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