]> git.proxmox.com Git - mirror_edk2.git/blobdiff - NetworkPkg/IScsiDxe/IScsiProto.c
MdeModulePkg/EbcDxe: reorganize EBC header definitions
[mirror_edk2.git] / NetworkPkg / IScsiDxe / IScsiProto.c
index 50923654644194d77b2bc8cc77ea39d660dbc457..a67bbd5c8700ad98b06eb67a4dcac4a4a830ad32 100644 (file)
@@ -786,7 +786,7 @@ IScsiPrepareLoginReq (
 \r
   case ISCSI_LOGIN_OPERATIONAL_NEGOTIATION:\r
     //\r
-    // Only negotiate the paramter once.\r
+    // Only negotiate the parameter once.\r
     //\r
     if (!Conn->ParamNegotiated) {\r
       IScsiFillOpParams (Conn, Nbuf);\r
@@ -1069,12 +1069,13 @@ IScsiUpdateTargetAddress (
   IN     UINT32                Len\r
   )\r
 {\r
-  LIST_ENTRY      *KeyValueList;\r
-  CHAR8           *TargetAddress;\r
-  CHAR8           *IpStr;\r
-  EFI_STATUS      Status;\r
-  UINTN           Number;\r
-  UINT8           IpMode;\r
+  LIST_ENTRY                   *KeyValueList;\r
+  CHAR8                        *TargetAddress;\r
+  CHAR8                        *IpStr;\r
+  EFI_STATUS                   Status;\r
+  UINTN                        Number;\r
+  UINT8                        IpMode;\r
+  ISCSI_SESSION_CONFIG_NVDATA  *NvData;\r
 \r
   KeyValueList = IScsiBuildKeyValueList (Data, Len);\r
   if (KeyValueList == NULL) {\r
@@ -1082,31 +1083,63 @@ IScsiUpdateTargetAddress (
   }\r
 \r
   Status = EFI_NOT_FOUND;\r
-\r
+  NvData = &Session->ConfigData->SessionConfigData;\r
\r
   while (TRUE) {\r
     TargetAddress = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_TARGET_ADDRESS);\r
     if (TargetAddress == NULL) {\r
       break;\r
     }\r
 \r
-    if (!NET_IS_DIGIT (TargetAddress[0])) {\r
+    //\r
+    // RFC 3720 defines format of the TargetAddress=domainname[:port][,portal-group-tag]\r
+    // The domainname can be specified as either a DNS host name, adotted-decimal IPv4 address,\r
+    // or a bracketed IPv6 address as specified in [RFC2732].\r
+    //\r
+    if (NET_IS_DIGIT (TargetAddress[0])) {\r
       //\r
-      // The domainname of the target may be presented in three formats: a DNS host name,\r
-      // a dotted-decimal IPv4 address, or a bracketed IPv6 address. Only accept dotted\r
-      // IPv4 address.\r
+      // The domainname of the target is presented in a dotted-decimal IPv4 address format.\r
       //\r
-      continue;\r
-    }\r
+      IpStr = TargetAddress;\r
 \r
-    IpStr = TargetAddress;\r
-\r
-    while ((*TargetAddress != 0) && (*TargetAddress != ':') && (*TargetAddress != ',')) {\r
+      while ((*TargetAddress != '\0') && (*TargetAddress != ':') && (*TargetAddress != ',')) {\r
+        //\r
+        // NULL, ':', or ',' ends the IPv4 string.\r
+        //\r
+        TargetAddress++;\r
+      }\r
+    } else if (*TargetAddress == ISCSI_REDIRECT_ADDR_START_DELIMITER){\r
       //\r
-      // NULL, ':', or ',' ends the IPv4 string.\r
+      // The domainname of the target is presented in a bracketed IPv6 address format.\r
       //\r
-      TargetAddress++;\r
+      TargetAddress ++;\r
+      IpStr = TargetAddress;\r
+      while ((*TargetAddress != '\0') && (*TargetAddress != ISCSI_REDIRECT_ADDR_END_DELIMITER)) {\r
+        //\r
+        // ']' ends the IPv6 string.\r
+        //\r
+        TargetAddress++;\r
+      }\r
+\r
+      if (*TargetAddress != ISCSI_REDIRECT_ADDR_END_DELIMITER) {\r
+        continue;\r
+      }\r
+\r
+      *TargetAddress = '\0';\r
+      TargetAddress ++;\r
+\r
+    } else {\r
+      //\r
+      // The domainname of the target is presented in the format of a DNS host name.\r
+      // Temporary not supported.\r
+      continue;\r
     }\r
 \r
+    //\r
+    // Save the origial 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
@@ -1122,19 +1155,25 @@ IScsiUpdateTargetAddress (
       if (Number > 0xFFFF) {\r
         continue;\r
       } else {\r
-        Session->ConfigData->SessionConfigData.TargetPort = (UINT16) Number;\r
+        NvData->TargetPort = (UINT16) Number;\r
       }\r
     } else {\r
       //\r
-      // The string only contains the IPv4 address. Use the well-known port.\r
+      // The string only contains the Target address. Use the well-known port.\r
       //\r
-      Session->ConfigData->SessionConfigData.TargetPort = ISCSI_WELL_KNOWN_PORT;\r
+      NvData->TargetPort = ISCSI_WELL_KNOWN_PORT;\r
     }\r
+\r
+    //\r
+    // Save the origial user setting which specifies the proxy/virtual iSCSI target.\r
+    //    \r
+    CopyMem (&NvData->OriginalTargetIp, &NvData->TargetIp, sizeof (EFI_IP_ADDRESS));\r
+\r
     //\r
     // Update the target IP address.\r
     //\r
-    if (Session->ConfigData->SessionConfigData.IpMode < IP_MODE_AUTOCONFIG) {\r
-      IpMode = Session->ConfigData->SessionConfigData.IpMode;\r
+    if (NvData->IpMode < IP_MODE_AUTOCONFIG) {\r
+      IpMode = NvData->IpMode;\r
     } else {\r
       IpMode = Session->ConfigData->AutoConfigureMode;\r
     }\r
@@ -1148,6 +1187,7 @@ IScsiUpdateTargetAddress (
     if (EFI_ERROR (Status)) {\r
       continue;\r
     } else {\r
+      NvData->RedirectFlag = TRUE;\r
       break;\r
     }\r
   }\r
@@ -2103,7 +2143,7 @@ IScsiNewDataSegment (
 \r
   @param[in]  Packet The EXT SCSI PASS THRU request packet containing the SCSI command.\r
   @param[in]  Lun    The LUN.\r
-  @param[in]  Tcb    The tcb assocated with this SCSI command.\r
+  @param[in]  Tcb    The tcb associated with this SCSI command.\r
 \r
   @return The  created iSCSI SCSI command PDU.\r
   @retval NULL Other errors as indicated.\r