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