**/\r
\r
#include "Ip4ConfigNv.h"\r
+#include "NicIp4Variable.h"\r
\r
EFI_GUID mNicIp4ConfigNvDataGuid = EFI_NIC_IP4_CONFIG_NVDATA_GUID;\r
\r
Convert the decimal dotted IPv4 address into the binary IPv4 address.\r
\r
@param[in] Str The UNICODE string.\r
- @param[out] Ip The storage to return the ASCII string.\r
+ @param[out] Ip The storage to return the IPv4 address.\r
\r
@retval EFI_SUCCESS The binary IP address is returned in Ip.\r
@retval EFI_INVALID_PARAMETER The IP string is malformatted.\r
**/\r
EFI_STATUS\r
-Ip4AsciiStrToIp (\r
- IN CHAR8 *Str,\r
+Ip4StrToIp (\r
+ IN CHAR16 *Str,\r
OUT EFI_IPv4_ADDRESS *Ip\r
)\r
{\r
\r
Index = 0;\r
\r
- while (*Str != 0) {\r
+ while (*Str != L'\0') {\r
\r
if (Index > 3) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
Number = 0;\r
- while (NET_IS_DIGIT (*Str)) {\r
- Number = Number * 10 + (*Str - '0');\r
+ while ((*Str >= L'0') && (*Str <= L'9')) {\r
+ Number = Number * 10 + (*Str - L'0');\r
Str++;\r
}\r
\r
\r
Ip->Addr[Index] = (UINT8) Number;\r
\r
- if ((*Str != '\0') && (*Str != '.')) {\r
+ if ((*Str != L'\0') && (*Str != L'.')) {\r
//\r
// The current character should be either the NULL terminator or\r
// the dot delimiter.\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
- if (*Str == '.') {\r
+ if (*Str == L'.') {\r
//\r
// Skip the delimiter.\r
//\r
OUT IP4_CONFIG_IFR_NVDATA *IfrFormNvData\r
)\r
{\r
- EFI_STATUS Status;\r
- NIC_IP4_CONFIG_INFO *NicConfig;\r
- UINTN ConfigLen;\r
-\r
- ConfigLen = sizeof (NIC_IP4_CONFIG_INFO) + sizeof (EFI_IP4_ROUTE_TABLE) * 2;\r
- NicConfig = AllocateZeroPool (ConfigLen);\r
- ASSERT (NicConfig != NULL);\r
- Status = EfiNicIp4ConfigGetInfo (Ip4ConfigInstance, &ConfigLen, NicConfig);\r
- if (!EFI_ERROR (Status)) {\r
+ NIC_IP4_CONFIG_INFO *NicConfig;\r
+\r
+ NicConfig = EfiNicIp4ConfigGetInfo (Ip4ConfigInstance);\r
+ if (NicConfig != NULL) {\r
IfrFormNvData->Configure = 1;\r
if (NicConfig->Source == IP4_CONFIG_SOURCE_DHCP) {\r
IfrFormNvData->DhcpEnable = 1;\r
Ip4ConfigIpToStr (&NicConfig->Ip4Info.SubnetMask, IfrFormNvData->SubnetMask);\r
Ip4ConfigIpToStr (&NicConfig->Ip4Info.RouteTable[1].GatewayAddress, IfrFormNvData->GatewayAddress);\r
}\r
+\r
+ FreePool (NicConfig);\r
} else {\r
IfrFormNvData->Configure = 0;\r
}\r
-\r
- FreePool (NicConfig);\r
}\r
\r
/**\r
Convert the IFR data into the network configuration data and set the IP\r
configure parameters for the NIC.\r
\r
+ @param[in] IfrFormNvData The IFR NV data.\r
@param[in, out] Ip4ConfigInstance The IP4Config instance.\r
\r
@retval EFI_SUCCESS The configure parameter for this NIC was\r
**/\r
EFI_STATUS\r
Ip4ConfigConvertIfrNvDataToDeviceConfigData (\r
+ IN IP4_CONFIG_IFR_NVDATA *IfrFormNvData,\r
IN OUT IP4_CONFIG_INSTANCE *Ip4ConfigInstance\r
)\r
{\r
NIC_IP4_CONFIG_INFO *NicInfo;\r
EFI_IP_ADDRESS Ip;\r
\r
+ ZeroMem (&Ip4ConfigInstance->Ip4ConfigCallbackInfo, sizeof (IP4_SETTING_INFO));\r
+\r
+ Ip4ConfigInstance->Ip4ConfigCallbackInfo.Configured = IfrFormNvData->Configure;\r
+ Ip4ConfigInstance->Ip4ConfigCallbackInfo.DhcpEnabled = IfrFormNvData->DhcpEnable;\r
+ Ip4StrToIp (IfrFormNvData->StationAddress, &Ip4ConfigInstance->Ip4ConfigCallbackInfo.LocalIp);\r
+ Ip4StrToIp (IfrFormNvData->SubnetMask, &Ip4ConfigInstance->Ip4ConfigCallbackInfo.SubnetMask);\r
+ Ip4StrToIp (IfrFormNvData->GatewayAddress, &Ip4ConfigInstance->Ip4ConfigCallbackInfo.Gateway);\r
+\r
if (!Ip4ConfigInstance->Ip4ConfigCallbackInfo.Configured) {\r
//\r
// Clear the variable\r
)\r
{\r
EFI_STATUS Status;\r
- UINTN ConfigLen;\r
NIC_IP4_CONFIG_INFO *IfrDeviceNvData;\r
+ NIC_IP4_CONFIG_INFO *NicConfig;\r
IP4_CONFIG_INSTANCE *Ip4ConfigInstance;\r
IP4_CONFIG_IFR_NVDATA *IfrFormNvData;\r
EFI_STRING ConfigRequestHdr;\r
return EFI_OUT_OF_RESOURCES;\r
}\r
\r
- ConfigLen = sizeof (NIC_IP4_CONFIG_INFO) + sizeof (EFI_IP4_ROUTE_TABLE) * 2;\r
- Status = EfiNicIp4ConfigGetInfo (Ip4ConfigInstance, &ConfigLen, IfrDeviceNvData);\r
- if (EFI_ERROR (Status)) {\r
- FreePool (IfrDeviceNvData);\r
+ NicConfig = EfiNicIp4ConfigGetInfo (Ip4ConfigInstance);\r
+ if (NicConfig == NULL) {\r
return EFI_NOT_FOUND;\r
}\r
+ CopyMem (IfrDeviceNvData, NicConfig, SIZEOF_NIC_IP4_CONFIG_INFO (NicConfig));\r
+ FreePool (NicConfig);\r
\r
ConfigRequest = Request;\r
if ((Request == NULL) || (StrStr (Request, L"OFFSET") == NULL)) {\r
if (EFI_ERROR (Status)) {\r
goto Failure;\r
}\r
- } \r
- \r
+ }\r
+\r
if ((Request == NULL) || HiiIsConfigHdrMatch (Request, &mNicIp4ConfigNvDataGuid, EFI_NIC_IP4_CONFIG_VARIABLE)) {\r
\r
- IfrFormNvData = AllocateZeroPool (NIC_ITEM_CONFIG_SIZE);\r
+ IfrFormNvData = AllocateZeroPool (sizeof (IP4_CONFIG_IFR_NVDATA));\r
if (IfrFormNvData == NULL) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX", ConfigRequestHdr, (UINT64)BufferSize);\r
FreePool (ConfigRequestHdr);\r
}\r
- \r
+\r
//\r
// Convert buffer data to <ConfigResp> by helper function BlockToConfig()\r
//\r
} else if (StrStr (Request, L"OFFSET") == NULL) {\r
*Progress = Request + StrLen (Request);\r
}\r
- \r
+\r
return Status;\r
}\r
\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
+ //\r
+ // Reclaim Ip4Config variable\r
+ //\r
+ Ip4ConfigReclaimVariable ();\r
+\r
*Progress = Configuration;\r
\r
Ip4ConfigInstance = IP4_CONFIG_INSTANCE_FROM_CONFIG_ACCESS (This);\r
Progress\r
);\r
if (!EFI_ERROR (Status)) {\r
- Status = Ip4ConfigConvertIfrNvDataToDeviceConfigData (Ip4ConfigInstance);\r
+ Status = Ip4ConfigConvertIfrNvDataToDeviceConfigData (IfrFormNvData, Ip4ConfigInstance);\r
}\r
\r
FreePool (IfrFormNvData);\r
if (!EFI_ERROR (Status)) {\r
ZeroMem (&ZeroMac, sizeof (EFI_MAC_ADDRESS));\r
if (CompareMem (&IfrDeviceNvData->NicAddr.MacAddr, &ZeroMac, IfrDeviceNvData->NicAddr.Len) != 0) {\r
- BufferSize = sizeof (NIC_IP4_CONFIG_INFO) + sizeof (EFI_IP4_ROUTE_TABLE) * IfrDeviceNvData->Ip4Info.RouteTableSize;\r
+ BufferSize = SIZEOF_NIC_IP4_CONFIG_INFO (IfrDeviceNvData);\r
NicInfo = AllocateCopyPool (BufferSize, IfrDeviceNvData);\r
+ if (NicInfo == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
Status = EfiNicIp4ConfigSetInfo (Ip4ConfigInstance, NicInfo, TRUE);\r
+ FreePool (NicInfo);\r
} else {\r
ZeroMem (&Ip4ConfigInstance->Ip4ConfigCallbackInfo, sizeof (IP4_SETTING_INFO));\r
Status = EfiNicIp4ConfigSetInfo (Ip4ConfigInstance, NULL, TRUE);\r
)\r
{\r
IP4_CONFIG_INSTANCE *Ip4ConfigInstance;\r
- CHAR8 Ip4String[IP4_STR_MAX_SIZE];\r
IP4_CONFIG_IFR_NVDATA *IfrFormNvData;\r
EFI_IP_ADDRESS HostIp;\r
EFI_IP_ADDRESS SubnetMask;\r
EFI_STATUS Status;\r
EFI_INPUT_KEY Key;\r
\r
- if ((Action == EFI_BROWSER_ACTION_FORM_OPEN) || (Action == EFI_BROWSER_ACTION_FORM_CLOSE)) {
+ if ((Action == EFI_BROWSER_ACTION_FORM_OPEN) || (Action == EFI_BROWSER_ACTION_FORM_CLOSE)) {\r
//\r
// Do nothing for UEFI OPEN/CLOSE Action\r
//\r
- return EFI_SUCCESS;
+ return EFI_SUCCESS;\r
}\r
\r
Ip4ConfigInstance = IP4_CONFIG_INSTANCE_FROM_CONFIG_ACCESS (This);\r
Status = EFI_SUCCESS;\r
\r
switch (QuestionId) {\r
-\r
- case KEY_ENABLE:\r
- if (IfrFormNvData->Configure == 0) {\r
- Ip4ConfigInstance->Ip4ConfigCallbackInfo.Configured = FALSE;\r
- } else {\r
- Ip4ConfigInstance->Ip4ConfigCallbackInfo.Configured = TRUE;\r
- }\r
- break;\r
-\r
- case KEY_DHCP_ENABLE:\r
- if (IfrFormNvData->DhcpEnable == 0) {\r
- Ip4ConfigInstance->Ip4ConfigCallbackInfo.DhcpEnabled = FALSE;\r
- } else {\r
- Ip4ConfigInstance->Ip4ConfigCallbackInfo.DhcpEnabled = TRUE;\r
- }\r
-\r
- break;\r
-\r
case KEY_LOCAL_IP:\r
- UnicodeStrToAsciiStr (IfrFormNvData->StationAddress, Ip4String);\r
- Status = Ip4AsciiStrToIp (Ip4String, &HostIp.v4);\r
+ Status = Ip4StrToIp (IfrFormNvData->StationAddress, &HostIp.v4);\r
if (EFI_ERROR (Status) || !NetIp4IsUnicast (NTOHL (HostIp.Addr[0]), 0)) {\r
CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid IP address!", NULL);\r
Status = EFI_INVALID_PARAMETER;\r
break;\r
\r
case KEY_SUBNET_MASK:\r
- UnicodeStrToAsciiStr (IfrFormNvData->SubnetMask, Ip4String);\r
- Status = Ip4AsciiStrToIp (Ip4String, &SubnetMask.v4);\r
+ Status = Ip4StrToIp (IfrFormNvData->SubnetMask, &SubnetMask.v4);\r
if (EFI_ERROR (Status) || ((SubnetMask.Addr[0] != 0) && (GetSubnetMaskPrefixLength (&SubnetMask.v4) == 0))) {\r
- CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid SubnetMask!", NULL);\r
+ CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid Subnet Mask!", NULL);\r
Status = EFI_INVALID_PARAMETER;\r
} else {\r
CopyMem (&Ip4ConfigInstance->Ip4ConfigCallbackInfo.SubnetMask, &SubnetMask.v4, sizeof (SubnetMask.v4));\r
break;\r
\r
case KEY_GATE_WAY:\r
- UnicodeStrToAsciiStr (IfrFormNvData->GatewayAddress, Ip4String);\r
- Status = Ip4AsciiStrToIp (Ip4String, &Gateway.v4);\r
+ Status = Ip4StrToIp (IfrFormNvData->GatewayAddress, &Gateway.v4);\r
if (EFI_ERROR (Status) || ((Gateway.Addr[0] != 0) && !NetIp4IsUnicast (NTOHL (Gateway.Addr[0]), 0))) {\r
CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, L"Invalid Gateway!", NULL);\r
Status = EFI_INVALID_PARAMETER;\r
break;\r
\r
case KEY_SAVE_CHANGES:\r
-\r
- Status = Ip4ConfigConvertIfrNvDataToDeviceConfigData (Ip4ConfigInstance);\r
-\r
+ Status = Ip4ConfigConvertIfrNvDataToDeviceConfigData (IfrFormNvData, Ip4ConfigInstance);\r
*ActionRequest = EFI_BROWSER_ACTION_REQUEST_SUBMIT;\r
-\r
break;\r
\r
default:\r
-\r
break;\r
}\r
\r
- if (!EFI_ERROR (Status)) {\r
- //\r
- // Pass changed uncommitted data back to Form Browser\r
- //\r
- HiiSetBrowserData (&gEfiNicIp4ConfigVariableGuid, EFI_NIC_IP4_CONFIG_VARIABLE, sizeof (IP4_CONFIG_IFR_NVDATA), (UINT8 *) IfrFormNvData, NULL);\r
- }\r
-\r
FreePool (IfrFormNvData);\r
\r
return Status;\r