src/sys/scsi/iscsi.h

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 */