Kaynağa Gözat

Split login into security negotation and operational parameter

negotiation phases, to allow inclusion of CHAP authentication.
tags/v0.9.3
Michael Brown 18 yıl önce
ebeveyn
işleme
fedc186fd7
2 değiştirilmiş dosya ile 57 ekleme ve 25 silme
  1. 7
    0
      src/include/gpxe/iscsi.h
  2. 50
    25
      src/net/tcp/iscsi.c

+ 7
- 0
src/include/gpxe/iscsi.h Dosyayı Görüntüle

167
 #define ISCSI_LOGIN_NSG_OPERATIONAL_NEGOTIATION 0x01
167
 #define ISCSI_LOGIN_NSG_OPERATIONAL_NEGOTIATION 0x01
168
 #define ISCSI_LOGIN_NSG_FULL_FEATURE_PHASE 0x03
168
 #define ISCSI_LOGIN_NSG_FULL_FEATURE_PHASE 0x03
169
 
169
 
170
+/* Combined stage values and mask */
171
+#define ISCSI_LOGIN_STAGE_MASK ( ISCSI_LOGIN_CSG_MASK | ISCSI_LOGIN_NSG_MASK )
172
+#define ISCSI_LOGIN_STAGE_SEC ( ISCSI_LOGIN_CSG_SECURITY_NEGOTIATION | \
173
+				ISCSI_LOGIN_NSG_OPERATIONAL_NEGOTIATION )
174
+#define ISCSI_LOGIN_STAGE_OP ( ISCSI_LOGIN_CSG_OPERATIONAL_NEGOTIATION | \
175
+			       ISCSI_LOGIN_NSG_FULL_FEATURE_PHASE )
176
+
170
 /** ISID IANA format marker */
177
 /** ISID IANA format marker */
171
 #define ISCSI_ISID_IANA 0x40000000
178
 #define ISCSI_ISID_IANA 0x40000000
172
 
179
 

+ 50
- 25
src/net/tcp/iscsi.c Dosyayı Görüntüle

291
  */
291
  */
292
 static int iscsi_build_login_request_strings ( struct iscsi_session *iscsi,
292
 static int iscsi_build_login_request_strings ( struct iscsi_session *iscsi,
293
 					       void *data, size_t len ) {
293
 					       void *data, size_t len ) {
294
-	return snprintf ( data, len,
295
-			  "InitiatorName=%s%c"
296
-			  "TargetName=%s%c"
297
-			  "SessionType=Normal%c"
298
-			  "HeaderDigest=None%c"
299
-			  "DataDigest=None%c"
300
-			  "InitialR2T=Yes%c"
301
-			  "DefaultTime2Wait=0%c"
302
-			  "DefaultTime2Retain=0%c"
303
-			  "MaxOutstandingR2T=1%c"
304
-			  "DataPDUInOrder=Yes%c"
305
-			  "DataSequenceInOrder=Yes%c"
306
-			  "ErrorRecoveryLevel=0%c",
307
-			  iscsi->initiator, 0, iscsi->target, 0,
308
-			  0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );
294
+	struct iscsi_bhs_login_request *request = &iscsi->tx_bhs.login_request;
295
+
296
+	switch ( request->flags & ISCSI_LOGIN_CSG_MASK ) {
297
+	case ISCSI_LOGIN_CSG_SECURITY_NEGOTIATION:
298
+		return snprintf ( data, len,
299
+				  "InitiatorName=%s%c"
300
+				  "TargetName=%s%c"
301
+				  "SessionType=Normal%c"
302
+				  "AuthMethod=CHAP,None%c"
303
+				  "CHAP_A=5%c",
304
+				  iscsi->initiator, 0, iscsi->target, 0,
305
+				  0, 0, 0 );
306
+	case ISCSI_LOGIN_CSG_OPERATIONAL_NEGOTIATION:
307
+		return snprintf ( data, len,
308
+				  "HeaderDigest=None%c"
309
+				  "DataDigest=None%c"
310
+				  "InitialR2T=Yes%c"
311
+				  "DefaultTime2Wait=0%c"
312
+				  "DefaultTime2Retain=0%c"
313
+				  "MaxOutstandingR2T=1%c"
314
+				  "DataPDUInOrder=Yes%c"
315
+				  "DataSequenceInOrder=Yes%c"
316
+				  "ErrorRecoveryLevel=0%c",
317
+				  0, 0, 0, 0, 0, 0, 0, 0, 0 );
318
+	default:
319
+		assert ( 0 );
320
+		return 0;
321
+	}
309
 }
322
 }
310
 
323
 
311
 /**
324
 /**
312
  * Build iSCSI login request BHS
325
  * Build iSCSI login request BHS
313
  *
326
  *
314
  * @v iscsi		iSCSI session
327
  * @v iscsi		iSCSI session
315
- * @v first		Login request is the first in a sequence
328
+ * @v stage		Current stage of iSCSI login
329
+ * @v send_strings	Send login strings with this login request
316
  */
330
  */
317
-static void iscsi_start_login ( struct iscsi_session *iscsi, int first ) {
331
+static void iscsi_start_login ( struct iscsi_session *iscsi,
332
+				int stage, int send_strings ) {
318
 	struct iscsi_bhs_login_request *request = &iscsi->tx_bhs.login_request;
333
 	struct iscsi_bhs_login_request *request = &iscsi->tx_bhs.login_request;
319
 	int len;
334
 	int len;
320
 
335
 
322
 	iscsi_start_tx ( iscsi );
337
 	iscsi_start_tx ( iscsi );
323
 	request->opcode = ( ISCSI_OPCODE_LOGIN_REQUEST |
338
 	request->opcode = ( ISCSI_OPCODE_LOGIN_REQUEST |
324
 			    ISCSI_FLAG_IMMEDIATE );
339
 			    ISCSI_FLAG_IMMEDIATE );
325
-	request->flags = ( ISCSI_LOGIN_FLAG_TRANSITION |
326
-			   ISCSI_LOGIN_CSG_OPERATIONAL_NEGOTIATION |
327
-			   ISCSI_LOGIN_NSG_FULL_FEATURE_PHASE );
340
+	request->flags = ( ISCSI_LOGIN_FLAG_TRANSITION | stage );
341
+
328
 	/* version_max and version_min left as zero */
342
 	/* version_max and version_min left as zero */
329
-	if ( first ) {
343
+	if ( send_strings ) {
330
 		len = iscsi_build_login_request_strings ( iscsi, NULL, 0 );
344
 		len = iscsi_build_login_request_strings ( iscsi, NULL, 0 );
331
 		ISCSI_SET_LENGTHS ( request->lengths, 0, len );
345
 		ISCSI_SET_LENGTHS ( request->lengths, 0, len );
332
 	}
346
 	}
334
 					IANA_EN_FEN_SYSTEMS );
348
 					IANA_EN_FEN_SYSTEMS );
335
 	/* isid_iana_qual left as zero */
349
 	/* isid_iana_qual left as zero */
336
 	request->tsih = htons ( iscsi->tsih );
350
 	request->tsih = htons ( iscsi->tsih );
337
-	if ( first )
338
-		iscsi->itt++;
339
 	request->itt = htonl ( iscsi->itt );
351
 	request->itt = htonl ( iscsi->itt );
340
 	/* cid left as zero */
352
 	/* cid left as zero */
341
 	request->cmdsn = htonl ( iscsi->cmdsn );
353
 	request->cmdsn = htonl ( iscsi->cmdsn );
387
 	 * request without any login strings.
399
 	 * request without any login strings.
388
 	 */
400
 	 */
389
 	if ( ! ( response->flags & ISCSI_LOGIN_FLAG_TRANSITION ) ) {
401
 	if ( ! ( response->flags & ISCSI_LOGIN_FLAG_TRANSITION ) ) {
390
-		iscsi_start_login ( iscsi, 0 );
402
+		iscsi_start_login ( iscsi, ( response->flags &
403
+					     ISCSI_LOGIN_STAGE_MASK ), 0 );
404
+		return;
405
+	}
406
+
407
+	/* If we are transitioning to the operational phase, send the
408
+	 * operational phase login request.
409
+	 */
410
+	if ( ( response->flags & ISCSI_LOGIN_NSG_MASK ) ==
411
+	     ISCSI_LOGIN_NSG_OPERATIONAL_NEGOTIATION ) {
412
+		iscsi_start_login ( iscsi, ISCSI_LOGIN_STAGE_OP, 1 );
391
 		return;
413
 		return;
392
 	}
414
 	}
393
 
415
 
762
 	iscsi->rx_state = ISCSI_RX_BHS;
784
 	iscsi->rx_state = ISCSI_RX_BHS;
763
 	iscsi->rx_offset = 0;
785
 	iscsi->rx_offset = 0;
764
 
786
 
787
+	/* Assign fresh initiator task tag */
788
+	iscsi->itt++;
789
+
765
 	/* Start logging in */
790
 	/* Start logging in */
766
-	iscsi_start_login ( iscsi, 1 );
791
+	iscsi_start_login ( iscsi, ISCSI_LOGIN_STAGE_SEC, 1 );
767
 }
792
 }
768
 
793
 
769
 /** iSCSI TCP operations */
794
 /** iSCSI TCP operations */

Loading…
İptal
Kaydet