diff options
| author | Michael Brown | 2006-05-13 13:39:46 +0200 |
|---|---|---|
| committer | Michael Brown | 2006-05-13 13:39:46 +0200 |
| commit | 5009f8d6a2d919326856cde6a25e15bf00872e8d (patch) | |
| tree | 81085ce4eac0153d872626f7ffc4a7801de17818 /src/include | |
| parent | Defined SCSI device interface, and added SCSI block device (diff) | |
| download | ipxe-5009f8d6a2d919326856cde6a25e15bf00872e8d.tar.gz ipxe-5009f8d6a2d919326856cde6a25e15bf00872e8d.tar.xz ipxe-5009f8d6a2d919326856cde6a25e15bf00872e8d.zip | |
Provide a SCSI device interface to the iSCSI protocol
Diffstat (limited to 'src/include')
| -rw-r--r-- | src/include/gpxe/iscsi.h | 136 |
1 files changed, 101 insertions, 35 deletions
diff --git a/src/include/gpxe/iscsi.h b/src/include/gpxe/iscsi.h index ab7b0a073..fdb4b5445 100644 --- a/src/include/gpxe/iscsi.h +++ b/src/include/gpxe/iscsi.h @@ -82,6 +82,60 @@ struct iscsi_bhs_common { #define ISCSI_FLAG_FINAL 0x80 /** + * iSCSI basic header segment common request fields + * + */ +struct iscsi_bhs_common_request { + /** Opcode */ + uint8_t opcode; + /** Flags */ + uint8_t flags; + /** Fields specific to the PDU type */ + uint8_t other_a[2]; + /** Segment lengths */ + union iscsi_segment_lengths lengths; + /** Fields specific to the PDU type */ + uint8_t other_b[8]; + /** Initiator Task Tag */ + uint32_t itt; + /** Fields specific to the PDU type */ + uint8_t other_c[4]; + /** Command sequence number */ + uint32_t cmdsn; + /** Expected status sequence number */ + uint32_t expstatsn; + /** Fields specific to the PDU type */ + uint8_t other_d[16]; +}; + +/** + * iSCSI basic header segment common request fields + * + */ +struct iscsi_bhs_common_response { + /** Opcode */ + uint8_t opcode; + /** Flags */ + uint8_t flags; + /** Fields specific to the PDU type */ + uint8_t other_a[2]; + /** Segment lengths */ + union iscsi_segment_lengths lengths; + /** Fields specific to the PDU type */ + uint8_t other_b[8]; + /** Initiator Task Tag */ + uint32_t itt; + /** Fields specific to the PDU type */ + uint8_t other_c[4]; + /** Status sequence number */ + uint32_t statsn; + /** Expected command sequence number */ + uint32_t expcmdsn; + /** Fields specific to the PDU type */ + uint8_t other_d[16]; +}; + +/** * iSCSI login request basic header segment * */ @@ -203,7 +257,7 @@ struct iscsi_bhs_scsi_command { /** Segment lengths */ union iscsi_segment_lengths lengths; /** SCSI Logical Unit Number */ - uint8_t lun[8]; + uint64_t lun; /** Initiator Task Tag */ uint32_t itt; /** Expected data transfer length */ @@ -290,7 +344,7 @@ struct iscsi_bhs_data_in { /** Segment lengths */ union iscsi_segment_lengths lengths; /** Logical Unit Number */ - uint8_t lun[8]; + uint64_t lun; /** Initiator Task Tag */ uint32_t itt; /** Target Transfer Tag */ @@ -329,6 +383,8 @@ struct iscsi_bhs_data_in { */ union iscsi_bhs { struct iscsi_bhs_common common; + struct iscsi_bhs_common_request common_request; + struct iscsi_bhs_common_response common_response; struct iscsi_bhs_login_request login_request; struct iscsi_bhs_login_response login_response; struct iscsi_bhs_scsi_command scsi_command; @@ -339,12 +395,10 @@ union iscsi_bhs { /** State */ enum iscsi_state { - /** In the process of logging in */ - ISCSI_STATE_FAILED = -1, - ISCSI_STATE_NOT_CONNECTED = 0, ISCSI_STATE_IDLE, - ISCSI_STATE_LOGGING_IN, - ISCSI_STATE_READING_DATA, + ISCSI_STATE_LOGIN, + ISCSI_STATE_LOGIN_CONT, + ISCSI_STATE_COMMAND, }; /** State of an iSCSI TX engine */ @@ -377,40 +431,32 @@ enum iscsi_rx_state { struct iscsi_session { /** TCP connection for this session */ struct tcp_connection tcp; + /** Session status + * + * This is the bitwise-OR of zero or more ISCSI_STATUS_XXX + * constants. + */ + int status; + /** Retry count + * + * Number of times that the connection has been retried. + * Reset upon a successful connection. + */ + int retry_count; /** Initiator IQN */ const char *initiator; /** Target IQN */ const char *target; + /** Logical Unit Number (LUN) */ + uint64_t lun; - /** Block size in bytes */ - size_t block_size; - /** Starting block number of the current data transfer */ - unsigned long block_start; - /** Block count of the current data transfer */ - unsigned long block_count; - /** Block read callback function - * - * Note that this may be called several times, since it is - * called per-packet rather than per-block. - */ - void ( * block_read_callback ) ( void *private, const void *data, - unsigned long offset, size_t len ); - /** Block read callback private data - * - * This is passed to block_read_callback() - */ - void *block_read_private; - - /** State of the session */ - enum iscsi_state state; /** Target session identifying handle * * This is assigned by the target when we first log in, and * must be reused on subsequent login attempts. */ uint16_t tsih; - /** Initiator task tag * * This is the tag of the current command. It is incremented @@ -447,14 +493,34 @@ struct iscsi_session { enum iscsi_rx_state rx_state; /** Byte offset within the current RX state */ size_t rx_offset; + + /** Current SCSI command + * + * Set to NULL when command is complete. + */ + struct scsi_command *command; }; -static inline int iscsi_busy ( struct iscsi_session *iscsi ) { - return ( iscsi->state > ISCSI_STATE_IDLE ); -} +/** Session is currently connected */ +#define ISCSI_STATUS_CONNECTED 0x01 + +/** Session has completed */ +#define ISCSI_STATUS_DONE 0x02 + +/** Session failed */ +#define ISCSI_STATUS_ERR 0x04 + +/** Maximum number of retries at connecting */ +#define ISCSI_MAX_RETRIES 2 + +/** An iSCSI device */ +struct iscsi_device { + /** SCSI device interface */ + struct scsi_device scsi; + /** iSCSI protocol instance */ + struct iscsi_session iscsi; +}; -static inline int iscsi_error ( struct iscsi_session *iscsi ) { - return ( iscsi->state == ISCSI_STATE_FAILED ); -} +extern int init_iscsidev ( struct iscsi_device *iscsidev ); #endif /* _GPXE_ISCSI_H */ |
