2 Functions implementation related with DHCPv4/v6 for DNS driver.
4 Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
18 The callback function for the timer event used to get map.
20 @param[in] Event The event this function is registered to.
21 @param[in] Context The context registered to the event.
30 *((BOOLEAN
*) Context
) = TRUE
;
35 Create an IP child, use it to start the auto configuration, then destroy it.
37 @param[in] Controller The controller which has the service installed.
38 @param[in] Image The image handle used to open service.
40 @retval EFI_SUCCESS The configuration is done.
41 @retval Others Other errors as indicated.
46 IN EFI_HANDLE Controller
,
50 EFI_IP4_PROTOCOL
*Ip4
;
52 EFI_EVENT TimerToGetMap
;
53 EFI_IP4_CONFIG_DATA Ip4ConfigData
;
54 EFI_IP4_MODE_DATA Ip4Mode
;
60 // Get the Ip4ServiceBinding Protocol
68 Status
= NetLibCreateServiceChild (
71 &gEfiIp4ServiceBindingProtocolGuid
,
75 if (EFI_ERROR (Status
)) {
79 Status
= gBS
->OpenProtocol (
85 EFI_OPEN_PROTOCOL_GET_PROTOCOL
88 if (EFI_ERROR (Status
)) {
92 Ip4ConfigData
.DefaultProtocol
= EFI_IP_PROTO_ICMP
;
93 Ip4ConfigData
.AcceptAnyProtocol
= FALSE
;
94 Ip4ConfigData
.AcceptIcmpErrors
= FALSE
;
95 Ip4ConfigData
.AcceptBroadcast
= FALSE
;
96 Ip4ConfigData
.AcceptPromiscuous
= FALSE
;
97 Ip4ConfigData
.UseDefaultAddress
= TRUE
;
98 ZeroMem (&Ip4ConfigData
.StationAddress
, sizeof (EFI_IPv4_ADDRESS
));
99 ZeroMem (&Ip4ConfigData
.SubnetMask
, sizeof (EFI_IPv4_ADDRESS
));
100 Ip4ConfigData
.TypeOfService
= 0;
101 Ip4ConfigData
.TimeToLive
= 1;
102 Ip4ConfigData
.DoNotFragment
= FALSE
;
103 Ip4ConfigData
.RawData
= FALSE
;
104 Ip4ConfigData
.ReceiveTimeout
= 0;
105 Ip4ConfigData
.TransmitTimeout
= 0;
107 Status
= Ip4
->Configure (Ip4
, &Ip4ConfigData
);
109 if (Status
== EFI_NO_MAPPING
) {
110 Status
= gBS
->CreateEvent (
111 EVT_NOTIFY_SIGNAL
| EVT_TIMER
,
118 if (EFI_ERROR (Status
)) {
122 Status
= gBS
->SetTimer (
125 MultU64x32 (10000000, 5)
128 if (EFI_ERROR (Status
)) {
135 if (!EFI_ERROR (Ip4
->GetModeData (Ip4
, &Ip4Mode
, NULL
, NULL
)) &&
136 Ip4Mode
.IsConfigured
) {
142 Status
= EFI_DEVICE_ERROR
;
148 if (TimerToGetMap
!= NULL
) {
149 gBS
->SetTimer (TimerToGetMap
, TimerCancel
, 0);
150 gBS
->CloseEvent (TimerToGetMap
);
153 NetLibDestroyServiceChild (
156 &gEfiIp4ServiceBindingProtocolGuid
,
164 This function initialize the DHCP4 message instance.
166 This function will pad each item of dhcp4 message packet.
168 @param Seed Pointer to the message instance of the DHCP4 packet.
169 @param InterfaceInfo Pointer to the EFI_IP4_CONFIG2_INTERFACE_INFO instance.
174 OUT EFI_DHCP4_PACKET
*Seed
,
175 IN EFI_IP4_CONFIG2_INTERFACE_INFO
*InterfaceInfo
178 EFI_DHCP4_HEADER
*Header
;
181 // Get IfType and HwAddressSize from SNP mode data.
183 Seed
->Size
= sizeof (EFI_DHCP4_PACKET
);
184 Seed
->Length
= sizeof (Seed
->Dhcp4
);
185 Header
= &Seed
->Dhcp4
.Header
;
186 ZeroMem (Header
, sizeof (EFI_DHCP4_HEADER
));
187 Header
->OpCode
= DHCP4_OPCODE_REQUEST
;
188 Header
->HwType
= InterfaceInfo
->IfType
;
189 Header
->HwAddrLen
= (UINT8
) InterfaceInfo
->HwAddressSize
;
190 CopyMem (Header
->ClientHwAddr
, &(InterfaceInfo
->HwAddress
), Header
->HwAddrLen
);
192 Seed
->Dhcp4
.Magik
= DHCP4_MAGIC
;
193 Seed
->Dhcp4
.Option
[0] = DHCP4_TAG_EOP
;
197 The common notify function.
199 @param[in] Event The event signaled.
200 @param[in] Context The context.
210 if ((Event
== NULL
) || (Context
== NULL
)) {
214 *((BOOLEAN
*) Context
) = TRUE
;
218 Parse the ACK to get required information
220 @param Dhcp4 The DHCP4 protocol.
221 @param Packet Packet waiting for parse.
222 @param DnsServerInfor The required Dns4 server information.
224 @retval EFI_SUCCESS The DNS information is got from the DHCP ACK.
225 @retval EFI_NO_MAPPING DHCP failed to acquire address and other information.
226 @retval EFI_DEVICE_ERROR Other errors as indicated.
227 @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
232 IN EFI_DHCP4_PROTOCOL
*Dhcp4
,
233 IN EFI_DHCP4_PACKET
*Packet
,
234 IN DNS4_SERVER_INFOR
*DnsServerInfor
239 EFI_DHCP4_PACKET_OPTION
**OptionList
;
241 EFI_IPv4_ADDRESS
*ServerList
;
251 Status
= Dhcp4
->Parse (Dhcp4
, Packet
, &OptionCount
, OptionList
);
252 if (Status
!= EFI_BUFFER_TOO_SMALL
) {
253 return EFI_DEVICE_ERROR
;
256 OptionList
= AllocatePool (OptionCount
* sizeof (EFI_DHCP4_PACKET_OPTION
*));
257 if (OptionList
== NULL
) {
258 return EFI_OUT_OF_RESOURCES
;
261 Status
= Dhcp4
->Parse (Dhcp4
, Packet
, &OptionCount
, OptionList
);
262 if (EFI_ERROR (Status
)) {
263 gBS
->FreePool (OptionList
);
264 return EFI_DEVICE_ERROR
;
267 Status
= EFI_NOT_FOUND
;
269 for (Index
= 0; Index
< OptionCount
; Index
++) {
271 // Get DNS server addresses
273 if (OptionList
[Index
]->OpCode
== DHCP4_TAG_DNS_SERVER
) {
275 if (((OptionList
[Index
]->Length
& 0x3) != 0) || (OptionList
[Index
]->Length
== 0)) {
276 Status
= EFI_DEVICE_ERROR
;
280 ServerCount
= OptionList
[Index
]->Length
/4;
281 ServerList
= AllocatePool (ServerCount
* sizeof (EFI_IPv4_ADDRESS
));
282 if (ServerList
== NULL
) {
283 return EFI_OUT_OF_RESOURCES
;
286 for(Count
=0; Count
< ServerCount
; Count
++){
287 CopyMem (ServerList
+ Count
, &OptionList
[Index
]->Data
[4 * Count
], sizeof (EFI_IPv4_ADDRESS
));
290 *(DnsServerInfor
->ServerCount
) = ServerCount
;
291 DnsServerInfor
->ServerList
= ServerList
;
293 Status
= EFI_SUCCESS
;
297 gBS
->FreePool (OptionList
);
303 EFI_DHCP6_INFO_CALLBACK is provided by the consumer of the EFI DHCPv6 Protocol
304 instance to intercept events that occurs in the DHCPv6 Information Request
307 @param This Pointer to the EFI_DHCP6_PROTOCOL instance that
308 is used to configure this callback function.
309 @param Context Pointer to the context that is initialized in
310 the EFI_DHCP6_PROTOCOL.InfoRequest().
311 @param Packet Pointer to Reply packet that has been received.
312 The EFI DHCPv6 Protocol instance is responsible
313 for freeing the buffer.
315 @retval EFI_SUCCESS The DNS information is got from the DHCP ACK.
316 @retval EFI_DEVICE_ERROR Other errors as indicated.
317 @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
322 IN EFI_DHCP6_PROTOCOL
*This
,
324 IN EFI_DHCP6_PACKET
*Packet
329 EFI_DHCP6_PACKET_OPTION
**OptionList
;
330 DNS6_SERVER_INFOR
*DnsServerInfor
;
332 EFI_IPv6_ADDRESS
*ServerList
;
340 Status
= This
->Parse (This
, Packet
, &OptionCount
, NULL
);
341 if (Status
!= EFI_BUFFER_TOO_SMALL
) {
342 return EFI_DEVICE_ERROR
;
345 OptionList
= AllocateZeroPool (OptionCount
* sizeof (EFI_DHCP6_PACKET_OPTION
*));
346 if (OptionList
== NULL
) {
347 return EFI_OUT_OF_RESOURCES
;
350 Status
= This
->Parse (This
, Packet
, &OptionCount
, OptionList
);
351 if (EFI_ERROR (Status
)) {
352 gBS
->FreePool (OptionList
);
353 return EFI_DEVICE_ERROR
;
356 DnsServerInfor
= (DNS6_SERVER_INFOR
*) Context
;
358 for (Index
= 0; Index
< OptionCount
; Index
++) {
359 OptionList
[Index
]->OpCode
= NTOHS (OptionList
[Index
]->OpCode
);
360 OptionList
[Index
]->OpLen
= NTOHS (OptionList
[Index
]->OpLen
);
363 // Get DNS server addresses from this reply packet.
365 if (OptionList
[Index
]->OpCode
== DHCP6_TAG_DNS_SERVER
) {
367 if (((OptionList
[Index
]->OpLen
& 0xf) != 0) || (OptionList
[Index
]->OpLen
== 0)) {
368 Status
= EFI_DEVICE_ERROR
;
369 gBS
->FreePool (OptionList
);
373 ServerCount
= OptionList
[Index
]->OpLen
/16;
374 ServerList
= AllocatePool (ServerCount
* sizeof (EFI_IPv6_ADDRESS
));
375 if (ServerList
== NULL
) {
376 gBS
->FreePool (OptionList
);
377 return EFI_OUT_OF_RESOURCES
;
380 for(Count
=0; Count
< ServerCount
; Count
++){
381 CopyMem (ServerList
+ Count
, &OptionList
[Index
]->Data
[16 * Count
], sizeof (EFI_IPv6_ADDRESS
));
384 *(DnsServerInfor
->ServerCount
) = ServerCount
;
385 DnsServerInfor
->ServerList
= ServerList
;
389 gBS
->FreePool (OptionList
);
396 Parse the DHCP ACK to get Dns4 server information.
398 @param Instance The DNS instance.
399 @param DnsServerCount Retrieved Dns4 server Ip count.
400 @param DnsServerList Retrieved Dns4 server Ip list.
402 @retval EFI_SUCCESS The Dns4 information is got from the DHCP ACK.
403 @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
404 @retval EFI_NO_MEDIA There was a media error.
405 @retval Others Other errors as indicated.
409 GetDns4ServerFromDhcp4 (
410 IN DNS_INSTANCE
*Instance
,
411 OUT UINT32
*DnsServerCount
,
412 OUT EFI_IPv4_ADDRESS
**DnsServerList
417 EFI_HANDLE Controller
;
418 BOOLEAN MediaPresent
;
419 EFI_HANDLE MnpChildHandle
;
420 EFI_MANAGED_NETWORK_PROTOCOL
*Mnp
;
421 EFI_MANAGED_NETWORK_CONFIG_DATA MnpConfigData
;
422 EFI_HANDLE Dhcp4Handle
;
423 EFI_DHCP4_PROTOCOL
*Dhcp4
;
424 EFI_IP4_CONFIG2_PROTOCOL
*Ip4Config2
;
427 EFI_IP4_CONFIG2_INTERFACE_INFO
*InterfaceInfo
;
428 EFI_DHCP4_PACKET SeedPacket
;
429 EFI_DHCP4_PACKET_OPTION
*ParaList
[2];
430 DNS4_SERVER_INFOR DnsServerInfor
;
432 EFI_DHCP4_TRANSMIT_RECEIVE_TOKEN Token
;
436 Image
= Instance
->Service
->ImageHandle
;
437 Controller
= Instance
->Service
->ControllerHandle
;
439 MnpChildHandle
= NULL
;
448 InterfaceInfo
= NULL
;
450 ZeroMem ((UINT8
*) ParaList
, sizeof (ParaList
));
452 ZeroMem (&MnpConfigData
, sizeof (EFI_MANAGED_NETWORK_CONFIG_DATA
));
454 ZeroMem (&DnsServerInfor
, sizeof (DNS4_SERVER_INFOR
));
456 ZeroMem (&Token
, sizeof (EFI_DHCP4_TRANSMIT_RECEIVE_TOKEN
));
458 DnsServerInfor
.ServerCount
= DnsServerCount
;
466 NetLibDetectMedia (Controller
, &MediaPresent
);
472 // Start the auto configuration if UseDefaultSetting.
474 if (Instance
->Dns4CfgData
.UseDefaultSetting
) {
475 Status
= DnsStartIp4 (Controller
, Image
);
476 if (EFI_ERROR(Status
)) {
482 // Create a Mnp child instance, get the protocol and config for it.
484 Status
= NetLibCreateServiceChild (
487 &gEfiManagedNetworkServiceBindingProtocolGuid
,
490 if (EFI_ERROR (Status
)) {
494 Status
= gBS
->OpenProtocol (
496 &gEfiManagedNetworkProtocolGuid
,
500 EFI_OPEN_PROTOCOL_BY_DRIVER
502 if (EFI_ERROR (Status
)) {
506 MnpConfigData
.ReceivedQueueTimeoutValue
= 0;
507 MnpConfigData
.TransmitQueueTimeoutValue
= 0;
508 MnpConfigData
.ProtocolTypeFilter
= IP4_ETHER_PROTO
;
509 MnpConfigData
.EnableUnicastReceive
= TRUE
;
510 MnpConfigData
.EnableMulticastReceive
= TRUE
;
511 MnpConfigData
.EnableBroadcastReceive
= TRUE
;
512 MnpConfigData
.EnablePromiscuousReceive
= FALSE
;
513 MnpConfigData
.FlushQueuesOnReset
= TRUE
;
514 MnpConfigData
.EnableReceiveTimestamps
= FALSE
;
515 MnpConfigData
.DisableBackgroundPolling
= FALSE
;
517 Status
= Mnp
->Configure(Mnp
, &MnpConfigData
);
518 if (EFI_ERROR (Status
)) {
523 // Create a DHCP4 child instance and get the protocol.
525 Status
= NetLibCreateServiceChild (
528 &gEfiDhcp4ServiceBindingProtocolGuid
,
531 if (EFI_ERROR (Status
)) {
535 Status
= gBS
->OpenProtocol (
537 &gEfiDhcp4ProtocolGuid
,
541 EFI_OPEN_PROTOCOL_BY_DRIVER
543 if (EFI_ERROR (Status
)) {
548 // Get Ip4Config2 instance info.
550 Status
= gBS
->HandleProtocol (Controller
, &gEfiIp4Config2ProtocolGuid
, (VOID
**) &Ip4Config2
);
551 if (EFI_ERROR (Status
)) {
555 Status
= Ip4Config2
->GetData (Ip4Config2
, Ip4Config2DataTypeInterfaceInfo
, &DataSize
, Data
);
556 if (EFI_ERROR (Status
) && Status
!= EFI_BUFFER_TOO_SMALL
) {
560 Data
= AllocateZeroPool (DataSize
);
562 Status
= EFI_OUT_OF_RESOURCES
;
566 Status
= Ip4Config2
->GetData (Ip4Config2
, Ip4Config2DataTypeInterfaceInfo
, &DataSize
, Data
);
567 if (EFI_ERROR (Status
)) {
571 InterfaceInfo
= (EFI_IP4_CONFIG2_INTERFACE_INFO
*)Data
;
574 // Build required Token.
576 Status
= gBS
->CreateEvent (
581 &Token
.CompletionEvent
583 if (EFI_ERROR (Status
)) {
587 SetMem (&Token
.RemoteAddress
, sizeof (EFI_IPv4_ADDRESS
), 0xff);
589 Token
.RemotePort
= 67;
591 Token
.ListenPointCount
= 1;
593 Token
.ListenPoints
= AllocateZeroPool (Token
.ListenPointCount
* sizeof (EFI_DHCP4_LISTEN_POINT
));
594 if (Token
.ListenPoints
== NULL
) {
595 Status
= EFI_OUT_OF_RESOURCES
;
599 if (Instance
->Dns4CfgData
.UseDefaultSetting
) {
600 CopyMem (&(Token
.ListenPoints
[0].ListenAddress
), &(InterfaceInfo
->StationAddress
), sizeof (EFI_IPv4_ADDRESS
));
601 CopyMem (&(Token
.ListenPoints
[0].SubnetMask
), &(InterfaceInfo
->SubnetMask
), sizeof (EFI_IPv4_ADDRESS
));
603 CopyMem (&(Token
.ListenPoints
[0].ListenAddress
), &(Instance
->Dns4CfgData
.StationIp
), sizeof (EFI_IPv4_ADDRESS
));
604 CopyMem (&(Token
.ListenPoints
[0].SubnetMask
), &(Instance
->Dns4CfgData
.SubnetMask
), sizeof (EFI_IPv4_ADDRESS
));
607 Token
.ListenPoints
[0].ListenPort
= 68;
609 Token
.TimeoutValue
= DNS_TIME_TO_GETMAP
;
611 DnsInitSeedPacket (&SeedPacket
, InterfaceInfo
);
613 ParaList
[0] = AllocateZeroPool (sizeof (EFI_DHCP4_PACKET_OPTION
));
614 if (ParaList
[0] == NULL
) {
615 Status
= EFI_OUT_OF_RESOURCES
;
619 ParaList
[0]->OpCode
= DHCP4_TAG_TYPE
;
620 ParaList
[0]->Length
= 1;
621 ParaList
[0]->Data
[0] = DHCP4_MSG_INFORM
;
623 ParaList
[1] = AllocateZeroPool (sizeof (EFI_DHCP4_PACKET_OPTION
));
624 if (ParaList
[1] == NULL
) {
625 Status
= EFI_OUT_OF_RESOURCES
;
629 ParaList
[1]->OpCode
= DHCP4_TAG_PARA_LIST
;
630 ParaList
[1]->Length
= 1;
631 ParaList
[1]->Data
[0] = DHCP4_TAG_DNS_SERVER
;
633 Status
= Dhcp4
->Build (Dhcp4
, &SeedPacket
, 0, NULL
, 2, ParaList
, &Token
.Packet
);
635 Token
.Packet
->Dhcp4
.Header
.Xid
= HTONL(NET_RANDOM (NetRandomInitSeed ()));
637 Token
.Packet
->Dhcp4
.Header
.Reserved
= HTONS ((UINT16
)0x8000);
639 if (Instance
->Dns4CfgData
.UseDefaultSetting
) {
640 CopyMem (&(Token
.Packet
->Dhcp4
.Header
.ClientAddr
), &(InterfaceInfo
->StationAddress
), sizeof (EFI_IPv4_ADDRESS
));
642 CopyMem (&(Token
.Packet
->Dhcp4
.Header
.ClientAddr
), &(Instance
->Dns4CfgData
.StationIp
), sizeof (EFI_IPv4_ADDRESS
));
645 CopyMem (Token
.Packet
->Dhcp4
.Header
.ClientHwAddr
, &(InterfaceInfo
->HwAddress
), InterfaceInfo
->HwAddressSize
);
647 Token
.Packet
->Dhcp4
.Header
.HwAddrLen
= (UINT8
)(InterfaceInfo
->HwAddressSize
);
650 // TransmitReceive Token
652 Status
= Dhcp4
->TransmitReceive (Dhcp4
, &Token
);
653 if (EFI_ERROR (Status
)) {
661 Status
= Mnp
->Poll (Mnp
);
665 // Parse the ACK to get required information if received done.
667 if (IsDone
&& !EFI_ERROR (Token
.Status
)) {
668 for (Index
= 0; Index
< Token
.ResponseCount
; Index
++) {
669 Status
= ParseDhcp4Ack (Dhcp4
, &Token
.ResponseList
[Index
], &DnsServerInfor
);
670 if (!EFI_ERROR (Status
)) {
675 *DnsServerList
= DnsServerInfor
.ServerList
;
677 Status
= Token
.Status
;
686 for (Index
= 0; Index
< 2; Index
++) {
687 if (ParaList
[Index
] != NULL
) {
688 FreePool (ParaList
[Index
]);
692 if (Token
.ListenPoints
) {
693 FreePool (Token
.ListenPoints
);
697 FreePool (Token
.Packet
);
700 if (Token
.ResponseList
!= NULL
) {
701 FreePool (Token
.ResponseList
);
704 if (Token
.CompletionEvent
!= NULL
) {
705 gBS
->CloseEvent (Token
.CompletionEvent
);
710 Dhcp4
->Configure (Dhcp4
, NULL
);
714 &gEfiDhcp4ProtocolGuid
,
720 if (Dhcp4Handle
!= NULL
) {
721 NetLibDestroyServiceChild (
724 &gEfiDhcp4ServiceBindingProtocolGuid
,
730 Mnp
->Configure (Mnp
, NULL
);
734 &gEfiManagedNetworkProtocolGuid
,
740 NetLibDestroyServiceChild (
743 &gEfiManagedNetworkServiceBindingProtocolGuid
,
751 Parse the DHCP ACK to get Dns6 server information.
753 @param Image The handle of the driver image.
754 @param Controller The handle of the controller.
755 @param DnsServerCount Retrieved Dns6 server Ip count.
756 @param DnsServerList Retrieved Dns6 server Ip list.
758 @retval EFI_SUCCESS The Dns6 information is got from the DHCP ACK.
759 @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
760 @retval EFI_NO_MEDIA There was a media error.
761 @retval Others Other errors as indicated.
765 GetDns6ServerFromDhcp6 (
767 IN EFI_HANDLE Controller
,
768 OUT UINT32
*DnsServerCount
,
769 OUT EFI_IPv6_ADDRESS
**DnsServerList
772 EFI_HANDLE Dhcp6Handle
;
773 EFI_DHCP6_PROTOCOL
*Dhcp6
;
775 EFI_STATUS TimerStatus
;
776 EFI_DHCP6_PACKET_OPTION
*Oro
;
777 EFI_DHCP6_RETRANSMISSION InfoReqReXmit
;
779 BOOLEAN MediaPresent
;
780 DNS6_SERVER_INFOR DnsServerInfor
;
787 ZeroMem (&DnsServerInfor
, sizeof (DNS6_SERVER_INFOR
));
789 DnsServerInfor
.ServerCount
= DnsServerCount
;
792 // Check media status before doing DHCP.
795 NetLibDetectMedia (Controller
, &MediaPresent
);
801 // Create a DHCP6 child instance and get the protocol.
803 Status
= NetLibCreateServiceChild (
806 &gEfiDhcp6ServiceBindingProtocolGuid
,
809 if (EFI_ERROR (Status
)) {
813 Status
= gBS
->OpenProtocol (
815 &gEfiDhcp6ProtocolGuid
,
819 EFI_OPEN_PROTOCOL_BY_DRIVER
821 if (EFI_ERROR (Status
)) {
825 Oro
= AllocateZeroPool (sizeof (EFI_DHCP6_PACKET_OPTION
) + 1);
827 Status
= EFI_OUT_OF_RESOURCES
;
832 // Ask the server to reply with DNS options.
833 // All members in EFI_DHCP6_PACKET_OPTION are in network order.
835 Oro
->OpCode
= HTONS (DHCP6_TAG_DNS_REQUEST
);
836 Oro
->OpLen
= HTONS (2);
837 Oro
->Data
[1] = DHCP6_TAG_DNS_SERVER
;
839 InfoReqReXmit
.Irt
= 4;
840 InfoReqReXmit
.Mrc
= 1;
841 InfoReqReXmit
.Mrt
= 10;
842 InfoReqReXmit
.Mrd
= 30;
844 Status
= Dhcp6
->InfoRequest (
855 if (Status
== EFI_NO_MAPPING
) {
856 Status
= gBS
->CreateEvent (EVT_TIMER
, TPL_CALLBACK
, NULL
, NULL
, &Timer
);
857 if (EFI_ERROR (Status
)) {
861 Status
= gBS
->SetTimer (
864 DNS_TIME_TO_GETMAP
* TICKS_PER_SECOND
867 if (EFI_ERROR (Status
)) {
872 TimerStatus
= gBS
->CheckEvent (Timer
);
873 if (!EFI_ERROR (TimerStatus
)) {
874 Status
= Dhcp6
->InfoRequest (
886 } while (TimerStatus
== EFI_NOT_READY
);
889 *DnsServerList
= DnsServerInfor
.ServerList
;
898 gBS
->CloseEvent (Timer
);
904 &gEfiDhcp6ProtocolGuid
,
910 NetLibDestroyServiceChild (
913 &gEfiDhcp6ServiceBindingProtocolGuid
,