Browse Source

Cannot immediately overwrite the peer address when we parse

TargetAddress from the login response, because we still need the old
address while we close the connection!
tags/v0.9.3
Michael Brown 18 years ago
parent
commit
a2e3357825
3 changed files with 20 additions and 9 deletions
  1. 8
    2
      src/include/gpxe/iscsi.h
  2. 8
    3
      src/net/tcp/iscsi.c
  3. 4
    4
      src/tests/iscsiboot.c

+ 8
- 2
src/include/gpxe/iscsi.h View File

504
 	int retry_count;
504
 	int retry_count;
505
 
505
 
506
 	/** Initiator IQN */
506
 	/** Initiator IQN */
507
-	const char *initiator;
507
+	const char *initiator_iqn;
508
+	/** Target address
509
+	 *
510
+	 * Kept separate from the TCP connection structure because we
511
+	 * may need to handle login redirection.
512
+	 */
513
+	struct sockaddr_tcpip target;
508
 	/** Target IQN */
514
 	/** Target IQN */
509
-	const char *target;
515
+	const char *target_iqn;
510
 	/** Logical Unit Number (LUN) */
516
 	/** Logical Unit Number (LUN) */
511
 	uint64_t lun;
517
 	uint64_t lun;
512
 
518
 

+ 8
- 3
src/net/tcp/iscsi.c View File

395
 				    "TargetName=%s%c"
395
 				    "TargetName=%s%c"
396
 				    "SessionType=Normal%c"
396
 				    "SessionType=Normal%c"
397
 				    "AuthMethod=CHAP,None%c",
397
 				    "AuthMethod=CHAP,None%c",
398
-				    iscsi->initiator, 0, iscsi->target, 0,
399
-				    0, 0 );
398
+				    iscsi->initiator_iqn, 0,
399
+				    iscsi->target_iqn, 0, 0, 0 );
400
 	}
400
 	}
401
 
401
 
402
 	if ( iscsi->status & ISCSI_STATUS_STRINGS_CHAP_ALGORITHM ) {
402
 	if ( iscsi->status & ISCSI_STATUS_STRINGS_CHAP_ALGORITHM ) {
497
 static void iscsi_handle_targetaddress_value ( struct iscsi_session *iscsi,
497
 static void iscsi_handle_targetaddress_value ( struct iscsi_session *iscsi,
498
 					       const char *value ) {
498
 					       const char *value ) {
499
 	struct in_addr address;
499
 	struct in_addr address;
500
-	struct sockaddr_in *sin = ( struct sockaddr_in * ) &iscsi->tcp.peer;
500
+	struct sockaddr_in *sin = ( struct sockaddr_in * ) &iscsi->target;
501
 
501
 
502
 	if ( inet_aton ( value, &address ) == 0 ) {
502
 	if ( inet_aton ( value, &address ) == 0 ) {
503
 		DBG ( "iSCSI %p received invalid TargetAddress \"%s\"\n",
503
 		DBG ( "iSCSI %p received invalid TargetAddress \"%s\"\n",
1121
 	/* Retry connection if within the retry limit, otherwise fail */
1121
 	/* Retry connection if within the retry limit, otherwise fail */
1122
 	if ( ++iscsi->retry_count <= ISCSI_MAX_RETRIES ) {
1122
 	if ( ++iscsi->retry_count <= ISCSI_MAX_RETRIES ) {
1123
 		DBG ( "iSCSI %p retrying connection\n", iscsi );
1123
 		DBG ( "iSCSI %p retrying connection\n", iscsi );
1124
+		/* Re-copy address to handle redirection */
1125
+		memcpy ( &iscsi->tcp.peer, &iscsi->target,
1126
+			 sizeof ( iscsi->tcp.peer ) );
1124
 		tcp_connect ( conn );
1127
 		tcp_connect ( conn );
1125
 	} else {
1128
 	} else {
1126
 		printf ( "iSCSI %p retry count exceeded\n", iscsi );
1129
 		printf ( "iSCSI %p retry count exceeded\n", iscsi );
1190
 	} else {
1193
 	} else {
1191
 		/* Session not open: initiate login */
1194
 		/* Session not open: initiate login */
1192
 		iscsi->tcp.tcp_op = &iscsi_tcp_operations;
1195
 		iscsi->tcp.tcp_op = &iscsi_tcp_operations;
1196
+		memcpy ( &iscsi->tcp.peer, &iscsi->target,
1197
+			 sizeof ( iscsi->tcp.peer ) );
1193
 		tcp_connect ( &iscsi->tcp );
1198
 		tcp_connect ( &iscsi->tcp );
1194
 	}
1199
 	}
1195
 
1200
 

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

21
 	int rc;
21
 	int rc;
22
 
22
 
23
 	memset ( &test_iscsidev, 0, sizeof ( test_iscsidev ) );
23
 	memset ( &test_iscsidev, 0, sizeof ( test_iscsidev ) );
24
-	memcpy ( &test_iscsidev.iscsi.tcp.peer, target,
25
-		 sizeof ( test_iscsidev.iscsi.tcp.peer ) );
26
-	test_iscsidev.iscsi.initiator = initiator_iqn;
27
-	test_iscsidev.iscsi.target = target_iqn;
24
+	memcpy ( &test_iscsidev.iscsi.target, target,
25
+		 sizeof ( test_iscsidev.iscsi.target ) );
26
+	test_iscsidev.iscsi.initiator_iqn = initiator_iqn;
27
+	test_iscsidev.iscsi.target_iqn = target_iqn;
28
 	test_iscsidev.iscsi.lun = lun;
28
 	test_iscsidev.iscsi.lun = lun;
29
 	test_iscsidev.iscsi.username = username;
29
 	test_iscsidev.iscsi.username = username;
30
 	test_iscsidev.iscsi.password = password;
30
 	test_iscsidev.iscsi.password = password;

Loading…
Cancel
Save