]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/Network/IScsiDxe/IScsiProto.h
Update the copyright notice format
[mirror_edk2.git] / MdeModulePkg / Universal / Network / IScsiDxe / IScsiProto.h
CommitLineData
12618416 1/** @file\r
55a64ae0 2 The header file of iSCSI Protocol that defines many specific data structures.\r
6a690e23 3\r
e5eed7d3
HT
4Copyright (c) 2004 - 2010, Intel Corporation. All rights reserved.<BR>\r
5This program and the accompanying materials\r
7a444476 6are licensed and made available under the terms and conditions of the BSD License\r
7which accompanies this distribution. The full text of the license may be found at\r
8http://opensource.org/licenses/bsd-license.php\r
9\r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
6a690e23 12\r
12618416 13**/\r
6a690e23 14\r
15#ifndef _ISCSI_PROTO_H_\r
16#define _ISCSI_PROTO_H_\r
17\r
9cb8724d 18#include <Protocol/ScsiPassThruExt.h>\r
6a690e23 19\r
20//\r
21// RFC 1982 Serial Number Arithmetic, SERIAL_BITS = 32\r
22//\r
23#define ISCSI_SEQ_EQ(s1, s2) ((s1) == (s2))\r
24#define ISCSI_SEQ_LT(s1, s2) \\r
25 ( \\r
1c574ee4 26 (((INT32) (s1) < (INT32) (s2)) && (s2 - s1) < ((UINT32) 1 << 31)) || \\r
27 (((INT32) (s1) > (INT32) (s2)) && (s1 - s2) > ((UINT32) 1 << 31)) \\r
6a690e23 28 )\r
29#define ISCSI_SEQ_GT(s1, s2) \\r
30 ( \\r
1c574ee4 31 (((INT32) (s1) < (INT32) (s2)) && (s2 - s1) > ((UINT32) 1 << 31)) || \\r
32 (((INT32) (s1) > (INT32) (s2)) && (s1 - s2) < ((UINT32) 1 << 31)) \\r
6a690e23 33 )\r
34\r
35#define ISCSI_WELL_KNOWN_PORT 3260\r
36#define ISCSI_MAX_CONNS_PER_SESSION 1\r
37\r
38#define DEFAULT_MAX_RECV_DATA_SEG_LEN 8192\r
39#define MAX_RECV_DATA_SEG_LEN_IN_FFP 65536\r
40#define DEFAULT_MAX_OUTSTANDING_R2T 1\r
41\r
42#define ISCSI_VERSION_MAX 0x00\r
43#define ISCSI_VERSION_MIN 0x00\r
44\r
45#define ISID_BYTE_0 0 // OUI format\r
46#define ISID_BYTE_1 0\r
47#define ISID_BYTE_2 0xaa\r
48#define ISID_BYTE_3 0x1\r
49\r
50#define ISCSI_KEY_AUTH_METHOD "AuthMethod"\r
51#define ISCSI_KEY_HEADER_DIGEST "HeaderDigest"\r
52#define ISCSI_KEY_DATA_DIGEST "DataDigest"\r
53#define ISCSI_KEY_MAX_CONNECTIONS "MaxConnections"\r
54#define ISCSI_KEY_TARGET_NAME "TargetName"\r
55#define ISCSI_KEY_INITIATOR_NAME "InitiatorName"\r
56#define ISCSI_KEY_TARGET_ALIAS "TargetAlias"\r
57#define ISCSI_KEY_INITIATOR_ALIAS "InitiatorAlias"\r
58#define ISCSI_KEY_TARGET_ADDRESS "TargetAddress"\r
59#define ISCSI_KEY_INITIAL_R2T "InitialR2T"\r
60#define ISCSI_KEY_IMMEDIATE_DATA "ImmediateData"\r
61#define ISCSI_KEY_TARGET_PORTAL_GROUP_TAG "TargetPortalGroupTag"\r
62#define ISCSI_KEY_MAX_BURST_LENGTH "MaxBurstLength"\r
63#define ISCSI_KEY_FIRST_BURST_LENGTH "FirstBurstLength"\r
64#define ISCSI_KEY_DEFAULT_TIME2WAIT "DefaultTime2Wait"\r
65#define ISCSI_KEY_DEFAULT_TIME2RETAIN "DefaultTime2Retain"\r
66#define ISCSI_KEY_MAX_OUTSTANDING_R2T "MaxOutstandingR2T"\r
67#define ISCSI_KEY_DATA_PDU_IN_ORDER "DataPDUInOrder"\r
68#define ISCSI_KEY_DATA_SEQUENCE_IN_ORDER "DataSequenceInOrder"\r
69#define ISCSI_KEY_ERROR_RECOVERY_LEVEL "ErrorRecoveryLevel"\r
70#define ISCSI_KEY_SESSION_TYPE "SessionType"\r
71#define ISCSI_KEY_MAX_RECV_DATA_SEGMENT_LENGTH "MaxRecvDataSegmentLength"\r
72\r
73#define ISCSI_KEY_VALUE_NONE "None"\r
74\r
db3e605d 75///\r
76/// connection state for initiator\r
77///\r
f6b7393c 78\r
79#define CONN_STATE_FREE 0\r
80#define CONN_STATE_XPT_WAIT 1\r
81#define CONN_STATE_IN_LOGIN 2\r
82#define CONN_STATE_LOGGED_IN 3\r
83#define CONN_STATE_IN_LOGOUT 4\r
84#define CONN_STATE_LOGOUT_REQUESTED 5\r
85#define CONN_STATE_CLEANUP_WAIT 6\r
86#define CONN_STATE_IN_CLEANUP 7\r
6a690e23 87\r
db3e605d 88///\r
89/// session state for initiator\r
90///\r
f6b7393c 91#define SESSION_STATE_FREE 0\r
92#define SESSION_STATE_LOGGED_IN 1\r
93#define SESSION_STATE_FAILED 2\r
6a690e23 94\r
95typedef enum {\r
96 DataIn = 0,\r
97 DataOut = 1,\r
98 DataBi = 2\r
99} DATA_DIRECTION;\r
100\r
101#define ISCSI_RESERVED_TAG 0xffffffff\r
102\r
103#define ISCSI_REQ_IMMEDIATE 0x40\r
104#define ISCSI_OPCODE_MASK 0x3F\r
105\r
106#define ISCSI_SET_OPCODE(PduHdr, Op, Flgs) ((((ISCSI_BASIC_HEADER *) (PduHdr))->OpCode) = ((Op) | (Flgs)))\r
107#define ISCSI_GET_OPCODE(PduHdr) ((((ISCSI_BASIC_HEADER *) (PduHdr))->OpCode) & ISCSI_OPCODE_MASK)\r
108#define ISCSI_CHECK_OPCODE(PduHdr, Op) ((((PduHdr)->OpCode) & ISCSI_OPCODE_MASK) == (Op))\r
109#define ISCSI_IMMEDIATE_ON(PduHdr) ((PduHdr)->OpCode & ISCSI_REQ_IMMEDIATE)\r
69b0882d 110#define ISCSI_SET_FLAG(PduHdr, Flag) (((ISCSI_BASIC_HEADER *) (PduHdr))->Flags |= (BOOLEAN)(Flag))\r
6a690e23 111#define ISCSI_CLEAR_FLAG(PduHdr, Flag) (((ISCSI_BASIC_HEADER *) (PduHdr))->Flags &= ~(Flag))\r
93e3992d 112#define ISCSI_FLAG_ON(PduHdr, Flag) ((((ISCSI_BASIC_HEADER *) (PduHdr))->Flags & (Flag)) == (Flag))\r
69b0882d 113#define ISCSI_SET_STAGES(PduHdr, Cur, Nxt) ((PduHdr)->Flags = (UINT8) ((PduHdr)->Flags | ((Cur) << 2 | (Nxt))))\r
6a690e23 114#define ISCSI_GET_CURRENT_STAGE(PduHdr) (((PduHdr)->Flags >> 2) & 0x3)\r
115#define ISCSI_GET_NEXT_STAGE(PduHdr) (((PduHdr)->Flags) & 0x3)\r
116\r
117#define ISCSI_GET_PAD_LEN(DataLen) ((~(DataLen) + 1) & 0x3)\r
118#define ISCSI_ROUNDUP(DataLen) (((DataLen) + 3) &~(0x3))\r
119\r
120#define HTON24(Dst, Src) \\r
121 do { \\r
69b0882d 122 (Dst)[0] = (UINT8) (((Src) >> 16) & 0xFF); \\r
123 (Dst)[1] = (UINT8) (((Src) >> 8) & 0xFF); \\r
124 (Dst)[2] = (UINT8) ((Src) & 0xFF); \\r
6a690e23 125 } while (0);\r
126\r
127#define NTOH24(src) (((src)[0] << 16) | ((src)[1] << 8) | ((src)[2]))\r
128\r
129#define ISCSI_GET_DATASEG_LEN(PduHdr) NTOH24 (((ISCSI_BASIC_HEADER *) (PduHdr))->DataSegmentLength)\r
130#define ISCSI_SET_DATASEG_LEN(PduHdr, Len) HTON24 (((ISCSI_BASIC_HEADER *) (PduHdr))->DataSegmentLength, (Len))\r
131\r
132//\r
133// initiator opcodes\r
134//\r
135#define ISCSI_OPCODE_NOP_OUT 0x00\r
136#define ISCSI_OPCODE_SCSI_CMD 0x01\r
137#define ISCSI_OPCODE_SCSI_TMF_REQ 0x02\r
138#define ISCSI_OPCODE_LOGIN_REQ 0x03\r
139#define ISCSI_OPCODE_TEXT_REQ 0x04\r
140#define ISCSI_OPCODE_SCSI_DATA_OUT 0x05\r
141#define ISCSI_OPCODE_LOGOUT_REQ 0x06\r
142#define ISCSI_OPCODE_SNACK_REQ 0x10\r
143#define ISCSI_OPCODE_VENDOR_I0 0x1c\r
144#define ISCSI_OPCODE_VENDOR_I1 0x1d\r
145#define ISCSI_OPCODE_VENDOR_I2 0x1e\r
146\r
147//\r
148// target opcodes\r
149//\r
150#define ISCSI_OPCODE_NOP_IN 0x20\r
151#define ISCSI_OPCODE_SCSI_RSP 0x21\r
152#define ISCSI_OPCODE_SCSI_TMF_RSP 0x22\r
153#define ISCSI_OPCODE_LOGIN_RSP 0x23\r
154#define ISCSI_OPCODE_TEXT_RSP 0x24\r
155#define ISCSI_OPCODE_SCSI_DATA_IN 0x25\r
156#define ISCSI_OPCODE_LOGOUT_RSP 0x26\r
157#define ISCSI_OPCODE_R2T 0x31\r
158#define ISCSI_OPCODE_ASYNC_MSG 0x32\r
159#define ISCSI_OPCODE_VENDOR_T0 0x3c\r
160#define ISCSI_OPCODE_VENDOR_T1 0x3d\r
161#define ISCSI_OPCODE_VENDOR_T2 0x3e\r
162#define ISCSI_OPCODE_REJECT 0x3f\r
163\r
164#define ISCSI_BHS_FLAG_FINAL 0x80\r
165\r
db3e605d 166///\r
167/// iSCSI Basic Header Segment\r
168///\r
6a690e23 169typedef struct _ISCSI_BASIC_HEADER {\r
170 UINT8 OpCode;\r
171 UINT8 Flags;\r
172 UINT16 OpCodeSpecific1;\r
173 UINT8 TotalAHSLength;\r
174 UINT8 DataSegmentLength[3];\r
175 UINT8 Lun[8];\r
176 UINT32 InitiatorTaskTag;\r
177 UINT32 OpCodeSpecific2[7];\r
178} ISCSI_BASIC_HEADER;\r
179\r
180//\r
181// Defined AHS types, others are reserved.\r
182//\r
183#define ISCSI_AHS_TYPE_EXT_CDB 0x1\r
184#define ISCSI_AHS_TYPE_BI_EXP_READ_DATA_LEN 0x2\r
185\r
186typedef struct _ISCSI_ADDTIONAL_HEADER {\r
187 UINT16 Length;\r
188 UINT8 Type;\r
189 UINT8 TypeSpecific[1];\r
190} ISCSI_ADDITIONAL_HEADER;\r
191\r
192typedef struct _ISCSI_BI_EXP_READ_DATA_LEN_AHS {\r
193 UINT16 Length;\r
194 UINT8 Type;\r
195 UINT8 Reserved;\r
196 UINT32 ExpReadDataLength;\r
197} ISCSI_BI_EXP_READ_DATA_LEN_AHS;\r
198\r
199#define SCSI_CMD_PDU_FLAG_READ 0x40\r
200#define SCSI_CMD_PDU_FLAG_WRITE 0x20\r
201\r
202#define ISCSI_CMD_PDU_TASK_ATTR_MASK 0x07\r
203\r
204//\r
205// task attributes\r
206//\r
207#define ISCSI_TASK_ATTR_UNTAGGED 0x00\r
208#define ISCSI_TASK_ATTR_SIMPLE 0x01\r
209#define ISCSI_TASK_ATTR_ORDERD 0x02\r
210#define ISCSI_TASK_ATTR_HOQ 0x03\r
211#define ISCSI_TASK_ATTR_ACA 0x04\r
212\r
db3e605d 213///\r
214/// SCSI Command\r
215///\r
6a690e23 216typedef struct _SCSI_COMMAND {\r
217 UINT8 OpCode;\r
218 UINT8 Flags;\r
219 UINT16 Reserved;\r
220 UINT8 TotalAHSLength;\r
221 UINT8 DataSegmentLength[3];\r
222 UINT8 Lun[8];\r
223 UINT32 InitiatorTaskTag;\r
224 UINT32 ExpDataXferLength;\r
225 UINT32 CmdSN;\r
226 UINT32 ExpStatSN;\r
f6b7393c 227 UINT8 Cdb[16];\r
6a690e23 228} SCSI_COMMAND;\r
229\r
230//\r
231// flag bit definitions in SCSI response\r
232//\r
233#define SCSI_RSP_PDU_FLAG_BI_READ_OVERFLOW 0x10\r
234#define SCSI_RSP_PDU_FLAG_BI_READ_UNDERFLOW 0x08\r
235#define SCSI_RSP_PDU_FLAG_OVERFLOW 0x04\r
236#define SCSI_RSP_PDU_FLAG_UNDERFLOW 0x02\r
237\r
238//\r
239// iSCSI service response codes\r
240//\r
241#define ISCSI_SERVICE_RSP_COMMAND_COMPLETE_AT_TARGET 0x00\r
242#define ISCSI_SERVICE_RSP_TARGET_FAILURE 0x01\r
243\r
db3e605d 244///\r
245/// SCSI Response\r
246///\r
6a690e23 247typedef struct _SCSI_RESPONSE {\r
248 UINT8 OpCode;\r
249 UINT8 Flags;\r
250 UINT8 Response;\r
251 UINT8 Status;\r
252 UINT8 TotalAHSLength;\r
253 UINT8 DataSegmentLength[3];\r
254 UINT8 Reserved[8];\r
255 UINT32 InitiatorTaskTag;\r
256 UINT32 SNACKTag;\r
257 UINT32 StatSN;\r
258 UINT32 ExpCmdSN;\r
259 UINT32 MaxCmdSN;\r
260 UINT32 ExpDataSN;\r
261 UINT32 BiReadResidualCount;\r
262 UINT32 ResidualCount;\r
263} SCSI_RESPONSE;\r
264\r
265typedef struct _ISCSI_SENSE_DATA {\r
266 UINT16 Length;\r
267 UINT8 Data[2];\r
268} ISCSI_SENSE_DATA;\r
269\r
db3e605d 270///\r
271/// iSCSI Task Managment Function Request\r
272///\r
6a690e23 273typedef struct _ISCSI_TMF_REQUEST {\r
274 UINT8 OpCode;\r
275 UINT8 Fuction;\r
276 UINT16 Reserved1;\r
277 UINT8 TotalAHSLength;\r
278 UINT8 DataSegmentLength[3];\r
279 UINT8 Lun[8];\r
280 UINT32 InitiatorTaskTag;\r
281 UINT32 ReferencedTaskTag;\r
282 UINT32 CmdSN;\r
283 UINT32 ExpStatSN;\r
284 UINT32 RefCmdSN;\r
285 UINT32 ExpDataSN;\r
286 UINT32 Reserved2[2];\r
287} ISCSI_TMF_REQUEST;\r
288\r
289#define ISCSI_TMF_RSP_PDU_RSP_FUNCTION_COMPLETE 0\r
290#define ISCSI_TMF_RSP_PDU_RSP_TASK_NOT_EXIST 1\r
291#define ISCSI_TMF_RSP_PDU_RSP_LUN_NOT_EXIST 2\r
292#define ISCSI_TMF_RSP_PDU_RSP_TASK_STILL_ALLEGIANT 3\r
293#define ISCSI_TMF_RSP_PDU_RSP_TASK_REASSGIN_NOT_SUPPORTED 4\r
294#define ISCSI_TMF_RSP_PDU_RSP_NOT_SUPPORTED 5\r
295#define ISCSI_TMF_RSP_PDU_RSP_FUNCTION_AHTH_FAILED 6\r
296#define ISCSI_TMF_RSP_PDU_RSP_FUNCTION_REJECTED 255\r
297\r
db3e605d 298///\r
299/// iSCSI Task Management Function Response\r
300///\r
6a690e23 301typedef struct _ISCSI_TMF_RESPONSE {\r
302 UINT8 OpCode;\r
303 UINT8 Reserved1;\r
304 UINT8 Response;\r
305 UINT8 Reserved2;\r
306 UINT8 TotalAHSLength;\r
307 UINT8 DataSegmentLength[3];\r
308 UINT32 Reserver3[2];\r
309 UINT32 InitiatorTaskTag;\r
310 UINT32 Reserved4;\r
311 UINT32 StatSN;\r
312 UINT32 ExpCmdSN;\r
313 UINT32 MaxCmdSN;\r
314 UINT32 Reserved[3];\r
315} ISCSI_TMF_RESPONSE;\r
316\r
db3e605d 317///\r
318/// SCSI Data-Out\r
319///\r
6a690e23 320typedef struct _ISCSI_SCSI_DATA_OUT {\r
321 UINT8 OpCode;\r
322 UINT8 Reserved1[3];\r
323 UINT8 TotalAHSLength;\r
324 UINT8 DataSegmentLength[3];\r
325 UINT8 Lun[8];\r
326 UINT32 InitiatorTaskTag;\r
327 UINT32 TargetTransferTag;\r
328 UINT32 Reserved2;\r
329 UINT32 ExpStatSN;\r
330 UINT32 Reserved3;\r
331 UINT32 DataSN;\r
332 UINT32 BufferOffset;\r
333 UINT32 Reserved4;\r
334} ISCSI_SCSI_DATA_OUT;\r
335\r
336#define SCSI_DATA_IN_PDU_FLAG_ACKKNOWLEDGE 0x40\r
337#define SCSI_DATA_IN_PDU_FLAG_OVERFLOW SCSI_RSP_PDU_FLAG_OVERFLOW\r
338#define SCSI_DATA_IN_PDU_FLAG_UNDERFLOW SCSI_RSP_PDU_FLAG_UNDERFLOW\r
339#define SCSI_DATA_IN_PDU_FLAG_STATUS_VALID 0x01\r
db3e605d 340\r
341///\r
342/// SCSI Data-In\r
343///\r
6a690e23 344typedef struct _ISCSI_SCSI_DATA_IN {\r
345 UINT8 OpCode;\r
346 UINT8 Flags;\r
347 UINT8 Reserved1;\r
348 UINT8 Status;\r
349 UINT8 TotalAHSLength;\r
350 UINT8 DataSegmentLength[3];\r
351 UINT8 Lun[8];\r
352 UINT32 InitiatorTaskTag;\r
353 UINT32 TargetTransferTag;\r
354 UINT32 StatSN;\r
355 UINT32 ExpCmdSN;\r
356 UINT32 MaxCmdSN;\r
357 UINT32 DataSN;\r
358 UINT32 BufferOffset;\r
359 UINT32 ResidualCount;\r
360} ISCSI_SCSI_DATA_IN;\r
361\r
362#define ISCSI_GET_BUFFER_OFFSET(PduHdr) NTOHL (((ISCSI_SCSI_DATA_IN *) (PduHdr))->BufferOffset)\r
db3e605d 363\r
364///\r
365/// Ready To Transfer\r
366///\r
6a690e23 367typedef struct _ISCSI_READY_TO_TRANSFER {\r
368 UINT8 OpCode;\r
369 UINT8 Reserved1[3];\r
370 UINT8 TotalAHSLength;\r
371 UINT8 DataSegmentLength[3];\r
372 UINT8 Lun[8];\r
373 UINT32 InitiatorTaskTag;\r
374 UINT32 TargetTransferTag;\r
375 UINT32 StatSN;\r
376 UINT32 ExpCmdSN;\r
377 UINT32 MaxCmdSN;\r
f6b7393c 378 UINT32 R2TSeqNum;\r
6a690e23 379 UINT32 BufferOffset;\r
380 UINT32 DesiredDataTransferLength;\r
381} ISCSI_READY_TO_TRANSFER;\r
382\r
383typedef struct _ISCSI_ASYNC_MESSAGE {\r
384 UINT8 OpCode;\r
385 UINT8 Reserved1[8];\r
386 UINT8 TotalAHSLength;\r
387 UINT8 DataSegmentLength[3];\r
388 UINT8 Lun[8];\r
389 UINT32 InitiatorTaskTag;\r
390 UINT32 Reserved2;\r
391 UINT32 StatSN;\r
392 UINT32 ExpCmdSN;\r
393 UINT32 MaxCmdSN;\r
394 UINT8 AsyncEvent;\r
395 UINT8 AsyncVCode;\r
396 UINT16 Parameter1;\r
397 UINT16 Parameter2;\r
398 UINT16 Parameter3;\r
399 UINT32 Reserved3;\r
400} ISCSI_ASYNC_MESSAGE;\r
401\r
402#define ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT 0x80\r
403#define ISCSI_LOGIN_REQ_PDU_FLAG_CONTINUE 0x40\r
404\r
db3e605d 405///\r
406/// Login Request\r
407///\r
6a690e23 408typedef struct _ISCSI_LOGIN_REQUEST {\r
409 UINT8 OpCode;\r
410 UINT8 Flags;\r
411 UINT8 VersionMax;\r
412 UINT8 VersionMin;\r
413 UINT8 TotalAHSLength;\r
414 UINT8 DataSegmentLength[3];\r
a78d176c 415 UINT8 Isid[6];\r
416 UINT16 Tsih;\r
6a690e23 417 UINT32 InitiatorTaskTag;\r
a78d176c 418 UINT16 Cid;\r
6a690e23 419 UINT16 Reserved1;\r
420 UINT32 CmdSN;\r
421 UINT32 ExpStatSN;\r
422 UINT32 Reserved2[4];\r
423} ISCSI_LOGIN_REQUEST;\r
424\r
425#define ISCSI_LOGIN_RSP_PDU_FLAG_TRANSIT ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT\r
426#define ISCSI_LOGIN_RSP_PDU_FLAG_CONTINUE ISCSI_LOGIN_REQ_PDU_FLAG_CONTINUE\r
427\r
428#define ISCSI_LOGIN_STATUS_SUCCESS 0\r
429#define ISCSI_LOGIN_STATUS_REDIRECTION 1\r
430#define ISCSI_LOGIN_STATUS_INITIATOR_ERROR 2\r
431#define ISCSI_LOGIN_STATUS_TARGET_ERROR 3\r
432\r
db3e605d 433///\r
434/// Login Response\r
435///\r
6a690e23 436typedef struct _ISCSI_LOGIN_RESPONSE {\r
437 UINT8 OpCode;\r
438 UINT8 Flags;\r
439 UINT8 VersionMax;\r
440 UINT8 VersionActive;\r
441 UINT8 TotalAHSLength;\r
442 UINT8 DataSegmentLength[3];\r
a78d176c 443 UINT8 Isid[6];\r
444 UINT16 Tsih;\r
6a690e23 445 UINT32 InitiatorTaskTag;\r
446 UINT32 Reserved1;\r
447 UINT32 StatSN;\r
448 UINT32 ExpCmdSN;\r
449 UINT32 MaxCmdSN;\r
450 UINT8 StatusClass;\r
451 UINT8 StatusDetail;\r
452 UINT8 Reserved2[10];\r
453} ISCSI_LOGIN_RESPONSE;\r
454\r
455#define ISCSI_LOGOUT_REASON_CLOSE_SESSION 0\r
456#define ISCSI_LOGOUT_REASON_CLOSE_CONNECTION 1\r
457#define ISCSI_LOGOUT_REASON_REMOVE_CONNECTION_FOR_RECOVERY 2\r
458\r
db3e605d 459///\r
460/// Logout Request\r
461///\r
6a690e23 462typedef struct _ISCSI_LOGOUT_REQUEST {\r
463 UINT8 OpCode;\r
464 UINT8 ReasonCode;\r
465 UINT16 Reserved1;\r
466 UINT8 TotalAHSLength;\r
467 UINT8 DataSegmentLength[3];\r
468 UINT32 Reserved2[2];\r
469 UINT32 InitiatorTaskTag;\r
a78d176c 470 UINT16 Cid;\r
6a690e23 471 UINT16 Reserved3;\r
472 UINT32 CmdSN;\r
473 UINT32 ExpStatSN;\r
474 UINT32 Reserved4[4];\r
475} ISCSI_LOGOUT_REQUEST;\r
476\r
477#define ISCSI_LOGOUT_RESPONSE_SESSION_CLOSED_SUCCESS 0\r
478#define ISCSI_LOGOUT_RESPONSE_CID_NOT_FOUND 1\r
479#define ISCSI_LOGOUT_RESPONSE_RECOVERY_NOT_SUPPORTED 2\r
480#define ISCSI_LOGOUT_RESPONSE_CLEANUP_FAILED 3\r
481\r
db3e605d 482///\r
483/// Logout Response\r
484///\r
6a690e23 485typedef struct _ISCSI_LOGOUT_RESPONSE {\r
486 UINT8 OpCode;\r
487 UINT8 Reserved1;\r
488 UINT8 Response;\r
489 UINT8 Reserved2;\r
490 UINT8 TotalAHSLength;\r
491 UINT8 DataSegmentLength[3];\r
492 UINT32 Reserved3[2];\r
493 UINT32 InitiatorTaskTag;\r
494 UINT32 Reserved4;\r
495 UINT32 StatSN;\r
496 UINT32 ExpCmdSN;\r
497 UINT32 MaxCmdSN;\r
498 UINT32 Reserved5;\r
499 UINT16 Time2Wait;\r
500 UINT16 Time2Retain;\r
501 UINT32 Reserved6;\r
502} ISCSI_LOGOUT_RESPONSE;\r
503\r
504#define ISCSI_SNACK_REQUEST_TYPE_DATA_OR_R2T 0\r
505#define ISCSI_SNACK_REQUEST_TYPE_STATUS 1\r
506#define ISCSI_SNACK_REQUEST_TYPE_DATA_ACK 2\r
507#define ISCSI_SNACK_REQUEST_TYPE_RDATA 3\r
508\r
db3e605d 509///\r
510/// SNACK Request\r
511///\r
6a690e23 512typedef struct _ISCSI_SNACK_REQUEST {\r
513 UINT8 OpCode;\r
514 UINT8 Type;\r
515 UINT16 Reserved1;\r
516 UINT8 TotalAHSLength;\r
517 UINT8 DataSegmentLength[3];\r
518 UINT8 Lun[8];\r
519 UINT32 InitiatorTaskTag;\r
520 UINT32 TargetTransferTag;\r
521 UINT32 Reserved2;\r
522 UINT32 ExpStatSN;\r
523 UINT32 Reserved[2];\r
524 UINT32 BegRun;\r
525 UINT32 RunLength;\r
526} ISCSI_SNACK_REQUEST;\r
527\r
db3e605d 528///\r
529/// Reject\r
530///\r
6a690e23 531typedef struct _ISCSI_REJECT {\r
532 UINT8 OpCode;\r
533 UINT8 Reserved1;\r
534 UINT8 Reason;\r
535 UINT8 Reserved2;\r
536 UINT8 TotalAHSLength;\r
537 UINT8 DataSegmentLength[3];\r
538 UINT32 Reserved3[2];\r
539 UINT32 InitiatorTaskTag;\r
540 UINT32 Reserved4;\r
541 UINT32 StatSN;\r
542 UINT32 ExpCmdSN;\r
543 UINT32 MaxCmdSN;\r
544 UINT32 DataSN;\r
545 UINT32 Reserved5[2];\r
546} ISCSI_REJECT;\r
547\r
db3e605d 548///\r
549/// NOP-Out\r
550///\r
6a690e23 551typedef struct _ISCSI_NOP_OUT {\r
552 UINT8 OpCode;\r
553 UINT8 Reserved1[3];\r
554 UINT8 TotalAHSLength;\r
555 UINT8 DataSegmentLength[3];\r
556 UINT8 Lun[8];\r
557 UINT32 InitiatorTaskTag;\r
558 UINT32 TargetTransferTag;\r
559 UINT32 CmdSN;\r
560 UINT32 ExpStatSN;\r
561 UINT32 Reserved2[4];\r
562} ISCSI_NOP_OUT;\r
563\r
db3e605d 564///\r
565/// NOP-In\r
566///\r
6a690e23 567typedef struct _ISCSI_NOP_IN {\r
568 UINT8 OpCode;\r
569 UINT8 Reserved1[3];\r
570 UINT8 TotalAHSLength;\r
571 UINT8 DataSegmentLength[3];\r
572 UINT8 Lun[8];\r
573 UINT32 InitiatorTaskTag;\r
574 UINT32 TargetTransferTag;\r
575 UINT32 StatSN;\r
576 UINT32 ExpCmdSN;\r
577 UINT32 MaxCmdSN;\r
578 UINT32 Reserved2[3];\r
579} ISCSI_NOP_IN;\r
580\r
581#define ISCSI_SECURITY_NEGOTIATION 0\r
582#define ISCSI_LOGIN_OPERATIONAL_NEGOTIATION 1\r
583#define ISCSI_FULL_FEATURE_PHASE 3\r
584\r
585typedef enum {\r
f6b7393c 586 IScsiDigestNone,\r
587 IScsiDigestCRC32\r
6a690e23 588} ISCSI_DIGEST_TYPE;\r
589\r
590typedef struct _ISCSI_XFER_CONTEXT {\r
591 UINT32 TargetTransferTag;\r
592 UINT32 Offset;\r
593 UINT32 DesiredLength;\r
594 UINT32 ExpDataSN;\r
595} ISCSI_XFER_CONTEXT;\r
596\r
597typedef struct _ISCSI_IN_BUFFER_CONTEXT {\r
598 UINT8 *InData;\r
599 UINT32 InDataLen;\r
600} ISCSI_IN_BUFFER_CONTEXT;\r
601\r
602typedef struct _ISCSI_TCB {\r
e48e37fc 603 LIST_ENTRY Link;\r
6a690e23 604\r
605 BOOLEAN SoFarInOrder;\r
606 UINT32 ExpDataSN;\r
607 BOOLEAN FbitReceived;\r
608 BOOLEAN StatusXferd;\r
609 UINT32 ActiveR2Ts;\r
610 UINT32 Response;\r
611 CHAR8 *Reason;\r
612 UINT32 InitiatorTaskTag;\r
613 UINT32 CmdSN;\r
614 UINT32 SNACKTag;\r
615\r
616 ISCSI_XFER_CONTEXT XferContext;\r
617\r
618 ISCSI_CONNECTION *Conn;\r
619} ISCSI_TCB;\r
620\r
621typedef struct _ISCSI_KEY_VALUE_PAIR {\r
e48e37fc 622 LIST_ENTRY List;\r
6a690e23 623\r
624 CHAR8 *Key;\r
625 CHAR8 *Value;\r
626} ISCSI_KEY_VALUE_PAIR;\r
627\r
12618416 628/**\r
629 Attach the iSCSI connection to the iSCSI session. \r
630\r
c5de0d55 631 @param[in, out] Session The iSCSI session.\r
632 @param[in, out] Conn The iSCSI connection.\r
12618416 633**/\r
6a690e23 634VOID\r
635IScsiAttatchConnection (\r
c5de0d55 636 IN OUT ISCSI_SESSION *Session,\r
637 IN OUT ISCSI_CONNECTION *Conn\r
6a690e23 638 );\r
639\r
12618416 640/**\r
641 Detach the iSCSI connection from the session it belongs to. \r
642\r
c5de0d55 643 @param[in, out] Conn The iSCSI connection.\r
12618416 644**/\r
6a690e23 645VOID\r
646IScsiDetatchConnection (\r
c5de0d55 647 IN OUT ISCSI_CONNECTION *Conn\r
6a690e23 648 );\r
649\r
12618416 650/**\r
651 This function does the iSCSI connection login.\r
652\r
c5de0d55 653 @param[in, out] Conn The iSCSI connection to login.\r
12618416 654\r
655 @retval EFI_SUCCESS The iSCSI connection is logged into the iSCSI target.\r
12618416 656 @retval EFI_TIMEOUT Timeout happened during the login procedure.\r
963dbb30 657 @retval Others Other errors as indicated. \r
12618416 658**/\r
6a690e23 659EFI_STATUS\r
660IScsiConnLogin (\r
c5de0d55 661 IN OUT ISCSI_CONNECTION *Conn\r
6a690e23 662 );\r
663\r
12618416 664/**\r
665 Create a TCP connection for the iSCSI session.\r
666\r
db3e605d 667 @param[in] Private The iSCSI driver data.\r
668 @param[in] Session Maximum CmdSN from the target.\r
12618416 669\r
db3e605d 670 @return The newly created iSCSI connection.\r
12618416 671**/\r
db3e605d 672ISCSI_CONNECTION *\r
6a690e23 673IScsiCreateConnection (\r
674 IN ISCSI_DRIVER_DATA *Private,\r
675 IN ISCSI_SESSION *Session\r
676 );\r
677\r
12618416 678/**\r
679 Destroy an iSCSI connection.\r
680\r
db3e605d 681 @param[in] Conn The connection to destroy.\r
12618416 682**/\r
6a690e23 683VOID\r
684IScsiDestroyConnection (\r
685 IN ISCSI_CONNECTION *Conn\r
686 );\r
687\r
12618416 688/**\r
689 Login the iSCSI session.\r
690\r
db3e605d 691 @param[in] Private The iSCSI driver data.\r
12618416 692\r
693 @retval EFI_SUCCESS The iSCSI session login procedure finished.\r
12618416 694 @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.\r
dd29f3ed 695 @retval EFI_NO_MEDIA There was a media error.\r
963dbb30 696 @retval Others Other errors as indicated.\r
dd29f3ed 697\r
12618416 698**/\r
6a690e23 699EFI_STATUS\r
700IScsiSessionLogin (\r
701 IN ISCSI_DRIVER_DATA *Private\r
702 );\r
703\r
12618416 704/**\r
705 Build and send the iSCSI login request to the iSCSI target according to\r
706 the current login stage.\r
707\r
db3e605d 708 @param[in] Conn The connection in the iSCSI login phase.\r
12618416 709\r
710 @retval EFI_SUCCESS The iSCSI login request PDU is built and sent on this\r
711 connection.\r
12618416 712 @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.\r
db3e605d 713 @retval EFI_DEVICE_ERROR Some kind of device error happened.\r
12618416 714**/\r
6a690e23 715EFI_STATUS\r
716IScsiSendLoginReq (\r
717 IN ISCSI_CONNECTION *Conn\r
718 );\r
719\r
12618416 720/**\r
721 Receive and process the iSCSI login response.\r
722\r
db3e605d 723 @param[in] Conn The connection in the iSCSI login phase.\r
724 \r
12618416 725 @retval EFI_SUCCESS The iSCSI login response PDU is received and processed.\r
963dbb30 726 @retval Others Other errors as indicated.\r
12618416 727**/\r
6a690e23 728EFI_STATUS\r
729IScsiReceiveLoginRsp (\r
730 IN ISCSI_CONNECTION *Conn\r
731 );\r
732\r
12618416 733/**\r
734 Add an iSCSI key-value pair as a string into the data segment of the Login Request PDU.\r
735 The DataSegmentLength and the actual size of the net buffer containing this PDU will be\r
736 updated.\r
737\r
c5de0d55 738 @param[in, out] Pdu The iSCSI PDU whose data segment the key-value pair will\r
12618416 739 be added to.\r
c5de0d55 740 @param[in] Key The key name string.\r
741 @param[in] Value The value string.\r
12618416 742\r
743 @retval EFI_SUCCESS The key-valu pair is added to the PDU's datasegment and\r
744 the correspondence length fields are updated.\r
12618416 745 @retval EFI_OUT_OF_RESOURCES There is not enough space in the PDU to add the key-value\r
746 pair.\r
12618416 747**/\r
6a690e23 748EFI_STATUS\r
749IScsiAddKeyValuePair (\r
c5de0d55 750 IN OUT NET_BUF *Pdu,\r
6a690e23 751 IN CHAR8 *Key,\r
752 IN CHAR8 *Value\r
753 );\r
754\r
12618416 755/**\r
756 Prepare the iSCSI login request to be sent according to the current login status.\r
757\r
c5de0d55 758 @param[in, out] Conn The connection in the iSCSI login phase.\r
12618416 759\r
db3e605d 760 @return The pointer to the net buffer containing the iSCSI login request built.\r
963dbb30 761 @retval Others Other errors as indicated.\r
12618416 762**/\r
763NET_BUF *\r
6a690e23 764IScsiPrepareLoginReq (\r
c5de0d55 765 IN OUT ISCSI_CONNECTION *Conn\r
6a690e23 766 );\r
767\r
12618416 768/**\r
769 Process the iSCSI Login Response.\r
770\r
c5de0d55 771 @param[in, out] Conn The connection on which the iSCSI login response is received.\r
772 @param[in, out] Pdu The iSCSI login response PDU.\r
12618416 773\r
774 @retval EFI_SUCCESS The iSCSI login response PDU is processed and all check are passed.\r
12618416 775 @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error happened.\r
db3e605d 776 @retval EFI_MEDIA_CHANGED Target is redirected.\r
963dbb30 777 @retval Others Other errors as indicated.\r
12618416 778**/\r
6a690e23 779EFI_STATUS\r
780IScsiProcessLoginRsp (\r
c5de0d55 781 IN OUT ISCSI_CONNECTION *Conn,\r
782 IN OUT NET_BUF *Pdu\r
6a690e23 783 );\r
784\r
12618416 785/**\r
786 Updated the target information according the data received in the iSCSI\r
787 login response with an target redirection status.\r
788\r
c5de0d55 789 @param[in, out] Session The iSCSI session.\r
790 @param[in] Data The data segment which should contain the\r
791 TargetAddress key-value list.\r
792 @param[in] Len Length of the data.\r
db3e605d 793 \r
12618416 794 @retval EFI_SUCCESS The target address is updated.\r
12618416 795 @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.\r
12618416 796 @retval EFI_NOT_FOUND The TargetAddress key is not found.\r
963dbb30 797 @retval Others Other errors as indicated.\r
12618416 798**/\r
6a690e23 799EFI_STATUS\r
800IScsiUpdateTargetAddress (\r
c5de0d55 801 IN OUT ISCSI_SESSION *Session,\r
802 IN CHAR8 *Data,\r
803 IN UINT32 Len\r
6a690e23 804 );\r
805\r
12618416 806/**\r
807 The callback function to free the net buffer list.\r
808\r
db3e605d 809 @param[in] Arg The opaque parameter.\r
12618416 810**/\r
6a690e23 811VOID\r
e798cd87 812EFIAPI\r
6a690e23 813IScsiFreeNbufList (\r
814 VOID *Arg\r
815 );\r
816\r
12618416 817/**\r
818 Receive an iSCSI response PDU. An iSCSI response PDU contains an iSCSI PDU header and\r
819 an optional data segment. The two parts will be put into two blocks of buffers in the\r
820 net buffer. The digest check will be conducted in this function if needed and the digests\r
821 will be trimmed from the PDU buffer.\r
822\r
db3e605d 823 @param[in] Conn The iSCSI connection to receive data from.\r
824 @param[out] Pdu The received iSCSI pdu.\r
825 @param[in] Context The context used to describe information on the caller provided\r
12618416 826 buffer to receive data segment of the iSCSI pdu, it's optional.\r
db3e605d 827 @param[in] HeaderDigest Whether there will be header digest received.\r
828 @param[in] DataDigest Whether there will be data digest.\r
829 @param[in] TimeoutEvent The timeout event, it's optional.\r
12618416 830\r
db3e605d 831 @retval EFI_SUCCESS An iSCSI pdu is received.\r
832 @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.\r
833 @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error happened.\r
963dbb30 834 @retval Others Other errors as indicated.\r
12618416 835**/\r
6a690e23 836EFI_STATUS\r
837IScsiReceivePdu (\r
838 IN ISCSI_CONNECTION *Conn,\r
839 OUT NET_BUF **Pdu,\r
840 IN ISCSI_IN_BUFFER_CONTEXT *Context, OPTIONAL\r
841 IN BOOLEAN HeaderDigest,\r
842 IN BOOLEAN DataDigest,\r
843 IN EFI_EVENT TimeoutEvent OPTIONAL\r
844 );\r
845\r
12618416 846/**\r
847 Check and get the result of the prameter negotiation.\r
848\r
c5de0d55 849 @param[in, out] Conn The connection in iSCSI login.\r
12618416 850\r
db3e605d 851 @retval EFI_SUCCESS The parmeter check is passed and negotiation is finished.\r
852 @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error happened.\r
853 @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.\r
12618416 854**/\r
6a690e23 855EFI_STATUS\r
856IScsiCheckOpParams (\r
c5de0d55 857 IN OUT ISCSI_CONNECTION *Conn\r
6a690e23 858 );\r
859\r
12618416 860/**\r
861 Fill the oprational prameters.\r
862\r
c5de0d55 863 @param[in] Conn The connection in iSCSI login.\r
864 @param[in, out] Pdu The iSCSI login request PDU to fill the parameters.\r
12618416 865\r
866 @retval EFI_SUCCESS The parmeters are filled into the iSCSI login request PDU.\r
12618416 867**/\r
6a690e23 868EFI_STATUS\r
869IScsiFillOpParams (\r
870 IN ISCSI_CONNECTION *Conn,\r
c5de0d55 871 IN OUT NET_BUF *Pdu\r
6a690e23 872 );\r
873\r
12618416 874/**\r
875 Pad the iSCSI AHS or data segment to an integer number of 4 byte words.\r
876\r
c5de0d55 877 @param[in, out] Pdu The iSCSI pdu which contains segments to pad.\r
878 @param[in] Len The length of the last semgnet in the PDU.\r
12618416 879\r
880 @retval EFI_SUCCESS The segment is padded or no need to pad it.\r
12618416 881 @retval EFI_OUT_OF_RESOURCES There is not enough remaining free space to add the\r
882 padding bytes.\r
12618416 883**/\r
6a690e23 884EFI_STATUS\r
885IScsiPadSegment (\r
c5de0d55 886 IN OUT NET_BUF *Pdu,\r
887 IN UINT32 Len\r
6a690e23 888 );\r
889\r
12618416 890/**\r
891 Build a key-value list from the data segment.\r
892\r
db3e605d 893 @param[in] Data The data segment containing the key-value pairs.\r
894 @param[in] Len Length of the data segment.\r
12618416 895\r
db3e605d 896 @return The key-value list.\r
963dbb30 897 @retval NULL Other errors as indicated.\r
12618416 898**/\r
899LIST_ENTRY *\r
6a690e23 900IScsiBuildKeyValueList (\r
901 IN CHAR8 *Data,\r
902 IN UINT32 Len\r
903 );\r
904\r
12618416 905/**\r
906 Get the value string by the key name from the key-value list. If found,\r
907 the key-value entry will be removed from the list.\r
908\r
c5de0d55 909 @param[in, out] KeyValueList The key-value list.\r
910 @param[in] Key The key name to find.\r
12618416 911\r
db3e605d 912 @return The value string.\r
12618416 913**/\r
914CHAR8 *\r
6a690e23 915IScsiGetValueByKeyFromList (\r
c5de0d55 916 IN OUT LIST_ENTRY *KeyValueList,\r
6a690e23 917 IN CHAR8 *Key\r
918 );\r
919\r
12618416 920/**\r
921 Free the key-value list.\r
922\r
db3e605d 923 @param[in] KeyValueList The key-value list.\r
12618416 924**/\r
6a690e23 925VOID\r
926IScsiFreeKeyValueList (\r
e48e37fc 927 IN LIST_ENTRY *KeyValueList\r
6a690e23 928 );\r
929\r
12618416 930/**\r
931 Normalize the iSCSI name according to RFC.\r
932\r
c5de0d55 933 @param[in, out] Name The iSCSI name.\r
934 @param[in] Len length of the iSCSI name.\r
12618416 935\r
936 @retval EFI_SUCCESS The iSCSI name is valid and normalized.\r
12618416 937 @retval EFI_PROTOCOL_ERROR The iSCSI name is mal-formatted or not in the IQN format.\r
12618416 938**/\r
6a690e23 939EFI_STATUS\r
940IScsiNormalizeName (\r
c5de0d55 941 IN OUT CHAR8 *Name,\r
942 IN UINTN Len\r
6a690e23 943 );\r
944\r
12618416 945/**\r
946 Execute the SCSI command issued through the EXT SCSI PASS THRU protocol.\r
947\r
db3e605d 948 @param[in] PassThru The EXT SCSI PASS THRU protocol.\r
949 @param[in] Target The target ID.\r
950 @param[in] Lun The LUN.\r
951 @param[in, out] Packet The request packet containing IO request, SCSI command\r
952 buffer and buffers to read/write.\r
953 \r
954 @retval EFI_SUCCES The SCSI command is executed and the result is updated to \r
955 the Packet.\r
c5de0d55 956 @retval EFI_DEVICE_ERROR Session state was not as required.\r
db3e605d 957 @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.\r
963dbb30 958 @retval Others Other errors as indicated.\r
12618416 959**/\r
6a690e23 960EFI_STATUS\r
961IScsiExecuteScsiCommand (\r
962 IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *PassThru,\r
963 IN UINT8 *Target,\r
964 IN UINT64 Lun,\r
965 IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet\r
966 );\r
967\r
12618416 968/**\r
969 Reinstate the session on some error.\r
970\r
c5de0d55 971 @param[in, out] Private The iSCSI driver data.\r
12618416 972\r
973 @retval EFI_SUCCES The session is reinstated from some error.\r
db3e605d 974 @retval Other Reinstatement failed.\r
12618416 975**/\r
6a690e23 976EFI_STATUS\r
977IScsiSessionReinstatement (\r
c5de0d55 978 IN OUT ISCSI_DRIVER_DATA *Private\r
6a690e23 979 );\r
980\r
12618416 981/**\r
982 Initialize some session parameters before login.\r
983\r
963dbb30 984 @param[in, out] Session The iSCSI session.\r
985 @param[in] Recovery Whether the request is from a fresh new start or recovery.\r
12618416 986**/\r
6a690e23 987VOID\r
988IScsiSessionInit (\r
963dbb30 989 IN OUT ISCSI_SESSION *Session,\r
990 IN BOOLEAN Recovery\r
6a690e23 991 );\r
963dbb30 992 \r
12618416 993/**\r
994 Abort the iSCSI session, that is, reset all the connection and free the\r
995 resources.\r
996\r
c5de0d55 997 @param[in, out] Session The iSCSI session.\r
12618416 998\r
999 @retval EFI_SUCCES The session is aborted.\r
12618416 1000**/\r
6a690e23 1001EFI_STATUS\r
1002IScsiSessionAbort (\r
c5de0d55 1003 IN OUT ISCSI_SESSION *Session\r
6a690e23 1004 );\r
1005\r
1006#endif\r