Browse Source

Add iSCSI to the DHCP tests.

Start updating iscsi.c to use Nikhil's TCP API.
tags/v0.9.3
Michael Brown 18 years ago
parent
commit
d0e4f198d6
3 changed files with 51 additions and 14 deletions
  1. 1
    1
      src/net/tcp/iscsi.c
  2. 46
    10
      src/tests/dhcptest.c
  3. 4
    3
      src/tests/iscsiboot.c

+ 1
- 1
src/net/tcp/iscsi.c View File

@@ -777,7 +777,7 @@ int iscsi_issue ( struct iscsi_session *iscsi,
777 777
 
778 778
 	if ( iscsi->status & ISCSI_STATUS_CONNECTED ) {
779 779
 		iscsi_start_command ( iscsi );
780
-		tcp_kick ( &iscsi->tcp );
780
+		tcp_senddata ( &iscsi->tcp );
781 781
 	} else {
782 782
 		iscsi->tcp.tcp_op = &iscsi_tcp_operations;
783 783
 		tcp_connect ( &iscsi->tcp );

+ 46
- 10
src/tests/dhcptest.c View File

@@ -3,6 +3,48 @@
3 3
 #include <byteswap.h>
4 4
 #include <gpxe/ip.h>
5 5
 #include <gpxe/dhcp.h>
6
+#include <gpxe/iscsi.h>
7
+
8
+static int test_dhcp_aoe_boot ( struct net_device *netdev,
9
+				char *aoename ) {
10
+	unsigned int drivenum;
11
+	
12
+	drivenum = find_global_dhcp_num_option ( DHCP_EB_BIOS_DRIVE );
13
+	return test_aoeboot ( netdev, aoename, drivenum );
14
+}
15
+
16
+static int test_dhcp_iscsi_boot ( struct net_device *netdev __unused,
17
+				  char *iscsiname ) {
18
+	char *initiator_iqn = "iqn.1900-01.localdomain.localhost:initiator";
19
+	char *target_iqn;
20
+	union {
21
+		struct sockaddr_in sin;
22
+		struct sockaddr_tcpip st;
23
+	} target;
24
+
25
+	memset ( &target, 0, sizeof ( target ) );
26
+	target.sin.sin_family = AF_INET;
27
+	target.sin.sin_port = htons ( ISCSI_PORT );
28
+	target_iqn = strchr ( iscsiname, ':' ) + 1;
29
+	if ( ! target_iqn ) {
30
+		printf ( "Invalid iSCSI DHCP path\n" );
31
+		return -EINVAL;
32
+	}
33
+	inet_aton ( iscsiname, &target.sin.sin_addr );
34
+
35
+	return test_iscsiboot ( initiator_iqn, &target, target_iqn );
36
+}
37
+
38
+static int test_dhcp_boot ( struct net_device *netdev, char *filename ) {
39
+	if ( strncmp ( filename, "aoe:", 4 ) == 0 ) {
40
+		return test_dhcp_aoe_boot ( netdev, &filename[4] );
41
+	} else if ( strncmp ( filename, "iscsi:", 6 ) == 0 ) {
42
+		return test_dhcp_iscsi_boot ( netdev, &filename[6] );
43
+	} else {
44
+		printf ( "Don't know how to boot %s\n", filename );
45
+		return -EPROTONOSUPPORT;
46
+	}
47
+}
6 48
 
7 49
 int test_dhcp ( struct net_device *netdev ) {
8 50
 	struct dhcp_session dhcp;
@@ -56,16 +98,10 @@ int test_dhcp ( struct net_device *netdev ) {
56 98
 				       gateway ) ) != 0 )
57 99
 		goto out_no_del_ipv4;
58 100
 
59
-	/* Proof of concept: check for "aoe:" prefix and if found, do
60
-	 * test AoE boot with AoE options.
61
-	 */
62
-	if ( strncmp ( filename, "aoe:", 4 ) == 0 ) {
63
-		unsigned int drivenum;
64
-		
65
-		drivenum = find_global_dhcp_num_option ( DHCP_EB_BIOS_DRIVE );
66
-		test_aoeboot ( netdev, &filename[4], drivenum );
67
-	} else {
68
-		printf ( "Don't know how to boot %s\n", filename );
101
+	/* Test boot */
102
+	if ( ( rc = test_dhcp_boot ( netdev, filename ) ) != 0 ) {
103
+		printf ( "Boot failed\n" );
104
+		goto out;
69 105
 	}
70 106
 	
71 107
  out:

+ 4
- 3
src/tests/iscsiboot.c View File

@@ -8,14 +8,15 @@
8 8
 static struct iscsi_device test_iscsidev;
9 9
 
10 10
 int test_iscsiboot ( const char *initiator_iqn,
11
-		     struct in_addr target,
11
+		     struct sockaddr_tcpip *target,
12 12
 		     const char *target_iqn ) {
13
+	struct sockaddr_in *sin;
13 14
 	struct int13_drive drive;
14 15
 	int rc;
15 16
 
16 17
 	memset ( &test_iscsidev, 0, sizeof ( test_iscsidev ) );
17
-	test_iscsidev.iscsi.tcp.sin.sin_addr = target;
18
-	test_iscsidev.iscsi.tcp.sin.sin_port = htons ( ISCSI_PORT );
18
+	memcpy ( &test_iscsidev.iscsi.tcp.peer, target,
19
+		 sizeof ( test_iscsidev.iscsi.tcp.peer ) );
19 20
 	test_iscsidev.iscsi.initiator = initiator_iqn;
20 21
 	test_iscsidev.iscsi.target = target_iqn;
21 22
 

Loading…
Cancel
Save