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