NetBSD/dist/iscsi/include/iscsi.h

519 lines
13 KiB
C
Raw Normal View History

/*
* 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 "util.h"
/*
* iSCSI Version 18
*/
#define ISCSI_VENDOR "NetBSD"
#define ISCSI_PRODUCT "NetBSD/Intel 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
*/
#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_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_REJECT 0x3f
#define ISCSI_SNACK 0x10/* not implemented */
#define ISCSI_ASYNC 0x32
/*
* Login Phase
*/
#define ISCSI_LOGIN_STATUS_SUCCESS 0
#define ISCSI_LOGIN_STATUS_REDIRECTION 1
#define ISCSI_LOGIN_STATUS_INITIATOR_ERROR 2
#define ISCSI_LOGIN_STATUS_TARGET_ERROR 3
#define ISCSI_LOGIN_STAGE_SECURITY 0
#define ISCSI_LOGIN_STAGE_NEGOTIATE 1
#define ISCSI_LOGIN_STAGE_FULL_FEATURE 3
/*
* Logout Phase
*/
#define ISCSI_LOGOUT_CLOSE_SESSION 0
#define ISCSI_LOGOUT_CLOSE_CONNECTION 1
#define ISCSI_LOGOUT_CLOSE_RECOVERY 2
#define ISCSI_LOGOUT_STATUS_SUCCESS 0
#define ISCSI_LOGOUT_STATUS_NO_CID 1
#define ISCSI_LOGOUT_STATUS_NO_RECOVERY 2
#define ISCSI_LOGOUT_STATUS_FAILURE 3
/*
* Task Command
*/
#define ISCSI_TASK_CMD_ABORT_TASK 1
#define ISCSI_TASK_CMD_ABORT_TASK_SET 2
#define ISCSI_TASK_CMD_CLEAR_ACA 3
#define ISCSI_TASK_CMD_CLEAR_TASK_SET 4
#define ISCSI_TASK_CMD_LOGICAL_UNIT_RESET 5
#define ISCSI_TASK_CMD_TARGET_WARM_RESET 6
#define ISCSI_TASK_CMD_TARGET_COLD_RESET 7
#define 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
*/
#define ISCSI_TASK_RSP_FUNCTION_COMPLETE 0
#define ISCSI_TASK_RSP_NO_SUCH_TASK 1
#define ISCSI_TASK_RSP_NO_SUCH_LUN 2
#define ISCSI_TASK_RSP_STILL_ALLEGIANT 3
#define ISCSI_TASK_RSP_NO_FAILOVER 4
#define ISCSI_TASK_RSP_NO_SUPPORT 5
#define ISCSI_TASK_RSP_AUTHORIZED_FAILED 6
#define ISCSI_TASK_RSP_REJECTED 255
#define ISCSI_TASK_QUAL_FUNCTION_EXECUTED 0
#define 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;
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 */