571 lines
8.8 KiB
C
571 lines
8.8 KiB
C
/* $OpenBSD: iscsi.h,v 1.9 2019/09/27 23:07:42 krw Exp $ */
|
|
|
|
/*
|
|
* Copyright (c) 2008 David Gwynne <dlg@openbsd.org>
|
|
*
|
|
* Permission to use, copy, modify, and distribute this software for any
|
|
* purpose with or without fee is hereby granted, provided that the above
|
|
* copyright notice and this permission notice appear in all copies.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
*/
|
|
|
|
#ifndef _SCSI_ISCSI_H
|
|
#define _SCSI_ISCSI_H
|
|
|
|
struct iscsi_pdu {
|
|
u_int8_t opcode;
|
|
u_int8_t flags;
|
|
u_int8_t _reserved1[2];
|
|
|
|
u_int8_t ahslen;
|
|
u_int8_t datalen[3];
|
|
|
|
u_int8_t lun[8];
|
|
|
|
u_int32_t itt;
|
|
|
|
u_int8_t _reserved2[4];
|
|
|
|
u_int32_t cmdsn;
|
|
|
|
u_int32_t expstatsn;
|
|
|
|
u_int8_t _reserved3[16];
|
|
} __packed;
|
|
|
|
/*
|
|
* Initiator opcodes
|
|
*/
|
|
|
|
#define ISCSI_OP_I_NOP 0x00
|
|
#define ISCSI_OP_SCSI_REQUEST 0x01
|
|
#define ISCSI_OP_TASK_REQUEST 0x02
|
|
#define ISCSI_OP_LOGIN_REQUEST 0x03
|
|
#define ISCSI_OP_TEXT_REQUEST 0x04
|
|
#define ISCSI_OP_DATA_OUT 0x05
|
|
#define ISCSI_OP_LOGOUT_REQUEST 0x06
|
|
#define ISCSI_OP_SNACK_REQUEST 0x10
|
|
|
|
/*
|
|
* Target opcodes
|
|
*/
|
|
|
|
#define ISCSI_OP_T_NOP 0x20
|
|
#define ISCSI_OP_SCSI_RESPONSE 0x21
|
|
#define ISCSI_OP_TASK_RESPONSE 0x22
|
|
#define ISCSI_OP_LOGIN_RESPONSE 0x23
|
|
#define ISCSI_OP_TEXT_RESPONSE 0x24
|
|
#define ISCSI_OP_DATA_IN 0x25
|
|
#define ISCSI_OP_LOGOUT_RESPONSE 0x26
|
|
#define ISCSI_OP_R2T 0x31
|
|
#define ISCSI_OP_ASYNC 0x32
|
|
#define ISCSI_OP_REJECT 0x3f
|
|
|
|
#define ISCSI_PDU_OPCODE(_o) ((_o) & 0x3f)
|
|
#define ISCSI_PDU_I(_h) ((_h)->opcode & 0x40)
|
|
#define ISCSI_PDU_F(_h) ((_h)->flags & 0x80)
|
|
|
|
#define ISCSI_OP_F_IMMEDIATE 0x40
|
|
|
|
/*
|
|
* various other flags and values
|
|
*/
|
|
#define ISCSI_ISID_OUI 0x00000000
|
|
#define ISCSI_ISID_EN 0x40000000
|
|
#define ISCSI_ISID_RAND 0x80000000
|
|
|
|
struct iscsi_pdu_scsi_request {
|
|
u_int8_t opcode;
|
|
u_int8_t flags;
|
|
u_int8_t _reserved[2];
|
|
|
|
u_int8_t ahslen;
|
|
u_int8_t datalen[3];
|
|
|
|
u_int8_t lun[8];
|
|
|
|
u_int32_t itt;
|
|
|
|
u_int32_t bytes;
|
|
|
|
u_int32_t cmdsn;
|
|
|
|
u_int32_t expstatsn;
|
|
|
|
u_int8_t cdb[16];
|
|
} __packed;
|
|
|
|
struct iscsi_pdu_scsi_response {
|
|
u_int8_t opcode;
|
|
u_int8_t flags;
|
|
u_int8_t response;
|
|
u_int8_t status;
|
|
|
|
u_int8_t ahslen;
|
|
u_int8_t datalen[3];
|
|
|
|
u_int8_t _reserved[8];
|
|
|
|
u_int32_t itt;
|
|
|
|
u_int32_t snack;
|
|
|
|
u_int32_t statsn;
|
|
|
|
u_int32_t expcmdsn;
|
|
|
|
u_int32_t maxcmdsn;
|
|
|
|
u_int32_t expdatasn;
|
|
|
|
u_int32_t birescount;
|
|
|
|
u_int32_t rescount;
|
|
} __packed;
|
|
|
|
#define ISCSI_SCSI_F_F 0x80
|
|
#define ISCSI_SCSI_F_R 0x40
|
|
#define ISCSI_SCSI_F_W 0x20
|
|
|
|
#define ISCSI_SCSI_ATTR_UNTAGGED 0
|
|
#define ISCSI_SCSI_ATTR_SIMPLE 1
|
|
#define ISCSI_SCSI_ATTR_ORDERED 2
|
|
#define ISCSI_SCSI_ATTR_HEAD_OF_Q 3
|
|
#define ISCSI_SCSI_ATTR_ACA 4
|
|
|
|
#define ISCSI_SCSI_STAT_GOOD 0x00
|
|
#define ISCSI_SCSI_STAT_CHCK_COND 0x02
|
|
/* we don't care about the type of the other error conditions */
|
|
|
|
struct iscsi_pdu_task_request {
|
|
u_int8_t opcode;
|
|
u_int8_t flags;
|
|
u_int8_t reserved[2];
|
|
|
|
u_int8_t ahslen;
|
|
u_int8_t datalen[3];
|
|
|
|
u_int8_t lun[8];
|
|
|
|
u_int32_t itt;
|
|
|
|
u_int32_t tag;
|
|
|
|
u_int32_t cmdsn;
|
|
|
|
u_int32_t expstatsn;
|
|
|
|
u_int32_t refcmdsn;
|
|
|
|
u_int32_t expdatasn;
|
|
|
|
u_int8_t _reserved[8];
|
|
} __packed;
|
|
|
|
struct iscsi_pdu_task_response {
|
|
u_int8_t opcode;
|
|
u_int8_t flags;
|
|
u_int8_t response;
|
|
u_int8_t _reserved1;
|
|
|
|
u_int8_t ahslen;
|
|
u_int8_t datalen[3];
|
|
|
|
u_int8_t _reserved[8];
|
|
|
|
u_int32_t itt;
|
|
|
|
u_int8_t _reserved2[4];
|
|
|
|
u_int32_t statsn;
|
|
|
|
u_int32_t expcmdsn;
|
|
|
|
u_int32_t maxcmdsn;
|
|
|
|
u_int8_t _reserved3[12];
|
|
} __packed;
|
|
|
|
struct iscsi_pdu_data_out {
|
|
u_int8_t opcode;
|
|
u_int8_t flags;
|
|
u_int8_t _reserved1[2];
|
|
|
|
u_int8_t ahslen;
|
|
u_int8_t datalen[3];
|
|
|
|
u_int8_t lun[8];
|
|
|
|
u_int32_t itt;
|
|
|
|
u_int32_t ttt;
|
|
|
|
u_int8_t _reserved2[4];
|
|
|
|
u_int32_t expstatsn;
|
|
|
|
u_int8_t _reserved3[4];
|
|
|
|
u_int32_t datasn;
|
|
|
|
u_int32_t buffer_offs;
|
|
|
|
u_int8_t _reserved4[4];
|
|
} __packed;
|
|
|
|
struct iscsi_pdu_data_in {
|
|
u_int8_t opcode;
|
|
u_int8_t flags;
|
|
u_int8_t _reserved;
|
|
u_int8_t status;
|
|
|
|
u_int8_t ahslen;
|
|
u_int8_t datalen[3];
|
|
|
|
u_int8_t lun[8];
|
|
|
|
u_int32_t itt;
|
|
|
|
u_int32_t ttt;
|
|
|
|
u_int32_t statsn;
|
|
|
|
u_int32_t expcmdsn;
|
|
|
|
u_int32_t maxcmdsn;
|
|
|
|
u_int32_t datasn;
|
|
|
|
u_int32_t buffer_offs;
|
|
|
|
u_int32_t residual;
|
|
} __packed;
|
|
|
|
struct iscsi_pdu_rt2 {
|
|
u_int8_t opcode;
|
|
u_int8_t flags;
|
|
u_int8_t _reserved1[2];
|
|
|
|
u_int8_t ahslen;
|
|
u_int8_t datalen[3];
|
|
|
|
u_int8_t lun[8];
|
|
|
|
u_int32_t itt;
|
|
|
|
u_int32_t ttt;
|
|
|
|
u_int32_t statsn;
|
|
|
|
u_int32_t expcmdsn;
|
|
|
|
u_int32_t maxcmdsn;
|
|
|
|
u_int32_t r2tsn;
|
|
|
|
u_int32_t buffer_offs;
|
|
|
|
u_int32_t desired_datalen;
|
|
} __packed;
|
|
|
|
struct iscsi_pdu_async {
|
|
u_int8_t opcode;
|
|
u_int8_t flags;
|
|
u_int8_t _reserved1[2];
|
|
|
|
u_int8_t ahslen;
|
|
u_int8_t datalen[3];
|
|
|
|
u_int8_t lun[8];
|
|
|
|
u_int32_t ffffffff;
|
|
|
|
u_int8_t _reserved2[4];
|
|
|
|
u_int32_t statsn;
|
|
|
|
u_int32_t expcmdsn;
|
|
|
|
u_int32_t maxcmdsn;
|
|
|
|
u_int8_t event;
|
|
u_int8_t vcode;
|
|
u_int16_t param[3];
|
|
|
|
u_int8_t _reserved3[4];
|
|
} __packed;
|
|
|
|
struct iscsi_pdu_text_request {
|
|
u_int8_t opcode;
|
|
u_int8_t flags;
|
|
u_int8_t _reserved1[2];
|
|
|
|
u_int8_t ahslen;
|
|
u_int8_t datalen[3];
|
|
|
|
u_int8_t lun[8];
|
|
|
|
u_int32_t itt;
|
|
|
|
u_int32_t ttt;
|
|
|
|
u_int32_t cmdsn;
|
|
|
|
u_int32_t expstatsn;
|
|
|
|
u_int8_t _reserved2[16];
|
|
} __packed;
|
|
|
|
struct iscsi_pdu_text_response {
|
|
u_int8_t opcode;
|
|
u_int8_t flags;
|
|
u_int8_t _reserved1[2];
|
|
|
|
u_int8_t ahslen;
|
|
u_int8_t datalen[3];
|
|
|
|
u_int8_t lun[8];
|
|
|
|
u_int32_t itt;
|
|
|
|
u_int32_t ttt;
|
|
|
|
u_int32_t cmdsn;
|
|
|
|
u_int32_t expcmdsn;
|
|
|
|
u_int32_t maxcmdsn;
|
|
|
|
u_int8_t _reserved2[12];
|
|
} __packed;
|
|
|
|
#define ISCSI_TEXT_F_F 0x80
|
|
#define ISCSI_TEXT_F_C 0x40
|
|
|
|
struct iscsi_pdu_login_request {
|
|
u_int8_t opcode;
|
|
u_int8_t flags;
|
|
u_int8_t version_max;
|
|
u_int8_t version_min;
|
|
|
|
u_int8_t ahslen;
|
|
u_int8_t datalen[3];
|
|
|
|
u_int32_t isid_base;
|
|
u_int16_t isid_qual;
|
|
u_int16_t tsih;
|
|
|
|
u_int32_t itt;
|
|
|
|
u_int16_t cid;
|
|
u_int8_t _reserved1[2];
|
|
|
|
u_int32_t cmdsn;
|
|
|
|
u_int32_t expstatsn;
|
|
|
|
u_int8_t _reserved2[16];
|
|
} __packed;
|
|
|
|
#define ISCSI_LOGIN_F_T 0x80
|
|
#define ISCSI_LOGIN_F_C 0x40
|
|
#define ISCSI_LOGIN_F_CSG(x) (((x) & 0x3) << 2)
|
|
#define ISCSI_LOGIN_F_NSG(x) ((x) & 0x3)
|
|
#define ISCSI_LOGIN_STG_SECNEG 0
|
|
#define ISCSI_LOGIN_STG_OPNEG 1
|
|
#define ISCSI_LOGIN_STG_FULL 3
|
|
|
|
struct iscsi_pdu_login_response {
|
|
u_int8_t opcode;
|
|
u_int8_t flags;
|
|
u_int8_t version_max;
|
|
u_int8_t version_active;
|
|
|
|
u_int8_t ahslen;
|
|
u_int8_t datalen[3];
|
|
|
|
u_int32_t isid_base;
|
|
u_int16_t isid_qual;
|
|
u_int16_t tsih;
|
|
|
|
u_int32_t itt;
|
|
|
|
u_int8_t _reserved1[4];
|
|
|
|
u_int32_t statsn;
|
|
|
|
u_int32_t expcmdsn;
|
|
|
|
u_int32_t maxcmdsn;
|
|
|
|
u_int8_t status_class;
|
|
u_int8_t status_detail;
|
|
|
|
u_int8_t _reserved2[10];
|
|
} __packed;
|
|
|
|
struct iscsi_pdu_logout_request {
|
|
u_int8_t opcode;
|
|
u_int8_t flags;
|
|
u_int8_t _reserved1[2];
|
|
|
|
u_int8_t ahslen;
|
|
u_int8_t datalen[3];
|
|
|
|
u_int8_t _reserved2[8];
|
|
|
|
u_int32_t itt;
|
|
|
|
u_int16_t cid;
|
|
u_int8_t _reserved3[2];
|
|
|
|
u_int32_t cmdsn;
|
|
|
|
u_int32_t expstatsn;
|
|
|
|
u_int8_t _reserved4[16];
|
|
} __packed;
|
|
|
|
#define ISCSI_LOGOUT_F 0x80
|
|
#define ISCSI_LOGOUT_CLOSE_SESS 0
|
|
#define ISCSI_LOGOUT_CLOSE_CONN 1
|
|
#define ISCSI_LOGOUT_RCVRY_CONN 2
|
|
|
|
#define ISCSI_LOGOUT_RESP_SUCCESS 0
|
|
#define ISCSI_LOGOUT_RESP_UNKN_CID 1
|
|
#define ISCSI_LOGOUT_RESP_NO_SUPPORT 2
|
|
#define ISCSI_LOGOUT_RESP_ERROR 3
|
|
|
|
struct iscsi_pdu_logout_response {
|
|
u_int8_t opcode;
|
|
u_int8_t flags;
|
|
u_int8_t response;
|
|
u_int8_t _reserved1;
|
|
|
|
u_int8_t ahslen;
|
|
u_int8_t datalen[3];
|
|
|
|
u_int8_t _reserved2[8];
|
|
|
|
u_int32_t itt;
|
|
|
|
u_int8_t _reserved3[4];
|
|
|
|
u_int32_t statsn;
|
|
|
|
u_int32_t expcmdsn;
|
|
|
|
u_int32_t maxcmdsn;
|
|
|
|
u_int8_t _reserved4[4];
|
|
|
|
u_int16_t time2wait;
|
|
u_int16_t time2retain;
|
|
|
|
u_int8_t _reserved5[4];
|
|
} __packed;
|
|
|
|
struct iscsi_pdu_snack_request {
|
|
u_int8_t opcode;
|
|
u_int8_t flags;
|
|
u_int8_t _reserved1[2];
|
|
|
|
u_int8_t ahslen;
|
|
u_int8_t datalen[3];
|
|
|
|
u_int8_t lun[8];
|
|
|
|
u_int32_t itt;
|
|
|
|
u_int32_t ttt;
|
|
|
|
u_int8_t _reserved2[4];
|
|
|
|
u_int32_t expstatsn;
|
|
|
|
u_int8_t _reserved3[8];
|
|
|
|
u_int32_t begrun;
|
|
|
|
u_int32_t runlength;
|
|
} __packed;
|
|
|
|
struct iscsi_pdu_reject {
|
|
u_int8_t opcode;
|
|
u_int8_t flags;
|
|
u_int8_t reason;
|
|
u_int8_t _reserved1;
|
|
|
|
u_int8_t ahslen;
|
|
u_int8_t datalen[3];
|
|
|
|
u_int8_t _reserved2[8];
|
|
|
|
u_int32_t ffffffff;
|
|
|
|
u_int8_t _reserved3[4];
|
|
|
|
u_int32_t statsn;
|
|
|
|
u_int32_t expcmdsn;
|
|
|
|
u_int32_t maxcmdsn;
|
|
|
|
u_int32_t datasn_r2tsn;
|
|
|
|
u_int8_t _reserved4[8];
|
|
} __packed;
|
|
|
|
struct iscsi_pdu_nop_out {
|
|
u_int8_t opcode;
|
|
u_int8_t flags;
|
|
u_int8_t _reserved1[2];
|
|
|
|
u_int8_t ahslen;
|
|
u_int8_t datalen[3];
|
|
|
|
u_int8_t lun[8];
|
|
|
|
u_int32_t itt;
|
|
|
|
u_int32_t ttt;
|
|
|
|
u_int32_t cmdsn;
|
|
|
|
u_int32_t expstatsn;
|
|
|
|
u_int8_t _reserved2[16];
|
|
} __packed;
|
|
|
|
struct iscsi_pdu_nop_in {
|
|
u_int8_t opcode;
|
|
u_int8_t flags;
|
|
u_int8_t _reserved1[2];
|
|
|
|
u_int8_t ahslen;
|
|
u_int8_t datalen[3];
|
|
|
|
u_int8_t lun[8];
|
|
|
|
u_int32_t itt;
|
|
|
|
u_int32_t ttt;
|
|
|
|
u_int32_t statsn;
|
|
|
|
u_int32_t expcmdsn;
|
|
|
|
u_int32_t maxcmdsn;
|
|
|
|
u_int8_t _reserved2[12];
|
|
} __packed;
|
|
|
|
#endif /* _SCSI_ISCSI_H */
|