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
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
\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