iscsi.h 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571
  1. /* $OpenBSD: iscsi.h,v 1.8 2011/04/26 21:30:14 claudio Exp $ */
  2. /*
  3. * Copyright (c) 2008 David Gwynne <dlg@openbsd.org>
  4. *
  5. * Permission to use, copy, modify, and distribute this software for any
  6. * purpose with or without fee is hereby granted, provided that the above
  7. * copyright notice and this permission notice appear in all copies.
  8. *
  9. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
  10. * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  11. * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  12. * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  13. * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  14. * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  15. * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  16. */
  17. #ifndef _SYS_SCSI_ISCSI_H
  18. #define _SYS_SCSI_ISCSI_H
  19. struct iscsi_pdu {
  20. u_int8_t opcode;
  21. u_int8_t flags;
  22. u_int8_t _reserved1[2];
  23. u_int8_t ahslen;
  24. u_int8_t datalen[3];
  25. u_int8_t lun[8];
  26. u_int32_t itt;
  27. u_int8_t _reserved2[4];
  28. u_int32_t cmdsn;
  29. u_int32_t expstatsn;
  30. u_int8_t _reserved3[16];
  31. } __packed;
  32. /*
  33. * Initiator opcodes
  34. */
  35. #define ISCSI_OP_I_NOP 0x00
  36. #define ISCSI_OP_SCSI_REQUEST 0x01
  37. #define ISCSI_OP_TASK_REQUEST 0x02
  38. #define ISCSI_OP_LOGIN_REQUEST 0x03
  39. #define ISCSI_OP_TEXT_REQUEST 0x04
  40. #define ISCSI_OP_DATA_OUT 0x05
  41. #define ISCSI_OP_LOGOUT_REQUEST 0x06
  42. #define ISCSI_OP_SNACK_REQUEST 0x10
  43. /*
  44. * Target opcodes
  45. */
  46. #define ISCSI_OP_T_NOP 0x20
  47. #define ISCSI_OP_SCSI_RESPONSE 0x21
  48. #define ISCSI_OP_TASK_RESPONSE 0x22
  49. #define ISCSI_OP_LOGIN_RESPONSE 0x23
  50. #define ISCSI_OP_TEXT_RESPONSE 0x24
  51. #define ISCSI_OP_DATA_IN 0x25
  52. #define ISCSI_OP_LOGOUT_RESPONSE 0x26
  53. #define ISCSI_OP_R2T 0x31
  54. #define ISCSI_OP_ASYNC 0x32
  55. #define ISCSI_OP_REJECT 0x3f
  56. #define ISCSI_PDU_OPCODE(_o) ((_o) & 0x3f)
  57. #define ISCSI_PDU_I(_h) ((_h)->opcode & 0x40)
  58. #define ISCSI_PDU_F(_h) ((_h)->flags & 0x80)
  59. #define ISCSI_OP_F_IMMEDIATE 0x40
  60. /*
  61. * various other flags and values
  62. */
  63. #define ISCSI_ISID_OUI 0x00000000
  64. #define ISCSI_ISID_EN 0x40000000
  65. #define ISCSI_ISID_RAND 0x80000000
  66. struct iscsi_pdu_scsi_request {
  67. u_int8_t opcode;
  68. u_int8_t flags;
  69. u_int8_t _reserved[2];
  70. u_int8_t ahslen;
  71. u_int8_t datalen[3];
  72. u_int8_t lun[8];
  73. u_int32_t itt;
  74. u_int32_t bytes;
  75. u_int32_t cmdsn;
  76. u_int32_t expstatsn;
  77. u_int8_t cdb[16];
  78. } __packed;
  79. struct iscsi_pdu_scsi_response {
  80. u_int8_t opcode;
  81. u_int8_t flags;
  82. u_int8_t response;
  83. u_int8_t status;
  84. u_int8_t ahslen;
  85. u_int8_t datalen[3];
  86. u_int8_t _reserved[8];
  87. u_int32_t itt;
  88. u_int32_t snack;
  89. u_int32_t statsn;
  90. u_int32_t expcmdsn;
  91. u_int32_t maxcmdsn;
  92. u_int32_t expdatasn;
  93. u_int32_t birescount;
  94. u_int32_t rescount;
  95. } __packed;
  96. #define ISCSI_SCSI_F_F 0x80
  97. #define ISCSI_SCSI_F_R 0x40
  98. #define ISCSI_SCSI_F_W 0x20
  99. #define ISCSI_SCSI_ATTR_UNTAGGED 0
  100. #define ISCSI_SCSI_ATTR_SIMPLE 1
  101. #define ISCSI_SCSI_ATTR_ORDERED 2
  102. #define ISCSI_SCSI_ATTR_HEAD_OF_Q 3
  103. #define ISCSI_SCSI_ATTR_ACA 4
  104. #define ISCSI_SCSI_STAT_GOOD 0x00
  105. #define ISCSI_SCSI_STAT_CHCK_COND 0x02
  106. /* we don't care about the type of the other error conditions */
  107. struct iscsi_pdu_task_request {
  108. u_int8_t opcode;
  109. u_int8_t flags;
  110. u_int8_t reserved[2];
  111. u_int8_t ahslen;
  112. u_int8_t datalen[3];
  113. u_int8_t lun[8];
  114. u_int32_t itt;
  115. u_int32_t tag;
  116. u_int32_t cmdsn;
  117. u_int32_t expstatsn;
  118. u_int32_t refcmdsn;
  119. u_int32_t expdatasn;
  120. u_int8_t _reserved[8];
  121. } __packed;
  122. struct iscsi_pdu_task_response {
  123. u_int8_t opcode;
  124. u_int8_t flags;
  125. u_int8_t response;
  126. u_int8_t _reserved1;
  127. u_int8_t ahslen;
  128. u_int8_t datalen[3];
  129. u_int8_t _reserved[8];
  130. u_int32_t itt;
  131. u_int8_t _reserved2[4];
  132. u_int32_t statsn;
  133. u_int32_t expcmdsn;
  134. u_int32_t maxcmdsn;
  135. u_int8_t _reserved3[12];
  136. } __packed;
  137. struct iscsi_pdu_data_out {
  138. u_int8_t opcode;
  139. u_int8_t flags;
  140. u_int8_t _reserved1[2];
  141. u_int8_t ahslen;
  142. u_int8_t datalen[3];
  143. u_int8_t lun[8];
  144. u_int32_t itt;
  145. u_int32_t ttt;
  146. u_int8_t _reserved2[4];
  147. u_int32_t expstatsn;
  148. u_int8_t _reserved3[4];
  149. u_int32_t datasn;
  150. u_int32_t buffer_offs;
  151. u_int8_t _reserved4[4];
  152. } __packed;
  153. struct iscsi_pdu_data_in {
  154. u_int8_t opcode;
  155. u_int8_t flags;
  156. u_int8_t _reserved;
  157. u_int8_t status;
  158. u_int8_t ahslen;
  159. u_int8_t datalen[3];
  160. u_int8_t lun[8];
  161. u_int32_t itt;
  162. u_int32_t ttt;
  163. u_int32_t statsn;
  164. u_int32_t expcmdsn;
  165. u_int32_t maxcmdsn;
  166. u_int32_t datasn;
  167. u_int32_t buffer_offs;
  168. u_int32_t residual;
  169. } __packed;
  170. struct iscsi_pdu_rt2 {
  171. u_int8_t opcode;
  172. u_int8_t flags;
  173. u_int8_t _reserved1[2];
  174. u_int8_t ahslen;
  175. u_int8_t datalen[3];
  176. u_int8_t lun[8];
  177. u_int32_t itt;
  178. u_int32_t ttt;
  179. u_int32_t statsn;
  180. u_int32_t expcmdsn;
  181. u_int32_t maxcmdsn;
  182. u_int32_t r2tsn;
  183. u_int32_t buffer_offs;
  184. u_int32_t desired_datalen;
  185. } __packed;
  186. struct iscsi_pdu_async {
  187. u_int8_t opcode;
  188. u_int8_t flags;
  189. u_int8_t _reserved1[2];
  190. u_int8_t ahslen;
  191. u_int8_t datalen[3];
  192. u_int8_t lun[8];
  193. u_int32_t ffffffff;
  194. u_int8_t _reserved2[4];
  195. u_int32_t statsn;
  196. u_int32_t expcmdsn;
  197. u_int32_t maxcmdsn;
  198. u_int8_t event;
  199. u_int8_t vcode;
  200. u_int16_t param[3];
  201. u_int8_t _reserved3[4];
  202. } __packed;
  203. struct iscsi_pdu_text_request {
  204. u_int8_t opcode;
  205. u_int8_t flags;
  206. u_int8_t _reserved1[2];
  207. u_int8_t ahslen;
  208. u_int8_t datalen[3];
  209. u_int8_t lun[8];
  210. u_int32_t itt;
  211. u_int32_t ttt;
  212. u_int32_t cmdsn;
  213. u_int32_t expstatsn;
  214. u_int8_t _reserved2[16];
  215. } __packed;
  216. struct iscsi_pdu_text_response {
  217. u_int8_t opcode;
  218. u_int8_t flags;
  219. u_int8_t _reserved1[2];
  220. u_int8_t ahslen;
  221. u_int8_t datalen[3];
  222. u_int8_t lun[8];
  223. u_int32_t itt;
  224. u_int32_t ttt;
  225. u_int32_t cmdsn;
  226. u_int32_t expcmdsn;
  227. u_int32_t maxcmdsn;
  228. u_int8_t _reserved2[12];
  229. } __packed;
  230. #define ISCSI_TEXT_F_F 0x80
  231. #define ISCSI_TEXT_F_C 0x40
  232. struct iscsi_pdu_login_request {
  233. u_int8_t opcode;
  234. u_int8_t flags;
  235. u_int8_t version_max;
  236. u_int8_t version_min;
  237. u_int8_t ahslen;
  238. u_int8_t datalen[3];
  239. u_int32_t isid_base;
  240. u_int16_t isid_qual;
  241. u_int16_t tsih;
  242. u_int32_t itt;
  243. u_int16_t cid;
  244. u_int8_t _reserved1[2];
  245. u_int32_t cmdsn;
  246. u_int32_t expstatsn;
  247. u_int8_t _reserved2[16];
  248. } __packed;
  249. #define ISCSI_LOGIN_F_T 0x80
  250. #define ISCSI_LOGIN_F_C 0x40
  251. #define ISCSI_LOGIN_F_CSG(x) (((x) & 0x3) << 2)
  252. #define ISCSI_LOGIN_F_NSG(x) ((x) & 0x3)
  253. #define ISCSI_LOGIN_STG_SECNEG 0
  254. #define ISCSI_LOGIN_STG_OPNEG 1
  255. #define ISCSI_LOGIN_STG_FULL 3
  256. struct iscsi_pdu_login_response {
  257. u_int8_t opcode;
  258. u_int8_t flags;
  259. u_int8_t version_max;
  260. u_int8_t version_active;
  261. u_int8_t ahslen;
  262. u_int8_t datalen[3];
  263. u_int32_t isid_base;
  264. u_int16_t isid_qual;
  265. u_int16_t tsih;
  266. u_int32_t itt;
  267. u_int8_t _reserved1[4];
  268. u_int32_t statsn;
  269. u_int32_t expcmdsn;
  270. u_int32_t maxcmdsn;
  271. u_int8_t status_class;
  272. u_int8_t status_detail;
  273. u_int8_t _reserved2[10];
  274. } __packed;
  275. struct iscsi_pdu_logout_request {
  276. u_int8_t opcode;
  277. u_int8_t flags;
  278. u_int8_t _reserved1[2];
  279. u_int8_t ahslen;
  280. u_int8_t datalen[3];
  281. u_int8_t _reserved2[8];
  282. u_int32_t itt;
  283. u_int16_t cid;
  284. u_int8_t _reserved3[2];
  285. u_int32_t cmdsn;
  286. u_int32_t expstatsn;
  287. u_int8_t _reserved4[16];
  288. } __packed;
  289. #define ISCSI_LOGOUT_F 0x80
  290. #define ISCSI_LOGOUT_CLOSE_SESS 0
  291. #define ISCSI_LOGOUT_CLOSE_CONN 1
  292. #define ISCSI_LOGOUT_RCVRY_CONN 2
  293. #define ISCSI_LOGOUT_RESP_SUCCESS 0
  294. #define ISCSI_LOGOUT_RESP_UNKN_CID 1
  295. #define ISCSI_LOGOUT_RESP_NO_SUPPORT 2
  296. #define ISCSI_LOGOUT_RESP_ERROR 3
  297. struct iscsi_pdu_logout_response {
  298. u_int8_t opcode;
  299. u_int8_t flags;
  300. u_int8_t response;
  301. u_int8_t _reserved1;
  302. u_int8_t ahslen;
  303. u_int8_t datalen[3];
  304. u_int8_t _reserved2[8];
  305. u_int32_t itt;
  306. u_int8_t _reserved3[4];
  307. u_int32_t statsn;
  308. u_int32_t expcmdsn;
  309. u_int32_t maxcmdsn;
  310. u_int8_t _reserved4[4];
  311. u_int16_t time2wait;
  312. u_int16_t time2retain;
  313. u_int8_t _reserved5[4];
  314. } __packed;
  315. struct iscsi_pdu_snack_request {
  316. u_int8_t opcode;
  317. u_int8_t flags;
  318. u_int8_t _reserved1[2];
  319. u_int8_t ahslen;
  320. u_int8_t datalen[3];
  321. u_int8_t lun[8];
  322. u_int32_t itt;
  323. u_int32_t ttt;
  324. u_int8_t _reserved2[4];
  325. u_int32_t expstatsn;
  326. u_int8_t _reserved3[8];
  327. u_int32_t begrun;
  328. u_int32_t runlength;
  329. } __packed;
  330. struct iscsi_pdu_reject {
  331. u_int8_t opcode;
  332. u_int8_t flags;
  333. u_int8_t reason;
  334. u_int8_t _reserved1;
  335. u_int8_t ahslen;
  336. u_int8_t datalen[3];
  337. u_int8_t _reserved2[8];
  338. u_int32_t ffffffff;
  339. u_int8_t _reserved3[4];
  340. u_int32_t statsn;
  341. u_int32_t expcmdsn;
  342. u_int32_t maxcmdsn;
  343. u_int32_t datasn_r2tsn;
  344. u_int8_t _reserved4[8];
  345. } __packed;
  346. struct iscsi_pdu_nop_out {
  347. u_int8_t opcode;
  348. u_int8_t flags;
  349. u_int8_t _reserved1[2];
  350. u_int8_t ahslen;
  351. u_int8_t datalen[3];
  352. u_int8_t lun[8];
  353. u_int32_t itt;
  354. u_int32_t ttt;
  355. u_int32_t cmdsn;
  356. u_int32_t expstatsn;
  357. u_int8_t _reserved2[16];
  358. } __packed;
  359. struct iscsi_pdu_nop_in {
  360. u_int8_t opcode;
  361. u_int8_t flags;
  362. u_int8_t _reserved1[2];
  363. u_int8_t ahslen;
  364. u_int8_t datalen[3];
  365. u_int8_t lun[8];
  366. u_int32_t itt;
  367. u_int32_t ttt;
  368. u_int32_t statsn;
  369. u_int32_t expcmdsn;
  370. u_int32_t maxcmdsn;
  371. u_int8_t _reserved2[12];
  372. } __packed;
  373. #endif /* _SYS_SCSI_ISCSI_H */