4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The implementation of EFI IPv6 Configuration Protocol.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This program and the accompanying materials
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync are licensed and made available under the terms and conditions of the BSD License
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync which accompanies this distribution. The full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync http://opensource.org/licenses/bsd-license.php.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "Ip6Impl.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncLIST_ENTRY mIp6ConfigInstanceList = {&mIp6ConfigInstanceList, &mIp6ConfigInstanceList};
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The event process routine when the DHCPv6 service binding protocol is installed
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync in the system.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Event Not used.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Context Pointer to the IP6 config instance data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIp6ConfigOnDhcp6SbInstalled (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_EVENT Event,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Context
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Update the current policy to NewPolicy. During the transition
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync period, the default router list, on-link prefix list, autonomous prefix list
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync and address list in all interfaces will be released.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] IpSb The IP6 service binding instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] NewPolicy The new policy to be updated to.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIp6ConfigOnPolicyChanged (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN IP6_SERVICE *IpSb,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_IP6_CONFIG_POLICY NewPolicy
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *Entry;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *Entry2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *Next;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_INTERFACE *IpIf;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_DAD_ENTRY *DadEntry;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Currently there are only two policies: Manual and Automatic. Regardless of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // what transition is going on, i.e., Manual -> Automatic and Automatic ->
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Manual, we have to free default router list, on-link prefix list, autonomous
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // prefix list, address list in all the interfaces and destroy any IPv6 child
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // instance whose local IP is neither 0 nor the link-local address.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6CleanDefaultRouterList (IpSb);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6CleanPrefixListTable (IpSb, &IpSb->OnlinkPrefix);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6CleanPrefixListTable (IpSb, &IpSb->AutonomousPrefix);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // It's tricky... If the LinkLocal address is O.K., add back the link-local
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // prefix to the on-link prefix table.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IpSb->LinkLocalOk) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6CreatePrefixListEntry (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IpSb,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TRUE,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (UINT32) IP6_INFINIT_LIFETIME,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (UINT32) IP6_INFINIT_LIFETIME,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_LINK_LOCAL_PREFIX_LENGTH,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &IpSb->LinkLocalAddr
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // All IPv6 children that use global unicast address as it's source address
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // should be destryoed now. The survivers are those use the link-local address
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // or the unspecified address as the source address.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // TODO: Conduct a check here.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6RemoveAddr (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IpSb,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &IpSb->DefaultInterface->AddressList,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &IpSb->DefaultInterface->AddressCount,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NET_LIST_FOR_EACH (Entry, &IpSb->Interfaces) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // remove all pending DAD entries for the global addresses.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IpIf = NET_LIST_USER_STRUCT_S (Entry, IP6_INTERFACE, Link, IP6_INTERFACE_SIGNATURE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NET_LIST_FOR_EACH_SAFE (Entry2, Next, &IpIf->DupAddrDetectList) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DadEntry = NET_LIST_USER_STRUCT_S (Entry2, IP6_DAD_ENTRY, Link, IP6_DAD_ENTRY_SIGNATURE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!NetIp6IsLinkLocalAddr (&DadEntry->AddressInfo->Address)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Fail this DAD entry if the address is not link-local.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6OnDADFinished (FALSE, IpIf, DadEntry);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NewPolicy == Ip6ConfigPolicyAutomatic) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Set paramters to trigger router solicitation sending in timer handler.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IpSb->RouterAdvertiseReceived = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IpSb->SolicitTimer = IP6_MAX_RTR_SOLICITATIONS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // delay 1 second
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IpSb->Ticks = (UINT32) IP6_GET_TICKS (IP6_ONE_SECOND_IN_MS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The work function to trigger the DHCPv6 process to perform a stateful autoconfiguration.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Instance Pointer to the IP6 config instance data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] OtherInfoOnly If FALSE, get stateful address and other information
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync via DHCPv6. Otherwise, only get the other information.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The operation finished successfully.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_UNSUPPORTED The DHCP6 driver is not available.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIp6ConfigStartStatefulAutoConfig (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN IP6_CONFIG_INSTANCE *Instance,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN BOOLEAN OtherInfoOnly
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_SERVICE *IpSb;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DHCP6_CONFIG_DATA Dhcp6CfgData;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DHCP6_PROTOCOL *Dhcp6;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DHCP6_PACKET_OPTION *OptList[1];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 OptBuf[4];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DHCP6_PACKET_OPTION *Oro;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DHCP6_RETRANSMISSION InfoReqReXmit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // A host must not invoke stateful address configuration if it is already
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // participating in the statuful protocol as a result of an earlier advertisement.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Instance->Dhcp6Handle != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IpSb = IP6_SERVICE_FROM_IP6_CONFIG_INSTANCE (Instance);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance->OtherInfoOnly = OtherInfoOnly;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = NetLibCreateServiceChild (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IpSb->Controller,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IpSb->Image,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiDhcp6ServiceBindingProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Instance->Dhcp6Handle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Status == EFI_UNSUPPORTED) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // No DHCPv6 Service Binding protocol, register a notify.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Instance->Dhcp6SbNotifyEvent == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance->Dhcp6SbNotifyEvent = EfiCreateProtocolNotifyEvent (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiDhcp6ServiceBindingProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TPL_CALLBACK,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6ConfigOnDhcp6SbInstalled,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID *) Instance,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Instance->Registration
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Instance->Dhcp6SbNotifyEvent != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->CloseEvent (Instance->Dhcp6SbNotifyEvent);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->OpenProtocol (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance->Dhcp6Handle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiDhcp6ProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID **) &Instance->Dhcp6,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IpSb->Image,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IpSb->Controller,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_OPEN_PROTOCOL_BY_DRIVER
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_EFI_ERROR (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Dhcp6 = Instance->Dhcp6;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Dhcp6->Configure (Dhcp6, NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Set the exta options to send. Here we only want the option request option
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // with DNS SERVERS.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Oro = (EFI_DHCP6_PACKET_OPTION *) OptBuf;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Oro->OpCode = HTONS (IP6_CONFIG_DHCP6_OPTION_ORO);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Oro->OpLen = HTONS (2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *((UINT16 *) &Oro->Data[0]) = HTONS (IP6_CONFIG_DHCP6_OPTION_DNS_SERVERS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OptList[0] = Oro;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!OtherInfoOnly) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get stateful address and other information via DHCPv6.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Dhcp6CfgData.Dhcp6Callback = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Dhcp6CfgData.CallbackContext = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Dhcp6CfgData.OptionCount = 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Dhcp6CfgData.OptionList = &OptList[0];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Dhcp6CfgData.IaDescriptor.Type = EFI_DHCP6_IA_TYPE_NA;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Dhcp6CfgData.IaDescriptor.IaId = Instance->IaId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Dhcp6CfgData.IaInfoEvent = Instance->Dhcp6Event;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Dhcp6CfgData.ReconfigureAccept = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Dhcp6CfgData.RapidCommit = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Dhcp6CfgData.SolicitRetransmission = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Dhcp6->Configure (Dhcp6, &Dhcp6CfgData);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IpSb->LinkLocalOk) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Dhcp6->Start (Dhcp6);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IpSb->Dhcp6NeedStart = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Only get other information via DHCPv6, this doesn't require a config
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // action.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InfoReqReXmit.Irt = 4;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InfoReqReXmit.Mrc = 64;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InfoReqReXmit.Mrt = 60;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InfoReqReXmit.Mrd = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IpSb->LinkLocalOk) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Dhcp6->InfoRequest (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Dhcp6,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TRUE,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Oro,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &InfoReqReXmit,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance->Dhcp6Event,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6ConfigOnDhcp6Reply,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IpSb->Dhcp6NeedInfoRequest = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Signal the registered event. It is the callback routine for NetMapIterate.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Map Points to the list of registered event.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Item The registered event.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Arg Not used.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIp6ConfigSignalEvent (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN NET_MAP *Map,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN NET_MAP_ITEM *Item,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Arg
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->SignalEvent ((EFI_EVENT) Item->Key);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Read the configuration data from variable storage according to the VarName and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gEfiIp6ConfigProtocolGuid. It checks the integrity of variable data. If the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync data is corrupted, it clears the variable data to ZERO. Othewise, it outputs the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync configuration data to IP6_CONFIG_INSTANCE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] VarName The pointer to the variable name
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] Instance The pointer to the IP6 config instance data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NOT_FOUND The variable can not be found or already corrupted.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES Fail to allocate resource to complete the operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The configuration data was retrieved successfully.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIp6ConfigReadConfigData (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CHAR16 *VarName,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT IP6_CONFIG_INSTANCE *Instance
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN VarSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_CONFIG_VARIABLE *Variable;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_CONFIG_DATA_ITEM *DataItem;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_CONFIG_DATA_RECORD DataRecord;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR8 *Data;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Try to read the configuration variable.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarSize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gRT->GetVariable (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarName,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiIp6ConfigProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &VarSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Status == EFI_BUFFER_TOO_SMALL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Allocate buffer and read the config variable.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Variable = AllocatePool (VarSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Variable == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gRT->GetVariable (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarName,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiIp6ConfigProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &VarSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Variable
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status) || (UINT16) (~NetblockChecksum ((UINT8 *) Variable, (UINT32) VarSize)) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // GetVariable still error or the variable is corrupted.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Fall back to the default value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Variable);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Remove the problematic variable and return EFI_NOT_FOUND, a new
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // variable will be set again.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gRT->SetVariable (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarName,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiIp6ConfigProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_CONFIG_VARIABLE_ATTRIBUTE,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get the IAID we use.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance->IaId = Variable->IaId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < Variable->DataRecordCount; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (&DataRecord, &Variable->DataRecord[Index], sizeof (DataRecord));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataItem = &Instance->DataItem[DataRecord.DataType];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DATA_ATTRIB_SET (DataItem->Attribute, DATA_ATTRIB_SIZE_FIXED) &&
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (DataItem->DataSize != DataRecord.DataSize)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Perhaps a corrupted data record...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!DATA_ATTRIB_SET (DataItem->Attribute, DATA_ATTRIB_SIZE_FIXED)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // This data item has variable length data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataItem->Data.Ptr = AllocatePool (DataRecord.DataSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DataItem->Data.Ptr == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // no memory resource
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Data = (CHAR8 *) Variable + DataRecord.Offset;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (DataItem->Data.Ptr, Data, DataRecord.DataSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataItem->DataSize = DataRecord.DataSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataItem->Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Variable);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Write the configuration data from IP6_CONFIG_INSTANCE to variable storage.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] VarName The pointer to the variable name.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Instance The pointer to the IP6 configuration instance data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES Fail to allocate resource to complete the operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The configuration data is written successfully.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIp6ConfigWriteConfigData (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CHAR16 *VarName,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN IP6_CONFIG_INSTANCE *Instance
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN VarSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_CONFIG_DATA_ITEM *DataItem;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_CONFIG_VARIABLE *Variable;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_CONFIG_DATA_RECORD *DataRecord;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR8 *Heap;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarSize = sizeof (IP6_CONFIG_VARIABLE) - sizeof (IP6_CONFIG_DATA_RECORD);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < Ip6ConfigDataTypeMaximum; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataItem = &Instance->DataItem[Index];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!DATA_ATTRIB_SET (DataItem->Attribute, DATA_ATTRIB_VOLATILE) && !EFI_ERROR (DataItem->Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarSize += sizeof (IP6_CONFIG_DATA_RECORD) + DataItem->DataSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Variable = AllocatePool (VarSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Variable == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Variable->IaId = Instance->IaId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Heap = (CHAR8 *) Variable + VarSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Variable->DataRecordCount = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < Ip6ConfigDataTypeMaximum; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataItem = &Instance->DataItem[Index];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!DATA_ATTRIB_SET (DataItem->Attribute, DATA_ATTRIB_VOLATILE) && !EFI_ERROR (DataItem->Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Heap -= DataItem->DataSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (Heap, DataItem->Data.Ptr, DataItem->DataSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataRecord = &Variable->DataRecord[Variable->DataRecordCount];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataRecord->DataType = (EFI_IP6_CONFIG_DATA_TYPE) Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataRecord->DataSize = DataItem->DataSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataRecord->Offset = (UINT16) (Heap - (CHAR8 *) Variable);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Variable->DataRecordCount++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Variable->Checksum = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Variable->Checksum = (UINT16) ~NetblockChecksum ((UINT8 *) Variable, (UINT32) VarSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gRT->SetVariable (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarName,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiIp6ConfigProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_CONFIG_VARIABLE_ATTRIBUTE,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VarSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Variable
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Variable);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The work function for EfiIp6ConfigGetData() to get the interface information
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync of the communication device this IP6Config instance manages.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Instance Pointer to the IP6 config instance data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] DataSize On input, in bytes, the size of Data. On output, in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync bytes, the size of buffer required to store the specified
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync configuration data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Data The data buffer in which the configuration data is returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ignored if DataSize is ZERO.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_BUFFER_TOO_SMALL The size of Data is too small for the specified
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync configuration data, and the required size is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync returned in DataSize.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The specified configuration data was obtained.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIp6ConfigGetIfInfo (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN IP6_CONFIG_INSTANCE *Instance,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT UINTN *DataSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Data OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_SERVICE *IpSb;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_CONFIG_DATA_ITEM *Item;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IP6_CONFIG_INTERFACE_INFO *IfInfo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 AddressCount;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 RouteCount;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IpSb = IP6_SERVICE_FROM_IP6_CONFIG_INSTANCE (Instance);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Length = sizeof (EFI_IP6_CONFIG_INTERFACE_INFO);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Calculate the required length, add the buffer size for AddressInfo and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // RouteTable
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6BuildEfiAddressList (IpSb, &AddressCount, NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6BuildEfiRouteTable (IpSb->RouteTable, &RouteCount, NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Length += AddressCount * sizeof (EFI_IP6_ADDRESS_INFO) + RouteCount * sizeof (EFI_IP6_ROUTE_TABLE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*DataSize < Length) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *DataSize = Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_BUFFER_TOO_SMALL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Copy the fixed size part of the interface info.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Item = &Instance->DataItem[Ip6ConfigDataTypeInterfaceInfo];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfInfo = (EFI_IP6_CONFIG_INTERFACE_INFO *) Data;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (IfInfo, Item->Data.Ptr, sizeof (EFI_IP6_CONFIG_INTERFACE_INFO));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // AddressInfo
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfInfo->AddressInfo = (EFI_IP6_ADDRESS_INFO *) (IfInfo + 1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6BuildEfiAddressList (IpSb, &IfInfo->AddressInfoCount, &IfInfo->AddressInfo);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // RouteTable
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfInfo->RouteTable = (EFI_IP6_ROUTE_TABLE *) (IfInfo->AddressInfo + IfInfo->AddressInfoCount);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6BuildEfiRouteTable (IpSb->RouteTable, &IfInfo->RouteCount, &IfInfo->RouteTable);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IfInfo->AddressInfoCount == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfInfo->AddressInfo = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IfInfo->RouteCount == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfInfo->RouteTable = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The work function for EfiIp6ConfigSetData() to set the alternative inteface ID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for the communication device managed by this IP6Config instance, if the link local
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IPv6 addresses generated from the interface ID based on the default source the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI IPv6 Protocol uses is a duplicate address.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Instance Pointer to the IP6 configuration instance data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] DataSize Size of the buffer pointed to by Data in bytes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Data The data buffer to set.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_BAD_BUFFER_SIZE The DataSize does not match the size of the type,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 8 bytes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The specified configuration data for the EFI IPv6
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync network stack was set.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIp6ConfigSetAltIfId (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN IP6_CONFIG_INSTANCE *Instance,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN DataSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IP6_CONFIG_INTERFACE_ID *OldIfId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IP6_CONFIG_INTERFACE_ID *NewIfId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_CONFIG_DATA_ITEM *DataItem;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DataSize != sizeof (EFI_IP6_CONFIG_INTERFACE_ID)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_BAD_BUFFER_SIZE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataItem = &Instance->DataItem[Ip6ConfigDataTypeAltInterfaceId];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OldIfId = DataItem->Data.AltIfId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewIfId = (EFI_IP6_CONFIG_INTERFACE_ID *) Data;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (OldIfId, NewIfId, DataSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataItem->Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The work function for EfiIp6ConfigSetData() to set the general configuration
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync policy for the EFI IPv6 network stack that is running on the communication device
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync managed by this IP6Config instance. The policy will affect other configuration settings.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Instance Pointer to the IP6 config instance data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] DataSize Size of the buffer pointed to by Data in bytes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Data The data buffer to set.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER The to be set policy is invalid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_BAD_BUFFER_SIZE The DataSize does not match the size of the type.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_ABORTED The new policy equals the current policy.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The specified configuration data for the EFI IPv6
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync network stack was set.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIp6ConfigSetPolicy (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN IP6_CONFIG_INSTANCE *Instance,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN DataSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IP6_CONFIG_POLICY NewPolicy;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_CONFIG_DATA_ITEM *DataItem;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_SERVICE *IpSb;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DataSize != sizeof (EFI_IP6_CONFIG_POLICY)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_BAD_BUFFER_SIZE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewPolicy = *((EFI_IP6_CONFIG_POLICY *) Data);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NewPolicy > Ip6ConfigPolicyAutomatic) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NewPolicy == Instance->Policy) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_ABORTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NewPolicy == Ip6ConfigPolicyAutomatic) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Clean the ManualAddress, Gateway and DnsServers, shrink the variable
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // data size, and fire up all the related events.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataItem = &Instance->DataItem[Ip6ConfigDataTypeManualAddress];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DataItem->Data.Ptr != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (DataItem->Data.Ptr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataItem->Data.Ptr = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataItem->DataSize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataItem->Status = EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NetMapIterate (&DataItem->EventMap, Ip6ConfigSignalEvent, NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataItem = &Instance->DataItem[Ip6ConfigDataTypeGateway];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DataItem->Data.Ptr != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (DataItem->Data.Ptr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataItem->Data.Ptr = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataItem->DataSize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataItem->Status = EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NetMapIterate (&DataItem->EventMap, Ip6ConfigSignalEvent, NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataItem = &Instance->DataItem[Ip6ConfigDataTypeDnsServer];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataItem->Data.Ptr = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataItem->DataSize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataItem->Status = EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NetMapIterate (&DataItem->EventMap, Ip6ConfigSignalEvent, NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // The policy is changed from automatic to manual. Stop the DHCPv6 process
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // and destroy the DHCPv6 child.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Instance->Dhcp6Handle != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6ConfigDestroyDhcp6 (Instance);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IpSb = IP6_SERVICE_FROM_IP6_CONFIG_INSTANCE (Instance);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6ConfigOnPolicyChanged (IpSb, NewPolicy);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance->Policy = NewPolicy;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The work function for EfiIp6ConfigSetData() to set the number of consecutive
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Neighbor Solicitation messages sent while performing Duplicate Address Detection
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync on a tentative address. A value of ZERO indicates that Duplicate Address Detection
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync will not be performed on a tentative address.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Instance The Instance Pointer to the IP6 config instance data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] DataSize Size of the buffer pointed to by Data in bytes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Data The data buffer to set.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_BAD_BUFFER_SIZE The DataSize does not match the size of the type.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_ABORTED The new transmit count equals the current configuration.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The specified configuration data for the EFI IPv6
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync network stack was set.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIp6ConfigSetDadXmits (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN IP6_CONFIG_INSTANCE *Instance,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN DataSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IP6_CONFIG_DUP_ADDR_DETECT_TRANSMITS *OldDadXmits;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DataSize != sizeof (EFI_IP6_CONFIG_DUP_ADDR_DETECT_TRANSMITS)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_BAD_BUFFER_SIZE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OldDadXmits = Instance->DataItem[Ip6ConfigDataTypeDupAddrDetectTransmits].Data.DadXmits;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((*(UINT32 *) Data) == OldDadXmits->DupAddrDetectTransmits) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_ABORTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OldDadXmits->DupAddrDetectTransmits = *((UINT32 *) Data);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The callback function for Ip6SetAddr. The prototype is defined
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync as IP6_DAD_CALLBACK. It is called after Duplicate Address Detection is performed
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for the manual address set by Ip6ConfigSetMaunualAddress.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] IsDadPassed If TRUE, Duplicate Address Detection passed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] TargetAddress The tentative IPv6 address to be checked.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Context Pointer to the IP6 configuration instance data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIp6ManualAddrDadCallback (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN BOOLEAN IsDadPassed,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_IPv6_ADDRESS *TargetAddress,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Context
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_CONFIG_INSTANCE *Instance;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_CONFIG_DATA_ITEM *Item;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IP6_CONFIG_MANUAL_ADDRESS *ManualAddr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IP6_CONFIG_MANUAL_ADDRESS *PassedAddr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN DadPassCount;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN DadFailCount;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_SERVICE *IpSb;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance = (IP6_CONFIG_INSTANCE *) Context;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NET_CHECK_SIGNATURE (Instance, IP6_CONFIG_INSTANCE_SIGNATURE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Item = &Instance->DataItem[Ip6ConfigDataTypeManualAddress];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ManualAddr = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < Item->DataSize / sizeof (EFI_IP6_CONFIG_MANUAL_ADDRESS); Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Find the original tag used to place into the NET_MAP.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ManualAddr = Item->Data.ManualAddress + Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_IP6_EQUAL (TargetAddress, &ManualAddr->Address)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Index != Item->DataSize / sizeof (EFI_IP6_CONFIG_MANUAL_ADDRESS));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IsDadPassed) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NetMapInsertTail (&Instance->DadPassedMap, ManualAddr, NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NetMapInsertTail (&Instance->DadFailedMap, ManualAddr, NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DadPassCount = NetMapGetCount (&Instance->DadPassedMap);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DadFailCount = NetMapGetCount (&Instance->DadFailedMap);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((DadPassCount + DadFailCount) == (Item->DataSize / sizeof (EFI_IP6_CONFIG_MANUAL_ADDRESS))) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // All addresses have finished the configuration process.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DadFailCount != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // There is at least one duplicate address.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Item->Data.Ptr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Item->DataSize = DadPassCount * sizeof (EFI_IP6_CONFIG_MANUAL_ADDRESS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Item->DataSize == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // All failed, bad luck.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Item->Data.Ptr = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Item->Status = EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Part of addresses are detected to be duplicates, so update the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // data with those passed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PassedAddr = (EFI_IP6_CONFIG_MANUAL_ADDRESS *) AllocatePool (Item->DataSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (PassedAddr != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Item->Data.Ptr = PassedAddr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Item->Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (!NetMapIsEmpty (&Instance->DadPassedMap)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ManualAddr = (EFI_IP6_CONFIG_MANUAL_ADDRESS *) NetMapRemoveHead (&Instance->DadPassedMap, NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (PassedAddr, ManualAddr, sizeof (EFI_IP6_CONFIG_MANUAL_ADDRESS));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PassedAddr++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT ((UINTN) PassedAddr - (UINTN) Item->Data.Ptr == Item->DataSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // All addresses are valid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Item->Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Remove the tags we put in the NET_MAPs.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (!NetMapIsEmpty (&Instance->DadFailedMap)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NetMapRemoveHead (&Instance->DadFailedMap, NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (!NetMapIsEmpty (&Instance->DadPassedMap)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NetMapRemoveHead (&Instance->DadPassedMap, NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Signal the waiting events.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NetMapIterate (&Item->EventMap, Ip6ConfigSignalEvent, NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IpSb = IP6_SERVICE_FROM_IP6_CONFIG_INSTANCE (Instance);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6ConfigWriteConfigData (IpSb->MacString, Instance);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The work function for EfiIp6ConfigSetData() to set the station addresses manually
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for the EFI IPv6 network stack. It is only configurable when the policy is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6ConfigPolicyManual.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Instance Pointer to the IP6 configuration instance data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] DataSize Size of the buffer pointed to by Data in bytes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Data The data buffer to set.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_BAD_BUFFER_SIZE The DataSize does not match the size of the type.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_WRITE_PROTECTED The specified configuration data cannot be set
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync under the current policy.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER One or more fields in Data is invalid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES Fail to allocate resource to complete the operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NOT_READY An asynchrous process is invoked to set the specified
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync configuration data, and the process is not finished.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_ABORTED The manual addresses to be set equal current
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync configuration.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The specified configuration data for the EFI IPv6
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync network stack was set.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIp6ConfigSetMaunualAddress (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN IP6_CONFIG_INSTANCE *Instance,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN DataSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IP6_CONFIG_MANUAL_ADDRESS *NewAddress;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IP6_CONFIG_MANUAL_ADDRESS *TmpAddress;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_CONFIG_DATA_ITEM *DataItem;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN NewAddressCount;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_SERVICE *IpSb;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_ADDRESS_INFO *CurrentAddrInfo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_ADDRESS_INFO *Copy;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY CurrentSourceList;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 CurrentSourceCount;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *Entry;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *Entry2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_INTERFACE *IpIf;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_PREFIX_LIST_ENTRY *PrefixEntry;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN IsUpdated;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Instance->DataItem[Ip6ConfigDataTypeManualAddress].Status != EFI_NOT_READY);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (((DataSize % sizeof (EFI_IP6_CONFIG_MANUAL_ADDRESS)) != 0) || (DataSize == 0)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_BAD_BUFFER_SIZE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Instance->Policy != Ip6ConfigPolicyManual) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_WRITE_PROTECTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewAddressCount = DataSize / sizeof (EFI_IP6_CONFIG_MANUAL_ADDRESS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewAddress = (EFI_IP6_CONFIG_MANUAL_ADDRESS *) Data;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index1 = 0; Index1 < NewAddressCount; Index1++, NewAddress++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NetIp6IsLinkLocalAddr (&NewAddress->Address) ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync !NetIp6IsValidUnicast (&NewAddress->Address) ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (NewAddress->PrefixLength > 128)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // make sure the IPv6 address is unicast and not link-local address &&
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // the prefix length is valid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TmpAddress = NewAddress + 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index2 = Index1 + 1; Index2 < NewAddressCount; Index2++, TmpAddress++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Any two addresses in the array can't be equal.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_IP6_EQUAL (&TmpAddress->Address, &NewAddress->Address)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IpSb = IP6_SERVICE_FROM_IP6_CONFIG_INSTANCE (Instance);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Build the current source address list.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InitializeListHead (&CurrentSourceList);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentSourceCount = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NET_LIST_FOR_EACH (Entry, &IpSb->Interfaces) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IpIf = NET_LIST_USER_STRUCT_S (Entry, IP6_INTERFACE, Link, IP6_INTERFACE_SIGNATURE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NET_LIST_FOR_EACH (Entry2, &IpIf->AddressList) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentAddrInfo = NET_LIST_USER_STRUCT_S (Entry2, IP6_ADDRESS_INFO, Link, IP6_ADDR_INFO_SIGNATURE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Copy = AllocateCopyPool (sizeof (IP6_ADDRESS_INFO), CurrentAddrInfo);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Copy == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InsertTailList (&CurrentSourceList, &Copy->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentSourceCount++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Update the value... a long journey starts
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewAddress = AllocateCopyPool (DataSize, Data);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NewAddress == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6RemoveAddr (NULL, &CurrentSourceList, &CurrentSourceCount, NULL, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Store the new data, and init the DataItem status to EFI_NOT_READY because
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // we may have an asynchronous configuration process.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataItem = &Instance->DataItem[Ip6ConfigDataTypeManualAddress];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DataItem->Data.Ptr != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (DataItem->Data.Ptr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataItem->Data.Ptr = NewAddress;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataItem->DataSize = DataSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataItem->Status = EFI_NOT_READY;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Trigger DAD, it's an asynchronous process.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IsUpdated = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index1 = 0; Index1 < NewAddressCount; Index1++, NewAddress++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Ip6IsOneOfSetAddress (IpSb, &NewAddress->Address, NULL, &CurrentAddrInfo)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (CurrentAddrInfo != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Remove this already existing source address from the CurrentSourceList
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // built before.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6RemoveAddr (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &CurrentSourceList,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &CurrentSourceCount,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &CurrentAddrInfo->Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 128
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // This manual address is already in use, see whether prefix length is changed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NewAddress->PrefixLength != CurrentAddrInfo->PrefixLength) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Remove the on-link prefix table, the route entry will be removed
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // implicitly.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrefixEntry = Ip6FindPrefixListEntry (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IpSb,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TRUE,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentAddrInfo->PrefixLength,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &CurrentAddrInfo->Address
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (PrefixEntry != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6DestroyPrefixListEntry (IpSb, PrefixEntry, TRUE, FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Save the prefix length.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentAddrInfo->PrefixLength = NewAddress->PrefixLength;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IsUpdated = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // create a new on-link prefix entry.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrefixEntry = Ip6FindPrefixListEntry (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IpSb,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TRUE,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewAddress->PrefixLength,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &NewAddress->Address
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (PrefixEntry == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6CreatePrefixListEntry (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IpSb,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TRUE,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (UINT32) IP6_INFINIT_LIFETIME,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (UINT32) IP6_INFINIT_LIFETIME,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewAddress->PrefixLength,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &NewAddress->Address
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentAddrInfo->IsAnycast = NewAddress->IsAnycast;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Artificially mark this address passed DAD be'coz it is already in use.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6ManualAddrDadCallback (TRUE, &NewAddress->Address, Instance);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // A new address.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IsUpdated = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Set the new address, this will trigger DAD and activate the address if
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // DAD succeeds.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6SetAddress (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IpSb->DefaultInterface,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &NewAddress->Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewAddress->IsAnycast,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewAddress->PrefixLength,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (UINT32) IP6_INFINIT_LIFETIME,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (UINT32) IP6_INFINIT_LIFETIME,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6ManualAddrDadCallback,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check the CurrentSourceList, it now contains those addresses currently in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // use and will be removed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IpIf = IpSb->DefaultInterface;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (!IsListEmpty (&CurrentSourceList)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IsUpdated = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentAddrInfo = NET_LIST_HEAD (&CurrentSourceList, IP6_ADDRESS_INFO, Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // This local address is going to be removed, the IP instances that are
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // currently using it will be destroyed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6RemoveAddr (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IpSb,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &IpIf->AddressList,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &IpIf->AddressCount,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &CurrentAddrInfo->Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 128
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Remove the on-link prefix table, the route entry will be removed
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // implicitly.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrefixEntry = Ip6FindPrefixListEntry (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IpSb,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TRUE,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentAddrInfo->PrefixLength,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &CurrentAddrInfo->Address
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (PrefixEntry != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6DestroyPrefixListEntry (IpSb, PrefixEntry, TRUE, FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RemoveEntryList (&CurrentAddrInfo->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (CurrentAddrInfo);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IsUpdated) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DataItem->Status == EFI_NOT_READY) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If DAD is disabled on this interface, the configuration process is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // actually synchronous, and the data item's status will be changed to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // the final status before we reach here, just check it.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_NOT_READY;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // No update is taken, reset the status to success and return EFI_ABORTED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataItem->Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_ABORTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The work function for EfiIp6ConfigSetData() to set the gateway addresses manually
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for the EFI IPv6 network stack that is running on the communication device that
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync this EFI IPv6 Configuration Protocol manages. It is not configurable when the policy is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6ConfigPolicyAutomatic. The gateway addresses must be unicast IPv6 addresses.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Instance The pointer to the IP6 config instance data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] DataSize The size of the buffer pointed to by Data in bytes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Data The data buffer to set. This points to an array of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IPv6_ADDRESS instances.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_BAD_BUFFER_SIZE The DataSize does not match the size of the type.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_WRITE_PROTECTED The specified configuration data cannot be set
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync under the current policy.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER One or more fields in Data is invalid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES Failed to allocate resource to complete the operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_ABORTED The manual gateway addresses to be set equal the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync current configuration.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The specified configuration data for the EFI IPv6
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync network stack was set.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIp6ConfigSetGateway (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN IP6_CONFIG_INSTANCE *Instance,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN DataSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IPv6_ADDRESS *OldGateway;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IPv6_ADDRESS *NewGateway;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN OldGatewayCount;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN NewGatewayCount;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_CONFIG_DATA_ITEM *Item;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN OneRemoved;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN OneAdded;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_SERVICE *IpSb;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_DEFAULT_ROUTER *DefaultRouter;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID *Tmp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((DataSize % sizeof (EFI_IPv6_ADDRESS) != 0) || (DataSize == 0)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_BAD_BUFFER_SIZE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Instance->Policy != Ip6ConfigPolicyManual) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_WRITE_PROTECTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewGateway = (EFI_IPv6_ADDRESS *) Data;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewGatewayCount = DataSize / sizeof (EFI_IPv6_ADDRESS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index1 = 0; Index1 < NewGatewayCount; Index1++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!NetIp6IsValidUnicast (NewGateway + Index1)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index2 = Index1 + 1; Index2 < NewGatewayCount; Index2++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_IP6_EQUAL (NewGateway + Index1, NewGateway + Index2)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IpSb = IP6_SERVICE_FROM_IP6_CONFIG_INSTANCE (Instance);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Item = &Instance->DataItem[Ip6ConfigDataTypeGateway];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OldGateway = Item->Data.Gateway;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OldGatewayCount = Item->DataSize / sizeof (EFI_IPv6_ADDRESS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OneRemoved = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OneAdded = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NewGatewayCount != OldGatewayCount) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Tmp = AllocatePool (DataSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Tmp == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Tmp = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index1 = 0; Index1 < OldGatewayCount; Index1++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Find the gateways that are no long in the new setting and remove them.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index2 = 0; Index2 < NewGatewayCount; Index2++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_IP6_EQUAL (OldGateway + Index1, NewGateway + Index2)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OneRemoved = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Index2 == NewGatewayCount) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Remove this default router.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DefaultRouter = Ip6FindDefaultRouter (IpSb, OldGateway + Index1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DefaultRouter != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6DestroyDefaultRouter (IpSb, DefaultRouter);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index1 = 0; Index1 < NewGatewayCount; Index1++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DefaultRouter = Ip6FindDefaultRouter (IpSb, NewGateway + Index1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DefaultRouter == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6CreateDefaultRouter (IpSb, NewGateway + Index1, IP6_INF_ROUTER_LIFETIME);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OneAdded = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!OneRemoved && !OneAdded) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Item->Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_ABORTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Tmp != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Item->Data.Ptr != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Item->Data.Ptr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Item->Data.Ptr = Tmp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (Item->Data.Ptr, Data, DataSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Item->DataSize = DataSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Item->Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The work function for EfiIp6ConfigSetData() to set the DNS server list for the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI IPv6 network stack running on the communication device that this EFI IPv6
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Configuration Protocol manages. It is not configurable when the policy is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6ConfigPolicyAutomatic. The DNS server addresses must be unicast IPv6 addresses.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Instance The pointer to the IP6 config instance data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] DataSize The size of the buffer pointed to by Data in bytes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Data The data buffer to set, points to an array of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IPv6_ADDRESS instances.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_BAD_BUFFER_SIZE The DataSize does not match the size of the type.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_WRITE_PROTECTED The specified configuration data cannot be set
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync under the current policy.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER One or more fields in Data is invalid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES Failed to allocate resources to complete the operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_ABORTED The DNS server addresses to be set equal the current
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync configuration.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The specified configuration data for the EFI IPv6
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync network stack was set.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIp6ConfigSetDnsServer (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN IP6_CONFIG_INSTANCE *Instance,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN DataSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN OldIndex;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN NewIndex;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IPv6_ADDRESS *OldDns;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IPv6_ADDRESS *NewDns;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN OldDnsCount;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN NewDnsCount;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_CONFIG_DATA_ITEM *Item;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN OneAdded;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID *Tmp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((DataSize % sizeof (EFI_IPv6_ADDRESS) != 0) || (DataSize == 0)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_BAD_BUFFER_SIZE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Instance->Policy != Ip6ConfigPolicyManual) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_WRITE_PROTECTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Item = &Instance->DataItem[Ip6ConfigDataTypeDnsServer];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewDns = (EFI_IPv6_ADDRESS *) Data;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OldDns = Item->Data.DnsServers;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewDnsCount = DataSize / sizeof (EFI_IPv6_ADDRESS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OldDnsCount = Item->DataSize / sizeof (EFI_IPv6_ADDRESS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OneAdded = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NewDnsCount != OldDnsCount) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Tmp = AllocatePool (DataSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Tmp == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Tmp = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (NewIndex = 0; NewIndex < NewDnsCount; NewIndex++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!NetIp6IsValidUnicast (NewDns + NewIndex)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // The dns server address must be unicast.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Tmp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index1 = NewIndex + 1; Index1 < NewDnsCount; Index1++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_IP6_EQUAL (NewDns + NewIndex, NewDns + Index1)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Tmp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (OneAdded) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If any address in the new setting is not in the old settings, skip the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // comparision below.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (OldIndex = 0; OldIndex < OldDnsCount; OldIndex++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_IP6_EQUAL (NewDns + NewIndex, OldDns + OldIndex)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If found break out.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (OldIndex == OldDnsCount) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OneAdded = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!OneAdded && (DataSize == Item->DataSize)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // No new item is added and the size is the same.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Item->Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_ABORTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Tmp != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Item->Data.Ptr != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Item->Data.Ptr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Item->Data.Ptr = Tmp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (Item->Data.Ptr, Data, DataSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Item->DataSize = DataSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Item->Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Generate the operational state of the interface this IP6 config instance manages
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync and output in EFI_IP6_CONFIG_INTERFACE_INFO.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] IpSb The pointer to the IP6 service binding instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] IfInfo The pointer to the IP6 configuration interface information structure.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIp6ConfigInitIfInfo (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN IP6_SERVICE *IpSb,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_IP6_CONFIG_INTERFACE_INFO *IfInfo
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfInfo->Name[0] = L'e';
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfInfo->Name[1] = L't';
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfInfo->Name[2] = L'h';
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfInfo->Name[3] = (CHAR16) (L'0' + IpSb->Ip6ConfigInstance.IfIndex);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfInfo->Name[4] = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfInfo->IfType = IpSb->SnpMode.IfType;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfInfo->HwAddressSize = IpSb->SnpMode.HwAddressSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (&IfInfo->HwAddress, &IpSb->SnpMode.CurrentAddress, IfInfo->HwAddressSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Parse DHCPv6 reply packet to get the DNS server list.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync It is the work function for Ip6ConfigOnDhcp6Reply and Ip6ConfigOnDhcp6Event.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Dhcp6 The pointer to the EFI_DHCP6_PROTOCOL instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] Instance The pointer to the IP6 configuration instance data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Reply The pointer to the DHCPv6 reply packet.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The DNS server address was retrieved from the reply packet.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NOT_READY The reply packet does not contain the DNS server option, or
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the DNS server address is not valid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIp6ConfigParseDhcpReply (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_DHCP6_PROTOCOL *Dhcp6,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT IP6_CONFIG_INSTANCE *Instance,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_DHCP6_PACKET *Reply
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 OptCount;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DHCP6_PACKET_OPTION **OptList;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 OpCode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IPv6_ADDRESS *DnsServer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_CONFIG_DATA_ITEM *Item;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // A DHCPv6 reply packet is received as the response to our InfoRequest
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // packet.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OptCount = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Dhcp6->Parse (Dhcp6, Reply, &OptCount, NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Status != EFI_BUFFER_TOO_SMALL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_NOT_READY;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OptList = AllocatePool (OptCount * sizeof (EFI_DHCP6_PACKET_OPTION *));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (OptList == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_NOT_READY;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Dhcp6->Parse (Dhcp6, Reply, &OptCount, OptList);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_NOT_READY;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto ON_EXIT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < OptCount; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Go through all the options to check the ones we are interested in.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // The OpCode and Length are in network byte-order and may not be naturally
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // aligned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (&OpCode, &OptList[Index]->OpCode, sizeof (OpCode));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OpCode = NTOHS (OpCode);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (OpCode == IP6_CONFIG_DHCP6_OPTION_DNS_SERVERS) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (&Length, &OptList[Index]->OpLen, sizeof (Length));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Length = NTOHS (Length);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Length == 0) || ((Length % sizeof (EFI_IPv6_ADDRESS)) != 0)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // The length should be a multiple of 16 bytes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_NOT_READY;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Validate the DnsServers: whether they are unicast addresses.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DnsServer = (EFI_IPv6_ADDRESS *) OptList[Index]->Data;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index2 = 0; Index2 < Length / sizeof (EFI_IPv6_ADDRESS); Index2++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!NetIp6IsValidUnicast (DnsServer)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_NOT_READY;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto ON_EXIT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DnsServer++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Item = &Instance->DataItem[Ip6ConfigDataTypeDnsServer];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Item->DataSize != Length) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Item->Data.Ptr != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Item->Data.Ptr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Item->Data.Ptr = AllocatePool (Length);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Item->Data.Ptr != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (Item->Data.Ptr, OptList[Index]->Data, Length);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Item->DataSize = Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Item->Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Signal the waiting events.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NetMapIterate (&Item->EventMap, Ip6ConfigSignalEvent, NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncON_EXIT:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (OptList);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The callback function for Ip6SetAddr. The prototype is defined
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync as IP6_DAD_CALLBACK. It is called after Duplicate Address Detection is performed
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync on the tentative address by DHCPv6 in Ip6ConfigOnDhcp6Event().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] IsDadPassed If TRUE, Duplicate Address Detection passes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] TargetAddress The tentative IPv6 address to be checked.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Context Pointer to the IP6 configuration instance data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIp6ConfigSetStatefulAddrCallback (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN BOOLEAN IsDadPassed,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_IPv6_ADDRESS *TargetAddress,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Context
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_CONFIG_INSTANCE *Instance;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance = (IP6_CONFIG_INSTANCE *) Context;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NET_CHECK_SIGNATURE (Instance, IP6_CONFIG_INSTANCE_SIGNATURE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // We should record the addresses that fail the DAD, and DECLINE them.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IsDadPassed) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Decrease the count, no interests in those passed DAD.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Instance->FailedIaAddressCount > 0 ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance->FailedIaAddressCount--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Record it.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_COPY_ADDRESS (Instance->DeclineAddress + Instance->DeclineAddressCount, TargetAddress);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance->DeclineAddressCount++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Instance->FailedIaAddressCount == Instance->DeclineAddressCount) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // The checking on all addresses are finished.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Instance->DeclineAddressCount != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Decline those duplicates.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance->Dhcp6->Decline (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance->Dhcp6,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance->DeclineAddressCount,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance->DeclineAddress
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Instance->DeclineAddress != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Instance->DeclineAddress);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance->DeclineAddress = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance->DeclineAddressCount = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The event handle routine when DHCPv6 process is finished or is updated.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Event Not used.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Context The pointer to the IP6 configuration instance data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIp6ConfigOnDhcp6Event (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_EVENT Event,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Context
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_CONFIG_INSTANCE *Instance;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DHCP6_PROTOCOL *Dhcp6;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DHCP6_MODE_DATA Dhcp6ModeData;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DHCP6_IA *Ia;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DHCP6_IA_ADDRESS *IaAddr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_SERVICE *IpSb;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_ADDRESS_INFO *AddrInfo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_INTERFACE *IpIf;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance = (IP6_CONFIG_INSTANCE *) Context;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Instance->Policy != Ip6ConfigPolicyAutomatic) || Instance->OtherInfoOnly) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // IPv6 is not operating in the automatic policy now or
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // the DHCPv6 information request message exchange is aborted.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // The stateful address autoconfiguration is done or updated.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Dhcp6 = Instance->Dhcp6;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Dhcp6->GetModeData (Dhcp6, &Dhcp6ModeData, NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IpSb = IP6_SERVICE_FROM_IP6_CONFIG_INSTANCE (Instance);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IpIf = IpSb->DefaultInterface;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ia = Dhcp6ModeData.Ia;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IaAddr = Ia->IaAddress;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Instance->DeclineAddress != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Instance->DeclineAddress);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance->DeclineAddress = (EFI_IPv6_ADDRESS *) AllocatePool (Ia->IaAddressCount * sizeof (EFI_IPv6_ADDRESS));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Instance->DeclineAddress == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto ON_EXIT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance->FailedIaAddressCount = Ia->IaAddressCount;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance->DeclineAddressCount = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < Ia->IaAddressCount; Index++, IaAddr++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Ia->IaAddress[Index].ValidLifetime != 0 && Ia->State == Dhcp6Bound) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Set this address, either it's a new address or with updated lifetimes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // An appropriate prefix length will be set.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6SetAddress (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IpIf,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &IaAddr->IpAddress,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FALSE,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IaAddr->ValidLifetime,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IaAddr->PreferredLifetime,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6ConfigSetStatefulAddrCallback,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // discard this address, artificially decrease the count as if this address
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // passed DAD.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Ip6IsOneOfSetAddress (IpSb, &IaAddr->IpAddress, NULL, &AddrInfo)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (AddrInfo != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6RemoveAddr (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IpSb,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &IpIf->AddressList,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &IpIf->AddressCount,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &AddrInfo->Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AddrInfo->PrefixLength
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Instance->FailedIaAddressCount > 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance->FailedIaAddressCount--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Parse the Reply packet to get the options we need.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Dhcp6ModeData.Ia->ReplyPacket != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6ConfigParseDhcpReply (Dhcp6, Instance, Dhcp6ModeData.Ia->ReplyPacket);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncON_EXIT:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Dhcp6ModeData.ClientId);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Dhcp6ModeData.Ia);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The event process routine when the DHCPv6 server is answered with a reply packet
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for an information request.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This Points to the EFI_DHCP6_PROTOCOL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Context The pointer to the IP6 configuration instance data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Packet The DHCPv6 reply packet.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The DNS server address was retrieved from the reply packet.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NOT_READY The reply packet does not contain the DNS server option, or
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the DNS server address is not valid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIp6ConfigOnDhcp6Reply (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_DHCP6_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Context,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_DHCP6_PACKET *Packet
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Ip6ConfigParseDhcpReply (This, (IP6_CONFIG_INSTANCE *) Context, Packet);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The event process routine when the DHCPv6 service binding protocol is installed
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync in the system.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Event Not used.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Context The pointer to the IP6 config instance data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIp6ConfigOnDhcp6SbInstalled (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_EVENT Event,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Context
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_CONFIG_INSTANCE *Instance;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance = (IP6_CONFIG_INSTANCE *) Context;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Instance->Dhcp6Handle != NULL) || (Instance->Policy != Ip6ConfigPolicyAutomatic)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // The DHCP6 child is already created or the policy is no longer AUTOMATIC.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6ConfigStartStatefulAutoConfig (Instance, Instance->OtherInfoOnly);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Set the configuration for the EFI IPv6 network stack running on the communication
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync device this EFI IPv6 Configuration Protocol instance manages.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function is used to set the configuration data of type DataType for the EFI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IPv6 network stack that is running on the communication device that this EFI IPv6
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Configuration Protocol instance manages.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataSize is used to calculate the count of structure instances in the Data for
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync a DataType in which multiple structure instances are allowed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function is always non-blocking. When setting some type of configuration data,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync an asynchronous process is invoked to check the correctness of the data, such as
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync performing Duplicate Address Detection on the manually set local IPv6 addresses.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_NOT_READY is returned immediately to indicate that such an asynchronous process
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync is invoked, and the process is not finished yet. The caller wanting to get the result
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync of the asynchronous process is required to call RegisterDataNotify() to register an
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync event on the specified configuration data. Once the event is signaled, the caller
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync can call GetData() to obtain the configuration data and know the result.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync For other types of configuration data that do not require an asynchronous configuration
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync process, the result of the operation is immediately returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This The pointer to the EFI_IP6_CONFIG_PROTOCOL instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] DataType The type of data to set.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] DataSize Size of the buffer pointed to by Data in bytes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Data The data buffer to set. The type of the data buffer is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync associated with the DataType.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The specified configuration data for the EFI IPv6
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync network stack was set successfully.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER One or more of the following are TRUE:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync - This is NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync - Data is NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync - One or more fields in Data do not match the requirement of the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync data type indicated by DataType.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_WRITE_PROTECTED The specified configuration data is read-only or the specified
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync configuration data cannot be set under the current policy.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_ACCESS_DENIED Another set operation on the specified configuration
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync data is already in process.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NOT_READY An asynchronous process was invoked to set the specified
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync configuration data, and the process is not finished yet.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_BAD_BUFFER_SIZE The DataSize does not match the size of the type
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync indicated by DataType.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_UNSUPPORTED This DataType is not supported.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES Required system resources could not be allocated.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR An unexpected system error or network error occurred.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEfiIp6ConfigSetData (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_IP6_CONFIG_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_IP6_CONFIG_DATA_TYPE DataType,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN DataSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_TPL OldTpl;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_CONFIG_INSTANCE *Instance;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_SERVICE *IpSb;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((This == NULL) || (Data == NULL)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DataType >= Ip6ConfigDataTypeMaximum) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_UNSUPPORTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance = IP6_CONFIG_INSTANCE_FROM_PROTOCOL (This);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IpSb = IP6_SERVICE_FROM_IP6_CONFIG_INSTANCE (Instance);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NET_CHECK_SIGNATURE (IpSb, IP6_SERVICE_SIGNATURE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IpSb->LinkLocalDadFail) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_DEVICE_ERROR;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Instance->DataItem[DataType].Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Status != EFI_NOT_READY) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Instance->DataItem[DataType].SetData == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // This type of data is readonly.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_WRITE_PROTECTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Instance->DataItem[DataType].SetData (Instance, DataSize, Data);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Fire up the events registered with this type of data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NetMapIterate (&Instance->DataItem[DataType].EventMap, Ip6ConfigSignalEvent, NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6ConfigWriteConfigData (IpSb->MacString, Instance);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (Status == EFI_ABORTED) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // The SetData is aborted because the data to set is the same with
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // the one maintained.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NetMapIterate (&Instance->DataItem[DataType].EventMap, Ip6ConfigSignalEvent, NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Another asynchornous process is on the way.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_ACCESS_DENIED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->RestoreTPL (OldTpl);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Get the configuration data for the EFI IPv6 network stack running on the communication
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync device that this EFI IPv6 Configuration Protocol instance manages.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function returns the configuration data of type DataType for the EFI IPv6 network
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync stack running on the communication device that this EFI IPv6 Configuration Protocol instance
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync manages.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The caller is responsible for allocating the buffer used to return the specified
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync configuration data. The required size will be returned to the caller if the size of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the buffer is too small.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_NOT_READY is returned if the specified configuration data is not ready due to an
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync asynchronous configuration process already in progress. The caller can call RegisterDataNotify()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync to register an event on the specified configuration data. Once the asynchronous configuration
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync process is finished, the event will be signaled, and a subsequent GetData() call will return
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the specified configuration data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This Pointer to the EFI_IP6_CONFIG_PROTOCOL instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] DataType The type of data to get.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] DataSize On input, in bytes, the size of Data. On output, in bytes, the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync size of buffer required to store the specified configuration data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Data The data buffer in which the configuration data is returned. The
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync type of the data buffer is associated with the DataType.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This is an optional parameter that may be NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The specified configuration data was obtained successfully.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER One or more of the followings are TRUE:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync - This is NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync - DataSize is NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync - Data is NULL if *DataSize is not zero.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_BUFFER_TOO_SMALL The size of Data is too small for the specified configuration data,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync and the required size is returned in DataSize.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NOT_READY The specified configuration data is not ready due to an
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync asynchronous configuration process already in progress.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NOT_FOUND The specified configuration data is not found.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEfiIp6ConfigGetData (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_IP6_CONFIG_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_IP6_CONFIG_DATA_TYPE DataType,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT UINTN *DataSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Data OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_TPL OldTpl;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_CONFIG_INSTANCE *Instance;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_CONFIG_DATA_ITEM *DataItem;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((This == NULL) || (DataSize == NULL) || ((*DataSize != 0) && (Data == NULL))) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DataType >= Ip6ConfigDataTypeMaximum) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance = IP6_CONFIG_INSTANCE_FROM_PROTOCOL (This);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataItem = &Instance->DataItem[DataType];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Instance->DataItem[DataType].Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DataItem->GetData != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = DataItem->GetData (Instance, DataSize, Data);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (*DataSize < Instance->DataItem[DataType].DataSize) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Update the buffer length.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *DataSize = Instance->DataItem[DataType].DataSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_BUFFER_TOO_SMALL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *DataSize = Instance->DataItem[DataType].DataSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (Data, Instance->DataItem[DataType].Data.Ptr, *DataSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->RestoreTPL (OldTpl);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Register an event that is signaled whenever a configuration process on the specified
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync configuration data is done.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function registers an event that is to be signaled whenever a configuration
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync process on the specified configuration data is performed. An event can be registered
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for a different DataType simultaneously. The caller is responsible for determining
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync which type of configuration data causes the signaling of the event in such an event.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This Pointer to the EFI_IP6_CONFIG_PROTOCOL instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] DataType The type of data to unregister the event for.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Event The event to register.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The notification event for the specified configuration data is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync registered.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER This is NULL or Event is NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_UNSUPPORTED The configuration data type specified by DataType is not
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync supported.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES Required system resources could not be allocated.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_ACCESS_DENIED The Event is already registered for the DataType.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEfiIp6ConfigRegisterDataNotify (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_IP6_CONFIG_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_IP6_CONFIG_DATA_TYPE DataType,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_EVENT Event
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_TPL OldTpl;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_CONFIG_INSTANCE *Instance;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NET_MAP *EventMap;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NET_MAP_ITEM *Item;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((This == NULL) || (Event == NULL)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DataType >= Ip6ConfigDataTypeMaximum) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_UNSUPPORTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance = IP6_CONFIG_INSTANCE_FROM_PROTOCOL (This);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EventMap = &Instance->DataItem[DataType].EventMap;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check whether this event is already registered for this DataType.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Item = NetMapFindKey (EventMap, Event);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Item == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = NetMapInsertTail (EventMap, Event, NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_ACCESS_DENIED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->RestoreTPL (OldTpl);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Remove a previously registered event for the specified configuration data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param This The pointer to the EFI_IP6_CONFIG_PROTOCOL instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param DataType The type of data to remove from the previously
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync registered event.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Event The event to be unregistered.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The event registered for the specified
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync configuration data was removed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER This is NULL or Event is NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NOT_FOUND The Event has not been registered for the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync specified DataType.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEfiIp6ConfigUnregisterDataNotify (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_IP6_CONFIG_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_IP6_CONFIG_DATA_TYPE DataType,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_EVENT Event
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_TPL OldTpl;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_CONFIG_INSTANCE *Instance;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NET_MAP_ITEM *Item;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((This == NULL) || (Event == NULL)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DataType >= Ip6ConfigDataTypeMaximum) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance = IP6_CONFIG_INSTANCE_FROM_PROTOCOL (This);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Item = NetMapFindKey (&Instance->DataItem[DataType].EventMap, Event);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Item != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NetMapRemoveItem (&Instance->DataItem[DataType].EventMap, Item, NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->RestoreTPL (OldTpl);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Initialize an IP6_CONFIG_INSTANCE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Instance The buffer of IP6_CONFIG_INSTANCE to be initialized.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES Failed to allocate resources to complete the operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The IP6_CONFIG_INSTANCE initialized successfully.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIp6ConfigInitInstance (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT IP6_CONFIG_INSTANCE *Instance
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_SERVICE *IpSb;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_CONFIG_INSTANCE *TmpInstance;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *Entry;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 IfIndex;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_CONFIG_DATA_ITEM *DataItem;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IpSb = IP6_SERVICE_FROM_IP6_CONFIG_INSTANCE (Instance);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance->Signature = IP6_CONFIG_INSTANCE_SIGNATURE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Determine the index of this interface.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfIndex = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NET_LIST_FOR_EACH (Entry, &mIp6ConfigInstanceList) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TmpInstance = NET_LIST_USER_STRUCT_S (Entry, IP6_CONFIG_INSTANCE, Link, IP6_CONFIG_INSTANCE_SIGNATURE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TmpInstance->IfIndex > IfIndex) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // There is a sequence hole because some interface is down.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfIndex++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance->IfIndex = IfIndex;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NetListInsertBefore (Entry, &Instance->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < Ip6ConfigDataTypeMaximum; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Initialize the event map for each data item.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NetMapInit (&Instance->DataItem[Index].EventMap);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Initialize the NET_MAPs used for DAD on manually configured source addresses.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NetMapInit (&Instance->DadFailedMap);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NetMapInit (&Instance->DadPassedMap);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Initialize each data type: associate storage and set data size for the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // fixed size data types, hook the SetData function, set the data attribute.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataItem = &Instance->DataItem[Ip6ConfigDataTypeInterfaceInfo];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataItem->GetData = Ip6ConfigGetIfInfo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataItem->Data.Ptr = &Instance->InterfaceInfo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataItem->DataSize = sizeof (Instance->InterfaceInfo);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SET_DATA_ATTRIB (DataItem->Attribute, DATA_ATTRIB_SIZE_FIXED | DATA_ATTRIB_VOLATILE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6ConfigInitIfInfo (IpSb, &Instance->InterfaceInfo);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataItem = &Instance->DataItem[Ip6ConfigDataTypeAltInterfaceId];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataItem->SetData = Ip6ConfigSetAltIfId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataItem->Data.Ptr = &Instance->AltIfId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataItem->DataSize = sizeof (Instance->AltIfId);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataItem->Status = EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SET_DATA_ATTRIB (DataItem->Attribute, DATA_ATTRIB_SIZE_FIXED);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataItem = &Instance->DataItem[Ip6ConfigDataTypePolicy];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataItem->SetData = Ip6ConfigSetPolicy;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataItem->Data.Ptr = &Instance->Policy;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataItem->DataSize = sizeof (Instance->Policy);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance->Policy = Ip6ConfigPolicyAutomatic;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SET_DATA_ATTRIB (DataItem->Attribute, DATA_ATTRIB_SIZE_FIXED);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataItem = &Instance->DataItem[Ip6ConfigDataTypeDupAddrDetectTransmits];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataItem->SetData = Ip6ConfigSetDadXmits;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataItem->Data.Ptr = &Instance->DadXmits;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataItem->DataSize = sizeof (Instance->DadXmits);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance->DadXmits.DupAddrDetectTransmits = IP6_CONFIG_DEFAULT_DAD_XMITS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SET_DATA_ATTRIB (DataItem->Attribute, DATA_ATTRIB_SIZE_FIXED);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataItem = &Instance->DataItem[Ip6ConfigDataTypeManualAddress];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataItem->SetData = Ip6ConfigSetMaunualAddress;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataItem->Status = EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataItem = &Instance->DataItem[Ip6ConfigDataTypeGateway];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataItem->SetData = Ip6ConfigSetGateway;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataItem->Status = EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataItem = &Instance->DataItem[Ip6ConfigDataTypeDnsServer];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataItem->SetData = Ip6ConfigSetDnsServer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataItem->Status = EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Create the event used for DHCP.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->CreateEvent (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EVT_NOTIFY_SIGNAL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TPL_CALLBACK,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6ConfigOnDhcp6Event,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Instance->Dhcp6Event
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT_EFI_ERROR (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance->Configured = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Try to read the config data from NV variable.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Ip6ConfigReadConfigData (IpSb->MacString, Instance);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Status == EFI_NOT_FOUND) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // The NV variable is not set, so generate a random IAID, and write down the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // fresh new configuration as the NV variable now.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance->IaId = NET_RANDOM (NetRandomInitSeed ());
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < IpSb->SnpMode.HwAddressSize; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance->IaId |= (IpSb->SnpMode.CurrentAddress.Addr[Index] << ((Index << 3) & 31));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6ConfigWriteConfigData (IpSb->MacString, Instance);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance->Ip6Config.SetData = EfiIp6ConfigSetData;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance->Ip6Config.GetData = EfiIp6ConfigGetData;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance->Ip6Config.RegisterDataNotify = EfiIp6ConfigRegisterDataNotify;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance->Ip6Config.UnregisterDataNotify = EfiIp6ConfigUnregisterDataNotify;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Publish the IP6 configuration form
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Ip6ConfigFormInit (Instance);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Release an IP6_CONFIG_INSTANCE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] Instance The buffer of IP6_CONFIG_INSTANCE to be freed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIp6ConfigCleanInstance (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT IP6_CONFIG_INSTANCE *Instance
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_CONFIG_DATA_ITEM *DataItem;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Instance->DeclineAddress != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Instance->DeclineAddress);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!Instance->Configured) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Instance->Dhcp6Handle != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6ConfigDestroyDhcp6 (Instance);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Close the event.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Instance->Dhcp6Event != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->CloseEvent (Instance->Dhcp6Event);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NetMapClean (&Instance->DadPassedMap);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NetMapClean (&Instance->DadFailedMap);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < Ip6ConfigDataTypeMaximum; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataItem = &Instance->DataItem[Index];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!DATA_ATTRIB_SET (DataItem->Attribute, DATA_ATTRIB_SIZE_FIXED)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DataItem->Data.Ptr != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (DataItem->Data.Ptr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataItem->Data.Ptr = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataItem->DataSize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NetMapClean (&Instance->DataItem[Index].EventMap);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6ConfigFormUnload (Instance);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RemoveEntryList (&Instance->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Destory the Dhcp6 child in IP6_CONFIG_INSTANCE and release the resources.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] Instance The buffer of IP6_CONFIG_INSTANCE to be freed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The child was successfully destroyed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Others Failed to destory the child.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIp6ConfigDestroyDhcp6 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT IP6_CONFIG_INSTANCE *Instance
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_SERVICE *IpSb;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DHCP6_PROTOCOL *Dhcp6;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Dhcp6 = Instance->Dhcp6;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Dhcp6 != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Dhcp6->Stop (Dhcp6);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Dhcp6->Configure (Dhcp6, NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance->Dhcp6 = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IpSb = IP6_SERVICE_FROM_IP6_CONFIG_INSTANCE (Instance);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Close DHCPv6 protocol and destroy the child.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->CloseProtocol (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance->Dhcp6Handle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiDhcp6ProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IpSb->Image,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IpSb->Controller
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = NetLibDestroyServiceChild (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IpSb->Controller,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IpSb->Image,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiDhcp6ServiceBindingProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance->Dhcp6Handle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance->Dhcp6Handle = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync