1 /* $OpenBSD: iscsi.h,v 1.6 2009/08/27 14:12:27 claudio Exp $ */ 2 3 /* 4 * Copyright (c) 2008 David Gwynne <dlg@openbsd.org> 5 * 6 * Permission to use, copy, modify, and distribute this software for any 7 * purpose with or without fee is hereby granted, provided that the above 8 * copyright notice and this permission notice appear in all copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17 */ 18 19 #ifndef _SYS_SCSI_ISCSI_H 20 #define _SYS_SCSI_ISCSI_H 21 22 struct iscsi_pdu { 23 u_int8_t opcode; 24 u_int8_t flags; 25 u_int8_t _reserved1[2]; 26 27 u_int8_t ahslen; 28 u_int8_t datalen[3]; 29 30 u_int8_t lun[8]; 31 32 u_int32_t itt; 33 34 u_int8_t _reserved2[4]; 35 36 u_int32_t cmdsn; 37 38 u_int32_t expstatsn; 39 40 u_int8_t _reserved3[16]; 41 } __packed; 42 43 /* 44 * Initiator opcodes 45 */ 46 47 #define ISCSI_OP_I_NOP 0x00 48 #define ISCSI_OP_SCSI_REQUEST 0x01 49 #define ISCSI_OP_TASK_REQUEST 0x02 50 #define ISCSI_OP_LOGIN_REQUEST 0x03 51 #define ISCSI_OP_TEXT_REQUEST 0x04 52 #define ISCSI_OP_DATA_OUT 0x05 53 #define ISCSI_OP_LOGOUT_REQUEST 0x06 54 #define ISCSI_OP_SNACK_REQUEST 0x10 55 56 /* 57 * Target opcodes 58 */ 59 60 #define ISCSI_OP_T_NOP 0x20 61 #define ISCSI_OP_SCSI_RESPONSE 0x21 62 #define ISCSI_OP_TASK_RESPONSE 0x22 63 #define ISCSI_OP_LOGIN_RESPONSE 0x23 64 #define ISCSI_OP_TEXT_RESPONSE 0x24 65 #define ISCSI_OP_DATA_IN 0x25 66 #define ISCSI_OP_LOGOUT_RESPONSE 0x26 67 #define ISCSI_OP_R2T 0x31 68 #define ISCSI_OP_ASYNC 0x32 69 #define ISCSI_OP_REJECT 0x3f 70 71 #define ISCSI_PDU_OPCODE(_o) ((_o) & 0x3f) 72 #define ISCSI_PDU_I(_h) ((_h)->opcode & 0x40) 73 #define ISCSI_PDU_F(_h) ((_h)->flags & 0x80) 74 75 #define ISCSI_OP_F_IMMEDIATE 0x40 76 77 /* 78 * various other flags and values 79 */ 80 #define ISCSI_ISID_OUI 0x00000000 81 #define ISCSI_ISID_EN 0x40000000 82 #define ISCSI_ISID_RAND 0x80000000 83 84 struct iscsi_pdu_scsi_request { 85 u_int8_t opcode; 86 u_int8_t flags; 87 u_int8_t _reserved[2]; 88 89 u_int8_t ahslen; 90 u_int8_t datalen[3]; 91 92 u_int8_t lun[8]; 93 94 u_int32_t itt; 95 96 u_int32_t bytes; 97 98 u_int32_t cmdsn; 99 100 u_int32_t expstatsn; 101 102 u_int8_t cdb[16]; 103 } __packed; 104 105 struct iscsi_pdu_scsi_response { 106 u_int8_t opcode; 107 u_int8_t flags; 108 u_int8_t response; 109 u_int8_t status; 110 111 u_int8_t ahslen; 112 u_int8_t datalen[3]; 113 114 u_int8_t _reserved[8]; 115 116 u_int32_t itt; 117 118 u_int32_t snack; 119 120 u_int32_t statsn; 121 122 u_int32_t expcmdsn; 123 124 u_int32_t maxcmdsn; 125 126 u_int32_t expdatasn; 127 } __packed; 128 129 #define ISCSI_SCSI_F_F 0x80 130 #define ISCSI_SCSI_F_R 0x40 131 #define ISCSI_SCSI_F_W 0x20 132 133 #define ISCSI_SCSI_ATTR_UNTAGGED 0 134 #define ISCSI_SCSI_ATTR_SIMPLE 1 135 #define ISCSI_SCSI_ATTR_ORDERED 2 136 #define ISCSI_SCSI_ATTR_HEAD_OF_Q 3 137 #define ISCSI_SCSI_ATTR_ACA 4 138 139 #define ISCSI_SCSI_STAT_GOOD 0x00 140 #define ISCSI_SCSI_STAT_CHCK_COND 0x02 141 /* we don't care about the type of the other error conditions */ 142 143 struct iscsi_pdu_task_request { 144 u_int8_t opcode; 145 u_int8_t flags; 146 u_int8_t reserved[2]; 147 148 u_int8_t ahslen; 149 u_int8_t datalen[3]; 150 151 u_int8_t lun[8]; 152 153 u_int32_t itt; 154 155 u_int32_t tag; 156 157 u_int32_t cmdsn; 158 159 u_int32_t expstatsn; 160 161 u_int32_t refcmdsn; 162 163 u_int32_t expdatasn; 164 165 u_int8_t _reserved[8]; 166 } __packed; 167 168 struct iscsi_pdu_task_response { 169 u_int8_t opcode; 170 u_int8_t flags; 171 u_int8_t response; 172 u_int8_t _reserved1; 173 174 u_int8_t ahslen; 175 u_int8_t datalen[3]; 176 177 u_int8_t _reserved2[4]; 178 179 u_int32_t statsn; 180 181 u_int32_t expcmdsn; 182 183 u_int32_t maxcmdsn; 184 185 u_int8_t _reserved3[12]; 186 } __packed; 187 188 struct iscsi_pdu_data_out { 189 u_int8_t opcode; 190 u_int8_t flags; 191 u_int8_t _reserved1[2]; 192 193 u_int8_t ahslen; 194 u_int8_t datalen[3]; 195 196 u_int8_t lun[8]; 197 198 u_int32_t itt; 199 200 u_int32_t ttt; 201 202 u_int8_t _reserved2[4]; 203 204 u_int32_t expstatsn; 205 206 u_int8_t _reserved3[4]; 207 208 u_int32_t datasn; 209 210 u_int32_t buffer_offs; 211 212 u_int8_t _reserved4[4]; 213 } __packed; 214 215 struct iscsi_pdu_data_in { 216 u_int8_t opcode; 217 u_int8_t flags; 218 u_int8_t _reserved; 219 u_int8_t status; 220 221 u_int8_t ahslen; 222 u_int8_t datalen[3]; 223 224 u_int8_t lun[8]; 225 226 u_int32_t itt; 227 228 u_int32_t ttt; 229 230 u_int32_t statsn; 231 232 u_int32_t expcmdsn; 233 234 u_int32_t maxcmdsn; 235 236 u_int32_t datasn; 237 238 u_int32_t buffer_offs; 239 240 u_int32_t residual; 241 } __packed; 242 243 struct iscsi_pdu_rt2 { 244 u_int8_t opcode; 245 u_int8_t flags; 246 u_int8_t _reserved1[2]; 247 248 u_int8_t ahslen; 249 u_int8_t datalen[3]; 250 251 u_int8_t lun[8]; 252 253 u_int32_t itt; 254 255 u_int32_t ttt; 256 257 u_int32_t statsn; 258 259 u_int32_t expcmdsn; 260 261 u_int32_t maxcmdsn; 262 263 u_int32_t r2tsn; 264 265 u_int32_t buffer_offs; 266 267 u_int32_t desired_datalen; 268 } __packed; 269 270 struct iscsi_pdu_async { 271 u_int8_t opcode; 272 u_int8_t flags; 273 u_int8_t _reserved1[2]; 274 275 u_int8_t ahslen; 276 u_int8_t datalen[3]; 277 278 u_int8_t lun[8]; 279 280 u_int32_t ffffffff; 281 282 u_int8_t _reserved2[4]; 283 284 u_int32_t statsn; 285 286 u_int32_t expstatsn; 287 288 u_int32_t maxstatsn; 289 290 u_int8_t event; 291 u_int8_t vcode; 292 u_int32_t param[3]; 293 294 u_int8_t _reserved3[4]; 295 } __packed; 296 297 struct iscsi_pdu_text_request { 298 u_int8_t opcode; 299 u_int8_t flags; 300 u_int8_t _reserved1[2]; 301 302 u_int8_t ahslen; 303 u_int8_t datalen[3]; 304 305 u_int8_t lun[8]; 306 307 u_int32_t itt; 308 309 u_int32_t ttt; 310 311 u_int32_t cmdsn; 312 313 u_int32_t expstatsn; 314 315 u_int8_t _reserved2[16]; 316 } __packed; 317 318 struct iscsi_pdu_text_response { 319 u_int8_t opcode; 320 u_int8_t flags; 321 u_int8_t _reserved1[2]; 322 323 u_int8_t ahslen; 324 u_int8_t datalen[3]; 325 326 u_int8_t lun[8]; 327 328 u_int32_t itt; 329 330 u_int32_t ttt; 331 332 u_int32_t cmdsn; 333 334 u_int32_t expcmdsn; 335 336 u_int32_t maxcmdsn; 337 338 u_int8_t _reserved2[12]; 339 } __packed; 340 341 #define ISCSI_TEXT_F_F 0x80 342 #define ISCSI_TEXT_F_C 0x40 343 344 struct iscsi_pdu_login_request { 345 u_int8_t opcode; 346 u_int8_t flags; 347 u_int8_t version_max; 348 u_int8_t version_min; 349 350 u_int8_t ahslen; 351 u_int8_t datalen[3]; 352 353 u_int32_t isid_base; 354 u_int16_t isid_qual; 355 u_int16_t tsih; 356 357 u_int32_t itt; 358 359 u_int16_t cid; 360 u_int8_t _reserved1[2]; 361 362 u_int32_t cmdsn; 363 364 u_int32_t expstatsn; 365 366 u_int8_t _reserved2[16]; 367 } __packed; 368 369 #define ISCSI_LOGIN_F_T 0x80 370 #define ISCSI_LOGIN_F_C 0x40 371 #define ISCSI_LOGIN_F_CSG(x) (((x) & 0x3) << 2) 372 #define ISCSI_LOGIN_F_NSG(x) ((x) & 0x3) 373 #define ISCSI_LOGIN_STG_SECNEG 0 374 #define ISCSI_LOGIN_STG_OPNEG 1 375 #define ISCSI_LOGIN_STG_FULL 3 376 377 struct iscsi_pdu_login_response { 378 u_int8_t opcode; 379 u_int8_t flags; 380 u_int8_t version_max; 381 u_int8_t version_active; 382 383 u_int8_t ahslen; 384 u_int8_t datalen[3]; 385 386 u_int32_t isid_base; 387 u_int16_t isid_qual; 388 u_int16_t tsih; 389 390 u_int32_t itt; 391 392 u_int8_t _reserved1[4]; 393 394 u_int32_t statsn; 395 396 u_int32_t expcmdsn; 397 398 u_int32_t maxcmdsn; 399 400 u_int8_t status_class; 401 u_int8_t status_detail; 402 403 u_int8_t _reserved2[10]; 404 } __packed; 405 406 struct iscsi_pdu_logout_request { 407 u_int8_t opcode; 408 u_int8_t flags; 409 u_int8_t _reserved1[2]; 410 411 u_int8_t ahslen; 412 u_int8_t datalen[3]; 413 414 u_int8_t _reserved2[8]; 415 416 u_int32_t itt; 417 418 u_int16_t cid; 419 u_int8_t _reserved3[2]; 420 421 u_int32_t cmdsn; 422 423 u_int32_t expstatsn; 424 425 u_int8_t _reserved4[16]; 426 } __packed; 427 428 struct iscsi_pdu_logout_response { 429 u_int8_t opcode; 430 u_int8_t flags; 431 u_int8_t _reserved1[2]; 432 433 u_int8_t ahslen; 434 u_int8_t datalen[3]; 435 436 u_int8_t _reserved2[8]; 437 438 u_int32_t itt; 439 440 u_int8_t _reserved3[4]; 441 442 u_int32_t statsn; 443 444 u_int32_t expcmdsn; 445 446 u_int32_t maxcmdsn; 447 448 u_int8_t _reserved4[4]; 449 450 u_int16_t time2wait; 451 u_int16_t time2retain; 452 453 u_int8_t _reserved5[4]; 454 } __packed; 455 456 struct iscsi_pdu_snack_request { 457 u_int8_t opcode; 458 u_int8_t flags; 459 u_int8_t _reserved1[2]; 460 461 u_int8_t ahslen; 462 u_int8_t datalen[3]; 463 464 u_int8_t lun[8]; 465 466 u_int32_t itt; 467 468 u_int32_t ttt; 469 470 u_int8_t _reserved2[4]; 471 472 u_int32_t expstatsn; 473 474 u_int8_t _reserved3[8]; 475 476 u_int32_t begrun; 477 478 u_int32_t runlength; 479 } __packed; 480 481 struct iscsi_pdu_reject { 482 u_int8_t opcode; 483 u_int8_t flags; 484 u_int8_t reason; 485 u_int8_t _reserved1; 486 487 u_int8_t ahslen; 488 u_int8_t datalen[3]; 489 490 u_int8_t _reserved2[8]; 491 492 u_int32_t ffffffff; 493 494 u_int8_t _reserved3[4]; 495 496 u_int32_t statsn; 497 498 u_int32_t expcmdsn; 499 500 u_int32_t maxcmdsn; 501 502 u_int32_t datasn_r2tsn; 503 504 u_int8_t _reserved4[8]; 505 } __packed; 506 507 struct iscsi_pdu_nop_out { 508 u_int8_t opcode; 509 u_int8_t flags; 510 u_int8_t _reserved1[2]; 511 512 u_int8_t ahslen; 513 u_int8_t datalen[3]; 514 515 u_int8_t lun[8]; 516 517 u_int32_t itt; 518 519 u_int32_t ttt; 520 521 u_int32_t cmdsn; 522 523 u_int32_t expstatsn; 524 525 u_int8_t _reserved2[16]; 526 } __packed; 527 528 struct iscsi_pdu_nop_in { 529 u_int8_t opcode; 530 u_int8_t flags; 531 u_int8_t _reserved1[2]; 532 533 u_int8_t ahslen; 534 u_int8_t datalen[3]; 535 536 u_int8_t lun[8]; 537 538 u_int32_t itt; 539 540 u_int32_t ttt; 541 542 u_int32_t statsn; 543 544 u_int32_t expcmdsn; 545 546 u_int32_t maxcmdsn; 547 548 u_int8_t _reserved2[12]; 549 } __packed; 550 551 #endif /* _SYS_SCSI_ISCSI_H */ 552