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