📄 iscsi-protocol.h
字号:
#ifndef ISCSI_PROTOCOL_H_#define ISCSI_PROTOCOL_H_/* * iSCSI connection daemon * Copyright (C) 2001 Cisco Systems, Inc. * maintained by linux-iscsi@cisco.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published * by the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * See the file COPYING included with this distribution for more details. * * $Id: iscsi-protocol.h,v 1.16 2002/10/08 20:01:38 smferris Exp $ * * This file sets up definitions of messages and constants used by the * iSCSI protocol. * */#ifdef __cplusplusextern "C" {#endif#if defined(VXWORKS)# include <vxWorks.h>#elif defined(LINUX)# ifdef __KERNEL__# include <linux/types.h># include <asm/byteorder.h># ifdef __BIG_ENDIAN_BITFIELD# define ISCSI_BIG_ENDIAN_BITFIELD 1# endif# else# include <stdint.h> # if (__BYTE_ORDER == __BIG_ENDIAN)# define ISCSI_BIG_ENDIAN_BITFIELD 1# endif# endif typedef uint8_t UINT8; typedef uint16_t UINT16; typedef uint32_t UINT32;#elif defined(SOLARIS)# include <sys/types.h># include <sys/isa_defs.h># if defined (_BIG_ENDIAN)# define ISCSI_BIG_ENDIAN_BITFIELD 1# endif typedef uint8_t UINT8; typedef uint16_t UINT16; typedef uint32_t UINT32;#else# if (__BYTE_ORDER == __BIG_ENDIAN)# define ISCSI_BIG_ENDIAN_BITFIELD 1# endif /* FIXME: probably ok for ILP32 and LP64, but not ILP64 */ typedef unsigned char UINT8; typedef unsigned short UINT16; typedef unsigned int UINT32;#endif/* iSCSI listen port for incoming connections */#define ISCSI_LISTEN_PORT 3260/* assumes a pointer to a 3-byte array */#define ntoh24(p) (((p)[0] << 16) | ((p)[1] << 8) | ((p)[2]))/* assumes a pointer to a 3 byte array, and an integer value */#define hton24(p, v) {\ p[0] = (((v) >> 16) & 0xFF); \ p[1] = (((v) >> 8) & 0xFF); \ p[2] = ((v) & 0xFF); \} /* for Login min, max, active version fields */#define ISCSI_MIN_VERSION 0x00#define ISCSI_DRAFT8_VERSION 0x02 #define ISCSI_DRAFT16_VERSION 0x00#define ISCSI_MAX_VERSION 0x02/* Min. and Max. length of a PDU we can support */#define MIN_PDU_LENGTH (8 << 9) // 4KB#define MAX_PDU_LENGTH (0xffffffff) // Huge/* Padding word length */#define PAD_WORD_LEN 4/* Max. number of Key=Value pairs in a text message */#define MAX_KEY_VALUE_PAIRS 8192/* Reserved value for initiator/target task tag */#define RSVD_TASK_TAG 0xffffffff/* maximum length for text keys/values */#define KEY_MAXLEN 64#define VALUE_MAXLEN 255#define TARGET_NAME_MAXLEN VALUE_MAXLEN/* iSCSI Template Message Header */struct IscsiHdr { UINT8 opcode;#ifdef ISCSI_BIG_ENDIAN_BITFIELD UINT8 final:1, // Final (or Poll) bit rsvd1:7;#else UINT8 rsvd1:7, final:1;#endif UINT8 rsvd2[2]; UINT8 hlength; /* AHSs total length */ UINT8 dlength[3]; /* Data length */ UINT8 lun[8]; UINT32 itt; /* Initiator Task Tag */ UINT8 other[28];};/* Opcode encoding bits */#define ISCSI_OP_RETRY 0x80#define ISCSI_OP_IMMEDIATE 0x40#define ISCSI_OP_RSP 0x00 /* The 2 MSB not set anymore */#define ISCSI_OPCODE_MASK 0x3F/* Client to Server Message Opcode values */#define ISCSI_OP_NOOP_OUT 0x00#define ISCSI_OP_SCSI_CMD 0x01#define ISCSI_OP_SCSI_TASK_MGT_MSG 0x02#define ISCSI_OP_LOGIN_CMD 0x03#define ISCSI_OP_TEXT_CMD 0x04#define ISCSI_OP_SCSI_DATA 0x05#define ISCSI_OP_LOGOUT_CMD 0x06#define ISCSI_OP_SNACK_CMD 0x10/* Server to Client Message Opcode values */#define ISCSI_OP_NOOP_IN (0x20 | ISCSI_OP_RSP)#define ISCSI_OP_SCSI_RSP (0x21 | ISCSI_OP_RSP)#define ISCSI_OP_SCSI_TASK_MGT_RSP (0x22 | ISCSI_OP_RSP)#define ISCSI_OP_LOGIN_RSP (0x23 | ISCSI_OP_RSP)#define ISCSI_OP_TEXT_RSP (0x24 | ISCSI_OP_RSP)#define ISCSI_OP_SCSI_DATA_RSP (0x25 | ISCSI_OP_RSP)#define ISCSI_OP_LOGOUT_RSP (0x26 | ISCSI_OP_RSP)#define ISCSI_OP_RTT_RSP (0x31 | ISCSI_OP_RSP)#define ISCSI_OP_ASYNC_EVENT (0x32 | ISCSI_OP_RSP)#define ISCSI_OP_REJECT_MSG (0x3f | ISCSI_OP_RSP)struct IscsiCmdFlags {#ifdef ISCSI_BIG_ENDIAN_BITFIELD UINT8 final:1, read_data:1, write_data:1, rsvd1:2, attr:3; /* see SCSI Command Attribute values below */#else UINT8 attr:3, rsvd1:2, write_data:1, read_data:1, final:1;#endif};/* SCSI Command Header */struct IscsiScsiCmdHdr { UINT8 opcode; struct IscsiCmdFlags flags; UINT8 rsvd2; UINT8 cmdrn; UINT8 hlength; UINT8 dlength[3]; UINT8 lun[8]; UINT32 itt; /* Initiator Task Tag */ UINT32 data_length; UINT32 cmdsn; UINT32 expstatsn; UINT8 scb[16]; /* SCSI Command Block */ /* Additional Data (Command Dependent) */};/* SCSI Command Attribute values */#define ISCSI_ATTR_UNTAGGED 0#define ISCSI_ATTR_SIMPLE 1#define ISCSI_ATTR_ORDERED 2#define ISCSI_ATTR_HEAD_OF_QUEUE 3#define ISCSI_ATTR_ACA 4struct IscsiCmdRespFlags {#ifdef ISCSI_BIG_ENDIAN_BITFIELD UINT8 fbit:1, rsvd1:2, bidi_overflow:1, bidi_undeflow:1, overflow:1, underflow:1, rsvd2:1;#else UINT8 rsvd2:1, underflow:1, overflow:1, bidi_underflow:1, bidi_overflow:1, rsvd1:2, fbit:1;#endif};/* SCSI Response Header */struct IscsiScsiRspHdr { UINT8 opcode; struct IscsiCmdRespFlags flags; UINT8 response; UINT8 cmd_status; UINT8 hlength; UINT8 dlength[3]; UINT8 rsvd[8]; UINT32 itt; /* Initiator Task Tag */ UINT32 rsvd1; UINT32 statsn; UINT32 expcmdsn; UINT32 maxcmdsn; UINT32 expdatasn; UINT32 bi_residual_count; UINT32 residual_count; /* Response or Sense Data (optional) */};/* iSCSI Status values. Valid if Rsp Selector bit is not set */#define ISCSI_STATUS_CMD_COMPLETED 0#define ISCSI_STATUS_TARGET_FAILURE 1#define ISCSI_STATUS_SUBSYS_FAILURE 2/* Asynchronous Event Header */struct IscsiAsyncEvtHdr { UINT8 opcode;#ifdef ISCSI_BIG_ENDIAN_BITFIELD UINT8 fbit:1, rsvd1:7;#else UINT8 rsvd1:7, fbit:1;#endif UINT8 rsvd2[2]; UINT8 rsvd3; UINT8 dlength[3]; UINT8 lun[8]; UINT8 rsvd4[8]; UINT32 statsn; UINT32 expcmdsn; UINT32 maxcmdsn; UINT8 async_event; UINT8 async_vcode; UINT16 param1; UINT16 param2; UINT16 param3; UINT8 rsvd5[4];};/* iSCSI Event Indicator values */#define ASYNC_EVENT_SCSI_EVENT 0#define ASYNC_EVENT_REQUEST_LOGOUT 1#define ASYNC_EVENT_DROPPING_CONNECTION 2#define ASYNC_EVENT_DROPPING_ALL_CONNECTIONS 3#define ASYNC_EVENT_PARAM_NEGOTIATION 4#define ASYNC_EVENT_VENDOR_SPECIFIC 255/* NOP-Out Message */struct IscsiNopOutHdr { UINT8 opcode;#ifdef ISCSI_BIG_ENDIAN_BITFIELD UINT8 poll:1, rsvd1:7;#else UINT8 rsvd1:7, poll:1;#endif UINT16 rsvd2; UINT8 rsvd3; UINT8 dlength[3]; UINT8 lun[8]; UINT32 itt; /* Initiator Task Tag */ UINT32 ttt; /* Target Transfer Tag */ UINT32 cmdsn; UINT32 expstatsn; UINT8 rsvd4[16];};/* NOP-In Message */struct IscsiNopInHdr { UINT8 opcode;#ifdef ISCSI_BIG_ENDIAN_BITFIELD UINT8 fbit:1, rsvd1:7;#else UINT8 rsvd1:7, fbit:1;#endif UINT16 rsvd2; UINT8 rsvd3; UINT8 dlength[3]; UINT8 lun[8]; UINT32 itt; /* Initiator Task Tag */ UINT32 ttt; /* Target Transfer Tag */ UINT32 statsn; UINT32 expcmdsn; UINT32 maxcmdsn; UINT8 rsvd4[12];};/* SCSI Task Management Message Header */struct IscsiScsiTaskMgtHdr { UINT8 opcode;#ifdef ISCSI_BIG_ENDIAN_BITFIELD UINT8 fbit:1, function:7; /* see Function values below */#else UINT8 function:7, fbit:1;#endif UINT8 rsvd1[2]; UINT8 hlength; UINT8 dlength[3]; UINT8 lun[8]; UINT32 itt; /* Initiator Task Tag */ UINT32 rtt; /* Reference Task Tag */ UINT32 cmdsn; UINT32 expstatsn; UINT32 refcmdsn; UINT32 expdatasn; UINT8 rsvd2[8];};/* Function values */#define ISCSI_TM_FUNC_ABORT_TASK 1#define ISCSI_TM_FUNC_ABORT_TASK_SET 2#define ISCSI_TM_FUNC_CLEAR_ACA 3#define ISCSI_TM_FUNC_CLEAR_TASK_SET 4#define ISCSI_TM_FUNC_LOGICAL_UNIT_RESET 5#define ISCSI_TM_FUNC_TARGET_WARM_RESET 6#define ISCSI_TM_FUNC_TARGET_COLD_RESET 7#define ISCSI_TM_FUNC_TASK_REASSIGN 8/* SCSI Task Management Response Header */struct IscsiScsiTaskMgtRspHdr { UINT8 opcode;#ifdef ISCSI_BIG_ENDIAN_BITFIELD UINT8 fbit:1, rsvd1:7;#else UINT8 rsvd1:7, fbit:1;#endif UINT8 response; /* see Response values below */ UINT8 qualifier; UINT8 hlength; UINT8 dlength[3]; UINT8 rsvd2[8]; UINT32 itt; /* Initiator Task Tag */ UINT32 rtt; /* Reference Task Tag */ UINT32 statsn; UINT32 expcmdsn; UINT32 maxcmdsn;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -