Update HiiConfigAccess.ExtractConfig interface to support NULL request string and...
[efi/edk2/.git] / edk2 / MdeModulePkg / Universal / Network / Ip4ConfigDxe / Ip4ConfigNv.c
index 9417a44..f5a721b 100644 (file)
@@ -342,19 +342,32 @@ Ip4DeviceExtractConfig (
   NIC_IP4_CONFIG_INFO              *IfrDeviceNvData;\r
   IP4_CONFIG_INSTANCE              *Ip4ConfigInstance;\r
   IP4_CONFIG_IFR_NVDATA            *IfrFormNvData;\r
+  EFI_STRING                       ConfigRequestHdr;\r
+  EFI_STRING                       ConfigRequest;\r
+  EFI_STRING                       DeviceResult;\r
+  EFI_STRING                       FormResult;\r
+  CHAR16                           *StrPointer;\r
+  BOOLEAN                          AllocatedRequest;\r
+  UINTN                            Size;\r
+  UINTN                            BufferSize;\r
 \r
-  if (Request == NULL || Progress == NULL || Results == NULL) {\r
+  if (Progress == NULL || Results == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  *Progress = Request;\r
-\r
+  *Progress     = Request;\r
+  Size          = 0;\r
+  DeviceResult  = NULL;\r
+  FormResult    = NULL;\r
+  ConfigRequest = NULL;\r
+  Status        = EFI_SUCCESS;\r
+  AllocatedRequest  = FALSE;\r
   Ip4ConfigInstance = IP4_CONFIG_INSTANCE_FROM_CONFIG_ACCESS (This);\r
 \r
   //\r
   // Check Request data in <ConfigHdr>.\r
   //\r
-  if (HiiIsConfigHdrMatch (Request, &gEfiNicIp4ConfigVariableGuid, EFI_NIC_IP4_CONFIG_VARIABLE)) {\r
+  if ((Request == NULL) || HiiIsConfigHdrMatch (Request, &gEfiNicIp4ConfigVariableGuid, EFI_NIC_IP4_CONFIG_VARIABLE)) {\r
     IfrDeviceNvData = AllocateZeroPool (NIC_ITEM_CONFIG_SIZE);\r
     if (IfrDeviceNvData == NULL) {\r
       return EFI_OUT_OF_RESOURCES;\r
@@ -367,21 +380,50 @@ Ip4DeviceExtractConfig (
       return EFI_NOT_FOUND;\r
     }\r
 \r
+    ConfigRequest = Request;\r
+    if ((Request == NULL) || (StrStr (Request, L"OFFSET") == NULL)) {\r
+      //\r
+      // Request has no request element, construct full request string.\r
+      // 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 (&gEfiNicIp4ConfigVariableGuid, EFI_NIC_IP4_CONFIG_VARIABLE, Ip4ConfigInstance->ChildHandle);\r
+      Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16);\r
+      ConfigRequest = AllocateZeroPool (Size);\r
+      ASSERT (ConfigRequest != NULL);\r
+      AllocatedRequest = TRUE;\r
+      BufferSize = NIC_ITEM_CONFIG_SIZE;\r
+      UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX", ConfigRequestHdr, (UINT64)BufferSize);\r
+      FreePool (ConfigRequestHdr);\r
+    }\r
+\r
     //\r
     // Convert buffer data to <ConfigResp> by helper function BlockToConfig()\r
     //\r
     Status = gHiiConfigRouting->BlockToConfig (\r
                                   gHiiConfigRouting,\r
-                                  Request,\r
+                                  ConfigRequest,\r
                                   (UINT8 *) IfrDeviceNvData,\r
                                   NIC_ITEM_CONFIG_SIZE,\r
-                                  Results,\r
+                                  &DeviceResult,\r
                                   Progress\r
                                   );\r
 \r
     FreePool (IfrDeviceNvData);\r
+    //\r
+    // Free the allocated config request string.\r
+    //\r
+    if (AllocatedRequest) {\r
+      FreePool (ConfigRequest);\r
+      ConfigRequest = NULL;\r
+    }\r
 \r
-  } else if (HiiIsConfigHdrMatch (Request, &mNicIp4ConfigNvDataGuid, EFI_NIC_IP4_CONFIG_VARIABLE)) {\r
+    if (EFI_ERROR (Status)) {\r
+      goto Failure;\r
+    }\r
+  } \r
+  \r
+  if ((Request == NULL) || HiiIsConfigHdrMatch (Request, &mNicIp4ConfigNvDataGuid, EFI_NIC_IP4_CONFIG_VARIABLE)) {\r
 \r
     IfrFormNvData = AllocateZeroPool (NIC_ITEM_CONFIG_SIZE);\r
     if (IfrFormNvData == NULL) {\r
@@ -390,25 +432,80 @@ Ip4DeviceExtractConfig (
 \r
     Ip4ConfigConvertDeviceConfigDataToIfrNvData (Ip4ConfigInstance, IfrFormNvData);\r
 \r
+    ConfigRequest = Request;\r
+    if ((Request == NULL) || (StrStr (Request, L"OFFSET") == NULL)) {\r
+      //\r
+      // Request has no request element, construct full request string.\r
+      // 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
+      Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16);\r
+      ConfigRequest = AllocateZeroPool (Size);\r
+      ASSERT (ConfigRequest != NULL);\r
+      AllocatedRequest = TRUE;\r
+      BufferSize = sizeof (IP4_CONFIG_IFR_NVDATA);\r
+      UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX", ConfigRequestHdr, (UINT64)BufferSize);\r
+      FreePool (ConfigRequestHdr);\r
+    }\r
\r
     //\r
     // Convert buffer data to <ConfigResp> by helper function BlockToConfig()\r
     //\r
     Status = gHiiConfigRouting->BlockToConfig (\r
                                   gHiiConfigRouting,\r
-                                  Request,\r
+                                  ConfigRequest,\r
                                   (UINT8 *) IfrFormNvData,\r
                                   sizeof (IP4_CONFIG_IFR_NVDATA),\r
-                                  Results,\r
+                                  &FormResult,\r
                                   Progress\r
                                   );\r
 \r
     FreePool (IfrFormNvData);\r
+    //\r
+    // Free the allocated config request string.\r
+    //\r
+    if (AllocatedRequest) {\r
+      FreePool (ConfigRequest);\r
+      ConfigRequest = NULL;\r
+    }\r
+\r
+    if (EFI_ERROR (Status)) {\r
+      goto Failure;\r
+    }\r
+  }\r
 \r
+  if (Request == NULL) {\r
+    Size = StrLen (DeviceResult);\r
+    Size = Size + 1;\r
+    Size = Size + StrLen (FormResult) + 1;\r
+    *Results = AllocateZeroPool (Size * sizeof (CHAR16));\r
+    ASSERT (*Results != NULL);\r
+    StrPointer  = *Results;\r
+    StrCpy (StrPointer, DeviceResult);\r
+    StrPointer  = StrPointer + StrLen (StrPointer);\r
+    *StrPointer = L'&';\r
+    StrCpy (StrPointer + 1, FormResult);\r
+    FreePool (DeviceResult);\r
+    FreePool (FormResult);\r
+  } else if (HiiIsConfigHdrMatch (ConfigRequest, &gEfiNicIp4ConfigVariableGuid, EFI_NIC_IP4_CONFIG_VARIABLE)) {\r
+    *Results = DeviceResult;\r
+  } else if (HiiIsConfigHdrMatch (ConfigRequest, &mNicIp4ConfigNvDataGuid, EFI_NIC_IP4_CONFIG_VARIABLE)) {\r
+    *Results = FormResult;\r
   } else {\r
     return EFI_NOT_FOUND;\r
   }\r
 \r
-\r
+Failure:\r
+  //\r
+  // Set Progress string to the original request string.\r
+  //\r
+  if (Request == NULL) {\r
+    *Progress = NULL;\r
+  } else if (StrStr (Request, L"OFFSET") == NULL) {\r
+    *Progress = Request + StrLen (Request);\r
+  }\r
+  \r
   return Status;\r
 }\r
 \r