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