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