]> git.proxmox.com Git - mirror_edk2.git/blobdiff - NetworkPkg/IScsiDxe/IScsiProto.c
NetworkPkg: Support bracketed IPv6 address during a redirection in iSCSI
[mirror_edk2.git] / NetworkPkg / IScsiDxe / IScsiProto.c
index eb77d750529886a3f87aefcf4bc921420fe78a66..a67bbd5c8700ad98b06eb67a4dcac4a4a830ad32 100644 (file)
@@ -1091,12 +1091,47 @@ IScsiUpdateTargetAddress (
       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 is presented in a dotted-decimal IPv4 address format.\r
+      //\r
+      IpStr = TargetAddress;\r
+\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
-      // 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 bracketed IPv6 address format.\r
       //\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
@@ -1105,15 +1140,6 @@ IScsiUpdateTargetAddress (
     //\r
     NvData->OriginalTargetPort = NvData->TargetPort;\r
 \r
-    IpStr = TargetAddress;\r
-\r
-    while ((*TargetAddress != 0) && (*TargetAddress != ':') && (*TargetAddress != ',')) {\r
-      //\r
-      // NULL, ':', or ',' ends the IPv4 string.\r
-      //\r
-      TargetAddress++;\r
-    }\r
-\r
     if (*TargetAddress == ',') {\r
       //\r
       // Comma and the portal group tag MUST be ommitted if the TargetAddress is sent\r
@@ -1133,7 +1159,7 @@ IScsiUpdateTargetAddress (
       }\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
       NvData->TargetPort = ISCSI_WELL_KNOWN_PORT;\r
     }\r