diff options
author | H. Peter Anvin <hpa@zytor.com> | 2008-06-04 18:52:18 -0700 |
---|---|---|
committer | H. Peter Anvin <hpa@zytor.com> | 2008-06-04 18:52:18 -0700 |
commit | e63132bf03140d91ec74eca663f7bc2f16429fb0 (patch) | |
tree | ea5af9895146e85d3912584e699799863e0f8a29 /gpxe/src/net/tcp/iscsi.c | |
parent | bce8e1595ab30c828254038523e1e25c9fd9445f (diff) | |
download | syslinux-e63132bf03140d91ec74eca663f7bc2f16429fb0.tar.gz |
Update gPXE from gPXE git
Diffstat (limited to 'gpxe/src/net/tcp/iscsi.c')
-rw-r--r-- | gpxe/src/net/tcp/iscsi.c | 46 |
1 files changed, 39 insertions, 7 deletions
diff --git a/gpxe/src/net/tcp/iscsi.c b/gpxe/src/net/tcp/iscsi.c index c01ca44b..a12fca85 100644 --- a/gpxe/src/net/tcp/iscsi.c +++ b/gpxe/src/net/tcp/iscsi.c @@ -456,17 +456,18 @@ static int iscsi_build_login_request_strings ( struct iscsi_session *iscsi, "InitiatorName=%s%c" "TargetName=%s%c" "SessionType=Normal%c" - "AuthMethod=CHAP,None%c", + "AuthMethod=%sNone%c", iscsi_initiator_iqn(), 0, - iscsi->target_iqn, 0, 0, 0 ); + iscsi->target_iqn, 0, 0, + ( ( iscsi->username && iscsi->password ) ? + "CHAP," : "" ), 0 ); } if ( iscsi->status & ISCSI_STATUS_STRINGS_CHAP_ALGORITHM ) { used += ssnprintf ( data + used, len - used, "CHAP_A=5%c", 0 ); } - if ( ( iscsi->status & ISCSI_STATUS_STRINGS_CHAP_RESPONSE ) && - iscsi->username ) { + if ( ( iscsi->status & ISCSI_STATUS_STRINGS_CHAP_RESPONSE ) ) { used += ssnprintf ( data + used, len - used, "CHAP_N=%s%cCHAP_R=0x", iscsi->username, 0 ); @@ -830,6 +831,35 @@ static int iscsi_rx_buffered_data ( struct iscsi_session *iscsi, } /** + * Convert iSCSI response status to return status code + * + * @v status_class iSCSI status class + * @v status_detail iSCSI status detail + * @ret rc Return status code + */ +static int iscsi_status_to_rc ( unsigned int status_class, + unsigned int status_detail ) { + switch ( status_class ) { + case ISCSI_STATUS_INITIATOR_ERROR : + switch ( status_detail ) { + case ISCSI_STATUS_INITIATOR_ERROR_AUTHENTICATION : + return -EACCES; + case ISCSI_STATUS_INITIATOR_ERROR_AUTHORISATION : + return -EPERM; + case ISCSI_STATUS_INITIATOR_ERROR_NOT_FOUND : + case ISCSI_STATUS_INITIATOR_ERROR_REMOVED : + return -ENODEV; + default : + return -ENOTSUP; + } + case ISCSI_STATUS_TARGET_ERROR : + return -EIO; + default : + return -EINVAL; + } +} + +/** * Receive data segment of an iSCSI login response PDU * * @v iscsi iSCSI session @@ -876,8 +906,10 @@ static int iscsi_rx_login_response ( struct iscsi_session *iscsi, if ( response->status_class != 0 ) { DBGC ( iscsi, "iSCSI login failure: class %02x detail %02x\n", response->status_class, response->status_detail ); - iscsi->instant_rc = -EPERM; - return -EPERM; + rc = iscsi_status_to_rc ( response->status_class, + response->status_detail ); + iscsi->instant_rc = rc; + return rc; } /* Handle login transitions */ @@ -1176,7 +1208,7 @@ static int iscsi_rx_data ( struct iscsi_session *iscsi, const void *data, return 0; DBGC ( iscsi, "iSCSI %p unknown opcode %02x\n", iscsi, response->opcode ); - return -EOPNOTSUPP; + return -ENOTSUP; } } |