Quellcode durchsuchen

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 vor 18 Jahren
Ursprung
Commit
a2e3357825
3 geänderte Dateien mit 20 neuen und 9 gelöschten Zeilen
  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 Datei anzeigen

@@ -504,9 +504,15 @@ struct iscsi_session {
504 504
 	int retry_count;
505 505
 
506 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 514
 	/** Target IQN */
509
-	const char *target;
515
+	const char *target_iqn;
510 516
 	/** Logical Unit Number (LUN) */
511 517
 	uint64_t lun;
512 518
 

+ 8
- 3
src/net/tcp/iscsi.c Datei anzeigen

@@ -395,8 +395,8 @@ static int iscsi_build_login_request_strings ( struct iscsi_session *iscsi,
395 395
 				    "TargetName=%s%c"
396 396
 				    "SessionType=Normal%c"
397 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 402
 	if ( iscsi->status & ISCSI_STATUS_STRINGS_CHAP_ALGORITHM ) {
@@ -497,7 +497,7 @@ static void iscsi_tx_login_request ( struct iscsi_session *iscsi,
497 497
 static void iscsi_handle_targetaddress_value ( struct iscsi_session *iscsi,
498 498
 					       const char *value ) {
499 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 502
 	if ( inet_aton ( value, &address ) == 0 ) {
503 503
 		DBG ( "iSCSI %p received invalid TargetAddress \"%s\"\n",
@@ -1121,6 +1121,9 @@ static void iscsi_closed ( struct tcp_connection *conn, int status ) {
1121 1121
 	/* Retry connection if within the retry limit, otherwise fail */
1122 1122
 	if ( ++iscsi->retry_count <= ISCSI_MAX_RETRIES ) {
1123 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 1127
 		tcp_connect ( conn );
1125 1128
 	} else {
1126 1129
 		printf ( "iSCSI %p retry count exceeded\n", iscsi );
@@ -1190,6 +1193,8 @@ struct async_operation * iscsi_issue ( struct iscsi_session *iscsi,
1190 1193
 	} else {
1191 1194
 		/* Session not open: initiate login */
1192 1195
 		iscsi->tcp.tcp_op = &iscsi_tcp_operations;
1196
+		memcpy ( &iscsi->tcp.peer, &iscsi->target,
1197
+			 sizeof ( iscsi->tcp.peer ) );
1193 1198
 		tcp_connect ( &iscsi->tcp );
1194 1199
 	}
1195 1200
 

+ 4
- 4
src/tests/iscsiboot.c Datei anzeigen

@@ -21,10 +21,10 @@ int test_iscsiboot ( const char *initiator_iqn,
21 21
 	int rc;
22 22
 
23 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 28
 	test_iscsidev.iscsi.lun = lun;
29 29
 	test_iscsidev.iscsi.username = username;
30 30
 	test_iscsidev.iscsi.password = password;

Laden…
Abbrechen
Speichern