Skip to content

Commit

Permalink
[iscsi] Ensure ISID is consistent within an iSCSI session
Browse files Browse the repository at this point in the history
Commit 5f4ab0d ("[iscsi] Randomise a portion of the ISID to force new
session instantiation") introduced a regression by randomising the
ISID on each call to iscsi_start_login(), which may be called more
than once per connection, rather than on each call to
iscsi_open_connection(), which is guaranteed to be called only once
per connection.  This is incorrect behaviour that causes our
connection to be rejected by some iSCSI targets (observed with a
COMSTAR target under OpenSolaris).

Fix by generating the ISID in iscsi_open_connection(), and storing the
randomised ISID as part of the session state.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
  • Loading branch information
mcb30 committed Oct 18, 2010
1 parent 44dbf0e commit 19c59bb
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 1 deletion.
6 changes: 6 additions & 0 deletions src/include/ipxe/iscsi.h
Expand Up @@ -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
Expand Down
5 changes: 4 additions & 1 deletion src/net/tcp/iscsi.c
Expand Up @@ -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 );

Expand Down Expand Up @@ -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 */
Expand Down

0 comments on commit 19c59bb

Please sign in to comment.