]> git.proxmox.com Git - mirror_edk2.git/blobdiff - NetworkPkg/Ip6Dxe/Ip6ConfigNv.c
1. Add EFI_COMPONENT_NAME2_PROTOCOL.GetControllerName() support.
[mirror_edk2.git] / NetworkPkg / Ip6Dxe / Ip6ConfigNv.c
index 64fb25f169ba5254dfcdb26107c0f24db7a22356..d4f25d030147134d1898c6c6401ec98b0c22c468 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Helper functions for configuring or obtaining the parameters relating to IP6.\r
 \r
-  Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2010 - 2012, 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
@@ -15,8 +15,6 @@
 \r
 #include "Ip6Impl.h"\r
 \r
-EFI_GUID  mIp6HiiVendorDevicePathGuid = IP6_HII_VENDOR_DEVICE_PATH_GUID;\r
-EFI_GUID  mIp6ConfigNvDataGuid        = IP6_CONFIG_NVDATA_GUID;\r
 CHAR16    mIp6ConfigStorageName[]     = L"IP6_CONFIG_IFR_NVDATA";\r
 \r
 /**\r
@@ -556,7 +554,7 @@ Ip6ConvertAddressListToString (
 \r
   Status = HiiUpdateForm (\r
              HiiHandle,                       // HII handle\r
-             &mIp6ConfigNvDataGuid,           // Formset GUID\r
+             &gIp6ConfigNvDataGuid,           // Formset GUID\r
              FORMID_MAIN_FORM,                // Form ID\r
              StartOpCodeHandle,               // Label for where to insert opcodes\r
              EndOpCodeHandle                  // Replace data\r
@@ -930,11 +928,11 @@ Ip6ConvertConfigNvDataToIfrNvData (
   IN     IP6_CONFIG_INSTANCE         *Instance\r
   )\r
 {\r
+  IP6_CONFIG_NVDATA                          *Ip6NvData;\r
   EFI_IP6_CONFIG_PROTOCOL                    *Ip6Config;\r
   UINTN                                      DataSize;\r
   VOID                                       *Data;\r
   EFI_STATUS                                 Status;\r
-  EFI_IP6_CONFIG_INTERFACE_ID                InterfaceId;\r
   EFI_IP6_CONFIG_POLICY                      Policy;\r
   EFI_IP6_CONFIG_DUP_ADDR_DETECT_TRANSMITS   DadXmits;\r
   EFI_HII_HANDLE                             HiiHandle;\r
@@ -946,6 +944,7 @@ Ip6ConvertConfigNvDataToIfrNvData (
   NET_CHECK_SIGNATURE (Instance, IP6_CONFIG_INSTANCE_SIGNATURE);\r
 \r
   Ip6Config = &Instance->Ip6Config;\r
+  Ip6NvData = &Instance->Ip6NvData;\r
   Data      = NULL;\r
   DataSize  = 0;\r
   HiiHandle = Instance->CallbackInfo.RegisteredHandle;\r
@@ -979,18 +978,18 @@ Ip6ConvertConfigNvDataToIfrNvData (
   // Get the interface id.\r
   //\r
   DataSize = sizeof (EFI_IP6_CONFIG_INTERFACE_ID);\r
-  ZeroMem (&InterfaceId, DataSize);\r
+  ZeroMem (&Ip6NvData->InterfaceId, DataSize);\r
   Status = Ip6Config->GetData (\r
                         Ip6Config,\r
                         Ip6ConfigDataTypeAltInterfaceId,\r
                         &DataSize,\r
-                        &InterfaceId\r
+                        &Ip6NvData->InterfaceId\r
                         );\r
   if (EFI_ERROR (Status)) {\r
     goto Exit;\r
   }\r
 \r
-  Ip6ConvertInterfaceIdToString (IfrNvData->InterfaceId, &InterfaceId);\r
+  Ip6ConvertInterfaceIdToString (IfrNvData->InterfaceId, &Ip6NvData->InterfaceId);\r
 \r
   //\r
   // Get current policy.\r
@@ -1447,7 +1446,7 @@ Ip6FormExtractConfig (
 \r
   *Progress = Request;\r
   if ((Request != NULL) &&\r
-      !HiiIsConfigHdrMatch (Request, &mIp6ConfigNvDataGuid, mIp6ConfigStorageName)) {\r
+      !HiiIsConfigHdrMatch (Request, &gIp6ConfigNvDataGuid, mIp6ConfigStorageName)) {\r
     return EFI_NOT_FOUND;\r
   }\r
 \r
@@ -1478,7 +1477,7 @@ Ip6FormExtractConfig (
     // followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW" followed by a Null-terminator.\r
     //\r
     ConfigRequestHdr = HiiConstructConfigHdr (\r
-                         &mIp6ConfigNvDataGuid,\r
+                         &gIp6ConfigNvDataGuid,\r
                          mIp6ConfigStorageName,\r
                          Private->ChildHandle\r
                          );\r
@@ -1578,7 +1577,7 @@ Ip6FormRouteConfig (
   // Check routing data in <ConfigHdr>.\r
   // Note: if only one Storage is used, then this checking could be skipped.\r
   //\r
-  if (!HiiIsConfigHdrMatch (Configuration, &mIp6ConfigNvDataGuid, mIp6ConfigStorageName)) {\r
+  if (!HiiIsConfigHdrMatch (Configuration, &gIp6ConfigNvDataGuid, mIp6ConfigStorageName)) {\r
     *Progress = Configuration;\r
     return EFI_NOT_FOUND;\r
   }\r
@@ -1629,7 +1628,6 @@ Ip6FormCallback (
   IP6_FORM_CALLBACK_INFO        *Private;\r
   UINTN                         BufferSize;\r
   IP6_CONFIG_IFR_NVDATA         *IfrNvData;\r
-  IP6_CONFIG_IFR_NVDATA         OldIfrNvData;\r
   EFI_STATUS                    Status;\r
   EFI_INPUT_KEY                 Key;\r
   IP6_CONFIG_INSTANCE           *Instance;\r
@@ -1649,156 +1647,195 @@ Ip6FormCallback (
   Instance  = IP6_CONFIG_INSTANCE_FROM_FORM_CALLBACK (Private);\r
   Ip6NvData = &Instance->Ip6NvData;\r
 \r
-  if (Action == EFI_BROWSER_ACTION_FORM_OPEN) {\r
-    //\r
-    // Update main Form when main Form is opened.\r
-    // This will be done only in FORM_OPEN CallBack of question with KEY_INTERFACE_ID from main Form.\r
-    //\r
-    if (QuestionId != KEY_INTERFACE_ID) {\r
-      return EFI_SUCCESS;\r
-    }\r
+  if ((Action == EFI_BROWSER_ACTION_FORM_OPEN) || (Action == EFI_BROWSER_ACTION_FORM_CLOSE)){\r
+    return EFI_SUCCESS;\r
+  }\r
 \r
-    Ip6Config = &Instance->Ip6Config;\r
-    HiiHandle = Instance->CallbackInfo.RegisteredHandle;\r
+  if (Action != EFI_BROWSER_ACTION_CHANGING && Action != EFI_BROWSER_ACTION_CHANGED) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
 \r
-    //\r
-    // Get the current interface info.\r
-    //\r
-    Status = Ip6ConfigNvGetData (\r
-               Ip6Config,\r
-               Ip6ConfigDataTypeInterfaceInfo,\r
-               &DataSize,\r
-               (VOID **) &Data\r
-               );\r
-    if (EFI_ERROR (Status)) {\r
-      goto Exit;\r
-    }\r
+  if ((Value == NULL) || (ActionRequest == NULL)) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
 \r
-    //\r
-    // Generate the 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
-      goto Exit;\r
-    }\r
+  //\r
+  // Retrieve uncommitted data from Browser\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
-      goto Exit;\r
-    }\r
+  BufferSize = sizeof (IP6_CONFIG_IFR_NVDATA);\r
+  IfrNvData = AllocateZeroPool (BufferSize);\r
+  if (IfrNvData == NULL) {\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
 \r
-    //\r
-    // Get DNS server list.\r
-    //\r
-    DataSize = 0;\r
-    Status = Ip6ConfigNvGetData (\r
-               Ip6Config,\r
-               Ip6ConfigDataTypeDnsServer,\r
-               &DataSize,\r
-               (VOID **) &Data\r
-               );\r
-    if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) {\r
-      goto Exit;\r
-    }\r
+  Status = EFI_SUCCESS;\r
+\r
+  HiiGetBrowserData (NULL, NULL, BufferSize, (UINT8 *) IfrNvData);\r
+\r
+  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
-    if (DataSize > 0) {\r
       //\r
-      // Generate the dynamic text opcode for DNS server and draw it.\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
-                 Ip6ConfigNvDnsAddress,\r
-                 Data,\r
-                 DataSize / sizeof (EFI_IPv6_ADDRESS)\r
+                 Ip6ConfigNvHostAddress,\r
+                 IfInfo->AddressInfo,\r
+                 IfInfo->AddressInfoCount\r
                  );\r
       if (EFI_ERROR (Status)) {\r
-        goto Exit;\r
+        FreePool (Data);\r
+        return Status;\r
       }\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
-    if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) {\r
-      goto Exit;\r
-    }\r
-\r
-    if (DataSize > 0) {\r
       //\r
-      // Generate the dynamic text opcode for gateway and draw it.\r
+      // Generate the dynamic text opcode for route table and draw it.\r
       //\r
       Status = Ip6ConvertAddressListToString (\r
                  PortString,\r
                  HiiHandle,\r
-                 Ip6ConfigNvGatewayAddress,\r
-                 Data,\r
-                 DataSize / sizeof (EFI_IPv6_ADDRESS)\r
+                 Ip6ConfigNvRouteTable,\r
+                 IfInfo->RouteTable,\r
+                 IfInfo->RouteCount\r
                  );\r
       if (EFI_ERROR (Status)) {\r
-        goto Exit;\r
+        FreePool (Data);\r
+        return Status;\r
       }\r
-    }\r
-\r
-Exit:\r
-    FreePool (Data);\r
-    return Status;\r
-  }\r
 \r
-  if (Action == EFI_BROWSER_ACTION_FORM_CLOSE) {\r
-    //\r
-    // Do nothing for UEFI FORM_CLOSE action\r
-    //\r
-    return EFI_SUCCESS;\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 (Action == EFI_BROWSER_ACTION_CHANGING) {\r
-    if ((Value == NULL) || (ActionRequest == NULL)) {\r
-      return EFI_INVALID_PARAMETER;\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
-    // Retrieve uncommitted data from Browser\r
-    //\r
+      //\r
+      // Get gateway adderss list.\r
+      //\r
+      if (Data != NULL) {\r
+        FreePool (Data);\r
+      }\r
 \r
-    BufferSize = sizeof (IP6_CONFIG_IFR_NVDATA);\r
-    IfrNvData = AllocateZeroPool (BufferSize);\r
-    if (IfrNvData == NULL) {\r
-      return EFI_OUT_OF_RESOURCES;\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
-    Status = EFI_SUCCESS;\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
-    ZeroMem (&OldIfrNvData, BufferSize);\r
+      if (Data != NULL) {\r
+        FreePool (Data);\r
+      }\r
 \r
-    HiiGetBrowserData (NULL, NULL, BufferSize, (UINT8 *) IfrNvData);\r
+      Status = EFI_SUCCESS;\r
 \r
-    CopyMem (&OldIfrNvData, IfrNvData, BufferSize);\r
+      break;\r
 \r
+    default:\r
+      break;\r
+    }\r
+  } else if (Action == EFI_BROWSER_ACTION_CHANGED) {\r
     switch (QuestionId) {\r
+    case KEY_SAVE_CONFIG_CHANGES:\r
+      *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_SUBMIT_EXIT;\r
+      break;\r
+\r
+    case KEY_IGNORE_CONFIG_CHANGES:\r
+      Ip6FreeAddressInfoList (&Ip6NvData->ManualAddress);\r
+      Ip6FreeAddressInfoList (&Ip6NvData->GatewayAddress);\r
+      Ip6FreeAddressInfoList (&Ip6NvData->DnsAddress);\r
+\r
+      Ip6NvData->ManualAddressCount  = 0;\r
+      Ip6NvData->GatewayAddressCount = 0;\r
+      Ip6NvData->DnsAddressCount     = 0;\r
+\r
+      *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_DISCARD_EXIT;\r
+      break;\r
+\r
+    case KEY_SAVE_CHANGES:\r
+      Status = Ip6ConvertIfrNvDataToConfigNvData (IfrNvData, Instance);\r
+      if (EFI_ERROR (Status)) {\r
+        break;\r
+      }\r
+      *ActionRequest = EFI_BROWSER_ACTION_REQUEST_SUBMIT;\r
+      break;\r
+    \r
     case KEY_INTERFACE_ID:\r
       Status = Ip6ParseInterfaceIdFromString (IfrNvData->InterfaceId, &Ip6NvData->InterfaceId);\r
       if (EFI_ERROR (Status)) {\r
@@ -1809,9 +1846,9 @@ Exit:
           NULL\r
           );\r
       }\r
-\r
+    \r
       break;\r
-\r
+    \r
     case KEY_MANUAL_ADDRESS:\r
       Status = Ip6ParseAddressListFromString (\r
                  IfrNvData->ManualAddress,\r
@@ -1826,9 +1863,9 @@ Exit:
           NULL\r
           );\r
       }\r
-\r
+    \r
       break;\r
-\r
+    \r
     case KEY_GATEWAY_ADDRESS:\r
       Status = Ip6ParseAddressListFromString (\r
                  IfrNvData->GatewayAddress,\r
@@ -1843,9 +1880,9 @@ Exit:
           NULL\r
           );\r
       }\r
-\r
+    \r
       break;\r
-\r
+    \r
     case KEY_DNS_ADDRESS:\r
       Status = Ip6ParseAddressListFromString (\r
                  IfrNvData->DnsAddress,\r
@@ -1860,48 +1897,24 @@ Exit:
           NULL\r
           );\r
       }\r
-\r
-      break;\r
-\r
-    case KEY_SAVE_CONFIG_CHANGES:\r
-      CopyMem (&OldIfrNvData, IfrNvData, sizeof (IP6_CONFIG_IFR_NVDATA));\r
-      *ActionRequest = EFI_BROWSER_ACTION_REQUEST_SUBMIT;\r
-      break;\r
-\r
-    case KEY_IGNORE_CONFIG_CHANGES:\r
-      CopyMem (IfrNvData, &OldIfrNvData, sizeof (IP6_CONFIG_IFR_NVDATA));\r
-      *ActionRequest = EFI_BROWSER_ACTION_REQUEST_SUBMIT;\r
-      break;\r
-\r
-    case KEY_SAVE_CHANGES:\r
-      Status = Ip6ConvertIfrNvDataToConfigNvData (IfrNvData, Instance);\r
-      if (EFI_ERROR (Status)) {\r
-        break;\r
-      }\r
-\r
-      *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
+    \r
       break;\r
 \r
     default:\r
       break;\r
     }\r
+  }\r
 \r
-    if (!EFI_ERROR (Status)) {\r
-      //\r
-      // Pass changed uncommitted data back to Form Browser.\r
-      //\r
-      BufferSize = sizeof (IP6_CONFIG_IFR_NVDATA);\r
-      HiiSetBrowserData (NULL, NULL, BufferSize, (UINT8 *) IfrNvData, NULL);\r
-    }\r
-\r
-    FreePool (IfrNvData);\r
-    return Status;\r
+  if (!EFI_ERROR (Status)) {\r
+    //\r
+    // Pass changed uncommitted data back to Form Browser.\r
+    //\r
+    BufferSize = sizeof (IP6_CONFIG_IFR_NVDATA);\r
+    HiiSetBrowserData (NULL, NULL, BufferSize, (UINT8 *) IfrNvData, NULL);\r
   }\r
 \r
-  //\r
-  // All other action return unsupported.\r
-  //\r
-  return EFI_UNSUPPORTED;\r
+  FreePool (IfrNvData);\r
+  return Status;\r
 }\r
 \r
 /**\r
@@ -1955,7 +1968,7 @@ Ip6ConfigFormInit (
   VendorDeviceNode.Header.Type    = HARDWARE_DEVICE_PATH;\r
   VendorDeviceNode.Header.SubType = HW_VENDOR_DP;\r
 \r
-  CopyGuid (&VendorDeviceNode.Guid, &mIp6HiiVendorDevicePathGuid);\r
+  CopyGuid (&VendorDeviceNode.Guid, &gEfiCallerIdGuid);\r
 \r
   SetDevicePathNodeLength (&VendorDeviceNode.Header, sizeof (VENDOR_DEVICE_PATH));\r
   CallbackInfo->HiiVendorDevicePath = AppendDevicePathNode (\r
@@ -2005,7 +2018,7 @@ Ip6ConfigFormInit (
   // Publish our HII data\r
   //\r
   CallbackInfo->RegisteredHandle = HiiAddPackages (\r
-                                     &mIp6ConfigNvDataGuid,\r
+                                     &gIp6ConfigNvDataGuid,\r
                                      CallbackInfo->ChildHandle,\r
                                      Ip6DxeStrings,\r
                                      Ip6ConfigBin,\r