1 /*- 2 * Copyright (c) 2005-2008 Daniel Braniss <danny@cs.huji.ac.il> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 * 26 * $FreeBSD: src/sys/dev/iscsi/initiator/iscsi.h,v 1.2 2008/11/25 07:17:11 scottl Exp $ 27 */ 28 /* 29 | $Id: iscsi.h,v 1.17 2006/12/01 09:10:17 danny Exp danny $ 30 */ 31 #define TRUE 1 32 #define FALSE 0 33 #ifndef _KERNEL 34 typedef int boolean_t; 35 #endif 36 37 #include <sys/objcache.h> 38 #include <bus/cam/cam.h> 39 #include <sys/device.h> 40 #include <sys/bootmaj.h> 41 42 #define ISCSIDEV "iscsi" 43 44 #define ISCSI_CDEV_MAJOR 115 45 46 #define ISCSI_MAX_TARGETS 4 //64 47 48 #define ISCSI_MAX_LUNS 4 49 50 /* 51 | iSCSI commands 52 */ 53 54 /* 55 | Initiator Opcodes: 56 */ 57 #define ISCSI_NOP_OUT 0x00 58 #define ISCSI_SCSI_CMD 0x01 59 #define ISCSI_TASK_CMD 0x02 60 #define ISCSI_LOGIN_CMD 0x03 61 #define ISCSI_TEXT_CMD 0x04 62 #define ISCSI_WRITE_DATA 0x05 63 #define ISCSI_LOGOUT_CMD 0x06 64 #define ISCSI_SNACK 0x10 65 /* 66 | Target Opcodes: 67 */ 68 #define ISCSI_NOP_IN 0x20 69 #define ISCSI_SCSI_RSP 0x21 70 #define ISCSI_TASK_RSP 0x22 71 #define ISCSI_LOGIN_RSP 0x23 72 #define ISCSI_TEXT_RSP 0x24 73 #define ISCSI_READ_DATA 0x25 74 #define ISCSI_LOGOUT_RSP 0x26 75 #define ISCSI_R2T 0x31 76 #define ISCSI_ASYNC 0x32 77 #define ISCSI_REJECT 0x3f 78 /* 79 | PDU stuff 80 */ 81 /* 82 | BHS Basic Header Segment 83 */ 84 typedef struct bhs { 85 // the order is network byte order! 86 u_char opcode:6; 87 u_char I:1; 88 u_char _:1; 89 u_char __:7; 90 u_char F:1; // Final bit 91 u_char ___[2]; 92 93 u_int AHSLength:8; // in 4byte words 94 u_int DSLength:24; // in bytes 95 96 u_int LUN[2]; // or Opcode-specific fields 97 u_int itt; 98 u_int OpcodeSpecificFields[7]; 99 #define CmdSN OpcodeSpecificFields[1] 100 #define ExpStSN OpcodeSpecificFields[2] 101 #define MaxCmdSN OpcodeSpecificFields[3] 102 } bhs_t; 103 104 typedef struct ahs { 105 u_int len:16; 106 u_int type:8; 107 u_int spec:8; 108 char data[0]; 109 } ahs_t; 110 111 typedef struct { 112 // Sequence Numbers 113 // (computers were invented to count, right?) 114 int cmd; 115 int expcmd; 116 int maxcmd; 117 } req_sn_t; 118 119 typedef struct { 120 // Sequence Numbers 121 // (computers were invented to count, right?) 122 int stat; 123 int expcmd; 124 int maxcmd; 125 } rsp_sn_t; 126 127 typedef struct scsi_req { 128 u_char opcode:6; // 0x01 129 u_char I:1; 130 u_char _:1; 131 132 u_char attr:3; 133 u_char _0:2; 134 u_char W:1; 135 u_char R:1; 136 u_char F:1; 137 #define iSCSI_TASK_UNTAGGED 0 138 #define iSCSI_TASK_SIMPLE 1 139 #define iSCSI_TASK_ORDER 2 140 #define iSCSI_TASK_HOFQ 3 141 #define iSCSI_TASK_ACA 4 142 char _1[2]; 143 int len; 144 int lun[2]; 145 int itt; 146 int edtlen; // expectect data transfere length 147 int cmdSN; 148 int extStatSN; 149 int cdb[4]; 150 } scsi_req_t; 151 152 typedef struct scsi_rsp { 153 char opcode; // 0x21 154 u_char flag; 155 u_char response; 156 u_char status; 157 158 int len; 159 int _[2]; 160 int itt; 161 int stag; 162 rsp_sn_t sn; 163 int expdatasn; 164 int bdrcnt; // bidirectional residual count 165 int rcnt; // residual count 166 } scsi_rsp_t; 167 168 typedef struct nop_out { 169 // the order is network byte order! 170 u_char opcode:6; 171 u_char I:1; 172 u_char _:1; 173 u_char __:7; 174 u_char F:1; // Final bit 175 u_char ___[2]; 176 177 u_int len; 178 u_int lun[2]; 179 u_int itt; 180 u_int ttt; 181 req_sn_t sn; 182 u_int mbz[3]; 183 } nop_out_t; 184 185 typedef struct nop_in { 186 // the order is network byte order! 187 u_char opcode:6; 188 u_char I:1; 189 u_char _:1; 190 u_char __:7; 191 u_char F:1; // Final bit 192 u_char ___[2]; 193 194 u_int len; 195 u_int lun[2]; 196 u_int itt; 197 u_int ttt; 198 rsp_sn_t sn; 199 u_int ____[2]; 200 201 } nop_in_t; 202 203 typedef struct r2t { 204 u_char opcode:6; 205 u_char I:1; 206 u_char _:1; 207 u_char __:7; 208 u_char F:1; // Final bit 209 u_char ___[2]; 210 211 u_int len; 212 u_int lun[2]; 213 u_int itt; 214 u_int ttt; 215 rsp_sn_t sn; 216 u_int r2tSN; 217 u_int bo; 218 u_int ddtl; 219 } r2t_t; 220 221 typedef struct data_out { 222 u_char opcode:6; 223 u_char I:1; 224 u_char _:1; 225 u_char __:7; 226 u_char F:1; // Final bit 227 u_char ___[2]; 228 229 u_int len; 230 u_int lun[2]; 231 u_int itt; 232 u_int ttt; 233 rsp_sn_t sn; 234 u_int dsn; // data seq. number 235 u_int bo; 236 u_int ____; 237 } data_out_t; 238 239 typedef struct data_in { 240 u_char opcode:6; 241 u_char I:1; 242 u_char _:1; 243 244 u_char S:1; 245 u_char U:1; 246 u_char O:1; 247 u_char __:3; 248 u_char A:1; 249 u_char F:1; // Final bit 250 u_char ___[1]; 251 u_char status; 252 253 u_int len; 254 u_int lun[2]; 255 u_int itt; 256 u_int ttt; 257 rsp_sn_t sn; 258 u_int dataSN; 259 u_int bo; 260 u_int ____; 261 } data_in_t; 262 263 typedef struct reject { 264 u_char opcode:6; 265 u_char _:2; 266 u_char F:1; 267 u_char __:7; 268 u_char reason; 269 u_char ___; 270 271 u_int len; 272 u_int ____[2]; 273 u_int tt[2]; // must be -1 274 rsp_sn_t sn; 275 u_int dataSN; // or R2TSN or reserved 276 u_int _____[2]; 277 } reject_t; 278 279 typedef struct async { 280 u_char opcode:6; 281 u_char _:2; 282 u_char F:1; 283 u_char __:7; 284 u_char ___[2]; 285 286 u_int len; 287 u_int lun[2]; 288 u_int itt; // must be -1 289 u_int ____; 290 rsp_sn_t sn; 291 292 u_char asyncEvent; 293 u_char asyncVCode; 294 u_char param1[2]; 295 u_char param2[2]; 296 u_char param3[2]; 297 298 u_int _____; 299 300 } async_t; 301 302 typedef struct login_req { 303 char cmd; // 0x03 304 305 u_char NSG:2; 306 u_char CSG:2; 307 u_char _:2; 308 u_char C:1; 309 u_char T:1; 310 311 char v_max; 312 char v_min; 313 314 int len; // remapped via standard bhs 315 char isid[6]; 316 short tsih; 317 int itt; // Initiator Task Tag; 318 319 int CID:16; 320 int rsv:16; 321 322 int cmdSN; 323 int expStatSN; 324 int unused[4]; 325 } login_req_t; 326 327 typedef struct login_rsp { 328 char cmd; // 0x23 329 u_char NSG:2; 330 u_char CSG:2; 331 u_char _1:2; 332 u_char C:1; 333 u_char T:1; 334 335 char v_max; 336 char v_act; 337 338 int len; // remapped via standard bhs 339 char isid[6]; 340 short tsih; 341 int itt; // Initiator Task Tag; 342 int _2; 343 rsp_sn_t sn; 344 int status:16; 345 int _3:16; 346 int _4[2]; 347 } login_rsp_t; 348 349 typedef struct text_req { 350 char cmd; // 0x04 351 352 u_char _1:6; 353 u_char C:1; // Continuation 354 u_char F:1; // Final 355 char _2[2]; 356 357 int len; 358 int itt; // Initiator Task Tag 359 int LUN[2]; 360 int ttt; // Target Transfer Tag 361 int cmdSN; 362 int expStatSN; 363 int unused[4]; 364 } text_req_t; 365 366 typedef struct logout_req { 367 char cmd; // 0x06 368 char reason; // 0 - close session 369 // 1 - close connection 370 // 2 - remove the connection for recovery 371 char _2[2]; 372 373 int len; 374 int _r[2]; 375 int itt; // Initiator Task Tag; 376 377 u_int CID:16; 378 u_int rsv:16; 379 380 int cmdSN; 381 int expStatSN; 382 int unused[4]; 383 } logout_req_t; 384 385 typedef struct logout_rsp { 386 char cmd; // 0x26 387 char cbits; 388 char _1[2]; 389 int len; 390 int _2[2]; 391 int itt; 392 int _3; 393 rsp_sn_t sn; 394 short time2wait; 395 short time2retain; 396 int _4; 397 } logout_rsp_t; 398 399 union ipdu_u { 400 bhs_t bhs; 401 scsi_req_t scsi_req; 402 scsi_rsp_t scsi_rsp; 403 nop_out_t nop_out; 404 nop_in_t nop_in; 405 r2t_t r2t; 406 data_out_t data_out; 407 data_in_t data_in; 408 reject_t reject; 409 async_t async; 410 }; 411 412 /* 413 | Sequence Numbers 414 */ 415 typedef struct { 416 u_int itt; 417 u_int cmd; 418 u_int expCmd; 419 u_int maxCmd; 420 u_int stat; 421 u_int expStat; 422 u_int data; 423 } sn_t; 424 425 /* 426 | in-core version of a Protocol Data Unit 427 */ 428 typedef struct { 429 union ipdu_u ipdu; 430 431 ahs_t *ahs; 432 u_int ahs_len; 433 u_int ahs_size; // the allocated size 434 u_int hdr_dig; // header digest 435 436 u_char *ds; 437 u_int ds_len; 438 u_int ds_size; // the allocated size 439 u_int ds_dig; // data digest 440 } pdu_t; 441 442 typedef struct opvals { 443 int port; 444 int tags; 445 int maxluns; 446 int sockbufsize; 447 448 int maxConnections; 449 int maxRecvDataSegmentLength; 450 int maxXmitDataSegmentLength; // pseudo ... 451 int maxBurstLength; 452 int firstBurstLength; 453 int defaultTime2Wait; 454 int defaultTime2Retain; 455 int maxOutstandingR2T; 456 int errorRecoveryLevel; 457 int targetPortalGroupTag; 458 459 boolean_t initialR2T; 460 boolean_t immediateData; 461 boolean_t dataPDUInOrder; 462 boolean_t dataSequenceInOrder; 463 char *headerDigest; 464 char *dataDigest; 465 char *sessionType; 466 char *sendTargets; 467 char *targetAddress; 468 char *targetAlias; 469 char *targetName; 470 char *initiatorName; 471 char *initiatorAlias; 472 char *authMethod; 473 char *chapSecret; 474 char *chapIName; 475 char *chapDigest; 476 char *tgtChapName; 477 char *tgtChapSecret; 478 int tgtChallengeLen; 479 u_char tgtChapID; 480 char *tgtChapDigest; 481 char *iqn; 482 } isc_opt_t; 483 484 /* 485 | ioctl 486 */ 487 #define ISCSISETSES _IOR('i', 1, int) 488 #define ISCSISETSOC _IOW('i', 2, int) 489 #define ISCSISETOPT _IOW('i', 5, isc_opt_t) 490 #define ISCSIGETOPT _IOR('i', 6, isc_opt_t) 491 492 #define ISCSISEND _IOW('i', 10, pdu_t) 493 #define ISCSIRECV _IOWR('i', 11, pdu_t) 494 495 #define ISCSIPING _IO('i', 20) 496 #define ISCSISIGNAL _IOW('i', 21, int *) 497 498 #define ISCSISTART _IO('i', 30) 499 #define ISCSIRESTART _IO('i', 31) 500 #define ISCSISTOP _IO('i', 32) 501 502 typedef struct iscsi_cam { 503 path_id_t path_id; 504 target_id_t target_id; 505 int target_nluns; 506 lun_id_t target_lun[ISCSI_MAX_LUNS]; 507 } iscsi_cam_t; 508 509 #define ISCSIGETCAM _IOR('i', 33, iscsi_cam_t) 510