iscsi_proto.h revision 330897
1/*- 2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD 3 * 4 * Copyright (c) 2012 The FreeBSD Foundation 5 * All rights reserved. 6 * 7 * This software was developed by Edward Tomasz Napierala under sponsorship 8 * from the FreeBSD Foundation. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29 * SUCH DAMAGE. 30 * 31 * $FreeBSD: stable/11/sys/dev/iscsi/iscsi_proto.h 330897 2018-03-14 03:19:51Z eadler $ 32 */ 33 34#ifndef ISCSI_PROTO_H 35#define ISCSI_PROTO_H 36 37#ifndef CTASSERT 38#define CTASSERT(x) _CTASSERT(x, __LINE__) 39#define _CTASSERT(x, y) __CTASSERT(x, y) 40#define __CTASSERT(x, y) typedef char __assert_ ## y [(x) ? 1 : -1] 41#endif 42 43#define ISCSI_SNGT(x, y) ((int32_t)(x) - (int32_t)(y) > 0) 44#define ISCSI_SNLT(x, y) ((int32_t)(x) - (int32_t)(y) < 0) 45 46#define ISCSI_BHS_SIZE 48 47#define ISCSI_HEADER_DIGEST_SIZE 4 48#define ISCSI_DATA_DIGEST_SIZE 4 49 50#define ISCSI_BHS_OPCODE_IMMEDIATE 0x40 51 52#define ISCSI_BHS_OPCODE_NOP_OUT 0x00 53#define ISCSI_BHS_OPCODE_SCSI_COMMAND 0x01 54#define ISCSI_BHS_OPCODE_TASK_REQUEST 0x02 55#define ISCSI_BHS_OPCODE_LOGIN_REQUEST 0x03 56#define ISCSI_BHS_OPCODE_TEXT_REQUEST 0x04 57#define ISCSI_BHS_OPCODE_SCSI_DATA_OUT 0x05 58#define ISCSI_BHS_OPCODE_LOGOUT_REQUEST 0x06 59 60#define ISCSI_BHS_OPCODE_NOP_IN 0x20 61#define ISCSI_BHS_OPCODE_SCSI_RESPONSE 0x21 62#define ISCSI_BHS_OPCODE_TASK_RESPONSE 0x22 63#define ISCSI_BHS_OPCODE_LOGIN_RESPONSE 0x23 64#define ISCSI_BHS_OPCODE_TEXT_RESPONSE 0x24 65#define ISCSI_BHS_OPCODE_SCSI_DATA_IN 0x25 66#define ISCSI_BHS_OPCODE_LOGOUT_RESPONSE 0x26 67#define ISCSI_BHS_OPCODE_R2T 0x31 68#define ISCSI_BHS_OPCODE_ASYNC_MESSAGE 0x32 69#define ISCSI_BHS_OPCODE_REJECT 0x3f 70 71struct iscsi_bhs { 72 uint8_t bhs_opcode; 73 uint8_t bhs_opcode_specific1[3]; 74 uint8_t bhs_total_ahs_len; 75 uint8_t bhs_data_segment_len[3]; 76 uint64_t bhs_lun; 77 uint8_t bhs_inititator_task_tag[4]; 78 uint8_t bhs_opcode_specific4[28]; 79}; 80CTASSERT(sizeof(struct iscsi_bhs) == ISCSI_BHS_SIZE); 81 82#define BHSSC_FLAGS_F 0x80 83#define BHSSC_FLAGS_R 0x40 84#define BHSSC_FLAGS_W 0x20 85#define BHSSC_FLAGS_ATTR 0x07 86 87#define BHSSC_FLAGS_ATTR_UNTAGGED 0 88#define BHSSC_FLAGS_ATTR_SIMPLE 1 89#define BHSSC_FLAGS_ATTR_ORDERED 2 90#define BHSSC_FLAGS_ATTR_HOQ 3 91#define BHSSC_FLAGS_ATTR_ACA 4 92 93struct iscsi_bhs_scsi_command { 94 uint8_t bhssc_opcode; 95 uint8_t bhssc_flags; 96 uint8_t bhssc_reserved[2]; 97 uint8_t bhssc_total_ahs_len; 98 uint8_t bhssc_data_segment_len[3]; 99 uint64_t bhssc_lun; 100 uint32_t bhssc_initiator_task_tag; 101 uint32_t bhssc_expected_data_transfer_length; 102 uint32_t bhssc_cmdsn; 103 uint32_t bhssc_expstatsn; 104 uint8_t bhssc_cdb[16]; 105}; 106CTASSERT(sizeof(struct iscsi_bhs_scsi_command) == ISCSI_BHS_SIZE); 107 108#define BHSSR_FLAGS_RESIDUAL_UNDERFLOW 0x02 109#define BHSSR_FLAGS_RESIDUAL_OVERFLOW 0x04 110 111#define BHSSR_RESPONSE_COMMAND_COMPLETED 0x00 112 113struct iscsi_bhs_scsi_response { 114 uint8_t bhssr_opcode; 115 uint8_t bhssr_flags; 116 uint8_t bhssr_response; 117 uint8_t bhssr_status; 118 uint8_t bhssr_total_ahs_len; 119 uint8_t bhssr_data_segment_len[3]; 120 uint16_t bhssr_status_qualifier; 121 uint16_t bhssr_reserved; 122 uint32_t bhssr_reserved2; 123 uint32_t bhssr_initiator_task_tag; 124 uint32_t bhssr_snack_tag; 125 uint32_t bhssr_statsn; 126 uint32_t bhssr_expcmdsn; 127 uint32_t bhssr_maxcmdsn; 128 uint32_t bhssr_expdatasn; 129 uint32_t bhssr_bidirectional_read_residual_count; 130 uint32_t bhssr_residual_count; 131}; 132CTASSERT(sizeof(struct iscsi_bhs_scsi_response) == ISCSI_BHS_SIZE); 133 134#define BHSTMR_FUNCTION_ABORT_TASK 1 135#define BHSTMR_FUNCTION_ABORT_TASK_SET 2 136#define BHSTMR_FUNCTION_CLEAR_ACA 3 137#define BHSTMR_FUNCTION_CLEAR_TASK_SET 4 138#define BHSTMR_FUNCTION_LOGICAL_UNIT_RESET 5 139#define BHSTMR_FUNCTION_TARGET_WARM_RESET 6 140#define BHSTMR_FUNCTION_TARGET_COLD_RESET 7 141#define BHSTMR_FUNCTION_TASK_REASSIGN 8 142#define BHSTMR_FUNCTION_QUERY_TASK 9 143#define BHSTMR_FUNCTION_QUERY_TASK_SET 10 144#define BHSTMR_FUNCTION_I_T_NEXUS_RESET 11 145#define BHSTMR_FUNCTION_QUERY_ASYNC_EVENT 12 146 147struct iscsi_bhs_task_management_request { 148 uint8_t bhstmr_opcode; 149 uint8_t bhstmr_function; 150 uint8_t bhstmr_reserved[2]; 151 uint8_t bhstmr_total_ahs_len; 152 uint8_t bhstmr_data_segment_len[3]; 153 uint64_t bhstmr_lun; 154 uint32_t bhstmr_initiator_task_tag; 155 uint32_t bhstmr_referenced_task_tag; 156 uint32_t bhstmr_cmdsn; 157 uint32_t bhstmr_expstatsn; 158 uint32_t bhstmr_refcmdsn; 159 uint32_t bhstmr_expdatasn; 160 uint64_t bhstmr_reserved2; 161}; 162CTASSERT(sizeof(struct iscsi_bhs_task_management_request) == ISCSI_BHS_SIZE); 163 164#define BHSTMR_RESPONSE_FUNCTION_COMPLETE 0 165#define BHSTMR_RESPONSE_TASK_DOES_NOT_EXIST 1 166#define BHSTMR_RESPONSE_LUN_DOES_NOT_EXIST 2 167#define BHSTMR_RESPONSE_TASK_STILL_ALLEGIANT 3 168#define BHSTMR_RESPONSE_TASK_ALL_REASS_NOT_SUPP 4 169#define BHSTMR_RESPONSE_FUNCTION_NOT_SUPPORTED 5 170#define BHSTMR_RESPONSE_FUNCTION_AUTH_FAIL 6 171#define BHSTMR_RESPONSE_FUNCTION_SUCCEEDED 7 172#define BHSTMR_RESPONSE_FUNCTION_REJECTED 255 173 174struct iscsi_bhs_task_management_response { 175 uint8_t bhstmr_opcode; 176 uint8_t bhstmr_flags; 177 uint8_t bhstmr_response; 178 uint8_t bhstmr_reserved; 179 uint8_t bhstmr_total_ahs_len; 180 uint8_t bhstmr_data_segment_len[3]; 181 uint8_t bhstmr_additional_reponse_information[3]; 182 uint8_t bhstmr_reserved2[5]; 183 uint32_t bhstmr_initiator_task_tag; 184 uint32_t bhstmr_reserved3; 185 uint32_t bhstmr_statsn; 186 uint32_t bhstmr_expcmdsn; 187 uint32_t bhstmr_maxcmdsn; 188 uint8_t bhstmr_reserved4[12]; 189}; 190CTASSERT(sizeof(struct iscsi_bhs_task_management_response) == ISCSI_BHS_SIZE); 191 192#define BHSLR_FLAGS_TRANSIT 0x80 193#define BHSLR_FLAGS_CONTINUE 0x40 194 195#define BHSLR_STAGE_SECURITY_NEGOTIATION 0 196#define BHSLR_STAGE_OPERATIONAL_NEGOTIATION 1 197#define BHSLR_STAGE_FULL_FEATURE_PHASE 3 /* Yes, 3. */ 198 199struct iscsi_bhs_login_request { 200 uint8_t bhslr_opcode; 201 uint8_t bhslr_flags; 202 uint8_t bhslr_version_max; 203 uint8_t bhslr_version_min; 204 uint8_t bhslr_total_ahs_len; 205 uint8_t bhslr_data_segment_len[3]; 206 uint8_t bhslr_isid[6]; 207 uint16_t bhslr_tsih; 208 uint32_t bhslr_initiator_task_tag; 209 uint16_t bhslr_cid; 210 uint16_t bhslr_reserved; 211 uint32_t bhslr_cmdsn; 212 uint32_t bhslr_expstatsn; 213 uint8_t bhslr_reserved2[16]; 214}; 215CTASSERT(sizeof(struct iscsi_bhs_login_request) == ISCSI_BHS_SIZE); 216 217struct iscsi_bhs_login_response { 218 uint8_t bhslr_opcode; 219 uint8_t bhslr_flags; 220 uint8_t bhslr_version_max; 221 uint8_t bhslr_version_active; 222 uint8_t bhslr_total_ahs_len; 223 uint8_t bhslr_data_segment_len[3]; 224 uint8_t bhslr_isid[6]; 225 uint16_t bhslr_tsih; 226 uint32_t bhslr_initiator_task_tag; 227 uint32_t bhslr_reserved; 228 uint32_t bhslr_statsn; 229 uint32_t bhslr_expcmdsn; 230 uint32_t bhslr_maxcmdsn; 231 uint8_t bhslr_status_class; 232 uint8_t bhslr_status_detail; 233 uint16_t bhslr_reserved2; 234 uint8_t bhslr_reserved3[8]; 235}; 236CTASSERT(sizeof(struct iscsi_bhs_login_response) == ISCSI_BHS_SIZE); 237 238#define BHSTR_FLAGS_FINAL 0x80 239#define BHSTR_FLAGS_CONTINUE 0x40 240 241struct iscsi_bhs_text_request { 242 uint8_t bhstr_opcode; 243 uint8_t bhstr_flags; 244 uint16_t bhstr_reserved; 245 uint8_t bhstr_total_ahs_len; 246 uint8_t bhstr_data_segment_len[3]; 247 uint64_t bhstr_lun; 248 uint32_t bhstr_initiator_task_tag; 249 uint32_t bhstr_target_transfer_tag; 250 uint32_t bhstr_cmdsn; 251 uint32_t bhstr_expstatsn; 252 uint8_t bhstr_reserved2[16]; 253}; 254CTASSERT(sizeof(struct iscsi_bhs_text_request) == ISCSI_BHS_SIZE); 255 256struct iscsi_bhs_text_response { 257 uint8_t bhstr_opcode; 258 uint8_t bhstr_flags; 259 uint16_t bhstr_reserved; 260 uint8_t bhstr_total_ahs_len; 261 uint8_t bhstr_data_segment_len[3]; 262 uint64_t bhstr_lun; 263 uint32_t bhstr_initiator_task_tag; 264 uint32_t bhstr_target_transfer_tag; 265 uint32_t bhstr_statsn; 266 uint32_t bhstr_expcmdsn; 267 uint32_t bhstr_maxcmdsn; 268 uint8_t bhstr_reserved2[12]; 269}; 270CTASSERT(sizeof(struct iscsi_bhs_text_response) == ISCSI_BHS_SIZE); 271 272#define BHSDO_FLAGS_F 0x80 273 274struct iscsi_bhs_data_out { 275 uint8_t bhsdo_opcode; 276 uint8_t bhsdo_flags; 277 uint8_t bhsdo_reserved[2]; 278 uint8_t bhsdo_total_ahs_len; 279 uint8_t bhsdo_data_segment_len[3]; 280 uint64_t bhsdo_lun; 281 uint32_t bhsdo_initiator_task_tag; 282 uint32_t bhsdo_target_transfer_tag; 283 uint32_t bhsdo_reserved2; 284 uint32_t bhsdo_expstatsn; 285 uint32_t bhsdo_reserved3; 286 uint32_t bhsdo_datasn; 287 uint32_t bhsdo_buffer_offset; 288 uint32_t bhsdo_reserved4; 289}; 290CTASSERT(sizeof(struct iscsi_bhs_data_out) == ISCSI_BHS_SIZE); 291 292#define BHSDI_FLAGS_F 0x80 293#define BHSDI_FLAGS_A 0x40 294#define BHSDI_FLAGS_O 0x04 295#define BHSDI_FLAGS_U 0x02 296#define BHSDI_FLAGS_S 0x01 297 298struct iscsi_bhs_data_in { 299 uint8_t bhsdi_opcode; 300 uint8_t bhsdi_flags; 301 uint8_t bhsdi_reserved; 302 uint8_t bhsdi_status; 303 uint8_t bhsdi_total_ahs_len; 304 uint8_t bhsdi_data_segment_len[3]; 305 uint64_t bhsdi_lun; 306 uint32_t bhsdi_initiator_task_tag; 307 uint32_t bhsdi_target_transfer_tag; 308 uint32_t bhsdi_statsn; 309 uint32_t bhsdi_expcmdsn; 310 uint32_t bhsdi_maxcmdsn; 311 uint32_t bhsdi_datasn; 312 uint32_t bhsdi_buffer_offset; 313 uint32_t bhsdi_residual_count; 314}; 315CTASSERT(sizeof(struct iscsi_bhs_data_in) == ISCSI_BHS_SIZE); 316 317struct iscsi_bhs_r2t { 318 uint8_t bhsr2t_opcode; 319 uint8_t bhsr2t_flags; 320 uint16_t bhsr2t_reserved; 321 uint8_t bhsr2t_total_ahs_len; 322 uint8_t bhsr2t_data_segment_len[3]; 323 uint64_t bhsr2t_lun; 324 uint32_t bhsr2t_initiator_task_tag; 325 uint32_t bhsr2t_target_transfer_tag; 326 uint32_t bhsr2t_statsn; 327 uint32_t bhsr2t_expcmdsn; 328 uint32_t bhsr2t_maxcmdsn; 329 uint32_t bhsr2t_r2tsn; 330 uint32_t bhsr2t_buffer_offset; 331 uint32_t bhsr2t_desired_data_transfer_length; 332}; 333CTASSERT(sizeof(struct iscsi_bhs_r2t) == ISCSI_BHS_SIZE); 334 335struct iscsi_bhs_nop_out { 336 uint8_t bhsno_opcode; 337 uint8_t bhsno_flags; 338 uint16_t bhsno_reserved; 339 uint8_t bhsno_total_ahs_len; 340 uint8_t bhsno_data_segment_len[3]; 341 uint64_t bhsno_lun; 342 uint32_t bhsno_initiator_task_tag; 343 uint32_t bhsno_target_transfer_tag; 344 uint32_t bhsno_cmdsn; 345 uint32_t bhsno_expstatsn; 346 uint8_t bhsno_reserved2[16]; 347}; 348CTASSERT(sizeof(struct iscsi_bhs_nop_out) == ISCSI_BHS_SIZE); 349 350struct iscsi_bhs_nop_in { 351 uint8_t bhsni_opcode; 352 uint8_t bhsni_flags; 353 uint16_t bhsni_reserved; 354 uint8_t bhsni_total_ahs_len; 355 uint8_t bhsni_data_segment_len[3]; 356 uint64_t bhsni_lun; 357 uint32_t bhsni_initiator_task_tag; 358 uint32_t bhsni_target_transfer_tag; 359 uint32_t bhsni_statsn; 360 uint32_t bhsni_expcmdsn; 361 uint32_t bhsni_maxcmdsn; 362 uint8_t bhsno_reserved2[12]; 363}; 364CTASSERT(sizeof(struct iscsi_bhs_nop_in) == ISCSI_BHS_SIZE); 365 366#define BHSLR_REASON_CLOSE_SESSION 0 367#define BHSLR_REASON_CLOSE_CONNECTION 1 368#define BHSLR_REASON_REMOVE_FOR_RECOVERY 2 369 370struct iscsi_bhs_logout_request { 371 uint8_t bhslr_opcode; 372 uint8_t bhslr_reason; 373 uint16_t bhslr_reserved; 374 uint8_t bhslr_total_ahs_len; 375 uint8_t bhslr_data_segment_len[3]; 376 uint64_t bhslr_reserved2; 377 uint32_t bhslr_initiator_task_tag; 378 uint16_t bhslr_cid; 379 uint16_t bhslr_reserved3; 380 uint32_t bhslr_cmdsn; 381 uint32_t bhslr_expstatsn; 382 uint8_t bhslr_reserved4[16]; 383}; 384CTASSERT(sizeof(struct iscsi_bhs_logout_request) == ISCSI_BHS_SIZE); 385 386#define BHSLR_RESPONSE_CLOSED_SUCCESSFULLY 0 387#define BHSLR_RESPONSE_RECOVERY_NOT_SUPPORTED 2 388 389struct iscsi_bhs_logout_response { 390 uint8_t bhslr_opcode; 391 uint8_t bhslr_flags; 392 uint8_t bhslr_response; 393 uint8_t bhslr_reserved; 394 uint8_t bhslr_total_ahs_len; 395 uint8_t bhslr_data_segment_len[3]; 396 uint64_t bhslr_reserved2; 397 uint32_t bhslr_initiator_task_tag; 398 uint32_t bhslr_reserved3; 399 uint32_t bhslr_statsn; 400 uint32_t bhslr_expcmdsn; 401 uint32_t bhslr_maxcmdsn; 402 uint32_t bhslr_reserved4; 403 uint16_t bhslr_time2wait; 404 uint16_t bhslr_time2retain; 405 uint32_t bhslr_reserved5; 406}; 407CTASSERT(sizeof(struct iscsi_bhs_logout_response) == ISCSI_BHS_SIZE); 408 409#define BHSAM_EVENT_TARGET_REQUESTS_LOGOUT 1 410#define BHSAM_EVENT_TARGET_TERMINATES_CONNECTION 2 411#define BHSAM_EVENT_TARGET_TERMINATES_SESSION 3 412 413struct iscsi_bhs_asynchronous_message { 414 uint8_t bhsam_opcode; 415 uint8_t bhsam_flags; 416 uint16_t bhsam_reserved; 417 uint8_t bhsam_total_ahs_len; 418 uint8_t bhsam_data_segment_len[3]; 419 uint64_t bhsam_lun; 420 uint32_t bhsam_0xffffffff; 421 uint32_t bhsam_reserved2; 422 uint32_t bhsam_statsn; 423 uint32_t bhsam_expcmdsn; 424 uint32_t bhsam_maxcmdsn; 425 uint8_t bhsam_async_event; 426 uint8_t bhsam_async_vcode; 427 uint16_t bhsam_parameter1; 428 uint16_t bhsam_parameter2; 429 uint16_t bhsam_parameter3; 430 uint32_t bhsam_reserved3; 431}; 432CTASSERT(sizeof(struct iscsi_bhs_asynchronous_message) == ISCSI_BHS_SIZE); 433 434#define BHSSR_REASON_DATA_DIGEST_ERROR 0x02 435#define BHSSR_PROTOCOL_ERROR 0x04 436#define BHSSR_COMMAND_NOT_SUPPORTED 0x05 437#define BHSSR_INVALID_PDU_FIELD 0x09 438 439struct iscsi_bhs_reject { 440 uint8_t bhsr_opcode; 441 uint8_t bhsr_flags; 442 uint8_t bhsr_reason; 443 uint8_t bhsr_reserved; 444 uint8_t bhsr_total_ahs_len; 445 uint8_t bhsr_data_segment_len[3]; 446 uint64_t bhsr_reserved2; 447 uint32_t bhsr_0xffffffff; 448 uint32_t bhsr_reserved3; 449 uint32_t bhsr_statsn; 450 uint32_t bhsr_expcmdsn; 451 uint32_t bhsr_maxcmdsn; 452 uint32_t bhsr_datasn_r2tsn; 453 uint32_t bhsr_reserved4; 454 uint32_t bhsr_reserved5; 455}; 456CTASSERT(sizeof(struct iscsi_bhs_reject) == ISCSI_BHS_SIZE); 457 458#endif /* !ISCSI_PROTO_H */ 459