]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/iScsi/IScsiProto.h
UEFI HII: Merge UEFI HII support changes from branch.
[mirror_edk2.git] / MdeModulePkg / Universal / iScsi / IScsiProto.h
CommitLineData
6a690e23 1/*++\r
2\r
3Copyright (c) 2007 Intel Corporation. All rights reserved\r
4This software and associated documentation (if any) is furnished\r
5under a license and may only be used or copied in accordance\r
6with the terms of the license. Except as permitted by such\r
7license, no part of this software or documentation may be\r
8reproduced, stored in a retrieval system, or transmitted in any\r
9form or by any means without the express written consent of\r
10Intel Corporation.\r
11\r
12Module Name:\r
13\r
14 IScsiProto.h\r
15\r
16Abstract:\r
17\r
18 Protocol definitions for iSCSI driver, mainly from RFC3720.\r
19\r
20--*/\r
21\r
22#ifndef _ISCSI_PROTO_H_\r
23#define _ISCSI_PROTO_H_\r
24\r
25#include <protocol/ScsiPassThruExt.h>\r
26\r
27//\r
28// RFC 1982 Serial Number Arithmetic, SERIAL_BITS = 32\r
29//\r
30#define ISCSI_SEQ_EQ(s1, s2) ((s1) == (s2))\r
31#define ISCSI_SEQ_LT(s1, s2) \\r
32 ( \\r
33 (((INT32) (s1) < (INT32) (s2)) && (s2 - s1) < (1 << 31)) || \\r
34 (((INT32) (s1) > (INT32) (s2)) && (s1 - s2) > (1 << 31)) \\r
35 )\r
36#define ISCSI_SEQ_GT(s1, s2) \\r
37 ( \\r
38 (((INT32) (s1) < (INT32) (s2)) && (s2 - s1) > (1 << 31)) || \\r
39 (((INT32) (s1) > (INT32) (s2)) && (s1 - s2) < (1 << 31)) \\r
40 )\r
41\r
42#define ISCSI_WELL_KNOWN_PORT 3260\r
43#define ISCSI_MAX_CONNS_PER_SESSION 1\r
44\r
45#define DEFAULT_MAX_RECV_DATA_SEG_LEN 8192\r
46#define MAX_RECV_DATA_SEG_LEN_IN_FFP 65536\r
47#define DEFAULT_MAX_OUTSTANDING_R2T 1\r
48\r
49#define ISCSI_VERSION_MAX 0x00\r
50#define ISCSI_VERSION_MIN 0x00\r
51\r
52#define ISID_BYTE_0 0 // OUI format\r
53#define ISID_BYTE_1 0\r
54#define ISID_BYTE_2 0xaa\r
55#define ISID_BYTE_3 0x1\r
56\r
57#define ISCSI_KEY_AUTH_METHOD "AuthMethod"\r
58#define ISCSI_KEY_HEADER_DIGEST "HeaderDigest"\r
59#define ISCSI_KEY_DATA_DIGEST "DataDigest"\r
60#define ISCSI_KEY_MAX_CONNECTIONS "MaxConnections"\r
61#define ISCSI_KEY_TARGET_NAME "TargetName"\r
62#define ISCSI_KEY_INITIATOR_NAME "InitiatorName"\r
63#define ISCSI_KEY_TARGET_ALIAS "TargetAlias"\r
64#define ISCSI_KEY_INITIATOR_ALIAS "InitiatorAlias"\r
65#define ISCSI_KEY_TARGET_ADDRESS "TargetAddress"\r
66#define ISCSI_KEY_INITIAL_R2T "InitialR2T"\r
67#define ISCSI_KEY_IMMEDIATE_DATA "ImmediateData"\r
68#define ISCSI_KEY_TARGET_PORTAL_GROUP_TAG "TargetPortalGroupTag"\r
69#define ISCSI_KEY_MAX_BURST_LENGTH "MaxBurstLength"\r
70#define ISCSI_KEY_FIRST_BURST_LENGTH "FirstBurstLength"\r
71#define ISCSI_KEY_DEFAULT_TIME2WAIT "DefaultTime2Wait"\r
72#define ISCSI_KEY_DEFAULT_TIME2RETAIN "DefaultTime2Retain"\r
73#define ISCSI_KEY_MAX_OUTSTANDING_R2T "MaxOutstandingR2T"\r
74#define ISCSI_KEY_DATA_PDU_IN_ORDER "DataPDUInOrder"\r
75#define ISCSI_KEY_DATA_SEQUENCE_IN_ORDER "DataSequenceInOrder"\r
76#define ISCSI_KEY_ERROR_RECOVERY_LEVEL "ErrorRecoveryLevel"\r
77#define ISCSI_KEY_SESSION_TYPE "SessionType"\r
78#define ISCSI_KEY_MAX_RECV_DATA_SEGMENT_LENGTH "MaxRecvDataSegmentLength"\r
79\r
80#define ISCSI_KEY_VALUE_NONE "None"\r
81\r
82//\r
83// connection state for initiator\r
84//\r
85typedef enum {\r
86 CONN_STATE_FREE,\r
87 CONN_STATE_XPT_WAIT,\r
88 CONN_STATE_IN_LOGIN,\r
89 CONN_STATE_LOGGED_IN,\r
90 CONN_STATE_IN_LOGOUT,\r
91 CONN_STATE_LOGOUT_REQUESTED,\r
92 CONN_STATE_CLEANUP_WAIT,\r
93 CONN_STATE_IN_CLEANUP\r
94} CONNECTION_STATE;\r
95\r
96//\r
97// session state for initiator\r
98//\r
99typedef enum {\r
100 SESSION_STATE_FREE,\r
101 SESSION_STATE_LOGGED_IN,\r
102 SESSION_STATE_FAILED\r
103} SESSION_STATE;\r
104\r
105typedef enum {\r
106 DataIn = 0,\r
107 DataOut = 1,\r
108 DataBi = 2\r
109} DATA_DIRECTION;\r
110\r
111#define ISCSI_RESERVED_TAG 0xffffffff\r
112\r
113#define ISCSI_REQ_IMMEDIATE 0x40\r
114#define ISCSI_OPCODE_MASK 0x3F\r
115\r
116#define ISCSI_SET_OPCODE(PduHdr, Op, Flgs) ((((ISCSI_BASIC_HEADER *) (PduHdr))->OpCode) = ((Op) | (Flgs)))\r
117#define ISCSI_GET_OPCODE(PduHdr) ((((ISCSI_BASIC_HEADER *) (PduHdr))->OpCode) & ISCSI_OPCODE_MASK)\r
118#define ISCSI_CHECK_OPCODE(PduHdr, Op) ((((PduHdr)->OpCode) & ISCSI_OPCODE_MASK) == (Op))\r
119#define ISCSI_IMMEDIATE_ON(PduHdr) ((PduHdr)->OpCode & ISCSI_REQ_IMMEDIATE)\r
120#define ISCSI_SET_FLAG(PduHdr, Flag) (((ISCSI_BASIC_HEADER *) (PduHdr))->Flags |= (Flag))\r
121#define ISCSI_CLEAR_FLAG(PduHdr, Flag) (((ISCSI_BASIC_HEADER *) (PduHdr))->Flags &= ~(Flag))\r
93e3992d 122#define ISCSI_FLAG_ON(PduHdr, Flag) ((((ISCSI_BASIC_HEADER *) (PduHdr))->Flags & (Flag)) == (Flag))\r
123#define ISCSI_SET_STAGES(PduHdr, Cur, Nxt) ((PduHdr)->Flags |= ((Cur) << 2 | (Nxt)))\r
6a690e23 124#define ISCSI_GET_CURRENT_STAGE(PduHdr) (((PduHdr)->Flags >> 2) & 0x3)\r
125#define ISCSI_GET_NEXT_STAGE(PduHdr) (((PduHdr)->Flags) & 0x3)\r
126\r
127#define ISCSI_GET_PAD_LEN(DataLen) ((~(DataLen) + 1) & 0x3)\r
128#define ISCSI_ROUNDUP(DataLen) (((DataLen) + 3) &~(0x3))\r
129\r
130#define HTON24(Dst, Src) \\r
131 do { \\r
93e3992d 132 (Dst)[0] = (UINT8) ((Src) >> 16) & 0xFF; \\r
133 (Dst)[1] = (UINT8) ((Src) >> 8) & 0xFF; \\r
134 (Dst)[2] = (UINT8) (Src) & 0xFF; \\r
6a690e23 135 } while (0);\r
136\r
137#define NTOH24(src) (((src)[0] << 16) | ((src)[1] << 8) | ((src)[2]))\r
138\r
139#define ISCSI_GET_DATASEG_LEN(PduHdr) NTOH24 (((ISCSI_BASIC_HEADER *) (PduHdr))->DataSegmentLength)\r
140#define ISCSI_SET_DATASEG_LEN(PduHdr, Len) HTON24 (((ISCSI_BASIC_HEADER *) (PduHdr))->DataSegmentLength, (Len))\r
141\r
142//\r
143// initiator opcodes\r
144//\r
145#define ISCSI_OPCODE_NOP_OUT 0x00\r
146#define ISCSI_OPCODE_SCSI_CMD 0x01\r
147#define ISCSI_OPCODE_SCSI_TMF_REQ 0x02\r
148#define ISCSI_OPCODE_LOGIN_REQ 0x03\r
149#define ISCSI_OPCODE_TEXT_REQ 0x04\r
150#define ISCSI_OPCODE_SCSI_DATA_OUT 0x05\r
151#define ISCSI_OPCODE_LOGOUT_REQ 0x06\r
152#define ISCSI_OPCODE_SNACK_REQ 0x10\r
153#define ISCSI_OPCODE_VENDOR_I0 0x1c\r
154#define ISCSI_OPCODE_VENDOR_I1 0x1d\r
155#define ISCSI_OPCODE_VENDOR_I2 0x1e\r
156\r
157//\r
158// target opcodes\r
159//\r
160#define ISCSI_OPCODE_NOP_IN 0x20\r
161#define ISCSI_OPCODE_SCSI_RSP 0x21\r
162#define ISCSI_OPCODE_SCSI_TMF_RSP 0x22\r
163#define ISCSI_OPCODE_LOGIN_RSP 0x23\r
164#define ISCSI_OPCODE_TEXT_RSP 0x24\r
165#define ISCSI_OPCODE_SCSI_DATA_IN 0x25\r
166#define ISCSI_OPCODE_LOGOUT_RSP 0x26\r
167#define ISCSI_OPCODE_R2T 0x31\r
168#define ISCSI_OPCODE_ASYNC_MSG 0x32\r
169#define ISCSI_OPCODE_VENDOR_T0 0x3c\r
170#define ISCSI_OPCODE_VENDOR_T1 0x3d\r
171#define ISCSI_OPCODE_VENDOR_T2 0x3e\r
172#define ISCSI_OPCODE_REJECT 0x3f\r
173\r
174#define ISCSI_BHS_FLAG_FINAL 0x80\r
175\r
176//\r
177// iSCSI Basic Header Segment\r
178//\r
179typedef struct _ISCSI_BASIC_HEADER {\r
180 UINT8 OpCode;\r
181 UINT8 Flags;\r
182 UINT16 OpCodeSpecific1;\r
183 UINT8 TotalAHSLength;\r
184 UINT8 DataSegmentLength[3];\r
185 UINT8 Lun[8];\r
186 UINT32 InitiatorTaskTag;\r
187 UINT32 OpCodeSpecific2[7];\r
188} ISCSI_BASIC_HEADER;\r
189\r
190//\r
191// Defined AHS types, others are reserved.\r
192//\r
193#define ISCSI_AHS_TYPE_EXT_CDB 0x1\r
194#define ISCSI_AHS_TYPE_BI_EXP_READ_DATA_LEN 0x2\r
195\r
196typedef struct _ISCSI_ADDTIONAL_HEADER {\r
197 UINT16 Length;\r
198 UINT8 Type;\r
199 UINT8 TypeSpecific[1];\r
200} ISCSI_ADDITIONAL_HEADER;\r
201\r
202typedef struct _ISCSI_BI_EXP_READ_DATA_LEN_AHS {\r
203 UINT16 Length;\r
204 UINT8 Type;\r
205 UINT8 Reserved;\r
206 UINT32 ExpReadDataLength;\r
207} ISCSI_BI_EXP_READ_DATA_LEN_AHS;\r
208\r
209#define SCSI_CMD_PDU_FLAG_READ 0x40\r
210#define SCSI_CMD_PDU_FLAG_WRITE 0x20\r
211\r
212#define ISCSI_CMD_PDU_TASK_ATTR_MASK 0x07\r
213\r
214//\r
215// task attributes\r
216//\r
217#define ISCSI_TASK_ATTR_UNTAGGED 0x00\r
218#define ISCSI_TASK_ATTR_SIMPLE 0x01\r
219#define ISCSI_TASK_ATTR_ORDERD 0x02\r
220#define ISCSI_TASK_ATTR_HOQ 0x03\r
221#define ISCSI_TASK_ATTR_ACA 0x04\r
222\r
223//\r
224// SCSI Command\r
225//\r
226typedef struct _SCSI_COMMAND {\r
227 UINT8 OpCode;\r
228 UINT8 Flags;\r
229 UINT16 Reserved;\r
230 UINT8 TotalAHSLength;\r
231 UINT8 DataSegmentLength[3];\r
232 UINT8 Lun[8];\r
233 UINT32 InitiatorTaskTag;\r
234 UINT32 ExpDataXferLength;\r
235 UINT32 CmdSN;\r
236 UINT32 ExpStatSN;\r
237 UINT8 CDB[16];\r
238} SCSI_COMMAND;\r
239\r
240//\r
241// flag bit definitions in SCSI response\r
242//\r
243#define SCSI_RSP_PDU_FLAG_BI_READ_OVERFLOW 0x10\r
244#define SCSI_RSP_PDU_FLAG_BI_READ_UNDERFLOW 0x08\r
245#define SCSI_RSP_PDU_FLAG_OVERFLOW 0x04\r
246#define SCSI_RSP_PDU_FLAG_UNDERFLOW 0x02\r
247\r
248//\r
249// iSCSI service response codes\r
250//\r
251#define ISCSI_SERVICE_RSP_COMMAND_COMPLETE_AT_TARGET 0x00\r
252#define ISCSI_SERVICE_RSP_TARGET_FAILURE 0x01\r
253\r
254//\r
255// SCSI Response\r
256//\r
257typedef struct _SCSI_RESPONSE {\r
258 UINT8 OpCode;\r
259 UINT8 Flags;\r
260 UINT8 Response;\r
261 UINT8 Status;\r
262 UINT8 TotalAHSLength;\r
263 UINT8 DataSegmentLength[3];\r
264 UINT8 Reserved[8];\r
265 UINT32 InitiatorTaskTag;\r
266 UINT32 SNACKTag;\r
267 UINT32 StatSN;\r
268 UINT32 ExpCmdSN;\r
269 UINT32 MaxCmdSN;\r
270 UINT32 ExpDataSN;\r
271 UINT32 BiReadResidualCount;\r
272 UINT32 ResidualCount;\r
273} SCSI_RESPONSE;\r
274\r
275typedef struct _ISCSI_SENSE_DATA {\r
276 UINT16 Length;\r
277 UINT8 Data[2];\r
278} ISCSI_SENSE_DATA;\r
279\r
280//\r
281// iSCSI Task Managment Function Request\r
282//\r
283typedef struct _ISCSI_TMF_REQUEST {\r
284 UINT8 OpCode;\r
285 UINT8 Fuction;\r
286 UINT16 Reserved1;\r
287 UINT8 TotalAHSLength;\r
288 UINT8 DataSegmentLength[3];\r
289 UINT8 Lun[8];\r
290 UINT32 InitiatorTaskTag;\r
291 UINT32 ReferencedTaskTag;\r
292 UINT32 CmdSN;\r
293 UINT32 ExpStatSN;\r
294 UINT32 RefCmdSN;\r
295 UINT32 ExpDataSN;\r
296 UINT32 Reserved2[2];\r
297} ISCSI_TMF_REQUEST;\r
298\r
299#define ISCSI_TMF_RSP_PDU_RSP_FUNCTION_COMPLETE 0\r
300#define ISCSI_TMF_RSP_PDU_RSP_TASK_NOT_EXIST 1\r
301#define ISCSI_TMF_RSP_PDU_RSP_LUN_NOT_EXIST 2\r
302#define ISCSI_TMF_RSP_PDU_RSP_TASK_STILL_ALLEGIANT 3\r
303#define ISCSI_TMF_RSP_PDU_RSP_TASK_REASSGIN_NOT_SUPPORTED 4\r
304#define ISCSI_TMF_RSP_PDU_RSP_NOT_SUPPORTED 5\r
305#define ISCSI_TMF_RSP_PDU_RSP_FUNCTION_AHTH_FAILED 6\r
306#define ISCSI_TMF_RSP_PDU_RSP_FUNCTION_REJECTED 255\r
307\r
308//\r
309// iSCSI Task Management Function Response\r
310//\r
311typedef struct _ISCSI_TMF_RESPONSE {\r
312 UINT8 OpCode;\r
313 UINT8 Reserved1;\r
314 UINT8 Response;\r
315 UINT8 Reserved2;\r
316 UINT8 TotalAHSLength;\r
317 UINT8 DataSegmentLength[3];\r
318 UINT32 Reserver3[2];\r
319 UINT32 InitiatorTaskTag;\r
320 UINT32 Reserved4;\r
321 UINT32 StatSN;\r
322 UINT32 ExpCmdSN;\r
323 UINT32 MaxCmdSN;\r
324 UINT32 Reserved[3];\r
325} ISCSI_TMF_RESPONSE;\r
326\r
327//\r
328// SCSI Data-Out\r
329//\r
330typedef struct _ISCSI_SCSI_DATA_OUT {\r
331 UINT8 OpCode;\r
332 UINT8 Reserved1[3];\r
333 UINT8 TotalAHSLength;\r
334 UINT8 DataSegmentLength[3];\r
335 UINT8 Lun[8];\r
336 UINT32 InitiatorTaskTag;\r
337 UINT32 TargetTransferTag;\r
338 UINT32 Reserved2;\r
339 UINT32 ExpStatSN;\r
340 UINT32 Reserved3;\r
341 UINT32 DataSN;\r
342 UINT32 BufferOffset;\r
343 UINT32 Reserved4;\r
344} ISCSI_SCSI_DATA_OUT;\r
345\r
346#define SCSI_DATA_IN_PDU_FLAG_ACKKNOWLEDGE 0x40\r
347#define SCSI_DATA_IN_PDU_FLAG_OVERFLOW SCSI_RSP_PDU_FLAG_OVERFLOW\r
348#define SCSI_DATA_IN_PDU_FLAG_UNDERFLOW SCSI_RSP_PDU_FLAG_UNDERFLOW\r
349#define SCSI_DATA_IN_PDU_FLAG_STATUS_VALID 0x01\r
350//\r
351// SCSI Data-In\r
352//\r
353typedef struct _ISCSI_SCSI_DATA_IN {\r
354 UINT8 OpCode;\r
355 UINT8 Flags;\r
356 UINT8 Reserved1;\r
357 UINT8 Status;\r
358 UINT8 TotalAHSLength;\r
359 UINT8 DataSegmentLength[3];\r
360 UINT8 Lun[8];\r
361 UINT32 InitiatorTaskTag;\r
362 UINT32 TargetTransferTag;\r
363 UINT32 StatSN;\r
364 UINT32 ExpCmdSN;\r
365 UINT32 MaxCmdSN;\r
366 UINT32 DataSN;\r
367 UINT32 BufferOffset;\r
368 UINT32 ResidualCount;\r
369} ISCSI_SCSI_DATA_IN;\r
370\r
371#define ISCSI_GET_BUFFER_OFFSET(PduHdr) NTOHL (((ISCSI_SCSI_DATA_IN *) (PduHdr))->BufferOffset)\r
372//\r
373// Ready To Transfer\r
374//\r
375typedef struct _ISCSI_READY_TO_TRANSFER {\r
376 UINT8 OpCode;\r
377 UINT8 Reserved1[3];\r
378 UINT8 TotalAHSLength;\r
379 UINT8 DataSegmentLength[3];\r
380 UINT8 Lun[8];\r
381 UINT32 InitiatorTaskTag;\r
382 UINT32 TargetTransferTag;\r
383 UINT32 StatSN;\r
384 UINT32 ExpCmdSN;\r
385 UINT32 MaxCmdSN;\r
386 UINT32 R2TSN;\r
387 UINT32 BufferOffset;\r
388 UINT32 DesiredDataTransferLength;\r
389} ISCSI_READY_TO_TRANSFER;\r
390\r
391typedef struct _ISCSI_ASYNC_MESSAGE {\r
392 UINT8 OpCode;\r
393 UINT8 Reserved1[8];\r
394 UINT8 TotalAHSLength;\r
395 UINT8 DataSegmentLength[3];\r
396 UINT8 Lun[8];\r
397 UINT32 InitiatorTaskTag;\r
398 UINT32 Reserved2;\r
399 UINT32 StatSN;\r
400 UINT32 ExpCmdSN;\r
401 UINT32 MaxCmdSN;\r
402 UINT8 AsyncEvent;\r
403 UINT8 AsyncVCode;\r
404 UINT16 Parameter1;\r
405 UINT16 Parameter2;\r
406 UINT16 Parameter3;\r
407 UINT32 Reserved3;\r
408} ISCSI_ASYNC_MESSAGE;\r
409\r
410#define ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT 0x80\r
411#define ISCSI_LOGIN_REQ_PDU_FLAG_CONTINUE 0x40\r
412\r
413//\r
414// Login Request\r
415//\r
416typedef struct _ISCSI_LOGIN_REQUEST {\r
417 UINT8 OpCode;\r
418 UINT8 Flags;\r
419 UINT8 VersionMax;\r
420 UINT8 VersionMin;\r
421 UINT8 TotalAHSLength;\r
422 UINT8 DataSegmentLength[3];\r
423 UINT8 ISID[6];\r
424 UINT16 TSIH;\r
425 UINT32 InitiatorTaskTag;\r
426 UINT16 CID;\r
427 UINT16 Reserved1;\r
428 UINT32 CmdSN;\r
429 UINT32 ExpStatSN;\r
430 UINT32 Reserved2[4];\r
431} ISCSI_LOGIN_REQUEST;\r
432\r
433#define ISCSI_LOGIN_RSP_PDU_FLAG_TRANSIT ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT\r
434#define ISCSI_LOGIN_RSP_PDU_FLAG_CONTINUE ISCSI_LOGIN_REQ_PDU_FLAG_CONTINUE\r
435\r
436#define ISCSI_LOGIN_STATUS_SUCCESS 0\r
437#define ISCSI_LOGIN_STATUS_REDIRECTION 1\r
438#define ISCSI_LOGIN_STATUS_INITIATOR_ERROR 2\r
439#define ISCSI_LOGIN_STATUS_TARGET_ERROR 3\r
440\r
441//\r
442// Login Response\r
443//\r
444typedef struct _ISCSI_LOGIN_RESPONSE {\r
445 UINT8 OpCode;\r
446 UINT8 Flags;\r
447 UINT8 VersionMax;\r
448 UINT8 VersionActive;\r
449 UINT8 TotalAHSLength;\r
450 UINT8 DataSegmentLength[3];\r
451 UINT8 ISID[6];\r
452 UINT16 TSIH;\r
453 UINT32 InitiatorTaskTag;\r
454 UINT32 Reserved1;\r
455 UINT32 StatSN;\r
456 UINT32 ExpCmdSN;\r
457 UINT32 MaxCmdSN;\r
458 UINT8 StatusClass;\r
459 UINT8 StatusDetail;\r
460 UINT8 Reserved2[10];\r
461} ISCSI_LOGIN_RESPONSE;\r
462\r
463#define ISCSI_LOGOUT_REASON_CLOSE_SESSION 0\r
464#define ISCSI_LOGOUT_REASON_CLOSE_CONNECTION 1\r
465#define ISCSI_LOGOUT_REASON_REMOVE_CONNECTION_FOR_RECOVERY 2\r
466\r
467//\r
468// Logout Request\r
469//\r
470typedef struct _ISCSI_LOGOUT_REQUEST {\r
471 UINT8 OpCode;\r
472 UINT8 ReasonCode;\r
473 UINT16 Reserved1;\r
474 UINT8 TotalAHSLength;\r
475 UINT8 DataSegmentLength[3];\r
476 UINT32 Reserved2[2];\r
477 UINT32 InitiatorTaskTag;\r
478 UINT16 CID;\r
479 UINT16 Reserved3;\r
480 UINT32 CmdSN;\r
481 UINT32 ExpStatSN;\r
482 UINT32 Reserved4[4];\r
483} ISCSI_LOGOUT_REQUEST;\r
484\r
485#define ISCSI_LOGOUT_RESPONSE_SESSION_CLOSED_SUCCESS 0\r
486#define ISCSI_LOGOUT_RESPONSE_CID_NOT_FOUND 1\r
487#define ISCSI_LOGOUT_RESPONSE_RECOVERY_NOT_SUPPORTED 2\r
488#define ISCSI_LOGOUT_RESPONSE_CLEANUP_FAILED 3\r
489\r
490//\r
491// Logout Response\r
492//\r
493typedef struct _ISCSI_LOGOUT_RESPONSE {\r
494 UINT8 OpCode;\r
495 UINT8 Reserved1;\r
496 UINT8 Response;\r
497 UINT8 Reserved2;\r
498 UINT8 TotalAHSLength;\r
499 UINT8 DataSegmentLength[3];\r
500 UINT32 Reserved3[2];\r
501 UINT32 InitiatorTaskTag;\r
502 UINT32 Reserved4;\r
503 UINT32 StatSN;\r
504 UINT32 ExpCmdSN;\r
505 UINT32 MaxCmdSN;\r
506 UINT32 Reserved5;\r
507 UINT16 Time2Wait;\r
508 UINT16 Time2Retain;\r
509 UINT32 Reserved6;\r
510} ISCSI_LOGOUT_RESPONSE;\r
511\r
512#define ISCSI_SNACK_REQUEST_TYPE_DATA_OR_R2T 0\r
513#define ISCSI_SNACK_REQUEST_TYPE_STATUS 1\r
514#define ISCSI_SNACK_REQUEST_TYPE_DATA_ACK 2\r
515#define ISCSI_SNACK_REQUEST_TYPE_RDATA 3\r
516\r
517//\r
518// SNACK Request\r
519//\r
520typedef struct _ISCSI_SNACK_REQUEST {\r
521 UINT8 OpCode;\r
522 UINT8 Type;\r
523 UINT16 Reserved1;\r
524 UINT8 TotalAHSLength;\r
525 UINT8 DataSegmentLength[3];\r
526 UINT8 Lun[8];\r
527 UINT32 InitiatorTaskTag;\r
528 UINT32 TargetTransferTag;\r
529 UINT32 Reserved2;\r
530 UINT32 ExpStatSN;\r
531 UINT32 Reserved[2];\r
532 UINT32 BegRun;\r
533 UINT32 RunLength;\r
534} ISCSI_SNACK_REQUEST;\r
535\r
536//\r
537// Reject\r
538//\r
539typedef struct _ISCSI_REJECT {\r
540 UINT8 OpCode;\r
541 UINT8 Reserved1;\r
542 UINT8 Reason;\r
543 UINT8 Reserved2;\r
544 UINT8 TotalAHSLength;\r
545 UINT8 DataSegmentLength[3];\r
546 UINT32 Reserved3[2];\r
547 UINT32 InitiatorTaskTag;\r
548 UINT32 Reserved4;\r
549 UINT32 StatSN;\r
550 UINT32 ExpCmdSN;\r
551 UINT32 MaxCmdSN;\r
552 UINT32 DataSN;\r
553 UINT32 Reserved5[2];\r
554} ISCSI_REJECT;\r
555\r
556//\r
557// NOP-Out\r
558//\r
559typedef struct _ISCSI_NOP_OUT {\r
560 UINT8 OpCode;\r
561 UINT8 Reserved1[3];\r
562 UINT8 TotalAHSLength;\r
563 UINT8 DataSegmentLength[3];\r
564 UINT8 Lun[8];\r
565 UINT32 InitiatorTaskTag;\r
566 UINT32 TargetTransferTag;\r
567 UINT32 CmdSN;\r
568 UINT32 ExpStatSN;\r
569 UINT32 Reserved2[4];\r
570} ISCSI_NOP_OUT;\r
571\r
572//\r
573// NOP-In\r
574//\r
575typedef struct _ISCSI_NOP_IN {\r
576 UINT8 OpCode;\r
577 UINT8 Reserved1[3];\r
578 UINT8 TotalAHSLength;\r
579 UINT8 DataSegmentLength[3];\r
580 UINT8 Lun[8];\r
581 UINT32 InitiatorTaskTag;\r
582 UINT32 TargetTransferTag;\r
583 UINT32 StatSN;\r
584 UINT32 ExpCmdSN;\r
585 UINT32 MaxCmdSN;\r
586 UINT32 Reserved2[3];\r
587} ISCSI_NOP_IN;\r
588\r
589#define ISCSI_SECURITY_NEGOTIATION 0\r
590#define ISCSI_LOGIN_OPERATIONAL_NEGOTIATION 1\r
591#define ISCSI_FULL_FEATURE_PHASE 3\r
592\r
593typedef enum {\r
594 ISCSI_DIGEST_NONE,\r
595 ISCSI_DIGEST_CRC32\r
596} ISCSI_DIGEST_TYPE;\r
597\r
598typedef struct _ISCSI_XFER_CONTEXT {\r
599 UINT32 TargetTransferTag;\r
600 UINT32 Offset;\r
601 UINT32 DesiredLength;\r
602 UINT32 ExpDataSN;\r
603} ISCSI_XFER_CONTEXT;\r
604\r
605typedef struct _ISCSI_IN_BUFFER_CONTEXT {\r
606 UINT8 *InData;\r
607 UINT32 InDataLen;\r
608} ISCSI_IN_BUFFER_CONTEXT;\r
609\r
610typedef struct _ISCSI_TCB {\r
611 NET_LIST_ENTRY Link;\r
612\r
613 BOOLEAN SoFarInOrder;\r
614 UINT32 ExpDataSN;\r
615 BOOLEAN FbitReceived;\r
616 BOOLEAN StatusXferd;\r
617 UINT32 ActiveR2Ts;\r
618 UINT32 Response;\r
619 CHAR8 *Reason;\r
620 UINT32 InitiatorTaskTag;\r
621 UINT32 CmdSN;\r
622 UINT32 SNACKTag;\r
623\r
624 ISCSI_XFER_CONTEXT XferContext;\r
625\r
626 ISCSI_CONNECTION *Conn;\r
627} ISCSI_TCB;\r
628\r
629typedef struct _ISCSI_KEY_VALUE_PAIR {\r
630 NET_LIST_ENTRY List;\r
631\r
632 CHAR8 *Key;\r
633 CHAR8 *Value;\r
634} ISCSI_KEY_VALUE_PAIR;\r
635\r
636//\r
637// function prototypes.\r
638//\r
639VOID\r
640IScsiAttatchConnection (\r
641 IN ISCSI_SESSION *Session,\r
642 IN ISCSI_CONNECTION *Conn\r
643 );\r
644\r
645VOID\r
646IScsiDetatchConnection (\r
647 IN ISCSI_CONNECTION *Conn\r
648 );\r
649\r
650EFI_STATUS\r
651IScsiConnLogin (\r
652 IN ISCSI_CONNECTION *Conn\r
653 );\r
654\r
655ISCSI_CONNECTION *\r
656IScsiCreateConnection (\r
657 IN ISCSI_DRIVER_DATA *Private,\r
658 IN ISCSI_SESSION *Session\r
659 );\r
660\r
661VOID\r
662IScsiDestroyConnection (\r
663 IN ISCSI_CONNECTION *Conn\r
664 );\r
665\r
666EFI_STATUS\r
667IScsiSessionLogin (\r
668 IN ISCSI_DRIVER_DATA *Private\r
669 );\r
670\r
671EFI_STATUS\r
672IScsiSendLoginReq (\r
673 IN ISCSI_CONNECTION *Conn\r
674 );\r
675\r
676EFI_STATUS\r
677IScsiReceiveLoginRsp (\r
678 IN ISCSI_CONNECTION *Conn\r
679 );\r
680\r
681EFI_STATUS\r
682IScsiAddKeyValuePair (\r
683 IN NET_BUF *Pdu,\r
684 IN CHAR8 *Key,\r
685 IN CHAR8 *Value\r
686 );\r
687\r
688NET_BUF *\r
689IScsiPrepareLoginReq (\r
690 IN ISCSI_CONNECTION *Conn\r
691 );\r
692\r
693EFI_STATUS\r
694IScsiProcessLoginRsp (\r
695 IN ISCSI_CONNECTION *Conn,\r
696 IN NET_BUF *Pdu\r
697 );\r
698\r
699EFI_STATUS\r
700IScsiUpdateTargetAddress (\r
701 IN ISCSI_SESSION *Session,\r
702 IN CHAR8 *Data,\r
703 IN UINT32 Len\r
704 );\r
705\r
706VOID\r
707IScsiFreeNbufList (\r
708 VOID *Arg\r
709 );\r
710\r
711EFI_STATUS\r
712IScsiReceivePdu (\r
713 IN ISCSI_CONNECTION *Conn,\r
714 OUT NET_BUF **Pdu,\r
715 IN ISCSI_IN_BUFFER_CONTEXT *Context, OPTIONAL\r
716 IN BOOLEAN HeaderDigest,\r
717 IN BOOLEAN DataDigest,\r
718 IN EFI_EVENT TimeoutEvent OPTIONAL\r
719 );\r
720\r
721EFI_STATUS\r
722IScsiCheckOpParams (\r
723 IN ISCSI_CONNECTION *Conn,\r
724 IN BOOLEAN Transit\r
725 );\r
726\r
727EFI_STATUS\r
728IScsiFillOpParams (\r
729 IN ISCSI_CONNECTION *Conn,\r
730 IN NET_BUF *Pdu\r
731 );\r
732\r
733EFI_STATUS\r
734IScsiPadSegment (\r
735 IN NET_BUF *Pdu,\r
736 IN UINT32 Len\r
737 );\r
738\r
739NET_LIST_ENTRY *\r
740IScsiBuildKeyValueList (\r
741 IN CHAR8 *Data,\r
742 IN UINT32 Len\r
743 );\r
744\r
745CHAR8 *\r
746IScsiGetValueByKeyFromList (\r
747 IN NET_LIST_ENTRY *KeyValueList,\r
748 IN CHAR8 *Key\r
749 );\r
750\r
751VOID\r
752IScsiFreeKeyValueList (\r
753 IN NET_LIST_ENTRY *KeyValueList\r
754 );\r
755\r
756EFI_STATUS\r
757IScsiNormalizeName (\r
758 IN CHAR8 *Name,\r
759 IN UINTN Len\r
760 );\r
761\r
762EFI_STATUS\r
763IScsiExecuteScsiCommand (\r
764 IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *PassThru,\r
765 IN UINT8 *Target,\r
766 IN UINT64 Lun,\r
767 IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet\r
768 );\r
769\r
770EFI_STATUS\r
771IScsiSessionReinstatement (\r
772 IN ISCSI_DRIVER_DATA *Private\r
773 );\r
774\r
775VOID\r
776IScsiSessionInit (\r
777 IN ISCSI_SESSION *Session,\r
778 IN BOOLEAN Recovery\r
779 );\r
780\r
781EFI_STATUS\r
782IScsiSessionAbort (\r
783 IN ISCSI_SESSION *Session\r
784 );\r
785\r
786#endif\r