]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Network/Ip4ConfigDxe/Ip4ConfigNv.c
Per UEFI spec, on CallBack action EFI_BROWSER_ACTION_CHANGING, the return value of...
[mirror_edk2.git] / MdeModulePkg / Universal / Network / Ip4ConfigDxe / Ip4ConfigNv.c
index fa78678adea2845cf856d08e61e746a497f2b579..58c4c1a02cd05ae856c85ac3b1946de8c3ca6070 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Helper functions for configuring or getting the parameters relating to Ip4.\r
 \r
-Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>\r
 This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
@@ -15,9 +15,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #include "Ip4ConfigNv.h"\r
 #include "NicIp4Variable.h"\r
 \r
-EFI_GUID  mNicIp4ConfigNvDataGuid = EFI_NIC_IP4_CONFIG_NVDATA_GUID;\r
-\r
-\r
 /**\r
   Calculate the prefix length of the IPv4 subnet mask.\r
 \r
@@ -37,7 +34,7 @@ GetSubnetMaskPrefixLength (
   //\r
   // The SubnetMask is in network byte order.\r
   //\r
-  ReverseMask = (SubnetMask->Addr[0] << 24) | (SubnetMask->Addr[1] << 16) | (SubnetMask->Addr[2] << 8) | (SubnetMask->Addr[3]);\r
+  ReverseMask = SwapBytes32 (*(UINT32 *)&SubnetMask[0]);\r
 \r
   //\r
   // Reverse it.\r
@@ -154,18 +151,26 @@ Ip4ConfigConvertDeviceConfigDataToIfrNvData (
   NicConfig = EfiNicIp4ConfigGetInfo (Ip4ConfigInstance);\r
   if (NicConfig != NULL) {\r
     IfrFormNvData->Configure = 1;\r
+    Ip4ConfigInstance->Ip4ConfigCallbackInfo.Configured = TRUE;\r
     if (NicConfig->Source == IP4_CONFIG_SOURCE_DHCP) {\r
       IfrFormNvData->DhcpEnable = 1;\r
+      Ip4ConfigInstance->Ip4ConfigCallbackInfo.DhcpEnabled = TRUE;\r
     } else {\r
       IfrFormNvData->DhcpEnable = 0;\r
       Ip4ConfigIpToStr (&NicConfig->Ip4Info.StationAddress, IfrFormNvData->StationAddress);\r
       Ip4ConfigIpToStr (&NicConfig->Ip4Info.SubnetMask, IfrFormNvData->SubnetMask);\r
       Ip4ConfigIpToStr (&NicConfig->Ip4Info.RouteTable[1].GatewayAddress, IfrFormNvData->GatewayAddress);\r
+\r
+      Ip4ConfigInstance->Ip4ConfigCallbackInfo.DhcpEnabled = FALSE;\r
+      CopyMem (&Ip4ConfigInstance->Ip4ConfigCallbackInfo.LocalIp, &NicConfig->Ip4Info.StationAddress, sizeof (EFI_IPv4_ADDRESS));\r
+      CopyMem (&Ip4ConfigInstance->Ip4ConfigCallbackInfo.SubnetMask, &NicConfig->Ip4Info.SubnetMask, sizeof (EFI_IPv4_ADDRESS));\r
+      CopyMem (&Ip4ConfigInstance->Ip4ConfigCallbackInfo.Gateway, &NicConfig->Ip4Info.RouteTable[1].GatewayAddress, sizeof (EFI_IPv4_ADDRESS));\r
     }\r
 \r
     FreePool (NicConfig);\r
   } else {\r
     IfrFormNvData->Configure = 0;\r
+    Ip4ConfigInstance->Ip4ConfigCallbackInfo.Configured = FALSE;\r
   }\r
 }\r
 \r
@@ -423,7 +428,7 @@ Ip4DeviceExtractConfig (
     }\r
   }\r
 \r
-  if ((Request == NULL) || HiiIsConfigHdrMatch (Request, &mNicIp4ConfigNvDataGuid, EFI_NIC_IP4_CONFIG_VARIABLE)) {\r
+  if ((Request == NULL) || HiiIsConfigHdrMatch (Request, &gNicIp4ConfigNvDataGuid, EFI_NIC_IP4_CONFIG_VARIABLE)) {\r
 \r
     IfrFormNvData = AllocateZeroPool (sizeof (IP4_CONFIG_IFR_NVDATA));\r
     if (IfrFormNvData == NULL) {\r
@@ -439,7 +444,7 @@ Ip4DeviceExtractConfig (
       // Allocate and fill a buffer large enough to hold the <ConfigHdr> template\r
       // followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW" followed by a Null-terminator\r
       //\r
-      ConfigRequestHdr = HiiConstructConfigHdr (&mNicIp4ConfigNvDataGuid, EFI_NIC_IP4_CONFIG_VARIABLE, Ip4ConfigInstance->ChildHandle);\r
+      ConfigRequestHdr = HiiConstructConfigHdr (&gNicIp4ConfigNvDataGuid, EFI_NIC_IP4_CONFIG_VARIABLE, Ip4ConfigInstance->ChildHandle);\r
       Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16);\r
       ConfigRequest = AllocateZeroPool (Size);\r
       ASSERT (ConfigRequest != NULL);\r
@@ -490,7 +495,7 @@ Ip4DeviceExtractConfig (
     FreePool (FormResult);\r
   } else if (HiiIsConfigHdrMatch (Request, &gEfiNicIp4ConfigVariableGuid, EFI_NIC_IP4_CONFIG_VARIABLE)) {\r
     *Results = DeviceResult;\r
-  } else if (HiiIsConfigHdrMatch (Request, &mNicIp4ConfigNvDataGuid, EFI_NIC_IP4_CONFIG_VARIABLE)) {\r
+  } else if (HiiIsConfigHdrMatch (Request, &gNicIp4ConfigNvDataGuid, EFI_NIC_IP4_CONFIG_VARIABLE)) {\r
     *Results = FormResult;\r
   } else {\r
     return EFI_NOT_FOUND;\r
@@ -574,7 +579,7 @@ Ip4DeviceRouteConfig (
   //\r
   // Check Routing data in <ConfigHdr>.\r
   //\r
-  if (HiiIsConfigHdrMatch (Configuration, &mNicIp4ConfigNvDataGuid, EFI_NIC_IP4_CONFIG_VARIABLE)) {\r
+  if (HiiIsConfigHdrMatch (Configuration, &gNicIp4ConfigNvDataGuid, EFI_NIC_IP4_CONFIG_VARIABLE)) {\r
     //\r
     // Convert buffer data to <ConfigResp> by helper function BlockToConfig()\r
     //\r
@@ -684,76 +689,76 @@ Ip4FormCallback (
   EFI_STATUS                Status;\r
   EFI_INPUT_KEY             Key;\r
 \r
-  if ((Action == EFI_BROWSER_ACTION_FORM_OPEN) || (Action == EFI_BROWSER_ACTION_FORM_CLOSE)) {\r
+  if (Action == EFI_BROWSER_ACTION_CHANGED) {\r
+    Ip4ConfigInstance = IP4_CONFIG_INSTANCE_FROM_CONFIG_ACCESS (This);\r
+\r
+    IfrFormNvData = AllocateZeroPool (sizeof (IP4_CONFIG_IFR_NVDATA));\r
+    if (IfrFormNvData == NULL) {\r
+      return EFI_OUT_OF_RESOURCES;\r
+    }\r
+\r
     //\r
-    // Do nothing for UEFI OPEN/CLOSE Action\r
+    // Retrive uncommitted data from Browser\r
     //\r
-    return EFI_SUCCESS;\r
-  }\r
+    if (!HiiGetBrowserData (&gNicIp4ConfigNvDataGuid, EFI_NIC_IP4_CONFIG_VARIABLE, sizeof (IP4_CONFIG_IFR_NVDATA), (UINT8 *) IfrFormNvData)) {\r
+      FreePool (IfrFormNvData);\r
+      return EFI_NOT_FOUND;\r
+    }\r
 \r
-  Ip4ConfigInstance = IP4_CONFIG_INSTANCE_FROM_CONFIG_ACCESS (This);\r
+    Status = EFI_SUCCESS;\r
 \r
-  IfrFormNvData = AllocateZeroPool (sizeof (IP4_CONFIG_IFR_NVDATA));\r
-  if (IfrFormNvData == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
+    switch (QuestionId) {\r
+    case KEY_LOCAL_IP:\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
+      } else {\r
+        CopyMem (&Ip4ConfigInstance->Ip4ConfigCallbackInfo.LocalIp, &HostIp.v4, sizeof (HostIp.v4));\r
+      }\r
 \r
-  //\r
-  // Retrive uncommitted data from Browser\r
-  //\r
-  if (!HiiGetBrowserData (&mNicIp4ConfigNvDataGuid, EFI_NIC_IP4_CONFIG_VARIABLE, sizeof (IP4_CONFIG_IFR_NVDATA), (UINT8 *) IfrFormNvData)) {\r
-    FreePool (IfrFormNvData);\r
-    return EFI_NOT_FOUND;\r
-  }\r
+      break;\r
 \r
-  Status = EFI_SUCCESS;\r
+    case KEY_SUBNET_MASK:\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 Subnet Mask!", NULL);\r
+        Status = EFI_INVALID_PARAMETER;\r
+      } else {\r
+        CopyMem (&Ip4ConfigInstance->Ip4ConfigCallbackInfo.SubnetMask, &SubnetMask.v4, sizeof (SubnetMask.v4));\r
+      }\r
 \r
-  switch (QuestionId) {\r
-  case KEY_LOCAL_IP:\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
-    } else {\r
-      CopyMem (&Ip4ConfigInstance->Ip4ConfigCallbackInfo.LocalIp, &HostIp.v4, sizeof (HostIp.v4));\r
-    }\r
+      break;\r
 \r
-    break;\r
+    case KEY_GATE_WAY:\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
+      } else {\r
+        CopyMem (&Ip4ConfigInstance->Ip4ConfigCallbackInfo.Gateway, &Gateway.v4, sizeof (Gateway.v4));\r
+      }\r
 \r
-  case KEY_SUBNET_MASK:\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 Subnet Mask!", NULL);\r
-      Status = EFI_INVALID_PARAMETER;\r
-    } else {\r
-      CopyMem (&Ip4ConfigInstance->Ip4ConfigCallbackInfo.SubnetMask, &SubnetMask.v4, sizeof (SubnetMask.v4));\r
-    }\r
+      break;\r
 \r
-    break;\r
+    case KEY_SAVE_CHANGES:\r
+      Status = Ip4ConfigConvertIfrNvDataToDeviceConfigData (IfrFormNvData, Ip4ConfigInstance);\r
+      *ActionRequest = EFI_BROWSER_ACTION_REQUEST_SUBMIT;\r
+      break;\r
 \r
-  case KEY_GATE_WAY:\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
-    } else {\r
-      CopyMem (&Ip4ConfigInstance->Ip4ConfigCallbackInfo.Gateway, &Gateway.v4, sizeof (Gateway.v4));\r
+    default:\r
+      break;\r
     }\r
 \r
-    break;\r
-\r
-  case KEY_SAVE_CHANGES:\r
-    Status = Ip4ConfigConvertIfrNvDataToDeviceConfigData (IfrFormNvData, Ip4ConfigInstance);\r
-    *ActionRequest = EFI_BROWSER_ACTION_REQUEST_SUBMIT;\r
-    break;\r
+    FreePool (IfrFormNvData);\r
 \r
-  default:\r
-    break;\r
+    return Status;\r
   }\r
 \r
-  FreePool (IfrFormNvData);\r
-\r
-  return Status;\r
+  //\r
+  // All other action return unsupported.\r
+  //\r
+  return EFI_UNSUPPORTED;\r
 }\r
 \r
 /**\r
@@ -833,7 +838,7 @@ Ip4ConfigDeviceInit (
   // Publish our HII data\r
   //\r
   Instance->RegisteredHandle = HiiAddPackages (\r
-                                 &mNicIp4ConfigNvDataGuid,\r
+                                 &gNicIp4ConfigNvDataGuid,\r
                                  Instance->ChildHandle,\r
                                  Ip4ConfigDxeStrings,\r
                                  Ip4ConfigDxeBin,\r
@@ -844,16 +849,16 @@ Ip4ConfigDeviceInit (
   }\r
 \r
   //\r
-  // Append MAC string in the menu string and tile string\r
+  // Append MAC string in the menu help string and tile help string\r
   //\r
   Status = NetLibGetMacString (Instance->Controller, Instance->Image, &MacString);\r
   if (!EFI_ERROR (Status)) {\r
-    OldMenuString = HiiGetString (Instance->RegisteredHandle, STRING_TOKEN (STR_IP4_CONFIG_FORM_TITLE), NULL);\r
+    OldMenuString = HiiGetString (Instance->RegisteredHandle, STRING_TOKEN (STR_IP4_CONFIG_FORM_HELP), NULL);\r
     UnicodeSPrint (MenuString, 128, L"%s (MAC:%s)", OldMenuString, MacString);\r
-    HiiSetString (Instance->RegisteredHandle, STRING_TOKEN (STR_IP4_CONFIG_FORM_TITLE), MenuString, NULL);\r
+    HiiSetString (Instance->RegisteredHandle, STRING_TOKEN (STR_IP4_CONFIG_FORM_HELP), MenuString, NULL);\r
 \r
     UnicodeSPrint (PortString, 128, L"MAC:%s", MacString);\r
-    HiiSetString (Instance->RegisteredHandle, STRING_TOKEN (STR_IP4_DEVICE_FORM_TITLE), PortString, NULL);\r
+    HiiSetString (Instance->RegisteredHandle, STRING_TOKEN (STR_IP4_DEVICE_FORM_HELP), PortString, NULL);\r
     FreePool (MacString);\r
   }\r
 \r