NetworkPkg: Support DNS4/6 GeneralLookUp feature
authorJiaxin Wu <jiaxin.wu@intel.com>
Wed, 30 Dec 2015 08:10:55 +0000 (08:10 +0000)
committerjiaxinwu <jiaxinwu@Edk2>
Wed, 30 Dec 2015 08:10:55 +0000 (08:10 +0000)
This patch is used to support DNS4/6 GeneralLookUp feature.

Cc: Subramanian Sriram <sriram-s@hpe.com>
Cc: El-Haj-Mahmoud Samer <samer.el-haj-mahmoud@hpe.com>
Cc: Ye Ting <ting.ye@intel.com>
Cc: Fu Siyuan <siyuan.fu@intel.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jiaxin Wu <jiaxin.wu@intel.com>
Reviewed-by: Ye Ting <ting.ye@intel.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@19579 6f19259b-4bc3-4df7-8a09-765794883524

NetworkPkg/DnsDxe/DnsImpl.c
NetworkPkg/DnsDxe/DnsImpl.h
NetworkPkg/DnsDxe/DnsProtocol.c

index 4f7320e403bfbc56dc0806c1187be042f64c0d86..8725670a8e8a4a51c098dcd7b1e61f067039c021 100644 (file)
@@ -1013,6 +1013,61 @@ AddDns6ServerIp (
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  Fill QName for IP querying. QName is a domain name represented as \r
+  a sequence of labels, where each label consists of a length octet \r
+  followed by that number of octets. The domain name terminates with \r
+  the zero length octet for the null label of the root. Caller should \r
+  take responsibility to the buffer in QName.\r
+\r
+  @param  HostName          Queried HostName    \r
+\r
+  @retval NULL      Failed to fill QName.\r
+  @return           QName filled successfully.\r
+  \r
+**/ \r
+UINT8 *\r
+EFIAPI\r
+DnsFillinQNameForQueryIp (\r
+  IN  CHAR16              *HostName\r
+  )\r
+{\r
+  CHAR8                 *QueryName;\r
+  CHAR8                 *Header;\r
+  CHAR8                 *Tail;\r
+  UINTN                 Len;\r
+  UINTN                 Index;\r
+\r
+  QueryName  = NULL;\r
+  Header     = NULL;\r
+  Tail       = NULL;\r
+\r
+  QueryName = AllocateZeroPool (DNS_DEFAULT_BLKSIZE);\r
+  if (QueryName == NULL) {\r
+    return NULL;\r
+  }\r
+  \r
+  Header = QueryName;\r
+  Tail = Header + 1;\r
+  Len = 0;\r
+  for (Index = 0; HostName[Index] != 0; Index++) {\r
+    *Tail = (CHAR8) HostName[Index];\r
+    if (*Tail == '.') {\r
+      *Header = (CHAR8) Len;\r
+      Header = Tail;\r
+      Tail ++;\r
+      Len = 0;\r
+    } else {\r
+      Tail++;\r
+      Len++;\r
+    }\r
+  }\r
+  *Header = (CHAR8) Len;\r
+  *Tail = 0;\r
+\r
+  return QueryName;\r
+}\r
+\r
 /**\r
   Find out whether the response is valid or invalid.\r
 \r
@@ -1100,6 +1155,7 @@ ParseDnsResponse (
   DNS6_TOKEN_ENTRY      *Dns6TokenEntry;\r
   \r
   UINT32                IpCount;\r
+  UINT32                RRCount;\r
   UINT32                AnswerSectionNum;\r
   \r
   EFI_IPv4_ADDRESS      *HostAddr4;\r
@@ -1108,6 +1164,9 @@ ParseDnsResponse (
   EFI_DNS4_CACHE_ENTRY  *Dns4CacheEntry;\r
   EFI_DNS6_CACHE_ENTRY  *Dns6CacheEntry;\r
 \r
+  DNS_RESOURCE_RECORD   *Dns4RR;\r
+  DNS6_RESOURCE_RECORD  *Dns6RR;\r
+\r
   EFI_STATUS            Status;\r
 \r
   EFI_TPL               OldTpl;\r
@@ -1117,6 +1176,7 @@ ParseDnsResponse (
   Dns6TokenEntry   = NULL;\r
   \r
   IpCount          = 0;\r
+  RRCount          = 0;\r
   AnswerSectionNum = 0;\r
   \r
   HostAddr4        = NULL;\r
@@ -1124,6 +1184,9 @@ ParseDnsResponse (
   \r
   Dns4CacheEntry   = NULL;\r
   Dns6CacheEntry   = NULL;\r
+  \r
+  Dns4RR           = NULL;\r
+  Dns6RR           = NULL;\r
 \r
   *Completed       = TRUE;\r
   Status           = EFI_SUCCESS;\r
@@ -1197,29 +1260,81 @@ ParseDnsResponse (
   }\r
   \r
   //\r
-  // Check the Query type, do some buffer allocations.\r
+  // Do some buffer allocations.\r
   //\r
   if (Instance->Service->IpVersion == IP_VERSION_4) {\r
     ASSERT (Dns4TokenEntry != NULL);\r
-    if (QuerySection->Type == DNS_TYPE_A) {\r
-      Dns4TokenEntry->Token->RspData.H2AData = AllocatePool (sizeof (DNS_HOST_TO_ADDR_DATA));\r
-      ASSERT (Dns4TokenEntry->Token->RspData.H2AData != NULL);\r
-      Dns4TokenEntry->Token->RspData.H2AData->IpList = AllocatePool (DnsHeader->AnswersNum * sizeof (EFI_IPv4_ADDRESS));\r
-      ASSERT (Dns4TokenEntry->Token->RspData.H2AData->IpList != NULL);\r
+\r
+    if (Dns4TokenEntry->GeneralLookUp) {\r
+      //\r
+      // It's the GeneralLookUp querying.\r
+      //\r
+      Dns4TokenEntry->Token->RspData.GLookupData = AllocatePool (sizeof (DNS_RESOURCE_RECORD));\r
+      if (Dns4TokenEntry->Token->RspData.GLookupData == NULL) {\r
+        Status = EFI_OUT_OF_RESOURCES;\r
+        goto ON_EXIT;\r
+      }\r
+      Dns4TokenEntry->Token->RspData.GLookupData->RRList = AllocatePool (DnsHeader->AnswersNum * sizeof (DNS_RESOURCE_RECORD));\r
+      if (Dns4TokenEntry->Token->RspData.GLookupData->RRList == NULL) {\r
+        Status = EFI_OUT_OF_RESOURCES;\r
+        goto ON_EXIT;\r
+      }\r
     } else {\r
-      Status = EFI_UNSUPPORTED;\r
-      goto ON_EXIT;\r
+      //\r
+      // It's not the GeneralLookUp querying. Check the Query type.\r
+      //\r
+      if (QuerySection->Type == DNS_TYPE_A) {\r
+        Dns4TokenEntry->Token->RspData.H2AData = AllocatePool (sizeof (DNS_HOST_TO_ADDR_DATA));\r
+        if (Dns4TokenEntry->Token->RspData.H2AData == NULL) {\r
+          Status = EFI_OUT_OF_RESOURCES;\r
+          goto ON_EXIT;\r
+        }\r
+        Dns4TokenEntry->Token->RspData.H2AData->IpList = AllocatePool (DnsHeader->AnswersNum * sizeof (EFI_IPv4_ADDRESS));\r
+        if (Dns4TokenEntry->Token->RspData.H2AData->IpList == NULL) {\r
+          Status = EFI_OUT_OF_RESOURCES;\r
+          goto ON_EXIT;\r
+        }\r
+      } else {\r
+        Status = EFI_UNSUPPORTED;\r
+        goto ON_EXIT;\r
+      }\r
     }\r
   } else {\r
     ASSERT (Dns6TokenEntry != NULL);\r
-    if (QuerySection->Type == DNS_TYPE_AAAA) {\r
-      Dns6TokenEntry->Token->RspData.H2AData = AllocatePool (sizeof (DNS6_HOST_TO_ADDR_DATA));\r
-      ASSERT (Dns6TokenEntry->Token->RspData.H2AData != NULL);\r
-      Dns6TokenEntry->Token->RspData.H2AData->IpList = AllocatePool (DnsHeader->AnswersNum * sizeof (EFI_IPv6_ADDRESS));\r
-      ASSERT (Dns6TokenEntry->Token->RspData.H2AData->IpList != NULL);\r
+\r
+    if (Dns6TokenEntry->GeneralLookUp) {\r
+      //\r
+      // It's the GeneralLookUp querying.\r
+      //\r
+      Dns6TokenEntry->Token->RspData.GLookupData = AllocatePool (sizeof (DNS_RESOURCE_RECORD));\r
+      if (Dns6TokenEntry->Token->RspData.GLookupData == NULL) {\r
+        Status = EFI_UNSUPPORTED;\r
+        goto ON_EXIT;\r
+      }\r
+      Dns6TokenEntry->Token->RspData.GLookupData->RRList = AllocatePool (DnsHeader->AnswersNum * sizeof (DNS_RESOURCE_RECORD));\r
+      if (Dns6TokenEntry->Token->RspData.GLookupData->RRList == NULL) {\r
+        Status = EFI_UNSUPPORTED;\r
+        goto ON_EXIT;\r
+      }\r
     } else {\r
-      Status = EFI_UNSUPPORTED;\r
-      goto ON_EXIT;\r
+      //\r
+      // It's not the GeneralLookUp querying. Check the Query type.\r
+      //\r
+      if (QuerySection->Type == DNS_TYPE_AAAA) {\r
+        Dns6TokenEntry->Token->RspData.H2AData = AllocatePool (sizeof (DNS6_HOST_TO_ADDR_DATA));\r
+        if (Dns6TokenEntry->Token->RspData.H2AData == NULL) {\r
+          Status = EFI_UNSUPPORTED;\r
+          goto ON_EXIT;\r
+        }\r
+        Dns6TokenEntry->Token->RspData.H2AData->IpList = AllocatePool (DnsHeader->AnswersNum * sizeof (EFI_IPv6_ADDRESS));\r
+        if (Dns6TokenEntry->Token->RspData.H2AData->IpList == NULL) {\r
+          Status = EFI_UNSUPPORTED;\r
+          goto ON_EXIT;\r
+        }\r
+      } else {\r
+        Status = EFI_UNSUPPORTED;\r
+        goto ON_EXIT;\r
+      }\r
     }\r
   }\r
 \r
@@ -1241,9 +1356,68 @@ ParseDnsResponse (
     AnswerSection->Ttl = NTOHL (AnswerSection->Ttl);\r
     AnswerSection->DataLength = NTOHS (AnswerSection->DataLength);\r
 \r
-    ASSERT (AnswerSection->Class == DNS_CLASS_INET);\r
+    //\r
+    // Check whether it's the GeneralLookUp querying.\r
+    //\r
+    if (Instance->Service->IpVersion == IP_VERSION_4 && Dns4TokenEntry->GeneralLookUp) {\r
+      ASSERT (Dns4TokenEntry != NULL);\r
+      \r
+      Dns4RR = Dns4TokenEntry->Token->RspData.GLookupData->RRList;\r
+      AnswerData = (UINT8 *) AnswerSection + sizeof (*AnswerSection);\r
+\r
+      //\r
+      // Fill the ResourceRecord.\r
+      //\r
+      Dns4RR[RRCount].QName = AllocateZeroPool (AsciiStrLen (QueryName) + 1);\r
+      if (Dns4RR[RRCount].QName == NULL) {\r
+        Status = EFI_UNSUPPORTED;\r
+        goto ON_EXIT;\r
+      }\r
+      CopyMem (Dns4RR[RRCount].QName, QueryName, AsciiStrLen (QueryName));\r
+      Dns4RR[RRCount].QType = AnswerSection->Type;\r
+      Dns4RR[RRCount].QClass = AnswerSection->Class;\r
+      Dns4RR[RRCount].TTL = AnswerSection->Ttl;\r
+      Dns4RR[RRCount].DataLength = AnswerSection->DataLength;\r
+      Dns4RR[RRCount].RData = AllocateZeroPool (Dns4RR[RRCount].DataLength);\r
+      if (Dns4RR[RRCount].RData == NULL) {\r
+        Status = EFI_UNSUPPORTED;\r
+        goto ON_EXIT;\r
+      }\r
+      CopyMem (Dns4RR[RRCount].RData, AnswerData, Dns4RR[RRCount].DataLength);\r
+      \r
+      RRCount ++;\r
+    } else if (Instance->Service->IpVersion == IP_VERSION_6 && Dns6TokenEntry->GeneralLookUp) {\r
+      ASSERT (Dns6TokenEntry != NULL);\r
+      \r
+      Dns6RR = Dns6TokenEntry->Token->RspData.GLookupData->RRList;\r
+      AnswerData = (UINT8 *) AnswerSection + sizeof (*AnswerSection);\r
 \r
-    if (AnswerSection->Type == QuerySection->Type) {\r
+      //\r
+      // Fill the ResourceRecord.\r
+      //\r
+      Dns6RR[RRCount].QName = AllocateZeroPool (AsciiStrLen (QueryName) + 1);\r
+      if (Dns6RR[RRCount].QName == NULL) {\r
+        Status = EFI_UNSUPPORTED;\r
+        goto ON_EXIT;\r
+      }\r
+      CopyMem (Dns6RR[RRCount].QName, QueryName, AsciiStrLen (QueryName));\r
+      Dns6RR[RRCount].QType = AnswerSection->Type;\r
+      Dns6RR[RRCount].QClass = AnswerSection->Class;\r
+      Dns6RR[RRCount].TTL = AnswerSection->Ttl;\r
+      Dns6RR[RRCount].DataLength = AnswerSection->DataLength;\r
+      Dns6RR[RRCount].RData = AllocateZeroPool (Dns6RR[RRCount].DataLength);\r
+      if (Dns6RR[RRCount].RData == NULL) {\r
+        Status = EFI_UNSUPPORTED;\r
+        goto ON_EXIT;\r
+      }\r
+      CopyMem (Dns6RR[RRCount].RData, AnswerData, Dns6RR[RRCount].DataLength);\r
+      \r
+      RRCount ++;\r
+    } else {\r
+      //\r
+      // It's not the GeneralLookUp querying. \r
+      // Check the Query type, parse the response packet.\r
+      //\r
       switch (AnswerSection->Type) {\r
       case DNS_TYPE_A:\r
         //\r
@@ -1274,12 +1448,21 @@ ParseDnsResponse (
         // Allocate new CacheEntry pool.\r
         //\r
         Dns4CacheEntry = AllocateZeroPool (sizeof (EFI_DNS4_CACHE_ENTRY));\r
-        ASSERT (Dns4CacheEntry != NULL);\r
+        if (Dns4CacheEntry == NULL) {\r
+          Status = EFI_UNSUPPORTED;\r
+          goto ON_EXIT;\r
+        }\r
         Dns4CacheEntry->HostName = AllocateZeroPool (2 * (StrLen(Dns4TokenEntry->QueryHostName) + 1));\r
-        ASSERT (Dns4CacheEntry->HostName != NULL);\r
+        if (Dns4CacheEntry->HostName == NULL) {\r
+          Status = EFI_UNSUPPORTED;\r
+          goto ON_EXIT;\r
+        }\r
         CopyMem (Dns4CacheEntry->HostName, Dns4TokenEntry->QueryHostName, 2 * (StrLen(Dns4TokenEntry->QueryHostName) + 1));\r
         Dns4CacheEntry->IpAddress = AllocateZeroPool (sizeof (EFI_IPv4_ADDRESS));\r
-        ASSERT (Dns4CacheEntry->IpAddress != NULL);\r
+        if (Dns4CacheEntry->IpAddress == NULL) {\r
+          Status = EFI_UNSUPPORTED;\r
+          goto ON_EXIT;\r
+        }\r
         CopyMem (Dns4CacheEntry->IpAddress, AnswerData, sizeof (EFI_IPv4_ADDRESS));\r
         Dns4CacheEntry->Timeout = AnswerSection->Ttl;\r
         \r
@@ -1316,12 +1499,21 @@ ParseDnsResponse (
         // Allocate new CacheEntry pool.\r
         //\r
         Dns6CacheEntry = AllocateZeroPool (sizeof (EFI_DNS6_CACHE_ENTRY));\r
-        ASSERT (Dns6CacheEntry != NULL);\r
+        if (Dns6CacheEntry == NULL) {\r
+          Status = EFI_UNSUPPORTED;\r
+          goto ON_EXIT;\r
+        }\r
         Dns6CacheEntry->HostName = AllocateZeroPool (2 * (StrLen(Dns6TokenEntry->QueryHostName) + 1));\r
-        ASSERT (Dns6CacheEntry->HostName != NULL);\r
+        if (Dns6CacheEntry->HostName == NULL) {\r
+          Status = EFI_UNSUPPORTED;\r
+          goto ON_EXIT;\r
+        }\r
         CopyMem (Dns6CacheEntry->HostName, Dns6TokenEntry->QueryHostName, 2 * (StrLen(Dns6TokenEntry->QueryHostName) + 1));\r
         Dns6CacheEntry->IpAddress = AllocateZeroPool (sizeof (EFI_IPv6_ADDRESS));\r
-        ASSERT (Dns6CacheEntry->IpAddress != NULL);\r
+        if (Dns6CacheEntry->IpAddress == NULL) {\r
+          Status = EFI_UNSUPPORTED;\r
+          goto ON_EXIT;\r
+        }\r
         CopyMem (Dns6CacheEntry->IpAddress, AnswerData, sizeof (EFI_IPv6_ADDRESS));\r
         Dns6CacheEntry->Timeout = AnswerSection->Ttl;\r
         \r
@@ -1344,19 +1536,29 @@ ParseDnsResponse (
 \r
   if (Instance->Service->IpVersion == IP_VERSION_4) {\r
     ASSERT (Dns4TokenEntry != NULL);\r
-    if (QuerySection->Type == DNS_TYPE_A) {\r
-      Dns4TokenEntry->Token->RspData.H2AData->IpCount = IpCount;\r
+    \r
+    if (Dns4TokenEntry->GeneralLookUp) {\r
+      Dns4TokenEntry->Token->RspData.GLookupData->RRCount = RRCount;\r
     } else {\r
-      Status = EFI_UNSUPPORTED;\r
-      goto ON_EXIT;\r
+      if (QuerySection->Type == DNS_TYPE_A) {\r
+        Dns4TokenEntry->Token->RspData.H2AData->IpCount = IpCount;\r
+      } else {\r
+        Status = EFI_UNSUPPORTED;\r
+        goto ON_EXIT;\r
+      }\r
     }\r
   } else {\r
     ASSERT (Dns6TokenEntry != NULL);\r
-    if (QuerySection->Type == DNS_TYPE_AAAA) {\r
-      Dns6TokenEntry->Token->RspData.H2AData->IpCount = IpCount;\r
+\r
+    if (Dns6TokenEntry->GeneralLookUp) {\r
+      Dns6TokenEntry->Token->RspData.GLookupData->RRCount = RRCount;\r
     } else {\r
-      Status = EFI_UNSUPPORTED;\r
-      goto ON_EXIT;\r
+      if (QuerySection->Type == DNS_TYPE_AAAA) {\r
+        Dns6TokenEntry->Token->RspData.H2AData->IpCount = IpCount;\r
+      } else {\r
+        Status = EFI_UNSUPPORTED;\r
+        goto ON_EXIT;\r
+      }\r
     }\r
   }\r
 \r
@@ -1560,35 +1762,31 @@ DoDnsQuery (
 }\r
 \r
 /**\r
-  Construct the Packet to query Ip.\r
+  Construct the Packet according query section.\r
 \r
   @param  Instance              The DNS instance\r
-  @param  HostName              Queried HostName  \r
-  @param  Type                  DNS query Type\r
-  @param  Packet                The packet for querying Ip\r
+  @param  QueryName             Queried Name  \r
+  @param  Type                  Queried Type \r
+  @param  Class                 Queried Class \r
+  @param  Packet                The packet for query\r
 \r
   @retval EFI_SUCCESS           The packet is constructed.\r
   @retval Others                Failed to construct the Packet.\r
 \r
 **/\r
 EFI_STATUS\r
-ConstructDNSQueryIp (\r
+ConstructDNSQuery (\r
   IN  DNS_INSTANCE              *Instance,\r
-  IN  CHAR16                    *HostName,\r
+  IN  CHAR8                     *QueryName,\r
   IN  UINT16                    Type,\r
+  IN  UINT16                    Class,\r
   OUT NET_BUF                   **Packet\r
   )\r
 {\r
   NET_FRAGMENT        Frag;\r
   DNS_HEADER          *DnsHeader;\r
-  CHAR8               *QueryName;\r
-  DNS_QUERY_SECTION   *QuerySection;\r
-  CHAR8               *Header;\r
-  CHAR8               *Tail;\r
-  UINTN               Len;\r
-  UINTN               Index;\r
+  DNS_QUERY_SECTION   *DnsQuery;\r
   \r
-\r
   Frag.Bulk = AllocatePool (DNS_DEFAULT_BLKSIZE * sizeof (UINT8));\r
   if (Frag.Bulk == NULL) {\r
     return EFI_OUT_OF_RESOURCES;\r
@@ -1620,37 +1818,20 @@ ConstructDNSQueryIp (
   //\r
   // Fill Query name\r
   //\r
-  QueryName = (CHAR8 *) (Frag.Bulk + Frag.Len);\r
-  Header = QueryName;\r
-  Tail = Header + 1;\r
-  Len = 0;\r
-  for (Index = 0; HostName[Index] != 0; Index++) {\r
-    *Tail = (CHAR8) HostName[Index];\r
-    if (*Tail == '.') {\r
-      *Header = (CHAR8) Len;\r
-      Header = Tail;\r
-      Tail ++;\r
-      Len = 0;\r
-    } else {\r
-      Tail++;\r
-      Len++;\r
-    }\r
-  }\r
-  *Header = (CHAR8) Len;\r
-  *Tail = 0;\r
-  Frag.Len = (UINT32) (Frag.Len + StrLen (HostName) + 2); /// 1 for header, 1 for tail.\r
-\r
+  CopyMem (Frag.Bulk + Frag.Len, QueryName, AsciiStrLen (QueryName));\r
+  Frag.Len = (UINT32) (Frag.Len + AsciiStrLen (QueryName));\r
+  *(Frag.Bulk + Frag.Len) = 0;\r
+  Frag.Len ++;\r
+  \r
   //\r
   // Rest query section\r
   //\r
-  QuerySection = (DNS_QUERY_SECTION *) (Frag.Bulk + Frag.Len);\r
-  QuerySection->Type = Type;\r
-  QuerySection->Class = DNS_CLASS_INET;\r
+  DnsQuery = (DNS_QUERY_SECTION *) (Frag.Bulk + Frag.Len);\r
 \r
-  QuerySection->Type = HTONS (QuerySection->Type);\r
-  QuerySection->Class = HTONS (QuerySection->Class);\r
+  DnsQuery->Type = HTONS (Type);\r
+  DnsQuery->Class = HTONS (Class);\r
 \r
-  Frag.Len += sizeof (*QuerySection);\r
+  Frag.Len += sizeof (*DnsQuery);\r
 \r
   //\r
   // Wrap the Frag in a net buffer.\r
index c3a889bcd51534b8dc900a0e1b1283c80d97dc67..a13355f85517cb64fd8b56582cb57d9d80ca1efe 100644 (file)
@@ -119,6 +119,7 @@ typedef struct {
   UINT32                     PacketToLive;\r
   CHAR16                     *QueryHostName;\r
   EFI_IPv4_ADDRESS           QueryIpAddress;\r
+  BOOLEAN                    GeneralLookUp;\r
   EFI_DNS4_COMPLETION_TOKEN  *Token;\r
 } DNS4_TOKEN_ENTRY;\r
 \r
@@ -126,6 +127,7 @@ typedef struct {
   UINT32                     PacketToLive;\r
   CHAR16                     *QueryHostName;\r
   EFI_IPv6_ADDRESS           QueryIpAddress;\r
+  BOOLEAN                    GeneralLookUp;\r
   EFI_DNS6_COMPLETION_TOKEN  *Token;\r
 } DNS6_TOKEN_ENTRY;\r
 \r
@@ -567,6 +569,24 @@ AddDns6ServerIp (
   IN EFI_IPv6_ADDRESS           ServerIp\r
   );\r
 \r
+/**\r
+  Fill QName for IP querying. QName is a domain name represented as \r
+  a sequence of labels, where each label consists of a length octet \r
+  followed by that number of octets. The domain name terminates with \r
+  the zero length octet for the null label of the root.\r
+\r
+  @param  HostName          Queried HostName    \r
+\r
+  @retval NULL      Failed to fill QName.\r
+  @return           QName filled successfully.\r
+  \r
+**/ \r
+UINT8 *\r
+EFIAPI\r
+DnsFillinQNameForQueryIp (\r
+  IN  CHAR16              *HostName\r
+  );\r
+\r
 /**\r
   Find out whether the response is valid or invalid.\r
 \r
@@ -658,22 +678,24 @@ DoDnsQuery (
   );\r
 \r
 /**\r
-  Construct the Packet to query Ip.\r
+  Construct the Packet according query section.\r
 \r
   @param  Instance              The DNS instance\r
-  @param  HostName              Queried HostName  \r
-  @param  Type                  DNS query Type\r
-  @param  Packet                The packet for querying Ip\r
+  @param  QueryName             Queried Name  \r
+  @param  Type                  Queried Type \r
+  @param  Class                 Queried Class \r
+  @param  Packet                The packet for query\r
 \r
   @retval EFI_SUCCESS           The packet is constructed.\r
   @retval Others                Failed to construct the Packet.\r
 \r
 **/\r
 EFI_STATUS\r
-ConstructDNSQueryIp (\r
+ConstructDNSQuery (\r
   IN  DNS_INSTANCE              *Instance,\r
-  IN  CHAR16                    *HostName,\r
+  IN  CHAR8                     *QueryName,\r
   IN  UINT16                    Type,\r
+  IN  UINT16                    Class,\r
   OUT NET_BUF                   **Packet\r
   );\r
 \r
index 70857c2b2f49290a9c58f62bd6f257aa258c33d0..e7aa227994ed8adc2ec68be46fa427368a13d84e 100644 (file)
@@ -329,6 +329,8 @@ Dns4HostNameToIp (
   LIST_ENTRY            *Entry;\r
   LIST_ENTRY            *Next;\r
   \r
+  CHAR8                 *QueryName;\r
+  \r
   DNS4_TOKEN_ENTRY      *TokenEntry;\r
   NET_BUF               *Packet;\r
   \r
@@ -336,6 +338,7 @@ Dns4HostNameToIp (
   \r
   Status     = EFI_SUCCESS;\r
   Item       = NULL;\r
+  QueryName  = NULL;\r
   TokenEntry = NULL;\r
   Packet     = NULL;\r
   \r
@@ -438,10 +441,19 @@ Dns4HostNameToIp (
   TokenEntry->QueryHostName = HostName;\r
   TokenEntry->Token = Token;\r
 \r
+  //\r
+  // Construct QName.\r
+  //\r
+  QueryName = DnsFillinQNameForQueryIp (TokenEntry->QueryHostName);\r
+  if (QueryName == NULL) {\r
+    Status = EFI_OUT_OF_RESOURCES;\r
+    goto ON_EXIT;\r
+  }\r
+  \r
   //\r
   // Construct DNS Query Packet.\r
   //\r
-  Status = ConstructDNSQueryIp (Instance, TokenEntry->QueryHostName, DNS_TYPE_A, &Packet);\r
+  Status = ConstructDNSQuery (Instance, QueryName, DNS_TYPE_A, DNS_CLASS_INET, &Packet);\r
   if (EFI_ERROR (Status)) {\r
     if (TokenEntry != NULL) {\r
       FreePool (TokenEntry);\r
@@ -477,6 +489,10 @@ Dns4HostNameToIp (
   }\r
   \r
 ON_EXIT:\r
+  if (QueryName != NULL) {\r
+    FreePool (QueryName);\r
+  }\r
+  \r
   gBS->RestoreTPL (OldTpl);\r
   return Status;\r
 }\r
@@ -544,7 +560,110 @@ Dns4GeneralLookUp (
   IN  EFI_DNS4_COMPLETION_TOKEN        *Token\r
   )\r
 {\r
-  return EFI_UNSUPPORTED;\r
+  EFI_STATUS            Status;\r
+  \r
+  DNS_INSTANCE          *Instance;\r
+  \r
+  EFI_DNS4_CONFIG_DATA  *ConfigData;\r
+  \r
+  DNS4_TOKEN_ENTRY      *TokenEntry;\r
+  NET_BUF               *Packet;\r
+  \r
+  EFI_TPL               OldTpl;\r
+  \r
+  Status     = EFI_SUCCESS;\r
+  TokenEntry = NULL;\r
+  Packet     = NULL;\r
+  \r
+  //\r
+  // Validate the parameters\r
+  //\r
+  if ((This == NULL) || (QName == NULL) || Token == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+  \r
+  OldTpl   = gBS->RaiseTPL (TPL_CALLBACK);\r
+  \r
+  Instance = DNS_INSTANCE_FROM_THIS_PROTOCOL4 (This);\r
+  \r
+  ConfigData = &(Instance->Dns4CfgData);\r
+  \r
+  Instance->MaxRetry = ConfigData->RetryCount;\r
+  \r
+  Token->Status = EFI_NOT_READY;\r
+  Token->RetryCount = 0;\r
+  Token->RetryInterval = ConfigData->RetryInterval;\r
+\r
+  if (Instance->State != DNS_STATE_CONFIGED) {\r
+    Status = EFI_NOT_STARTED;\r
+    goto ON_EXIT;\r
+  }\r
+\r
+  //\r
+  // Check the MaxRetry and RetryInterval values.\r
+  //\r
+  if (Instance->MaxRetry == 0) {\r
+    Instance->MaxRetry = DNS_DEFAULT_RETRY;\r
+  }\r
+\r
+  if (Token->RetryInterval < DNS_DEFAULT_TIMEOUT) {\r
+    Token->RetryInterval = DNS_DEFAULT_TIMEOUT;\r
+  }\r
+\r
+  //\r
+  // Construct DNS TokenEntry.\r
+  //\r
+  TokenEntry = AllocateZeroPool (sizeof(DNS4_TOKEN_ENTRY));\r
+  if (TokenEntry == NULL) {\r
+    Status = EFI_OUT_OF_RESOURCES;\r
+    goto ON_EXIT;\r
+  }\r
+  \r
+  TokenEntry->PacketToLive = Token->RetryInterval;\r
+  TokenEntry->GeneralLookUp = TRUE;\r
+  TokenEntry->Token = Token;\r
+\r
+  //\r
+  // Construct DNS Query Packet.\r
+  //\r
+  Status = ConstructDNSQuery (Instance, QName, QType, QClass, &Packet);\r
+  if (EFI_ERROR (Status)) {\r
+    if (TokenEntry != NULL) {\r
+      FreePool (TokenEntry);\r
+    }\r
+    \r
+    goto ON_EXIT;\r
+  }\r
+\r
+  //\r
+  // Save the token into the Dns4TxTokens map.\r
+  //\r
+  Status = NetMapInsertTail (&Instance->Dns4TxTokens, TokenEntry, Packet);\r
+  if (EFI_ERROR (Status)) {\r
+    if (TokenEntry != NULL) {\r
+      FreePool (TokenEntry);\r
+    }\r
+    \r
+    NetbufFree (Packet);\r
+    \r
+    goto ON_EXIT;\r
+  }\r
+  \r
+  //\r
+  // Dns Query Ip\r
+  //\r
+  Status = DoDnsQuery (Instance, Packet);\r
+  if (EFI_ERROR (Status)) {\r
+    if (TokenEntry != NULL) {\r
+      FreePool (TokenEntry);\r
+    }\r
+    \r
+    NetbufFree (Packet);\r
+  }\r
+  \r
+ON_EXIT:\r
+  gBS->RestoreTPL (OldTpl);\r
+  return Status;\r
 }\r
 \r
 /**\r
@@ -978,6 +1097,8 @@ Dns6HostNameToIp (
   LIST_ENTRY            *Entry;\r
   LIST_ENTRY            *Next;\r
   \r
+  CHAR8                 *QueryName;\r
+  \r
   DNS6_TOKEN_ENTRY      *TokenEntry;\r
   NET_BUF               *Packet;\r
   \r
@@ -985,6 +1106,7 @@ Dns6HostNameToIp (
   \r
   Status     = EFI_SUCCESS;\r
   Item       = NULL;\r
+  QueryName  = NULL;\r
   TokenEntry = NULL;\r
   Packet     = NULL;\r
 \r
@@ -1087,10 +1209,20 @@ Dns6HostNameToIp (
   TokenEntry->QueryHostName = HostName;\r
   TokenEntry->Token = Token;\r
 \r
+\r
+  //\r
+  // Construct QName.\r
+  //\r
+  QueryName = DnsFillinQNameForQueryIp (TokenEntry->QueryHostName);\r
+  if (QueryName == NULL) {\r
+    Status = EFI_OUT_OF_RESOURCES;\r
+    goto ON_EXIT;\r
+  }\r
+  \r
   //\r
   // Construct DNS Query Packet.\r
   //\r
-  Status = ConstructDNSQueryIp (Instance, TokenEntry->QueryHostName, DNS_TYPE_AAAA, &Packet);\r
+  Status = ConstructDNSQuery (Instance, QueryName, DNS_TYPE_AAAA, DNS_CLASS_INET, &Packet);\r
   if (EFI_ERROR (Status)) {\r
     if (TokenEntry != NULL) {\r
       FreePool (TokenEntry);\r
@@ -1126,6 +1258,10 @@ Dns6HostNameToIp (
   }\r
   \r
 ON_EXIT:\r
+  if (QueryName != NULL) {\r
+    FreePool (QueryName);\r
+  }\r
+  \r
   gBS->RestoreTPL (OldTpl);\r
   return Status;\r
 }\r
@@ -1193,7 +1329,110 @@ Dns6GeneralLookUp (
   IN  EFI_DNS6_COMPLETION_TOKEN         *Token\r
   )\r
 {\r
-  return EFI_UNSUPPORTED;\r
+  EFI_STATUS            Status;\r
+  \r
+  DNS_INSTANCE          *Instance;\r
+  \r
+  EFI_DNS6_CONFIG_DATA  *ConfigData;\r
+  \r
+  DNS6_TOKEN_ENTRY      *TokenEntry;\r
+  NET_BUF               *Packet;\r
+  \r
+  EFI_TPL               OldTpl;\r
+  \r
+  Status     = EFI_SUCCESS;\r
+  TokenEntry = NULL;\r
+  Packet     = NULL;\r
+  \r
+  //\r
+  // Validate the parameters\r
+  //\r
+  if ((This == NULL) || (QName == NULL) || Token == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+  \r
+  OldTpl   = gBS->RaiseTPL (TPL_CALLBACK);\r
+  \r
+  Instance = DNS_INSTANCE_FROM_THIS_PROTOCOL6 (This);\r
+  \r
+  ConfigData = &(Instance->Dns6CfgData);\r
+  \r
+  Instance->MaxRetry = ConfigData->RetryCount;\r
+  \r
+  Token->Status = EFI_NOT_READY;\r
+  Token->RetryCount = 0;\r
+  Token->RetryInterval = ConfigData->RetryInterval;\r
+\r
+  if (Instance->State != DNS_STATE_CONFIGED) {\r
+    Status = EFI_NOT_STARTED;\r
+    goto ON_EXIT;\r
+  }\r
+\r
+  //\r
+  // Check the MaxRetry and RetryInterval values.\r
+  //\r
+  if (Instance->MaxRetry == 0) {\r
+    Instance->MaxRetry = DNS_DEFAULT_RETRY;\r
+  }\r
+\r
+  if (Token->RetryInterval < DNS_DEFAULT_TIMEOUT) {\r
+    Token->RetryInterval = DNS_DEFAULT_TIMEOUT;\r
+  }\r
+\r
+  //\r
+  // Construct DNS TokenEntry.\r
+  //\r
+  TokenEntry = AllocateZeroPool (sizeof(DNS6_TOKEN_ENTRY));\r
+  if (TokenEntry == NULL) {\r
+    Status = EFI_OUT_OF_RESOURCES;\r
+    goto ON_EXIT;\r
+  }\r
+  \r
+  TokenEntry->PacketToLive = Token->RetryInterval;\r
+  TokenEntry->GeneralLookUp = TRUE;\r
+  TokenEntry->Token = Token;\r
+\r
+  //\r
+  // Construct DNS Query Packet.\r
+  //\r
+  Status = ConstructDNSQuery (Instance, QName, QType, QClass, &Packet);\r
+  if (EFI_ERROR (Status)) {\r
+    if (TokenEntry != NULL) {\r
+      FreePool (TokenEntry);\r
+    }\r
+    \r
+    goto ON_EXIT;\r
+  }\r
+\r
+  //\r
+  // Save the token into the Dns6TxTokens map.\r
+  //\r
+  Status = NetMapInsertTail (&Instance->Dns6TxTokens, TokenEntry, Packet);\r
+  if (EFI_ERROR (Status)) {\r
+    if (TokenEntry != NULL) {\r
+      FreePool (TokenEntry);\r
+    }\r
+    \r
+    NetbufFree (Packet);\r
+    \r
+    goto ON_EXIT;\r
+  }\r
+  \r
+  //\r
+  // Dns Query Ip\r
+  //\r
+  Status = DoDnsQuery (Instance, Packet);\r
+  if (EFI_ERROR (Status)) {\r
+    if (TokenEntry != NULL) {\r
+      FreePool (TokenEntry);\r
+    }\r
+    \r
+    NetbufFree (Packet);\r
+  }\r
+  \r
+ON_EXIT:\r
+  gBS->RestoreTPL (OldTpl);\r
+  return Status;\r
 }\r
 \r
 /**\r