]> git.proxmox.com Git - mirror_edk2.git/blame - NetworkPkg/DnsDxe/DnsProtocol.c
NetworkPkg: Add the unspecified address check for DNS6 StationIp.
[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
4Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>\r
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
40 This function is used to retrieve DNS mode data for this DNS instance.\r
41\r
42 @param[in] This Pointer to EFI_DNS4_PROTOCOL instance.\r
43 @param[out] DnsModeData Pointer to the caller-allocated storage for the EFI_DNS4_MODE_DATA structure.\r
44\r
45 @retval EFI_SUCCESS The operation completed successfully.\r
46 @retval EFI_NOT_STARTED When DnsConfigData is queried, no configuration data is \r
47 available because this instance has not been configured.\r
48 @retval EFI_OUT_OF_RESOURCES Failed to allocate needed resources.\r
49 @retval EFI_INVALID_PARAMETER This is NULL or DnsModeData is NULL.\r
50\r
51**/\r
52EFI_STATUS\r
53EFIAPI\r
54Dns4GetModeData (\r
55 IN EFI_DNS4_PROTOCOL *This,\r
56 OUT EFI_DNS4_MODE_DATA *DnsModeData\r
57 )\r
58{\r
59 DNS_INSTANCE *Instance;\r
60 \r
61 EFI_TPL OldTpl;\r
62\r
63 UINTN Index;\r
64 \r
65 LIST_ENTRY *Entry;\r
66 LIST_ENTRY *Next;\r
67 \r
68 DNS4_SERVER_IP *ServerItem;\r
69 EFI_IPv4_ADDRESS *ServerList;\r
70 DNS4_CACHE *CacheItem;\r
71 EFI_DNS4_CACHE_ENTRY *CacheList;\r
72 EFI_STATUS Status;\r
73\r
74 ServerItem = NULL;\r
75 ServerList = NULL;\r
76 CacheItem = NULL;\r
77 CacheList = NULL;\r
78 Status = EFI_SUCCESS;\r
79 \r
80 \r
81 if ((This == NULL) || (DnsModeData == NULL)) {\r
82 return EFI_INVALID_PARAMETER;\r
83 }\r
84\r
85 OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
86 \r
87 Instance = DNS_INSTANCE_FROM_THIS_PROTOCOL4 (This);\r
88 if (Instance->State == DNS_STATE_UNCONFIGED) {\r
89 gBS->RestoreTPL (OldTpl);\r
90 return EFI_NOT_STARTED;\r
91 }\r
92 \r
93 ZeroMem (DnsModeData, sizeof (EFI_DNS4_MODE_DATA));\r
94\r
95 //\r
96 // Get the current configuration data of this instance. \r
97 //\r
98 Status = Dns4CopyConfigure (&DnsModeData->DnsConfigData, &Instance->Dns4CfgData);\r
99 if (EFI_ERROR (Status)) {\r
100 gBS->RestoreTPL (OldTpl);\r
101 return Status;\r
102 }\r
103\r
104 //\r
105 // Get the DnsServerCount and DnsServerList\r
106 //\r
107 Index = 0;\r
108 NET_LIST_FOR_EACH_SAFE (Entry, Next, &mDriverData->Dns4ServerList) {\r
109 Index++;\r
110 }\r
111 DnsModeData->DnsServerCount = (UINT32) Index;\r
112 ServerList = AllocatePool (sizeof (EFI_IPv4_ADDRESS) * DnsModeData->DnsServerCount);\r
113 ASSERT (ServerList != NULL);\r
114 Index = 0;\r
115 NET_LIST_FOR_EACH_SAFE (Entry, Next, &mDriverData->Dns4ServerList) {\r
116 ServerItem = NET_LIST_USER_STRUCT (Entry, DNS4_SERVER_IP, AllServerLink);\r
117 CopyMem (ServerList + Index, &ServerItem->Dns4ServerIp, sizeof (EFI_IPv4_ADDRESS));\r
118 Index++;\r
119 }\r
120 DnsModeData->DnsServerList = ServerList;\r
121\r
122 //\r
123 // Get the DnsCacheCount and DnsCacheList\r
124 //\r
125 Index =0;\r
126 NET_LIST_FOR_EACH_SAFE (Entry, Next, &mDriverData->Dns4CacheList) {\r
127 Index++;\r
128 }\r
129 DnsModeData->DnsCacheCount = (UINT32) Index;\r
130 CacheList = AllocatePool (sizeof (EFI_DNS4_CACHE_ENTRY) * DnsModeData->DnsCacheCount);\r
131 ASSERT (CacheList != NULL);\r
132 Index =0;\r
133 NET_LIST_FOR_EACH_SAFE (Entry, Next, &mDriverData->Dns4CacheList) {\r
134 CacheItem = NET_LIST_USER_STRUCT (Entry, DNS4_CACHE, AllCacheLink);\r
135 CopyMem (CacheList + Index, &CacheItem->DnsCache, sizeof (EFI_DNS4_CACHE_ENTRY));\r
136 Index++;\r
137 }\r
138 DnsModeData->DnsCacheList = CacheList;\r
139\r
140 gBS->RestoreTPL (OldTpl);\r
141 \r
142 return EFI_SUCCESS;\r
143}\r
144\r
145/**\r
146 This function is used to configure DNS configuration data for this DNS instance.\r
147\r
148 @param[in] This Pointer to EFI_DNS4_PROTOCOL instance.\r
149 @param[in] DnsConfigData Pointer to caller-allocated buffer containing EFI_DNS4_CONFIG_DATA structure. \r
150 If NULL, the driver will reinitialize the protocol instance to the unconfigured state.\r
151\r
152 @retval EFI_SUCCESS The operation completed successfully.\r
153 @retval EFI_UNSUPPORTED The designated protocol is not supported.\r
154 @retval EFI_OUT_OF_RESOURCES Failed to allocate needed resources.\r
155 @retval EFI_INVALID_PARAMETER This is NULL.\r
156 The StationIp address provided in DnsConfigData is not a valid unicast.\r
157 DnsServerList is NULL while DnsServerListCount is not equal to Zero.\r
158 DnsServerListCount is Zero while DnsServerListCount is not equal to NULL.\r
159 @retval EFI_DEVICE_ERROR An unexpected system or network error occurred. The EFI DNSv4 Protocol instance is not configured.\r
160\r
161**/\r
162EFI_STATUS\r
163EFIAPI\r
164Dns4Configure (\r
165 IN EFI_DNS4_PROTOCOL *This,\r
166 IN EFI_DNS4_CONFIG_DATA *DnsConfigData\r
167 )\r
168{\r
169 EFI_STATUS Status;\r
170 DNS_INSTANCE *Instance;\r
171 \r
172 EFI_TPL OldTpl;\r
173 IP4_ADDR Ip;\r
174 IP4_ADDR Netmask;\r
175\r
176 UINT32 ServerListCount;\r
177 EFI_IPv4_ADDRESS *ServerList; \r
178\r
179 Status = EFI_SUCCESS;\r
180 ServerList = NULL;\r
181 \r
182 if (This == NULL || \r
183 (DnsConfigData != NULL && ((DnsConfigData->DnsServerListCount != 0 && DnsConfigData->DnsServerList == NULL) || \r
184 (DnsConfigData->DnsServerListCount == 0 && DnsConfigData->DnsServerList != NULL)))) {\r
185 return EFI_INVALID_PARAMETER;\r
186 }\r
187\r
188 if (DnsConfigData != NULL && DnsConfigData->Protocol != DNS_PROTOCOL_UDP) {\r
189 return EFI_UNSUPPORTED;\r
190 }\r
191\r
192 OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
193\r
194 Instance = DNS_INSTANCE_FROM_THIS_PROTOCOL4 (This);\r
195\r
196 if (DnsConfigData == NULL) {\r
197 ZeroMem (&Instance->SessionDnsServer, sizeof (EFI_IP_ADDRESS));\r
198 \r
199 //\r
200 // Reset the Instance if ConfigData is NULL\r
201 //\r
202 if (!NetMapIsEmpty(&Instance->Dns4TxTokens)) {\r
203 Dns4InstanceCancelToken(Instance, NULL);\r
204 }\r
205\r
206 Instance->MaxRetry = 0;\r
207\r
208 if (Instance->UdpIo != NULL){\r
209 UdpIoCleanIo (Instance->UdpIo);\r
210 }\r
211 \r
212 if (Instance->Dns4CfgData.DnsServerList != NULL) {\r
213 FreePool (Instance->Dns4CfgData.DnsServerList);\r
214 }\r
215 ZeroMem (&Instance->Dns4CfgData, sizeof (EFI_DNS4_CONFIG_DATA));\r
216 \r
217 Instance->State = DNS_STATE_UNCONFIGED;\r
218 } else {\r
219 //\r
220 // Configure the parameters for new operation.\r
221 //\r
222 CopyMem (&Ip, &DnsConfigData->StationIp, sizeof (IP4_ADDR));\r
223 CopyMem (&Netmask, &DnsConfigData->SubnetMask, sizeof (IP4_ADDR));\r
224\r
225 Ip = NTOHL (Ip);\r
226 Netmask = NTOHL (Netmask);\r
227\r
228 if (!DnsConfigData->UseDefaultSetting &&\r
229 ((!IP4_IS_VALID_NETMASK (Netmask) || !NetIp4IsUnicast (Ip, Netmask)))) {\r
230 Status = EFI_INVALID_PARAMETER;\r
231 goto ON_EXIT;\r
232 }\r
233\r
234 Status = Dns4CopyConfigure (&Instance->Dns4CfgData, DnsConfigData);\r
235 if (EFI_ERROR (Status)) {\r
236 goto ON_EXIT;\r
237 }\r
238\r
239 if (DnsConfigData->DnsServerListCount == 0 || DnsConfigData->DnsServerList == NULL) {\r
240 gBS->RestoreTPL (OldTpl); \r
241 \r
242 //\r
243 // The DNS instance will retrieve DNS server from DHCP Server\r
244 //\r
245 Status = GetDns4ServerFromDhcp4 (\r
246 Instance,\r
247 &ServerListCount, \r
248 &ServerList\r
249 );\r
250 if (EFI_ERROR (Status)) {\r
251 return Status;\r
252 }\r
253\r
254 ASSERT(ServerList != NULL);\r
255 \r
256 OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
257\r
258 CopyMem (&Instance->SessionDnsServer.v4, &ServerList[0], sizeof (EFI_IPv4_ADDRESS));\r
259 } else {\r
260 CopyMem (&Instance->SessionDnsServer.v4, &DnsConfigData->DnsServerList[0], sizeof (EFI_IPv4_ADDRESS));\r
261 }\r
262\r
263 //\r
264 // Config UDP\r
265 //\r
266 Status = Dns4ConfigUdp (Instance, Instance->UdpIo);\r
267 if (EFI_ERROR (Status)) {\r
268 if (Instance->Dns4CfgData.DnsServerList != NULL) {\r
269 FreePool (Instance->Dns4CfgData.DnsServerList);\r
270 }\r
271 goto ON_EXIT;\r
272 }\r
273\r
274 //\r
275 // Add configured DNS server used by this instance to ServerList.\r
276 //\r
277 Status = AddDns4ServerIp (&mDriverData->Dns4ServerList, Instance->SessionDnsServer.v4);\r
278 if (EFI_ERROR (Status)) {\r
279 if (Instance->Dns4CfgData.DnsServerList != NULL) {\r
280 FreePool (Instance->Dns4CfgData.DnsServerList);\r
281 }\r
282 goto ON_EXIT;\r
283 }\r
284 \r
285 Instance->State = DNS_STATE_CONFIGED;\r
286 }\r
287\r
288ON_EXIT:\r
289 gBS->RestoreTPL (OldTpl);\r
290 return Status;\r
291}\r
292\r
293/**\r
294 The function is used to translate the host name to host IP address. \r
295 A type A query is used to get the one or more IP addresses for this host. \r
296\r
297 @param[in] This Pointer to EFI_DNS4_PROTOCOL instance.\r
298 @param[in] HostName Pointer to caller-supplied buffer containing Host name to be translated. \r
299 This buffer contains 16 bit characters but these are translated to ASCII for use with \r
300 DNSv4 server and there is no requirement for driver to support non-ASCII Unicode characters.\r
301 @param[in] Token Pointer to the caller-allocated completion token to return at the completion of the process to translate host name to host address. \r
302\r
303 @retval EFI_SUCCESS The operation completed successfully.\r
304 @retval EFI_OUT_OF_RESOURCES Failed to allocate needed resources.\r
305 @retval EFI_INVALID_PARAMETER This is NULL.\r
306 Token is NULL.\r
307 Token.Event is.NULL\r
308 HostName is NULL\r
309 @retval EFI_NO_MAPPING There's no source address is available for use.\r
310 @retval EFI_NOT_STARTED This instance has not been started.\r
311\r
312**/\r
313EFI_STATUS\r
314EFIAPI\r
315Dns4HostNameToIp (\r
316 IN EFI_DNS4_PROTOCOL *This,\r
317 IN CHAR16 *HostName,\r
318 IN EFI_DNS4_COMPLETION_TOKEN *Token\r
319 )\r
320{\r
321 EFI_STATUS Status;\r
322 \r
323 DNS_INSTANCE *Instance;\r
324 \r
325 EFI_DNS4_CONFIG_DATA *ConfigData;\r
326 \r
327 UINTN Index;\r
328 DNS4_CACHE *Item;\r
329 LIST_ENTRY *Entry;\r
330 LIST_ENTRY *Next;\r
331 \r
332 DNS4_TOKEN_ENTRY *TokenEntry;\r
333 NET_BUF *Packet;\r
334 \r
335 EFI_TPL OldTpl;\r
336 \r
337 Status = EFI_SUCCESS;\r
338 Item = NULL;\r
339 TokenEntry = NULL;\r
340 Packet = NULL;\r
341 \r
342 //\r
343 // Validate the parameters\r
344 //\r
345 if ((This == NULL) || (HostName == NULL) || Token == NULL) {\r
346 return EFI_INVALID_PARAMETER;\r
347 }\r
348 \r
349 OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
350 \r
351 Instance = DNS_INSTANCE_FROM_THIS_PROTOCOL4 (This);\r
352 \r
353 ConfigData = &(Instance->Dns4CfgData);\r
354 \r
355 Instance->MaxRetry = ConfigData->RetryCount;\r
356 \r
357 Token->Status = EFI_NOT_READY;\r
358 Token->RetryCount = 0;\r
359 Token->RetryInterval = ConfigData->RetryInterval;\r
360\r
361 if (Instance->State != DNS_STATE_CONFIGED) {\r
362 Status = EFI_NOT_STARTED;\r
363 goto ON_EXIT;\r
364 }\r
365\r
366 //\r
367 // Check the MaxRetry and RetryInterval values.\r
368 //\r
369 if (Instance->MaxRetry == 0) {\r
370 Instance->MaxRetry = DNS_DEFAULT_RETRY;\r
371 }\r
372\r
373 if (Token->RetryInterval < DNS_DEFAULT_TIMEOUT) {\r
374 Token->RetryInterval = DNS_DEFAULT_TIMEOUT;\r
375 }\r
376\r
377 //\r
378 // Check cache\r
379 //\r
380 if (ConfigData->EnableDnsCache) {\r
381 Index = 0;\r
382 NET_LIST_FOR_EACH_SAFE (Entry, Next, &mDriverData->Dns4CacheList) {\r
383 Item = NET_LIST_USER_STRUCT (Entry, DNS4_CACHE, AllCacheLink);\r
384 if (StrCmp (HostName, Item->DnsCache.HostName) == 0) {\r
385 Index++;\r
386 }\r
387 }\r
388\r
389 if (Index != 0) {\r
390 Token->RspData.H2AData = AllocatePool (sizeof (DNS_HOST_TO_ADDR_DATA));\r
391 if (Token->RspData.H2AData == NULL) {\r
392 Status = EFI_OUT_OF_RESOURCES;\r
393 goto ON_EXIT;\r
394 }\r
395\r
396 Token->RspData.H2AData->IpCount = (UINT32)Index;\r
397 Token->RspData.H2AData->IpList = AllocatePool (sizeof (EFI_IPv4_ADDRESS) * Index);\r
398 if (Token->RspData.H2AData->IpList == NULL) {\r
399 if (Token->RspData.H2AData != NULL) {\r
400 FreePool (Token->RspData.H2AData);\r
401 }\r
402 \r
403 Status = EFI_OUT_OF_RESOURCES;\r
404 goto ON_EXIT;\r
405 }\r
406\r
407 Index = 0;\r
408 NET_LIST_FOR_EACH_SAFE (Entry, Next, &mDriverData->Dns4CacheList) {\r
409 Item = NET_LIST_USER_STRUCT (Entry, DNS4_CACHE, AllCacheLink);\r
410 if ((UINT32)Index < Token->RspData.H2AData->IpCount && StrCmp (HostName, Item->DnsCache.HostName) == 0) {\r
411 CopyMem ((Token->RspData.H2AData->IpList) + Index, Item->DnsCache.IpAddress, sizeof (EFI_IPv4_ADDRESS));\r
412 Index++; \r
413 }\r
414 }\r
415 \r
416 Token->Status = EFI_SUCCESS;\r
417 \r
418 if (Token->Event != NULL) {\r
419 gBS->SignalEvent (Token->Event);\r
420 DispatchDpc ();\r
421 }\r
422\r
423 Status = Token->Status;\r
424 goto ON_EXIT;\r
425 } \r
426 }\r
427\r
428 //\r
429 // Construct DNS TokenEntry.\r
430 //\r
431 TokenEntry = AllocateZeroPool (sizeof(DNS4_TOKEN_ENTRY));\r
432 if (TokenEntry == NULL) {\r
433 Status = EFI_OUT_OF_RESOURCES;\r
434 goto ON_EXIT;\r
435 }\r
436 \r
437 TokenEntry->PacketToLive = Token->RetryInterval;\r
438 TokenEntry->QueryHostName = HostName;\r
439 TokenEntry->Token = Token;\r
440\r
441 //\r
442 // Construct DNS Query Packet.\r
443 //\r
444 Status = ConstructDNSQueryIp (Instance, TokenEntry->QueryHostName, DNS_TYPE_A, &Packet);\r
445 if (EFI_ERROR (Status)) {\r
446 if (TokenEntry != NULL) {\r
447 FreePool (TokenEntry);\r
448 }\r
449 \r
450 goto ON_EXIT;\r
451 }\r
452\r
453 //\r
454 // Save the token into the Dns4TxTokens map.\r
455 //\r
456 Status = NetMapInsertTail (&Instance->Dns4TxTokens, TokenEntry, Packet);\r
457 if (EFI_ERROR (Status)) {\r
458 if (TokenEntry != NULL) {\r
459 FreePool (TokenEntry);\r
460 }\r
461 \r
462 NetbufFree (Packet);\r
463 \r
464 goto ON_EXIT;\r
465 }\r
466 \r
467 //\r
468 // Dns Query Ip\r
469 //\r
470 Status = DoDnsQuery (Instance, Packet);\r
471 if (EFI_ERROR (Status)) {\r
472 if (TokenEntry != NULL) {\r
473 FreePool (TokenEntry);\r
474 }\r
475 \r
476 NetbufFree (Packet);\r
477 }\r
478 \r
479ON_EXIT:\r
480 gBS->RestoreTPL (OldTpl);\r
481 return Status;\r
482}\r
483\r
484/**\r
485 The function is used to translate the host address to host name. \r
486 A type PTR query is used to get the primary name of the host. \r
487\r
488 @param[in] This Pointer to EFI_DNS4_PROTOCOL instance.\r
489 @param[in] IpAddress IP address.\r
490 @param[in] Token Pointer to the caller-allocated completion used token to translate host address to host name.\r
491\r
492 @retval EFI_SUCCESS The operation completed successfully.\r
493 @retval EFI_OUT_OF_RESOURCES Failed to allocate needed resources.\r
494 @retval EFI_INVALID_PARAMETER This is NULL.\r
495 Token is NULL.\r
496 Token.Event is NULL.\r
497 IpAddress is not valid IP address.\r
498 @retval EFI_NO_MAPPING There's no source address is available for use.\r
499 @retval EFI_NOT_STARTED This instance has not been started.\r
500 @retval EFI_UNSUPPORTED This function is not supported.\r
501\r
502**/\r
503EFI_STATUS\r
504EFIAPI\r
505Dns4IpToHostName (\r
506 IN EFI_DNS4_PROTOCOL *This,\r
507 IN EFI_IPv4_ADDRESS IpAddress,\r
508 IN EFI_DNS4_COMPLETION_TOKEN *Token\r
509 )\r
510{\r
511 return EFI_UNSUPPORTED;\r
512}\r
513\r
514/**\r
515 This function retrieves arbitrary information from the DNS. \r
516 The caller supplies a QNAME, QTYPE, and QCLASS, and all of the matching RRs are returned. \r
517 All RR content (e.g., Ttl) was returned. \r
518 The caller need parse the returned RR to get required information. This function is optional.\r
519\r
520 @param[in] This Pointer to EFI_DNS4_PROTOCOL instance.\r
521 @param[in] QName Pointer to Query Name.\r
522 @param[in] QType Query Type.\r
523 @param[in] QClass Query Name.\r
524 @param[in] Token Point to the caller-allocated completion token to retrieve arbitrary information.\r
525\r
526 @retval EFI_SUCCESS The operation completed successfully.\r
527 @retval EFI_OUT_OF_RESOURCES Failed to allocate needed resources.\r
528 @retval EFI_INVALID_PARAMETER This is NULL.\r
529 Token is NULL.\r
530 Token.Event is NULL.\r
531 QName is NULL.\r
532 @retval EFI_NO_MAPPING There's no source address is available for use.\r
533 @retval EFI_ALREADY_STARTED This Token is being used in another DNS session.\r
534 @retval EFI_UNSUPPORTED This function is not supported. Or the requested QType is not supported\r
535\r
536**/\r
537EFI_STATUS\r
538EFIAPI\r
539Dns4GeneralLookUp (\r
540 IN EFI_DNS4_PROTOCOL *This,\r
541 IN CHAR8 *QName,\r
542 IN UINT16 QType, \r
543 IN UINT16 QClass,\r
544 IN EFI_DNS4_COMPLETION_TOKEN *Token\r
545 )\r
546{\r
547 return EFI_UNSUPPORTED;\r
548}\r
549\r
550/**\r
551 This function is used to add/delete/modify DNS cache entry. \r
552 DNS cache can be normally dynamically updated after the DNS resolve succeeds. \r
553 This function provided capability to manually add/delete/modify the DNS cache.\r
554\r
555 @param[in] This Pointer to EFI_DNS4_PROTOCOL instance.\r
556 @param[in] DeleteFlag If FALSE, this function is to add one entry to the DNS Cache. \r
557 If TRUE, this function will delete matching DNS Cache entry. \r
558 @param[in] Override If TRUE, the matching DNS cache entry will be overwritten with the supplied parameter. \r
559 If FALSE, EFI_ACCESS_DENIED will be returned if the entry to be added is already exists.\r
560 @param[in] DnsCacheEntry Pointer to DNS Cache entry.\r
561\r
562 @retval EFI_SUCCESS The operation completed successfully.\r
563 @retval EFI_INVALID_PARAMETER This is NULL. \r
564 DnsCacheEntry.HostName is NULL.\r
565 DnsCacheEntry.IpAddress is NULL.\r
566 DnsCacheEntry.Timeout is zero.\r
567 @retval EFI_ACCESS_DENIED The DNS cache entry already exists and Override is not TRUE. \r
568\r
569**/\r
570EFI_STATUS\r
571EFIAPI\r
572Dns4UpdateDnsCache (\r
573 IN EFI_DNS4_PROTOCOL *This,\r
574 IN BOOLEAN DeleteFlag,\r
575 IN BOOLEAN Override,\r
576 IN EFI_DNS4_CACHE_ENTRY DnsCacheEntry\r
577 )\r
578{\r
579 EFI_STATUS Status; \r
580 EFI_TPL OldTpl;\r
581\r
582 Status = EFI_SUCCESS;\r
583 \r
584 if (DnsCacheEntry.HostName == NULL || DnsCacheEntry.IpAddress == NULL || DnsCacheEntry.Timeout == 0) {\r
585 return EFI_INVALID_PARAMETER; \r
586 }\r
587 \r
588 OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
589\r
590 //\r
591 // Update Dns4Cache here.\r
592 //\r
593 Status = UpdateDns4Cache (&mDriverData->Dns4CacheList, DeleteFlag, Override, DnsCacheEntry);\r
594\r
595 gBS->RestoreTPL (OldTpl);\r
596 \r
597 return Status;\r
598}\r
599\r
600/**\r
601 This function can be used by network drivers and applications to increase the rate that data packets are moved between \r
602 the communications device and the transmit and receive queues. In some systems, the periodic timer event in the managed \r
603 network driver may not poll the underlying communications device fast enough to transmit and/or receive all data packets \r
604 without missing incoming packets or dropping outgoing packets.\r
605\r
606 @param[in] This Pointer to EFI_DNS4_PROTOCOL instance.\r
607\r
608 @retval EFI_SUCCESS Incoming or outgoing data was processed.\r
609 @retval EFI_INVALID_PARAMETER This is NULL. \r
610 @retval EFI_NOT_STARTED This EFI DNS Protocol instance has not been started. \r
611 @retval EFI_DEVICE_ERROR An unexpected system or network error occurred. \r
612 @retval EFI_TIMEOUT Data was dropped out of the transmit and/or receive queue. \r
613 Consider increasing the polling rate.\r
614 \r
615**/\r
616EFI_STATUS\r
617EFIAPI\r
618Dns4Poll (\r
619 IN EFI_DNS4_PROTOCOL *This\r
620 )\r
621{\r
622 DNS_INSTANCE *Instance;\r
623 EFI_UDP4_PROTOCOL *Udp;\r
624\r
625 if (This == NULL) {\r
626 return EFI_INVALID_PARAMETER;\r
627 }\r
628\r
629 Instance = DNS_INSTANCE_FROM_THIS_PROTOCOL4 (This);\r
630\r
631 if (Instance->State == DNS_STATE_UNCONFIGED) {\r
632 return EFI_NOT_STARTED;\r
633 } else if (Instance->State == DNS_STATE_DESTROY) {\r
634 return EFI_DEVICE_ERROR;\r
635 }\r
636\r
637 Udp = Instance->UdpIo->Protocol.Udp4;\r
638 \r
639 return Udp->Poll (Udp);\r
640}\r
641\r
642/**\r
643 This function is used to abort a pending resolution request. \r
644 After calling this function, Token.Status will be set to EFI_ABORTED and then Token.\r
645\r
646 @param[in] This Pointer to EFI_DNS4_PROTOCOL instance.\r
647 @param[in] Token Pointer to a token that has been issued by EFI_DNS4_PROTOCOL.HostNameToIp(), \r
648 EFI_DNS4_PROTOCOL.IpToHostName() or EFI_DNS4_PROTOCOL.GeneralLookup(). \r
649 If NULL, all pending tokens are aborted.\r
650\r
651 @retval EFI_SUCCESS Incoming or outgoing data was processed.\r
652 @retval EFI_INVALID_PARAMETER This is NULL. \r
653 @retval EFI_NOT_STARTED This EFI DNS Protocol instance has not been started. \r
654 @retval EFI_NOT_FOUND When Token is not NULL, and the asynchronous DNS operation was not found in the transmit queue. \r
655 It was either completed or was not issued by HostNameToIp(), IpToHostName() or GeneralLookup().\r
656 \r
657**/\r
658EFI_STATUS\r
659EFIAPI\r
660Dns4Cancel (\r
661 IN EFI_DNS4_PROTOCOL *This,\r
662 IN EFI_DNS4_COMPLETION_TOKEN *Token\r
663 )\r
664{\r
665 EFI_STATUS Status;\r
666 DNS_INSTANCE *Instance;\r
667 EFI_TPL OldTpl;\r
668\r
669 if (This == NULL) {\r
670 return EFI_INVALID_PARAMETER;\r
671 }\r
672\r
673 Instance = DNS_INSTANCE_FROM_THIS_PROTOCOL4 (This);\r
674\r
675 if (Instance->State == DNS_STATE_UNCONFIGED) {\r
676 return EFI_NOT_STARTED;\r
677 }\r
678\r
679 OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
680\r
681 //\r
682 // Cancle the tokens specified by Token for this instance.\r
683 //\r
684 Status = Dns4InstanceCancelToken (Instance, Token);\r
685\r
686 //\r
687 // Dispatch the DPC queued by the NotifyFunction of the canceled token's events.\r
688 //\r
689 DispatchDpc ();\r
690\r
691 gBS->RestoreTPL (OldTpl);\r
692\r
693 return Status;\r
694}\r
695\r
696/**\r
697 This function is used to retrieve DNS mode data for this DNS instance.\r
698\r
699 @param[in] This Pointer to EFI_DNS6_PROTOCOL instance.\r
700 @param[out] DnsModeData Pointer to the caller-allocated storage for the EFI_DNS6_MODE_DATA structure.\r
701\r
702 @retval EFI_SUCCESS The operation completed successfully.\r
703 @retval EFI_NOT_STARTED When DnsConfigData is queried, no configuration data is \r
704 available because this instance has not been configured.\r
705 @retval EFI_OUT_OF_RESOURCES Failed to allocate needed resources.\r
706 @retval EFI_INVALID_PARAMETER This is NULL or DnsModeData is NULL.\r
707\r
708**/\r
709EFI_STATUS\r
710EFIAPI\r
711Dns6GetModeData (\r
712 IN EFI_DNS6_PROTOCOL *This,\r
713 OUT EFI_DNS6_MODE_DATA *DnsModeData\r
714 )\r
715{\r
716 DNS_INSTANCE *Instance;\r
717 \r
718 EFI_TPL OldTpl;\r
719\r
720 UINTN Index;\r
721 \r
722 LIST_ENTRY *Entry;\r
723 LIST_ENTRY *Next;\r
724\r
725 DNS6_SERVER_IP *ServerItem;\r
726 EFI_IPv6_ADDRESS *ServerList;\r
727 DNS6_CACHE *CacheItem;\r
728 EFI_DNS6_CACHE_ENTRY *CacheList;\r
729 EFI_STATUS Status;\r
730\r
731 ServerItem = NULL;\r
732 ServerList = NULL;\r
733 CacheItem = NULL;\r
734 CacheList = NULL;\r
735 Status = EFI_SUCCESS;\r
736\r
737 if ((This == NULL) || (DnsModeData == NULL)) {\r
738 return EFI_INVALID_PARAMETER;\r
739 }\r
740\r
741 OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
742 \r
743 Instance = DNS_INSTANCE_FROM_THIS_PROTOCOL6 (This);\r
744 if (Instance->State == DNS_STATE_UNCONFIGED) {\r
745 gBS->RestoreTPL (OldTpl);\r
746 return EFI_NOT_STARTED;\r
747 }\r
748\r
749 ZeroMem (DnsModeData, sizeof (EFI_DNS6_MODE_DATA));\r
750\r
751 //\r
752 // Get the current configuration data of this instance. \r
753 //\r
754 Status = Dns6CopyConfigure(&DnsModeData->DnsConfigData, &Instance->Dns6CfgData);\r
755 if (EFI_ERROR (Status)) {\r
756 gBS->RestoreTPL (OldTpl);\r
757 return Status;\r
758 }\r
759 \r
760 //\r
761 // Get the DnsServerCount and DnsServerList\r
762 //\r
763 Index = 0;\r
764 NET_LIST_FOR_EACH_SAFE (Entry, Next, &mDriverData->Dns6ServerList) {\r
765 Index++;\r
766 }\r
767 DnsModeData->DnsServerCount = (UINT32) Index;\r
768 ServerList = AllocatePool (sizeof(EFI_IPv6_ADDRESS) * DnsModeData->DnsServerCount);\r
769 ASSERT (ServerList != NULL);\r
770 Index = 0;\r
771 NET_LIST_FOR_EACH_SAFE (Entry, Next, &mDriverData->Dns6ServerList) {\r
772 ServerItem = NET_LIST_USER_STRUCT (Entry, DNS6_SERVER_IP, AllServerLink);\r
773 CopyMem (ServerList + Index, &ServerItem->Dns6ServerIp, sizeof (EFI_IPv6_ADDRESS));\r
774 Index++;\r
775 }\r
776 DnsModeData->DnsServerList = ServerList;\r
777\r
778 //\r
779 // Get the DnsCacheCount and DnsCacheList\r
780 //\r
781 Index =0;\r
782 NET_LIST_FOR_EACH_SAFE (Entry, Next, &mDriverData->Dns6CacheList) {\r
783 Index++;\r
784 }\r
785 DnsModeData->DnsCacheCount = (UINT32) Index;\r
786 CacheList = AllocatePool (sizeof(EFI_DNS6_CACHE_ENTRY) * DnsModeData->DnsCacheCount);\r
787 ASSERT (CacheList != NULL);\r
788 Index =0;\r
789 NET_LIST_FOR_EACH_SAFE (Entry, Next, &mDriverData->Dns6CacheList) {\r
790 CacheItem = NET_LIST_USER_STRUCT (Entry, DNS6_CACHE, AllCacheLink);\r
791 CopyMem (CacheList + Index, &CacheItem->DnsCache, sizeof (EFI_DNS6_CACHE_ENTRY));\r
792 Index++;\r
793 }\r
794 DnsModeData->DnsCacheList = CacheList;\r
795\r
796 gBS->RestoreTPL (OldTpl);\r
797 \r
798 return EFI_SUCCESS;\r
799}\r
800\r
801/**\r
802 The function is used to set and change the configuration data for this EFI DNSv6 Protocol driver instance. \r
803 Reset the DNS instance if DnsConfigData is NULL.\r
804\r
805 @param[in] This Pointer to EFI_DNS6_PROTOCOL instance.\r
806 @param[in] DnsConfigData Pointer to the configuration data structure. \r
807 All associated storage to be allocated and released by caller.\r
808\r
809 @retval EFI_SUCCESS The operation completed successfully.\r
810 @retval EFI_UNSUPPORTED The designated protocol is not supported.\r
811 @retval EFI_OUT_OF_RESOURCES Failed to allocate needed resources.\r
812 @retval EFI_INVALID_PARAMETER This is NULL.\r
813 The StationIp address provided in DnsConfigData is not a valid unicast.\r
814 DnsServerList is NULL while DnsServerListCount is not equal to Zero.\r
815 DnsServerListCount is Zero while DnsServerList is not equal to NULL.\r
816 @retval EFI_DEVICE_ERROR An unexpected system or network error occurred. The EFI DNSv6 Protocol instance is not configured.\r
817\r
818**/\r
819EFI_STATUS\r
820EFIAPI\r
821Dns6Configure (\r
822 IN EFI_DNS6_PROTOCOL *This,\r
823 IN EFI_DNS6_CONFIG_DATA *DnsConfigData\r
824 )\r
825{\r
826 EFI_STATUS Status;\r
827 DNS_INSTANCE *Instance;\r
828 \r
829 EFI_TPL OldTpl;\r
830\r
831 UINT32 ServerListCount;\r
832 EFI_IPv6_ADDRESS *ServerList; \r
833\r
834 Status = EFI_SUCCESS;\r
835 ServerList = NULL;\r
836\r
837 if (This == NULL || \r
838 (DnsConfigData != NULL && ((DnsConfigData->DnsServerCount != 0 && DnsConfigData->DnsServerList == NULL) || \r
839 (DnsConfigData->DnsServerCount == 0 && DnsConfigData->DnsServerList != NULL)))) {\r
840 return EFI_INVALID_PARAMETER;\r
841 }\r
842\r
843 if (DnsConfigData != NULL && DnsConfigData->Protocol != DNS_PROTOCOL_UDP) {\r
844 return EFI_UNSUPPORTED;\r
845 }\r
846\r
847 OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
848\r
849 Instance = DNS_INSTANCE_FROM_THIS_PROTOCOL6 (This);\r
850\r
851 if (DnsConfigData == NULL) {\r
852 ZeroMem (&Instance->SessionDnsServer, sizeof (EFI_IP_ADDRESS));\r
853\r
854 //\r
855 // Reset the Instance if ConfigData is NULL\r
856 //\r
857 if (!NetMapIsEmpty(&Instance->Dns6TxTokens)) {\r
858 Dns6InstanceCancelToken(Instance, NULL);\r
859 }\r
860\r
861 Instance->MaxRetry = 0;\r
862\r
863 if (Instance->UdpIo != NULL){\r
864 UdpIoCleanIo (Instance->UdpIo);\r
865 }\r
866\r
867 if (Instance->Dns6CfgData.DnsServerList != NULL) {\r
868 FreePool (Instance->Dns6CfgData.DnsServerList);\r
869 }\r
870 ZeroMem (&Instance->Dns6CfgData, sizeof (EFI_DNS6_CONFIG_DATA));\r
871 \r
872 Instance->State = DNS_STATE_UNCONFIGED;\r
873 } else {\r
874 //\r
875 // Configure the parameters for new operation.\r
876 //\r
90ae1f02 877 if (!NetIp6IsUnspecifiedAddr (&DnsConfigData->StationIp) && !NetIp6IsValidUnicast (&DnsConfigData->StationIp)) {\r
99c048ef 878 Status = EFI_INVALID_PARAMETER;\r
879 goto ON_EXIT;\r
880 }\r
881\r
882 Status = Dns6CopyConfigure (&Instance->Dns6CfgData, DnsConfigData);\r
883 if (EFI_ERROR (Status)) {\r
884 goto ON_EXIT;\r
885 }\r
886\r
887 if (DnsConfigData->DnsServerCount == 0 || DnsConfigData->DnsServerList == NULL) {\r
888 gBS->RestoreTPL (OldTpl);\r
889\r
890 //\r
891 //The DNS instance will retrieve DNS server from DHCP Server.\r
892 //\r
893 Status = GetDns6ServerFromDhcp6 (\r
894 Instance->Service->ImageHandle,\r
895 Instance->Service->ControllerHandle, \r
896 &ServerListCount, \r
897 &ServerList\r
898 );\r
899 if (EFI_ERROR (Status)) {\r
900 goto ON_EXIT;\r
901 }\r
902 \r
903 ASSERT(ServerList != NULL);\r
904\r
905 OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
906\r
907 CopyMem (&Instance->SessionDnsServer.v6, &ServerList[0], sizeof (EFI_IPv6_ADDRESS));\r
908 } else {\r
909 CopyMem (&Instance->SessionDnsServer.v6, &DnsConfigData->DnsServerList[0], sizeof (EFI_IPv6_ADDRESS));\r
910 }\r
911\r
912 //\r
913 // Config UDP\r
914 //\r
915 Status = Dns6ConfigUdp (Instance, Instance->UdpIo);\r
916 if (EFI_ERROR (Status)) {\r
917 if (Instance->Dns6CfgData.DnsServerList != NULL) {\r
918 FreePool (Instance->Dns6CfgData.DnsServerList);\r
919 }\r
920 goto ON_EXIT;\r
921 }\r
922\r
923 //\r
924 // Add configured DNS server used by this instance to ServerList.\r
925 //\r
926 Status = AddDns6ServerIp (&mDriverData->Dns6ServerList, Instance->SessionDnsServer.v6);\r
927 if (EFI_ERROR (Status)) {\r
928 if (Instance->Dns6CfgData.DnsServerList != NULL) {\r
929 FreePool (Instance->Dns6CfgData.DnsServerList);\r
930 }\r
931 goto ON_EXIT;\r
932 }\r
933 \r
934 Instance->State = DNS_STATE_CONFIGED;\r
935 }\r
936\r
937ON_EXIT:\r
938 gBS->RestoreTPL (OldTpl);\r
939 return Status;\r
940}\r
941\r
942/**\r
943 The function is used to translate the host name to host IP address. \r
944 A type AAAA query is used to get the one or more IPv6 addresses for this host. \r
945\r
946 @param[in] This Pointer to EFI_DNS6_PROTOCOL instance.\r
947 @param[in] HostName Pointer to caller-supplied buffer containing Host name to be translated. \r
948 This buffer contains 16 bit characters but these are translated to ASCII for use with \r
949 DNSv4 server and there is no requirement for driver to support non-ASCII Unicode characters.\r
950 @param[in] Token Pointer to the caller-allocated completion token to return at the completion of the process to translate host name to host address. \r
951\r
952 @retval EFI_SUCCESS The operation completed successfully.\r
953 @retval EFI_OUT_OF_RESOURCES Failed to allocate needed resources.\r
954 @retval EFI_INVALID_PARAMETER This is NULL.\r
955 Token is NULL.\r
956 Token.Event is.NULL\r
957 HostName is NULL\r
958 @retval EFI_NO_MAPPING There's no source address is available for use.\r
959 @retval EFI_NOT_STARTED This instance has not been started.\r
960\r
961**/\r
962EFI_STATUS\r
963EFIAPI\r
964Dns6HostNameToIp (\r
965 IN EFI_DNS6_PROTOCOL *This,\r
966 IN CHAR16 *HostName,\r
967 IN EFI_DNS6_COMPLETION_TOKEN *Token\r
968 )\r
969{\r
970 EFI_STATUS Status;\r
971 \r
972 DNS_INSTANCE *Instance;\r
973\r
974 EFI_DNS6_CONFIG_DATA *ConfigData;\r
975 \r
976 UINTN Index; \r
977 DNS6_CACHE *Item;\r
978 LIST_ENTRY *Entry;\r
979 LIST_ENTRY *Next;\r
980 \r
981 DNS6_TOKEN_ENTRY *TokenEntry;\r
982 NET_BUF *Packet;\r
983 \r
984 EFI_TPL OldTpl;\r
985 \r
986 Status = EFI_SUCCESS;\r
987 Item = NULL;\r
988 TokenEntry = NULL;\r
989 Packet = NULL;\r
990\r
991 //\r
992 // Validate the parameters\r
993 //\r
994 if ((This == NULL) || (HostName == NULL) || Token == NULL) {\r
995 return EFI_INVALID_PARAMETER;\r
996 }\r
997\r
998 OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
999 \r
1000 Instance = DNS_INSTANCE_FROM_THIS_PROTOCOL6 (This);\r
1001 \r
1002 ConfigData = &(Instance->Dns6CfgData);\r
1003 \r
1004 Instance->MaxRetry = ConfigData->RetryCount;\r
1005\r
1006 Token->Status = EFI_NOT_READY;\r
1007 Token->RetryCount = 0;\r
1008 Token->RetryInterval = ConfigData->RetryInterval;\r
1009\r
1010 if (Instance->State != DNS_STATE_CONFIGED) {\r
1011 Status = EFI_NOT_STARTED;\r
1012 goto ON_EXIT;\r
1013 }\r
1014\r
1015 //\r
1016 // Check the MaxRetry and RetryInterval values.\r
1017 //\r
1018 if (Instance->MaxRetry == 0) {\r
1019 Instance->MaxRetry = DNS_DEFAULT_RETRY;\r
1020 }\r
1021\r
1022 if (Token->RetryInterval < DNS_DEFAULT_TIMEOUT) {\r
1023 Token->RetryInterval = DNS_DEFAULT_TIMEOUT;\r
1024 } \r
1025\r
1026 //\r
1027 // Check cache\r
1028 //\r
1029 if (ConfigData->EnableDnsCache) {\r
1030 Index = 0;\r
1031 NET_LIST_FOR_EACH_SAFE (Entry, Next, &mDriverData->Dns6CacheList) {\r
1032 Item = NET_LIST_USER_STRUCT (Entry, DNS6_CACHE, AllCacheLink);\r
1033 if (StrCmp (HostName, Item->DnsCache.HostName) == 0) {\r
1034 Index++;\r
1035 }\r
1036 }\r
1037\r
1038 if (Index != 0) {\r
1039 Token->RspData.H2AData = AllocatePool (sizeof (DNS6_HOST_TO_ADDR_DATA));\r
1040 if (Token->RspData.H2AData == NULL) {\r
1041 Status = EFI_OUT_OF_RESOURCES;\r
1042 goto ON_EXIT;\r
1043 }\r
1044\r
1045 Token->RspData.H2AData->IpCount = (UINT32)Index;\r
1046 Token->RspData.H2AData->IpList = AllocatePool (sizeof (EFI_IPv6_ADDRESS) * Index);\r
1047 if (Token->RspData.H2AData->IpList == NULL) {\r
1048 if (Token->RspData.H2AData != NULL) {\r
1049 FreePool (Token->RspData.H2AData);\r
1050 }\r
1051 \r
1052 Status = EFI_OUT_OF_RESOURCES;\r
1053 goto ON_EXIT;\r
1054 }\r
1055\r
1056 Index = 0;\r
1057 NET_LIST_FOR_EACH_SAFE (Entry, Next, &mDriverData->Dns6CacheList) {\r
1058 Item = NET_LIST_USER_STRUCT (Entry, DNS6_CACHE, AllCacheLink);\r
1059 if ((UINT32)Index < Token->RspData.H2AData->IpCount && StrCmp (HostName, Item->DnsCache.HostName) == 0) {\r
1060 CopyMem ((Token->RspData.H2AData->IpList) + Index, Item->DnsCache.IpAddress, sizeof (EFI_IPv6_ADDRESS));\r
1061 Index++;\r
1062 }\r
1063 }\r
1064 \r
1065 Token->Status = EFI_SUCCESS;\r
1066 \r
1067 if (Token->Event != NULL) {\r
1068 gBS->SignalEvent (Token->Event);\r
1069 DispatchDpc ();\r
1070 }\r
1071 \r
1072 Status = Token->Status;\r
1073 goto ON_EXIT;\r
1074 } \r
1075 }\r
1076\r
1077 //\r
1078 // Construct DNS TokenEntry.\r
1079 //\r
1080 TokenEntry = AllocateZeroPool (sizeof (DNS6_TOKEN_ENTRY));\r
1081 if (TokenEntry == NULL) {\r
1082 Status = EFI_OUT_OF_RESOURCES;\r
1083 goto ON_EXIT;\r
1084 }\r
1085 \r
1086 TokenEntry->PacketToLive = Token->RetryInterval;\r
1087 TokenEntry->QueryHostName = HostName;\r
1088 TokenEntry->Token = Token;\r
1089\r
1090 //\r
1091 // Construct DNS Query Packet.\r
1092 //\r
1093 Status = ConstructDNSQueryIp (Instance, TokenEntry->QueryHostName, DNS_TYPE_AAAA, &Packet);\r
1094 if (EFI_ERROR (Status)) {\r
1095 if (TokenEntry != NULL) {\r
1096 FreePool (TokenEntry);\r
1097 }\r
1098 \r
1099 goto ON_EXIT;\r
1100 }\r
1101\r
1102 //\r
1103 // Save the token into the Dns6TxTokens map.\r
1104 //\r
1105 Status = NetMapInsertTail (&Instance->Dns6TxTokens, TokenEntry, Packet);\r
1106 if (EFI_ERROR (Status)) {\r
1107 if (TokenEntry != NULL) {\r
1108 FreePool (TokenEntry);\r
1109 }\r
1110 \r
1111 NetbufFree (Packet);\r
1112 \r
1113 goto ON_EXIT;\r
1114 }\r
1115 \r
1116 //\r
1117 // Dns Query Ip\r
1118 //\r
1119 Status = DoDnsQuery (Instance, Packet);\r
1120 if (EFI_ERROR (Status)) {\r
1121 if (TokenEntry != NULL) {\r
1122 FreePool (TokenEntry);\r
1123 }\r
1124 \r
1125 NetbufFree (Packet);\r
1126 }\r
1127 \r
1128ON_EXIT:\r
1129 gBS->RestoreTPL (OldTpl);\r
1130 return Status;\r
1131}\r
1132\r
1133/**\r
1134 The function is used to translate the host address to host name. \r
1135 A type PTR query is used to get the primary name of the host. \r
1136\r
1137 @param[in] This Pointer to EFI_DNS6_PROTOCOL instance.\r
1138 @param[in] IpAddress IP address.\r
1139 @param[in] Token Pointer to the caller-allocated completion used token to translate host address to host name.\r
1140\r
1141 @retval EFI_SUCCESS The operation completed successfully.\r
1142 @retval EFI_OUT_OF_RESOURCES Failed to allocate needed resources.\r
1143 @retval EFI_INVALID_PARAMETER This is NULL.\r
1144 Token is NULL.\r
1145 Token.Event is NULL.\r
1146 IpAddress is not valid IP address.\r
1147 @retval EFI_NO_MAPPING There's no source address is available for use.\r
1148 @retval EFI_NOT_STARTED This instance has not been started.\r
1149 @retval EFI_UNSUPPORTED This function is not supported.\r
1150\r
1151**/\r
1152EFI_STATUS\r
1153EFIAPI\r
1154Dns6IpToHostName (\r
1155 IN EFI_DNS6_PROTOCOL *This,\r
1156 IN EFI_IPv6_ADDRESS IpAddress,\r
1157 IN EFI_DNS6_COMPLETION_TOKEN *Token\r
1158 )\r
1159{\r
1160 return EFI_UNSUPPORTED;\r
1161}\r
1162\r
1163/**\r
1164 This function retrieves arbitrary information from the DNS. \r
1165 The caller supplies a QNAME, QTYPE, and QCLASS, and all of the matching RRs are returned. \r
1166 All RR content (e.g., Ttl) was returned. \r
1167 The caller need parse the returned RR to get required information. This function is optional.\r
1168\r
1169 @param[in] This Pointer to EFI_DNS6_PROTOCOL instance.\r
1170 @param[in] QName Pointer to Query Name.\r
1171 @param[in] QType Query Type.\r
1172 @param[in] QClass Query Name.\r
1173 @param[in] Token Point to the caller-allocated completion token to retrieve arbitrary information.\r
1174\r
1175 @retval EFI_SUCCESS The operation completed successfully.\r
1176 @retval EFI_OUT_OF_RESOURCES Failed to allocate needed resources.\r
1177 @retval EFI_INVALID_PARAMETER This is NULL.\r
1178 Token is NULL.\r
1179 Token.Event is NULL.\r
1180 QName is NULL.\r
1181 @retval EFI_NO_MAPPING There's no source address is available for use.\r
1182 @retval EFI_NOT_STARTED This instance has not been started.\r
1183 @retval EFI_UNSUPPORTED This function is not supported. Or the requested QType is not supported\r
1184\r
1185**/\r
1186EFI_STATUS\r
1187EFIAPI\r
1188Dns6GeneralLookUp (\r
1189 IN EFI_DNS6_PROTOCOL *This,\r
1190 IN CHAR8 *QName,\r
1191 IN UINT16 QType, \r
1192 IN UINT16 QClass,\r
1193 IN EFI_DNS6_COMPLETION_TOKEN *Token\r
1194 )\r
1195{\r
1196 return EFI_UNSUPPORTED;\r
1197}\r
1198\r
1199/**\r
1200 This function is used to add/delete/modify DNS cache entry. \r
1201 DNS cache can be normally dynamically updated after the DNS resolve succeeds. \r
1202 This function provided capability to manually add/delete/modify the DNS cache.\r
1203\r
1204 @param[in] This Pointer to EFI_DNS6_PROTOCOL instance.\r
1205 @param[in] DeleteFlag If FALSE, this function is to add one entry to the DNS Cache. \r
1206 If TRUE, this function will delete matching DNS Cache entry. \r
1207 @param[in] Override If TRUE, the matching DNS cache entry will be overwritten with the supplied parameter. \r
1208 If FALSE, EFI_ACCESS_DENIED will be returned if the entry to be added is already exists.\r
1209 @param[in] DnsCacheEntry Pointer to DNS Cache entry.\r
1210\r
1211 @retval EFI_SUCCESS The operation completed successfully.\r
1212 @retval EFI_INVALID_PARAMETER This is NULL. \r
1213 DnsCacheEntry.HostName is NULL.\r
1214 DnsCacheEntry.IpAddress is NULL.\r
1215 DnsCacheEntry.Timeout is zero.\r
1216 @retval EFI_ACCESS_DENIED The DNS cache entry already exists and Override is not TRUE. \r
1217\r
1218**/\r
1219EFI_STATUS\r
1220EFIAPI\r
1221Dns6UpdateDnsCache (\r
1222 IN EFI_DNS6_PROTOCOL *This,\r
1223 IN BOOLEAN DeleteFlag,\r
1224 IN BOOLEAN Override,\r
1225 IN EFI_DNS6_CACHE_ENTRY DnsCacheEntry\r
1226 )\r
1227{\r
1228 EFI_STATUS Status; \r
1229 EFI_TPL OldTpl;\r
1230\r
1231 Status = EFI_SUCCESS;\r
1232 \r
1233 if (DnsCacheEntry.HostName == NULL || DnsCacheEntry.IpAddress == NULL || DnsCacheEntry.Timeout == 0) {\r
1234 return EFI_INVALID_PARAMETER; \r
1235 }\r
1236 \r
1237 OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
1238\r
1239 //\r
1240 // Update Dns6Cache here.\r
1241 //\r
1242 Status = UpdateDns6Cache (&mDriverData->Dns6CacheList, DeleteFlag, Override, DnsCacheEntry);\r
1243 \r
1244 gBS->RestoreTPL (OldTpl);\r
1245 \r
1246 return Status;\r
1247}\r
1248\r
1249/**\r
1250 This function can be used by network drivers and applications to increase the rate that data packets are moved between \r
1251 the communications device and the transmit and receive queues. In some systems, the periodic timer event in the managed \r
1252 network driver may not poll the underlying communications device fast enough to transmit and/or receive all data packets \r
1253 without missing incoming packets or dropping outgoing packets.\r
1254\r
1255 @param[in] This Pointer to EFI_DNS6_PROTOCOL instance.\r
1256\r
1257 @retval EFI_SUCCESS Incoming or outgoing data was processed.\r
1258 @retval EFI_INVALID_PARAMETER This is NULL. \r
1259 @retval EFI_NOT_STARTED This EFI DNS Protocol instance has not been started. \r
1260 @retval EFI_DEVICE_ERROR An unexpected system or network error occurred. \r
1261 @retval EFI_TIMEOUT Data was dropped out of the transmit and/or receive queue. \r
1262 Consider increasing the polling rate.\r
1263 \r
1264**/\r
1265EFI_STATUS\r
1266EFIAPI\r
1267Dns6Poll (\r
1268 IN EFI_DNS6_PROTOCOL *This\r
1269 )\r
1270{\r
1271 DNS_INSTANCE *Instance;\r
1272 EFI_UDP6_PROTOCOL *Udp;\r
1273\r
1274 if (This == NULL) {\r
1275 return EFI_INVALID_PARAMETER;\r
1276 }\r
1277\r
1278 Instance = DNS_INSTANCE_FROM_THIS_PROTOCOL6 (This);\r
1279\r
1280 if (Instance->State == DNS_STATE_UNCONFIGED) {\r
1281 return EFI_NOT_STARTED;\r
1282 } else if (Instance->State == DNS_STATE_DESTROY) {\r
1283 return EFI_DEVICE_ERROR;\r
1284 }\r
1285\r
1286 Udp = Instance->UdpIo->Protocol.Udp6;\r
1287 \r
1288 return Udp->Poll (Udp);\r
1289}\r
1290\r
1291/**\r
1292 This function is used to abort a pending resolution request. \r
1293 After calling this function, Token.Status will be set to EFI_ABORTED and then Token.\r
1294\r
1295 @param[in] This Pointer to EFI_DNS6_PROTOCOL instance.\r
1296 @param[in] Token Pointer to a token that has been issued by EFI_DNS6_PROTOCOL.HostNameToIp(), \r
1297 EFI_DNS6_PROTOCOL.IpToHostName() or EFI_DNS6_PROTOCOL.GeneralLookup(). \r
1298 If NULL, all pending tokens are aborted.\r
1299\r
1300 @retval EFI_SUCCESS Incoming or outgoing data was processed.\r
1301 @retval EFI_INVALID_PARAMETER This is NULL. \r
1302 @retval EFI_NOT_STARTED This EFI DNS Protocol instance has not been started. \r
1303 @retval EFI_NOT_FOUND When Token is not NULL, and the asynchronous DNS operation was not found in the transmit queue. \r
1304 It was either completed or was not issued by HostNameToIp(), IpToHostName() or GeneralLookup().\r
1305 \r
1306**/\r
1307EFI_STATUS\r
1308EFIAPI\r
1309Dns6Cancel (\r
1310 IN EFI_DNS6_PROTOCOL *This,\r
1311 IN EFI_DNS6_COMPLETION_TOKEN *Token\r
1312 )\r
1313{\r
1314 EFI_STATUS Status;\r
1315 DNS_INSTANCE *Instance;\r
1316 EFI_TPL OldTpl;\r
1317\r
1318 if (This == NULL) {\r
1319 return EFI_INVALID_PARAMETER;\r
1320 }\r
1321\r
1322 Instance = DNS_INSTANCE_FROM_THIS_PROTOCOL6 (This);\r
1323\r
1324 if (Instance->State == DNS_STATE_UNCONFIGED) {\r
1325 return EFI_NOT_STARTED;\r
1326 }\r
1327\r
1328 OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
1329\r
1330 //\r
1331 // Cancle the tokens specified by Token for this instance.\r
1332 //\r
1333 Status = Dns6InstanceCancelToken (Instance, Token);\r
1334\r
1335 //\r
1336 // Dispatch the DPC queued by the NotifyFunction of the canceled token's events.\r
1337 //\r
1338 DispatchDpc ();\r
1339\r
1340 gBS->RestoreTPL (OldTpl);\r
1341\r
1342 return Status;\r
1343}\r
1344\r