+ 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