]> git.proxmox.com Git - mirror_edk2.git/commitdiff
NetworkPkg: Fix HII related problem in HTTP boot driver.
authorFu Siyuan <siyuan.fu@intel.com>
Thu, 17 Mar 2016 01:27:07 +0000 (09:27 +0800)
committerFu Siyuan <siyuan.fu@intel.com>
Thu, 24 Mar 2016 02:09:47 +0000 (10:09 +0800)
According to UEFI spec, HII_Config_Access.RouteConfig() should return success
if the required configuration has been processed. Current HTTP boot driver
may return error code in some situation, which failed the UEFI SCT test.
This patch fix this issue by removing the returned error status code and adding
extra check point in the Callback() function, which will pop up a message box
if user input an unsupported URI string.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Fu Siyuan <siyuan.fu@intel.com>
Reviewed-by: Dong Eric <eric.dong@intel.com>
Reviewed-by: Wu Jiaxin <jiaxin.wu@intel.com>
NetworkPkg/HttpBootDxe/HttpBootConfig.c
NetworkPkg/HttpBootDxe/HttpBootConfigNVDataStruc.h
NetworkPkg/HttpBootDxe/HttpBootConfigVfr.vfr

index 0c1ff43d5c84a856211fbec5cda329a94a450f91..e7dd5db4dbe2a7ecefbe9d946b11c969c6f44f76 100644 (file)
@@ -351,6 +351,7 @@ HttpBootFormExtractConfig (
   //\r
   BufferSize = sizeof (HTTP_BOOT_CONFIG_IFR_NVDATA);\r
   ZeroMem (&CallbackInfo->HttpBootNvData, BufferSize);\r
+  StrCpyS (CallbackInfo->HttpBootNvData.Description, DESCRIPTION_STR_MAX_SIZE / sizeof (CHAR16), HTTP_BOOT_DEFAULT_DESCRIPTION_STR);\r
 \r
   ConfigRequest = Request;\r
   if ((Request == NULL) || (StrStr (Request, L"OFFSET") == NULL)) {\r
@@ -376,7 +377,6 @@ HttpBootFormExtractConfig (
                                 Results,\r
                                 Progress\r
                                 );\r
-  ASSERT_EFI_ERROR (Status);\r
   \r
   //\r
   // Free the allocated config request string.\r
@@ -487,14 +487,14 @@ HttpBootFormRouteConfig (
   //\r
   // Create a new boot option according to the configuration data.\r
   //\r
-  Status = HttpBootAddBootOption (\r
-             Private,\r
-             (CallbackInfo->HttpBootNvData.IpVersion == HTTP_BOOT_IP_VERSION_6) ? TRUE : FALSE,\r
-             CallbackInfo->HttpBootNvData.Description,\r
-             CallbackInfo->HttpBootNvData.Uri\r
-             );\r
+  HttpBootAddBootOption (\r
+    Private,\r
+    (CallbackInfo->HttpBootNvData.IpVersion == HTTP_BOOT_IP_VERSION_6) ? TRUE : FALSE,\r
+    CallbackInfo->HttpBootNvData.Description,\r
+    CallbackInfo->HttpBootNvData.Uri\r
+    );\r
   \r
-  return Status;\r
+  return EFI_SUCCESS;\r
 }\r
 \r
 /**\r
@@ -533,7 +533,66 @@ HttpBootFormCallback (
   OUT       EFI_BROWSER_ACTION_REQUEST       *ActionRequest\r
   )\r
 {\r
-  return EFI_UNSUPPORTED;\r
+  EFI_INPUT_KEY                   Key;\r
+  UINTN                           Index;\r
+  CHAR16                          *Uri;\r
+  HTTP_BOOT_FORM_CALLBACK_INFO    *CallbackInfo;\r
+  \r
+  if (This == NULL || Value == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  CallbackInfo = HTTP_BOOT_FORM_CALLBACK_INFO_FROM_CONFIG_ACCESS (This);\r
+  \r
+  if (Action != EFI_BROWSER_ACTION_CHANGING) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+  \r
+  switch (QuestionId) {\r
+  case KEY_INITIATOR_URI:\r
+    //\r
+    // Get user input URI string\r
+    //\r
+    Uri = HiiGetString (CallbackInfo->RegisteredHandle, Value->string, NULL);\r
+\r
+    //\r
+    // Convert the scheme to all lower case.\r
+    //\r
+    for (Index = 0; Index < StrLen (Uri); Index++) {\r
+      if (Uri[Index] == L':') {\r
+        break;\r
+      }\r
+      if (Uri[Index] >= L'A' && Uri[Index] <= L'Z') {\r
+        Uri[Index] -= (CHAR16)(L'A' - L'a');\r
+      }\r
+    }\r
+\r
+    //\r
+    // Set the converted URI string back\r
+    //\r
+    HiiSetString (CallbackInfo->RegisteredHandle, Value->string, Uri, NULL);\r
+\r
+    //\r
+    // We only accept http and https, pop up a message box for unsupported URI.\r
+    //\r
+    if ((StrnCmp (Uri, L"http://", 7) != 0) && (StrnCmp (Uri, L"https://", 7) != 0)) {\r
+      CreatePopUp (\r
+        EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
+        &Key,\r
+        L"ERROR: Unsupported URI!",\r
+        L"Only supports HTTP and HTTPS",\r
+        NULL\r
+        );\r
+    }\r
+\r
+    FreePool (Uri);\r
+    break;\r
+\r
+  default:\r
+    break;\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
 }\r
 \r
 /**\r
index 07043e7ee8376688cacd892668117bf0fdf4e992..37ce440411baab167dc75aafb375c6203d8e2f96 100644 (file)
@@ -17,24 +17,31 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 #include <Guid/HttpBootConfigHii.h>\r
 \r
-#define HTTP_BOOT_IP_VERSION_4         0\r
-#define HTTP_BOOT_IP_VERSION_6         1\r
+#define HTTP_BOOT_IP_VERSION_4       0\r
+#define HTTP_BOOT_IP_VERSION_6       1\r
 \r
 //\r
 // Macros used for an IPv4 or an IPv6 address.\r
 //\r
-#define URI_STR_MIN_SIZE           8\r
-#define URI_STR_MAX_SIZE           255\r
+#define URI_STR_MIN_SIZE             8\r
+#define URI_STR_MAX_SIZE             255\r
+\r
+#define DESCRIPTION_STR_MIN_SIZE     6\r
+#define DESCRIPTION_STR_MAX_SIZE     75\r
 \r
 #define CONFIGURATION_VARSTORE_ID    0x1234\r
 \r
-#define FORMID_MAIN_FORM    1\r
+#define FORMID_MAIN_FORM             1\r
+\r
+#define KEY_INITIATOR_URI            0x101\r
+\r
+#define HTTP_BOOT_DEFAULT_DESCRIPTION_STR   L"UEFI HTTP"\r
 \r
 #pragma pack(1)\r
 typedef struct _HTTP_BOOT_CONFIG_IFR_NVDATA {\r
   UINT8     IpVersion;\r
   UINT8     Padding;\r
-  CHAR16    Description[URI_STR_MAX_SIZE];\r
+  CHAR16    Description[DESCRIPTION_STR_MAX_SIZE];\r
   CHAR16    Uri[URI_STR_MAX_SIZE];\r
 } HTTP_BOOT_CONFIG_IFR_NVDATA;\r
 #pragma pack()\r
index e47c6af3ad3acf931309bbfd5d8cfa68a6ec161e..7e8ddae33d761fda024e73298bf8379464124810 100644 (file)
@@ -31,8 +31,8 @@ formset
     string  varid   = HTTP_BOOT_CONFIG_IFR_NVDATA.Description,\r
             prompt  = STRING_TOKEN(STR_BOOT_DESCRIPTION_PROMPT),\r
             help    = STRING_TOKEN(STR_NULL_STRING),\r
-            minsize = 6,\r
-            maxsize = 75,\r
+            minsize = DESCRIPTION_STR_MIN_SIZE,\r
+            maxsize = DESCRIPTION_STR_MAX_SIZE,\r
     endstring;\r
 \r
     oneof varid  = HTTP_BOOT_CONFIG_IFR_NVDATA.IpVersion,\r
@@ -45,6 +45,8 @@ formset
     string  varid   = HTTP_BOOT_CONFIG_IFR_NVDATA.Uri,\r
             prompt  = STRING_TOKEN(STR_BOOT_URI_PROMPT),\r
             help    = STRING_TOKEN(STR_BOOT_URI_HELP),\r
+            flags   = INTERACTIVE,\r
+            key     = KEY_INITIATOR_URI,\r
             minsize = URI_STR_MIN_SIZE,\r
             maxsize = URI_STR_MAX_SIZE,\r
     endstring;\r