NetworkPkg: Fix bug in iSCSI mode ipv6 when enabling target DHCP.
authorZhang, Lubo <lubo.zhang@intel.com>
Fri, 28 Apr 2017 06:40:22 +0000 (14:40 +0800)
committerJiaxin Wu <jiaxin.wu@intel.com>
Tue, 2 May 2017 03:11:47 +0000 (11:11 +0800)
if the server name expressed as a site local address begain with FEC0
when retrieving from dhcpv6 option 59 boot file url, it incorrectly process it
as a dns name.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Zhang Lubo <lubo.zhang@intel.com>
Cc: Wu Jiaxin <jiaxin.wu@intel.com>
Cc: Ye Ting <ting.ye@intel.com>
Cc: Fu Siyuan <siyuan.fu@intel.com>
Reviewed-by: Wu Jiaxin <jiaxin.wu@intel.com>
NetworkPkg/IScsiDxe/IScsiDhcp6.c

index d3535d57cb5a2eb646118f7c447400a75b2cfa20..06c634c3cda4f6dbe28442535bf6ca09714b836c 100644 (file)
@@ -50,7 +50,7 @@ IScsiDhcp6ExtractRootPath (
   UINT8                       IpMode;  \r
 \r
   ConfigNvData = &ConfigData->SessionConfigData;\r
   UINT8                       IpMode;  \r
 \r
   ConfigNvData = &ConfigData->SessionConfigData;\r
-\r
+  ConfigNvData->DnsMode = FALSE;\r
   //\r
   // "iscsi:"<servername>":"<protocol>":"<port>":"<LUN>":"<targetname>\r
   //\r
   //\r
   // "iscsi:"<servername>":"<protocol>":"<port>":"<LUN>":"<targetname>\r
   //\r
@@ -82,23 +82,36 @@ IScsiDhcp6ExtractRootPath (
   // Extract SERVERNAME field in the Root Path option.\r
   //\r
   if (TmpStr[Index] != ISCSI_ROOT_PATH_ADDR_START_DELIMITER) {\r
   // Extract SERVERNAME field in the Root Path option.\r
   //\r
   if (TmpStr[Index] != ISCSI_ROOT_PATH_ADDR_START_DELIMITER) {\r
-    Status = EFI_INVALID_PARAMETER;\r
-    goto ON_EXIT;\r
+    //\r
+    // The servername is expressed as domain name.\r
+    //\r
+    ConfigNvData->DnsMode = TRUE;\r
   } else {\r
     Index++;\r
   }\r
 \r
   Fields[RP_FIELD_IDX_SERVERNAME].Str = &TmpStr[Index];\r
 \r
   } else {\r
     Index++;\r
   }\r
 \r
   Fields[RP_FIELD_IDX_SERVERNAME].Str = &TmpStr[Index];\r
 \r
-  while ((TmpStr[Index] != ISCSI_ROOT_PATH_ADDR_END_DELIMITER) && (Index < Length)) {\r
-    Index++;\r
-  }\r
+  if (!ConfigNvData->DnsMode) {\r
+    while ((TmpStr[Index] != ISCSI_ROOT_PATH_ADDR_END_DELIMITER)&& (Index < Length)) {\r
+      Index++;\r
+    }\r
 \r
 \r
-  //\r
-  // Skip ']' and ':'.\r
-  //\r
-  TmpStr[Index] = '\0';\r
-  Index += 2;\r
+    //\r
+    // Skip ']' and ':'.\r
+    //\r
+    TmpStr[Index] = '\0';\r
+    Index += 2;\r
+  } else {\r
+    while ((TmpStr[Index] != ISCSI_ROOT_PATH_FIELD_DELIMITER) && (Index < Length)) {\r
+      Index++;\r
+    }\r
+    //\r
+    // Skip ':'.\r
+    //\r
+    TmpStr[Index] = '\0';\r
+    Index += 1;\r
+  }\r
 \r
   Fields[RP_FIELD_IDX_SERVERNAME].Len = (UINT8) AsciiStrLen (Fields[RP_FIELD_IDX_SERVERNAME].Str);\r
 \r
 \r
   Fields[RP_FIELD_IDX_SERVERNAME].Len = (UINT8) AsciiStrLen (Fields[RP_FIELD_IDX_SERVERNAME].Str);\r
 \r
@@ -153,8 +166,7 @@ IScsiDhcp6ExtractRootPath (
   //\r
   // Server name is expressed as domain name, just save it.\r
   //\r
   //\r
   // Server name is expressed as domain name, just save it.\r
   //\r
-  if ((!NET_IS_DIGIT (*(Field->Str))) && (*(Field->Str) != '[')) {\r
-    ConfigNvData->DnsMode = TRUE;\r
+  if (ConfigNvData->DnsMode) {\r
     if (Field->Len > sizeof (ConfigNvData->TargetUrl)) {\r
       return EFI_INVALID_PARAMETER;\r
     }\r
     if (Field->Len > sizeof (ConfigNvData->TargetUrl)) {\r
       return EFI_INVALID_PARAMETER;\r
     }\r