1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453 |
- /** @file
- Helper functions for configuring or getting the parameters relating to Ip4.
- Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.<BR>
- SPDX-License-Identifier: BSD-2-Clause-Patent
- **/
- #include "Ip4Impl.h"
- CHAR16 mIp4Config2StorageName[] = L"IP4_CONFIG2_IFR_NVDATA";
- /**
- Calculate the prefix length of the IPv4 subnet mask.
- @param[in] SubnetMask The IPv4 subnet mask.
- @return The prefix length of the subnet mask.
- @retval 0 Other errors as indicated.
- **/
- UINT8
- GetSubnetMaskPrefixLength (
- IN EFI_IPv4_ADDRESS *SubnetMask
- )
- {
- UINT8 Len;
- UINT32 ReverseMask;
- //
- // The SubnetMask is in network byte order.
- //
- ReverseMask = SwapBytes32 (*(UINT32 *)&SubnetMask[0]);
- //
- // Reverse it.
- //
- ReverseMask = ~ReverseMask;
- if ((ReverseMask & (ReverseMask + 1)) != 0) {
- return 0;
- }
- Len = 0;
- while (ReverseMask != 0) {
- ReverseMask = ReverseMask >> 1;
- Len++;
- }
- return (UINT8)(32 - Len);
- }
- /**
- Convert the decimal dotted IPv4 address into the binary IPv4 address.
- @param[in] Str The UNICODE string.
- @param[out] Ip The storage to return the IPv4 address.
- @retval EFI_SUCCESS The binary IP address is returned in Ip.
- @retval EFI_INVALID_PARAMETER The IP string is malformatted.
- **/
- EFI_STATUS
- Ip4Config2StrToIp (
- IN CHAR16 *Str,
- OUT EFI_IPv4_ADDRESS *Ip
- )
- {
- UINTN Index;
- UINTN Number;
- Index = 0;
- while (*Str != L'\0') {
- if (Index > 3) {
- return EFI_INVALID_PARAMETER;
- }
- Number = 0;
- while ((*Str >= L'0') && (*Str <= L'9')) {
- Number = Number * 10 + (*Str - L'0');
- Str++;
- }
- if (Number > 0xFF) {
- return EFI_INVALID_PARAMETER;
- }
- Ip->Addr[Index] = (UINT8)Number;
- if ((*Str != L'\0') && (*Str != L'.')) {
- //
- // The current character should be either the NULL terminator or
- // the dot delimiter.
- //
- return EFI_INVALID_PARAMETER;
- }
- if (*Str == L'.') {
- //
- // Skip the delimiter.
- //
- Str++;
- }
- Index++;
- }
- if (Index != 4) {
- return EFI_INVALID_PARAMETER;
- }
- return EFI_SUCCESS;
- }
- /**
- Convert the decimal dotted IPv4 addresses separated by space into the binary IPv4 address list.
- @param[in] Str The UNICODE string contains IPv4 addresses.
- @param[out] PtrIpList The storage to return the IPv4 address list.
- @param[out] IpCount The size of the IPv4 address list.
- @retval EFI_SUCCESS The binary IP address list is returned in PtrIpList.
- @retval EFI_OUT_OF_RESOURCES Error occurs in allocating memory.
- @retval EFI_INVALID_PARAMETER The IP string is malformatted.
- **/
- EFI_STATUS
- Ip4Config2StrToIpList (
- IN CHAR16 *Str,
- OUT EFI_IPv4_ADDRESS **PtrIpList,
- OUT UINTN *IpCount
- )
- {
- UINTN BeginIndex;
- UINTN EndIndex;
- UINTN Index;
- UINTN IpIndex;
- CHAR16 *StrTemp;
- BOOLEAN SpaceTag;
- BeginIndex = 0;
- EndIndex = BeginIndex;
- Index = 0;
- IpIndex = 0;
- StrTemp = NULL;
- SpaceTag = TRUE;
- *PtrIpList = NULL;
- *IpCount = 0;
- if (Str == NULL) {
- return EFI_SUCCESS;
- }
- //
- // Get the number of Ip.
- //
- while (*(Str + Index) != L'\0') {
- if (*(Str + Index) == L' ') {
- SpaceTag = TRUE;
- } else {
- if (SpaceTag) {
- (*IpCount)++;
- SpaceTag = FALSE;
- }
- }
- Index++;
- }
- if (*IpCount == 0) {
- return EFI_SUCCESS;
- }
- //
- // Allocate buffer for IpList.
- //
- *PtrIpList = AllocateZeroPool (*IpCount * sizeof (EFI_IPv4_ADDRESS));
- if (*PtrIpList == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
- //
- // Get IpList from Str.
- //
- Index = 0;
- while (*(Str + Index) != L'\0') {
- if (*(Str + Index) == L' ') {
- if (!SpaceTag) {
- StrTemp = AllocateZeroPool ((EndIndex - BeginIndex + 1) * sizeof (CHAR16));
- if (StrTemp == NULL) {
- FreePool (*PtrIpList);
- *PtrIpList = NULL;
- *IpCount = 0;
- return EFI_OUT_OF_RESOURCES;
- }
- CopyMem (StrTemp, Str + BeginIndex, (EndIndex - BeginIndex) * sizeof (CHAR16));
- *(StrTemp + (EndIndex - BeginIndex)) = L'\0';
- if (Ip4Config2StrToIp (StrTemp, &((*PtrIpList)[IpIndex])) != EFI_SUCCESS) {
- FreePool (StrTemp);
- FreePool (*PtrIpList);
- *PtrIpList = NULL;
- *IpCount = 0;
- return EFI_INVALID_PARAMETER;
- }
- BeginIndex = EndIndex;
- IpIndex++;
- FreePool (StrTemp);
- }
- BeginIndex++;
- EndIndex++;
- SpaceTag = TRUE;
- } else {
- EndIndex++;
- SpaceTag = FALSE;
- }
- Index++;
- if (*(Str + Index) == L'\0') {
- if (!SpaceTag) {
- StrTemp = AllocateZeroPool ((EndIndex - BeginIndex + 1) * sizeof (CHAR16));
- if (StrTemp == NULL) {
- FreePool (*PtrIpList);
- *PtrIpList = NULL;
- *IpCount = 0;
- return EFI_OUT_OF_RESOURCES;
- }
- CopyMem (StrTemp, Str + BeginIndex, (EndIndex - BeginIndex) * sizeof (CHAR16));
- *(StrTemp + (EndIndex - BeginIndex)) = L'\0';
- if (Ip4Config2StrToIp (StrTemp, &((*PtrIpList)[IpIndex])) != EFI_SUCCESS) {
- FreePool (StrTemp);
- FreePool (*PtrIpList);
- *PtrIpList = NULL;
- *IpCount = 0;
- return EFI_INVALID_PARAMETER;
- }
- FreePool (StrTemp);
- }
- }
- }
- return EFI_SUCCESS;
- }
- /**
- Convert the IPv4 address into a dotted string.
- @param[in] Ip The IPv4 address.
- @param[out] Str The dotted IP string.
- **/
- VOID
- Ip4Config2IpToStr (
- IN EFI_IPv4_ADDRESS *Ip,
- OUT CHAR16 *Str
- )
- {
- UnicodeSPrint (
- Str,
- 2 * IP4_STR_MAX_SIZE,
- L"%d.%d.%d.%d",
- Ip->Addr[0],
- Ip->Addr[1],
- Ip->Addr[2],
- Ip->Addr[3]
- );
- }
- /**
- Convert the IPv4 address list into string consists of several decimal
- dotted IPv4 addresses separated by space.
- @param[in] Ip The IPv4 address list.
- @param[in] IpCount The size of IPv4 address list.
- @param[out] Str The string contains several decimal dotted
- IPv4 addresses separated by space.
- @retval EFI_SUCCESS Operation is success.
- @retval EFI_OUT_OF_RESOURCES Error occurs in allocating memory.
- **/
- EFI_STATUS
- Ip4Config2IpListToStr (
- IN EFI_IPv4_ADDRESS *Ip,
- IN UINTN IpCount,
- OUT CHAR16 *Str
- )
- {
- UINTN Index;
- UINTN TemIndex;
- UINTN StrIndex;
- CHAR16 *TempStr;
- EFI_IPv4_ADDRESS *TempIp;
- Index = 0;
- TemIndex = 0;
- StrIndex = 0;
- TempStr = NULL;
- TempIp = NULL;
- for (Index = 0; Index < IpCount; Index++) {
- TempIp = Ip + Index;
- if (TempStr == NULL) {
- TempStr = AllocateZeroPool (2 * IP4_STR_MAX_SIZE);
- if (TempStr == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
- }
- UnicodeSPrint (
- TempStr,
- 2 * IP4_STR_MAX_SIZE,
- L"%d.%d.%d.%d",
- TempIp->Addr[0],
- TempIp->Addr[1],
- TempIp->Addr[2],
- TempIp->Addr[3]
- );
- for (TemIndex = 0; TemIndex < IP4_STR_MAX_SIZE; TemIndex++) {
- if (*(TempStr + TemIndex) == L'\0') {
- if (Index == IpCount - 1) {
- Str[StrIndex++] = L'\0';
- } else {
- Str[StrIndex++] = L' ';
- }
- break;
- } else {
- Str[StrIndex++] = *(TempStr + TemIndex);
- }
- }
- }
- if (TempStr != NULL) {
- FreePool (TempStr);
- }
- return EFI_SUCCESS;
- }
- /**
- The notify function of create event when performing a manual configuration.
- @param[in] Event The pointer of Event.
- @param[in] Context The pointer of Context.
- **/
- VOID
- EFIAPI
- Ip4Config2ManualAddressNotify (
- IN EFI_EVENT Event,
- IN VOID *Context
- )
- {
- *((BOOLEAN *)Context) = TRUE;
- }
- /**
- Convert the network configuration data into the IFR data.
- @param[in] Instance The IP4 config2 instance.
- @param[in, out] IfrNvData The IFR nv data.
- @retval EFI_SUCCESS The configure parameter to IFR data was
- set successfully.
- @retval EFI_INVALID_PARAMETER Source instance or target IFR data is not available.
- @retval Others Other errors as indicated.
- **/
- EFI_STATUS
- Ip4Config2ConvertConfigNvDataToIfrNvData (
- IN IP4_CONFIG2_INSTANCE *Instance,
- IN OUT IP4_CONFIG2_IFR_NVDATA *IfrNvData
- )
- {
- IP4_SERVICE *IpSb;
- EFI_IP4_CONFIG2_PROTOCOL *Ip4Config2;
- EFI_IP4_CONFIG2_INTERFACE_INFO *Ip4Info;
- EFI_IP4_CONFIG2_POLICY Policy;
- UINTN DataSize;
- UINTN GatewaySize;
- EFI_IPv4_ADDRESS GatewayAddress;
- EFI_STATUS Status;
- UINTN DnsSize;
- UINTN DnsCount;
- EFI_IPv4_ADDRESS *DnsAddress;
- Status = EFI_SUCCESS;
- Ip4Config2 = &Instance->Ip4Config2;
- Ip4Info = NULL;
- DnsAddress = NULL;
- GatewaySize = sizeof (EFI_IPv4_ADDRESS);
- if ((IfrNvData == NULL) || (Instance == NULL)) {
- return EFI_INVALID_PARAMETER;
- }
- NET_CHECK_SIGNATURE (Instance, IP4_CONFIG2_INSTANCE_SIGNATURE);
- IpSb = IP4_SERVICE_FROM_IP4_CONFIG2_INSTANCE (Instance);
- if (IpSb->DefaultInterface->Configured) {
- IfrNvData->Configure = 1;
- } else {
- IfrNvData->Configure = 0;
- goto Exit;
- }
- //
- // Get the Policy info.
- //
- DataSize = sizeof (EFI_IP4_CONFIG2_POLICY);
- Status = Ip4Config2->GetData (
- Ip4Config2,
- Ip4Config2DataTypePolicy,
- &DataSize,
- &Policy
- );
- if (EFI_ERROR (Status)) {
- goto Exit;
- }
- if (Policy == Ip4Config2PolicyStatic) {
- IfrNvData->DhcpEnable = FALSE;
- } else if (Policy == Ip4Config2PolicyDhcp) {
- IfrNvData->DhcpEnable = TRUE;
- goto Exit;
- }
- //
- // Get the interface info.
- //
- DataSize = 0;
- Status = Ip4Config2->GetData (
- Ip4Config2,
- Ip4Config2DataTypeInterfaceInfo,
- &DataSize,
- NULL
- );
- if (Status != EFI_BUFFER_TOO_SMALL) {
- return Status;
- }
- Ip4Info = AllocateZeroPool (DataSize);
- if (Ip4Info == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
- return Status;
- }
- Status = Ip4Config2->GetData (
- Ip4Config2,
- Ip4Config2DataTypeInterfaceInfo,
- &DataSize,
- Ip4Info
- );
- if (EFI_ERROR (Status)) {
- goto Exit;
- }
- //
- // Get the Gateway info.
- //
- Status = Ip4Config2->GetData (
- Ip4Config2,
- Ip4Config2DataTypeGateway,
- &GatewaySize,
- &GatewayAddress
- );
- if (EFI_ERROR (Status)) {
- goto Exit;
- }
- //
- // Get the Dns info.
- //
- DnsSize = 0;
- Status = Ip4Config2->GetData (
- Ip4Config2,
- Ip4Config2DataTypeDnsServer,
- &DnsSize,
- NULL
- );
- if ((Status != EFI_BUFFER_TOO_SMALL) && (Status != EFI_NOT_FOUND)) {
- goto Exit;
- }
- DnsCount = (UINT32)(DnsSize / sizeof (EFI_IPv4_ADDRESS));
- if (DnsSize > 0) {
- DnsAddress = AllocateZeroPool (DnsSize);
- if (DnsAddress == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
- goto Exit;
- }
- Status = Ip4Config2->GetData (
- Ip4Config2,
- Ip4Config2DataTypeDnsServer,
- &DnsSize,
- DnsAddress
- );
- if (EFI_ERROR (Status)) {
- goto Exit;
- }
- }
- Ip4Config2IpToStr (&Ip4Info->StationAddress, IfrNvData->StationAddress);
- Ip4Config2IpToStr (&Ip4Info->SubnetMask, IfrNvData->SubnetMask);
- Ip4Config2IpToStr (&GatewayAddress, IfrNvData->GatewayAddress);
- Status = Ip4Config2IpListToStr (DnsAddress, DnsCount, IfrNvData->DnsAddress);
- Exit:
- if (DnsAddress != NULL) {
- FreePool (DnsAddress);
- }
- if (Ip4Info != NULL) {
- FreePool (Ip4Info);
- }
- return Status;
- }
- /**
- Convert the IFR data into the network configuration data and set the IP
- configure parameters for the NIC.
- @param[in] IfrFormNvData The IFR NV data.
- @param[in, out] Instance The IP4 config2 instance.
- @retval EFI_SUCCESS The configure parameter for this NIC was
- set successfully.
- @retval EFI_INVALID_PARAMETER The address information for setting is invalid.
- @retval Others Other errors as indicated.
- **/
- EFI_STATUS
- Ip4Config2ConvertIfrNvDataToConfigNvData (
- IN IP4_CONFIG2_IFR_NVDATA *IfrFormNvData,
- IN OUT IP4_CONFIG2_INSTANCE *Instance
- )
- {
- EFI_STATUS Status;
- EFI_IP4_CONFIG2_PROTOCOL *Ip4Cfg2;
- IP4_CONFIG2_NVDATA *Ip4NvData;
- EFI_IP_ADDRESS StationAddress;
- EFI_IP_ADDRESS SubnetMask;
- EFI_IP_ADDRESS Gateway;
- IP4_ADDR Ip;
- EFI_IPv4_ADDRESS *DnsAddress;
- UINTN DnsCount;
- UINTN Index;
- EFI_EVENT TimeoutEvent;
- EFI_EVENT SetAddressEvent;
- BOOLEAN IsAddressOk;
- UINTN DataSize;
- EFI_INPUT_KEY Key;
- Status = EFI_SUCCESS;
- Ip4Cfg2 = &Instance->Ip4Config2;
- Ip4NvData = &Instance->Ip4NvData;
- DnsCount = 0;
- DnsAddress = NULL;
- TimeoutEvent = NULL;
- SetAddressEvent = NULL;
- if ((Instance == NULL) || (IfrFormNvData == NULL)) {
- return EFI_INVALID_PARAMETER;
- }
- if (IfrFormNvData->Configure != TRUE) {
- return EFI_SUCCESS;
- }
- if (IfrFormNvData->DhcpEnable == TRUE) {
- Ip4NvData->Policy = Ip4Config2PolicyDhcp;
- Status = Ip4Cfg2->SetData (
- Ip4Cfg2,
- Ip4Config2DataTypePolicy,
- sizeof (EFI_IP4_CONFIG2_POLICY),
- &Ip4NvData->Policy
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
- } else {
- //
- // Get Ip4NvData from IfrFormNvData if it is valid.
- //
- Ip4NvData->Policy = Ip4Config2PolicyStatic;
- Status = Ip4Config2StrToIp (IfrFormNvData->SubnetMask, &SubnetMask.v4);
- if (EFI_ERROR (Status) || ((SubnetMask.Addr[0] != 0) && (GetSubnetMaskPrefixLength (&SubnetMask.v4) == 0))) {
- CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid Subnet Mask!", NULL);
- return EFI_INVALID_PARAMETER;
- }
- Status = Ip4Config2StrToIp (IfrFormNvData->StationAddress, &StationAddress.v4);
- if (EFI_ERROR (Status) ||
- ((SubnetMask.Addr[0] != 0) && !NetIp4IsUnicast (NTOHL (StationAddress.Addr[0]), NTOHL (SubnetMask.Addr[0]))) ||
- !Ip4StationAddressValid (NTOHL (StationAddress.Addr[0]), NTOHL (SubnetMask.Addr[0])))
- {
- CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid IP address!", NULL);
- return EFI_INVALID_PARAMETER;
- }
- Status = Ip4Config2StrToIp (IfrFormNvData->GatewayAddress, &Gateway.v4);
- if (EFI_ERROR (Status) ||
- ((Gateway.Addr[0] != 0) && (SubnetMask.Addr[0] != 0) && !NetIp4IsUnicast (NTOHL (Gateway.Addr[0]), NTOHL (SubnetMask.Addr[0]))))
- {
- CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid Gateway!", NULL);
- return EFI_INVALID_PARAMETER;
- }
- Status = Ip4Config2StrToIpList (IfrFormNvData->DnsAddress, &DnsAddress, &DnsCount);
- if (!EFI_ERROR (Status) && (DnsCount > 0)) {
- for (Index = 0; Index < DnsCount; Index++) {
- CopyMem (&Ip, &DnsAddress[Index], sizeof (IP4_ADDR));
- if (IP4_IS_UNSPECIFIED (NTOHL (Ip)) || IP4_IS_LOCAL_BROADCAST (NTOHL (Ip))) {
- CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid Dns Server!", NULL);
- FreePool (DnsAddress);
- return EFI_INVALID_PARAMETER;
- }
- }
- } else {
- if (EFI_ERROR (Status)) {
- CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid Dns Server!", NULL);
- }
- }
- if (Ip4NvData->ManualAddress != NULL) {
- FreePool (Ip4NvData->ManualAddress);
- }
- Ip4NvData->ManualAddressCount = 1;
- Ip4NvData->ManualAddress = AllocateZeroPool (sizeof (EFI_IP4_CONFIG2_MANUAL_ADDRESS));
- if (Ip4NvData->ManualAddress == NULL) {
- if (DnsAddress != NULL) {
- FreePool (DnsAddress);
- }
- return EFI_OUT_OF_RESOURCES;
- }
- CopyMem (&Ip4NvData->ManualAddress->Address, &StationAddress.v4, sizeof (EFI_IPv4_ADDRESS));
- CopyMem (&Ip4NvData->ManualAddress->SubnetMask, &SubnetMask.v4, sizeof (EFI_IPv4_ADDRESS));
- if (Ip4NvData->GatewayAddress != NULL) {
- FreePool (Ip4NvData->GatewayAddress);
- }
- Ip4NvData->GatewayAddressCount = 1;
- Ip4NvData->GatewayAddress = AllocateZeroPool (sizeof (EFI_IPv4_ADDRESS));
- if (Ip4NvData->GatewayAddress == NULL) {
- if (DnsAddress != NULL) {
- FreePool (DnsAddress);
- }
- return EFI_OUT_OF_RESOURCES;
- }
- CopyMem (Ip4NvData->GatewayAddress, &Gateway.v4, sizeof (EFI_IPv4_ADDRESS));
- if (Ip4NvData->DnsAddress != NULL) {
- FreePool (Ip4NvData->DnsAddress);
- }
- Ip4NvData->DnsAddressCount = (UINT32)DnsCount;
- Ip4NvData->DnsAddress = DnsAddress;
- //
- // Setting Ip4NvData.
- //
- Status = Ip4Cfg2->SetData (
- Ip4Cfg2,
- Ip4Config2DataTypePolicy,
- sizeof (EFI_IP4_CONFIG2_POLICY),
- &Ip4NvData->Policy
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
- //
- // Create events & timers for asynchronous settings.
- //
- Status = gBS->CreateEvent (
- EVT_TIMER,
- TPL_CALLBACK,
- NULL,
- NULL,
- &TimeoutEvent
- );
- if (EFI_ERROR (Status)) {
- return EFI_OUT_OF_RESOURCES;
- }
- Status = gBS->CreateEvent (
- EVT_NOTIFY_SIGNAL,
- TPL_NOTIFY,
- Ip4Config2ManualAddressNotify,
- &IsAddressOk,
- &SetAddressEvent
- );
- if (EFI_ERROR (Status)) {
- goto Exit;
- }
- IsAddressOk = FALSE;
- Status = Ip4Cfg2->RegisterDataNotify (
- Ip4Cfg2,
- Ip4Config2DataTypeManualAddress,
- SetAddressEvent
- );
- if (EFI_ERROR (Status)) {
- goto Exit;
- }
- //
- // Set ManualAddress.
- //
- DataSize = Ip4NvData->ManualAddressCount * sizeof (EFI_IP4_CONFIG2_MANUAL_ADDRESS);
- Status = Ip4Cfg2->SetData (
- Ip4Cfg2,
- Ip4Config2DataTypeManualAddress,
- DataSize,
- (VOID *)Ip4NvData->ManualAddress
- );
- if (Status == EFI_NOT_READY) {
- gBS->SetTimer (TimeoutEvent, TimerRelative, 50000000);
- while (EFI_ERROR (gBS->CheckEvent (TimeoutEvent))) {
- if (IsAddressOk) {
- Status = EFI_SUCCESS;
- break;
- }
- }
- }
- Ip4Cfg2->UnregisterDataNotify (
- Ip4Cfg2,
- Ip4Config2DataTypeManualAddress,
- SetAddressEvent
- );
- if (EFI_ERROR (Status)) {
- goto Exit;
- }
- //
- // Set gateway.
- //
- DataSize = Ip4NvData->GatewayAddressCount * sizeof (EFI_IPv4_ADDRESS);
- Status = Ip4Cfg2->SetData (
- Ip4Cfg2,
- Ip4Config2DataTypeGateway,
- DataSize,
- Ip4NvData->GatewayAddress
- );
- if (EFI_ERROR (Status)) {
- goto Exit;
- }
- //
- // Set DNS addresses.
- //
- if ((Ip4NvData->DnsAddressCount > 0) && (Ip4NvData->DnsAddress != NULL)) {
- DataSize = Ip4NvData->DnsAddressCount * sizeof (EFI_IPv4_ADDRESS);
- Status = Ip4Cfg2->SetData (
- Ip4Cfg2,
- Ip4Config2DataTypeDnsServer,
- DataSize,
- Ip4NvData->DnsAddress
- );
- if (EFI_ERROR (Status)) {
- goto Exit;
- }
- }
- }
- Exit:
- if (SetAddressEvent != NULL) {
- gBS->CloseEvent (SetAddressEvent);
- }
- if (TimeoutEvent != NULL) {
- gBS->CloseEvent (TimeoutEvent);
- }
- return Status;
- }
- /**
- This function allows the caller to request the current
- configuration for one or more named elements. The resulting
- string is in <ConfigAltResp> format. Any and all alternative
- configuration strings shall also be appended to the end of the
- current configuration string. If they are, they must appear
- after the current configuration. They must contain the same
- routing (GUID, NAME, PATH) as the current configuration string.
- They must have an additional description indicating the type of
- alternative configuration the string represents,
- "ALTCFG=<StringToken>". That <StringToken> (when
- converted from Hex UNICODE to binary) is a reference to a
- string in the associated string pack.
- @param[in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
- @param[in] Request A null-terminated Unicode string in
- <ConfigRequest> format. Note that this
- includes the routing information as well as
- the configurable name / value pairs. It is
- invalid for this string to be in
- <MultiConfigRequest> format.
- @param[out] Progress On return, points to a character in the
- Request string. Points to the string's null
- terminator if request was successful. Points
- to the most recent "&" before the first
- failing name / value pair (or the beginning
- of the string if the failure is in the first
- name / value pair) if the request was not
- successful.
- @param[out] Results A null-terminated Unicode string in
- <ConfigAltResp> format which has all values
- filled in for the names in the Request string.
- String to be allocated by the called function.
- @retval EFI_SUCCESS The Results string is filled with the
- values corresponding to all requested
- names.
- @retval EFI_OUT_OF_RESOURCES Not enough memory to store the
- parts of the results that must be
- stored awaiting possible future
- protocols.
- @retval EFI_NOT_FOUND Routing data doesn't match any
- known driver. Progress set to the
- first character in the routing header.
- Note: There is no requirement that the
- driver validate the routing data. It
- must skip the <ConfigHdr> in order to
- process the names.
- @retval EFI_INVALID_PARAMETER Illegal syntax. Progress set
- to most recent & before the
- error or the beginning of the
- string.
- @retval EFI_INVALID_PARAMETER Unknown name. Progress points
- to the & before the name in
- question.Currently not implemented.
- **/
- EFI_STATUS
- EFIAPI
- Ip4FormExtractConfig (
- IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
- IN CONST EFI_STRING Request,
- OUT EFI_STRING *Progress,
- OUT EFI_STRING *Results
- )
- {
- EFI_STATUS Status;
- IP4_CONFIG2_INSTANCE *Ip4Config2Instance;
- IP4_FORM_CALLBACK_INFO *Private;
- IP4_CONFIG2_IFR_NVDATA *IfrFormNvData;
- EFI_STRING ConfigRequestHdr;
- EFI_STRING ConfigRequest;
- BOOLEAN AllocatedRequest;
- EFI_STRING FormResult;
- UINTN Size;
- UINTN BufferSize;
- if ((Progress == NULL) || (Results == NULL)) {
- return EFI_INVALID_PARAMETER;
- }
- Status = EFI_SUCCESS;
- IfrFormNvData = NULL;
- ConfigRequest = NULL;
- FormResult = NULL;
- Size = 0;
- AllocatedRequest = FALSE;
- ConfigRequest = Request;
- Private = IP4_FORM_CALLBACK_INFO_FROM_CONFIG_ACCESS (This);
- Ip4Config2Instance = IP4_CONFIG2_INSTANCE_FROM_FORM_CALLBACK (Private);
- BufferSize = sizeof (IP4_CONFIG2_IFR_NVDATA);
- *Progress = Request;
- //
- // Check Request data in <ConfigHdr>.
- //
- if ((Request == NULL) || HiiIsConfigHdrMatch (Request, &gIp4Config2NvDataGuid, mIp4Config2StorageName)) {
- IfrFormNvData = AllocateZeroPool (sizeof (IP4_CONFIG2_IFR_NVDATA));
- if (IfrFormNvData == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
- Ip4Config2ConvertConfigNvDataToIfrNvData (Ip4Config2Instance, IfrFormNvData);
- if ((Request == NULL) || (StrStr (Request, L"OFFSET") == NULL)) {
- //
- // Request has no request element, construct full request string.
- // Allocate and fill a buffer large enough to hold the <ConfigHdr> template
- // followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW" followed by a Null-terminator
- //
- ConfigRequestHdr = HiiConstructConfigHdr (&gIp4Config2NvDataGuid, mIp4Config2StorageName, Private->ChildHandle);
- Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16);
- ConfigRequest = AllocateZeroPool (Size);
- if (ConfigRequest == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
- goto Failure;
- }
- AllocatedRequest = TRUE;
- UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX", ConfigRequestHdr, (UINT64)BufferSize);
- FreePool (ConfigRequestHdr);
- }
- //
- // Convert buffer data to <ConfigResp> by helper function BlockToConfig()
- //
- Status = gHiiConfigRouting->BlockToConfig (
- gHiiConfigRouting,
- ConfigRequest,
- (UINT8 *)IfrFormNvData,
- BufferSize,
- &FormResult,
- Progress
- );
- FreePool (IfrFormNvData);
- //
- // Free the allocated config request string.
- //
- if (AllocatedRequest) {
- FreePool (ConfigRequest);
- ConfigRequest = NULL;
- }
- if (EFI_ERROR (Status)) {
- goto Failure;
- }
- }
- if ((Request == NULL) || HiiIsConfigHdrMatch (Request, &gIp4Config2NvDataGuid, mIp4Config2StorageName)) {
- *Results = FormResult;
- } else {
- return EFI_NOT_FOUND;
- }
- Failure:
- //
- // Set Progress string to the original request string.
- //
- if (Request == NULL) {
- *Progress = NULL;
- } else if (StrStr (Request, L"OFFSET") == NULL) {
- *Progress = Request + StrLen (Request);
- }
- return Status;
- }
- /**
- This function applies changes in a driver's configuration.
- Input is a Configuration, which has the routing data for this
- driver followed by name / value configuration pairs. The driver
- must apply those pairs to its configurable storage. If the
- driver's configuration is stored in a linear block of data
- and the driver's name / value pairs are in <BlockConfig>
- format, it may use the ConfigToBlock helper function (above) to
- simplify the job. Currently not implemented.
- @param[in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
- @param[in] Configuration A null-terminated Unicode string in
- <ConfigString> format.
- @param[out] Progress A pointer to a string filled in with the
- offset of the most recent '&' before the
- first failing name / value pair (or the
- beginning of the string if the failure
- is in the first name / value pair) or
- the terminating NULL if all was
- successful.
- @retval EFI_SUCCESS The results have been distributed or are
- awaiting distribution.
- @retval EFI_OUT_OF_MEMORY Not enough memory to store the
- parts of the results that must be
- stored awaiting possible future
- protocols.
- @retval EFI_INVALID_PARAMETERS Passing in a NULL for the
- Results parameter would result
- in this type of error.
- @retval EFI_NOT_FOUND Target for the specified routing data
- was not found.
- **/
- EFI_STATUS
- EFIAPI
- Ip4FormRouteConfig (
- IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
- IN CONST EFI_STRING Configuration,
- OUT EFI_STRING *Progress
- )
- {
- EFI_STATUS Status;
- UINTN BufferSize;
- IP4_CONFIG2_IFR_NVDATA *IfrFormNvData;
- IP4_CONFIG2_INSTANCE *Ip4Config2Instance;
- IP4_FORM_CALLBACK_INFO *Private;
- Status = EFI_SUCCESS;
- IfrFormNvData = NULL;
- if ((Configuration == NULL) || (Progress == NULL)) {
- return EFI_INVALID_PARAMETER;
- }
- *Progress = Configuration;
- Private = IP4_FORM_CALLBACK_INFO_FROM_CONFIG_ACCESS (This);
- Ip4Config2Instance = IP4_CONFIG2_INSTANCE_FROM_FORM_CALLBACK (Private);
- //
- // Check Routing data in <ConfigHdr>.
- //
- if (HiiIsConfigHdrMatch (Configuration, &gIp4Config2NvDataGuid, mIp4Config2StorageName)) {
- //
- // Convert buffer data to <ConfigResp> by helper function BlockToConfig()
- //
- IfrFormNvData = AllocateZeroPool (sizeof (IP4_CONFIG2_IFR_NVDATA));
- if (IfrFormNvData == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
- BufferSize = 0;
- Status = gHiiConfigRouting->ConfigToBlock (
- gHiiConfigRouting,
- Configuration,
- (UINT8 *)IfrFormNvData,
- &BufferSize,
- Progress
- );
- if (Status != EFI_BUFFER_TOO_SMALL) {
- return Status;
- }
- Status = gHiiConfigRouting->ConfigToBlock (
- gHiiConfigRouting,
- Configuration,
- (UINT8 *)IfrFormNvData,
- &BufferSize,
- Progress
- );
- if (!EFI_ERROR (Status)) {
- Status = Ip4Config2ConvertIfrNvDataToConfigNvData (IfrFormNvData, Ip4Config2Instance);
- }
- FreePool (IfrFormNvData);
- } else {
- return EFI_NOT_FOUND;
- }
- return Status;
- }
- /**
- This function is called to provide results data to the driver.
- This data consists of a unique key that is used to identify
- which data is either being passed back or being asked for.
- @param[in] This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.
- @param[in] Action Specifies the type of action taken by the browser.
- @param[in] QuestionId A unique value which is sent to the original
- exporting driver so that it can identify the type
- of data to expect. The format of the data tends to
- vary based on the opcode that enerated the callback.
- @param[in] Type The type of value for the question.
- @param[in] Value A pointer to the data being sent to the original
- exporting driver.
- @param[out] ActionRequest On return, points to the action requested by the
- callback function.
- @retval EFI_SUCCESS The callback successfully handled the action.
- @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold the
- variable and its data.
- @retval EFI_DEVICE_ERROR The variable could not be saved.
- @retval EFI_UNSUPPORTED The specified Action is not supported by the
- callback. Currently not implemented.
- @retval EFI_INVALID_PARAMETERS Passing in wrong parameter.
- @retval Others Other errors as indicated.
- **/
- EFI_STATUS
- EFIAPI
- Ip4FormCallback (
- IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
- IN EFI_BROWSER_ACTION Action,
- IN EFI_QUESTION_ID QuestionId,
- IN UINT8 Type,
- IN EFI_IFR_TYPE_VALUE *Value,
- OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest
- )
- {
- EFI_STATUS Status;
- IP4_CONFIG2_INSTANCE *Instance;
- IP4_CONFIG2_IFR_NVDATA *IfrFormNvData;
- IP4_FORM_CALLBACK_INFO *Private;
- EFI_IP_ADDRESS StationAddress;
- EFI_IP_ADDRESS SubnetMask;
- EFI_IP_ADDRESS Gateway;
- IP4_ADDR Ip;
- EFI_IPv4_ADDRESS *DnsAddress;
- UINTN DnsCount;
- UINTN Index;
- EFI_INPUT_KEY Key;
- IfrFormNvData = NULL;
- DnsCount = 0;
- DnsAddress = NULL;
- if (Action == EFI_BROWSER_ACTION_CHANGED) {
- Private = IP4_FORM_CALLBACK_INFO_FROM_CONFIG_ACCESS (This);
- Instance = IP4_CONFIG2_INSTANCE_FROM_FORM_CALLBACK (Private);
- IfrFormNvData = AllocateZeroPool (sizeof (IP4_CONFIG2_IFR_NVDATA));
- if (IfrFormNvData == NULL) {
- return EFI_OUT_OF_RESOURCES;
- }
- //
- // Retrieve uncommitted data from Browser
- //
- if (!HiiGetBrowserData (&gIp4Config2NvDataGuid, mIp4Config2StorageName, sizeof (IP4_CONFIG2_IFR_NVDATA), (UINT8 *)IfrFormNvData)) {
- FreePool (IfrFormNvData);
- return EFI_NOT_FOUND;
- }
- Status = EFI_SUCCESS;
- switch (QuestionId) {
- case KEY_LOCAL_IP:
- Status = Ip4Config2StrToIp (IfrFormNvData->StationAddress, &StationAddress.v4);
- if (EFI_ERROR (Status) || IP4_IS_UNSPECIFIED (NTOHL (StationAddress.Addr[0])) || IP4_IS_LOCAL_BROADCAST (NTOHL (StationAddress.Addr[0]))) {
- CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid IP address!", NULL);
- Status = EFI_INVALID_PARAMETER;
- }
- break;
- case KEY_SUBNET_MASK:
- Status = Ip4Config2StrToIp (IfrFormNvData->SubnetMask, &SubnetMask.v4);
- if (EFI_ERROR (Status) || ((SubnetMask.Addr[0] != 0) && (GetSubnetMaskPrefixLength (&SubnetMask.v4) == 0))) {
- CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid Subnet Mask!", NULL);
- Status = EFI_INVALID_PARAMETER;
- }
- break;
- case KEY_GATE_WAY:
- Status = Ip4Config2StrToIp (IfrFormNvData->GatewayAddress, &Gateway.v4);
- if (EFI_ERROR (Status) || IP4_IS_LOCAL_BROADCAST (NTOHL (Gateway.Addr[0]))) {
- CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid Gateway!", NULL);
- Status = EFI_INVALID_PARAMETER;
- }
- break;
- case KEY_DNS:
- Status = Ip4Config2StrToIpList (IfrFormNvData->DnsAddress, &DnsAddress, &DnsCount);
- if (!EFI_ERROR (Status) && (DnsCount > 0)) {
- for (Index = 0; Index < DnsCount; Index++) {
- CopyMem (&Ip, &DnsAddress[Index], sizeof (IP4_ADDR));
- if (IP4_IS_UNSPECIFIED (NTOHL (Ip)) || IP4_IS_LOCAL_BROADCAST (NTOHL (Ip))) {
- CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid Dns Server!", NULL);
- Status = EFI_INVALID_PARAMETER;
- break;
- }
- }
- } else {
- if (EFI_ERROR (Status)) {
- CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid Dns Server!", NULL);
- }
- }
- if (DnsAddress != NULL) {
- FreePool (DnsAddress);
- }
- break;
- case KEY_SAVE_CHANGES:
- Status = Ip4Config2ConvertIfrNvDataToConfigNvData (IfrFormNvData, Instance);
- *ActionRequest = EFI_BROWSER_ACTION_REQUEST_SUBMIT;
- break;
- default:
- break;
- }
- FreePool (IfrFormNvData);
- return Status;
- }
- //
- // All other action return unsupported.
- //
- return EFI_UNSUPPORTED;
- }
- /**
- Install HII Config Access protocol for network device and allocate resource.
- @param[in, out] Instance The IP4 config2 Instance.
- @retval EFI_SUCCESS The HII Config Access protocol is installed.
- @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
- @retval Others Other errors as indicated.
- **/
- EFI_STATUS
- Ip4Config2FormInit (
- IN OUT IP4_CONFIG2_INSTANCE *Instance
- )
- {
- EFI_STATUS Status;
- IP4_SERVICE *IpSb;
- IP4_FORM_CALLBACK_INFO *CallbackInfo;
- EFI_HII_CONFIG_ACCESS_PROTOCOL *ConfigAccess;
- VENDOR_DEVICE_PATH VendorDeviceNode;
- EFI_SERVICE_BINDING_PROTOCOL *MnpSb;
- CHAR16 *MacString;
- CHAR16 MenuString[128];
- CHAR16 PortString[128];
- CHAR16 *OldMenuString;
- EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
- IpSb = IP4_SERVICE_FROM_IP4_CONFIG2_INSTANCE (Instance);
- ASSERT (IpSb != NULL);
- CallbackInfo = &Instance->CallbackInfo;
- CallbackInfo->Signature = IP4_FORM_CALLBACK_INFO_SIGNATURE;
- Status = gBS->HandleProtocol (
- IpSb->Controller,
- &gEfiDevicePathProtocolGuid,
- (VOID **)&ParentDevicePath
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
- //
- // Construct device path node for EFI HII Config Access protocol,
- // which consists of controller physical device path and one hardware
- // vendor guid node.
- //
- ZeroMem (&VendorDeviceNode, sizeof (VENDOR_DEVICE_PATH));
- VendorDeviceNode.Header.Type = HARDWARE_DEVICE_PATH;
- VendorDeviceNode.Header.SubType = HW_VENDOR_DP;
- CopyGuid (&VendorDeviceNode.Guid, &gEfiCallerIdGuid);
- SetDevicePathNodeLength (&VendorDeviceNode.Header, sizeof (VENDOR_DEVICE_PATH));
- CallbackInfo->HiiVendorDevicePath = AppendDevicePathNode (
- ParentDevicePath,
- (EFI_DEVICE_PATH_PROTOCOL *)&VendorDeviceNode
- );
- if (CallbackInfo->HiiVendorDevicePath == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
- goto Error;
- }
- ConfigAccess = &CallbackInfo->HiiConfigAccessProtocol;
- ConfigAccess->ExtractConfig = Ip4FormExtractConfig;
- ConfigAccess->RouteConfig = Ip4FormRouteConfig;
- ConfigAccess->Callback = Ip4FormCallback;
- //
- // Install Device Path Protocol and Config Access protocol on new handle
- //
- Status = gBS->InstallMultipleProtocolInterfaces (
- &CallbackInfo->ChildHandle,
- &gEfiDevicePathProtocolGuid,
- CallbackInfo->HiiVendorDevicePath,
- &gEfiHiiConfigAccessProtocolGuid,
- ConfigAccess,
- NULL
- );
- if (!EFI_ERROR (Status)) {
- //
- // Open the Parent Handle for the child
- //
- Status = gBS->OpenProtocol (
- IpSb->Controller,
- &gEfiManagedNetworkServiceBindingProtocolGuid,
- (VOID **)&MnpSb,
- IpSb->Image,
- CallbackInfo->ChildHandle,
- EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
- );
- }
- if (EFI_ERROR (Status)) {
- goto Error;
- }
- //
- // Publish our HII data
- //
- CallbackInfo->RegisteredHandle = HiiAddPackages (
- &gIp4Config2NvDataGuid,
- CallbackInfo->ChildHandle,
- Ip4DxeStrings,
- Ip4Config2Bin,
- NULL
- );
- if (CallbackInfo->RegisteredHandle == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
- goto Error;
- }
- //
- // Append MAC string in the menu help string and tile help string
- //
- Status = NetLibGetMacString (IpSb->Controller, IpSb->Image, &MacString);
- if (!EFI_ERROR (Status)) {
- OldMenuString = HiiGetString (
- CallbackInfo->RegisteredHandle,
- STRING_TOKEN (STR_IP4_CONFIG2_FORM_HELP),
- NULL
- );
- UnicodeSPrint (MenuString, 128, L"%s (MAC:%s)", OldMenuString, MacString);
- HiiSetString (
- CallbackInfo->RegisteredHandle,
- STRING_TOKEN (STR_IP4_CONFIG2_FORM_HELP),
- MenuString,
- NULL
- );
- UnicodeSPrint (PortString, 128, L"MAC:%s", MacString);
- HiiSetString (
- CallbackInfo->RegisteredHandle,
- STRING_TOKEN (STR_IP4_DEVICE_FORM_HELP),
- PortString,
- NULL
- );
- FreePool (MacString);
- FreePool (OldMenuString);
- return EFI_SUCCESS;
- }
- Error:
- Ip4Config2FormUnload (Instance);
- return Status;
- }
- /**
- Uninstall the HII Config Access protocol for network devices and free up the resources.
- @param[in, out] Instance The IP4 config2 instance to unload a form.
- **/
- VOID
- Ip4Config2FormUnload (
- IN OUT IP4_CONFIG2_INSTANCE *Instance
- )
- {
- IP4_SERVICE *IpSb;
- IP4_FORM_CALLBACK_INFO *CallbackInfo;
- IP4_CONFIG2_NVDATA *Ip4NvData;
- IpSb = IP4_SERVICE_FROM_IP4_CONFIG2_INSTANCE (Instance);
- ASSERT (IpSb != NULL);
- CallbackInfo = &Instance->CallbackInfo;
- if (CallbackInfo->ChildHandle != NULL) {
- //
- // Close the child handle
- //
- gBS->CloseProtocol (
- IpSb->Controller,
- &gEfiManagedNetworkServiceBindingProtocolGuid,
- IpSb->Image,
- CallbackInfo->ChildHandle
- );
- //
- // Uninstall EFI_HII_CONFIG_ACCESS_PROTOCOL
- //
- gBS->UninstallMultipleProtocolInterfaces (
- CallbackInfo->ChildHandle,
- &gEfiDevicePathProtocolGuid,
- CallbackInfo->HiiVendorDevicePath,
- &gEfiHiiConfigAccessProtocolGuid,
- &CallbackInfo->HiiConfigAccessProtocol,
- NULL
- );
- }
- if (CallbackInfo->HiiVendorDevicePath != NULL) {
- FreePool (CallbackInfo->HiiVendorDevicePath);
- }
- if (CallbackInfo->RegisteredHandle != NULL) {
- //
- // Remove HII package list
- //
- HiiRemovePackages (CallbackInfo->RegisteredHandle);
- }
- Ip4NvData = &Instance->Ip4NvData;
- if (Ip4NvData->ManualAddress != NULL) {
- FreePool (Ip4NvData->ManualAddress);
- }
- if (Ip4NvData->GatewayAddress != NULL) {
- FreePool (Ip4NvData->GatewayAddress);
- }
- if (Ip4NvData->DnsAddress != NULL) {
- FreePool (Ip4NvData->DnsAddress);
- }
- Ip4NvData->ManualAddressCount = 0;
- Ip4NvData->GatewayAddressCount = 0;
- Ip4NvData->DnsAddressCount = 0;
- }
|