aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/include/ipxe/iscsi.h6
-rw-r--r--src/net/tcp/iscsi.c5
2 files changed, 10 insertions, 1 deletions
diff --git a/src/include/ipxe/iscsi.h b/src/include/ipxe/iscsi.h
index e711459c9..4890bcc6d 100644
--- a/src/include/ipxe/iscsi.h
+++ b/src/include/ipxe/iscsi.h
@@ -539,6 +539,12 @@ struct iscsi_session {
/** CHAP response (used for both initiator and target auth) */
struct chap_response chap;
+ /** Initiator session ID (IANA format) qualifier
+ *
+ * This is part of the ISID. It is generated randomly
+ * whenever a new connection is opened.
+ */
+ uint16_t isid_iana_qual;
/** Initiator task tag
*
* This is the tag of the current command. It is incremented
diff --git a/src/net/tcp/iscsi.c b/src/net/tcp/iscsi.c
index a483dd40a..5e003a816 100644
--- a/src/net/tcp/iscsi.c
+++ b/src/net/tcp/iscsi.c
@@ -246,6 +246,9 @@ static int iscsi_open_connection ( struct iscsi_session *iscsi ) {
if ( iscsi->target_username )
iscsi->status |= ISCSI_STATUS_AUTH_REVERSE_REQUIRED;
+ /* Assign new ISID */
+ iscsi->isid_iana_qual = ( random() & 0xffff );
+
/* Assign fresh initiator task tag */
iscsi_new_itt ( iscsi );
@@ -707,7 +710,7 @@ static void iscsi_start_login ( struct iscsi_session *iscsi ) {
ISCSI_SET_LENGTHS ( request->lengths, 0, len );
request->isid_iana_en = htonl ( ISCSI_ISID_IANA |
IANA_EN_FEN_SYSTEMS );
- request->isid_iana_qual = ( random() & 0xffff );
+ request->isid_iana_qual = htons ( iscsi->isid_iana_qual );
/* tsih left as zero */
request->itt = htonl ( iscsi->itt );
/* cid left as zero */