NetworkPkg: Add URI configuration form to HTTP boot driver.

This patch updates the HTTP boot driver to produce a setup page for the boot
file URI configuration. A new boot option will be created for the manual
configured URI address. This change is made to support the HTTP boot usage
in home environment.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Fu Siyuan <siyuan.fu@intel.com>
Reviewed-by: Wu Jiaxin <jiaxin.wu@intel.com>
Reviewed-by: Ye Ting <ting.ye@intel.com>
This commit is contained in:
Fu Siyuan
2016-03-07 09:12:14 +08:00
parent 9353c60cea
commit fa848a4048
17 changed files with 1288 additions and 110 deletions
+55 -44
View File
@@ -168,18 +168,35 @@ HttpBootDhcp4ExtractUriInfo (
// HttpOffer contains the boot file URL.
//
SelectOffer = &Private->OfferBuffer[SelectIndex].Dhcp4;
if ((SelectOffer->OfferType == HttpOfferTypeDhcpIpUri) || (SelectOffer->OfferType == HttpOfferTypeDhcpNameUriDns)) {
HttpOffer = SelectOffer;
if (Private->FilePathUri == NULL) {
//
// In Corporate environment, we need a HttpOffer.
//
if ((SelectOffer->OfferType == HttpOfferTypeDhcpIpUri) ||
(SelectOffer->OfferType == HttpOfferTypeDhcpIpUriDns) ||
(SelectOffer->OfferType == HttpOfferTypeDhcpNameUriDns)) {
HttpOffer = SelectOffer;
} else {
ASSERT (Private->SelectProxyType != HttpOfferTypeMax);
ProxyIndex = Private->OfferIndex[Private->SelectProxyType][0];
HttpOffer = &Private->OfferBuffer[ProxyIndex].Dhcp4;
}
Private->BootFileUriParser = HttpOffer->UriParser;
Private->BootFileUri = (CHAR8*) HttpOffer->OptList[HTTP_BOOT_DHCP4_TAG_INDEX_BOOTFILE]->Data;
} else {
ASSERT (Private->SelectProxyType != HttpOfferTypeMax);
ProxyIndex = Private->OfferIndex[Private->SelectProxyType][0];
HttpOffer = &Private->OfferBuffer[ProxyIndex].Dhcp4;
//
// In Home environment the BootFileUri comes from the FilePath.
//
Private->BootFileUriParser = Private->FilePathUriParser;
Private->BootFileUri = Private->FilePathUri;
}
//
// Configure the default DNS server if server assigned.
//
if ((SelectOffer->OfferType == HttpOfferTypeDhcpNameUriDns) || (SelectOffer->OfferType == HttpOfferTypeDhcpDns)) {
if ((SelectOffer->OfferType == HttpOfferTypeDhcpNameUriDns) ||
(SelectOffer->OfferType == HttpOfferTypeDhcpDns) ||
(SelectOffer->OfferType == HttpOfferTypeDhcpIpUriDns)) {
Option = SelectOffer->OptList[HTTP_BOOT_DHCP4_TAG_INDEX_DNS_SERVER];
ASSERT (Option != NULL);
Status = HttpBootRegisterIp4Dns (
@@ -196,21 +213,14 @@ HttpBootDhcp4ExtractUriInfo (
// Extract the port from URL, and use default HTTP port 80 if not provided.
//
Status = HttpUrlGetPort (
(CHAR8*) HttpOffer->OptList[HTTP_BOOT_DHCP4_TAG_INDEX_BOOTFILE]->Data,
HttpOffer->UriParser,
Private->BootFileUri,
Private->BootFileUriParser,
&Private->Port
);
if (EFI_ERROR (Status) || Private->Port == 0) {
Private->Port = 80;
}
//
// Record the URI of boot file from the selected HTTP offer.
//
Private->BootFileUriParser = HttpOffer->UriParser;
Private->BootFileUri = (CHAR8*) HttpOffer->OptList[HTTP_BOOT_DHCP4_TAG_INDEX_BOOTFILE]->Data;
//
// All boot informations are valid here.
//
@@ -260,12 +270,27 @@ HttpBootDhcp6ExtractUriInfo (
// HttpOffer contains the boot file URL.
//
SelectOffer = &Private->OfferBuffer[SelectIndex].Dhcp6;
if ((SelectOffer->OfferType == HttpOfferTypeDhcpIpUri) || (SelectOffer->OfferType == HttpOfferTypeDhcpNameUriDns)) {
HttpOffer = SelectOffer;
if (Private->FilePathUri == NULL) {
//
// In Corporate environment, we need a HttpOffer.
//
if ((SelectOffer->OfferType == HttpOfferTypeDhcpIpUri) ||
(SelectOffer->OfferType == HttpOfferTypeDhcpIpUriDns) ||
(SelectOffer->OfferType == HttpOfferTypeDhcpNameUriDns)) {
HttpOffer = SelectOffer;
} else {
ASSERT (Private->SelectProxyType != HttpOfferTypeMax);
ProxyIndex = Private->OfferIndex[Private->SelectProxyType][0];
HttpOffer = &Private->OfferBuffer[ProxyIndex].Dhcp6;
}
Private->BootFileUriParser = HttpOffer->UriParser;
Private->BootFileUri = (CHAR8*) HttpOffer->OptList[HTTP_BOOT_DHCP6_IDX_BOOT_FILE_URL]->Data;
} else {
ASSERT (Private->SelectProxyType != HttpOfferTypeMax);
ProxyIndex = Private->OfferIndex[Private->SelectProxyType][0];
HttpOffer = &Private->OfferBuffer[ProxyIndex].Dhcp6;
//
// In Home environment the BootFileUri comes from the FilePath.
//
Private->BootFileUriParser = Private->FilePathUriParser;
Private->BootFileUri = Private->FilePathUri;
}
//
@@ -279,7 +304,9 @@ HttpBootDhcp6ExtractUriInfo (
//
// Configure the default DNS server if server assigned.
//
if ((SelectOffer->OfferType == HttpOfferTypeDhcpNameUriDns) || (SelectOffer->OfferType == HttpOfferTypeDhcpDns)) {
if ((SelectOffer->OfferType == HttpOfferTypeDhcpNameUriDns) ||
(SelectOffer->OfferType == HttpOfferTypeDhcpDns) ||
(SelectOffer->OfferType == HttpOfferTypeDhcpIpUriDns)) {
Option = SelectOffer->OptList[HTTP_BOOT_DHCP6_IDX_DNS_SERVER];
ASSERT (Option != NULL);
Status = HttpBootSetIp6Dns (
@@ -297,8 +324,8 @@ HttpBootDhcp6ExtractUriInfo (
// whether can send message to HTTP Server Ip through the GateWay.
//
Status = HttpUrlGetIp6 (
(CHAR8*) HttpOffer->OptList[HTTP_BOOT_DHCP6_IDX_BOOT_FILE_URL]->Data,
HttpOffer->UriParser,
Private->BootFileUri,
Private->BootFileUriParser,
&IpAddr
);
@@ -307,8 +334,8 @@ HttpBootDhcp6ExtractUriInfo (
// The Http server address is expressed by Name Ip, so perform DNS resolution
//
Status = HttpUrlGetHostName (
(CHAR8*) HttpOffer->OptList[HTTP_BOOT_DHCP6_IDX_BOOT_FILE_URL]->Data,
HttpOffer->UriParser,
Private->BootFileUri,
Private->BootFileUriParser,
&HostName
);
if (EFI_ERROR (Status)) {
@@ -343,21 +370,14 @@ HttpBootDhcp6ExtractUriInfo (
// Extract the port from URL, and use default HTTP port 80 if not provided.
//
Status = HttpUrlGetPort (
(CHAR8*) HttpOffer->OptList[HTTP_BOOT_DHCP6_IDX_BOOT_FILE_URL]->Data,
HttpOffer->UriParser,
Private->BootFileUri,
Private->BootFileUriParser,
&Private->Port
);
if (EFI_ERROR (Status) || Private->Port == 0) {
Private->Port = 80;
}
//
// Record the URI of boot file from the selected HTTP offer.
//
Private->BootFileUriParser = HttpOffer->UriParser;
Private->BootFileUri = (CHAR8*) HttpOffer->OptList[HTTP_BOOT_DHCP6_IDX_BOOT_FILE_URL]->Data;
//
// All boot informations are valid here.
//
@@ -570,10 +590,6 @@ HttpBootGetFileFromCache (
return EFI_INVALID_PARAMETER;
}
//
// Search file in the cache list, the cache entry will be released upon a successful
// match.
//
NET_LIST_FOR_EACH (Entry, &Private->CacheList) {
Cache = NET_LIST_USER_STRUCT (Entry, HTTP_BOOT_CACHE_CONTENT, Link);
//
@@ -607,12 +623,6 @@ HttpBootGetFileFromCache (
}
}
*BufferSize = CopyedSize;
//
// On success, free the cached data to release the memory resource.
//
RemoveEntryList (&Cache->Link);
HttpBootFreeCache (Cache);
return EFI_SUCCESS;
}
}
@@ -1083,3 +1093,4 @@ ERROR_1:
return Status;
}
File diff suppressed because it is too large Load Diff
+78
View File
@@ -0,0 +1,78 @@
/** @file
The header file of functions for configuring or getting the parameters
relating to HTTP Boot.
Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
#ifndef _HTTP_BOOT_CONFIG_H_
#define _HTTP_BOOT_CONFIG_H_
#include "HttpBootConfigNVDataStruc.h"
typedef struct _HTTP_BOOT_FORM_CALLBACK_INFO HTTP_BOOT_FORM_CALLBACK_INFO;
extern UINT8 HttpBootDxeStrings[];
extern UINT8 HttpBootConfigVfrBin[];
#pragma pack()
#define HTTP_BOOT_FORM_CALLBACK_INFO_SIGNATURE SIGNATURE_32 ('H', 'B', 'f', 'c')
#define HTTP_BOOT_FORM_CALLBACK_INFO_FROM_CONFIG_ACCESS(Callback) \
CR ( \
Callback, \
HTTP_BOOT_FORM_CALLBACK_INFO, \
ConfigAccess, \
HTTP_BOOT_FORM_CALLBACK_INFO_SIGNATURE \
)
struct _HTTP_BOOT_FORM_CALLBACK_INFO {
UINT32 Signature;
BOOLEAN Initilized;
EFI_HANDLE ChildHandle;
EFI_DEVICE_PATH_PROTOCOL *HiiVendorDevicePath;
EFI_HII_HANDLE RegisteredHandle;
EFI_HII_CONFIG_ACCESS_PROTOCOL ConfigAccess;
HTTP_BOOT_CONFIG_IFR_NVDATA HttpBootNvData;
};
/**
Initialize the configuration form.
@param[in] Private Pointer to the driver private data.
@retval EFI_SUCCESS The configuration form is initialized.
@retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
**/
EFI_STATUS
HttpBootConfigFormInit (
IN HTTP_BOOT_PRIVATE_DATA *Private
);
/**
Unload the configuration form, this includes: delete all the configuration
entries, uninstall the form callback protocol, and free the resources used.
@param[in] Private Pointer to the driver private data.
@retval EFI_SUCCESS The configuration form is unloaded.
@retval Others Failed to unload the form.
**/
EFI_STATUS
HttpBootConfigFormUnload (
IN HTTP_BOOT_PRIVATE_DATA *Private
);
#endif
@@ -0,0 +1,43 @@
/** @file
Define NVData structures used by the HTTP Boot configuration component.
Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
#ifndef _HTTP_BOOT_NVDATA_STRUC_H_
#define _HTTP_BOOT_NVDATA_STRUC_H_
#include <Guid/HttpBootConfigHii.h>
#define HTTP_BOOT_IP_VERSION_4 0
#define HTTP_BOOT_IP_VERSION_6 1
//
// Macros used for an IPv4 or an IPv6 address.
//
#define URI_STR_MIN_SIZE 8
#define URI_STR_MAX_SIZE 255
#define CONFIGURATION_VARSTORE_ID 0x1234
#define FORMID_MAIN_FORM 1
#pragma pack(1)
typedef struct _HTTP_BOOT_CONFIG_IFR_NVDATA {
UINT8 IpVersion;
UINT8 Padding;
CHAR16 Description[URI_STR_MAX_SIZE];
CHAR16 Uri[URI_STR_MAX_SIZE];
} HTTP_BOOT_CONFIG_IFR_NVDATA;
#pragma pack()
#endif
Binary file not shown.
@@ -0,0 +1,53 @@
/** @file
VFR file used by the HTTP Boot configuration component.
Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php.
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
#include "HttpBootConfigNVDataStruc.h"
formset
guid = HTTP_BOOT_CONFIG_GUID,
title = STRING_TOKEN(STR_HTTP_BOOT_CONFIG_FORM_TITLE),
help = STRING_TOKEN(STR_HTTP_BOOT_CONFIG_FORM_HELP),
varstore HTTP_BOOT_CONFIG_IFR_NVDATA,
name = HTTP_BOOT_CONFIG_IFR_NVDATA,
guid = HTTP_BOOT_CONFIG_GUID;
form formid = FORMID_MAIN_FORM,
title = STRING_TOKEN(STR_HTTP_BOOT_CONFIG_FORM_TITLE);
string varid = HTTP_BOOT_CONFIG_IFR_NVDATA.Description,
prompt = STRING_TOKEN(STR_BOOT_DESCRIPTION_PROMPT),
help = STRING_TOKEN(STR_NULL_STRING),
minsize = 6,
maxsize = 75,
endstring;
oneof varid = HTTP_BOOT_CONFIG_IFR_NVDATA.IpVersion,
prompt = STRING_TOKEN(STR_HTTP_BOOT_IP_VERSION_PROMPT),
help = STRING_TOKEN(STR_HTTP_BOOT_IP_VERSION_HELP),
option text = STRING_TOKEN(STR_HTTP_BOOT_IP_VERSION_4), value = HTTP_BOOT_IP_VERSION_4, flags = DEFAULT;
option text = STRING_TOKEN(STR_HTTP_BOOT_IP_VERSION_6), value = HTTP_BOOT_IP_VERSION_6, flags = 0;
endoneof;
string varid = HTTP_BOOT_CONFIG_IFR_NVDATA.Uri,
prompt = STRING_TOKEN(STR_BOOT_URI_PROMPT),
help = STRING_TOKEN(STR_BOOT_URI_HELP),
minsize = URI_STR_MIN_SIZE,
maxsize = URI_STR_MAX_SIZE,
endstring;
endform;
endformset;
+75 -36
View File
@@ -1,7 +1,7 @@
/** @file
Functions implementation related with DHCPv4 for HTTP boot driver.
Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials are licensed and made available under
the terms and conditions of the BSD License that accompanies this distribution.
The full text of the license may be found at
@@ -395,7 +395,11 @@ HttpBootParseDhcp4Packet (
//
if (IsHttpOffer) {
if (IpExpressedUri) {
OfferType = IsProxyOffer ? HttpOfferTypeProxyIpUri : HttpOfferTypeDhcpIpUri;
if (IsProxyOffer) {
OfferType = HttpOfferTypeProxyIpUri;
} else {
OfferType = IsDnsOffer ? HttpOfferTypeDhcpIpUriDns : HttpOfferTypeDhcpIpUri;
}
} else {
if (!IsProxyOffer) {
OfferType = IsDnsOffer ? HttpOfferTypeDhcpNameUriDns : HttpOfferTypeDhcpNameUri;
@@ -473,46 +477,81 @@ HttpBootSelectDhcpOffer (
{
Private->SelectIndex = 0;
Private->SelectProxyType = HttpOfferTypeMax;
//
// Priority1: HttpOfferTypeDhcpIpUri
// Priority2: HttpOfferTypeDhcpNameUriDns
// Priority3: HttpOfferTypeDhcpOnly + HttpOfferTypeProxyIpUri
// Priority4: HttpOfferTypeDhcpDns + HttpOfferTypeProxyIpUri
// Priority5: HttpOfferTypeDhcpDns + HttpOfferTypeProxyNameUri
// Priority6: HttpOfferTypeDhcpDns + HttpOfferTypeDhcpNameUri
//
if (Private->OfferCount[HttpOfferTypeDhcpIpUri] > 0) {
if (Private->FilePathUri != NULL) {
//
// We are in home environment, the URI is already specified.
// Just need to choose a DHCP offer.
// The offer with DNS server address takes priority here.
//
if (Private->OfferCount[HttpOfferTypeDhcpDns] > 0) {
Private->SelectIndex = Private->OfferIndex[HttpOfferTypeDhcpDns][0] + 1;
} else if (Private->OfferCount[HttpOfferTypeDhcpIpUriDns] > 0) {
Private->SelectIndex = Private->OfferIndex[HttpOfferTypeDhcpIpUri][0] + 1;
Private->SelectIndex = Private->OfferIndex[HttpOfferTypeDhcpIpUriDns][0] + 1;
} else if (Private->OfferCount[HttpOfferTypeDhcpNameUriDns] > 0) {
} else if (Private->OfferCount[HttpOfferTypeDhcpNameUriDns] > 0) {
Private->SelectIndex = Private->OfferIndex[HttpOfferTypeDhcpNameUriDns][0] + 1;
Private->SelectIndex = Private->OfferIndex[HttpOfferTypeDhcpNameUriDns][0] + 1;
} else if (Private->OfferCount[HttpOfferTypeDhcpOnly] > 0) {
} else if (Private->OfferCount[HttpOfferTypeDhcpOnly] > 0 &&
Private->OfferCount[HttpOfferTypeProxyIpUri] > 0) {
Private->SelectIndex = Private->OfferIndex[HttpOfferTypeDhcpOnly][0] + 1;
Private->SelectProxyType = HttpOfferTypeProxyIpUri;
Private->SelectIndex = Private->OfferIndex[HttpOfferTypeDhcpOnly][0] + 1;
} else if (Private->OfferCount[HttpOfferTypeDhcpIpUri] > 0) {
} else if (Private->OfferCount[HttpOfferTypeDhcpDns] > 0 &&
Private->OfferCount[HttpOfferTypeProxyIpUri] > 0) {
Private->SelectIndex = Private->OfferIndex[HttpOfferTypeDhcpDns][0] + 1;
Private->SelectProxyType = HttpOfferTypeProxyIpUri;
Private->SelectIndex = Private->OfferIndex[HttpOfferTypeDhcpIpUri][0] + 1;
}
} else if (Private->OfferCount[HttpOfferTypeDhcpDns] > 0 &&
Private->OfferCount[HttpOfferTypeProxyNameUri] > 0) {
Private->SelectIndex = Private->OfferIndex[HttpOfferTypeDhcpDns][0] + 1;
Private->SelectProxyType = HttpOfferTypeProxyNameUri;
} else {
//
// We are in corporate environment.
//
// Priority1: HttpOfferTypeDhcpIpUri or HttpOfferTypeDhcpIpUriDns
// Priority2: HttpOfferTypeDhcpNameUriDns
// Priority3: HttpOfferTypeDhcpOnly + HttpOfferTypeProxyIpUri
// Priority4: HttpOfferTypeDhcpDns + HttpOfferTypeProxyIpUri
// Priority5: HttpOfferTypeDhcpDns + HttpOfferTypeProxyNameUri
// Priority6: HttpOfferTypeDhcpDns + HttpOfferTypeDhcpNameUri
//
if (Private->OfferCount[HttpOfferTypeDhcpIpUri] > 0) {
Private->SelectIndex = Private->OfferIndex[HttpOfferTypeDhcpIpUri][0] + 1;
} else if (Private->OfferCount[HttpOfferTypeDhcpIpUriDns] > 0) {
Private->SelectIndex = Private->OfferIndex[HttpOfferTypeDhcpIpUriDns][0] + 1;
}else if (Private->OfferCount[HttpOfferTypeDhcpNameUriDns] > 0) {
} else if (Private->OfferCount[HttpOfferTypeDhcpDns] > 0 &&
Private->OfferCount[HttpOfferTypeDhcpNameUri] > 0) {
Private->SelectIndex = Private->OfferIndex[HttpOfferTypeDhcpDns][0] + 1;
Private->SelectProxyType = HttpOfferTypeDhcpNameUri;
Private->SelectIndex = Private->OfferIndex[HttpOfferTypeDhcpNameUriDns][0] + 1;
} else if (Private->OfferCount[HttpOfferTypeDhcpOnly] > 0 &&
Private->OfferCount[HttpOfferTypeProxyIpUri] > 0) {
Private->SelectIndex = Private->OfferIndex[HttpOfferTypeDhcpOnly][0] + 1;
Private->SelectProxyType = HttpOfferTypeProxyIpUri;
} else if (Private->OfferCount[HttpOfferTypeDhcpDns] > 0 &&
Private->OfferCount[HttpOfferTypeProxyIpUri] > 0) {
Private->SelectIndex = Private->OfferIndex[HttpOfferTypeDhcpDns][0] + 1;
Private->SelectProxyType = HttpOfferTypeProxyIpUri;
} else if (Private->OfferCount[HttpOfferTypeDhcpDns] > 0 &&
Private->OfferCount[HttpOfferTypeProxyNameUri] > 0) {
Private->SelectIndex = Private->OfferIndex[HttpOfferTypeDhcpDns][0] + 1;
Private->SelectProxyType = HttpOfferTypeProxyNameUri;
} else if (Private->OfferCount[HttpOfferTypeDhcpDns] > 0 &&
Private->OfferCount[HttpOfferTypeDhcpNameUri] > 0) {
Private->SelectIndex = Private->OfferIndex[HttpOfferTypeDhcpDns][0] + 1;
Private->SelectProxyType = HttpOfferTypeDhcpNameUri;
}
}
}
+6 -3
View File
@@ -1,7 +1,7 @@
/** @file
Functions declaration related with DHCPv4 for HTTP boot driver.
Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials are licensed and made available under
the terms and conditions of the BSD License that accompanies this distribution.
The full text of the license may be found at
@@ -96,11 +96,14 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
///
typedef enum {
//
// <IP address, IP expressed URI> or
// <IP address, IP expressed URI, Name-server (will be ignored)>
// <IP address, IP expressed URI>
//
HttpOfferTypeDhcpIpUri,
//
// <IP address, IP expressed URI, Name-server>
//
HttpOfferTypeDhcpIpUriDns,
//
// <IP address, Domain-name expressed URI, Name-server>
//
HttpOfferTypeDhcpNameUriDns,
+5 -1
View File
@@ -298,7 +298,11 @@ HttpBootParseDhcp6Packet (
//
if (IsHttpOffer) {
if (IpExpressedUri) {
OfferType = IsProxyOffer ? HttpOfferTypeProxyIpUri : HttpOfferTypeDhcpIpUri;
if (IsProxyOffer) {
OfferType = HttpOfferTypeProxyIpUri;
} else {
OfferType = IsDnsOffer ? HttpOfferTypeDhcpIpUriDns : HttpOfferTypeDhcpIpUri;
}
} else {
if (!IsProxyOffer) {
OfferType = IsDnsOffer ? HttpOfferTypeDhcpNameUriDns : HttpOfferTypeDhcpNameUri;
+36 -8
View File
@@ -1,7 +1,7 @@
/** @file
Driver Binding functions implementation for UEFI HTTP boot.
Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials are licensed and made available under
the terms and conditions of the BSD License that accompanies this distribution.
The full text of the license may be found at
@@ -364,6 +364,14 @@ HttpBootIp4DxeDriverBindingStart (
goto ON_ERROR;
}
//
// Initialize the HII configuration form.
//
Status = HttpBootConfigFormInit (Private);
if (EFI_ERROR (Status)) {
goto ON_ERROR;
}
//
// Install a protocol with Caller Id Guid to the NIC, this is just to build the relationship between
// NIC handle and the private data.
@@ -508,8 +516,9 @@ HttpBootIp4DxeDriverBindingStart (
ON_ERROR:
HttpBootDestroyIp4Children (This, Private);
HttpBootConfigFormUnload (Private);
FreePool (Private);
return Status;
@@ -615,6 +624,11 @@ HttpBootIp4DxeDriverBindingStop (
// Release the cached data.
//
HttpBootFreeCacheList (Private);
//
// Unload the config form.
//
HttpBootConfigFormUnload (Private);
gBS->UninstallProtocolInterface (
NicHandle,
@@ -822,6 +836,14 @@ HttpBootIp6DxeDriverBindingStart (
goto ON_ERROR;
}
//
// Initialize the HII configuration form.
//
Status = HttpBootConfigFormInit (Private);
if (EFI_ERROR (Status)) {
goto ON_ERROR;
}
//
// Install a protocol with Caller Id Guid to the NIC, this is just to build the relationship between
// NIC handle and the private data.
@@ -989,12 +1011,12 @@ HttpBootIp6DxeDriverBindingStart (
return EFI_SUCCESS;
ON_ERROR:
HttpBootDestroyIp6Children(This, Private);
FreePool (Private);
return Status;
HttpBootDestroyIp6Children(This, Private);
HttpBootConfigFormUnload (Private);
FreePool (Private);
return Status;
}
/**
@@ -1096,7 +1118,12 @@ HttpBootIp6DxeDriverBindingStop (
// Release the cached data.
//
HttpBootFreeCacheList (Private);
//
// Unload the config form.
//
HttpBootConfigFormUnload (Private);
gBS->UninstallProtocolInterface (
NicHandle,
&gEfiCallerIdGuid,
@@ -1128,6 +1155,7 @@ HttpBootDxeDriverEntryPoint (
)
{
EFI_STATUS Status;
//
// Install UEFI Driver Model protocol(s).
//
+32 -1
View File
@@ -1,7 +1,7 @@
/** @file
UEFI HTTP boot driver's private data structure and interfaces declaration.
Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>
(C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>
This program and the accompanying materials are licensed and made available under
the terms and conditions of the BSD License that accompanies this distribution.
@@ -24,6 +24,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
// Libraries
//
#include <Library/UefiBootServicesTableLib.h>
#include <Library/UefiHiiServicesLib.h>
#include <Library/UefiRuntimeServicesTableLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/BaseLib.h>
#include <Library/UefiLib.h>
@@ -31,6 +33,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#include <Library/DebugLib.h>
#include <Library/NetLib.h>
#include <Library/HttpLib.h>
#include <Library/HiiLib.h>
#include <Library/PrintLib.h>
//
// UEFI Driver Model Protocols
@@ -42,6 +46,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
//
// Consumed Protocols
//
#include <Protocol/ServiceBinding.h>
#include <Protocol/HiiConfigAccess.h>
#include <Protocol/NetworkInterfaceIdentifier.h>
#include <Protocol/Dhcp4.h>
#include <Protocol/Dhcp6.h>
@@ -54,6 +60,11 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
//
#include <Protocol/LoadFile.h>
//
// Consumed Guids
//
#include <Guid/HttpBootConfigHii.h>
//
// Driver Version
//
@@ -81,6 +92,7 @@ typedef struct _HTTP_BOOT_VIRTUAL_NIC HTTP_BOOT_VIRTUAL_NIC;
#include "HttpBootImpl.h"
#include "HttpBootSupport.h"
#include "HttpBootClient.h"
#include "HttpBootConfig.h"
typedef union {
HTTP_BOOT_DHCP4_PACKET_CACHE Dhcp4;
@@ -95,6 +107,14 @@ struct _HTTP_BOOT_VIRTUAL_NIC {
HTTP_BOOT_PRIVATE_DATA *Private;
};
#define HTTP_BOOT_PRIVATE_DATA_FROM_CALLBACK_INFO(Callback) \
CR ( \
Callback, \
HTTP_BOOT_PRIVATE_DATA, \
CallbackInfo, \
HTTP_BOOT_PRIVATE_DATA_SIGNATURE \
)
struct _HTTP_BOOT_PRIVATE_DATA {
UINT32 Signature;
EFI_HANDLE Controller;
@@ -131,6 +151,11 @@ struct _HTTP_BOOT_PRIVATE_DATA {
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
UINT32 Id;
//
// HII callback info block
//
HTTP_BOOT_FORM_CALLBACK_INFO CallbackInfo;
//
// Mode data
//
@@ -146,6 +171,12 @@ struct _HTTP_BOOT_PRIVATE_DATA {
UINTN BootFileSize;
BOOLEAN NoGateway;
//
// URI string extracted from the input FilePath parameter.
//
CHAR8 *FilePathUri;
VOID *FilePathUriParser;
//
// Cached HTTP data
//
+16 -1
View File
@@ -1,7 +1,7 @@
## @file
# This modules produce the Load File Protocol for UEFI HTTP boot.
#
# Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
# Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>
# This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License
# which accompanies this distribution. The full text of the license may be found at
@@ -25,10 +25,12 @@
[Packages]
MdePkg/MdePkg.dec
MdeModulePkg/MdeModulePkg.dec
NetworkPkg/NetworkPkg.dec
[Sources]
HttpBootDxe.h
HttpBootDxe.c
HttpBootConfig.c
HttpBootComponentName.h
HttpBootComponentName.c
HttpBootImpl.h
@@ -41,6 +43,8 @@
HttpBootSupport.c
HttpBootClient.h
HttpBootClient.c
HttpBootConfigVfr.vfr
HttpBootConfigStrings.uni
[LibraryClasses]
UefiDriverEntryPoint
@@ -52,6 +56,9 @@
DebugLib
NetLib
HttpLib
HiiLib
PrintLib
UefiHiiServicesLib
[Protocols]
## TO_START
@@ -72,6 +79,14 @@
gEfiIp6ProtocolGuid ## TO_START
gEfiIp6ConfigProtocolGuid ## TO_START
gEfiNetworkInterfaceIdentifierProtocolGuid_31 ## SOMETIMES_CONSUMES
gEfiHiiConfigAccessProtocolGuid ## BY_START
[Guids]
## SOMETIMES_CONSUMES ## GUID # HiiIsConfigHdrMatch mHttpBootConfigStorageName
## SOMETIMES_PRODUCES ## GUID # HiiConstructConfigHdr mHttpBootConfigStorageName
## SOMETIMES_PRODUCES ## GUID # HiiGetBrowserData mHttpBootConfigStorageName
## SOMETIMES_CONSUMES ## HII
gHttpBootConfigGuid
[UserExtensions.TianoCore."ExtraFiles"]
HttpBootDxeExtra.uni
+56 -15
View File
@@ -1,7 +1,7 @@
/** @file
The implementation of EFI_LOAD_FILE_PROTOCOL for UEFI HTTP boot.
Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>
Copyright (c) 2015 - 2016, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials are licensed and made available under
the terms and conditions of the BSD License that accompanies this distribution.
The full text of the license may be found at
@@ -21,22 +21,25 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
@param[in] UsingIpv6 Specifies the type of IP addresses that are to be
used during the session that is being started.
Set to TRUE for IPv6, and FALSE for IPv4.
@param[in] FilePath The device specific path of the file to load.
@retval EFI_SUCCESS HTTP boot was successfully enabled.
@retval EFI_INVALID_PARAMETER Private is NULL.
@retval EFI_ALREADY_STARTED The driver is already in started state.
@retval EFI_OUT_OF_RESOURCES There are not enough resources.
**/
EFI_STATUS
HttpBootStart (
IN HTTP_BOOT_PRIVATE_DATA *Private,
IN BOOLEAN UsingIpv6
IN BOOLEAN UsingIpv6,
IN EFI_DEVICE_PATH_PROTOCOL *FilePath
)
{
UINTN Index;
EFI_STATUS Status;
if (Private == NULL) {
if (Private == NULL || FilePath == NULL) {
return EFI_INVALID_PARAMETER;
}
@@ -54,6 +57,26 @@ HttpBootStart (
} else {
return EFI_UNSUPPORTED;
}
//
// Check whether the URI address is specified.
//
Status = HttpBootParseFilePath (FilePath, &Private->FilePathUri);
if (EFI_ERROR (Status)) {
return EFI_INVALID_PARAMETER;
}
if (Private->FilePathUri != NULL) {
Status = HttpParseUrl (
Private->FilePathUri,
(UINT32) AsciiStrLen (Private->FilePathUri),
FALSE,
&Private->FilePathUriParser
);
if (EFI_ERROR (Status)) {
return Status;
}
}
//
// Init the content of cached DHCP offer list.
@@ -301,12 +324,21 @@ HttpBootStop (
}
}
}
if (Private->FilePathUri!= NULL) {
FreePool (Private->FilePathUri);
HttpUrlFreeParser (Private->FilePathUriParser);
Private->FilePathUri = NULL;
Private->FilePathUriParser = NULL;
}
ZeroMem (Private->OfferBuffer, sizeof (Private->OfferBuffer));
Private->OfferNum = 0;
ZeroMem (Private->OfferCount, sizeof (Private->OfferCount));
ZeroMem (Private->OfferIndex, sizeof (Private->OfferIndex));
HttpBootFreeCacheList (Private);
return EFI_SUCCESS;
}
@@ -357,7 +389,7 @@ HttpBootDxeLoadFile (
BOOLEAN UsingIpv6;
EFI_STATUS Status;
if (This == NULL || BufferSize == NULL) {
if (This == NULL || BufferSize == NULL || FilePath == NULL) {
return EFI_INVALID_PARAMETER;
}
@@ -370,7 +402,6 @@ HttpBootDxeLoadFile (
VirtualNic = HTTP_BOOT_VIRTUAL_NIC_FROM_LOADFILE (This);
Private = VirtualNic->Private;
UsingIpv6 = FALSE;
//
// Check media status before HTTP boot start
@@ -380,27 +411,37 @@ HttpBootDxeLoadFile (
if (!MediaPresent) {
return EFI_NO_MEDIA;
}
//
// Check whether the virtual nic is using IPv6 or not.
//
UsingIpv6 = FALSE;
if (VirtualNic == Private->Ip6Nic) {
UsingIpv6 = TRUE;
}
//
// Initialize HTTP boot and load the boot file.
// Initialize HTTP boot.
//
Status = HttpBootStart (Private, UsingIpv6);
if (Status == EFI_ALREADY_STARTED && UsingIpv6 != Private->UsingIpv6) {
Status = HttpBootStart (Private, UsingIpv6, FilePath);
if (Status == EFI_ALREADY_STARTED) {
//
// Http boot Driver has already been started but not on the required IP version, restart it.
// Restart the HTTP boot driver in 2 cases:
// 1. Http boot Driver has already been started but not on the required IP version.
// 2. The required boot FilePath is different with the one we produced in the device path
// protocol.
//
Status = HttpBootStop (Private);
if (!EFI_ERROR (Status)) {
Status = HttpBootStart (Private, UsingIpv6);
if ((UsingIpv6 != Private->UsingIpv6) || !IsDevicePathEnd(FilePath)) {
Status = HttpBootStop (Private);
if (!EFI_ERROR (Status)) {
Status = HttpBootStart (Private, UsingIpv6, FilePath);
}
}
}
//
// Load the boot file.
//
if (Status == EFI_SUCCESS || Status == EFI_ALREADY_STARTED) {
Status = HttpBootLoadFile (Private, BufferSize, Buffer);
}
+63
View File
@@ -977,3 +977,66 @@ HttpIoRecvResponse (
return Status;
}
/**
Get the URI address string from the input device path.
Caller need to free the buffer in the UriAddress pointer.
@param[in] FilePath Pointer to the device path which contains a URI device path node.
@param[in] UriAddress The URI address string extract from the device path.
@retval EFI_SUCCESS The URI string is returned.
@retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
**/
EFI_STATUS
HttpBootParseFilePath (
IN EFI_DEVICE_PATH_PROTOCOL *FilePath,
OUT CHAR8 **UriAddress
)
{
EFI_DEVICE_PATH_PROTOCOL *TempDevicePath;
URI_DEVICE_PATH *UriDevicePath;
CHAR8 *Uri;
UINTN UriStrLength;
if (FilePath == NULL) {
return EFI_INVALID_PARAMETER;
}
*UriAddress = NULL;
//
// Extract the URI address from the FilePath
//
TempDevicePath = FilePath;
while (!IsDevicePathEnd (TempDevicePath)) {
if ((DevicePathType (TempDevicePath) == MESSAGING_DEVICE_PATH) &&
(DevicePathSubType (TempDevicePath) == MSG_URI_DP)) {
UriDevicePath = (URI_DEVICE_PATH*) TempDevicePath;
//
// UEFI Spec doesn't require the URI to be a NULL-terminated string
// So we allocate a new buffer and always append a '\0' to it.
//
UriStrLength = DevicePathNodeLength (UriDevicePath) - sizeof(EFI_DEVICE_PATH_PROTOCOL);
if (UriStrLength == 0) {
//
// return a NULL UriAddress if it's a empty URI device path node.
//
break;
}
Uri = AllocatePool (UriStrLength + 1);
if (Uri == NULL) {
return EFI_OUT_OF_RESOURCES;
}
CopyMem (Uri, UriDevicePath->Uri, DevicePathNodeLength (UriDevicePath) - sizeof(EFI_DEVICE_PATH_PROTOCOL));
Uri[DevicePathNodeLength (UriDevicePath) - sizeof(EFI_DEVICE_PATH_PROTOCOL)] = '\0';
*UriAddress = Uri;
}
TempDevicePath = NextDevicePathNode (TempDevicePath);
}
return EFI_SUCCESS;
}
+18
View File
@@ -329,4 +329,22 @@ HttpIoRecvResponse (
OUT HTTP_IO_RESPONSE_DATA *ResponseData
);
/**
Get the URI address string from the input device path.
Caller need to free the buffer in the UriAddress pointer.
@param[in] FilePath Pointer to the device path which contains a URI device path node.
@param[in] UriAddress The URI address string extract from the device path.
@retval EFI_SUCCESS The URI string is returned.
@retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
**/
EFI_STATUS
HttpBootParseFilePath (
IN EFI_DEVICE_PATH_PROTOCOL *FilePath,
OUT CHAR8 **UriAddress
);
#endif
@@ -0,0 +1,25 @@
/** @file
GUIDs used as HII FormSet and HII Package list GUID in HTTP boot driver.
Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials are licensed and made available under
the terms and conditions of the BSD License that accompanies this distribution.
The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php.
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
#ifndef __HTTP_BOOT_HII_GUID_H__
#define __HTTP_BOOT_HII_GUID_H__
#define HTTP_BOOT_CONFIG_GUID \
{ \
0x4d20583a, 0x7765, 0x4e7a, { 0x8a, 0x67, 0xdc, 0xde, 0x74, 0xee, 0x3e, 0xc5 } \
}
extern EFI_GUID gHttpBootConfigGuid;
#endif
+4 -1
View File
@@ -4,7 +4,7 @@
# This package provides network modules that conform to UEFI 2.4 specification.
#
# (C) Copyright 2015 Hewlett-Packard Development Company, L.P.<BR>
# Copyright (c) 2009 - 2015, Intel Corporation. All rights reserved.<BR>
# Copyright (c) 2009 - 2016, Intel Corporation. All rights reserved.<BR>
#
# This program and the accompanying materials are licensed and made available under
# the terms and conditions of the BSD License which accompanies this distribution.
@@ -37,6 +37,9 @@
# Include/Guid/IscsiConfigHii.h
gIScsiConfigGuid = { 0x4b47d616, 0xa8d6, 0x4552, { 0x9d, 0x44, 0xcc, 0xad, 0x2e, 0xf, 0x4c, 0xf9}}
# Include/Guid/HttpBootConfigHii.h
gHttpBootConfigGuid = { 0x4d20583a, 0x7765, 0x4e7a, { 0x8a, 0x67, 0xdc, 0xde, 0x74, 0xee, 0x3e, 0xc5 }}
[PcdsFeatureFlag]
## Indicates if the IPsec IKEv2 Certificate Authentication feature is enabled or not.<BR><BR>
# TRUE - Certificate Authentication feature is enabled.<BR>