]> git.proxmox.com Git - mirror_edk2.git/blame - NetworkPkg/DnsDxe/DnsProtocol.c
NetworkPkg/DnsDxe: Fix zero StationIp configuration failure of DNSv6
[mirror_edk2.git] / NetworkPkg / DnsDxe / DnsProtocol.c
CommitLineData
99c048ef 1/** @file\r
2Implementation of EFI_DNS4_PROTOCOL and EFI_DNS6_PROTOCOL interfaces.\r
3\r
ba025280 4Copyright (c) 2015 - 2017, Intel Corporation. All rights reserved.<BR>\r
99c048ef 5This program and the accompanying materials\r
6are licensed and made available under the terms and conditions of the BSD License\r
7which accompanies this distribution. The full text of the license may be found at\r
8http://opensource.org/licenses/bsd-license.php\r
9\r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#include "DnsImpl.h"\r
16\r
17EFI_DNS4_PROTOCOL mDns4Protocol = {\r
18 Dns4GetModeData,\r
19 Dns4Configure,\r
20 Dns4HostNameToIp,\r
21 Dns4IpToHostName,\r
22 Dns4GeneralLookUp,\r
23 Dns4UpdateDnsCache,\r
24 Dns4Poll,\r
25 Dns4Cancel\r
26};\r
27\r
28EFI_DNS6_PROTOCOL mDns6Protocol = {\r
29 Dns6GetModeData,\r
30 Dns6Configure,\r
31 Dns6HostNameToIp,\r
32 Dns6IpToHostName,\r
33 Dns6GeneralLookUp,\r
34 Dns6UpdateDnsCache,\r
35 Dns6Poll,\r
36 Dns6Cancel\r
37};\r
38\r
39/**\r
0f4e123f 40 Retrieve mode data of this DNS instance.\r
99c048ef 41\r
0f4e123f 42 This function is used to retrieve DNS mode data for this DNS instance.\r
99c048ef 43\r
0f4e123f
JW
44 @param[in] This Pointer to EFI_DNS4_PROTOCOL instance.\r
45 @param[out] DnsModeData Point to the mode data.\r
99c048ef 46\r
0f4e123f
JW
47 @retval EFI_SUCCESS The operation completed successfully.\r
48 @retval EFI_NOT_STARTED When DnsConfigData is queried, no configuration data\r
49 is available because this instance has not been\r
50 configured.\r
51 @retval EFI_INVALID_PARAMETER This is NULL or DnsModeData is NULL.\r
52 @retval EFI_OUT_OF_RESOURCES Failed to allocate needed resources.\r
99c048ef 53**/\r
54EFI_STATUS\r
55EFIAPI\r
56Dns4GetModeData (\r
57 IN EFI_DNS4_PROTOCOL *This,\r
58 OUT EFI_DNS4_MODE_DATA *DnsModeData\r
59 )\r
60{\r
61 DNS_INSTANCE *Instance;\r
62 \r
63 EFI_TPL OldTpl;\r
64\r
65 UINTN Index;\r
66 \r
67 LIST_ENTRY *Entry;\r
68 LIST_ENTRY *Next;\r
69 \r
70 DNS4_SERVER_IP *ServerItem;\r
71 EFI_IPv4_ADDRESS *ServerList;\r
72 DNS4_CACHE *CacheItem;\r
73 EFI_DNS4_CACHE_ENTRY *CacheList;\r
74 EFI_STATUS Status;\r
75\r
76 ServerItem = NULL;\r
77 ServerList = NULL;\r
78 CacheItem = NULL;\r
79 CacheList = NULL;\r
80 Status = EFI_SUCCESS;\r
81 \r
82 \r
83 if ((This == NULL) || (DnsModeData == NULL)) {\r
84 return EFI_INVALID_PARAMETER;\r
85 }\r
86\r
87 OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
88 \r
89 Instance = DNS_INSTANCE_FROM_THIS_PROTOCOL4 (This);\r
90 if (Instance->State == DNS_STATE_UNCONFIGED) {\r
ac0f5843
JW
91 Status = EFI_NOT_STARTED;\r
92 goto ON_EXIT;\r
99c048ef 93 }\r
94 \r
95 ZeroMem (DnsModeData, sizeof (EFI_DNS4_MODE_DATA));\r
96\r
97 //\r
98 // Get the current configuration data of this instance. \r
99 //\r
100 Status = Dns4CopyConfigure (&DnsModeData->DnsConfigData, &Instance->Dns4CfgData);\r
101 if (EFI_ERROR (Status)) {\r
ac0f5843 102 goto ON_EXIT;\r
99c048ef 103 }\r
104\r
105 //\r
106 // Get the DnsServerCount and DnsServerList\r
107 //\r
108 Index = 0;\r
109 NET_LIST_FOR_EACH_SAFE (Entry, Next, &mDriverData->Dns4ServerList) {\r
110 Index++;\r
111 }\r
112 DnsModeData->DnsServerCount = (UINT32) Index;\r
113 ServerList = AllocatePool (sizeof (EFI_IPv4_ADDRESS) * DnsModeData->DnsServerCount);\r
ac0f5843
JW
114 if (ServerList == NULL) {\r
115 Status = EFI_OUT_OF_RESOURCES;\r
116 Dns4CleanConfigure (&DnsModeData->DnsConfigData);\r
117 goto ON_EXIT;\r
118 }\r
119 \r
99c048ef 120 Index = 0;\r
121 NET_LIST_FOR_EACH_SAFE (Entry, Next, &mDriverData->Dns4ServerList) {\r
122 ServerItem = NET_LIST_USER_STRUCT (Entry, DNS4_SERVER_IP, AllServerLink);\r
123 CopyMem (ServerList + Index, &ServerItem->Dns4ServerIp, sizeof (EFI_IPv4_ADDRESS));\r
124 Index++;\r
125 }\r
126 DnsModeData->DnsServerList = ServerList;\r
127\r
128 //\r
129 // Get the DnsCacheCount and DnsCacheList\r
130 //\r
131 Index =0;\r
132 NET_LIST_FOR_EACH_SAFE (Entry, Next, &mDriverData->Dns4CacheList) {\r
133 Index++;\r
134 }\r
135 DnsModeData->DnsCacheCount = (UINT32) Index;\r
136 CacheList = AllocatePool (sizeof (EFI_DNS4_CACHE_ENTRY) * DnsModeData->DnsCacheCount);\r
ac0f5843
JW
137 if (CacheList == NULL) {\r
138 Status = EFI_OUT_OF_RESOURCES;\r
139 Dns4CleanConfigure (&DnsModeData->DnsConfigData);\r
140 FreePool (ServerList);\r
141 goto ON_EXIT;\r
142 }\r
143 \r
99c048ef 144 Index =0;\r
145 NET_LIST_FOR_EACH_SAFE (Entry, Next, &mDriverData->Dns4CacheList) {\r
146 CacheItem = NET_LIST_USER_STRUCT (Entry, DNS4_CACHE, AllCacheLink);\r
147 CopyMem (CacheList + Index, &CacheItem->DnsCache, sizeof (EFI_DNS4_CACHE_ENTRY));\r
148 Index++;\r
149 }\r
150 DnsModeData->DnsCacheList = CacheList;\r
151\r
ac0f5843 152ON_EXIT:\r
99c048ef 153 gBS->RestoreTPL (OldTpl);\r
ac0f5843 154 return Status;\r
99c048ef 155}\r
156\r
157/**\r
0f4e123f
JW
158 Configure this DNS instance.\r
159\r
160 This function is used to configure DNS mode data for this DNS instance.\r
161\r
162 @param[in] This Pointer to EFI_DNS4_PROTOCOL instance.\r
163 @param[in] DnsConfigData Point to the Configuration data.\r
164\r
165 @retval EFI_SUCCESS The operation completed successfully.\r
166 @retval EFI_UNSUPPORTED The designated protocol is not supported.\r
167 @retval EFI_INVALID_PARAMTER Thisis NULL.\r
168 The StationIp address provided in DnsConfigData is not a \r
169 valid unicast.\r
170 DnsServerList is NULL while DnsServerListCount\r
171 is not ZERO.\r
172 DnsServerListCount is ZERO while DnsServerList\r
173 is not NULL\r
174 @retval EFI_OUT_OF_RESOURCES The DNS instance data or required space could not be\r
175 allocated.\r
176 @retval EFI_DEVICE_ERROR An unexpected system or network error occurred. The\r
177 EFI DNSv4 Protocol instance is not configured.\r
178 @retval EFI_ALREADY_STARTED Second call to Configure() with DnsConfigData. To \r
179 reconfigure the instance the caller must call Configure() \r
180 with NULL first to return driver to unconfigured state.\r
99c048ef 181**/\r
182EFI_STATUS\r
183EFIAPI\r
184Dns4Configure (\r
185 IN EFI_DNS4_PROTOCOL *This,\r
186 IN EFI_DNS4_CONFIG_DATA *DnsConfigData\r
187 )\r
188{\r
189 EFI_STATUS Status;\r
190 DNS_INSTANCE *Instance;\r
191 \r
192 EFI_TPL OldTpl;\r
193 IP4_ADDR Ip;\r
194 IP4_ADDR Netmask;\r
195\r
196 UINT32 ServerListCount;\r
197 EFI_IPv4_ADDRESS *ServerList; \r
198\r
199 Status = EFI_SUCCESS;\r
200 ServerList = NULL;\r
201 \r
202 if (This == NULL || \r
203 (DnsConfigData != NULL && ((DnsConfigData->DnsServerListCount != 0 && DnsConfigData->DnsServerList == NULL) || \r
204 (DnsConfigData->DnsServerListCount == 0 && DnsConfigData->DnsServerList != NULL)))) {\r
205 return EFI_INVALID_PARAMETER;\r
206 }\r
207\r
208 if (DnsConfigData != NULL && DnsConfigData->Protocol != DNS_PROTOCOL_UDP) {\r
209 return EFI_UNSUPPORTED;\r
210 }\r
211\r
212 OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
213\r
214 Instance = DNS_INSTANCE_FROM_THIS_PROTOCOL4 (This);\r
215\r
216 if (DnsConfigData == NULL) {\r
217 ZeroMem (&Instance->SessionDnsServer, sizeof (EFI_IP_ADDRESS));\r
218 \r
219 //\r
220 // Reset the Instance if ConfigData is NULL\r
221 //\r
222 if (!NetMapIsEmpty(&Instance->Dns4TxTokens)) {\r
223 Dns4InstanceCancelToken(Instance, NULL);\r
224 }\r
225\r
226 Instance->MaxRetry = 0;\r
227\r
228 if (Instance->UdpIo != NULL){\r
229 UdpIoCleanIo (Instance->UdpIo);\r
230 }\r
231 \r
232 if (Instance->Dns4CfgData.DnsServerList != NULL) {\r
233 FreePool (Instance->Dns4CfgData.DnsServerList);\r
234 }\r
235 ZeroMem (&Instance->Dns4CfgData, sizeof (EFI_DNS4_CONFIG_DATA));\r
236 \r
237 Instance->State = DNS_STATE_UNCONFIGED;\r
238 } else {\r
239 //\r
240 // Configure the parameters for new operation.\r
241 //\r
242 CopyMem (&Ip, &DnsConfigData->StationIp, sizeof (IP4_ADDR));\r
243 CopyMem (&Netmask, &DnsConfigData->SubnetMask, sizeof (IP4_ADDR));\r
244\r
245 Ip = NTOHL (Ip);\r
246 Netmask = NTOHL (Netmask);\r
247\r
248 if (!DnsConfigData->UseDefaultSetting &&\r
ba025280 249 ((!IP4_IS_VALID_NETMASK (Netmask) || (Netmask != 0 && !NetIp4IsUnicast (Ip, Netmask))))) {\r
99c048ef 250 Status = EFI_INVALID_PARAMETER;\r
251 goto ON_EXIT;\r
252 }\r
253\r
254 Status = Dns4CopyConfigure (&Instance->Dns4CfgData, DnsConfigData);\r
255 if (EFI_ERROR (Status)) {\r
256 goto ON_EXIT;\r
257 }\r
258\r
259 if (DnsConfigData->DnsServerListCount == 0 || DnsConfigData->DnsServerList == NULL) {\r
260 gBS->RestoreTPL (OldTpl); \r
261 \r
262 //\r
263 // The DNS instance will retrieve DNS server from DHCP Server\r
264 //\r
265 Status = GetDns4ServerFromDhcp4 (\r
266 Instance,\r
267 &ServerListCount, \r
268 &ServerList\r
269 );\r
270 if (EFI_ERROR (Status)) {\r
271 return Status;\r
272 }\r
273\r
274 ASSERT(ServerList != NULL);\r
275 \r
276 OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
277\r
278 CopyMem (&Instance->SessionDnsServer.v4, &ServerList[0], sizeof (EFI_IPv4_ADDRESS));\r
279 } else {\r
280 CopyMem (&Instance->SessionDnsServer.v4, &DnsConfigData->DnsServerList[0], sizeof (EFI_IPv4_ADDRESS));\r
281 }\r
282\r
283 //\r
284 // Config UDP\r
285 //\r
286 Status = Dns4ConfigUdp (Instance, Instance->UdpIo);\r
287 if (EFI_ERROR (Status)) {\r
288 if (Instance->Dns4CfgData.DnsServerList != NULL) {\r
289 FreePool (Instance->Dns4CfgData.DnsServerList);\r
8aa2cdd7 290 Instance->Dns4CfgData.DnsServerList = NULL;\r
99c048ef 291 }\r
292 goto ON_EXIT;\r
293 }\r
294\r
295 //\r
296 // Add configured DNS server used by this instance to ServerList.\r
297 //\r
298 Status = AddDns4ServerIp (&mDriverData->Dns4ServerList, Instance->SessionDnsServer.v4);\r
299 if (EFI_ERROR (Status)) {\r
300 if (Instance->Dns4CfgData.DnsServerList != NULL) {\r
301 FreePool (Instance->Dns4CfgData.DnsServerList);\r
8aa2cdd7 302 Instance->Dns4CfgData.DnsServerList = NULL;\r
99c048ef 303 }\r
304 goto ON_EXIT;\r
305 }\r
306 \r
307 Instance->State = DNS_STATE_CONFIGED;\r
308 }\r
309\r
310ON_EXIT:\r
311 gBS->RestoreTPL (OldTpl);\r
312 return Status;\r
313}\r
314\r
315/**\r
0f4e123f
JW
316 Host name to host address translation.\r
317\r
318 The HostNameToIp () function is used to translate the host name to host IP address. A\r
319 type A query is used to get the one or more IP addresses for this host.\r
320\r
321 @param[in] This Pointer to EFI_DNS4_PROTOCOL instance.\r
322 @param[in] HostName Host name.\r
323 @param[in] Token Point to the completion token to translate host name\r
324 to host address.\r
325\r
326 @retval EFI_SUCCESS The operation completed successfully.\r
327 @retval EFI_INVALID_PARAMETER One or more of the following conditions is TRUE:\r
328 This is NULL.\r
329 Token is NULL.\r
330 Token.Event is NULL.\r
331 HostName is NULL. HostName string is unsupported format.\r
332 @retval EFI_NO_MAPPING There's no source address is available for use.\r
333 @retval EFI_NOT_STARTED This instance has not been started.\r
99c048ef 334**/\r
335EFI_STATUS\r
336EFIAPI\r
337Dns4HostNameToIp (\r
338 IN EFI_DNS4_PROTOCOL *This,\r
339 IN CHAR16 *HostName,\r
340 IN EFI_DNS4_COMPLETION_TOKEN *Token\r
341 )\r
342{\r
343 EFI_STATUS Status;\r
344 \r
345 DNS_INSTANCE *Instance;\r
346 \r
347 EFI_DNS4_CONFIG_DATA *ConfigData;\r
348 \r
349 UINTN Index;\r
350 DNS4_CACHE *Item;\r
351 LIST_ENTRY *Entry;\r
352 LIST_ENTRY *Next;\r
353 \r
fcae1a99
JW
354 CHAR8 *QueryName;\r
355 \r
99c048ef 356 DNS4_TOKEN_ENTRY *TokenEntry;\r
357 NET_BUF *Packet;\r
358 \r
359 EFI_TPL OldTpl;\r
360 \r
361 Status = EFI_SUCCESS;\r
362 Item = NULL;\r
fcae1a99 363 QueryName = NULL;\r
99c048ef 364 TokenEntry = NULL;\r
365 Packet = NULL;\r
366 \r
367 //\r
368 // Validate the parameters\r
369 //\r
370 if ((This == NULL) || (HostName == NULL) || Token == NULL) {\r
371 return EFI_INVALID_PARAMETER;\r
372 }\r
373 \r
374 OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
375 \r
376 Instance = DNS_INSTANCE_FROM_THIS_PROTOCOL4 (This);\r
377 \r
378 ConfigData = &(Instance->Dns4CfgData);\r
379 \r
380 Instance->MaxRetry = ConfigData->RetryCount;\r
381 \r
382 Token->Status = EFI_NOT_READY;\r
383 Token->RetryCount = 0;\r
384 Token->RetryInterval = ConfigData->RetryInterval;\r
385\r
386 if (Instance->State != DNS_STATE_CONFIGED) {\r
387 Status = EFI_NOT_STARTED;\r
388 goto ON_EXIT;\r
389 }\r
390\r
391 //\r
392 // Check the MaxRetry and RetryInterval values.\r
393 //\r
394 if (Instance->MaxRetry == 0) {\r
395 Instance->MaxRetry = DNS_DEFAULT_RETRY;\r
396 }\r
397\r
398 if (Token->RetryInterval < DNS_DEFAULT_TIMEOUT) {\r
399 Token->RetryInterval = DNS_DEFAULT_TIMEOUT;\r
400 }\r
401\r
402 //\r
403 // Check cache\r
404 //\r
405 if (ConfigData->EnableDnsCache) {\r
406 Index = 0;\r
407 NET_LIST_FOR_EACH_SAFE (Entry, Next, &mDriverData->Dns4CacheList) {\r
408 Item = NET_LIST_USER_STRUCT (Entry, DNS4_CACHE, AllCacheLink);\r
409 if (StrCmp (HostName, Item->DnsCache.HostName) == 0) {\r
410 Index++;\r
411 }\r
412 }\r
413\r
414 if (Index != 0) {\r
415 Token->RspData.H2AData = AllocatePool (sizeof (DNS_HOST_TO_ADDR_DATA));\r
416 if (Token->RspData.H2AData == NULL) {\r
417 Status = EFI_OUT_OF_RESOURCES;\r
418 goto ON_EXIT;\r
419 }\r
420\r
421 Token->RspData.H2AData->IpCount = (UINT32)Index;\r
422 Token->RspData.H2AData->IpList = AllocatePool (sizeof (EFI_IPv4_ADDRESS) * Index);\r
423 if (Token->RspData.H2AData->IpList == NULL) {\r
424 if (Token->RspData.H2AData != NULL) {\r
425 FreePool (Token->RspData.H2AData);\r
426 }\r
427 \r
428 Status = EFI_OUT_OF_RESOURCES;\r
429 goto ON_EXIT;\r
430 }\r
431\r
432 Index = 0;\r
433 NET_LIST_FOR_EACH_SAFE (Entry, Next, &mDriverData->Dns4CacheList) {\r
434 Item = NET_LIST_USER_STRUCT (Entry, DNS4_CACHE, AllCacheLink);\r
435 if ((UINT32)Index < Token->RspData.H2AData->IpCount && StrCmp (HostName, Item->DnsCache.HostName) == 0) {\r
436 CopyMem ((Token->RspData.H2AData->IpList) + Index, Item->DnsCache.IpAddress, sizeof (EFI_IPv4_ADDRESS));\r
437 Index++; \r
438 }\r
439 }\r
440 \r
441 Token->Status = EFI_SUCCESS;\r
442 \r
443 if (Token->Event != NULL) {\r
444 gBS->SignalEvent (Token->Event);\r
445 DispatchDpc ();\r
446 }\r
447\r
448 Status = Token->Status;\r
449 goto ON_EXIT;\r
450 } \r
451 }\r
452\r
453 //\r
454 // Construct DNS TokenEntry.\r
455 //\r
456 TokenEntry = AllocateZeroPool (sizeof(DNS4_TOKEN_ENTRY));\r
457 if (TokenEntry == NULL) {\r
458 Status = EFI_OUT_OF_RESOURCES;\r
459 goto ON_EXIT;\r
460 }\r
461 \r
462 TokenEntry->PacketToLive = Token->RetryInterval;\r
463 TokenEntry->QueryHostName = HostName;\r
464 TokenEntry->Token = Token;\r
465\r
fcae1a99
JW
466 //\r
467 // Construct QName.\r
468 //\r
3700da73 469 QueryName = NetLibCreateDnsQName (TokenEntry->QueryHostName);\r
fcae1a99
JW
470 if (QueryName == NULL) {\r
471 Status = EFI_OUT_OF_RESOURCES;\r
472 goto ON_EXIT;\r
473 }\r
474 \r
99c048ef 475 //\r
476 // Construct DNS Query Packet.\r
477 //\r
fcae1a99 478 Status = ConstructDNSQuery (Instance, QueryName, DNS_TYPE_A, DNS_CLASS_INET, &Packet);\r
99c048ef 479 if (EFI_ERROR (Status)) {\r
480 if (TokenEntry != NULL) {\r
481 FreePool (TokenEntry);\r
482 }\r
483 \r
484 goto ON_EXIT;\r
485 }\r
486\r
8339166d
JW
487 ASSERT (Packet != NULL);\r
488\r
99c048ef 489 //\r
490 // Save the token into the Dns4TxTokens map.\r
491 //\r
492 Status = NetMapInsertTail (&Instance->Dns4TxTokens, TokenEntry, Packet);\r
493 if (EFI_ERROR (Status)) {\r
494 if (TokenEntry != NULL) {\r
495 FreePool (TokenEntry);\r
496 }\r
497 \r
498 NetbufFree (Packet);\r
499 \r
500 goto ON_EXIT;\r
501 }\r
502 \r
503 //\r
504 // Dns Query Ip\r
505 //\r
506 Status = DoDnsQuery (Instance, Packet);\r
507 if (EFI_ERROR (Status)) {\r
520a0746
JW
508 Dns4RemoveTokenEntry (&Instance->Dns4TxTokens, TokenEntry);\r
509\r
99c048ef 510 if (TokenEntry != NULL) {\r
511 FreePool (TokenEntry);\r
512 }\r
513 \r
514 NetbufFree (Packet);\r
515 }\r
516 \r
517ON_EXIT:\r
fcae1a99
JW
518 if (QueryName != NULL) {\r
519 FreePool (QueryName);\r
520 }\r
521 \r
99c048ef 522 gBS->RestoreTPL (OldTpl);\r
523 return Status;\r
524}\r
525\r
526/**\r
0f4e123f
JW
527 IPv4 address to host name translation also known as Reverse DNS lookup.\r
528\r
529 The IpToHostName() function is used to translate the host address to host name. A type PTR \r
530 query is used to get the primary name of the host. Support of this function is optional.\r
531\r
532 @param[in] This Pointer to EFI_DNS4_PROTOCOL instance.\r
533 @param[in] IpAddress Ip Address.\r
534 @param[in] Token Point to the completion token to translate host\r
535 address to host name.\r
536\r
537 @retval EFI_SUCCESS The operation completed successfully.\r
538 @retval EFI_UNSUPPORTED This function is not supported.\r
539 @retval EFI_INVALID_PARAMETER One or more of the following conditions is TRUE:\r
540 This is NULL.\r
541 Token is NULL.\r
542 Token.Event is NULL.\r
543 IpAddress is not valid IP address .\r
544 @retval EFI_NO_MAPPING There's no source address is available for use.\r
545 @retval EFI_ALREADY_STARTED This Token is being used in another DNS session.\r
546 @retval EFI_OUT_OF_RESOURCES Failed to allocate needed resources.\r
99c048ef 547**/\r
548EFI_STATUS\r
549EFIAPI\r
550Dns4IpToHostName (\r
551 IN EFI_DNS4_PROTOCOL *This,\r
552 IN EFI_IPv4_ADDRESS IpAddress,\r
553 IN EFI_DNS4_COMPLETION_TOKEN *Token\r
554 )\r
555{\r
556 return EFI_UNSUPPORTED;\r
557}\r
558\r
559/**\r
0f4e123f
JW
560 Retrieve arbitrary information from the DNS server. \r
561\r
562 This GeneralLookup() function retrieves arbitrary information from the DNS. The caller\r
563 supplies a QNAME, QTYPE, and QCLASS, and all of the matching RRs are returned. All\r
564 RR content (e.g., TTL) was returned. The caller need parse the returned RR to get\r
565 required information. The function is optional.\r
566\r
567 @param[in] This Pointer to EFI_DNS4_PROTOCOL instance.\r
568 @param[in] QName Pointer to Query Name.\r
569 @param[in] QType Query Type.\r
570 @param[in] QClass Query Name.\r
571 @param[in] Token Point to the completion token to retrieve arbitrary\r
572 information.\r
573\r
574 @retval EFI_SUCCESS The operation completed successfully.\r
575 @retval EFI_UNSUPPORTED This function is not supported. Or the requested\r
576 QType is not supported\r
577 @retval EFI_INVALID_PARAMETER One or more of the following conditions is TRUE:\r
578 This is NULL.\r
579 Token is NULL.\r
580 Token.Event is NULL.\r
581 QName is NULL.\r
582 @retval EFI_NO_MAPPING There's no source address is available for use.\r
583 @retval EFI_ALREADY_STARTED This Token is being used in another DNS session.\r
584 @retval EFI_OUT_OF_RESOURCES Failed to allocate needed resources.\r
99c048ef 585**/\r
586EFI_STATUS\r
587EFIAPI\r
588Dns4GeneralLookUp (\r
589 IN EFI_DNS4_PROTOCOL *This,\r
590 IN CHAR8 *QName,\r
591 IN UINT16 QType, \r
592 IN UINT16 QClass,\r
593 IN EFI_DNS4_COMPLETION_TOKEN *Token\r
594 )\r
595{\r
fcae1a99
JW
596 EFI_STATUS Status;\r
597 \r
598 DNS_INSTANCE *Instance;\r
599 \r
600 EFI_DNS4_CONFIG_DATA *ConfigData;\r
601 \r
602 DNS4_TOKEN_ENTRY *TokenEntry;\r
603 NET_BUF *Packet;\r
604 \r
605 EFI_TPL OldTpl;\r
606 \r
607 Status = EFI_SUCCESS;\r
608 TokenEntry = NULL;\r
609 Packet = NULL;\r
610 \r
611 //\r
612 // Validate the parameters\r
613 //\r
614 if ((This == NULL) || (QName == NULL) || Token == NULL) {\r
615 return EFI_INVALID_PARAMETER;\r
616 }\r
617 \r
618 OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
619 \r
620 Instance = DNS_INSTANCE_FROM_THIS_PROTOCOL4 (This);\r
621 \r
622 ConfigData = &(Instance->Dns4CfgData);\r
623 \r
624 Instance->MaxRetry = ConfigData->RetryCount;\r
625 \r
626 Token->Status = EFI_NOT_READY;\r
627 Token->RetryCount = 0;\r
628 Token->RetryInterval = ConfigData->RetryInterval;\r
629\r
630 if (Instance->State != DNS_STATE_CONFIGED) {\r
631 Status = EFI_NOT_STARTED;\r
632 goto ON_EXIT;\r
633 }\r
634\r
635 //\r
636 // Check the MaxRetry and RetryInterval values.\r
637 //\r
638 if (Instance->MaxRetry == 0) {\r
639 Instance->MaxRetry = DNS_DEFAULT_RETRY;\r
640 }\r
641\r
642 if (Token->RetryInterval < DNS_DEFAULT_TIMEOUT) {\r
643 Token->RetryInterval = DNS_DEFAULT_TIMEOUT;\r
644 }\r
645\r
646 //\r
647 // Construct DNS TokenEntry.\r
648 //\r
649 TokenEntry = AllocateZeroPool (sizeof(DNS4_TOKEN_ENTRY));\r
650 if (TokenEntry == NULL) {\r
651 Status = EFI_OUT_OF_RESOURCES;\r
652 goto ON_EXIT;\r
653 }\r
654 \r
655 TokenEntry->PacketToLive = Token->RetryInterval;\r
656 TokenEntry->GeneralLookUp = TRUE;\r
657 TokenEntry->Token = Token;\r
658\r
659 //\r
660 // Construct DNS Query Packet.\r
661 //\r
662 Status = ConstructDNSQuery (Instance, QName, QType, QClass, &Packet);\r
663 if (EFI_ERROR (Status)) {\r
664 if (TokenEntry != NULL) {\r
665 FreePool (TokenEntry);\r
666 }\r
667 \r
668 goto ON_EXIT;\r
669 }\r
670\r
8339166d
JW
671 ASSERT (Packet != NULL);\r
672\r
fcae1a99
JW
673 //\r
674 // Save the token into the Dns4TxTokens map.\r
675 //\r
676 Status = NetMapInsertTail (&Instance->Dns4TxTokens, TokenEntry, Packet);\r
677 if (EFI_ERROR (Status)) {\r
678 if (TokenEntry != NULL) {\r
679 FreePool (TokenEntry);\r
680 }\r
681 \r
682 NetbufFree (Packet);\r
683 \r
684 goto ON_EXIT;\r
685 }\r
686 \r
687 //\r
688 // Dns Query Ip\r
689 //\r
690 Status = DoDnsQuery (Instance, Packet);\r
691 if (EFI_ERROR (Status)) {\r
520a0746
JW
692 Dns4RemoveTokenEntry (&Instance->Dns4TxTokens, TokenEntry);\r
693\r
fcae1a99
JW
694 if (TokenEntry != NULL) {\r
695 FreePool (TokenEntry);\r
696 }\r
697 \r
698 NetbufFree (Packet);\r
699 }\r
700 \r
701ON_EXIT:\r
702 gBS->RestoreTPL (OldTpl);\r
703 return Status;\r
99c048ef 704}\r
705\r
706/**\r
0f4e123f
JW
707 This function is to update the DNS Cache.\r
708\r
709 The UpdateDnsCache() function is used to add/delete/modify DNS cache entry. DNS cache\r
710 can be normally dynamically updated after the DNS resolve succeeds. This function\r
711 provided capability to manually add/delete/modify the DNS cache.\r
712\r
713 @param[in] This Pointer to EFI_DNS4_PROTOCOL instance.\r
714 @param[in] DeleteFlag If FALSE, this function is to add one entry to the\r
715 DNS Cahce. If TRUE, this function will delete\r
716 matching DNS Cache entry.\r
717 @param[in] Override If TRUE, the maching DNS cache entry will be\r
718 overwritten with the supplied parameter. If FALSE,\r
719 EFI_ACCESS_DENIED will be returned if the entry to\r
720 be added is already existed.\r
721 @param[in] DnsCacheEntry Pointer to DNS Cache entry.\r
722\r
723 @retval EFI_SUCCESS The operation completed successfully.\r
724 @retval EFI_INVALID_PARAMETER One or more of the following conditions is TRUE:\r
725 This is NULL.\r
726 DnsCacheEntry.HostName is NULL.\r
727 DnsCacheEntry.IpAddress is NULL.\r
728 DnsCacheEntry.Timeout is zero.\r
729 @retval EFI_ACCESS_DENIED The DNS cache entry already exists and Override is\r
730 not TRUE.\r
99c048ef 731**/\r
732EFI_STATUS\r
733EFIAPI\r
734Dns4UpdateDnsCache (\r
735 IN EFI_DNS4_PROTOCOL *This,\r
736 IN BOOLEAN DeleteFlag,\r
737 IN BOOLEAN Override,\r
738 IN EFI_DNS4_CACHE_ENTRY DnsCacheEntry\r
739 )\r
740{\r
741 EFI_STATUS Status; \r
742 EFI_TPL OldTpl;\r
743\r
744 Status = EFI_SUCCESS;\r
745 \r
746 if (DnsCacheEntry.HostName == NULL || DnsCacheEntry.IpAddress == NULL || DnsCacheEntry.Timeout == 0) {\r
747 return EFI_INVALID_PARAMETER; \r
748 }\r
749 \r
750 OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
751\r
752 //\r
753 // Update Dns4Cache here.\r
754 //\r
755 Status = UpdateDns4Cache (&mDriverData->Dns4CacheList, DeleteFlag, Override, DnsCacheEntry);\r
756\r
757 gBS->RestoreTPL (OldTpl);\r
758 \r
759 return Status;\r
760}\r
761\r
762/**\r
0f4e123f
JW
763 Polls for incoming data packets and processes outgoing data packets.\r
764\r
765 The Poll() function can be used by network drivers and applications to increase the\r
766 rate that data packets are moved between the communications device and the transmit\r
767 and receive queues.\r
768 In some systems, the periodic timer event in the managed network driver may not poll\r
769 the underlying communications device fast enough to transmit and/or receive all data\r
770 packets without missing incoming packets or dropping outgoing packets. Drivers and\r
771 applications that are experiencing packet loss should try calling the Poll()\r
772 function more often.\r
773\r
774 @param[in] This Pointer to EFI_DNS4_PROTOCOL instance.\r
775\r
776 @retval EFI_SUCCESS Incoming or outgoing data was processed.\r
777 @retval EFI_NOT_STARTED This EFI DNS Protocol instance has not been started.\r
778 @retval EFI_INVALID_PARAMETER This is NULL.\r
779 @retval EFI_DEVICE_ERROR An unexpected system or network error occurred.\r
780 @retval EFI_TIMEOUT Data was dropped out of the transmit and/or receive\r
781 queue. Consider increasing the polling rate.\r
99c048ef 782**/\r
783EFI_STATUS\r
784EFIAPI\r
785Dns4Poll (\r
786 IN EFI_DNS4_PROTOCOL *This\r
787 )\r
788{\r
789 DNS_INSTANCE *Instance;\r
790 EFI_UDP4_PROTOCOL *Udp;\r
791\r
792 if (This == NULL) {\r
793 return EFI_INVALID_PARAMETER;\r
794 }\r
795\r
796 Instance = DNS_INSTANCE_FROM_THIS_PROTOCOL4 (This);\r
797\r
798 if (Instance->State == DNS_STATE_UNCONFIGED) {\r
799 return EFI_NOT_STARTED;\r
800 } else if (Instance->State == DNS_STATE_DESTROY) {\r
801 return EFI_DEVICE_ERROR;\r
802 }\r
803\r
804 Udp = Instance->UdpIo->Protocol.Udp4;\r
805 \r
806 return Udp->Poll (Udp);\r
807}\r
808\r
809/**\r
0f4e123f
JW
810 Abort an asynchronous DNS operation, including translation between IP and Host, and\r
811 general look up behavior.\r
812\r
813 The Cancel() function is used to abort a pending resolution request. After calling\r
814 this function, Token.Status will be set to EFI_ABORTED and then Token.Event will be\r
815 signaled. If the token is not in one of the queues, which usually means that the\r
816 asynchronous operation has completed, this function will not signal the token and\r
817 EFI_NOT_FOUND is returned.\r
818\r
819 @param[in] This Pointer to EFI_DNS4_PROTOCOL instance.\r
820 @param[in] Token Pointer to a token that has been issued by\r
821 EFI_DNS4_PROTOCOL.HostNameToIp (),\r
822 EFI_DNS4_PROTOCOL.IpToHostName() or\r
823 EFI_DNS4_PROTOCOL.GeneralLookup().\r
824 If NULL, all pending tokens are aborted.\r
825\r
826 @retval EFI_SUCCESS Incoming or outgoing data was processed.\r
827 @retval EFI_NOT_STARTED This EFI DNS4 Protocol instance has not been started.\r
828 @retval EFI_INVALID_PARAMETER This is NULL.\r
829 @retval EFI_NOT_FOUND When Token is not NULL, and the asynchronous DNS\r
830 operation was not found in the transmit queue. It\r
831 was either completed or was not issued by\r
832 HostNameToIp(), IpToHostName() or GeneralLookup().\r
99c048ef 833**/\r
834EFI_STATUS\r
835EFIAPI\r
836Dns4Cancel (\r
837 IN EFI_DNS4_PROTOCOL *This,\r
838 IN EFI_DNS4_COMPLETION_TOKEN *Token\r
839 )\r
840{\r
841 EFI_STATUS Status;\r
842 DNS_INSTANCE *Instance;\r
843 EFI_TPL OldTpl;\r
844\r
845 if (This == NULL) {\r
846 return EFI_INVALID_PARAMETER;\r
847 }\r
848\r
849 Instance = DNS_INSTANCE_FROM_THIS_PROTOCOL4 (This);\r
850\r
851 if (Instance->State == DNS_STATE_UNCONFIGED) {\r
852 return EFI_NOT_STARTED;\r
853 }\r
854\r
855 OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
856\r
857 //\r
858 // Cancle the tokens specified by Token for this instance.\r
859 //\r
860 Status = Dns4InstanceCancelToken (Instance, Token);\r
861\r
862 //\r
863 // Dispatch the DPC queued by the NotifyFunction of the canceled token's events.\r
864 //\r
865 DispatchDpc ();\r
866\r
867 gBS->RestoreTPL (OldTpl);\r
868\r
869 return Status;\r
870}\r
871\r
872/**\r
0f4e123f 873 Retrieve mode data of this DNS instance.\r
99c048ef 874\r
0f4e123f 875 This function is used to retrieve DNS mode data for this DNS instance.\r
99c048ef 876\r
0f4e123f
JW
877 @param[in] This Pointer to EFI_DNS6_PROTOCOL instance.\r
878 @param[out] DnsModeData Pointer to the caller-allocated storage for the \r
879 EFI_DNS6_MODE_DATA data.\r
99c048ef 880\r
0f4e123f
JW
881 @retval EFI_SUCCESS The operation completed successfully.\r
882 @retval EFI_NOT_STARTED When DnsConfigData is queried, no configuration data\r
883 is available because this instance has not been\r
884 configured.\r
885 @retval EFI_INVALID_PARAMETER This is NULL or DnsModeData is NULL.\r
886 @retval EFI_OUT_OF_RESOURCE Failed to allocate needed resources.\r
99c048ef 887**/\r
888EFI_STATUS\r
889EFIAPI\r
890Dns6GetModeData (\r
891 IN EFI_DNS6_PROTOCOL *This,\r
892 OUT EFI_DNS6_MODE_DATA *DnsModeData\r
893 )\r
894{\r
895 DNS_INSTANCE *Instance;\r
896 \r
897 EFI_TPL OldTpl;\r
898\r
899 UINTN Index;\r
900 \r
901 LIST_ENTRY *Entry;\r
902 LIST_ENTRY *Next;\r
903\r
904 DNS6_SERVER_IP *ServerItem;\r
905 EFI_IPv6_ADDRESS *ServerList;\r
906 DNS6_CACHE *CacheItem;\r
907 EFI_DNS6_CACHE_ENTRY *CacheList;\r
908 EFI_STATUS Status;\r
909\r
910 ServerItem = NULL;\r
911 ServerList = NULL;\r
912 CacheItem = NULL;\r
913 CacheList = NULL;\r
914 Status = EFI_SUCCESS;\r
915\r
916 if ((This == NULL) || (DnsModeData == NULL)) {\r
917 return EFI_INVALID_PARAMETER;\r
918 }\r
919\r
920 OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
921 \r
922 Instance = DNS_INSTANCE_FROM_THIS_PROTOCOL6 (This);\r
923 if (Instance->State == DNS_STATE_UNCONFIGED) {\r
ac0f5843
JW
924 Status = EFI_NOT_STARTED;\r
925 goto ON_EXIT;\r
99c048ef 926 }\r
927\r
928 ZeroMem (DnsModeData, sizeof (EFI_DNS6_MODE_DATA));\r
929\r
930 //\r
931 // Get the current configuration data of this instance. \r
932 //\r
ac0f5843 933 Status = Dns6CopyConfigure (&DnsModeData->DnsConfigData, &Instance->Dns6CfgData);\r
99c048ef 934 if (EFI_ERROR (Status)) {\r
ac0f5843 935 goto ON_EXIT;\r
99c048ef 936 }\r
937 \r
938 //\r
939 // Get the DnsServerCount and DnsServerList\r
940 //\r
941 Index = 0;\r
942 NET_LIST_FOR_EACH_SAFE (Entry, Next, &mDriverData->Dns6ServerList) {\r
943 Index++;\r
944 }\r
945 DnsModeData->DnsServerCount = (UINT32) Index;\r
946 ServerList = AllocatePool (sizeof(EFI_IPv6_ADDRESS) * DnsModeData->DnsServerCount);\r
ac0f5843
JW
947 if (ServerList == NULL) {\r
948 Status = EFI_OUT_OF_RESOURCES;\r
949 Dns6CleanConfigure (&DnsModeData->DnsConfigData);\r
950 goto ON_EXIT;\r
951 }\r
952 \r
99c048ef 953 Index = 0;\r
954 NET_LIST_FOR_EACH_SAFE (Entry, Next, &mDriverData->Dns6ServerList) {\r
955 ServerItem = NET_LIST_USER_STRUCT (Entry, DNS6_SERVER_IP, AllServerLink);\r
956 CopyMem (ServerList + Index, &ServerItem->Dns6ServerIp, sizeof (EFI_IPv6_ADDRESS));\r
957 Index++;\r
958 }\r
959 DnsModeData->DnsServerList = ServerList;\r
960\r
961 //\r
962 // Get the DnsCacheCount and DnsCacheList\r
963 //\r
964 Index =0;\r
965 NET_LIST_FOR_EACH_SAFE (Entry, Next, &mDriverData->Dns6CacheList) {\r
966 Index++;\r
967 }\r
968 DnsModeData->DnsCacheCount = (UINT32) Index;\r
969 CacheList = AllocatePool (sizeof(EFI_DNS6_CACHE_ENTRY) * DnsModeData->DnsCacheCount);\r
ac0f5843
JW
970 if (CacheList == NULL) {\r
971 Status = EFI_OUT_OF_RESOURCES;\r
972 Dns6CleanConfigure (&DnsModeData->DnsConfigData);\r
973 FreePool (ServerList);\r
974 goto ON_EXIT;\r
975 }\r
976 \r
99c048ef 977 Index =0;\r
978 NET_LIST_FOR_EACH_SAFE (Entry, Next, &mDriverData->Dns6CacheList) {\r
979 CacheItem = NET_LIST_USER_STRUCT (Entry, DNS6_CACHE, AllCacheLink);\r
980 CopyMem (CacheList + Index, &CacheItem->DnsCache, sizeof (EFI_DNS6_CACHE_ENTRY));\r
981 Index++;\r
982 }\r
983 DnsModeData->DnsCacheList = CacheList;\r
99c048ef 984 \r
ac0f5843
JW
985ON_EXIT:\r
986 gBS->RestoreTPL (OldTpl);\r
987 return Status;\r
99c048ef 988}\r
989\r
990/**\r
0f4e123f
JW
991 Configure this DNS instance.\r
992\r
993 The Configure() function is used to set and change the configuration data for this\r
994 EFI DNSv6 Protocol driver instance. Reset the DNS instance if DnsConfigData is NULL.\r
995\r
996 @param[in] This Pointer to EFI_DNS6_PROTOCOL instance.\r
997 @param[in] DnsConfigData Pointer to the configuration data structure. All associated \r
998 storage to be allocated and released by caller.\r
999\r
1000 @retval EFI_SUCCESS The operation completed successfully.\r
1001 @retval EFI_INVALID_PARAMTER This is NULL.\r
1002 The StationIp address provided in DnsConfigData is not zero and not a valid unicast.\r
1003 DnsServerList is NULL while DnsServerList Count is not ZERO.\r
1004 DnsServerList Count is ZERO while DnsServerList is not NULL.\r
1005 @retval EFI_OUT_OF_RESOURCES The DNS instance data or required space could not be allocated.\r
1006 @retval EFI_DEVICE_ERROR An unexpected system or network error occurred. The\r
1007 EFI DNSv6 Protocol instance is not configured.\r
1008 @retval EFI_UNSUPPORTED The designated protocol is not supported.\r
1009 @retval EFI_ALREADY_STARTED Second call to Configure() with DnsConfigData. To \r
1010 reconfigure the instance the caller must call Configure() with \r
1011 NULL first to return driver to unconfigured state.\r
99c048ef 1012**/\r
1013EFI_STATUS\r
1014EFIAPI\r
1015Dns6Configure (\r
1016 IN EFI_DNS6_PROTOCOL *This,\r
1017 IN EFI_DNS6_CONFIG_DATA *DnsConfigData\r
1018 )\r
1019{\r
1020 EFI_STATUS Status;\r
1021 DNS_INSTANCE *Instance;\r
1022 \r
1023 EFI_TPL OldTpl;\r
1024\r
1025 UINT32 ServerListCount;\r
1026 EFI_IPv6_ADDRESS *ServerList; \r
1027\r
1028 Status = EFI_SUCCESS;\r
1029 ServerList = NULL;\r
1030\r
1031 if (This == NULL || \r
1032 (DnsConfigData != NULL && ((DnsConfigData->DnsServerCount != 0 && DnsConfigData->DnsServerList == NULL) || \r
1033 (DnsConfigData->DnsServerCount == 0 && DnsConfigData->DnsServerList != NULL)))) {\r
1034 return EFI_INVALID_PARAMETER;\r
1035 }\r
1036\r
1037 if (DnsConfigData != NULL && DnsConfigData->Protocol != DNS_PROTOCOL_UDP) {\r
1038 return EFI_UNSUPPORTED;\r
1039 }\r
1040\r
1041 OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
1042\r
1043 Instance = DNS_INSTANCE_FROM_THIS_PROTOCOL6 (This);\r
1044\r
1045 if (DnsConfigData == NULL) {\r
1046 ZeroMem (&Instance->SessionDnsServer, sizeof (EFI_IP_ADDRESS));\r
1047\r
1048 //\r
1049 // Reset the Instance if ConfigData is NULL\r
1050 //\r
1051 if (!NetMapIsEmpty(&Instance->Dns6TxTokens)) {\r
1052 Dns6InstanceCancelToken(Instance, NULL);\r
1053 }\r
1054\r
1055 Instance->MaxRetry = 0;\r
1056\r
1057 if (Instance->UdpIo != NULL){\r
1058 UdpIoCleanIo (Instance->UdpIo);\r
1059 }\r
1060\r
1061 if (Instance->Dns6CfgData.DnsServerList != NULL) {\r
1062 FreePool (Instance->Dns6CfgData.DnsServerList);\r
1063 }\r
1064 ZeroMem (&Instance->Dns6CfgData, sizeof (EFI_DNS6_CONFIG_DATA));\r
1065 \r
1066 Instance->State = DNS_STATE_UNCONFIGED;\r
1067 } else {\r
1068 //\r
1069 // Configure the parameters for new operation.\r
1070 //\r
90ae1f02 1071 if (!NetIp6IsUnspecifiedAddr (&DnsConfigData->StationIp) && !NetIp6IsValidUnicast (&DnsConfigData->StationIp)) {\r
99c048ef 1072 Status = EFI_INVALID_PARAMETER;\r
1073 goto ON_EXIT;\r
1074 }\r
1075\r
1076 Status = Dns6CopyConfigure (&Instance->Dns6CfgData, DnsConfigData);\r
1077 if (EFI_ERROR (Status)) {\r
1078 goto ON_EXIT;\r
1079 }\r
1080\r
1081 if (DnsConfigData->DnsServerCount == 0 || DnsConfigData->DnsServerList == NULL) {\r
1082 gBS->RestoreTPL (OldTpl);\r
1083\r
1084 //\r
1085 //The DNS instance will retrieve DNS server from DHCP Server.\r
1086 //\r
1087 Status = GetDns6ServerFromDhcp6 (\r
1088 Instance->Service->ImageHandle,\r
1089 Instance->Service->ControllerHandle, \r
1090 &ServerListCount, \r
1091 &ServerList\r
1092 );\r
1093 if (EFI_ERROR (Status)) {\r
1094 goto ON_EXIT;\r
1095 }\r
1096 \r
1097 ASSERT(ServerList != NULL);\r
1098\r
1099 OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
1100\r
1101 CopyMem (&Instance->SessionDnsServer.v6, &ServerList[0], sizeof (EFI_IPv6_ADDRESS));\r
1102 } else {\r
1103 CopyMem (&Instance->SessionDnsServer.v6, &DnsConfigData->DnsServerList[0], sizeof (EFI_IPv6_ADDRESS));\r
1104 }\r
1105\r
1106 //\r
1107 // Config UDP\r
1108 //\r
eed4585b 1109 gBS->RestoreTPL (OldTpl);\r
99c048ef 1110 Status = Dns6ConfigUdp (Instance, Instance->UdpIo);\r
eed4585b 1111 OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
99c048ef 1112 if (EFI_ERROR (Status)) {\r
1113 if (Instance->Dns6CfgData.DnsServerList != NULL) {\r
1114 FreePool (Instance->Dns6CfgData.DnsServerList);\r
8aa2cdd7 1115 Instance->Dns6CfgData.DnsServerList = NULL;\r
99c048ef 1116 }\r
1117 goto ON_EXIT;\r
1118 }\r
1119\r
1120 //\r
1121 // Add configured DNS server used by this instance to ServerList.\r
1122 //\r
1123 Status = AddDns6ServerIp (&mDriverData->Dns6ServerList, Instance->SessionDnsServer.v6);\r
1124 if (EFI_ERROR (Status)) {\r
1125 if (Instance->Dns6CfgData.DnsServerList != NULL) {\r
1126 FreePool (Instance->Dns6CfgData.DnsServerList);\r
8aa2cdd7 1127 Instance->Dns6CfgData.DnsServerList = NULL;\r
99c048ef 1128 }\r
1129 goto ON_EXIT;\r
1130 }\r
1131 \r
1132 Instance->State = DNS_STATE_CONFIGED;\r
1133 }\r
1134\r
1135ON_EXIT:\r
1136 gBS->RestoreTPL (OldTpl);\r
1137 return Status;\r
1138}\r
1139\r
1140/**\r
0f4e123f
JW
1141 Host name to host address translation.\r
1142\r
1143 The HostNameToIp () function is used to translate the host name to host IP address. A\r
1144 type AAAA query is used to get the one or more IPv6 addresses for this host.\r
1145\r
1146 @param[in] This Pointer to EFI_DNS6_PROTOCOL instance.\r
1147 @param[in] HostName Host name.\r
1148 @param[in] Token Point to the completion token to translate host name\r
1149 to host address.\r
1150\r
1151 @retval EFI_SUCCESS The operation completed successfully.\r
1152 @retval EFI_INVALID_PARAMETER One or more of the following conditions is TRUE:\r
1153 This is NULL.\r
1154 Token is NULL.\r
1155 Token.Event is NULL.\r
1156 HostName is NULL or buffer contained unsupported characters.\r
1157 @retval EFI_NO_MAPPING There's no source address is available for use.\r
1158 @retval EFI_ALREADY_STARTED This Token is being used in another DNS session.\r
1159 @retval EFI_NOT_STARTED This instance has not been started.\r
1160 @retval EFI_OUT_OF_RESOURCES Failed to allocate needed resources.\r
99c048ef 1161**/\r
1162EFI_STATUS\r
1163EFIAPI\r
1164Dns6HostNameToIp (\r
1165 IN EFI_DNS6_PROTOCOL *This,\r
1166 IN CHAR16 *HostName,\r
1167 IN EFI_DNS6_COMPLETION_TOKEN *Token\r
1168 )\r
1169{\r
1170 EFI_STATUS Status;\r
1171 \r
1172 DNS_INSTANCE *Instance;\r
1173\r
1174 EFI_DNS6_CONFIG_DATA *ConfigData;\r
1175 \r
1176 UINTN Index; \r
1177 DNS6_CACHE *Item;\r
1178 LIST_ENTRY *Entry;\r
1179 LIST_ENTRY *Next;\r
1180 \r
fcae1a99
JW
1181 CHAR8 *QueryName;\r
1182 \r
99c048ef 1183 DNS6_TOKEN_ENTRY *TokenEntry;\r
1184 NET_BUF *Packet;\r
1185 \r
1186 EFI_TPL OldTpl;\r
1187 \r
1188 Status = EFI_SUCCESS;\r
1189 Item = NULL;\r
fcae1a99 1190 QueryName = NULL;\r
99c048ef 1191 TokenEntry = NULL;\r
1192 Packet = NULL;\r
1193\r
1194 //\r
1195 // Validate the parameters\r
1196 //\r
1197 if ((This == NULL) || (HostName == NULL) || Token == NULL) {\r
1198 return EFI_INVALID_PARAMETER;\r
1199 }\r
1200\r
1201 OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
1202 \r
1203 Instance = DNS_INSTANCE_FROM_THIS_PROTOCOL6 (This);\r
1204 \r
1205 ConfigData = &(Instance->Dns6CfgData);\r
1206 \r
1207 Instance->MaxRetry = ConfigData->RetryCount;\r
1208\r
1209 Token->Status = EFI_NOT_READY;\r
1210 Token->RetryCount = 0;\r
1211 Token->RetryInterval = ConfigData->RetryInterval;\r
1212\r
1213 if (Instance->State != DNS_STATE_CONFIGED) {\r
1214 Status = EFI_NOT_STARTED;\r
1215 goto ON_EXIT;\r
1216 }\r
1217\r
1218 //\r
1219 // Check the MaxRetry and RetryInterval values.\r
1220 //\r
1221 if (Instance->MaxRetry == 0) {\r
1222 Instance->MaxRetry = DNS_DEFAULT_RETRY;\r
1223 }\r
1224\r
1225 if (Token->RetryInterval < DNS_DEFAULT_TIMEOUT) {\r
1226 Token->RetryInterval = DNS_DEFAULT_TIMEOUT;\r
1227 } \r
1228\r
1229 //\r
1230 // Check cache\r
1231 //\r
1232 if (ConfigData->EnableDnsCache) {\r
1233 Index = 0;\r
1234 NET_LIST_FOR_EACH_SAFE (Entry, Next, &mDriverData->Dns6CacheList) {\r
1235 Item = NET_LIST_USER_STRUCT (Entry, DNS6_CACHE, AllCacheLink);\r
1236 if (StrCmp (HostName, Item->DnsCache.HostName) == 0) {\r
1237 Index++;\r
1238 }\r
1239 }\r
1240\r
1241 if (Index != 0) {\r
1242 Token->RspData.H2AData = AllocatePool (sizeof (DNS6_HOST_TO_ADDR_DATA));\r
1243 if (Token->RspData.H2AData == NULL) {\r
1244 Status = EFI_OUT_OF_RESOURCES;\r
1245 goto ON_EXIT;\r
1246 }\r
1247\r
1248 Token->RspData.H2AData->IpCount = (UINT32)Index;\r
1249 Token->RspData.H2AData->IpList = AllocatePool (sizeof (EFI_IPv6_ADDRESS) * Index);\r
1250 if (Token->RspData.H2AData->IpList == NULL) {\r
1251 if (Token->RspData.H2AData != NULL) {\r
1252 FreePool (Token->RspData.H2AData);\r
1253 }\r
1254 \r
1255 Status = EFI_OUT_OF_RESOURCES;\r
1256 goto ON_EXIT;\r
1257 }\r
1258\r
1259 Index = 0;\r
1260 NET_LIST_FOR_EACH_SAFE (Entry, Next, &mDriverData->Dns6CacheList) {\r
1261 Item = NET_LIST_USER_STRUCT (Entry, DNS6_CACHE, AllCacheLink);\r
1262 if ((UINT32)Index < Token->RspData.H2AData->IpCount && StrCmp (HostName, Item->DnsCache.HostName) == 0) {\r
1263 CopyMem ((Token->RspData.H2AData->IpList) + Index, Item->DnsCache.IpAddress, sizeof (EFI_IPv6_ADDRESS));\r
1264 Index++;\r
1265 }\r
1266 }\r
1267 \r
1268 Token->Status = EFI_SUCCESS;\r
1269 \r
1270 if (Token->Event != NULL) {\r
1271 gBS->SignalEvent (Token->Event);\r
1272 DispatchDpc ();\r
1273 }\r
1274 \r
1275 Status = Token->Status;\r
1276 goto ON_EXIT;\r
1277 } \r
1278 }\r
1279\r
1280 //\r
1281 // Construct DNS TokenEntry.\r
1282 //\r
1283 TokenEntry = AllocateZeroPool (sizeof (DNS6_TOKEN_ENTRY));\r
1284 if (TokenEntry == NULL) {\r
1285 Status = EFI_OUT_OF_RESOURCES;\r
1286 goto ON_EXIT;\r
1287 }\r
1288 \r
1289 TokenEntry->PacketToLive = Token->RetryInterval;\r
1290 TokenEntry->QueryHostName = HostName;\r
1291 TokenEntry->Token = Token;\r
1292\r
fcae1a99
JW
1293\r
1294 //\r
1295 // Construct QName.\r
1296 //\r
3700da73 1297 QueryName = NetLibCreateDnsQName (TokenEntry->QueryHostName);\r
fcae1a99
JW
1298 if (QueryName == NULL) {\r
1299 Status = EFI_OUT_OF_RESOURCES;\r
1300 goto ON_EXIT;\r
1301 }\r
1302 \r
99c048ef 1303 //\r
1304 // Construct DNS Query Packet.\r
1305 //\r
fcae1a99 1306 Status = ConstructDNSQuery (Instance, QueryName, DNS_TYPE_AAAA, DNS_CLASS_INET, &Packet);\r
99c048ef 1307 if (EFI_ERROR (Status)) {\r
1308 if (TokenEntry != NULL) {\r
1309 FreePool (TokenEntry);\r
1310 }\r
1311 \r
1312 goto ON_EXIT;\r
1313 }\r
1314\r
8339166d
JW
1315 ASSERT (Packet != NULL);\r
1316\r
99c048ef 1317 //\r
1318 // Save the token into the Dns6TxTokens map.\r
1319 //\r
1320 Status = NetMapInsertTail (&Instance->Dns6TxTokens, TokenEntry, Packet);\r
1321 if (EFI_ERROR (Status)) {\r
1322 if (TokenEntry != NULL) {\r
1323 FreePool (TokenEntry);\r
1324 }\r
1325 \r
1326 NetbufFree (Packet);\r
1327 \r
1328 goto ON_EXIT;\r
1329 }\r
1330 \r
1331 //\r
1332 // Dns Query Ip\r
1333 //\r
1334 Status = DoDnsQuery (Instance, Packet);\r
1335 if (EFI_ERROR (Status)) {\r
520a0746
JW
1336 Dns6RemoveTokenEntry (&Instance->Dns6TxTokens, TokenEntry);\r
1337 \r
99c048ef 1338 if (TokenEntry != NULL) {\r
1339 FreePool (TokenEntry);\r
1340 }\r
1341 \r
1342 NetbufFree (Packet);\r
1343 }\r
1344 \r
1345ON_EXIT:\r
fcae1a99
JW
1346 if (QueryName != NULL) {\r
1347 FreePool (QueryName);\r
1348 }\r
1349 \r
99c048ef 1350 gBS->RestoreTPL (OldTpl);\r
1351 return Status;\r
1352}\r
1353\r
1354/**\r
0f4e123f
JW
1355 Host address to host name translation.\r
1356\r
1357 The IpToHostName () function is used to translate the host address to host name. A\r
1358 type PTR query is used to get the primary name of the host. Implementation can choose\r
1359 to support this function or not.\r
1360\r
1361 @param[in] This Pointer to EFI_DNS6_PROTOCOL instance.\r
1362 @param[in] IpAddress Ip Address.\r
1363 @param[in] Token Point to the completion token to translate host\r
1364 address to host name.\r
1365\r
1366 @retval EFI_SUCCESS The operation completed successfully.\r
1367 @retval EFI_UNSUPPORTED This function is not supported.\r
1368 @retval EFI_INVALID_PARAMETER One or more of the following conditions is TRUE:\r
1369 This is NULL.\r
1370 Token is NULL.\r
1371 Token.Event is NULL.\r
1372 IpAddress is not valid IP address.\r
1373 @retval EFI_NO_MAPPING There's no source address is available for use.\r
1374 @retval EFI_NOT_STARTED This instance has not been started.\r
1375 @retval EFI_OUT_OF_RESOURCES Failed to allocate needed resources.\r
99c048ef 1376**/\r
1377EFI_STATUS\r
1378EFIAPI\r
1379Dns6IpToHostName (\r
1380 IN EFI_DNS6_PROTOCOL *This,\r
1381 IN EFI_IPv6_ADDRESS IpAddress,\r
1382 IN EFI_DNS6_COMPLETION_TOKEN *Token\r
1383 )\r
1384{\r
1385 return EFI_UNSUPPORTED;\r
1386}\r
1387\r
1388/**\r
0f4e123f
JW
1389 This function provides capability to retrieve arbitrary information from the DNS\r
1390 server.\r
1391\r
1392 This GeneralLookup() function retrieves arbitrary information from the DNS. The caller\r
1393 supplies a QNAME, QTYPE, and QCLASS, and all of the matching RRs are returned. All\r
1394 RR content (e.g., TTL) was returned. The caller need parse the returned RR to get\r
1395 required information. The function is optional. Implementation can choose to support\r
1396 it or not.\r
1397\r
1398 @param[in] This Pointer to EFI_DNS6_PROTOCOL instance.\r
1399 @param[in] QName Pointer to Query Name.\r
1400 @param[in] QType Query Type.\r
1401 @param[in] QClass Query Name.\r
1402 @param[in] Token Point to the completion token to retrieve arbitrary\r
1403 information.\r
1404\r
1405 @retval EFI_SUCCESS The operation completed successfully.\r
1406 @retval EFI_UNSUPPORTED This function is not supported. Or the requested\r
1407 QType is not supported\r
1408 @retval EFI_INVALID_PARAMETER One or more of the following conditions is TRUE:\r
1409 This is NULL.\r
1410 Token is NULL.\r
1411 Token.Event is NULL.\r
1412 QName is NULL.\r
1413 @retval EFI_NO_MAPPING There's no source address is available for use.\r
1414 @retval EFI_NOT_STARTED This instance has not been started.\r
1415 @retval EFI_OUT_OF_RESOURCES Failed to allocate needed resources.\r
99c048ef 1416**/\r
1417EFI_STATUS\r
1418EFIAPI\r
1419Dns6GeneralLookUp (\r
1420 IN EFI_DNS6_PROTOCOL *This,\r
1421 IN CHAR8 *QName,\r
1422 IN UINT16 QType, \r
1423 IN UINT16 QClass,\r
1424 IN EFI_DNS6_COMPLETION_TOKEN *Token\r
1425 )\r
1426{\r
fcae1a99
JW
1427 EFI_STATUS Status;\r
1428 \r
1429 DNS_INSTANCE *Instance;\r
1430 \r
1431 EFI_DNS6_CONFIG_DATA *ConfigData;\r
1432 \r
1433 DNS6_TOKEN_ENTRY *TokenEntry;\r
1434 NET_BUF *Packet;\r
1435 \r
1436 EFI_TPL OldTpl;\r
1437 \r
1438 Status = EFI_SUCCESS;\r
1439 TokenEntry = NULL;\r
1440 Packet = NULL;\r
1441 \r
1442 //\r
1443 // Validate the parameters\r
1444 //\r
1445 if ((This == NULL) || (QName == NULL) || Token == NULL) {\r
1446 return EFI_INVALID_PARAMETER;\r
1447 }\r
1448 \r
1449 OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
1450 \r
1451 Instance = DNS_INSTANCE_FROM_THIS_PROTOCOL6 (This);\r
1452 \r
1453 ConfigData = &(Instance->Dns6CfgData);\r
1454 \r
1455 Instance->MaxRetry = ConfigData->RetryCount;\r
1456 \r
1457 Token->Status = EFI_NOT_READY;\r
1458 Token->RetryCount = 0;\r
1459 Token->RetryInterval = ConfigData->RetryInterval;\r
1460\r
1461 if (Instance->State != DNS_STATE_CONFIGED) {\r
1462 Status = EFI_NOT_STARTED;\r
1463 goto ON_EXIT;\r
1464 }\r
1465\r
1466 //\r
1467 // Check the MaxRetry and RetryInterval values.\r
1468 //\r
1469 if (Instance->MaxRetry == 0) {\r
1470 Instance->MaxRetry = DNS_DEFAULT_RETRY;\r
1471 }\r
1472\r
1473 if (Token->RetryInterval < DNS_DEFAULT_TIMEOUT) {\r
1474 Token->RetryInterval = DNS_DEFAULT_TIMEOUT;\r
1475 }\r
1476\r
1477 //\r
1478 // Construct DNS TokenEntry.\r
1479 //\r
1480 TokenEntry = AllocateZeroPool (sizeof(DNS6_TOKEN_ENTRY));\r
1481 if (TokenEntry == NULL) {\r
1482 Status = EFI_OUT_OF_RESOURCES;\r
1483 goto ON_EXIT;\r
1484 }\r
1485 \r
1486 TokenEntry->PacketToLive = Token->RetryInterval;\r
1487 TokenEntry->GeneralLookUp = TRUE;\r
1488 TokenEntry->Token = Token;\r
1489\r
1490 //\r
1491 // Construct DNS Query Packet.\r
1492 //\r
1493 Status = ConstructDNSQuery (Instance, QName, QType, QClass, &Packet);\r
1494 if (EFI_ERROR (Status)) {\r
1495 if (TokenEntry != NULL) {\r
1496 FreePool (TokenEntry);\r
1497 }\r
1498 \r
1499 goto ON_EXIT;\r
1500 }\r
1501\r
8339166d
JW
1502 ASSERT (Packet != NULL);\r
1503\r
fcae1a99
JW
1504 //\r
1505 // Save the token into the Dns6TxTokens map.\r
1506 //\r
1507 Status = NetMapInsertTail (&Instance->Dns6TxTokens, TokenEntry, Packet);\r
1508 if (EFI_ERROR (Status)) {\r
1509 if (TokenEntry != NULL) {\r
1510 FreePool (TokenEntry);\r
1511 }\r
1512 \r
1513 NetbufFree (Packet);\r
1514 \r
1515 goto ON_EXIT;\r
1516 }\r
1517 \r
1518 //\r
1519 // Dns Query Ip\r
1520 //\r
1521 Status = DoDnsQuery (Instance, Packet);\r
1522 if (EFI_ERROR (Status)) {\r
520a0746
JW
1523 Dns6RemoveTokenEntry (&Instance->Dns6TxTokens, TokenEntry);\r
1524\r
fcae1a99
JW
1525 if (TokenEntry != NULL) {\r
1526 FreePool (TokenEntry);\r
1527 }\r
1528 \r
1529 NetbufFree (Packet);\r
1530 }\r
1531 \r
1532ON_EXIT:\r
1533 gBS->RestoreTPL (OldTpl);\r
1534 return Status;\r
99c048ef 1535}\r
1536\r
1537/**\r
0f4e123f
JW
1538 This function is to update the DNS Cache.\r
1539\r
1540 The UpdateDnsCache() function is used to add/delete/modify DNS cache entry. DNS cache\r
1541 can be normally dynamically updated after the DNS resolve succeeds. This function\r
1542 provided capability to manually add/delete/modify the DNS cache.\r
1543\r
1544 @param[in] This Pointer to EFI_DNS6_PROTOCOL instance.\r
1545 @param[in] DeleteFlag If FALSE, this function is to add one entry to the\r
1546 DNS Cahce. If TRUE, this function will delete\r
1547 matching DNS Cache entry.\r
1548 @param[in] Override If TRUE, the maching DNS cache entry will be\r
1549 overwritten with the supplied parameter. If FALSE,\r
1550 EFI_ACCESS_DENIED will be returned if the entry to\r
1551 be added is already existed.\r
1552 @param[in] DnsCacheEntry Pointer to DNS Cache entry.\r
1553\r
1554 @retval EFI_SUCCESS The operation completed successfully.\r
1555 @retval EFI_INVALID_PARAMETER One or more of the following conditions is TRUE:\r
1556 This is NULL.\r
1557 DnsCacheEntry.HostName is NULL.\r
1558 DnsCacheEntry.IpAddress is NULL.\r
1559 DnsCacheEntry.Timeout is zero.\r
1560 @retval EFI_ACCESS_DENIED The DNS cache entry already exists and Override is\r
1561 not TRUE.\r
1562 @retval EFI_OUT_OF_RESOURCE Failed to allocate needed resources.\r
99c048ef 1563**/\r
1564EFI_STATUS\r
1565EFIAPI\r
1566Dns6UpdateDnsCache (\r
1567 IN EFI_DNS6_PROTOCOL *This,\r
1568 IN BOOLEAN DeleteFlag,\r
1569 IN BOOLEAN Override,\r
1570 IN EFI_DNS6_CACHE_ENTRY DnsCacheEntry\r
1571 )\r
1572{\r
1573 EFI_STATUS Status; \r
1574 EFI_TPL OldTpl;\r
1575\r
1576 Status = EFI_SUCCESS;\r
1577 \r
1578 if (DnsCacheEntry.HostName == NULL || DnsCacheEntry.IpAddress == NULL || DnsCacheEntry.Timeout == 0) {\r
1579 return EFI_INVALID_PARAMETER; \r
1580 }\r
1581 \r
1582 OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
1583\r
1584 //\r
1585 // Update Dns6Cache here.\r
1586 //\r
1587 Status = UpdateDns6Cache (&mDriverData->Dns6CacheList, DeleteFlag, Override, DnsCacheEntry);\r
1588 \r
1589 gBS->RestoreTPL (OldTpl);\r
1590 \r
1591 return Status;\r
1592}\r
1593\r
1594/**\r
0f4e123f
JW
1595 Polls for incoming data packets and processes outgoing data packets.\r
1596\r
1597 The Poll() function can be used by network drivers and applications to increase the\r
1598 rate that data packets are moved between the communications device and the transmit\r
1599 and receive queues.\r
1600\r
1601 In some systems, the periodic timer event in the managed network driver may not poll\r
1602 the underlying communications device fast enough to transmit and/or receive all data\r
1603 packets without missing incoming packets or dropping outgoing packets. Drivers and\r
1604 applications that are experiencing packet loss should try calling the Poll()\r
1605 function more often.\r
1606\r
1607 @param[in] This Pointer to EFI_DNS6_PROTOCOL instance.\r
1608\r
1609 @retval EFI_SUCCESS Incoming or outgoing data was processed.\r
1610 @retval EFI_NOT_STARTED This EFI DNS Protocol instance has not been started.\r
1611 @retval EFI_INVALID_PARAMETER This is NULL.\r
1612 @retval EFI_NO_MAPPING There is no source address is available for use.\r
1613 @retval EFI_DEVICE_ERROR An unexpected system or network error occurred.\r
1614 @retval EFI_TIMEOUT Data was dropped out of the transmit and/or receive\r
1615 queue. Consider increasing the polling rate.\r
99c048ef 1616**/\r
1617EFI_STATUS\r
1618EFIAPI\r
1619Dns6Poll (\r
1620 IN EFI_DNS6_PROTOCOL *This\r
1621 )\r
1622{\r
1623 DNS_INSTANCE *Instance;\r
1624 EFI_UDP6_PROTOCOL *Udp;\r
1625\r
1626 if (This == NULL) {\r
1627 return EFI_INVALID_PARAMETER;\r
1628 }\r
1629\r
1630 Instance = DNS_INSTANCE_FROM_THIS_PROTOCOL6 (This);\r
1631\r
1632 if (Instance->State == DNS_STATE_UNCONFIGED) {\r
1633 return EFI_NOT_STARTED;\r
1634 } else if (Instance->State == DNS_STATE_DESTROY) {\r
1635 return EFI_DEVICE_ERROR;\r
1636 }\r
1637\r
1638 Udp = Instance->UdpIo->Protocol.Udp6;\r
1639 \r
1640 return Udp->Poll (Udp);\r
1641}\r
1642\r
1643/**\r
0f4e123f
JW
1644 Abort an asynchronous DNS operation, including translation between IP and Host, and\r
1645 general look up behavior.\r
1646\r
1647 The Cancel() function is used to abort a pending resolution request. After calling\r
1648 this function, Token.Status will be set to EFI_ABORTED and then Token.Event will be\r
1649 signaled. If the token is not in one of the queues, which usually means that the\r
1650 asynchronous operation has completed, this function will not signal the token and\r
1651 EFI_NOT_FOUND is returned.\r
1652\r
1653 @param[in] This Pointer to EFI_DNS6_PROTOCOL instance.\r
1654 @param[in] Token Pointer to a token that has been issued by\r
1655 EFI_DNS6_PROTOCOL.HostNameToIp (),\r
1656 EFI_DNS6_PROTOCOL.IpToHostName() or\r
1657 EFI_DNS6_PROTOCOL.GeneralLookup().\r
1658 If NULL, all pending tokens are aborted.\r
1659\r
1660 @retval EFI_SUCCESS Incoming or outgoing data was processed.\r
1661 @retval EFI_NOT_STARTED This EFI DNS6 Protocol instance has not been started.\r
1662 @retval EFI_INVALID_PARAMETER This is NULL.\r
1663 @retval EFI_NO_MAPPING There's no source address is available for use.\r
1664 @retval EFI_NOT_FOUND When Token is not NULL, and the asynchronous DNS\r
1665 operation was not found in the transmit queue. It\r
1666 was either completed or was not issued by\r
1667 HostNameToIp(), IpToHostName() or GeneralLookup().\r
99c048ef 1668**/\r
1669EFI_STATUS\r
1670EFIAPI\r
1671Dns6Cancel (\r
1672 IN EFI_DNS6_PROTOCOL *This,\r
1673 IN EFI_DNS6_COMPLETION_TOKEN *Token\r
1674 )\r
1675{\r
1676 EFI_STATUS Status;\r
1677 DNS_INSTANCE *Instance;\r
1678 EFI_TPL OldTpl;\r
1679\r
1680 if (This == NULL) {\r
1681 return EFI_INVALID_PARAMETER;\r
1682 }\r
1683\r
1684 Instance = DNS_INSTANCE_FROM_THIS_PROTOCOL6 (This);\r
1685\r
1686 if (Instance->State == DNS_STATE_UNCONFIGED) {\r
1687 return EFI_NOT_STARTED;\r
1688 }\r
1689\r
1690 OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
1691\r
1692 //\r
1693 // Cancle the tokens specified by Token for this instance.\r
1694 //\r
1695 Status = Dns6InstanceCancelToken (Instance, Token);\r
1696\r
1697 //\r
1698 // Dispatch the DPC queued by the NotifyFunction of the canceled token's events.\r
1699 //\r
1700 DispatchDpc ();\r
1701\r
1702 gBS->RestoreTPL (OldTpl);\r
1703\r
1704 return Status;\r
1705}\r
1706\r