]> git.proxmox.com Git - mirror_edk2.git/blobdiff - NetworkPkg/DnsDxe/DnsProtocol.c
UefiCpuPkg/MpInitLib: Fix timer interrupt is disabled after SwitchBSP
[mirror_edk2.git] / NetworkPkg / DnsDxe / DnsProtocol.c
index 11009fdc0dd9ff7f459ee620ed5f737519518686..1fcaabdf95e570cab7b46ac56d1fdc950c3281fe 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
 Implementation of EFI_DNS4_PROTOCOL and EFI_DNS6_PROTOCOL interfaces.\r
 \r
-Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2015 - 2017, 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
@@ -88,8 +88,8 @@ Dns4GetModeData (
     \r
   Instance = DNS_INSTANCE_FROM_THIS_PROTOCOL4 (This);\r
   if (Instance->State == DNS_STATE_UNCONFIGED) {\r
-    gBS->RestoreTPL (OldTpl);\r
-    return  EFI_NOT_STARTED;\r
+    Status = EFI_NOT_STARTED;\r
+    goto ON_EXIT;\r
   }\r
   \r
   ZeroMem (DnsModeData, sizeof (EFI_DNS4_MODE_DATA));\r
@@ -99,8 +99,7 @@ Dns4GetModeData (
   //\r
   Status = Dns4CopyConfigure (&DnsModeData->DnsConfigData, &Instance->Dns4CfgData);\r
   if (EFI_ERROR (Status)) {\r
-    gBS->RestoreTPL (OldTpl);\r
-    return Status;\r
+    goto ON_EXIT;\r
   }\r
 \r
   //\r
@@ -112,7 +111,12 @@ Dns4GetModeData (
   }\r
   DnsModeData->DnsServerCount = (UINT32) Index;\r
   ServerList = AllocatePool (sizeof (EFI_IPv4_ADDRESS) * DnsModeData->DnsServerCount);\r
-  ASSERT (ServerList != NULL);\r
+  if (ServerList == NULL) {\r
+    Status = EFI_OUT_OF_RESOURCES;\r
+    Dns4CleanConfigure (&DnsModeData->DnsConfigData);\r
+    goto ON_EXIT;\r
+  }\r
+  \r
   Index = 0;\r
   NET_LIST_FOR_EACH_SAFE (Entry, Next, &mDriverData->Dns4ServerList) {\r
     ServerItem = NET_LIST_USER_STRUCT (Entry, DNS4_SERVER_IP, AllServerLink);\r
@@ -130,7 +134,13 @@ Dns4GetModeData (
   }\r
   DnsModeData->DnsCacheCount = (UINT32) Index;\r
   CacheList = AllocatePool (sizeof (EFI_DNS4_CACHE_ENTRY) * DnsModeData->DnsCacheCount);\r
-  ASSERT (CacheList != NULL);\r
+  if (CacheList == NULL) {\r
+    Status = EFI_OUT_OF_RESOURCES;\r
+    Dns4CleanConfigure (&DnsModeData->DnsConfigData);\r
+    FreePool (ServerList);\r
+    goto ON_EXIT;\r
+  }\r
+  \r
   Index =0;\r
   NET_LIST_FOR_EACH_SAFE (Entry, Next, &mDriverData->Dns4CacheList) {\r
     CacheItem = NET_LIST_USER_STRUCT (Entry, DNS4_CACHE, AllCacheLink);\r
@@ -139,9 +149,9 @@ Dns4GetModeData (
   }\r
   DnsModeData->DnsCacheList = CacheList;\r
 \r
+ON_EXIT:\r
   gBS->RestoreTPL (OldTpl);\r
-  \r
-  return EFI_SUCCESS;\r
+  return Status;\r
 }\r
 \r
 /**\r
@@ -213,8 +223,6 @@ Dns4Configure (
       Dns4InstanceCancelToken(Instance, NULL);\r
     }\r
 \r
-    Instance->MaxRetry = 0;\r
-\r
     if (Instance->UdpIo != NULL){\r
       UdpIoCleanIo (Instance->UdpIo);\r
     }\r
@@ -236,7 +244,7 @@ Dns4Configure (
     Netmask  = NTOHL (Netmask);\r
 \r
     if (!DnsConfigData->UseDefaultSetting &&\r
-       ((!IP4_IS_VALID_NETMASK (Netmask) || !NetIp4IsUnicast (Ip, Netmask)))) {\r
+        ((!IP4_IS_VALID_NETMASK (Netmask) || (Netmask != 0 && !NetIp4IsUnicast (Ip, Netmask))))) {\r
       Status = EFI_INVALID_PARAMETER;\r
       goto ON_EXIT;\r
     }\r
@@ -246,7 +254,7 @@ Dns4Configure (
       goto ON_EXIT;\r
     }\r
 \r
-    if (DnsConfigData->DnsServerListCount == 0 || DnsConfigData->DnsServerList == NULL) {\r
+    if (DnsConfigData->DnsServerListCount == 0) {\r
       gBS->RestoreTPL (OldTpl); \r
       \r
       //\r
@@ -277,6 +285,7 @@ Dns4Configure (
     if (EFI_ERROR (Status)) {\r
       if (Instance->Dns4CfgData.DnsServerList != NULL) {\r
         FreePool (Instance->Dns4CfgData.DnsServerList);\r
+        Instance->Dns4CfgData.DnsServerList = NULL;\r
       }\r
       goto ON_EXIT;\r
     }\r
@@ -288,6 +297,7 @@ Dns4Configure (
     if (EFI_ERROR (Status)) {\r
       if (Instance->Dns4CfgData.DnsServerList != NULL) {\r
         FreePool (Instance->Dns4CfgData.DnsServerList);\r
+        Instance->Dns4CfgData.DnsServerList = NULL;\r
       }\r
       goto ON_EXIT;\r
     }\r
@@ -365,24 +375,30 @@ Dns4HostNameToIp (
   \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
+  Token->Status = EFI_NOT_READY;\r
+\r
   //\r
-  // Check the MaxRetry and RetryInterval values.\r
+  // If zero, use the parameter configured through Dns.Configure() interface.\r
   //\r
-  if (Instance->MaxRetry == 0) {\r
-    Instance->MaxRetry = DNS_DEFAULT_RETRY;\r
+  if (Token->RetryCount == 0) {\r
+    Token->RetryCount = ConfigData->RetryCount;\r
   }\r
 \r
+  //\r
+  // If zero, use the parameter configured through Dns.Configure() interface.\r
+  //\r
+  if (Token->RetryInterval == 0) {\r
+    Token->RetryInterval = ConfigData->RetryInterval;\r
+  }\r
+  \r
+  //\r
+  // Minimum interval of retry is 2 second. If the retry interval is less than 2 second, then use the 2 second. \r
+  //\r
   if (Token->RetryInterval < DNS_DEFAULT_TIMEOUT) {\r
     Token->RetryInterval = DNS_DEFAULT_TIMEOUT;\r
   }\r
@@ -448,9 +464,15 @@ Dns4HostNameToIp (
   }\r
   \r
   TokenEntry->PacketToLive = Token->RetryInterval;\r
-  TokenEntry->QueryHostName = HostName;\r
   TokenEntry->Token = Token;\r
-\r
+  TokenEntry->QueryHostName = AllocateZeroPool (StrSize (HostName));\r
+  if (TokenEntry->QueryHostName == NULL) {\r
+    Status = EFI_OUT_OF_RESOURCES;\r
+    goto ON_EXIT;\r
+  }\r
+  \r
+  CopyMem (TokenEntry->QueryHostName, HostName, StrSize (HostName));\r
+  \r
   //\r
   // Construct QName.\r
   //\r
@@ -464,11 +486,7 @@ Dns4HostNameToIp (
   // Construct DNS Query Packet.\r
   //\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
-    }\r
-    \r
+  if (EFI_ERROR (Status)) { \r
     goto ON_EXIT;\r
   }\r
 \r
@@ -479,12 +497,6 @@ Dns4HostNameToIp (
   //\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
@@ -492,15 +504,26 @@ Dns4HostNameToIp (
   // Dns Query Ip\r
   //\r
   Status = DoDnsQuery (Instance, Packet);\r
+  if (EFI_ERROR (Status)) {\r
+    Dns4RemoveTokenEntry (&Instance->Dns4TxTokens, TokenEntry);\r
+  }\r
+  \r
+ON_EXIT:\r
+\r
   if (EFI_ERROR (Status)) {\r
     if (TokenEntry != NULL) {\r
+      if (TokenEntry->QueryHostName != NULL) {\r
+        FreePool (TokenEntry->QueryHostName);\r
+      }\r
+      \r
       FreePool (TokenEntry);\r
     }\r
     \r
-    NetbufFree (Packet);\r
+    if (Packet != NULL) {\r
+      NetbufFree (Packet);\r
+    }\r
   }\r
   \r
-ON_EXIT:\r
   if (QueryName != NULL) {\r
     FreePool (QueryName);\r
   }\r
@@ -606,25 +629,31 @@ Dns4GeneralLookUp (
   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
+  Token->Status = EFI_NOT_READY;\r
+  \r
   //\r
-  // Check the MaxRetry and RetryInterval values.\r
+  // If zero, use the parameter configured through Dns.Configure() interface.\r
   //\r
-  if (Instance->MaxRetry == 0) {\r
-    Instance->MaxRetry = DNS_DEFAULT_RETRY;\r
+  if (Token->RetryCount == 0) {\r
+    Token->RetryCount = ConfigData->RetryCount;\r
+  }\r
+  \r
+  //\r
+  // If zero, use the parameter configured through Dns.Configure() interface.\r
+  //\r
+  if (Token->RetryInterval == 0) {\r
+    Token->RetryInterval = ConfigData->RetryInterval;\r
   }\r
 \r
+  //\r
+  // Minimum interval of retry is 2 second. If the retry interval is less than 2 second, then use the 2 second. \r
+  //\r
   if (Token->RetryInterval < DNS_DEFAULT_TIMEOUT) {\r
     Token->RetryInterval = DNS_DEFAULT_TIMEOUT;\r
   }\r
@@ -675,6 +704,8 @@ Dns4GeneralLookUp (
   //\r
   Status = DoDnsQuery (Instance, Packet);\r
   if (EFI_ERROR (Status)) {\r
+    Dns4RemoveTokenEntry (&Instance->Dns4TxTokens, TokenEntry);\r
+\r
     if (TokenEntry != NULL) {\r
       FreePool (TokenEntry);\r
     }\r
@@ -905,8 +936,8 @@ Dns6GetModeData (
     \r
   Instance  = DNS_INSTANCE_FROM_THIS_PROTOCOL6 (This);\r
   if (Instance->State == DNS_STATE_UNCONFIGED) {\r
-    gBS->RestoreTPL (OldTpl);\r
-    return  EFI_NOT_STARTED;\r
+    Status =  EFI_NOT_STARTED;\r
+    goto ON_EXIT;\r
   }\r
 \r
   ZeroMem (DnsModeData, sizeof (EFI_DNS6_MODE_DATA));\r
@@ -914,10 +945,9 @@ Dns6GetModeData (
   //\r
   // Get the current configuration data of this instance. \r
   //\r
-  Status = Dns6CopyConfigure(&DnsModeData->DnsConfigData, &Instance->Dns6CfgData);\r
+  Status = Dns6CopyConfigure (&DnsModeData->DnsConfigData, &Instance->Dns6CfgData);\r
   if (EFI_ERROR (Status)) {\r
-    gBS->RestoreTPL (OldTpl);\r
-    return Status;\r
+    goto ON_EXIT;\r
   }\r
   \r
   //\r
@@ -929,7 +959,12 @@ Dns6GetModeData (
   }\r
   DnsModeData->DnsServerCount = (UINT32) Index;\r
   ServerList = AllocatePool (sizeof(EFI_IPv6_ADDRESS) * DnsModeData->DnsServerCount);\r
-  ASSERT (ServerList != NULL);\r
+  if (ServerList == NULL) {\r
+    Status = EFI_OUT_OF_RESOURCES;\r
+    Dns6CleanConfigure (&DnsModeData->DnsConfigData);\r
+    goto ON_EXIT;\r
+  }\r
+  \r
   Index = 0;\r
   NET_LIST_FOR_EACH_SAFE (Entry, Next, &mDriverData->Dns6ServerList) {\r
     ServerItem = NET_LIST_USER_STRUCT (Entry, DNS6_SERVER_IP, AllServerLink);\r
@@ -947,7 +982,13 @@ Dns6GetModeData (
   }\r
   DnsModeData->DnsCacheCount = (UINT32) Index;\r
   CacheList = AllocatePool (sizeof(EFI_DNS6_CACHE_ENTRY) * DnsModeData->DnsCacheCount);\r
-  ASSERT (CacheList != NULL);\r
+  if (CacheList == NULL) {\r
+    Status = EFI_OUT_OF_RESOURCES;\r
+    Dns6CleanConfigure (&DnsModeData->DnsConfigData);\r
+    FreePool (ServerList);\r
+    goto ON_EXIT;\r
+  }\r
+  \r
   Index =0;\r
   NET_LIST_FOR_EACH_SAFE (Entry, Next, &mDriverData->Dns6CacheList) {\r
     CacheItem = NET_LIST_USER_STRUCT (Entry, DNS6_CACHE, AllCacheLink);\r
@@ -955,10 +996,10 @@ Dns6GetModeData (
     Index++;\r
   }\r
   DnsModeData->DnsCacheList = CacheList;\r
-\r
-  gBS->RestoreTPL (OldTpl);\r
   \r
-  return EFI_SUCCESS;\r
+ON_EXIT:\r
+  gBS->RestoreTPL (OldTpl);\r
+  return Status;\r
 }\r
 \r
 /**\r
@@ -1026,8 +1067,6 @@ Dns6Configure (
       Dns6InstanceCancelToken(Instance, NULL);\r
     }\r
 \r
-    Instance->MaxRetry = 0;\r
-\r
     if (Instance->UdpIo != NULL){\r
       UdpIoCleanIo (Instance->UdpIo);\r
     }\r
@@ -1052,7 +1091,7 @@ Dns6Configure (
       goto ON_EXIT;\r
     }\r
 \r
-    if (DnsConfigData->DnsServerCount == 0 || DnsConfigData->DnsServerList == NULL) {\r
+    if (DnsConfigData->DnsServerCount == 0) {\r
       gBS->RestoreTPL (OldTpl);\r
 \r
       //\r
@@ -1080,10 +1119,13 @@ Dns6Configure (
     //\r
     // Config UDP\r
     //\r
+    gBS->RestoreTPL (OldTpl);\r
     Status = Dns6ConfigUdp (Instance, Instance->UdpIo);\r
+    OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
     if (EFI_ERROR (Status)) {\r
       if (Instance->Dns6CfgData.DnsServerList != NULL) {\r
         FreePool (Instance->Dns6CfgData.DnsServerList);\r
+        Instance->Dns6CfgData.DnsServerList = NULL;\r
       }\r
       goto ON_EXIT;\r
     }\r
@@ -1095,6 +1137,7 @@ Dns6Configure (
     if (EFI_ERROR (Status)) {\r
       if (Instance->Dns6CfgData.DnsServerList != NULL) {\r
         FreePool (Instance->Dns6CfgData.DnsServerList);\r
+        Instance->Dns6CfgData.DnsServerList = NULL;\r
       }\r
       goto ON_EXIT;\r
     }\r
@@ -1173,28 +1216,34 @@ Dns6HostNameToIp (
   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
+  Token->Status = EFI_NOT_READY;\r
+\r
   //\r
-  // Check the MaxRetry and RetryInterval values.\r
+  // If zero, use the parameter configured through Dns.Configure() interface.\r
   //\r
-  if (Instance->MaxRetry == 0) {\r
-    Instance->MaxRetry = DNS_DEFAULT_RETRY;\r
+  if (Token->RetryCount == 0) {\r
+    Token->RetryCount = ConfigData->RetryCount;\r
   }\r
 \r
+  //\r
+  // If zero, use the parameter configured through Dns.Configure() interface.\r
+  //\r
+  if (Token->RetryInterval == 0) {\r
+    Token->RetryInterval = ConfigData->RetryInterval;\r
+  }\r
+  \r
+  //\r
+  // Minimum interval of retry is 2 second. If the retry interval is less than 2 second, then use the 2 second. \r
+  //\r
   if (Token->RetryInterval < DNS_DEFAULT_TIMEOUT) {\r
     Token->RetryInterval = DNS_DEFAULT_TIMEOUT;\r
-  } \r
+  }\r
 \r
   //\r
   // Check cache\r
@@ -1257,9 +1306,14 @@ Dns6HostNameToIp (
   }\r
   \r
   TokenEntry->PacketToLive = Token->RetryInterval;\r
-  TokenEntry->QueryHostName = HostName;\r
   TokenEntry->Token = Token;\r
-\r
+  TokenEntry->QueryHostName = AllocateZeroPool (StrSize (HostName));\r
+  if (TokenEntry->QueryHostName == NULL) {\r
+    Status = EFI_OUT_OF_RESOURCES;\r
+    goto ON_EXIT;\r
+  }\r
+  \r
+  CopyMem (TokenEntry->QueryHostName, HostName, StrSize (HostName));\r
 \r
   //\r
   // Construct QName.\r
@@ -1275,10 +1329,6 @@ Dns6HostNameToIp (
   //\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
-    }\r
-    \r
     goto ON_EXIT;\r
   }\r
 \r
@@ -1289,12 +1339,6 @@ Dns6HostNameToIp (
   //\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
@@ -1302,15 +1346,26 @@ Dns6HostNameToIp (
   // Dns Query Ip\r
   //\r
   Status = DoDnsQuery (Instance, Packet);\r
+  if (EFI_ERROR (Status)) {\r
+    Dns6RemoveTokenEntry (&Instance->Dns6TxTokens, TokenEntry);\r
+  }\r
+  \r
+ON_EXIT:\r
+\r
   if (EFI_ERROR (Status)) {\r
     if (TokenEntry != NULL) {\r
+      if (TokenEntry->QueryHostName != NULL) {\r
+        FreePool (TokenEntry->QueryHostName);\r
+      }\r
+      \r
       FreePool (TokenEntry);\r
     }\r
     \r
-    NetbufFree (Packet);\r
+    if (Packet != NULL) {\r
+      NetbufFree (Packet);\r
+    }\r
   }\r
   \r
-ON_EXIT:\r
   if (QueryName != NULL) {\r
     FreePool (QueryName);\r
   }\r
@@ -1419,25 +1474,31 @@ Dns6GeneralLookUp (
   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
+  Token->Status = EFI_NOT_READY;\r
+  \r
+  //\r
+  // If zero, use the parameter configured through Dns.Configure() interface.\r
+  //\r
+  if (Token->RetryCount == 0) {\r
+    Token->RetryCount = ConfigData->RetryCount;\r
+  }\r
+  \r
   //\r
-  // Check the MaxRetry and RetryInterval values.\r
+  // If zero, use the parameter configured through Dns.Configure() interface.\r
   //\r
-  if (Instance->MaxRetry == 0) {\r
-    Instance->MaxRetry = DNS_DEFAULT_RETRY;\r
+  if (Token->RetryInterval == 0) {\r
+    Token->RetryInterval = ConfigData->RetryInterval;\r
   }\r
 \r
+  //\r
+  // Minimum interval of retry is 2 second. If the retry interval is less than 2 second, then use the 2 second. \r
+  //\r
   if (Token->RetryInterval < DNS_DEFAULT_TIMEOUT) {\r
     Token->RetryInterval = DNS_DEFAULT_TIMEOUT;\r
   }\r
@@ -1488,6 +1549,8 @@ Dns6GeneralLookUp (
   //\r
   Status = DoDnsQuery (Instance, Packet);\r
   if (EFI_ERROR (Status)) {\r
+    Dns6RemoveTokenEntry (&Instance->Dns6TxTokens, TokenEntry);\r
+\r
     if (TokenEntry != NULL) {\r
       FreePool (TokenEntry);\r
     }\r