iscsi_proto.h 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657
  1. /* SPDX-License-Identifier: GPL-2.0-or-later */
  2. /*
  3. * RFC 3720 (iSCSI) protocol data types
  4. *
  5. * Copyright (C) 2005 Dmitry Yusupov
  6. * Copyright (C) 2005 Alex Aizman
  7. * maintained by open-iscsi@googlegroups.com
  8. */
  9. #ifndef ISCSI_PROTO_H
  10. #define ISCSI_PROTO_H
  11. #include <linux/types.h>
  12. #include <scsi/scsi.h>
  13. #define ISCSI_DRAFT20_VERSION 0x00
  14. /* default iSCSI listen port for incoming connections */
  15. #define ISCSI_LISTEN_PORT 3260
  16. /* iSCSI header length */
  17. #define ISCSI_HDR_LEN 48
  18. /* iSCSI CRC32C length */
  19. #define ISCSI_CRC_LEN 4
  20. /* Padding word length */
  21. #define ISCSI_PAD_LEN 4
  22. /*
  23. * Serial Number Arithmetic, 32 bits, RFC1982
  24. */
  25. static inline int iscsi_sna_lt(u32 n1, u32 n2)
  26. {
  27. return (s32)(n1 - n2) < 0;
  28. }
  29. static inline int iscsi_sna_lte(u32 n1, u32 n2)
  30. {
  31. return (s32)(n1 - n2) <= 0;
  32. }
  33. static inline int iscsi_sna_gt(u32 n1, u32 n2)
  34. {
  35. return (s32)(n1 - n2) > 0;
  36. }
  37. static inline int iscsi_sna_gte(u32 n1, u32 n2)
  38. {
  39. return (s32)(n1 - n2) >= 0;
  40. }
  41. /*
  42. * useful common(control and data pathes) macro
  43. */
  44. #define ntoh24(p) (((p)[0] << 16) | ((p)[1] << 8) | ((p)[2]))
  45. #define hton24(p, v) { \
  46. p[0] = (((v) >> 16) & 0xFF); \
  47. p[1] = (((v) >> 8) & 0xFF); \
  48. p[2] = ((v) & 0xFF); \
  49. }
  50. #define zero_data(p) {p[0]=0;p[1]=0;p[2]=0;}
  51. /* initiator tags; opaque for target */
  52. typedef uint32_t __bitwise itt_t;
  53. /* below makes sense only for initiator that created this tag */
  54. #define build_itt(itt, age) ((__force itt_t)\
  55. ((itt) | ((age) << ISCSI_AGE_SHIFT)))
  56. #define get_itt(itt) ((__force uint32_t)(itt_t)(itt) & ISCSI_ITT_MASK)
  57. #define RESERVED_ITT ((__force itt_t)0xffffffff)
  58. /*
  59. * iSCSI Template Message Header
  60. */
  61. struct iscsi_hdr {
  62. uint8_t opcode;
  63. uint8_t flags; /* Final bit */
  64. uint8_t rsvd2[2];
  65. uint8_t hlength; /* AHSs total length */
  66. uint8_t dlength[3]; /* Data length */
  67. struct scsi_lun lun;
  68. itt_t itt; /* Initiator Task Tag, opaque for target */
  69. __be32 ttt; /* Target Task Tag */
  70. __be32 statsn;
  71. __be32 exp_statsn;
  72. __be32 max_statsn;
  73. uint8_t other[12];
  74. };
  75. /************************* RFC 3720 Begin *****************************/
  76. #define ISCSI_RESERVED_TAG 0xffffffff
  77. /* Opcode encoding bits */
  78. #define ISCSI_OP_RETRY 0x80
  79. #define ISCSI_OP_IMMEDIATE 0x40
  80. #define ISCSI_OPCODE_MASK 0x3F
  81. /* Initiator Opcode values */
  82. #define ISCSI_OP_NOOP_OUT 0x00
  83. #define ISCSI_OP_SCSI_CMD 0x01
  84. #define ISCSI_OP_SCSI_TMFUNC 0x02
  85. #define ISCSI_OP_LOGIN 0x03
  86. #define ISCSI_OP_TEXT 0x04
  87. #define ISCSI_OP_SCSI_DATA_OUT 0x05
  88. #define ISCSI_OP_LOGOUT 0x06
  89. #define ISCSI_OP_SNACK 0x10
  90. #define ISCSI_OP_VENDOR1_CMD 0x1c
  91. #define ISCSI_OP_VENDOR2_CMD 0x1d
  92. #define ISCSI_OP_VENDOR3_CMD 0x1e
  93. #define ISCSI_OP_VENDOR4_CMD 0x1f
  94. /* Target Opcode values */
  95. #define ISCSI_OP_NOOP_IN 0x20
  96. #define ISCSI_OP_SCSI_CMD_RSP 0x21
  97. #define ISCSI_OP_SCSI_TMFUNC_RSP 0x22
  98. #define ISCSI_OP_LOGIN_RSP 0x23
  99. #define ISCSI_OP_TEXT_RSP 0x24
  100. #define ISCSI_OP_SCSI_DATA_IN 0x25
  101. #define ISCSI_OP_LOGOUT_RSP 0x26
  102. #define ISCSI_OP_R2T 0x31
  103. #define ISCSI_OP_ASYNC_EVENT 0x32
  104. #define ISCSI_OP_REJECT 0x3f
  105. struct iscsi_ahs_hdr {
  106. __be16 ahslength;
  107. uint8_t ahstype;
  108. uint8_t ahspec[5];
  109. };
  110. #define ISCSI_AHSTYPE_CDB 1
  111. #define ISCSI_AHSTYPE_RLENGTH 2
  112. #define ISCSI_CDB_SIZE 16
  113. /* iSCSI PDU Header */
  114. struct iscsi_scsi_req {
  115. uint8_t opcode;
  116. uint8_t flags;
  117. __be16 rsvd2;
  118. uint8_t hlength;
  119. uint8_t dlength[3];
  120. struct scsi_lun lun;
  121. itt_t itt; /* Initiator Task Tag */
  122. __be32 data_length;
  123. __be32 cmdsn;
  124. __be32 exp_statsn;
  125. uint8_t cdb[ISCSI_CDB_SIZE]; /* SCSI Command Block */
  126. /* Additional Data (Command Dependent) */
  127. };
  128. /* Command PDU flags */
  129. #define ISCSI_FLAG_CMD_FINAL 0x80
  130. #define ISCSI_FLAG_CMD_READ 0x40
  131. #define ISCSI_FLAG_CMD_WRITE 0x20
  132. #define ISCSI_FLAG_CMD_ATTR_MASK 0x07 /* 3 bits */
  133. /* SCSI Command Attribute values */
  134. #define ISCSI_ATTR_UNTAGGED 0
  135. #define ISCSI_ATTR_SIMPLE 1
  136. #define ISCSI_ATTR_ORDERED 2
  137. #define ISCSI_ATTR_HEAD_OF_QUEUE 3
  138. #define ISCSI_ATTR_ACA 4
  139. struct iscsi_rlength_ahdr {
  140. __be16 ahslength;
  141. uint8_t ahstype;
  142. uint8_t reserved;
  143. __be32 read_length;
  144. };
  145. /* Extended CDB AHS */
  146. struct iscsi_ecdb_ahdr {
  147. __be16 ahslength; /* CDB length - 15, including reserved byte */
  148. uint8_t ahstype;
  149. uint8_t reserved;
  150. /* 4-byte aligned extended CDB spillover */
  151. uint8_t ecdb[SCSI_MAX_VARLEN_CDB_SIZE - ISCSI_CDB_SIZE];
  152. };
  153. /* SCSI Response Header */
  154. struct iscsi_scsi_rsp {
  155. uint8_t opcode;
  156. uint8_t flags;
  157. uint8_t response;
  158. uint8_t cmd_status;
  159. uint8_t hlength;
  160. uint8_t dlength[3];
  161. uint8_t rsvd[8];
  162. itt_t itt; /* Initiator Task Tag */
  163. __be32 rsvd1;
  164. __be32 statsn;
  165. __be32 exp_cmdsn;
  166. __be32 max_cmdsn;
  167. __be32 exp_datasn;
  168. __be32 bi_residual_count;
  169. __be32 residual_count;
  170. /* Response or Sense Data (optional) */
  171. };
  172. /* Command Response PDU flags */
  173. #define ISCSI_FLAG_CMD_BIDI_OVERFLOW 0x10
  174. #define ISCSI_FLAG_CMD_BIDI_UNDERFLOW 0x08
  175. #define ISCSI_FLAG_CMD_OVERFLOW 0x04
  176. #define ISCSI_FLAG_CMD_UNDERFLOW 0x02
  177. /* iSCSI Status values. Valid if Rsp Selector bit is not set */
  178. #define ISCSI_STATUS_CMD_COMPLETED 0
  179. #define ISCSI_STATUS_TARGET_FAILURE 1
  180. #define ISCSI_STATUS_SUBSYS_FAILURE 2
  181. /* Asynchronous Event Header */
  182. struct iscsi_async {
  183. uint8_t opcode;
  184. uint8_t flags;
  185. uint8_t rsvd2[2];
  186. uint8_t rsvd3;
  187. uint8_t dlength[3];
  188. struct scsi_lun lun;
  189. uint8_t rsvd4[8];
  190. __be32 statsn;
  191. __be32 exp_cmdsn;
  192. __be32 max_cmdsn;
  193. uint8_t async_event;
  194. uint8_t async_vcode;
  195. __be16 param1;
  196. __be16 param2;
  197. __be16 param3;
  198. uint8_t rsvd5[4];
  199. };
  200. /* iSCSI Event Codes */
  201. #define ISCSI_ASYNC_MSG_SCSI_EVENT 0
  202. #define ISCSI_ASYNC_MSG_REQUEST_LOGOUT 1
  203. #define ISCSI_ASYNC_MSG_DROPPING_CONNECTION 2
  204. #define ISCSI_ASYNC_MSG_DROPPING_ALL_CONNECTIONS 3
  205. #define ISCSI_ASYNC_MSG_PARAM_NEGOTIATION 4
  206. #define ISCSI_ASYNC_MSG_VENDOR_SPECIFIC 255
  207. /* NOP-Out Message */
  208. struct iscsi_nopout {
  209. uint8_t opcode;
  210. uint8_t flags;
  211. __be16 rsvd2;
  212. uint8_t rsvd3;
  213. uint8_t dlength[3];
  214. struct scsi_lun lun;
  215. itt_t itt; /* Initiator Task Tag */
  216. __be32 ttt; /* Target Transfer Tag */
  217. __be32 cmdsn;
  218. __be32 exp_statsn;
  219. uint8_t rsvd4[16];
  220. };
  221. /* NOP-In Message */
  222. struct iscsi_nopin {
  223. uint8_t opcode;
  224. uint8_t flags;
  225. __be16 rsvd2;
  226. uint8_t rsvd3;
  227. uint8_t dlength[3];
  228. struct scsi_lun lun;
  229. itt_t itt; /* Initiator Task Tag */
  230. __be32 ttt; /* Target Transfer Tag */
  231. __be32 statsn;
  232. __be32 exp_cmdsn;
  233. __be32 max_cmdsn;
  234. uint8_t rsvd4[12];
  235. };
  236. /* SCSI Task Management Message Header */
  237. struct iscsi_tm {
  238. uint8_t opcode;
  239. uint8_t flags;
  240. uint8_t rsvd1[2];
  241. uint8_t hlength;
  242. uint8_t dlength[3];
  243. struct scsi_lun lun;
  244. itt_t itt; /* Initiator Task Tag */
  245. itt_t rtt; /* Reference Task Tag */
  246. __be32 cmdsn;
  247. __be32 exp_statsn;
  248. __be32 refcmdsn;
  249. __be32 exp_datasn;
  250. uint8_t rsvd2[8];
  251. };
  252. #define ISCSI_FLAG_TM_FUNC_MASK 0x7F
  253. /* Function values */
  254. #define ISCSI_TM_FUNC_ABORT_TASK 1
  255. #define ISCSI_TM_FUNC_ABORT_TASK_SET 2
  256. #define ISCSI_TM_FUNC_CLEAR_ACA 3
  257. #define ISCSI_TM_FUNC_CLEAR_TASK_SET 4
  258. #define ISCSI_TM_FUNC_LOGICAL_UNIT_RESET 5
  259. #define ISCSI_TM_FUNC_TARGET_WARM_RESET 6
  260. #define ISCSI_TM_FUNC_TARGET_COLD_RESET 7
  261. #define ISCSI_TM_FUNC_TASK_REASSIGN 8
  262. #define ISCSI_TM_FUNC_VALUE(hdr) ((hdr)->flags & ISCSI_FLAG_TM_FUNC_MASK)
  263. /* SCSI Task Management Response Header */
  264. struct iscsi_tm_rsp {
  265. uint8_t opcode;
  266. uint8_t flags;
  267. uint8_t response; /* see Response values below */
  268. uint8_t qualifier;
  269. uint8_t hlength;
  270. uint8_t dlength[3];
  271. uint8_t rsvd2[8];
  272. itt_t itt; /* Initiator Task Tag */
  273. itt_t rtt; /* Reference Task Tag */
  274. __be32 statsn;
  275. __be32 exp_cmdsn;
  276. __be32 max_cmdsn;
  277. uint8_t rsvd3[12];
  278. };
  279. /* Response values */
  280. #define ISCSI_TMF_RSP_COMPLETE 0x00
  281. #define ISCSI_TMF_RSP_NO_TASK 0x01
  282. #define ISCSI_TMF_RSP_NO_LUN 0x02
  283. #define ISCSI_TMF_RSP_TASK_ALLEGIANT 0x03
  284. #define ISCSI_TMF_RSP_NO_FAILOVER 0x04
  285. #define ISCSI_TMF_RSP_NOT_SUPPORTED 0x05
  286. #define ISCSI_TMF_RSP_AUTH_FAILED 0x06
  287. #define ISCSI_TMF_RSP_REJECTED 0xff
  288. /* Ready To Transfer Header */
  289. struct iscsi_r2t_rsp {
  290. uint8_t opcode;
  291. uint8_t flags;
  292. uint8_t rsvd2[2];
  293. uint8_t hlength;
  294. uint8_t dlength[3];
  295. struct scsi_lun lun;
  296. itt_t itt; /* Initiator Task Tag */
  297. __be32 ttt; /* Target Transfer Tag */
  298. __be32 statsn;
  299. __be32 exp_cmdsn;
  300. __be32 max_cmdsn;
  301. __be32 r2tsn;
  302. __be32 data_offset;
  303. __be32 data_length;
  304. };
  305. /* SCSI Data Hdr */
  306. struct iscsi_data {
  307. uint8_t opcode;
  308. uint8_t flags;
  309. uint8_t rsvd2[2];
  310. uint8_t rsvd3;
  311. uint8_t dlength[3];
  312. struct scsi_lun lun;
  313. itt_t itt;
  314. __be32 ttt;
  315. __be32 rsvd4;
  316. __be32 exp_statsn;
  317. __be32 rsvd5;
  318. __be32 datasn;
  319. __be32 offset;
  320. __be32 rsvd6;
  321. /* Payload */
  322. };
  323. /* SCSI Data Response Hdr */
  324. struct iscsi_data_rsp {
  325. uint8_t opcode;
  326. uint8_t flags;
  327. uint8_t rsvd2;
  328. uint8_t cmd_status;
  329. uint8_t hlength;
  330. uint8_t dlength[3];
  331. struct scsi_lun lun;
  332. itt_t itt;
  333. __be32 ttt;
  334. __be32 statsn;
  335. __be32 exp_cmdsn;
  336. __be32 max_cmdsn;
  337. __be32 datasn;
  338. __be32 offset;
  339. __be32 residual_count;
  340. };
  341. /* Data Response PDU flags */
  342. #define ISCSI_FLAG_DATA_ACK 0x40
  343. #define ISCSI_FLAG_DATA_OVERFLOW 0x04
  344. #define ISCSI_FLAG_DATA_UNDERFLOW 0x02
  345. #define ISCSI_FLAG_DATA_STATUS 0x01
  346. /* Text Header */
  347. struct iscsi_text {
  348. uint8_t opcode;
  349. uint8_t flags;
  350. uint8_t rsvd2[2];
  351. uint8_t hlength;
  352. uint8_t dlength[3];
  353. uint8_t rsvd4[8];
  354. itt_t itt;
  355. __be32 ttt;
  356. __be32 cmdsn;
  357. __be32 exp_statsn;
  358. uint8_t rsvd5[16];
  359. /* Text - key=value pairs */
  360. };
  361. #define ISCSI_FLAG_TEXT_CONTINUE 0x40
  362. /* Text Response Header */
  363. struct iscsi_text_rsp {
  364. uint8_t opcode;
  365. uint8_t flags;
  366. uint8_t rsvd2[2];
  367. uint8_t hlength;
  368. uint8_t dlength[3];
  369. uint8_t rsvd4[8];
  370. itt_t itt;
  371. __be32 ttt;
  372. __be32 statsn;
  373. __be32 exp_cmdsn;
  374. __be32 max_cmdsn;
  375. uint8_t rsvd5[12];
  376. /* Text Response - key:value pairs */
  377. };
  378. /* Login Header */
  379. struct iscsi_login_req {
  380. uint8_t opcode;
  381. uint8_t flags;
  382. uint8_t max_version; /* Max. version supported */
  383. uint8_t min_version; /* Min. version supported */
  384. uint8_t hlength;
  385. uint8_t dlength[3];
  386. uint8_t isid[6]; /* Initiator Session ID */
  387. __be16 tsih; /* Target Session Handle */
  388. itt_t itt; /* Initiator Task Tag */
  389. __be16 cid;
  390. __be16 rsvd3;
  391. __be32 cmdsn;
  392. __be32 exp_statsn;
  393. uint8_t rsvd5[16];
  394. };
  395. /* Login PDU flags */
  396. #define ISCSI_FLAG_LOGIN_TRANSIT 0x80
  397. #define ISCSI_FLAG_LOGIN_CONTINUE 0x40
  398. #define ISCSI_FLAG_LOGIN_CURRENT_STAGE_MASK 0x0C /* 2 bits */
  399. #define ISCSI_FLAG_LOGIN_CURRENT_STAGE1 0x04
  400. #define ISCSI_FLAG_LOGIN_CURRENT_STAGE2 0x08
  401. #define ISCSI_FLAG_LOGIN_CURRENT_STAGE3 0x0C
  402. #define ISCSI_FLAG_LOGIN_NEXT_STAGE_MASK 0x03 /* 2 bits */
  403. #define ISCSI_FLAG_LOGIN_NEXT_STAGE1 0x01
  404. #define ISCSI_FLAG_LOGIN_NEXT_STAGE2 0x02
  405. #define ISCSI_FLAG_LOGIN_NEXT_STAGE3 0x03
  406. #define ISCSI_LOGIN_CURRENT_STAGE(flags) \
  407. ((flags & ISCSI_FLAG_LOGIN_CURRENT_STAGE_MASK) >> 2)
  408. #define ISCSI_LOGIN_NEXT_STAGE(flags) \
  409. (flags & ISCSI_FLAG_LOGIN_NEXT_STAGE_MASK)
  410. /* Login Response Header */
  411. struct iscsi_login_rsp {
  412. uint8_t opcode;
  413. uint8_t flags;
  414. uint8_t max_version; /* Max. version supported */
  415. uint8_t active_version; /* Active version */
  416. uint8_t hlength;
  417. uint8_t dlength[3];
  418. uint8_t isid[6]; /* Initiator Session ID */
  419. __be16 tsih; /* Target Session Handle */
  420. itt_t itt; /* Initiator Task Tag */
  421. __be32 rsvd3;
  422. __be32 statsn;
  423. __be32 exp_cmdsn;
  424. __be32 max_cmdsn;
  425. uint8_t status_class; /* see Login RSP ststus classes below */
  426. uint8_t status_detail; /* see Login RSP Status details below */
  427. uint8_t rsvd4[10];
  428. };
  429. /* Login stage (phase) codes for CSG, NSG */
  430. #define ISCSI_INITIAL_LOGIN_STAGE -1
  431. #define ISCSI_SECURITY_NEGOTIATION_STAGE 0
  432. #define ISCSI_OP_PARMS_NEGOTIATION_STAGE 1
  433. #define ISCSI_FULL_FEATURE_PHASE 3
  434. /* Login Status response classes */
  435. #define ISCSI_STATUS_CLS_SUCCESS 0x00
  436. #define ISCSI_STATUS_CLS_REDIRECT 0x01
  437. #define ISCSI_STATUS_CLS_INITIATOR_ERR 0x02
  438. #define ISCSI_STATUS_CLS_TARGET_ERR 0x03
  439. /* Login Status response detail codes */
  440. /* Class-0 (Success) */
  441. #define ISCSI_LOGIN_STATUS_ACCEPT 0x00
  442. /* Class-1 (Redirection) */
  443. #define ISCSI_LOGIN_STATUS_TGT_MOVED_TEMP 0x01
  444. #define ISCSI_LOGIN_STATUS_TGT_MOVED_PERM 0x02
  445. /* Class-2 (Initiator Error) */
  446. #define ISCSI_LOGIN_STATUS_INIT_ERR 0x00
  447. #define ISCSI_LOGIN_STATUS_AUTH_FAILED 0x01
  448. #define ISCSI_LOGIN_STATUS_TGT_FORBIDDEN 0x02
  449. #define ISCSI_LOGIN_STATUS_TGT_NOT_FOUND 0x03
  450. #define ISCSI_LOGIN_STATUS_TGT_REMOVED 0x04
  451. #define ISCSI_LOGIN_STATUS_NO_VERSION 0x05
  452. #define ISCSI_LOGIN_STATUS_ISID_ERROR 0x06
  453. #define ISCSI_LOGIN_STATUS_MISSING_FIELDS 0x07
  454. #define ISCSI_LOGIN_STATUS_CONN_ADD_FAILED 0x08
  455. #define ISCSI_LOGIN_STATUS_NO_SESSION_TYPE 0x09
  456. #define ISCSI_LOGIN_STATUS_NO_SESSION 0x0a
  457. #define ISCSI_LOGIN_STATUS_INVALID_REQUEST 0x0b
  458. /* Class-3 (Target Error) */
  459. #define ISCSI_LOGIN_STATUS_TARGET_ERROR 0x00
  460. #define ISCSI_LOGIN_STATUS_SVC_UNAVAILABLE 0x01
  461. #define ISCSI_LOGIN_STATUS_NO_RESOURCES 0x02
  462. /* Logout Header */
  463. struct iscsi_logout {
  464. uint8_t opcode;
  465. uint8_t flags;
  466. uint8_t rsvd1[2];
  467. uint8_t hlength;
  468. uint8_t dlength[3];
  469. uint8_t rsvd2[8];
  470. itt_t itt; /* Initiator Task Tag */
  471. __be16 cid;
  472. uint8_t rsvd3[2];
  473. __be32 cmdsn;
  474. __be32 exp_statsn;
  475. uint8_t rsvd4[16];
  476. };
  477. /* Logout PDU flags */
  478. #define ISCSI_FLAG_LOGOUT_REASON_MASK 0x7F
  479. /* logout reason_code values */
  480. #define ISCSI_LOGOUT_REASON_CLOSE_SESSION 0
  481. #define ISCSI_LOGOUT_REASON_CLOSE_CONNECTION 1
  482. #define ISCSI_LOGOUT_REASON_RECOVERY 2
  483. #define ISCSI_LOGOUT_REASON_AEN_REQUEST 3
  484. /* Logout Response Header */
  485. struct iscsi_logout_rsp {
  486. uint8_t opcode;
  487. uint8_t flags;
  488. uint8_t response; /* see Logout response values below */
  489. uint8_t rsvd2;
  490. uint8_t hlength;
  491. uint8_t dlength[3];
  492. uint8_t rsvd3[8];
  493. itt_t itt; /* Initiator Task Tag */
  494. __be32 rsvd4;
  495. __be32 statsn;
  496. __be32 exp_cmdsn;
  497. __be32 max_cmdsn;
  498. __be32 rsvd5;
  499. __be16 t2wait;
  500. __be16 t2retain;
  501. __be32 rsvd6;
  502. };
  503. /* logout response status values */
  504. #define ISCSI_LOGOUT_SUCCESS 0
  505. #define ISCSI_LOGOUT_CID_NOT_FOUND 1
  506. #define ISCSI_LOGOUT_RECOVERY_UNSUPPORTED 2
  507. #define ISCSI_LOGOUT_CLEANUP_FAILED 3
  508. /* SNACK Header */
  509. struct iscsi_snack {
  510. uint8_t opcode;
  511. uint8_t flags;
  512. uint8_t rsvd2[2];
  513. uint8_t hlength;
  514. uint8_t dlength[3];
  515. uint8_t lun[8];
  516. itt_t itt;
  517. __be32 ttt;
  518. uint8_t rsvd3[4];
  519. __be32 exp_statsn;
  520. uint8_t rsvd4[8];
  521. __be32 begrun;
  522. __be32 runlength;
  523. };
  524. /* SNACK PDU flags */
  525. #define ISCSI_FLAG_SNACK_TYPE_DATA 0
  526. #define ISCSI_FLAG_SNACK_TYPE_R2T 0
  527. #define ISCSI_FLAG_SNACK_TYPE_STATUS 1
  528. #define ISCSI_FLAG_SNACK_TYPE_DATA_ACK 2
  529. #define ISCSI_FLAG_SNACK_TYPE_RDATA 3
  530. #define ISCSI_FLAG_SNACK_TYPE_MASK 0x0F /* 4 bits */
  531. /* Reject Message Header */
  532. struct iscsi_reject {
  533. uint8_t opcode;
  534. uint8_t flags;
  535. uint8_t reason;
  536. uint8_t rsvd2;
  537. uint8_t hlength;
  538. uint8_t dlength[3];
  539. uint8_t rsvd3[8];
  540. __be32 ffffffff;
  541. uint8_t rsvd4[4];
  542. __be32 statsn;
  543. __be32 exp_cmdsn;
  544. __be32 max_cmdsn;
  545. __be32 datasn;
  546. uint8_t rsvd5[8];
  547. /* Text - Rejected hdr */
  548. };
  549. /* Reason for Reject */
  550. #define ISCSI_REASON_CMD_BEFORE_LOGIN 1
  551. #define ISCSI_REASON_DATA_DIGEST_ERROR 2
  552. #define ISCSI_REASON_DATA_SNACK_REJECT 3
  553. #define ISCSI_REASON_PROTOCOL_ERROR 4
  554. #define ISCSI_REASON_CMD_NOT_SUPPORTED 5
  555. #define ISCSI_REASON_IMM_CMD_REJECT 6
  556. #define ISCSI_REASON_TASK_IN_PROGRESS 7
  557. #define ISCSI_REASON_INVALID_SNACK 8
  558. #define ISCSI_REASON_BOOKMARK_INVALID 9
  559. #define ISCSI_REASON_BOOKMARK_NO_RESOURCES 10
  560. #define ISCSI_REASON_NEGOTIATION_RESET 11
  561. /* Max. number of Key=Value pairs in a text message */
  562. #define MAX_KEY_VALUE_PAIRS 8192
  563. /* maximum length for text keys/values */
  564. #define KEY_MAXLEN 64
  565. #define VALUE_MAXLEN 255
  566. #define TARGET_NAME_MAXLEN VALUE_MAXLEN
  567. #define ISCSI_DEF_MAX_RECV_SEG_LEN 8192
  568. #define ISCSI_MIN_MAX_RECV_SEG_LEN 512
  569. #define ISCSI_MAX_MAX_RECV_SEG_LEN 16777215
  570. #define ISCSI_DEF_FIRST_BURST_LEN 65536
  571. #define ISCSI_MIN_FIRST_BURST_LEN 512
  572. #define ISCSI_MAX_FIRST_BURST_LEN 16777215
  573. #define ISCSI_DEF_MAX_BURST_LEN 262144
  574. #define ISCSI_MIN_MAX_BURST_LEN 512
  575. #define ISCSI_MAX_MAX_BURST_LEN 16777215
  576. #define ISCSI_DEF_TIME2WAIT 2
  577. #define ISCSI_NAME_LEN 224
  578. /************************* RFC 3720 End *****************************/
  579. #endif /* ISCSI_PROTO_H */