]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Network/Ip4ConfigDxe/Ip4ConfigNv.c
1. update to use 1 EFI Variable per NIC (instead of converge all NIC configuration...
[mirror_edk2.git] / MdeModulePkg / Universal / Network / Ip4ConfigDxe / Ip4ConfigNv.c
index c0d27aac78c1f6eeed8a7155d070239e25577c44..fa78678adea2845cf856d08e61e746a497f2b579 100644 (file)
@@ -13,6 +13,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 **/\r
 \r
 #include "Ip4ConfigNv.h"\r
+#include "NicIp4Variable.h"\r
 \r
 EFI_GUID  mNicIp4ConfigNvDataGuid = EFI_NIC_IP4_CONFIG_NVDATA_GUID;\r
 \r
@@ -61,14 +62,14 @@ GetSubnetMaskPrefixLength (
   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  CHAR            *Str,\r
+Ip4StrToIp (\r
+  IN  CHAR16            *Str,\r
   OUT EFI_IPv4_ADDRESS  *Ip\r
   )\r
 {\r
@@ -77,15 +78,15 @@ Ip4AsciiStrToIp (
 \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
@@ -95,7 +96,7 @@ Ip4AsciiStrToIp (
 \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
@@ -103,7 +104,7 @@ Ip4AsciiStrToIp (
       return EFI_INVALID_PARAMETER;\r
     }\r
 \r
-    if (*Str == '.') {\r
+    if (*Str == L'.') {\r
       //\r
       // Skip the delimiter.\r
       //\r
@@ -148,15 +149,10 @@ Ip4ConfigConvertDeviceConfigDataToIfrNvData (
   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
@@ -166,17 +162,18 @@ Ip4ConfigConvertDeviceConfigDataToIfrNvData (
       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
@@ -187,6 +184,7 @@ Ip4ConfigConvertDeviceConfigDataToIfrNvData (
 **/\r
 EFI_STATUS\r
 Ip4ConfigConvertIfrNvDataToDeviceConfigData (\r
+  IN     IP4_CONFIG_IFR_NVDATA     *IfrFormNvData,\r
   IN OUT IP4_CONFIG_INSTANCE       *Ip4ConfigInstance\r
   )\r
 {\r
@@ -198,6 +196,14 @@ Ip4ConfigConvertIfrNvDataToDeviceConfigData (
   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
@@ -332,8 +338,8 @@ Ip4DeviceExtractConfig (
   )\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
@@ -367,12 +373,12 @@ Ip4DeviceExtractConfig (
       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
@@ -415,11 +421,11 @@ Ip4DeviceExtractConfig (
     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
@@ -442,7 +448,7 @@ Ip4DeviceExtractConfig (
       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
@@ -499,7 +505,7 @@ Failure:
   } else if (StrStr (Request, L"OFFSET") == NULL) {\r
     *Progress = Request + StrLen (Request);\r
   }\r
-  \r
+\r
   return Status;\r
 }\r
 \r
@@ -556,6 +562,11 @@ Ip4DeviceRouteConfig (
     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
@@ -581,7 +592,7 @@ Ip4DeviceRouteConfig (
                                   Progress\r
                                   );\r
     if (!EFI_ERROR (Status)) {\r
-      Status = Ip4ConfigConvertIfrNvDataToDeviceConfigData (Ip4ConfigInstance);\r
+      Status = Ip4ConfigConvertIfrNvDataToDeviceConfigData (IfrFormNvData, Ip4ConfigInstance);\r
     }\r
 \r
     FreePool (IfrFormNvData);\r
@@ -604,9 +615,13 @@ Ip4DeviceRouteConfig (
     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
@@ -662,7 +677,6 @@ Ip4FormCallback (
   )\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
@@ -670,11 +684,11 @@ Ip4FormCallback (
   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
@@ -695,27 +709,8 @@ Ip4FormCallback (
   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
@@ -726,10 +721,9 @@ Ip4FormCallback (
     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
@@ -738,8 +732,7 @@ Ip4FormCallback (
     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
@@ -750,25 +743,14 @@ Ip4FormCallback (
     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