summaryrefslogtreecommitdiffstats
path: root/sys/dev/iscsi/initiator/iscsi.h
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/iscsi/initiator/iscsi.h')
-rw-r--r--sys/dev/iscsi/initiator/iscsi.h407
1 files changed, 407 insertions, 0 deletions
diff --git a/sys/dev/iscsi/initiator/iscsi.h b/sys/dev/iscsi/initiator/iscsi.h
new file mode 100644
index 0000000..cbd9f22
--- /dev/null
+++ b/sys/dev/iscsi/initiator/iscsi.h
@@ -0,0 +1,407 @@
+/*-
+ * Copyright (c) 2005-2007 Daniel Braniss <danny@cs.huji.ac.il>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+/*
+ | $Id: iscsi.h,v 1.17 2006/12/01 09:10:17 danny Exp danny $
+ */
+#define TRUE 1
+#define FALSE 0
+#ifndef _KERNEL
+typedef int boolean_t;
+#endif
+
+#include <cam/cam.h>
+
+#define ISCSIDEV "iscsi"
+
+#define ISCSI_MAX_TARGETS 4 //64
+
+#define ISCSI_MAX_LUNS 4
+
+/*
+ | iSCSI commands
+ */
+
+/*
+ | Initiator Opcodes:
+ */
+#define ISCSI_NOP_OUT 0x00
+#define ISCSI_SCSI_CMD 0x01
+#define ISCSI_TASK_CMD 0x02
+#define ISCSI_LOGIN_CMD 0x03
+#define ISCSI_TEXT_CMD 0x04
+#define ISCSI_WRITE_DATA 0x05
+#define ISCSI_LOGOUT_CMD 0x06
+#define ISCSI_SNACK 0x10
+/*
+ | Target Opcodes:
+ */
+#define ISCSI_NOP_IN 0x20
+#define ISCSI_SCSI_RSP 0x21
+#define ISCSI_TASK_RSP 0x22
+#define ISCSI_LOGIN_RSP 0x23
+#define ISCSI_TEXT_RSP 0x24
+#define ISCSI_READ_DATA 0x25
+#define ISCSI_LOGOUT_RSP 0x26
+#define ISCSI_R2T 0x31
+#define ISCSI_ASYNC 0x32
+#define ISCSI_REJECT 0x3f
+/*
+ | PDU stuff
+ */
+/*
+ | BHS Basic Header Segment
+ */
+typedef struct bhs {
+ // the order is network byte order!
+ u_char opcode:6;
+ u_char I:1;
+ u_char _:1;
+ u_char __:7;
+ u_char F:1; // Final bit
+ u_char ___[2];
+
+ u_int AHSLength:8; // in 4byte words
+ u_int DSLength:24; // in bytes
+
+ u_int LUN[2]; // or Opcode-specific fields
+ u_int itt;
+ u_int OpcodeSpecificFields[7];
+#define CmdSN OpcodeSpecificFields[1]
+#define ExpStSN OpcodeSpecificFields[2]
+#define MaxCmdSN OpcodeSpecificFields[3]
+} bhs_t;
+
+typedef struct ahs {
+ u_int len:16;
+ u_int type:8;
+ u_int spec:8;
+ char data[0];
+} ahs_t;
+
+typedef struct {
+ // Sequence Numbers
+ // (computers were invented to count, right?)
+ int cmd;
+ int expcmd;
+ int maxcmd;
+} req_sn_t;
+
+typedef struct {
+ // Sequence Numbers
+ // (computers were invented to count, right?)
+ int stat;
+ int expcmd;
+ int maxcmd;
+} rsp_sn_t;
+
+typedef struct scsi_req {
+ u_char opcode:6; // 0x01
+ u_char I:1;
+ u_char _:1;
+
+ u_char attr:3;
+ u_char _0:2;
+ u_char W:1;
+ u_char R:1;
+ u_char F:1;
+#define iSCSI_TASK_UNTAGGED 0
+#define iSCSI_TASK_SIMPLE 1
+#define iSCSI_TASK_ORDER 2
+#define iSCSI_TASK_HOFQ 3
+#define iSCSI_TASK_ACA 4
+ char _1[2];
+ int len;
+ int lun[2];
+ int itt;
+ int edtlen; // expectect data transfere length
+ int cmdSN;
+ int extStatSN;
+ int cdb[4];
+} scsi_req_t;
+
+typedef struct scsi_rsp {
+ char opcode; // 0x21
+ u_char flag;
+ u_char response;
+ u_char status;
+
+ int len;
+ int _[2];
+ int itt;
+ int stag;
+ rsp_sn_t sn;
+ int expdatasn;
+ int bdrcnt; // bidirectional residual count
+ int rcnt; // residual count
+} scsi_rsp_t;
+
+typedef struct nop_out {
+ // the order is network byte order!
+ u_char opcode:6;
+ u_char I:1;
+ u_char _:1;
+ u_char __:7;
+ u_char F:1; // Final bit
+ u_char ___[2];
+
+ u_int len;
+ u_int lun[2];
+ u_int itt;
+ u_int ttt;
+ req_sn_t sn;
+ u_int mbz[3];
+} nop_out_t;
+
+typedef struct nop_in {
+ // the order is network byte order!
+ u_char opcode:6;
+ u_char I:1;
+ u_char _:1;
+ u_char __:7;
+ u_char F:1; // Final bit
+ u_char ___[2];
+
+ u_int len;
+ u_int lun[2];
+ u_int itt;
+ u_int ttt;
+ rsp_sn_t sn;
+ u_int ____[2];
+
+} nop_in_t;
+
+typedef struct r2t {
+ u_char opcode:6;
+ u_char I:1;
+ u_char _:1;
+ u_char __:7;
+ u_char F:1; // Final bit
+ u_char ___[2];
+
+ u_int len;
+ u_int lun[2];
+ u_int itt;
+ u_int ttt;
+ rsp_sn_t sn;
+ u_int r2tSN;
+ u_int bo;
+ u_int ddtl;
+} r2t_t;
+
+typedef struct data_out {
+ u_char opcode:6;
+ u_char I:1;
+ u_char _:1;
+ u_char __:7;
+ u_char F:1; // Final bit
+ u_char ___[2];
+
+ u_int len;
+ u_int lun[2];
+ u_int itt;
+ u_int ttt;
+ rsp_sn_t sn;
+ u_int dsn; // data seq. number
+ u_int bo;
+ u_int ____;
+} data_out_t;
+
+typedef struct data_in {
+ u_char opcode:6;
+ u_char I:1;
+ u_char _:1;
+
+ u_char S:1;
+ u_char U:1;
+ u_char O:1;
+ u_char __:3;
+ u_char A:1;
+ u_char F:1; // Final bit
+ u_char ___[1];
+ u_char status;
+
+ u_int len;
+ u_int lun[2];
+ u_int itt;
+ u_int ttt;
+ rsp_sn_t sn;
+ u_int dataSN;
+ u_int bo;
+ u_int ____;
+} data_in_t;
+
+typedef struct reject {
+ u_char opcode:6;
+ u_char _:2;
+ u_char F:1;
+ u_char __:7;
+ u_char reason;
+ u_char ___;
+
+ u_int len;
+ u_int ____[2];
+ u_int tt[2]; // must be -1
+ rsp_sn_t sn;
+ u_int dataSN; // or R2TSN or reserved
+ u_int _____[2];
+} reject_t;
+
+typedef struct async {
+ u_char opcode:6;
+ u_char _:2;
+ u_char F:1;
+ u_char __:7;
+ u_char ___[2];
+
+ u_int len;
+ u_int lun[2];
+ u_int itt; // must be -1
+ u_int ____;
+ rsp_sn_t sn;
+
+ u_char asyncEvent;
+ u_char asyncVCode;
+ u_char param1[2];
+ u_char param2[2];
+ u_char param3[2];
+
+ u_int _____;
+
+} async_t;
+
+union ipdu_u {
+ bhs_t bhs;
+ scsi_req_t scsi_req;
+ scsi_rsp_t scsi_rsp;
+ nop_out_t nop_out;
+ nop_in_t nop_in;
+ r2t_t r2t;
+ data_out_t data_out;
+ data_in_t data_in;
+ reject_t reject;
+ async_t async;
+};
+
+/*
+ | Sequence Numbers
+ */
+typedef struct {
+ u_int itt;
+ u_int cmd;
+ u_int expCmd;
+ u_int maxCmd;
+ u_int stat;
+ u_int expStat;
+ u_int data;
+} sn_t;
+
+/*
+ | in-core version of a Protocol Data Unit
+ */
+typedef struct {
+ union ipdu_u ipdu;
+
+ ahs_t *ahs;
+ u_int ahs_len;
+ u_int ahs_size; // the allocated size
+ u_int hdr_dig; // header digest
+
+ u_char *ds;
+ u_int ds_len;
+ u_int ds_size; // the allocated size
+ u_int ds_dig; // data digest
+} pdu_t;
+
+typedef struct opvals {
+ int port;
+ int tags;
+ int maxluns;
+ int sockbufsize;
+
+ int maxConnections;
+ int maxRecvDataSegmentLength;
+ int maxXmitDataSegmentLength; // pseudo ...
+ int maxBurstLength;
+ int firstBurstLength;
+ int defaultTime2Wait;
+ int defaultTime2Retain;
+ int maxOutstandingR2T;
+ int errorRecoveryLevel;
+ int targetPortalGroupTag;
+
+ boolean_t initialR2T;
+ boolean_t immediateData;
+ boolean_t dataPDUInOrder;
+ boolean_t dataSequenceInOrder;
+ char *headerDigest;
+ char *dataDigest;
+ char *sessionType;
+ char *sendTargets;
+ char *targetAddress;
+ char *targetAlias;
+ char *targetName;
+ char *initiatorName;
+ char *initiatorAlias;
+ char *authMethod;
+ char *chapSecret;
+ char *chapIName;
+ char *chapDigest;
+ char *tgtChapName;
+ char *tgtChapSecret;
+ int tgtChallengeLen;
+ u_char tgtChapID;
+ char *tgtChapDigest;
+ char *iqn;
+} isc_opt_t;
+
+/*
+ | ioctl
+ */
+#define ISCSISETSES _IOR('i', 1, int)
+#define ISCSISETSOC _IOW('i', 2, int)
+#define ISCSISETOPT _IOW('i', 5, isc_opt_t)
+#define ISCSIGETOPT _IOR('i', 6, isc_opt_t)
+
+#define ISCSISEND _IOW('i', 10, pdu_t)
+#define ISCSIRECV _IOWR('i', 11, pdu_t)
+
+#define ISCSIPING _IO('i', 20)
+#define ISCSISIGNAL _IOW('i', 21, int *)
+
+#define ISCSISTART _IO('i', 30)
+#define ISCSIRESTART _IO('i', 31)
+#define ISCSISTOP _IO('i', 32)
+
+typedef struct iscsi_cam {
+ path_id_t path_id;
+ target_id_t target_id;
+ int target_nluns;
+ lun_id_t target_lun[ISCSI_MAX_LUNS];
+} iscsi_cam_t;
+
+#define ISCSIGETCAM _IOR('i', 33, iscsi_cam_t)
OpenPOWER on IntegriCloud