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
DNS6_TOKEN_ENTRY *Dns6TokenEntry;\r
\r
UINT32 IpCount;\r
+ UINT32 RRCount;\r
UINT32 AnswerSectionNum;\r
\r
EFI_IPv4_ADDRESS *HostAddr4;\r
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
Dns6TokenEntry = NULL;\r
\r
IpCount = 0;\r
+ RRCount = 0;\r
AnswerSectionNum = 0;\r
\r
HostAddr4 = NULL;\r
\r
Dns4CacheEntry = NULL;\r
Dns6CacheEntry = NULL;\r
+ \r
+ Dns4RR = NULL;\r
+ Dns6RR = NULL;\r
\r
*Completed = TRUE;\r
Status = EFI_SUCCESS;\r
}\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
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
// 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
// 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
\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
}\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
//\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
LIST_ENTRY *Entry;\r
LIST_ENTRY *Next;\r
\r
+ CHAR8 *QueryName;\r
+ \r
DNS4_TOKEN_ENTRY *TokenEntry;\r
NET_BUF *Packet;\r
\r
\r
Status = EFI_SUCCESS;\r
Item = NULL;\r
+ QueryName = NULL;\r
TokenEntry = NULL;\r
Packet = NULL;\r
\r
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
}\r
\r
ON_EXIT:\r
+ if (QueryName != NULL) {\r
+ FreePool (QueryName);\r
+ }\r
+ \r
gBS->RestoreTPL (OldTpl);\r
return Status;\r
}\r
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
LIST_ENTRY *Entry;\r
LIST_ENTRY *Next;\r
\r
+ CHAR8 *QueryName;\r
+ \r
DNS6_TOKEN_ENTRY *TokenEntry;\r
NET_BUF *Packet;\r
\r
\r
Status = EFI_SUCCESS;\r
Item = NULL;\r
+ QueryName = NULL;\r
TokenEntry = NULL;\r
Packet = NULL;\r
\r
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
}\r
\r
ON_EXIT:\r
+ if (QueryName != NULL) {\r
+ FreePool (QueryName);\r
+ }\r
+ \r
gBS->RestoreTPL (OldTpl);\r
return Status;\r
}\r
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