4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Network library.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCopyright (c) 2005 - 2011, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncThis program and the accompanying materials
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncare licensed and made available under the terms and conditions of the BSD License
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncwhich accompanies this distribution. The full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynchttp://opensource.org/licenses/bsd-license.php
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncTHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Uefi.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <IndustryStandard/SmBios.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Protocol/DriverBinding.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Protocol/ServiceBinding.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Protocol/SimpleNetwork.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Protocol/ManagedNetwork.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Protocol/HiiConfigRouting.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Protocol/ComponentName.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Protocol/ComponentName2.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Protocol/HiiConfigAccess.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Guid/NicIp4ConfigNvData.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Guid/SmBios.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/NetLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/BaseLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/DebugLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/BaseMemoryLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/UefiBootServicesTableLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/UefiRuntimeServicesTableLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/MemoryAllocationLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/DevicePathLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/HiiLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/PrintLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/UefiLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define NIC_ITEM_CONFIG_SIZE sizeof (NIC_IP4_CONFIG_INFO) + sizeof (EFI_IP4_ROUTE_TABLE) * MAX_IP4_CONFIG_IN_VARIABLE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// All the supported IP4 maskes in host byte order.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncGLOBAL_REMOVE_IF_UNREFERENCED IP4_ADDR gIp4AllMasks[IP4_MASK_NUM] = {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x00000000,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0x80000000,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0xC0000000,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0xE0000000,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0xF0000000,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0xF8000000,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0xFC000000,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0xFE000000,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0xFF000000,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0xFF800000,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0xFFC00000,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0xFFE00000,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0xFFF00000,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0xFFF80000,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0xFFFC0000,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0xFFFE0000,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0xFFFF0000,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0xFFFF8000,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0xFFFFC000,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0xFFFFE000,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0xFFFFF000,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0xFFFFF800,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0xFFFFFC00,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0xFFFFFE00,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0xFFFFFF00,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0xFFFFFF80,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0xFFFFFFC0,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0xFFFFFFE0,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0xFFFFFFF0,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0xFFFFFFF8,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0xFFFFFFFC,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0xFFFFFFFE,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0xFFFFFFFF,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync};
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncGLOBAL_REMOVE_IF_UNREFERENCED EFI_IPv4_ADDRESS mZeroIp4Addr = {{0, 0, 0, 0}};
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// Any error level digitally larger than mNetDebugLevelMax
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// will be silently discarded.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncGLOBAL_REMOVE_IF_UNREFERENCED UINTN mNetDebugLevelMax = NETDEBUG_LEVEL_ERROR;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncGLOBAL_REMOVE_IF_UNREFERENCED UINT32 mSyslogPacketSeq = 0xDEADBEEF;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// You can change mSyslogDstMac mSyslogDstIp and mSyslogSrcIp
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// here to direct the syslog packets to the syslog deamon. The
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// default is broadcast to both the ethernet and IP.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncGLOBAL_REMOVE_IF_UNREFERENCED UINT8 mSyslogDstMac[NET_ETHER_ADDR_LEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncGLOBAL_REMOVE_IF_UNREFERENCED UINT32 mSyslogDstIp = 0xffffffff;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncGLOBAL_REMOVE_IF_UNREFERENCED UINT32 mSyslogSrcIp = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncGLOBAL_REMOVE_IF_UNREFERENCED CHAR8 *mMonthName[] = {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "Jan",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "Feb",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "Mar",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "Apr",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "May",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "Jun",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "Jul",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "Aug",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "Sep",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "Oct",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "Nov",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "Dec"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync};
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// VLAN device path node template
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncGLOBAL_REMOVE_IF_UNREFERENCED VLAN_DEVICE_PATH mNetVlanDevicePathTemplate = {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MESSAGING_DEVICE_PATH,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MSG_VLAN_DP,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (UINT8) (sizeof (VLAN_DEVICE_PATH)),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (UINT8) ((sizeof (VLAN_DEVICE_PATH)) >> 8)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync },
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync};
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Locate the handles that support SNP, then open one of them
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync to send the syslog packets. The caller isn't required to close
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the SNP after use because the SNP is opened by HandleProtocol.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The point to SNP if one is properly openned. Otherwise NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_SIMPLE_NETWORK_PROTOCOL *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSyslogLocateSnp (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_SIMPLE_NETWORK_PROTOCOL *Snp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HANDLE *Handles;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN HandleCount;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Locate the handles which has SNP installed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Handles = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->LocateHandleBuffer (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ByProtocol,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiSimpleNetworkProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &HandleCount,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Handles
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status) || (HandleCount == 0)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Try to open one of the ethernet SNP protocol to send packet
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Snp = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < HandleCount; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->HandleProtocol (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Handles[Index],
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiSimpleNetworkProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID **) &Snp
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Status == EFI_SUCCESS) && (Snp != NULL) &&
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (Snp->Mode->IfType == NET_IFTYPE_ETHERNET) &&
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (Snp->Mode->MaxPacketSize >= NET_SYSLOG_PACKET_LEN)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Snp = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Handles);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Snp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Transmit a syslog packet synchronously through SNP. The Packet
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync already has the ethernet header prepended. This function should
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fill in the source MAC because it will try to locate a SNP each
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync time it is called to avoid the problem if SNP is unloaded.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This code snip is copied from MNP.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Packet The Syslog packet
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Length The length of the packet
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR Failed to locate a usable SNP protocol
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_TIMEOUT Timeout happened to send the packet.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Packet is sent.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSyslogSendPacket (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CHAR8 *Packet,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT32 Length
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_SIMPLE_NETWORK_PROTOCOL *Snp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ETHER_HEAD *Ether;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_EVENT TimeoutEvent;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *TxBuf;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Snp = SyslogLocateSnp ();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Snp == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_DEVICE_ERROR;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ether = (ETHER_HEAD *) Packet;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (Ether->SrcMac, Snp->Mode->CurrentAddress.Addr, NET_ETHER_ADDR_LEN);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Start the timeout event.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->CreateEvent (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EVT_TIMER,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TPL_NOTIFY,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &TimeoutEvent
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->SetTimer (TimeoutEvent, TimerRelative, NET_SYSLOG_TX_TIMEOUT);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto ON_EXIT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (;;) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Transmit the packet through SNP.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Snp->Transmit (Snp, 0, Length, Packet, NULL, NULL, NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Status != EFI_SUCCESS) && (Status != EFI_NOT_READY)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_DEVICE_ERROR;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If Status is EFI_SUCCESS, the packet is put in the transmit queue.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // if Status is EFI_NOT_READY, the transmit engine of the network
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // interface is busy. Both need to sync SNP.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TxBuf = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync do {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get the recycled transmit buffer status.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Snp->GetStatus (Snp, NULL, (VOID **) &TxBuf);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR (gBS->CheckEvent (TimeoutEvent))) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_TIMEOUT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } while (TxBuf == NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Status == EFI_SUCCESS) || (Status == EFI_TIMEOUT)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Status is EFI_NOT_READY. Restart the timer event and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // call Snp->Transmit again.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->SetTimer (TimeoutEvent, TimerRelative, NET_SYSLOG_TX_TIMEOUT);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->SetTimer (TimeoutEvent, TimerCancel, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncON_EXIT:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->CloseEvent (TimeoutEvent);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Build a syslog packet, including the Ethernet/Ip/Udp headers
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync and user's message.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Level Syslog servity level
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Module The module that generates the log
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] File The file that contains the current log
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Line The line of code in the File that contains the current log
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Message The log message
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] BufLen The lenght of the Buf
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Buf The buffer to put the packet data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The length of the syslog packet built.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT32
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSyslogBuildPacket (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT32 Level,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 *Module,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 *File,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT32 Line,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 *Message,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT32 BufLen,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT CHAR8 *Buf
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ETHER_HEAD *Ether;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP4_HEAD *Ip4;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_UDP_HEADER *Udp4;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_TIME Time;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 Pri;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 Len;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Fill in the Ethernet header. Leave alone the source MAC.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // SyslogSendPacket will fill in the address for us.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ether = (ETHER_HEAD *) Buf;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (Ether->DstMac, mSyslogDstMac, NET_ETHER_ADDR_LEN);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (Ether->SrcMac, NET_ETHER_ADDR_LEN);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ether->EtherType = HTONS (0x0800); // IPv4 protocol
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buf += sizeof (ETHER_HEAD);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BufLen -= sizeof (ETHER_HEAD);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Fill in the IP header
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip4 = (IP4_HEAD *) Buf;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip4->HeadLen = 5;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip4->Ver = 4;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip4->Tos = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip4->TotalLen = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip4->Id = (UINT16) mSyslogPacketSeq;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip4->Fragment = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip4->Ttl = 16;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip4->Protocol = 0x11;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip4->Checksum = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip4->Src = mSyslogSrcIp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip4->Dst = mSyslogDstIp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buf += sizeof (IP4_HEAD);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BufLen -= sizeof (IP4_HEAD);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Fill in the UDP header, Udp checksum is optional. Leave it zero.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Udp4 = (EFI_UDP_HEADER *) Buf;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Udp4->SrcPort = HTONS (514);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Udp4->DstPort = HTONS (514);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Udp4->Length = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Udp4->Checksum = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buf += sizeof (EFI_UDP_HEADER);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BufLen -= sizeof (EFI_UDP_HEADER);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Build the syslog message body with <PRI> Timestamp machine module Message
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Pri = ((NET_SYSLOG_FACILITY & 31) << 3) | (Level & 7);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gRT->GetTime (&Time, NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT ((Time.Month <= 12) && (Time.Month >= 1));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Use %a to format the ASCII strings, %s to format UNICODE strings
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Len = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Len += (UINT32) AsciiSPrint (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buf,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BufLen,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "<%d> %a %d %d:%d:%d ",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Pri,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mMonthName [Time.Month-1],
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Time.Day,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Time.Hour,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Time.Minute,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Time.Second
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Len--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Len += (UINT32) AsciiSPrint (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buf + Len,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BufLen - Len,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "Tiano %a: %a (Line: %d File: %a)",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Module,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Message,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Line,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Len--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // OK, patch the IP length/checksum and UDP length fields.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Len += sizeof (EFI_UDP_HEADER);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Udp4->Length = HTONS ((UINT16) Len);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Len += sizeof (IP4_HEAD);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip4->TotalLen = HTONS ((UINT16) Len);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip4->Checksum = (UINT16) (~NetblockChecksum ((UINT8 *) Ip4, sizeof (IP4_HEAD)));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Len + sizeof (ETHER_HEAD);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Allocate a buffer, then format the message to it. This is a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync help function for the NET_DEBUG_XXX macros. The PrintArg of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync these macros treats the variable length print parameters as a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync single parameter, and pass it to the NetDebugASPrint. For
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync example, NET_DEBUG_TRACE ("Tcp", ("State transit to %a\n", Name))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if extracted to:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NetDebugOutput (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NETDEBUG_LEVEL_TRACE,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "Tcp",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync __FILE__,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync __LINE__,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NetDebugASPrint ("State transit to %a\n", Name)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Format The ASCII format string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param ... The variable length parameter whose format is determined
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync by the Format string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The buffer containing the formatted message,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync or NULL if failed to allocate memory.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCHAR8 *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNetDebugASPrint (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CHAR8 *Format,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VA_LIST Marker;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR8 *Buf;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buf = (CHAR8 *) AllocatePool (NET_DEBUG_MSG_LEN);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Buf == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VA_START (Marker, Format);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AsciiVSPrint (Buf, NET_DEBUG_MSG_LEN, Format, Marker);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VA_END (Marker);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Buf;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Builds an UDP4 syslog packet and send it using SNP.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function will locate a instance of SNP then send the message through it.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Because it isn't open the SNP BY_DRIVER, apply caution when using it.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Level The servity level of the message.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Module The Moudle that generates the log.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param File The file that contains the log.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Line The exact line that contains the log.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Message The user message to log.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES Failed to allocate memory for the packet
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The log is discard because that it is more verbose
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync than the mNetDebugLevelMax. Or, it has been sent out.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNetDebugOutput (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT32 Level,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 *Module,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 *File,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT32 Line,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 *Message
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR8 *Packet;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 Len;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check whether the message should be sent out
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Message == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Level > mNetDebugLevelMax) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto ON_EXIT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Allocate a maxium of 1024 bytes, the caller should ensure
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // that the message plus the ethernet/ip/udp header is shorter
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // than this
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Packet = (CHAR8 *) AllocatePool (NET_SYSLOG_PACKET_LEN);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Packet == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto ON_EXIT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Build the message: Ethernet header + IP header + Udp Header + user data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Len = SyslogBuildPacket (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Level,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Module,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Line,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Message,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NET_SYSLOG_PACKET_LEN,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Packet
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mSyslogPacketSeq++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = SyslogSendPacket (Packet, Len);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Packet);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncON_EXIT:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Message);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Return the length of the mask.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Return the length of the mask, the correct value is from 0 to 32.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If the mask is invalid, return the invalid length 33, which is IP4_MASK_NUM.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NetMask is in the host byte order.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] NetMask The netmask to get the length from.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The length of the netmask, IP4_MASK_NUM if the mask is invalid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncINTN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNetGetMaskLength (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN IP4_ADDR NetMask
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync INTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < IP4_MASK_NUM; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NetMask == gIp4AllMasks[Index]) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Return the class of the IP address, such as class A, B, C.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Addr is in host byte order.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The address of class A starts with 0.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If the address belong to class A, return IP4_ADDR_CLASSA.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The address of class B starts with 10.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If the address belong to class B, return IP4_ADDR_CLASSB.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The address of class C starts with 110.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If the address belong to class C, return IP4_ADDR_CLASSC.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The address of class D starts with 1110.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If the address belong to class D, return IP4_ADDR_CLASSD.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The address of class E starts with 1111.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If the address belong to class E, return IP4_ADDR_CLASSE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Addr The address to get the class from.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return IP address class, such as IP4_ADDR_CLASSA.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncINTN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNetGetIpClass (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN IP4_ADDR Addr
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 ByteOne;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ByteOne = (UINT8) (Addr >> 24);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((ByteOne & 0x80) == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return IP4_ADDR_CLASSA;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if ((ByteOne & 0xC0) == 0x80) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return IP4_ADDR_CLASSB;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if ((ByteOne & 0xE0) == 0xC0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return IP4_ADDR_CLASSC;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if ((ByteOne & 0xF0) == 0xE0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return IP4_ADDR_CLASSD;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return IP4_ADDR_CLASSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Check whether the IP is a valid unicast address according to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the netmask. If NetMask is zero, use the IP address's class to get the default mask.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Ip is 0, IP is not a valid unicast address.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Class D address is used for multicasting and class E address is reserved for future. If Ip
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync belongs to class D or class E, IP is not a valid unicast address.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If all bits of the host address of IP are 0 or 1, IP is also not a valid unicast address.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Ip The IP to check against.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] NetMask The mask of the IP.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return TRUE if IP is a valid unicast address on the network, otherwise FALSE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBOOLEAN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNetIp4IsUnicast (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN IP4_ADDR Ip,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN IP4_ADDR NetMask
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync INTN Class;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Class = NetGetIpClass (Ip);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Ip == 0) || (Class >= IP4_ADDR_CLASSD)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NetMask == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NetMask = gIp4AllMasks[Class << 3];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (((Ip &~NetMask) == ~NetMask) || ((Ip &~NetMask) == 0)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Check whether the incoming IPv6 address is a valid unicast address.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If the address is a multicast address has binary 0xFF at the start, it is not
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync a valid unicast address. If the address is unspecified ::, it is not a valid
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync unicast address to be assigned to any node. If the address is loopback address
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ::1, it is also not a valid unicast address to be assigned to any physical
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync interface.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Ip6 The IPv6 address to check against.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return TRUE if Ip6 is a valid unicast address on the network, otherwise FALSE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBOOLEAN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNetIp6IsValidUnicast (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_IPv6_ADDRESS *Ip6
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 Byte;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Ip6->Addr[0] == 0xFF) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < 15; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Ip6->Addr[Index] != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Byte = Ip6->Addr[Index];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Byte == 0x0 || Byte == 0x1) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Check whether the incoming Ipv6 address is the unspecified address or not.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Ip6 - Ip6 address, in network order.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval TRUE - Yes, unspecified
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE - No
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBOOLEAN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNetIp6IsUnspecifiedAddr (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_IPv6_ADDRESS *Ip6
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < 16; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Ip6->Addr[Index] != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Check whether the incoming Ipv6 address is a link-local address.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Ip6 - Ip6 address, in network order.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval TRUE - Yes, link-local address
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE - No
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBOOLEAN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNetIp6IsLinkLocalAddr (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_IPv6_ADDRESS *Ip6
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Ip6 != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Ip6->Addr[0] != 0xFE) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Ip6->Addr[1] != 0x80) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 2; Index < 8; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Ip6->Addr[Index] != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Check whether the Ipv6 address1 and address2 are on the connected network.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Ip1 - Ip6 address1, in network order.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Ip2 - Ip6 address2, in network order.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] PrefixLength - The prefix length of the checking net.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval TRUE - Yes, connected.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE - No.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBOOLEAN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNetIp6IsNetEqual (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IPv6_ADDRESS *Ip1,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IPv6_ADDRESS *Ip2,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 PrefixLength
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 Byte;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 Bit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 Mask;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT ((Ip1 != NULL) && (Ip2 != NULL) && (PrefixLength < IP6_PREFIX_NUM));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (PrefixLength == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Byte = (UINT8) (PrefixLength / 8);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Bit = (UINT8) (PrefixLength % 8);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CompareMem (Ip1, Ip2, Byte) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Bit > 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Mask = (UINT8) (0xFF << (8 - Bit));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Byte < 16);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Ip1->Addr[Byte] & Mask) != (Ip2->Addr[Byte] & Mask)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Switches the endianess of an IPv6 address
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function swaps the bytes in a 128-bit IPv6 address to switch the value
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync from little endian to big endian or vice versa. The byte swapped value is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Ip6 Points to an IPv6 address
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The byte swapped IPv6 address.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_IPv6_ADDRESS *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIp6Swap128 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_IPv6_ADDRESS *Ip6
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT64 High;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT64 Low;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (&High, Ip6, sizeof (UINT64));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (&Low, &Ip6->Addr[8], sizeof (UINT64));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync High = SwapBytes64 (High);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Low = SwapBytes64 (Low);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (Ip6, &Low, sizeof (UINT64));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (&Ip6->Addr[8], &High, sizeof (UINT64));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Ip6;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Initialize a random seed using current time.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Get current time first. Then initialize a random seed based on some basic
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync mathematics operation on the hour, day, minute, second, nanosecond and year
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync of the current time.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The random seed initialized with current time.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT32
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNetRandomInitSeed (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_TIME Time;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 Seed;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gRT->GetTime (&Time, NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Seed = (~Time.Hour << 24 | Time.Day << 16 | Time.Minute << 8 | Time.Second);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Seed ^= Time.Nanosecond;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Seed ^= Time.Year << 7;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Seed;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Extract a UINT32 from a byte stream.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Copy a UINT32 from a byte stream, then converts it from Network
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync byte order to host byte order. Use this function to avoid alignment error.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Buf The buffer to extract the UINT32.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The UINT32 extracted.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT32
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNetGetUint32 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 *Buf
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 Value;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (&Value, Buf, sizeof (UINT32));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NTOHL (Value);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Put a UINT32 to the byte stream in network byte order.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Converts a UINT32 from host byte order to network byte order. Then copy it to the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync byte stream.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] Buf The buffer to put the UINT32.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Data The data to be converted and put into the byte stream.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNetPutUint32 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT UINT8 *Buf,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT32 Data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Data = HTONL (Data);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (Buf, &Data, sizeof (UINT32));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Remove the first node entry on the list, and return the removed node entry.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Removes the first node Entry from a doubly linked list. It is up to the caller of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync this function to release the memory used by the first node if that is required. On
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync exit, the removed node is returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Head is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Head was not initialized, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If PcdMaximumLinkedListLength is not zero, and the number of nodes in the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync linked list including the head node is greater than or equal to PcdMaximumLinkedListLength,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] Head The list header.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The first node entry that is removed from the list, NULL if the list is empty.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncLIST_ENTRY *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNetListRemoveHead (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT LIST_ENTRY *Head
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *First;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Head != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IsListEmpty (Head)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync First = Head->ForwardLink;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Head->ForwardLink = First->ForwardLink;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync First->ForwardLink->BackLink = Head;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG_CODE (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync First->ForwardLink = (LIST_ENTRY *) NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync First->BackLink = (LIST_ENTRY *) NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return First;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Remove the last node entry on the list and and return the removed node entry.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Removes the last node entry from a doubly linked list. It is up to the caller of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync this function to release the memory used by the first node if that is required. On
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync exit, the removed node is returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Head is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Head was not initialized, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If PcdMaximumLinkedListLength is not zero, and the number of nodes in the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync linked list including the head node is greater than or equal to PcdMaximumLinkedListLength,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] Head The list head.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The last node entry that is removed from the list, NULL if the list is empty.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncLIST_ENTRY *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNetListRemoveTail (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT LIST_ENTRY *Head
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *Last;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Head != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IsListEmpty (Head)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Last = Head->BackLink;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Head->BackLink = Last->BackLink;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Last->BackLink->ForwardLink = Head;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG_CODE (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Last->ForwardLink = (LIST_ENTRY *) NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Last->BackLink = (LIST_ENTRY *) NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Last;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Insert a new node entry after a designated node entry of a doubly linked list.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Inserts a new node entry donated by NewEntry after the node entry donated by PrevEntry
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync of the doubly linked list.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] PrevEntry The previous entry to insert after.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] NewEntry The new entry to insert.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNetListInsertAfter (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT LIST_ENTRY *PrevEntry,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT LIST_ENTRY *NewEntry
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewEntry->BackLink = PrevEntry;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewEntry->ForwardLink = PrevEntry->ForwardLink;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrevEntry->ForwardLink->BackLink = NewEntry;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrevEntry->ForwardLink = NewEntry;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Insert a new node entry before a designated node entry of a doubly linked list.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Inserts a new node entry donated by NewEntry after the node entry donated by PostEntry
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync of the doubly linked list.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] PostEntry The entry to insert before.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] NewEntry The new entry to insert.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNetListInsertBefore (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT LIST_ENTRY *PostEntry,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT LIST_ENTRY *NewEntry
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewEntry->ForwardLink = PostEntry;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewEntry->BackLink = PostEntry->BackLink;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PostEntry->BackLink->ForwardLink = NewEntry;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PostEntry->BackLink = NewEntry;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Initialize the netmap. Netmap is a reposity to keep the <Key, Value> pairs.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Initialize the forward and backward links of two head nodes donated by Map->Used
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync and Map->Recycled of two doubly linked lists.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Initializes the count of the <Key, Value> pairs in the netmap to zero.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Map is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If the address of Map->Used is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If the address of Map->Recycled is NULl, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] Map The netmap to initialize.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNetMapInit (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT NET_MAP *Map
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Map != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InitializeListHead (&Map->Used);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InitializeListHead (&Map->Recycled);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Map->Count = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync To clean up the netmap, that is, release allocated memories.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Removes all nodes of the Used doubly linked list and free memory of all related netmap items.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Removes all nodes of the Recycled doubly linked list and free memory of all related netmap items.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The number of the <Key, Value> pairs in the netmap is set to be zero.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Map is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] Map The netmap to clean up.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNetMapClean (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT NET_MAP *Map
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NET_MAP_ITEM *Item;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *Entry;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *Next;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Map != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NET_LIST_FOR_EACH_SAFE (Entry, Next, &Map->Used) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Item = NET_LIST_USER_STRUCT (Entry, NET_MAP_ITEM, Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RemoveEntryList (&Item->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Map->Count--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->FreePool (Item);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT ((Map->Count == 0) && IsListEmpty (&Map->Used));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NET_LIST_FOR_EACH_SAFE (Entry, Next, &Map->Recycled) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Item = NET_LIST_USER_STRUCT (Entry, NET_MAP_ITEM, Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RemoveEntryList (&Item->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->FreePool (Item);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (IsListEmpty (&Map->Recycled));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Test whether the netmap is empty and return true if it is.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If the number of the <Key, Value> pairs in the netmap is zero, return TRUE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Map is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Map The net map to test.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return TRUE if the netmap is empty, otherwise FALSE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBOOLEAN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNetMapIsEmpty (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN NET_MAP *Map
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Map != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (BOOLEAN) (Map->Count == 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Return the number of the <Key, Value> pairs in the netmap.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Map The netmap to get the entry number.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The entry number in the netmap.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINTN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNetMapGetCount (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN NET_MAP *Map
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Map->Count;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Return one allocated item.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If the Recycled doubly linked list of the netmap is empty, it will try to allocate
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync a batch of items if there are enough resources and add corresponding nodes to the begining
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync of the Recycled doubly linked list of the netmap. Otherwise, it will directly remove
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the fist node entry of the Recycled doubly linked list and return the corresponding item.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Map is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] Map The netmap to allocate item for.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The allocated item. If NULL, the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync allocation failed due to resource limit.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNET_MAP_ITEM *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNetMapAllocItem (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT NET_MAP *Map
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NET_MAP_ITEM *Item;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *Head;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Map != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Head = &Map->Recycled;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IsListEmpty (Head)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < NET_MAP_INCREAMENT; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Item = AllocatePool (sizeof (NET_MAP_ITEM));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Item == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Index == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InsertHeadList (Head, &Item->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Item = NET_LIST_HEAD (Head, NET_MAP_ITEM, Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NetListRemoveHead (Head);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Item;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Allocate an item to save the <Key, Value> pair to the head of the netmap.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Allocate an item to save the <Key, Value> pair and add corresponding node entry
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync to the beginning of the Used doubly linked list. The number of the <Key, Value>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pairs in the netmap increase by 1.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Map is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] Map The netmap to insert into.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Key The user's key.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Value The user's value for the key.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES Failed to allocate the memory for the item.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The item is inserted to the head.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNetMapInsertHead (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT NET_MAP *Map,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Key,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Value OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NET_MAP_ITEM *Item;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Map != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Item = NetMapAllocItem (Map);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Item == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Item->Key = Key;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Item->Value = Value;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InsertHeadList (&Map->Used, &Item->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Map->Count++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Allocate an item to save the <Key, Value> pair to the tail of the netmap.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Allocate an item to save the <Key, Value> pair and add corresponding node entry
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync to the tail of the Used doubly linked list. The number of the <Key, Value>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync pairs in the netmap increase by 1.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Map is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] Map The netmap to insert into.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Key The user's key.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Value The user's value for the key.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES Failed to allocate the memory for the item.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The item is inserted to the tail.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNetMapInsertTail (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT NET_MAP *Map,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Key,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Value OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NET_MAP_ITEM *Item;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Map != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Item = NetMapAllocItem (Map);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Item == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Item->Key = Key;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Item->Value = Value;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InsertTailList (&Map->Used, &Item->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Map->Count++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Check whether the item is in the Map and return TRUE if it is.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Map The netmap to search within.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Item The item to search.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return TRUE if the item is in the netmap, otherwise FALSE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBOOLEAN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNetItemInMap (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN NET_MAP *Map,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN NET_MAP_ITEM *Item
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *ListEntry;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NET_LIST_FOR_EACH (ListEntry, &Map->Used) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ListEntry == &Item->Link) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Find the key in the netmap and returns the point to the item contains the Key.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Iterate the Used doubly linked list of the netmap to get every item. Compare the key of every
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync item with the key to search. It returns the point to the item contains the Key if found.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Map is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Map The netmap to search within.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Key The key to search.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The point to the item contains the Key, or NULL if Key isn't in the map.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNET_MAP_ITEM *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNetMapFindKey (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN NET_MAP *Map,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Key
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *Entry;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NET_MAP_ITEM *Item;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Map != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NET_LIST_FOR_EACH (Entry, &Map->Used) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Item = NET_LIST_USER_STRUCT (Entry, NET_MAP_ITEM, Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Item->Key == Key) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Item;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Remove the node entry of the item from the netmap and return the key of the removed item.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Remove the node entry of the item from the Used doubly linked list of the netmap.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The number of the <Key, Value> pairs in the netmap decrease by 1. Then add the node
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync entry of the item to the Recycled doubly linked list of the netmap. If Value is not NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Value will point to the value of the item. It returns the key of the removed item.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Map is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Item is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if item in not in the netmap, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] Map The netmap to remove the item from.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] Item The item to remove.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Value The variable to receive the value if not NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The key of the removed item.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNetMapRemoveItem (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT NET_MAP *Map,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT NET_MAP_ITEM *Item,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT VOID **Value OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT ((Map != NULL) && (Item != NULL));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (NetItemInMap (Map, Item));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RemoveEntryList (&Item->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Map->Count--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InsertHeadList (&Map->Recycled, &Item->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Value != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Value = Item->Value;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Item->Key;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Remove the first node entry on the netmap and return the key of the removed item.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Remove the first node entry from the Used doubly linked list of the netmap.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The number of the <Key, Value> pairs in the netmap decrease by 1. Then add the node
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync entry to the Recycled doubly linked list of the netmap. If parameter Value is not NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync parameter Value will point to the value of the item. It returns the key of the removed item.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Map is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If the Used doubly linked list is empty, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] Map The netmap to remove the head from.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Value The variable to receive the value if not NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The key of the item removed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNetMapRemoveHead (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT NET_MAP *Map,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT VOID **Value OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NET_MAP_ITEM *Item;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Often, it indicates a programming error to remove
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // the first entry in an empty list
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Map && !IsListEmpty (&Map->Used));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Item = NET_LIST_HEAD (&Map->Used, NET_MAP_ITEM, Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RemoveEntryList (&Item->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Map->Count--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InsertHeadList (&Map->Recycled, &Item->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Value != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Value = Item->Value;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Item->Key;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Remove the last node entry on the netmap and return the key of the removed item.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Remove the last node entry from the Used doubly linked list of the netmap.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The number of the <Key, Value> pairs in the netmap decrease by 1. Then add the node
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync entry to the Recycled doubly linked list of the netmap. If parameter Value is not NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync parameter Value will point to the value of the item. It returns the key of the removed item.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Map is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If the Used doubly linked list is empty, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] Map The netmap to remove the tail from.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Value The variable to receive the value if not NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The key of the item removed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNetMapRemoveTail (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT NET_MAP *Map,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT VOID **Value OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NET_MAP_ITEM *Item;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Often, it indicates a programming error to remove
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // the last entry in an empty list
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Map && !IsListEmpty (&Map->Used));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Item = NET_LIST_TAIL (&Map->Used, NET_MAP_ITEM, Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync RemoveEntryList (&Item->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Map->Count--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InsertHeadList (&Map->Recycled, &Item->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Value != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Value = Item->Value;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Item->Key;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Iterate through the netmap and call CallBack for each item.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync It will contiue the traverse if CallBack returns EFI_SUCCESS, otherwise, break
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync from the loop. It returns the CallBack's last return value. This function is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync delete safe for the current item.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Map is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If CallBack is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Map The Map to iterate through.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] CallBack The callback function to call for each item.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Arg The opaque parameter to the callback.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS There is no item in the netmap or CallBack for each item
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Others It returns the CallBack's last return value.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNetMapIterate (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN NET_MAP *Map,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN NET_MAP_CALLBACK CallBack,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Arg OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *Entry;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *Next;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY *Head;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NET_MAP_ITEM *Item;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Result;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT ((Map != NULL) && (CallBack != NULL));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Head = &Map->Used;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IsListEmpty (Head)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NET_LIST_FOR_EACH_SAFE (Entry, Next, Head) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Item = NET_LIST_USER_STRUCT (Entry, NET_MAP_ITEM, Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Result = CallBack (Map, Item, Arg);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Result)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Result;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Internal function to get the child handle of the NIC handle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Controller NIC controller handle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] ChildHandle Returned child handle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Successfully to get child handle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Others Failed to get child handle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNetGetChildHandle (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HANDLE Controller,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_HANDLE *ChildHandle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HANDLE *Handles;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN HandleCount;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DEVICE_PATH_PROTOCOL *ChildDeviceDevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VENDOR_DEVICE_PATH *VendorDeviceNode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Locate all EFI Hii Config Access protocols
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->LocateHandleBuffer (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ByProtocol,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiHiiConfigAccessProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &HandleCount,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Handles
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status) || (HandleCount == 0)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < HandleCount; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EfiTestChildHandle (Controller, Handles[Index], &gEfiManagedNetworkServiceBindingProtocolGuid);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get device path on the child handle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->HandleProtocol (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Handles[Index],
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiDevicePathProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID **) &ChildDeviceDevicePath
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (!IsDevicePathEnd (ChildDeviceDevicePath)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ChildDeviceDevicePath = NextDevicePathNode (ChildDeviceDevicePath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Parse one instance
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ChildDeviceDevicePath->Type == HARDWARE_DEVICE_PATH &&
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ChildDeviceDevicePath->SubType == HW_VENDOR_DP) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VendorDeviceNode = (VENDOR_DEVICE_PATH *) ChildDeviceDevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CompareMem (&VendorDeviceNode->Guid, &gEfiNicIp4ConfigVariableGuid, sizeof (EFI_GUID)) == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Found item matched gEfiNicIp4ConfigVariableGuid
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *ChildHandle = Handles[Index];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Handles);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Handles);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This is the default unload handle for all the network drivers.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Disconnect the driver specified by ImageHandle from all the devices in the handle database.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Uninstall all the protocols installed in the driver entry point.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ImageHandle The drivers' driver image.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The image is unloaded.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Others Failed to unload the image.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNetLibDefaultUnload (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HANDLE ImageHandle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HANDLE *DeviceHandleBuffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN DeviceHandleCount;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DRIVER_BINDING_PROTOCOL *DriverBinding;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_COMPONENT_NAME_PROTOCOL *ComponentName;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_COMPONENT_NAME2_PROTOCOL *ComponentName2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get the list of all the handles in the handle database.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If there is an error getting the list, then the unload
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // operation fails.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->LocateHandleBuffer (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AllHandles,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &DeviceHandleCount,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &DeviceHandleBuffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Disconnect the driver specified by ImageHandle from all
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // the devices in the handle database.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < DeviceHandleCount; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->DisconnectController (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DeviceHandleBuffer[Index],
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ImageHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Uninstall all the protocols installed in the driver entry point
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < DeviceHandleCount; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->HandleProtocol (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DeviceHandleBuffer[Index],
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiDriverBindingProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID **) &DriverBinding
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DriverBinding->ImageHandle != ImageHandle) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->UninstallProtocolInterface (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ImageHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiDriverBindingProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DriverBinding
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->HandleProtocol (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DeviceHandleBuffer[Index],
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiComponentNameProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID **) &ComponentName
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->UninstallProtocolInterface (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ImageHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiComponentNameProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ComponentName
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->HandleProtocol (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DeviceHandleBuffer[Index],
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiComponentName2ProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID **) &ComponentName2
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->UninstallProtocolInterface (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ImageHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiComponentName2ProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ComponentName2
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Free the buffer containing the list of handles from the handle database
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DeviceHandleBuffer != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->FreePool (DeviceHandleBuffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Create a child of the service that is identified by ServiceBindingGuid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Get the ServiceBinding Protocol first, then use it to create a child.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If ServiceBindingGuid is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If ChildHandle is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Controller The controller which has the service installed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Image The image handle used to open service.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ServiceBindingGuid The service's Guid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] ChildHandle The handle to receive the create child.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The child is successfully created.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Others Failed to create the child.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNetLibCreateServiceChild (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HANDLE Controller,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HANDLE Image,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_GUID *ServiceBindingGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT EFI_HANDLE *ChildHandle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_SERVICE_BINDING_PROTOCOL *Service;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT ((ServiceBindingGuid != NULL) && (ChildHandle != NULL));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get the ServiceBinding Protocol
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->OpenProtocol (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Controller,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ServiceBindingGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID **) &Service,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Image,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Controller,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_OPEN_PROTOCOL_GET_PROTOCOL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Create a child
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Service->CreateChild (Service, ChildHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Destory a child of the service that is identified by ServiceBindingGuid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Get the ServiceBinding Protocol first, then use it to destroy a child.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If ServiceBindingGuid is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Controller The controller which has the service installed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Image The image handle used to open service.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ServiceBindingGuid The service's Guid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ChildHandle The child to destory.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The child is successfully destoried.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Others Failed to destory the child.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNetLibDestroyServiceChild (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HANDLE Controller,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HANDLE Image,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_GUID *ServiceBindingGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HANDLE ChildHandle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_SERVICE_BINDING_PROTOCOL *Service;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (ServiceBindingGuid != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get the ServiceBinding Protocol
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->OpenProtocol (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Controller,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ServiceBindingGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID **) &Service,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Image,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Controller,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_OPEN_PROTOCOL_GET_PROTOCOL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // destory the child
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Service->DestroyChild (Service, ChildHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Get handle with Simple Network Protocol installed on it.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync There should be MNP Service Binding Protocol installed on the input ServiceHandle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Simple Network Protocol is already installed on the ServiceHandle, the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ServiceHandle will be returned. If SNP is not installed on the ServiceHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync try to find its parent handle with SNP installed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ServiceHandle The handle where network service binding protocols are
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync installed on.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Snp The pointer to store the address of the SNP instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This is an optional parameter that may be NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The SNP handle, or NULL if not found.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_HANDLE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNetLibGetSnpHandle (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HANDLE ServiceHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_SIMPLE_NETWORK_PROTOCOL **Snp OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_SIMPLE_NETWORK_PROTOCOL *SnpInstance;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DEVICE_PATH_PROTOCOL *DevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HANDLE SnpHandle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Try to open SNP from ServiceHandle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SnpInstance = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->HandleProtocol (ServiceHandle, &gEfiSimpleNetworkProtocolGuid, (VOID **) &SnpInstance);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Snp != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Snp = SnpInstance;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ServiceHandle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Failed to open SNP, try to get SNP handle by LocateDevicePath()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevicePath = DevicePathFromHandle (ServiceHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DevicePath == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SnpHandle = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->LocateDevicePath (&gEfiSimpleNetworkProtocolGuid, &DevicePath, &SnpHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Failed to find SNP handle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->HandleProtocol (SnpHandle, &gEfiSimpleNetworkProtocolGuid, (VOID **) &SnpInstance);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Snp != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Snp = SnpInstance;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return SnpHandle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Retrieve VLAN ID of a VLAN device handle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Search VLAN device path node in Device Path of specified ServiceHandle and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return its VLAN ID. If no VLAN device path node found, then this ServiceHandle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync is not a VLAN device handle, and 0 will be returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ServiceHandle The handle where network service binding protocols are
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync installed on.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return VLAN ID of the device handle, or 0 if not a VLAN device.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT16
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNetLibGetVlanId (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HANDLE ServiceHandle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DEVICE_PATH_PROTOCOL *DevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DEVICE_PATH_PROTOCOL *Node;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevicePath = DevicePathFromHandle (ServiceHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DevicePath == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node = DevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (!IsDevicePathEnd (Node)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Node->Type == MESSAGING_DEVICE_PATH && Node->SubType == MSG_VLAN_DP) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ((VLAN_DEVICE_PATH *) Node)->VlanId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node = NextDevicePathNode (Node);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Find VLAN device handle with specified VLAN ID.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The VLAN child device handle is created by VLAN Config Protocol on ControllerHandle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function will append VLAN device path node to the parent device path,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync and then use LocateDevicePath() to find the correct VLAN device handle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ControllerHandle The handle where network service binding protocols are
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync installed on.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] VlanId The configured VLAN ID for the VLAN device.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The VLAN device handle, or NULL if not found.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_HANDLE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNetLibGetVlanHandle (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HANDLE ControllerHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 VlanId
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DEVICE_PATH_PROTOCOL *VlanDevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DEVICE_PATH_PROTOCOL *DevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VLAN_DEVICE_PATH VlanNode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HANDLE Handle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ParentDevicePath = DevicePathFromHandle (ControllerHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ParentDevicePath == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Construct VLAN device path
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (&VlanNode, &mNetVlanDevicePathTemplate, sizeof (VLAN_DEVICE_PATH));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VlanNode.VlanId = VlanId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VlanDevicePath = AppendDevicePathNode (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ParentDevicePath,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (EFI_DEVICE_PATH_PROTOCOL *) &VlanNode
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (VlanDevicePath == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Find VLAN device handle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Handle = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevicePath = VlanDevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->LocateDevicePath (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiDevicePathProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &DevicePath,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Handle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!IsDevicePathEnd (DevicePath)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Device path is not exactly match
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Handle = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (VlanDevicePath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Handle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Get MAC address associated with the network service handle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync There should be MNP Service Binding Protocol installed on the input ServiceHandle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If SNP is installed on the ServiceHandle or its parent handle, MAC address will
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync be retrieved from SNP. If no SNP found, try to get SNP mode data use MNP.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ServiceHandle The handle where network service binding protocols are
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync installed on.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] MacAddress The pointer to store the returned MAC address.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] AddressSize The length of returned MAC address.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS MAC address is returned successfully.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Others Failed to get SNP mode data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNetLibGetMacAddress (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HANDLE ServiceHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_MAC_ADDRESS *MacAddress,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINTN *AddressSize
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_SIMPLE_NETWORK_PROTOCOL *Snp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_SIMPLE_NETWORK_MODE *SnpMode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_SIMPLE_NETWORK_MODE SnpModeData;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_MANAGED_NETWORK_PROTOCOL *Mnp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_SERVICE_BINDING_PROTOCOL *MnpSb;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HANDLE *SnpHandle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HANDLE MnpChildHandle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (MacAddress != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (AddressSize != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Try to get SNP handle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Snp = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SnpHandle = NetLibGetSnpHandle (ServiceHandle, &Snp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (SnpHandle != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // SNP found, use it directly
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SnpMode = Snp->Mode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Failed to get SNP handle, try to get MAC address from MNP
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MnpChildHandle = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->HandleProtocol (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ServiceHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiManagedNetworkServiceBindingProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID **) &MnpSb
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Create a MNP child
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = MnpSb->CreateChild (MnpSb, &MnpChildHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Open MNP protocol
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->HandleProtocol (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MnpChildHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiManagedNetworkProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID **) &Mnp
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MnpSb->DestroyChild (MnpSb, MnpChildHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Try to get SNP mode from MNP
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Mnp->GetModeData (Mnp, NULL, &SnpModeData);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MnpSb->DestroyChild (MnpSb, MnpChildHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SnpMode = &SnpModeData;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Destroy the MNP child
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MnpSb->DestroyChild (MnpSb, MnpChildHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *AddressSize = SnpMode->HwAddressSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (MacAddress->Addr, SnpMode->CurrentAddress.Addr, SnpMode->HwAddressSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Convert MAC address of the NIC associated with specified Service Binding Handle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync to a unicode string. Callers are responsible for freeing the string storage.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Locate simple network protocol associated with the Service Binding Handle and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync get the mac address from SNP. Then convert the mac address into a unicode
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync string. It takes 2 unicode characters to represent a 1 byte binary buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Plus one unicode character for the null-terminator.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ServiceHandle The handle where network service binding protocol is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync installed on.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ImageHandle The image handle used to act as the agent handle to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync get the simple network protocol.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] MacString The pointer to store the address of the string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync representation of the mac address.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Convert the mac address a unicode string successfully.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES There are not enough memory resource.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Others Failed to open the simple network protocol.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNetLibGetMacString (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HANDLE ServiceHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HANDLE ImageHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT CHAR16 **MacString
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_MAC_ADDRESS MacAddress;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 *HwAddress;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN HwAddressSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 VlanId;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *String;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (MacString != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get MAC address of the network device
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = NetLibGetMacAddress (ServiceHandle, &MacAddress, &HwAddressSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // It takes 2 unicode characters to represent a 1 byte binary buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If VLAN is configured, it will need extra 5 characters like "\0005".
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Plus one unicode character for the null-terminator.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String = AllocateZeroPool ((2 * HwAddressSize + 5 + 1) * sizeof (CHAR16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (String == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *MacString = String;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Convert the MAC address into a unicode string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HwAddress = &MacAddress.Addr[0];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < HwAddressSize; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String += UnicodeValueToString (String, PREFIX_ZERO | RADIX_HEX, *(HwAddress++), 2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Append VLAN ID if any
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VlanId = NetLibGetVlanId (ServiceHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (VlanId != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *String++ = L'\\';
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String += UnicodeValueToString (String, PREFIX_ZERO | RADIX_HEX, VlanId, 4);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Null terminate the Unicode string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *String = L'\0';
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Detect media status for specified network device.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The underlying UNDI driver may or may not support reporting media status from
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync GET_STATUS command (PXE_STATFLAGS_GET_STATUS_NO_MEDIA_SUPPORTED). This routine
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync will try to invoke Snp->GetStatus() to get the media status: if media already
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync present, it return directly; if media not present, it will stop SNP and then
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync restart SNP to get the latest media status, this give chance to get the correct
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync media status for old UNDI driver which doesn't support reporting media status
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync from GET_STATUS command.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Note: there will be two limitations for current algorithm:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 1) for UNDI with this capability, in case of cable is not attached, there will
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync be an redundant Stop/Start() process;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 2) for UNDI without this capability, in case that network cable is attached when
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Snp->Initialize() is invoked while network cable is unattached later,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NetLibDetectMedia() will report MediaPresent as TRUE, causing upper layer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync apps to wait for timeout time.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ServiceHandle The handle where network service binding protocols are
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync installed on.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] MediaPresent The pointer to store the media status.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Media detection success.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER ServiceHandle is not valid network device handle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_UNSUPPORTED Network device does not support media detection.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR SNP is in unknown state.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNetLibDetectMedia (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HANDLE ServiceHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT BOOLEAN *MediaPresent
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HANDLE SnpHandle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_SIMPLE_NETWORK_PROTOCOL *Snp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 InterruptStatus;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 OldState;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_MAC_ADDRESS *MCastFilter;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 MCastFilterCount;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 EnableFilterBits;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 DisableFilterBits;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN ResetMCastFilters;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (MediaPresent != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get SNP handle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Snp = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SnpHandle = NetLibGetSnpHandle (ServiceHandle, &Snp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (SnpHandle == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Check whether SNP support media detection
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!Snp->Mode->MediaPresentSupported) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_UNSUPPORTED;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Invoke Snp->GetStatus() to refresh MediaPresent field in SNP mode data
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Snp->GetStatus (Snp, &InterruptStatus, NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Snp->Mode->MediaPresent) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Media is present, return directly
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *MediaPresent = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Till now, GetStatus() report no media; while, in case UNDI not support
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // reporting media status from GetStatus(), this media status may be incorrect.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // So, we will stop SNP and then restart it to get the correct media status.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OldState = Snp->Mode->State;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (OldState >= EfiSimpleNetworkMaxState) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_DEVICE_ERROR;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MCastFilter = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (OldState == EfiSimpleNetworkInitialized) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // SNP is already in use, need Shutdown/Stop and then Start/Initialize
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Backup current SNP receive filter settings
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EnableFilterBits = Snp->Mode->ReceiveFilterSetting;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DisableFilterBits = Snp->Mode->ReceiveFilterMask ^ EnableFilterBits;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ResetMCastFilters = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MCastFilterCount = Snp->Mode->MCastFilterCount;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (MCastFilterCount != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MCastFilter = AllocateCopyPool (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MCastFilterCount * sizeof (EFI_MAC_ADDRESS),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Snp->Mode->MCastFilter
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (MCastFilter != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ResetMCastFilters = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Shutdown/Stop the simple network
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Snp->Shutdown (Snp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Snp->Stop (Snp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Start/Initialize the simple network
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Snp->Start (Snp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Snp->Initialize (Snp, 0, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Here we get the correct media status
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *MediaPresent = Snp->Mode->MediaPresent;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Restore SNP receive filter settings
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Snp->ReceiveFilters (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Snp,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EnableFilterBits,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DisableFilterBits,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ResetMCastFilters,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MCastFilterCount,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MCastFilter
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (MCastFilter != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (MCastFilter);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // SNP is not in use, it's in state of EfiSimpleNetworkStopped or EfiSimpleNetworkStarted
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (OldState == EfiSimpleNetworkStopped) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // SNP not start yet, start it
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Snp->Start (Snp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Initialize the simple network
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = Snp->Initialize (Snp, 0, 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_DEVICE_ERROR;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Here we get the correct media status
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *MediaPresent = Snp->Mode->MediaPresent;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Shut down the simple network
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Snp->Shutdown (Snp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncExit:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (OldState == EfiSimpleNetworkStopped) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Original SNP sate is Stopped, restore to original state
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Snp->Stop (Snp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (MCastFilter != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (MCastFilter);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Check the default address used by the IPv4 driver is static or dynamic (acquired
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync from DHCP).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If the controller handle does not have the NIC Ip4 Config Protocol installed, the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default address is static. If the EFI variable to save the configuration is not found,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the default address is static. Otherwise, get the result from the EFI variable which
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync saving the configuration.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Controller The controller handle which has the NIC Ip4 Config Protocol
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync relative with the default address to judge.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval TRUE If the default address is static.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE If the default address is acquired from DHCP.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBOOLEAN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNetLibDefaultAddressIsStatic (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HANDLE Controller
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HII_CONFIG_ROUTING_PROTOCOL *HiiConfigRouting;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Len;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NIC_IP4_CONFIG_INFO *ConfigInfo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN IsStatic;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING ConfigHdr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING ConfigResp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING AccessProgress;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING AccessResults;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STRING String;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HANDLE ChildHandle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigInfo = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigHdr = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigResp = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AccessProgress = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AccessResults = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IsStatic = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->LocateProtocol (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiHiiConfigRoutingProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID **) &HiiConfigRouting
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = NetGetChildHandle (Controller, &ChildHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Construct config request string header
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigHdr = HiiConstructConfigHdr (&gEfiNicIp4ConfigVariableGuid, EFI_NIC_IP4_CONFIG_VARIABLE, ChildHandle);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ConfigHdr == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Len = StrLen (ConfigHdr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigResp = AllocateZeroPool ((Len + NIC_ITEM_CONFIG_SIZE * 2 + 100) * sizeof (CHAR16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ConfigResp == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto ON_EXIT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCpy (ConfigResp, ConfigHdr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String = ConfigResp + Len;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UnicodeSPrint (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (8 + 4 + 7 + 4 + 1) * sizeof (CHAR16),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync L"&OFFSET=%04X&WIDTH=%04X",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OFFSET_OF (NIC_IP4_CONFIG_INFO, Source),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sizeof (UINT32)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = HiiConfigRouting->ExtractConfig (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiConfigRouting,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigResp,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &AccessProgress,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &AccessResults
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto ON_EXIT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigInfo = AllocateZeroPool (NIC_ITEM_CONFIG_SIZE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ConfigInfo == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto ON_EXIT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConfigInfo->Source = IP4_CONFIG_SOURCE_STATIC;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Len = NIC_ITEM_CONFIG_SIZE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = HiiConfigRouting->ConfigToBlock (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync HiiConfigRouting,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AccessResults,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (UINT8 *) ConfigInfo,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &Len,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &AccessProgress
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto ON_EXIT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IsStatic = (BOOLEAN) (ConfigInfo->Source == IP4_CONFIG_SOURCE_STATIC);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncON_EXIT:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (AccessResults != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (AccessResults);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ConfigInfo != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (ConfigInfo);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ConfigResp != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (ConfigResp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ConfigHdr != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (ConfigHdr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return IsStatic;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Create an IPv4 device path node.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The header type of IPv4 device path node is MESSAGING_DEVICE_PATH.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The header subtype of IPv4 device path node is MSG_IPv4_DP.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Get other info from parameters to make up the whole IPv4 device path node.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] Node Pointer to the IPv4 device path node.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Controller The controller handle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] LocalIp The local IPv4 address.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] LocalPort The local port.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] RemoteIp The remote IPv4 address.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] RemotePort The remote port.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Protocol The protocol type in the IP header.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] UseDefaultAddress Whether this instance is using default address or not.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNetLibCreateIPv4DPathNode (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT IPv4_DEVICE_PATH *Node,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HANDLE Controller,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN IP4_ADDR LocalIp,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 LocalPort,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN IP4_ADDR RemoteIp,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 RemotePort,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 Protocol,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN BOOLEAN UseDefaultAddress
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->Header.Type = MESSAGING_DEVICE_PATH;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->Header.SubType = MSG_IPv4_DP;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SetDevicePathNodeLength (&Node->Header, sizeof (IPv4_DEVICE_PATH));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (&Node->LocalIpAddress, &LocalIp, sizeof (EFI_IPv4_ADDRESS));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (&Node->RemoteIpAddress, &RemoteIp, sizeof (EFI_IPv4_ADDRESS));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->LocalPort = LocalPort;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->RemotePort = RemotePort;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->Protocol = Protocol;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!UseDefaultAddress) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->StaticIpAddress = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->StaticIpAddress = NetLibDefaultAddressIsStatic (Controller);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Set the Gateway IP address to default value 0:0:0:0.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Set the Subnet mask to default value 255:255:255:0.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (&Node->GatewayIpAddress, sizeof (EFI_IPv4_ADDRESS));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SetMem (&Node->SubnetMask, sizeof (EFI_IPv4_ADDRESS), 0xff);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->SubnetMask.Addr[3] = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Create an IPv6 device path node.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The header type of IPv6 device path node is MESSAGING_DEVICE_PATH.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The header subtype of IPv6 device path node is MSG_IPv6_DP.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Get other info from parameters to make up the whole IPv6 device path node.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] Node Pointer to the IPv6 device path node.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Controller The controller handle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] LocalIp The local IPv6 address.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] LocalPort The local port.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] RemoteIp The remote IPv6 address.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] RemotePort The remote port.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Protocol The protocol type in the IP header.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNetLibCreateIPv6DPathNode (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT IPv6_DEVICE_PATH *Node,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HANDLE Controller,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_IPv6_ADDRESS *LocalIp,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 LocalPort,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_IPv6_ADDRESS *RemoteIp,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 RemotePort,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 Protocol
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->Header.Type = MESSAGING_DEVICE_PATH;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->Header.SubType = MSG_IPv6_DP;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SetDevicePathNodeLength (&Node->Header, sizeof (IPv6_DEVICE_PATH));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (&Node->LocalIpAddress, LocalIp, sizeof (EFI_IPv6_ADDRESS));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (&Node->RemoteIpAddress, RemoteIp, sizeof (EFI_IPv6_ADDRESS));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->LocalPort = LocalPort;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->RemotePort = RemotePort;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->Protocol = Protocol;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Set default value to IPAddressOrigin, PrefixLength.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Set the Gateway IP address to unspecified address.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->IpAddressOrigin = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node->PrefixLength = IP6_PREFIX_LENGTH;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (&Node->GatewayIpAddress, sizeof (EFI_IPv6_ADDRESS));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Find the UNDI/SNP handle from controller and protocol GUID.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync For example, IP will open a MNP child to transmit/receive
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync packets, when MNP is stopped, IP should also be stopped. IP
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync needs to find its own private data which is related the IP's
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync service binding instance that is install on UNDI/SNP handle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Now, the controller is either a MNP or ARP child handle. But
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IP opens these handle BY_DRIVER, use that info, we can get the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UNDI/SNP handle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Controller Then protocol handle to check.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] ProtocolGuid The protocol that is related with the handle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The UNDI/SNP handle or NULL for errors.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_HANDLE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNetLibGetNicHandle (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HANDLE Controller,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_GUID *ProtocolGuid
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *OpenBuffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HANDLE Handle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN OpenCount;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->OpenProtocolInformation (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Controller,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &OpenBuffer,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &OpenCount
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Handle = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < OpenCount; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((OpenBuffer[Index].Attributes & EFI_OPEN_PROTOCOL_BY_DRIVER) != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Handle = OpenBuffer[Index].ControllerHandle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->FreePool (OpenBuffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Handle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Convert one Null-terminated ASCII string (decimal dotted) to EFI_IPv4_ADDRESS.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] String The pointer to the Ascii string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Ip4Address The pointer to the converted IPv4 address.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Convert to IPv4 address successfully.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER The string is mal-formated or Ip4Address is NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNetLibAsciiStrToIp4 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR8 *String,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_IPv4_ADDRESS *Ip4Address
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR8 *Ip4Str;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR8 *TempStr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN NodeVal;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((String == NULL) || (Ip4Address == NULL)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip4Str = (CHAR8 *) String;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < 4; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempStr = Ip4Str;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while ((*Ip4Str != '\0') && (*Ip4Str != '.')) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip4Str++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // The IPv4 address is X.X.X.X
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*Ip4Str == '.') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Index == 3) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Index != 3) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Convert the string to IPv4 address. AsciiStrDecimalToUintn stops at the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // first character that is not a valid decimal character, '.' or '\0' here.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NodeVal = AsciiStrDecimalToUintn (TempStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NodeVal > 0xFF) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip4Address->Addr[Index] = (UINT8) NodeVal;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip4Str++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Convert one Null-terminated ASCII string to EFI_IPv6_ADDRESS. The format of the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync string is defined in RFC 4291 - Text Pepresentation of Addresses.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] String The pointer to the Ascii string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Ip6Address The pointer to the converted IPv6 address.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Convert to IPv6 address successfully.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER The string is mal-formated or Ip6Address is NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNetLibAsciiStrToIp6 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR8 *String,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_IPv6_ADDRESS *Ip6Address
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR8 *Ip6Str;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR8 *TempStr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR8 *TempStr2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 NodeCnt;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 TailNodeCnt;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 AllowedCnt;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN NodeVal;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN Short;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN Update;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN LeadZero;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 LeadZeroCnt;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 Cnt;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((String == NULL) || (Ip6Address == NULL)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6Str = (CHAR8 *) String;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AllowedCnt = 6;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LeadZeroCnt = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // An IPv6 address leading with : looks strange.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*Ip6Str == ':') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*(Ip6Str + 1) != ':') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AllowedCnt = 7;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (Ip6Address, sizeof (EFI_IPv6_ADDRESS));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NodeCnt = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TailNodeCnt = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Short = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Update = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LeadZero = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < 15; Index = (UINT8) (Index + 2)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempStr = Ip6Str;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while ((*Ip6Str != '\0') && (*Ip6Str != ':')) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6Str++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((*Ip6Str == '\0') && (Index != 14)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*Ip6Str == ':') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*(Ip6Str + 1) == ':') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((NodeCnt > 6) ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ((*(Ip6Str + 2) != '\0') && (AsciiStrHexToUintn (Ip6Str + 2) == 0))) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // ::0 looks strange. report error to user.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((NodeCnt == 6) && (*(Ip6Str + 2) != '\0') &&
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (AsciiStrHexToUintn (Ip6Str + 2) != 0)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Skip the abbreviation part of IPv6 address.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempStr2 = Ip6Str + 2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while ((*TempStr2 != '\0')) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*TempStr2 == ':') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*(TempStr2 + 1) == ':') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // :: can only appear once in IPv6 address.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TailNodeCnt++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TailNodeCnt >= (AllowedCnt - NodeCnt)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // :: indicates one or more groups of 16 bits of zeros.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempStr2++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Short = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Update = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6Str = Ip6Str + 2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*(Ip6Str + 1) == '\0') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6Str++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NodeCnt++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Short && (NodeCnt > 6)) || (!Short && (NodeCnt > 7))) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // There are more than 8 groups of 16 bits of zeros.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Convert the string to IPv6 address. AsciiStrHexToUintn stops at the first
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // character that is not a valid hexadecimal character, ':' or '\0' here.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NodeVal = AsciiStrHexToUintn (TempStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((NodeVal > 0xFFFF) || (Index > 14)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NodeVal != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((*TempStr == '0') &&
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ((*(TempStr + 2) == ':') || (*(TempStr + 3) == ':') ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (*(TempStr + 2) == '\0') || (*(TempStr + 3) == '\0'))) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((*TempStr == '0') && (*(TempStr + 4) != '\0') &&
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (*(TempStr + 4) != ':')) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (((*TempStr == '0') && (*(TempStr + 1) == '0') &&
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ((*(TempStr + 2) == ':') || (*(TempStr + 2) == '\0'))) ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ((*TempStr == '0') && (*(TempStr + 1) == '0') && (*(TempStr + 2) == '0') &&
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ((*(TempStr + 3) == ':') || (*(TempStr + 3) == '\0')))) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Cnt = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while ((TempStr[Cnt] != ':') && (TempStr[Cnt] != '\0')) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Cnt++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (LeadZeroCnt == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Cnt == 4) && (*TempStr == '0')) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LeadZero = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LeadZeroCnt++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Cnt != 0) && (Cnt < 4)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LeadZero = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LeadZeroCnt++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Cnt == 4) && (*TempStr == '0') && !LeadZero) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((Cnt != 0) && (Cnt < 4) && LeadZero) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6Address->Addr[Index] = (UINT8) (NodeVal >> 8);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6Address->Addr[Index + 1] = (UINT8) (NodeVal & 0xFF);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Skip the groups of zeros by ::
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Short && Update) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Index = (UINT8) (16 - (TailNodeCnt + 2) * 2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Update = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((!Short && Index != 16) || (*Ip6Str != '\0')) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Convert one Null-terminated Unicode string (decimal dotted) to EFI_IPv4_ADDRESS.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] String The pointer to the Ascii string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Ip4Address The pointer to the converted IPv4 address.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Convert to IPv4 address successfully.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER The string is mal-formated or Ip4Address is NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES Fail to perform the operation due to lack of resource.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNetLibStrToIp4 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *String,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_IPv4_ADDRESS *Ip4Address
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR8 *Ip4Str;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((String == NULL) || (Ip4Address == NULL)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip4Str = (CHAR8 *) AllocatePool ((StrLen (String) + 1) * sizeof (CHAR8));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Ip4Str == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UnicodeStrToAsciiStr (String, Ip4Str);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = NetLibAsciiStrToIp4 (Ip4Str, Ip4Address);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Ip4Str);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Convert one Null-terminated Unicode string to EFI_IPv6_ADDRESS. The format of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the string is defined in RFC 4291 - Text Pepresentation of Addresses.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] String The pointer to the Ascii string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Ip6Address The pointer to the converted IPv6 address.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Convert to IPv6 address successfully.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER The string is mal-formated or Ip6Address is NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES Fail to perform the operation due to lack of resource.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNetLibStrToIp6 (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *String,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_IPv6_ADDRESS *Ip6Address
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR8 *Ip6Str;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((String == NULL) || (Ip6Address == NULL)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6Str = (CHAR8 *) AllocatePool ((StrLen (String) + 1) * sizeof (CHAR8));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Ip6Str == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UnicodeStrToAsciiStr (String, Ip6Str);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = NetLibAsciiStrToIp6 (Ip6Str, Ip6Address);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Ip6Str);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Convert one Null-terminated Unicode string to EFI_IPv6_ADDRESS and prefix length.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The format of the string is defined in RFC 4291 - Text Pepresentation of Addresses
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Prefixes: ipv6-address/prefix-length.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] String The pointer to the Ascii string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Ip6Address The pointer to the converted IPv6 address.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] PrefixLength The pointer to the converted prefix length.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Convert to IPv6 address successfully.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER The string is mal-formated or Ip6Address is NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES Fail to perform the operation due to lack of resource.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNetLibStrToIp6andPrefix (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *String,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_IPv6_ADDRESS *Ip6Address,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINT8 *PrefixLength
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR8 *Ip6Str;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR8 *PrefixStr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR8 *TempStr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((String == NULL) || (Ip6Address == NULL) || (PrefixLength == NULL)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Ip6Str = (CHAR8 *) AllocatePool ((StrLen (String) + 1) * sizeof (CHAR8));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Ip6Str == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UnicodeStrToAsciiStr (String, Ip6Str);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get the sub string describing prefix length.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempStr = Ip6Str;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (*TempStr != '\0' && (*TempStr != '/')) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempStr++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*TempStr == '/') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrefixStr = TempStr + 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrefixStr = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get the sub string describing IPv6 address and convert it.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *TempStr = '\0';
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = NetLibAsciiStrToIp6 (Ip6Str, Ip6Address);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If input string doesn't indicate the prefix length, return 0xff.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Length = 0xFF;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Convert the string to prefix length
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (PrefixStr != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_INVALID_PARAMETER;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Length = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (*PrefixStr != '\0') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NET_IS_DIGIT (*PrefixStr)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Length = (UINT8) (Length * 10 + (*PrefixStr - '0'));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Length >= IP6_PREFIX_NUM) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync goto Exit;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrefixStr++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *PrefixLength = Length;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncExit:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (Ip6Str);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function obtains the system guid from the smbios table.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] SystemGuid The pointer of the returned system guid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Successfully obtained the system guid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NOT_FOUND Did not find the SMBIOS table.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNetLibGetSystemGuid (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_GUID *SystemGuid
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SMBIOS_TABLE_ENTRY_POINT *SmbiosTable;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SMBIOS_STRUCTURE_POINTER Smbios;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SMBIOS_STRUCTURE_POINTER SmbiosEnd;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR8 *String;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SmbiosTable = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EfiGetSystemConfigurationTable (&gEfiSmbiosTableGuid, (VOID **) &SmbiosTable);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status) || SmbiosTable == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Smbios.Hdr = (SMBIOS_STRUCTURE *) (UINTN) SmbiosTable->TableAddress;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SmbiosEnd.Raw = (UINT8 *) (UINTN) (SmbiosTable->TableAddress + SmbiosTable->TableLength);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync do {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Smbios.Hdr->Type == 1) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Smbios.Hdr->Length < 0x19) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Older version did not support UUID.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // SMBIOS tables are byte packed so we need to do a byte copy to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // prevend alignment faults on Itanium-based platform.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (SystemGuid, &Smbios.Type1->Uuid, sizeof (EFI_GUID));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Go to the next SMBIOS structure. Each SMBIOS structure may include 2 parts:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // 1. Formatted section; 2. Unformatted string section. So, 2 steps are needed
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // to skip one SMBIOS structure.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Step 1: Skip over formatted section.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync String = (CHAR8 *) (Smbios.Raw + Smbios.Hdr->Length);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Step 2: Skip over unformated string section.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync do {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Each string is terminated with a NULL(00h) BYTE and the sets of strings
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // is terminated with an additional NULL(00h) BYTE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for ( ; *String != 0; String++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*(UINT8*)++String == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Pointer to the next SMBIOS structure.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Smbios.Raw = (UINT8 *)++String;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } while (TRUE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } while (Smbios.Raw < SmbiosEnd.Raw);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_NOT_FOUND;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}