1009ea47eSEdward Tomasz Napierala /*- 2*4d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause 3718cf2ccSPedro F. Giffuni * 4009ea47eSEdward Tomasz Napierala * Copyright (c) 2012 The FreeBSD Foundation 5009ea47eSEdward Tomasz Napierala * 6009ea47eSEdward Tomasz Napierala * This software was developed by Edward Tomasz Napierala under sponsorship 7009ea47eSEdward Tomasz Napierala * from the FreeBSD Foundation. 8009ea47eSEdward Tomasz Napierala * 9009ea47eSEdward Tomasz Napierala * Redistribution and use in source and binary forms, with or without 10009ea47eSEdward Tomasz Napierala * modification, are permitted provided that the following conditions 11009ea47eSEdward Tomasz Napierala * are met: 12009ea47eSEdward Tomasz Napierala * 1. Redistributions of source code must retain the above copyright 13009ea47eSEdward Tomasz Napierala * notice, this list of conditions and the following disclaimer. 14009ea47eSEdward Tomasz Napierala * 2. Redistributions in binary form must reproduce the above copyright 15009ea47eSEdward Tomasz Napierala * notice, this list of conditions and the following disclaimer in the 16009ea47eSEdward Tomasz Napierala * documentation and/or other materials provided with the distribution. 17009ea47eSEdward Tomasz Napierala * 18009ea47eSEdward Tomasz Napierala * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 19009ea47eSEdward Tomasz Napierala * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20009ea47eSEdward Tomasz Napierala * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21009ea47eSEdward Tomasz Napierala * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 22009ea47eSEdward Tomasz Napierala * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23009ea47eSEdward Tomasz Napierala * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24009ea47eSEdward Tomasz Napierala * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25009ea47eSEdward Tomasz Napierala * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 26009ea47eSEdward Tomasz Napierala * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27009ea47eSEdward Tomasz Napierala * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28009ea47eSEdward Tomasz Napierala * SUCH DAMAGE. 29009ea47eSEdward Tomasz Napierala * 30009ea47eSEdward Tomasz Napierala * $FreeBSD$ 31009ea47eSEdward Tomasz Napierala */ 32009ea47eSEdward Tomasz Napierala 33009ea47eSEdward Tomasz Napierala #ifndef ISCSI_PROTO_H 34009ea47eSEdward Tomasz Napierala #define ISCSI_PROTO_H 35009ea47eSEdward Tomasz Napierala 36009ea47eSEdward Tomasz Napierala #ifndef CTASSERT 37009ea47eSEdward Tomasz Napierala #define CTASSERT(x) _CTASSERT(x, __LINE__) 38009ea47eSEdward Tomasz Napierala #define _CTASSERT(x, y) __CTASSERT(x, y) 39009ea47eSEdward Tomasz Napierala #define __CTASSERT(x, y) typedef char __assert_ ## y [(x) ? 1 : -1] 40009ea47eSEdward Tomasz Napierala #endif 41009ea47eSEdward Tomasz Napierala 422124e3b0SAlexander Motin #define ISCSI_SNGT(x, y) ((int32_t)(x) - (int32_t)(y) > 0) 432124e3b0SAlexander Motin #define ISCSI_SNLT(x, y) ((int32_t)(x) - (int32_t)(y) < 0) 442124e3b0SAlexander Motin 45009ea47eSEdward Tomasz Napierala #define ISCSI_BHS_SIZE 48 46009ea47eSEdward Tomasz Napierala #define ISCSI_HEADER_DIGEST_SIZE 4 47009ea47eSEdward Tomasz Napierala #define ISCSI_DATA_DIGEST_SIZE 4 48009ea47eSEdward Tomasz Napierala 49009ea47eSEdward Tomasz Napierala #define ISCSI_BHS_OPCODE_IMMEDIATE 0x40 50009ea47eSEdward Tomasz Napierala 51009ea47eSEdward Tomasz Napierala #define ISCSI_BHS_OPCODE_NOP_OUT 0x00 52009ea47eSEdward Tomasz Napierala #define ISCSI_BHS_OPCODE_SCSI_COMMAND 0x01 53009ea47eSEdward Tomasz Napierala #define ISCSI_BHS_OPCODE_TASK_REQUEST 0x02 54009ea47eSEdward Tomasz Napierala #define ISCSI_BHS_OPCODE_LOGIN_REQUEST 0x03 55009ea47eSEdward Tomasz Napierala #define ISCSI_BHS_OPCODE_TEXT_REQUEST 0x04 56009ea47eSEdward Tomasz Napierala #define ISCSI_BHS_OPCODE_SCSI_DATA_OUT 0x05 57009ea47eSEdward Tomasz Napierala #define ISCSI_BHS_OPCODE_LOGOUT_REQUEST 0x06 58009ea47eSEdward Tomasz Napierala 59009ea47eSEdward Tomasz Napierala #define ISCSI_BHS_OPCODE_NOP_IN 0x20 60009ea47eSEdward Tomasz Napierala #define ISCSI_BHS_OPCODE_SCSI_RESPONSE 0x21 61009ea47eSEdward Tomasz Napierala #define ISCSI_BHS_OPCODE_TASK_RESPONSE 0x22 62009ea47eSEdward Tomasz Napierala #define ISCSI_BHS_OPCODE_LOGIN_RESPONSE 0x23 63009ea47eSEdward Tomasz Napierala #define ISCSI_BHS_OPCODE_TEXT_RESPONSE 0x24 64009ea47eSEdward Tomasz Napierala #define ISCSI_BHS_OPCODE_SCSI_DATA_IN 0x25 65009ea47eSEdward Tomasz Napierala #define ISCSI_BHS_OPCODE_LOGOUT_RESPONSE 0x26 66009ea47eSEdward Tomasz Napierala #define ISCSI_BHS_OPCODE_R2T 0x31 67009ea47eSEdward Tomasz Napierala #define ISCSI_BHS_OPCODE_ASYNC_MESSAGE 0x32 68009ea47eSEdward Tomasz Napierala #define ISCSI_BHS_OPCODE_REJECT 0x3f 69009ea47eSEdward Tomasz Napierala 70009ea47eSEdward Tomasz Napierala struct iscsi_bhs { 71009ea47eSEdward Tomasz Napierala uint8_t bhs_opcode; 72009ea47eSEdward Tomasz Napierala uint8_t bhs_opcode_specific1[3]; 73009ea47eSEdward Tomasz Napierala uint8_t bhs_total_ahs_len; 74009ea47eSEdward Tomasz Napierala uint8_t bhs_data_segment_len[3]; 75009ea47eSEdward Tomasz Napierala uint64_t bhs_lun; 76009ea47eSEdward Tomasz Napierala uint8_t bhs_inititator_task_tag[4]; 77009ea47eSEdward Tomasz Napierala uint8_t bhs_opcode_specific4[28]; 78009ea47eSEdward Tomasz Napierala }; 79009ea47eSEdward Tomasz Napierala CTASSERT(sizeof(struct iscsi_bhs) == ISCSI_BHS_SIZE); 80009ea47eSEdward Tomasz Napierala 81009ea47eSEdward Tomasz Napierala #define BHSSC_FLAGS_F 0x80 82009ea47eSEdward Tomasz Napierala #define BHSSC_FLAGS_R 0x40 83009ea47eSEdward Tomasz Napierala #define BHSSC_FLAGS_W 0x20 84009ea47eSEdward Tomasz Napierala #define BHSSC_FLAGS_ATTR 0x07 85009ea47eSEdward Tomasz Napierala 86009ea47eSEdward Tomasz Napierala #define BHSSC_FLAGS_ATTR_UNTAGGED 0 87009ea47eSEdward Tomasz Napierala #define BHSSC_FLAGS_ATTR_SIMPLE 1 88009ea47eSEdward Tomasz Napierala #define BHSSC_FLAGS_ATTR_ORDERED 2 89009ea47eSEdward Tomasz Napierala #define BHSSC_FLAGS_ATTR_HOQ 3 90009ea47eSEdward Tomasz Napierala #define BHSSC_FLAGS_ATTR_ACA 4 91009ea47eSEdward Tomasz Napierala 927dbbd1aeSAlexander Motin #define BHSSC_PRI_MASK 0xf0 937dbbd1aeSAlexander Motin #define BHSSC_PRI_SHIFT 4 947dbbd1aeSAlexander Motin 95009ea47eSEdward Tomasz Napierala struct iscsi_bhs_scsi_command { 96009ea47eSEdward Tomasz Napierala uint8_t bhssc_opcode; 97009ea47eSEdward Tomasz Napierala uint8_t bhssc_flags; 987dbbd1aeSAlexander Motin uint8_t bhssc_pri; 997dbbd1aeSAlexander Motin uint8_t bhssc_reserved; 100009ea47eSEdward Tomasz Napierala uint8_t bhssc_total_ahs_len; 101009ea47eSEdward Tomasz Napierala uint8_t bhssc_data_segment_len[3]; 102009ea47eSEdward Tomasz Napierala uint64_t bhssc_lun; 103009ea47eSEdward Tomasz Napierala uint32_t bhssc_initiator_task_tag; 104009ea47eSEdward Tomasz Napierala uint32_t bhssc_expected_data_transfer_length; 105009ea47eSEdward Tomasz Napierala uint32_t bhssc_cmdsn; 106009ea47eSEdward Tomasz Napierala uint32_t bhssc_expstatsn; 107009ea47eSEdward Tomasz Napierala uint8_t bhssc_cdb[16]; 108009ea47eSEdward Tomasz Napierala }; 109009ea47eSEdward Tomasz Napierala CTASSERT(sizeof(struct iscsi_bhs_scsi_command) == ISCSI_BHS_SIZE); 110009ea47eSEdward Tomasz Napierala 111009ea47eSEdward Tomasz Napierala #define BHSSR_FLAGS_RESIDUAL_UNDERFLOW 0x02 112009ea47eSEdward Tomasz Napierala #define BHSSR_FLAGS_RESIDUAL_OVERFLOW 0x04 113009ea47eSEdward Tomasz Napierala 114009ea47eSEdward Tomasz Napierala #define BHSSR_RESPONSE_COMMAND_COMPLETED 0x00 115009ea47eSEdward Tomasz Napierala 116009ea47eSEdward Tomasz Napierala struct iscsi_bhs_scsi_response { 117009ea47eSEdward Tomasz Napierala uint8_t bhssr_opcode; 118009ea47eSEdward Tomasz Napierala uint8_t bhssr_flags; 119009ea47eSEdward Tomasz Napierala uint8_t bhssr_response; 120009ea47eSEdward Tomasz Napierala uint8_t bhssr_status; 121009ea47eSEdward Tomasz Napierala uint8_t bhssr_total_ahs_len; 122009ea47eSEdward Tomasz Napierala uint8_t bhssr_data_segment_len[3]; 123bebf6a85SAlexander Motin uint16_t bhssr_status_qualifier; 124bebf6a85SAlexander Motin uint16_t bhssr_reserved; 125bebf6a85SAlexander Motin uint32_t bhssr_reserved2; 126009ea47eSEdward Tomasz Napierala uint32_t bhssr_initiator_task_tag; 127009ea47eSEdward Tomasz Napierala uint32_t bhssr_snack_tag; 128009ea47eSEdward Tomasz Napierala uint32_t bhssr_statsn; 129009ea47eSEdward Tomasz Napierala uint32_t bhssr_expcmdsn; 130009ea47eSEdward Tomasz Napierala uint32_t bhssr_maxcmdsn; 131009ea47eSEdward Tomasz Napierala uint32_t bhssr_expdatasn; 132009ea47eSEdward Tomasz Napierala uint32_t bhssr_bidirectional_read_residual_count; 133009ea47eSEdward Tomasz Napierala uint32_t bhssr_residual_count; 134009ea47eSEdward Tomasz Napierala }; 135009ea47eSEdward Tomasz Napierala CTASSERT(sizeof(struct iscsi_bhs_scsi_response) == ISCSI_BHS_SIZE); 136009ea47eSEdward Tomasz Napierala 137009ea47eSEdward Tomasz Napierala #define BHSTMR_FUNCTION_ABORT_TASK 1 138009ea47eSEdward Tomasz Napierala #define BHSTMR_FUNCTION_ABORT_TASK_SET 2 139009ea47eSEdward Tomasz Napierala #define BHSTMR_FUNCTION_CLEAR_ACA 3 140009ea47eSEdward Tomasz Napierala #define BHSTMR_FUNCTION_CLEAR_TASK_SET 4 141009ea47eSEdward Tomasz Napierala #define BHSTMR_FUNCTION_LOGICAL_UNIT_RESET 5 142009ea47eSEdward Tomasz Napierala #define BHSTMR_FUNCTION_TARGET_WARM_RESET 6 143009ea47eSEdward Tomasz Napierala #define BHSTMR_FUNCTION_TARGET_COLD_RESET 7 144009ea47eSEdward Tomasz Napierala #define BHSTMR_FUNCTION_TASK_REASSIGN 8 145bebf6a85SAlexander Motin #define BHSTMR_FUNCTION_QUERY_TASK 9 146bebf6a85SAlexander Motin #define BHSTMR_FUNCTION_QUERY_TASK_SET 10 147bebf6a85SAlexander Motin #define BHSTMR_FUNCTION_I_T_NEXUS_RESET 11 148bebf6a85SAlexander Motin #define BHSTMR_FUNCTION_QUERY_ASYNC_EVENT 12 149009ea47eSEdward Tomasz Napierala 150009ea47eSEdward Tomasz Napierala struct iscsi_bhs_task_management_request { 151009ea47eSEdward Tomasz Napierala uint8_t bhstmr_opcode; 152009ea47eSEdward Tomasz Napierala uint8_t bhstmr_function; 153009ea47eSEdward Tomasz Napierala uint8_t bhstmr_reserved[2]; 154009ea47eSEdward Tomasz Napierala uint8_t bhstmr_total_ahs_len; 155009ea47eSEdward Tomasz Napierala uint8_t bhstmr_data_segment_len[3]; 156009ea47eSEdward Tomasz Napierala uint64_t bhstmr_lun; 157009ea47eSEdward Tomasz Napierala uint32_t bhstmr_initiator_task_tag; 158009ea47eSEdward Tomasz Napierala uint32_t bhstmr_referenced_task_tag; 159009ea47eSEdward Tomasz Napierala uint32_t bhstmr_cmdsn; 160009ea47eSEdward Tomasz Napierala uint32_t bhstmr_expstatsn; 161009ea47eSEdward Tomasz Napierala uint32_t bhstmr_refcmdsn; 162009ea47eSEdward Tomasz Napierala uint32_t bhstmr_expdatasn; 163009ea47eSEdward Tomasz Napierala uint64_t bhstmr_reserved2; 164009ea47eSEdward Tomasz Napierala }; 165009ea47eSEdward Tomasz Napierala CTASSERT(sizeof(struct iscsi_bhs_task_management_request) == ISCSI_BHS_SIZE); 166009ea47eSEdward Tomasz Napierala 167009ea47eSEdward Tomasz Napierala #define BHSTMR_RESPONSE_FUNCTION_COMPLETE 0 168bebf6a85SAlexander Motin #define BHSTMR_RESPONSE_TASK_DOES_NOT_EXIST 1 169bebf6a85SAlexander Motin #define BHSTMR_RESPONSE_LUN_DOES_NOT_EXIST 2 170bebf6a85SAlexander Motin #define BHSTMR_RESPONSE_TASK_STILL_ALLEGIANT 3 171bebf6a85SAlexander Motin #define BHSTMR_RESPONSE_TASK_ALL_REASS_NOT_SUPP 4 172009ea47eSEdward Tomasz Napierala #define BHSTMR_RESPONSE_FUNCTION_NOT_SUPPORTED 5 173bebf6a85SAlexander Motin #define BHSTMR_RESPONSE_FUNCTION_AUTH_FAIL 6 174bebf6a85SAlexander Motin #define BHSTMR_RESPONSE_FUNCTION_SUCCEEDED 7 175bebf6a85SAlexander Motin #define BHSTMR_RESPONSE_FUNCTION_REJECTED 255 176009ea47eSEdward Tomasz Napierala 177009ea47eSEdward Tomasz Napierala struct iscsi_bhs_task_management_response { 178009ea47eSEdward Tomasz Napierala uint8_t bhstmr_opcode; 179009ea47eSEdward Tomasz Napierala uint8_t bhstmr_flags; 180009ea47eSEdward Tomasz Napierala uint8_t bhstmr_response; 181009ea47eSEdward Tomasz Napierala uint8_t bhstmr_reserved; 182009ea47eSEdward Tomasz Napierala uint8_t bhstmr_total_ahs_len; 183009ea47eSEdward Tomasz Napierala uint8_t bhstmr_data_segment_len[3]; 1844b0e5c9eSAlexander Motin uint8_t bhstmr_additional_reponse_information[3]; 1854b0e5c9eSAlexander Motin uint8_t bhstmr_reserved2[5]; 186009ea47eSEdward Tomasz Napierala uint32_t bhstmr_initiator_task_tag; 187009ea47eSEdward Tomasz Napierala uint32_t bhstmr_reserved3; 188009ea47eSEdward Tomasz Napierala uint32_t bhstmr_statsn; 189009ea47eSEdward Tomasz Napierala uint32_t bhstmr_expcmdsn; 190009ea47eSEdward Tomasz Napierala uint32_t bhstmr_maxcmdsn; 191009ea47eSEdward Tomasz Napierala uint8_t bhstmr_reserved4[12]; 192009ea47eSEdward Tomasz Napierala }; 193009ea47eSEdward Tomasz Napierala CTASSERT(sizeof(struct iscsi_bhs_task_management_response) == ISCSI_BHS_SIZE); 194009ea47eSEdward Tomasz Napierala 195009ea47eSEdward Tomasz Napierala #define BHSLR_FLAGS_TRANSIT 0x80 196009ea47eSEdward Tomasz Napierala #define BHSLR_FLAGS_CONTINUE 0x40 197009ea47eSEdward Tomasz Napierala 198009ea47eSEdward Tomasz Napierala #define BHSLR_STAGE_SECURITY_NEGOTIATION 0 199009ea47eSEdward Tomasz Napierala #define BHSLR_STAGE_OPERATIONAL_NEGOTIATION 1 200009ea47eSEdward Tomasz Napierala #define BHSLR_STAGE_FULL_FEATURE_PHASE 3 /* Yes, 3. */ 201009ea47eSEdward Tomasz Napierala 202009ea47eSEdward Tomasz Napierala struct iscsi_bhs_login_request { 203009ea47eSEdward Tomasz Napierala uint8_t bhslr_opcode; 204009ea47eSEdward Tomasz Napierala uint8_t bhslr_flags; 205009ea47eSEdward Tomasz Napierala uint8_t bhslr_version_max; 206009ea47eSEdward Tomasz Napierala uint8_t bhslr_version_min; 207009ea47eSEdward Tomasz Napierala uint8_t bhslr_total_ahs_len; 208009ea47eSEdward Tomasz Napierala uint8_t bhslr_data_segment_len[3]; 209009ea47eSEdward Tomasz Napierala uint8_t bhslr_isid[6]; 210009ea47eSEdward Tomasz Napierala uint16_t bhslr_tsih; 211009ea47eSEdward Tomasz Napierala uint32_t bhslr_initiator_task_tag; 212009ea47eSEdward Tomasz Napierala uint16_t bhslr_cid; 213009ea47eSEdward Tomasz Napierala uint16_t bhslr_reserved; 214009ea47eSEdward Tomasz Napierala uint32_t bhslr_cmdsn; 215009ea47eSEdward Tomasz Napierala uint32_t bhslr_expstatsn; 216009ea47eSEdward Tomasz Napierala uint8_t bhslr_reserved2[16]; 217009ea47eSEdward Tomasz Napierala }; 218009ea47eSEdward Tomasz Napierala CTASSERT(sizeof(struct iscsi_bhs_login_request) == ISCSI_BHS_SIZE); 219009ea47eSEdward Tomasz Napierala 220009ea47eSEdward Tomasz Napierala struct iscsi_bhs_login_response { 221009ea47eSEdward Tomasz Napierala uint8_t bhslr_opcode; 222009ea47eSEdward Tomasz Napierala uint8_t bhslr_flags; 223009ea47eSEdward Tomasz Napierala uint8_t bhslr_version_max; 224009ea47eSEdward Tomasz Napierala uint8_t bhslr_version_active; 225009ea47eSEdward Tomasz Napierala uint8_t bhslr_total_ahs_len; 226009ea47eSEdward Tomasz Napierala uint8_t bhslr_data_segment_len[3]; 227009ea47eSEdward Tomasz Napierala uint8_t bhslr_isid[6]; 228009ea47eSEdward Tomasz Napierala uint16_t bhslr_tsih; 229009ea47eSEdward Tomasz Napierala uint32_t bhslr_initiator_task_tag; 230009ea47eSEdward Tomasz Napierala uint32_t bhslr_reserved; 231009ea47eSEdward Tomasz Napierala uint32_t bhslr_statsn; 232009ea47eSEdward Tomasz Napierala uint32_t bhslr_expcmdsn; 233009ea47eSEdward Tomasz Napierala uint32_t bhslr_maxcmdsn; 234009ea47eSEdward Tomasz Napierala uint8_t bhslr_status_class; 235009ea47eSEdward Tomasz Napierala uint8_t bhslr_status_detail; 236009ea47eSEdward Tomasz Napierala uint16_t bhslr_reserved2; 237009ea47eSEdward Tomasz Napierala uint8_t bhslr_reserved3[8]; 238009ea47eSEdward Tomasz Napierala }; 239009ea47eSEdward Tomasz Napierala CTASSERT(sizeof(struct iscsi_bhs_login_response) == ISCSI_BHS_SIZE); 240009ea47eSEdward Tomasz Napierala 241009ea47eSEdward Tomasz Napierala #define BHSTR_FLAGS_FINAL 0x80 242009ea47eSEdward Tomasz Napierala #define BHSTR_FLAGS_CONTINUE 0x40 243009ea47eSEdward Tomasz Napierala 244009ea47eSEdward Tomasz Napierala struct iscsi_bhs_text_request { 245009ea47eSEdward Tomasz Napierala uint8_t bhstr_opcode; 246009ea47eSEdward Tomasz Napierala uint8_t bhstr_flags; 247009ea47eSEdward Tomasz Napierala uint16_t bhstr_reserved; 248009ea47eSEdward Tomasz Napierala uint8_t bhstr_total_ahs_len; 249009ea47eSEdward Tomasz Napierala uint8_t bhstr_data_segment_len[3]; 250009ea47eSEdward Tomasz Napierala uint64_t bhstr_lun; 251009ea47eSEdward Tomasz Napierala uint32_t bhstr_initiator_task_tag; 252009ea47eSEdward Tomasz Napierala uint32_t bhstr_target_transfer_tag; 253009ea47eSEdward Tomasz Napierala uint32_t bhstr_cmdsn; 254009ea47eSEdward Tomasz Napierala uint32_t bhstr_expstatsn; 255009ea47eSEdward Tomasz Napierala uint8_t bhstr_reserved2[16]; 256009ea47eSEdward Tomasz Napierala }; 257009ea47eSEdward Tomasz Napierala CTASSERT(sizeof(struct iscsi_bhs_text_request) == ISCSI_BHS_SIZE); 258009ea47eSEdward Tomasz Napierala 259009ea47eSEdward Tomasz Napierala struct iscsi_bhs_text_response { 260009ea47eSEdward Tomasz Napierala uint8_t bhstr_opcode; 261009ea47eSEdward Tomasz Napierala uint8_t bhstr_flags; 262009ea47eSEdward Tomasz Napierala uint16_t bhstr_reserved; 263009ea47eSEdward Tomasz Napierala uint8_t bhstr_total_ahs_len; 264009ea47eSEdward Tomasz Napierala uint8_t bhstr_data_segment_len[3]; 265009ea47eSEdward Tomasz Napierala uint64_t bhstr_lun; 266009ea47eSEdward Tomasz Napierala uint32_t bhstr_initiator_task_tag; 267009ea47eSEdward Tomasz Napierala uint32_t bhstr_target_transfer_tag; 268009ea47eSEdward Tomasz Napierala uint32_t bhstr_statsn; 269009ea47eSEdward Tomasz Napierala uint32_t bhstr_expcmdsn; 270009ea47eSEdward Tomasz Napierala uint32_t bhstr_maxcmdsn; 271009ea47eSEdward Tomasz Napierala uint8_t bhstr_reserved2[12]; 272009ea47eSEdward Tomasz Napierala }; 273009ea47eSEdward Tomasz Napierala CTASSERT(sizeof(struct iscsi_bhs_text_response) == ISCSI_BHS_SIZE); 274009ea47eSEdward Tomasz Napierala 275009ea47eSEdward Tomasz Napierala #define BHSDO_FLAGS_F 0x80 276009ea47eSEdward Tomasz Napierala 277009ea47eSEdward Tomasz Napierala struct iscsi_bhs_data_out { 278009ea47eSEdward Tomasz Napierala uint8_t bhsdo_opcode; 279009ea47eSEdward Tomasz Napierala uint8_t bhsdo_flags; 280009ea47eSEdward Tomasz Napierala uint8_t bhsdo_reserved[2]; 281009ea47eSEdward Tomasz Napierala uint8_t bhsdo_total_ahs_len; 282009ea47eSEdward Tomasz Napierala uint8_t bhsdo_data_segment_len[3]; 283009ea47eSEdward Tomasz Napierala uint64_t bhsdo_lun; 284009ea47eSEdward Tomasz Napierala uint32_t bhsdo_initiator_task_tag; 285009ea47eSEdward Tomasz Napierala uint32_t bhsdo_target_transfer_tag; 286009ea47eSEdward Tomasz Napierala uint32_t bhsdo_reserved2; 287009ea47eSEdward Tomasz Napierala uint32_t bhsdo_expstatsn; 288009ea47eSEdward Tomasz Napierala uint32_t bhsdo_reserved3; 289009ea47eSEdward Tomasz Napierala uint32_t bhsdo_datasn; 290009ea47eSEdward Tomasz Napierala uint32_t bhsdo_buffer_offset; 291009ea47eSEdward Tomasz Napierala uint32_t bhsdo_reserved4; 292009ea47eSEdward Tomasz Napierala }; 293009ea47eSEdward Tomasz Napierala CTASSERT(sizeof(struct iscsi_bhs_data_out) == ISCSI_BHS_SIZE); 294009ea47eSEdward Tomasz Napierala 295009ea47eSEdward Tomasz Napierala #define BHSDI_FLAGS_F 0x80 296009ea47eSEdward Tomasz Napierala #define BHSDI_FLAGS_A 0x40 297009ea47eSEdward Tomasz Napierala #define BHSDI_FLAGS_O 0x04 298009ea47eSEdward Tomasz Napierala #define BHSDI_FLAGS_U 0x02 299009ea47eSEdward Tomasz Napierala #define BHSDI_FLAGS_S 0x01 300009ea47eSEdward Tomasz Napierala 301009ea47eSEdward Tomasz Napierala struct iscsi_bhs_data_in { 302009ea47eSEdward Tomasz Napierala uint8_t bhsdi_opcode; 303009ea47eSEdward Tomasz Napierala uint8_t bhsdi_flags; 304009ea47eSEdward Tomasz Napierala uint8_t bhsdi_reserved; 305009ea47eSEdward Tomasz Napierala uint8_t bhsdi_status; 306009ea47eSEdward Tomasz Napierala uint8_t bhsdi_total_ahs_len; 307009ea47eSEdward Tomasz Napierala uint8_t bhsdi_data_segment_len[3]; 308009ea47eSEdward Tomasz Napierala uint64_t bhsdi_lun; 309009ea47eSEdward Tomasz Napierala uint32_t bhsdi_initiator_task_tag; 310009ea47eSEdward Tomasz Napierala uint32_t bhsdi_target_transfer_tag; 311009ea47eSEdward Tomasz Napierala uint32_t bhsdi_statsn; 312009ea47eSEdward Tomasz Napierala uint32_t bhsdi_expcmdsn; 313009ea47eSEdward Tomasz Napierala uint32_t bhsdi_maxcmdsn; 314009ea47eSEdward Tomasz Napierala uint32_t bhsdi_datasn; 315009ea47eSEdward Tomasz Napierala uint32_t bhsdi_buffer_offset; 316009ea47eSEdward Tomasz Napierala uint32_t bhsdi_residual_count; 317009ea47eSEdward Tomasz Napierala }; 318009ea47eSEdward Tomasz Napierala CTASSERT(sizeof(struct iscsi_bhs_data_in) == ISCSI_BHS_SIZE); 319009ea47eSEdward Tomasz Napierala 320009ea47eSEdward Tomasz Napierala struct iscsi_bhs_r2t { 321009ea47eSEdward Tomasz Napierala uint8_t bhsr2t_opcode; 322009ea47eSEdward Tomasz Napierala uint8_t bhsr2t_flags; 323009ea47eSEdward Tomasz Napierala uint16_t bhsr2t_reserved; 324009ea47eSEdward Tomasz Napierala uint8_t bhsr2t_total_ahs_len; 325009ea47eSEdward Tomasz Napierala uint8_t bhsr2t_data_segment_len[3]; 326009ea47eSEdward Tomasz Napierala uint64_t bhsr2t_lun; 327009ea47eSEdward Tomasz Napierala uint32_t bhsr2t_initiator_task_tag; 328009ea47eSEdward Tomasz Napierala uint32_t bhsr2t_target_transfer_tag; 329009ea47eSEdward Tomasz Napierala uint32_t bhsr2t_statsn; 330009ea47eSEdward Tomasz Napierala uint32_t bhsr2t_expcmdsn; 331009ea47eSEdward Tomasz Napierala uint32_t bhsr2t_maxcmdsn; 332009ea47eSEdward Tomasz Napierala uint32_t bhsr2t_r2tsn; 333009ea47eSEdward Tomasz Napierala uint32_t bhsr2t_buffer_offset; 334009ea47eSEdward Tomasz Napierala uint32_t bhsr2t_desired_data_transfer_length; 335009ea47eSEdward Tomasz Napierala }; 336009ea47eSEdward Tomasz Napierala CTASSERT(sizeof(struct iscsi_bhs_r2t) == ISCSI_BHS_SIZE); 337009ea47eSEdward Tomasz Napierala 338009ea47eSEdward Tomasz Napierala struct iscsi_bhs_nop_out { 339009ea47eSEdward Tomasz Napierala uint8_t bhsno_opcode; 340009ea47eSEdward Tomasz Napierala uint8_t bhsno_flags; 341009ea47eSEdward Tomasz Napierala uint16_t bhsno_reserved; 342009ea47eSEdward Tomasz Napierala uint8_t bhsno_total_ahs_len; 343009ea47eSEdward Tomasz Napierala uint8_t bhsno_data_segment_len[3]; 344009ea47eSEdward Tomasz Napierala uint64_t bhsno_lun; 345009ea47eSEdward Tomasz Napierala uint32_t bhsno_initiator_task_tag; 346009ea47eSEdward Tomasz Napierala uint32_t bhsno_target_transfer_tag; 347009ea47eSEdward Tomasz Napierala uint32_t bhsno_cmdsn; 348009ea47eSEdward Tomasz Napierala uint32_t bhsno_expstatsn; 349009ea47eSEdward Tomasz Napierala uint8_t bhsno_reserved2[16]; 350009ea47eSEdward Tomasz Napierala }; 351009ea47eSEdward Tomasz Napierala CTASSERT(sizeof(struct iscsi_bhs_nop_out) == ISCSI_BHS_SIZE); 352009ea47eSEdward Tomasz Napierala 353009ea47eSEdward Tomasz Napierala struct iscsi_bhs_nop_in { 354009ea47eSEdward Tomasz Napierala uint8_t bhsni_opcode; 355009ea47eSEdward Tomasz Napierala uint8_t bhsni_flags; 356009ea47eSEdward Tomasz Napierala uint16_t bhsni_reserved; 357009ea47eSEdward Tomasz Napierala uint8_t bhsni_total_ahs_len; 358009ea47eSEdward Tomasz Napierala uint8_t bhsni_data_segment_len[3]; 359009ea47eSEdward Tomasz Napierala uint64_t bhsni_lun; 360009ea47eSEdward Tomasz Napierala uint32_t bhsni_initiator_task_tag; 361009ea47eSEdward Tomasz Napierala uint32_t bhsni_target_transfer_tag; 362009ea47eSEdward Tomasz Napierala uint32_t bhsni_statsn; 363009ea47eSEdward Tomasz Napierala uint32_t bhsni_expcmdsn; 364009ea47eSEdward Tomasz Napierala uint32_t bhsni_maxcmdsn; 365009ea47eSEdward Tomasz Napierala uint8_t bhsno_reserved2[12]; 366009ea47eSEdward Tomasz Napierala }; 367009ea47eSEdward Tomasz Napierala CTASSERT(sizeof(struct iscsi_bhs_nop_in) == ISCSI_BHS_SIZE); 368009ea47eSEdward Tomasz Napierala 369009ea47eSEdward Tomasz Napierala #define BHSLR_REASON_CLOSE_SESSION 0 370009ea47eSEdward Tomasz Napierala #define BHSLR_REASON_CLOSE_CONNECTION 1 371009ea47eSEdward Tomasz Napierala #define BHSLR_REASON_REMOVE_FOR_RECOVERY 2 372009ea47eSEdward Tomasz Napierala 373009ea47eSEdward Tomasz Napierala struct iscsi_bhs_logout_request { 374009ea47eSEdward Tomasz Napierala uint8_t bhslr_opcode; 375009ea47eSEdward Tomasz Napierala uint8_t bhslr_reason; 376009ea47eSEdward Tomasz Napierala uint16_t bhslr_reserved; 377009ea47eSEdward Tomasz Napierala uint8_t bhslr_total_ahs_len; 378009ea47eSEdward Tomasz Napierala uint8_t bhslr_data_segment_len[3]; 379009ea47eSEdward Tomasz Napierala uint64_t bhslr_reserved2; 380009ea47eSEdward Tomasz Napierala uint32_t bhslr_initiator_task_tag; 381009ea47eSEdward Tomasz Napierala uint16_t bhslr_cid; 382009ea47eSEdward Tomasz Napierala uint16_t bhslr_reserved3; 383009ea47eSEdward Tomasz Napierala uint32_t bhslr_cmdsn; 384009ea47eSEdward Tomasz Napierala uint32_t bhslr_expstatsn; 385009ea47eSEdward Tomasz Napierala uint8_t bhslr_reserved4[16]; 386009ea47eSEdward Tomasz Napierala }; 387009ea47eSEdward Tomasz Napierala CTASSERT(sizeof(struct iscsi_bhs_logout_request) == ISCSI_BHS_SIZE); 388009ea47eSEdward Tomasz Napierala 389009ea47eSEdward Tomasz Napierala #define BHSLR_RESPONSE_CLOSED_SUCCESSFULLY 0 390009ea47eSEdward Tomasz Napierala #define BHSLR_RESPONSE_RECOVERY_NOT_SUPPORTED 2 391009ea47eSEdward Tomasz Napierala 392009ea47eSEdward Tomasz Napierala struct iscsi_bhs_logout_response { 393009ea47eSEdward Tomasz Napierala uint8_t bhslr_opcode; 394009ea47eSEdward Tomasz Napierala uint8_t bhslr_flags; 395009ea47eSEdward Tomasz Napierala uint8_t bhslr_response; 396009ea47eSEdward Tomasz Napierala uint8_t bhslr_reserved; 397009ea47eSEdward Tomasz Napierala uint8_t bhslr_total_ahs_len; 398009ea47eSEdward Tomasz Napierala uint8_t bhslr_data_segment_len[3]; 399009ea47eSEdward Tomasz Napierala uint64_t bhslr_reserved2; 400009ea47eSEdward Tomasz Napierala uint32_t bhslr_initiator_task_tag; 401009ea47eSEdward Tomasz Napierala uint32_t bhslr_reserved3; 402009ea47eSEdward Tomasz Napierala uint32_t bhslr_statsn; 403009ea47eSEdward Tomasz Napierala uint32_t bhslr_expcmdsn; 404009ea47eSEdward Tomasz Napierala uint32_t bhslr_maxcmdsn; 405009ea47eSEdward Tomasz Napierala uint32_t bhslr_reserved4; 406009ea47eSEdward Tomasz Napierala uint16_t bhslr_time2wait; 407009ea47eSEdward Tomasz Napierala uint16_t bhslr_time2retain; 408009ea47eSEdward Tomasz Napierala uint32_t bhslr_reserved5; 409009ea47eSEdward Tomasz Napierala }; 410009ea47eSEdward Tomasz Napierala CTASSERT(sizeof(struct iscsi_bhs_logout_response) == ISCSI_BHS_SIZE); 411009ea47eSEdward Tomasz Napierala 412009ea47eSEdward Tomasz Napierala #define BHSAM_EVENT_TARGET_REQUESTS_LOGOUT 1 413009ea47eSEdward Tomasz Napierala #define BHSAM_EVENT_TARGET_TERMINATES_CONNECTION 2 414009ea47eSEdward Tomasz Napierala #define BHSAM_EVENT_TARGET_TERMINATES_SESSION 3 415009ea47eSEdward Tomasz Napierala 416009ea47eSEdward Tomasz Napierala struct iscsi_bhs_asynchronous_message { 417009ea47eSEdward Tomasz Napierala uint8_t bhsam_opcode; 418009ea47eSEdward Tomasz Napierala uint8_t bhsam_flags; 419009ea47eSEdward Tomasz Napierala uint16_t bhsam_reserved; 420009ea47eSEdward Tomasz Napierala uint8_t bhsam_total_ahs_len; 421009ea47eSEdward Tomasz Napierala uint8_t bhsam_data_segment_len[3]; 422009ea47eSEdward Tomasz Napierala uint64_t bhsam_lun; 423009ea47eSEdward Tomasz Napierala uint32_t bhsam_0xffffffff; 424009ea47eSEdward Tomasz Napierala uint32_t bhsam_reserved2; 425009ea47eSEdward Tomasz Napierala uint32_t bhsam_statsn; 426009ea47eSEdward Tomasz Napierala uint32_t bhsam_expcmdsn; 427009ea47eSEdward Tomasz Napierala uint32_t bhsam_maxcmdsn; 428009ea47eSEdward Tomasz Napierala uint8_t bhsam_async_event; 429009ea47eSEdward Tomasz Napierala uint8_t bhsam_async_vcode; 430009ea47eSEdward Tomasz Napierala uint16_t bhsam_parameter1; 431009ea47eSEdward Tomasz Napierala uint16_t bhsam_parameter2; 432009ea47eSEdward Tomasz Napierala uint16_t bhsam_parameter3; 433009ea47eSEdward Tomasz Napierala uint32_t bhsam_reserved3; 434009ea47eSEdward Tomasz Napierala }; 435009ea47eSEdward Tomasz Napierala CTASSERT(sizeof(struct iscsi_bhs_asynchronous_message) == ISCSI_BHS_SIZE); 436009ea47eSEdward Tomasz Napierala 437009ea47eSEdward Tomasz Napierala #define BHSSR_REASON_DATA_DIGEST_ERROR 0x02 438009ea47eSEdward Tomasz Napierala #define BHSSR_PROTOCOL_ERROR 0x04 439009ea47eSEdward Tomasz Napierala #define BHSSR_COMMAND_NOT_SUPPORTED 0x05 440009ea47eSEdward Tomasz Napierala #define BHSSR_INVALID_PDU_FIELD 0x09 441009ea47eSEdward Tomasz Napierala 442009ea47eSEdward Tomasz Napierala struct iscsi_bhs_reject { 443009ea47eSEdward Tomasz Napierala uint8_t bhsr_opcode; 444009ea47eSEdward Tomasz Napierala uint8_t bhsr_flags; 445009ea47eSEdward Tomasz Napierala uint8_t bhsr_reason; 446009ea47eSEdward Tomasz Napierala uint8_t bhsr_reserved; 447009ea47eSEdward Tomasz Napierala uint8_t bhsr_total_ahs_len; 448009ea47eSEdward Tomasz Napierala uint8_t bhsr_data_segment_len[3]; 449009ea47eSEdward Tomasz Napierala uint64_t bhsr_reserved2; 450009ea47eSEdward Tomasz Napierala uint32_t bhsr_0xffffffff; 451009ea47eSEdward Tomasz Napierala uint32_t bhsr_reserved3; 452009ea47eSEdward Tomasz Napierala uint32_t bhsr_statsn; 453009ea47eSEdward Tomasz Napierala uint32_t bhsr_expcmdsn; 454009ea47eSEdward Tomasz Napierala uint32_t bhsr_maxcmdsn; 455009ea47eSEdward Tomasz Napierala uint32_t bhsr_datasn_r2tsn; 456009ea47eSEdward Tomasz Napierala uint32_t bhsr_reserved4; 457009ea47eSEdward Tomasz Napierala uint32_t bhsr_reserved5; 458009ea47eSEdward Tomasz Napierala }; 459009ea47eSEdward Tomasz Napierala CTASSERT(sizeof(struct iscsi_bhs_reject) == ISCSI_BHS_SIZE); 460009ea47eSEdward Tomasz Napierala 461009ea47eSEdward Tomasz Napierala #endif /* !ISCSI_PROTO_H */ 462