]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Update IPv6 configuration UI: 1) keep addresses blank when enter ‘Advanced Configurat...
authortye1 <tye1@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 15 Jan 2013 02:19:42 +0000 (02:19 +0000)
committertye1 <tye1@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 15 Jan 2013 02:19:42 +0000 (02:19 +0000)
Signed-off-by: Ye Ting <ting.ye@intel.com>
Reviewed-by: Fu Siyuan <siyuan.fu@intel.com>
Reviewed-by: Ouyang Qian <qian.ouyang@intel.com>
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@14047 6f19259b-4bc3-4df7-8a09-765794883524

NetworkPkg/Ip6Dxe/Ip6ConfigNv.c
NetworkPkg/Ip6Dxe/Ip6NvData.h

index d4f25d030147134d1898c6c6401ec98b0c22c468..546cd868076acbed7645efc0e1df4d403a2c980f 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Helper functions for configuring or obtaining the parameters relating to IP6.\r
 \r
-  Copyright (c) 2010 - 2012, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2010 - 2013, Intel Corporation. All rights reserved.<BR>\r
 \r
   This program and the accompanying materials\r
   are licensed and made available under the terms and conditions of the BSD License\r
@@ -669,9 +669,8 @@ Error:
 \r
 /**\r
   This function converts the interface info to string and draws it to the IP6 UI.\r
-  The interface information includes interface name, interface type, hardware address,\r
-  address info, and route table information. The address information is also used as the\r
-  content of manual addresses in IP6 UI.\r
+  The interface information includes interface name, interface type, hardware\r
+  address and route table information.\r
 \r
   @param[in]       IfInfo          The pointer of EFI_IP6_CONFIG_INTERFACE_INFO.\r
   @param[in]       HiiHandle       The handle that was previously registered in the\r
@@ -693,7 +692,6 @@ Ip6ConvertInterfaceInfoToString (
   UINT32                         Index;\r
   UINTN                          Number;\r
   CHAR16                         *String;\r
-  CHAR16                         *LinkLocalStr;\r
   CHAR16                         PortString[ADDRESS_STR_MAX_SIZE];\r
   CHAR16                         FormatString[8];\r
   EFI_STRING_ID                  StringId;\r
@@ -782,43 +780,6 @@ Ip6ConvertInterfaceInfoToString (
     return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
-  //\r
-  // Print the host address Information.\r
-  //\r
-  Status = Ip6ConvertAddressListToString (\r
-             PortString,\r
-             HiiHandle,\r
-             Ip6ConfigNvHostAddress,\r
-             IfInfo->AddressInfo,\r
-             IfInfo->AddressInfoCount\r
-             );\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-\r
-  //\r
-  // Copy the Host Address Info to manual address field.\r
-  // Do not copy the link local address.\r
-  //\r
-  LinkLocalStr = StrStr (PortString, IP6_LINK_LOCAL_PREFIX);\r
-  if (LinkLocalStr != NULL) {\r
-    Number = LinkLocalStr - PortString;\r
-    if (Number > 0) {\r
-      CopyMem (IfrNvData->ManualAddress, PortString, Number * sizeof (CHAR16));\r
-    }\r
-\r
-    while ((*LinkLocalStr != L' ') && (*LinkLocalStr != L'\0')) {\r
-      LinkLocalStr++;\r
-    }\r
-\r
-    if (*LinkLocalStr != L'\0') {\r
-      LinkLocalStr++;\r
-      StrCat (IfrNvData->ManualAddress, LinkLocalStr);\r
-    }\r
-  } else {\r
-    StrCpy (IfrNvData->ManualAddress, PortString);\r
-  }\r
-\r
   //\r
   // Print the route table information.\r
   //\r
@@ -1033,75 +994,6 @@ Ip6ConvertConfigNvDataToIfrNvData (
 \r
   IfrNvData->DadTransmitCount = DadXmits.DupAddrDetectTransmits;\r
 \r
-  //\r
-  // Get DNS server list.\r
-  //\r
-  FreePool (Data);\r
-  Data     = NULL;\r
-  DataSize = 0;\r
-  Status   = Ip6ConfigNvGetData (\r
-               Ip6Config,\r
-               Ip6ConfigDataTypeDnsServer,\r
-               &DataSize,\r
-               (VOID **) &Data\r
-               );\r
-\r
-  if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) {\r
-    goto Exit;\r
-  }\r
-\r
-  if (DataSize > 0) {\r
-    //\r
-    // Convert the DNS server address to string and draw it to UI.\r
-    //\r
-    Status = Ip6ConvertAddressListToString (\r
-               IfrNvData->DnsAddress,\r
-               HiiHandle,\r
-               Ip6ConfigNvDnsAddress,\r
-               Data,\r
-               DataSize / sizeof (EFI_IPv6_ADDRESS)\r
-               );\r
-    if (EFI_ERROR (Status)) {\r
-      goto Exit;\r
-    }\r
-\r
-    FreePool (Data);\r
-    Data = NULL;\r
-  }\r
-\r
-  //\r
-  // Get gateway adderss list.\r
-  //\r
-  DataSize = 0;\r
-  Status   = Ip6ConfigNvGetData (\r
-               Ip6Config,\r
-               Ip6ConfigDataTypeGateway,\r
-               &DataSize,\r
-               (VOID **) &Data\r
-               );\r
-\r
-  if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) {\r
-    goto Exit;\r
-  }\r
-\r
-  if (DataSize > 0) {\r
-    //\r
-    // Convert the gateway address to string and draw it to UI.\r
-    //\r
-    Status = Ip6ConvertAddressListToString (\r
-               IfrNvData->GatewayAddress,\r
-               HiiHandle,\r
-               Ip6ConfigNvGatewayAddress,\r
-               Data,\r
-               DataSize / sizeof (EFI_IPv6_ADDRESS)\r
-               );\r
-    if (EFI_ERROR (Status)) {\r
-      goto Exit;\r
-    }\r
-  }\r
-\r
-  Status = EFI_SUCCESS;\r
-\r
 Exit:\r
   if (Data != NULL) {\r
      FreePool (Data);\r
@@ -1112,8 +1004,7 @@ Exit:
 \r
 /**\r
   Convert IFR data into IP6 configuration data. The policy, alternative interface\r
-  ID, and DAD transmit counts, and will be saved. If under manual policy, the configured\r
-  manual address, gateway address, and DNS server address will be saved.\r
+  ID, and DAD transmit counts, and will be saved. \r
 \r
   @param[in]       IfrNvData       The IFR NV data.\r
   @param[in, out]  Instance        The IP6 config instance data.\r
@@ -1124,7 +1015,7 @@ Exit:
 \r
 **/\r
 EFI_STATUS\r
-Ip6ConvertIfrNvDataToConfigNvData (\r
+Ip6ConvertIfrNvDataToConfigNvDataGeneral (\r
   IN     IP6_CONFIG_IFR_NVDATA       *IfrNvData,\r
   IN OUT IP6_CONFIG_INSTANCE         *Instance\r
   )\r
@@ -1132,12 +1023,6 @@ Ip6ConvertIfrNvDataToConfigNvData (
   IP6_CONFIG_NVDATA                  *Ip6NvData;\r
   EFI_IP6_CONFIG_PROTOCOL            *Ip6Config;\r
   EFI_STATUS                         Status;\r
-  EFI_IP6_CONFIG_MANUAL_ADDRESS      *ManualAddress;\r
-  EFI_IPv6_ADDRESS                   *Address;\r
-  BOOLEAN                            IsAddressOk;\r
-  EFI_EVENT                          SetAddressEvent;\r
-  EFI_EVENT                          TimeoutEvent;\r
-  UINTN                              DataSize;\r
 \r
   if ((IfrNvData == NULL) || (Instance == NULL)) {\r
     return EFI_INVALID_PARAMETER;\r
@@ -1197,11 +1082,67 @@ Ip6ConvertIfrNvDataToConfigNvData (
     return Status;\r
   }\r
 \r
+  return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+  Convert IFR data into IP6 configuration data. The policy, configured\r
+  manual address, gateway address, and DNS server address will be saved.\r
+\r
+  @param[in]       IfrNvData       The IFR NV data.\r
+  @param[in, out]  Instance        The IP6 config instance data.\r
+\r
+  @retval EFI_SUCCESS              The operation finished successfully.\r
+  @retval EFI_INVALID_PARAMETER    Any input parameter is invalid.\r
+  @retval Others                   Other errors as indicated.\r
+\r
+**/\r
+EFI_STATUS\r
+Ip6ConvertIfrNvDataToConfigNvDataAdvanced (\r
+  IN     IP6_CONFIG_IFR_NVDATA       *IfrNvData,\r
+  IN OUT IP6_CONFIG_INSTANCE         *Instance\r
+  )\r
+{\r
+  IP6_CONFIG_NVDATA                  *Ip6NvData;\r
+  EFI_IP6_CONFIG_PROTOCOL            *Ip6Config;\r
+  EFI_STATUS                         Status;\r
+  EFI_IP6_CONFIG_MANUAL_ADDRESS      *ManualAddress;\r
+  EFI_IPv6_ADDRESS                   *Address;\r
+  BOOLEAN                            IsAddressOk;\r
+  EFI_EVENT                          SetAddressEvent;\r
+  EFI_EVENT                          TimeoutEvent;\r
+  UINTN                              DataSize;\r
+\r
+  if ((IfrNvData == NULL) || (Instance == NULL)) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
 \r
-  if (Ip6NvData->Policy == Ip6ConfigPolicyAutomatic) {\r
+  if (IfrNvData->Policy == IP6_POLICY_AUTO) {\r
     return EFI_SUCCESS;\r
   }\r
 \r
+  NET_CHECK_SIGNATURE (Instance, IP6_CONFIG_INSTANCE_SIGNATURE);\r
+  Ip6NvData = &Instance->Ip6NvData;\r
+  Ip6Config = &Instance->Ip6Config;\r
+\r
+  //\r
+  // Update those fields which don't have INTERACTIVE attribute.\r
+  //\r
+  Ip6NvData->Policy = Ip6ConfigPolicyManual;\r
+\r
+  //\r
+  // Set the configured policy.\r
+  //\r
+  Status = Ip6Config->SetData (\r
+                        Ip6Config,\r
+                        Ip6ConfigDataTypePolicy,\r
+                        sizeof (EFI_IP6_CONFIG_POLICY),\r
+                        &Ip6NvData->Policy\r
+                        );\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
   //\r
   // Create events & timers for asynchronous settings.\r
   //\r
@@ -1358,6 +1299,7 @@ Exit:
   return Status;\r
 }\r
 \r
+\r
 /**\r
   This function allows the caller to request the current\r
   configuration for one or more named elements. The resulting\r
@@ -1587,6 +1529,160 @@ Ip6FormRouteConfig (
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  Display host addresses, route table, DNS addresses and gateway addresses in\r
+  "IPv6 Current Setting" page.\r
+\r
+  @param[in]       Instance        The IP6 config instance data.\r
+\r
+  @retval EFI_SUCCESS              The operation finished successfully.\r
+  @retval Others                   Other errors as indicated.\r
+\r
+**/\r
+EFI_STATUS\r
+Ip6GetCurrentSetting (\r
+  IN IP6_CONFIG_INSTANCE        *Instance\r
+  )\r
+{\r
+  EFI_IP6_CONFIG_PROTOCOL       *Ip6Config;\r
+  EFI_HII_HANDLE                HiiHandle;\r
+  EFI_IP6_CONFIG_INTERFACE_INFO *Data;\r
+  UINTN                         DataSize;\r
+  EFI_STATUS                    Status;\r
+  CHAR16                        PortString[ADDRESS_STR_MAX_SIZE];\r
+  EFI_IP6_CONFIG_INTERFACE_INFO *IfInfo;\r
+  \r
+\r
+  Ip6Config = &Instance->Ip6Config;\r
+  HiiHandle = Instance->CallbackInfo.RegisteredHandle;\r
+  Data      = NULL;\r
+\r
+  //\r
+  // Get current interface info.\r
+  //\r
+  Status = Ip6ConfigNvGetData (\r
+             Ip6Config,\r
+             Ip6ConfigDataTypeInterfaceInfo,\r
+             &DataSize,\r
+             (VOID **) &Data\r
+             );\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+\r
+  //\r
+  // Generate dynamic text opcode for host address and draw it.\r
+  //\r
+  IfInfo = (EFI_IP6_CONFIG_INTERFACE_INFO *) Data;\r
+  Status = Ip6ConvertAddressListToString (\r
+             PortString,\r
+             HiiHandle,\r
+             Ip6ConfigNvHostAddress,\r
+             IfInfo->AddressInfo,\r
+             IfInfo->AddressInfoCount\r
+             );\r
+  if (EFI_ERROR (Status)) {\r
+    FreePool (Data);\r
+    return Status;\r
+  }\r
+\r
+  //\r
+  // Generate the dynamic text opcode for route table and draw it.\r
+  //\r
+  Status = Ip6ConvertAddressListToString (\r
+             PortString,\r
+             HiiHandle,\r
+             Ip6ConfigNvRouteTable,\r
+             IfInfo->RouteTable,\r
+             IfInfo->RouteCount\r
+             );\r
+  if (EFI_ERROR (Status)) {\r
+    FreePool (Data);\r
+    return Status;\r
+  }\r
+\r
+  //\r
+  // Get DNS server list.\r
+  //\r
+  FreePool (Data);\r
+  DataSize = 0;\r
+  Data = NULL;\r
+  Status = Ip6ConfigNvGetData (\r
+             Ip6Config,\r
+             Ip6ConfigDataTypeDnsServer,\r
+             &DataSize,\r
+             (VOID **) &Data\r
+             );\r
+  if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) {\r
+    if (Data != NULL) {\r
+      FreePool (Data);\r
+    }\r
+    return Status;\r
+  }\r
+\r
+  if (DataSize > 0) {\r
+    //\r
+    // Generate the dynamic text opcode for DNS server and draw it.\r
+    //\r
+    Status = Ip6ConvertAddressListToString (\r
+               PortString,\r
+               HiiHandle,\r
+               Ip6ConfigNvDnsAddress,\r
+               Data,\r
+               DataSize / sizeof (EFI_IPv6_ADDRESS)\r
+               );\r
+    if (EFI_ERROR (Status)) {\r
+      FreePool (Data);\r
+      return Status;\r
+    }\r
+  }\r
+\r
+  //\r
+  // Get gateway adderss list.\r
+  //\r
+  if (Data != NULL) {\r
+    FreePool (Data);\r
+  }\r
+\r
+  DataSize = 0;\r
+  Data = NULL;\r
+  Status = Ip6ConfigNvGetData (\r
+             Ip6Config,\r
+             Ip6ConfigDataTypeGateway,\r
+             &DataSize,\r
+             (VOID **) &Data\r
+             );\r
+  if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) {\r
+    if (Data != NULL) {\r
+      FreePool (Data);\r
+    }\r
+    return Status;\r
+  }\r
+\r
+  if (DataSize > 0) {\r
+    //\r
+    // Generate the dynamic text opcode for gateway and draw it.\r
+    //\r
+    Status = Ip6ConvertAddressListToString (\r
+               PortString,\r
+               HiiHandle,\r
+               Ip6ConfigNvGatewayAddress,\r
+               Data,\r
+               DataSize / sizeof (EFI_IPv6_ADDRESS)\r
+               );\r
+    if (EFI_ERROR (Status)) {\r
+      FreePool (Data);\r
+      return Status;\r
+    }\r
+  }\r
+\r
+  if (Data != NULL) {\r
+    FreePool (Data);\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
 /**\r
   This function is called to provide results data to the driver.\r
   This data consists of a unique key that is used to identify\r
@@ -1632,12 +1728,6 @@ Ip6FormCallback (
   EFI_INPUT_KEY                 Key;\r
   IP6_CONFIG_INSTANCE           *Instance;\r
   IP6_CONFIG_NVDATA             *Ip6NvData;\r
-  EFI_IP6_CONFIG_PROTOCOL       *Ip6Config;\r
-  EFI_IP6_CONFIG_INTERFACE_INFO *Data;\r
-  UINTN                         DataSize;\r
-  CHAR16                        PortString[ADDRESS_STR_MAX_SIZE];\r
-  EFI_HII_HANDLE                HiiHandle;\r
-  EFI_IP6_CONFIG_INTERFACE_INFO *IfInfo;\r
 \r
   if (This == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
@@ -1676,135 +1766,7 @@ Ip6FormCallback (
   if (Action == EFI_BROWSER_ACTION_CHANGING) {\r
     switch (QuestionId) {\r
     case KEY_GET_CURRENT_SETTING:\r
-      Ip6Config = &Instance->Ip6Config;\r
-      HiiHandle = Instance->CallbackInfo.RegisteredHandle;\r
-      Data      = NULL;\r
-\r
-      //\r
-      // Get current interface info.\r
-      //\r
-      Status = Ip6ConfigNvGetData (\r
-                 Ip6Config,\r
-                 Ip6ConfigDataTypeInterfaceInfo,\r
-                 &DataSize,\r
-                 (VOID **) &Data\r
-                 );\r
-      if (EFI_ERROR (Status)) {\r
-        return Status;\r
-      }\r
-\r
-      //\r
-      // Generate dynamic text opcode for host address and draw it.\r
-      //\r
-      IfInfo = (EFI_IP6_CONFIG_INTERFACE_INFO *) Data;\r
-      Status = Ip6ConvertAddressListToString (\r
-                 PortString,\r
-                 HiiHandle,\r
-                 Ip6ConfigNvHostAddress,\r
-                 IfInfo->AddressInfo,\r
-                 IfInfo->AddressInfoCount\r
-                 );\r
-      if (EFI_ERROR (Status)) {\r
-        FreePool (Data);\r
-        return Status;\r
-      }\r
-\r
-      //\r
-      // Generate the dynamic text opcode for route table and draw it.\r
-      //\r
-      Status = Ip6ConvertAddressListToString (\r
-                 PortString,\r
-                 HiiHandle,\r
-                 Ip6ConfigNvRouteTable,\r
-                 IfInfo->RouteTable,\r
-                 IfInfo->RouteCount\r
-                 );\r
-      if (EFI_ERROR (Status)) {\r
-        FreePool (Data);\r
-        return Status;\r
-      }\r
-\r
-      //\r
-      // Get DNS server list.\r
-      //\r
-      FreePool (Data);\r
-      DataSize = 0;\r
-      Data = NULL;\r
-      Status = Ip6ConfigNvGetData (\r
-                 Ip6Config,\r
-                 Ip6ConfigDataTypeDnsServer,\r
-                 &DataSize,\r
-                 (VOID **) &Data\r
-                 );\r
-      if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) {\r
-        if (Data != NULL) {\r
-          FreePool (Data);\r
-        }\r
-        return Status;\r
-      }\r
-\r
-      if (DataSize > 0) {\r
-        //\r
-        // Generate the dynamic text opcode for DNS server and draw it.\r
-        //\r
-        Status = Ip6ConvertAddressListToString (\r
-                   PortString,\r
-                   HiiHandle,\r
-                   Ip6ConfigNvDnsAddress,\r
-                   Data,\r
-                   DataSize / sizeof (EFI_IPv6_ADDRESS)\r
-                   );\r
-        if (EFI_ERROR (Status)) {\r
-          FreePool (Data);\r
-          return Status;\r
-        }\r
-      }\r
-\r
-      //\r
-      // Get gateway adderss list.\r
-      //\r
-      if (Data != NULL) {\r
-        FreePool (Data);\r
-      }\r
-\r
-      DataSize = 0;\r
-      Data = NULL;\r
-      Status = Ip6ConfigNvGetData (\r
-                 Ip6Config,\r
-                 Ip6ConfigDataTypeGateway,\r
-                 &DataSize,\r
-                 (VOID **) &Data\r
-                 );\r
-      if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) {\r
-        if (Data != NULL) {\r
-          FreePool (Data);\r
-        }\r
-        return Status;\r
-      }\r
-\r
-      if (DataSize > 0) {\r
-        //\r
-        // Generate the dynamic text opcode for gateway and draw it.\r
-        //\r
-        Status = Ip6ConvertAddressListToString (\r
-                   PortString,\r
-                   HiiHandle,\r
-                   Ip6ConfigNvGatewayAddress,\r
-                   Data,\r
-                   DataSize / sizeof (EFI_IPv6_ADDRESS)\r
-                   );\r
-        if (EFI_ERROR (Status)) {\r
-          FreePool (Data);\r
-          return Status;\r
-        }\r
-      }\r
-\r
-      if (Data != NULL) {\r
-        FreePool (Data);\r
-      }\r
-\r
-      Status = EFI_SUCCESS;\r
-\r
+      Status = Ip6GetCurrentSetting (Instance);\r
       break;\r
 \r
     default:\r
@@ -1813,6 +1775,13 @@ Ip6FormCallback (
   } else if (Action == EFI_BROWSER_ACTION_CHANGED) {\r
     switch (QuestionId) {\r
     case KEY_SAVE_CONFIG_CHANGES:\r
+      Status = Ip6ConvertIfrNvDataToConfigNvDataAdvanced (IfrNvData, Instance);\r
+      if (EFI_ERROR (Status)) {\r
+        break;\r
+      }\r
+\r
+      Status = Ip6GetCurrentSetting (Instance);\r
+\r
       *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT;\r
       break;\r
 \r
@@ -1829,7 +1798,7 @@ Ip6FormCallback (
       break;\r
 \r
     case KEY_SAVE_CHANGES:\r
-      Status = Ip6ConvertIfrNvDataToConfigNvData (IfrNvData, Instance);\r
+      Status = Ip6ConvertIfrNvDataToConfigNvDataGeneral (IfrNvData, Instance);\r
       if (EFI_ERROR (Status)) {\r
         break;\r
       }\r
index b67e6249b5c9a89b75a3f06091885ebe2f35a8e3..09177613fbc9e4b8e45efe035f3fe30b59f68dd1 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   NVData structure used by the IP6 configuration component.\r
 \r
-  Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2010 - 2013, Intel Corporation. All rights reserved.<BR>\r
 \r
   This program and the accompanying materials\r
   are licensed and made available under the terms and conditions of the BSD License\r
@@ -43,7 +43,7 @@
 \r
 #define INTERFACE_ID_STR_MIN_SIZE 1\r
 #define INTERFACE_ID_STR_MAX_SIZE 23\r
-#define INTERFACE_ID_STR_STORAGE  24\r
+#define INTERFACE_ID_STR_STORAGE  25\r
 #define IP6_STR_MAX_SIZE          40\r
 #define ADDRESS_STR_MIN_SIZE      2\r
 #define ADDRESS_STR_MAX_SIZE      255\r