4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Helper functions for configuring or obtaining the parameters relating to IP6.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Copyright (c) 2010 - 2012, 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
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCHAR16 mIp6ConfigStorageName[] = L"IP6_CONFIG_IFR_NVDATA";
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The notify function of create event when performing a manual configuration.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Event The pointer of Event.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Context The pointer of Context.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIp6ConfigManualAddressNotify (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_EVENT Event,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Context
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *((BOOLEAN *) Context) = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Get the configuration data for the EFI IPv6 network stack running on the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync communication. It is a help function to the call EfiIp6ConfigGetData().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Ip6Config The pointer to the EFI_IP6_CONFIG_PROTOCOL instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] DataType The type of data to get.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] DataSize The size of buffer required in bytes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Data The data buffer in which the configuration data is returned. The
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync type of the data buffer associated with the DataType.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync It is the caller's responsibility to free the resource.
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 - Ip6Config is NULL or invalid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync - DataSize is NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync - Data is NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES Fail to perform the operation due to lack of resources.
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 was not found.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIp6ConfigNvGetData (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_IP6_CONFIG_PROTOCOL *Ip6Config,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_IP6_CONFIG_DATA_TYPE DataType,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINTN *DataSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT VOID **Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN BufferSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID *Buffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Ip6Config == NULL) || (Data == NULL) || (DataSize == NULL)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BufferSize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Ip6Config->GetData (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6Config,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataType,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &BufferSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Status != EFI_BUFFER_TOO_SMALL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer = AllocateZeroPool (BufferSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Buffer == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Ip6Config->GetData (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6Config,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataType,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &BufferSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *DataSize = BufferSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Data = Buffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Free all nodes in IP6_ADDRESS_INFO_ENTRY in the list array specified
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync with ListHead.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ListHead The head of the list array in IP6_ADDRESS_INFO_ENTRY.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIp6FreeAddressInfoList (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN LIST_ENTRY *ListHead
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_ADDRESS_INFO_ENTRY *Node;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *Entry;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *NextEntry;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, ListHead) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node = NET_LIST_USER_STRUCT (Entry, IP6_ADDRESS_INFO_ENTRY, Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RemoveEntryList (&Node->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Node);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Convert the IPv6 address into a formatted string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Ip6 The IPv6 address.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Str The formatted IP string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIp6ToStr (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_IPv6_ADDRESS *Ip6,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT CHAR16 *Str
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN Short;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Number;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 FormatString[8];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Short = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < 15; Index = Index + 2) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!Short &&
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Index % 2 == 0 &&
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6->Addr[Index] == 0 &&
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6->Addr[Index + 1] == 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Deal with the case of ::.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Index == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Str = L':';
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *(Str + 1) = L':';
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Str = Str + 2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Str = L':';
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Str = Str + 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while ((Index < 15) && (Ip6->Addr[Index] == 0) && (Ip6->Addr[Index + 1] == 0)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Index = Index + 2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Short = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Index == 16) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // :: is at the end of the address.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Str = L'\0';
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Index < 15);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Ip6->Addr[Index] == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Number = UnicodeSPrint (Str, 2 * IP6_STR_MAX_SIZE, L"%x:", (UINTN) Ip6->Addr[Index + 1]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Ip6->Addr[Index + 1] < 0x10) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (FormatString, L"%x0%x:", StrSize (L"%x0%x:"));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (FormatString, L"%x%x:", StrSize (L"%x%x:"));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Number = UnicodeSPrint (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Str,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 2 * IP6_STR_MAX_SIZE,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (CONST CHAR16 *) FormatString,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (UINTN) Ip6->Addr[Index],
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (UINTN) Ip6->Addr[Index + 1]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Str = Str + Number;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Index + 2 == 16) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Str = L'\0';
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*(Str - 1) == L':') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *(Str - 1) = L'\0';
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Convert EFI_IP6_CONFIG_INTERFACE_ID to string format.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] String The buffer to store the converted string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] IfId The pointer of EFI_IP6_CONFIG_INTERFACE_ID.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The string converted successfully.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIp6ConvertInterfaceIdToString (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT CHAR16 *String,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_IP6_CONFIG_INTERFACE_ID *IfId
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Number;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((String == NULL) || (IfId == NULL)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < 8; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Number = UnicodeSPrint (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 2 * INTERFACE_ID_STR_STORAGE,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"%x:",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (UINTN) IfId->Id[Index]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String = String + Number;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *(String - 1) = '\0';
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Parse InterfaceId in string format and convert it to EFI_IP6_CONFIG_INTERFACE_ID.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] String The buffer of the string to be parsed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] IfId The pointer of EFI_IP6_CONFIG_INTERFACE_ID.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The operation finished successfully.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIp6ParseInterfaceIdFromString (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *String,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_IP6_CONFIG_INTERFACE_ID *IfId
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *IfIdStr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *TempStr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN NodeVal;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((String == NULL) || (IfId == NULL)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfIdStr = (CHAR16 *) String;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (IfId, sizeof (EFI_IP6_CONFIG_INTERFACE_ID));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < 8; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempStr = IfIdStr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while ((*IfIdStr != L'\0') && (*IfIdStr != L':')) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfIdStr++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // The InterfaceId format is X:X:X:X, the number of X should not exceed 8.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If the number of X is less than 8, zero is appended to the InterfaceId.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((*IfIdStr == ':') && (Index == 7)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Convert the string to interface id. AsciiStrHexToUintn stops at the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // first character that is not a valid hex character, ':' or '\0' here.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NodeVal = StrHexToUintn (TempStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NodeVal > 0xFF) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfId->Id[Index] = (UINT8) NodeVal;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfIdStr++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Create Hii Extend Label OpCode as the start opcode and end opcode. It is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync a help function.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] StartLabelNumber The number of start label.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] StartOpCodeHandle Points to the start opcode handle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] StartLabel Points to the created start opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] EndOpCodeHandle Points to the end opcode handle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] EndLabel Points to the created end opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES Does not have sufficient resources to finish this
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync operation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The operation completed successfully.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIp6CreateOpCode (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 StartLabelNumber,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT VOID **StartOpCodeHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_IFR_GUID_LABEL **StartLabel,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT VOID **EndOpCodeHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_IFR_GUID_LABEL **EndLabel
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IFR_GUID_LABEL *InternalStartLabel;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IFR_GUID_LABEL *InternalEndLabel;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StartOpCodeHandle == NULL || StartLabel == NULL || EndOpCodeHandle == NULL || EndLabel == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *StartOpCodeHandle = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *EndOpCodeHandle = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Initialize the container for dynamic opcodes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *StartOpCodeHandle = HiiAllocateOpCodeHandle ();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*StartOpCodeHandle == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *EndOpCodeHandle = HiiAllocateOpCodeHandle ();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*EndOpCodeHandle == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Create Hii Extend Label OpCode as the start opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InternalStartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *StartOpCodeHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiIfrTianoGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sizeof (EFI_IFR_GUID_LABEL)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (InternalStartLabel == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InternalStartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InternalStartLabel->Number = StartLabelNumber;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Create Hii Extend Label OpCode as the end opcode.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InternalEndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *EndOpCodeHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiIfrTianoGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sizeof (EFI_IFR_GUID_LABEL)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (InternalEndLabel == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InternalEndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InternalEndLabel->Number = LABEL_END;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *StartLabel = InternalStartLabel;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *EndLabel = InternalEndLabel;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncExit:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*StartOpCodeHandle != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiFreeOpCodeHandle (*StartOpCodeHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*EndOpCodeHandle != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiFreeOpCodeHandle (*EndOpCodeHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function converts the different format of address list to string format and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync then generates the corresponding text opcode to illustarate the address info in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6 configuration page. Currently, the following formats are supported:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IP6_ADDRESS_INFO AddressType: Ip6ConfigNvHostAddress;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IPv6_ADDRESS AddressType: Ip6ConfigNvGatewayAddress and Ip6ConfigNvDnsAddress;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IP6_ROUTE_TABLE AddressType: Ip6ConfigNvRouteTable.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] String The pointer to the buffer to store the converted
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] HiiHandle A handle that was previously registered in the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HII Database.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] AddressType The address type.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] AddressInfo Pointer to the address list.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] AddressCount The address count of the address list.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The operation finished successfully.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_UNSUPPORTED The AddressType is not supported.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIp6ConvertAddressListToString (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT CHAR16 *String,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HII_HANDLE HiiHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN IP6_CONFIG_NV_ADDRESS_TYPE AddressType,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *AddressInfo,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN AddressCount
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Number;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *TempStr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID *StartOpCodeHandle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IFR_GUID_LABEL *StartLabel;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID *EndOpCodeHandle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IFR_GUID_LABEL *EndLabel;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 StartLabelNumber;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING_ID TextTwo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *AddressHead;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 PrefixLength;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IPv6_ADDRESS *Address;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((String == NULL) || (HiiHandle == NULL) || (AddressInfo == NULL)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (AddressType == Ip6ConfigNvHostAddress) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StartLabelNumber = HOST_ADDRESS_LABEL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (AddressType == Ip6ConfigNvGatewayAddress) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StartLabelNumber = GATEWAY_ADDRESS_LABEL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (AddressType == Ip6ConfigNvDnsAddress) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StartLabelNumber = DNS_ADDRESS_LABEL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (AddressType == Ip6ConfigNvRouteTable) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StartLabelNumber = ROUTE_TABLE_LABEL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_UNSUPPORTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Ip6CreateOpCode (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StartLabelNumber,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &StartOpCodeHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &StartLabel,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &EndOpCodeHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &EndLabel
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AddressHead = (UINT8 *) AddressInfo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < AddressCount; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (AddressType == Ip6ConfigNvHostAddress) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AddressInfo = AddressHead + sizeof (EFI_IP6_ADDRESS_INFO) * Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Address = &((EFI_IP6_ADDRESS_INFO *) AddressInfo)->Address;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (AddressType == Ip6ConfigNvRouteTable) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AddressInfo = AddressHead + sizeof (EFI_IP6_ROUTE_TABLE) * Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Address = &((EFI_IP6_ROUTE_TABLE *) AddressInfo)->Destination;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AddressInfo = AddressHead + sizeof (EFI_IPv6_ADDRESS) * Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Address = AddressInfo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Convert the IP address info to string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6ToStr (Address, String);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempStr = String + StrLen (String);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((AddressType == Ip6ConfigNvHostAddress) || (AddressType == Ip6ConfigNvRouteTable)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (AddressType == Ip6ConfigNvHostAddress) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrefixLength = ((EFI_IP6_ADDRESS_INFO *) AddressInfo)->PrefixLength;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrefixLength = ((EFI_IP6_ROUTE_TABLE *) AddressInfo)->PrefixLength;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Append the prefix length to the string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *TempStr = L'/';
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempStr++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Number = UnicodeSPrint (TempStr, 6, L"%d", PrefixLength);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempStr = TempStr + Number;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (AddressType == Ip6ConfigNvRouteTable) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Append " >> " to the string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Number = UnicodeSPrint (TempStr, 8, L" >> ");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempStr = TempStr + Number;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Append the gateway address to the string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6ToStr (&((EFI_IP6_ROUTE_TABLE *) AddressInfo)->Gateway, TempStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempStr = TempStr + StrLen (TempStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Generate a text opcode and update the UI.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TextTwo = HiiSetString (HiiHandle, 0, String, NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TextTwo == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiCreateTextOpCode (StartOpCodeHandle, STR_NULL, STR_NULL, TextTwo);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String = TempStr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *String = IP6_ADDRESS_DELIMITER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *(String - 1) = '\0';
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = HiiUpdateForm (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiHandle, // HII handle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gIp6ConfigNvDataGuid, // Formset GUID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FORMID_MAIN_FORM, // Form ID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StartOpCodeHandle, // Label for where to insert opcodes
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EndOpCodeHandle // Replace data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncExit:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiFreeOpCodeHandle (StartOpCodeHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiFreeOpCodeHandle (EndOpCodeHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Parse address list in string format and convert it to a list array of node in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_ADDRESS_INFO_ENTRY.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] String The buffer to string to be parsed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] ListHead The list head of array.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] AddressCount The number of list nodes in the array.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The operation finished successfully.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES Failed to perform the operation due to lack of resource.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIp6ParseAddressListFromString (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *String,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT LIST_ENTRY *ListHead,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINT32 *AddressCount
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *LocalString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *Temp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *TempStr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IP6_ADDRESS_INFO AddressInfo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_ADDRESS_INFO_ENTRY *Node;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN Last;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 Count;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((String == NULL) || (ListHead == NULL) || (AddressCount == NULL)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LocalString = (CHAR16 *) AllocateCopyPool (StrSize (String), String);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (LocalString == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Clean the original address list.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6FreeAddressInfoList (ListHead);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Temp = LocalString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Last = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Count = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (*LocalString != L'\0') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempStr = LocalString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while ((*LocalString != L'\0') && (*LocalString != IP6_ADDRESS_DELIMITER)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LocalString++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*LocalString == L'\0') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Last = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *LocalString = L'\0';
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = NetLibStrToIp6andPrefix (TempStr, &AddressInfo.Address, &AddressInfo.PrefixLength);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Error;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (AddressInfo.PrefixLength == 0xFF) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AddressInfo.PrefixLength = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!NetIp6IsValidUnicast (&AddressInfo.Address)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Error;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node = AllocatePool (sizeof (IP6_ADDRESS_INFO_ENTRY));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Node == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Error;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (&Node->AddrInfo, &AddressInfo, sizeof (EFI_IP6_ADDRESS_INFO));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InsertTailList (ListHead, &Node->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Count++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Last) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LocalString++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Temp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *AddressCount = Count;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncError:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6FreeAddressInfoList (ListHead);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Temp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function converts the interface info to string and draws it to the IP6 UI.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The interface information includes interface name, interface type, hardware address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync address info, and route table information. The address information is also used as the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync content of manual addresses in IP6 UI.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] IfInfo The pointer of EFI_IP6_CONFIG_INTERFACE_INFO.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] HiiHandle The handle that was previously registered in the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HII Database.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] IfrNvData Points to IP6_CONFIG_IFR_NVDATA.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The operation finished successfully.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES The operation failed due to lack of resources.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIp6ConvertInterfaceInfoToString (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_IP6_CONFIG_INTERFACE_INFO *IfInfo,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HII_HANDLE HiiHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT IP6_CONFIG_IFR_NVDATA *IfrNvData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Number;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *String;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *LinkLocalStr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 PortString[ADDRESS_STR_MAX_SIZE];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 FormatString[8];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING_ID StringId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((IfInfo == NULL) || (HiiHandle == NULL) || (IfrNvData == NULL)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Print the interface name.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringId = HiiSetString (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync STRING_TOKEN (STR_IP6_INTERFACE_NAME_CONTENT),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfInfo->Name,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StringId == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Print the interface type.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IfInfo->IfType == Ip6InterfaceTypeEthernet) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCpy (PortString, IP6_ETHERNET);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (IfInfo->IfType == Ip6InterfaceTypeExperimentalEthernet) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCpy (PortString, IP6_EXPERIMENTAL_ETHERNET);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Refer to RFC1700, chapter Number Hardware Type.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UnicodeSPrint (PortString, 6, L"%d", IfInfo->IfType);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringId = HiiSetString (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync STRING_TOKEN (STR_IP6_INTERFACE_TYPE_CONTENT),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PortString,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StringId == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Convert the hardware address.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String = PortString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (IfInfo->HwAddressSize <= 32);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < IfInfo->HwAddressSize; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IfInfo->HwAddress.Addr[Index] < 0x10) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCpy (FormatString, L"0%x-");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCpy (FormatString, L"%x-");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Number = UnicodeSPrint (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 8,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (CONST CHAR16 *) FormatString,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (UINTN) IfInfo->HwAddress.Addr[Index]
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String = String + Number;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Index != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (String > PortString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *String = '\0';
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Print the hardware address.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringId = HiiSetString (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync STRING_TOKEN (STR_IP6_MAC_ADDRESS_CONTENT),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PortString,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StringId == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Print the host address Information.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Ip6ConvertAddressListToString (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PortString,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6ConfigNvHostAddress,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfInfo->AddressInfo,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfInfo->AddressInfoCount
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Copy the Host Address Info to manual address field.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Do not copy the link local address.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LinkLocalStr = StrStr (PortString, IP6_LINK_LOCAL_PREFIX);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (LinkLocalStr != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Number = LinkLocalStr - PortString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Number > 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (IfrNvData->ManualAddress, PortString, Number * sizeof (CHAR16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while ((*LinkLocalStr != L' ') && (*LinkLocalStr != L'\0')) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LinkLocalStr++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*LinkLocalStr != L'\0') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LinkLocalStr++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCat (IfrNvData->ManualAddress, LinkLocalStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCpy (IfrNvData->ManualAddress, PortString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Print the route table information.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Ip6ConvertAddressListToString (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PortString,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6ConfigNvRouteTable,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfInfo->RouteTable,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfInfo->RouteCount
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Build the address info list from list array of node in IP6_ADDRESS_INFO_ENTRY.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Instance Points to IP6 config instance data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] AddressType The address type.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] AddressInfo The pointer to the buffer to store the address list.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] AddressSize The address size of the address list.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The operation finished successfully.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_UNSUPPORTED The AddressType is not supported.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIp6BuildNvAddressInfo (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN IP6_CONFIG_INSTANCE *Instance,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN IP6_CONFIG_NV_ADDRESS_TYPE AddressType,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT VOID **AddressInfo,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINTN *AddressSize
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_CONFIG_NVDATA *Ip6NvData;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *Entry;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *ListHead;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_ADDRESS_INFO_ENTRY *Node;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID *AddressList;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID *TmpStr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN DataSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IPv6_ADDRESS *Ip6Address;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IP6_CONFIG_MANUAL_ADDRESS *ManualAddress;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Instance == NULL) || (AddressInfo == NULL) || (AddressSize == NULL)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NET_CHECK_SIGNATURE (Instance, IP6_CONFIG_INSTANCE_SIGNATURE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6NvData = &Instance->Ip6NvData;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (AddressType == Ip6ConfigNvHostAddress) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ListHead = &Ip6NvData->ManualAddress;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataSize = sizeof (EFI_IP6_CONFIG_MANUAL_ADDRESS) * Ip6NvData->ManualAddressCount;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (AddressType == Ip6ConfigNvGatewayAddress) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ListHead = &Ip6NvData->GatewayAddress;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataSize = sizeof (EFI_IPv6_ADDRESS) * Ip6NvData->GatewayAddressCount;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (AddressType == Ip6ConfigNvDnsAddress) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ListHead = &Ip6NvData->DnsAddress;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataSize = sizeof (EFI_IPv6_ADDRESS) * Ip6NvData->DnsAddressCount;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_UNSUPPORTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AddressList = AllocateZeroPool (DataSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (AddressList == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TmpStr = AddressList;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NET_LIST_FOR_EACH (Entry, ListHead) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node = NET_LIST_USER_STRUCT (Entry, IP6_ADDRESS_INFO_ENTRY, Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (AddressType == Ip6ConfigNvHostAddress) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ManualAddress = (EFI_IP6_CONFIG_MANUAL_ADDRESS *) AddressList;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_COPY_ADDRESS (&ManualAddress->Address, &Node->AddrInfo.Address);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ManualAddress->PrefixLength = Node->AddrInfo.PrefixLength;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AddressList = (UINT8 *) AddressList + sizeof (EFI_IP6_CONFIG_MANUAL_ADDRESS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6Address = (EFI_IPv6_ADDRESS *) AddressList;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_COPY_ADDRESS (Ip6Address, &Node->AddrInfo.Address);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AddressList = (UINT8 *) AddressList + sizeof (EFI_IPv6_ADDRESS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *AddressInfo = TmpStr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *AddressSize = DataSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Convert the IP6 configuration data into the IFR data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] IfrNvData The IFR NV data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Instance The IP6 config instance data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The operation finished successfully.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_UNSUPPORTED The policy is not supported in the current implementation.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Others Other errors as indicated.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIp6ConvertConfigNvDataToIfrNvData (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT IP6_CONFIG_IFR_NVDATA *IfrNvData,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN IP6_CONFIG_INSTANCE *Instance
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_CONFIG_NVDATA *Ip6NvData;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IP6_CONFIG_PROTOCOL *Ip6Config;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN DataSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID *Data;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IP6_CONFIG_POLICY Policy;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IP6_CONFIG_DUP_ADDR_DETECT_TRANSMITS DadXmits;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_HANDLE HiiHandle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((IfrNvData == NULL) || (Instance == NULL)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NET_CHECK_SIGNATURE (Instance, IP6_CONFIG_INSTANCE_SIGNATURE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6Config = &Instance->Ip6Config;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6NvData = &Instance->Ip6NvData;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Data = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataSize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiHandle = Instance->CallbackInfo.RegisteredHandle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get the current interface info.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Ip6ConfigNvGetData (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6Config,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6ConfigDataTypeInterfaceInfo,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &DataSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID **) &Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Convert the interface info to string and print.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Ip6ConvertInterfaceInfoToString (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (EFI_IP6_CONFIG_INTERFACE_INFO *) Data,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfrNvData
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get the interface id.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataSize = sizeof (EFI_IP6_CONFIG_INTERFACE_ID);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (&Ip6NvData->InterfaceId, DataSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Ip6Config->GetData (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6Config,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6ConfigDataTypeAltInterfaceId,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &DataSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Ip6NvData->InterfaceId
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6ConvertInterfaceIdToString (IfrNvData->InterfaceId, &Ip6NvData->InterfaceId);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get current policy.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataSize = sizeof (EFI_IP6_CONFIG_POLICY);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Ip6Config->GetData (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6Config,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6ConfigDataTypePolicy,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &DataSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Policy
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Policy == Ip6ConfigPolicyManual) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfrNvData->Policy = IP6_POLICY_MANUAL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (Policy == Ip6ConfigPolicyAutomatic) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfrNvData->Policy = IP6_POLICY_AUTO;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (FALSE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_UNSUPPORTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get Duplicate Address Detection Transmits count.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataSize = sizeof (EFI_IP6_CONFIG_DUP_ADDR_DETECT_TRANSMITS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Ip6Config->GetData (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6Config,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6ConfigDataTypeDupAddrDetectTransmits,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &DataSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &DadXmits
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfrNvData->DadTransmitCount = DadXmits.DupAddrDetectTransmits;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get DNS server list.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Data);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Data = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataSize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Ip6ConfigNvGetData (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6Config,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6ConfigDataTypeDnsServer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &DataSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID **) &Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DataSize > 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Convert the DNS server address to string and draw it to UI.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Ip6ConvertAddressListToString (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfrNvData->DnsAddress,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6ConfigNvDnsAddress,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Data,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataSize / sizeof (EFI_IPv6_ADDRESS)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Data);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Data = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get gateway adderss list.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataSize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Ip6ConfigNvGetData (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6Config,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6ConfigDataTypeGateway,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &DataSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID **) &Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DataSize > 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Convert the gateway address to string and draw it to UI.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Ip6ConvertAddressListToString (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfrNvData->GatewayAddress,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6ConfigNvGatewayAddress,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Data,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataSize / sizeof (EFI_IPv6_ADDRESS)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncExit:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Data != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Data);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Convert IFR data into IP6 configuration data. The policy, alternative interface
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ID, and DAD transmit counts, and will be saved. If under manual policy, the configured
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync manual address, gateway address, and DNS server address will be saved.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] IfrNvData The IFR NV data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] Instance The IP6 config instance data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The operation finished successfully.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Others Other errors as indicated.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIp6ConvertIfrNvDataToConfigNvData (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN IP6_CONFIG_IFR_NVDATA *IfrNvData,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT IP6_CONFIG_INSTANCE *Instance
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_CONFIG_NVDATA *Ip6NvData;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IP6_CONFIG_PROTOCOL *Ip6Config;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IP6_CONFIG_MANUAL_ADDRESS *ManualAddress;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IPv6_ADDRESS *Address;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN IsAddressOk;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_EVENT SetAddressEvent;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_EVENT TimeoutEvent;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN DataSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((IfrNvData == NULL) || (Instance == NULL)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NET_CHECK_SIGNATURE (Instance, IP6_CONFIG_INSTANCE_SIGNATURE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6NvData = &Instance->Ip6NvData;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6Config = &Instance->Ip6Config;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Update those fields which don't have INTERACTIVE attribute.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IfrNvData->Policy == IP6_POLICY_AUTO) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6NvData->Policy = Ip6ConfigPolicyAutomatic;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (IfrNvData->Policy == IP6_POLICY_MANUAL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6NvData->Policy = Ip6ConfigPolicyManual;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6NvData->DadTransmitCount.DupAddrDetectTransmits = IfrNvData->DadTransmitCount;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Set the configured policy.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Ip6Config->SetData (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6Config,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6ConfigDataTypePolicy,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sizeof (EFI_IP6_CONFIG_POLICY),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Ip6NvData->Policy
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Set the duplicate address detection transmits count.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Ip6Config->SetData (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6Config,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6ConfigDataTypeDupAddrDetectTransmits,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sizeof (EFI_IP6_CONFIG_DUP_ADDR_DETECT_TRANSMITS),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Ip6NvData->DadTransmitCount
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Set the alternative interface ID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Ip6Config->SetData (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6Config,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6ConfigDataTypeAltInterfaceId,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sizeof (EFI_IP6_CONFIG_INTERFACE_ID),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Ip6NvData->InterfaceId
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Ip6NvData->Policy == Ip6ConfigPolicyAutomatic) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Create events & timers for asynchronous settings.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SetAddressEvent = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TimeoutEvent = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ManualAddress = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Address = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->CreateEvent (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EVT_NOTIFY_SIGNAL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TPL_NOTIFY,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6ConfigManualAddressNotify,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &IsAddressOk,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &SetAddressEvent
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->CreateEvent (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EVT_TIMER,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TPL_CALLBACK,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &TimeoutEvent
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Set the manual address list. This is an asynchronous process.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!IsListEmpty (&Ip6NvData->ManualAddress) && (Ip6NvData->ManualAddressCount != 0)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Ip6BuildNvAddressInfo (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6ConfigNvHostAddress,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID **) &ManualAddress,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &DataSize
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IsAddressOk = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Ip6Config->RegisterDataNotify (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6Config,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6ConfigDataTypeManualAddress,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SetAddressEvent
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Ip6Config->SetData (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6Config,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6ConfigDataTypeManualAddress,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID *) ManualAddress
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Status == EFI_NOT_READY) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->SetTimer (TimeoutEvent, TimerRelative, 50000000);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (EFI_ERROR (gBS->CheckEvent (TimeoutEvent))) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IsAddressOk) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Ip6Config->UnregisterDataNotify (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6Config,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6ConfigDataTypeManualAddress,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SetAddressEvent
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Set gateway address list.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!IsListEmpty (&Ip6NvData->GatewayAddress) && (Ip6NvData->GatewayAddressCount != 0)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Ip6BuildNvAddressInfo (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6ConfigNvGatewayAddress,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID **) &Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &DataSize
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Ip6Config->SetData (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6Config,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6ConfigDataTypeGateway,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID *) Address
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Address);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Address = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Set DNS server address list.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!IsListEmpty (&Ip6NvData->DnsAddress) && (Ip6NvData->DnsAddressCount != 0)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Ip6BuildNvAddressInfo (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6ConfigNvDnsAddress,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID **) &Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &DataSize
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Ip6Config->SetData (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6Config,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6ConfigDataTypeDnsServer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID *) Address
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncExit:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (SetAddressEvent != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->CloseEvent (SetAddressEvent);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TimeoutEvent != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->CloseEvent (TimeoutEvent);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ManualAddress != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (ManualAddress);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Address != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Address);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function allows the caller to request the current
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync configuration for one or more named elements. The resulting
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync string is in <ConfigAltResp> format. Any and all alternative
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync configuration strings shall also be appended to the end of the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync current configuration string. If they are, they must appear
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync after the current configuration. They must contain the same
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync routing (GUID, NAME, PATH) as the current configuration string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync They must have an additional description indicating the type of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync alternative configuration the string represents,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "ALTCFG=<StringToken>". That <StringToken> (when
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync converted from Hex UNICODE to binary) is a reference to a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync string in the associated string pack.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Request A null-terminated Unicode string in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <ConfigRequest> format. Note that this
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync includes the routing information as well as
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the configurable name / value pairs. It is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync invalid for this string to be in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <MultiConfigRequest> format.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Progress On return, points to a character in the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Request string. Points to the string's null
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync terminator if request was successful. Points
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync to the most recent "&" before the first
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync failing name / value pair (or the beginning
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync of the string if the failure is in the first
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync name / value pair) if the request was not
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync successful.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Results A null-terminated Unicode string in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <ConfigAltResp> format which has all values
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync filled in for the names in the Request string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String to be allocated by the called function.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The Results string is filled with the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync values corresponding to all requested
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync names.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES Not enough memory to store the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync parts of the results that must be
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync stored awaiting possible future
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync protocols.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER For example, passing in a NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for the Request parameter
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync would result in this type of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync error. In this case, the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Progress parameter would be
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync set to NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NOT_FOUND Routing data doesn't match any
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync known driver. Progress set to the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync first character in the routing header.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Note: There is no requirement that the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync driver validate the routing data. It
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync must skip the <ConfigHdr> in order to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync process the names.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER Illegal syntax. Progress set
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync to most recent & before the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync error or the beginning of the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER Unknown name. Progress points
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync to the & before the name in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync question. Currently not implemented.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIp6FormExtractConfig (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_STRING Request,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_STRING *Progress,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_STRING *Results
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_FORM_CALLBACK_INFO *Private;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_CONFIG_INSTANCE *Ip6ConfigInstance;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_CONFIG_IFR_NVDATA *IfrNvData;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING ConfigRequestHdr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING ConfigRequest;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN AllocatedRequest;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Size;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN BufferSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (This == NULL || Progress == NULL || Results == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Progress = Request;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Request != NULL) &&
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync !HiiIsConfigHdrMatch (Request, &gIp6ConfigNvDataGuid, mIp6ConfigStorageName)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigRequestHdr = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigRequest = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AllocatedRequest = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private = IP6_FORM_CALLBACK_INFO_FROM_CONFIG_ACCESS (This);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6ConfigInstance = IP6_CONFIG_INSTANCE_FROM_FORM_CALLBACK (Private);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BufferSize = sizeof (IP6_CONFIG_IFR_NVDATA);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfrNvData = (IP6_CONFIG_IFR_NVDATA *) AllocateZeroPool (BufferSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IfrNvData == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Ip6ConvertConfigNvDataToIfrNvData (IfrNvData, Ip6ConfigInstance);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigRequest = Request;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Request == NULL) || (StrStr (Request, L"OFFSET") == NULL)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Request has no request element, construct full request string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Allocate and fill a buffer large enough to hold the <ConfigHdr> template
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW" followed by a Null-terminator.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigRequestHdr = HiiConstructConfigHdr (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gIp6ConfigNvDataGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mIp6ConfigStorageName,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private->ChildHandle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigRequest = AllocateZeroPool (Size);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (ConfigRequest != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AllocatedRequest = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UnicodeSPrint (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigRequest,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"%s&OFFSET=0&WIDTH=%016LX",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigRequestHdr,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (UINT64) BufferSize
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (ConfigRequestHdr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Convert buffer data to <ConfigResp> by helper function BlockToConfig()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gHiiConfigRouting->BlockToConfig (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gHiiConfigRouting,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigRequest,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (UINT8 *) IfrNvData,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BufferSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Results,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Progress
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncExit:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (IfrNvData);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Free the allocated config request string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (AllocatedRequest) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (ConfigRequest);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigRequest = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Set Progress string to the original request string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Request == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Progress = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (StrStr (Request, L"OFFSET") == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Progress = Request + StrLen (Request);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function applies changes in a driver's configuration.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Input is a Configuration, which has the routing data for this
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync driver followed by name / value configuration pairs. The driver
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync must apply those pairs to its configurable storage. If the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync driver's configuration is stored in a linear block of data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync and the driver's name / value pairs are in <BlockConfig>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync format, it may use the ConfigToBlock helper function (above) to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync simplify the job. Currently not implemented.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Configuration A null-terminated Unicode string in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync <ConfigString> format.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Progress A pointer to a string filled in with the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync offset of the most recent '&' before the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync first failing name / value pair (or the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync beginn ing of the string if the failure
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync is in the first name / value pair) or
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the terminating NULL if all was
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync successful.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The results have been distributed or are
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync awaiting distribution.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_MEMORY Not enough memory to store the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync parts of the results that must be
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync stored awaiting possible future
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync protocols.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETERS Passing in a NULL for the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Results parameter would result
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync in this type of error.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NOT_FOUND Target for the specified routing data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync was not found.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIp6FormRouteConfig (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_STRING Configuration,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_STRING *Progress
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (This == NULL || Configuration == NULL || Progress == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check routing data in <ConfigHdr>.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Note: if only one Storage is used, then this checking could be skipped.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!HiiIsConfigHdrMatch (Configuration, &gIp6ConfigNvDataGuid, mIp6ConfigStorageName)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Progress = Configuration;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Progress = Configuration + StrLen (Configuration);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function is called to provide results data to the driver.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This data consists of a unique key that is used to identify
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync which data is either being passed back or being asked for.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Action Specifies the type of action taken by the browser.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] QuestionId A unique value which is sent to the original
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync exporting driver so that it can identify the type
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync of data to expect. The format of the data tends to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync vary based on the opcode that generated the callback.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Type The type of value for the question.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Value A pointer to the data being sent to the original
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync exporting driver.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] ActionRequest On return, points to the action requested by the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync callback function.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The callback successfully handled the action.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync variable and its data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR The variable could not be saved.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_UNSUPPORTED The specified Action is not supported by the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync callback. Currently not implemented.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER Passed in the wrong parameter.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Others Other errors as indicated.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIp6FormCallback (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_BROWSER_ACTION Action,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_QUESTION_ID QuestionId,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 Type,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_IFR_TYPE_VALUE *Value,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_FORM_CALLBACK_INFO *Private;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN BufferSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_CONFIG_IFR_NVDATA *IfrNvData;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_INPUT_KEY Key;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_CONFIG_INSTANCE *Instance;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_CONFIG_NVDATA *Ip6NvData;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IP6_CONFIG_PROTOCOL *Ip6Config;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IP6_CONFIG_INTERFACE_INFO *Data;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN DataSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 PortString[ADDRESS_STR_MAX_SIZE];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_HANDLE HiiHandle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IP6_CONFIG_INTERFACE_INFO *IfInfo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (This == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Private = IP6_FORM_CALLBACK_INFO_FROM_CONFIG_ACCESS (This);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Instance = IP6_CONFIG_INSTANCE_FROM_FORM_CALLBACK (Private);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6NvData = &Instance->Ip6NvData;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Action == EFI_BROWSER_ACTION_FORM_OPEN) || (Action == EFI_BROWSER_ACTION_FORM_CLOSE)){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Action != EFI_BROWSER_ACTION_CHANGING && Action != EFI_BROWSER_ACTION_CHANGED) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_UNSUPPORTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Value == NULL) || (ActionRequest == NULL)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Retrieve uncommitted data from Browser
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BufferSize = sizeof (IP6_CONFIG_IFR_NVDATA);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfrNvData = AllocateZeroPool (BufferSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IfrNvData == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiGetBrowserData (NULL, NULL, BufferSize, (UINT8 *) IfrNvData);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Action == EFI_BROWSER_ACTION_CHANGING) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (QuestionId) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case KEY_GET_CURRENT_SETTING:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6Config = &Instance->Ip6Config;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiHandle = Instance->CallbackInfo.RegisteredHandle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Data = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get current interface info.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Ip6ConfigNvGetData (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6Config,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6ConfigDataTypeInterfaceInfo,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &DataSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID **) &Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Generate dynamic text opcode for host address and draw it.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfInfo = (EFI_IP6_CONFIG_INTERFACE_INFO *) Data;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Ip6ConvertAddressListToString (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PortString,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6ConfigNvHostAddress,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfInfo->AddressInfo,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfInfo->AddressInfoCount
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Data);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Generate the dynamic text opcode for route table and draw it.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Ip6ConvertAddressListToString (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PortString,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6ConfigNvRouteTable,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfInfo->RouteTable,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfInfo->RouteCount
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Data);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get DNS server list.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Data);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataSize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Data = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Ip6ConfigNvGetData (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6Config,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6ConfigDataTypeDnsServer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &DataSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID **) &Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Data != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Data);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DataSize > 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Generate the dynamic text opcode for DNS server and draw it.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Ip6ConvertAddressListToString (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PortString,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6ConfigNvDnsAddress,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Data,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataSize / sizeof (EFI_IPv6_ADDRESS)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Data);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get gateway adderss list.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Data != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Data);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataSize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Data = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Ip6ConfigNvGetData (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6Config,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6ConfigDataTypeGateway,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &DataSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID **) &Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Data != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Data);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DataSize > 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Generate the dynamic text opcode for gateway and draw it.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Ip6ConvertAddressListToString (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PortString,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6ConfigNvGatewayAddress,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Data,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DataSize / sizeof (EFI_IPv6_ADDRESS)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Data);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Data != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Data);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (Action == EFI_BROWSER_ACTION_CHANGED) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (QuestionId) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case KEY_SAVE_CONFIG_CHANGES:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case KEY_IGNORE_CONFIG_CHANGES:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6FreeAddressInfoList (&Ip6NvData->ManualAddress);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6FreeAddressInfoList (&Ip6NvData->GatewayAddress);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6FreeAddressInfoList (&Ip6NvData->DnsAddress);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6NvData->ManualAddressCount = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6NvData->GatewayAddressCount = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6NvData->DnsAddressCount = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_DISCARD_EXIT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case KEY_SAVE_CHANGES:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Ip6ConvertIfrNvDataToConfigNvData (IfrNvData, Instance);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *ActionRequest = EFI_BROWSER_ACTION_REQUEST_SUBMIT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case KEY_INTERFACE_ID:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Ip6ParseInterfaceIdFromString (IfrNvData->InterfaceId, &Ip6NvData->InterfaceId);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CreatePopUp (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Key,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"Invalid Interface ID!",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case KEY_MANUAL_ADDRESS:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Ip6ParseAddressListFromString (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfrNvData->ManualAddress,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Ip6NvData->ManualAddress,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Ip6NvData->ManualAddressCount
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CreatePopUp (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Key,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"Invalid Host Addresses!",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case KEY_GATEWAY_ADDRESS:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Ip6ParseAddressListFromString (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfrNvData->GatewayAddress,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Ip6NvData->GatewayAddress,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Ip6NvData->GatewayAddressCount
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CreatePopUp (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Key,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"Invalid Gateway Addresses!",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case KEY_DNS_ADDRESS:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Ip6ParseAddressListFromString (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IfrNvData->DnsAddress,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Ip6NvData->DnsAddress,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Ip6NvData->DnsAddressCount
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CreatePopUp (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Key,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"Invalid DNS Addresses!",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Pass changed uncommitted data back to Form Browser.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BufferSize = sizeof (IP6_CONFIG_IFR_NVDATA);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiSetBrowserData (NULL, NULL, BufferSize, (UINT8 *) IfrNvData, NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (IfrNvData);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Install HII Config Access protocol for network device and allocate resources.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] Instance The IP6_CONFIG_INSTANCE to create a form.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The HII Config Access protocol is installed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Others Other errors as indicated.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIp6ConfigFormInit (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT IP6_CONFIG_INSTANCE *Instance
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_SERVICE *IpSb;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_FORM_CALLBACK_INFO *CallbackInfo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_CONFIG_ACCESS_PROTOCOL *ConfigAccess;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VENDOR_DEVICE_PATH VendorDeviceNode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_SERVICE_BINDING_PROTOCOL *MnpSb;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *MacString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 MenuString[128];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 PortString[128];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *OldMenuString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IpSb = IP6_SERVICE_FROM_IP6_CONFIG_INSTANCE (Instance);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (IpSb != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->HandleProtocol (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IpSb->Controller,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiDevicePathProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID **) &ParentDevicePath
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CallbackInfo = &Instance->CallbackInfo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CallbackInfo->Signature = IP6_FORM_CALLBACK_INFO_SIGNATURE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Construct device path node for EFI HII Config Access protocol,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // which consists of controller physical device path and one hardware
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // vendor guid node.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (&VendorDeviceNode, sizeof (VENDOR_DEVICE_PATH));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VendorDeviceNode.Header.Type = HARDWARE_DEVICE_PATH;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VendorDeviceNode.Header.SubType = HW_VENDOR_DP;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyGuid (&VendorDeviceNode.Guid, &gEfiCallerIdGuid);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SetDevicePathNodeLength (&VendorDeviceNode.Header, sizeof (VENDOR_DEVICE_PATH));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CallbackInfo->HiiVendorDevicePath = AppendDevicePathNode (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ParentDevicePath,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (EFI_DEVICE_PATH_PROTOCOL *) &VendorDeviceNode
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CallbackInfo->HiiVendorDevicePath == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Error;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigAccess = &CallbackInfo->HiiConfigAccess;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigAccess->ExtractConfig = Ip6FormExtractConfig;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigAccess->RouteConfig = Ip6FormRouteConfig;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigAccess->Callback = Ip6FormCallback;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Install Device Path Protocol and Config Access protocol on new handle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->InstallMultipleProtocolInterfaces (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &CallbackInfo->ChildHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiDevicePathProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CallbackInfo->HiiVendorDevicePath,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiHiiConfigAccessProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigAccess,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Open the Parent Handle for the child
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->OpenProtocol (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IpSb->Controller,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiManagedNetworkServiceBindingProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID **) &MnpSb,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IpSb->Image,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CallbackInfo->ChildHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Error;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Publish our HII data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CallbackInfo->RegisteredHandle = HiiAddPackages (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gIp6ConfigNvDataGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CallbackInfo->ChildHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6DxeStrings,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6ConfigBin,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CallbackInfo->RegisteredHandle == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Error;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Append MAC string in the menu help string and tile help string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = NetLibGetMacString (IpSb->Controller, IpSb->Image, &MacString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OldMenuString = HiiGetString (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CallbackInfo->RegisteredHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync STRING_TOKEN (STR_IP6_CONFIG_FORM_HELP),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UnicodeSPrint (MenuString, 128, L"%s (MAC:%s)", OldMenuString, MacString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiSetString (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CallbackInfo->RegisteredHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync STRING_TOKEN (STR_IP6_CONFIG_FORM_HELP),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MenuString,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UnicodeSPrint (PortString, 128, L"MAC:%s", MacString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiSetString (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CallbackInfo->RegisteredHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync STRING_TOKEN (STR_IP6_DEVICE_FORM_HELP),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PortString,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (MacString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (OldMenuString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InitializeListHead (&Instance->Ip6NvData.ManualAddress);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InitializeListHead (&Instance->Ip6NvData.GatewayAddress);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InitializeListHead (&Instance->Ip6NvData.DnsAddress);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncError:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6ConfigFormUnload (Instance);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Uninstall the HII Config Access protocol for network devices and free up the resources.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] Instance The IP6_CONFIG_INSTANCE to unload a form.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIp6ConfigFormUnload (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT IP6_CONFIG_INSTANCE *Instance
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_SERVICE *IpSb;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_FORM_CALLBACK_INFO *CallbackInfo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP6_CONFIG_NVDATA *Ip6NvData;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IpSb = IP6_SERVICE_FROM_IP6_CONFIG_INSTANCE (Instance);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (IpSb != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CallbackInfo = &Instance->CallbackInfo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CallbackInfo->ChildHandle != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Close the child handle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->CloseProtocol (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IpSb->Controller,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiManagedNetworkServiceBindingProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IpSb->Image,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CallbackInfo->ChildHandle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Uninstall EFI_HII_CONFIG_ACCESS_PROTOCOL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->UninstallMultipleProtocolInterfaces (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CallbackInfo->ChildHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiDevicePathProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CallbackInfo->HiiVendorDevicePath,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiHiiConfigAccessProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &CallbackInfo->HiiConfigAccess,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CallbackInfo->HiiVendorDevicePath != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (CallbackInfo->HiiVendorDevicePath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CallbackInfo->RegisteredHandle != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Remove HII package list
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiRemovePackages (CallbackInfo->RegisteredHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6NvData = &Instance->Ip6NvData;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6FreeAddressInfoList (&Ip6NvData->ManualAddress);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6FreeAddressInfoList (&Ip6NvData->GatewayAddress);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6FreeAddressInfoList (&Ip6NvData->DnsAddress);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6NvData->ManualAddressCount = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6NvData->GatewayAddressCount = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6NvData->DnsAddressCount = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}