PxeBcSupport.c revision e285199897e538523f762cb5b3900e81f872035a
1dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff/** @file 2f737cfb953905f42f3324e8e53ec324a15314210jgong Support routines for PxeBc. 3e285199897e538523f762cb5b3900e81f872035avanjeff 4e285199897e538523f762cb5b3900e81f872035avanjeffCopyright (c) 2007 - 2010, Intel Corporation.<BR> 5dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeffAll rights reserved. This program and the accompanying materials 6dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeffare licensed and made available under the terms and conditions of the BSD License 7dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeffwhich accompanies this distribution. The full text of the license may be found at 8dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeffhttp://opensource.org/licenses/bsd-license.php 9dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff 10dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeffTHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 11dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeffWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 12dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff 13dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff**/ 14dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff 15dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff 16dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff#include "PxeBcImpl.h" 17dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff 18dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff 19dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff/** 20f737cfb953905f42f3324e8e53ec324a15314210jgong This function returns SMBIOS string given the string number. 21e285199897e538523f762cb5b3900e81f872035avanjeff 22dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff @param Smbios Pointer to SMBIOS structure 23dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff @param StringNumber String number to return. 0 is used to skip all 24dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff strings and point to the next SMBIOS structure. 25dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff 26dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff @return Pointer to string, or pointer to next SMBIOS strcuture if StringNumber == 0 27dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff 28dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff**/ 29dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeffCHAR8 * 30dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeffGetSmbiosString ( 31dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff IN SMBIOS_STRUCTURE_POINTER *Smbios, 32dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff IN UINT16 StringNumber 33dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff ) 34dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff{ 35dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff UINT16 Index; 36dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff CHAR8 *String; 37dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff 38dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff // 39dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff // Skip over formatted section 40dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff // 41dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff String = (CHAR8 *) (Smbios->Raw + Smbios->Hdr->Length); 42dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff 43dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff // 44dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff // Look through unformated section 45dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff // 46dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff for (Index = 1; Index <= StringNumber || StringNumber == 0; Index++) { 47dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff if (StringNumber == Index) { 48dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff return String; 49dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff } 50dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff // 51dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff // Skip string 52dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff // 53dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff for (; *String != 0; String++) 54dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff ; 55dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff String++; 56dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff 57dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff if (*String == 0) { 58dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff // 59dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff // If double NULL then we are done. 60dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff // Return pointer to next structure in Smbios. 61dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff // if you pass in a 0 you will always get here 62dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff // 63dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff Smbios->Raw = (UINT8 *)++String; 64dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff return NULL; 65dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff } 66dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff } 67dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff 68dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff return NULL; 69dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff} 70dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff 71dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff 72dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff/** 73f737cfb953905f42f3324e8e53ec324a15314210jgong This function gets system guid and serial number from the smbios table. 74dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff 75f737cfb953905f42f3324e8e53ec324a15314210jgong @param SystemGuid The pointer of returned system guid. 76f737cfb953905f42f3324e8e53ec324a15314210jgong @param SystemSerialNumber The pointer of returned system serial number. 77dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff 78dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff @retval EFI_SUCCESS Successfully get the system guid and system serial 79f737cfb953905f42f3324e8e53ec324a15314210jgong number. 80f737cfb953905f42f3324e8e53ec324a15314210jgong @retval EFI_NOT_FOUND Not find the SMBIOS table. 81dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff 82dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff**/ 83dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeffEFI_STATUS 84dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeffGetSmbiosSystemGuidAndSerialNumber ( 85dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff IN EFI_GUID *SystemGuid, 86dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff OUT CHAR8 **SystemSerialNumber 87dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff ) 88dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff{ 89dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff EFI_STATUS Status; 90dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff SMBIOS_TABLE_ENTRY_POINT *SmbiosTable; 91dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff SMBIOS_STRUCTURE_POINTER Smbios; 92dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff SMBIOS_STRUCTURE_POINTER SmbiosEnd; 93dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff UINT16 Index; 94dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff 95dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff Status = EfiGetSystemConfigurationTable (&gEfiSmbiosTableGuid, (VOID **) &SmbiosTable); 96dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff 97dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff if (EFI_ERROR (Status)) { 98dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff return EFI_NOT_FOUND; 99dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff } 100e285199897e538523f762cb5b3900e81f872035avanjeff ASSERT (SmbiosTable != NULL); 101dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff 102dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff Smbios.Hdr = (SMBIOS_STRUCTURE *) (UINTN) SmbiosTable->TableAddress; 103dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff SmbiosEnd.Raw = (UINT8 *) (UINTN) (SmbiosTable->TableAddress + SmbiosTable->TableLength); 104dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff 105dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff for (Index = 0; Index < SmbiosTable->TableLength; Index++) { 106dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff if (Smbios.Hdr->Type == 1) { 107dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff if (Smbios.Hdr->Length < 0x19) { 108dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff // 109dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff // Older version did not support Guid and Serial number 110dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff // 111dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff continue; 112dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff } 113dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff // 114dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff // SMBIOS tables are byte packed so we need to do a byte copy to 115dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff // prevend alignment faults on Itanium-based platform. 116dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff // 117dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff CopyMem (SystemGuid, &Smbios.Type1->Uuid, sizeof (EFI_GUID)); 118dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff *SystemSerialNumber = GetSmbiosString (&Smbios, Smbios.Type1->SerialNumber); 119dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff 120dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff return EFI_SUCCESS; 121dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff } 122dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff // 123dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff // Make Smbios point to the next record 124dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff // 125dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff GetSmbiosString (&Smbios, 0); 126dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff 127dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff if (Smbios.Raw >= SmbiosEnd.Raw) { 128dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff // 129dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff // SMBIOS 2.1 incorrectly stated the length of SmbiosTable as 0x1e. 130dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff // given this we must double check against the length of the structure. 131dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff // 132dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff return EFI_SUCCESS; 133dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff } 134dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff } 135dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff 136dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff return EFI_SUCCESS; 137dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff} 138dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff 139dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff 140dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff/** 141e285199897e538523f762cb5b3900e81f872035avanjeff The common notify function associated with various PxeBc events. 142dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff 143f737cfb953905f42f3324e8e53ec324a15314210jgong @param Event The event signaled. 144f737cfb953905f42f3324e8e53ec324a15314210jgong @param Context The context. 145dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff 146dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff**/ 147dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeffVOID 1486d3ea23f1183f3378a53e44d34c0a27aebec7d9ajljustenEFIAPI 149dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeffPxeBcCommonNotify ( 150dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff IN EFI_EVENT Event, 151dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff IN VOID *Context 152dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff ) 153dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff{ 154dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff *((BOOLEAN *) Context) = TRUE; 155dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff} 156dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff 157f737cfb953905f42f3324e8e53ec324a15314210jgong 158f737cfb953905f42f3324e8e53ec324a15314210jgong/** 159f737cfb953905f42f3324e8e53ec324a15314210jgong This function initialize(or configure) the Udp4Write instance. 160e285199897e538523f762cb5b3900e81f872035avanjeff 161f737cfb953905f42f3324e8e53ec324a15314210jgong @param Udp4 Pointer to the EFI_UDP4_PROTOCOL instance. 162f737cfb953905f42f3324e8e53ec324a15314210jgong @param StationIp Pointer to the station ip address. 163f737cfb953905f42f3324e8e53ec324a15314210jgong @param SubnetMask Pointer to the subnetmask of the station ip address. 164f737cfb953905f42f3324e8e53ec324a15314210jgong @param Gateway Pointer to the gateway ip address. 165f737cfb953905f42f3324e8e53ec324a15314210jgong @param SrcPort Pointer to the srouce port of the station. 166e285199897e538523f762cb5b3900e81f872035avanjeff 167f737cfb953905f42f3324e8e53ec324a15314210jgong @retval EFI_SUCCESS The configuration settings were set, changed, or reset successfully. 168f737cfb953905f42f3324e8e53ec324a15314210jgong @retval EFI_NO_MAPPING When using a default address, configuration (DHCP, BOOTP, 169f737cfb953905f42f3324e8e53ec324a15314210jgong RARP, etc.) is not finished yet. 170f737cfb953905f42f3324e8e53ec324a15314210jgong @retval EFI_INVALID_PARAMETER One or more following conditions are TRUE: 171f737cfb953905f42f3324e8e53ec324a15314210jgong @retval EFI_ALREADY_STARTED The EFI UDPv4 Protocol instance is already started/configured 172f737cfb953905f42f3324e8e53ec324a15314210jgong and must be stopped/reset before it can be reconfigured. 173f737cfb953905f42f3324e8e53ec324a15314210jgong @retval EFI_ACCESS_DENIED UdpConfigData. AllowDuplicatePort is FALSE 174f737cfb953905f42f3324e8e53ec324a15314210jgong and UdpConfigData.StationPort is already used by 175f737cfb953905f42f3324e8e53ec324a15314210jgong other instance. 176f737cfb953905f42f3324e8e53ec324a15314210jgong @retval EFI_OUT_OF_RESOURCES The EFI UDPv4 Protocol driver cannot allocate memory for this 177f737cfb953905f42f3324e8e53ec324a15314210jgong EFI UDPv4 Protocol instance. 178f737cfb953905f42f3324e8e53ec324a15314210jgong @retval EFI_DEVICE_ERROR An unexpected network or system error occurred and this instance 179f737cfb953905f42f3324e8e53ec324a15314210jgong was not opened. 180f737cfb953905f42f3324e8e53ec324a15314210jgong @retval Others Please examine the function Udp4->Routes(Udp4, FALSE, &mZeroIp4Addr, &mZeroIp4Addr, Gateway) returns. 181e285199897e538523f762cb5b3900e81f872035avanjeff 182f737cfb953905f42f3324e8e53ec324a15314210jgong**/ 1838792362f22e4fac66aeec04b13b7a6b70cb571e9vanjeffEFI_STATUS 1848792362f22e4fac66aeec04b13b7a6b70cb571e9vanjeffPxeBcConfigureUdpWriteInstance ( 1858792362f22e4fac66aeec04b13b7a6b70cb571e9vanjeff IN EFI_UDP4_PROTOCOL *Udp4, 1868792362f22e4fac66aeec04b13b7a6b70cb571e9vanjeff IN EFI_IPv4_ADDRESS *StationIp, 1878792362f22e4fac66aeec04b13b7a6b70cb571e9vanjeff IN EFI_IPv4_ADDRESS *SubnetMask, 1888792362f22e4fac66aeec04b13b7a6b70cb571e9vanjeff IN EFI_IPv4_ADDRESS *Gateway, 1898792362f22e4fac66aeec04b13b7a6b70cb571e9vanjeff IN OUT UINT16 *SrcPort 1908792362f22e4fac66aeec04b13b7a6b70cb571e9vanjeff ) 1918792362f22e4fac66aeec04b13b7a6b70cb571e9vanjeff{ 1928792362f22e4fac66aeec04b13b7a6b70cb571e9vanjeff EFI_UDP4_CONFIG_DATA Udp4CfgData; 1938792362f22e4fac66aeec04b13b7a6b70cb571e9vanjeff EFI_STATUS Status; 1948792362f22e4fac66aeec04b13b7a6b70cb571e9vanjeff 1958792362f22e4fac66aeec04b13b7a6b70cb571e9vanjeff ZeroMem (&Udp4CfgData, sizeof (Udp4CfgData)); 1968792362f22e4fac66aeec04b13b7a6b70cb571e9vanjeff 1978792362f22e4fac66aeec04b13b7a6b70cb571e9vanjeff Udp4CfgData.ReceiveTimeout = 1000; 1988792362f22e4fac66aeec04b13b7a6b70cb571e9vanjeff Udp4CfgData.TypeOfService = DEFAULT_ToS; 1998792362f22e4fac66aeec04b13b7a6b70cb571e9vanjeff Udp4CfgData.TimeToLive = DEFAULT_TTL; 200319075ff6e1d1fb470667453ec24a2ba685f60a0vanjeff Udp4CfgData.AllowDuplicatePort = TRUE; 2018792362f22e4fac66aeec04b13b7a6b70cb571e9vanjeff 2028792362f22e4fac66aeec04b13b7a6b70cb571e9vanjeff CopyMem (&Udp4CfgData.StationAddress, StationIp, sizeof (*StationIp)); 2038792362f22e4fac66aeec04b13b7a6b70cb571e9vanjeff CopyMem (&Udp4CfgData.SubnetMask, SubnetMask, sizeof (*SubnetMask)); 2048792362f22e4fac66aeec04b13b7a6b70cb571e9vanjeff 2058792362f22e4fac66aeec04b13b7a6b70cb571e9vanjeff Udp4CfgData.StationPort = *SrcPort; 2068792362f22e4fac66aeec04b13b7a6b70cb571e9vanjeff 2078792362f22e4fac66aeec04b13b7a6b70cb571e9vanjeff // 2088792362f22e4fac66aeec04b13b7a6b70cb571e9vanjeff // Reset the instance. 2098792362f22e4fac66aeec04b13b7a6b70cb571e9vanjeff // 2108792362f22e4fac66aeec04b13b7a6b70cb571e9vanjeff Udp4->Configure (Udp4, NULL); 2118792362f22e4fac66aeec04b13b7a6b70cb571e9vanjeff 2128792362f22e4fac66aeec04b13b7a6b70cb571e9vanjeff Status = Udp4->Configure (Udp4, &Udp4CfgData); 2138792362f22e4fac66aeec04b13b7a6b70cb571e9vanjeff if (!EFI_ERROR (Status) && (Gateway->Addr[0] != 0)) { 2148792362f22e4fac66aeec04b13b7a6b70cb571e9vanjeff // 2158792362f22e4fac66aeec04b13b7a6b70cb571e9vanjeff // basic configuration OK, need to add the default route entry 2168792362f22e4fac66aeec04b13b7a6b70cb571e9vanjeff // 2178792362f22e4fac66aeec04b13b7a6b70cb571e9vanjeff Status = Udp4->Routes (Udp4, FALSE, &mZeroIp4Addr, &mZeroIp4Addr, Gateway); 2188792362f22e4fac66aeec04b13b7a6b70cb571e9vanjeff if (EFI_ERROR (Status)) { 2198792362f22e4fac66aeec04b13b7a6b70cb571e9vanjeff // 2208792362f22e4fac66aeec04b13b7a6b70cb571e9vanjeff // roll back 2218792362f22e4fac66aeec04b13b7a6b70cb571e9vanjeff // 2228792362f22e4fac66aeec04b13b7a6b70cb571e9vanjeff Udp4->Configure (Udp4, NULL); 2238792362f22e4fac66aeec04b13b7a6b70cb571e9vanjeff } 2248792362f22e4fac66aeec04b13b7a6b70cb571e9vanjeff } 2258792362f22e4fac66aeec04b13b7a6b70cb571e9vanjeff 2268792362f22e4fac66aeec04b13b7a6b70cb571e9vanjeff if (!EFI_ERROR (Status) && (*SrcPort == 0)) { 2278792362f22e4fac66aeec04b13b7a6b70cb571e9vanjeff Udp4->GetModeData (Udp4, &Udp4CfgData, NULL, NULL, NULL); 2288792362f22e4fac66aeec04b13b7a6b70cb571e9vanjeff *SrcPort = Udp4CfgData.StationPort; 2298792362f22e4fac66aeec04b13b7a6b70cb571e9vanjeff } 2308792362f22e4fac66aeec04b13b7a6b70cb571e9vanjeff 2318792362f22e4fac66aeec04b13b7a6b70cb571e9vanjeff return Status; 2328792362f22e4fac66aeec04b13b7a6b70cb571e9vanjeff} 2338792362f22e4fac66aeec04b13b7a6b70cb571e9vanjeff 234dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff 235dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff/** 236f737cfb953905f42f3324e8e53ec324a15314210jgong Convert number to ASCII value. 237dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff 238dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff @param Number Numeric value to convert to decimal ASCII value. 239f737cfb953905f42f3324e8e53ec324a15314210jgong @param Buffer Buffer to place ASCII version of the Number. 240dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff @param Length Length of Buffer. 241dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff 242dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff**/ 243dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeffVOID 244dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeffCvtNum ( 245dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff IN UINTN Number, 246dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff IN UINT8 *Buffer, 247f737cfb953905f42f3324e8e53ec324a15314210jgong IN UINTN Length 248dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff ) 249dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff{ 250dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff UINTN Remainder; 251dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff 252894d038a8d0e99d456042e2b6d1554c4a406ea70vanjeff while (Length > 0) { 253dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff Remainder = Number % 10; 254dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff Number /= 10; 255894d038a8d0e99d456042e2b6d1554c4a406ea70vanjeff Length--; 256dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff Buffer[Length] = (UINT8) ('0' + Remainder); 257dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff } 258dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff} 259dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff 260dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff 261dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff/** 262f737cfb953905f42f3324e8e53ec324a15314210jgong Convert unsigned int number to decimal number. 263dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff 264f737cfb953905f42f3324e8e53ec324a15314210jgong @param Number The unsigned int number will be converted. 265f737cfb953905f42f3324e8e53ec324a15314210jgong @param Buffer Pointer to the buffer to store the decimal number after transform. 266dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff 267f737cfb953905f42f3324e8e53ec324a15314210jgong @return the length of the number after transform. 268dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff 269dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff**/ 270dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeffUINTN 271dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeffUtoA10 ( 272dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff IN UINTN Number, 273dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff IN CHAR8 *Buffer 274dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff ) 275dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff{ 276dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff UINTN Index; 277dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff CHAR8 TempStr[64]; 278dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff 279dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff Index = 63; 280dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff TempStr[Index] = 0; 281dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff 282dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff do { 283dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff Index--; 284dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff TempStr[Index] = (CHAR8) ('0' + (Number % 10)); 285dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff Number = Number / 10; 286dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff } while (Number != 0); 287dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff 288dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff AsciiStrCpy (Buffer, &TempStr[Index]); 289dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff 290dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff return AsciiStrLen (Buffer); 291dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff} 292dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff 293dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff 294dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff/** 295f737cfb953905f42f3324e8e53ec324a15314210jgong Convert ASCII numeric string to a UINTN value. 296dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff 297f737cfb953905f42f3324e8e53ec324a15314210jgong @param Buffer Pointer to the 8-byte unsigned int value. 298dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff 299f737cfb953905f42f3324e8e53ec324a15314210jgong @return UINTN value of the ASCII string. 300dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff 301dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff**/ 302dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeffUINT64 303dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeffAtoU64 ( 304dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff IN UINT8 *Buffer 305dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff ) 306dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff{ 307dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff UINT64 Value; 308dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff UINT8 Character; 309dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff 310dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff Value = 0; 311dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff while ((Character = *Buffer++) != '\0') { 312dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff Value = MultU64x32 (Value, 10) + (Character - '0'); 313dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff } 314dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff 315dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff return Value; 316dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff} 317dc361cc5a04657ddc8c74bd8f044f7ad30c4118avanjeff 318