]> git.proxmox.com Git - mirror_edk2.git/blobdiff - NetworkPkg/IScsiDxe/IScsiProto.c
NetworkPkg/IScsiDxe: support multiple hash algorithms for CHAP
[mirror_edk2.git] / NetworkPkg / IScsiDxe / IScsiProto.c
index 7619360568d8efd6de55f41764b1bf7a79bc8d02..e62736bc041f8ec665ef35832189f27fedcc0ead 100644 (file)
@@ -2,13 +2,7 @@
   The implementation of iSCSI protocol based on RFC3720.\r
 \r
 Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
@@ -423,6 +417,26 @@ ON_EXIT:
   return Status;\r
 }\r
 \r
+/**\r
+  Re-set any stateful session-level authentication information that is used by\r
+  the leading login / leading connection.\r
+\r
+  (Note that this driver only supports a single connection per session -- see\r
+  ISCSI_MAX_CONNS_PER_SESSION.)\r
+\r
+  @param[in,out] Session  The iSCSI session.\r
+**/\r
+STATIC\r
+VOID\r
+IScsiSessionResetAuthData (\r
+  IN OUT ISCSI_SESSION *Session\r
+  )\r
+{\r
+  if (Session->AuthType == ISCSI_AUTH_TYPE_CHAP) {\r
+    Session->AuthData.CHAP.Hash = NULL;\r
+  }\r
+}\r
+\r
 /**\r
   Login the iSCSI session.\r
 \r
@@ -474,8 +488,9 @@ IScsiSessionLogin (
     IScsiAttatchConnection (Session, Conn);\r
 \r
     //\r
-    // Login througth the newly created connection.\r
+    // Login through the newly created connection.\r
     //\r
+    IScsiSessionResetAuthData (Session);\r
     Status = IScsiConnLogin (Conn, Session->ConfigData->SessionConfigData.ConnectTimeout);\r
     if (EFI_ERROR (Status)) {\r
       IScsiConnReset (Conn);\r
@@ -771,7 +786,7 @@ IScsiPrepareLoginReq (
   LoginReq->CmdSN             = HTONL (Session->CmdSN);\r
 \r
   //\r
-  // For the first Login Request on a coonection this is ExpStatSN for the\r
+  // For the first Login Request on a connection this is ExpStatSN for the\r
   // old connection, and this field is only valid if the Login Request restarts\r
   // a connection.\r
   // For subsequent Login Requests it is used to acknowledge the Login Responses\r
@@ -947,7 +962,7 @@ IScsiProcessLoginRsp (
     // A Login Response with the C bit set to 1 MUST have the T bit set to 0.\r
     // The CSG in the Login Response MUST be the same with the I-end of this connection.\r
     // The T bit can't be 1 if the last Login Response sent by the initiator doesn't\r
-    // initiate the transistion.\r
+    // initiate the transition.\r
     // The NSG MUST be the same with the I-end of this connection if Transit is required.\r
     // The ISID in the Login Response MUST be the same with this session.\r
     //\r
@@ -1158,13 +1173,13 @@ IScsiUpdateTargetAddress (
     }\r
 \r
     //\r
-    // Save the origial user setting which specifies the proxy/virtual iSCSI target.\r
+    // Save the original user setting which specifies the proxy/virtual iSCSI target.\r
     //\r
     NvData->OriginalTargetPort = NvData->TargetPort;\r
 \r
     if (*TargetAddress == ',') {\r
       //\r
-      // Comma and the portal group tag MUST be ommitted if the TargetAddress is sent\r
+      // Comma and the portal group tag MUST be omitted if the TargetAddress is sent\r
       // as the result of a redirection.\r
       //\r
       continue;\r
@@ -1187,7 +1202,7 @@ IScsiUpdateTargetAddress (
     }\r
 \r
     //\r
-    // Save the origial user setting which specifies the proxy/virtual iSCSI target.\r
+    // Save the original user setting which specifies the proxy/virtual iSCSI target.\r
     //\r
     CopyMem (&NvData->OriginalTargetIp, &NvData->TargetIp, sizeof (EFI_IP_ADDRESS));\r
 \r
@@ -1477,7 +1492,7 @@ ON_EXIT:
 \r
   @param[in, out]  Conn          The connection in iSCSI login.\r
 \r
-  @retval EFI_SUCCESS          The parmeter check is passed and negotiation is finished.\r
+  @retval EFI_SUCCESS          The parameter check is passed and negotiation is finished.\r
   @retval EFI_PROTOCOL_ERROR   Some kind of iSCSI protocol error occurred.\r
   @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.\r
 \r
@@ -1552,7 +1567,7 @@ IScsiCheckOpParams (
     goto ON_ERROR;\r
   }\r
   //\r
-  // ErrorRecoveryLevel: result fuction is Minimum.\r
+  // ErrorRecoveryLevel: result function is Minimum.\r
   //\r
   Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_ERROR_RECOVERY_LEVEL);\r
   if (Value == NULL) {\r
@@ -1596,7 +1611,7 @@ IScsiCheckOpParams (
     Conn->MaxRecvDataSegmentLength = (UINT32) IScsiNetNtoi (Value);\r
   }\r
   //\r
-  // MaxBurstLength: result funtion is Mininum.\r
+  // MaxBurstLength: result function is Minimum.\r
   //\r
   Value = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_MAX_BURST_LENGTH);\r
   if (Value == NULL) {\r
@@ -2096,39 +2111,6 @@ IScsiDelTcb (
 }\r
 \r
 \r
-/**\r
-  Find the task control block by the initator task tag.\r
-\r
-  @param[in]  TcbList         The tcb list.\r
-  @param[in]  InitiatorTaskTag The initiator task tag.\r
-\r
-  @return The task control block found.\r
-  @retval NULL The task control block cannot be found.\r
-\r
-**/\r
-ISCSI_TCB *\r
-IScsiFindTcbByITT (\r
-  IN LIST_ENTRY      *TcbList,\r
-  IN UINT32          InitiatorTaskTag\r
-  )\r
-{\r
-  ISCSI_TCB       *Tcb;\r
-  LIST_ENTRY      *Entry;\r
-\r
-  Tcb = NULL;\r
-\r
-  NET_LIST_FOR_EACH (Entry, TcbList) {\r
-    Tcb = NET_LIST_USER_STRUCT (Entry, ISCSI_TCB, Link);\r
-\r
-    if (Tcb->InitiatorTaskTag == InitiatorTaskTag) {\r
-      break;\r
-    }\r
-  }\r
-\r
-  return Tcb;\r
-}\r
-\r
-\r
 /**\r
   Create a data segment, pad it, and calculate the CRC if needed.\r
 \r
@@ -2288,7 +2270,7 @@ IScsiNewScsiCmdPdu (
 \r
   if (Session->ImmediateData && (Packet->OutTransferLength != 0)) {\r
     //\r
-    // Send immediate data in this SCSI Command PDU. The length of the immeidate\r
+    // Send immediate data in this SCSI Command PDU. The length of the immediate\r
     // data is the minimum of FirstBurstLength, the data length to be xfered, and\r
     // the MaxRecvdataSegmentLength on this connection.\r
     //\r
@@ -2533,7 +2515,7 @@ ON_EXIT:
   @param[in]  Lun             The LUN the data will be sent to.\r
   @param[in]  Tcb             The task control block.\r
 \r
-  @retval EFI_SUCCES           The data is sent out to the LUN.\r
+  @retval EFI_SUCCESS          The data is sent out to the LUN.\r
   @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.\r
   @retval Others               Other errors as indicated.\r
 \r
@@ -2586,9 +2568,9 @@ IScsiSendDataOutPduSequence (
   @param[in]        Tcb      The task control block.\r
   @param[in, out]   Packet   The EXT SCSI PASS THRU request packet.\r
 \r
-  @retval EFI_SUCCES           The check on the Data IN PDU is passed and some update\r
+  @retval EFI_SUCCESS          The check on the Data IN PDU is passed and some update\r
                                actions are taken.\r
-  @retval EFI_PROTOCOL_ERROR   Some kind of iSCSI protocol errror occurred.\r
+  @retval EFI_PROTOCOL_ERROR   Some kind of iSCSI protocol error occurred.\r
   @retval EFI_BAD_BUFFER_SIZEE The buffer was not the proper size for the request.\r
   @retval Others               Other errors as indicated.\r
 \r
@@ -2678,8 +2660,8 @@ IScsiOnDataInRcvd (
   @param[in]       Lun       The Lun.\r
   @param[in, out]  Packet    The EXT SCSI PASS THRU request packet.\r
 \r
-  @retval EFI_SUCCES         The R2T PDU is valid and the solicited data is sent out.\r
-  @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol errror occurred.\r
+  @retval EFI_SUCCESS        The R2T PDU is valid and the solicited data is sent out.\r
+  @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error occurred.\r
   @retval Others             Other errors as indicated.\r
 \r
 **/\r
@@ -2746,8 +2728,8 @@ IScsiOnR2TRcvd (
   @param[in]       Tcb      The task control block.\r
   @param[in, out]  Packet   The EXT SCSI PASS THRU request packet.\r
 \r
-  @retval EFI_SUCCES         The Response PDU is processed.\r
-  @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol errror occurred.\r
+  @retval EFI_SUCCESS        The Response PDU is processed.\r
+  @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error occurred.\r
   @retval EFI_BAD_BUFFER_SIZEE The buffer was not the proper size for the request.\r
   @retval Others             Other errors as indicated.\r
 \r
@@ -2854,9 +2836,9 @@ IScsiOnScsiRspRcvd (
   @param[in]  Pdu            The NOP In PDU received.\r
   @param[in]  Tcb            The task control block.\r
 \r
-  @retval EFI_SUCCES         The NOP In PDU is processed and the related sequence\r
+  @retval EFI_SUCCESS        The NOP In PDU is processed and the related sequence\r
                              numbers are updated.\r
-  @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol errror occurred.\r
+  @retval EFI_PROTOCOL_ERROR Some kind of iSCSI protocol error occurred.\r
 \r
 **/\r
 EFI_STATUS\r
@@ -2903,7 +2885,7 @@ IScsiOnNopInRcvd (
   @param[in, out]  Packet    The request packet containing IO request, SCSI command\r
                              buffer and buffers to read/write.\r
 \r
-  @retval EFI_SUCCES           The SCSI command is executed and the result is updated to\r
+  @retval EFI_SUCCESS          The SCSI command is executed and the result is updated to\r
                                the Packet.\r
   @retval EFI_DEVICE_ERROR     Session state was not as required.\r
   @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.\r