Annotation of embedaddon/istgt/src/istgt_iscsi.h, revision 1.1
1.1 ! misho 1: /*
! 2: * Copyright (C) 2008-2011 Daisuke Aoyama <aoyama@peach.ne.jp>.
! 3: * All rights reserved.
! 4: *
! 5: * Redistribution and use in source and binary forms, with or without
! 6: * modification, are permitted provided that the following conditions
! 7: * are met:
! 8: * 1. Redistributions of source code must retain the above copyright
! 9: * notice, this list of conditions and the following disclaimer.
! 10: * 2. Redistributions in binary form must reproduce the above copyright
! 11: * notice, this list of conditions and the following disclaimer in the
! 12: * documentation and/or other materials provided with the distribution.
! 13: *
! 14: * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
! 15: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
! 16: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
! 17: * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
! 18: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
! 19: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
! 20: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
! 21: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
! 22: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
! 23: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
! 24: * SUCH DAMAGE.
! 25: *
! 26: */
! 27:
! 28: #ifndef ISTGT_ISCSI_H
! 29: #define ISTGT_ISCSI_H
! 30:
! 31: #include <stdint.h>
! 32: #include <pthread.h>
! 33: #include "istgt.h"
! 34: #include "istgt_iscsi_param.h"
! 35: #include "istgt_lu.h"
! 36: #include "istgt_queue.h"
! 37:
! 38: #define ISCSI_BHS_LEN 48
! 39: #define ISCSI_DIGEST_LEN 4
! 40: #define ISCSI_ALIGNMENT 4
! 41: /* support version - RFC3720(10.12.4) */
! 42: #define ISCSI_VERSION 0x00
! 43:
! 44: #define ISCSI_ALIGN(SIZE) \
! 45: (((SIZE) + (ISCSI_ALIGNMENT - 1)) & ~(ISCSI_ALIGNMENT - 1))
! 46:
! 47: #define ISCSI_TEXT_MAX_KEY_LEN 64
! 48: /* for authentication key (non encoded 1024bytes) RFC3720(5.1/11.1.4) */
! 49: #define ISCSI_TEXT_MAX_VAL_LEN 8192
! 50:
! 51: #define SESS_MTX_LOCK(CONN) \
! 52: do { \
! 53: if (pthread_mutex_lock(&(CONN)->sess->mutex) != 0) { \
! 54: ISTGT_ERRLOG("sess lock error\n"); \
! 55: pthread_exit(NULL); \
! 56: } \
! 57: } while (0)
! 58: #define SESS_MTX_UNLOCK(CONN) \
! 59: do { \
! 60: if (pthread_mutex_unlock(&(CONN)->sess->mutex) != 0) { \
! 61: ISTGT_ERRLOG("sess unlock error\n"); \
! 62: pthread_exit(NULL); \
! 63: } \
! 64: } while (0)
! 65:
! 66: typedef enum {
! 67: /* Initiator opcodes */
! 68: ISCSI_OP_NOPOUT = 0x00,
! 69: ISCSI_OP_SCSI = 0x01,
! 70: ISCSI_OP_TASK = 0x02,
! 71: ISCSI_OP_LOGIN = 0x03,
! 72: ISCSI_OP_TEXT = 0x04,
! 73: ISCSI_OP_SCSI_DATAOUT = 0x05,
! 74: ISCSI_OP_LOGOUT = 0x06,
! 75: ISCSI_OP_SNACK = 0x10,
! 76: ISCSI_OP_VENDOR_1C = 0x1c,
! 77: ISCSI_OP_VENDOR_1D = 0x1d,
! 78: ISCSI_OP_VENDOR_1E = 0x1e,
! 79:
! 80: /* Target opcodes */
! 81: ISCSI_OP_NOPIN = 0x20,
! 82: ISCSI_OP_SCSI_RSP = 0x21,
! 83: ISCSI_OP_TASK_RSP = 0x22,
! 84: ISCSI_OP_LOGIN_RSP = 0x23,
! 85: ISCSI_OP_TEXT_RSP = 0x24,
! 86: ISCSI_OP_SCSI_DATAIN = 0x25,
! 87: ISCSI_OP_LOGOUT_RSP = 0x26,
! 88: ISCSI_OP_R2T = 0x31,
! 89: ISCSI_OP_ASYNC = 0x32,
! 90: ISCSI_OP_VENDOR_3C = 0x3c,
! 91: ISCSI_OP_VENDOR_3D = 0x3d,
! 92: ISCSI_OP_VENDOR_3E = 0x3e,
! 93: ISCSI_OP_REJECT = 0x3f,
! 94: } ISCSI_OP;
! 95:
! 96: typedef enum {
! 97: ISCSI_TASK_FUNC_ABORT_TASK = 1,
! 98: ISCSI_TASK_FUNC_ABORT_TASK_SET = 2,
! 99: ISCSI_TASK_FUNC_CLEAR_ACA = 3,
! 100: ISCSI_TASK_FUNC_CLEAR_TASK_SET = 4,
! 101: ISCSI_TASK_FUNC_LOGICAL_UNIT_RESET = 5,
! 102: ISCSI_TASK_FUNC_TARGET_WARM_RESET = 6,
! 103: ISCSI_TASK_FUNC_TARGET_COLD_RESET = 7,
! 104: ISCSI_TASK_FUNC_TASK_REASSIGN = 8,
! 105: } ISCSI_TASK_FUNC;
! 106:
! 107: typedef struct iscsi_bhs_t {
! 108: /* 0-3 */
! 109: uint8_t opcode;
! 110: uint8_t opcode_specific1[3];
! 111: /* 4-7 */
! 112: uint8_t total_ahs_len;
! 113: uint8_t data_segment_len[3];
! 114: /* 8-11 */
! 115: union {
! 116: uint8_t lun1[4];
! 117: uint8_t opcode_specific2[4];
! 118: } u1;
! 119: /* 12-15 */
! 120: union {
! 121: uint8_t lun2[4];
! 122: uint8_t opcode_specific3[4];
! 123: } u2;
! 124: /* 16-19 */
! 125: uint8_t inititator_task_tag[4];
! 126: /* 20-47 */
! 127: uint8_t opcode_specific4[28];
! 128: } ISCSI_BHS;
! 129:
! 130: typedef struct iscsi_ahs_t {
! 131: /* 0-3 */
! 132: uint8_t ahs_len[2];
! 133: uint8_t ahs_type;
! 134: uint8_t ahs_specific1;
! 135: /* 4-x */
! 136: uint8_t ahs_specific2[];
! 137: } ISCSI_AHS;
! 138:
! 139: typedef struct iscsi_pdu_t {
! 140: ISCSI_BHS bhs;
! 141: ISCSI_AHS *ahs;
! 142: uint8_t header_digest[ISCSI_DIGEST_LEN];
! 143: uint8_t shortdata[ISTGT_SHORTDATASIZE];
! 144: uint8_t *data;
! 145: uint8_t data_digest[ISCSI_DIGEST_LEN];
! 146: int total_ahs_len;
! 147: int data_segment_len;
! 148: int copy_pdu;
! 149: } ISCSI_PDU;
! 150: typedef ISCSI_PDU *ISCSI_PDU_Ptr;
! 151:
! 152: typedef enum {
! 153: CONN_STATE_INVALID = 0,
! 154: CONN_STATE_RUNNING = 1,
! 155: CONN_STATE_EXITING = 2,
! 156: CONN_STATE_SHUTDOWN = 3,
! 157: } CONN_STATE;
! 158:
! 159: typedef enum {
! 160: ISCSI_LOGIN_PHASE_NONE = 0,
! 161: ISCSI_LOGIN_PHASE_START = 1,
! 162: ISCSI_LOGIN_PHASE_SECURITY = 2,
! 163: ISCSI_LOGIN_PHASE_OPERATIONAL = 3,
! 164: ISCSI_LOGIN_PHASE_FULLFEATURE = 4,
! 165: } ISCSI_LOGIN_PHASE;
! 166:
! 167: typedef enum {
! 168: ISTGT_CHAP_PHASE_NONE = 0,
! 169: ISTGT_CHAP_PHASE_WAIT_A = 1,
! 170: ISTGT_CHAP_PHASE_WAIT_NR = 2,
! 171: ISTGT_CHAP_PHASE_END = 3,
! 172: } ISTGT_CHAP_PHASE;
! 173:
! 174: #define ISTGT_CHAP_CHALLENGE_LEN 1024
! 175: typedef struct istgt_chap_auth_t {
! 176: ISTGT_CHAP_PHASE chap_phase;
! 177:
! 178: char *user;
! 179: char *secret;
! 180: char *muser;
! 181: char *msecret;
! 182:
! 183: uint8_t chap_id[1];
! 184: uint8_t chap_mid[1];
! 185: int chap_challenge_len;
! 186: uint8_t chap_challenge[ISTGT_CHAP_CHALLENGE_LEN];
! 187: int chap_mchallenge_len;
! 188: uint8_t chap_mchallenge[ISTGT_CHAP_CHALLENGE_LEN];
! 189: } ISTGT_CHAP_AUTH;
! 190:
! 191: typedef struct istgt_r2t_task_t {
! 192: struct istgt_conn_t *conn;
! 193: ISTGT_LU_Ptr lu;
! 194: uint64_t lun;
! 195: uint32_t CmdSN;
! 196: uint32_t task_tag;
! 197: uint32_t transfer_len;
! 198: uint32_t transfer_tag;
! 199:
! 200: int iobufsize;
! 201: uint8_t *iobuf;
! 202:
! 203: uint32_t R2TSN;
! 204: uint32_t DataSN;
! 205: int F_bit;
! 206: int offset;
! 207: } ISTGT_R2T_TASK;
! 208: typedef ISTGT_R2T_TASK *ISTGT_R2T_TASK_Ptr;
! 209:
! 210: typedef struct istgt_conn_t {
! 211: int id;
! 212:
! 213: ISTGT_Ptr istgt;
! 214: PORTAL portal;
! 215: int sock;
! 216: int wsock;
! 217: #ifdef ISTGT_USE_KQUEUE
! 218: int kq;
! 219: #endif /* ISTGT_USE_KQUEUE */
! 220: int use_sender;
! 221: pthread_t thread;
! 222: pthread_t sender_thread;
! 223: pthread_mutex_t sender_mutex;
! 224: pthread_cond_t sender_cond;
! 225: struct istgt_sess_t *sess;
! 226:
! 227: CONN_STATE state;
! 228: int exec_logout;
! 229:
! 230: int max_pending;
! 231: int queue_depth;
! 232: pthread_mutex_t wpdu_mutex;
! 233: pthread_cond_t wpdu_cond;
! 234: ISTGT_QUEUE pending_pdus;
! 235: ISCSI_PDU pdu;
! 236:
! 237: int max_r2t;
! 238: int pending_r2t;
! 239: pthread_mutex_t r2t_mutex;
! 240: ISTGT_R2T_TASK_Ptr *r2t_tasks;
! 241:
! 242: int task_pipe[2];
! 243: int max_task_queue;
! 244: pthread_mutex_t task_queue_mutex;
! 245: ISTGT_QUEUE task_queue;
! 246: pthread_mutex_t result_queue_mutex;
! 247: pthread_cond_t result_queue_cond;
! 248: ISTGT_QUEUE result_queue;
! 249: ISTGT_LU_TASK_Ptr exec_lu_task;
! 250: int running_tasks;
! 251:
! 252: uint16_t cid;
! 253:
! 254: /* IP address */
! 255: int initiator_family;
! 256: char initiator_addr[MAX_INITIATOR_ADDR];
! 257: char target_addr[MAX_TARGET_ADDR];
! 258:
! 259: /* Initiator/Target port binds */
! 260: char initiator_name[MAX_INITIATOR_NAME];
! 261: char target_name[MAX_TARGET_NAME];
! 262: char initiator_port[MAX_INITIATOR_NAME];
! 263: char target_port[MAX_TARGET_NAME];
! 264:
! 265: /* for fast access */
! 266: int header_digest;
! 267: int data_digest;
! 268: int full_feature;
! 269:
! 270: ISCSI_PARAM *params;
! 271: ISCSI_LOGIN_PHASE login_phase;
! 272: ISTGT_CHAP_AUTH auth;
! 273: int authenticated;
! 274: int req_auth;
! 275: int req_mutual;
! 276:
! 277: int timeout;
! 278: int nopininterval;
! 279:
! 280: int TargetMaxRecvDataSegmentLength;
! 281: int MaxRecvDataSegmentLength;
! 282: int MaxOutstandingR2T;
! 283: int FirstBurstLength;
! 284: int MaxBurstLength;
! 285:
! 286: int shortpdusize;
! 287: uint8_t *shortpdu;
! 288:
! 289: int iobufsize;
! 290: uint8_t *iobuf;
! 291: int snsbufsize;
! 292: uint8_t *snsbuf;
! 293:
! 294: int recvbufsize;
! 295: int sendbufsize;
! 296: uint8_t *recvbuf;
! 297: uint8_t *sendbuf;
! 298:
! 299: int worksize;
! 300: uint8_t *workbuf;
! 301:
! 302: uint32_t StatSN;
! 303: } CONN;
! 304: typedef CONN *CONN_Ptr;
! 305:
! 306: typedef struct istgt_sess_t {
! 307: int connections;
! 308: int max_conns;
! 309: CONN_Ptr *conns;
! 310:
! 311: pthread_mutex_t mutex;
! 312: pthread_cond_t mcs_cond;
! 313: int req_mcs_cond;
! 314:
! 315: char *initiator_port;
! 316: char *target_name;
! 317: int tag;
! 318:
! 319: uint64_t isid;
! 320: uint16_t tsih;
! 321: ISTGT_LU_Ptr lu;
! 322:
! 323: ISCSI_PARAM *params;
! 324:
! 325: int MaxConnections;
! 326: int MaxOutstandingR2T;
! 327: int DefaultTime2Wait;
! 328: int DefaultTime2Retain;
! 329: int FirstBurstLength;
! 330: int MaxBurstLength;
! 331: int InitialR2T;
! 332: int ImmediateData;
! 333: int DataPDUInOrder;
! 334: int DataSequenceInOrder;
! 335: int ErrorRecoveryLevel;
! 336:
! 337: int initial_r2t;
! 338: int immediate_data;
! 339:
! 340: uint32_t ExpCmdSN;
! 341: uint32_t MaxCmdSN;
! 342: } SESS;
! 343: typedef SESS *SESS_Ptr;
! 344:
! 345: #endif /* ISTGT_ISCSI_H */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>