Sfoglia il codice sorgente

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 anni fa
parent
commit
a2e3357825
3 ha cambiato i file con 20 aggiunte e 9 eliminazioni
  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 Vedi File

@@ -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 Vedi File

@@ -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 Vedi File

@@ -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;

Loading…
Annulla
Salva