]> git.proxmox.com Git - mirror_edk2.git/blobdiff - NetworkPkg/HttpBootDxe/HttpBootConfig.c
QuarkSocPkg/MemoryInit: Remove use of memset()/memcpy()
[mirror_edk2.git] / NetworkPkg / HttpBootDxe / HttpBootConfig.c
index e7dd5db4dbe2a7ecefbe9d946b11c969c6f44f76..f32bf18e9d64e6999cfd903ac8670515f45df2f3 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Helper functions for configuring or getting the parameters relating to HTTP Boot.\r
 \r
-Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2016 - 2017, Intel Corporation. All rights reserved.<BR>\r
 This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
@@ -13,6 +13,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 **/\r
 \r
 #include "HttpBootDxe.h"\r
+#include <Library/UefiBootManagerLib.h>\r
 \r
 CHAR16  mHttpBootConfigStorageName[]     = L"HTTP_BOOT_CONFIG_IFR_NVDATA";\r
 \r
@@ -36,31 +37,18 @@ HttpBootAddBootOption (
   IN   CHAR16                   *Uri\r
   )\r
 {\r
-  EFI_DEV_PATH               *Node;\r
-  EFI_DEVICE_PATH_PROTOCOL   *TmpDevicePath;\r
-  EFI_DEVICE_PATH_PROTOCOL   *NewDevicePath;\r
-  UINTN                      Length;\r
-  CHAR8                      AsciiUri[URI_STR_MAX_SIZE];\r
-  CHAR16                     *CurrentOrder;\r
-  EFI_STATUS                 Status;\r
-  UINTN                      OrderCount;\r
-  UINTN                      TargetLocation;\r
-  BOOLEAN                    Found;\r
-  UINT8                      *TempByteBuffer;\r
-  UINT8                      *TempByteStart;\r
-  UINTN                      DescSize;\r
-  UINTN                      FilePathSize;\r
-  CHAR16                     OptionStr[10];\r
-  UINT16                     *NewOrder;\r
-  UINTN                      Index;\r
-\r
-  NewOrder      = NULL;\r
-  TempByteStart = NULL;\r
+  EFI_DEV_PATH                      *Node;\r
+  EFI_DEVICE_PATH_PROTOCOL          *TmpDevicePath;\r
+  EFI_DEVICE_PATH_PROTOCOL          *NewDevicePath;\r
+  UINTN                             Length;\r
+  CHAR8                             AsciiUri[URI_STR_MAX_SIZE];\r
+  EFI_STATUS                        Status;\r
+  UINTN                             Index;\r
+  EFI_BOOT_MANAGER_LOAD_OPTION      NewOption;\r
+\r
   NewDevicePath = NULL;\r
-  NewOrder      = NULL;\r
   Node          = NULL;\r
   TmpDevicePath = NULL;\r
-  CurrentOrder  = NULL;\r
 \r
   if (StrLen (Description) == 0) {\r
     return EFI_INVALID_PARAMETER;\r
@@ -79,9 +67,9 @@ HttpBootAddBootOption (
   }\r
 \r
   //\r
-  // Only accept http and https URI.\r
+  // Only accept empty URI, or http and https URI.\r
   //\r
-  if ((StrnCmp (Uri, L"http://", 7) != 0) && (StrnCmp (Uri, L"https://", 7) != 0)) {\r
+  if ((StrLen (Uri) != 0) && (StrnCmp (Uri, L"http://", 7) != 0) && (StrnCmp (Uri, L"https://", 8) != 0)) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
   \r
@@ -116,7 +104,7 @@ HttpBootAddBootOption (
   //\r
   // Update the URI node with the input boot file URI.\r
   //\r
-  UnicodeStrToAsciiStr (Uri, AsciiUri);\r
+  UnicodeStrToAsciiStrS (Uri, AsciiUri, sizeof (AsciiUri));\r
   Length = sizeof (EFI_DEVICE_PATH_PROTOCOL) + AsciiStrSize (AsciiUri);\r
   Node = AllocatePool (Length);\r
   if (Node == NULL) {\r
@@ -137,105 +125,27 @@ HttpBootAddBootOption (
   }\r
 \r
   //\r
-  // Get current "BootOrder" variable and find a free target.\r
+  // Add a new load option.\r
   //\r
-  Length = 0;\r
-  Status = GetVariable2 (\r
-             L"BootOrder",\r
-             &gEfiGlobalVariableGuid,\r
-             (VOID **)&CurrentOrder,\r
-             &Length \r
-             );\r
-  if (EFI_ERROR (Status) && Status != EFI_NOT_FOUND) {\r
-    goto ON_EXIT;\r
-  }\r
-  OrderCount = Length / sizeof (UINT16);\r
-  Found = FALSE;\r
-  for (TargetLocation=0; TargetLocation < 0xFFFF; TargetLocation++) {\r
-    Found = TRUE;\r
-    for (Index = 0; Index < OrderCount; Index++) {\r
-      if (CurrentOrder[Index] == TargetLocation) {\r
-        Found = FALSE;\r
-        break;\r
-      }\r
-    }\r
-    if (Found) {\r
-      break;\r
-    }\r
-  }\r
-\r
-  if (TargetLocation == 0xFFFF) {\r
-    DEBUG ((EFI_D_ERROR, "Could not find unused target index.\n"));\r
-    Status = EFI_OUT_OF_RESOURCES;\r
-    goto ON_EXIT;\r
-  } else {\r
-    DEBUG ((EFI_D_INFO, "TargetIndex = %04x.\n", TargetLocation));\r
-  }\r
-  \r
-  //\r
-  // Construct and set the "Boot####" variable\r
-  //\r
-  DescSize = StrSize(Description);\r
-  FilePathSize = GetDevicePathSize (NewDevicePath);\r
-  TempByteBuffer = AllocateZeroPool(sizeof(EFI_LOAD_OPTION) + DescSize + FilePathSize);\r
-  if (TempByteBuffer == NULL) {\r
-    Status = EFI_OUT_OF_RESOURCES;\r
-    goto ON_EXIT;\r
-  }\r
-\r
-  TempByteStart = TempByteBuffer;\r
-  *((UINT32 *) TempByteBuffer) = LOAD_OPTION_ACTIVE;      // Attributes\r
-  TempByteBuffer += sizeof (UINT32);\r
-\r
-  *((UINT16 *) TempByteBuffer) = (UINT16)FilePathSize;    // FilePathListLength\r
-  TempByteBuffer += sizeof (UINT16);\r
-\r
-  CopyMem (TempByteBuffer, Description, DescSize);\r
-  TempByteBuffer += DescSize;\r
-  CopyMem (TempByteBuffer, NewDevicePath, FilePathSize);\r
-\r
-  UnicodeSPrint (OptionStr, sizeof(OptionStr), L"%s%04x", L"Boot", TargetLocation);\r
-  Status = gRT->SetVariable (\r
-                  OptionStr,\r
-                  &gEfiGlobalVariableGuid,\r
-                  EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
-                  sizeof(UINT32) + sizeof(UINT16) + DescSize + FilePathSize,\r
-                  TempByteStart\r
-                  );\r
+  Status = EfiBootManagerInitializeLoadOption (\r
+                 &NewOption,\r
+                 LoadOptionNumberUnassigned,\r
+                 LoadOptionTypeBoot,\r
+                 LOAD_OPTION_ACTIVE,\r
+                 Description,\r
+                 NewDevicePath,\r
+                 NULL,\r
+                 0\r
+                 );\r
   if (EFI_ERROR (Status)) {\r
     goto ON_EXIT;\r
   }\r
 \r
-  //\r
-  // Insert into the order list and set "BootOrder" variable\r
-  //\r
-  NewOrder = AllocateZeroPool ((OrderCount + 1) * sizeof (UINT16));\r
-  if (NewOrder == NULL) {\r
-    Status = EFI_OUT_OF_RESOURCES;\r
-    goto ON_EXIT;\r
-  }\r
-  CopyMem(NewOrder, CurrentOrder, OrderCount * sizeof(UINT16));\r
-  NewOrder[OrderCount] = (UINT16) TargetLocation;\r
-  Status = gRT->SetVariable (\r
-                  L"BootOrder",\r
-                  &gEfiGlobalVariableGuid,\r
-                  EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
-                  ((OrderCount + 1) * sizeof (UINT16)),\r
-                  NewOrder\r
-                  );\r
-  \r
+  Status = EfiBootManagerAddLoadOptionVariable (&NewOption, (UINTN) -1);\r
+  EfiBootManagerFreeLoadOption (&NewOption);\r
 \r
 ON_EXIT:\r
 \r
-  if (CurrentOrder != NULL) {\r
-    FreePool (CurrentOrder);\r
-  }\r
-  if (NewOrder != NULL) {\r
-    FreePool (NewOrder);\r
-  }\r
-  if (TempByteStart != NULL) {\r
-    FreePool (TempByteStart);\r
-  }\r
   if (NewDevicePath != NULL) {\r
     FreePool (NewDevicePath);\r
   }\r
@@ -363,7 +273,9 @@ HttpBootFormExtractConfig (
     ConfigRequestHdr = HiiConstructConfigHdr (&gHttpBootConfigGuid, mHttpBootConfigStorageName, CallbackInfo->ChildHandle);\r
     Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16);\r
     ConfigRequest = AllocateZeroPool (Size);\r
-    ASSERT (ConfigRequest != NULL);\r
+    if (ConfigRequest == NULL) {\r
+      return EFI_OUT_OF_RESOURCES;\r
+    }\r
     AllocatedRequest = TRUE;\r
     UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX", ConfigRequestHdr, (UINT64)BufferSize);\r
     FreePool (ConfigRequestHdr);\r
@@ -534,9 +446,16 @@ HttpBootFormCallback (
   )\r
 {\r
   EFI_INPUT_KEY                   Key;\r
-  UINTN                           Index;\r
   CHAR16                          *Uri;\r
+  UINTN                           UriLen;\r
+  CHAR8                           *AsciiUri;\r
   HTTP_BOOT_FORM_CALLBACK_INFO    *CallbackInfo;\r
+  EFI_STATUS                      Status;\r
+\r
+  Uri      = NULL;\r
+  UriLen   = 0;\r
+  AsciiUri = NULL;\r
+  Status   = EFI_SUCCESS;\r
   \r
   if (This == NULL || Value == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
@@ -556,43 +475,61 @@ HttpBootFormCallback (
     Uri = HiiGetString (CallbackInfo->RegisteredHandle, Value->string, NULL);\r
 \r
     //\r
-    // Convert the scheme to all lower case.\r
+    // The URI should be either an empty string (for corporate environment) ,or http(s) for home environment.\r
+    // Pop up a message box for the unsupported URI.\r
     //\r
-    for (Index = 0; Index < StrLen (Uri); Index++) {\r
-      if (Uri[Index] == L':') {\r
-        break;\r
+    if (StrLen (Uri) != 0) {\r
+      UriLen = StrLen (Uri) + 1;\r
+      AsciiUri = AllocateZeroPool (UriLen);\r
+      if (AsciiUri == NULL) {\r
+        FreePool (Uri);\r
+        return EFI_OUT_OF_RESOURCES;\r
       }\r
-      if (Uri[Index] >= L'A' && Uri[Index] <= L'Z') {\r
-        Uri[Index] -= (CHAR16)(L'A' - L'a');\r
+\r
+      UnicodeStrToAsciiStrS (Uri, AsciiUri, UriLen);\r
+\r
+      Status = HttpBootCheckUriScheme (AsciiUri);\r
+      \r
+      if (Status == EFI_INVALID_PARAMETER) {\r
+\r
+        DEBUG ((EFI_D_ERROR, "HttpBootFormCallback: %r.\n", Status));\r
+\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
+      } else if (Status == EFI_ACCESS_DENIED) {\r
+      \r
+        DEBUG ((EFI_D_ERROR, "HttpBootFormCallback: %r.\n", Status));\r
+      \r
+        CreatePopUp (\r
+          EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,\r
+          &Key,\r
+          L"ERROR: Unsupported URI!",\r
+          L"HTTP is disabled",\r
+          NULL\r
+          );\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
+    if (Uri != NULL) {\r
+      FreePool (Uri);\r
     }\r
 \r
-    FreePool (Uri);\r
+    if (AsciiUri != NULL) {\r
+      FreePool (AsciiUri);\r
+    }   \r
+    \r
     break;\r
 \r
   default:\r
     break;\r
   }\r
 \r
-  return EFI_SUCCESS;\r
+  return Status;\r
 }\r
 \r
 /**\r