/* * IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. * By downloading, copying, installing or using the software you agree * to this license. If you do not agree to this license, do not * download, install, copy or use the software. * * Intel License Agreement * * Copyright (c) 2000, Intel Corporation * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * -Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * -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. * * -The name of Intel Corporation may not be used to endorse or * promote products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 INTEL * 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. */ #ifndef ISCSI_H #define ISCSI_H #include "iscsiutil.h" /* * iSCSI Version 18 */ #define ISCSI_VENDOR "NetBSD" #define ISCSI_PRODUCT "NetBSD iSCSI" #define ISCSI_VERSION 0 /* * Parameters */ #define ISCSI_IMMEDIATE_DATA_DFLT 1 #define ISCSI_INITIAL_R2T_DFLT 1 #define ISCSI_USE_PHASE_COLLAPSED_READ_DFLT 0 #define ISCSI_HEADER_LEN 48 #define ISCSI_PORT 3260 /* Default port */ #define ISCSI_OPCODE(HEADER) (HEADER[0] & 0x3f) #define ISCSI_FIRST_BURST (ISCSI_FIRST_BURST_DFLT) #define ISCSI_DATA_PDU_LENGTH (ISCSI_DATA_PDU_LENGTH_DFLT) /* * Opcodes */ enum { ISCSI_NOP_OUT = 0x00, ISCSI_SCSI_CMD = 0x01, ISCSI_TASK_CMD = 0x02, ISCSI_LOGIN_CMD = 0x03, ISCSI_TEXT_CMD = 0x04, ISCSI_WRITE_DATA = 0x05, ISCSI_LOGOUT_CMD = 0x06, ISCSI_SNACK = 0x10, /* not implemented */ ISCSI_NOP_IN = 0x20, ISCSI_SCSI_RSP = 0x21, ISCSI_TASK_RSP = 0x22, ISCSI_LOGIN_RSP = 0x23, ISCSI_TEXT_RSP = 0x24, ISCSI_READ_DATA = 0x25, ISCSI_LOGOUT_RSP = 0x26, ISCSI_R2T = 0x31, ISCSI_ASYNC = 0x32, ISCSI_REJECT = 0x3f }; enum { ISCSI_AHS_EXTENDED_CDB = 0x01, ISCSI_AHS_BIDI_READ = 0x02 }; /* * Login Phase */ enum { ISCSI_LOGIN_STATUS_SUCCESS = 0, ISCSI_LOGIN_STATUS_REDIRECTION = 1, ISCSI_LOGIN_STATUS_INITIATOR_ERROR = 2, ISCSI_LOGIN_STATUS_TARGET_ERROR = 3, ISCSI_LOGIN_STAGE_SECURITY = 0, ISCSI_LOGIN_STAGE_NEGOTIATE = 1, ISCSI_LOGIN_STAGE_FULL_FEATURE = 3 }; /* detailed return codes for login phase */ enum { ISCSI_LOGIN_DETAIL_SUCCESS = 0x0, ISCSI_LOGIN_DETAIL_INIT_AUTH_FAILURE = 0x01, ISCSI_LOGIN_DETAIL_VERSION_NOT_SUPPORTED = 0x05, ISCSI_LOGIN_DETAIL_NOT_LOGGED_IN = 0x0b }; /* * Logout Phase */ enum { ISCSI_LOGOUT_CLOSE_SESSION = 0, ISCSI_LOGOUT_CLOSE_CONNECTION = 1, ISCSI_LOGOUT_CLOSE_RECOVERY = 2, ISCSI_LOGOUT_STATUS_SUCCESS = 0, ISCSI_LOGOUT_STATUS_NO_CID = 1, ISCSI_LOGOUT_STATUS_NO_RECOVERY = 2, ISCSI_LOGOUT_STATUS_FAILURE = 3 }; /* * Task Command */ enum { ISCSI_TASK_CMD_ABORT_TASK = 1, ISCSI_TASK_CMD_ABORT_TASK_SET = 2, ISCSI_TASK_CMD_CLEAR_ACA = 3, ISCSI_TASK_CMD_CLEAR_TASK_SET = 4, ISCSI_TASK_CMD_LOGICAL_UNIT_RESET = 5, ISCSI_TASK_CMD_TARGET_WARM_RESET = 6, ISCSI_TASK_CMD_TARGET_COLD_RESET = 7, ISCSI_TASK_CMD_TARGET_REASSIGN = 8 }; typedef struct iscsi_task_cmd_t { int32_t immediate; uint8_t function; uint64_t lun; uint32_t tag; uint32_t ref_tag; uint32_t CmdSN; uint32_t ExpStatSN; uint32_t RefCmdSN; uint32_t ExpDataSN; } iscsi_task_cmd_t; int iscsi_task_cmd_encap(uint8_t *header, iscsi_task_cmd_t * cmd); int iscsi_task_cmd_decap(uint8_t *header, iscsi_task_cmd_t * cmd); /* * Task Response */ enum { ISCSI_TASK_RSP_FUNCTION_COMPLETE = 0, ISCSI_TASK_RSP_NO_SUCH_TASK = 1, ISCSI_TASK_RSP_NO_SUCH_LUN = 2, ISCSI_TASK_RSP_STILL_ALLEGIANT = 3, ISCSI_TASK_RSP_NO_FAILOVER = 4, ISCSI_TASK_RSP_NO_SUPPORT = 5, ISCSI_TASK_RSP_AUTHORIZED_FAILED = 6, ISCSI_TASK_RSP_REJECTED = 255, ISCSI_TASK_QUAL_FUNCTION_EXECUTED = 0, ISCSI_TASK_QUAL_NOT_AUTHORIZED = 1 }; typedef struct iscsi_task_rsp_t { uint8_t response; uint32_t length; uint32_t tag; uint32_t StatSN; uint32_t ExpCmdSN; uint32_t MaxCmdSN; } iscsi_task_rsp_t; int iscsi_task_rsp_encap(uint8_t *header, iscsi_task_rsp_t * rsp); int iscsi_task_rsp_decap(uint8_t *header, iscsi_task_rsp_t * rsp); /* * NOP-Out */ typedef struct iscsi_nop_out_args_t { int32_t immediate; uint32_t length; uint64_t lun; uint32_t tag; uint32_t transfer_tag; uint32_t CmdSN; uint32_t ExpStatSN; const uint8_t *data; } iscsi_nop_out_args_t; int iscsi_nop_out_encap(uint8_t *header, iscsi_nop_out_args_t * cmd); int iscsi_nop_out_decap(uint8_t *header, iscsi_nop_out_args_t * cmd); /* * NOP-In */ typedef struct iscsi_nop_in_args_t { uint32_t length; uint64_t lun; uint32_t tag; uint32_t transfer_tag; uint32_t StatSN; uint32_t ExpCmdSN; uint32_t MaxCmdSN; } iscsi_nop_in_args_t; int iscsi_nop_in_encap(uint8_t *header, iscsi_nop_in_args_t * cmd); int iscsi_nop_in_decap(uint8_t *header, iscsi_nop_in_args_t * cmd); /* * Text Command */ typedef struct iscsi_text_cmd_args_t { int32_t immediate; int32_t final; int32_t cont; uint32_t length; uint64_t lun; uint32_t tag; uint32_t transfer_tag; uint32_t CmdSN; uint32_t ExpStatSN; char *text; } iscsi_text_cmd_args_t; int iscsi_text_cmd_encap(uint8_t *header, iscsi_text_cmd_args_t * cmd); int iscsi_text_cmd_decap(uint8_t *header, iscsi_text_cmd_args_t * cmd); /* * Text Response */ typedef struct iscsi_text_rsp_args_t { int32_t final; int32_t cont; uint32_t length; uint64_t lun; uint32_t tag; uint32_t transfer_tag; uint32_t StatSN; uint32_t ExpCmdSN; uint32_t MaxCmdSN; } iscsi_text_rsp_args_t; int iscsi_text_rsp_encap(uint8_t *header, iscsi_text_rsp_args_t * rsp); int iscsi_text_rsp_decap(uint8_t *header, iscsi_text_rsp_args_t * rsp); /* * Login Command */ typedef struct iscsi_login_cmd_args_t { int32_t transit; int32_t cont; uint8_t csg; uint8_t nsg; int8_t version_max; int8_t version_min; uint8_t AHSlength; uint32_t length; uint64_t isid; uint16_t tsih; uint32_t tag; uint16_t cid; uint32_t CmdSN; uint32_t ExpStatSN; char *text; } iscsi_login_cmd_args_t; int iscsi_login_cmd_encap(uint8_t *header, iscsi_login_cmd_args_t * cmd); int iscsi_login_cmd_decap(uint8_t *header, iscsi_login_cmd_args_t * cmd); /* * Login Response */ typedef struct iscsi_login_rsp_args_t { int32_t transit; int32_t cont; uint8_t csg; uint8_t nsg; int8_t version_max; int8_t version_active; uint8_t AHSlength; uint32_t length; uint64_t isid; uint16_t tsih; uint32_t tag; uint32_t StatSN; uint32_t ExpCmdSN; uint32_t MaxCmdSN; uint8_t status_class; uint8_t status_detail; } iscsi_login_rsp_args_t; int iscsi_login_rsp_encap(uint8_t *header, iscsi_login_rsp_args_t * rsp); int iscsi_login_rsp_decap(uint8_t *header, iscsi_login_rsp_args_t * rsp); /* * Logout Command */ typedef struct iscsi_logout_cmd_args_t { int32_t immediate; uint8_t reason; uint32_t tag; uint16_t cid; uint32_t CmdSN; uint32_t ExpStatSN; } iscsi_logout_cmd_args_t; int iscsi_logout_cmd_encap(uint8_t *header, iscsi_logout_cmd_args_t * cmd); int iscsi_logout_cmd_decap(uint8_t *header, iscsi_logout_cmd_args_t * cmd); /* * Logout Response */ typedef struct iscsi_logout_rsp_args_t { uint8_t response; uint32_t length; uint32_t tag; uint32_t StatSN; uint32_t ExpCmdSN; uint32_t MaxCmdSN; uint16_t Time2Wait; uint16_t Time2Retain; } iscsi_logout_rsp_args_t; int iscsi_logout_rsp_encap(uint8_t *header, iscsi_logout_rsp_args_t * rsp); int iscsi_logout_rsp_decap(uint8_t *header, iscsi_logout_rsp_args_t * rsp); /* * SCSI Command */ typedef struct iscsi_scsi_cmd_args_t { int32_t immediate; int32_t final; int32_t input; int32_t output; uint8_t attr; uint32_t length; uint64_t lun; uint32_t tag; uint32_t trans_len; uint32_t bidi_trans_len; uint32_t CmdSN; uint32_t ExpStatSN; uint8_t *cdb; uint8_t *ext_cdb; uint8_t *ahs; uint8_t ahs_len; uint8_t *send_data; uint8_t *send_buffer; /* malloc'ed buffer for READ */ int32_t send_sg_len; uint8_t *recv_data; int32_t recv_sg_len; uint8_t status; uint32_t bytes_sent; uint32_t bytes_recv; } iscsi_scsi_cmd_args_t; int iscsi_scsi_cmd_encap(uint8_t *header, iscsi_scsi_cmd_args_t * cmd); int iscsi_scsi_cmd_decap(uint8_t *header, iscsi_scsi_cmd_args_t * cmd); /* * SCSI Response */ typedef struct iscsi_scsi_rsp_args_t { int32_t bidi_overflow; int32_t bidi_underflow; int32_t overflow; int32_t underflow; uint8_t response; uint8_t status; uint32_t ahs_len; uint32_t length; uint32_t tag; uint32_t StatSN; uint32_t ExpCmdSN; uint32_t MaxCmdSN; uint32_t ExpDataSN; uint32_t bidi_res_cnt; uint32_t basic_res_cnt; } iscsi_scsi_rsp_t; int iscsi_scsi_rsp_encap(uint8_t *header, iscsi_scsi_rsp_t * rsp); int iscsi_scsi_rsp_decap(uint8_t *header, iscsi_scsi_rsp_t * rsp); /* * Ready To Transfer (R2T) */ typedef struct iscsi_r2t_args_t { uint32_t AHSlength; uint64_t lun; uint32_t tag; uint32_t transfer_tag; uint32_t StatSN; uint32_t ExpCmdSN; uint32_t MaxCmdSN; uint32_t R2TSN; uint32_t offset; uint32_t length; } iscsi_r2t_t; int iscsi_r2t_encap(uint8_t *header, iscsi_r2t_t * cmd); int iscsi_r2t_decap(uint8_t *header, iscsi_r2t_t * cmd); /* * SCSI Write Data */ typedef struct iscsi_write_data_args_t { int32_t final; uint32_t length; uint64_t lun; uint32_t tag; uint32_t transfer_tag; uint32_t ExpStatSN; uint32_t DataSN; uint32_t offset; } iscsi_write_data_t; int iscsi_write_data_encap(uint8_t *header, iscsi_write_data_t * cmd); int iscsi_write_data_decap(uint8_t *header, iscsi_write_data_t * cmd); /* * SCSI Read Data */ typedef struct iscsi_read_data_args_t { int32_t final; int32_t ack; int32_t overflow; int32_t underflow; int32_t S_bit; uint8_t status; uint32_t length; uint64_t lun; uint32_t task_tag; uint32_t transfer_tag; uint32_t StatSN; uint32_t ExpCmdSN; uint32_t MaxCmdSN; uint32_t DataSN; uint32_t offset; uint32_t res_count; } iscsi_read_data_t; int iscsi_read_data_encap(uint8_t *header, iscsi_read_data_t * cmd); int iscsi_read_data_decap(uint8_t *header, iscsi_read_data_t * cmd); /* * Reject */ typedef struct iscsi_reject_args_t { uint8_t reason; uint32_t length; uint32_t StatSN; uint32_t ExpCmdSN; uint32_t MaxCmdSN; uint32_t DataSN; char *header; } iscsi_reject_t; int iscsi_reject_encap(uint8_t *header, iscsi_reject_t * cmd); int iscsi_reject_decap(uint8_t *header, iscsi_reject_t * cmd); /* * Async Message */ typedef struct iscsi_async_msg_args_t { uint8_t AHSlength; uint64_t lun; uint32_t StatSN; uint32_t ExpCmdSN; uint32_t MaxCmdSN; uint32_t length; uint8_t AsyncEvent; uint8_t AsyncVCode; } iscsi_async_msg_t; int iscsi_amsg_decap(uint8_t *header, iscsi_async_msg_t * msg); #ifndef SOL_TCP #define SOL_TCP IPPROTO_TCP #endif #endif /* ISCSI_H */