Home | History | Annotate | Line # | Download | only in include
      1 /*
      2  * IMPORTANT:  READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
      3  * By downloading, copying, installing or using the software you agree
      4  * to this license.  If you do not agree to this license, do not
      5  * download, install, copy or use the software.
      6  *
      7  * Intel License Agreement
      8  *
      9  * Copyright (c) 2000, Intel Corporation
     10  * All rights reserved.
     11  *
     12  * Redistribution and use in source and binary forms, with or without
     13  * modification, are permitted provided that the following conditions
     14  * are met:
     15  *
     16  * -Redistributions of source code must retain the above copyright
     17  *  notice, this list of conditions and the following disclaimer.
     18  *
     19  * -Redistributions in binary form must reproduce the above copyright
     20  *  notice, this list of conditions and the following disclaimer in the
     21  *  documentation and/or other materials provided with the
     22  *  distribution.
     23  *
     24  * -The name of Intel Corporation may not be used to endorse or
     25  *  promote products derived from this software without specific prior
     26  *  written permission.
     27  *
     28  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     29  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     30  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
     31  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL INTEL
     32  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     33  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     34  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
     35  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
     36  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
     37  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
     38  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     39  * SUCH DAMAGE.
     40  */
     41 #ifndef ISCSI_H
     42 #define ISCSI_H
     43 
     44 #include "iscsiutil.h"
     45 
     46 /*
     47  * iSCSI Version 18
     48  */
     49 
     50 #define ISCSI_VENDOR	"NetBSD"
     51 #define ISCSI_PRODUCT	"NetBSD iSCSI"
     52 #define ISCSI_VERSION	0
     53 
     54 /*
     55  * Parameters
     56  */
     57 
     58 #define ISCSI_IMMEDIATE_DATA_DFLT            1
     59 #define ISCSI_INITIAL_R2T_DFLT               1
     60 #define ISCSI_USE_PHASE_COLLAPSED_READ_DFLT  0
     61 #define ISCSI_HEADER_LEN                     48
     62 #define ISCSI_PORT                           3260	/* Default port */
     63 #define ISCSI_OPCODE(HEADER)                 (HEADER[0] & 0x3f)
     64 
     65 #define ISCSI_FIRST_BURST                    (ISCSI_FIRST_BURST_DFLT)
     66 #define ISCSI_DATA_PDU_LENGTH                (ISCSI_DATA_PDU_LENGTH_DFLT)
     67 
     68 /*
     69  * Opcodes
     70  */
     71 enum {
     72 	ISCSI_NOP_OUT       = 0x00,
     73 	ISCSI_SCSI_CMD      = 0x01,
     74 	ISCSI_TASK_CMD      = 0x02,
     75 	ISCSI_LOGIN_CMD     = 0x03,
     76 	ISCSI_TEXT_CMD      = 0x04,
     77 	ISCSI_WRITE_DATA    = 0x05,
     78 	ISCSI_LOGOUT_CMD    = 0x06,
     79 	ISCSI_SNACK         = 0x10,	/* not implemented */
     80 	ISCSI_NOP_IN        = 0x20,
     81 	ISCSI_SCSI_RSP      = 0x21,
     82 	ISCSI_TASK_RSP      = 0x22,
     83 	ISCSI_LOGIN_RSP     = 0x23,
     84 	ISCSI_TEXT_RSP      = 0x24,
     85 	ISCSI_READ_DATA     = 0x25,
     86 	ISCSI_LOGOUT_RSP    = 0x26,
     87 	ISCSI_R2T           = 0x31,
     88 	ISCSI_ASYNC         = 0x32,
     89 	ISCSI_REJECT        = 0x3f
     90 };
     91 
     92 enum {
     93 	ISCSI_AHS_EXTENDED_CDB	= 0x01,
     94 	ISCSI_AHS_BIDI_READ	= 0x02
     95 };
     96 
     97 /*
     98  * Login Phase
     99  */
    100 enum {
    101 	ISCSI_LOGIN_STATUS_SUCCESS          = 0,
    102 	ISCSI_LOGIN_STATUS_REDIRECTION      = 1,
    103 	ISCSI_LOGIN_STATUS_INITIATOR_ERROR  = 2,
    104 	ISCSI_LOGIN_STATUS_TARGET_ERROR     = 3,
    105 
    106 	ISCSI_LOGIN_STAGE_SECURITY          = 0,
    107 	ISCSI_LOGIN_STAGE_NEGOTIATE         = 1,
    108 	ISCSI_LOGIN_STAGE_FULL_FEATURE      = 3
    109 };
    110 
    111 /* detailed return codes for login phase */
    112 enum {
    113 	ISCSI_LOGIN_DETAIL_SUCCESS = 0x0,
    114 	ISCSI_LOGIN_DETAIL_INIT_AUTH_FAILURE = 0x01,
    115 	ISCSI_LOGIN_DETAIL_VERSION_NOT_SUPPORTED = 0x05,
    116 	ISCSI_LOGIN_DETAIL_NOT_LOGGED_IN = 0x0b
    117 };
    118 
    119 
    120 /*
    121  * Logout Phase
    122  */
    123 enum {
    124 	ISCSI_LOGOUT_CLOSE_SESSION      = 0,
    125 	ISCSI_LOGOUT_CLOSE_CONNECTION   = 1,
    126 	ISCSI_LOGOUT_CLOSE_RECOVERY     = 2,
    127 
    128 	ISCSI_LOGOUT_STATUS_SUCCESS     = 0,
    129 	ISCSI_LOGOUT_STATUS_NO_CID      = 1,
    130 	ISCSI_LOGOUT_STATUS_NO_RECOVERY = 2,
    131 	ISCSI_LOGOUT_STATUS_FAILURE     = 3
    132 };
    133 
    134 
    135 /*
    136  * Task Command
    137  */
    138 enum {
    139 	ISCSI_TASK_CMD_ABORT_TASK           = 1,
    140 	ISCSI_TASK_CMD_ABORT_TASK_SET       = 2,
    141 	ISCSI_TASK_CMD_CLEAR_ACA            = 3,
    142 	ISCSI_TASK_CMD_CLEAR_TASK_SET       = 4,
    143 	ISCSI_TASK_CMD_LOGICAL_UNIT_RESET   = 5,
    144 	ISCSI_TASK_CMD_TARGET_WARM_RESET    = 6,
    145 	ISCSI_TASK_CMD_TARGET_COLD_RESET    = 7,
    146 	ISCSI_TASK_CMD_TARGET_REASSIGN      = 8
    147 };
    148 
    149 typedef struct iscsi_task_cmd_t {
    150 	int32_t         immediate;
    151 	uint8_t         function;
    152 	uint64_t        lun;
    153 	uint32_t        tag;
    154 	uint32_t        ref_tag;
    155 	uint32_t        CmdSN;
    156 	uint32_t        ExpStatSN;
    157 	uint32_t        RefCmdSN;
    158 	uint32_t        ExpDataSN;
    159 }               iscsi_task_cmd_t;
    160 
    161 int             iscsi_task_cmd_encap(uint8_t *header, iscsi_task_cmd_t * cmd);
    162 int             iscsi_task_cmd_decap(uint8_t *header, iscsi_task_cmd_t * cmd);
    163 
    164 
    165 /*
    166  * Task Response
    167  */
    168 enum {
    169 	ISCSI_TASK_RSP_FUNCTION_COMPLETE  = 0,
    170 	ISCSI_TASK_RSP_NO_SUCH_TASK       = 1,
    171 	ISCSI_TASK_RSP_NO_SUCH_LUN        = 2,
    172 	ISCSI_TASK_RSP_STILL_ALLEGIANT    = 3,
    173 	ISCSI_TASK_RSP_NO_FAILOVER        = 4,
    174 	ISCSI_TASK_RSP_NO_SUPPORT	  = 5,
    175 	ISCSI_TASK_RSP_AUTHORIZED_FAILED  = 6,
    176 
    177 	ISCSI_TASK_RSP_REJECTED           = 255,
    178 
    179 	ISCSI_TASK_QUAL_FUNCTION_EXECUTED = 0,
    180 	ISCSI_TASK_QUAL_NOT_AUTHORIZED    = 1
    181 };
    182 
    183 typedef struct iscsi_task_rsp_t {
    184 	uint8_t         response;
    185 	uint32_t        length;
    186 	uint32_t        tag;
    187 	uint32_t        StatSN;
    188 	uint32_t        ExpCmdSN;
    189 	uint32_t        MaxCmdSN;
    190 }               iscsi_task_rsp_t;
    191 
    192 int             iscsi_task_rsp_encap(uint8_t *header, iscsi_task_rsp_t * rsp);
    193 int             iscsi_task_rsp_decap(uint8_t *header, iscsi_task_rsp_t * rsp);
    194 
    195 
    196 /*
    197  * NOP-Out
    198  */
    199 
    200 
    201 typedef struct iscsi_nop_out_args_t {
    202 	int32_t         immediate;
    203 	uint32_t        length;
    204 	uint64_t        lun;
    205 	uint32_t        tag;
    206 	uint32_t        transfer_tag;
    207 	uint32_t        CmdSN;
    208 	uint32_t        ExpStatSN;
    209 	const uint8_t   *data;
    210 }               iscsi_nop_out_args_t;
    211 
    212 int             iscsi_nop_out_encap(uint8_t *header, iscsi_nop_out_args_t * cmd);
    213 int             iscsi_nop_out_decap(uint8_t *header, iscsi_nop_out_args_t * cmd);
    214 
    215 
    216 /*
    217  * NOP-In
    218  */
    219 
    220 
    221 typedef struct iscsi_nop_in_args_t {
    222 	uint32_t        length;
    223 	uint64_t        lun;
    224 	uint32_t        tag;
    225 	uint32_t        transfer_tag;
    226 	uint32_t        StatSN;
    227 	uint32_t        ExpCmdSN;
    228 	uint32_t        MaxCmdSN;
    229 }               iscsi_nop_in_args_t;
    230 
    231 int             iscsi_nop_in_encap(uint8_t *header, iscsi_nop_in_args_t * cmd);
    232 int             iscsi_nop_in_decap(uint8_t *header, iscsi_nop_in_args_t * cmd);
    233 
    234 
    235 /*
    236  * Text Command
    237  */
    238 
    239 
    240 typedef struct iscsi_text_cmd_args_t {
    241 	int32_t         immediate;
    242 	int32_t         final;
    243 	int32_t         cont;
    244 	uint32_t        length;
    245 	uint64_t        lun;
    246 	uint32_t        tag;
    247 	uint32_t        transfer_tag;
    248 	uint32_t        CmdSN;
    249 	uint32_t        ExpStatSN;
    250 	char           *text;
    251 }               iscsi_text_cmd_args_t;
    252 
    253 int             iscsi_text_cmd_encap(uint8_t *header, iscsi_text_cmd_args_t * cmd);
    254 int             iscsi_text_cmd_decap(uint8_t *header, iscsi_text_cmd_args_t * cmd);
    255 
    256 
    257 /*
    258  * Text Response
    259  */
    260 
    261 
    262 typedef struct iscsi_text_rsp_args_t {
    263 	int32_t         final;
    264 	int32_t         cont;
    265 	uint32_t        length;
    266 	uint64_t        lun;
    267 	uint32_t        tag;
    268 	uint32_t        transfer_tag;
    269 	uint32_t        StatSN;
    270 	uint32_t        ExpCmdSN;
    271 	uint32_t        MaxCmdSN;
    272 }               iscsi_text_rsp_args_t;
    273 
    274 int             iscsi_text_rsp_encap(uint8_t *header, iscsi_text_rsp_args_t * rsp);
    275 int             iscsi_text_rsp_decap(uint8_t *header, iscsi_text_rsp_args_t * rsp);
    276 
    277 
    278 /*
    279  * Login Command
    280  */
    281 
    282 
    283 typedef struct iscsi_login_cmd_args_t {
    284 	int32_t         transit;
    285 	int32_t         cont;
    286 	uint8_t         csg;
    287 	uint8_t         nsg;
    288 	int8_t          version_max;
    289 	int8_t          version_min;
    290 	uint8_t         AHSlength;
    291 	uint32_t        length;
    292 	uint64_t	isid;
    293 	uint16_t        tsih;
    294 	uint32_t        tag;
    295 	uint16_t        cid;
    296 	uint32_t        CmdSN;
    297 	uint32_t        ExpStatSN;
    298 	char           *text;
    299 }               iscsi_login_cmd_args_t;
    300 
    301 int             iscsi_login_cmd_encap(uint8_t *header, iscsi_login_cmd_args_t * cmd);
    302 int             iscsi_login_cmd_decap(uint8_t *header, iscsi_login_cmd_args_t * cmd);
    303 
    304 
    305 /*
    306  * Login Response
    307  */
    308 
    309 
    310 typedef struct iscsi_login_rsp_args_t {
    311 	int32_t         transit;
    312 	int32_t         cont;
    313 	uint8_t         csg;
    314 	uint8_t         nsg;
    315 	int8_t          version_max;
    316 	int8_t          version_active;
    317 	uint8_t         AHSlength;
    318 	uint32_t        length;
    319 	uint64_t	isid;
    320 	uint16_t        tsih;
    321 	uint32_t        tag;
    322 	uint32_t        StatSN;
    323 	uint32_t        ExpCmdSN;
    324 	uint32_t        MaxCmdSN;
    325 	uint8_t         status_class;
    326 	uint8_t         status_detail;
    327 }               iscsi_login_rsp_args_t;
    328 
    329 int             iscsi_login_rsp_encap(uint8_t *header, iscsi_login_rsp_args_t * rsp);
    330 int             iscsi_login_rsp_decap(uint8_t *header, iscsi_login_rsp_args_t * rsp);
    331 
    332 
    333 /*
    334  * Logout Command
    335  */
    336 
    337 
    338 typedef struct iscsi_logout_cmd_args_t {
    339 	int32_t         immediate;
    340 	uint8_t         reason;
    341 	uint32_t        tag;
    342 	uint16_t        cid;
    343 	uint32_t        CmdSN;
    344 	uint32_t        ExpStatSN;
    345 }               iscsi_logout_cmd_args_t;
    346 
    347 int             iscsi_logout_cmd_encap(uint8_t *header, iscsi_logout_cmd_args_t * cmd);
    348 int             iscsi_logout_cmd_decap(uint8_t *header, iscsi_logout_cmd_args_t * cmd);
    349 
    350 
    351 /*
    352  * Logout Response
    353  */
    354 
    355 
    356 typedef struct iscsi_logout_rsp_args_t {
    357 	uint8_t         response;
    358 	uint32_t        length;
    359 	uint32_t        tag;
    360 	uint32_t        StatSN;
    361 	uint32_t        ExpCmdSN;
    362 	uint32_t        MaxCmdSN;
    363 	uint16_t        Time2Wait;
    364 	uint16_t        Time2Retain;
    365 }               iscsi_logout_rsp_args_t;
    366 
    367 int             iscsi_logout_rsp_encap(uint8_t *header, iscsi_logout_rsp_args_t * rsp);
    368 int             iscsi_logout_rsp_decap(uint8_t *header, iscsi_logout_rsp_args_t * rsp);
    369 
    370 
    371 /*
    372  * SCSI Command
    373  */
    374 
    375 
    376 typedef struct iscsi_scsi_cmd_args_t {
    377 	int32_t         immediate;
    378 	int32_t         final;
    379 	int32_t         input;
    380 	int32_t         output;
    381 	uint8_t         attr;
    382 	uint32_t        length;
    383 	uint64_t        lun;
    384 	uint32_t        tag;
    385 	uint32_t        trans_len;
    386 	uint32_t        bidi_trans_len;
    387 	uint32_t        CmdSN;
    388 	uint32_t        ExpStatSN;
    389 	uint8_t  	*cdb;
    390 	uint8_t  	*ext_cdb;
    391 	uint8_t  	*ahs;
    392 	uint8_t         ahs_len;
    393 	uint8_t  	*send_data;
    394 	uint8_t		*send_buffer;	/* malloc'ed buffer for READ */
    395 	int32_t         send_sg_len;
    396 	uint8_t  	*recv_data;
    397 	int32_t         recv_sg_len;
    398 	uint8_t         status;
    399 	uint32_t        bytes_sent;
    400 	uint32_t        bytes_recv;
    401 }               iscsi_scsi_cmd_args_t;
    402 
    403 int             iscsi_scsi_cmd_encap(uint8_t *header, iscsi_scsi_cmd_args_t * cmd);
    404 int             iscsi_scsi_cmd_decap(uint8_t *header, iscsi_scsi_cmd_args_t * cmd);
    405 
    406 
    407 /*
    408  * SCSI Response
    409  */
    410 
    411 
    412 typedef struct iscsi_scsi_rsp_args_t {
    413 	int32_t         bidi_overflow;
    414 	int32_t         bidi_underflow;
    415 	int32_t         overflow;
    416 	int32_t         underflow;
    417 
    418 
    419 	uint8_t         response;
    420 	uint8_t         status;
    421 	uint32_t        ahs_len;
    422 	uint32_t        length;
    423 	uint32_t        tag;
    424 	uint32_t        StatSN;
    425 	uint32_t        ExpCmdSN;
    426 	uint32_t        MaxCmdSN;
    427 	uint32_t        ExpDataSN;
    428 	uint32_t        bidi_res_cnt;
    429 	uint32_t        basic_res_cnt;
    430 }               iscsi_scsi_rsp_t;
    431 
    432 int             iscsi_scsi_rsp_encap(uint8_t *header, iscsi_scsi_rsp_t * rsp);
    433 int             iscsi_scsi_rsp_decap(uint8_t *header, iscsi_scsi_rsp_t * rsp);
    434 
    435 
    436 /*
    437  * Ready To Transfer (R2T)
    438  */
    439 
    440 
    441 typedef struct iscsi_r2t_args_t {
    442 	uint32_t        AHSlength;
    443 	uint64_t        lun;
    444 	uint32_t        tag;
    445 	uint32_t        transfer_tag;
    446 	uint32_t        StatSN;
    447 	uint32_t        ExpCmdSN;
    448 	uint32_t        MaxCmdSN;
    449 	uint32_t        R2TSN;
    450 	uint32_t        offset;
    451 	uint32_t        length;
    452 }               iscsi_r2t_t;
    453 
    454 int             iscsi_r2t_encap(uint8_t *header, iscsi_r2t_t * cmd);
    455 int             iscsi_r2t_decap(uint8_t *header, iscsi_r2t_t * cmd);
    456 
    457 
    458 /*
    459  * SCSI Write Data
    460  */
    461 
    462 
    463 typedef struct iscsi_write_data_args_t {
    464 	int32_t         final;
    465 	uint32_t        length;
    466 	uint64_t        lun;
    467 	uint32_t        tag;
    468 	uint32_t        transfer_tag;
    469 	uint32_t        ExpStatSN;
    470 	uint32_t        DataSN;
    471 	uint32_t        offset;
    472 }               iscsi_write_data_t;
    473 
    474 int             iscsi_write_data_encap(uint8_t *header, iscsi_write_data_t * cmd);
    475 int             iscsi_write_data_decap(uint8_t *header, iscsi_write_data_t * cmd);
    476 
    477 
    478 /*
    479  * SCSI Read Data
    480  */
    481 
    482 
    483 typedef struct iscsi_read_data_args_t {
    484 	int32_t         final;
    485 	int32_t         ack;
    486 	int32_t         overflow;
    487 	int32_t         underflow;
    488 	int32_t         S_bit;
    489 	uint8_t         status;
    490 	uint32_t        length;
    491 	uint64_t        lun;
    492 	uint32_t        task_tag;
    493 	uint32_t        transfer_tag;
    494 	uint32_t        StatSN;
    495 	uint32_t        ExpCmdSN;
    496 	uint32_t        MaxCmdSN;
    497 	uint32_t        DataSN;
    498 	uint32_t        offset;
    499 	uint32_t        res_count;
    500 }               iscsi_read_data_t;
    501 
    502 int             iscsi_read_data_encap(uint8_t *header, iscsi_read_data_t * cmd);
    503 int             iscsi_read_data_decap(uint8_t *header, iscsi_read_data_t * cmd);
    504 
    505 
    506 /*
    507  * Reject
    508  */
    509 
    510 typedef struct iscsi_reject_args_t {
    511 	uint8_t         reason;
    512 	uint32_t        length;
    513 	uint32_t        StatSN;
    514 	uint32_t        ExpCmdSN;
    515 	uint32_t        MaxCmdSN;
    516 	uint32_t        DataSN;
    517 	char           *header;
    518 
    519 }               iscsi_reject_t;
    520 
    521 int             iscsi_reject_encap(uint8_t *header, iscsi_reject_t * cmd);
    522 int             iscsi_reject_decap(uint8_t *header, iscsi_reject_t * cmd);
    523 
    524 /*
    525  * Async Message
    526  */
    527 
    528 typedef struct iscsi_async_msg_args_t {
    529 	uint8_t         AHSlength;
    530 	uint64_t        lun;
    531 	uint32_t        StatSN;
    532 	uint32_t        ExpCmdSN;
    533 	uint32_t        MaxCmdSN;
    534 	uint32_t        length;
    535 	uint8_t         AsyncEvent;
    536 	uint8_t         AsyncVCode;
    537 }               iscsi_async_msg_t;
    538 
    539 int             iscsi_amsg_decap(uint8_t *header, iscsi_async_msg_t * msg);
    540 
    541 #ifndef SOL_TCP
    542 #define SOL_TCP IPPROTO_TCP
    543 #endif
    544 
    545 #endif				/* ISCSI_H */
    546