NetworkPkg: Apply uncrustify changes
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3737 Apply uncrustify changes to .c/.h files in the NetworkPkg package Cc: Andrew Fish <afish@apple.com> Cc: Leif Lindholm <leif@nuviainc.com> Cc: Michael D Kinney <michael.d.kinney@intel.com> Signed-off-by: Michael Kubacki <michael.kubacki@microsoft.com> Reviewed-by: Maciej Rabeda <maciej.rabeda@linux.intel.com>
This commit is contained in:
committed by
mergify[bot]
parent
2f88bd3a12
commit
d1050b9dff
@ -23,20 +23,20 @@
|
|||||||
//
|
//
|
||||||
// String token ID of VConfig command help message text.
|
// String token ID of VConfig command help message text.
|
||||||
//
|
//
|
||||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_STRING_ID mStringVConfigHelpTokenId = STRING_TOKEN (STR_VCONFIG_HELP);
|
GLOBAL_REMOVE_IF_UNREFERENCED EFI_STRING_ID mStringVConfigHelpTokenId = STRING_TOKEN (STR_VCONFIG_HELP);
|
||||||
|
|
||||||
#define INVALID_NIC_INDEX 0xffff
|
#define INVALID_NIC_INDEX 0xffff
|
||||||
#define INVALID_VLAN_ID 0xffff
|
#define INVALID_VLAN_ID 0xffff
|
||||||
|
|
||||||
//
|
//
|
||||||
// This is the generated String package data for all .UNI files.
|
// This is the generated String package data for all .UNI files.
|
||||||
// This data array is ready to be used as input of HiiAddPackages() to
|
// This data array is ready to be used as input of HiiAddPackages() to
|
||||||
// create a packagelist (which contains Form packages, String packages, etc).
|
// create a packagelist (which contains Form packages, String packages, etc).
|
||||||
//
|
//
|
||||||
extern UINT8 VConfigStrings[];
|
extern UINT8 VConfigStrings[];
|
||||||
|
|
||||||
EFI_HANDLE mImageHandle = NULL;
|
EFI_HANDLE mImageHandle = NULL;
|
||||||
EFI_HII_HANDLE mHiiHandle = NULL;
|
EFI_HII_HANDLE mHiiHandle = NULL;
|
||||||
|
|
||||||
SHELL_PARAM_ITEM mParamList[] = {
|
SHELL_PARAM_ITEM mParamList[] = {
|
||||||
{
|
{
|
||||||
@ -66,14 +66,14 @@ SHELL_PARAM_ITEM mParamList[] = {
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
LocateNicHandleBuffer (
|
LocateNicHandleBuffer (
|
||||||
OUT UINTN *NumberOfHandles,
|
OUT UINTN *NumberOfHandles,
|
||||||
OUT EFI_HANDLE **HandleBuffer
|
OUT EFI_HANDLE **HandleBuffer
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
*NumberOfHandles = 0;
|
*NumberOfHandles = 0;
|
||||||
*HandleBuffer = NULL;
|
*HandleBuffer = NULL;
|
||||||
|
|
||||||
Status = gBS->LocateHandleBuffer (
|
Status = gBS->LocateHandleBuffer (
|
||||||
ByProtocol,
|
ByProtocol,
|
||||||
@ -98,7 +98,7 @@ LocateNicHandleBuffer (
|
|||||||
**/
|
**/
|
||||||
UINTN
|
UINTN
|
||||||
NicNameToIndex (
|
NicNameToIndex (
|
||||||
IN CHAR16 *Name
|
IN CHAR16 *Name
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
CHAR16 *Str;
|
CHAR16 *Str;
|
||||||
@ -116,7 +116,7 @@ NicNameToIndex (
|
|||||||
Str++;
|
Str++;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (UINT16) StrDecimalToUintn (Name + 3);
|
return (UINT16)StrDecimalToUintn (Name + 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -130,7 +130,7 @@ NicNameToIndex (
|
|||||||
**/
|
**/
|
||||||
EFI_HANDLE
|
EFI_HANDLE
|
||||||
NicNameToHandle (
|
NicNameToHandle (
|
||||||
IN CHAR16 *Name
|
IN CHAR16 *Name
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINTN NumberOfHandles;
|
UINTN NumberOfHandles;
|
||||||
@ -168,7 +168,7 @@ NicNameToHandle (
|
|||||||
**/
|
**/
|
||||||
EFI_VLAN_CONFIG_PROTOCOL *
|
EFI_VLAN_CONFIG_PROTOCOL *
|
||||||
OpenVlanConfigProtocol (
|
OpenVlanConfigProtocol (
|
||||||
IN EFI_HANDLE Handle
|
IN EFI_HANDLE Handle
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_VLAN_CONFIG_PROTOCOL *VlanConfig;
|
EFI_VLAN_CONFIG_PROTOCOL *VlanConfig;
|
||||||
@ -177,7 +177,7 @@ OpenVlanConfigProtocol (
|
|||||||
gBS->OpenProtocol (
|
gBS->OpenProtocol (
|
||||||
Handle,
|
Handle,
|
||||||
&gEfiVlanConfigProtocolGuid,
|
&gEfiVlanConfigProtocolGuid,
|
||||||
(VOID **) &VlanConfig,
|
(VOID **)&VlanConfig,
|
||||||
mImageHandle,
|
mImageHandle,
|
||||||
Handle,
|
Handle,
|
||||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||||
@ -194,7 +194,7 @@ OpenVlanConfigProtocol (
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
CloseVlanConfigProtocol (
|
CloseVlanConfigProtocol (
|
||||||
IN EFI_HANDLE Handle
|
IN EFI_HANDLE Handle
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
gBS->CloseProtocol (
|
gBS->CloseProtocol (
|
||||||
@ -214,8 +214,8 @@ CloseVlanConfigProtocol (
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
ShowNicVlanInfo (
|
ShowNicVlanInfo (
|
||||||
IN EFI_HANDLE Handle,
|
IN EFI_HANDLE Handle,
|
||||||
IN UINTN NicIndex
|
IN UINTN NicIndex
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
CHAR16 *MacStr;
|
CHAR16 *MacStr;
|
||||||
@ -227,11 +227,11 @@ ShowNicVlanInfo (
|
|||||||
|
|
||||||
VlanConfig = OpenVlanConfigProtocol (Handle);
|
VlanConfig = OpenVlanConfigProtocol (Handle);
|
||||||
if (VlanConfig == NULL) {
|
if (VlanConfig == NULL) {
|
||||||
return ;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
MacStr = NULL;
|
MacStr = NULL;
|
||||||
Status = NetLibGetMacString (Handle, mImageHandle, &MacStr);
|
Status = NetLibGetMacString (Handle, mImageHandle, &MacStr);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VCONFIG_MAC_FAIL), mHiiHandle, Status);
|
ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VCONFIG_MAC_FAIL), mHiiHandle, Status);
|
||||||
goto Exit;
|
goto Exit;
|
||||||
@ -281,7 +281,7 @@ Exit:
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
DisplayVlan (
|
DisplayVlan (
|
||||||
IN CHAR16 *Name OPTIONAL
|
IN CHAR16 *Name OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINTN NumberOfHandles;
|
UINTN NumberOfHandles;
|
||||||
@ -295,11 +295,11 @@ DisplayVlan (
|
|||||||
//
|
//
|
||||||
NicHandle = NicNameToHandle (Name);
|
NicHandle = NicNameToHandle (Name);
|
||||||
if (NicHandle == NULL) {
|
if (NicHandle == NULL) {
|
||||||
return ;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ShowNicVlanInfo (NicHandle, 0);
|
ShowNicVlanInfo (NicHandle, 0);
|
||||||
return ;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -307,7 +307,7 @@ DisplayVlan (
|
|||||||
//
|
//
|
||||||
LocateNicHandleBuffer (&NumberOfHandles, &HandleBuffer);
|
LocateNicHandleBuffer (&NumberOfHandles, &HandleBuffer);
|
||||||
if (NumberOfHandles == 0) {
|
if (NumberOfHandles == 0) {
|
||||||
return ;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Index = 0; Index < NumberOfHandles; Index++) {
|
for (Index = 0; Index < NumberOfHandles; Index++) {
|
||||||
@ -327,7 +327,7 @@ DisplayVlan (
|
|||||||
**/
|
**/
|
||||||
UINT16
|
UINT16
|
||||||
StrToVlanId (
|
StrToVlanId (
|
||||||
IN CHAR16 *String
|
IN CHAR16 *String
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
CHAR16 *Str;
|
CHAR16 *Str;
|
||||||
@ -345,7 +345,7 @@ StrToVlanId (
|
|||||||
return INVALID_VLAN_ID;
|
return INVALID_VLAN_ID;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (UINT16) StrDecimalToUintn (String);
|
return (UINT16)StrDecimalToUintn (String);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -356,7 +356,7 @@ StrToVlanId (
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
AddVlan (
|
AddVlan (
|
||||||
IN CHAR16 *ParamStr
|
IN CHAR16 *ParamStr
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
CHAR16 *Name;
|
CHAR16 *Name;
|
||||||
@ -371,17 +371,17 @@ AddVlan (
|
|||||||
EFI_VLAN_CONFIG_PROTOCOL *VlanConfig;
|
EFI_VLAN_CONFIG_PROTOCOL *VlanConfig;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
VlanConfig = NULL;
|
VlanConfig = NULL;
|
||||||
Priority = 0;
|
Priority = 0;
|
||||||
|
|
||||||
if (ParamStr == NULL) {
|
if (ParamStr == NULL) {
|
||||||
ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VCONFIG_NO_IF), mHiiHandle);
|
ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VCONFIG_NO_IF), mHiiHandle);
|
||||||
return ;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
StrPtr = AllocateCopyPool (StrSize (ParamStr), ParamStr);
|
StrPtr = AllocateCopyPool (StrSize (ParamStr), ParamStr);
|
||||||
if (StrPtr == NULL) {
|
if (StrPtr == NULL) {
|
||||||
return ;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Name = StrPtr;
|
Name = StrPtr;
|
||||||
@ -459,7 +459,7 @@ AddVlan (
|
|||||||
//
|
//
|
||||||
// Set VLAN
|
// Set VLAN
|
||||||
//
|
//
|
||||||
Status = VlanConfig->Set (VlanConfig, (UINT16) VlanId, (UINT8) Priority);
|
Status = VlanConfig->Set (VlanConfig, (UINT16)VlanId, (UINT8)Priority);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VCONFIG_SET_FAIL), mHiiHandle, Status);
|
ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VCONFIG_SET_FAIL), mHiiHandle, Status);
|
||||||
goto Exit;
|
goto Exit;
|
||||||
@ -468,7 +468,7 @@ AddVlan (
|
|||||||
//
|
//
|
||||||
// Connect the VLAN device.
|
// Connect the VLAN device.
|
||||||
//
|
//
|
||||||
VlanHandle = NetLibGetVlanHandle (Handle, (UINT16) VlanId);
|
VlanHandle = NetLibGetVlanHandle (Handle, (UINT16)VlanId);
|
||||||
if (VlanHandle != NULL) {
|
if (VlanHandle != NULL) {
|
||||||
gBS->ConnectController (VlanHandle, NULL, NULL, TRUE);
|
gBS->ConnectController (VlanHandle, NULL, NULL, TRUE);
|
||||||
}
|
}
|
||||||
@ -491,7 +491,7 @@ Exit:
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
DeleteVlan (
|
DeleteVlan (
|
||||||
IN CHAR16 *ParamStr
|
IN CHAR16 *ParamStr
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
CHAR16 *Name;
|
CHAR16 *Name;
|
||||||
@ -508,12 +508,12 @@ DeleteVlan (
|
|||||||
|
|
||||||
if (ParamStr == NULL) {
|
if (ParamStr == NULL) {
|
||||||
ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VCONFIG_NO_IF), mHiiHandle);
|
ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VCONFIG_NO_IF), mHiiHandle);
|
||||||
return ;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
StrPtr = AllocateCopyPool (StrSize (ParamStr), ParamStr);
|
StrPtr = AllocateCopyPool (StrSize (ParamStr), ParamStr);
|
||||||
if (StrPtr == NULL) {
|
if (StrPtr == NULL) {
|
||||||
return ;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Name = StrPtr;
|
Name = StrPtr;
|
||||||
@ -541,7 +541,7 @@ DeleteVlan (
|
|||||||
//
|
//
|
||||||
// Check VLAN ID
|
// Check VLAN ID
|
||||||
//
|
//
|
||||||
if (VlanIdStr == NULL || *VlanIdStr == 0) {
|
if ((VlanIdStr == NULL) || (*VlanIdStr == 0)) {
|
||||||
ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VCONFIG_NO_VID), mHiiHandle);
|
ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VCONFIG_NO_VID), mHiiHandle);
|
||||||
goto Exit;
|
goto Exit;
|
||||||
}
|
}
|
||||||
@ -555,7 +555,7 @@ DeleteVlan (
|
|||||||
//
|
//
|
||||||
// Delete VLAN.
|
// Delete VLAN.
|
||||||
//
|
//
|
||||||
Status = VlanConfig->Remove (VlanConfig, (UINT16) VlanId);
|
Status = VlanConfig->Remove (VlanConfig, (UINT16)VlanId);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
if (Status == EFI_NOT_FOUND) {
|
if (Status == EFI_NOT_FOUND) {
|
||||||
ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VCONFIG_NOT_FOUND), mHiiHandle);
|
ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_VCONFIG_NOT_FOUND), mHiiHandle);
|
||||||
@ -606,10 +606,10 @@ VlanConfigMain (
|
|||||||
IN EFI_SYSTEM_TABLE *SystemTable
|
IN EFI_SYSTEM_TABLE *SystemTable
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
LIST_ENTRY *List;
|
LIST_ENTRY *List;
|
||||||
CONST CHAR16 *Str;
|
CONST CHAR16 *Str;
|
||||||
EFI_HII_PACKAGE_LIST_HEADER *PackageList;
|
EFI_HII_PACKAGE_LIST_HEADER *PackageList;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
mImageHandle = ImageHandle;
|
mImageHandle = ImageHandle;
|
||||||
|
|
||||||
@ -619,7 +619,7 @@ VlanConfigMain (
|
|||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
ImageHandle,
|
ImageHandle,
|
||||||
&gEfiHiiPackageListProtocolGuid,
|
&gEfiHiiPackageListProtocolGuid,
|
||||||
(VOID **) &PackageList,
|
(VOID **)&PackageList,
|
||||||
ImageHandle,
|
ImageHandle,
|
||||||
NULL,
|
NULL,
|
||||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||||
@ -632,11 +632,11 @@ VlanConfigMain (
|
|||||||
// Publish HII package list to HII Database.
|
// Publish HII package list to HII Database.
|
||||||
//
|
//
|
||||||
Status = gHiiDatabase->NewPackageList (
|
Status = gHiiDatabase->NewPackageList (
|
||||||
gHiiDatabase,
|
gHiiDatabase,
|
||||||
PackageList,
|
PackageList,
|
||||||
NULL,
|
NULL,
|
||||||
&mHiiHandle
|
&mHiiHandle
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
@ -654,19 +654,19 @@ VlanConfigMain (
|
|||||||
|
|
||||||
if (ShellCommandLineGetFlag (List, L"-l")) {
|
if (ShellCommandLineGetFlag (List, L"-l")) {
|
||||||
Str = ShellCommandLineGetValue (List, L"-l");
|
Str = ShellCommandLineGetValue (List, L"-l");
|
||||||
DisplayVlan ((CHAR16 *) Str);
|
DisplayVlan ((CHAR16 *)Str);
|
||||||
goto Exit;
|
goto Exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ShellCommandLineGetFlag (List, L"-a")) {
|
if (ShellCommandLineGetFlag (List, L"-a")) {
|
||||||
Str = ShellCommandLineGetValue (List, L"-a");
|
Str = ShellCommandLineGetValue (List, L"-a");
|
||||||
AddVlan ((CHAR16 *) Str);
|
AddVlan ((CHAR16 *)Str);
|
||||||
goto Exit;
|
goto Exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ShellCommandLineGetFlag (List, L"-d")) {
|
if (ShellCommandLineGetFlag (List, L"-d")) {
|
||||||
Str = ShellCommandLineGetValue (List, L"-d");
|
Str = ShellCommandLineGetValue (List, L"-d");
|
||||||
DeleteVlan ((CHAR16 *) Str);
|
DeleteVlan ((CHAR16 *)Str);
|
||||||
goto Exit;
|
goto Exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#include "ArpDriver.h"
|
#include "ArpDriver.h"
|
||||||
#include "ArpImpl.h"
|
#include "ArpImpl.h"
|
||||||
|
|
||||||
EFI_DRIVER_BINDING_PROTOCOL gArpDriverBinding = {
|
EFI_DRIVER_BINDING_PROTOCOL gArpDriverBinding = {
|
||||||
ArpDriverBindingSupported,
|
ArpDriverBindingSupported,
|
||||||
ArpDriverBindingStart,
|
ArpDriverBindingStart,
|
||||||
ArpDriverBindingStop,
|
ArpDriverBindingStop,
|
||||||
@ -18,7 +18,6 @@ EFI_DRIVER_BINDING_PROTOCOL gArpDriverBinding = {
|
|||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Create and initialize the arp service context data.
|
Create and initialize the arp service context data.
|
||||||
|
|
||||||
@ -37,8 +36,8 @@ EFI_DRIVER_BINDING_PROTOCOL gArpDriverBinding = {
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
ArpCreateService (
|
ArpCreateService (
|
||||||
IN EFI_HANDLE ImageHandle,
|
IN EFI_HANDLE ImageHandle,
|
||||||
IN EFI_HANDLE ControllerHandle,
|
IN EFI_HANDLE ControllerHandle,
|
||||||
IN OUT ARP_SERVICE_DATA *ArpService
|
IN OUT ARP_SERVICE_DATA *ArpService
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
@ -176,7 +175,6 @@ ERROR_EXIT:
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Clean the arp service context data.
|
Clean the arp service context data.
|
||||||
|
|
||||||
@ -226,7 +224,7 @@ ArpCleanService (
|
|||||||
//
|
//
|
||||||
// Destroy the mnp child.
|
// Destroy the mnp child.
|
||||||
//
|
//
|
||||||
NetLibDestroyServiceChild(
|
NetLibDestroyServiceChild (
|
||||||
ArpService->ControllerHandle,
|
ArpService->ControllerHandle,
|
||||||
ArpService->ImageHandle,
|
ArpService->ImageHandle,
|
||||||
&gEfiManagedNetworkServiceBindingProtocolGuid,
|
&gEfiManagedNetworkServiceBindingProtocolGuid,
|
||||||
@ -248,19 +246,19 @@ ArpCleanService (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
ArpDestroyChildEntryInHandleBuffer (
|
ArpDestroyChildEntryInHandleBuffer (
|
||||||
IN LIST_ENTRY *Entry,
|
IN LIST_ENTRY *Entry,
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
ARP_INSTANCE_DATA *Instance;
|
ARP_INSTANCE_DATA *Instance;
|
||||||
EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding;
|
EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding;
|
||||||
|
|
||||||
if (Entry == NULL || Context == NULL) {
|
if ((Entry == NULL) || (Context == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
Instance = NET_LIST_USER_STRUCT_S (Entry, ARP_INSTANCE_DATA, List, ARP_INSTANCE_DATA_SIGNATURE);
|
Instance = NET_LIST_USER_STRUCT_S (Entry, ARP_INSTANCE_DATA, List, ARP_INSTANCE_DATA_SIGNATURE);
|
||||||
ServiceBinding = (EFI_SERVICE_BINDING_PROTOCOL *) Context;
|
ServiceBinding = (EFI_SERVICE_BINDING_PROTOCOL *)Context;
|
||||||
|
|
||||||
return ServiceBinding->DestroyChild (ServiceBinding, Instance->Handle);
|
return ServiceBinding->DestroyChild (ServiceBinding, Instance->Handle);
|
||||||
}
|
}
|
||||||
@ -334,7 +332,6 @@ ArpDriverBindingSupported (
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Start this driver on ControllerHandle.
|
Start this driver on ControllerHandle.
|
||||||
|
|
||||||
@ -380,7 +377,7 @@ ArpDriverBindingStart (
|
|||||||
//
|
//
|
||||||
// Allocate a zero pool for ArpService.
|
// Allocate a zero pool for ArpService.
|
||||||
//
|
//
|
||||||
ArpService = AllocateZeroPool (sizeof(ARP_SERVICE_DATA));
|
ArpService = AllocateZeroPool (sizeof (ARP_SERVICE_DATA));
|
||||||
if (ArpService == NULL) {
|
if (ArpService == NULL) {
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
@ -427,7 +424,6 @@ ERROR:
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Stop this driver on ControllerHandle.
|
Stop this driver on ControllerHandle.
|
||||||
|
|
||||||
@ -502,7 +498,7 @@ ArpDriverBindingStop (
|
|||||||
//
|
//
|
||||||
// NumberOfChildren is not zero, destroy all the ARP children instances.
|
// NumberOfChildren is not zero, destroy all the ARP children instances.
|
||||||
//
|
//
|
||||||
List = &ArpService->ChildrenList;
|
List = &ArpService->ChildrenList;
|
||||||
Status = NetDestroyLinkList (
|
Status = NetDestroyLinkList (
|
||||||
List,
|
List,
|
||||||
ArpDestroyChildEntryInHandleBuffer,
|
ArpDestroyChildEntryInHandleBuffer,
|
||||||
@ -576,7 +572,7 @@ ArpServiceBindingCreateChild (
|
|||||||
//
|
//
|
||||||
// Allocate memory for the instance context data.
|
// Allocate memory for the instance context data.
|
||||||
//
|
//
|
||||||
Instance = AllocateZeroPool (sizeof(ARP_INSTANCE_DATA));
|
Instance = AllocateZeroPool (sizeof (ARP_INSTANCE_DATA));
|
||||||
if (Instance == NULL) {
|
if (Instance == NULL) {
|
||||||
DEBUG ((DEBUG_ERROR, "ArpSBCreateChild: Failed to allocate memory for Instance.\n"));
|
DEBUG ((DEBUG_ERROR, "ArpSBCreateChild: Failed to allocate memory for Instance.\n"));
|
||||||
|
|
||||||
@ -615,7 +611,7 @@ ArpServiceBindingCreateChild (
|
|||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
ArpService->MnpChildHandle,
|
ArpService->MnpChildHandle,
|
||||||
&gEfiManagedNetworkProtocolGuid,
|
&gEfiManagedNetworkProtocolGuid,
|
||||||
(VOID **) &Mnp,
|
(VOID **)&Mnp,
|
||||||
gArpDriverBinding.DriverBindingHandle,
|
gArpDriverBinding.DriverBindingHandle,
|
||||||
Instance->Handle,
|
Instance->Handle,
|
||||||
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
||||||
@ -637,7 +633,6 @@ ArpServiceBindingCreateChild (
|
|||||||
ERROR:
|
ERROR:
|
||||||
|
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
|
|
||||||
gBS->CloseProtocol (
|
gBS->CloseProtocol (
|
||||||
ArpService->MnpChildHandle,
|
ArpService->MnpChildHandle,
|
||||||
&gEfiManagedNetworkProtocolGuid,
|
&gEfiManagedNetworkProtocolGuid,
|
||||||
@ -661,7 +656,6 @@ ERROR:
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Destroys a child handle with a protocol installed on it.
|
Destroys a child handle with a protocol installed on it.
|
||||||
|
|
||||||
@ -746,8 +740,11 @@ ArpServiceBindingDestroyChild (
|
|||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
DEBUG ((DEBUG_ERROR, "ArpSBDestroyChild: Failed to uninstall the arp protocol, %r.\n",
|
DEBUG ((
|
||||||
Status));
|
DEBUG_ERROR,
|
||||||
|
"ArpSBDestroyChild: Failed to uninstall the arp protocol, %r.\n",
|
||||||
|
Status
|
||||||
|
));
|
||||||
|
|
||||||
Instance->InDestroy = FALSE;
|
Instance->InDestroy = FALSE;
|
||||||
return Status;
|
return Status;
|
||||||
|
@ -9,7 +9,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#ifndef _ARP_DRIVER_H_
|
#ifndef _ARP_DRIVER_H_
|
||||||
#define _ARP_DRIVER_H_
|
#define _ARP_DRIVER_H_
|
||||||
|
|
||||||
|
|
||||||
#include <Uefi.h>
|
#include <Uefi.h>
|
||||||
|
|
||||||
#include <Protocol/Arp.h>
|
#include <Protocol/Arp.h>
|
||||||
@ -21,17 +20,17 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#include <Library/UefiBootServicesTableLib.h>
|
#include <Library/UefiBootServicesTableLib.h>
|
||||||
#include <Library/UefiLib.h>
|
#include <Library/UefiLib.h>
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Global variables
|
// Global variables
|
||||||
//
|
//
|
||||||
extern EFI_DRIVER_BINDING_PROTOCOL gArpDriverBinding;
|
extern EFI_DRIVER_BINDING_PROTOCOL gArpDriverBinding;
|
||||||
extern EFI_COMPONENT_NAME_PROTOCOL gArpComponentName;
|
extern EFI_COMPONENT_NAME_PROTOCOL gArpComponentName;
|
||||||
extern EFI_COMPONENT_NAME2_PROTOCOL gArpComponentName2;
|
extern EFI_COMPONENT_NAME2_PROTOCOL gArpComponentName2;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Function prototypes for the Driver Binding Protocol
|
// Function prototypes for the Driver Binding Protocol
|
||||||
//
|
//
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Tests to see if this driver supports a given controller.
|
Tests to see if this driver supports a given controller.
|
||||||
|
|
||||||
@ -199,10 +198,10 @@ ArpServiceBindingDestroyChild (
|
|||||||
IN EFI_HANDLE ChildHandle
|
IN EFI_HANDLE ChildHandle
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// EFI Component Name Functions
|
// EFI Component Name Functions
|
||||||
//
|
//
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Retrieves a Unicode string that is the user readable name of the driver.
|
Retrieves a Unicode string that is the user readable name of the driver.
|
||||||
|
|
||||||
@ -250,7 +249,6 @@ ArpComponentNameGetDriverName (
|
|||||||
OUT CHAR16 **DriverName
|
OUT CHAR16 **DriverName
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Retrieves a Unicode string that is the user readable name of the controller
|
Retrieves a Unicode string that is the user readable name of the controller
|
||||||
that is being managed by a driver.
|
that is being managed by a driver.
|
||||||
@ -322,13 +320,11 @@ ArpComponentNameGetDriverName (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
ArpComponentNameGetControllerName (
|
ArpComponentNameGetControllerName (
|
||||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||||
IN EFI_HANDLE ControllerHandle,
|
IN EFI_HANDLE ControllerHandle,
|
||||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||||
IN CHAR8 *Language,
|
IN CHAR8 *Language,
|
||||||
OUT CHAR16 **ControllerName
|
OUT CHAR16 **ControllerName
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -21,7 +21,6 @@ EFI_ARP_PROTOCOL mEfiArpProtocolTemplate = {
|
|||||||
ArpCancel
|
ArpCancel
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Initialize the instance context data.
|
Initialize the instance context data.
|
||||||
|
|
||||||
@ -51,7 +50,6 @@ ArpInitInstance (
|
|||||||
InitializeListHead (&Instance->List);
|
InitializeListHead (&Instance->List);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Process the Arp packets received from Mnp, the procedure conforms to RFC826.
|
Process the Arp packets received from Mnp, the procedure conforms to RFC826.
|
||||||
|
|
||||||
@ -64,7 +62,7 @@ ArpInitInstance (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
ArpOnFrameRcvdDpc (
|
ArpOnFrameRcvdDpc (
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
@ -119,7 +117,7 @@ ArpOnFrameRcvdDpc (
|
|||||||
//
|
//
|
||||||
// Convert the byte order of the multi-byte fields.
|
// Convert the byte order of the multi-byte fields.
|
||||||
//
|
//
|
||||||
Head = (ARP_HEAD *) RxData->PacketData;
|
Head = (ARP_HEAD *)RxData->PacketData;
|
||||||
Head->HwType = NTOHS (Head->HwType);
|
Head->HwType = NTOHS (Head->HwType);
|
||||||
Head->ProtoType = NTOHS (Head->ProtoType);
|
Head->ProtoType = NTOHS (Head->ProtoType);
|
||||||
Head->OpCode = NTOHS (Head->OpCode);
|
Head->OpCode = NTOHS (Head->OpCode);
|
||||||
@ -129,8 +127,9 @@ ArpOnFrameRcvdDpc (
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ((Head->HwType != ArpService->SnpMode.IfType) ||
|
if ((Head->HwType != ArpService->SnpMode.IfType) ||
|
||||||
(Head->HwAddrLen != ArpService->SnpMode.HwAddressSize) ||
|
(Head->HwAddrLen != ArpService->SnpMode.HwAddressSize) ||
|
||||||
(RxData->ProtocolType != ARP_ETHER_PROTO_TYPE)) {
|
(RxData->ProtocolType != ARP_ETHER_PROTO_TYPE))
|
||||||
|
{
|
||||||
//
|
//
|
||||||
// The hardware type or the hardware address length doesn't match.
|
// The hardware type or the hardware address length doesn't match.
|
||||||
// There is a sanity check for the protocol type too.
|
// There is a sanity check for the protocol type too.
|
||||||
@ -182,8 +181,9 @@ ArpOnFrameRcvdDpc (
|
|||||||
ConfigData = &Instance->ConfigData;
|
ConfigData = &Instance->ConfigData;
|
||||||
|
|
||||||
if ((Instance->Configured) &&
|
if ((Instance->Configured) &&
|
||||||
(Head->ProtoType == ConfigData->SwAddressType) &&
|
(Head->ProtoType == ConfigData->SwAddressType) &&
|
||||||
(Head->ProtoAddrLen == ConfigData->SwAddressLength)) {
|
(Head->ProtoAddrLen == ConfigData->SwAddressLength))
|
||||||
|
{
|
||||||
//
|
//
|
||||||
// The protocol type is matched for the received arp packet.
|
// The protocol type is matched for the received arp packet.
|
||||||
//
|
//
|
||||||
@ -192,7 +192,8 @@ ArpOnFrameRcvdDpc (
|
|||||||
(VOID *)ArpAddress.TargetProtoAddr,
|
(VOID *)ArpAddress.TargetProtoAddr,
|
||||||
ConfigData->StationAddress,
|
ConfigData->StationAddress,
|
||||||
ConfigData->SwAddressLength
|
ConfigData->SwAddressLength
|
||||||
)) {
|
))
|
||||||
|
{
|
||||||
//
|
//
|
||||||
// The arp driver has the target address required by the received arp packet.
|
// The arp driver has the target address required by the received arp packet.
|
||||||
//
|
//
|
||||||
@ -226,7 +227,7 @@ ArpOnFrameRcvdDpc (
|
|||||||
//
|
//
|
||||||
ArpFillAddressInCacheEntry (CacheEntry, &SenderAddress[Hardware], NULL);
|
ArpFillAddressInCacheEntry (CacheEntry, &SenderAddress[Hardware], NULL);
|
||||||
CacheEntry->DecayTime = CacheEntry->DefaultDecayTime;
|
CacheEntry->DecayTime = CacheEntry->DefaultDecayTime;
|
||||||
MergeFlag = TRUE;
|
MergeFlag = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!IsTarget) {
|
if (!IsTarget) {
|
||||||
@ -305,10 +306,15 @@ RESTART_RECEIVE:
|
|||||||
Status = ArpService->Mnp->Receive (ArpService->Mnp, RxToken);
|
Status = ArpService->Mnp->Receive (ArpService->Mnp, RxToken);
|
||||||
|
|
||||||
DEBUG_CODE_BEGIN ();
|
DEBUG_CODE_BEGIN ();
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
DEBUG ((DEBUG_ERROR, "ArpOnFrameRcvd: ArpService->Mnp->Receive "
|
DEBUG ((
|
||||||
"failed, %r\n.", Status));
|
DEBUG_ERROR,
|
||||||
}
|
"ArpOnFrameRcvd: ArpService->Mnp->Receive "
|
||||||
|
"failed, %r\n.",
|
||||||
|
Status
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
DEBUG_CODE_END ();
|
DEBUG_CODE_END ();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -347,7 +353,7 @@ ArpOnFrameRcvd (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
ArpOnFrameSentDpc (
|
ArpOnFrameSentDpc (
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_MANAGED_NETWORK_COMPLETION_TOKEN *TxToken;
|
EFI_MANAGED_NETWORK_COMPLETION_TOKEN *TxToken;
|
||||||
@ -359,9 +365,10 @@ ArpOnFrameSentDpc (
|
|||||||
TxData = TxToken->Packet.TxData;
|
TxData = TxToken->Packet.TxData;
|
||||||
|
|
||||||
DEBUG_CODE_BEGIN ();
|
DEBUG_CODE_BEGIN ();
|
||||||
if (EFI_ERROR (TxToken->Status)) {
|
if (EFI_ERROR (TxToken->Status)) {
|
||||||
DEBUG ((DEBUG_ERROR, "ArpOnFrameSent: TxToken->Status, %r.\n", TxToken->Status));
|
DEBUG ((DEBUG_ERROR, "ArpOnFrameSent: TxToken->Status, %r.\n", TxToken->Status));
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUG_CODE_END ();
|
DEBUG_CODE_END ();
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -396,7 +403,6 @@ ArpOnFrameSent (
|
|||||||
QueueDpc (TPL_CALLBACK, ArpOnFrameSentDpc, Context);
|
QueueDpc (TPL_CALLBACK, ArpOnFrameSentDpc, Context);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Process the arp cache olding and drive the retrying arp requests.
|
Process the arp cache olding and drive the retrying arp requests.
|
||||||
|
|
||||||
@ -449,7 +455,7 @@ ArpTimerHandler (
|
|||||||
//
|
//
|
||||||
// resend the ARP request.
|
// resend the ARP request.
|
||||||
//
|
//
|
||||||
ASSERT (!IsListEmpty(&CacheEntry->UserRequestList));
|
ASSERT (!IsListEmpty (&CacheEntry->UserRequestList));
|
||||||
|
|
||||||
ContextEntry = CacheEntry->UserRequestList.ForwardLink;
|
ContextEntry = CacheEntry->UserRequestList.ForwardLink;
|
||||||
RequestContext = NET_LIST_USER_STRUCT (ContextEntry, USER_REQUEST_CONTEXT, List);
|
RequestContext = NET_LIST_USER_STRUCT (ContextEntry, USER_REQUEST_CONTEXT, List);
|
||||||
@ -524,7 +530,6 @@ ArpTimerHandler (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Match the two NET_ARP_ADDRESSes.
|
Match the two NET_ARP_ADDRESSes.
|
||||||
|
|
||||||
@ -543,7 +548,8 @@ ArpMatchAddress (
|
|||||||
ASSERT (AddressOne != NULL && AddressTwo != NULL);
|
ASSERT (AddressOne != NULL && AddressTwo != NULL);
|
||||||
|
|
||||||
if ((AddressOne->Type != AddressTwo->Type) ||
|
if ((AddressOne->Type != AddressTwo->Type) ||
|
||||||
(AddressOne->Length != AddressTwo->Length)) {
|
(AddressOne->Length != AddressTwo->Length))
|
||||||
|
{
|
||||||
//
|
//
|
||||||
// Either Type or Length doesn't match.
|
// Either Type or Length doesn't match.
|
||||||
//
|
//
|
||||||
@ -551,11 +557,12 @@ ArpMatchAddress (
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ((AddressOne->AddressPtr != NULL) &&
|
if ((AddressOne->AddressPtr != NULL) &&
|
||||||
(CompareMem (
|
(CompareMem (
|
||||||
AddressOne->AddressPtr,
|
AddressOne->AddressPtr,
|
||||||
AddressTwo->AddressPtr,
|
AddressTwo->AddressPtr,
|
||||||
AddressOne->Length
|
AddressOne->Length
|
||||||
) != 0)) {
|
) != 0))
|
||||||
|
{
|
||||||
//
|
//
|
||||||
// The address is not the same.
|
// The address is not the same.
|
||||||
//
|
//
|
||||||
@ -565,7 +572,6 @@ ArpMatchAddress (
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Find the CacheEntry which matches the requirements in the specified CacheTable.
|
Find the CacheEntry which matches the requirements in the specified CacheTable.
|
||||||
|
|
||||||
@ -581,11 +587,11 @@ ArpMatchAddress (
|
|||||||
**/
|
**/
|
||||||
ARP_CACHE_ENTRY *
|
ARP_CACHE_ENTRY *
|
||||||
ArpFindNextCacheEntryInTable (
|
ArpFindNextCacheEntryInTable (
|
||||||
IN LIST_ENTRY *CacheTable,
|
IN LIST_ENTRY *CacheTable,
|
||||||
IN LIST_ENTRY *StartEntry,
|
IN LIST_ENTRY *StartEntry,
|
||||||
IN FIND_OPTYPE FindOpType,
|
IN FIND_OPTYPE FindOpType,
|
||||||
IN NET_ARP_ADDRESS *ProtocolAddress OPTIONAL,
|
IN NET_ARP_ADDRESS *ProtocolAddress OPTIONAL,
|
||||||
IN NET_ARP_ADDRESS *HardwareAddress OPTIONAL
|
IN NET_ARP_ADDRESS *HardwareAddress OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
LIST_ENTRY *Entry;
|
LIST_ENTRY *Entry;
|
||||||
@ -637,7 +643,6 @@ ArpFindNextCacheEntryInTable (
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Find the CacheEntry, using ProtocolAddress or HardwareAddress or both, as the keyword,
|
Find the CacheEntry, using ProtocolAddress or HardwareAddress or both, as the keyword,
|
||||||
in the DeniedCacheTable.
|
in the DeniedCacheTable.
|
||||||
@ -698,7 +703,6 @@ ArpFindDeniedCacheEntry (
|
|||||||
return CacheEntry;
|
return CacheEntry;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Allocate a cache entry and initialize it.
|
Allocate a cache entry and initialize it.
|
||||||
|
|
||||||
@ -734,7 +738,7 @@ ArpAllocCacheEntry (
|
|||||||
//
|
//
|
||||||
// Init the address pointers to point to the concrete buffer.
|
// Init the address pointers to point to the concrete buffer.
|
||||||
//
|
//
|
||||||
Address = &CacheEntry->Addresses[Index];
|
Address = &CacheEntry->Addresses[Index];
|
||||||
Address->AddressPtr = Address->Buffer.ProtoAddress;
|
Address->AddressPtr = Address->Buffer.ProtoAddress;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -765,7 +769,6 @@ ArpAllocCacheEntry (
|
|||||||
return CacheEntry;
|
return CacheEntry;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Turn the CacheEntry into the resolved status.
|
Turn the CacheEntry into the resolved status.
|
||||||
|
|
||||||
@ -797,7 +800,8 @@ ArpAddressResolved (
|
|||||||
Context = NET_LIST_USER_STRUCT (Entry, USER_REQUEST_CONTEXT, List);
|
Context = NET_LIST_USER_STRUCT (Entry, USER_REQUEST_CONTEXT, List);
|
||||||
|
|
||||||
if (((Instance == NULL) || (Context->Instance == Instance)) &&
|
if (((Instance == NULL) || (Context->Instance == Instance)) &&
|
||||||
((UserEvent == NULL) || (Context->UserRequestEvent == UserEvent))) {
|
((UserEvent == NULL) || (Context->UserRequestEvent == UserEvent)))
|
||||||
|
{
|
||||||
//
|
//
|
||||||
// Copy the address to the user-provided buffer and notify the user.
|
// Copy the address to the user-provided buffer and notify the user.
|
||||||
//
|
//
|
||||||
@ -826,7 +830,6 @@ ArpAddressResolved (
|
|||||||
return Count;
|
return Count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Fill the addresses in the CacheEntry using the information passed in by
|
Fill the addresses in the CacheEntry using the information passed in by
|
||||||
HwAddr and SwAddr.
|
HwAddr and SwAddr.
|
||||||
@ -881,7 +884,6 @@ ArpFillAddressInCacheEntry (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Configure the instance using the ConfigData. ConfigData is already validated.
|
Configure the instance using the ConfigData. ConfigData is already validated.
|
||||||
|
|
||||||
@ -912,18 +914,18 @@ ArpConfigureInstance (
|
|||||||
OldConfigData = &Instance->ConfigData;
|
OldConfigData = &Instance->ConfigData;
|
||||||
|
|
||||||
if (ConfigData != NULL) {
|
if (ConfigData != NULL) {
|
||||||
|
|
||||||
if (Instance->Configured) {
|
if (Instance->Configured) {
|
||||||
//
|
//
|
||||||
// The instance is configured, check the unchangeable fields.
|
// The instance is configured, check the unchangeable fields.
|
||||||
//
|
//
|
||||||
if ((OldConfigData->SwAddressType != ConfigData->SwAddressType) ||
|
if ((OldConfigData->SwAddressType != ConfigData->SwAddressType) ||
|
||||||
(OldConfigData->SwAddressLength != ConfigData->SwAddressLength) ||
|
(OldConfigData->SwAddressLength != ConfigData->SwAddressLength) ||
|
||||||
(CompareMem (
|
(CompareMem (
|
||||||
OldConfigData->StationAddress,
|
OldConfigData->StationAddress,
|
||||||
ConfigData->StationAddress,
|
ConfigData->StationAddress,
|
||||||
OldConfigData->SwAddressLength
|
OldConfigData->SwAddressLength
|
||||||
) != 0)) {
|
) != 0))
|
||||||
|
{
|
||||||
//
|
//
|
||||||
// Deny the unallowed changes.
|
// Deny the unallowed changes.
|
||||||
//
|
//
|
||||||
@ -952,8 +954,11 @@ ArpConfigureInstance (
|
|||||||
|
|
||||||
OldConfigData->StationAddress = AllocatePool (OldConfigData->SwAddressLength);
|
OldConfigData->StationAddress = AllocatePool (OldConfigData->SwAddressLength);
|
||||||
if (OldConfigData->StationAddress == NULL) {
|
if (OldConfigData->StationAddress == NULL) {
|
||||||
DEBUG ((DEBUG_ERROR, "ArpConfigInstance: AllocatePool for the StationAddress "
|
DEBUG ((
|
||||||
"failed.\n"));
|
DEBUG_ERROR,
|
||||||
|
"ArpConfigInstance: AllocatePool for the StationAddress "
|
||||||
|
"failed.\n"
|
||||||
|
));
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -976,13 +981,13 @@ ArpConfigureInstance (
|
|||||||
// Use the implementation specific values if the following field is zero.
|
// Use the implementation specific values if the following field is zero.
|
||||||
//
|
//
|
||||||
OldConfigData->EntryTimeOut = (ConfigData->EntryTimeOut == 0) ?
|
OldConfigData->EntryTimeOut = (ConfigData->EntryTimeOut == 0) ?
|
||||||
ARP_DEFAULT_TIMEOUT_VALUE : ConfigData->EntryTimeOut;
|
ARP_DEFAULT_TIMEOUT_VALUE : ConfigData->EntryTimeOut;
|
||||||
|
|
||||||
OldConfigData->RetryCount = (ConfigData->RetryCount == 0) ?
|
OldConfigData->RetryCount = (ConfigData->RetryCount == 0) ?
|
||||||
ARP_DEFAULT_RETRY_COUNT : ConfigData->RetryCount;
|
ARP_DEFAULT_RETRY_COUNT : ConfigData->RetryCount;
|
||||||
|
|
||||||
OldConfigData->RetryTimeOut = (ConfigData->RetryTimeOut == 0) ?
|
OldConfigData->RetryTimeOut = (ConfigData->RetryTimeOut == 0) ?
|
||||||
ARP_DEFAULT_RETRY_INTERVAL : ConfigData->RetryTimeOut;
|
ARP_DEFAULT_RETRY_INTERVAL : ConfigData->RetryTimeOut;
|
||||||
} else {
|
} else {
|
||||||
//
|
//
|
||||||
// Reset the configuration.
|
// Reset the configuration.
|
||||||
@ -1006,7 +1011,6 @@ ArpConfigureInstance (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Send out an arp frame using the CacheEntry and the ArpOpCode.
|
Send out an arp frame using the CacheEntry and the ArpOpCode.
|
||||||
|
|
||||||
@ -1042,7 +1046,7 @@ ArpSendFrame (
|
|||||||
//
|
//
|
||||||
// Allocate memory for the TxToken.
|
// Allocate memory for the TxToken.
|
||||||
//
|
//
|
||||||
TxToken = AllocatePool (sizeof(EFI_MANAGED_NETWORK_COMPLETION_TOKEN));
|
TxToken = AllocatePool (sizeof (EFI_MANAGED_NETWORK_COMPLETION_TOKEN));
|
||||||
if (TxToken == NULL) {
|
if (TxToken == NULL) {
|
||||||
DEBUG ((DEBUG_ERROR, "ArpSendFrame: Allocate memory for TxToken failed.\n"));
|
DEBUG ((DEBUG_ERROR, "ArpSendFrame: Allocate memory for TxToken failed.\n"));
|
||||||
return;
|
return;
|
||||||
@ -1070,7 +1074,7 @@ ArpSendFrame (
|
|||||||
//
|
//
|
||||||
// Allocate memory for the TxData used in the TxToken.
|
// Allocate memory for the TxData used in the TxToken.
|
||||||
//
|
//
|
||||||
TxData = AllocatePool (sizeof(EFI_MANAGED_NETWORK_TRANSMIT_DATA));
|
TxData = AllocatePool (sizeof (EFI_MANAGED_NETWORK_TRANSMIT_DATA));
|
||||||
if (TxData == NULL) {
|
if (TxData == NULL) {
|
||||||
DEBUG ((DEBUG_ERROR, "ArpSendFrame: Allocate memory for TxData failed.\n"));
|
DEBUG ((DEBUG_ERROR, "ArpSendFrame: Allocate memory for TxData failed.\n"));
|
||||||
goto CLEAN_EXIT;
|
goto CLEAN_EXIT;
|
||||||
@ -1109,6 +1113,7 @@ ArpSendFrame (
|
|||||||
SnpMode->HwAddressSize
|
SnpMode->HwAddressSize
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
TmpPtr += SnpMode->HwAddressSize;
|
TmpPtr += SnpMode->HwAddressSize;
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -1121,18 +1126,18 @@ ArpSendFrame (
|
|||||||
// The ethernet protocol type.
|
// The ethernet protocol type.
|
||||||
//
|
//
|
||||||
*(UINT16 *)TmpPtr = HTONS (ARP_ETHER_PROTO_TYPE);
|
*(UINT16 *)TmpPtr = HTONS (ARP_ETHER_PROTO_TYPE);
|
||||||
TmpPtr += 2;
|
TmpPtr += 2;
|
||||||
|
|
||||||
//
|
//
|
||||||
// The ARP Head.
|
// The ARP Head.
|
||||||
//
|
//
|
||||||
ArpHead = (ARP_HEAD *) TmpPtr;
|
ArpHead = (ARP_HEAD *)TmpPtr;
|
||||||
ArpHead->HwType = HTONS ((UINT16)SnpMode->IfType);
|
ArpHead->HwType = HTONS ((UINT16)SnpMode->IfType);
|
||||||
ArpHead->ProtoType = HTONS (ConfigData->SwAddressType);
|
ArpHead->ProtoType = HTONS (ConfigData->SwAddressType);
|
||||||
ArpHead->HwAddrLen = (UINT8)SnpMode->HwAddressSize;
|
ArpHead->HwAddrLen = (UINT8)SnpMode->HwAddressSize;
|
||||||
ArpHead->ProtoAddrLen = ConfigData->SwAddressLength;
|
ArpHead->ProtoAddrLen = ConfigData->SwAddressLength;
|
||||||
ArpHead->OpCode = HTONS (ArpOpCode);
|
ArpHead->OpCode = HTONS (ArpOpCode);
|
||||||
TmpPtr += sizeof (ARP_HEAD);
|
TmpPtr += sizeof (ARP_HEAD);
|
||||||
|
|
||||||
//
|
//
|
||||||
// The sender hardware address.
|
// The sender hardware address.
|
||||||
@ -1172,7 +1177,7 @@ ArpSendFrame (
|
|||||||
TxData->SourceAddress = NULL;
|
TxData->SourceAddress = NULL;
|
||||||
TxData->ProtocolType = 0;
|
TxData->ProtocolType = 0;
|
||||||
TxData->DataLength = TotalLength - SnpMode->MediaHeaderSize;
|
TxData->DataLength = TotalLength - SnpMode->MediaHeaderSize;
|
||||||
TxData->HeaderLength = (UINT16) SnpMode->MediaHeaderSize;
|
TxData->HeaderLength = (UINT16)SnpMode->MediaHeaderSize;
|
||||||
TxData->FragmentCount = 1;
|
TxData->FragmentCount = 1;
|
||||||
|
|
||||||
TxData->FragmentTable[0].FragmentBuffer = Packet;
|
TxData->FragmentTable[0].FragmentBuffer = Packet;
|
||||||
@ -1212,7 +1217,6 @@ CLEAN_EXIT:
|
|||||||
FreePool (TxToken);
|
FreePool (TxToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Delete the cache entries in the specified CacheTable, using the BySwAddress,
|
Delete the cache entries in the specified CacheTable, using the BySwAddress,
|
||||||
SwAddressType, AddressBuffer combination as the matching key, if Force is TRUE,
|
SwAddressType, AddressBuffer combination as the matching key, if Force is TRUE,
|
||||||
@ -1231,11 +1235,11 @@ CLEAN_EXIT:
|
|||||||
**/
|
**/
|
||||||
UINTN
|
UINTN
|
||||||
ArpDeleteCacheEntryInTable (
|
ArpDeleteCacheEntryInTable (
|
||||||
IN LIST_ENTRY *CacheTable,
|
IN LIST_ENTRY *CacheTable,
|
||||||
IN BOOLEAN BySwAddress,
|
IN BOOLEAN BySwAddress,
|
||||||
IN UINT16 SwAddressType,
|
IN UINT16 SwAddressType,
|
||||||
IN UINT8 *AddressBuffer OPTIONAL,
|
IN UINT8 *AddressBuffer OPTIONAL,
|
||||||
IN BOOLEAN Force
|
IN BOOLEAN Force
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
LIST_ENTRY *Entry;
|
LIST_ENTRY *Entry;
|
||||||
@ -1261,11 +1265,12 @@ ArpDeleteCacheEntryInTable (
|
|||||||
// Protocol address type matched. Check the address.
|
// Protocol address type matched. Check the address.
|
||||||
//
|
//
|
||||||
if ((AddressBuffer == NULL) ||
|
if ((AddressBuffer == NULL) ||
|
||||||
(CompareMem (
|
(CompareMem (
|
||||||
AddressBuffer,
|
AddressBuffer,
|
||||||
CacheEntry->Addresses[Protocol].AddressPtr,
|
CacheEntry->Addresses[Protocol].AddressPtr,
|
||||||
CacheEntry->Addresses[Protocol].Length
|
CacheEntry->Addresses[Protocol].Length
|
||||||
) == 0)) {
|
) == 0))
|
||||||
|
{
|
||||||
//
|
//
|
||||||
// Address matched.
|
// Address matched.
|
||||||
//
|
//
|
||||||
@ -1274,11 +1279,12 @@ ArpDeleteCacheEntryInTable (
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if ((AddressBuffer == NULL) ||
|
if ((AddressBuffer == NULL) ||
|
||||||
(CompareMem (
|
(CompareMem (
|
||||||
AddressBuffer,
|
AddressBuffer,
|
||||||
CacheEntry->Addresses[Hardware].AddressPtr,
|
CacheEntry->Addresses[Hardware].AddressPtr,
|
||||||
CacheEntry->Addresses[Hardware].Length
|
CacheEntry->Addresses[Hardware].Length
|
||||||
) == 0)) {
|
) == 0))
|
||||||
|
{
|
||||||
//
|
//
|
||||||
// Address matched.
|
// Address matched.
|
||||||
//
|
//
|
||||||
@ -1303,7 +1309,6 @@ MATCHED:
|
|||||||
return Count;
|
return Count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Delete cache entries in all the cache tables.
|
Delete cache entries in all the cache tables.
|
||||||
|
|
||||||
@ -1357,7 +1362,6 @@ ArpDeleteCacheEntry (
|
|||||||
return Count;
|
return Count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Cancel the arp request.
|
Cancel the arp request.
|
||||||
|
|
||||||
@ -1392,11 +1396,12 @@ ArpCancelRequest (
|
|||||||
CacheEntry = NET_LIST_USER_STRUCT (Entry, ARP_CACHE_ENTRY, List);
|
CacheEntry = NET_LIST_USER_STRUCT (Entry, ARP_CACHE_ENTRY, List);
|
||||||
|
|
||||||
if ((TargetSwAddress == NULL) ||
|
if ((TargetSwAddress == NULL) ||
|
||||||
(CompareMem (
|
(CompareMem (
|
||||||
TargetSwAddress,
|
TargetSwAddress,
|
||||||
CacheEntry->Addresses[Protocol].AddressPtr,
|
CacheEntry->Addresses[Protocol].AddressPtr,
|
||||||
CacheEntry->Addresses[Protocol].Length
|
CacheEntry->Addresses[Protocol].Length
|
||||||
) == 0)) {
|
) == 0))
|
||||||
|
{
|
||||||
//
|
//
|
||||||
// This request entry matches the TargetSwAddress or all requests are to be
|
// This request entry matches the TargetSwAddress or all requests are to be
|
||||||
// cancelled as TargetSwAddress is NULL.
|
// cancelled as TargetSwAddress is NULL.
|
||||||
@ -1416,7 +1421,6 @@ ArpCancelRequest (
|
|||||||
return Count;
|
return Count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Find the cache entry in the cache table.
|
Find the cache entry in the cache table.
|
||||||
|
|
||||||
@ -1572,7 +1576,7 @@ ArpFindCacheEntry (
|
|||||||
|
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
|
|
||||||
FoundCount = (UINT32) NetMapGetCount (&FoundEntries);
|
FoundCount = (UINT32)NetMapGetCount (&FoundEntries);
|
||||||
if (FoundCount == 0) {
|
if (FoundCount == 0) {
|
||||||
Status = EFI_NOT_FOUND;
|
Status = EFI_NOT_FOUND;
|
||||||
goto CLEAN_EXIT;
|
goto CLEAN_EXIT;
|
||||||
@ -1582,7 +1586,7 @@ ArpFindCacheEntry (
|
|||||||
// Found the entry length, make sure its 8 bytes alignment.
|
// Found the entry length, make sure its 8 bytes alignment.
|
||||||
//
|
//
|
||||||
FoundEntryLength = (((sizeof (EFI_ARP_FIND_DATA) + Instance->ConfigData.SwAddressLength +
|
FoundEntryLength = (((sizeof (EFI_ARP_FIND_DATA) + Instance->ConfigData.SwAddressLength +
|
||||||
ArpService->SnpMode.HwAddressSize) + 3) & ~(0x3));
|
ArpService->SnpMode.HwAddressSize) + 3) & ~(0x3));
|
||||||
|
|
||||||
if (EntryLength != NULL) {
|
if (EntryLength != NULL) {
|
||||||
*EntryLength = FoundEntryLength;
|
*EntryLength = FoundEntryLength;
|
||||||
|
@ -9,7 +9,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#ifndef _ARP_IMPL_H_
|
#ifndef _ARP_IMPL_H_
|
||||||
#define _ARP_IMPL_H_
|
#define _ARP_IMPL_H_
|
||||||
|
|
||||||
|
|
||||||
#include <Uefi.h>
|
#include <Uefi.h>
|
||||||
|
|
||||||
#include <Protocol/Arp.h>
|
#include <Protocol/Arp.h>
|
||||||
@ -29,15 +28,15 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
//
|
//
|
||||||
// Ethernet protocol type definitions.
|
// Ethernet protocol type definitions.
|
||||||
//
|
//
|
||||||
#define ARP_ETHER_PROTO_TYPE 0x0806
|
#define ARP_ETHER_PROTO_TYPE 0x0806
|
||||||
#define IPV4_ETHER_PROTO_TYPE 0x0800
|
#define IPV4_ETHER_PROTO_TYPE 0x0800
|
||||||
#define IPV6_ETHER_PROTO_TYPE 0x86DD
|
#define IPV6_ETHER_PROTO_TYPE 0x86DD
|
||||||
|
|
||||||
//
|
//
|
||||||
// ARP opcode definitions.
|
// ARP opcode definitions.
|
||||||
//
|
//
|
||||||
#define ARP_OPCODE_REQUEST 0x0001
|
#define ARP_OPCODE_REQUEST 0x0001
|
||||||
#define ARP_OPCODE_REPLY 0x0002
|
#define ARP_OPCODE_REPLY 0x0002
|
||||||
|
|
||||||
//
|
//
|
||||||
// ARP timeout, retry count and interval definitions.
|
// ARP timeout, retry count and interval definitions.
|
||||||
@ -52,11 +51,11 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
//
|
//
|
||||||
#pragma pack(1)
|
#pragma pack(1)
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINT16 HwType;
|
UINT16 HwType;
|
||||||
UINT16 ProtoType;
|
UINT16 ProtoType;
|
||||||
UINT8 HwAddrLen;
|
UINT8 HwAddrLen;
|
||||||
UINT8 ProtoAddrLen;
|
UINT8 ProtoAddrLen;
|
||||||
UINT16 OpCode;
|
UINT16 OpCode;
|
||||||
} ARP_HEAD;
|
} ARP_HEAD;
|
||||||
#pragma pack()
|
#pragma pack()
|
||||||
|
|
||||||
@ -64,10 +63,10 @@ typedef struct {
|
|||||||
// ARP Address definition for internal use.
|
// ARP Address definition for internal use.
|
||||||
//
|
//
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINT8 *SenderHwAddr;
|
UINT8 *SenderHwAddr;
|
||||||
UINT8 *SenderProtoAddr;
|
UINT8 *SenderProtoAddr;
|
||||||
UINT8 *TargetHwAddr;
|
UINT8 *TargetHwAddr;
|
||||||
UINT8 *TargetProtoAddr;
|
UINT8 *TargetProtoAddr;
|
||||||
} ARP_ADDRESS;
|
} ARP_ADDRESS;
|
||||||
|
|
||||||
#define MATCH_SW_ADDRESS 0x1
|
#define MATCH_SW_ADDRESS 0x1
|
||||||
@ -104,20 +103,20 @@ typedef enum {
|
|||||||
ARP_INSTANCE_DATA_SIGNATURE \
|
ARP_INSTANCE_DATA_SIGNATURE \
|
||||||
)
|
)
|
||||||
|
|
||||||
typedef struct _ARP_SERVICE_DATA ARP_SERVICE_DATA;
|
typedef struct _ARP_SERVICE_DATA ARP_SERVICE_DATA;
|
||||||
|
|
||||||
//
|
//
|
||||||
// ARP instance context data structure.
|
// ARP instance context data structure.
|
||||||
//
|
//
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINT32 Signature;
|
UINT32 Signature;
|
||||||
ARP_SERVICE_DATA *ArpService;
|
ARP_SERVICE_DATA *ArpService;
|
||||||
EFI_HANDLE Handle;
|
EFI_HANDLE Handle;
|
||||||
EFI_ARP_PROTOCOL ArpProto;
|
EFI_ARP_PROTOCOL ArpProto;
|
||||||
LIST_ENTRY List;
|
LIST_ENTRY List;
|
||||||
EFI_ARP_CONFIG_DATA ConfigData;
|
EFI_ARP_CONFIG_DATA ConfigData;
|
||||||
BOOLEAN Configured;
|
BOOLEAN Configured;
|
||||||
BOOLEAN InDestroy;
|
BOOLEAN InDestroy;
|
||||||
} ARP_INSTANCE_DATA;
|
} ARP_INSTANCE_DATA;
|
||||||
|
|
||||||
#define ARP_SERVICE_DATA_SIGNATURE SIGNATURE_32('A', 'R', 'P', 'S')
|
#define ARP_SERVICE_DATA_SIGNATURE SIGNATURE_32('A', 'R', 'P', 'S')
|
||||||
@ -144,55 +143,55 @@ typedef struct {
|
|||||||
// ARP service data structure.
|
// ARP service data structure.
|
||||||
//
|
//
|
||||||
struct _ARP_SERVICE_DATA {
|
struct _ARP_SERVICE_DATA {
|
||||||
UINT32 Signature;
|
UINT32 Signature;
|
||||||
EFI_SERVICE_BINDING_PROTOCOL ServiceBinding;
|
EFI_SERVICE_BINDING_PROTOCOL ServiceBinding;
|
||||||
|
|
||||||
EFI_HANDLE MnpChildHandle;
|
EFI_HANDLE MnpChildHandle;
|
||||||
EFI_HANDLE ImageHandle;
|
EFI_HANDLE ImageHandle;
|
||||||
EFI_HANDLE ControllerHandle;
|
EFI_HANDLE ControllerHandle;
|
||||||
|
|
||||||
EFI_MANAGED_NETWORK_PROTOCOL *Mnp;
|
EFI_MANAGED_NETWORK_PROTOCOL *Mnp;
|
||||||
EFI_MANAGED_NETWORK_CONFIG_DATA MnpConfigData;
|
EFI_MANAGED_NETWORK_CONFIG_DATA MnpConfigData;
|
||||||
EFI_MANAGED_NETWORK_COMPLETION_TOKEN RxToken;
|
EFI_MANAGED_NETWORK_COMPLETION_TOKEN RxToken;
|
||||||
|
|
||||||
EFI_SIMPLE_NETWORK_MODE SnpMode;
|
EFI_SIMPLE_NETWORK_MODE SnpMode;
|
||||||
|
|
||||||
UINTN ChildrenNumber;
|
UINTN ChildrenNumber;
|
||||||
LIST_ENTRY ChildrenList;
|
LIST_ENTRY ChildrenList;
|
||||||
|
|
||||||
LIST_ENTRY PendingRequestTable;
|
LIST_ENTRY PendingRequestTable;
|
||||||
LIST_ENTRY DeniedCacheTable;
|
LIST_ENTRY DeniedCacheTable;
|
||||||
LIST_ENTRY ResolvedCacheTable;
|
LIST_ENTRY ResolvedCacheTable;
|
||||||
|
|
||||||
EFI_EVENT PeriodicTimer;
|
EFI_EVENT PeriodicTimer;
|
||||||
};
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// User request context structure.
|
// User request context structure.
|
||||||
//
|
//
|
||||||
typedef struct {
|
typedef struct {
|
||||||
LIST_ENTRY List;
|
LIST_ENTRY List;
|
||||||
ARP_INSTANCE_DATA *Instance;
|
ARP_INSTANCE_DATA *Instance;
|
||||||
EFI_EVENT UserRequestEvent;
|
EFI_EVENT UserRequestEvent;
|
||||||
VOID *UserHwAddrBuffer;
|
VOID *UserHwAddrBuffer;
|
||||||
} USER_REQUEST_CONTEXT;
|
} USER_REQUEST_CONTEXT;
|
||||||
|
|
||||||
#define ARP_MAX_PROTOCOL_ADDRESS_LEN sizeof(EFI_IP_ADDRESS)
|
#define ARP_MAX_PROTOCOL_ADDRESS_LEN sizeof(EFI_IP_ADDRESS)
|
||||||
#define ARP_MAX_HARDWARE_ADDRESS_LEN sizeof(EFI_MAC_ADDRESS)
|
#define ARP_MAX_HARDWARE_ADDRESS_LEN sizeof(EFI_MAC_ADDRESS)
|
||||||
|
|
||||||
typedef union {
|
typedef union {
|
||||||
UINT8 ProtoAddress[ARP_MAX_PROTOCOL_ADDRESS_LEN];
|
UINT8 ProtoAddress[ARP_MAX_PROTOCOL_ADDRESS_LEN];
|
||||||
UINT8 HwAddress[ARP_MAX_HARDWARE_ADDRESS_LEN];
|
UINT8 HwAddress[ARP_MAX_HARDWARE_ADDRESS_LEN];
|
||||||
} NET_ARP_ADDRESS_UNION;
|
} NET_ARP_ADDRESS_UNION;
|
||||||
|
|
||||||
//
|
//
|
||||||
// ARP address structure in an ARP packet.
|
// ARP address structure in an ARP packet.
|
||||||
//
|
//
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINT16 Type;
|
UINT16 Type;
|
||||||
UINT8 Length;
|
UINT8 Length;
|
||||||
UINT8 *AddressPtr;
|
UINT8 *AddressPtr;
|
||||||
NET_ARP_ADDRESS_UNION Buffer;
|
NET_ARP_ADDRESS_UNION Buffer;
|
||||||
} NET_ARP_ADDRESS;
|
} NET_ARP_ADDRESS;
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -207,16 +206,16 @@ typedef enum {
|
|||||||
// ARP cache entry definition.
|
// ARP cache entry definition.
|
||||||
//
|
//
|
||||||
typedef struct {
|
typedef struct {
|
||||||
LIST_ENTRY List;
|
LIST_ENTRY List;
|
||||||
|
|
||||||
UINT32 RetryCount;
|
UINT32 RetryCount;
|
||||||
UINT32 DefaultDecayTime;
|
UINT32 DefaultDecayTime;
|
||||||
UINT32 DecayTime;
|
UINT32 DecayTime;
|
||||||
UINT32 NextRetryTime;
|
UINT32 NextRetryTime;
|
||||||
|
|
||||||
NET_ARP_ADDRESS Addresses[2];
|
NET_ARP_ADDRESS Addresses[2];
|
||||||
|
|
||||||
LIST_ENTRY UserRequestList;
|
LIST_ENTRY UserRequestList;
|
||||||
} ARP_CACHE_ENTRY;
|
} ARP_CACHE_ENTRY;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -522,11 +521,11 @@ ArpFindDeniedCacheEntry (
|
|||||||
**/
|
**/
|
||||||
ARP_CACHE_ENTRY *
|
ARP_CACHE_ENTRY *
|
||||||
ArpFindNextCacheEntryInTable (
|
ArpFindNextCacheEntryInTable (
|
||||||
IN LIST_ENTRY *CacheTable,
|
IN LIST_ENTRY *CacheTable,
|
||||||
IN LIST_ENTRY *StartEntry,
|
IN LIST_ENTRY *StartEntry,
|
||||||
IN FIND_OPTYPE FindOpType,
|
IN FIND_OPTYPE FindOpType,
|
||||||
IN NET_ARP_ADDRESS *ProtocolAddress OPTIONAL,
|
IN NET_ARP_ADDRESS *ProtocolAddress OPTIONAL,
|
||||||
IN NET_ARP_ADDRESS *HardwareAddress OPTIONAL
|
IN NET_ARP_ADDRESS *HardwareAddress OPTIONAL
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -645,7 +644,7 @@ ArpInitInstance (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
ArpOnFrameRcvdDpc (
|
ArpOnFrameRcvdDpc (
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -677,7 +676,7 @@ ArpOnFrameRcvd (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
ArpOnFrameSentDpc (
|
ArpOnFrameSentDpc (
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -8,7 +8,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
|
|
||||||
#include "ArpImpl.h"
|
#include "ArpImpl.h"
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This function is used to assign a station address to the ARP cache for this instance
|
This function is used to assign a station address to the ARP cache for this instance
|
||||||
of the ARP driver.
|
of the ARP driver.
|
||||||
@ -53,9 +52,10 @@ ArpConfigure (
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ((ConfigData != NULL) &&
|
if ((ConfigData != NULL) &&
|
||||||
((ConfigData->SwAddressLength == 0) ||
|
((ConfigData->SwAddressLength == 0) ||
|
||||||
(ConfigData->StationAddress == NULL) ||
|
(ConfigData->StationAddress == NULL) ||
|
||||||
(ConfigData->SwAddressType <= 1500))) {
|
(ConfigData->SwAddressType <= 1500)))
|
||||||
|
{
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -73,7 +73,6 @@ ArpConfigure (
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This function is used to insert entries into the ARP cache.
|
This function is used to insert entries into the ARP cache.
|
||||||
|
|
||||||
@ -143,8 +142,9 @@ ArpAdd (
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (((!DenyFlag) && ((TargetHwAddress == NULL) || (TargetSwAddress == NULL))) ||
|
if (((!DenyFlag) && ((TargetHwAddress == NULL) || (TargetSwAddress == NULL))) ||
|
||||||
(DenyFlag && (TargetHwAddress != NULL) && (TargetSwAddress != NULL)) ||
|
(DenyFlag && (TargetHwAddress != NULL) && (TargetSwAddress != NULL)) ||
|
||||||
((TargetHwAddress == NULL) && (TargetSwAddress == NULL))) {
|
((TargetHwAddress == NULL) && (TargetSwAddress == NULL)))
|
||||||
|
{
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -162,7 +162,7 @@ ArpAdd (
|
|||||||
// Fill the hardware address part in the MatchAddress.
|
// Fill the hardware address part in the MatchAddress.
|
||||||
//
|
//
|
||||||
MatchAddress[Hardware].Type = SnpMode->IfType;
|
MatchAddress[Hardware].Type = SnpMode->IfType;
|
||||||
MatchAddress[Hardware].Length = (UINT8) SnpMode->HwAddressSize;
|
MatchAddress[Hardware].Length = (UINT8)SnpMode->HwAddressSize;
|
||||||
MatchAddress[Hardware].AddressPtr = TargetHwAddress;
|
MatchAddress[Hardware].AddressPtr = TargetHwAddress;
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -271,7 +271,6 @@ UNLOCK_EXIT:
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This function searches the ARP cache for matching entries and allocates a buffer into
|
This function searches the ARP cache for matching entries and allocates a buffer into
|
||||||
which those entries are copied.
|
which those entries are copied.
|
||||||
@ -323,12 +322,13 @@ ArpFind (
|
|||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
|
|
||||||
if ((This == NULL) ||
|
if ((This == NULL) ||
|
||||||
(!Refresh && (EntryCount == NULL) && (EntryLength == NULL)) ||
|
(!Refresh && (EntryCount == NULL) && (EntryLength == NULL)) ||
|
||||||
((Entries != NULL) && ((EntryLength == NULL) || (EntryCount == NULL)))) {
|
((Entries != NULL) && ((EntryLength == NULL) || (EntryCount == NULL))))
|
||||||
|
{
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
Instance = ARP_INSTANCE_DATA_FROM_THIS (This);
|
Instance = ARP_INSTANCE_DATA_FROM_THIS (This);
|
||||||
|
|
||||||
if (!Instance->Configured) {
|
if (!Instance->Configured) {
|
||||||
return EFI_NOT_STARTED;
|
return EFI_NOT_STARTED;
|
||||||
@ -354,7 +354,6 @@ ArpFind (
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This function removes specified ARP cache entries.
|
This function removes specified ARP cache entries.
|
||||||
|
|
||||||
@ -406,7 +405,6 @@ ArpDelete (
|
|||||||
return (Count == 0) ? EFI_NOT_FOUND : EFI_SUCCESS;
|
return (Count == 0) ? EFI_NOT_FOUND : EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This function delete all dynamic entries from the ARP cache that match the specified
|
This function delete all dynamic entries from the ARP cache that match the specified
|
||||||
software protocol type.
|
software protocol type.
|
||||||
@ -451,7 +449,6 @@ ArpFlush (
|
|||||||
return (Count == 0) ? EFI_NOT_FOUND : EFI_SUCCESS;
|
return (Count == 0) ? EFI_NOT_FOUND : EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This function tries to resolve the TargetSwAddress and optionally returns a
|
This function tries to resolve the TargetSwAddress and optionally returns a
|
||||||
TargetHwAddress if it already exists in the ARP cache.
|
TargetHwAddress if it already exists in the ARP cache.
|
||||||
@ -508,8 +505,9 @@ ArpRequest (
|
|||||||
SnpMode = &ArpService->SnpMode;
|
SnpMode = &ArpService->SnpMode;
|
||||||
|
|
||||||
if ((TargetSwAddress == NULL) ||
|
if ((TargetSwAddress == NULL) ||
|
||||||
((Instance->ConfigData.SwAddressType == IPV4_ETHER_PROTO_TYPE) &&
|
((Instance->ConfigData.SwAddressType == IPV4_ETHER_PROTO_TYPE) &&
|
||||||
IP4_IS_LOCAL_BROADCAST (*((UINT32 *)TargetSwAddress)))) {
|
IP4_IS_LOCAL_BROADCAST (*((UINT32 *)TargetSwAddress))))
|
||||||
|
{
|
||||||
//
|
//
|
||||||
// Return the hardware broadcast address.
|
// Return the hardware broadcast address.
|
||||||
//
|
//
|
||||||
@ -519,7 +517,8 @@ ArpRequest (
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ((Instance->ConfigData.SwAddressType == IPV4_ETHER_PROTO_TYPE) &&
|
if ((Instance->ConfigData.SwAddressType == IPV4_ETHER_PROTO_TYPE) &&
|
||||||
IP4_IS_MULTICAST (NTOHL (*((UINT32 *)TargetSwAddress)))) {
|
IP4_IS_MULTICAST (NTOHL (*((UINT32 *)TargetSwAddress))))
|
||||||
|
{
|
||||||
//
|
//
|
||||||
// If the software address is an IPv4 multicast address, invoke Mnp to
|
// If the software address is an IPv4 multicast address, invoke Mnp to
|
||||||
// resolve the address.
|
// resolve the address.
|
||||||
@ -588,7 +587,7 @@ ArpRequest (
|
|||||||
//
|
//
|
||||||
// Create a request context for this arp request.
|
// Create a request context for this arp request.
|
||||||
//
|
//
|
||||||
RequestContext = AllocatePool (sizeof(USER_REQUEST_CONTEXT));
|
RequestContext = AllocatePool (sizeof (USER_REQUEST_CONTEXT));
|
||||||
if (RequestContext == NULL) {
|
if (RequestContext == NULL) {
|
||||||
DEBUG ((DEBUG_ERROR, "ArpRequest: Allocate memory for RequestContext failed.\n"));
|
DEBUG ((DEBUG_ERROR, "ArpRequest: Allocate memory for RequestContext failed.\n"));
|
||||||
|
|
||||||
@ -612,7 +611,6 @@ ArpRequest (
|
|||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
if (CacheEntry != NULL) {
|
if (CacheEntry != NULL) {
|
||||||
|
|
||||||
CacheEntry->NextRetryTime = Instance->ConfigData.RetryTimeOut;
|
CacheEntry->NextRetryTime = Instance->ConfigData.RetryTimeOut;
|
||||||
CacheEntry->RetryCount = Instance->ConfigData.RetryCount;
|
CacheEntry->RetryCount = Instance->ConfigData.RetryCount;
|
||||||
} else {
|
} else {
|
||||||
@ -668,7 +666,6 @@ SIGNAL_USER:
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This function aborts the previous ARP request (identified by This, TargetSwAddress
|
This function aborts the previous ARP request (identified by This, TargetSwAddress
|
||||||
and ResolvedEvent) that is issued by EFI_ARP_PROTOCOL.Request().
|
and ResolvedEvent) that is issued by EFI_ARP_PROTOCOL.Request().
|
||||||
@ -709,8 +706,9 @@ ArpCancel (
|
|||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
|
|
||||||
if ((This == NULL) ||
|
if ((This == NULL) ||
|
||||||
((TargetSwAddress != NULL) && (ResolvedEvent == NULL)) ||
|
((TargetSwAddress != NULL) && (ResolvedEvent == NULL)) ||
|
||||||
((TargetSwAddress == NULL) && (ResolvedEvent != NULL))) {
|
((TargetSwAddress == NULL) && (ResolvedEvent != NULL)))
|
||||||
|
{
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,7 +8,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
|
|
||||||
#include "ArpDriver.h"
|
#include "ArpDriver.h"
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// EFI Component Name Protocol
|
// EFI Component Name Protocol
|
||||||
//
|
//
|
||||||
@ -21,21 +20,20 @@ GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gArpComponentName = {
|
|||||||
//
|
//
|
||||||
// EFI Component Name 2 Protocol
|
// EFI Component Name 2 Protocol
|
||||||
//
|
//
|
||||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gArpComponentName2 = {
|
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gArpComponentName2 = {
|
||||||
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME) ArpComponentNameGetDriverName,
|
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME)ArpComponentNameGetDriverName,
|
||||||
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) ArpComponentNameGetControllerName,
|
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME)ArpComponentNameGetControllerName,
|
||||||
"en"
|
"en"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mArpDriverNameTable[] = {
|
||||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mArpDriverNameTable[] = {
|
|
||||||
{ "eng;en", L"ARP Network Service Driver" },
|
{ "eng;en", L"ARP Network Service Driver" },
|
||||||
{ NULL, NULL }
|
{ NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mArpControllerNameTable[] = {
|
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mArpControllerNameTable[] = {
|
||||||
{ "eng;en", L"ARP Controller" },
|
{ "eng;en", L"ARP Controller" },
|
||||||
{ NULL, NULL }
|
{ NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -165,15 +163,15 @@ ArpComponentNameGetDriverName (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
ArpComponentNameGetControllerName (
|
ArpComponentNameGetControllerName (
|
||||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||||
IN EFI_HANDLE ControllerHandle,
|
IN EFI_HANDLE ControllerHandle,
|
||||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||||
IN CHAR8 *Language,
|
IN CHAR8 *Language,
|
||||||
OUT CHAR16 **ControllerName
|
OUT CHAR16 **ControllerName
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_ARP_PROTOCOL *Arp;
|
EFI_ARP_PROTOCOL *Arp;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Only provide names for child handles.
|
// Only provide names for child handles.
|
||||||
@ -200,7 +198,7 @@ ArpComponentNameGetControllerName (
|
|||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
ChildHandle,
|
ChildHandle,
|
||||||
&gEfiArpProtocolGuid,
|
&gEfiArpProtocolGuid,
|
||||||
(VOID **)&Arp,
|
(VOID **)&Arp,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||||
|
@ -5,12 +5,12 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
|
|
||||||
#include "Dhcp4Impl.h"
|
#include "Dhcp4Impl.h"
|
||||||
|
|
||||||
//
|
//
|
||||||
// EFI Component Name Functions
|
// EFI Component Name Functions
|
||||||
//
|
//
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Retrieves a Unicode string that is the user readable name of the driver.
|
Retrieves a Unicode string that is the user readable name of the driver.
|
||||||
|
|
||||||
@ -58,7 +58,6 @@ DhcpComponentNameGetDriverName (
|
|||||||
OUT CHAR16 **DriverName
|
OUT CHAR16 **DriverName
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Retrieves a Unicode string that is the user readable name of the controller
|
Retrieves a Unicode string that is the user readable name of the controller
|
||||||
that is being managed by a driver.
|
that is being managed by a driver.
|
||||||
@ -130,14 +129,13 @@ DhcpComponentNameGetDriverName (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
DhcpComponentNameGetControllerName (
|
DhcpComponentNameGetControllerName (
|
||||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||||
IN EFI_HANDLE ControllerHandle,
|
IN EFI_HANDLE ControllerHandle,
|
||||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||||
IN CHAR8 *Language,
|
IN CHAR8 *Language,
|
||||||
OUT CHAR16 **ControllerName
|
OUT CHAR16 **ControllerName
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// EFI Component Name Protocol
|
// EFI Component Name Protocol
|
||||||
//
|
//
|
||||||
@ -150,14 +148,13 @@ GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gDhcp4ComponentName =
|
|||||||
//
|
//
|
||||||
// EFI Component Name 2 Protocol
|
// EFI Component Name 2 Protocol
|
||||||
//
|
//
|
||||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gDhcp4ComponentName2 = {
|
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gDhcp4ComponentName2 = {
|
||||||
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME) DhcpComponentNameGetDriverName,
|
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME)DhcpComponentNameGetDriverName,
|
||||||
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) DhcpComponentNameGetControllerName,
|
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME)DhcpComponentNameGetControllerName,
|
||||||
"en"
|
"en"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mDhcpDriverNameTable[] = {
|
||||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mDhcpDriverNameTable[] = {
|
|
||||||
{
|
{
|
||||||
"eng;en",
|
"eng;en",
|
||||||
L"DHCP Protocol Driver"
|
L"DHCP Protocol Driver"
|
||||||
@ -168,9 +165,9 @@ GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mDhcpDriverNameTable[] =
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE *gDhcpControllerNameTable = NULL;
|
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE *gDhcpControllerNameTable = NULL;
|
||||||
|
|
||||||
CHAR16 *mDhcp4ControllerName[] = {
|
CHAR16 *mDhcp4ControllerName[] = {
|
||||||
L"DHCPv4 (State=0, Stopped)",
|
L"DHCPv4 (State=0, Stopped)",
|
||||||
L"DHCPv4 (State=1, Init)",
|
L"DHCPv4 (State=1, Init)",
|
||||||
L"DHCPv4 (State=2, Selecting)",
|
L"DHCPv4 (State=2, Selecting)",
|
||||||
@ -251,11 +248,11 @@ DhcpComponentNameGetDriverName (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
UpdateName (
|
UpdateName (
|
||||||
IN EFI_DHCP4_PROTOCOL *Dhcp4
|
IN EFI_DHCP4_PROTOCOL *Dhcp4
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_DHCP4_MODE_DATA Dhcp4ModeData;
|
EFI_DHCP4_MODE_DATA Dhcp4ModeData;
|
||||||
|
|
||||||
if (Dhcp4 == NULL) {
|
if (Dhcp4 == NULL) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
@ -369,15 +366,15 @@ UpdateName (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
DhcpComponentNameGetControllerName (
|
DhcpComponentNameGetControllerName (
|
||||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||||
IN EFI_HANDLE ControllerHandle,
|
IN EFI_HANDLE ControllerHandle,
|
||||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||||
IN CHAR8 *Language,
|
IN CHAR8 *Language,
|
||||||
OUT CHAR16 **ControllerName
|
OUT CHAR16 **ControllerName
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_DHCP4_PROTOCOL *Dhcp4;
|
EFI_DHCP4_PROTOCOL *Dhcp4;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Only provide names for child handles.
|
// Only provide names for child handles.
|
||||||
|
@ -8,7 +8,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#include "Dhcp4Impl.h"
|
#include "Dhcp4Impl.h"
|
||||||
#include "Dhcp4Driver.h"
|
#include "Dhcp4Driver.h"
|
||||||
|
|
||||||
EFI_DRIVER_BINDING_PROTOCOL gDhcp4DriverBinding = {
|
EFI_DRIVER_BINDING_PROTOCOL gDhcp4DriverBinding = {
|
||||||
Dhcp4DriverBindingSupported,
|
Dhcp4DriverBindingSupported,
|
||||||
Dhcp4DriverBindingStart,
|
Dhcp4DriverBindingStart,
|
||||||
Dhcp4DriverBindingStop,
|
Dhcp4DriverBindingStop,
|
||||||
@ -17,7 +17,7 @@ EFI_DRIVER_BINDING_PROTOCOL gDhcp4DriverBinding = {
|
|||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
EFI_SERVICE_BINDING_PROTOCOL mDhcp4ServiceBindingTemplate = {
|
EFI_SERVICE_BINDING_PROTOCOL mDhcp4ServiceBindingTemplate = {
|
||||||
Dhcp4ServiceBindingCreateChild,
|
Dhcp4ServiceBindingCreateChild,
|
||||||
Dhcp4ServiceBindingDestroyChild
|
Dhcp4ServiceBindingDestroyChild
|
||||||
};
|
};
|
||||||
@ -39,8 +39,8 @@ EFI_SERVICE_BINDING_PROTOCOL mDhcp4ServiceBindingTemplate = {
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
Dhcp4DriverEntryPoint (
|
Dhcp4DriverEntryPoint (
|
||||||
IN EFI_HANDLE ImageHandle,
|
IN EFI_HANDLE ImageHandle,
|
||||||
IN EFI_SYSTEM_TABLE *SystemTable
|
IN EFI_SYSTEM_TABLE *SystemTable
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return EfiLibInstallDriverBindingComponentName2 (
|
return EfiLibInstallDriverBindingComponentName2 (
|
||||||
@ -53,7 +53,6 @@ Dhcp4DriverEntryPoint (
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Test to see if this driver supports ControllerHandle. This service
|
Test to see if this driver supports ControllerHandle. This service
|
||||||
is called by the EFI boot service ConnectController(). In
|
is called by the EFI boot service ConnectController(). In
|
||||||
@ -94,8 +93,6 @@ Dhcp4DriverBindingSupported (
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Configure the default UDP child to receive all the DHCP traffics
|
Configure the default UDP child to receive all the DHCP traffics
|
||||||
on this network interface.
|
on this network interface.
|
||||||
@ -110,35 +107,33 @@ Dhcp4DriverBindingSupported (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
DhcpConfigUdpIo (
|
DhcpConfigUdpIo (
|
||||||
IN UDP_IO *UdpIo,
|
IN UDP_IO *UdpIo,
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_UDP4_CONFIG_DATA UdpConfigData;
|
EFI_UDP4_CONFIG_DATA UdpConfigData;
|
||||||
|
|
||||||
UdpConfigData.AcceptBroadcast = TRUE;
|
UdpConfigData.AcceptBroadcast = TRUE;
|
||||||
UdpConfigData.AcceptPromiscuous = FALSE;
|
UdpConfigData.AcceptPromiscuous = FALSE;
|
||||||
UdpConfigData.AcceptAnyPort = FALSE;
|
UdpConfigData.AcceptAnyPort = FALSE;
|
||||||
UdpConfigData.AllowDuplicatePort = TRUE;
|
UdpConfigData.AllowDuplicatePort = TRUE;
|
||||||
UdpConfigData.TypeOfService = 0;
|
UdpConfigData.TypeOfService = 0;
|
||||||
UdpConfigData.TimeToLive = 64;
|
UdpConfigData.TimeToLive = 64;
|
||||||
UdpConfigData.DoNotFragment = FALSE;
|
UdpConfigData.DoNotFragment = FALSE;
|
||||||
UdpConfigData.ReceiveTimeout = 0;
|
UdpConfigData.ReceiveTimeout = 0;
|
||||||
UdpConfigData.TransmitTimeout = 0;
|
UdpConfigData.TransmitTimeout = 0;
|
||||||
|
|
||||||
UdpConfigData.UseDefaultAddress = FALSE;
|
UdpConfigData.UseDefaultAddress = FALSE;
|
||||||
UdpConfigData.StationPort = DHCP_CLIENT_PORT;
|
UdpConfigData.StationPort = DHCP_CLIENT_PORT;
|
||||||
UdpConfigData.RemotePort = DHCP_SERVER_PORT;
|
UdpConfigData.RemotePort = DHCP_SERVER_PORT;
|
||||||
|
|
||||||
ZeroMem (&UdpConfigData.StationAddress, sizeof (EFI_IPv4_ADDRESS));
|
ZeroMem (&UdpConfigData.StationAddress, sizeof (EFI_IPv4_ADDRESS));
|
||||||
ZeroMem (&UdpConfigData.SubnetMask, sizeof (EFI_IPv4_ADDRESS));
|
ZeroMem (&UdpConfigData.SubnetMask, sizeof (EFI_IPv4_ADDRESS));
|
||||||
ZeroMem (&UdpConfigData.RemoteAddress, sizeof (EFI_IPv4_ADDRESS));
|
ZeroMem (&UdpConfigData.RemoteAddress, sizeof (EFI_IPv4_ADDRESS));
|
||||||
|
|
||||||
return UdpIo->Protocol.Udp4->Configure (UdpIo->Protocol.Udp4, &UdpConfigData);;
|
return UdpIo->Protocol.Udp4->Configure (UdpIo->Protocol.Udp4, &UdpConfigData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Destroy the DHCP service. The Dhcp4 service may be partly initialized,
|
Destroy the DHCP service. The Dhcp4 service may be partly initialized,
|
||||||
or partly destroyed. If a resource is destroyed, it is marked as so in
|
or partly destroyed. If a resource is destroyed, it is marked as so in
|
||||||
@ -151,7 +146,7 @@ DhcpConfigUdpIo (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
Dhcp4CloseService (
|
Dhcp4CloseService (
|
||||||
IN DHCP_SERVICE *DhcpSb
|
IN DHCP_SERVICE *DhcpSb
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
DhcpCleanLease (DhcpSb);
|
DhcpCleanLease (DhcpSb);
|
||||||
@ -171,8 +166,6 @@ Dhcp4CloseService (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Create a new DHCP service binding instance for the controller.
|
Create a new DHCP service binding instance for the controller.
|
||||||
|
|
||||||
@ -189,28 +182,28 @@ Dhcp4CloseService (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
Dhcp4CreateService (
|
Dhcp4CreateService (
|
||||||
IN EFI_HANDLE Controller,
|
IN EFI_HANDLE Controller,
|
||||||
IN EFI_HANDLE ImageHandle,
|
IN EFI_HANDLE ImageHandle,
|
||||||
OUT DHCP_SERVICE **Service
|
OUT DHCP_SERVICE **Service
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
DHCP_SERVICE *DhcpSb;
|
DHCP_SERVICE *DhcpSb;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
*Service = NULL;
|
*Service = NULL;
|
||||||
DhcpSb = AllocateZeroPool (sizeof (DHCP_SERVICE));
|
DhcpSb = AllocateZeroPool (sizeof (DHCP_SERVICE));
|
||||||
|
|
||||||
if (DhcpSb == NULL) {
|
if (DhcpSb == NULL) {
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
DhcpSb->Signature = DHCP_SERVICE_SIGNATURE;
|
DhcpSb->Signature = DHCP_SERVICE_SIGNATURE;
|
||||||
DhcpSb->ServiceState = DHCP_UNCONFIGED;
|
DhcpSb->ServiceState = DHCP_UNCONFIGED;
|
||||||
DhcpSb->Controller = Controller;
|
DhcpSb->Controller = Controller;
|
||||||
DhcpSb->Image = ImageHandle;
|
DhcpSb->Image = ImageHandle;
|
||||||
InitializeListHead (&DhcpSb->Children);
|
InitializeListHead (&DhcpSb->Children);
|
||||||
DhcpSb->DhcpState = Dhcp4Stopped;
|
DhcpSb->DhcpState = Dhcp4Stopped;
|
||||||
DhcpSb->Xid = NET_RANDOM (NetRandomInitSeed ());
|
DhcpSb->Xid = NET_RANDOM (NetRandomInitSeed ());
|
||||||
CopyMem (
|
CopyMem (
|
||||||
&DhcpSb->ServiceBinding,
|
&DhcpSb->ServiceBinding,
|
||||||
&mDhcp4ServiceBindingTemplate,
|
&mDhcp4ServiceBindingTemplate,
|
||||||
@ -244,11 +237,11 @@ Dhcp4CreateService (
|
|||||||
goto ON_ERROR;
|
goto ON_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
DhcpSb->HwLen = (UINT8) DhcpSb->UdpIo->SnpMode.HwAddressSize;
|
DhcpSb->HwLen = (UINT8)DhcpSb->UdpIo->SnpMode.HwAddressSize;
|
||||||
DhcpSb->HwType = DhcpSb->UdpIo->SnpMode.IfType;
|
DhcpSb->HwType = DhcpSb->UdpIo->SnpMode.IfType;
|
||||||
CopyMem (&DhcpSb->Mac, &DhcpSb->UdpIo->SnpMode.CurrentAddress, sizeof (DhcpSb->Mac));
|
CopyMem (&DhcpSb->Mac, &DhcpSb->UdpIo->SnpMode.CurrentAddress, sizeof (DhcpSb->Mac));
|
||||||
|
|
||||||
*Service = DhcpSb;
|
*Service = DhcpSb;
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
|
|
||||||
ON_ERROR:
|
ON_ERROR:
|
||||||
@ -258,7 +251,6 @@ ON_ERROR:
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Start this driver on ControllerHandle. This service is called by the
|
Start this driver on ControllerHandle. This service is called by the
|
||||||
EFI boot service ConnectController(). In order to make
|
EFI boot service ConnectController(). In order to make
|
||||||
@ -285,8 +277,8 @@ Dhcp4DriverBindingStart (
|
|||||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
|
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
DHCP_SERVICE *DhcpSb;
|
DHCP_SERVICE *DhcpSb;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
//
|
//
|
||||||
// First: test for the DHCP4 Protocol
|
// First: test for the DHCP4 Protocol
|
||||||
@ -309,6 +301,7 @@ Dhcp4DriverBindingStart (
|
|||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
ASSERT (DhcpSb != NULL);
|
ASSERT (DhcpSb != NULL);
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -319,6 +312,7 @@ Dhcp4DriverBindingStart (
|
|||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
goto ON_ERROR;
|
goto ON_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = gBS->SetTimer (DhcpSb->Timer, TimerPeriodic, TICKS_PER_SECOND);
|
Status = gBS->SetTimer (DhcpSb->Timer, TimerPeriodic, TICKS_PER_SECOND);
|
||||||
|
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
@ -360,24 +354,23 @@ ON_ERROR:
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
Dhcp4DestroyChildEntry (
|
Dhcp4DestroyChildEntry (
|
||||||
IN LIST_ENTRY *Entry,
|
IN LIST_ENTRY *Entry,
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
DHCP_PROTOCOL *Instance;
|
DHCP_PROTOCOL *Instance;
|
||||||
EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding;
|
EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding;
|
||||||
|
|
||||||
if (Entry == NULL || Context == NULL) {
|
if ((Entry == NULL) || (Context == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
Instance = NET_LIST_USER_STRUCT_S (Entry, DHCP_PROTOCOL, Link, DHCP_PROTOCOL_SIGNATURE);
|
Instance = NET_LIST_USER_STRUCT_S (Entry, DHCP_PROTOCOL, Link, DHCP_PROTOCOL_SIGNATURE);
|
||||||
ServiceBinding = (EFI_SERVICE_BINDING_PROTOCOL *) Context;
|
ServiceBinding = (EFI_SERVICE_BINDING_PROTOCOL *)Context;
|
||||||
|
|
||||||
return ServiceBinding->DestroyChild (ServiceBinding, Instance->Handle);
|
return ServiceBinding->DestroyChild (ServiceBinding, Instance->Handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Stop this driver on ControllerHandle. This service is called by the
|
Stop this driver on ControllerHandle. This service is called by the
|
||||||
EFI boot service DisconnectController(). In order to
|
EFI boot service DisconnectController(). In order to
|
||||||
@ -422,10 +415,10 @@ Dhcp4DriverBindingStop (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
NicHandle,
|
NicHandle,
|
||||||
&gEfiDhcp4ServiceBindingProtocolGuid,
|
&gEfiDhcp4ServiceBindingProtocolGuid,
|
||||||
(VOID **) &ServiceBinding,
|
(VOID **)&ServiceBinding,
|
||||||
This->DriverBindingHandle,
|
This->DriverBindingHandle,
|
||||||
NicHandle,
|
NicHandle,
|
||||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||||
@ -440,23 +433,23 @@ Dhcp4DriverBindingStop (
|
|||||||
//
|
//
|
||||||
// Destroy all the children instances before destroy the service.
|
// Destroy all the children instances before destroy the service.
|
||||||
//
|
//
|
||||||
List = &DhcpSb->Children;
|
List = &DhcpSb->Children;
|
||||||
Status = NetDestroyLinkList (
|
Status = NetDestroyLinkList (
|
||||||
List,
|
List,
|
||||||
Dhcp4DestroyChildEntry,
|
Dhcp4DestroyChildEntry,
|
||||||
ServiceBinding,
|
ServiceBinding,
|
||||||
&ListLength
|
&ListLength
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status) || ListLength != 0) {
|
if (EFI_ERROR (Status) || (ListLength != 0)) {
|
||||||
Status = EFI_DEVICE_ERROR;
|
Status = EFI_DEVICE_ERROR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (NumberOfChildren == 0 && !IsListEmpty (&DhcpSb->Children)) {
|
if ((NumberOfChildren == 0) && !IsListEmpty (&DhcpSb->Children)) {
|
||||||
Status = EFI_DEVICE_ERROR;
|
Status = EFI_DEVICE_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (NumberOfChildren == 0 && IsListEmpty (&DhcpSb->Children)) {
|
if ((NumberOfChildren == 0) && IsListEmpty (&DhcpSb->Children)) {
|
||||||
//
|
//
|
||||||
// Destroy the service itself if no child instance left.
|
// Destroy the service itself if no child instance left.
|
||||||
//
|
//
|
||||||
@ -474,6 +467,7 @@ Dhcp4DriverBindingStop (
|
|||||||
FreeUnicodeStringTable (gDhcpControllerNameTable);
|
FreeUnicodeStringTable (gDhcpControllerNameTable);
|
||||||
gDhcpControllerNameTable = NULL;
|
gDhcpControllerNameTable = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
FreePool (DhcpSb);
|
FreePool (DhcpSb);
|
||||||
|
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
@ -482,7 +476,6 @@ Dhcp4DriverBindingStop (
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Initialize a new DHCP instance.
|
Initialize a new DHCP instance.
|
||||||
|
|
||||||
@ -492,25 +485,24 @@ Dhcp4DriverBindingStop (
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
DhcpInitProtocol (
|
DhcpInitProtocol (
|
||||||
IN DHCP_SERVICE *DhcpSb,
|
IN DHCP_SERVICE *DhcpSb,
|
||||||
IN OUT DHCP_PROTOCOL *Instance
|
IN OUT DHCP_PROTOCOL *Instance
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
Instance->Signature = DHCP_PROTOCOL_SIGNATURE;
|
Instance->Signature = DHCP_PROTOCOL_SIGNATURE;
|
||||||
CopyMem (&Instance->Dhcp4Protocol, &mDhcp4ProtocolTemplate, sizeof (Instance->Dhcp4Protocol));
|
CopyMem (&Instance->Dhcp4Protocol, &mDhcp4ProtocolTemplate, sizeof (Instance->Dhcp4Protocol));
|
||||||
InitializeListHead (&Instance->Link);
|
InitializeListHead (&Instance->Link);
|
||||||
Instance->Handle = NULL;
|
Instance->Handle = NULL;
|
||||||
Instance->Service = DhcpSb;
|
Instance->Service = DhcpSb;
|
||||||
Instance->InDestroy = FALSE;
|
Instance->InDestroy = FALSE;
|
||||||
Instance->CompletionEvent = NULL;
|
Instance->CompletionEvent = NULL;
|
||||||
Instance->RenewRebindEvent = NULL;
|
Instance->RenewRebindEvent = NULL;
|
||||||
Instance->Token = NULL;
|
Instance->Token = NULL;
|
||||||
Instance->UdpIo = NULL;
|
Instance->UdpIo = NULL;
|
||||||
Instance->ElaspedTime = 0;
|
Instance->ElaspedTime = 0;
|
||||||
NetbufQueInit (&Instance->ResponseQueue);
|
NetbufQueInit (&Instance->ResponseQueue);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Creates a child handle and installs a protocol.
|
Creates a child handle and installs a protocol.
|
||||||
|
|
||||||
@ -537,11 +529,11 @@ Dhcp4ServiceBindingCreateChild (
|
|||||||
IN EFI_HANDLE *ChildHandle
|
IN EFI_HANDLE *ChildHandle
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
DHCP_SERVICE *DhcpSb;
|
DHCP_SERVICE *DhcpSb;
|
||||||
DHCP_PROTOCOL *Instance;
|
DHCP_PROTOCOL *Instance;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
VOID *Udp4;
|
VOID *Udp4;
|
||||||
|
|
||||||
if ((This == NULL) || (ChildHandle == NULL)) {
|
if ((This == NULL) || (ChildHandle == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
@ -571,7 +563,7 @@ Dhcp4ServiceBindingCreateChild (
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
Instance->Handle = *ChildHandle;
|
Instance->Handle = *ChildHandle;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Open the Udp4 protocol BY_CHILD.
|
// Open the Udp4 protocol BY_CHILD.
|
||||||
@ -579,7 +571,7 @@ Dhcp4ServiceBindingCreateChild (
|
|||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
DhcpSb->UdpIo->UdpHandle,
|
DhcpSb->UdpIo->UdpHandle,
|
||||||
&gEfiUdp4ProtocolGuid,
|
&gEfiUdp4ProtocolGuid,
|
||||||
(VOID **) &Udp4,
|
(VOID **)&Udp4,
|
||||||
gDhcp4DriverBinding.DriverBindingHandle,
|
gDhcp4DriverBinding.DriverBindingHandle,
|
||||||
Instance->Handle,
|
Instance->Handle,
|
||||||
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
||||||
@ -606,7 +598,6 @@ Dhcp4ServiceBindingCreateChild (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Destroys a child handle with a protocol installed on it.
|
Destroys a child handle with a protocol installed on it.
|
||||||
|
|
||||||
@ -632,11 +623,11 @@ Dhcp4ServiceBindingDestroyChild (
|
|||||||
IN EFI_HANDLE ChildHandle
|
IN EFI_HANDLE ChildHandle
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
DHCP_SERVICE *DhcpSb;
|
DHCP_SERVICE *DhcpSb;
|
||||||
DHCP_PROTOCOL *Instance;
|
DHCP_PROTOCOL *Instance;
|
||||||
EFI_DHCP4_PROTOCOL *Dhcp;
|
EFI_DHCP4_PROTOCOL *Dhcp;
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
if ((This == NULL) || (ChildHandle == NULL)) {
|
if ((This == NULL) || (ChildHandle == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
@ -648,7 +639,7 @@ Dhcp4ServiceBindingDestroyChild (
|
|||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
ChildHandle,
|
ChildHandle,
|
||||||
&gEfiDhcp4ProtocolGuid,
|
&gEfiDhcp4ProtocolGuid,
|
||||||
(VOID **) &Dhcp,
|
(VOID **)&Dhcp,
|
||||||
gDhcp4DriverBinding.DriverBindingHandle,
|
gDhcp4DriverBinding.DriverBindingHandle,
|
||||||
ChildHandle,
|
ChildHandle,
|
||||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||||
@ -658,8 +649,8 @@ Dhcp4ServiceBindingDestroyChild (
|
|||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
Instance = DHCP_INSTANCE_FROM_THIS (Dhcp);
|
Instance = DHCP_INSTANCE_FROM_THIS (Dhcp);
|
||||||
DhcpSb = DHCP_SERVICE_FROM_THIS (This);
|
DhcpSb = DHCP_SERVICE_FROM_THIS (This);
|
||||||
|
|
||||||
if (Instance->Service != DhcpSb) {
|
if (Instance->Service != DhcpSb) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
@ -675,7 +666,7 @@ Dhcp4ServiceBindingDestroyChild (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
||||||
Instance->InDestroy = TRUE;
|
Instance->InDestroy = TRUE;
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -9,9 +9,9 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#ifndef __EFI_DHCP4_DRIVER_H__
|
#ifndef __EFI_DHCP4_DRIVER_H__
|
||||||
#define __EFI_DHCP4_DRIVER_H__
|
#define __EFI_DHCP4_DRIVER_H__
|
||||||
|
|
||||||
extern EFI_COMPONENT_NAME_PROTOCOL gDhcp4ComponentName;
|
extern EFI_COMPONENT_NAME_PROTOCOL gDhcp4ComponentName;
|
||||||
extern EFI_COMPONENT_NAME2_PROTOCOL gDhcp4ComponentName2;
|
extern EFI_COMPONENT_NAME2_PROTOCOL gDhcp4ComponentName2;
|
||||||
extern EFI_UNICODE_STRING_TABLE *gDhcpControllerNameTable;
|
extern EFI_UNICODE_STRING_TABLE *gDhcpControllerNameTable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Test to see if this driver supports ControllerHandle. This service
|
Test to see if this driver supports ControllerHandle. This service
|
||||||
|
@ -6,7 +6,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
|
|
||||||
#include "Dhcp4Impl.h"
|
#include "Dhcp4Impl.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -25,8 +24,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EfiDhcp4GetModeData (
|
EfiDhcp4GetModeData (
|
||||||
IN EFI_DHCP4_PROTOCOL *This,
|
IN EFI_DHCP4_PROTOCOL *This,
|
||||||
OUT EFI_DHCP4_MODE_DATA *Dhcp4ModeData
|
OUT EFI_DHCP4_MODE_DATA *Dhcp4ModeData
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -121,8 +120,8 @@ EfiDhcp4Configure (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EfiDhcp4Start (
|
EfiDhcp4Start (
|
||||||
IN EFI_DHCP4_PROTOCOL *This,
|
IN EFI_DHCP4_PROTOCOL *This,
|
||||||
IN EFI_EVENT CompletionEvent OPTIONAL
|
IN EFI_EVENT CompletionEvent OPTIONAL
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -166,9 +165,9 @@ EfiDhcp4Start (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EfiDhcp4RenewRebind (
|
EfiDhcp4RenewRebind (
|
||||||
IN EFI_DHCP4_PROTOCOL *This,
|
IN EFI_DHCP4_PROTOCOL *This,
|
||||||
IN BOOLEAN RebindRequest,
|
IN BOOLEAN RebindRequest,
|
||||||
IN EFI_EVENT CompletionEvent OPTIONAL
|
IN EFI_EVENT CompletionEvent OPTIONAL
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -195,7 +194,7 @@ EfiDhcp4RenewRebind (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EfiDhcp4Release (
|
EfiDhcp4Release (
|
||||||
IN EFI_DHCP4_PROTOCOL *This
|
IN EFI_DHCP4_PROTOCOL *This
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -216,7 +215,7 @@ EfiDhcp4Release (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EfiDhcp4Stop (
|
EfiDhcp4Stop (
|
||||||
IN EFI_DHCP4_PROTOCOL *This
|
IN EFI_DHCP4_PROTOCOL *This
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -314,10 +313,10 @@ EfiDhcp4TransmitReceive (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EfiDhcp4Parse (
|
EfiDhcp4Parse (
|
||||||
IN EFI_DHCP4_PROTOCOL *This,
|
IN EFI_DHCP4_PROTOCOL *This,
|
||||||
IN EFI_DHCP4_PACKET *Packet,
|
IN EFI_DHCP4_PACKET *Packet,
|
||||||
IN OUT UINT32 *OptionCount,
|
IN OUT UINT32 *OptionCount,
|
||||||
OUT EFI_DHCP4_PACKET_OPTION *PacketOptionList[] OPTIONAL
|
OUT EFI_DHCP4_PACKET_OPTION *PacketOptionList[] OPTIONAL
|
||||||
);
|
);
|
||||||
|
|
||||||
EFI_DHCP4_PROTOCOL mDhcp4ProtocolTemplate = {
|
EFI_DHCP4_PROTOCOL mDhcp4ProtocolTemplate = {
|
||||||
@ -348,15 +347,15 @@ EFI_DHCP4_PROTOCOL mDhcp4ProtocolTemplate = {
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EfiDhcp4GetModeData (
|
EfiDhcp4GetModeData (
|
||||||
IN EFI_DHCP4_PROTOCOL *This,
|
IN EFI_DHCP4_PROTOCOL *This,
|
||||||
OUT EFI_DHCP4_MODE_DATA *Dhcp4ModeData
|
OUT EFI_DHCP4_MODE_DATA *Dhcp4ModeData
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
DHCP_PROTOCOL *Instance;
|
DHCP_PROTOCOL *Instance;
|
||||||
DHCP_SERVICE *DhcpSb;
|
DHCP_SERVICE *DhcpSb;
|
||||||
DHCP_PARAMETER *Para;
|
DHCP_PARAMETER *Para;
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
IP4_ADDR Ip;
|
IP4_ADDR Ip;
|
||||||
|
|
||||||
//
|
//
|
||||||
// First validate the parameters.
|
// First validate the parameters.
|
||||||
@ -367,14 +366,14 @@ EfiDhcp4GetModeData (
|
|||||||
|
|
||||||
Instance = DHCP_INSTANCE_FROM_THIS (This);
|
Instance = DHCP_INSTANCE_FROM_THIS (This);
|
||||||
|
|
||||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
||||||
DhcpSb = Instance->Service;
|
DhcpSb = Instance->Service;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Caller can use GetModeData to retrieve current DHCP states
|
// Caller can use GetModeData to retrieve current DHCP states
|
||||||
// no matter whether it is the active child or not.
|
// no matter whether it is the active child or not.
|
||||||
//
|
//
|
||||||
Dhcp4ModeData->State = (EFI_DHCP4_STATE) DhcpSb->DhcpState;
|
Dhcp4ModeData->State = (EFI_DHCP4_STATE)DhcpSb->DhcpState;
|
||||||
CopyMem (&Dhcp4ModeData->ConfigData, &DhcpSb->ActiveConfig, sizeof (Dhcp4ModeData->ConfigData));
|
CopyMem (&Dhcp4ModeData->ConfigData, &DhcpSb->ActiveConfig, sizeof (Dhcp4ModeData->ConfigData));
|
||||||
CopyMem (&Dhcp4ModeData->ClientMacAddress, &DhcpSb->Mac, sizeof (Dhcp4ModeData->ClientMacAddress));
|
CopyMem (&Dhcp4ModeData->ClientMacAddress, &DhcpSb->Mac, sizeof (Dhcp4ModeData->ClientMacAddress));
|
||||||
|
|
||||||
@ -404,7 +403,6 @@ EfiDhcp4GetModeData (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Free the resource related to the configure parameters.
|
Free the resource related to the configure parameters.
|
||||||
DHCP driver will make a copy of the user's configure
|
DHCP driver will make a copy of the user's configure
|
||||||
@ -418,7 +416,7 @@ DhcpCleanConfigure (
|
|||||||
IN OUT EFI_DHCP4_CONFIG_DATA *Config
|
IN OUT EFI_DHCP4_CONFIG_DATA *Config
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINT32 Index;
|
UINT32 Index;
|
||||||
|
|
||||||
if (Config->DiscoverTimeout != NULL) {
|
if (Config->DiscoverTimeout != NULL) {
|
||||||
FreePool (Config->DiscoverTimeout);
|
FreePool (Config->DiscoverTimeout);
|
||||||
@ -441,7 +439,6 @@ DhcpCleanConfigure (
|
|||||||
ZeroMem (Config, sizeof (EFI_DHCP4_CONFIG_DATA));
|
ZeroMem (Config, sizeof (EFI_DHCP4_CONFIG_DATA));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Allocate memory for configure parameter such as timeout value for Dst,
|
Allocate memory for configure parameter such as timeout value for Dst,
|
||||||
then copy the configure parameter from Src to Dst.
|
then copy the configure parameter from Src to Dst.
|
||||||
@ -459,22 +456,22 @@ DhcpCopyConfigure (
|
|||||||
IN EFI_DHCP4_CONFIG_DATA *Src
|
IN EFI_DHCP4_CONFIG_DATA *Src
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_DHCP4_PACKET_OPTION **DstOptions;
|
EFI_DHCP4_PACKET_OPTION **DstOptions;
|
||||||
EFI_DHCP4_PACKET_OPTION **SrcOptions;
|
EFI_DHCP4_PACKET_OPTION **SrcOptions;
|
||||||
UINTN Len;
|
UINTN Len;
|
||||||
UINT32 Index;
|
UINT32 Index;
|
||||||
|
|
||||||
CopyMem (Dst, Src, sizeof (*Dst));
|
CopyMem (Dst, Src, sizeof (*Dst));
|
||||||
Dst->DiscoverTimeout = NULL;
|
Dst->DiscoverTimeout = NULL;
|
||||||
Dst->RequestTimeout = NULL;
|
Dst->RequestTimeout = NULL;
|
||||||
Dst->OptionList = NULL;
|
Dst->OptionList = NULL;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Allocate a memory then copy DiscoverTimeout to it
|
// Allocate a memory then copy DiscoverTimeout to it
|
||||||
//
|
//
|
||||||
if (Src->DiscoverTimeout != NULL) {
|
if (Src->DiscoverTimeout != NULL) {
|
||||||
Len = Src->DiscoverTryCount * sizeof (UINT32);
|
Len = Src->DiscoverTryCount * sizeof (UINT32);
|
||||||
Dst->DiscoverTimeout = AllocatePool (Len);
|
Dst->DiscoverTimeout = AllocatePool (Len);
|
||||||
|
|
||||||
if (Dst->DiscoverTimeout == NULL) {
|
if (Dst->DiscoverTimeout == NULL) {
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
@ -513,8 +510,8 @@ DhcpCopyConfigure (
|
|||||||
goto ON_ERROR;
|
goto ON_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
DstOptions = Dst->OptionList;
|
DstOptions = Dst->OptionList;
|
||||||
SrcOptions = Src->OptionList;
|
SrcOptions = Src->OptionList;
|
||||||
|
|
||||||
for (Index = 0; Index < Src->OptionCount; Index++) {
|
for (Index = 0; Index < Src->OptionCount; Index++) {
|
||||||
Len = sizeof (EFI_DHCP4_PACKET_OPTION) + MAX (SrcOptions[Index]->Length - 1, 0);
|
Len = sizeof (EFI_DHCP4_PACKET_OPTION) + MAX (SrcOptions[Index]->Length - 1, 0);
|
||||||
@ -536,7 +533,6 @@ ON_ERROR:
|
|||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Give up the control of the DHCP service to let other child
|
Give up the control of the DHCP service to let other child
|
||||||
resume. Don't change the service's DHCP state and the Client
|
resume. Don't change the service's DHCP state and the Client
|
||||||
@ -547,21 +543,21 @@ ON_ERROR:
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
DhcpYieldControl (
|
DhcpYieldControl (
|
||||||
IN DHCP_SERVICE *DhcpSb
|
IN DHCP_SERVICE *DhcpSb
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_DHCP4_CONFIG_DATA *Config;
|
EFI_DHCP4_CONFIG_DATA *Config;
|
||||||
|
|
||||||
Config = &DhcpSb->ActiveConfig;
|
Config = &DhcpSb->ActiveConfig;
|
||||||
|
|
||||||
DhcpSb->ServiceState = DHCP_UNCONFIGED;
|
DhcpSb->ServiceState = DHCP_UNCONFIGED;
|
||||||
DhcpSb->ActiveChild = NULL;
|
DhcpSb->ActiveChild = NULL;
|
||||||
|
|
||||||
if (Config->DiscoverTimeout != NULL) {
|
if (Config->DiscoverTimeout != NULL) {
|
||||||
FreePool (Config->DiscoverTimeout);
|
FreePool (Config->DiscoverTimeout);
|
||||||
|
|
||||||
Config->DiscoverTryCount = 0;
|
Config->DiscoverTryCount = 0;
|
||||||
Config->DiscoverTimeout = NULL;
|
Config->DiscoverTimeout = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Config->RequestTimeout != NULL) {
|
if (Config->RequestTimeout != NULL) {
|
||||||
@ -575,7 +571,6 @@ DhcpYieldControl (
|
|||||||
Config->CallbackContext = NULL;
|
Config->CallbackContext = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Initializes, changes, or resets the operational settings for the EFI DHCPv4 Protocol driver.
|
Initializes, changes, or resets the operational settings for the EFI DHCPv4 Protocol driver.
|
||||||
|
|
||||||
@ -625,13 +620,13 @@ EfiDhcp4Configure (
|
|||||||
IN EFI_DHCP4_CONFIG_DATA *Dhcp4CfgData OPTIONAL
|
IN EFI_DHCP4_CONFIG_DATA *Dhcp4CfgData OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_DHCP4_CONFIG_DATA *Config;
|
EFI_DHCP4_CONFIG_DATA *Config;
|
||||||
DHCP_PROTOCOL *Instance;
|
DHCP_PROTOCOL *Instance;
|
||||||
DHCP_SERVICE *DhcpSb;
|
DHCP_SERVICE *DhcpSb;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
UINT32 Index;
|
UINT32 Index;
|
||||||
IP4_ADDR Ip;
|
IP4_ADDR Ip;
|
||||||
|
|
||||||
//
|
//
|
||||||
// First validate the parameters
|
// First validate the parameters
|
||||||
@ -654,7 +649,7 @@ EfiDhcp4Configure (
|
|||||||
}
|
}
|
||||||
|
|
||||||
CopyMem (&Ip, &Dhcp4CfgData->ClientAddress, sizeof (IP4_ADDR));
|
CopyMem (&Ip, &Dhcp4CfgData->ClientAddress, sizeof (IP4_ADDR));
|
||||||
if (IP4_IS_LOCAL_BROADCAST(NTOHL (Ip))) {
|
if (IP4_IS_LOCAL_BROADCAST (NTOHL (Ip))) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -665,18 +660,18 @@ EfiDhcp4Configure (
|
|||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
||||||
|
|
||||||
DhcpSb = Instance->Service;
|
DhcpSb = Instance->Service;
|
||||||
Config = &DhcpSb->ActiveConfig;
|
Config = &DhcpSb->ActiveConfig;
|
||||||
|
|
||||||
Status = EFI_ACCESS_DENIED;
|
Status = EFI_ACCESS_DENIED;
|
||||||
|
|
||||||
if ((DhcpSb->DhcpState != Dhcp4Stopped) &&
|
if ((DhcpSb->DhcpState != Dhcp4Stopped) &&
|
||||||
(DhcpSb->DhcpState != Dhcp4Init) &&
|
(DhcpSb->DhcpState != Dhcp4Init) &&
|
||||||
(DhcpSb->DhcpState != Dhcp4InitReboot) &&
|
(DhcpSb->DhcpState != Dhcp4InitReboot) &&
|
||||||
(DhcpSb->DhcpState != Dhcp4Bound)) {
|
(DhcpSb->DhcpState != Dhcp4Bound))
|
||||||
|
{
|
||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -710,9 +705,8 @@ EfiDhcp4Configure (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
DhcpSb->ServiceState = DHCP_CONFIGED;
|
DhcpSb->ServiceState = DHCP_CONFIGED;
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
|
|
||||||
} else if (DhcpSb->ActiveChild == Instance) {
|
} else if (DhcpSb->ActiveChild == Instance) {
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
DhcpYieldControl (DhcpSb);
|
DhcpYieldControl (DhcpSb);
|
||||||
@ -723,7 +717,6 @@ ON_EXIT:
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Starts the DHCP configuration process.
|
Starts the DHCP configuration process.
|
||||||
|
|
||||||
@ -768,15 +761,15 @@ ON_EXIT:
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EfiDhcp4Start (
|
EfiDhcp4Start (
|
||||||
IN EFI_DHCP4_PROTOCOL *This,
|
IN EFI_DHCP4_PROTOCOL *This,
|
||||||
IN EFI_EVENT CompletionEvent OPTIONAL
|
IN EFI_EVENT CompletionEvent OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
DHCP_PROTOCOL *Instance;
|
DHCP_PROTOCOL *Instance;
|
||||||
DHCP_SERVICE *DhcpSb;
|
DHCP_SERVICE *DhcpSb;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
EFI_STATUS MediaStatus;
|
EFI_STATUS MediaStatus;
|
||||||
|
|
||||||
//
|
//
|
||||||
// First validate the parameters
|
// First validate the parameters
|
||||||
@ -791,8 +784,8 @@ EfiDhcp4Start (
|
|||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
||||||
DhcpSb = Instance->Service;
|
DhcpSb = Instance->Service;
|
||||||
|
|
||||||
if (DhcpSb->DhcpState == Dhcp4Stopped) {
|
if (DhcpSb->DhcpState == Dhcp4Stopped) {
|
||||||
Status = EFI_NOT_STARTED;
|
Status = EFI_NOT_STARTED;
|
||||||
@ -820,7 +813,6 @@ EfiDhcp4Start (
|
|||||||
goto ON_ERROR;
|
goto ON_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Instance->CompletionEvent = CompletionEvent;
|
Instance->CompletionEvent = CompletionEvent;
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -843,7 +835,6 @@ ON_ERROR:
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Extends the lease time by sending a request packet.
|
Extends the lease time by sending a request packet.
|
||||||
|
|
||||||
@ -885,15 +876,15 @@ ON_ERROR:
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EfiDhcp4RenewRebind (
|
EfiDhcp4RenewRebind (
|
||||||
IN EFI_DHCP4_PROTOCOL *This,
|
IN EFI_DHCP4_PROTOCOL *This,
|
||||||
IN BOOLEAN RebindRequest,
|
IN BOOLEAN RebindRequest,
|
||||||
IN EFI_EVENT CompletionEvent OPTIONAL
|
IN EFI_EVENT CompletionEvent OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
DHCP_PROTOCOL *Instance;
|
DHCP_PROTOCOL *Instance;
|
||||||
DHCP_SERVICE *DhcpSb;
|
DHCP_SERVICE *DhcpSb;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
|
|
||||||
//
|
//
|
||||||
// First validate the parameters
|
// First validate the parameters
|
||||||
@ -908,8 +899,8 @@ EfiDhcp4RenewRebind (
|
|||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
||||||
DhcpSb = Instance->Service;
|
DhcpSb = Instance->Service;
|
||||||
|
|
||||||
if (DhcpSb->DhcpState == Dhcp4Stopped) {
|
if (DhcpSb->DhcpState == Dhcp4Stopped) {
|
||||||
Status = EFI_NOT_STARTED;
|
Status = EFI_NOT_STARTED;
|
||||||
@ -946,7 +937,7 @@ EfiDhcp4RenewRebind (
|
|||||||
DhcpSb->Selected,
|
DhcpSb->Selected,
|
||||||
DhcpSb->Para,
|
DhcpSb->Para,
|
||||||
DHCP_MSG_REQUEST,
|
DHCP_MSG_REQUEST,
|
||||||
(UINT8 *) "Extra renew/rebind by the application"
|
(UINT8 *)"Extra renew/rebind by the application"
|
||||||
);
|
);
|
||||||
|
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
@ -954,16 +945,15 @@ EfiDhcp4RenewRebind (
|
|||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
DhcpSb->ExtraRefresh = TRUE;
|
DhcpSb->ExtraRefresh = TRUE;
|
||||||
DhcpSb->IoStatus = EFI_ALREADY_STARTED;
|
DhcpSb->IoStatus = EFI_ALREADY_STARTED;
|
||||||
Instance->RenewRebindEvent = CompletionEvent;
|
Instance->RenewRebindEvent = CompletionEvent;
|
||||||
|
|
||||||
gBS->RestoreTPL (OldTpl);
|
gBS->RestoreTPL (OldTpl);
|
||||||
|
|
||||||
if (CompletionEvent == NULL) {
|
if (CompletionEvent == NULL) {
|
||||||
while (DhcpSb->IoStatus == EFI_ALREADY_STARTED) {
|
while (DhcpSb->IoStatus == EFI_ALREADY_STARTED) {
|
||||||
DhcpSb->UdpIo->Protocol.Udp4->Poll (DhcpSb->UdpIo->Protocol.Udp4);
|
DhcpSb->UdpIo->Protocol.Udp4->Poll (DhcpSb->UdpIo->Protocol.Udp4);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return DhcpSb->IoStatus;
|
return DhcpSb->IoStatus;
|
||||||
@ -976,7 +966,6 @@ ON_EXIT:
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Releases the current address configuration.
|
Releases the current address configuration.
|
||||||
|
|
||||||
@ -1001,13 +990,13 @@ ON_EXIT:
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EfiDhcp4Release (
|
EfiDhcp4Release (
|
||||||
IN EFI_DHCP4_PROTOCOL *This
|
IN EFI_DHCP4_PROTOCOL *This
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
DHCP_PROTOCOL *Instance;
|
DHCP_PROTOCOL *Instance;
|
||||||
DHCP_SERVICE *DhcpSb;
|
DHCP_SERVICE *DhcpSb;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
|
|
||||||
//
|
//
|
||||||
// First validate the parameters
|
// First validate the parameters
|
||||||
@ -1022,9 +1011,9 @@ EfiDhcp4Release (
|
|||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
||||||
DhcpSb = Instance->Service;
|
DhcpSb = Instance->Service;
|
||||||
|
|
||||||
if ((DhcpSb->DhcpState != Dhcp4InitReboot) && (DhcpSb->DhcpState != Dhcp4Bound)) {
|
if ((DhcpSb->DhcpState != Dhcp4InitReboot) && (DhcpSb->DhcpState != Dhcp4Bound)) {
|
||||||
Status = EFI_ACCESS_DENIED;
|
Status = EFI_ACCESS_DENIED;
|
||||||
@ -1053,7 +1042,6 @@ ON_EXIT:
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Stops the current address configuration.
|
Stops the current address configuration.
|
||||||
|
|
||||||
@ -1072,12 +1060,12 @@ ON_EXIT:
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EfiDhcp4Stop (
|
EfiDhcp4Stop (
|
||||||
IN EFI_DHCP4_PROTOCOL *This
|
IN EFI_DHCP4_PROTOCOL *This
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
DHCP_PROTOCOL *Instance;
|
DHCP_PROTOCOL *Instance;
|
||||||
DHCP_SERVICE *DhcpSb;
|
DHCP_SERVICE *DhcpSb;
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
|
|
||||||
//
|
//
|
||||||
// First validate the parameters
|
// First validate the parameters
|
||||||
@ -1092,19 +1080,18 @@ EfiDhcp4Stop (
|
|||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
||||||
DhcpSb = Instance->Service;
|
DhcpSb = Instance->Service;
|
||||||
|
|
||||||
DhcpCleanLease (DhcpSb);
|
DhcpCleanLease (DhcpSb);
|
||||||
|
|
||||||
DhcpSb->DhcpState = Dhcp4Stopped;
|
DhcpSb->DhcpState = Dhcp4Stopped;
|
||||||
DhcpSb->ServiceState = DHCP_UNCONFIGED;
|
DhcpSb->ServiceState = DHCP_UNCONFIGED;
|
||||||
|
|
||||||
gBS->RestoreTPL (OldTpl);
|
gBS->RestoreTPL (OldTpl);
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Builds a DHCP packet, given the options to be appended or deleted or replaced.
|
Builds a DHCP packet, given the options to be appended or deleted or replaced.
|
||||||
|
|
||||||
@ -1152,15 +1139,15 @@ EfiDhcp4Build (
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ((SeedPacket == NULL) || (SeedPacket->Dhcp4.Magik != DHCP_OPTION_MAGIC) ||
|
if ((SeedPacket == NULL) || (SeedPacket->Dhcp4.Magik != DHCP_OPTION_MAGIC) ||
|
||||||
EFI_ERROR (DhcpValidateOptions (SeedPacket, NULL))) {
|
EFI_ERROR (DhcpValidateOptions (SeedPacket, NULL)))
|
||||||
|
{
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (((DeleteCount == 0) && (AppendCount == 0)) ||
|
if (((DeleteCount == 0) && (AppendCount == 0)) ||
|
||||||
((DeleteCount != 0) && (DeleteList == NULL)) ||
|
((DeleteCount != 0) && (DeleteList == NULL)) ||
|
||||||
((AppendCount != 0) && (AppendList == NULL))) {
|
((AppendCount != 0) && (AppendList == NULL)))
|
||||||
|
{
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1188,8 +1175,8 @@ EfiDhcp4Build (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
Dhcp4InstanceConfigUdpIo (
|
Dhcp4InstanceConfigUdpIo (
|
||||||
IN UDP_IO *UdpIo,
|
IN UDP_IO *UdpIo,
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
DHCP_PROTOCOL *Instance;
|
DHCP_PROTOCOL *Instance;
|
||||||
@ -1201,7 +1188,7 @@ Dhcp4InstanceConfigUdpIo (
|
|||||||
INTN Class;
|
INTN Class;
|
||||||
IP4_ADDR SubnetMask;
|
IP4_ADDR SubnetMask;
|
||||||
|
|
||||||
Instance = (DHCP_PROTOCOL *) Context;
|
Instance = (DHCP_PROTOCOL *)Context;
|
||||||
DhcpSb = Instance->Service;
|
DhcpSb = Instance->Service;
|
||||||
Token = Instance->Token;
|
Token = Instance->Token;
|
||||||
|
|
||||||
@ -1213,7 +1200,7 @@ Dhcp4InstanceConfigUdpIo (
|
|||||||
UdpConfigData.DoNotFragment = TRUE;
|
UdpConfigData.DoNotFragment = TRUE;
|
||||||
|
|
||||||
ClientAddr = EFI_NTOHL (Token->Packet->Dhcp4.Header.ClientAddr);
|
ClientAddr = EFI_NTOHL (Token->Packet->Dhcp4.Header.ClientAddr);
|
||||||
Ip = HTONL (ClientAddr);
|
Ip = HTONL (ClientAddr);
|
||||||
CopyMem (&UdpConfigData.StationAddress, &Ip, sizeof (EFI_IPv4_ADDRESS));
|
CopyMem (&UdpConfigData.StationAddress, &Ip, sizeof (EFI_IPv4_ADDRESS));
|
||||||
|
|
||||||
if (DhcpSb->Netmask == 0) {
|
if (DhcpSb->Netmask == 0) {
|
||||||
@ -1284,7 +1271,7 @@ Dhcp4InstanceCreateUdpIo (
|
|||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
Instance->UdpIo->UdpHandle,
|
Instance->UdpIo->UdpHandle,
|
||||||
&gEfiUdp4ProtocolGuid,
|
&gEfiUdp4ProtocolGuid,
|
||||||
(VOID **) &Udp4,
|
(VOID **)&Udp4,
|
||||||
Instance->Service->Image,
|
Instance->Service->Image,
|
||||||
Instance->Handle,
|
Instance->Handle,
|
||||||
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
||||||
@ -1293,6 +1280,7 @@ Dhcp4InstanceCreateUdpIo (
|
|||||||
UdpIoFreeIo (Instance->UdpIo);
|
UdpIoFreeIo (Instance->UdpIo);
|
||||||
Instance->UdpIo = NULL;
|
Instance->UdpIo = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1306,7 +1294,7 @@ Dhcp4InstanceCreateUdpIo (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
DhcpDummyExtFree (
|
DhcpDummyExtFree (
|
||||||
IN VOID *Arg
|
IN VOID *Arg
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
@ -1326,10 +1314,10 @@ DhcpDummyExtFree (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
PxeDhcpInput (
|
PxeDhcpInput (
|
||||||
NET_BUF *UdpPacket,
|
NET_BUF *UdpPacket,
|
||||||
UDP_END_POINT *EndPoint,
|
UDP_END_POINT *EndPoint,
|
||||||
EFI_STATUS IoStatus,
|
EFI_STATUS IoStatus,
|
||||||
VOID *Context
|
VOID *Context
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
DHCP_PROTOCOL *Instance;
|
DHCP_PROTOCOL *Instance;
|
||||||
@ -1341,14 +1329,14 @@ PxeDhcpInput (
|
|||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
Wrap = NULL;
|
Wrap = NULL;
|
||||||
Instance = (DHCP_PROTOCOL *) Context;
|
Instance = (DHCP_PROTOCOL *)Context;
|
||||||
Token = Instance->Token;
|
Token = Instance->Token;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Don't restart receive if error occurs or DHCP is destroyed.
|
// Don't restart receive if error occurs or DHCP is destroyed.
|
||||||
//
|
//
|
||||||
if (EFI_ERROR (IoStatus)) {
|
if (EFI_ERROR (IoStatus)) {
|
||||||
return ;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ASSERT (UdpPacket != NULL);
|
ASSERT (UdpPacket != NULL);
|
||||||
@ -1370,12 +1358,12 @@ PxeDhcpInput (
|
|||||||
goto RESTART;
|
goto RESTART;
|
||||||
}
|
}
|
||||||
|
|
||||||
Packet = (EFI_DHCP4_PACKET *) NetbufAllocSpace (Wrap, Len, NET_BUF_TAIL);
|
Packet = (EFI_DHCP4_PACKET *)NetbufAllocSpace (Wrap, Len, NET_BUF_TAIL);
|
||||||
ASSERT (Packet != NULL);
|
ASSERT (Packet != NULL);
|
||||||
|
|
||||||
Packet->Size = Len;
|
Packet->Size = Len;
|
||||||
Head = &Packet->Dhcp4.Header;
|
Head = &Packet->Dhcp4.Header;
|
||||||
Packet->Length = NetbufCopy (UdpPacket, 0, UdpPacket->TotalSize, (UINT8 *) Head);
|
Packet->Length = NetbufCopy (UdpPacket, 0, UdpPacket->TotalSize, (UINT8 *)Head);
|
||||||
|
|
||||||
if (Packet->Length != UdpPacket->TotalSize) {
|
if (Packet->Length != UdpPacket->TotalSize) {
|
||||||
goto RESTART;
|
goto RESTART;
|
||||||
@ -1386,7 +1374,8 @@ PxeDhcpInput (
|
|||||||
//
|
//
|
||||||
if ((Head->OpCode != BOOTP_REPLY) ||
|
if ((Head->OpCode != BOOTP_REPLY) ||
|
||||||
(Head->Xid != Token->Packet->Dhcp4.Header.Xid) ||
|
(Head->Xid != Token->Packet->Dhcp4.Header.Xid) ||
|
||||||
(CompareMem (&Token->Packet->Dhcp4.Header.ClientHwAddr[0], Head->ClientHwAddr, Head->HwAddrLen) != 0)) {
|
(CompareMem (&Token->Packet->Dhcp4.Header.ClientHwAddr[0], Head->ClientHwAddr, Head->HwAddrLen) != 0))
|
||||||
|
{
|
||||||
goto RESTART;
|
goto RESTART;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1395,8 +1384,8 @@ PxeDhcpInput (
|
|||||||
//
|
//
|
||||||
if ((Packet->Length > sizeof (EFI_DHCP4_HEADER) + sizeof (UINT32)) &&
|
if ((Packet->Length > sizeof (EFI_DHCP4_HEADER) + sizeof (UINT32)) &&
|
||||||
(Packet->Dhcp4.Magik == DHCP_OPTION_MAGIC) &&
|
(Packet->Dhcp4.Magik == DHCP_OPTION_MAGIC) &&
|
||||||
EFI_ERROR (DhcpValidateOptions (Packet, NULL))) {
|
EFI_ERROR (DhcpValidateOptions (Packet, NULL)))
|
||||||
|
{
|
||||||
goto RESTART;
|
goto RESTART;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1437,7 +1426,7 @@ PxeDhcpDone (
|
|||||||
|
|
||||||
Token->ResponseCount = Instance->ResponseQueue.BufNum;
|
Token->ResponseCount = Instance->ResponseQueue.BufNum;
|
||||||
if (Token->ResponseCount != 0) {
|
if (Token->ResponseCount != 0) {
|
||||||
Token->ResponseList = (EFI_DHCP4_PACKET *) AllocatePool (Instance->ResponseQueue.BufSize);
|
Token->ResponseList = (EFI_DHCP4_PACKET *)AllocatePool (Instance->ResponseQueue.BufSize);
|
||||||
if (Token->ResponseList == NULL) {
|
if (Token->ResponseList == NULL) {
|
||||||
Token->Status = EFI_OUT_OF_RESOURCES;
|
Token->Status = EFI_OUT_OF_RESOURCES;
|
||||||
goto SIGNAL_USER;
|
goto SIGNAL_USER;
|
||||||
@ -1446,7 +1435,7 @@ PxeDhcpDone (
|
|||||||
//
|
//
|
||||||
// Copy the received DHCP responses.
|
// Copy the received DHCP responses.
|
||||||
//
|
//
|
||||||
NetbufQueCopy (&Instance->ResponseQueue, 0, Instance->ResponseQueue.BufSize, (UINT8 *) Token->ResponseList);
|
NetbufQueCopy (&Instance->ResponseQueue, 0, Instance->ResponseQueue.BufSize, (UINT8 *)Token->ResponseList);
|
||||||
Token->Status = EFI_SUCCESS;
|
Token->Status = EFI_SUCCESS;
|
||||||
} else {
|
} else {
|
||||||
Token->ResponseList = NULL;
|
Token->ResponseList = NULL;
|
||||||
@ -1474,7 +1463,6 @@ SIGNAL_USER:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Transmits a DHCP formatted packet and optionally waits for responses.
|
Transmits a DHCP formatted packet and optionally waits for responses.
|
||||||
|
|
||||||
@ -1501,16 +1489,16 @@ EfiDhcp4TransmitReceive (
|
|||||||
IN EFI_DHCP4_TRANSMIT_RECEIVE_TOKEN *Token
|
IN EFI_DHCP4_TRANSMIT_RECEIVE_TOKEN *Token
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
DHCP_PROTOCOL *Instance;
|
DHCP_PROTOCOL *Instance;
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
NET_FRAGMENT Frag;
|
NET_FRAGMENT Frag;
|
||||||
NET_BUF *Wrap;
|
NET_BUF *Wrap;
|
||||||
UDP_END_POINT EndPoint;
|
UDP_END_POINT EndPoint;
|
||||||
IP4_ADDR Ip;
|
IP4_ADDR Ip;
|
||||||
DHCP_SERVICE *DhcpSb;
|
DHCP_SERVICE *DhcpSb;
|
||||||
EFI_IP_ADDRESS Gateway;
|
EFI_IP_ADDRESS Gateway;
|
||||||
IP4_ADDR ClientAddr;
|
IP4_ADDR ClientAddr;
|
||||||
|
|
||||||
if ((This == NULL) || (Token == NULL) || (Token->Packet == NULL)) {
|
if ((This == NULL) || (Token == NULL) || (Token->Packet == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
@ -1532,7 +1520,8 @@ EfiDhcp4TransmitReceive (
|
|||||||
((Token->ListenPointCount != 0) && (Token->ListenPoints == NULL)) ||
|
((Token->ListenPointCount != 0) && (Token->ListenPoints == NULL)) ||
|
||||||
EFI_ERROR (DhcpValidateOptions (Token->Packet, NULL)) ||
|
EFI_ERROR (DhcpValidateOptions (Token->Packet, NULL)) ||
|
||||||
EFI_IP4_EQUAL (&Token->RemoteAddress, &mZeroIp4Addr)
|
EFI_IP4_EQUAL (&Token->RemoteAddress, &mZeroIp4Addr)
|
||||||
) {
|
)
|
||||||
|
{
|
||||||
//
|
//
|
||||||
// The DHCP packet isn't well-formed, the Transaction ID is already used,
|
// The DHCP packet isn't well-formed, the Transaction ID is already used,
|
||||||
// the timeout value is zero, the ListenPoint is invalid, or the
|
// the timeout value is zero, the ListenPoint is invalid, or the
|
||||||
@ -1575,7 +1564,7 @@ EfiDhcp4TransmitReceive (
|
|||||||
//
|
//
|
||||||
// Wrap the DHCP packet into a net buffer.
|
// Wrap the DHCP packet into a net buffer.
|
||||||
//
|
//
|
||||||
Frag.Bulk = (UINT8 *) &Token->Packet->Dhcp4;
|
Frag.Bulk = (UINT8 *)&Token->Packet->Dhcp4;
|
||||||
Frag.Len = Token->Packet->Length;
|
Frag.Len = Token->Packet->Length;
|
||||||
Wrap = NetbufFromExt (&Frag, 1, 0, 0, DhcpDummyExtFree, NULL);
|
Wrap = NetbufFromExt (&Frag, 1, 0, 0, DhcpDummyExtFree, NULL);
|
||||||
if (Wrap == NULL) {
|
if (Wrap == NULL) {
|
||||||
@ -1667,7 +1656,6 @@ ON_ERROR:
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Callback function for DhcpIterateOptions. This callback sets the
|
Callback function for DhcpIterateOptions. This callback sets the
|
||||||
EFI_DHCP4_PACKET_OPTION array in the DHCP_PARSE_CONTEXT to point
|
EFI_DHCP4_PACKET_OPTION array in the DHCP_PARSE_CONTEXT to point
|
||||||
@ -1683,15 +1671,15 @@ ON_ERROR:
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
Dhcp4ParseCheckOption (
|
Dhcp4ParseCheckOption (
|
||||||
IN UINT8 Tag,
|
IN UINT8 Tag,
|
||||||
IN UINT8 Len,
|
IN UINT8 Len,
|
||||||
IN UINT8 *Data,
|
IN UINT8 *Data,
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
DHCP_PARSE_CONTEXT *Parse;
|
DHCP_PARSE_CONTEXT *Parse;
|
||||||
|
|
||||||
Parse = (DHCP_PARSE_CONTEXT *) Context;
|
Parse = (DHCP_PARSE_CONTEXT *)Context;
|
||||||
Parse->Index++;
|
Parse->Index++;
|
||||||
|
|
||||||
if (Parse->Index <= Parse->OptionCount) {
|
if (Parse->Index <= Parse->OptionCount) {
|
||||||
@ -1706,7 +1694,6 @@ Dhcp4ParseCheckOption (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Parses the packed DHCP option data.
|
Parses the packed DHCP option data.
|
||||||
|
|
||||||
@ -1737,14 +1724,14 @@ Dhcp4ParseCheckOption (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EfiDhcp4Parse (
|
EfiDhcp4Parse (
|
||||||
IN EFI_DHCP4_PROTOCOL *This,
|
IN EFI_DHCP4_PROTOCOL *This,
|
||||||
IN EFI_DHCP4_PACKET *Packet,
|
IN EFI_DHCP4_PACKET *Packet,
|
||||||
IN OUT UINT32 *OptionCount,
|
IN OUT UINT32 *OptionCount,
|
||||||
OUT EFI_DHCP4_PACKET_OPTION *PacketOptionList[] OPTIONAL
|
OUT EFI_DHCP4_PACKET_OPTION *PacketOptionList[] OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
DHCP_PARSE_CONTEXT Context;
|
DHCP_PARSE_CONTEXT Context;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
//
|
//
|
||||||
// First validate the parameters
|
// First validate the parameters
|
||||||
@ -1755,8 +1742,8 @@ EfiDhcp4Parse (
|
|||||||
|
|
||||||
if ((Packet->Size < Packet->Length + 2 * sizeof (UINT32)) ||
|
if ((Packet->Size < Packet->Length + 2 * sizeof (UINT32)) ||
|
||||||
(Packet->Dhcp4.Magik != DHCP_OPTION_MAGIC) ||
|
(Packet->Dhcp4.Magik != DHCP_OPTION_MAGIC) ||
|
||||||
EFI_ERROR (DhcpValidateOptions (Packet, NULL))) {
|
EFI_ERROR (DhcpValidateOptions (Packet, NULL)))
|
||||||
|
{
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1770,7 +1757,7 @@ EfiDhcp4Parse (
|
|||||||
Context.OptionCount = *OptionCount;
|
Context.OptionCount = *OptionCount;
|
||||||
Context.Index = 0;
|
Context.Index = 0;
|
||||||
|
|
||||||
Status = DhcpIterateOptions (Packet, Dhcp4ParseCheckOption, &Context);
|
Status = DhcpIterateOptions (Packet, Dhcp4ParseCheckOption, &Context);
|
||||||
|
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
@ -1794,9 +1781,9 @@ EfiDhcp4Parse (
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
SetElapsedTime (
|
SetElapsedTime (
|
||||||
IN UINT16 *Elapsed,
|
IN UINT16 *Elapsed,
|
||||||
IN DHCP_PROTOCOL *Instance
|
IN DHCP_PROTOCOL *Instance
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
WriteUnaligned16 (Elapsed, HTONS(Instance->ElaspedTime));
|
WriteUnaligned16 (Elapsed, HTONS (Instance->ElaspedTime));
|
||||||
}
|
}
|
||||||
|
@ -14,8 +14,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#ifndef __EFI_DHCP4_IMPL_H__
|
#ifndef __EFI_DHCP4_IMPL_H__
|
||||||
#define __EFI_DHCP4_IMPL_H__
|
#define __EFI_DHCP4_IMPL_H__
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#include <Uefi.h>
|
#include <Uefi.h>
|
||||||
|
|
||||||
#include <Protocol/Dhcp4.h>
|
#include <Protocol/Dhcp4.h>
|
||||||
@ -28,8 +26,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#include <Library/BaseLib.h>
|
#include <Library/BaseLib.h>
|
||||||
#include <Library/NetLib.h>
|
#include <Library/NetLib.h>
|
||||||
|
|
||||||
typedef struct _DHCP_SERVICE DHCP_SERVICE;
|
typedef struct _DHCP_SERVICE DHCP_SERVICE;
|
||||||
typedef struct _DHCP_PROTOCOL DHCP_PROTOCOL;
|
typedef struct _DHCP_PROTOCOL DHCP_PROTOCOL;
|
||||||
|
|
||||||
#include "Dhcp4Option.h"
|
#include "Dhcp4Option.h"
|
||||||
#include "Dhcp4Io.h"
|
#include "Dhcp4Io.h"
|
||||||
@ -37,7 +35,7 @@ typedef struct _DHCP_PROTOCOL DHCP_PROTOCOL;
|
|||||||
#define DHCP_SERVICE_SIGNATURE SIGNATURE_32 ('D', 'H', 'C', 'P')
|
#define DHCP_SERVICE_SIGNATURE SIGNATURE_32 ('D', 'H', 'C', 'P')
|
||||||
#define DHCP_PROTOCOL_SIGNATURE SIGNATURE_32 ('d', 'h', 'c', 'p')
|
#define DHCP_PROTOCOL_SIGNATURE SIGNATURE_32 ('d', 'h', 'c', 'p')
|
||||||
|
|
||||||
#define DHCP_CHECK_MEDIA_WAITING_TIME EFI_TIMER_PERIOD_SECONDS(20)
|
#define DHCP_CHECK_MEDIA_WAITING_TIME EFI_TIMER_PERIOD_SECONDS(20)
|
||||||
|
|
||||||
//
|
//
|
||||||
// The state of the DHCP service. It starts as UNCONFIGED. If
|
// The state of the DHCP service. It starts as UNCONFIGED. If
|
||||||
@ -46,28 +44,27 @@ typedef struct _DHCP_PROTOCOL DHCP_PROTOCOL;
|
|||||||
// goes back to UNCONFIGED. It becomes DESTROY if it is (partly)
|
// goes back to UNCONFIGED. It becomes DESTROY if it is (partly)
|
||||||
// destroyed.
|
// destroyed.
|
||||||
//
|
//
|
||||||
#define DHCP_UNCONFIGED 0
|
#define DHCP_UNCONFIGED 0
|
||||||
#define DHCP_CONFIGED 1
|
#define DHCP_CONFIGED 1
|
||||||
#define DHCP_DESTROY 2
|
#define DHCP_DESTROY 2
|
||||||
|
|
||||||
|
|
||||||
struct _DHCP_PROTOCOL {
|
struct _DHCP_PROTOCOL {
|
||||||
UINT32 Signature;
|
UINT32 Signature;
|
||||||
EFI_DHCP4_PROTOCOL Dhcp4Protocol;
|
EFI_DHCP4_PROTOCOL Dhcp4Protocol;
|
||||||
LIST_ENTRY Link;
|
LIST_ENTRY Link;
|
||||||
EFI_HANDLE Handle;
|
EFI_HANDLE Handle;
|
||||||
DHCP_SERVICE *Service;
|
DHCP_SERVICE *Service;
|
||||||
|
|
||||||
BOOLEAN InDestroy;
|
BOOLEAN InDestroy;
|
||||||
|
|
||||||
EFI_EVENT CompletionEvent;
|
EFI_EVENT CompletionEvent;
|
||||||
EFI_EVENT RenewRebindEvent;
|
EFI_EVENT RenewRebindEvent;
|
||||||
|
|
||||||
EFI_DHCP4_TRANSMIT_RECEIVE_TOKEN *Token;
|
EFI_DHCP4_TRANSMIT_RECEIVE_TOKEN *Token;
|
||||||
UDP_IO *UdpIo; // The UDP IO used for TransmitReceive.
|
UDP_IO *UdpIo; // The UDP IO used for TransmitReceive.
|
||||||
UINT32 Timeout;
|
UINT32 Timeout;
|
||||||
UINT16 ElaspedTime;
|
UINT16 ElaspedTime;
|
||||||
NET_BUF_QUEUE ResponseQueue;
|
NET_BUF_QUEUE ResponseQueue;
|
||||||
};
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -75,62 +72,62 @@ struct _DHCP_PROTOCOL {
|
|||||||
// has a service binding, there can be only one active child.
|
// has a service binding, there can be only one active child.
|
||||||
//
|
//
|
||||||
struct _DHCP_SERVICE {
|
struct _DHCP_SERVICE {
|
||||||
UINT32 Signature;
|
UINT32 Signature;
|
||||||
EFI_SERVICE_BINDING_PROTOCOL ServiceBinding;
|
EFI_SERVICE_BINDING_PROTOCOL ServiceBinding;
|
||||||
|
|
||||||
INTN ServiceState; // CONFIGED, UNCONFIGED, and DESTROY
|
INTN ServiceState; // CONFIGED, UNCONFIGED, and DESTROY
|
||||||
|
|
||||||
EFI_HANDLE Controller;
|
EFI_HANDLE Controller;
|
||||||
EFI_HANDLE Image;
|
EFI_HANDLE Image;
|
||||||
|
|
||||||
LIST_ENTRY Children;
|
LIST_ENTRY Children;
|
||||||
UINTN NumChildren;
|
UINTN NumChildren;
|
||||||
|
|
||||||
INTN DhcpState;
|
INTN DhcpState;
|
||||||
EFI_STATUS IoStatus; // the result of last user operation
|
EFI_STATUS IoStatus; // the result of last user operation
|
||||||
UINT32 Xid;
|
UINT32 Xid;
|
||||||
|
|
||||||
IP4_ADDR ClientAddr; // lease IP or configured client address
|
IP4_ADDR ClientAddr; // lease IP or configured client address
|
||||||
IP4_ADDR Netmask;
|
IP4_ADDR Netmask;
|
||||||
IP4_ADDR ServerAddr;
|
IP4_ADDR ServerAddr;
|
||||||
|
|
||||||
EFI_DHCP4_PACKET *LastOffer; // The last received offer
|
EFI_DHCP4_PACKET *LastOffer; // The last received offer
|
||||||
EFI_DHCP4_PACKET *Selected;
|
EFI_DHCP4_PACKET *Selected;
|
||||||
DHCP_PARAMETER *Para;
|
DHCP_PARAMETER *Para;
|
||||||
|
|
||||||
UINT32 Lease;
|
UINT32 Lease;
|
||||||
UINT32 T1;
|
UINT32 T1;
|
||||||
UINT32 T2;
|
UINT32 T2;
|
||||||
INTN ExtraRefresh; // This refresh is reqested by user
|
INTN ExtraRefresh; // This refresh is reqested by user
|
||||||
|
|
||||||
UDP_IO *UdpIo; // Udp child receiving all DHCP message
|
UDP_IO *UdpIo; // Udp child receiving all DHCP message
|
||||||
UDP_IO *LeaseIoPort; // Udp child with lease IP
|
UDP_IO *LeaseIoPort; // Udp child with lease IP
|
||||||
EFI_DHCP4_PACKET *LastPacket; // The last sent packet for retransmission
|
EFI_DHCP4_PACKET *LastPacket; // The last sent packet for retransmission
|
||||||
EFI_MAC_ADDRESS Mac;
|
EFI_MAC_ADDRESS Mac;
|
||||||
UINT8 HwType;
|
UINT8 HwType;
|
||||||
UINT8 HwLen;
|
UINT8 HwLen;
|
||||||
UINT8 ClientAddressSendOut[16];
|
UINT8 ClientAddressSendOut[16];
|
||||||
|
|
||||||
DHCP_PROTOCOL *ActiveChild;
|
DHCP_PROTOCOL *ActiveChild;
|
||||||
EFI_DHCP4_CONFIG_DATA ActiveConfig;
|
EFI_DHCP4_CONFIG_DATA ActiveConfig;
|
||||||
UINT32 UserOptionLen;
|
UINT32 UserOptionLen;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Timer event and various timer
|
// Timer event and various timer
|
||||||
//
|
//
|
||||||
EFI_EVENT Timer;
|
EFI_EVENT Timer;
|
||||||
|
|
||||||
UINT32 PacketToLive; // Retransmission timer for our packets
|
UINT32 PacketToLive; // Retransmission timer for our packets
|
||||||
UINT32 LastTimeout; // Record the init value of PacketToLive every time
|
UINT32 LastTimeout; // Record the init value of PacketToLive every time
|
||||||
INTN CurRetry;
|
INTN CurRetry;
|
||||||
INTN MaxRetries;
|
INTN MaxRetries;
|
||||||
UINT32 LeaseLife;
|
UINT32 LeaseLife;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
EFI_DHCP4_PACKET_OPTION **Option;
|
EFI_DHCP4_PACKET_OPTION **Option;
|
||||||
UINT32 OptionCount;
|
UINT32 OptionCount;
|
||||||
UINT32 Index;
|
UINT32 Index;
|
||||||
} DHCP_PARSE_CONTEXT;
|
} DHCP_PARSE_CONTEXT;
|
||||||
|
|
||||||
#define DHCP_INSTANCE_FROM_THIS(Proto) \
|
#define DHCP_INSTANCE_FROM_THIS(Proto) \
|
||||||
@ -139,7 +136,7 @@ typedef struct {
|
|||||||
#define DHCP_SERVICE_FROM_THIS(Sb) \
|
#define DHCP_SERVICE_FROM_THIS(Sb) \
|
||||||
CR ((Sb), DHCP_SERVICE, ServiceBinding, DHCP_SERVICE_SIGNATURE)
|
CR ((Sb), DHCP_SERVICE, ServiceBinding, DHCP_SERVICE_SIGNATURE)
|
||||||
|
|
||||||
extern EFI_DHCP4_PROTOCOL mDhcp4ProtocolTemplate;
|
extern EFI_DHCP4_PROTOCOL mDhcp4ProtocolTemplate;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Give up the control of the DHCP service to let other child
|
Give up the control of the DHCP service to let other child
|
||||||
@ -151,7 +148,7 @@ extern EFI_DHCP4_PROTOCOL mDhcp4ProtocolTemplate;
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
DhcpYieldControl (
|
DhcpYieldControl (
|
||||||
IN DHCP_SERVICE *DhcpSb
|
IN DHCP_SERVICE *DhcpSb
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -187,7 +184,7 @@ DhcpCleanConfigure (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
DhcpDummyExtFree (
|
DhcpDummyExtFree (
|
||||||
IN VOID *Arg
|
IN VOID *Arg
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -199,8 +196,8 @@ DhcpDummyExtFree (
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
SetElapsedTime (
|
SetElapsedTime (
|
||||||
IN UINT16 *Elapsed,
|
IN UINT16 *Elapsed,
|
||||||
IN DHCP_PROTOCOL *Instance
|
IN DHCP_PROTOCOL *Instance
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -18,37 +18,35 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#include <Library/BaseMemoryLib.h>
|
#include <Library/BaseMemoryLib.h>
|
||||||
#include <Library/MemoryAllocationLib.h>
|
#include <Library/MemoryAllocationLib.h>
|
||||||
|
|
||||||
|
#define DHCP_WAIT_OFFER 3 // Time to wait the offers
|
||||||
|
|
||||||
#define DHCP_WAIT_OFFER 3 // Time to wait the offers
|
|
||||||
#define DHCP_DEFAULT_LEASE 7 * 24 * 60 * 60 // Seven days as default.
|
#define DHCP_DEFAULT_LEASE 7 * 24 * 60 * 60 // Seven days as default.
|
||||||
#define DHCP_SERVER_PORT 67
|
#define DHCP_SERVER_PORT 67
|
||||||
#define DHCP_CLIENT_PORT 68
|
#define DHCP_CLIENT_PORT 68
|
||||||
|
|
||||||
//
|
//
|
||||||
// BOOTP header "op" field
|
// BOOTP header "op" field
|
||||||
//
|
//
|
||||||
#define BOOTP_REQUEST 1
|
#define BOOTP_REQUEST 1
|
||||||
#define BOOTP_REPLY 2
|
#define BOOTP_REPLY 2
|
||||||
|
|
||||||
//
|
//
|
||||||
// DHCP message types
|
// DHCP message types
|
||||||
//
|
//
|
||||||
#define DHCP_MSG_DISCOVER 1
|
#define DHCP_MSG_DISCOVER 1
|
||||||
#define DHCP_MSG_OFFER 2
|
#define DHCP_MSG_OFFER 2
|
||||||
#define DHCP_MSG_REQUEST 3
|
#define DHCP_MSG_REQUEST 3
|
||||||
#define DHCP_MSG_DECLINE 4
|
#define DHCP_MSG_DECLINE 4
|
||||||
#define DHCP_MSG_ACK 5
|
#define DHCP_MSG_ACK 5
|
||||||
#define DHCP_MSG_NAK 6
|
#define DHCP_MSG_NAK 6
|
||||||
#define DHCP_MSG_RELEASE 7
|
#define DHCP_MSG_RELEASE 7
|
||||||
#define DHCP_MSG_INFORM 8
|
#define DHCP_MSG_INFORM 8
|
||||||
|
|
||||||
//
|
//
|
||||||
// DHCP notify user type
|
// DHCP notify user type
|
||||||
//
|
//
|
||||||
#define DHCP_NOTIFY_COMPLETION 1
|
#define DHCP_NOTIFY_COMPLETION 1
|
||||||
#define DHCP_NOTIFY_RENEWREBIND 2
|
#define DHCP_NOTIFY_RENEWREBIND 2
|
||||||
#define DHCP_NOTIFY_ALL 3
|
#define DHCP_NOTIFY_ALL 3
|
||||||
|
|
||||||
#define DHCP_IS_BOOTP(Parameter) (((Parameter) == NULL) || ((Parameter)->DhcpType == 0))
|
#define DHCP_IS_BOOTP(Parameter) (((Parameter) == NULL) || ((Parameter)->DhcpType == 0))
|
||||||
|
|
||||||
@ -72,9 +70,9 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
DhcpSetState (
|
DhcpSetState (
|
||||||
IN OUT DHCP_SERVICE *DhcpSb,
|
IN OUT DHCP_SERVICE *DhcpSb,
|
||||||
IN INTN State,
|
IN INTN State,
|
||||||
IN BOOLEAN CallUser
|
IN BOOLEAN CallUser
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -98,11 +96,11 @@ DhcpSetState (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
DhcpSendMessage (
|
DhcpSendMessage (
|
||||||
IN DHCP_SERVICE *DhcpSb,
|
IN DHCP_SERVICE *DhcpSb,
|
||||||
IN EFI_DHCP4_PACKET *Seed,
|
IN EFI_DHCP4_PACKET *Seed,
|
||||||
IN DHCP_PARAMETER *Para,
|
IN DHCP_PARAMETER *Para,
|
||||||
IN UINT8 Type,
|
IN UINT8 Type,
|
||||||
IN UINT8 *Msg
|
IN UINT8 *Msg
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -119,8 +117,8 @@ DhcpSendMessage (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
DhcpOnTimerTick (
|
DhcpOnTimerTick (
|
||||||
IN EFI_EVENT Event,
|
IN EFI_EVENT Event,
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -136,10 +134,10 @@ DhcpOnTimerTick (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
DhcpInput (
|
DhcpInput (
|
||||||
NET_BUF *UdpPacket,
|
NET_BUF *UdpPacket,
|
||||||
UDP_END_POINT *EndPoint,
|
UDP_END_POINT *EndPoint,
|
||||||
EFI_STATUS IoStatus,
|
EFI_STATUS IoStatus,
|
||||||
VOID *Context
|
VOID *Context
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -154,7 +152,7 @@ DhcpInput (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
DhcpInitRequest (
|
DhcpInitRequest (
|
||||||
IN DHCP_SERVICE *DhcpSb
|
IN DHCP_SERVICE *DhcpSb
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -165,7 +163,7 @@ DhcpInitRequest (
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
DhcpCleanLease (
|
DhcpCleanLease (
|
||||||
IN DHCP_SERVICE *DhcpSb
|
IN DHCP_SERVICE *DhcpSb
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -180,10 +178,10 @@ DhcpCleanLease (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
DhcpOnPacketSent (
|
DhcpOnPacketSent (
|
||||||
NET_BUF *Packet,
|
NET_BUF *Packet,
|
||||||
UDP_END_POINT *EndPoint,
|
UDP_END_POINT *EndPoint,
|
||||||
EFI_STATUS IoStatus,
|
EFI_STATUS IoStatus,
|
||||||
VOID *Context
|
VOID *Context
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -13,95 +13,94 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
/// to validate a dhcp message. Refere the comments of the
|
/// to validate a dhcp message. Refere the comments of the
|
||||||
/// DHCP_OPTION_FORMAT structure.
|
/// DHCP_OPTION_FORMAT structure.
|
||||||
///
|
///
|
||||||
DHCP_OPTION_FORMAT DhcpOptionFormats[] = {
|
DHCP_OPTION_FORMAT DhcpOptionFormats[] = {
|
||||||
{DHCP4_TAG_NETMASK, DHCP_OPTION_IP, 1, 1 , TRUE},
|
{ DHCP4_TAG_NETMASK, DHCP_OPTION_IP, 1, 1, TRUE },
|
||||||
{DHCP4_TAG_TIME_OFFSET, DHCP_OPTION_INT32, 1, 1 , FALSE},
|
{ DHCP4_TAG_TIME_OFFSET, DHCP_OPTION_INT32, 1, 1, FALSE },
|
||||||
{DHCP4_TAG_ROUTER, DHCP_OPTION_IP, 1, -1 , TRUE},
|
{ DHCP4_TAG_ROUTER, DHCP_OPTION_IP, 1, -1, TRUE },
|
||||||
{DHCP4_TAG_TIME_SERVER, DHCP_OPTION_IP, 1, -1 , FALSE},
|
{ DHCP4_TAG_TIME_SERVER, DHCP_OPTION_IP, 1, -1, FALSE },
|
||||||
{DHCP4_TAG_NAME_SERVER, DHCP_OPTION_IP, 1, -1 , FALSE},
|
{ DHCP4_TAG_NAME_SERVER, DHCP_OPTION_IP, 1, -1, FALSE },
|
||||||
{DHCP4_TAG_DNS_SERVER, DHCP_OPTION_IP, 1, -1 , FALSE},
|
{ DHCP4_TAG_DNS_SERVER, DHCP_OPTION_IP, 1, -1, FALSE },
|
||||||
{DHCP4_TAG_LOG_SERVER, DHCP_OPTION_IP, 1, -1 , FALSE},
|
{ DHCP4_TAG_LOG_SERVER, DHCP_OPTION_IP, 1, -1, FALSE },
|
||||||
{DHCP4_TAG_COOKIE_SERVER, DHCP_OPTION_IP, 1, -1 , FALSE},
|
{ DHCP4_TAG_COOKIE_SERVER, DHCP_OPTION_IP, 1, -1, FALSE },
|
||||||
{DHCP4_TAG_LPR_SERVER, DHCP_OPTION_IP, 1, -1 , FALSE},
|
{ DHCP4_TAG_LPR_SERVER, DHCP_OPTION_IP, 1, -1, FALSE },
|
||||||
{DHCP4_TAG_IMPRESS_SERVER, DHCP_OPTION_IP, 1, -1 , FALSE},
|
{ DHCP4_TAG_IMPRESS_SERVER, DHCP_OPTION_IP, 1, -1, FALSE },
|
||||||
{DHCP4_TAG_RL_SERVER, DHCP_OPTION_IP, 1, -1 , FALSE},
|
{ DHCP4_TAG_RL_SERVER, DHCP_OPTION_IP, 1, -1, FALSE },
|
||||||
{DHCP4_TAG_HOSTNAME, DHCP_OPTION_INT8, 1, -1 , FALSE},
|
{ DHCP4_TAG_HOSTNAME, DHCP_OPTION_INT8, 1, -1, FALSE },
|
||||||
{DHCP4_TAG_BOOTFILE_LEN, DHCP_OPTION_INT16, 1, 1 , FALSE},
|
{ DHCP4_TAG_BOOTFILE_LEN, DHCP_OPTION_INT16, 1, 1, FALSE },
|
||||||
{DHCP4_TAG_DUMP, DHCP_OPTION_INT8, 1, -1 , FALSE},
|
{ DHCP4_TAG_DUMP, DHCP_OPTION_INT8, 1, -1, FALSE },
|
||||||
{DHCP4_TAG_DOMAINNAME, DHCP_OPTION_INT8, 1, -1 , FALSE},
|
{ DHCP4_TAG_DOMAINNAME, DHCP_OPTION_INT8, 1, -1, FALSE },
|
||||||
{DHCP4_TAG_SWAP_SERVER, DHCP_OPTION_IP, 1, 1 , FALSE},
|
{ DHCP4_TAG_SWAP_SERVER, DHCP_OPTION_IP, 1, 1, FALSE },
|
||||||
{DHCP4_TAG_ROOTPATH, DHCP_OPTION_INT8, 1, -1 , FALSE},
|
{ DHCP4_TAG_ROOTPATH, DHCP_OPTION_INT8, 1, -1, FALSE },
|
||||||
{DHCP4_TAG_EXTEND_PATH, DHCP_OPTION_INT8, 1, -1 , FALSE},
|
{ DHCP4_TAG_EXTEND_PATH, DHCP_OPTION_INT8, 1, -1, FALSE },
|
||||||
|
|
||||||
{DHCP4_TAG_IPFORWARD, DHCP_OPTION_SWITCH, 1, 1 , FALSE},
|
{ DHCP4_TAG_IPFORWARD, DHCP_OPTION_SWITCH, 1, 1, FALSE },
|
||||||
{DHCP4_TAG_NONLOCAL_SRR, DHCP_OPTION_SWITCH, 1, 1 , FALSE},
|
{ DHCP4_TAG_NONLOCAL_SRR, DHCP_OPTION_SWITCH, 1, 1, FALSE },
|
||||||
{DHCP4_TAG_POLICY_SRR, DHCP_OPTION_IPPAIR, 1, -1 , FALSE},
|
{ DHCP4_TAG_POLICY_SRR, DHCP_OPTION_IPPAIR, 1, -1, FALSE },
|
||||||
{DHCP4_TAG_EMTU, DHCP_OPTION_INT16, 1, 1 , FALSE},
|
{ DHCP4_TAG_EMTU, DHCP_OPTION_INT16, 1, 1, FALSE },
|
||||||
{DHCP4_TAG_TTL, DHCP_OPTION_INT8, 1, 1 , FALSE},
|
{ DHCP4_TAG_TTL, DHCP_OPTION_INT8, 1, 1, FALSE },
|
||||||
{DHCP4_TAG_PATHMTU_AGE, DHCP_OPTION_INT32, 1, 1 , FALSE},
|
{ DHCP4_TAG_PATHMTU_AGE, DHCP_OPTION_INT32, 1, 1, FALSE },
|
||||||
{DHCP4_TAG_PATHMTU_PLATEAU,DHCP_OPTION_INT16, 1, -1 , FALSE},
|
{ DHCP4_TAG_PATHMTU_PLATEAU, DHCP_OPTION_INT16, 1, -1, FALSE },
|
||||||
|
|
||||||
{DHCP4_TAG_IFMTU, DHCP_OPTION_INT16, 1, 1 , FALSE},
|
{ DHCP4_TAG_IFMTU, DHCP_OPTION_INT16, 1, 1, FALSE },
|
||||||
{DHCP4_TAG_SUBNET_LOCAL, DHCP_OPTION_SWITCH, 1, 1 , FALSE},
|
{ DHCP4_TAG_SUBNET_LOCAL, DHCP_OPTION_SWITCH, 1, 1, FALSE },
|
||||||
{DHCP4_TAG_BROADCAST, DHCP_OPTION_IP, 1, 1 , FALSE},
|
{ DHCP4_TAG_BROADCAST, DHCP_OPTION_IP, 1, 1, FALSE },
|
||||||
{DHCP4_TAG_DISCOVER_MASK, DHCP_OPTION_SWITCH, 1, 1 , FALSE},
|
{ DHCP4_TAG_DISCOVER_MASK, DHCP_OPTION_SWITCH, 1, 1, FALSE },
|
||||||
{DHCP4_TAG_SUPPLY_MASK, DHCP_OPTION_SWITCH, 1, 1 , FALSE},
|
{ DHCP4_TAG_SUPPLY_MASK, DHCP_OPTION_SWITCH, 1, 1, FALSE },
|
||||||
{DHCP4_TAG_DISCOVER_ROUTE, DHCP_OPTION_SWITCH, 1, 1 , FALSE},
|
{ DHCP4_TAG_DISCOVER_ROUTE, DHCP_OPTION_SWITCH, 1, 1, FALSE },
|
||||||
{DHCP4_TAG_ROUTER_SOLICIT, DHCP_OPTION_IP, 1, 1 , FALSE},
|
{ DHCP4_TAG_ROUTER_SOLICIT, DHCP_OPTION_IP, 1, 1, FALSE },
|
||||||
{DHCP4_TAG_STATIC_ROUTE, DHCP_OPTION_IPPAIR, 1, -1 , FALSE},
|
{ DHCP4_TAG_STATIC_ROUTE, DHCP_OPTION_IPPAIR, 1, -1, FALSE },
|
||||||
|
|
||||||
{DHCP4_TAG_TRAILER, DHCP_OPTION_SWITCH, 1, 1 , FALSE},
|
{ DHCP4_TAG_TRAILER, DHCP_OPTION_SWITCH, 1, 1, FALSE },
|
||||||
{DHCP4_TAG_ARPAGE, DHCP_OPTION_INT32, 1, 1 , FALSE},
|
{ DHCP4_TAG_ARPAGE, DHCP_OPTION_INT32, 1, 1, FALSE },
|
||||||
{DHCP4_TAG_ETHER_ENCAP, DHCP_OPTION_SWITCH, 1, 1 , FALSE},
|
{ DHCP4_TAG_ETHER_ENCAP, DHCP_OPTION_SWITCH, 1, 1, FALSE },
|
||||||
|
|
||||||
{DHCP4_TAG_TCP_TTL, DHCP_OPTION_INT8, 1, 1 , FALSE},
|
{ DHCP4_TAG_TCP_TTL, DHCP_OPTION_INT8, 1, 1, FALSE },
|
||||||
{DHCP4_TAG_KEEP_INTERVAL, DHCP_OPTION_INT32, 1, 1 , FALSE},
|
{ DHCP4_TAG_KEEP_INTERVAL, DHCP_OPTION_INT32, 1, 1, FALSE },
|
||||||
{DHCP4_TAG_KEEP_GARBAGE, DHCP_OPTION_SWITCH, 1, 1 , FALSE},
|
{ DHCP4_TAG_KEEP_GARBAGE, DHCP_OPTION_SWITCH, 1, 1, FALSE },
|
||||||
|
|
||||||
{DHCP4_TAG_NIS_DOMAIN, DHCP_OPTION_INT8, 1, -1 , FALSE},
|
{ DHCP4_TAG_NIS_DOMAIN, DHCP_OPTION_INT8, 1, -1, FALSE },
|
||||||
{DHCP4_TAG_NIS_SERVER, DHCP_OPTION_IP, 1, -1 , FALSE},
|
{ DHCP4_TAG_NIS_SERVER, DHCP_OPTION_IP, 1, -1, FALSE },
|
||||||
{DHCP4_TAG_NTP_SERVER, DHCP_OPTION_IP, 1, -1 , FALSE},
|
{ DHCP4_TAG_NTP_SERVER, DHCP_OPTION_IP, 1, -1, FALSE },
|
||||||
{DHCP4_TAG_VENDOR, DHCP_OPTION_INT8, 1, -1 , FALSE},
|
{ DHCP4_TAG_VENDOR, DHCP_OPTION_INT8, 1, -1, FALSE },
|
||||||
{DHCP4_TAG_NBNS, DHCP_OPTION_IP, 1, -1 , FALSE},
|
{ DHCP4_TAG_NBNS, DHCP_OPTION_IP, 1, -1, FALSE },
|
||||||
{DHCP4_TAG_NBDD, DHCP_OPTION_IP, 1, -1 , FALSE},
|
{ DHCP4_TAG_NBDD, DHCP_OPTION_IP, 1, -1, FALSE },
|
||||||
{DHCP4_TAG_NBTYPE, DHCP_OPTION_INT8, 1, 1 , FALSE},
|
{ DHCP4_TAG_NBTYPE, DHCP_OPTION_INT8, 1, 1, FALSE },
|
||||||
{DHCP4_TAG_NBSCOPE, DHCP_OPTION_INT8, 1, -1 , FALSE},
|
{ DHCP4_TAG_NBSCOPE, DHCP_OPTION_INT8, 1, -1, FALSE },
|
||||||
{DHCP4_TAG_XFONT, DHCP_OPTION_IP, 1, -1 , FALSE},
|
{ DHCP4_TAG_XFONT, DHCP_OPTION_IP, 1, -1, FALSE },
|
||||||
{DHCP4_TAG_XDM, DHCP_OPTION_IP, 1, -1 , FALSE},
|
{ DHCP4_TAG_XDM, DHCP_OPTION_IP, 1, -1, FALSE },
|
||||||
|
|
||||||
{DHCP4_TAG_REQUEST_IP, DHCP_OPTION_IP, 1, 1 , FALSE},
|
{ DHCP4_TAG_REQUEST_IP, DHCP_OPTION_IP, 1, 1, FALSE },
|
||||||
{DHCP4_TAG_LEASE, DHCP_OPTION_INT32, 1, 1 , TRUE},
|
{ DHCP4_TAG_LEASE, DHCP_OPTION_INT32, 1, 1, TRUE },
|
||||||
{DHCP4_TAG_OVERLOAD, DHCP_OPTION_INT8, 1, 1 , TRUE},
|
{ DHCP4_TAG_OVERLOAD, DHCP_OPTION_INT8, 1, 1, TRUE },
|
||||||
{DHCP4_TAG_MSG_TYPE, DHCP_OPTION_INT8, 1, 1 , TRUE},
|
{ DHCP4_TAG_MSG_TYPE, DHCP_OPTION_INT8, 1, 1, TRUE },
|
||||||
{DHCP4_TAG_SERVER_ID, DHCP_OPTION_IP, 1, 1 , TRUE},
|
{ DHCP4_TAG_SERVER_ID, DHCP_OPTION_IP, 1, 1, TRUE },
|
||||||
{DHCP4_TAG_PARA_LIST, DHCP_OPTION_INT8, 1, -1 , FALSE},
|
{ DHCP4_TAG_PARA_LIST, DHCP_OPTION_INT8, 1, -1, FALSE },
|
||||||
{DHCP4_TAG_MESSAGE, DHCP_OPTION_INT8, 1, -1 , FALSE},
|
{ DHCP4_TAG_MESSAGE, DHCP_OPTION_INT8, 1, -1, FALSE },
|
||||||
{DHCP4_TAG_MAXMSG, DHCP_OPTION_INT16, 1, 1 , FALSE},
|
{ DHCP4_TAG_MAXMSG, DHCP_OPTION_INT16, 1, 1, FALSE },
|
||||||
{DHCP4_TAG_T1, DHCP_OPTION_INT32, 1, 1 , TRUE},
|
{ DHCP4_TAG_T1, DHCP_OPTION_INT32, 1, 1, TRUE },
|
||||||
{DHCP4_TAG_T2, DHCP_OPTION_INT32, 1, 1 , TRUE},
|
{ DHCP4_TAG_T2, DHCP_OPTION_INT32, 1, 1, TRUE },
|
||||||
{DHCP4_TAG_VENDOR_CLASS_ID,DHCP_OPTION_INT8, 1, -1 , FALSE},
|
{ DHCP4_TAG_VENDOR_CLASS_ID, DHCP_OPTION_INT8, 1, -1, FALSE },
|
||||||
{DHCP4_TAG_CLIENT_ID, DHCP_OPTION_INT8, 2, -1 , FALSE},
|
{ DHCP4_TAG_CLIENT_ID, DHCP_OPTION_INT8, 2, -1, FALSE },
|
||||||
|
|
||||||
{DHCP4_TAG_NISPLUS, DHCP_OPTION_INT8, 1, -1 , FALSE},
|
{ DHCP4_TAG_NISPLUS, DHCP_OPTION_INT8, 1, -1, FALSE },
|
||||||
{DHCP4_TAG_NISPLUS_SERVER, DHCP_OPTION_IP, 1, -1 , FALSE},
|
{ DHCP4_TAG_NISPLUS_SERVER, DHCP_OPTION_IP, 1, -1, FALSE },
|
||||||
|
|
||||||
{DHCP4_TAG_TFTP, DHCP_OPTION_INT8, 1, -1 , FALSE},
|
{ DHCP4_TAG_TFTP, DHCP_OPTION_INT8, 1, -1, FALSE },
|
||||||
{DHCP4_TAG_BOOTFILE, DHCP_OPTION_INT8, 1, -1 , FALSE},
|
{ DHCP4_TAG_BOOTFILE, DHCP_OPTION_INT8, 1, -1, FALSE },
|
||||||
|
|
||||||
{DHCP4_TAG_MOBILEIP, DHCP_OPTION_IP, 0, -1 , FALSE},
|
{ DHCP4_TAG_MOBILEIP, DHCP_OPTION_IP, 0, -1, FALSE },
|
||||||
{DHCP4_TAG_SMTP, DHCP_OPTION_IP, 1, -1 , FALSE},
|
{ DHCP4_TAG_SMTP, DHCP_OPTION_IP, 1, -1, FALSE },
|
||||||
{DHCP4_TAG_POP3, DHCP_OPTION_IP, 1, -1 , FALSE},
|
{ DHCP4_TAG_POP3, DHCP_OPTION_IP, 1, -1, FALSE },
|
||||||
{DHCP4_TAG_NNTP, DHCP_OPTION_IP, 1, -1 , FALSE},
|
{ DHCP4_TAG_NNTP, DHCP_OPTION_IP, 1, -1, FALSE },
|
||||||
{DHCP4_TAG_WWW, DHCP_OPTION_IP, 1, -1 , FALSE},
|
{ DHCP4_TAG_WWW, DHCP_OPTION_IP, 1, -1, FALSE },
|
||||||
{DHCP4_TAG_FINGER, DHCP_OPTION_IP, 1, -1 , FALSE},
|
{ DHCP4_TAG_FINGER, DHCP_OPTION_IP, 1, -1, FALSE },
|
||||||
{DHCP4_TAG_IRC, DHCP_OPTION_IP, 1, -1 , FALSE},
|
{ DHCP4_TAG_IRC, DHCP_OPTION_IP, 1, -1, FALSE },
|
||||||
{DHCP4_TAG_STTALK, DHCP_OPTION_IP, 1, -1 , FALSE},
|
{ DHCP4_TAG_STTALK, DHCP_OPTION_IP, 1, -1, FALSE },
|
||||||
{DHCP4_TAG_STDA, DHCP_OPTION_IP, 1, -1 , FALSE},
|
{ DHCP4_TAG_STDA, DHCP_OPTION_IP, 1, -1, FALSE },
|
||||||
|
|
||||||
{DHCP4_TAG_CLASSLESS_ROUTE,DHCP_OPTION_INT8, 5, -1 , FALSE},
|
{ DHCP4_TAG_CLASSLESS_ROUTE, DHCP_OPTION_INT8, 5, -1, FALSE },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Binary search the DhcpOptionFormats array to find the format
|
Binary search the DhcpOptionFormats array to find the format
|
||||||
information about a specific option.
|
information about a specific option.
|
||||||
@ -113,12 +112,12 @@ DHCP_OPTION_FORMAT DhcpOptionFormats[] = {
|
|||||||
**/
|
**/
|
||||||
DHCP_OPTION_FORMAT *
|
DHCP_OPTION_FORMAT *
|
||||||
DhcpFindOptionFormat (
|
DhcpFindOptionFormat (
|
||||||
IN UINT8 Tag
|
IN UINT8 Tag
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
INTN Left;
|
INTN Left;
|
||||||
INTN Right;
|
INTN Right;
|
||||||
INTN Middle;
|
INTN Middle;
|
||||||
|
|
||||||
Left = 0;
|
Left = 0;
|
||||||
Right = sizeof (DhcpOptionFormats) / sizeof (DHCP_OPTION_FORMAT) - 1;
|
Right = sizeof (DhcpOptionFormats) / sizeof (DHCP_OPTION_FORMAT) - 1;
|
||||||
@ -133,14 +132,13 @@ DhcpFindOptionFormat (
|
|||||||
if (Tag < DhcpOptionFormats[Middle].Tag) {
|
if (Tag < DhcpOptionFormats[Middle].Tag) {
|
||||||
Right = Middle - 1;
|
Right = Middle - 1;
|
||||||
} else {
|
} else {
|
||||||
Left = Middle + 1;
|
Left = Middle + 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Validate whether a single DHCP option is valid according to its format.
|
Validate whether a single DHCP option is valid according to its format.
|
||||||
|
|
||||||
@ -154,35 +152,35 @@ DhcpFindOptionFormat (
|
|||||||
**/
|
**/
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
DhcpOptionIsValid (
|
DhcpOptionIsValid (
|
||||||
IN DHCP_OPTION_FORMAT *Format,
|
IN DHCP_OPTION_FORMAT *Format,
|
||||||
IN UINT8 *OptValue,
|
IN UINT8 *OptValue,
|
||||||
IN INTN Len
|
IN INTN Len
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
INTN Unit;
|
INTN Unit;
|
||||||
INTN Occur;
|
INTN Occur;
|
||||||
INTN Index;
|
INTN Index;
|
||||||
|
|
||||||
Unit = 0;
|
Unit = 0;
|
||||||
|
|
||||||
switch (Format->Type) {
|
switch (Format->Type) {
|
||||||
case DHCP_OPTION_SWITCH:
|
case DHCP_OPTION_SWITCH:
|
||||||
case DHCP_OPTION_INT8:
|
case DHCP_OPTION_INT8:
|
||||||
Unit = 1;
|
Unit = 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DHCP_OPTION_INT16:
|
case DHCP_OPTION_INT16:
|
||||||
Unit = 2;
|
Unit = 2;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DHCP_OPTION_INT32:
|
case DHCP_OPTION_INT32:
|
||||||
case DHCP_OPTION_IP:
|
case DHCP_OPTION_IP:
|
||||||
Unit = 4;
|
Unit = 4;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DHCP_OPTION_IPPAIR:
|
case DHCP_OPTION_IPPAIR:
|
||||||
Unit = 8;
|
Unit = 8;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
ASSERT (Unit != 0);
|
ASSERT (Unit != 0);
|
||||||
@ -201,7 +199,8 @@ DhcpOptionIsValid (
|
|||||||
|
|
||||||
if (((Format->MinOccur != -1) && (Occur < Format->MinOccur)) ||
|
if (((Format->MinOccur != -1) && (Occur < Format->MinOccur)) ||
|
||||||
((Format->MaxOccur != -1) && (Occur > Format->MaxOccur))
|
((Format->MaxOccur != -1) && (Occur > Format->MaxOccur))
|
||||||
) {
|
)
|
||||||
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -219,7 +218,6 @@ DhcpOptionIsValid (
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Extract the client interested options, all the parameters are
|
Extract the client interested options, all the parameters are
|
||||||
converted to host byte order.
|
converted to host byte order.
|
||||||
@ -235,61 +233,62 @@ DhcpOptionIsValid (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
DhcpGetParameter (
|
DhcpGetParameter (
|
||||||
IN UINT8 Tag,
|
IN UINT8 Tag,
|
||||||
IN INTN Len,
|
IN INTN Len,
|
||||||
IN UINT8 *Data,
|
IN UINT8 *Data,
|
||||||
OUT DHCP_PARAMETER *Para
|
OUT DHCP_PARAMETER *Para
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
switch (Tag) {
|
switch (Tag) {
|
||||||
case DHCP4_TAG_NETMASK:
|
case DHCP4_TAG_NETMASK:
|
||||||
Para->NetMask = NetGetUint32 (Data);
|
Para->NetMask = NetGetUint32 (Data);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DHCP4_TAG_ROUTER:
|
case DHCP4_TAG_ROUTER:
|
||||||
//
|
//
|
||||||
// Return the first router to consumer which is the preferred one
|
// Return the first router to consumer which is the preferred one
|
||||||
//
|
//
|
||||||
Para->Router = NetGetUint32 (Data);
|
Para->Router = NetGetUint32 (Data);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DHCP4_TAG_LEASE:
|
case DHCP4_TAG_LEASE:
|
||||||
Para->Lease = NetGetUint32 (Data);
|
Para->Lease = NetGetUint32 (Data);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DHCP4_TAG_OVERLOAD:
|
case DHCP4_TAG_OVERLOAD:
|
||||||
Para->Overload = *Data;
|
Para->Overload = *Data;
|
||||||
|
|
||||||
if ((Para->Overload < 1) || (Para->Overload > 3)) {
|
if ((Para->Overload < 1) || (Para->Overload > 3)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
|
|
||||||
case DHCP4_TAG_MSG_TYPE:
|
break;
|
||||||
Para->DhcpType = *Data;
|
|
||||||
|
|
||||||
if ((Para->DhcpType < 1) || (Para->DhcpType > 9)) {
|
case DHCP4_TAG_MSG_TYPE:
|
||||||
return EFI_INVALID_PARAMETER;
|
Para->DhcpType = *Data;
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DHCP4_TAG_SERVER_ID:
|
if ((Para->DhcpType < 1) || (Para->DhcpType > 9)) {
|
||||||
Para->ServerId = NetGetUint32 (Data);
|
return EFI_INVALID_PARAMETER;
|
||||||
break;
|
}
|
||||||
|
|
||||||
case DHCP4_TAG_T1:
|
break;
|
||||||
Para->T1 = NetGetUint32 (Data);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DHCP4_TAG_T2:
|
case DHCP4_TAG_SERVER_ID:
|
||||||
Para->T2 = NetGetUint32 (Data);
|
Para->ServerId = NetGetUint32 (Data);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case DHCP4_TAG_T1:
|
||||||
|
Para->T1 = NetGetUint32 (Data);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case DHCP4_TAG_T2:
|
||||||
|
Para->T2 = NetGetUint32 (Data);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Inspect all the options in a single buffer. DHCP options may be contained
|
Inspect all the options in a single buffer. DHCP options may be contained
|
||||||
in several buffers, such as the BOOTP options filed, boot file or server
|
in several buffers, such as the BOOTP options filed, boot file or server
|
||||||
@ -308,16 +307,16 @@ DhcpGetParameter (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
DhcpIterateBufferOptions (
|
DhcpIterateBufferOptions (
|
||||||
IN UINT8 *Buffer,
|
IN UINT8 *Buffer,
|
||||||
IN INTN BufLen,
|
IN INTN BufLen,
|
||||||
IN DHCP_CHECK_OPTION Check OPTIONAL,
|
IN DHCP_CHECK_OPTION Check OPTIONAL,
|
||||||
IN VOID *Context,
|
IN VOID *Context,
|
||||||
OUT UINT8 *Overload OPTIONAL
|
OUT UINT8 *Overload OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
INTN Cur;
|
INTN Cur;
|
||||||
UINT8 Tag;
|
UINT8 Tag;
|
||||||
UINT8 Len;
|
UINT8 Len;
|
||||||
|
|
||||||
Cur = 0;
|
Cur = 0;
|
||||||
|
|
||||||
@ -364,7 +363,6 @@ DhcpIterateBufferOptions (
|
|||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Iterate through a DHCP message to visit each option. First inspect
|
Iterate through a DHCP message to visit each option. First inspect
|
||||||
all the options in the OPTION field. Then if overloaded, inspect
|
all the options in the OPTION field. Then if overloaded, inspect
|
||||||
@ -382,23 +380,23 @@ DhcpIterateBufferOptions (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
DhcpIterateOptions (
|
DhcpIterateOptions (
|
||||||
IN EFI_DHCP4_PACKET *Packet,
|
IN EFI_DHCP4_PACKET *Packet,
|
||||||
IN DHCP_CHECK_OPTION Check OPTIONAL,
|
IN DHCP_CHECK_OPTION Check OPTIONAL,
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
UINT8 Overload;
|
UINT8 Overload;
|
||||||
|
|
||||||
Overload = 0;
|
Overload = 0;
|
||||||
|
|
||||||
Status = DhcpIterateBufferOptions (
|
Status = DhcpIterateBufferOptions (
|
||||||
Packet->Dhcp4.Option,
|
Packet->Dhcp4.Option,
|
||||||
Packet->Length - sizeof (EFI_DHCP4_HEADER) - sizeof (UINT32),
|
Packet->Length - sizeof (EFI_DHCP4_HEADER) - sizeof (UINT32),
|
||||||
Check,
|
Check,
|
||||||
Context,
|
Context,
|
||||||
&Overload
|
&Overload
|
||||||
);
|
);
|
||||||
|
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
@ -406,7 +404,7 @@ DhcpIterateOptions (
|
|||||||
|
|
||||||
if ((Overload == DHCP_OVERLOAD_FILENAME) || (Overload == DHCP_OVERLOAD_BOTH)) {
|
if ((Overload == DHCP_OVERLOAD_FILENAME) || (Overload == DHCP_OVERLOAD_BOTH)) {
|
||||||
Status = DhcpIterateBufferOptions (
|
Status = DhcpIterateBufferOptions (
|
||||||
(UINT8 *) Packet->Dhcp4.Header.BootFileName,
|
(UINT8 *)Packet->Dhcp4.Header.BootFileName,
|
||||||
128,
|
128,
|
||||||
Check,
|
Check,
|
||||||
Context,
|
Context,
|
||||||
@ -420,7 +418,7 @@ DhcpIterateOptions (
|
|||||||
|
|
||||||
if ((Overload == DHCP_OVERLOAD_SVRNAME) || (Overload == DHCP_OVERLOAD_BOTH)) {
|
if ((Overload == DHCP_OVERLOAD_SVRNAME) || (Overload == DHCP_OVERLOAD_BOTH)) {
|
||||||
Status = DhcpIterateBufferOptions (
|
Status = DhcpIterateBufferOptions (
|
||||||
(UINT8 *) Packet->Dhcp4.Header.ServerName,
|
(UINT8 *)Packet->Dhcp4.Header.ServerName,
|
||||||
64,
|
64,
|
||||||
Check,
|
Check,
|
||||||
Context,
|
Context,
|
||||||
@ -435,7 +433,6 @@ DhcpIterateOptions (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Call back function to DhcpIterateOptions to compute each option's
|
Call back function to DhcpIterateOptions to compute each option's
|
||||||
length. It just adds the data length of all the occurrences of this
|
length. It just adds the data length of all the occurrences of this
|
||||||
@ -452,21 +449,20 @@ DhcpIterateOptions (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
DhcpGetOptionLen (
|
DhcpGetOptionLen (
|
||||||
IN UINT8 Tag,
|
IN UINT8 Tag,
|
||||||
IN UINT8 Len,
|
IN UINT8 Len,
|
||||||
IN UINT8 *Data,
|
IN UINT8 *Data,
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
DHCP_OPTION_COUNT *OpCount;
|
DHCP_OPTION_COUNT *OpCount;
|
||||||
|
|
||||||
OpCount = (DHCP_OPTION_COUNT *) Context;
|
OpCount = (DHCP_OPTION_COUNT *)Context;
|
||||||
OpCount[Tag].Offset = (UINT16) (OpCount[Tag].Offset + Len);
|
OpCount[Tag].Offset = (UINT16)(OpCount[Tag].Offset + Len);
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Call back function to DhcpIterateOptions to consolidate each option's
|
Call back function to DhcpIterateOptions to consolidate each option's
|
||||||
data. There are maybe several occurrence of the same option.
|
data. There are maybe several occurrence of the same option.
|
||||||
@ -482,24 +478,24 @@ DhcpGetOptionLen (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
DhcpFillOption (
|
DhcpFillOption (
|
||||||
IN UINT8 Tag,
|
IN UINT8 Tag,
|
||||||
IN UINT8 Len,
|
IN UINT8 Len,
|
||||||
IN UINT8 *Data,
|
IN UINT8 *Data,
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
DHCP_OPTION_CONTEXT *OptContext;
|
DHCP_OPTION_CONTEXT *OptContext;
|
||||||
DHCP_OPTION_COUNT *OptCount;
|
DHCP_OPTION_COUNT *OptCount;
|
||||||
DHCP_OPTION *Options;
|
DHCP_OPTION *Options;
|
||||||
UINT8 *Buf;
|
UINT8 *Buf;
|
||||||
UINT8 Index;
|
UINT8 Index;
|
||||||
|
|
||||||
OptContext = (DHCP_OPTION_CONTEXT *) Context;
|
OptContext = (DHCP_OPTION_CONTEXT *)Context;
|
||||||
|
|
||||||
OptCount = OptContext->OpCount;
|
OptCount = OptContext->OpCount;
|
||||||
Index = OptCount[Tag].Index;
|
Index = OptCount[Tag].Index;
|
||||||
Options = OptContext->Options;
|
Options = OptContext->Options;
|
||||||
Buf = OptContext->Buf;
|
Buf = OptContext->Buf;
|
||||||
|
|
||||||
if (Options[Index].Data == NULL) {
|
if (Options[Index].Data == NULL) {
|
||||||
Options[Index].Tag = Tag;
|
Options[Index].Tag = Tag;
|
||||||
@ -508,12 +504,11 @@ DhcpFillOption (
|
|||||||
|
|
||||||
CopyMem (Buf + OptCount[Tag].Offset, Data, Len);
|
CopyMem (Buf + OptCount[Tag].Offset, Data, Len);
|
||||||
|
|
||||||
OptCount[Tag].Offset = (UINT16) (OptCount[Tag].Offset + Len);
|
OptCount[Tag].Offset = (UINT16)(OptCount[Tag].Offset + Len);
|
||||||
Options[Index].Len = (UINT16) (Options[Index].Len + Len);
|
Options[Index].Len = (UINT16)(Options[Index].Len + Len);
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Parse the options of a DHCP packet. It supports RFC 3396: Encoding
|
Parse the options of a DHCP packet. It supports RFC 3396: Encoding
|
||||||
Long Options in DHCP. That is, it will combine all the option value
|
Long Options in DHCP. That is, it will combine all the option value
|
||||||
@ -544,18 +539,18 @@ DhcpFillOption (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
DhcpParseOption (
|
DhcpParseOption (
|
||||||
IN EFI_DHCP4_PACKET *Packet,
|
IN EFI_DHCP4_PACKET *Packet,
|
||||||
OUT INTN *Count,
|
OUT INTN *Count,
|
||||||
OUT DHCP_OPTION **OptionPoint
|
OUT DHCP_OPTION **OptionPoint
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
DHCP_OPTION_CONTEXT Context;
|
DHCP_OPTION_CONTEXT Context;
|
||||||
DHCP_OPTION *Options;
|
DHCP_OPTION *Options;
|
||||||
DHCP_OPTION_COUNT *OptCount;
|
DHCP_OPTION_COUNT *OptCount;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
UINT16 TotalLen;
|
UINT16 TotalLen;
|
||||||
INTN OptNum;
|
INTN OptNum;
|
||||||
INTN Index;
|
INTN Index;
|
||||||
|
|
||||||
ASSERT ((Count != NULL) && (OptionPoint != NULL));
|
ASSERT ((Count != NULL) && (OptionPoint != NULL));
|
||||||
|
|
||||||
@ -580,22 +575,22 @@ DhcpParseOption (
|
|||||||
// OptCount[Index].Offset specifies the offset into the continuous
|
// OptCount[Index].Offset specifies the offset into the continuous
|
||||||
// option value buffer to put the data.
|
// option value buffer to put the data.
|
||||||
//
|
//
|
||||||
TotalLen = 0;
|
TotalLen = 0;
|
||||||
OptNum = 0;
|
OptNum = 0;
|
||||||
|
|
||||||
for (Index = 0; Index < DHCP_MAX_OPTIONS; Index++) {
|
for (Index = 0; Index < DHCP_MAX_OPTIONS; Index++) {
|
||||||
if (OptCount[Index].Offset != 0) {
|
if (OptCount[Index].Offset != 0) {
|
||||||
OptCount[Index].Index = (UINT8) OptNum;
|
OptCount[Index].Index = (UINT8)OptNum;
|
||||||
|
|
||||||
TotalLen = (UINT16) (TotalLen + OptCount[Index].Offset);
|
TotalLen = (UINT16)(TotalLen + OptCount[Index].Offset);
|
||||||
OptCount[Index].Offset = (UINT16) (TotalLen - OptCount[Index].Offset);
|
OptCount[Index].Offset = (UINT16)(TotalLen - OptCount[Index].Offset);
|
||||||
|
|
||||||
OptNum++;
|
OptNum++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
*Count = OptNum;
|
*Count = OptNum;
|
||||||
*OptionPoint = NULL;
|
*OptionPoint = NULL;
|
||||||
|
|
||||||
if (OptNum == 0) {
|
if (OptNum == 0) {
|
||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
@ -605,7 +600,7 @@ DhcpParseOption (
|
|||||||
// Allocate a buffer to hold the DHCP options, and after that, a
|
// Allocate a buffer to hold the DHCP options, and after that, a
|
||||||
// continuous buffer to put all the options' data.
|
// continuous buffer to put all the options' data.
|
||||||
//
|
//
|
||||||
Options = AllocateZeroPool ((UINTN) (OptNum * sizeof (DHCP_OPTION)) + TotalLen);
|
Options = AllocateZeroPool ((UINTN)(OptNum * sizeof (DHCP_OPTION)) + TotalLen);
|
||||||
|
|
||||||
if (Options == NULL) {
|
if (Options == NULL) {
|
||||||
Status = EFI_OUT_OF_RESOURCES;
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
@ -614,9 +609,9 @@ DhcpParseOption (
|
|||||||
|
|
||||||
Context.OpCount = OptCount;
|
Context.OpCount = OptCount;
|
||||||
Context.Options = Options;
|
Context.Options = Options;
|
||||||
Context.Buf = (UINT8 *) (Options + OptNum);
|
Context.Buf = (UINT8 *)(Options + OptNum);
|
||||||
|
|
||||||
Status = DhcpIterateOptions (Packet, DhcpFillOption, &Context);
|
Status = DhcpIterateOptions (Packet, DhcpFillOption, &Context);
|
||||||
|
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
FreePool (Options);
|
FreePool (Options);
|
||||||
@ -630,7 +625,6 @@ ON_EXIT:
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Validate the packet's options. If necessary, allocate
|
Validate the packet's options. If necessary, allocate
|
||||||
and fill in the interested parameters.
|
and fill in the interested parameters.
|
||||||
@ -645,18 +639,18 @@ ON_EXIT:
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
DhcpValidateOptions (
|
DhcpValidateOptions (
|
||||||
IN EFI_DHCP4_PACKET *Packet,
|
IN EFI_DHCP4_PACKET *Packet,
|
||||||
OUT DHCP_PARAMETER **Para OPTIONAL
|
OUT DHCP_PARAMETER **Para OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
DHCP_PARAMETER Parameter;
|
DHCP_PARAMETER Parameter;
|
||||||
DHCP_OPTION_FORMAT *Format;
|
DHCP_OPTION_FORMAT *Format;
|
||||||
DHCP_OPTION *AllOption;
|
DHCP_OPTION *AllOption;
|
||||||
DHCP_OPTION *Option;
|
DHCP_OPTION *Option;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
BOOLEAN Updated;
|
BOOLEAN Updated;
|
||||||
INTN Count;
|
INTN Count;
|
||||||
INTN Index;
|
INTN Index;
|
||||||
|
|
||||||
if (Para != NULL) {
|
if (Para != NULL) {
|
||||||
*Para = NULL;
|
*Para = NULL;
|
||||||
@ -668,6 +662,7 @@ DhcpValidateOptions (
|
|||||||
if (EFI_ERROR (Status) || (Count == 0)) {
|
if (EFI_ERROR (Status) || (Count == 0)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
ASSERT (AllOption != NULL);
|
ASSERT (AllOption != NULL);
|
||||||
|
|
||||||
Updated = FALSE;
|
Updated = FALSE;
|
||||||
@ -716,8 +711,6 @@ ON_EXIT:
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Append an option to the memory, if the option is longer than
|
Append an option to the memory, if the option is longer than
|
||||||
255 bytes, splits it into several options.
|
255 bytes, splits it into several options.
|
||||||
@ -732,31 +725,30 @@ ON_EXIT:
|
|||||||
**/
|
**/
|
||||||
UINT8 *
|
UINT8 *
|
||||||
DhcpAppendOption (
|
DhcpAppendOption (
|
||||||
OUT UINT8 *Buf,
|
OUT UINT8 *Buf,
|
||||||
IN UINT8 Tag,
|
IN UINT8 Tag,
|
||||||
IN UINT16 DataLen,
|
IN UINT16 DataLen,
|
||||||
IN UINT8 *Data
|
IN UINT8 *Data
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
INTN Index;
|
INTN Index;
|
||||||
INTN Len;
|
INTN Len;
|
||||||
|
|
||||||
ASSERT (DataLen != 0);
|
ASSERT (DataLen != 0);
|
||||||
|
|
||||||
for (Index = 0; Index < (DataLen + 254) / 255; Index++) {
|
for (Index = 0; Index < (DataLen + 254) / 255; Index++) {
|
||||||
Len = MIN (255, DataLen - Index * 255);
|
Len = MIN (255, DataLen - Index * 255);
|
||||||
|
|
||||||
*(Buf++) = Tag;
|
*(Buf++) = Tag;
|
||||||
*(Buf++) = (UINT8) Len;
|
*(Buf++) = (UINT8)Len;
|
||||||
CopyMem (Buf, Data + Index * 255, (UINTN) Len);
|
CopyMem (Buf, Data + Index * 255, (UINTN)Len);
|
||||||
|
|
||||||
Buf += Len;
|
Buf += Len;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Buf;
|
return Buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Build a new DHCP packet from a seed packet. Options may be deleted or
|
Build a new DHCP packet from a seed packet. Options may be deleted or
|
||||||
appended. The caller should free the NewPacket when finished using it.
|
appended. The caller should free the NewPacket when finished using it.
|
||||||
@ -776,22 +768,22 @@ DhcpAppendOption (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
DhcpBuild (
|
DhcpBuild (
|
||||||
IN EFI_DHCP4_PACKET *SeedPacket,
|
IN EFI_DHCP4_PACKET *SeedPacket,
|
||||||
IN UINT32 DeleteCount,
|
IN UINT32 DeleteCount,
|
||||||
IN UINT8 *DeleteList OPTIONAL,
|
IN UINT8 *DeleteList OPTIONAL,
|
||||||
IN UINT32 AppendCount,
|
IN UINT32 AppendCount,
|
||||||
IN EFI_DHCP4_PACKET_OPTION *AppendList[] OPTIONAL,
|
IN EFI_DHCP4_PACKET_OPTION *AppendList[] OPTIONAL,
|
||||||
OUT EFI_DHCP4_PACKET **NewPacket
|
OUT EFI_DHCP4_PACKET **NewPacket
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
DHCP_OPTION *Mark;
|
DHCP_OPTION *Mark;
|
||||||
DHCP_OPTION *SeedOptions;
|
DHCP_OPTION *SeedOptions;
|
||||||
EFI_DHCP4_PACKET *Packet;
|
EFI_DHCP4_PACKET *Packet;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
INTN Count;
|
INTN Count;
|
||||||
UINT32 Index;
|
UINT32 Index;
|
||||||
UINT32 Len;
|
UINT32 Len;
|
||||||
UINT8 *Buf;
|
UINT8 *Buf;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Use an array of DHCP_OPTION to mark the existence
|
// Use an array of DHCP_OPTION to mark the existence
|
||||||
@ -804,7 +796,7 @@ DhcpBuild (
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (Index = 0; Index < DHCP_MAX_OPTIONS; Index++) {
|
for (Index = 0; Index < DHCP_MAX_OPTIONS; Index++) {
|
||||||
Mark[Index].Tag = (UINT8) Index;
|
Mark[Index].Tag = (UINT8)Index;
|
||||||
Mark[Index].Len = 0;
|
Mark[Index].Len = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -820,7 +812,7 @@ DhcpBuild (
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (SeedOptions != NULL) {
|
if (SeedOptions != NULL) {
|
||||||
for (Index = 0; Index < (UINT32) Count; Index++) {
|
for (Index = 0; Index < (UINT32)Count; Index++) {
|
||||||
Mark[SeedOptions[Index].Tag] = SeedOptions[Index];
|
Mark[SeedOptions[Index].Tag] = SeedOptions[Index];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -854,18 +846,18 @@ DhcpBuild (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = EFI_OUT_OF_RESOURCES;
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
Packet = (EFI_DHCP4_PACKET *) AllocatePool (Len);
|
Packet = (EFI_DHCP4_PACKET *)AllocatePool (Len);
|
||||||
|
|
||||||
if (Packet == NULL) {
|
if (Packet == NULL) {
|
||||||
goto ON_ERROR;
|
goto ON_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
Packet->Size = Len;
|
Packet->Size = Len;
|
||||||
Packet->Length = 0;
|
Packet->Length = 0;
|
||||||
CopyMem (&Packet->Dhcp4.Header, &SeedPacket->Dhcp4.Header, sizeof (Packet->Dhcp4.Header));
|
CopyMem (&Packet->Dhcp4.Header, &SeedPacket->Dhcp4.Header, sizeof (Packet->Dhcp4.Header));
|
||||||
Packet->Dhcp4.Magik = DHCP_OPTION_MAGIC;
|
Packet->Dhcp4.Magik = DHCP_OPTION_MAGIC;
|
||||||
Buf = Packet->Dhcp4.Option;
|
Buf = Packet->Dhcp4.Option;
|
||||||
|
|
||||||
for (Index = 0; Index < DHCP_MAX_OPTIONS; Index++) {
|
for (Index = 0; Index < DHCP_MAX_OPTIONS; Index++) {
|
||||||
if (Mark[Index].Len != 0) {
|
if (Mark[Index].Len != 0) {
|
||||||
@ -873,12 +865,12 @@ DhcpBuild (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
*(Buf++) = DHCP4_TAG_EOP;
|
*(Buf++) = DHCP4_TAG_EOP;
|
||||||
Packet->Length = sizeof (EFI_DHCP4_HEADER) + sizeof (UINT32)
|
Packet->Length = sizeof (EFI_DHCP4_HEADER) + sizeof (UINT32)
|
||||||
+ (UINT32) (Buf - Packet->Dhcp4.Option);
|
+ (UINT32)(Buf - Packet->Dhcp4.Option);
|
||||||
|
|
||||||
*NewPacket = Packet;
|
*NewPacket = Packet;
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
|
|
||||||
ON_ERROR:
|
ON_ERROR:
|
||||||
if (SeedOptions != NULL) {
|
if (SeedOptions != NULL) {
|
||||||
|
@ -13,49 +13,48 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
/// DHCP option tags (types)
|
/// DHCP option tags (types)
|
||||||
///
|
///
|
||||||
|
|
||||||
#define DHCP_OPTION_MAGIC 0x63538263 // Network byte order
|
#define DHCP_OPTION_MAGIC 0x63538263 // Network byte order
|
||||||
#define DHCP_MAX_OPTIONS 256
|
#define DHCP_MAX_OPTIONS 256
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// DHCP option types, this is used to validate the DHCP options.
|
// DHCP option types, this is used to validate the DHCP options.
|
||||||
//
|
//
|
||||||
#define DHCP_OPTION_SWITCH 1
|
#define DHCP_OPTION_SWITCH 1
|
||||||
#define DHCP_OPTION_INT8 2
|
#define DHCP_OPTION_INT8 2
|
||||||
#define DHCP_OPTION_INT16 3
|
#define DHCP_OPTION_INT16 3
|
||||||
#define DHCP_OPTION_INT32 4
|
#define DHCP_OPTION_INT32 4
|
||||||
#define DHCP_OPTION_IP 5
|
#define DHCP_OPTION_IP 5
|
||||||
#define DHCP_OPTION_IPPAIR 6
|
#define DHCP_OPTION_IPPAIR 6
|
||||||
|
|
||||||
//
|
//
|
||||||
// Value of DHCP overload option
|
// Value of DHCP overload option
|
||||||
//
|
//
|
||||||
#define DHCP_OVERLOAD_FILENAME 1
|
#define DHCP_OVERLOAD_FILENAME 1
|
||||||
#define DHCP_OVERLOAD_SVRNAME 2
|
#define DHCP_OVERLOAD_SVRNAME 2
|
||||||
#define DHCP_OVERLOAD_BOTH 3
|
#define DHCP_OVERLOAD_BOTH 3
|
||||||
|
|
||||||
///
|
///
|
||||||
/// The DHCP option structure. This structure extends the EFI_DHCP_OPTION
|
/// The DHCP option structure. This structure extends the EFI_DHCP_OPTION
|
||||||
/// structure to support options longer than 255 bytes, such as classless route.
|
/// structure to support options longer than 255 bytes, such as classless route.
|
||||||
///
|
///
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINT8 Tag;
|
UINT8 Tag;
|
||||||
UINT16 Len;
|
UINT16 Len;
|
||||||
UINT8 *Data;
|
UINT8 *Data;
|
||||||
} DHCP_OPTION;
|
} DHCP_OPTION;
|
||||||
|
|
||||||
///
|
///
|
||||||
/// Structures used to parse the DHCP options with RFC3396 support.
|
/// Structures used to parse the DHCP options with RFC3396 support.
|
||||||
///
|
///
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINT8 Index;
|
UINT8 Index;
|
||||||
UINT16 Offset;
|
UINT16 Offset;
|
||||||
} DHCP_OPTION_COUNT;
|
} DHCP_OPTION_COUNT;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
DHCP_OPTION_COUNT *OpCount;
|
DHCP_OPTION_COUNT *OpCount;
|
||||||
DHCP_OPTION *Options;
|
DHCP_OPTION *Options;
|
||||||
UINT8 *Buf;
|
UINT8 *Buf;
|
||||||
} DHCP_OPTION_CONTEXT;
|
} DHCP_OPTION_CONTEXT;
|
||||||
|
|
||||||
///
|
///
|
||||||
@ -64,18 +63,18 @@ typedef struct {
|
|||||||
/// classless route, who can parse the DHCP offer to get them.
|
/// classless route, who can parse the DHCP offer to get them.
|
||||||
///
|
///
|
||||||
typedef struct {
|
typedef struct {
|
||||||
IP4_ADDR NetMask; // DHCP4_TAG_NETMASK
|
IP4_ADDR NetMask; // DHCP4_TAG_NETMASK
|
||||||
IP4_ADDR Router; // DHCP4_TAG_ROUTER, only the first router is used
|
IP4_ADDR Router; // DHCP4_TAG_ROUTER, only the first router is used
|
||||||
|
|
||||||
//
|
//
|
||||||
// DHCP specific options
|
// DHCP specific options
|
||||||
//
|
//
|
||||||
UINT8 DhcpType; // DHCP4_TAG_MSG_TYPE
|
UINT8 DhcpType; // DHCP4_TAG_MSG_TYPE
|
||||||
UINT8 Overload; // DHCP4_TAG_OVERLOAD
|
UINT8 Overload; // DHCP4_TAG_OVERLOAD
|
||||||
IP4_ADDR ServerId; // DHCP4_TAG_SERVER_ID
|
IP4_ADDR ServerId; // DHCP4_TAG_SERVER_ID
|
||||||
UINT32 Lease; // DHCP4_TAG_LEASE
|
UINT32 Lease; // DHCP4_TAG_LEASE
|
||||||
UINT32 T1; // DHCP4_TAG_T1
|
UINT32 T1; // DHCP4_TAG_T1
|
||||||
UINT32 T2; // DHCP4_TAG_T2
|
UINT32 T2; // DHCP4_TAG_T2
|
||||||
} DHCP_PARAMETER;
|
} DHCP_PARAMETER;
|
||||||
|
|
||||||
///
|
///
|
||||||
@ -87,20 +86,20 @@ typedef struct {
|
|||||||
/// inspect the option to parse DHCP_PARAMETER.
|
/// inspect the option to parse DHCP_PARAMETER.
|
||||||
///
|
///
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINT8 Tag;
|
UINT8 Tag;
|
||||||
INTN Type;
|
INTN Type;
|
||||||
INTN MinOccur;
|
INTN MinOccur;
|
||||||
INTN MaxOccur;
|
INTN MaxOccur;
|
||||||
BOOLEAN Alert;
|
BOOLEAN Alert;
|
||||||
} DHCP_OPTION_FORMAT;
|
} DHCP_OPTION_FORMAT;
|
||||||
|
|
||||||
typedef
|
typedef
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
(*DHCP_CHECK_OPTION) (
|
(*DHCP_CHECK_OPTION) (
|
||||||
IN UINT8 Tag,
|
IN UINT8 Tag,
|
||||||
IN UINT8 Len,
|
IN UINT8 Len,
|
||||||
IN UINT8 *Data,
|
IN UINT8 *Data,
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -120,9 +119,9 @@ EFI_STATUS
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
DhcpIterateOptions (
|
DhcpIterateOptions (
|
||||||
IN EFI_DHCP4_PACKET *Packet,
|
IN EFI_DHCP4_PACKET *Packet,
|
||||||
IN DHCP_CHECK_OPTION Check OPTIONAL,
|
IN DHCP_CHECK_OPTION Check OPTIONAL,
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -139,8 +138,8 @@ DhcpIterateOptions (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
DhcpValidateOptions (
|
DhcpValidateOptions (
|
||||||
IN EFI_DHCP4_PACKET *Packet,
|
IN EFI_DHCP4_PACKET *Packet,
|
||||||
OUT DHCP_PARAMETER **Para OPTIONAL
|
OUT DHCP_PARAMETER **Para OPTIONAL
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -173,9 +172,9 @@ DhcpValidateOptions (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
DhcpParseOption (
|
DhcpParseOption (
|
||||||
IN EFI_DHCP4_PACKET *Packet,
|
IN EFI_DHCP4_PACKET *Packet,
|
||||||
OUT INTN *Count,
|
OUT INTN *Count,
|
||||||
OUT DHCP_OPTION **OptionPoint
|
OUT DHCP_OPTION **OptionPoint
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -192,10 +191,10 @@ DhcpParseOption (
|
|||||||
**/
|
**/
|
||||||
UINT8 *
|
UINT8 *
|
||||||
DhcpAppendOption (
|
DhcpAppendOption (
|
||||||
OUT UINT8 *Buf,
|
OUT UINT8 *Buf,
|
||||||
IN UINT8 Tag,
|
IN UINT8 Tag,
|
||||||
IN UINT16 DataLen,
|
IN UINT16 DataLen,
|
||||||
IN UINT8 *Data
|
IN UINT8 *Data
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -217,12 +216,12 @@ DhcpAppendOption (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
DhcpBuild (
|
DhcpBuild (
|
||||||
IN EFI_DHCP4_PACKET *SeedPacket,
|
IN EFI_DHCP4_PACKET *SeedPacket,
|
||||||
IN UINT32 DeleteCount,
|
IN UINT32 DeleteCount,
|
||||||
IN UINT8 *DeleteList OPTIONAL,
|
IN UINT8 *DeleteList OPTIONAL,
|
||||||
IN UINT32 AppendCount,
|
IN UINT32 AppendCount,
|
||||||
IN EFI_DHCP4_PACKET_OPTION *AppendList[] OPTIONAL,
|
IN EFI_DHCP4_PACKET_OPTION *AppendList[] OPTIONAL,
|
||||||
OUT EFI_DHCP4_PACKET **NewPacket
|
OUT EFI_DHCP4_PACKET **NewPacket
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -9,7 +9,6 @@
|
|||||||
|
|
||||||
#include "Dhcp6Impl.h"
|
#include "Dhcp6Impl.h"
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Retrieves a Unicode string that is the user-readable name of the driver.
|
Retrieves a Unicode string that is the user-readable name of the driver.
|
||||||
|
|
||||||
@ -57,7 +56,6 @@ Dhcp6ComponentNameGetDriverName (
|
|||||||
OUT CHAR16 **DriverName
|
OUT CHAR16 **DriverName
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Retrieves a Unicode string that is the user-readable name of the controller
|
Retrieves a Unicode string that is the user-readable name of the controller
|
||||||
that is being managed by a driver.
|
that is being managed by a driver.
|
||||||
@ -129,18 +127,17 @@ Dhcp6ComponentNameGetDriverName (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
Dhcp6ComponentNameGetControllerName (
|
Dhcp6ComponentNameGetControllerName (
|
||||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||||
IN EFI_HANDLE ControllerHandle,
|
IN EFI_HANDLE ControllerHandle,
|
||||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||||
IN CHAR8 *Language,
|
IN CHAR8 *Language,
|
||||||
OUT CHAR16 **ControllerName
|
OUT CHAR16 **ControllerName
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// EFI Component Name Protocol
|
// EFI Component Name Protocol
|
||||||
//
|
//
|
||||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gDhcp6ComponentName = {
|
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gDhcp6ComponentName = {
|
||||||
Dhcp6ComponentNameGetDriverName,
|
Dhcp6ComponentNameGetDriverName,
|
||||||
Dhcp6ComponentNameGetControllerName,
|
Dhcp6ComponentNameGetControllerName,
|
||||||
"eng"
|
"eng"
|
||||||
@ -149,13 +146,13 @@ GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gDhcp6ComponentName
|
|||||||
//
|
//
|
||||||
// EFI Component Name 2 Protocol
|
// EFI Component Name 2 Protocol
|
||||||
//
|
//
|
||||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gDhcp6ComponentName2 = {
|
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gDhcp6ComponentName2 = {
|
||||||
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME) Dhcp6ComponentNameGetDriverName,
|
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME)Dhcp6ComponentNameGetDriverName,
|
||||||
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) Dhcp6ComponentNameGetControllerName,
|
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME)Dhcp6ComponentNameGetControllerName,
|
||||||
"en"
|
"en"
|
||||||
};
|
};
|
||||||
|
|
||||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mDhcp6DriverNameTable[] = {
|
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mDhcp6DriverNameTable[] = {
|
||||||
{
|
{
|
||||||
"eng;en",
|
"eng;en",
|
||||||
L"DHCP6 Protocol Driver"
|
L"DHCP6 Protocol Driver"
|
||||||
@ -166,9 +163,9 @@ GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mDhcp6DriverNameTab
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE *gDhcp6ControllerNameTable = NULL;
|
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE *gDhcp6ControllerNameTable = NULL;
|
||||||
|
|
||||||
CHAR16 *mDhcp6ControllerName[] = {
|
CHAR16 *mDhcp6ControllerName[] = {
|
||||||
L"DHCPv6 (State=0, Init)",
|
L"DHCPv6 (State=0, Init)",
|
||||||
L"DHCPv6 (State=1, Selecting)",
|
L"DHCPv6 (State=1, Selecting)",
|
||||||
L"DHCPv6 (State=2, Requesting)",
|
L"DHCPv6 (State=2, Requesting)",
|
||||||
@ -248,12 +245,12 @@ Dhcp6ComponentNameGetDriverName (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
UpdateName (
|
UpdateName (
|
||||||
IN EFI_DHCP6_PROTOCOL *Dhcp6
|
IN EFI_DHCP6_PROTOCOL *Dhcp6
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_DHCP6_MODE_DATA Dhcp6ModeData;
|
EFI_DHCP6_MODE_DATA Dhcp6ModeData;
|
||||||
CHAR16 *HandleName;
|
CHAR16 *HandleName;
|
||||||
|
|
||||||
if (Dhcp6 == NULL) {
|
if (Dhcp6 == NULL) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
@ -278,12 +275,14 @@ UpdateName (
|
|||||||
if (Dhcp6ModeData.Ia->State > Dhcp6Rebinding) {
|
if (Dhcp6ModeData.Ia->State > Dhcp6Rebinding) {
|
||||||
return EFI_DEVICE_ERROR;
|
return EFI_DEVICE_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
HandleName = mDhcp6ControllerName[Dhcp6ModeData.Ia->State];
|
HandleName = mDhcp6ControllerName[Dhcp6ModeData.Ia->State];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Dhcp6ModeData.Ia != NULL) {
|
if (Dhcp6ModeData.Ia != NULL) {
|
||||||
FreePool (Dhcp6ModeData.Ia);
|
FreePool (Dhcp6ModeData.Ia);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Dhcp6ModeData.ClientId != NULL) {
|
if (Dhcp6ModeData.ClientId != NULL) {
|
||||||
FreePool (Dhcp6ModeData.ClientId);
|
FreePool (Dhcp6ModeData.ClientId);
|
||||||
}
|
}
|
||||||
@ -379,15 +378,15 @@ UpdateName (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
Dhcp6ComponentNameGetControllerName (
|
Dhcp6ComponentNameGetControllerName (
|
||||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||||
IN EFI_HANDLE ControllerHandle,
|
IN EFI_HANDLE ControllerHandle,
|
||||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||||
IN CHAR8 *Language,
|
IN CHAR8 *Language,
|
||||||
OUT CHAR16 **ControllerName
|
OUT CHAR16 **ControllerName
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_DHCP6_PROTOCOL *Dhcp6;
|
EFI_DHCP6_PROTOCOL *Dhcp6;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Only provide names for child handles.
|
// Only provide names for child handles.
|
||||||
@ -439,4 +438,3 @@ Dhcp6ComponentNameGetControllerName (
|
|||||||
(BOOLEAN)(This == &gDhcp6ComponentName)
|
(BOOLEAN)(This == &gDhcp6ComponentName)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10,8 +10,7 @@
|
|||||||
|
|
||||||
#include "Dhcp6Impl.h"
|
#include "Dhcp6Impl.h"
|
||||||
|
|
||||||
|
EFI_DRIVER_BINDING_PROTOCOL gDhcp6DriverBinding = {
|
||||||
EFI_DRIVER_BINDING_PROTOCOL gDhcp6DriverBinding = {
|
|
||||||
Dhcp6DriverBindingSupported,
|
Dhcp6DriverBindingSupported,
|
||||||
Dhcp6DriverBindingStart,
|
Dhcp6DriverBindingStart,
|
||||||
Dhcp6DriverBindingStop,
|
Dhcp6DriverBindingStop,
|
||||||
@ -20,7 +19,7 @@ EFI_DRIVER_BINDING_PROTOCOL gDhcp6DriverBinding = {
|
|||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
EFI_SERVICE_BINDING_PROTOCOL gDhcp6ServiceBindingTemplate = {
|
EFI_SERVICE_BINDING_PROTOCOL gDhcp6ServiceBindingTemplate = {
|
||||||
Dhcp6ServiceBindingCreateChild,
|
Dhcp6ServiceBindingCreateChild,
|
||||||
Dhcp6ServiceBindingDestroyChild
|
Dhcp6ServiceBindingDestroyChild
|
||||||
};
|
};
|
||||||
@ -39,12 +38,12 @@ EFI_SERVICE_BINDING_PROTOCOL gDhcp6ServiceBindingTemplate = {
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
Dhcp6ConfigureUdpIo (
|
Dhcp6ConfigureUdpIo (
|
||||||
IN UDP_IO *UdpIo,
|
IN UDP_IO *UdpIo,
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_UDP6_PROTOCOL *Udp6;
|
EFI_UDP6_PROTOCOL *Udp6;
|
||||||
EFI_UDP6_CONFIG_DATA *Config;
|
EFI_UDP6_CONFIG_DATA *Config;
|
||||||
|
|
||||||
Udp6 = UdpIo->Protocol.Udp6;
|
Udp6 = UdpIo->Protocol.Udp6;
|
||||||
Config = &(UdpIo->Config.Udp6);
|
Config = &(UdpIo->Config.Udp6);
|
||||||
@ -67,13 +66,12 @@ Dhcp6ConfigureUdpIo (
|
|||||||
// will be overridden later. Note that we MUST not limit RemotePort.
|
// will be overridden later. Note that we MUST not limit RemotePort.
|
||||||
// More details, refer to RFC 3315 section 5.2.
|
// More details, refer to RFC 3315 section 5.2.
|
||||||
//
|
//
|
||||||
Config->StationPort = DHCP6_PORT_CLIENT;
|
Config->StationPort = DHCP6_PORT_CLIENT;
|
||||||
Config->RemotePort = 0;
|
Config->RemotePort = 0;
|
||||||
|
|
||||||
return Udp6->Configure (Udp6, Config);;
|
return Udp6->Configure (Udp6, Config);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Destroy the Dhcp6 service. The Dhcp6 service may be partly initialized,
|
Destroy the Dhcp6 service. The Dhcp6 service may be partly initialized,
|
||||||
or partly destroyed. If a resource is destroyed, it is marked as such in
|
or partly destroyed. If a resource is destroyed, it is marked as such in
|
||||||
@ -84,7 +82,7 @@ Dhcp6ConfigureUdpIo (
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
Dhcp6DestroyService (
|
Dhcp6DestroyService (
|
||||||
IN OUT DHCP6_SERVICE *Service
|
IN OUT DHCP6_SERVICE *Service
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
@ -103,7 +101,6 @@ Dhcp6DestroyService (
|
|||||||
FreePool (Service);
|
FreePool (Service);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Create a new Dhcp6 service for the Nic controller.
|
Create a new Dhcp6 service for the Nic controller.
|
||||||
|
|
||||||
@ -119,13 +116,13 @@ Dhcp6DestroyService (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
Dhcp6CreateService (
|
Dhcp6CreateService (
|
||||||
IN EFI_HANDLE Controller,
|
IN EFI_HANDLE Controller,
|
||||||
IN EFI_HANDLE ImageHandle,
|
IN EFI_HANDLE ImageHandle,
|
||||||
OUT DHCP6_SERVICE **Service
|
OUT DHCP6_SERVICE **Service
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
DHCP6_SERVICE *Dhcp6Srv;
|
DHCP6_SERVICE *Dhcp6Srv;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
*Service = NULL;
|
*Service = NULL;
|
||||||
Dhcp6Srv = AllocateZeroPool (sizeof (DHCP6_SERVICE));
|
Dhcp6Srv = AllocateZeroPool (sizeof (DHCP6_SERVICE));
|
||||||
@ -147,10 +144,10 @@ Dhcp6CreateService (
|
|||||||
//
|
//
|
||||||
// Initialize the fields of the new Dhcp6 service.
|
// Initialize the fields of the new Dhcp6 service.
|
||||||
//
|
//
|
||||||
Dhcp6Srv->Signature = DHCP6_SERVICE_SIGNATURE;
|
Dhcp6Srv->Signature = DHCP6_SERVICE_SIGNATURE;
|
||||||
Dhcp6Srv->Controller = Controller;
|
Dhcp6Srv->Controller = Controller;
|
||||||
Dhcp6Srv->Image = ImageHandle;
|
Dhcp6Srv->Image = ImageHandle;
|
||||||
Dhcp6Srv->Xid = (0xffffff & NET_RANDOM (NetRandomInitSeed ()));
|
Dhcp6Srv->Xid = (0xffffff & NET_RANDOM (NetRandomInitSeed ()));
|
||||||
|
|
||||||
CopyMem (
|
CopyMem (
|
||||||
&Dhcp6Srv->ServiceBinding,
|
&Dhcp6Srv->ServiceBinding,
|
||||||
@ -164,7 +161,7 @@ Dhcp6CreateService (
|
|||||||
Status = gBS->HandleProtocol (
|
Status = gBS->HandleProtocol (
|
||||||
Controller,
|
Controller,
|
||||||
&gEfiIp6ConfigProtocolGuid,
|
&gEfiIp6ConfigProtocolGuid,
|
||||||
(VOID **) &Dhcp6Srv->Ip6Cfg
|
(VOID **)&Dhcp6Srv->Ip6Cfg
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
FreePool (Dhcp6Srv);
|
FreePool (Dhcp6Srv);
|
||||||
@ -175,7 +172,7 @@ Dhcp6CreateService (
|
|||||||
// Generate client Duid: If SMBIOS system UUID is located, generate DUID in DUID-UUID format.
|
// Generate client Duid: If SMBIOS system UUID is located, generate DUID in DUID-UUID format.
|
||||||
// Otherwise, in DUID-LLT format.
|
// Otherwise, in DUID-LLT format.
|
||||||
//
|
//
|
||||||
Dhcp6Srv->ClientId = Dhcp6GenerateClientId (Dhcp6Srv->Snp->Mode);
|
Dhcp6Srv->ClientId = Dhcp6GenerateClientId (Dhcp6Srv->Snp->Mode);
|
||||||
|
|
||||||
if (Dhcp6Srv->ClientId == NULL) {
|
if (Dhcp6Srv->ClientId == NULL) {
|
||||||
FreePool (Dhcp6Srv);
|
FreePool (Dhcp6Srv);
|
||||||
@ -206,7 +203,6 @@ Dhcp6CreateService (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Destroy the Dhcp6 instance and recycle the resources.
|
Destroy the Dhcp6 instance and recycle the resources.
|
||||||
|
|
||||||
@ -215,7 +211,7 @@ Dhcp6CreateService (
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
Dhcp6DestroyInstance (
|
Dhcp6DestroyInstance (
|
||||||
IN OUT DHCP6_INSTANCE *Instance
|
IN OUT DHCP6_INSTANCE *Instance
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
//
|
//
|
||||||
@ -239,6 +235,7 @@ Dhcp6DestroyInstance (
|
|||||||
if (Instance->IaCb.Ia->ReplyPacket != NULL) {
|
if (Instance->IaCb.Ia->ReplyPacket != NULL) {
|
||||||
FreePool (Instance->IaCb.Ia->ReplyPacket);
|
FreePool (Instance->IaCb.Ia->ReplyPacket);
|
||||||
}
|
}
|
||||||
|
|
||||||
FreePool (Instance->IaCb.Ia);
|
FreePool (Instance->IaCb.Ia);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -253,7 +250,6 @@ Dhcp6DestroyInstance (
|
|||||||
FreePool (Instance);
|
FreePool (Instance);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Create the Dhcp6 instance and initialize it.
|
Create the Dhcp6 instance and initialize it.
|
||||||
|
|
||||||
@ -266,12 +262,12 @@ Dhcp6DestroyInstance (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
Dhcp6CreateInstance (
|
Dhcp6CreateInstance (
|
||||||
IN DHCP6_SERVICE *Service,
|
IN DHCP6_SERVICE *Service,
|
||||||
OUT DHCP6_INSTANCE **Instance
|
OUT DHCP6_INSTANCE **Instance
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
DHCP6_INSTANCE *Dhcp6Ins;
|
DHCP6_INSTANCE *Dhcp6Ins;
|
||||||
|
|
||||||
*Instance = NULL;
|
*Instance = NULL;
|
||||||
Dhcp6Ins = AllocateZeroPool (sizeof (DHCP6_INSTANCE));
|
Dhcp6Ins = AllocateZeroPool (sizeof (DHCP6_INSTANCE));
|
||||||
@ -283,11 +279,11 @@ Dhcp6CreateInstance (
|
|||||||
//
|
//
|
||||||
// Initialize the fields of the new Dhcp6 instance.
|
// Initialize the fields of the new Dhcp6 instance.
|
||||||
//
|
//
|
||||||
Dhcp6Ins->Signature = DHCP6_INSTANCE_SIGNATURE;
|
Dhcp6Ins->Signature = DHCP6_INSTANCE_SIGNATURE;
|
||||||
Dhcp6Ins->UdpSts = EFI_ALREADY_STARTED;
|
Dhcp6Ins->UdpSts = EFI_ALREADY_STARTED;
|
||||||
Dhcp6Ins->Service = Service;
|
Dhcp6Ins->Service = Service;
|
||||||
Dhcp6Ins->InDestroy = FALSE;
|
Dhcp6Ins->InDestroy = FALSE;
|
||||||
Dhcp6Ins->MediaPresent = TRUE;
|
Dhcp6Ins->MediaPresent = TRUE;
|
||||||
|
|
||||||
CopyMem (
|
CopyMem (
|
||||||
&Dhcp6Ins->Dhcp6,
|
&Dhcp6Ins->Dhcp6,
|
||||||
@ -333,24 +329,23 @@ Dhcp6CreateInstance (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
Dhcp6DestroyChildEntry (
|
Dhcp6DestroyChildEntry (
|
||||||
IN LIST_ENTRY *Entry,
|
IN LIST_ENTRY *Entry,
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
DHCP6_INSTANCE *Instance;
|
DHCP6_INSTANCE *Instance;
|
||||||
EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding;
|
EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding;
|
||||||
|
|
||||||
if (Entry == NULL || Context == NULL) {
|
if ((Entry == NULL) || (Context == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
Instance = NET_LIST_USER_STRUCT_S (Entry, DHCP6_INSTANCE, Link, DHCP6_INSTANCE_SIGNATURE);
|
Instance = NET_LIST_USER_STRUCT_S (Entry, DHCP6_INSTANCE, Link, DHCP6_INSTANCE_SIGNATURE);
|
||||||
ServiceBinding = (EFI_SERVICE_BINDING_PROTOCOL *) Context;
|
ServiceBinding = (EFI_SERVICE_BINDING_PROTOCOL *)Context;
|
||||||
|
|
||||||
return ServiceBinding->DestroyChild (ServiceBinding, Instance->Handle);
|
return ServiceBinding->DestroyChild (ServiceBinding, Instance->Handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Entry point of the DHCP6 driver to install various protocols.
|
Entry point of the DHCP6 driver to install various protocols.
|
||||||
|
|
||||||
@ -364,8 +359,8 @@ Dhcp6DestroyChildEntry (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
Dhcp6DriverEntryPoint (
|
Dhcp6DriverEntryPoint (
|
||||||
IN EFI_HANDLE ImageHandle,
|
IN EFI_HANDLE ImageHandle,
|
||||||
IN EFI_SYSTEM_TABLE *SystemTable
|
IN EFI_SYSTEM_TABLE *SystemTable
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return EfiLibInstallDriverBindingComponentName2 (
|
return EfiLibInstallDriverBindingComponentName2 (
|
||||||
@ -378,7 +373,6 @@ Dhcp6DriverEntryPoint (
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Test to see if this driver supports ControllerHandle. This service
|
Test to see if this driver supports ControllerHandle. This service
|
||||||
is called by the EFI boot service ConnectController(). In
|
is called by the EFI boot service ConnectController(). In
|
||||||
@ -414,7 +408,6 @@ Dhcp6DriverBindingSupported (
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Start this driver on ControllerHandle. This service is called by the
|
Start this driver on ControllerHandle. This service is called by the
|
||||||
EFI boot service ConnectController(). In order to make
|
EFI boot service ConnectController(). In order to make
|
||||||
@ -441,8 +434,8 @@ Dhcp6DriverBindingStart (
|
|||||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
|
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
DHCP6_SERVICE *Service;
|
DHCP6_SERVICE *Service;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Check the Dhcp6 service whether already started.
|
// Check the Dhcp6 service whether already started.
|
||||||
@ -490,7 +483,6 @@ Dhcp6DriverBindingStart (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Stop this driver on ControllerHandle. This service is called by the
|
Stop this driver on ControllerHandle. This service is called by the
|
||||||
EFI boot service DisconnectController(). In order to
|
EFI boot service DisconnectController(). In order to
|
||||||
@ -519,12 +511,12 @@ Dhcp6DriverBindingStop (
|
|||||||
IN EFI_HANDLE *ChildHandleBuffer OPTIONAL
|
IN EFI_HANDLE *ChildHandleBuffer OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_HANDLE NicHandle;
|
EFI_HANDLE NicHandle;
|
||||||
EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding;
|
EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding;
|
||||||
DHCP6_SERVICE *Service;
|
DHCP6_SERVICE *Service;
|
||||||
LIST_ENTRY *List;
|
LIST_ENTRY *List;
|
||||||
UINTN ListLength;
|
UINTN ListLength;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Find and check the Nic handle by the controller handle.
|
// Find and check the Nic handle by the controller handle.
|
||||||
@ -538,7 +530,7 @@ Dhcp6DriverBindingStop (
|
|||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
NicHandle,
|
NicHandle,
|
||||||
&gEfiDhcp6ServiceBindingProtocolGuid,
|
&gEfiDhcp6ServiceBindingProtocolGuid,
|
||||||
(VOID **) &ServiceBinding,
|
(VOID **)&ServiceBinding,
|
||||||
This->DriverBindingHandle,
|
This->DriverBindingHandle,
|
||||||
NicHandle,
|
NicHandle,
|
||||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||||
@ -553,23 +545,23 @@ Dhcp6DriverBindingStop (
|
|||||||
//
|
//
|
||||||
// Destroy all the children instances before destroy the service.
|
// Destroy all the children instances before destroy the service.
|
||||||
//
|
//
|
||||||
List = &Service->Child;
|
List = &Service->Child;
|
||||||
Status = NetDestroyLinkList (
|
Status = NetDestroyLinkList (
|
||||||
List,
|
List,
|
||||||
Dhcp6DestroyChildEntry,
|
Dhcp6DestroyChildEntry,
|
||||||
ServiceBinding,
|
ServiceBinding,
|
||||||
&ListLength
|
&ListLength
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status) || ListLength != 0) {
|
if (EFI_ERROR (Status) || (ListLength != 0)) {
|
||||||
Status = EFI_DEVICE_ERROR;
|
Status = EFI_DEVICE_ERROR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (NumberOfChildren == 0 && !IsListEmpty (&Service->Child)) {
|
if ((NumberOfChildren == 0) && !IsListEmpty (&Service->Child)) {
|
||||||
Status = EFI_DEVICE_ERROR;
|
Status = EFI_DEVICE_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (NumberOfChildren == 0 && IsListEmpty (&Service->Child)) {
|
if ((NumberOfChildren == 0) && IsListEmpty (&Service->Child)) {
|
||||||
//
|
//
|
||||||
// Destroy the service itself if no child instance left.
|
// Destroy the service itself if no child instance left.
|
||||||
//
|
//
|
||||||
@ -590,7 +582,6 @@ ON_EXIT:
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Creates a child handle and installs a protocol.
|
Creates a child handle and installs a protocol.
|
||||||
|
|
||||||
@ -615,19 +606,19 @@ Dhcp6ServiceBindingCreateChild (
|
|||||||
IN OUT EFI_HANDLE *ChildHandle
|
IN OUT EFI_HANDLE *ChildHandle
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
DHCP6_SERVICE *Service;
|
DHCP6_SERVICE *Service;
|
||||||
DHCP6_INSTANCE *Instance;
|
DHCP6_INSTANCE *Instance;
|
||||||
VOID *Udp6;
|
VOID *Udp6;
|
||||||
|
|
||||||
if (This == NULL || ChildHandle == NULL) {
|
if ((This == NULL) || (ChildHandle == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
Service = DHCP6_SERVICE_FROM_THIS (This);
|
Service = DHCP6_SERVICE_FROM_THIS (This);
|
||||||
|
|
||||||
Status = Dhcp6CreateInstance (Service, &Instance);
|
Status = Dhcp6CreateInstance (Service, &Instance);
|
||||||
|
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
@ -670,14 +661,13 @@ Dhcp6ServiceBindingCreateChild (
|
|||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
Service->UdpIo->UdpHandle,
|
Service->UdpIo->UdpHandle,
|
||||||
&gEfiUdp6ProtocolGuid,
|
&gEfiUdp6ProtocolGuid,
|
||||||
(VOID **) &Udp6,
|
(VOID **)&Udp6,
|
||||||
gDhcp6DriverBinding.DriverBindingHandle,
|
gDhcp6DriverBinding.DriverBindingHandle,
|
||||||
Instance->Handle,
|
Instance->Handle,
|
||||||
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
||||||
);
|
);
|
||||||
|
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
|
|
||||||
gBS->UninstallMultipleProtocolInterfaces (
|
gBS->UninstallMultipleProtocolInterfaces (
|
||||||
Instance->Handle,
|
Instance->Handle,
|
||||||
&gEfiDhcp6ProtocolGuid,
|
&gEfiDhcp6ProtocolGuid,
|
||||||
@ -704,7 +694,6 @@ ON_ERROR:
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Destroys a child handle with a protocol installed on it.
|
Destroys a child handle with a protocol installed on it.
|
||||||
|
|
||||||
@ -730,13 +719,13 @@ Dhcp6ServiceBindingDestroyChild (
|
|||||||
IN EFI_HANDLE ChildHandle
|
IN EFI_HANDLE ChildHandle
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
EFI_DHCP6_PROTOCOL *Dhcp6;
|
EFI_DHCP6_PROTOCOL *Dhcp6;
|
||||||
DHCP6_SERVICE *Service;
|
DHCP6_SERVICE *Service;
|
||||||
DHCP6_INSTANCE *Instance;
|
DHCP6_INSTANCE *Instance;
|
||||||
|
|
||||||
if (This == NULL || ChildHandle == NULL) {
|
if ((This == NULL) || (ChildHandle == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -746,7 +735,7 @@ Dhcp6ServiceBindingDestroyChild (
|
|||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
ChildHandle,
|
ChildHandle,
|
||||||
&gEfiDhcp6ProtocolGuid,
|
&gEfiDhcp6ProtocolGuid,
|
||||||
(VOID **) &Dhcp6,
|
(VOID **)&Dhcp6,
|
||||||
gDhcp6DriverBinding.DriverBindingHandle,
|
gDhcp6DriverBinding.DriverBindingHandle,
|
||||||
ChildHandle,
|
ChildHandle,
|
||||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||||
|
@ -13,9 +13,9 @@
|
|||||||
|
|
||||||
#include <Protocol/ServiceBinding.h>
|
#include <Protocol/ServiceBinding.h>
|
||||||
|
|
||||||
extern EFI_COMPONENT_NAME_PROTOCOL gDhcp6ComponentName;
|
extern EFI_COMPONENT_NAME_PROTOCOL gDhcp6ComponentName;
|
||||||
extern EFI_COMPONENT_NAME2_PROTOCOL gDhcp6ComponentName2;
|
extern EFI_COMPONENT_NAME2_PROTOCOL gDhcp6ComponentName2;
|
||||||
extern EFI_UNICODE_STRING_TABLE *gDhcp6ControllerNameTable;
|
extern EFI_UNICODE_STRING_TABLE *gDhcp6ControllerNameTable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Test to see if this driver supports ControllerHandle. This service
|
Test to see if this driver supports ControllerHandle. This service
|
||||||
|
@ -14,9 +14,11 @@
|
|||||||
//
|
//
|
||||||
// ALL_DHCP_Relay_Agents_and_Servers address: FF02::1:2
|
// ALL_DHCP_Relay_Agents_and_Servers address: FF02::1:2
|
||||||
//
|
//
|
||||||
EFI_IPv6_ADDRESS mAllDhcpRelayAndServersAddress = {{0xFF, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2}};
|
EFI_IPv6_ADDRESS mAllDhcpRelayAndServersAddress = {
|
||||||
|
{ 0xFF, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 2 }
|
||||||
|
};
|
||||||
|
|
||||||
EFI_DHCP6_PROTOCOL gDhcp6ProtocolTemplate = {
|
EFI_DHCP6_PROTOCOL gDhcp6ProtocolTemplate = {
|
||||||
EfiDhcp6GetModeData,
|
EfiDhcp6GetModeData,
|
||||||
EfiDhcp6Configure,
|
EfiDhcp6Configure,
|
||||||
EfiDhcp6Start,
|
EfiDhcp6Start,
|
||||||
@ -61,14 +63,14 @@ EFI_DHCP6_PROTOCOL gDhcp6ProtocolTemplate = {
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EfiDhcp6Start (
|
EfiDhcp6Start (
|
||||||
IN EFI_DHCP6_PROTOCOL *This
|
IN EFI_DHCP6_PROTOCOL *This
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
DHCP6_INSTANCE *Instance;
|
DHCP6_INSTANCE *Instance;
|
||||||
DHCP6_SERVICE *Service;
|
DHCP6_SERVICE *Service;
|
||||||
EFI_STATUS MediaStatus;
|
EFI_STATUS MediaStatus;
|
||||||
|
|
||||||
if (This == NULL) {
|
if (This == NULL) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
@ -93,7 +95,7 @@ EfiDhcp6Start (
|
|||||||
return EFI_ALREADY_STARTED;
|
return EFI_ALREADY_STARTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Check Media Status.
|
// Check Media Status.
|
||||||
@ -119,7 +121,7 @@ EfiDhcp6Start (
|
|||||||
//
|
//
|
||||||
// Register receive callback for the stateful exchange process.
|
// Register receive callback for the stateful exchange process.
|
||||||
//
|
//
|
||||||
Status = UdpIoRecvDatagram(
|
Status = UdpIoRecvDatagram (
|
||||||
Service->UdpIo,
|
Service->UdpIo,
|
||||||
Dhcp6ReceivePacket,
|
Dhcp6ReceivePacket,
|
||||||
Service,
|
Service,
|
||||||
@ -136,10 +138,10 @@ EfiDhcp6Start (
|
|||||||
// Poll udp out of the net tpl if synchronous call.
|
// Poll udp out of the net tpl if synchronous call.
|
||||||
//
|
//
|
||||||
if (Instance->Config->IaInfoEvent == NULL) {
|
if (Instance->Config->IaInfoEvent == NULL) {
|
||||||
|
|
||||||
while (Instance->UdpSts == EFI_ALREADY_STARTED) {
|
while (Instance->UdpSts == EFI_ALREADY_STARTED) {
|
||||||
Service->UdpIo->Protocol.Udp6->Poll (Service->UdpIo->Protocol.Udp6);
|
Service->UdpIo->Protocol.Udp6->Poll (Service->UdpIo->Protocol.Udp6);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Instance->UdpSts;
|
return Instance->UdpSts;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -151,7 +153,6 @@ ON_ERROR:
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Stops the DHCPv6 standard S.A.R.R. process.
|
Stops the DHCPv6 standard S.A.R.R. process.
|
||||||
|
|
||||||
@ -170,14 +171,14 @@ ON_ERROR:
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EfiDhcp6Stop (
|
EfiDhcp6Stop (
|
||||||
IN EFI_DHCP6_PROTOCOL *This
|
IN EFI_DHCP6_PROTOCOL *This
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_UDP6_PROTOCOL *Udp6;
|
EFI_UDP6_PROTOCOL *Udp6;
|
||||||
DHCP6_INSTANCE *Instance;
|
DHCP6_INSTANCE *Instance;
|
||||||
DHCP6_SERVICE *Service;
|
DHCP6_SERVICE *Service;
|
||||||
|
|
||||||
if (This == NULL) {
|
if (This == NULL) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
@ -200,10 +201,11 @@ EfiDhcp6Stop (
|
|||||||
//
|
//
|
||||||
// No valid REPLY message received yet, cleanup this instance directly.
|
// No valid REPLY message received yet, cleanup this instance directly.
|
||||||
//
|
//
|
||||||
if (Instance->IaCb.Ia->State == Dhcp6Init ||
|
if ((Instance->IaCb.Ia->State == Dhcp6Init) ||
|
||||||
Instance->IaCb.Ia->State == Dhcp6Selecting ||
|
(Instance->IaCb.Ia->State == Dhcp6Selecting) ||
|
||||||
Instance->IaCb.Ia->State == Dhcp6Requesting
|
(Instance->IaCb.Ia->State == Dhcp6Requesting)
|
||||||
) {
|
)
|
||||||
|
{
|
||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -213,7 +215,7 @@ EfiDhcp6Stop (
|
|||||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
||||||
|
|
||||||
Instance->UdpSts = EFI_ALREADY_STARTED;
|
Instance->UdpSts = EFI_ALREADY_STARTED;
|
||||||
Status = Dhcp6SendReleaseMsg (Instance, Instance->IaCb.Ia);
|
Status = Dhcp6SendReleaseMsg (Instance, Instance->IaCb.Ia);
|
||||||
gBS->RestoreTPL (OldTpl);
|
gBS->RestoreTPL (OldTpl);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
@ -227,6 +229,7 @@ EfiDhcp6Stop (
|
|||||||
while (Instance->UdpSts == EFI_ALREADY_STARTED) {
|
while (Instance->UdpSts == EFI_ALREADY_STARTED) {
|
||||||
Udp6->Poll (Udp6);
|
Udp6->Poll (Udp6);
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = Instance->UdpSts;
|
Status = Instance->UdpSts;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -241,7 +244,6 @@ ON_EXIT:
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Returns the current operating mode data for the Dhcp6 instance.
|
Returns the current operating mode data for the Dhcp6 instance.
|
||||||
|
|
||||||
@ -260,26 +262,26 @@ ON_EXIT:
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EfiDhcp6GetModeData (
|
EfiDhcp6GetModeData (
|
||||||
IN EFI_DHCP6_PROTOCOL *This,
|
IN EFI_DHCP6_PROTOCOL *This,
|
||||||
OUT EFI_DHCP6_MODE_DATA *Dhcp6ModeData OPTIONAL,
|
OUT EFI_DHCP6_MODE_DATA *Dhcp6ModeData OPTIONAL,
|
||||||
OUT EFI_DHCP6_CONFIG_DATA *Dhcp6ConfigData OPTIONAL
|
OUT EFI_DHCP6_CONFIG_DATA *Dhcp6ConfigData OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
EFI_DHCP6_IA *Ia;
|
EFI_DHCP6_IA *Ia;
|
||||||
DHCP6_INSTANCE *Instance;
|
DHCP6_INSTANCE *Instance;
|
||||||
DHCP6_SERVICE *Service;
|
DHCP6_SERVICE *Service;
|
||||||
UINT32 IaSize;
|
UINT32 IaSize;
|
||||||
UINT32 IdSize;
|
UINT32 IdSize;
|
||||||
|
|
||||||
if (This == NULL || (Dhcp6ModeData == NULL && Dhcp6ConfigData == NULL)) {
|
if ((This == NULL) || ((Dhcp6ModeData == NULL) && (Dhcp6ConfigData == NULL))) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
Instance = DHCP6_INSTANCE_FROM_THIS (This);
|
Instance = DHCP6_INSTANCE_FROM_THIS (This);
|
||||||
Service = Instance->Service;
|
Service = Instance->Service;
|
||||||
|
|
||||||
if (Instance->Config == NULL && Dhcp6ConfigData != NULL) {
|
if ((Instance->Config == NULL) && (Dhcp6ConfigData != NULL)) {
|
||||||
return EFI_ACCESS_DENIED;
|
return EFI_ACCESS_DENIED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -291,7 +293,7 @@ EfiDhcp6GetModeData (
|
|||||||
// User needs a copy of instance config data.
|
// User needs a copy of instance config data.
|
||||||
//
|
//
|
||||||
if (Dhcp6ConfigData != NULL) {
|
if (Dhcp6ConfigData != NULL) {
|
||||||
ZeroMem (Dhcp6ConfigData, sizeof(EFI_DHCP6_CONFIG_DATA));
|
ZeroMem (Dhcp6ConfigData, sizeof (EFI_DHCP6_CONFIG_DATA));
|
||||||
//
|
//
|
||||||
// Duplicate config data, including all reference buffers.
|
// Duplicate config data, including all reference buffers.
|
||||||
//
|
//
|
||||||
@ -347,6 +349,7 @@ EfiDhcp6GetModeData (
|
|||||||
if (Dhcp6ModeData->Ia->ReplyPacket == NULL) {
|
if (Dhcp6ModeData->Ia->ReplyPacket == NULL) {
|
||||||
goto ON_ERROR;
|
goto ON_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
CopyMem (
|
CopyMem (
|
||||||
Dhcp6ModeData->Ia->ReplyPacket,
|
Dhcp6ModeData->Ia->ReplyPacket,
|
||||||
Ia->ReplyPacket,
|
Ia->ReplyPacket,
|
||||||
@ -365,15 +368,16 @@ ON_ERROR:
|
|||||||
if (Dhcp6ConfigData != NULL) {
|
if (Dhcp6ConfigData != NULL) {
|
||||||
Dhcp6CleanupConfigData (Dhcp6ConfigData);
|
Dhcp6CleanupConfigData (Dhcp6ConfigData);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Dhcp6ModeData != NULL) {
|
if (Dhcp6ModeData != NULL) {
|
||||||
Dhcp6CleanupModeData (Dhcp6ModeData);
|
Dhcp6CleanupModeData (Dhcp6ModeData);
|
||||||
}
|
}
|
||||||
|
|
||||||
gBS->RestoreTPL (OldTpl);
|
gBS->RestoreTPL (OldTpl);
|
||||||
|
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Initializes, changes, or resets the operational settings for the Dhcp6 instance.
|
Initializes, changes, or resets the operational settings for the Dhcp6 instance.
|
||||||
|
|
||||||
@ -405,17 +409,17 @@ ON_ERROR:
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EfiDhcp6Configure (
|
EfiDhcp6Configure (
|
||||||
IN EFI_DHCP6_PROTOCOL *This,
|
IN EFI_DHCP6_PROTOCOL *This,
|
||||||
IN EFI_DHCP6_CONFIG_DATA *Dhcp6CfgData OPTIONAL
|
IN EFI_DHCP6_CONFIG_DATA *Dhcp6CfgData OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
LIST_ENTRY *Entry;
|
LIST_ENTRY *Entry;
|
||||||
DHCP6_INSTANCE *Other;
|
DHCP6_INSTANCE *Other;
|
||||||
DHCP6_INSTANCE *Instance;
|
DHCP6_INSTANCE *Instance;
|
||||||
DHCP6_SERVICE *Service;
|
DHCP6_SERVICE *Service;
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
|
|
||||||
if (This == NULL) {
|
if (This == NULL) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
@ -428,36 +432,40 @@ EfiDhcp6Configure (
|
|||||||
// Check the parameter of configure data.
|
// Check the parameter of configure data.
|
||||||
//
|
//
|
||||||
if (Dhcp6CfgData != NULL) {
|
if (Dhcp6CfgData != NULL) {
|
||||||
if (Dhcp6CfgData->OptionCount > 0 && Dhcp6CfgData->OptionList == NULL) {
|
if ((Dhcp6CfgData->OptionCount > 0) && (Dhcp6CfgData->OptionList == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Dhcp6CfgData->OptionList != NULL) {
|
if (Dhcp6CfgData->OptionList != NULL) {
|
||||||
for (Index = 0; Index < Dhcp6CfgData->OptionCount; Index++) {
|
for (Index = 0; Index < Dhcp6CfgData->OptionCount; Index++) {
|
||||||
if (Dhcp6CfgData->OptionList[Index]->OpCode == Dhcp6OptClientId ||
|
if ((Dhcp6CfgData->OptionList[Index]->OpCode == Dhcp6OptClientId) ||
|
||||||
Dhcp6CfgData->OptionList[Index]->OpCode == Dhcp6OptRapidCommit ||
|
(Dhcp6CfgData->OptionList[Index]->OpCode == Dhcp6OptRapidCommit) ||
|
||||||
Dhcp6CfgData->OptionList[Index]->OpCode == Dhcp6OptReconfigureAccept ||
|
(Dhcp6CfgData->OptionList[Index]->OpCode == Dhcp6OptReconfigureAccept) ||
|
||||||
Dhcp6CfgData->OptionList[Index]->OpCode == Dhcp6OptIana ||
|
(Dhcp6CfgData->OptionList[Index]->OpCode == Dhcp6OptIana) ||
|
||||||
Dhcp6CfgData->OptionList[Index]->OpCode == Dhcp6OptIata
|
(Dhcp6CfgData->OptionList[Index]->OpCode == Dhcp6OptIata)
|
||||||
) {
|
)
|
||||||
|
{
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Dhcp6CfgData->IaDescriptor.Type != EFI_DHCP6_IA_TYPE_NA &&
|
if ((Dhcp6CfgData->IaDescriptor.Type != EFI_DHCP6_IA_TYPE_NA) &&
|
||||||
Dhcp6CfgData->IaDescriptor.Type != EFI_DHCP6_IA_TYPE_TA
|
(Dhcp6CfgData->IaDescriptor.Type != EFI_DHCP6_IA_TYPE_TA)
|
||||||
) {
|
)
|
||||||
|
{
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Dhcp6CfgData->IaInfoEvent == NULL && Dhcp6CfgData->SolicitRetransmission == NULL) {
|
if ((Dhcp6CfgData->IaInfoEvent == NULL) && (Dhcp6CfgData->SolicitRetransmission == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Dhcp6CfgData->SolicitRetransmission != NULL &&
|
if ((Dhcp6CfgData->SolicitRetransmission != NULL) &&
|
||||||
Dhcp6CfgData->SolicitRetransmission->Mrc == 0 &&
|
(Dhcp6CfgData->SolicitRetransmission->Mrc == 0) &&
|
||||||
Dhcp6CfgData->SolicitRetransmission->Mrd == 0
|
(Dhcp6CfgData->SolicitRetransmission->Mrd == 0)
|
||||||
) {
|
)
|
||||||
|
{
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -466,10 +474,11 @@ EfiDhcp6Configure (
|
|||||||
//
|
//
|
||||||
NET_LIST_FOR_EACH (Entry, &Service->Child) {
|
NET_LIST_FOR_EACH (Entry, &Service->Child) {
|
||||||
Other = NET_LIST_USER_STRUCT (Entry, DHCP6_INSTANCE, Link);
|
Other = NET_LIST_USER_STRUCT (Entry, DHCP6_INSTANCE, Link);
|
||||||
if (Other->IaCb.Ia != NULL &&
|
if ((Other->IaCb.Ia != NULL) &&
|
||||||
Other->IaCb.Ia->Descriptor.Type == Dhcp6CfgData->IaDescriptor.Type &&
|
(Other->IaCb.Ia->Descriptor.Type == Dhcp6CfgData->IaDescriptor.Type) &&
|
||||||
Other->IaCb.Ia->Descriptor.IaId == Dhcp6CfgData->IaDescriptor.IaId
|
(Other->IaCb.Ia->Descriptor.IaId == Dhcp6CfgData->IaDescriptor.IaId)
|
||||||
) {
|
)
|
||||||
|
{
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -496,7 +505,7 @@ EfiDhcp6Configure (
|
|||||||
}
|
}
|
||||||
|
|
||||||
Status = Dhcp6CopyConfigData (Instance->Config, Dhcp6CfgData);
|
Status = Dhcp6CopyConfigData (Instance->Config, Dhcp6CfgData);
|
||||||
if (EFI_ERROR(Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
FreePool (Instance->Config);
|
FreePool (Instance->Config);
|
||||||
gBS->RestoreTPL (OldTpl);
|
gBS->RestoreTPL (OldTpl);
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
@ -506,21 +515,20 @@ EfiDhcp6Configure (
|
|||||||
// Initialize the Ia descriptor from the config data, and leave the other
|
// Initialize the Ia descriptor from the config data, and leave the other
|
||||||
// fields of the Ia as default value 0.
|
// fields of the Ia as default value 0.
|
||||||
//
|
//
|
||||||
Instance->IaCb.Ia = AllocateZeroPool (sizeof(EFI_DHCP6_IA));
|
Instance->IaCb.Ia = AllocateZeroPool (sizeof (EFI_DHCP6_IA));
|
||||||
if (Instance->IaCb.Ia == NULL) {
|
if (Instance->IaCb.Ia == NULL) {
|
||||||
Dhcp6CleanupConfigData (Instance->Config);
|
Dhcp6CleanupConfigData (Instance->Config);
|
||||||
FreePool (Instance->Config);
|
FreePool (Instance->Config);
|
||||||
gBS->RestoreTPL (OldTpl);
|
gBS->RestoreTPL (OldTpl);
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
CopyMem (
|
CopyMem (
|
||||||
&Instance->IaCb.Ia->Descriptor,
|
&Instance->IaCb.Ia->Descriptor,
|
||||||
&Dhcp6CfgData->IaDescriptor,
|
&Dhcp6CfgData->IaDescriptor,
|
||||||
sizeof(EFI_DHCP6_IA_DESCRIPTOR)
|
sizeof (EFI_DHCP6_IA_DESCRIPTOR)
|
||||||
);
|
);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
if (Instance->Config == NULL) {
|
if (Instance->Config == NULL) {
|
||||||
ASSERT (Instance->IaCb.Ia == NULL);
|
ASSERT (Instance->IaCb.Ia == NULL);
|
||||||
gBS->RestoreTPL (OldTpl);
|
gBS->RestoreTPL (OldTpl);
|
||||||
@ -548,7 +556,6 @@ EfiDhcp6Configure (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Request configuration information without the assignment of any
|
Request configuration information without the assignment of any
|
||||||
Ia addresses of the client.
|
Ia addresses of the client.
|
||||||
@ -604,29 +611,29 @@ EfiDhcp6InfoRequest (
|
|||||||
IN VOID *CallbackContext OPTIONAL
|
IN VOID *CallbackContext OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
DHCP6_INSTANCE *Instance;
|
DHCP6_INSTANCE *Instance;
|
||||||
DHCP6_SERVICE *Service;
|
DHCP6_SERVICE *Service;
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
EFI_EVENT Timer;
|
EFI_EVENT Timer;
|
||||||
EFI_STATUS TimerStatus;
|
EFI_STATUS TimerStatus;
|
||||||
UINTN GetMappingTimeOut;
|
UINTN GetMappingTimeOut;
|
||||||
|
|
||||||
if (This == NULL || OptionRequest == NULL || Retransmission == NULL || ReplyCallback == NULL) {
|
if ((This == NULL) || (OptionRequest == NULL) || (Retransmission == NULL) || (ReplyCallback == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Retransmission != NULL && Retransmission->Mrc == 0 && Retransmission->Mrd == 0) {
|
if ((Retransmission != NULL) && (Retransmission->Mrc == 0) && (Retransmission->Mrd == 0)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (OptionCount > 0 && OptionList == NULL) {
|
if ((OptionCount > 0) && (OptionList == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (OptionList != NULL) {
|
if (OptionList != NULL) {
|
||||||
for (Index = 0; Index < OptionCount; Index++) {
|
for (Index = 0; Index < OptionCount; Index++) {
|
||||||
if (OptionList[Index]->OpCode == Dhcp6OptClientId || OptionList[Index]->OpCode == Dhcp6OptRequestOption) {
|
if ((OptionList[Index]->OpCode == Dhcp6OptClientId) || (OptionList[Index]->OpCode == Dhcp6OptRequestOption)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -651,8 +658,8 @@ EfiDhcp6InfoRequest (
|
|||||||
// The link local address is not ready, wait for some time and restart
|
// The link local address is not ready, wait for some time and restart
|
||||||
// the DHCP6 information request process.
|
// the DHCP6 information request process.
|
||||||
//
|
//
|
||||||
Status = Dhcp6GetMappingTimeOut(Service->Ip6Cfg, &GetMappingTimeOut);
|
Status = Dhcp6GetMappingTimeOut (Service->Ip6Cfg, &GetMappingTimeOut);
|
||||||
if (EFI_ERROR(Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -689,6 +696,7 @@ EfiDhcp6InfoRequest (
|
|||||||
|
|
||||||
gBS->CloseEvent (Timer);
|
gBS->CloseEvent (Timer);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
@ -697,17 +705,16 @@ EfiDhcp6InfoRequest (
|
|||||||
// Poll udp out of the net tpl if synchronous call.
|
// Poll udp out of the net tpl if synchronous call.
|
||||||
//
|
//
|
||||||
if (TimeoutEvent == NULL) {
|
if (TimeoutEvent == NULL) {
|
||||||
|
|
||||||
while (Instance->UdpSts == EFI_ALREADY_STARTED) {
|
while (Instance->UdpSts == EFI_ALREADY_STARTED) {
|
||||||
Service->UdpIo->Protocol.Udp6->Poll (Service->UdpIo->Protocol.Udp6);
|
Service->UdpIo->Protocol.Udp6->Poll (Service->UdpIo->Protocol.Udp6);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Instance->UdpSts;
|
return Instance->UdpSts;
|
||||||
}
|
}
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Manually extend the valid and preferred lifetimes for the IPv6 addresses
|
Manually extend the valid and preferred lifetimes for the IPv6 addresses
|
||||||
of the configured IA and update other configuration parameters by sending a
|
of the configured IA and update other configuration parameters by sending a
|
||||||
@ -756,14 +763,14 @@ EfiDhcp6InfoRequest (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EfiDhcp6RenewRebind (
|
EfiDhcp6RenewRebind (
|
||||||
IN EFI_DHCP6_PROTOCOL *This,
|
IN EFI_DHCP6_PROTOCOL *This,
|
||||||
IN BOOLEAN RebindRequest
|
IN BOOLEAN RebindRequest
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
DHCP6_INSTANCE *Instance;
|
DHCP6_INSTANCE *Instance;
|
||||||
DHCP6_SERVICE *Service;
|
DHCP6_SERVICE *Service;
|
||||||
|
|
||||||
if (This == NULL) {
|
if (This == NULL) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
@ -784,9 +791,10 @@ EfiDhcp6RenewRebind (
|
|||||||
//
|
//
|
||||||
// The instance has already entered renewing or rebinding state.
|
// The instance has already entered renewing or rebinding state.
|
||||||
//
|
//
|
||||||
if ((Instance->IaCb.Ia->State == Dhcp6Rebinding && RebindRequest) ||
|
if (((Instance->IaCb.Ia->State == Dhcp6Rebinding) && RebindRequest) ||
|
||||||
(Instance->IaCb.Ia->State == Dhcp6Renewing && !RebindRequest)
|
((Instance->IaCb.Ia->State == Dhcp6Renewing) && !RebindRequest)
|
||||||
) {
|
)
|
||||||
|
{
|
||||||
return EFI_ALREADY_STARTED;
|
return EFI_ALREADY_STARTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -809,7 +817,7 @@ EfiDhcp6RenewRebind (
|
|||||||
//
|
//
|
||||||
// Register receive callback for the stateful exchange process.
|
// Register receive callback for the stateful exchange process.
|
||||||
//
|
//
|
||||||
Status = UdpIoRecvDatagram(
|
Status = UdpIoRecvDatagram (
|
||||||
Service->UdpIo,
|
Service->UdpIo,
|
||||||
Dhcp6ReceivePacket,
|
Dhcp6ReceivePacket,
|
||||||
Service,
|
Service,
|
||||||
@ -826,10 +834,10 @@ EfiDhcp6RenewRebind (
|
|||||||
// Poll udp out of the net tpl if synchronous call.
|
// Poll udp out of the net tpl if synchronous call.
|
||||||
//
|
//
|
||||||
if (Instance->Config->IaInfoEvent == NULL) {
|
if (Instance->Config->IaInfoEvent == NULL) {
|
||||||
|
|
||||||
while (Instance->UdpSts == EFI_ALREADY_STARTED) {
|
while (Instance->UdpSts == EFI_ALREADY_STARTED) {
|
||||||
Service->UdpIo->Protocol.Udp6->Poll (Service->UdpIo->Protocol.Udp6);
|
Service->UdpIo->Protocol.Udp6->Poll (Service->UdpIo->Protocol.Udp6);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Instance->UdpSts;
|
return Instance->UdpSts;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -841,7 +849,6 @@ ON_ERROR:
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Inform that one or more addresses assigned by a server are already
|
Inform that one or more addresses assigned by a server are already
|
||||||
in use by another node.
|
in use by another node.
|
||||||
@ -877,18 +884,18 @@ ON_ERROR:
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EfiDhcp6Decline (
|
EfiDhcp6Decline (
|
||||||
IN EFI_DHCP6_PROTOCOL *This,
|
IN EFI_DHCP6_PROTOCOL *This,
|
||||||
IN UINT32 AddressCount,
|
IN UINT32 AddressCount,
|
||||||
IN EFI_IPv6_ADDRESS *Addresses
|
IN EFI_IPv6_ADDRESS *Addresses
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
EFI_DHCP6_IA *DecIa;
|
EFI_DHCP6_IA *DecIa;
|
||||||
DHCP6_INSTANCE *Instance;
|
DHCP6_INSTANCE *Instance;
|
||||||
DHCP6_SERVICE *Service;
|
DHCP6_SERVICE *Service;
|
||||||
|
|
||||||
if (This == NULL || AddressCount == 0 || Addresses == NULL) {
|
if ((This == NULL) || (AddressCount == 0) || (Addresses == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -913,7 +920,7 @@ EfiDhcp6Decline (
|
|||||||
//
|
//
|
||||||
Status = Dhcp6CheckAddress (Instance->IaCb.Ia, AddressCount, Addresses);
|
Status = Dhcp6CheckAddress (Instance->IaCb.Ia, AddressCount, Addresses);
|
||||||
|
|
||||||
if (EFI_ERROR(Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -943,7 +950,7 @@ EfiDhcp6Decline (
|
|||||||
//
|
//
|
||||||
// Register receive callback for the stateful exchange process.
|
// Register receive callback for the stateful exchange process.
|
||||||
//
|
//
|
||||||
Status = UdpIoRecvDatagram(
|
Status = UdpIoRecvDatagram (
|
||||||
Service->UdpIo,
|
Service->UdpIo,
|
||||||
Dhcp6ReceivePacket,
|
Dhcp6ReceivePacket,
|
||||||
Service,
|
Service,
|
||||||
@ -961,10 +968,10 @@ EfiDhcp6Decline (
|
|||||||
// Poll udp out of the net tpl if synchronous call.
|
// Poll udp out of the net tpl if synchronous call.
|
||||||
//
|
//
|
||||||
if (Instance->Config->IaInfoEvent == NULL) {
|
if (Instance->Config->IaInfoEvent == NULL) {
|
||||||
|
|
||||||
while (Instance->UdpSts == EFI_ALREADY_STARTED) {
|
while (Instance->UdpSts == EFI_ALREADY_STARTED) {
|
||||||
Service->UdpIo->Protocol.Udp6->Poll (Service->UdpIo->Protocol.Udp6);
|
Service->UdpIo->Protocol.Udp6->Poll (Service->UdpIo->Protocol.Udp6);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Instance->UdpSts;
|
return Instance->UdpSts;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -975,12 +982,12 @@ ON_ERROR:
|
|||||||
if (DecIa != NULL) {
|
if (DecIa != NULL) {
|
||||||
FreePool (DecIa);
|
FreePool (DecIa);
|
||||||
}
|
}
|
||||||
|
|
||||||
gBS->RestoreTPL (OldTpl);
|
gBS->RestoreTPL (OldTpl);
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Release one or more addresses associated with the configured Ia
|
Release one or more addresses associated with the configured Ia
|
||||||
for current instance.
|
for current instance.
|
||||||
@ -1018,18 +1025,18 @@ ON_ERROR:
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EfiDhcp6Release (
|
EfiDhcp6Release (
|
||||||
IN EFI_DHCP6_PROTOCOL *This,
|
IN EFI_DHCP6_PROTOCOL *This,
|
||||||
IN UINT32 AddressCount,
|
IN UINT32 AddressCount,
|
||||||
IN EFI_IPv6_ADDRESS *Addresses
|
IN EFI_IPv6_ADDRESS *Addresses
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
EFI_DHCP6_IA *RelIa;
|
EFI_DHCP6_IA *RelIa;
|
||||||
DHCP6_INSTANCE *Instance;
|
DHCP6_INSTANCE *Instance;
|
||||||
DHCP6_SERVICE *Service;
|
DHCP6_SERVICE *Service;
|
||||||
|
|
||||||
if (This == NULL || (AddressCount != 0 && Addresses == NULL)) {
|
if ((This == NULL) || ((AddressCount != 0) && (Addresses == NULL))) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1054,7 +1061,7 @@ EfiDhcp6Release (
|
|||||||
//
|
//
|
||||||
Status = Dhcp6CheckAddress (Instance->IaCb.Ia, AddressCount, Addresses);
|
Status = Dhcp6CheckAddress (Instance->IaCb.Ia, AddressCount, Addresses);
|
||||||
|
|
||||||
if (EFI_ERROR(Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1084,7 +1091,7 @@ EfiDhcp6Release (
|
|||||||
//
|
//
|
||||||
// Register receive callback for the stateful exchange process.
|
// Register receive callback for the stateful exchange process.
|
||||||
//
|
//
|
||||||
Status = UdpIoRecvDatagram(
|
Status = UdpIoRecvDatagram (
|
||||||
Service->UdpIo,
|
Service->UdpIo,
|
||||||
Dhcp6ReceivePacket,
|
Dhcp6ReceivePacket,
|
||||||
Service,
|
Service,
|
||||||
@ -1105,6 +1112,7 @@ EfiDhcp6Release (
|
|||||||
while (Instance->UdpSts == EFI_ALREADY_STARTED) {
|
while (Instance->UdpSts == EFI_ALREADY_STARTED) {
|
||||||
Service->UdpIo->Protocol.Udp6->Poll (Service->UdpIo->Protocol.Udp6);
|
Service->UdpIo->Protocol.Udp6->Poll (Service->UdpIo->Protocol.Udp6);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Instance->UdpSts;
|
return Instance->UdpSts;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1115,12 +1123,12 @@ ON_ERROR:
|
|||||||
if (RelIa != NULL) {
|
if (RelIa != NULL) {
|
||||||
FreePool (RelIa);
|
FreePool (RelIa);
|
||||||
}
|
}
|
||||||
|
|
||||||
gBS->RestoreTPL (OldTpl);
|
gBS->RestoreTPL (OldTpl);
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Parse the option data in the Dhcp6 packet.
|
Parse the option data in the Dhcp6 packet.
|
||||||
|
|
||||||
@ -1146,21 +1154,21 @@ EfiDhcp6Parse (
|
|||||||
OUT EFI_DHCP6_PACKET_OPTION *PacketOptionList[] OPTIONAL
|
OUT EFI_DHCP6_PACKET_OPTION *PacketOptionList[] OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINT32 OptCnt;
|
UINT32 OptCnt;
|
||||||
UINT32 OptLen;
|
UINT32 OptLen;
|
||||||
UINT16 DataLen;
|
UINT16 DataLen;
|
||||||
UINT8 *Start;
|
UINT8 *Start;
|
||||||
UINT8 *End;
|
UINT8 *End;
|
||||||
|
|
||||||
if (This == NULL || Packet == NULL || OptionCount == NULL) {
|
if ((This == NULL) || (Packet == NULL) || (OptionCount == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (*OptionCount != 0 && PacketOptionList == NULL) {
|
if ((*OptionCount != 0) && (PacketOptionList == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Packet->Length > Packet->Size || Packet->Length < sizeof (EFI_DHCP6_HEADER)) {
|
if ((Packet->Length > Packet->Size) || (Packet->Length < sizeof (EFI_DHCP6_HEADER))) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1185,7 +1193,7 @@ EfiDhcp6Parse (
|
|||||||
// Calculate the number of option in the packet.
|
// Calculate the number of option in the packet.
|
||||||
//
|
//
|
||||||
while (Start < End) {
|
while (Start < End) {
|
||||||
DataLen = ((EFI_DHCP6_PACKET_OPTION *) Start)->OpLen;
|
DataLen = ((EFI_DHCP6_PACKET_OPTION *)Start)->OpLen;
|
||||||
Start += (NTOHS (DataLen) + 4);
|
Start += (NTOHS (DataLen) + 4);
|
||||||
OptCnt++;
|
OptCnt++;
|
||||||
}
|
}
|
||||||
@ -1208,13 +1216,11 @@ EfiDhcp6Parse (
|
|||||||
Start = Packet->Dhcp6.Option;
|
Start = Packet->Dhcp6.Option;
|
||||||
|
|
||||||
while (Start < End) {
|
while (Start < End) {
|
||||||
|
PacketOptionList[OptCnt] = (EFI_DHCP6_PACKET_OPTION *)Start;
|
||||||
PacketOptionList[OptCnt] = (EFI_DHCP6_PACKET_OPTION *) Start;
|
DataLen = ((EFI_DHCP6_PACKET_OPTION *)Start)->OpLen;
|
||||||
DataLen = ((EFI_DHCP6_PACKET_OPTION *) Start)->OpLen;
|
Start += (NTOHS (DataLen) + 4);
|
||||||
Start += (NTOHS (DataLen) + 4);
|
|
||||||
OptCnt++;
|
OptCnt++;
|
||||||
}
|
}
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10,7 +10,6 @@
|
|||||||
#ifndef __EFI_DHCP6_IMPL_H__
|
#ifndef __EFI_DHCP6_IMPL_H__
|
||||||
#define __EFI_DHCP6_IMPL_H__
|
#define __EFI_DHCP6_IMPL_H__
|
||||||
|
|
||||||
|
|
||||||
#include <Uefi.h>
|
#include <Uefi.h>
|
||||||
|
|
||||||
#include <IndustryStandard/Dhcp.h>
|
#include <IndustryStandard/Dhcp.h>
|
||||||
@ -33,12 +32,11 @@
|
|||||||
#include <Library/PrintLib.h>
|
#include <Library/PrintLib.h>
|
||||||
#include <Guid/ZeroGuid.h>
|
#include <Guid/ZeroGuid.h>
|
||||||
|
|
||||||
|
typedef struct _DHCP6_IA_CB DHCP6_IA_CB;
|
||||||
typedef struct _DHCP6_IA_CB DHCP6_IA_CB;
|
typedef struct _DHCP6_INF_CB DHCP6_INF_CB;
|
||||||
typedef struct _DHCP6_INF_CB DHCP6_INF_CB;
|
typedef struct _DHCP6_TX_CB DHCP6_TX_CB;
|
||||||
typedef struct _DHCP6_TX_CB DHCP6_TX_CB;
|
typedef struct _DHCP6_SERVICE DHCP6_SERVICE;
|
||||||
typedef struct _DHCP6_SERVICE DHCP6_SERVICE;
|
typedef struct _DHCP6_INSTANCE DHCP6_INSTANCE;
|
||||||
typedef struct _DHCP6_INSTANCE DHCP6_INSTANCE;
|
|
||||||
|
|
||||||
#include "Dhcp6Utility.h"
|
#include "Dhcp6Utility.h"
|
||||||
#include "Dhcp6Io.h"
|
#include "Dhcp6Io.h"
|
||||||
@ -47,104 +45,104 @@ typedef struct _DHCP6_INSTANCE DHCP6_INSTANCE;
|
|||||||
#define DHCP6_SERVICE_SIGNATURE SIGNATURE_32 ('D', 'H', '6', 'S')
|
#define DHCP6_SERVICE_SIGNATURE SIGNATURE_32 ('D', 'H', '6', 'S')
|
||||||
#define DHCP6_INSTANCE_SIGNATURE SIGNATURE_32 ('D', 'H', '6', 'I')
|
#define DHCP6_INSTANCE_SIGNATURE SIGNATURE_32 ('D', 'H', '6', 'I')
|
||||||
|
|
||||||
#define DHCP6_PACKET_ALL 0
|
#define DHCP6_PACKET_ALL 0
|
||||||
#define DHCP6_PACKET_STATEFUL 1
|
#define DHCP6_PACKET_STATEFUL 1
|
||||||
#define DHCP6_PACKET_STATELESS 2
|
#define DHCP6_PACKET_STATELESS 2
|
||||||
|
|
||||||
#define DHCP6_BASE_PACKET_SIZE 1024
|
#define DHCP6_BASE_PACKET_SIZE 1024
|
||||||
|
|
||||||
#define DHCP6_PORT_CLIENT 546
|
#define DHCP6_PORT_CLIENT 546
|
||||||
#define DHCP6_PORT_SERVER 547
|
#define DHCP6_PORT_SERVER 547
|
||||||
|
|
||||||
#define DHCP_CHECK_MEDIA_WAITING_TIME EFI_TIMER_PERIOD_SECONDS(20)
|
#define DHCP_CHECK_MEDIA_WAITING_TIME EFI_TIMER_PERIOD_SECONDS(20)
|
||||||
|
|
||||||
#define DHCP6_INSTANCE_FROM_THIS(Instance) CR ((Instance), DHCP6_INSTANCE, Dhcp6, DHCP6_INSTANCE_SIGNATURE)
|
#define DHCP6_INSTANCE_FROM_THIS(Instance) CR ((Instance), DHCP6_INSTANCE, Dhcp6, DHCP6_INSTANCE_SIGNATURE)
|
||||||
#define DHCP6_SERVICE_FROM_THIS(Service) CR ((Service), DHCP6_SERVICE, ServiceBinding, DHCP6_SERVICE_SIGNATURE)
|
#define DHCP6_SERVICE_FROM_THIS(Service) CR ((Service), DHCP6_SERVICE, ServiceBinding, DHCP6_SERVICE_SIGNATURE)
|
||||||
|
|
||||||
extern EFI_IPv6_ADDRESS mAllDhcpRelayAndServersAddress;
|
extern EFI_IPv6_ADDRESS mAllDhcpRelayAndServersAddress;
|
||||||
extern EFI_DHCP6_PROTOCOL gDhcp6ProtocolTemplate;
|
extern EFI_DHCP6_PROTOCOL gDhcp6ProtocolTemplate;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Control block for each IA.
|
// Control block for each IA.
|
||||||
//
|
//
|
||||||
struct _DHCP6_IA_CB {
|
struct _DHCP6_IA_CB {
|
||||||
EFI_DHCP6_IA *Ia;
|
EFI_DHCP6_IA *Ia;
|
||||||
UINT32 T1;
|
UINT32 T1;
|
||||||
UINT32 T2;
|
UINT32 T2;
|
||||||
UINT32 AllExpireTime;
|
UINT32 AllExpireTime;
|
||||||
UINT32 LeaseTime;
|
UINT32 LeaseTime;
|
||||||
};
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Control block for each transmitted message.
|
// Control block for each transmitted message.
|
||||||
//
|
//
|
||||||
struct _DHCP6_TX_CB {
|
struct _DHCP6_TX_CB {
|
||||||
LIST_ENTRY Link;
|
LIST_ENTRY Link;
|
||||||
UINT32 Xid;
|
UINT32 Xid;
|
||||||
EFI_DHCP6_PACKET *TxPacket;
|
EFI_DHCP6_PACKET *TxPacket;
|
||||||
EFI_DHCP6_RETRANSMISSION RetryCtl;
|
EFI_DHCP6_RETRANSMISSION RetryCtl;
|
||||||
UINT32 RetryCnt;
|
UINT32 RetryCnt;
|
||||||
UINT32 RetryExp;
|
UINT32 RetryExp;
|
||||||
UINT32 RetryLos;
|
UINT32 RetryLos;
|
||||||
UINT32 TickTime;
|
UINT32 TickTime;
|
||||||
UINT16 *Elapsed;
|
UINT16 *Elapsed;
|
||||||
BOOLEAN SolicitRetry;
|
BOOLEAN SolicitRetry;
|
||||||
};
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Control block for each info-request message.
|
// Control block for each info-request message.
|
||||||
//
|
//
|
||||||
struct _DHCP6_INF_CB {
|
struct _DHCP6_INF_CB {
|
||||||
LIST_ENTRY Link;
|
LIST_ENTRY Link;
|
||||||
UINT32 Xid;
|
UINT32 Xid;
|
||||||
EFI_DHCP6_INFO_CALLBACK ReplyCallback;
|
EFI_DHCP6_INFO_CALLBACK ReplyCallback;
|
||||||
VOID *CallbackContext;
|
VOID *CallbackContext;
|
||||||
EFI_EVENT TimeoutEvent;
|
EFI_EVENT TimeoutEvent;
|
||||||
};
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Control block for Dhcp6 instance, it's per configuration data.
|
// Control block for Dhcp6 instance, it's per configuration data.
|
||||||
//
|
//
|
||||||
struct _DHCP6_INSTANCE {
|
struct _DHCP6_INSTANCE {
|
||||||
UINT32 Signature;
|
UINT32 Signature;
|
||||||
EFI_HANDLE Handle;
|
EFI_HANDLE Handle;
|
||||||
DHCP6_SERVICE *Service;
|
DHCP6_SERVICE *Service;
|
||||||
LIST_ENTRY Link;
|
LIST_ENTRY Link;
|
||||||
EFI_DHCP6_PROTOCOL Dhcp6;
|
EFI_DHCP6_PROTOCOL Dhcp6;
|
||||||
EFI_EVENT Timer;
|
EFI_EVENT Timer;
|
||||||
EFI_DHCP6_CONFIG_DATA *Config;
|
EFI_DHCP6_CONFIG_DATA *Config;
|
||||||
EFI_DHCP6_IA *CacheIa;
|
EFI_DHCP6_IA *CacheIa;
|
||||||
DHCP6_IA_CB IaCb;
|
DHCP6_IA_CB IaCb;
|
||||||
LIST_ENTRY TxList;
|
LIST_ENTRY TxList;
|
||||||
LIST_ENTRY InfList;
|
LIST_ENTRY InfList;
|
||||||
EFI_DHCP6_PACKET *AdSelect;
|
EFI_DHCP6_PACKET *AdSelect;
|
||||||
UINT8 AdPref;
|
UINT8 AdPref;
|
||||||
EFI_IPv6_ADDRESS *Unicast;
|
EFI_IPv6_ADDRESS *Unicast;
|
||||||
volatile EFI_STATUS UdpSts;
|
volatile EFI_STATUS UdpSts;
|
||||||
BOOLEAN InDestroy;
|
BOOLEAN InDestroy;
|
||||||
BOOLEAN MediaPresent;
|
BOOLEAN MediaPresent;
|
||||||
//
|
//
|
||||||
// StartTime is used to calculate the 'elapsed-time' option. Refer to RFC3315,
|
// StartTime is used to calculate the 'elapsed-time' option. Refer to RFC3315,
|
||||||
// the elapsed-time is amount of time since the client began its current DHCP transaction.
|
// the elapsed-time is amount of time since the client began its current DHCP transaction.
|
||||||
//
|
//
|
||||||
UINT64 StartTime;
|
UINT64 StartTime;
|
||||||
};
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
// Control block for Dhcp6 service, it's per Nic handle.
|
// Control block for Dhcp6 service, it's per Nic handle.
|
||||||
//
|
//
|
||||||
struct _DHCP6_SERVICE {
|
struct _DHCP6_SERVICE {
|
||||||
UINT32 Signature;
|
UINT32 Signature;
|
||||||
EFI_HANDLE Controller;
|
EFI_HANDLE Controller;
|
||||||
EFI_HANDLE Image;
|
EFI_HANDLE Image;
|
||||||
EFI_SERVICE_BINDING_PROTOCOL ServiceBinding;
|
EFI_SERVICE_BINDING_PROTOCOL ServiceBinding;
|
||||||
EFI_SIMPLE_NETWORK_PROTOCOL *Snp;
|
EFI_SIMPLE_NETWORK_PROTOCOL *Snp;
|
||||||
EFI_IP6_CONFIG_PROTOCOL *Ip6Cfg;
|
EFI_IP6_CONFIG_PROTOCOL *Ip6Cfg;
|
||||||
EFI_DHCP6_DUID *ClientId;
|
EFI_DHCP6_DUID *ClientId;
|
||||||
UDP_IO *UdpIo;
|
UDP_IO *UdpIo;
|
||||||
UINT32 Xid;
|
UINT32 Xid;
|
||||||
LIST_ENTRY Child;
|
LIST_ENTRY Child;
|
||||||
UINTN NumOfChild;
|
UINTN NumOfChild;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -179,7 +177,7 @@ struct _DHCP6_SERVICE {
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EfiDhcp6Start (
|
EfiDhcp6Start (
|
||||||
IN EFI_DHCP6_PROTOCOL *This
|
IN EFI_DHCP6_PROTOCOL *This
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -200,7 +198,7 @@ EfiDhcp6Start (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EfiDhcp6Stop (
|
EfiDhcp6Stop (
|
||||||
IN EFI_DHCP6_PROTOCOL *This
|
IN EFI_DHCP6_PROTOCOL *This
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -222,9 +220,9 @@ EfiDhcp6Stop (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EfiDhcp6GetModeData (
|
EfiDhcp6GetModeData (
|
||||||
IN EFI_DHCP6_PROTOCOL *This,
|
IN EFI_DHCP6_PROTOCOL *This,
|
||||||
OUT EFI_DHCP6_MODE_DATA *Dhcp6ModeData OPTIONAL,
|
OUT EFI_DHCP6_MODE_DATA *Dhcp6ModeData OPTIONAL,
|
||||||
OUT EFI_DHCP6_CONFIG_DATA *Dhcp6ConfigData OPTIONAL
|
OUT EFI_DHCP6_CONFIG_DATA *Dhcp6ConfigData OPTIONAL
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -259,8 +257,8 @@ EfiDhcp6GetModeData (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EfiDhcp6Configure (
|
EfiDhcp6Configure (
|
||||||
IN EFI_DHCP6_PROTOCOL *This,
|
IN EFI_DHCP6_PROTOCOL *This,
|
||||||
IN EFI_DHCP6_CONFIG_DATA *Dhcp6CfgData OPTIONAL
|
IN EFI_DHCP6_CONFIG_DATA *Dhcp6CfgData OPTIONAL
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -366,8 +364,8 @@ EfiDhcp6InfoRequest (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EfiDhcp6RenewRebind (
|
EfiDhcp6RenewRebind (
|
||||||
IN EFI_DHCP6_PROTOCOL *This,
|
IN EFI_DHCP6_PROTOCOL *This,
|
||||||
IN BOOLEAN RebindRequest
|
IN BOOLEAN RebindRequest
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -405,9 +403,9 @@ EfiDhcp6RenewRebind (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EfiDhcp6Decline (
|
EfiDhcp6Decline (
|
||||||
IN EFI_DHCP6_PROTOCOL *This,
|
IN EFI_DHCP6_PROTOCOL *This,
|
||||||
IN UINT32 AddressCount,
|
IN UINT32 AddressCount,
|
||||||
IN EFI_IPv6_ADDRESS *Addresses
|
IN EFI_IPv6_ADDRESS *Addresses
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -446,9 +444,9 @@ EfiDhcp6Decline (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EfiDhcp6Release (
|
EfiDhcp6Release (
|
||||||
IN EFI_DHCP6_PROTOCOL *This,
|
IN EFI_DHCP6_PROTOCOL *This,
|
||||||
IN UINT32 AddressCount,
|
IN UINT32 AddressCount,
|
||||||
IN EFI_IPv6_ADDRESS *Addresses
|
IN EFI_IPv6_ADDRESS *Addresses
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -10,7 +10,6 @@
|
|||||||
#ifndef __EFI_DHCP6_IO_H__
|
#ifndef __EFI_DHCP6_IO_H__
|
||||||
#define __EFI_DHCP6_IO_H__
|
#define __EFI_DHCP6_IO_H__
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Clean up the specific nodes in the retry list.
|
Clean up the specific nodes in the retry list.
|
||||||
|
|
||||||
@ -20,8 +19,8 @@
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
Dhcp6CleanupRetry (
|
Dhcp6CleanupRetry (
|
||||||
IN DHCP6_INSTANCE *Instance,
|
IN DHCP6_INSTANCE *Instance,
|
||||||
IN UINT32 Scope
|
IN UINT32 Scope
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -33,8 +32,8 @@ Dhcp6CleanupRetry (
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
Dhcp6CleanupSession (
|
Dhcp6CleanupSession (
|
||||||
IN OUT DHCP6_INSTANCE *Instance,
|
IN OUT DHCP6_INSTANCE *Instance,
|
||||||
IN EFI_STATUS Status
|
IN EFI_STATUS Status
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -49,7 +48,7 @@ Dhcp6CleanupSession (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
Dhcp6SendSolicitMsg (
|
Dhcp6SendSolicitMsg (
|
||||||
IN DHCP6_INSTANCE *Instance
|
IN DHCP6_INSTANCE *Instance
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -65,7 +64,7 @@ Dhcp6SendSolicitMsg (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
Dhcp6SendRequestMsg (
|
Dhcp6SendRequestMsg (
|
||||||
IN DHCP6_INSTANCE *Instance
|
IN DHCP6_INSTANCE *Instance
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -83,8 +82,8 @@ Dhcp6SendRequestMsg (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
Dhcp6SendRenewRebindMsg (
|
Dhcp6SendRenewRebindMsg (
|
||||||
IN DHCP6_INSTANCE *Instance,
|
IN DHCP6_INSTANCE *Instance,
|
||||||
IN BOOLEAN RebindRequest
|
IN BOOLEAN RebindRequest
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -101,8 +100,8 @@ Dhcp6SendRenewRebindMsg (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
Dhcp6SendDeclineMsg (
|
Dhcp6SendDeclineMsg (
|
||||||
IN DHCP6_INSTANCE *Instance,
|
IN DHCP6_INSTANCE *Instance,
|
||||||
IN EFI_DHCP6_IA *DecIa
|
IN EFI_DHCP6_IA *DecIa
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -119,8 +118,8 @@ Dhcp6SendDeclineMsg (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
Dhcp6SendReleaseMsg (
|
Dhcp6SendReleaseMsg (
|
||||||
IN DHCP6_INSTANCE *Instance,
|
IN DHCP6_INSTANCE *Instance,
|
||||||
IN EFI_DHCP6_IA *RelIa
|
IN EFI_DHCP6_IA *RelIa
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -198,10 +197,10 @@ Dhcp6SendInfoRequestMsg (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
Dhcp6ReceivePacket (
|
Dhcp6ReceivePacket (
|
||||||
IN NET_BUF *Udp6Wrap,
|
IN NET_BUF *Udp6Wrap,
|
||||||
IN UDP_END_POINT *EndPoint,
|
IN UDP_END_POINT *EndPoint,
|
||||||
IN EFI_STATUS IoStatus,
|
IN EFI_STATUS IoStatus,
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -214,8 +213,8 @@ Dhcp6ReceivePacket (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
Dhcp6OnTimerTick (
|
Dhcp6OnTimerTick (
|
||||||
IN EFI_EVENT Event,
|
IN EFI_EVENT Event,
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -10,9 +10,8 @@
|
|||||||
#ifndef __EFI_DHCP6_UTILITY_H__
|
#ifndef __EFI_DHCP6_UTILITY_H__
|
||||||
#define __EFI_DHCP6_UTILITY_H__
|
#define __EFI_DHCP6_UTILITY_H__
|
||||||
|
|
||||||
|
#define DHCP6_10_BIT_MASK 0x3ff
|
||||||
#define DHCP6_10_BIT_MASK 0x3ff
|
#define DHCP6_DAD_ADDITIONAL_DELAY 30000000 // 3 seconds
|
||||||
#define DHCP6_DAD_ADDITIONAL_DELAY 30000000 // 3 seconds
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Generate client Duid in the format of Duid-llt.
|
Generate client Duid in the format of Duid-llt.
|
||||||
@ -25,7 +24,7 @@
|
|||||||
**/
|
**/
|
||||||
EFI_DHCP6_DUID *
|
EFI_DHCP6_DUID *
|
||||||
Dhcp6GenerateClientId (
|
Dhcp6GenerateClientId (
|
||||||
IN EFI_SIMPLE_NETWORK_MODE *Mode
|
IN EFI_SIMPLE_NETWORK_MODE *Mode
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -40,8 +39,8 @@ Dhcp6GenerateClientId (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
Dhcp6CopyConfigData (
|
Dhcp6CopyConfigData (
|
||||||
IN EFI_DHCP6_CONFIG_DATA *DstCfg,
|
IN EFI_DHCP6_CONFIG_DATA *DstCfg,
|
||||||
IN EFI_DHCP6_CONFIG_DATA *SorCfg
|
IN EFI_DHCP6_CONFIG_DATA *SorCfg
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -52,7 +51,7 @@ Dhcp6CopyConfigData (
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
Dhcp6CleanupConfigData (
|
Dhcp6CleanupConfigData (
|
||||||
IN OUT EFI_DHCP6_CONFIG_DATA *CfgData
|
IN OUT EFI_DHCP6_CONFIG_DATA *CfgData
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -63,7 +62,7 @@ Dhcp6CleanupConfigData (
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
Dhcp6CleanupModeData (
|
Dhcp6CleanupModeData (
|
||||||
IN OUT EFI_DHCP6_MODE_DATA *ModeData
|
IN OUT EFI_DHCP6_MODE_DATA *ModeData
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -78,9 +77,9 @@ Dhcp6CleanupModeData (
|
|||||||
**/
|
**/
|
||||||
UINT32
|
UINT32
|
||||||
Dhcp6CalculateExpireTime (
|
Dhcp6CalculateExpireTime (
|
||||||
IN UINT32 Base,
|
IN UINT32 Base,
|
||||||
IN BOOLEAN IsFirstRt,
|
IN BOOLEAN IsFirstRt,
|
||||||
IN BOOLEAN NeedSigned
|
IN BOOLEAN NeedSigned
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -91,7 +90,7 @@ Dhcp6CalculateExpireTime (
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
Dhcp6CalculateLeaseTime (
|
Dhcp6CalculateLeaseTime (
|
||||||
IN DHCP6_IA_CB *IaCb
|
IN DHCP6_IA_CB *IaCb
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -107,9 +106,9 @@ Dhcp6CalculateLeaseTime (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
Dhcp6CheckAddress (
|
Dhcp6CheckAddress (
|
||||||
IN EFI_DHCP6_IA *Ia,
|
IN EFI_DHCP6_IA *Ia,
|
||||||
IN UINT32 AddressCount,
|
IN UINT32 AddressCount,
|
||||||
IN EFI_IPv6_ADDRESS *Addresses
|
IN EFI_IPv6_ADDRESS *Addresses
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -125,9 +124,9 @@ Dhcp6CheckAddress (
|
|||||||
**/
|
**/
|
||||||
EFI_DHCP6_IA *
|
EFI_DHCP6_IA *
|
||||||
Dhcp6DepriveAddress (
|
Dhcp6DepriveAddress (
|
||||||
IN EFI_DHCP6_IA *Ia,
|
IN EFI_DHCP6_IA *Ia,
|
||||||
IN UINT32 AddressCount,
|
IN UINT32 AddressCount,
|
||||||
IN EFI_IPv6_ADDRESS *Addresses
|
IN EFI_IPv6_ADDRESS *Addresses
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -139,7 +138,7 @@ Dhcp6DepriveAddress (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
Dhcp6DummyExtFree (
|
Dhcp6DummyExtFree (
|
||||||
IN VOID *Arg
|
IN VOID *Arg
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -154,10 +153,10 @@ Dhcp6DummyExtFree (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
Dhcp6OnTransmitted (
|
Dhcp6OnTransmitted (
|
||||||
IN NET_BUF *Wrap,
|
IN NET_BUF *Wrap,
|
||||||
IN UDP_END_POINT *EndPoint,
|
IN UDP_END_POINT *EndPoint,
|
||||||
IN EFI_STATUS IoStatus,
|
IN EFI_STATUS IoStatus,
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -173,10 +172,10 @@ Dhcp6OnTransmitted (
|
|||||||
**/
|
**/
|
||||||
UINT8 *
|
UINT8 *
|
||||||
Dhcp6AppendOption (
|
Dhcp6AppendOption (
|
||||||
IN OUT UINT8 *Buf,
|
IN OUT UINT8 *Buf,
|
||||||
IN UINT16 OptType,
|
IN UINT16 OptType,
|
||||||
IN UINT16 OptLen,
|
IN UINT16 OptLen,
|
||||||
IN UINT8 *Data
|
IN UINT8 *Data
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -193,11 +192,11 @@ Dhcp6AppendOption (
|
|||||||
**/
|
**/
|
||||||
UINT8 *
|
UINT8 *
|
||||||
Dhcp6AppendIaOption (
|
Dhcp6AppendIaOption (
|
||||||
IN OUT UINT8 *Buf,
|
IN OUT UINT8 *Buf,
|
||||||
IN EFI_DHCP6_IA *Ia,
|
IN EFI_DHCP6_IA *Ia,
|
||||||
IN UINT32 T1,
|
IN UINT32 T1,
|
||||||
IN UINT32 T2,
|
IN UINT32 T2,
|
||||||
IN UINT32 MessageType
|
IN UINT32 MessageType
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -213,9 +212,9 @@ Dhcp6AppendIaOption (
|
|||||||
**/
|
**/
|
||||||
UINT8 *
|
UINT8 *
|
||||||
Dhcp6AppendETOption (
|
Dhcp6AppendETOption (
|
||||||
IN OUT UINT8 *Buf,
|
IN OUT UINT8 *Buf,
|
||||||
IN DHCP6_INSTANCE *Instance,
|
IN DHCP6_INSTANCE *Instance,
|
||||||
OUT UINT16 **Elapsed
|
OUT UINT16 **Elapsed
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -227,8 +226,8 @@ Dhcp6AppendETOption (
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
SetElapsedTime (
|
SetElapsedTime (
|
||||||
IN UINT16 *Elapsed,
|
IN UINT16 *Elapsed,
|
||||||
IN DHCP6_INSTANCE *Instance
|
IN DHCP6_INSTANCE *Instance
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -244,9 +243,9 @@ SetElapsedTime (
|
|||||||
**/
|
**/
|
||||||
UINT8 *
|
UINT8 *
|
||||||
Dhcp6SeekOption (
|
Dhcp6SeekOption (
|
||||||
IN UINT8 *Buf,
|
IN UINT8 *Buf,
|
||||||
IN UINT32 SeekLen,
|
IN UINT32 SeekLen,
|
||||||
IN UINT16 OptType
|
IN UINT16 OptType
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -262,9 +261,9 @@ Dhcp6SeekOption (
|
|||||||
**/
|
**/
|
||||||
UINT8 *
|
UINT8 *
|
||||||
Dhcp6SeekIaOption (
|
Dhcp6SeekIaOption (
|
||||||
IN UINT8 *Buf,
|
IN UINT8 *Buf,
|
||||||
IN UINT32 SeekLen,
|
IN UINT32 SeekLen,
|
||||||
IN EFI_DHCP6_IA_DESCRIPTOR *IaDesc
|
IN EFI_DHCP6_IA_DESCRIPTOR *IaDesc
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -279,11 +278,11 @@ Dhcp6SeekIaOption (
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
Dhcp6ParseAddrOption (
|
Dhcp6ParseAddrOption (
|
||||||
IN EFI_DHCP6_IA *CurrentIa,
|
IN EFI_DHCP6_IA *CurrentIa,
|
||||||
IN UINT8 *IaInnerOpt,
|
IN UINT8 *IaInnerOpt,
|
||||||
IN UINT16 IaInnerLen,
|
IN UINT16 IaInnerLen,
|
||||||
OUT UINT32 *AddrNum,
|
OUT UINT32 *AddrNum,
|
||||||
IN OUT EFI_DHCP6_IA_ADDRESS *AddrBuf
|
IN OUT EFI_DHCP6_IA_ADDRESS *AddrBuf
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -303,14 +302,13 @@ Dhcp6ParseAddrOption (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
Dhcp6GenerateIaCb (
|
Dhcp6GenerateIaCb (
|
||||||
IN DHCP6_INSTANCE *Instance,
|
IN DHCP6_INSTANCE *Instance,
|
||||||
IN UINT8 *IaInnerOpt,
|
IN UINT8 *IaInnerOpt,
|
||||||
IN UINT16 IaInnerLen,
|
IN UINT16 IaInnerLen,
|
||||||
IN UINT32 T1,
|
IN UINT32 T1,
|
||||||
IN UINT32 T2
|
IN UINT32 T2
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Cache the current IA configuration information.
|
Cache the current IA configuration information.
|
||||||
|
|
||||||
@ -322,10 +320,9 @@ Dhcp6GenerateIaCb (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
Dhcp6CacheIa (
|
Dhcp6CacheIa (
|
||||||
IN DHCP6_INSTANCE *Instance
|
IN DHCP6_INSTANCE *Instance
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Append CacheIa to the current IA. Meanwhile, clear CacheIa.ValidLifetime to 0.
|
Append CacheIa to the current IA. Meanwhile, clear CacheIa.ValidLifetime to 0.
|
||||||
|
|
||||||
@ -334,7 +331,7 @@ Dhcp6CacheIa (
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
Dhcp6AppendCacheIa (
|
Dhcp6AppendCacheIa (
|
||||||
IN DHCP6_INSTANCE *Instance
|
IN DHCP6_INSTANCE *Instance
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -348,7 +345,8 @@ Dhcp6AppendCacheIa (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
Dhcp6GetMappingTimeOut (
|
Dhcp6GetMappingTimeOut (
|
||||||
IN EFI_IP6_CONFIG_PROTOCOL *Ip6Cfg,
|
IN EFI_IP6_CONFIG_PROTOCOL *Ip6Cfg,
|
||||||
OUT UINTN *TimeOut
|
OUT UINTN *TimeOut
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -11,6 +11,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
//
|
//
|
||||||
// EFI Component Name Functions
|
// EFI Component Name Functions
|
||||||
//
|
//
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Retrieves a Unicode string that is the user-readable name of the EFI Driver.
|
Retrieves a Unicode string that is the user-readable name of the EFI Driver.
|
||||||
|
|
||||||
@ -85,13 +86,12 @@ EFI_STATUS
|
|||||||
EFIAPI
|
EFIAPI
|
||||||
DnsComponentNameGetControllerName (
|
DnsComponentNameGetControllerName (
|
||||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||||
IN EFI_HANDLE ControllerHandle,
|
IN EFI_HANDLE ControllerHandle,
|
||||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||||
IN CHAR8 *Language,
|
IN CHAR8 *Language,
|
||||||
OUT CHAR16 **ControllerName
|
OUT CHAR16 **ControllerName
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
///
|
///
|
||||||
/// Component Name Protocol instance
|
/// Component Name Protocol instance
|
||||||
///
|
///
|
||||||
@ -107,8 +107,8 @@ EFI_COMPONENT_NAME_PROTOCOL gDnsComponentName = {
|
|||||||
///
|
///
|
||||||
GLOBAL_REMOVE_IF_UNREFERENCED
|
GLOBAL_REMOVE_IF_UNREFERENCED
|
||||||
EFI_COMPONENT_NAME2_PROTOCOL gDnsComponentName2 = {
|
EFI_COMPONENT_NAME2_PROTOCOL gDnsComponentName2 = {
|
||||||
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME) DnsComponentNameGetDriverName,
|
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME)DnsComponentNameGetDriverName,
|
||||||
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) DnsComponentNameGetControllerName,
|
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME)DnsComponentNameGetControllerName,
|
||||||
"en"
|
"en"
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -116,12 +116,12 @@ EFI_COMPONENT_NAME2_PROTOCOL gDnsComponentName2 = {
|
|||||||
/// Table of driver names
|
/// Table of driver names
|
||||||
///
|
///
|
||||||
GLOBAL_REMOVE_IF_UNREFERENCED
|
GLOBAL_REMOVE_IF_UNREFERENCED
|
||||||
EFI_UNICODE_STRING_TABLE mDnsDriverNameTable[] = {
|
EFI_UNICODE_STRING_TABLE mDnsDriverNameTable[] = {
|
||||||
{ "eng;en", (CHAR16 *)L"DNS Network Service Driver" },
|
{ "eng;en", (CHAR16 *)L"DNS Network Service Driver" },
|
||||||
{ NULL, NULL }
|
{ NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE *gDnsControllerNameTable = NULL;
|
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE *gDnsControllerNameTable = NULL;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Retrieves a Unicode string that is the user-readable name of the EFI Driver.
|
Retrieves a Unicode string that is the user-readable name of the EFI Driver.
|
||||||
@ -174,12 +174,12 @@ DnsComponentNameGetDriverName (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
UpdateDns4Name (
|
UpdateDns4Name (
|
||||||
EFI_DNS4_PROTOCOL *Dns4
|
EFI_DNS4_PROTOCOL *Dns4
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
CHAR16 HandleName[80];
|
CHAR16 HandleName[80];
|
||||||
EFI_DNS4_MODE_DATA ModeData;
|
EFI_DNS4_MODE_DATA ModeData;
|
||||||
|
|
||||||
if (Dns4 == NULL) {
|
if (Dns4 == NULL) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
@ -208,6 +208,7 @@ UpdateDns4Name (
|
|||||||
if (ModeData.DnsCacheList != NULL) {
|
if (ModeData.DnsCacheList != NULL) {
|
||||||
FreePool (ModeData.DnsCacheList);
|
FreePool (ModeData.DnsCacheList);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ModeData.DnsServerList != NULL) {
|
if (ModeData.DnsServerList != NULL) {
|
||||||
FreePool (ModeData.DnsServerList);
|
FreePool (ModeData.DnsServerList);
|
||||||
}
|
}
|
||||||
@ -249,13 +250,13 @@ UpdateDns4Name (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
UpdateDns6Name (
|
UpdateDns6Name (
|
||||||
EFI_DNS6_PROTOCOL *Dns6
|
EFI_DNS6_PROTOCOL *Dns6
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
CHAR16 HandleName[128];
|
CHAR16 HandleName[128];
|
||||||
EFI_DNS6_MODE_DATA ModeData;
|
EFI_DNS6_MODE_DATA ModeData;
|
||||||
CHAR16 Address[sizeof"ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"];
|
CHAR16 Address[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"];
|
||||||
|
|
||||||
if (Dns6 == NULL) {
|
if (Dns6 == NULL) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
@ -274,6 +275,7 @@ UpdateDns6Name (
|
|||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
UnicodeSPrint (
|
UnicodeSPrint (
|
||||||
HandleName,
|
HandleName,
|
||||||
sizeof (HandleName),
|
sizeof (HandleName),
|
||||||
@ -285,6 +287,7 @@ UpdateDns6Name (
|
|||||||
if (ModeData.DnsCacheList != NULL) {
|
if (ModeData.DnsCacheList != NULL) {
|
||||||
FreePool (ModeData.DnsCacheList);
|
FreePool (ModeData.DnsCacheList);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ModeData.DnsServerList != NULL) {
|
if (ModeData.DnsServerList != NULL) {
|
||||||
FreePool (ModeData.DnsServerList);
|
FreePool (ModeData.DnsServerList);
|
||||||
}
|
}
|
||||||
@ -358,15 +361,15 @@ EFI_STATUS
|
|||||||
EFIAPI
|
EFIAPI
|
||||||
DnsComponentNameGetControllerName (
|
DnsComponentNameGetControllerName (
|
||||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||||
IN EFI_HANDLE ControllerHandle,
|
IN EFI_HANDLE ControllerHandle,
|
||||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||||
IN CHAR8 *Language,
|
IN CHAR8 *Language,
|
||||||
OUT CHAR16 **ControllerName
|
OUT CHAR16 **ControllerName
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_DNS4_PROTOCOL *Dns4;
|
EFI_DNS4_PROTOCOL *Dns4;
|
||||||
EFI_DNS6_PROTOCOL *Dns6;
|
EFI_DNS6_PROTOCOL *Dns6;
|
||||||
|
|
||||||
//
|
//
|
||||||
// ChildHandle must be NULL for a Device Driver
|
// ChildHandle must be NULL for a Device Driver
|
||||||
|
@ -19,22 +19,22 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
DnsInitSeedPacket (
|
DnsInitSeedPacket (
|
||||||
OUT EFI_DHCP4_PACKET *Seed,
|
OUT EFI_DHCP4_PACKET *Seed,
|
||||||
IN EFI_IP4_CONFIG2_INTERFACE_INFO *InterfaceInfo
|
IN EFI_IP4_CONFIG2_INTERFACE_INFO *InterfaceInfo
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_DHCP4_HEADER *Header;
|
EFI_DHCP4_HEADER *Header;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Get IfType and HwAddressSize from SNP mode data.
|
// Get IfType and HwAddressSize from SNP mode data.
|
||||||
//
|
//
|
||||||
Seed->Size = sizeof (EFI_DHCP4_PACKET);
|
Seed->Size = sizeof (EFI_DHCP4_PACKET);
|
||||||
Seed->Length = sizeof (Seed->Dhcp4);
|
Seed->Length = sizeof (Seed->Dhcp4);
|
||||||
Header = &Seed->Dhcp4.Header;
|
Header = &Seed->Dhcp4.Header;
|
||||||
ZeroMem (Header, sizeof (EFI_DHCP4_HEADER));
|
ZeroMem (Header, sizeof (EFI_DHCP4_HEADER));
|
||||||
Header->OpCode = DHCP4_OPCODE_REQUEST;
|
Header->OpCode = DHCP4_OPCODE_REQUEST;
|
||||||
Header->HwType = InterfaceInfo->IfType;
|
Header->HwType = InterfaceInfo->IfType;
|
||||||
Header->HwAddrLen = (UINT8) InterfaceInfo->HwAddressSize;
|
Header->HwAddrLen = (UINT8)InterfaceInfo->HwAddressSize;
|
||||||
CopyMem (Header->ClientHwAddr, &(InterfaceInfo->HwAddress), Header->HwAddrLen);
|
CopyMem (Header->ClientHwAddr, &(InterfaceInfo->HwAddress), Header->HwAddrLen);
|
||||||
|
|
||||||
Seed->Dhcp4.Magik = DHCP4_MAGIC;
|
Seed->Dhcp4.Magik = DHCP4_MAGIC;
|
||||||
@ -56,10 +56,10 @@ DhcpCommonNotify (
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
if ((Event == NULL) || (Context == NULL)) {
|
if ((Event == NULL) || (Context == NULL)) {
|
||||||
return ;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
*((BOOLEAN *) Context) = TRUE;
|
*((BOOLEAN *)Context) = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -77,26 +77,26 @@ DhcpCommonNotify (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
ParseDhcp4Ack (
|
ParseDhcp4Ack (
|
||||||
IN EFI_DHCP4_PROTOCOL *Dhcp4,
|
IN EFI_DHCP4_PROTOCOL *Dhcp4,
|
||||||
IN EFI_DHCP4_PACKET *Packet,
|
IN EFI_DHCP4_PACKET *Packet,
|
||||||
IN DNS4_SERVER_INFOR *DnsServerInfor
|
IN DNS4_SERVER_INFOR *DnsServerInfor
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
UINT32 OptionCount;
|
UINT32 OptionCount;
|
||||||
EFI_DHCP4_PACKET_OPTION **OptionList;
|
EFI_DHCP4_PACKET_OPTION **OptionList;
|
||||||
UINT32 ServerCount;
|
UINT32 ServerCount;
|
||||||
EFI_IPv4_ADDRESS *ServerList;
|
EFI_IPv4_ADDRESS *ServerList;
|
||||||
UINT32 Index;
|
UINT32 Index;
|
||||||
UINT32 Count;
|
UINT32 Count;
|
||||||
|
|
||||||
ServerCount = 0;
|
ServerCount = 0;
|
||||||
ServerList = NULL;
|
ServerList = NULL;
|
||||||
|
|
||||||
OptionCount = 0;
|
OptionCount = 0;
|
||||||
OptionList = NULL;
|
OptionList = NULL;
|
||||||
|
|
||||||
Status = Dhcp4->Parse (Dhcp4, Packet, &OptionCount, OptionList);
|
Status = Dhcp4->Parse (Dhcp4, Packet, &OptionCount, OptionList);
|
||||||
if (Status != EFI_BUFFER_TOO_SMALL) {
|
if (Status != EFI_BUFFER_TOO_SMALL) {
|
||||||
return EFI_DEVICE_ERROR;
|
return EFI_DEVICE_ERROR;
|
||||||
}
|
}
|
||||||
@ -119,19 +119,18 @@ ParseDhcp4Ack (
|
|||||||
// Get DNS server addresses
|
// Get DNS server addresses
|
||||||
//
|
//
|
||||||
if (OptionList[Index]->OpCode == DHCP4_TAG_DNS_SERVER) {
|
if (OptionList[Index]->OpCode == DHCP4_TAG_DNS_SERVER) {
|
||||||
|
|
||||||
if (((OptionList[Index]->Length & 0x3) != 0) || (OptionList[Index]->Length == 0)) {
|
if (((OptionList[Index]->Length & 0x3) != 0) || (OptionList[Index]->Length == 0)) {
|
||||||
Status = EFI_DEVICE_ERROR;
|
Status = EFI_DEVICE_ERROR;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
ServerCount = OptionList[Index]->Length/4;
|
ServerCount = OptionList[Index]->Length/4;
|
||||||
ServerList = AllocatePool (ServerCount * sizeof (EFI_IPv4_ADDRESS));
|
ServerList = AllocatePool (ServerCount * sizeof (EFI_IPv4_ADDRESS));
|
||||||
if (ServerList == NULL) {
|
if (ServerList == NULL) {
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Count=0; Count < ServerCount; Count++) {
|
for (Count = 0; Count < ServerCount; Count++) {
|
||||||
CopyMem (ServerList + Count, &OptionList[Index]->Data[4 * Count], sizeof (EFI_IPv4_ADDRESS));
|
CopyMem (ServerList + Count, &OptionList[Index]->Data[4 * Count], sizeof (EFI_IPv4_ADDRESS));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -167,25 +166,25 @@ ParseDhcp4Ack (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
ParseDhcp6Ack (
|
ParseDhcp6Ack (
|
||||||
IN EFI_DHCP6_PROTOCOL *This,
|
IN EFI_DHCP6_PROTOCOL *This,
|
||||||
IN VOID *Context,
|
IN VOID *Context,
|
||||||
IN EFI_DHCP6_PACKET *Packet
|
IN EFI_DHCP6_PACKET *Packet
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
UINT32 OptionCount;
|
UINT32 OptionCount;
|
||||||
EFI_DHCP6_PACKET_OPTION **OptionList;
|
EFI_DHCP6_PACKET_OPTION **OptionList;
|
||||||
DNS6_SERVER_INFOR *DnsServerInfor;
|
DNS6_SERVER_INFOR *DnsServerInfor;
|
||||||
UINT32 ServerCount;
|
UINT32 ServerCount;
|
||||||
EFI_IPv6_ADDRESS *ServerList;
|
EFI_IPv6_ADDRESS *ServerList;
|
||||||
UINT32 Index;
|
UINT32 Index;
|
||||||
UINT32 Count;
|
UINT32 Count;
|
||||||
|
|
||||||
OptionCount = 0;
|
OptionCount = 0;
|
||||||
ServerCount = 0;
|
ServerCount = 0;
|
||||||
ServerList = NULL;
|
ServerList = NULL;
|
||||||
|
|
||||||
Status = This->Parse (This, Packet, &OptionCount, NULL);
|
Status = This->Parse (This, Packet, &OptionCount, NULL);
|
||||||
if (Status != EFI_BUFFER_TOO_SMALL) {
|
if (Status != EFI_BUFFER_TOO_SMALL) {
|
||||||
return EFI_DEVICE_ERROR;
|
return EFI_DEVICE_ERROR;
|
||||||
}
|
}
|
||||||
@ -201,7 +200,7 @@ ParseDhcp6Ack (
|
|||||||
return EFI_DEVICE_ERROR;
|
return EFI_DEVICE_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
DnsServerInfor = (DNS6_SERVER_INFOR *) Context;
|
DnsServerInfor = (DNS6_SERVER_INFOR *)Context;
|
||||||
|
|
||||||
for (Index = 0; Index < OptionCount; Index++) {
|
for (Index = 0; Index < OptionCount; Index++) {
|
||||||
OptionList[Index]->OpCode = NTOHS (OptionList[Index]->OpCode);
|
OptionList[Index]->OpCode = NTOHS (OptionList[Index]->OpCode);
|
||||||
@ -211,7 +210,6 @@ ParseDhcp6Ack (
|
|||||||
// Get DNS server addresses from this reply packet.
|
// Get DNS server addresses from this reply packet.
|
||||||
//
|
//
|
||||||
if (OptionList[Index]->OpCode == DHCP6_TAG_DNS_SERVER) {
|
if (OptionList[Index]->OpCode == DHCP6_TAG_DNS_SERVER) {
|
||||||
|
|
||||||
if (((OptionList[Index]->OpLen & 0xf) != 0) || (OptionList[Index]->OpLen == 0)) {
|
if (((OptionList[Index]->OpLen & 0xf) != 0) || (OptionList[Index]->OpLen == 0)) {
|
||||||
Status = EFI_DEVICE_ERROR;
|
Status = EFI_DEVICE_ERROR;
|
||||||
gBS->FreePool (OptionList);
|
gBS->FreePool (OptionList);
|
||||||
@ -219,13 +217,13 @@ ParseDhcp6Ack (
|
|||||||
}
|
}
|
||||||
|
|
||||||
ServerCount = OptionList[Index]->OpLen/16;
|
ServerCount = OptionList[Index]->OpLen/16;
|
||||||
ServerList = AllocatePool (ServerCount * sizeof (EFI_IPv6_ADDRESS));
|
ServerList = AllocatePool (ServerCount * sizeof (EFI_IPv6_ADDRESS));
|
||||||
if (ServerList == NULL) {
|
if (ServerList == NULL) {
|
||||||
gBS->FreePool (OptionList);
|
gBS->FreePool (OptionList);
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Count=0; Count < ServerCount; Count++) {
|
for (Count = 0; Count < ServerCount; Count++) {
|
||||||
CopyMem (ServerList + Count, &OptionList[Index]->Data[16 * Count], sizeof (EFI_IPv6_ADDRESS));
|
CopyMem (ServerList + Count, &OptionList[Index]->Data[16 * Count], sizeof (EFI_IPv6_ADDRESS));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -237,7 +235,6 @@ ParseDhcp6Ack (
|
|||||||
gBS->FreePool (OptionList);
|
gBS->FreePool (OptionList);
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -255,47 +252,47 @@ ParseDhcp6Ack (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
GetDns4ServerFromDhcp4 (
|
GetDns4ServerFromDhcp4 (
|
||||||
IN DNS_INSTANCE *Instance,
|
IN DNS_INSTANCE *Instance,
|
||||||
OUT UINT32 *DnsServerCount,
|
OUT UINT32 *DnsServerCount,
|
||||||
OUT EFI_IPv4_ADDRESS **DnsServerList
|
OUT EFI_IPv4_ADDRESS **DnsServerList
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_HANDLE Image;
|
EFI_HANDLE Image;
|
||||||
EFI_HANDLE Controller;
|
EFI_HANDLE Controller;
|
||||||
EFI_STATUS MediaStatus;
|
EFI_STATUS MediaStatus;
|
||||||
EFI_HANDLE MnpChildHandle;
|
EFI_HANDLE MnpChildHandle;
|
||||||
EFI_MANAGED_NETWORK_PROTOCOL *Mnp;
|
EFI_MANAGED_NETWORK_PROTOCOL *Mnp;
|
||||||
EFI_MANAGED_NETWORK_CONFIG_DATA MnpConfigData;
|
EFI_MANAGED_NETWORK_CONFIG_DATA MnpConfigData;
|
||||||
EFI_HANDLE Dhcp4Handle;
|
EFI_HANDLE Dhcp4Handle;
|
||||||
EFI_DHCP4_PROTOCOL *Dhcp4;
|
EFI_DHCP4_PROTOCOL *Dhcp4;
|
||||||
EFI_IP4_CONFIG2_PROTOCOL *Ip4Config2;
|
EFI_IP4_CONFIG2_PROTOCOL *Ip4Config2;
|
||||||
UINTN DataSize;
|
UINTN DataSize;
|
||||||
VOID *Data;
|
VOID *Data;
|
||||||
EFI_IP4_CONFIG2_INTERFACE_INFO *InterfaceInfo;
|
EFI_IP4_CONFIG2_INTERFACE_INFO *InterfaceInfo;
|
||||||
EFI_DHCP4_PACKET SeedPacket;
|
EFI_DHCP4_PACKET SeedPacket;
|
||||||
EFI_DHCP4_PACKET_OPTION *ParaList[2];
|
EFI_DHCP4_PACKET_OPTION *ParaList[2];
|
||||||
DNS4_SERVER_INFOR DnsServerInfor;
|
DNS4_SERVER_INFOR DnsServerInfor;
|
||||||
|
|
||||||
EFI_DHCP4_TRANSMIT_RECEIVE_TOKEN Token;
|
EFI_DHCP4_TRANSMIT_RECEIVE_TOKEN Token;
|
||||||
BOOLEAN IsDone;
|
BOOLEAN IsDone;
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
|
|
||||||
Image = Instance->Service->ImageHandle;
|
Image = Instance->Service->ImageHandle;
|
||||||
Controller = Instance->Service->ControllerHandle;
|
Controller = Instance->Service->ControllerHandle;
|
||||||
|
|
||||||
MnpChildHandle = NULL;
|
MnpChildHandle = NULL;
|
||||||
Mnp = NULL;
|
Mnp = NULL;
|
||||||
|
|
||||||
Dhcp4Handle = NULL;
|
Dhcp4Handle = NULL;
|
||||||
Dhcp4 = NULL;
|
Dhcp4 = NULL;
|
||||||
|
|
||||||
Ip4Config2 = NULL;
|
Ip4Config2 = NULL;
|
||||||
DataSize = 0;
|
DataSize = 0;
|
||||||
Data = NULL;
|
Data = NULL;
|
||||||
InterfaceInfo = NULL;
|
InterfaceInfo = NULL;
|
||||||
|
|
||||||
ZeroMem ((UINT8 *) ParaList, sizeof (ParaList));
|
ZeroMem ((UINT8 *)ParaList, sizeof (ParaList));
|
||||||
|
|
||||||
ZeroMem (&MnpConfigData, sizeof (EFI_MANAGED_NETWORK_CONFIG_DATA));
|
ZeroMem (&MnpConfigData, sizeof (EFI_MANAGED_NETWORK_CONFIG_DATA));
|
||||||
|
|
||||||
@ -332,7 +329,7 @@ GetDns4ServerFromDhcp4 (
|
|||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
MnpChildHandle,
|
MnpChildHandle,
|
||||||
&gEfiManagedNetworkProtocolGuid,
|
&gEfiManagedNetworkProtocolGuid,
|
||||||
(VOID **) &Mnp,
|
(VOID **)&Mnp,
|
||||||
Image,
|
Image,
|
||||||
Controller,
|
Controller,
|
||||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||||
@ -352,7 +349,7 @@ GetDns4ServerFromDhcp4 (
|
|||||||
MnpConfigData.EnableReceiveTimestamps = FALSE;
|
MnpConfigData.EnableReceiveTimestamps = FALSE;
|
||||||
MnpConfigData.DisableBackgroundPolling = FALSE;
|
MnpConfigData.DisableBackgroundPolling = FALSE;
|
||||||
|
|
||||||
Status = Mnp->Configure(Mnp, &MnpConfigData);
|
Status = Mnp->Configure (Mnp, &MnpConfigData);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
}
|
}
|
||||||
@ -373,7 +370,7 @@ GetDns4ServerFromDhcp4 (
|
|||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
Dhcp4Handle,
|
Dhcp4Handle,
|
||||||
&gEfiDhcp4ProtocolGuid,
|
&gEfiDhcp4ProtocolGuid,
|
||||||
(VOID **) &Dhcp4,
|
(VOID **)&Dhcp4,
|
||||||
Image,
|
Image,
|
||||||
Controller,
|
Controller,
|
||||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||||
@ -385,13 +382,13 @@ GetDns4ServerFromDhcp4 (
|
|||||||
//
|
//
|
||||||
// Get Ip4Config2 instance info.
|
// Get Ip4Config2 instance info.
|
||||||
//
|
//
|
||||||
Status = gBS->HandleProtocol (Controller, &gEfiIp4Config2ProtocolGuid, (VOID **) &Ip4Config2);
|
Status = gBS->HandleProtocol (Controller, &gEfiIp4Config2ProtocolGuid, (VOID **)&Ip4Config2);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = Ip4Config2->GetData (Ip4Config2, Ip4Config2DataTypeInterfaceInfo, &DataSize, Data);
|
Status = Ip4Config2->GetData (Ip4Config2, Ip4Config2DataTypeInterfaceInfo, &DataSize, Data);
|
||||||
if (EFI_ERROR (Status) && Status != EFI_BUFFER_TOO_SMALL) {
|
if (EFI_ERROR (Status) && (Status != EFI_BUFFER_TOO_SMALL)) {
|
||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -470,7 +467,7 @@ GetDns4ServerFromDhcp4 (
|
|||||||
|
|
||||||
Status = Dhcp4->Build (Dhcp4, &SeedPacket, 0, NULL, 2, ParaList, &Token.Packet);
|
Status = Dhcp4->Build (Dhcp4, &SeedPacket, 0, NULL, 2, ParaList, &Token.Packet);
|
||||||
|
|
||||||
Token.Packet->Dhcp4.Header.Xid = HTONL(NET_RANDOM (NetRandomInitSeed ()));
|
Token.Packet->Dhcp4.Header.Xid = HTONL (NET_RANDOM (NetRandomInitSeed ()));
|
||||||
|
|
||||||
Token.Packet->Dhcp4.Header.Reserved = HTONS ((UINT16)0x8000);
|
Token.Packet->Dhcp4.Header.Reserved = HTONS ((UINT16)0x8000);
|
||||||
|
|
||||||
@ -601,10 +598,10 @@ ON_EXIT:
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
GetDns6ServerFromDhcp6 (
|
GetDns6ServerFromDhcp6 (
|
||||||
IN EFI_HANDLE Image,
|
IN EFI_HANDLE Image,
|
||||||
IN EFI_HANDLE Controller,
|
IN EFI_HANDLE Controller,
|
||||||
OUT UINT32 *DnsServerCount,
|
OUT UINT32 *DnsServerCount,
|
||||||
OUT EFI_IPv6_ADDRESS **DnsServerList
|
OUT EFI_IPv6_ADDRESS **DnsServerList
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_HANDLE Dhcp6Handle;
|
EFI_HANDLE Dhcp6Handle;
|
||||||
@ -651,7 +648,7 @@ GetDns6ServerFromDhcp6 (
|
|||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
Dhcp6Handle,
|
Dhcp6Handle,
|
||||||
&gEfiDhcp6ProtocolGuid,
|
&gEfiDhcp6ProtocolGuid,
|
||||||
(VOID **) &Dhcp6,
|
(VOID **)&Dhcp6,
|
||||||
Image,
|
Image,
|
||||||
Controller,
|
Controller,
|
||||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||||
@ -724,7 +721,7 @@ GetDns6ServerFromDhcp6 (
|
|||||||
} while (TimerStatus == EFI_NOT_READY);
|
} while (TimerStatus == EFI_NOT_READY);
|
||||||
}
|
}
|
||||||
|
|
||||||
*DnsServerList = DnsServerInfor.ServerList;
|
*DnsServerList = DnsServerInfor.ServerList;
|
||||||
|
|
||||||
ON_EXIT:
|
ON_EXIT:
|
||||||
|
|
||||||
@ -753,6 +750,4 @@ ON_EXIT:
|
|||||||
);
|
);
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,39 +14,38 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
//
|
//
|
||||||
#pragma pack(1)
|
#pragma pack(1)
|
||||||
|
|
||||||
#define IP4_ETHER_PROTO 0x0800
|
#define IP4_ETHER_PROTO 0x0800
|
||||||
|
|
||||||
#define DHCP4_OPCODE_REQUEST 1
|
#define DHCP4_OPCODE_REQUEST 1
|
||||||
#define DHCP4_MAGIC 0x63538263 /// network byte order
|
#define DHCP4_MAGIC 0x63538263 /// network byte order
|
||||||
#define DHCP4_TAG_EOP 255 /// End Option
|
#define DHCP4_TAG_EOP 255 /// End Option
|
||||||
|
|
||||||
#define DHCP4_TAG_TYPE 53
|
#define DHCP4_TAG_TYPE 53
|
||||||
#define DHCP4_MSG_REQUEST 3
|
#define DHCP4_MSG_REQUEST 3
|
||||||
#define DHCP4_MSG_INFORM 8
|
#define DHCP4_MSG_INFORM 8
|
||||||
|
|
||||||
#define DHCP4_TAG_PARA_LIST 55
|
#define DHCP4_TAG_PARA_LIST 55
|
||||||
#define DHCP4_TAG_DNS_SERVER 6
|
#define DHCP4_TAG_DNS_SERVER 6
|
||||||
|
|
||||||
|
#define DHCP6_TAG_DNS_REQUEST 6
|
||||||
|
#define DHCP6_TAG_DNS_SERVER 23
|
||||||
|
|
||||||
#define DHCP6_TAG_DNS_REQUEST 6
|
#define DNS_CHECK_MEDIA_GET_DHCP_WAITING_TIME EFI_TIMER_PERIOD_SECONDS(20)
|
||||||
#define DHCP6_TAG_DNS_SERVER 23
|
|
||||||
|
|
||||||
#define DNS_CHECK_MEDIA_GET_DHCP_WAITING_TIME EFI_TIMER_PERIOD_SECONDS(20)
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// The required Dns4 server information.
|
// The required Dns4 server information.
|
||||||
//
|
//
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINT32 *ServerCount;
|
UINT32 *ServerCount;
|
||||||
EFI_IPv4_ADDRESS *ServerList;
|
EFI_IPv4_ADDRESS *ServerList;
|
||||||
} DNS4_SERVER_INFOR;
|
} DNS4_SERVER_INFOR;
|
||||||
|
|
||||||
//
|
//
|
||||||
// The required Dns6 server information.
|
// The required Dns6 server information.
|
||||||
//
|
//
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINT32 *ServerCount;
|
UINT32 *ServerCount;
|
||||||
EFI_IPv6_ADDRESS *ServerList;
|
EFI_IPv6_ADDRESS *ServerList;
|
||||||
} DNS6_SERVER_INFOR;
|
} DNS6_SERVER_INFOR;
|
||||||
|
|
||||||
#pragma pack()
|
#pragma pack()
|
||||||
@ -66,9 +65,9 @@ typedef struct {
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
ParseDhcp4Ack (
|
ParseDhcp4Ack (
|
||||||
IN EFI_DHCP4_PROTOCOL *Dhcp4,
|
IN EFI_DHCP4_PROTOCOL *Dhcp4,
|
||||||
IN EFI_DHCP4_PACKET *Packet,
|
IN EFI_DHCP4_PACKET *Packet,
|
||||||
IN DNS4_SERVER_INFOR *DnsServerInfor
|
IN DNS4_SERVER_INFOR *DnsServerInfor
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -91,9 +90,9 @@ ParseDhcp4Ack (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
ParseDhcp6Ack (
|
ParseDhcp6Ack (
|
||||||
IN EFI_DHCP6_PROTOCOL *This,
|
IN EFI_DHCP6_PROTOCOL *This,
|
||||||
IN VOID *Context,
|
IN VOID *Context,
|
||||||
IN EFI_DHCP6_PACKET *Packet
|
IN EFI_DHCP6_PACKET *Packet
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -111,9 +110,9 @@ ParseDhcp6Ack (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
GetDns4ServerFromDhcp4 (
|
GetDns4ServerFromDhcp4 (
|
||||||
IN DNS_INSTANCE *Instance,
|
IN DNS_INSTANCE *Instance,
|
||||||
OUT UINT32 *DnsServerCount,
|
OUT UINT32 *DnsServerCount,
|
||||||
OUT EFI_IPv4_ADDRESS **DnsServerList
|
OUT EFI_IPv4_ADDRESS **DnsServerList
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -132,10 +131,10 @@ GetDns4ServerFromDhcp4 (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
GetDns6ServerFromDhcp6 (
|
GetDns6ServerFromDhcp6 (
|
||||||
IN EFI_HANDLE Image,
|
IN EFI_HANDLE Image,
|
||||||
IN EFI_HANDLE Controller,
|
IN EFI_HANDLE Controller,
|
||||||
OUT UINT32 *DnsServerCount,
|
OUT UINT32 *DnsServerCount,
|
||||||
OUT EFI_IPv6_ADDRESS **DnsServerList
|
OUT EFI_IPv6_ADDRESS **DnsServerList
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -8,7 +8,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
|
|
||||||
#include "DnsImpl.h"
|
#include "DnsImpl.h"
|
||||||
|
|
||||||
EFI_DRIVER_BINDING_PROTOCOL gDns4DriverBinding = {
|
EFI_DRIVER_BINDING_PROTOCOL gDns4DriverBinding = {
|
||||||
Dns4DriverBindingSupported,
|
Dns4DriverBindingSupported,
|
||||||
Dns4DriverBindingStart,
|
Dns4DriverBindingStart,
|
||||||
Dns4DriverBindingStop,
|
Dns4DriverBindingStop,
|
||||||
@ -17,7 +17,7 @@ EFI_DRIVER_BINDING_PROTOCOL gDns4DriverBinding = {
|
|||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
EFI_DRIVER_BINDING_PROTOCOL gDns6DriverBinding = {
|
EFI_DRIVER_BINDING_PROTOCOL gDns6DriverBinding = {
|
||||||
Dns6DriverBindingSupported,
|
Dns6DriverBindingSupported,
|
||||||
Dns6DriverBindingStart,
|
Dns6DriverBindingStart,
|
||||||
Dns6DriverBindingStop,
|
Dns6DriverBindingStop,
|
||||||
@ -26,17 +26,17 @@ EFI_DRIVER_BINDING_PROTOCOL gDns6DriverBinding = {
|
|||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
EFI_SERVICE_BINDING_PROTOCOL mDns4ServiceBinding = {
|
EFI_SERVICE_BINDING_PROTOCOL mDns4ServiceBinding = {
|
||||||
Dns4ServiceBindingCreateChild,
|
Dns4ServiceBindingCreateChild,
|
||||||
Dns4ServiceBindingDestroyChild
|
Dns4ServiceBindingDestroyChild
|
||||||
};
|
};
|
||||||
|
|
||||||
EFI_SERVICE_BINDING_PROTOCOL mDns6ServiceBinding = {
|
EFI_SERVICE_BINDING_PROTOCOL mDns6ServiceBinding = {
|
||||||
Dns6ServiceBindingCreateChild,
|
Dns6ServiceBindingCreateChild,
|
||||||
Dns6ServiceBindingDestroyChild
|
Dns6ServiceBindingDestroyChild
|
||||||
};
|
};
|
||||||
|
|
||||||
DNS_DRIVER_DATA *mDriverData = NULL;
|
DNS_DRIVER_DATA *mDriverData = NULL;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Destroy the DNS instance and recycle the resources.
|
Destroy the DNS instance and recycle the resources.
|
||||||
@ -46,7 +46,7 @@ DNS_DRIVER_DATA *mDriverData = NULL;
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
DnsDestroyInstance (
|
DnsDestroyInstance (
|
||||||
IN DNS_INSTANCE *Instance
|
IN DNS_INSTANCE *Instance
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
ZeroMem (&Instance->Dns4CfgData, sizeof (EFI_DNS4_CONFIG_DATA));
|
ZeroMem (&Instance->Dns4CfgData, sizeof (EFI_DNS4_CONFIG_DATA));
|
||||||
@ -61,7 +61,7 @@ DnsDestroyInstance (
|
|||||||
Dns6InstanceCancelToken (Instance, NULL);
|
Dns6InstanceCancelToken (Instance, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Instance->UdpIo!= NULL) {
|
if (Instance->UdpIo != NULL) {
|
||||||
UdpIoFreeIo (Instance->UdpIo);
|
UdpIoFreeIo (Instance->UdpIo);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -80,11 +80,11 @@ DnsDestroyInstance (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
DnsCreateInstance (
|
DnsCreateInstance (
|
||||||
IN DNS_SERVICE *Service,
|
IN DNS_SERVICE *Service,
|
||||||
OUT DNS_INSTANCE **Instance
|
OUT DNS_INSTANCE **Instance
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
DNS_INSTANCE *DnsIns;
|
DNS_INSTANCE *DnsIns;
|
||||||
|
|
||||||
*Instance = NULL;
|
*Instance = NULL;
|
||||||
|
|
||||||
@ -137,8 +137,8 @@ DnsCreateInstance (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
DnsDestroyChildEntryInHandleBuffer (
|
DnsDestroyChildEntryInHandleBuffer (
|
||||||
IN LIST_ENTRY *Entry,
|
IN LIST_ENTRY *Entry,
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
DNS_INSTANCE *Instance;
|
DNS_INSTANCE *Instance;
|
||||||
@ -146,14 +146,14 @@ DnsDestroyChildEntryInHandleBuffer (
|
|||||||
UINTN NumberOfChildren;
|
UINTN NumberOfChildren;
|
||||||
EFI_HANDLE *ChildHandleBuffer;
|
EFI_HANDLE *ChildHandleBuffer;
|
||||||
|
|
||||||
if (Entry == NULL || Context == NULL) {
|
if ((Entry == NULL) || (Context == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
Instance = NET_LIST_USER_STRUCT_S (Entry, DNS_INSTANCE, Link, DNS_INSTANCE_SIGNATURE);
|
Instance = NET_LIST_USER_STRUCT_S (Entry, DNS_INSTANCE, Link, DNS_INSTANCE_SIGNATURE);
|
||||||
ServiceBinding = ((DNS_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT *) Context)->ServiceBinding;
|
ServiceBinding = ((DNS_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT *)Context)->ServiceBinding;
|
||||||
NumberOfChildren = ((DNS_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT *) Context)->NumberOfChildren;
|
NumberOfChildren = ((DNS_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT *)Context)->NumberOfChildren;
|
||||||
ChildHandleBuffer = ((DNS_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT *) Context)->ChildHandleBuffer;
|
ChildHandleBuffer = ((DNS_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT *)Context)->ChildHandleBuffer;
|
||||||
|
|
||||||
if (!NetIsInHandleBuffer (Instance->ChildHandle, NumberOfChildren, ChildHandleBuffer)) {
|
if (!NetIsInHandleBuffer (Instance->ChildHandle, NumberOfChildren, ChildHandleBuffer)) {
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
@ -177,8 +177,8 @@ DnsDestroyChildEntryInHandleBuffer (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
DnsConfigNullUdp (
|
DnsConfigNullUdp (
|
||||||
IN UDP_IO *UdpIo,
|
IN UDP_IO *UdpIo,
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
@ -192,7 +192,7 @@ DnsConfigNullUdp (
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
DnsDestroyService (
|
DnsDestroyService (
|
||||||
IN DNS_SERVICE *DnsSb
|
IN DNS_SERVICE *DnsSb
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UdpIoFreeIo (DnsSb->ConnectUdp);
|
UdpIoFreeIo (DnsSb->ConnectUdp);
|
||||||
@ -227,19 +227,19 @@ DnsDestroyService (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
DnsCreateService (
|
DnsCreateService (
|
||||||
IN EFI_HANDLE Controller,
|
IN EFI_HANDLE Controller,
|
||||||
IN EFI_HANDLE Image,
|
IN EFI_HANDLE Image,
|
||||||
IN UINT8 IpVersion,
|
IN UINT8 IpVersion,
|
||||||
OUT DNS_SERVICE **Service
|
OUT DNS_SERVICE **Service
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
DNS_SERVICE *DnsSb;
|
DNS_SERVICE *DnsSb;
|
||||||
|
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
DnsSb = NULL;
|
DnsSb = NULL;
|
||||||
|
|
||||||
*Service = NULL;
|
*Service = NULL;
|
||||||
|
|
||||||
DnsSb = AllocateZeroPool (sizeof (DNS_SERVICE));
|
DnsSb = AllocateZeroPool (sizeof (DNS_SERVICE));
|
||||||
if (DnsSb == NULL) {
|
if (DnsSb == NULL) {
|
||||||
@ -263,11 +263,11 @@ DnsCreateService (
|
|||||||
DnsSb->ControllerHandle = Controller;
|
DnsSb->ControllerHandle = Controller;
|
||||||
DnsSb->ImageHandle = Image;
|
DnsSb->ImageHandle = Image;
|
||||||
|
|
||||||
DnsSb->TimerToGetMap = NULL;
|
DnsSb->TimerToGetMap = NULL;
|
||||||
|
|
||||||
DnsSb->Timer = NULL;
|
DnsSb->Timer = NULL;
|
||||||
|
|
||||||
DnsSb->IpVersion = IpVersion;
|
DnsSb->IpVersion = IpVersion;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Create the timer used to time out the procedure which is used to
|
// Create the timer used to time out the procedure which is used to
|
||||||
@ -299,6 +299,7 @@ DnsCreateService (
|
|||||||
if (DnsSb->TimerToGetMap != NULL) {
|
if (DnsSb->TimerToGetMap != NULL) {
|
||||||
gBS->CloseEvent (DnsSb->TimerToGetMap);
|
gBS->CloseEvent (DnsSb->TimerToGetMap);
|
||||||
}
|
}
|
||||||
|
|
||||||
FreePool (DnsSb);
|
FreePool (DnsSb);
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
@ -315,6 +316,7 @@ DnsCreateService (
|
|||||||
if (DnsSb->TimerToGetMap != NULL) {
|
if (DnsSb->TimerToGetMap != NULL) {
|
||||||
gBS->CloseEvent (DnsSb->TimerToGetMap);
|
gBS->CloseEvent (DnsSb->TimerToGetMap);
|
||||||
}
|
}
|
||||||
|
|
||||||
gBS->CloseEvent (DnsSb->Timer);
|
gBS->CloseEvent (DnsSb->Timer);
|
||||||
FreePool (DnsSb);
|
FreePool (DnsSb);
|
||||||
return EFI_DEVICE_ERROR;
|
return EFI_DEVICE_ERROR;
|
||||||
@ -341,11 +343,11 @@ DnsUnload (
|
|||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
LIST_ENTRY *Entry;
|
LIST_ENTRY *Entry;
|
||||||
DNS4_CACHE *ItemCache4;
|
DNS4_CACHE *ItemCache4;
|
||||||
DNS4_SERVER_IP *ItemServerIp4;
|
DNS4_SERVER_IP *ItemServerIp4;
|
||||||
DNS6_CACHE *ItemCache6;
|
DNS6_CACHE *ItemCache6;
|
||||||
DNS6_SERVER_IP *ItemServerIp6;
|
DNS6_SERVER_IP *ItemServerIp6;
|
||||||
|
|
||||||
ItemCache4 = NULL;
|
ItemCache4 = NULL;
|
||||||
ItemServerIp4 = NULL;
|
ItemServerIp4 = NULL;
|
||||||
@ -355,7 +357,7 @@ DnsUnload (
|
|||||||
//
|
//
|
||||||
// Disconnect the driver specified by ImageHandle
|
// Disconnect the driver specified by ImageHandle
|
||||||
//
|
//
|
||||||
Status = NetLibDefaultUnload(ImageHandle);
|
Status = NetLibDefaultUnload (ImageHandle);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
@ -493,25 +495,25 @@ DnsDriverEntryPoint (
|
|||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
|
|
||||||
Error4:
|
Error4:
|
||||||
gBS->CloseEvent (mDriverData->Timer);
|
gBS->CloseEvent (mDriverData->Timer);
|
||||||
|
|
||||||
Error3:
|
Error3:
|
||||||
FreePool (mDriverData);
|
FreePool (mDriverData);
|
||||||
|
|
||||||
Error2:
|
Error2:
|
||||||
EfiLibUninstallDriverBindingComponentName2 (
|
EfiLibUninstallDriverBindingComponentName2 (
|
||||||
&gDns6DriverBinding,
|
&gDns6DriverBinding,
|
||||||
&gDnsComponentName,
|
&gDnsComponentName,
|
||||||
&gDnsComponentName2
|
&gDnsComponentName2
|
||||||
);
|
);
|
||||||
|
|
||||||
Error1:
|
Error1:
|
||||||
EfiLibUninstallDriverBindingComponentName2 (
|
EfiLibUninstallDriverBindingComponentName2 (
|
||||||
&gDns4DriverBinding,
|
&gDns4DriverBinding,
|
||||||
&gDnsComponentName,
|
&gDnsComponentName,
|
||||||
&gDnsComponentName2
|
&gDnsComponentName2
|
||||||
);
|
);
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
@ -641,8 +643,8 @@ Dns4DriverBindingStart (
|
|||||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
|
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
DNS_SERVICE *DnsSb;
|
DNS_SERVICE *DnsSb;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
Status = DnsCreateService (ControllerHandle, This->DriverBindingHandle, IP_VERSION_4, &DnsSb);
|
Status = DnsCreateService (ControllerHandle, This->DriverBindingHandle, IP_VERSION_4, &DnsSb);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
@ -712,12 +714,12 @@ Dns4DriverBindingStop (
|
|||||||
IN EFI_HANDLE *ChildHandleBuffer OPTIONAL
|
IN EFI_HANDLE *ChildHandleBuffer OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding;
|
EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding;
|
||||||
DNS_SERVICE *DnsSb;
|
DNS_SERVICE *DnsSb;
|
||||||
EFI_HANDLE NicHandle;
|
EFI_HANDLE NicHandle;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
LIST_ENTRY *List;
|
LIST_ENTRY *List;
|
||||||
DNS_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT Context;
|
DNS_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT Context;
|
||||||
|
|
||||||
//
|
//
|
||||||
// DNS driver opens UDP child, So, Controller is a UDP
|
// DNS driver opens UDP child, So, Controller is a UDP
|
||||||
@ -733,7 +735,7 @@ Dns4DriverBindingStop (
|
|||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
NicHandle,
|
NicHandle,
|
||||||
&gEfiDns4ServiceBindingProtocolGuid,
|
&gEfiDns4ServiceBindingProtocolGuid,
|
||||||
(VOID **) &ServiceBinding,
|
(VOID **)&ServiceBinding,
|
||||||
This->DriverBindingHandle,
|
This->DriverBindingHandle,
|
||||||
NicHandle,
|
NicHandle,
|
||||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||||
@ -748,19 +750,19 @@ Dns4DriverBindingStop (
|
|||||||
//
|
//
|
||||||
// Destroy the Dns child instance in ChildHandleBuffer.
|
// Destroy the Dns child instance in ChildHandleBuffer.
|
||||||
//
|
//
|
||||||
List = &DnsSb->Dns4ChildrenList;
|
List = &DnsSb->Dns4ChildrenList;
|
||||||
Context.ServiceBinding = ServiceBinding;
|
Context.ServiceBinding = ServiceBinding;
|
||||||
Context.NumberOfChildren = NumberOfChildren;
|
Context.NumberOfChildren = NumberOfChildren;
|
||||||
Context.ChildHandleBuffer = ChildHandleBuffer;
|
Context.ChildHandleBuffer = ChildHandleBuffer;
|
||||||
Status = NetDestroyLinkList (
|
Status = NetDestroyLinkList (
|
||||||
List,
|
List,
|
||||||
DnsDestroyChildEntryInHandleBuffer,
|
DnsDestroyChildEntryInHandleBuffer,
|
||||||
&Context,
|
&Context,
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (NumberOfChildren == 0 && IsListEmpty (&DnsSb->Dns4ChildrenList)) {
|
if ((NumberOfChildren == 0) && IsListEmpty (&DnsSb->Dns4ChildrenList)) {
|
||||||
gBS->UninstallProtocolInterface (
|
gBS->UninstallProtocolInterface (
|
||||||
NicHandle,
|
NicHandle,
|
||||||
&gEfiDns4ServiceBindingProtocolGuid,
|
&gEfiDns4ServiceBindingProtocolGuid,
|
||||||
@ -905,8 +907,8 @@ Dns6DriverBindingStart (
|
|||||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
|
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
DNS_SERVICE *DnsSb;
|
DNS_SERVICE *DnsSb;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
Status = DnsCreateService (ControllerHandle, This->DriverBindingHandle, IP_VERSION_6, &DnsSb);
|
Status = DnsCreateService (ControllerHandle, This->DriverBindingHandle, IP_VERSION_6, &DnsSb);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
@ -977,12 +979,12 @@ Dns6DriverBindingStop (
|
|||||||
IN EFI_HANDLE *ChildHandleBuffer OPTIONAL
|
IN EFI_HANDLE *ChildHandleBuffer OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding;
|
EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding;
|
||||||
DNS_SERVICE *DnsSb;
|
DNS_SERVICE *DnsSb;
|
||||||
EFI_HANDLE NicHandle;
|
EFI_HANDLE NicHandle;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
LIST_ENTRY *List;
|
LIST_ENTRY *List;
|
||||||
DNS_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT Context;
|
DNS_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT Context;
|
||||||
|
|
||||||
//
|
//
|
||||||
// DNS driver opens UDP child, So, Controller is a UDP
|
// DNS driver opens UDP child, So, Controller is a UDP
|
||||||
@ -998,7 +1000,7 @@ Dns6DriverBindingStop (
|
|||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
NicHandle,
|
NicHandle,
|
||||||
&gEfiDns6ServiceBindingProtocolGuid,
|
&gEfiDns6ServiceBindingProtocolGuid,
|
||||||
(VOID **) &ServiceBinding,
|
(VOID **)&ServiceBinding,
|
||||||
This->DriverBindingHandle,
|
This->DriverBindingHandle,
|
||||||
NicHandle,
|
NicHandle,
|
||||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||||
@ -1013,19 +1015,19 @@ Dns6DriverBindingStop (
|
|||||||
//
|
//
|
||||||
// Destroy the Dns child instance in ChildHandleBuffer.
|
// Destroy the Dns child instance in ChildHandleBuffer.
|
||||||
//
|
//
|
||||||
List = &DnsSb->Dns6ChildrenList;
|
List = &DnsSb->Dns6ChildrenList;
|
||||||
Context.ServiceBinding = ServiceBinding;
|
Context.ServiceBinding = ServiceBinding;
|
||||||
Context.NumberOfChildren = NumberOfChildren;
|
Context.NumberOfChildren = NumberOfChildren;
|
||||||
Context.ChildHandleBuffer = ChildHandleBuffer;
|
Context.ChildHandleBuffer = ChildHandleBuffer;
|
||||||
Status = NetDestroyLinkList (
|
Status = NetDestroyLinkList (
|
||||||
List,
|
List,
|
||||||
DnsDestroyChildEntryInHandleBuffer,
|
DnsDestroyChildEntryInHandleBuffer,
|
||||||
&Context,
|
&Context,
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (NumberOfChildren == 0 && IsListEmpty (&DnsSb->Dns6ChildrenList)) {
|
if ((NumberOfChildren == 0) && IsListEmpty (&DnsSb->Dns6ChildrenList)) {
|
||||||
gBS->UninstallProtocolInterface (
|
gBS->UninstallProtocolInterface (
|
||||||
NicHandle,
|
NicHandle,
|
||||||
&gEfiDns6ServiceBindingProtocolGuid,
|
&gEfiDns6ServiceBindingProtocolGuid,
|
||||||
@ -1071,11 +1073,11 @@ Dns4ServiceBindingCreateChild (
|
|||||||
IN EFI_HANDLE *ChildHandle
|
IN EFI_HANDLE *ChildHandle
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
DNS_SERVICE *DnsSb;
|
DNS_SERVICE *DnsSb;
|
||||||
DNS_INSTANCE *Instance;
|
DNS_INSTANCE *Instance;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
VOID *Udp4;
|
VOID *Udp4;
|
||||||
|
|
||||||
if ((This == NULL) || (ChildHandle == NULL)) {
|
if ((This == NULL) || (ChildHandle == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
@ -1087,6 +1089,7 @@ Dns4ServiceBindingCreateChild (
|
|||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
ASSERT (Instance != NULL);
|
ASSERT (Instance != NULL);
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -1110,7 +1113,7 @@ Dns4ServiceBindingCreateChild (
|
|||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
DnsSb->ConnectUdp->UdpHandle,
|
DnsSb->ConnectUdp->UdpHandle,
|
||||||
&gEfiUdp4ProtocolGuid,
|
&gEfiUdp4ProtocolGuid,
|
||||||
(VOID **) &Udp4,
|
(VOID **)&Udp4,
|
||||||
gDns4DriverBinding.DriverBindingHandle,
|
gDns4DriverBinding.DriverBindingHandle,
|
||||||
Instance->ChildHandle,
|
Instance->ChildHandle,
|
||||||
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
||||||
@ -1132,7 +1135,7 @@ Dns4ServiceBindingCreateChild (
|
|||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
Instance->UdpIo->UdpHandle,
|
Instance->UdpIo->UdpHandle,
|
||||||
&gEfiUdp4ProtocolGuid,
|
&gEfiUdp4ProtocolGuid,
|
||||||
(VOID **) &Udp4,
|
(VOID **)&Udp4,
|
||||||
gDns4DriverBinding.DriverBindingHandle,
|
gDns4DriverBinding.DriverBindingHandle,
|
||||||
Instance->ChildHandle,
|
Instance->ChildHandle,
|
||||||
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
||||||
@ -1148,12 +1151,12 @@ Dns4ServiceBindingCreateChild (
|
|||||||
*ChildHandle
|
*ChildHandle
|
||||||
);
|
);
|
||||||
|
|
||||||
gBS->UninstallMultipleProtocolInterfaces (
|
gBS->UninstallMultipleProtocolInterfaces (
|
||||||
Instance->ChildHandle,
|
Instance->ChildHandle,
|
||||||
&gEfiDns4ProtocolGuid,
|
&gEfiDns4ProtocolGuid,
|
||||||
&Instance->Dns4,
|
&Instance->Dns4,
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
|
|
||||||
goto ON_ERROR;
|
goto ON_ERROR;
|
||||||
}
|
}
|
||||||
@ -1201,12 +1204,12 @@ Dns4ServiceBindingDestroyChild (
|
|||||||
IN EFI_HANDLE ChildHandle
|
IN EFI_HANDLE ChildHandle
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
DNS_SERVICE *DnsSb;
|
DNS_SERVICE *DnsSb;
|
||||||
DNS_INSTANCE *Instance;
|
DNS_INSTANCE *Instance;
|
||||||
|
|
||||||
EFI_DNS4_PROTOCOL *Dns4;
|
EFI_DNS4_PROTOCOL *Dns4;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
|
|
||||||
if ((This == NULL) || (ChildHandle == NULL)) {
|
if ((This == NULL) || (ChildHandle == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
@ -1218,7 +1221,7 @@ Dns4ServiceBindingDestroyChild (
|
|||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
ChildHandle,
|
ChildHandle,
|
||||||
&gEfiDns4ProtocolGuid,
|
&gEfiDns4ProtocolGuid,
|
||||||
(VOID **) &Dns4,
|
(VOID **)&Dns4,
|
||||||
gDns4DriverBinding.DriverBindingHandle,
|
gDns4DriverBinding.DriverBindingHandle,
|
||||||
ChildHandle,
|
ChildHandle,
|
||||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||||
@ -1228,8 +1231,8 @@ Dns4ServiceBindingDestroyChild (
|
|||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
Instance = DNS_INSTANCE_FROM_THIS_PROTOCOL4 (Dns4);
|
Instance = DNS_INSTANCE_FROM_THIS_PROTOCOL4 (Dns4);
|
||||||
DnsSb = DNS_SERVICE_FROM_THIS (This);
|
DnsSb = DNS_SERVICE_FROM_THIS (This);
|
||||||
|
|
||||||
if (Instance->Service != DnsSb) {
|
if (Instance->Service != DnsSb) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
@ -1314,11 +1317,11 @@ Dns6ServiceBindingCreateChild (
|
|||||||
IN EFI_HANDLE *ChildHandle
|
IN EFI_HANDLE *ChildHandle
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
DNS_SERVICE *DnsSb;
|
DNS_SERVICE *DnsSb;
|
||||||
DNS_INSTANCE *Instance;
|
DNS_INSTANCE *Instance;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
VOID *Udp6;
|
VOID *Udp6;
|
||||||
|
|
||||||
if ((This == NULL) || (ChildHandle == NULL)) {
|
if ((This == NULL) || (ChildHandle == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
@ -1330,6 +1333,7 @@ Dns6ServiceBindingCreateChild (
|
|||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
ASSERT (Instance != NULL);
|
ASSERT (Instance != NULL);
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -1353,7 +1357,7 @@ Dns6ServiceBindingCreateChild (
|
|||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
DnsSb->ConnectUdp->UdpHandle,
|
DnsSb->ConnectUdp->UdpHandle,
|
||||||
&gEfiUdp6ProtocolGuid,
|
&gEfiUdp6ProtocolGuid,
|
||||||
(VOID **) &Udp6,
|
(VOID **)&Udp6,
|
||||||
gDns6DriverBinding.DriverBindingHandle,
|
gDns6DriverBinding.DriverBindingHandle,
|
||||||
Instance->ChildHandle,
|
Instance->ChildHandle,
|
||||||
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
||||||
@ -1375,7 +1379,7 @@ Dns6ServiceBindingCreateChild (
|
|||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
Instance->UdpIo->UdpHandle,
|
Instance->UdpIo->UdpHandle,
|
||||||
&gEfiUdp6ProtocolGuid,
|
&gEfiUdp6ProtocolGuid,
|
||||||
(VOID **) &Udp6,
|
(VOID **)&Udp6,
|
||||||
gDns6DriverBinding.DriverBindingHandle,
|
gDns6DriverBinding.DriverBindingHandle,
|
||||||
Instance->ChildHandle,
|
Instance->ChildHandle,
|
||||||
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
||||||
@ -1391,12 +1395,12 @@ Dns6ServiceBindingCreateChild (
|
|||||||
*ChildHandle
|
*ChildHandle
|
||||||
);
|
);
|
||||||
|
|
||||||
gBS->UninstallMultipleProtocolInterfaces (
|
gBS->UninstallMultipleProtocolInterfaces (
|
||||||
Instance->ChildHandle,
|
Instance->ChildHandle,
|
||||||
&gEfiDns6ProtocolGuid,
|
&gEfiDns6ProtocolGuid,
|
||||||
&Instance->Dns6,
|
&Instance->Dns6,
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
|
|
||||||
goto ON_ERROR;
|
goto ON_ERROR;
|
||||||
}
|
}
|
||||||
@ -1444,12 +1448,12 @@ Dns6ServiceBindingDestroyChild (
|
|||||||
IN EFI_HANDLE ChildHandle
|
IN EFI_HANDLE ChildHandle
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
DNS_SERVICE *DnsSb;
|
DNS_SERVICE *DnsSb;
|
||||||
DNS_INSTANCE *Instance;
|
DNS_INSTANCE *Instance;
|
||||||
|
|
||||||
EFI_DNS6_PROTOCOL *Dns6;
|
EFI_DNS6_PROTOCOL *Dns6;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
|
|
||||||
if ((This == NULL) || (ChildHandle == NULL)) {
|
if ((This == NULL) || (ChildHandle == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
@ -1461,7 +1465,7 @@ Dns6ServiceBindingDestroyChild (
|
|||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
ChildHandle,
|
ChildHandle,
|
||||||
&gEfiDns6ProtocolGuid,
|
&gEfiDns6ProtocolGuid,
|
||||||
(VOID **) &Dns6,
|
(VOID **)&Dns6,
|
||||||
gDns6DriverBinding.DriverBindingHandle,
|
gDns6DriverBinding.DriverBindingHandle,
|
||||||
ChildHandle,
|
ChildHandle,
|
||||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||||
@ -1471,8 +1475,8 @@ Dns6ServiceBindingDestroyChild (
|
|||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
Instance = DNS_INSTANCE_FROM_THIS_PROTOCOL6 (Dns6);
|
Instance = DNS_INSTANCE_FROM_THIS_PROTOCOL6 (Dns6);
|
||||||
DnsSb = DNS_SERVICE_FROM_THIS (This);
|
DnsSb = DNS_SERVICE_FROM_THIS (This);
|
||||||
|
|
||||||
if (Instance->Service != DnsSb) {
|
if (Instance->Service != DnsSb) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
|
@ -15,84 +15,84 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
///
|
///
|
||||||
/// Dns service block
|
/// Dns service block
|
||||||
///
|
///
|
||||||
typedef struct _DNS_DRIVER_DATA DNS_DRIVER_DATA;
|
typedef struct _DNS_DRIVER_DATA DNS_DRIVER_DATA;
|
||||||
|
|
||||||
///
|
///
|
||||||
/// Dns service block
|
/// Dns service block
|
||||||
///
|
///
|
||||||
typedef struct _DNS_SERVICE DNS_SERVICE;
|
typedef struct _DNS_SERVICE DNS_SERVICE;
|
||||||
|
|
||||||
///
|
///
|
||||||
/// Dns instance block
|
/// Dns instance block
|
||||||
///
|
///
|
||||||
typedef struct _DNS_INSTANCE DNS_INSTANCE;
|
typedef struct _DNS_INSTANCE DNS_INSTANCE;
|
||||||
|
|
||||||
#define DNS_SERVICE_SIGNATURE SIGNATURE_32 ('D', 'N', 'S', 'S')
|
#define DNS_SERVICE_SIGNATURE SIGNATURE_32 ('D', 'N', 'S', 'S')
|
||||||
|
|
||||||
#define DNS_INSTANCE_SIGNATURE SIGNATURE_32 ('D', 'N', 'S', 'I')
|
#define DNS_INSTANCE_SIGNATURE SIGNATURE_32 ('D', 'N', 'S', 'I')
|
||||||
|
|
||||||
struct _DNS_DRIVER_DATA {
|
struct _DNS_DRIVER_DATA {
|
||||||
EFI_EVENT Timer; /// Ticking timer for DNS cache update.
|
EFI_EVENT Timer; /// Ticking timer for DNS cache update.
|
||||||
|
|
||||||
LIST_ENTRY Dns4CacheList;
|
LIST_ENTRY Dns4CacheList;
|
||||||
LIST_ENTRY Dns4ServerList;
|
LIST_ENTRY Dns4ServerList;
|
||||||
|
|
||||||
LIST_ENTRY Dns6CacheList;
|
LIST_ENTRY Dns6CacheList;
|
||||||
LIST_ENTRY Dns6ServerList;
|
LIST_ENTRY Dns6ServerList;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _DNS_SERVICE {
|
struct _DNS_SERVICE {
|
||||||
UINT32 Signature;
|
UINT32 Signature;
|
||||||
EFI_SERVICE_BINDING_PROTOCOL ServiceBinding;
|
EFI_SERVICE_BINDING_PROTOCOL ServiceBinding;
|
||||||
|
|
||||||
UINT16 Dns4ChildrenNum;
|
UINT16 Dns4ChildrenNum;
|
||||||
LIST_ENTRY Dns4ChildrenList;
|
LIST_ENTRY Dns4ChildrenList;
|
||||||
|
|
||||||
UINT16 Dns6ChildrenNum;
|
UINT16 Dns6ChildrenNum;
|
||||||
LIST_ENTRY Dns6ChildrenList;
|
LIST_ENTRY Dns6ChildrenList;
|
||||||
|
|
||||||
EFI_HANDLE ControllerHandle;
|
EFI_HANDLE ControllerHandle;
|
||||||
EFI_HANDLE ImageHandle;
|
EFI_HANDLE ImageHandle;
|
||||||
|
|
||||||
EFI_EVENT TimerToGetMap;
|
EFI_EVENT TimerToGetMap;
|
||||||
|
|
||||||
EFI_EVENT Timer; /// Ticking timer for packet retransmission.
|
EFI_EVENT Timer; /// Ticking timer for packet retransmission.
|
||||||
|
|
||||||
UINT8 IpVersion;
|
UINT8 IpVersion;
|
||||||
UDP_IO *ConnectUdp;
|
UDP_IO *ConnectUdp;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _DNS_INSTANCE {
|
struct _DNS_INSTANCE {
|
||||||
UINT32 Signature;
|
UINT32 Signature;
|
||||||
LIST_ENTRY Link;
|
LIST_ENTRY Link;
|
||||||
|
|
||||||
EFI_DNS4_PROTOCOL Dns4;
|
EFI_DNS4_PROTOCOL Dns4;
|
||||||
EFI_DNS6_PROTOCOL Dns6;
|
EFI_DNS6_PROTOCOL Dns6;
|
||||||
|
|
||||||
INTN State;
|
INTN State;
|
||||||
BOOLEAN InDestroy;
|
BOOLEAN InDestroy;
|
||||||
|
|
||||||
DNS_SERVICE *Service;
|
DNS_SERVICE *Service;
|
||||||
EFI_HANDLE ChildHandle;
|
EFI_HANDLE ChildHandle;
|
||||||
|
|
||||||
EFI_DNS4_CONFIG_DATA Dns4CfgData;
|
EFI_DNS4_CONFIG_DATA Dns4CfgData;
|
||||||
EFI_DNS6_CONFIG_DATA Dns6CfgData;
|
EFI_DNS6_CONFIG_DATA Dns6CfgData;
|
||||||
|
|
||||||
EFI_IP_ADDRESS SessionDnsServer;
|
EFI_IP_ADDRESS SessionDnsServer;
|
||||||
|
|
||||||
NET_MAP Dns4TxTokens;
|
NET_MAP Dns4TxTokens;
|
||||||
NET_MAP Dns6TxTokens;
|
NET_MAP Dns6TxTokens;
|
||||||
|
|
||||||
UDP_IO *UdpIo;
|
UDP_IO *UdpIo;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding;
|
EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding;
|
||||||
UINTN NumberOfChildren;
|
UINTN NumberOfChildren;
|
||||||
EFI_HANDLE *ChildHandleBuffer;
|
EFI_HANDLE *ChildHandleBuffer;
|
||||||
} DNS_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT;
|
} DNS_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT;
|
||||||
|
|
||||||
extern DNS_DRIVER_DATA *mDriverData;
|
extern DNS_DRIVER_DATA *mDriverData;
|
||||||
|
|
||||||
#define DNS_SERVICE_FROM_THIS(a) \
|
#define DNS_SERVICE_FROM_THIS(a) \
|
||||||
CR (a, DNS_SERVICE, ServiceBinding, DNS_SERVICE_SIGNATURE)
|
CR (a, DNS_SERVICE, ServiceBinding, DNS_SERVICE_SIGNATURE)
|
||||||
@ -103,7 +103,6 @@ extern DNS_DRIVER_DATA *mDriverData;
|
|||||||
#define DNS_INSTANCE_FROM_THIS_PROTOCOL6(a) \
|
#define DNS_INSTANCE_FROM_THIS_PROTOCOL6(a) \
|
||||||
CR (a, DNS_INSTANCE, Dns6, DNS_INSTANCE_SIGNATURE)
|
CR (a, DNS_INSTANCE, Dns6, DNS_INSTANCE_SIGNATURE)
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Destroy the DNS instance and recycle the resources.
|
Destroy the DNS instance and recycle the resources.
|
||||||
|
|
||||||
@ -112,7 +111,7 @@ extern DNS_DRIVER_DATA *mDriverData;
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
DnsDestroyInstance (
|
DnsDestroyInstance (
|
||||||
IN DNS_INSTANCE *Instance
|
IN DNS_INSTANCE *Instance
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -127,8 +126,8 @@ DnsDestroyInstance (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
DnsCreateInstance (
|
DnsCreateInstance (
|
||||||
IN DNS_SERVICE *Service,
|
IN DNS_SERVICE *Service,
|
||||||
OUT DNS_INSTANCE **Instance
|
OUT DNS_INSTANCE **Instance
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -144,8 +143,8 @@ DnsCreateInstance (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
DnsDestroyChildEntryInHandleBuffer (
|
DnsDestroyChildEntryInHandleBuffer (
|
||||||
IN LIST_ENTRY *Entry,
|
IN LIST_ENTRY *Entry,
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -163,8 +162,8 @@ DnsDestroyChildEntryInHandleBuffer (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
DnsConfigNullUdp (
|
DnsConfigNullUdp (
|
||||||
IN UDP_IO *UdpIo,
|
IN UDP_IO *UdpIo,
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -175,7 +174,7 @@ DnsConfigNullUdp (
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
DnsDestroyService (
|
DnsDestroyService (
|
||||||
IN DNS_SERVICE *DnsSb
|
IN DNS_SERVICE *DnsSb
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -197,10 +196,10 @@ DnsDestroyService (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
DnsCreateService (
|
DnsCreateService (
|
||||||
IN EFI_HANDLE Controller,
|
IN EFI_HANDLE Controller,
|
||||||
IN EFI_HANDLE Image,
|
IN EFI_HANDLE Image,
|
||||||
IN UINT8 IpVersion,
|
IN UINT8 IpVersion,
|
||||||
OUT DNS_SERVICE **Service
|
OUT DNS_SERVICE **Service
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -594,5 +593,4 @@ Dns6ServiceBindingDestroyChild (
|
|||||||
IN EFI_HANDLE ChildHandle
|
IN EFI_HANDLE ChildHandle
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -70,110 +70,109 @@ extern EFI_DNS6_PROTOCOL mDns6Protocol;
|
|||||||
//
|
//
|
||||||
// DNS related
|
// DNS related
|
||||||
//
|
//
|
||||||
#define DNS_SERVER_PORT 53
|
#define DNS_SERVER_PORT 53
|
||||||
|
|
||||||
#define DNS_PROTOCOL_UDP EFI_IP_PROTO_UDP
|
#define DNS_PROTOCOL_UDP EFI_IP_PROTO_UDP
|
||||||
#define DNS_PROTOCOL_TCP EFI_IP_PROTO_TCP
|
#define DNS_PROTOCOL_TCP EFI_IP_PROTO_TCP
|
||||||
|
|
||||||
#define DNS_STATE_UNCONFIGED 0
|
#define DNS_STATE_UNCONFIGED 0
|
||||||
#define DNS_STATE_CONFIGED 1
|
#define DNS_STATE_CONFIGED 1
|
||||||
#define DNS_STATE_DESTROY 2
|
#define DNS_STATE_DESTROY 2
|
||||||
|
|
||||||
#define DNS_DEFAULT_TIMEOUT 2
|
#define DNS_DEFAULT_TIMEOUT 2
|
||||||
|
|
||||||
#define DNS_TIME_TO_GETMAP 5
|
#define DNS_TIME_TO_GETMAP 5
|
||||||
|
|
||||||
#pragma pack(1)
|
#pragma pack(1)
|
||||||
|
|
||||||
typedef union _DNS_FLAGS DNS_FLAGS;
|
typedef union _DNS_FLAGS DNS_FLAGS;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
LIST_ENTRY AllCacheLink;
|
LIST_ENTRY AllCacheLink;
|
||||||
EFI_DNS4_CACHE_ENTRY DnsCache;
|
EFI_DNS4_CACHE_ENTRY DnsCache;
|
||||||
} DNS4_CACHE;
|
} DNS4_CACHE;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
LIST_ENTRY AllCacheLink;
|
LIST_ENTRY AllCacheLink;
|
||||||
EFI_DNS6_CACHE_ENTRY DnsCache;
|
EFI_DNS6_CACHE_ENTRY DnsCache;
|
||||||
} DNS6_CACHE;
|
} DNS6_CACHE;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
LIST_ENTRY AllServerLink;
|
LIST_ENTRY AllServerLink;
|
||||||
EFI_IPv4_ADDRESS Dns4ServerIp;
|
EFI_IPv4_ADDRESS Dns4ServerIp;
|
||||||
} DNS4_SERVER_IP;
|
} DNS4_SERVER_IP;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
LIST_ENTRY AllServerLink;
|
LIST_ENTRY AllServerLink;
|
||||||
EFI_IPv6_ADDRESS Dns6ServerIp;
|
EFI_IPv6_ADDRESS Dns6ServerIp;
|
||||||
} DNS6_SERVER_IP;
|
} DNS6_SERVER_IP;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINT32 RetryCounting;
|
UINT32 RetryCounting;
|
||||||
UINT32 PacketToLive;
|
UINT32 PacketToLive;
|
||||||
CHAR16 *QueryHostName;
|
CHAR16 *QueryHostName;
|
||||||
EFI_IPv4_ADDRESS QueryIpAddress;
|
EFI_IPv4_ADDRESS QueryIpAddress;
|
||||||
BOOLEAN GeneralLookUp;
|
BOOLEAN GeneralLookUp;
|
||||||
EFI_DNS4_COMPLETION_TOKEN *Token;
|
EFI_DNS4_COMPLETION_TOKEN *Token;
|
||||||
} DNS4_TOKEN_ENTRY;
|
} DNS4_TOKEN_ENTRY;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINT32 RetryCounting;
|
UINT32 RetryCounting;
|
||||||
UINT32 PacketToLive;
|
UINT32 PacketToLive;
|
||||||
CHAR16 *QueryHostName;
|
CHAR16 *QueryHostName;
|
||||||
EFI_IPv6_ADDRESS QueryIpAddress;
|
EFI_IPv6_ADDRESS QueryIpAddress;
|
||||||
BOOLEAN GeneralLookUp;
|
BOOLEAN GeneralLookUp;
|
||||||
EFI_DNS6_COMPLETION_TOKEN *Token;
|
EFI_DNS6_COMPLETION_TOKEN *Token;
|
||||||
} DNS6_TOKEN_ENTRY;
|
} DNS6_TOKEN_ENTRY;
|
||||||
|
|
||||||
union _DNS_FLAGS {
|
union _DNS_FLAGS {
|
||||||
struct {
|
struct {
|
||||||
UINT16 RCode:4;
|
UINT16 RCode : 4;
|
||||||
UINT16 Zero:3;
|
UINT16 Zero : 3;
|
||||||
UINT16 RA:1;
|
UINT16 RA : 1;
|
||||||
UINT16 RD:1;
|
UINT16 RD : 1;
|
||||||
UINT16 TC:1;
|
UINT16 TC : 1;
|
||||||
UINT16 AA:1;
|
UINT16 AA : 1;
|
||||||
UINT16 OpCode:4;
|
UINT16 OpCode : 4;
|
||||||
UINT16 QR:1;
|
UINT16 QR : 1;
|
||||||
} Bits;
|
} Bits;
|
||||||
UINT16 Uint16;
|
UINT16 Uint16;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define DNS_FLAGS_QR_QUERY 0
|
#define DNS_FLAGS_QR_QUERY 0
|
||||||
#define DNS_FLAGS_QR_RESPONSE 1
|
#define DNS_FLAGS_QR_RESPONSE 1
|
||||||
|
|
||||||
#define DNS_FLAGS_OPCODE_STANDARD 0
|
#define DNS_FLAGS_OPCODE_STANDARD 0
|
||||||
#define DNS_FLAGS_OPCODE_INVERSE 1
|
#define DNS_FLAGS_OPCODE_INVERSE 1
|
||||||
#define DNS_FLAGS_OPCODE_SERVER_STATE 2
|
#define DNS_FLAGS_OPCODE_SERVER_STATE 2
|
||||||
|
|
||||||
#define DNS_FLAGS_RCODE_NO_ERROR 0
|
#define DNS_FLAGS_RCODE_NO_ERROR 0
|
||||||
#define DNS_FLAGS_RCODE_NAME_ERROR 3
|
#define DNS_FLAGS_RCODE_NAME_ERROR 3
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINT16 Identification;
|
UINT16 Identification;
|
||||||
DNS_FLAGS Flags;
|
DNS_FLAGS Flags;
|
||||||
UINT16 QuestionsNum;
|
UINT16 QuestionsNum;
|
||||||
UINT16 AnswersNum;
|
UINT16 AnswersNum;
|
||||||
UINT16 AuthorityNum;
|
UINT16 AuthorityNum;
|
||||||
UINT16 AditionalNum;
|
UINT16 AditionalNum;
|
||||||
} DNS_HEADER;
|
} DNS_HEADER;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINT16 Type;
|
UINT16 Type;
|
||||||
UINT16 Class;
|
UINT16 Class;
|
||||||
} DNS_QUERY_SECTION;
|
} DNS_QUERY_SECTION;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINT16 Type;
|
UINT16 Type;
|
||||||
UINT16 Class;
|
UINT16 Class;
|
||||||
UINT32 Ttl;
|
UINT32 Ttl;
|
||||||
UINT16 DataLength;
|
UINT16 DataLength;
|
||||||
} DNS_ANSWER_SECTION;
|
} DNS_ANSWER_SECTION;
|
||||||
|
|
||||||
#define DNS4_DOMAIN L"in-addr.arpa"
|
#define DNS4_DOMAIN L"in-addr.arpa"
|
||||||
#define DNS6_DOMAIN L"IP6.ARPA"
|
#define DNS6_DOMAIN L"IP6.ARPA"
|
||||||
|
|
||||||
|
|
||||||
#pragma pack()
|
#pragma pack()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -188,8 +187,8 @@ typedef struct {
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
Dns4RemoveTokenEntry (
|
Dns4RemoveTokenEntry (
|
||||||
IN NET_MAP *TokenMap,
|
IN NET_MAP *TokenMap,
|
||||||
IN DNS4_TOKEN_ENTRY *TokenEntry
|
IN DNS4_TOKEN_ENTRY *TokenEntry
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -204,8 +203,8 @@ Dns4RemoveTokenEntry (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
Dns6RemoveTokenEntry (
|
Dns6RemoveTokenEntry (
|
||||||
IN NET_MAP *TokenMap,
|
IN NET_MAP *TokenMap,
|
||||||
IN DNS6_TOKEN_ENTRY *TokenEntry
|
IN DNS6_TOKEN_ENTRY *TokenEntry
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -270,9 +269,9 @@ Dns6CancelTokens (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GetDns4TokenEntry (
|
GetDns4TokenEntry (
|
||||||
IN NET_MAP *TokensMap,
|
IN NET_MAP *TokensMap,
|
||||||
IN EFI_DNS4_COMPLETION_TOKEN *Token,
|
IN EFI_DNS4_COMPLETION_TOKEN *Token,
|
||||||
OUT DNS4_TOKEN_ENTRY **TokenEntry
|
OUT DNS4_TOKEN_ENTRY **TokenEntry
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -289,9 +288,9 @@ GetDns4TokenEntry (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
GetDns6TokenEntry (
|
GetDns6TokenEntry (
|
||||||
IN NET_MAP *TokensMap,
|
IN NET_MAP *TokensMap,
|
||||||
IN EFI_DNS6_COMPLETION_TOKEN *Token,
|
IN EFI_DNS6_COMPLETION_TOKEN *Token,
|
||||||
OUT DNS6_TOKEN_ENTRY **TokenEntry
|
OUT DNS6_TOKEN_ENTRY **TokenEntry
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -395,7 +394,7 @@ Dns6CopyConfigure (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
DnsDummyExtFree (
|
DnsDummyExtFree (
|
||||||
IN VOID *Arg
|
IN VOID *Arg
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -415,9 +414,9 @@ DnsDummyExtFree (
|
|||||||
**/
|
**/
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
Dns4GetMapping (
|
Dns4GetMapping (
|
||||||
IN DNS_INSTANCE *Instance,
|
IN DNS_INSTANCE *Instance,
|
||||||
IN UDP_IO *UdpIo,
|
IN UDP_IO *UdpIo,
|
||||||
IN EFI_UDP4_CONFIG_DATA *UdpCfgData
|
IN EFI_UDP4_CONFIG_DATA *UdpCfgData
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -434,9 +433,9 @@ Dns4GetMapping (
|
|||||||
**/
|
**/
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
Dns6GetMapping (
|
Dns6GetMapping (
|
||||||
IN DNS_INSTANCE *Instance,
|
IN DNS_INSTANCE *Instance,
|
||||||
IN UDP_IO *UdpIo,
|
IN UDP_IO *UdpIo,
|
||||||
IN EFI_UDP6_CONFIG_DATA *UdpCfgData
|
IN EFI_UDP6_CONFIG_DATA *UdpCfgData
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -451,8 +450,8 @@ Dns6GetMapping (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
Dns4ConfigUdp (
|
Dns4ConfigUdp (
|
||||||
IN DNS_INSTANCE *Instance,
|
IN DNS_INSTANCE *Instance,
|
||||||
IN UDP_IO *UdpIo
|
IN UDP_IO *UdpIo
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -467,8 +466,8 @@ Dns4ConfigUdp (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
Dns6ConfigUdp (
|
Dns6ConfigUdp (
|
||||||
IN DNS_INSTANCE *Instance,
|
IN DNS_INSTANCE *Instance,
|
||||||
IN UDP_IO *UdpIo
|
IN UDP_IO *UdpIo
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -488,10 +487,10 @@ Dns6ConfigUdp (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
UpdateDns4Cache (
|
UpdateDns4Cache (
|
||||||
IN LIST_ENTRY *Dns4CacheList,
|
IN LIST_ENTRY *Dns4CacheList,
|
||||||
IN BOOLEAN DeleteFlag,
|
IN BOOLEAN DeleteFlag,
|
||||||
IN BOOLEAN Override,
|
IN BOOLEAN Override,
|
||||||
IN EFI_DNS4_CACHE_ENTRY DnsCacheEntry
|
IN EFI_DNS4_CACHE_ENTRY DnsCacheEntry
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -510,10 +509,10 @@ UpdateDns4Cache (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
UpdateDns6Cache (
|
UpdateDns6Cache (
|
||||||
IN LIST_ENTRY *Dns6CacheList,
|
IN LIST_ENTRY *Dns6CacheList,
|
||||||
IN BOOLEAN DeleteFlag,
|
IN BOOLEAN DeleteFlag,
|
||||||
IN BOOLEAN Override,
|
IN BOOLEAN Override,
|
||||||
IN EFI_DNS6_CACHE_ENTRY DnsCacheEntry
|
IN EFI_DNS6_CACHE_ENTRY DnsCacheEntry
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -529,8 +528,8 @@ UpdateDns6Cache (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
AddDns4ServerIp (
|
AddDns4ServerIp (
|
||||||
IN LIST_ENTRY *Dns4ServerList,
|
IN LIST_ENTRY *Dns4ServerList,
|
||||||
IN EFI_IPv4_ADDRESS ServerIp
|
IN EFI_IPv4_ADDRESS ServerIp
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -546,8 +545,8 @@ AddDns4ServerIp (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
AddDns6ServerIp (
|
AddDns6ServerIp (
|
||||||
IN LIST_ENTRY *Dns6ServerList,
|
IN LIST_ENTRY *Dns6ServerList,
|
||||||
IN EFI_IPv6_ADDRESS ServerIp
|
IN EFI_IPv6_ADDRESS ServerIp
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -565,11 +564,11 @@ AddDns6ServerIp (
|
|||||||
**/
|
**/
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
IsValidDnsResponse (
|
IsValidDnsResponse (
|
||||||
IN NET_MAP *TokensMap,
|
IN NET_MAP *TokensMap,
|
||||||
IN UINT16 Identification,
|
IN UINT16 Identification,
|
||||||
IN UINT16 Type,
|
IN UINT16 Type,
|
||||||
IN UINT16 Class,
|
IN UINT16 Class,
|
||||||
OUT NET_MAP_ITEM **Item
|
OUT NET_MAP_ITEM **Item
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -586,10 +585,10 @@ IsValidDnsResponse (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
ParseDnsResponse (
|
ParseDnsResponse (
|
||||||
IN OUT DNS_INSTANCE *Instance,
|
IN OUT DNS_INSTANCE *Instance,
|
||||||
IN UINT8 *RxString,
|
IN UINT8 *RxString,
|
||||||
IN UINT32 Length,
|
IN UINT32 Length,
|
||||||
OUT BOOLEAN *Completed
|
OUT BOOLEAN *Completed
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -604,10 +603,10 @@ ParseDnsResponse (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
DnsOnPacketReceived (
|
DnsOnPacketReceived (
|
||||||
NET_BUF *Packet,
|
NET_BUF *Packet,
|
||||||
UDP_END_POINT *EndPoint,
|
UDP_END_POINT *EndPoint,
|
||||||
EFI_STATUS IoStatus,
|
EFI_STATUS IoStatus,
|
||||||
VOID *Context
|
VOID *Context
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -622,10 +621,10 @@ DnsOnPacketReceived (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
DnsOnPacketSent (
|
DnsOnPacketSent (
|
||||||
NET_BUF *Packet,
|
NET_BUF *Packet,
|
||||||
UDP_END_POINT *EndPoint,
|
UDP_END_POINT *EndPoint,
|
||||||
EFI_STATUS IoStatus,
|
EFI_STATUS IoStatus,
|
||||||
VOID *Context
|
VOID *Context
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -640,8 +639,8 @@ DnsOnPacketSent (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
DoDnsQuery (
|
DoDnsQuery (
|
||||||
IN DNS_INSTANCE *Instance,
|
IN DNS_INSTANCE *Instance,
|
||||||
IN NET_BUF *Packet
|
IN NET_BUF *Packet
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -659,11 +658,11 @@ DoDnsQuery (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
ConstructDNSQuery (
|
ConstructDNSQuery (
|
||||||
IN DNS_INSTANCE *Instance,
|
IN DNS_INSTANCE *Instance,
|
||||||
IN CHAR8 *QueryName,
|
IN CHAR8 *QueryName,
|
||||||
IN UINT16 Type,
|
IN UINT16 Type,
|
||||||
IN UINT16 Class,
|
IN UINT16 Class,
|
||||||
OUT NET_BUF **Packet
|
OUT NET_BUF **Packet
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -678,8 +677,8 @@ ConstructDNSQuery (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
DnsRetransmit (
|
DnsRetransmit (
|
||||||
IN DNS_INSTANCE *Instance,
|
IN DNS_INSTANCE *Instance,
|
||||||
IN NET_BUF *Packet
|
IN NET_BUF *Packet
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -692,8 +691,8 @@ DnsRetransmit (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
DnsOnTimerRetransmit (
|
DnsOnTimerRetransmit (
|
||||||
IN EFI_EVENT Event,
|
IN EFI_EVENT Event,
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -706,11 +705,10 @@ DnsOnTimerRetransmit (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
DnsOnTimerUpdate (
|
DnsOnTimerUpdate (
|
||||||
IN EFI_EVENT Event,
|
IN EFI_EVENT Event,
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Retrieve mode data of this DNS instance.
|
Retrieve mode data of this DNS instance.
|
||||||
|
|
||||||
@ -729,8 +727,8 @@ DnsOnTimerUpdate (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
Dns4GetModeData (
|
Dns4GetModeData (
|
||||||
IN EFI_DNS4_PROTOCOL *This,
|
IN EFI_DNS4_PROTOCOL *This,
|
||||||
OUT EFI_DNS4_MODE_DATA *DnsModeData
|
OUT EFI_DNS4_MODE_DATA *DnsModeData
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -761,8 +759,8 @@ Dns4GetModeData (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
Dns4Configure (
|
Dns4Configure (
|
||||||
IN EFI_DNS4_PROTOCOL *This,
|
IN EFI_DNS4_PROTOCOL *This,
|
||||||
IN EFI_DNS4_CONFIG_DATA *DnsConfigData
|
IN EFI_DNS4_CONFIG_DATA *DnsConfigData
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -789,7 +787,7 @@ EFI_STATUS
|
|||||||
EFIAPI
|
EFIAPI
|
||||||
Dns4HostNameToIp (
|
Dns4HostNameToIp (
|
||||||
IN EFI_DNS4_PROTOCOL *This,
|
IN EFI_DNS4_PROTOCOL *This,
|
||||||
IN CHAR16 *HostName,
|
IN CHAR16 *HostName,
|
||||||
IN EFI_DNS4_COMPLETION_TOKEN *Token
|
IN EFI_DNS4_COMPLETION_TOKEN *Token
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -818,9 +816,9 @@ Dns4HostNameToIp (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
Dns4IpToHostName (
|
Dns4IpToHostName (
|
||||||
IN EFI_DNS4_PROTOCOL *This,
|
IN EFI_DNS4_PROTOCOL *This,
|
||||||
IN EFI_IPv4_ADDRESS IpAddress,
|
IN EFI_IPv4_ADDRESS IpAddress,
|
||||||
IN EFI_DNS4_COMPLETION_TOKEN *Token
|
IN EFI_DNS4_COMPLETION_TOKEN *Token
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -853,11 +851,11 @@ Dns4IpToHostName (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
Dns4GeneralLookUp (
|
Dns4GeneralLookUp (
|
||||||
IN EFI_DNS4_PROTOCOL *This,
|
IN EFI_DNS4_PROTOCOL *This,
|
||||||
IN CHAR8 *QName,
|
IN CHAR8 *QName,
|
||||||
IN UINT16 QType,
|
IN UINT16 QType,
|
||||||
IN UINT16 QClass,
|
IN UINT16 QClass,
|
||||||
IN EFI_DNS4_COMPLETION_TOKEN *Token
|
IN EFI_DNS4_COMPLETION_TOKEN *Token
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -889,10 +887,10 @@ Dns4GeneralLookUp (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
Dns4UpdateDnsCache (
|
Dns4UpdateDnsCache (
|
||||||
IN EFI_DNS4_PROTOCOL *This,
|
IN EFI_DNS4_PROTOCOL *This,
|
||||||
IN BOOLEAN DeleteFlag,
|
IN BOOLEAN DeleteFlag,
|
||||||
IN BOOLEAN Override,
|
IN BOOLEAN Override,
|
||||||
IN EFI_DNS4_CACHE_ENTRY DnsCacheEntry
|
IN EFI_DNS4_CACHE_ENTRY DnsCacheEntry
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -919,7 +917,7 @@ Dns4UpdateDnsCache (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
Dns4Poll (
|
Dns4Poll (
|
||||||
IN EFI_DNS4_PROTOCOL *This
|
IN EFI_DNS4_PROTOCOL *This
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -954,7 +952,6 @@ Dns4Cancel (
|
|||||||
IN EFI_DNS4_COMPLETION_TOKEN *Token
|
IN EFI_DNS4_COMPLETION_TOKEN *Token
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Retrieve mode data of this DNS instance.
|
Retrieve mode data of this DNS instance.
|
||||||
|
|
||||||
@ -974,8 +971,8 @@ Dns4Cancel (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
Dns6GetModeData (
|
Dns6GetModeData (
|
||||||
IN EFI_DNS6_PROTOCOL *This,
|
IN EFI_DNS6_PROTOCOL *This,
|
||||||
OUT EFI_DNS6_MODE_DATA *DnsModeData
|
OUT EFI_DNS6_MODE_DATA *DnsModeData
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1004,8 +1001,8 @@ Dns6GetModeData (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
Dns6Configure (
|
Dns6Configure (
|
||||||
IN EFI_DNS6_PROTOCOL *This,
|
IN EFI_DNS6_PROTOCOL *This,
|
||||||
IN EFI_DNS6_CONFIG_DATA *DnsConfigData
|
IN EFI_DNS6_CONFIG_DATA *DnsConfigData
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1064,9 +1061,9 @@ Dns6HostNameToIp (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
Dns6IpToHostName (
|
Dns6IpToHostName (
|
||||||
IN EFI_DNS6_PROTOCOL *This,
|
IN EFI_DNS6_PROTOCOL *This,
|
||||||
IN EFI_IPv6_ADDRESS IpAddress,
|
IN EFI_IPv6_ADDRESS IpAddress,
|
||||||
IN EFI_DNS6_COMPLETION_TOKEN *Token
|
IN EFI_DNS6_COMPLETION_TOKEN *Token
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1101,11 +1098,11 @@ Dns6IpToHostName (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
Dns6GeneralLookUp (
|
Dns6GeneralLookUp (
|
||||||
IN EFI_DNS6_PROTOCOL *This,
|
IN EFI_DNS6_PROTOCOL *This,
|
||||||
IN CHAR8 *QName,
|
IN CHAR8 *QName,
|
||||||
IN UINT16 QType,
|
IN UINT16 QType,
|
||||||
IN UINT16 QClass,
|
IN UINT16 QClass,
|
||||||
IN EFI_DNS6_COMPLETION_TOKEN *Token
|
IN EFI_DNS6_COMPLETION_TOKEN *Token
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1138,10 +1135,10 @@ Dns6GeneralLookUp (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
Dns6UpdateDnsCache (
|
Dns6UpdateDnsCache (
|
||||||
IN EFI_DNS6_PROTOCOL *This,
|
IN EFI_DNS6_PROTOCOL *This,
|
||||||
IN BOOLEAN DeleteFlag,
|
IN BOOLEAN DeleteFlag,
|
||||||
IN BOOLEAN Override,
|
IN BOOLEAN Override,
|
||||||
IN EFI_DNS6_CACHE_ENTRY DnsCacheEntry
|
IN EFI_DNS6_CACHE_ENTRY DnsCacheEntry
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1170,7 +1167,7 @@ Dns6UpdateDnsCache (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
Dns6Poll (
|
Dns6Poll (
|
||||||
IN EFI_DNS6_PROTOCOL *This
|
IN EFI_DNS6_PROTOCOL *This
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -48,24 +48,24 @@ EFI_DNS6_PROTOCOL mDns6Protocol = {
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
Dns4GetModeData (
|
Dns4GetModeData (
|
||||||
IN EFI_DNS4_PROTOCOL *This,
|
IN EFI_DNS4_PROTOCOL *This,
|
||||||
OUT EFI_DNS4_MODE_DATA *DnsModeData
|
OUT EFI_DNS4_MODE_DATA *DnsModeData
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
DNS_INSTANCE *Instance;
|
DNS_INSTANCE *Instance;
|
||||||
|
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
|
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
|
|
||||||
LIST_ENTRY *Entry;
|
LIST_ENTRY *Entry;
|
||||||
LIST_ENTRY *Next;
|
LIST_ENTRY *Next;
|
||||||
|
|
||||||
DNS4_SERVER_IP *ServerItem;
|
DNS4_SERVER_IP *ServerItem;
|
||||||
EFI_IPv4_ADDRESS *ServerList;
|
EFI_IPv4_ADDRESS *ServerList;
|
||||||
DNS4_CACHE *CacheItem;
|
DNS4_CACHE *CacheItem;
|
||||||
EFI_DNS4_CACHE_ENTRY *CacheList;
|
EFI_DNS4_CACHE_ENTRY *CacheList;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
ServerItem = NULL;
|
ServerItem = NULL;
|
||||||
ServerList = NULL;
|
ServerList = NULL;
|
||||||
@ -73,7 +73,6 @@ Dns4GetModeData (
|
|||||||
CacheList = NULL;
|
CacheList = NULL;
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
|
|
||||||
|
|
||||||
if ((This == NULL) || (DnsModeData == NULL)) {
|
if ((This == NULL) || (DnsModeData == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
@ -103,8 +102,8 @@ Dns4GetModeData (
|
|||||||
NET_LIST_FOR_EACH_SAFE (Entry, Next, &mDriverData->Dns4ServerList) {
|
NET_LIST_FOR_EACH_SAFE (Entry, Next, &mDriverData->Dns4ServerList) {
|
||||||
Index++;
|
Index++;
|
||||||
}
|
}
|
||||||
DnsModeData->DnsServerCount = (UINT32) Index;
|
DnsModeData->DnsServerCount = (UINT32)Index;
|
||||||
ServerList = AllocatePool (sizeof (EFI_IPv4_ADDRESS) * DnsModeData->DnsServerCount);
|
ServerList = AllocatePool (sizeof (EFI_IPv4_ADDRESS) * DnsModeData->DnsServerCount);
|
||||||
if (ServerList == NULL) {
|
if (ServerList == NULL) {
|
||||||
Status = EFI_OUT_OF_RESOURCES;
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
Dns4CleanConfigure (&DnsModeData->DnsConfigData);
|
Dns4CleanConfigure (&DnsModeData->DnsConfigData);
|
||||||
@ -122,12 +121,12 @@ Dns4GetModeData (
|
|||||||
//
|
//
|
||||||
// Get the DnsCacheCount and DnsCacheList
|
// Get the DnsCacheCount and DnsCacheList
|
||||||
//
|
//
|
||||||
Index =0;
|
Index = 0;
|
||||||
NET_LIST_FOR_EACH_SAFE (Entry, Next, &mDriverData->Dns4CacheList) {
|
NET_LIST_FOR_EACH_SAFE (Entry, Next, &mDriverData->Dns4CacheList) {
|
||||||
Index++;
|
Index++;
|
||||||
}
|
}
|
||||||
DnsModeData->DnsCacheCount = (UINT32) Index;
|
DnsModeData->DnsCacheCount = (UINT32)Index;
|
||||||
CacheList = AllocatePool (sizeof (EFI_DNS4_CACHE_ENTRY) * DnsModeData->DnsCacheCount);
|
CacheList = AllocatePool (sizeof (EFI_DNS4_CACHE_ENTRY) * DnsModeData->DnsCacheCount);
|
||||||
if (CacheList == NULL) {
|
if (CacheList == NULL) {
|
||||||
Status = EFI_OUT_OF_RESOURCES;
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
Dns4CleanConfigure (&DnsModeData->DnsConfigData);
|
Dns4CleanConfigure (&DnsModeData->DnsConfigData);
|
||||||
@ -135,7 +134,7 @@ Dns4GetModeData (
|
|||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
Index =0;
|
Index = 0;
|
||||||
NET_LIST_FOR_EACH_SAFE (Entry, Next, &mDriverData->Dns4CacheList) {
|
NET_LIST_FOR_EACH_SAFE (Entry, Next, &mDriverData->Dns4CacheList) {
|
||||||
CacheItem = NET_LIST_USER_STRUCT (Entry, DNS4_CACHE, AllCacheLink);
|
CacheItem = NET_LIST_USER_STRUCT (Entry, DNS4_CACHE, AllCacheLink);
|
||||||
CopyMem (CacheList + Index, &CacheItem->DnsCache, sizeof (EFI_DNS4_CACHE_ENTRY));
|
CopyMem (CacheList + Index, &CacheItem->DnsCache, sizeof (EFI_DNS4_CACHE_ENTRY));
|
||||||
@ -176,30 +175,31 @@ ON_EXIT:
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
Dns4Configure (
|
Dns4Configure (
|
||||||
IN EFI_DNS4_PROTOCOL *This,
|
IN EFI_DNS4_PROTOCOL *This,
|
||||||
IN EFI_DNS4_CONFIG_DATA *DnsConfigData
|
IN EFI_DNS4_CONFIG_DATA *DnsConfigData
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
DNS_INSTANCE *Instance;
|
DNS_INSTANCE *Instance;
|
||||||
|
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
IP4_ADDR Ip;
|
IP4_ADDR Ip;
|
||||||
IP4_ADDR Netmask;
|
IP4_ADDR Netmask;
|
||||||
|
|
||||||
UINT32 ServerListCount;
|
UINT32 ServerListCount;
|
||||||
EFI_IPv4_ADDRESS *ServerList;
|
EFI_IPv4_ADDRESS *ServerList;
|
||||||
|
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
ServerList = NULL;
|
ServerList = NULL;
|
||||||
|
|
||||||
if (This == NULL ||
|
if ((This == NULL) ||
|
||||||
(DnsConfigData != NULL && ((DnsConfigData->DnsServerListCount != 0 && DnsConfigData->DnsServerList == NULL) ||
|
((DnsConfigData != NULL) && (((DnsConfigData->DnsServerListCount != 0) && (DnsConfigData->DnsServerList == NULL)) ||
|
||||||
(DnsConfigData->DnsServerListCount == 0 && DnsConfigData->DnsServerList != NULL)))) {
|
((DnsConfigData->DnsServerListCount == 0) && (DnsConfigData->DnsServerList != NULL)))))
|
||||||
|
{
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (DnsConfigData != NULL && DnsConfigData->Protocol != DNS_PROTOCOL_UDP) {
|
if ((DnsConfigData != NULL) && (DnsConfigData->Protocol != DNS_PROTOCOL_UDP)) {
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -213,8 +213,8 @@ Dns4Configure (
|
|||||||
//
|
//
|
||||||
// Reset the Instance if ConfigData is NULL
|
// Reset the Instance if ConfigData is NULL
|
||||||
//
|
//
|
||||||
if (!NetMapIsEmpty(&Instance->Dns4TxTokens)) {
|
if (!NetMapIsEmpty (&Instance->Dns4TxTokens)) {
|
||||||
Dns4InstanceCancelToken(Instance, NULL);
|
Dns4InstanceCancelToken (Instance, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Instance->UdpIo != NULL) {
|
if (Instance->UdpIo != NULL) {
|
||||||
@ -224,6 +224,7 @@ Dns4Configure (
|
|||||||
if (Instance->Dns4CfgData.DnsServerList != NULL) {
|
if (Instance->Dns4CfgData.DnsServerList != NULL) {
|
||||||
FreePool (Instance->Dns4CfgData.DnsServerList);
|
FreePool (Instance->Dns4CfgData.DnsServerList);
|
||||||
}
|
}
|
||||||
|
|
||||||
ZeroMem (&Instance->Dns4CfgData, sizeof (EFI_DNS4_CONFIG_DATA));
|
ZeroMem (&Instance->Dns4CfgData, sizeof (EFI_DNS4_CONFIG_DATA));
|
||||||
|
|
||||||
Instance->State = DNS_STATE_UNCONFIGED;
|
Instance->State = DNS_STATE_UNCONFIGED;
|
||||||
@ -234,11 +235,12 @@ Dns4Configure (
|
|||||||
CopyMem (&Ip, &DnsConfigData->StationIp, sizeof (IP4_ADDR));
|
CopyMem (&Ip, &DnsConfigData->StationIp, sizeof (IP4_ADDR));
|
||||||
CopyMem (&Netmask, &DnsConfigData->SubnetMask, sizeof (IP4_ADDR));
|
CopyMem (&Netmask, &DnsConfigData->SubnetMask, sizeof (IP4_ADDR));
|
||||||
|
|
||||||
Ip = NTOHL (Ip);
|
Ip = NTOHL (Ip);
|
||||||
Netmask = NTOHL (Netmask);
|
Netmask = NTOHL (Netmask);
|
||||||
|
|
||||||
if (!DnsConfigData->UseDefaultSetting &&
|
if (!DnsConfigData->UseDefaultSetting &&
|
||||||
((!IP4_IS_VALID_NETMASK (Netmask) || (Netmask != 0 && !NetIp4IsUnicast (Ip, Netmask))))) {
|
((!IP4_IS_VALID_NETMASK (Netmask) || ((Netmask != 0) && !NetIp4IsUnicast (Ip, Netmask)))))
|
||||||
|
{
|
||||||
Status = EFI_INVALID_PARAMETER;
|
Status = EFI_INVALID_PARAMETER;
|
||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
}
|
}
|
||||||
@ -263,7 +265,7 @@ Dns4Configure (
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
ASSERT(ServerList != NULL);
|
ASSERT (ServerList != NULL);
|
||||||
|
|
||||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
||||||
|
|
||||||
@ -281,6 +283,7 @@ Dns4Configure (
|
|||||||
FreePool (Instance->Dns4CfgData.DnsServerList);
|
FreePool (Instance->Dns4CfgData.DnsServerList);
|
||||||
Instance->Dns4CfgData.DnsServerList = NULL;
|
Instance->Dns4CfgData.DnsServerList = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -293,6 +296,7 @@ Dns4Configure (
|
|||||||
FreePool (Instance->Dns4CfgData.DnsServerList);
|
FreePool (Instance->Dns4CfgData.DnsServerList);
|
||||||
Instance->Dns4CfgData.DnsServerList = NULL;
|
Instance->Dns4CfgData.DnsServerList = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -332,23 +336,23 @@ Dns4HostNameToIp (
|
|||||||
IN EFI_DNS4_COMPLETION_TOKEN *Token
|
IN EFI_DNS4_COMPLETION_TOKEN *Token
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
DNS_INSTANCE *Instance;
|
DNS_INSTANCE *Instance;
|
||||||
|
|
||||||
EFI_DNS4_CONFIG_DATA *ConfigData;
|
EFI_DNS4_CONFIG_DATA *ConfigData;
|
||||||
|
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
DNS4_CACHE *Item;
|
DNS4_CACHE *Item;
|
||||||
LIST_ENTRY *Entry;
|
LIST_ENTRY *Entry;
|
||||||
LIST_ENTRY *Next;
|
LIST_ENTRY *Next;
|
||||||
|
|
||||||
CHAR8 *QueryName;
|
CHAR8 *QueryName;
|
||||||
|
|
||||||
DNS4_TOKEN_ENTRY *TokenEntry;
|
DNS4_TOKEN_ENTRY *TokenEntry;
|
||||||
NET_BUF *Packet;
|
NET_BUF *Packet;
|
||||||
|
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
|
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
Item = NULL;
|
Item = NULL;
|
||||||
@ -359,11 +363,11 @@ Dns4HostNameToIp (
|
|||||||
//
|
//
|
||||||
// Validate the parameters
|
// Validate the parameters
|
||||||
//
|
//
|
||||||
if ((This == NULL) || (HostName == NULL) || Token == NULL) {
|
if ((This == NULL) || (HostName == NULL) || (Token == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
||||||
|
|
||||||
Instance = DNS_INSTANCE_FROM_THIS_PROTOCOL4 (This);
|
Instance = DNS_INSTANCE_FROM_THIS_PROTOCOL4 (This);
|
||||||
|
|
||||||
@ -417,7 +421,7 @@ Dns4HostNameToIp (
|
|||||||
}
|
}
|
||||||
|
|
||||||
Token->RspData.H2AData->IpCount = (UINT32)Index;
|
Token->RspData.H2AData->IpCount = (UINT32)Index;
|
||||||
Token->RspData.H2AData->IpList = AllocatePool (sizeof (EFI_IPv4_ADDRESS) * Index);
|
Token->RspData.H2AData->IpList = AllocatePool (sizeof (EFI_IPv4_ADDRESS) * Index);
|
||||||
if (Token->RspData.H2AData->IpList == NULL) {
|
if (Token->RspData.H2AData->IpList == NULL) {
|
||||||
if (Token->RspData.H2AData != NULL) {
|
if (Token->RspData.H2AData != NULL) {
|
||||||
FreePool (Token->RspData.H2AData);
|
FreePool (Token->RspData.H2AData);
|
||||||
@ -430,7 +434,7 @@ Dns4HostNameToIp (
|
|||||||
Index = 0;
|
Index = 0;
|
||||||
NET_LIST_FOR_EACH_SAFE (Entry, Next, &mDriverData->Dns4CacheList) {
|
NET_LIST_FOR_EACH_SAFE (Entry, Next, &mDriverData->Dns4CacheList) {
|
||||||
Item = NET_LIST_USER_STRUCT (Entry, DNS4_CACHE, AllCacheLink);
|
Item = NET_LIST_USER_STRUCT (Entry, DNS4_CACHE, AllCacheLink);
|
||||||
if ((UINT32)Index < Token->RspData.H2AData->IpCount && StrCmp (HostName, Item->DnsCache.HostName) == 0) {
|
if (((UINT32)Index < Token->RspData.H2AData->IpCount) && (StrCmp (HostName, Item->DnsCache.HostName) == 0)) {
|
||||||
CopyMem ((Token->RspData.H2AData->IpList) + Index, Item->DnsCache.IpAddress, sizeof (EFI_IPv4_ADDRESS));
|
CopyMem ((Token->RspData.H2AData->IpList) + Index, Item->DnsCache.IpAddress, sizeof (EFI_IPv4_ADDRESS));
|
||||||
Index++;
|
Index++;
|
||||||
}
|
}
|
||||||
@ -451,14 +455,14 @@ Dns4HostNameToIp (
|
|||||||
//
|
//
|
||||||
// Construct DNS TokenEntry.
|
// Construct DNS TokenEntry.
|
||||||
//
|
//
|
||||||
TokenEntry = AllocateZeroPool (sizeof(DNS4_TOKEN_ENTRY));
|
TokenEntry = AllocateZeroPool (sizeof (DNS4_TOKEN_ENTRY));
|
||||||
if (TokenEntry == NULL) {
|
if (TokenEntry == NULL) {
|
||||||
Status = EFI_OUT_OF_RESOURCES;
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
TokenEntry->PacketToLive = Token->RetryInterval;
|
TokenEntry->PacketToLive = Token->RetryInterval;
|
||||||
TokenEntry->Token = Token;
|
TokenEntry->Token = Token;
|
||||||
TokenEntry->QueryHostName = AllocateZeroPool (StrSize (HostName));
|
TokenEntry->QueryHostName = AllocateZeroPool (StrSize (HostName));
|
||||||
if (TokenEntry->QueryHostName == NULL) {
|
if (TokenEntry->QueryHostName == NULL) {
|
||||||
Status = EFI_OUT_OF_RESOURCES;
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
@ -551,9 +555,9 @@ ON_EXIT:
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
Dns4IpToHostName (
|
Dns4IpToHostName (
|
||||||
IN EFI_DNS4_PROTOCOL *This,
|
IN EFI_DNS4_PROTOCOL *This,
|
||||||
IN EFI_IPv4_ADDRESS IpAddress,
|
IN EFI_IPv4_ADDRESS IpAddress,
|
||||||
IN EFI_DNS4_COMPLETION_TOKEN *Token
|
IN EFI_DNS4_COMPLETION_TOKEN *Token
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
@ -589,23 +593,23 @@ Dns4IpToHostName (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
Dns4GeneralLookUp (
|
Dns4GeneralLookUp (
|
||||||
IN EFI_DNS4_PROTOCOL *This,
|
IN EFI_DNS4_PROTOCOL *This,
|
||||||
IN CHAR8 *QName,
|
IN CHAR8 *QName,
|
||||||
IN UINT16 QType,
|
IN UINT16 QType,
|
||||||
IN UINT16 QClass,
|
IN UINT16 QClass,
|
||||||
IN EFI_DNS4_COMPLETION_TOKEN *Token
|
IN EFI_DNS4_COMPLETION_TOKEN *Token
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
DNS_INSTANCE *Instance;
|
DNS_INSTANCE *Instance;
|
||||||
|
|
||||||
EFI_DNS4_CONFIG_DATA *ConfigData;
|
EFI_DNS4_CONFIG_DATA *ConfigData;
|
||||||
|
|
||||||
DNS4_TOKEN_ENTRY *TokenEntry;
|
DNS4_TOKEN_ENTRY *TokenEntry;
|
||||||
NET_BUF *Packet;
|
NET_BUF *Packet;
|
||||||
|
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
|
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
TokenEntry = NULL;
|
TokenEntry = NULL;
|
||||||
@ -614,11 +618,11 @@ Dns4GeneralLookUp (
|
|||||||
//
|
//
|
||||||
// Validate the parameters
|
// Validate the parameters
|
||||||
//
|
//
|
||||||
if ((This == NULL) || (QName == NULL) || Token == NULL) {
|
if ((This == NULL) || (QName == NULL) || (Token == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
||||||
|
|
||||||
Instance = DNS_INSTANCE_FROM_THIS_PROTOCOL4 (This);
|
Instance = DNS_INSTANCE_FROM_THIS_PROTOCOL4 (This);
|
||||||
|
|
||||||
@ -655,15 +659,15 @@ Dns4GeneralLookUp (
|
|||||||
//
|
//
|
||||||
// Construct DNS TokenEntry.
|
// Construct DNS TokenEntry.
|
||||||
//
|
//
|
||||||
TokenEntry = AllocateZeroPool (sizeof(DNS4_TOKEN_ENTRY));
|
TokenEntry = AllocateZeroPool (sizeof (DNS4_TOKEN_ENTRY));
|
||||||
if (TokenEntry == NULL) {
|
if (TokenEntry == NULL) {
|
||||||
Status = EFI_OUT_OF_RESOURCES;
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
TokenEntry->PacketToLive = Token->RetryInterval;
|
TokenEntry->PacketToLive = Token->RetryInterval;
|
||||||
TokenEntry->GeneralLookUp = TRUE;
|
TokenEntry->GeneralLookUp = TRUE;
|
||||||
TokenEntry->Token = Token;
|
TokenEntry->Token = Token;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Construct DNS Query Packet.
|
// Construct DNS Query Packet.
|
||||||
@ -741,18 +745,18 @@ ON_EXIT:
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
Dns4UpdateDnsCache (
|
Dns4UpdateDnsCache (
|
||||||
IN EFI_DNS4_PROTOCOL *This,
|
IN EFI_DNS4_PROTOCOL *This,
|
||||||
IN BOOLEAN DeleteFlag,
|
IN BOOLEAN DeleteFlag,
|
||||||
IN BOOLEAN Override,
|
IN BOOLEAN Override,
|
||||||
IN EFI_DNS4_CACHE_ENTRY DnsCacheEntry
|
IN EFI_DNS4_CACHE_ENTRY DnsCacheEntry
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
|
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
|
|
||||||
if (DnsCacheEntry.HostName == NULL || DnsCacheEntry.IpAddress == NULL || DnsCacheEntry.Timeout == 0) {
|
if ((DnsCacheEntry.HostName == NULL) || (DnsCacheEntry.IpAddress == NULL) || (DnsCacheEntry.Timeout == 0)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -792,11 +796,11 @@ Dns4UpdateDnsCache (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
Dns4Poll (
|
Dns4Poll (
|
||||||
IN EFI_DNS4_PROTOCOL *This
|
IN EFI_DNS4_PROTOCOL *This
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
DNS_INSTANCE *Instance;
|
DNS_INSTANCE *Instance;
|
||||||
EFI_UDP4_PROTOCOL *Udp;
|
EFI_UDP4_PROTOCOL *Udp;
|
||||||
|
|
||||||
if (This == NULL) {
|
if (This == NULL) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
@ -847,9 +851,9 @@ Dns4Cancel (
|
|||||||
IN EFI_DNS4_COMPLETION_TOKEN *Token
|
IN EFI_DNS4_COMPLETION_TOKEN *Token
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
DNS_INSTANCE *Instance;
|
DNS_INSTANCE *Instance;
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
|
|
||||||
if (This == NULL) {
|
if (This == NULL) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
@ -897,24 +901,24 @@ Dns4Cancel (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
Dns6GetModeData (
|
Dns6GetModeData (
|
||||||
IN EFI_DNS6_PROTOCOL *This,
|
IN EFI_DNS6_PROTOCOL *This,
|
||||||
OUT EFI_DNS6_MODE_DATA *DnsModeData
|
OUT EFI_DNS6_MODE_DATA *DnsModeData
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
DNS_INSTANCE *Instance;
|
DNS_INSTANCE *Instance;
|
||||||
|
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
|
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
|
|
||||||
LIST_ENTRY *Entry;
|
LIST_ENTRY *Entry;
|
||||||
LIST_ENTRY *Next;
|
LIST_ENTRY *Next;
|
||||||
|
|
||||||
DNS6_SERVER_IP *ServerItem;
|
DNS6_SERVER_IP *ServerItem;
|
||||||
EFI_IPv6_ADDRESS *ServerList;
|
EFI_IPv6_ADDRESS *ServerList;
|
||||||
DNS6_CACHE *CacheItem;
|
DNS6_CACHE *CacheItem;
|
||||||
EFI_DNS6_CACHE_ENTRY *CacheList;
|
EFI_DNS6_CACHE_ENTRY *CacheList;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
ServerItem = NULL;
|
ServerItem = NULL;
|
||||||
ServerList = NULL;
|
ServerList = NULL;
|
||||||
@ -928,7 +932,7 @@ Dns6GetModeData (
|
|||||||
|
|
||||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
||||||
|
|
||||||
Instance = DNS_INSTANCE_FROM_THIS_PROTOCOL6 (This);
|
Instance = DNS_INSTANCE_FROM_THIS_PROTOCOL6 (This);
|
||||||
if (Instance->State == DNS_STATE_UNCONFIGED) {
|
if (Instance->State == DNS_STATE_UNCONFIGED) {
|
||||||
Status = EFI_NOT_STARTED;
|
Status = EFI_NOT_STARTED;
|
||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
@ -951,8 +955,8 @@ Dns6GetModeData (
|
|||||||
NET_LIST_FOR_EACH_SAFE (Entry, Next, &mDriverData->Dns6ServerList) {
|
NET_LIST_FOR_EACH_SAFE (Entry, Next, &mDriverData->Dns6ServerList) {
|
||||||
Index++;
|
Index++;
|
||||||
}
|
}
|
||||||
DnsModeData->DnsServerCount = (UINT32) Index;
|
DnsModeData->DnsServerCount = (UINT32)Index;
|
||||||
ServerList = AllocatePool (sizeof(EFI_IPv6_ADDRESS) * DnsModeData->DnsServerCount);
|
ServerList = AllocatePool (sizeof (EFI_IPv6_ADDRESS) * DnsModeData->DnsServerCount);
|
||||||
if (ServerList == NULL) {
|
if (ServerList == NULL) {
|
||||||
Status = EFI_OUT_OF_RESOURCES;
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
Dns6CleanConfigure (&DnsModeData->DnsConfigData);
|
Dns6CleanConfigure (&DnsModeData->DnsConfigData);
|
||||||
@ -970,12 +974,12 @@ Dns6GetModeData (
|
|||||||
//
|
//
|
||||||
// Get the DnsCacheCount and DnsCacheList
|
// Get the DnsCacheCount and DnsCacheList
|
||||||
//
|
//
|
||||||
Index =0;
|
Index = 0;
|
||||||
NET_LIST_FOR_EACH_SAFE (Entry, Next, &mDriverData->Dns6CacheList) {
|
NET_LIST_FOR_EACH_SAFE (Entry, Next, &mDriverData->Dns6CacheList) {
|
||||||
Index++;
|
Index++;
|
||||||
}
|
}
|
||||||
DnsModeData->DnsCacheCount = (UINT32) Index;
|
DnsModeData->DnsCacheCount = (UINT32)Index;
|
||||||
CacheList = AllocatePool (sizeof(EFI_DNS6_CACHE_ENTRY) * DnsModeData->DnsCacheCount);
|
CacheList = AllocatePool (sizeof (EFI_DNS6_CACHE_ENTRY) * DnsModeData->DnsCacheCount);
|
||||||
if (CacheList == NULL) {
|
if (CacheList == NULL) {
|
||||||
Status = EFI_OUT_OF_RESOURCES;
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
Dns6CleanConfigure (&DnsModeData->DnsConfigData);
|
Dns6CleanConfigure (&DnsModeData->DnsConfigData);
|
||||||
@ -983,7 +987,7 @@ Dns6GetModeData (
|
|||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
Index =0;
|
Index = 0;
|
||||||
NET_LIST_FOR_EACH_SAFE (Entry, Next, &mDriverData->Dns6CacheList) {
|
NET_LIST_FOR_EACH_SAFE (Entry, Next, &mDriverData->Dns6CacheList) {
|
||||||
CacheItem = NET_LIST_USER_STRUCT (Entry, DNS6_CACHE, AllCacheLink);
|
CacheItem = NET_LIST_USER_STRUCT (Entry, DNS6_CACHE, AllCacheLink);
|
||||||
CopyMem (CacheList + Index, &CacheItem->DnsCache, sizeof (EFI_DNS6_CACHE_ENTRY));
|
CopyMem (CacheList + Index, &CacheItem->DnsCache, sizeof (EFI_DNS6_CACHE_ENTRY));
|
||||||
@ -1022,28 +1026,29 @@ ON_EXIT:
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
Dns6Configure (
|
Dns6Configure (
|
||||||
IN EFI_DNS6_PROTOCOL *This,
|
IN EFI_DNS6_PROTOCOL *This,
|
||||||
IN EFI_DNS6_CONFIG_DATA *DnsConfigData
|
IN EFI_DNS6_CONFIG_DATA *DnsConfigData
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
DNS_INSTANCE *Instance;
|
DNS_INSTANCE *Instance;
|
||||||
|
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
|
|
||||||
UINT32 ServerListCount;
|
UINT32 ServerListCount;
|
||||||
EFI_IPv6_ADDRESS *ServerList;
|
EFI_IPv6_ADDRESS *ServerList;
|
||||||
|
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
ServerList = NULL;
|
ServerList = NULL;
|
||||||
|
|
||||||
if (This == NULL ||
|
if ((This == NULL) ||
|
||||||
(DnsConfigData != NULL && ((DnsConfigData->DnsServerCount != 0 && DnsConfigData->DnsServerList == NULL) ||
|
((DnsConfigData != NULL) && (((DnsConfigData->DnsServerCount != 0) && (DnsConfigData->DnsServerList == NULL)) ||
|
||||||
(DnsConfigData->DnsServerCount == 0 && DnsConfigData->DnsServerList != NULL)))) {
|
((DnsConfigData->DnsServerCount == 0) && (DnsConfigData->DnsServerList != NULL)))))
|
||||||
|
{
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (DnsConfigData != NULL && DnsConfigData->Protocol != DNS_PROTOCOL_UDP) {
|
if ((DnsConfigData != NULL) && (DnsConfigData->Protocol != DNS_PROTOCOL_UDP)) {
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1057,8 +1062,8 @@ Dns6Configure (
|
|||||||
//
|
//
|
||||||
// Reset the Instance if ConfigData is NULL
|
// Reset the Instance if ConfigData is NULL
|
||||||
//
|
//
|
||||||
if (!NetMapIsEmpty(&Instance->Dns6TxTokens)) {
|
if (!NetMapIsEmpty (&Instance->Dns6TxTokens)) {
|
||||||
Dns6InstanceCancelToken(Instance, NULL);
|
Dns6InstanceCancelToken (Instance, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Instance->UdpIo != NULL) {
|
if (Instance->UdpIo != NULL) {
|
||||||
@ -1068,6 +1073,7 @@ Dns6Configure (
|
|||||||
if (Instance->Dns6CfgData.DnsServerList != NULL) {
|
if (Instance->Dns6CfgData.DnsServerList != NULL) {
|
||||||
FreePool (Instance->Dns6CfgData.DnsServerList);
|
FreePool (Instance->Dns6CfgData.DnsServerList);
|
||||||
}
|
}
|
||||||
|
|
||||||
ZeroMem (&Instance->Dns6CfgData, sizeof (EFI_DNS6_CONFIG_DATA));
|
ZeroMem (&Instance->Dns6CfgData, sizeof (EFI_DNS6_CONFIG_DATA));
|
||||||
|
|
||||||
Instance->State = DNS_STATE_UNCONFIGED;
|
Instance->State = DNS_STATE_UNCONFIGED;
|
||||||
@ -1089,7 +1095,7 @@ Dns6Configure (
|
|||||||
gBS->RestoreTPL (OldTpl);
|
gBS->RestoreTPL (OldTpl);
|
||||||
|
|
||||||
//
|
//
|
||||||
//The DNS instance will retrieve DNS server from DHCP Server.
|
// The DNS instance will retrieve DNS server from DHCP Server.
|
||||||
//
|
//
|
||||||
Status = GetDns6ServerFromDhcp6 (
|
Status = GetDns6ServerFromDhcp6 (
|
||||||
Instance->Service->ImageHandle,
|
Instance->Service->ImageHandle,
|
||||||
@ -1101,7 +1107,7 @@ Dns6Configure (
|
|||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
ASSERT(ServerList != NULL);
|
ASSERT (ServerList != NULL);
|
||||||
|
|
||||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
||||||
|
|
||||||
@ -1121,6 +1127,7 @@ Dns6Configure (
|
|||||||
FreePool (Instance->Dns6CfgData.DnsServerList);
|
FreePool (Instance->Dns6CfgData.DnsServerList);
|
||||||
Instance->Dns6CfgData.DnsServerList = NULL;
|
Instance->Dns6CfgData.DnsServerList = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1133,6 +1140,7 @@ Dns6Configure (
|
|||||||
FreePool (Instance->Dns6CfgData.DnsServerList);
|
FreePool (Instance->Dns6CfgData.DnsServerList);
|
||||||
Instance->Dns6CfgData.DnsServerList = NULL;
|
Instance->Dns6CfgData.DnsServerList = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1174,23 +1182,23 @@ Dns6HostNameToIp (
|
|||||||
IN EFI_DNS6_COMPLETION_TOKEN *Token
|
IN EFI_DNS6_COMPLETION_TOKEN *Token
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
DNS_INSTANCE *Instance;
|
DNS_INSTANCE *Instance;
|
||||||
|
|
||||||
EFI_DNS6_CONFIG_DATA *ConfigData;
|
EFI_DNS6_CONFIG_DATA *ConfigData;
|
||||||
|
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
DNS6_CACHE *Item;
|
DNS6_CACHE *Item;
|
||||||
LIST_ENTRY *Entry;
|
LIST_ENTRY *Entry;
|
||||||
LIST_ENTRY *Next;
|
LIST_ENTRY *Next;
|
||||||
|
|
||||||
CHAR8 *QueryName;
|
CHAR8 *QueryName;
|
||||||
|
|
||||||
DNS6_TOKEN_ENTRY *TokenEntry;
|
DNS6_TOKEN_ENTRY *TokenEntry;
|
||||||
NET_BUF *Packet;
|
NET_BUF *Packet;
|
||||||
|
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
|
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
Item = NULL;
|
Item = NULL;
|
||||||
@ -1201,11 +1209,11 @@ Dns6HostNameToIp (
|
|||||||
//
|
//
|
||||||
// Validate the parameters
|
// Validate the parameters
|
||||||
//
|
//
|
||||||
if ((This == NULL) || (HostName == NULL) || Token == NULL) {
|
if ((This == NULL) || (HostName == NULL) || (Token == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
||||||
|
|
||||||
Instance = DNS_INSTANCE_FROM_THIS_PROTOCOL6 (This);
|
Instance = DNS_INSTANCE_FROM_THIS_PROTOCOL6 (This);
|
||||||
|
|
||||||
@ -1259,7 +1267,7 @@ Dns6HostNameToIp (
|
|||||||
}
|
}
|
||||||
|
|
||||||
Token->RspData.H2AData->IpCount = (UINT32)Index;
|
Token->RspData.H2AData->IpCount = (UINT32)Index;
|
||||||
Token->RspData.H2AData->IpList = AllocatePool (sizeof (EFI_IPv6_ADDRESS) * Index);
|
Token->RspData.H2AData->IpList = AllocatePool (sizeof (EFI_IPv6_ADDRESS) * Index);
|
||||||
if (Token->RspData.H2AData->IpList == NULL) {
|
if (Token->RspData.H2AData->IpList == NULL) {
|
||||||
if (Token->RspData.H2AData != NULL) {
|
if (Token->RspData.H2AData != NULL) {
|
||||||
FreePool (Token->RspData.H2AData);
|
FreePool (Token->RspData.H2AData);
|
||||||
@ -1272,7 +1280,7 @@ Dns6HostNameToIp (
|
|||||||
Index = 0;
|
Index = 0;
|
||||||
NET_LIST_FOR_EACH_SAFE (Entry, Next, &mDriverData->Dns6CacheList) {
|
NET_LIST_FOR_EACH_SAFE (Entry, Next, &mDriverData->Dns6CacheList) {
|
||||||
Item = NET_LIST_USER_STRUCT (Entry, DNS6_CACHE, AllCacheLink);
|
Item = NET_LIST_USER_STRUCT (Entry, DNS6_CACHE, AllCacheLink);
|
||||||
if ((UINT32)Index < Token->RspData.H2AData->IpCount && StrCmp (HostName, Item->DnsCache.HostName) == 0) {
|
if (((UINT32)Index < Token->RspData.H2AData->IpCount) && (StrCmp (HostName, Item->DnsCache.HostName) == 0)) {
|
||||||
CopyMem ((Token->RspData.H2AData->IpList) + Index, Item->DnsCache.IpAddress, sizeof (EFI_IPv6_ADDRESS));
|
CopyMem ((Token->RspData.H2AData->IpList) + Index, Item->DnsCache.IpAddress, sizeof (EFI_IPv6_ADDRESS));
|
||||||
Index++;
|
Index++;
|
||||||
}
|
}
|
||||||
@ -1299,8 +1307,8 @@ Dns6HostNameToIp (
|
|||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
TokenEntry->PacketToLive = Token->RetryInterval;
|
TokenEntry->PacketToLive = Token->RetryInterval;
|
||||||
TokenEntry->Token = Token;
|
TokenEntry->Token = Token;
|
||||||
TokenEntry->QueryHostName = AllocateZeroPool (StrSize (HostName));
|
TokenEntry->QueryHostName = AllocateZeroPool (StrSize (HostName));
|
||||||
if (TokenEntry->QueryHostName == NULL) {
|
if (TokenEntry->QueryHostName == NULL) {
|
||||||
Status = EFI_OUT_OF_RESOURCES;
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
@ -1394,9 +1402,9 @@ ON_EXIT:
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
Dns6IpToHostName (
|
Dns6IpToHostName (
|
||||||
IN EFI_DNS6_PROTOCOL *This,
|
IN EFI_DNS6_PROTOCOL *This,
|
||||||
IN EFI_IPv6_ADDRESS IpAddress,
|
IN EFI_IPv6_ADDRESS IpAddress,
|
||||||
IN EFI_DNS6_COMPLETION_TOKEN *Token
|
IN EFI_DNS6_COMPLETION_TOKEN *Token
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
@ -1434,23 +1442,23 @@ Dns6IpToHostName (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
Dns6GeneralLookUp (
|
Dns6GeneralLookUp (
|
||||||
IN EFI_DNS6_PROTOCOL *This,
|
IN EFI_DNS6_PROTOCOL *This,
|
||||||
IN CHAR8 *QName,
|
IN CHAR8 *QName,
|
||||||
IN UINT16 QType,
|
IN UINT16 QType,
|
||||||
IN UINT16 QClass,
|
IN UINT16 QClass,
|
||||||
IN EFI_DNS6_COMPLETION_TOKEN *Token
|
IN EFI_DNS6_COMPLETION_TOKEN *Token
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
DNS_INSTANCE *Instance;
|
DNS_INSTANCE *Instance;
|
||||||
|
|
||||||
EFI_DNS6_CONFIG_DATA *ConfigData;
|
EFI_DNS6_CONFIG_DATA *ConfigData;
|
||||||
|
|
||||||
DNS6_TOKEN_ENTRY *TokenEntry;
|
DNS6_TOKEN_ENTRY *TokenEntry;
|
||||||
NET_BUF *Packet;
|
NET_BUF *Packet;
|
||||||
|
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
|
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
TokenEntry = NULL;
|
TokenEntry = NULL;
|
||||||
@ -1459,11 +1467,11 @@ Dns6GeneralLookUp (
|
|||||||
//
|
//
|
||||||
// Validate the parameters
|
// Validate the parameters
|
||||||
//
|
//
|
||||||
if ((This == NULL) || (QName == NULL) || Token == NULL) {
|
if ((This == NULL) || (QName == NULL) || (Token == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
||||||
|
|
||||||
Instance = DNS_INSTANCE_FROM_THIS_PROTOCOL6 (This);
|
Instance = DNS_INSTANCE_FROM_THIS_PROTOCOL6 (This);
|
||||||
|
|
||||||
@ -1500,15 +1508,15 @@ Dns6GeneralLookUp (
|
|||||||
//
|
//
|
||||||
// Construct DNS TokenEntry.
|
// Construct DNS TokenEntry.
|
||||||
//
|
//
|
||||||
TokenEntry = AllocateZeroPool (sizeof(DNS6_TOKEN_ENTRY));
|
TokenEntry = AllocateZeroPool (sizeof (DNS6_TOKEN_ENTRY));
|
||||||
if (TokenEntry == NULL) {
|
if (TokenEntry == NULL) {
|
||||||
Status = EFI_OUT_OF_RESOURCES;
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
TokenEntry->PacketToLive = Token->RetryInterval;
|
TokenEntry->PacketToLive = Token->RetryInterval;
|
||||||
TokenEntry->GeneralLookUp = TRUE;
|
TokenEntry->GeneralLookUp = TRUE;
|
||||||
TokenEntry->Token = Token;
|
TokenEntry->Token = Token;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Construct DNS Query Packet.
|
// Construct DNS Query Packet.
|
||||||
@ -1587,18 +1595,18 @@ ON_EXIT:
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
Dns6UpdateDnsCache (
|
Dns6UpdateDnsCache (
|
||||||
IN EFI_DNS6_PROTOCOL *This,
|
IN EFI_DNS6_PROTOCOL *This,
|
||||||
IN BOOLEAN DeleteFlag,
|
IN BOOLEAN DeleteFlag,
|
||||||
IN BOOLEAN Override,
|
IN BOOLEAN Override,
|
||||||
IN EFI_DNS6_CACHE_ENTRY DnsCacheEntry
|
IN EFI_DNS6_CACHE_ENTRY DnsCacheEntry
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
|
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
|
|
||||||
if (DnsCacheEntry.HostName == NULL || DnsCacheEntry.IpAddress == NULL || DnsCacheEntry.Timeout == 0) {
|
if ((DnsCacheEntry.HostName == NULL) || (DnsCacheEntry.IpAddress == NULL) || (DnsCacheEntry.Timeout == 0)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1640,11 +1648,11 @@ Dns6UpdateDnsCache (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
Dns6Poll (
|
Dns6Poll (
|
||||||
IN EFI_DNS6_PROTOCOL *This
|
IN EFI_DNS6_PROTOCOL *This
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
DNS_INSTANCE *Instance;
|
DNS_INSTANCE *Instance;
|
||||||
EFI_UDP6_PROTOCOL *Udp;
|
EFI_UDP6_PROTOCOL *Udp;
|
||||||
|
|
||||||
if (This == NULL) {
|
if (This == NULL) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
@ -1696,9 +1704,9 @@ Dns6Cancel (
|
|||||||
IN EFI_DNS6_COMPLETION_TOKEN *Token
|
IN EFI_DNS6_COMPLETION_TOKEN *Token
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
DNS_INSTANCE *Instance;
|
DNS_INSTANCE *Instance;
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
|
|
||||||
if (This == NULL) {
|
if (This == NULL) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
@ -1726,4 +1734,3 @@ Dns6Cancel (
|
|||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -22,7 +22,7 @@ EFI_HANDLE mDpcHandle = NULL;
|
|||||||
//
|
//
|
||||||
// The EFI_DPC_PROTOCOL instances that is installed onto mDpcHandle
|
// The EFI_DPC_PROTOCOL instances that is installed onto mDpcHandle
|
||||||
//
|
//
|
||||||
EFI_DPC_PROTOCOL mDpc = {
|
EFI_DPC_PROTOCOL mDpc = {
|
||||||
DpcQueueDpc,
|
DpcQueueDpc,
|
||||||
DpcDispatchDpc
|
DpcDispatchDpc
|
||||||
};
|
};
|
||||||
@ -30,7 +30,7 @@ EFI_DPC_PROTOCOL mDpc = {
|
|||||||
//
|
//
|
||||||
// Global variables used to measure the DPC Queue Depths
|
// Global variables used to measure the DPC Queue Depths
|
||||||
//
|
//
|
||||||
UINTN mDpcQueueDepth = 0;
|
UINTN mDpcQueueDepth = 0;
|
||||||
UINTN mMaxDpcQueueDepth = 0;
|
UINTN mMaxDpcQueueDepth = 0;
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -39,14 +39,14 @@ UINTN mMaxDpcQueueDepth = 0;
|
|||||||
// If the free list is empty and a DPC is queued, the free list is grown by allocating
|
// If the free list is empty and a DPC is queued, the free list is grown by allocating
|
||||||
// an additional set of DPC entries.
|
// an additional set of DPC entries.
|
||||||
//
|
//
|
||||||
LIST_ENTRY mDpcEntryFreeList = INITIALIZE_LIST_HEAD_VARIABLE(mDpcEntryFreeList);
|
LIST_ENTRY mDpcEntryFreeList = INITIALIZE_LIST_HEAD_VARIABLE (mDpcEntryFreeList);
|
||||||
|
|
||||||
//
|
//
|
||||||
// An array of DPC queues. A DPC queue is allocated for every level EFI_TPL value.
|
// An array of DPC queues. A DPC queue is allocated for every level EFI_TPL value.
|
||||||
// As DPCs are queued, they are added to the end of the linked list.
|
// As DPCs are queued, they are added to the end of the linked list.
|
||||||
// As DPCs are dispatched, they are removed from the beginning of the linked list.
|
// As DPCs are dispatched, they are removed from the beginning of the linked list.
|
||||||
//
|
//
|
||||||
LIST_ENTRY mDpcQueue[TPL_HIGH_LEVEL + 1];
|
LIST_ENTRY mDpcQueue[TPL_HIGH_LEVEL + 1];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Add a Deferred Procedure Call to the end of the DPC queue.
|
Add a Deferred Procedure Call to the end of the DPC queue.
|
||||||
@ -81,7 +81,7 @@ DpcQueueDpc (
|
|||||||
//
|
//
|
||||||
// Make sure DpcTpl is valid
|
// Make sure DpcTpl is valid
|
||||||
//
|
//
|
||||||
if (DpcTpl < TPL_APPLICATION || DpcTpl > TPL_HIGH_LEVEL) {
|
if ((DpcTpl < TPL_APPLICATION) || (DpcTpl > TPL_HIGH_LEVEL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -265,7 +265,7 @@ DpcDispatchDpc (
|
|||||||
//
|
//
|
||||||
// Invoke the DPC passing in its context
|
// Invoke the DPC passing in its context
|
||||||
//
|
//
|
||||||
(DpcEntry->DpcProcedure) (DpcEntry->DpcContext);
|
(DpcEntry->DpcProcedure)(DpcEntry->DpcContext);
|
||||||
|
|
||||||
//
|
//
|
||||||
// At least one DPC has been invoked, so set the return status to EFI_SUCCESS
|
// At least one DPC has been invoked, so set the return status to EFI_SUCCESS
|
||||||
|
@ -28,9 +28,9 @@ Abstract:
|
|||||||
// list or on a DPC queue at a specific EFI_TPL.
|
// list or on a DPC queue at a specific EFI_TPL.
|
||||||
//
|
//
|
||||||
typedef struct {
|
typedef struct {
|
||||||
LIST_ENTRY ListEntry;
|
LIST_ENTRY ListEntry;
|
||||||
EFI_DPC_PROCEDURE DpcProcedure;
|
EFI_DPC_PROCEDURE DpcProcedure;
|
||||||
VOID *DpcContext;
|
VOID *DpcContext;
|
||||||
} DPC_ENTRY;
|
} DPC_ENTRY;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -77,4 +77,3 @@ DpcDispatchDpc (
|
|||||||
);
|
);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -21,15 +21,15 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpBootUpdateDevicePath (
|
HttpBootUpdateDevicePath (
|
||||||
IN HTTP_BOOT_PRIVATE_DATA *Private
|
IN HTTP_BOOT_PRIVATE_DATA *Private
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_DEV_PATH *Node;
|
EFI_DEV_PATH *Node;
|
||||||
EFI_DEVICE_PATH_PROTOCOL *TmpIpDevicePath;
|
EFI_DEVICE_PATH_PROTOCOL *TmpIpDevicePath;
|
||||||
EFI_DEVICE_PATH_PROTOCOL *TmpDnsDevicePath;
|
EFI_DEVICE_PATH_PROTOCOL *TmpDnsDevicePath;
|
||||||
EFI_DEVICE_PATH_PROTOCOL *NewDevicePath;
|
EFI_DEVICE_PATH_PROTOCOL *NewDevicePath;
|
||||||
UINTN Length;
|
UINTN Length;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
TmpIpDevicePath = NULL;
|
TmpIpDevicePath = NULL;
|
||||||
TmpDnsDevicePath = NULL;
|
TmpDnsDevicePath = NULL;
|
||||||
@ -42,6 +42,7 @@ HttpBootUpdateDevicePath (
|
|||||||
if (Node == NULL) {
|
if (Node == NULL) {
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
Node->Ipv4.Header.Type = MESSAGING_DEVICE_PATH;
|
Node->Ipv4.Header.Type = MESSAGING_DEVICE_PATH;
|
||||||
Node->Ipv4.Header.SubType = MSG_IPv4_DP;
|
Node->Ipv4.Header.SubType = MSG_IPv4_DP;
|
||||||
SetDevicePathNodeLength (Node, sizeof (IPv4_DEVICE_PATH));
|
SetDevicePathNodeLength (Node, sizeof (IPv4_DEVICE_PATH));
|
||||||
@ -56,8 +57,9 @@ HttpBootUpdateDevicePath (
|
|||||||
if (Node == NULL) {
|
if (Node == NULL) {
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
Node->Ipv6.Header.Type = MESSAGING_DEVICE_PATH;
|
|
||||||
Node->Ipv6.Header.SubType = MSG_IPv6_DP;
|
Node->Ipv6.Header.Type = MESSAGING_DEVICE_PATH;
|
||||||
|
Node->Ipv6.Header.SubType = MSG_IPv6_DP;
|
||||||
SetDevicePathNodeLength (Node, sizeof (IPv6_DEVICE_PATH));
|
SetDevicePathNodeLength (Node, sizeof (IPv6_DEVICE_PATH));
|
||||||
Node->Ipv6.PrefixLength = IP6_PREFIX_LENGTH;
|
Node->Ipv6.PrefixLength = IP6_PREFIX_LENGTH;
|
||||||
Node->Ipv6.RemotePort = Private->Port;
|
Node->Ipv6.RemotePort = Private->Port;
|
||||||
@ -68,7 +70,7 @@ HttpBootUpdateDevicePath (
|
|||||||
CopyMem (&Node->Ipv6.GatewayIpAddress, &Private->GatewayIp.v6, sizeof (EFI_IPv6_ADDRESS));
|
CopyMem (&Node->Ipv6.GatewayIpAddress, &Private->GatewayIp.v6, sizeof (EFI_IPv6_ADDRESS));
|
||||||
}
|
}
|
||||||
|
|
||||||
TmpIpDevicePath = AppendDevicePathNode (Private->ParentDevicePath, (EFI_DEVICE_PATH_PROTOCOL*) Node);
|
TmpIpDevicePath = AppendDevicePathNode (Private->ParentDevicePath, (EFI_DEVICE_PATH_PROTOCOL *)Node);
|
||||||
FreePool (Node);
|
FreePool (Node);
|
||||||
if (TmpIpDevicePath == NULL) {
|
if (TmpIpDevicePath == NULL) {
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
@ -79,18 +81,19 @@ HttpBootUpdateDevicePath (
|
|||||||
//
|
//
|
||||||
if (Private->DnsServerIp != NULL) {
|
if (Private->DnsServerIp != NULL) {
|
||||||
Length = sizeof (EFI_DEVICE_PATH_PROTOCOL) + sizeof (Node->Dns.IsIPv6) + Private->DnsServerCount * sizeof (EFI_IP_ADDRESS);
|
Length = sizeof (EFI_DEVICE_PATH_PROTOCOL) + sizeof (Node->Dns.IsIPv6) + Private->DnsServerCount * sizeof (EFI_IP_ADDRESS);
|
||||||
Node = AllocatePool (Length);
|
Node = AllocatePool (Length);
|
||||||
if (Node == NULL) {
|
if (Node == NULL) {
|
||||||
FreePool (TmpIpDevicePath);
|
FreePool (TmpIpDevicePath);
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
Node->DevPath.Type = MESSAGING_DEVICE_PATH;
|
Node->DevPath.Type = MESSAGING_DEVICE_PATH;
|
||||||
Node->DevPath.SubType = MSG_DNS_DP;
|
Node->DevPath.SubType = MSG_DNS_DP;
|
||||||
SetDevicePathNodeLength (Node, Length);
|
SetDevicePathNodeLength (Node, Length);
|
||||||
Node->Dns.IsIPv6 = Private->UsingIpv6 ? 0x01 : 0x00;
|
Node->Dns.IsIPv6 = Private->UsingIpv6 ? 0x01 : 0x00;
|
||||||
CopyMem ((UINT8*) Node + sizeof (EFI_DEVICE_PATH_PROTOCOL) + sizeof (Node->Dns.IsIPv6), Private->DnsServerIp, Private->DnsServerCount * sizeof (EFI_IP_ADDRESS));
|
CopyMem ((UINT8 *)Node + sizeof (EFI_DEVICE_PATH_PROTOCOL) + sizeof (Node->Dns.IsIPv6), Private->DnsServerIp, Private->DnsServerCount * sizeof (EFI_IP_ADDRESS));
|
||||||
|
|
||||||
TmpDnsDevicePath = AppendDevicePathNode (TmpIpDevicePath, (EFI_DEVICE_PATH_PROTOCOL*) Node);
|
TmpDnsDevicePath = AppendDevicePathNode (TmpIpDevicePath, (EFI_DEVICE_PATH_PROTOCOL *)Node);
|
||||||
FreePool (Node);
|
FreePool (Node);
|
||||||
FreePool (TmpIpDevicePath);
|
FreePool (TmpIpDevicePath);
|
||||||
TmpIpDevicePath = NULL;
|
TmpIpDevicePath = NULL;
|
||||||
@ -103,29 +106,33 @@ HttpBootUpdateDevicePath (
|
|||||||
// Update the URI node with the boot file URI.
|
// Update the URI node with the boot file URI.
|
||||||
//
|
//
|
||||||
Length = sizeof (EFI_DEVICE_PATH_PROTOCOL) + AsciiStrSize (Private->BootFileUri);
|
Length = sizeof (EFI_DEVICE_PATH_PROTOCOL) + AsciiStrSize (Private->BootFileUri);
|
||||||
Node = AllocatePool (Length);
|
Node = AllocatePool (Length);
|
||||||
if (Node == NULL) {
|
if (Node == NULL) {
|
||||||
if (TmpIpDevicePath != NULL) {
|
if (TmpIpDevicePath != NULL) {
|
||||||
FreePool (TmpIpDevicePath);
|
FreePool (TmpIpDevicePath);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TmpDnsDevicePath != NULL) {
|
if (TmpDnsDevicePath != NULL) {
|
||||||
FreePool (TmpDnsDevicePath);
|
FreePool (TmpDnsDevicePath);
|
||||||
}
|
}
|
||||||
|
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
Node->DevPath.Type = MESSAGING_DEVICE_PATH;
|
Node->DevPath.Type = MESSAGING_DEVICE_PATH;
|
||||||
Node->DevPath.SubType = MSG_URI_DP;
|
Node->DevPath.SubType = MSG_URI_DP;
|
||||||
SetDevicePathNodeLength (Node, Length);
|
SetDevicePathNodeLength (Node, Length);
|
||||||
CopyMem ((UINT8*) Node + sizeof (EFI_DEVICE_PATH_PROTOCOL), Private->BootFileUri, AsciiStrSize (Private->BootFileUri));
|
CopyMem ((UINT8 *)Node + sizeof (EFI_DEVICE_PATH_PROTOCOL), Private->BootFileUri, AsciiStrSize (Private->BootFileUri));
|
||||||
|
|
||||||
if (TmpDnsDevicePath != NULL) {
|
if (TmpDnsDevicePath != NULL) {
|
||||||
NewDevicePath = AppendDevicePathNode (TmpDnsDevicePath, (EFI_DEVICE_PATH_PROTOCOL*) Node);
|
NewDevicePath = AppendDevicePathNode (TmpDnsDevicePath, (EFI_DEVICE_PATH_PROTOCOL *)Node);
|
||||||
FreePool (TmpDnsDevicePath);
|
FreePool (TmpDnsDevicePath);
|
||||||
} else {
|
} else {
|
||||||
ASSERT (TmpIpDevicePath != NULL);
|
ASSERT (TmpIpDevicePath != NULL);
|
||||||
NewDevicePath = AppendDevicePathNode (TmpIpDevicePath, (EFI_DEVICE_PATH_PROTOCOL*) Node);
|
NewDevicePath = AppendDevicePathNode (TmpIpDevicePath, (EFI_DEVICE_PATH_PROTOCOL *)Node);
|
||||||
FreePool (TmpIpDevicePath);
|
FreePool (TmpIpDevicePath);
|
||||||
}
|
}
|
||||||
|
|
||||||
FreePool (Node);
|
FreePool (Node);
|
||||||
if (NewDevicePath == NULL) {
|
if (NewDevicePath == NULL) {
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
@ -160,6 +167,7 @@ HttpBootUpdateDevicePath (
|
|||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
FreePool (Private->Ip6Nic->DevicePath);
|
FreePool (Private->Ip6Nic->DevicePath);
|
||||||
Private->Ip6Nic->DevicePath = NewDevicePath;
|
Private->Ip6Nic->DevicePath = NewDevicePath;
|
||||||
}
|
}
|
||||||
@ -178,16 +186,16 @@ HttpBootUpdateDevicePath (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpBootDhcp4ExtractUriInfo (
|
HttpBootDhcp4ExtractUriInfo (
|
||||||
IN HTTP_BOOT_PRIVATE_DATA *Private
|
IN HTTP_BOOT_PRIVATE_DATA *Private
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
HTTP_BOOT_DHCP4_PACKET_CACHE *SelectOffer;
|
HTTP_BOOT_DHCP4_PACKET_CACHE *SelectOffer;
|
||||||
HTTP_BOOT_DHCP4_PACKET_CACHE *HttpOffer;
|
HTTP_BOOT_DHCP4_PACKET_CACHE *HttpOffer;
|
||||||
UINT32 SelectIndex;
|
UINT32 SelectIndex;
|
||||||
UINT32 ProxyIndex;
|
UINT32 ProxyIndex;
|
||||||
UINT32 DnsServerIndex;
|
UINT32 DnsServerIndex;
|
||||||
EFI_DHCP4_PACKET_OPTION *Option;
|
EFI_DHCP4_PACKET_OPTION *Option;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
ASSERT (Private != NULL);
|
ASSERT (Private != NULL);
|
||||||
ASSERT (Private->SelectIndex != 0);
|
ASSERT (Private->SelectIndex != 0);
|
||||||
@ -209,21 +217,23 @@ HttpBootDhcp4ExtractUriInfo (
|
|||||||
//
|
//
|
||||||
if ((SelectOffer->OfferType == HttpOfferTypeDhcpIpUri) ||
|
if ((SelectOffer->OfferType == HttpOfferTypeDhcpIpUri) ||
|
||||||
(SelectOffer->OfferType == HttpOfferTypeDhcpIpUriDns) ||
|
(SelectOffer->OfferType == HttpOfferTypeDhcpIpUriDns) ||
|
||||||
(SelectOffer->OfferType == HttpOfferTypeDhcpNameUriDns)) {
|
(SelectOffer->OfferType == HttpOfferTypeDhcpNameUriDns))
|
||||||
|
{
|
||||||
HttpOffer = SelectOffer;
|
HttpOffer = SelectOffer;
|
||||||
} else {
|
} else {
|
||||||
ASSERT (Private->SelectProxyType != HttpOfferTypeMax);
|
ASSERT (Private->SelectProxyType != HttpOfferTypeMax);
|
||||||
ProxyIndex = Private->OfferIndex[Private->SelectProxyType][0];
|
ProxyIndex = Private->OfferIndex[Private->SelectProxyType][0];
|
||||||
HttpOffer = &Private->OfferBuffer[ProxyIndex].Dhcp4;
|
HttpOffer = &Private->OfferBuffer[ProxyIndex].Dhcp4;
|
||||||
}
|
}
|
||||||
|
|
||||||
Private->BootFileUriParser = HttpOffer->UriParser;
|
Private->BootFileUriParser = HttpOffer->UriParser;
|
||||||
Private->BootFileUri = (CHAR8*) HttpOffer->OptList[HTTP_BOOT_DHCP4_TAG_INDEX_BOOTFILE]->Data;
|
Private->BootFileUri = (CHAR8 *)HttpOffer->OptList[HTTP_BOOT_DHCP4_TAG_INDEX_BOOTFILE]->Data;
|
||||||
} else {
|
} else {
|
||||||
//
|
//
|
||||||
// In Home environment the BootFileUri comes from the FilePath.
|
// In Home environment the BootFileUri comes from the FilePath.
|
||||||
//
|
//
|
||||||
Private->BootFileUriParser = Private->FilePathUriParser;
|
Private->BootFileUriParser = Private->FilePathUriParser;
|
||||||
Private->BootFileUri = Private->FilePathUri;
|
Private->BootFileUri = Private->FilePathUri;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -237,12 +247,14 @@ HttpBootDhcp4ExtractUriInfo (
|
|||||||
} else if (Status == EFI_ACCESS_DENIED) {
|
} else if (Status == EFI_ACCESS_DENIED) {
|
||||||
AsciiPrint ("\n Error: Access forbidden, only HTTPS connection is allowed.\n");
|
AsciiPrint ("\n Error: Access forbidden, only HTTPS connection is allowed.\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((SelectOffer->OfferType == HttpOfferTypeDhcpNameUriDns) ||
|
if ((SelectOffer->OfferType == HttpOfferTypeDhcpNameUriDns) ||
|
||||||
(SelectOffer->OfferType == HttpOfferTypeDhcpDns) ||
|
(SelectOffer->OfferType == HttpOfferTypeDhcpDns) ||
|
||||||
(SelectOffer->OfferType == HttpOfferTypeDhcpIpUriDns)) {
|
(SelectOffer->OfferType == HttpOfferTypeDhcpIpUriDns))
|
||||||
|
{
|
||||||
Option = SelectOffer->OptList[HTTP_BOOT_DHCP4_TAG_INDEX_DNS_SERVER];
|
Option = SelectOffer->OptList[HTTP_BOOT_DHCP4_TAG_INDEX_DNS_SERVER];
|
||||||
ASSERT (Option != NULL);
|
ASSERT (Option != NULL);
|
||||||
|
|
||||||
@ -257,7 +269,7 @@ HttpBootDhcp4ExtractUriInfo (
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (DnsServerIndex = 0; DnsServerIndex < Private->DnsServerCount; DnsServerIndex++) {
|
for (DnsServerIndex = 0; DnsServerIndex < Private->DnsServerCount; DnsServerIndex++) {
|
||||||
CopyMem (&(Private->DnsServerIp[DnsServerIndex].v4), &(((EFI_IPv4_ADDRESS *) Option->Data)[DnsServerIndex]), sizeof (EFI_IPv4_ADDRESS));
|
CopyMem (&(Private->DnsServerIp[DnsServerIndex].v4), &(((EFI_IPv4_ADDRESS *)Option->Data)[DnsServerIndex]), sizeof (EFI_IPv4_ADDRESS));
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -283,7 +295,7 @@ HttpBootDhcp4ExtractUriInfo (
|
|||||||
Private->BootFileUriParser,
|
Private->BootFileUriParser,
|
||||||
&Private->Port
|
&Private->Port
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status) || Private->Port == 0) {
|
if (EFI_ERROR (Status) || (Private->Port == 0)) {
|
||||||
Private->Port = 80;
|
Private->Port = 80;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -295,7 +307,7 @@ HttpBootDhcp4ExtractUriInfo (
|
|||||||
// Update the device path to include the boot resource information.
|
// Update the device path to include the boot resource information.
|
||||||
//
|
//
|
||||||
Status = HttpBootUpdateDevicePath (Private);
|
Status = HttpBootUpdateDevicePath (Private);
|
||||||
if (EFI_ERROR (Status) && Private->DnsServerIp != NULL) {
|
if (EFI_ERROR (Status) && (Private->DnsServerIp != NULL)) {
|
||||||
FreePool (Private->DnsServerIp);
|
FreePool (Private->DnsServerIp);
|
||||||
Private->DnsServerIp = NULL;
|
Private->DnsServerIp = NULL;
|
||||||
}
|
}
|
||||||
@ -314,20 +326,20 @@ HttpBootDhcp4ExtractUriInfo (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpBootDhcp6ExtractUriInfo (
|
HttpBootDhcp6ExtractUriInfo (
|
||||||
IN HTTP_BOOT_PRIVATE_DATA *Private
|
IN HTTP_BOOT_PRIVATE_DATA *Private
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
HTTP_BOOT_DHCP6_PACKET_CACHE *SelectOffer;
|
HTTP_BOOT_DHCP6_PACKET_CACHE *SelectOffer;
|
||||||
HTTP_BOOT_DHCP6_PACKET_CACHE *HttpOffer;
|
HTTP_BOOT_DHCP6_PACKET_CACHE *HttpOffer;
|
||||||
UINT32 SelectIndex;
|
UINT32 SelectIndex;
|
||||||
UINT32 ProxyIndex;
|
UINT32 ProxyIndex;
|
||||||
UINT32 DnsServerIndex;
|
UINT32 DnsServerIndex;
|
||||||
EFI_DHCP6_PACKET_OPTION *Option;
|
EFI_DHCP6_PACKET_OPTION *Option;
|
||||||
EFI_IPv6_ADDRESS IpAddr;
|
EFI_IPv6_ADDRESS IpAddr;
|
||||||
CHAR8 *HostName;
|
CHAR8 *HostName;
|
||||||
UINTN HostNameSize;
|
UINTN HostNameSize;
|
||||||
CHAR16 *HostNameStr;
|
CHAR16 *HostNameStr;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
ASSERT (Private != NULL);
|
ASSERT (Private != NULL);
|
||||||
ASSERT (Private->SelectIndex != 0);
|
ASSERT (Private->SelectIndex != 0);
|
||||||
@ -349,21 +361,23 @@ HttpBootDhcp6ExtractUriInfo (
|
|||||||
//
|
//
|
||||||
if ((SelectOffer->OfferType == HttpOfferTypeDhcpIpUri) ||
|
if ((SelectOffer->OfferType == HttpOfferTypeDhcpIpUri) ||
|
||||||
(SelectOffer->OfferType == HttpOfferTypeDhcpIpUriDns) ||
|
(SelectOffer->OfferType == HttpOfferTypeDhcpIpUriDns) ||
|
||||||
(SelectOffer->OfferType == HttpOfferTypeDhcpNameUriDns)) {
|
(SelectOffer->OfferType == HttpOfferTypeDhcpNameUriDns))
|
||||||
|
{
|
||||||
HttpOffer = SelectOffer;
|
HttpOffer = SelectOffer;
|
||||||
} else {
|
} else {
|
||||||
ASSERT (Private->SelectProxyType != HttpOfferTypeMax);
|
ASSERT (Private->SelectProxyType != HttpOfferTypeMax);
|
||||||
ProxyIndex = Private->OfferIndex[Private->SelectProxyType][0];
|
ProxyIndex = Private->OfferIndex[Private->SelectProxyType][0];
|
||||||
HttpOffer = &Private->OfferBuffer[ProxyIndex].Dhcp6;
|
HttpOffer = &Private->OfferBuffer[ProxyIndex].Dhcp6;
|
||||||
}
|
}
|
||||||
|
|
||||||
Private->BootFileUriParser = HttpOffer->UriParser;
|
Private->BootFileUriParser = HttpOffer->UriParser;
|
||||||
Private->BootFileUri = (CHAR8*) HttpOffer->OptList[HTTP_BOOT_DHCP6_IDX_BOOT_FILE_URL]->Data;
|
Private->BootFileUri = (CHAR8 *)HttpOffer->OptList[HTTP_BOOT_DHCP6_IDX_BOOT_FILE_URL]->Data;
|
||||||
} else {
|
} else {
|
||||||
//
|
//
|
||||||
// In Home environment the BootFileUri comes from the FilePath.
|
// In Home environment the BootFileUri comes from the FilePath.
|
||||||
//
|
//
|
||||||
Private->BootFileUriParser = Private->FilePathUriParser;
|
Private->BootFileUriParser = Private->FilePathUriParser;
|
||||||
Private->BootFileUri = Private->FilePathUri;
|
Private->BootFileUri = Private->FilePathUri;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -377,6 +391,7 @@ HttpBootDhcp6ExtractUriInfo (
|
|||||||
} else if (Status == EFI_ACCESS_DENIED) {
|
} else if (Status == EFI_ACCESS_DENIED) {
|
||||||
AsciiPrint ("\n Error: Access forbidden, only HTTPS connection is allowed.\n");
|
AsciiPrint ("\n Error: Access forbidden, only HTTPS connection is allowed.\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -398,7 +413,8 @@ HttpBootDhcp6ExtractUriInfo (
|
|||||||
|
|
||||||
if ((SelectOffer->OfferType == HttpOfferTypeDhcpNameUriDns) ||
|
if ((SelectOffer->OfferType == HttpOfferTypeDhcpNameUriDns) ||
|
||||||
(SelectOffer->OfferType == HttpOfferTypeDhcpDns) ||
|
(SelectOffer->OfferType == HttpOfferTypeDhcpDns) ||
|
||||||
(SelectOffer->OfferType == HttpOfferTypeDhcpIpUriDns)) {
|
(SelectOffer->OfferType == HttpOfferTypeDhcpIpUriDns))
|
||||||
|
{
|
||||||
Option = SelectOffer->OptList[HTTP_BOOT_DHCP6_IDX_DNS_SERVER];
|
Option = SelectOffer->OptList[HTTP_BOOT_DHCP6_IDX_DNS_SERVER];
|
||||||
ASSERT (Option != NULL);
|
ASSERT (Option != NULL);
|
||||||
|
|
||||||
@ -413,7 +429,7 @@ HttpBootDhcp6ExtractUriInfo (
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (DnsServerIndex = 0; DnsServerIndex < Private->DnsServerCount; DnsServerIndex++) {
|
for (DnsServerIndex = 0; DnsServerIndex < Private->DnsServerCount; DnsServerIndex++) {
|
||||||
CopyMem (&(Private->DnsServerIp[DnsServerIndex].v6), &(((EFI_IPv6_ADDRESS *) Option->Data)[DnsServerIndex]), sizeof (EFI_IPv6_ADDRESS));
|
CopyMem (&(Private->DnsServerIp[DnsServerIndex].v6), &(((EFI_IPv6_ADDRESS *)Option->Data)[DnsServerIndex]), sizeof (EFI_IPv6_ADDRESS));
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -453,7 +469,7 @@ HttpBootDhcp6ExtractUriInfo (
|
|||||||
}
|
}
|
||||||
|
|
||||||
HostNameSize = AsciiStrSize (HostName);
|
HostNameSize = AsciiStrSize (HostName);
|
||||||
HostNameStr = AllocateZeroPool (HostNameSize * sizeof (CHAR16));
|
HostNameStr = AllocateZeroPool (HostNameSize * sizeof (CHAR16));
|
||||||
if (HostNameStr == NULL) {
|
if (HostNameStr == NULL) {
|
||||||
Status = EFI_OUT_OF_RESOURCES;
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
goto Error;
|
goto Error;
|
||||||
@ -483,7 +499,7 @@ HttpBootDhcp6ExtractUriInfo (
|
|||||||
Private->BootFileUriParser,
|
Private->BootFileUriParser,
|
||||||
&Private->Port
|
&Private->Port
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status) || Private->Port == 0) {
|
if (EFI_ERROR (Status) || (Private->Port == 0)) {
|
||||||
Private->Port = 80;
|
Private->Port = 80;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -510,7 +526,6 @@ Error:
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Discover all the boot information for boot file.
|
Discover all the boot information for boot file.
|
||||||
|
|
||||||
@ -522,10 +537,10 @@ Error:
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpBootDiscoverBootInfo (
|
HttpBootDiscoverBootInfo (
|
||||||
IN OUT HTTP_BOOT_PRIVATE_DATA *Private
|
IN OUT HTTP_BOOT_PRIVATE_DATA *Private
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Start D.O.R.A/S.A.R.R exchange to acquire station ip address and
|
// Start D.O.R.A/S.A.R.R exchange to acquire station ip address and
|
||||||
@ -558,24 +573,26 @@ HttpBootDiscoverBootInfo (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
HttpBootHttpIoCallback (
|
HttpBootHttpIoCallback (
|
||||||
IN HTTP_IO_CALLBACK_EVENT EventType,
|
IN HTTP_IO_CALLBACK_EVENT EventType,
|
||||||
IN EFI_HTTP_MESSAGE *Message,
|
IN EFI_HTTP_MESSAGE *Message,
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
HTTP_BOOT_PRIVATE_DATA *Private;
|
HTTP_BOOT_PRIVATE_DATA *Private;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
Private = (HTTP_BOOT_PRIVATE_DATA *) Context;
|
|
||||||
|
Private = (HTTP_BOOT_PRIVATE_DATA *)Context;
|
||||||
if (Private->HttpBootCallback != NULL) {
|
if (Private->HttpBootCallback != NULL) {
|
||||||
Status = Private->HttpBootCallback->Callback (
|
Status = Private->HttpBootCallback->Callback (
|
||||||
Private->HttpBootCallback,
|
Private->HttpBootCallback,
|
||||||
EventType == HttpIoRequest ? HttpBootHttpRequest : HttpBootHttpResponse,
|
EventType == HttpIoRequest ? HttpBootHttpRequest : HttpBootHttpResponse,
|
||||||
EventType == HttpIoRequest ? FALSE : TRUE,
|
EventType == HttpIoRequest ? FALSE : TRUE,
|
||||||
sizeof (EFI_HTTP_MESSAGE),
|
sizeof (EFI_HTTP_MESSAGE),
|
||||||
(VOID *) Message
|
(VOID *)Message
|
||||||
);
|
);
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -590,13 +607,13 @@ HttpBootHttpIoCallback (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpBootCreateHttpIo (
|
HttpBootCreateHttpIo (
|
||||||
IN HTTP_BOOT_PRIVATE_DATA *Private
|
IN HTTP_BOOT_PRIVATE_DATA *Private
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
HTTP_IO_CONFIG_DATA ConfigData;
|
HTTP_IO_CONFIG_DATA ConfigData;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_HANDLE ImageHandle;
|
EFI_HANDLE ImageHandle;
|
||||||
UINT32 TimeoutValue;
|
UINT32 TimeoutValue;
|
||||||
|
|
||||||
ASSERT (Private != NULL);
|
ASSERT (Private != NULL);
|
||||||
|
|
||||||
@ -625,7 +642,7 @@ HttpBootCreateHttpIo (
|
|||||||
Private->UsingIpv6 ? IP_VERSION_6 : IP_VERSION_4,
|
Private->UsingIpv6 ? IP_VERSION_6 : IP_VERSION_4,
|
||||||
&ConfigData,
|
&ConfigData,
|
||||||
HttpBootHttpIoCallback,
|
HttpBootHttpIoCallback,
|
||||||
(VOID *) Private,
|
(VOID *)Private,
|
||||||
&Private->HttpIo
|
&Private->HttpIo
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
@ -644,13 +661,13 @@ HttpBootCreateHttpIo (
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
HttpBootFreeCache (
|
HttpBootFreeCache (
|
||||||
IN HTTP_BOOT_CACHE_CONTENT *Cache
|
IN HTTP_BOOT_CACHE_CONTENT *Cache
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
LIST_ENTRY *Entry;
|
LIST_ENTRY *Entry;
|
||||||
LIST_ENTRY *NextEntry;
|
LIST_ENTRY *NextEntry;
|
||||||
HTTP_BOOT_ENTITY_DATA *EntityData;
|
HTTP_BOOT_ENTITY_DATA *EntityData;
|
||||||
|
|
||||||
if (Cache != NULL) {
|
if (Cache != NULL) {
|
||||||
//
|
//
|
||||||
@ -660,6 +677,7 @@ HttpBootFreeCache (
|
|||||||
if (Cache->RequestData->Url != NULL) {
|
if (Cache->RequestData->Url != NULL) {
|
||||||
FreePool (Cache->RequestData->Url);
|
FreePool (Cache->RequestData->Url);
|
||||||
}
|
}
|
||||||
|
|
||||||
FreePool (Cache->RequestData);
|
FreePool (Cache->RequestData);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -672,6 +690,7 @@ HttpBootFreeCache (
|
|||||||
FreePool (Cache->ResponseData->Headers[Index].FieldName);
|
FreePool (Cache->ResponseData->Headers[Index].FieldName);
|
||||||
FreePool (Cache->ResponseData->Headers[Index].FieldValue);
|
FreePool (Cache->ResponseData->Headers[Index].FieldValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
FreePool (Cache->ResponseData->Headers);
|
FreePool (Cache->ResponseData->Headers);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -684,6 +703,7 @@ HttpBootFreeCache (
|
|||||||
if (EntityData->Block != NULL) {
|
if (EntityData->Block != NULL) {
|
||||||
FreePool (EntityData->Block);
|
FreePool (EntityData->Block);
|
||||||
}
|
}
|
||||||
|
|
||||||
RemoveEntryList (&EntityData->Link);
|
RemoveEntryList (&EntityData->Link);
|
||||||
FreePool (EntityData);
|
FreePool (EntityData);
|
||||||
}
|
}
|
||||||
@ -700,12 +720,12 @@ HttpBootFreeCache (
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
HttpBootFreeCacheList (
|
HttpBootFreeCacheList (
|
||||||
IN HTTP_BOOT_PRIVATE_DATA *Private
|
IN HTTP_BOOT_PRIVATE_DATA *Private
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
LIST_ENTRY *Entry;
|
LIST_ENTRY *Entry;
|
||||||
LIST_ENTRY *NextEntry;
|
LIST_ENTRY *NextEntry;
|
||||||
HTTP_BOOT_CACHE_CONTENT *Cache;
|
HTTP_BOOT_CACHE_CONTENT *Cache;
|
||||||
|
|
||||||
NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &Private->CacheList) {
|
NET_LIST_FOR_EACH_SAFE (Entry, NextEntry, &Private->CacheList) {
|
||||||
Cache = NET_LIST_USER_STRUCT (Entry, HTTP_BOOT_CACHE_CONTENT, Link);
|
Cache = NET_LIST_USER_STRUCT (Entry, HTTP_BOOT_CACHE_CONTENT, Link);
|
||||||
@ -734,20 +754,20 @@ HttpBootFreeCacheList (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpBootGetFileFromCache (
|
HttpBootGetFileFromCache (
|
||||||
IN HTTP_BOOT_PRIVATE_DATA *Private,
|
IN HTTP_BOOT_PRIVATE_DATA *Private,
|
||||||
IN CHAR16 *Uri,
|
IN CHAR16 *Uri,
|
||||||
IN OUT UINTN *BufferSize,
|
IN OUT UINTN *BufferSize,
|
||||||
OUT UINT8 *Buffer,
|
OUT UINT8 *Buffer,
|
||||||
OUT HTTP_BOOT_IMAGE_TYPE *ImageType
|
OUT HTTP_BOOT_IMAGE_TYPE *ImageType
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
LIST_ENTRY *Entry;
|
LIST_ENTRY *Entry;
|
||||||
LIST_ENTRY *Entry2;
|
LIST_ENTRY *Entry2;
|
||||||
HTTP_BOOT_CACHE_CONTENT *Cache;
|
HTTP_BOOT_CACHE_CONTENT *Cache;
|
||||||
HTTP_BOOT_ENTITY_DATA *EntityData;
|
HTTP_BOOT_ENTITY_DATA *EntityData;
|
||||||
UINTN CopyedSize;
|
UINTN CopyedSize;
|
||||||
|
|
||||||
if (Uri == NULL || BufferSize == NULL || Buffer == NULL || ImageType == NULL) {
|
if ((Uri == NULL) || (BufferSize == NULL) || (Buffer == NULL) || (ImageType == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -758,11 +778,12 @@ HttpBootGetFileFromCache (
|
|||||||
//
|
//
|
||||||
if ((Cache->RequestData != NULL) &&
|
if ((Cache->RequestData != NULL) &&
|
||||||
(Cache->RequestData->Url != NULL) &&
|
(Cache->RequestData->Url != NULL) &&
|
||||||
(StrCmp (Uri, Cache->RequestData->Url) == 0)) {
|
(StrCmp (Uri, Cache->RequestData->Url) == 0))
|
||||||
|
{
|
||||||
//
|
//
|
||||||
// Hit in cache, record image type.
|
// Hit in cache, record image type.
|
||||||
//
|
//
|
||||||
*ImageType = Cache->ImageType;
|
*ImageType = Cache->ImageType;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Check buffer size.
|
// Check buffer size.
|
||||||
@ -813,16 +834,16 @@ HttpBootGetFileFromCache (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
HttpBootGetBootFileCallback (
|
HttpBootGetBootFileCallback (
|
||||||
IN HTTP_BODY_PARSE_EVENT EventType,
|
IN HTTP_BODY_PARSE_EVENT EventType,
|
||||||
IN CHAR8 *Data,
|
IN CHAR8 *Data,
|
||||||
IN UINTN Length,
|
IN UINTN Length,
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
HTTP_BOOT_CALLBACK_DATA *CallbackData;
|
HTTP_BOOT_CALLBACK_DATA *CallbackData;
|
||||||
HTTP_BOOT_ENTITY_DATA *NewEntityData;
|
HTTP_BOOT_ENTITY_DATA *NewEntityData;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_HTTP_BOOT_CALLBACK_PROTOCOL *HttpBootCallback;
|
EFI_HTTP_BOOT_CALLBACK_PROTOCOL *HttpBootCallback;
|
||||||
|
|
||||||
//
|
//
|
||||||
// We only care about the entity data.
|
// We only care about the entity data.
|
||||||
@ -831,20 +852,21 @@ HttpBootGetBootFileCallback (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
CallbackData = (HTTP_BOOT_CALLBACK_DATA *) Context;
|
CallbackData = (HTTP_BOOT_CALLBACK_DATA *)Context;
|
||||||
HttpBootCallback = CallbackData->Private->HttpBootCallback;
|
HttpBootCallback = CallbackData->Private->HttpBootCallback;
|
||||||
if (HttpBootCallback != NULL) {
|
if (HttpBootCallback != NULL) {
|
||||||
Status = HttpBootCallback->Callback (
|
Status = HttpBootCallback->Callback (
|
||||||
HttpBootCallback,
|
HttpBootCallback,
|
||||||
HttpBootHttpEntityBody,
|
HttpBootHttpEntityBody,
|
||||||
TRUE,
|
TRUE,
|
||||||
(UINT32)Length,
|
(UINT32)Length,
|
||||||
Data
|
Data
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Copy data if caller has provided a buffer.
|
// Copy data if caller has provided a buffer.
|
||||||
//
|
//
|
||||||
@ -865,14 +887,17 @@ HttpBootGetBootFileCallback (
|
|||||||
if (NewEntityData == NULL) {
|
if (NewEntityData == NULL) {
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (CallbackData->NewBlock) {
|
if (CallbackData->NewBlock) {
|
||||||
NewEntityData->Block = CallbackData->Block;
|
NewEntityData->Block = CallbackData->Block;
|
||||||
CallbackData->Block = NULL;
|
CallbackData->Block = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
NewEntityData->DataLength = Length;
|
NewEntityData->DataLength = Length;
|
||||||
NewEntityData->DataStart = (UINT8*) Data;
|
NewEntityData->DataStart = (UINT8 *)Data;
|
||||||
InsertTailList (&CallbackData->Cache->EntityDataList, &NewEntityData->Link);
|
InsertTailList (&CallbackData->Cache->EntityDataList, &NewEntityData->Link);
|
||||||
}
|
}
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -902,39 +927,39 @@ HttpBootGetBootFileCallback (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpBootGetBootFile (
|
HttpBootGetBootFile (
|
||||||
IN HTTP_BOOT_PRIVATE_DATA *Private,
|
IN HTTP_BOOT_PRIVATE_DATA *Private,
|
||||||
IN BOOLEAN HeaderOnly,
|
IN BOOLEAN HeaderOnly,
|
||||||
IN OUT UINTN *BufferSize,
|
IN OUT UINTN *BufferSize,
|
||||||
OUT UINT8 *Buffer,
|
OUT UINT8 *Buffer,
|
||||||
OUT HTTP_BOOT_IMAGE_TYPE *ImageType
|
OUT HTTP_BOOT_IMAGE_TYPE *ImageType
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_HTTP_STATUS_CODE StatusCode;
|
EFI_HTTP_STATUS_CODE StatusCode;
|
||||||
CHAR8 *HostName;
|
CHAR8 *HostName;
|
||||||
EFI_HTTP_REQUEST_DATA *RequestData;
|
EFI_HTTP_REQUEST_DATA *RequestData;
|
||||||
HTTP_IO_RESPONSE_DATA *ResponseData;
|
HTTP_IO_RESPONSE_DATA *ResponseData;
|
||||||
HTTP_IO_RESPONSE_DATA ResponseBody;
|
HTTP_IO_RESPONSE_DATA ResponseBody;
|
||||||
HTTP_IO *HttpIo;
|
HTTP_IO *HttpIo;
|
||||||
HTTP_IO_HEADER *HttpIoHeader;
|
HTTP_IO_HEADER *HttpIoHeader;
|
||||||
VOID *Parser;
|
VOID *Parser;
|
||||||
HTTP_BOOT_CALLBACK_DATA Context;
|
HTTP_BOOT_CALLBACK_DATA Context;
|
||||||
UINTN ContentLength;
|
UINTN ContentLength;
|
||||||
HTTP_BOOT_CACHE_CONTENT *Cache;
|
HTTP_BOOT_CACHE_CONTENT *Cache;
|
||||||
UINT8 *Block;
|
UINT8 *Block;
|
||||||
UINTN UrlSize;
|
UINTN UrlSize;
|
||||||
CHAR16 *Url;
|
CHAR16 *Url;
|
||||||
BOOLEAN IdentityMode;
|
BOOLEAN IdentityMode;
|
||||||
UINTN ReceivedSize;
|
UINTN ReceivedSize;
|
||||||
|
|
||||||
ASSERT (Private != NULL);
|
ASSERT (Private != NULL);
|
||||||
ASSERT (Private->HttpCreated);
|
ASSERT (Private->HttpCreated);
|
||||||
|
|
||||||
if (BufferSize == NULL || ImageType == NULL) {
|
if ((BufferSize == NULL) || (ImageType == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (*BufferSize != 0 && Buffer == NULL) {
|
if ((*BufferSize != 0) && (Buffer == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -942,12 +967,13 @@ HttpBootGetBootFile (
|
|||||||
// First, check whether we already cached the requested Uri.
|
// First, check whether we already cached the requested Uri.
|
||||||
//
|
//
|
||||||
UrlSize = AsciiStrSize (Private->BootFileUri);
|
UrlSize = AsciiStrSize (Private->BootFileUri);
|
||||||
Url = AllocatePool (UrlSize * sizeof (CHAR16));
|
Url = AllocatePool (UrlSize * sizeof (CHAR16));
|
||||||
if (Url == NULL) {
|
if (Url == NULL) {
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
AsciiStrToUnicodeStrS (Private->BootFileUri, Url, UrlSize);
|
AsciiStrToUnicodeStrS (Private->BootFileUri, Url, UrlSize);
|
||||||
if (!HeaderOnly && Buffer != NULL) {
|
if (!HeaderOnly && (Buffer != NULL)) {
|
||||||
Status = HttpBootGetFileFromCache (Private, Url, BufferSize, Buffer, ImageType);
|
Status = HttpBootGetFileFromCache (Private, Url, BufferSize, Buffer, ImageType);
|
||||||
if (Status != EFI_NOT_FOUND) {
|
if (Status != EFI_NOT_FOUND) {
|
||||||
FreePool (Url);
|
FreePool (Url);
|
||||||
@ -969,6 +995,7 @@ HttpBootGetBootFile (
|
|||||||
Status = EFI_OUT_OF_RESOURCES;
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
goto ERROR_1;
|
goto ERROR_1;
|
||||||
}
|
}
|
||||||
|
|
||||||
Cache->ImageType = ImageTypeMax;
|
Cache->ImageType = ImageTypeMax;
|
||||||
InitializeListHead (&Cache->EntityDataList);
|
InitializeListHead (&Cache->EntityDataList);
|
||||||
}
|
}
|
||||||
@ -993,14 +1020,15 @@ HttpBootGetBootFile (
|
|||||||
// Add HTTP header field 1: Host
|
// Add HTTP header field 1: Host
|
||||||
//
|
//
|
||||||
HostName = NULL;
|
HostName = NULL;
|
||||||
Status = HttpUrlGetHostName (
|
Status = HttpUrlGetHostName (
|
||||||
Private->BootFileUri,
|
Private->BootFileUri,
|
||||||
Private->BootFileUriParser,
|
Private->BootFileUriParser,
|
||||||
&HostName
|
&HostName
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
goto ERROR_3;
|
goto ERROR_3;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = HttpIoSetHeader (
|
Status = HttpIoSetHeader (
|
||||||
HttpIoHeader,
|
HttpIoHeader,
|
||||||
HTTP_HEADER_HOST,
|
HTTP_HEADER_HOST,
|
||||||
@ -1043,8 +1071,9 @@ HttpBootGetBootFile (
|
|||||||
Status = EFI_OUT_OF_RESOURCES;
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
goto ERROR_3;
|
goto ERROR_3;
|
||||||
}
|
}
|
||||||
|
|
||||||
RequestData->Method = HeaderOnly ? HttpMethodHead : HttpMethodGet;
|
RequestData->Method = HeaderOnly ? HttpMethodHead : HttpMethodGet;
|
||||||
RequestData->Url = Url;
|
RequestData->Url = Url;
|
||||||
|
|
||||||
//
|
//
|
||||||
// 2.3 Record the request info in a temp cache item.
|
// 2.3 Record the request info in a temp cache item.
|
||||||
@ -1064,7 +1093,7 @@ HttpBootGetBootFile (
|
|||||||
HttpIoHeader->Headers,
|
HttpIoHeader->Headers,
|
||||||
0,
|
0,
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
goto ERROR_4;
|
goto ERROR_4;
|
||||||
}
|
}
|
||||||
@ -1076,11 +1105,12 @@ HttpBootGetBootFile (
|
|||||||
//
|
//
|
||||||
// 3.1 First step, use zero BodyLength to only receive the response headers.
|
// 3.1 First step, use zero BodyLength to only receive the response headers.
|
||||||
//
|
//
|
||||||
ResponseData = AllocateZeroPool (sizeof(HTTP_IO_RESPONSE_DATA));
|
ResponseData = AllocateZeroPool (sizeof (HTTP_IO_RESPONSE_DATA));
|
||||||
if (ResponseData == NULL) {
|
if (ResponseData == NULL) {
|
||||||
Status = EFI_OUT_OF_RESOURCES;
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
goto ERROR_4;
|
goto ERROR_4;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = HttpIoRecvResponse (
|
Status = HttpIoRecvResponse (
|
||||||
&Private->HttpIo,
|
&Private->HttpIo,
|
||||||
TRUE,
|
TRUE,
|
||||||
@ -1092,6 +1122,7 @@ HttpBootGetBootFile (
|
|||||||
HttpBootPrintErrorMessage (StatusCode);
|
HttpBootPrintErrorMessage (StatusCode);
|
||||||
Status = ResponseData->Status;
|
Status = ResponseData->Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
goto ERROR_5;
|
goto ERROR_5;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1114,13 +1145,13 @@ HttpBootGetBootFile (
|
|||||||
//
|
//
|
||||||
if (Cache != NULL) {
|
if (Cache != NULL) {
|
||||||
Cache->ResponseData = ResponseData;
|
Cache->ResponseData = ResponseData;
|
||||||
Cache->ImageType = *ImageType;
|
Cache->ImageType = *ImageType;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// 3.3 Init a message-body parser from the header information.
|
// 3.3 Init a message-body parser from the header information.
|
||||||
//
|
//
|
||||||
Parser = NULL;
|
Parser = NULL;
|
||||||
Context.NewBlock = FALSE;
|
Context.NewBlock = FALSE;
|
||||||
Context.Block = NULL;
|
Context.Block = NULL;
|
||||||
Context.CopyedSize = 0;
|
Context.CopyedSize = 0;
|
||||||
@ -1128,15 +1159,15 @@ HttpBootGetBootFile (
|
|||||||
Context.BufferSize = *BufferSize;
|
Context.BufferSize = *BufferSize;
|
||||||
Context.Cache = Cache;
|
Context.Cache = Cache;
|
||||||
Context.Private = Private;
|
Context.Private = Private;
|
||||||
Status = HttpInitMsgParser (
|
Status = HttpInitMsgParser (
|
||||||
HeaderOnly ? HttpMethodHead : HttpMethodGet,
|
HeaderOnly ? HttpMethodHead : HttpMethodGet,
|
||||||
ResponseData->Response.StatusCode,
|
ResponseData->Response.StatusCode,
|
||||||
ResponseData->HeaderCount,
|
ResponseData->HeaderCount,
|
||||||
ResponseData->Headers,
|
ResponseData->Headers,
|
||||||
HttpBootGetBootFileCallback,
|
HttpBootGetBootFileCallback,
|
||||||
(VOID*) &Context,
|
(VOID *)&Context,
|
||||||
&Parser
|
&Parser
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
goto ERROR_6;
|
goto ERROR_6;
|
||||||
}
|
}
|
||||||
@ -1150,7 +1181,7 @@ HttpBootGetBootFile (
|
|||||||
// 3.4.1, check whether we are in identity transfer-coding.
|
// 3.4.1, check whether we are in identity transfer-coding.
|
||||||
//
|
//
|
||||||
ContentLength = 0;
|
ContentLength = 0;
|
||||||
Status = HttpGetEntityLength (Parser, &ContentLength);
|
Status = HttpGetEntityLength (Parser, &ContentLength);
|
||||||
if (!EFI_ERROR (Status)) {
|
if (!EFI_ERROR (Status)) {
|
||||||
IdentityMode = TRUE;
|
IdentityMode = TRUE;
|
||||||
} else {
|
} else {
|
||||||
@ -1169,28 +1200,30 @@ HttpBootGetBootFile (
|
|||||||
//
|
//
|
||||||
ReceivedSize = 0;
|
ReceivedSize = 0;
|
||||||
while (ReceivedSize < ContentLength) {
|
while (ReceivedSize < ContentLength) {
|
||||||
ResponseBody.Body = (CHAR8*) Buffer + ReceivedSize;
|
ResponseBody.Body = (CHAR8 *)Buffer + ReceivedSize;
|
||||||
ResponseBody.BodyLength = *BufferSize - ReceivedSize;
|
ResponseBody.BodyLength = *BufferSize - ReceivedSize;
|
||||||
Status = HttpIoRecvResponse (
|
Status = HttpIoRecvResponse (
|
||||||
&Private->HttpIo,
|
&Private->HttpIo,
|
||||||
FALSE,
|
FALSE,
|
||||||
&ResponseBody
|
&ResponseBody
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status) || EFI_ERROR (ResponseBody.Status)) {
|
if (EFI_ERROR (Status) || EFI_ERROR (ResponseBody.Status)) {
|
||||||
if (EFI_ERROR (ResponseBody.Status)) {
|
if (EFI_ERROR (ResponseBody.Status)) {
|
||||||
Status = ResponseBody.Status;
|
Status = ResponseBody.Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
goto ERROR_6;
|
goto ERROR_6;
|
||||||
}
|
}
|
||||||
|
|
||||||
ReceivedSize += ResponseBody.BodyLength;
|
ReceivedSize += ResponseBody.BodyLength;
|
||||||
if (Private->HttpBootCallback != NULL) {
|
if (Private->HttpBootCallback != NULL) {
|
||||||
Status = Private->HttpBootCallback->Callback (
|
Status = Private->HttpBootCallback->Callback (
|
||||||
Private->HttpBootCallback,
|
Private->HttpBootCallback,
|
||||||
HttpBootHttpEntityBody,
|
HttpBootHttpEntityBody,
|
||||||
TRUE,
|
TRUE,
|
||||||
(UINT32)ResponseBody.BodyLength,
|
(UINT32)ResponseBody.BodyLength,
|
||||||
ResponseBody.Body
|
ResponseBody.Body
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
goto ERROR_6;
|
goto ERROR_6;
|
||||||
}
|
}
|
||||||
@ -1209,29 +1242,31 @@ HttpBootGetBootFile (
|
|||||||
// Otherwise a buffer, the buffer in Block will be cached and we should allocate a new before
|
// Otherwise a buffer, the buffer in Block will be cached and we should allocate a new before
|
||||||
// every HttpIoRecvResponse().
|
// every HttpIoRecvResponse().
|
||||||
//
|
//
|
||||||
if (Block == NULL || Context.BufferSize == 0) {
|
if ((Block == NULL) || (Context.BufferSize == 0)) {
|
||||||
Block = AllocatePool (HTTP_BOOT_BLOCK_SIZE);
|
Block = AllocatePool (HTTP_BOOT_BLOCK_SIZE);
|
||||||
if (Block == NULL) {
|
if (Block == NULL) {
|
||||||
Status = EFI_OUT_OF_RESOURCES;
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
goto ERROR_6;
|
goto ERROR_6;
|
||||||
}
|
}
|
||||||
|
|
||||||
Context.NewBlock = TRUE;
|
Context.NewBlock = TRUE;
|
||||||
Context.Block = Block;
|
Context.Block = Block;
|
||||||
} else {
|
} else {
|
||||||
Context.NewBlock = FALSE;
|
Context.NewBlock = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
ResponseBody.Body = (CHAR8*) Block;
|
ResponseBody.Body = (CHAR8 *)Block;
|
||||||
ResponseBody.BodyLength = HTTP_BOOT_BLOCK_SIZE;
|
ResponseBody.BodyLength = HTTP_BOOT_BLOCK_SIZE;
|
||||||
Status = HttpIoRecvResponse (
|
Status = HttpIoRecvResponse (
|
||||||
&Private->HttpIo,
|
&Private->HttpIo,
|
||||||
FALSE,
|
FALSE,
|
||||||
&ResponseBody
|
&ResponseBody
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status) || EFI_ERROR (ResponseBody.Status)) {
|
if (EFI_ERROR (Status) || EFI_ERROR (ResponseBody.Status)) {
|
||||||
if (EFI_ERROR (ResponseBody.Status)) {
|
if (EFI_ERROR (ResponseBody.Status)) {
|
||||||
Status = ResponseBody.Status;
|
Status = ResponseBody.Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
goto ERROR_6;
|
goto ERROR_6;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1263,6 +1298,7 @@ HttpBootGetBootFile (
|
|||||||
} else {
|
} else {
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
*BufferSize = ContentLength;
|
*BufferSize = ContentLength;
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -1283,25 +1319,30 @@ ERROR_6:
|
|||||||
if (Parser != NULL) {
|
if (Parser != NULL) {
|
||||||
HttpFreeMsgParser (Parser);
|
HttpFreeMsgParser (Parser);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Context.Block != NULL) {
|
if (Context.Block != NULL) {
|
||||||
FreePool (Context.Block);
|
FreePool (Context.Block);
|
||||||
}
|
}
|
||||||
|
|
||||||
HttpBootFreeCache (Cache);
|
HttpBootFreeCache (Cache);
|
||||||
|
|
||||||
ERROR_5:
|
ERROR_5:
|
||||||
if (ResponseData != NULL) {
|
if (ResponseData != NULL) {
|
||||||
FreePool (ResponseData);
|
FreePool (ResponseData);
|
||||||
}
|
}
|
||||||
|
|
||||||
ERROR_4:
|
ERROR_4:
|
||||||
if (RequestData != NULL) {
|
if (RequestData != NULL) {
|
||||||
FreePool (RequestData);
|
FreePool (RequestData);
|
||||||
}
|
}
|
||||||
|
|
||||||
ERROR_3:
|
ERROR_3:
|
||||||
HttpIoFreeHeader (HttpIoHeader);
|
HttpIoFreeHeader (HttpIoHeader);
|
||||||
ERROR_2:
|
ERROR_2:
|
||||||
if (Cache != NULL) {
|
if (Cache != NULL) {
|
||||||
FreePool (Cache);
|
FreePool (Cache);
|
||||||
}
|
}
|
||||||
|
|
||||||
ERROR_1:
|
ERROR_1:
|
||||||
if (Url != NULL) {
|
if (Url != NULL) {
|
||||||
FreePool (Url);
|
FreePool (Url);
|
||||||
|
@ -10,29 +10,29 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#ifndef __EFI_HTTP_BOOT_HTTP_H__
|
#ifndef __EFI_HTTP_BOOT_HTTP_H__
|
||||||
#define __EFI_HTTP_BOOT_HTTP_H__
|
#define __EFI_HTTP_BOOT_HTTP_H__
|
||||||
|
|
||||||
#define HTTP_BOOT_BLOCK_SIZE 1500
|
#define HTTP_BOOT_BLOCK_SIZE 1500
|
||||||
#define HTTP_USER_AGENT_EFI_HTTP_BOOT "UefiHttpBoot/1.0"
|
#define HTTP_USER_AGENT_EFI_HTTP_BOOT "UefiHttpBoot/1.0"
|
||||||
|
|
||||||
//
|
//
|
||||||
// Record the data length and start address of a data block.
|
// Record the data length and start address of a data block.
|
||||||
//
|
//
|
||||||
typedef struct {
|
typedef struct {
|
||||||
LIST_ENTRY Link; // Link to the EntityDataList in HTTP_BOOT_CACHE_CONTENT
|
LIST_ENTRY Link; // Link to the EntityDataList in HTTP_BOOT_CACHE_CONTENT
|
||||||
UINT8 *Block; // If NULL, the data is in previous data block.
|
UINT8 *Block; // If NULL, the data is in previous data block.
|
||||||
UINT8 *DataStart; // Point to somewhere in the Block
|
UINT8 *DataStart; // Point to somewhere in the Block
|
||||||
UINTN DataLength;
|
UINTN DataLength;
|
||||||
} HTTP_BOOT_ENTITY_DATA;
|
} HTTP_BOOT_ENTITY_DATA;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Structure for a cache item
|
// Structure for a cache item
|
||||||
//
|
//
|
||||||
typedef struct {
|
typedef struct {
|
||||||
LIST_ENTRY Link; // Link to the CacheList in driver's private data.
|
LIST_ENTRY Link; // Link to the CacheList in driver's private data.
|
||||||
EFI_HTTP_REQUEST_DATA *RequestData;
|
EFI_HTTP_REQUEST_DATA *RequestData;
|
||||||
HTTP_IO_RESPONSE_DATA *ResponseData; // Not include any message-body data.
|
HTTP_IO_RESPONSE_DATA *ResponseData; // Not include any message-body data.
|
||||||
HTTP_BOOT_IMAGE_TYPE ImageType;
|
HTTP_BOOT_IMAGE_TYPE ImageType;
|
||||||
UINTN EntityLength;
|
UINTN EntityLength;
|
||||||
LIST_ENTRY EntityDataList; // Entity data (message-body)
|
LIST_ENTRY EntityDataList; // Entity data (message-body)
|
||||||
} HTTP_BOOT_CACHE_CONTENT;
|
} HTTP_BOOT_CACHE_CONTENT;
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -68,7 +68,7 @@ typedef struct {
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpBootDiscoverBootInfo (
|
HttpBootDiscoverBootInfo (
|
||||||
IN OUT HTTP_BOOT_PRIVATE_DATA *Private
|
IN OUT HTTP_BOOT_PRIVATE_DATA *Private
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -82,7 +82,7 @@ HttpBootDiscoverBootInfo (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpBootCreateHttpIo (
|
HttpBootCreateHttpIo (
|
||||||
IN HTTP_BOOT_PRIVATE_DATA *Private
|
IN HTTP_BOOT_PRIVATE_DATA *Private
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -111,11 +111,11 @@ HttpBootCreateHttpIo (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpBootGetBootFile (
|
HttpBootGetBootFile (
|
||||||
IN HTTP_BOOT_PRIVATE_DATA *Private,
|
IN HTTP_BOOT_PRIVATE_DATA *Private,
|
||||||
IN BOOLEAN HeaderOnly,
|
IN BOOLEAN HeaderOnly,
|
||||||
IN OUT UINTN *BufferSize,
|
IN OUT UINTN *BufferSize,
|
||||||
OUT UINT8 *Buffer,
|
OUT UINT8 *Buffer,
|
||||||
OUT HTTP_BOOT_IMAGE_TYPE *ImageType
|
OUT HTTP_BOOT_IMAGE_TYPE *ImageType
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -126,7 +126,7 @@ HttpBootGetBootFile (
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
HttpBootFreeCacheList (
|
HttpBootFreeCacheList (
|
||||||
IN HTTP_BOOT_PRIVATE_DATA *Private
|
IN HTTP_BOOT_PRIVATE_DATA *Private
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -13,7 +13,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
///
|
///
|
||||||
GLOBAL_REMOVE_IF_UNREFERENCED
|
GLOBAL_REMOVE_IF_UNREFERENCED
|
||||||
EFI_COMPONENT_NAME_PROTOCOL gHttpBootDxeComponentName = {
|
EFI_COMPONENT_NAME_PROTOCOL gHttpBootDxeComponentName = {
|
||||||
(EFI_COMPONENT_NAME_GET_DRIVER_NAME) HttpBootDxeComponentNameGetDriverName,
|
(EFI_COMPONENT_NAME_GET_DRIVER_NAME)HttpBootDxeComponentNameGetDriverName,
|
||||||
(EFI_COMPONENT_NAME_GET_CONTROLLER_NAME)HttpBootDxeComponentNameGetControllerName,
|
(EFI_COMPONENT_NAME_GET_CONTROLLER_NAME)HttpBootDxeComponentNameGetControllerName,
|
||||||
"eng"
|
"eng"
|
||||||
};
|
};
|
||||||
@ -32,18 +32,18 @@ EFI_COMPONENT_NAME2_PROTOCOL gHttpBootDxeComponentName2 = {
|
|||||||
/// Table of driver names
|
/// Table of driver names
|
||||||
///
|
///
|
||||||
GLOBAL_REMOVE_IF_UNREFERENCED
|
GLOBAL_REMOVE_IF_UNREFERENCED
|
||||||
EFI_UNICODE_STRING_TABLE mHttpBootDxeDriverNameTable[] = {
|
EFI_UNICODE_STRING_TABLE mHttpBootDxeDriverNameTable[] = {
|
||||||
{ "eng;en", (CHAR16 *)L"UEFI HTTP Boot Driver" },
|
{ "eng;en", (CHAR16 *)L"UEFI HTTP Boot Driver" },
|
||||||
{ NULL, NULL }
|
{ NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
///
|
///
|
||||||
/// Table of controller names
|
/// Table of controller names
|
||||||
///
|
///
|
||||||
GLOBAL_REMOVE_IF_UNREFERENCED
|
GLOBAL_REMOVE_IF_UNREFERENCED
|
||||||
EFI_UNICODE_STRING_TABLE mHttpBootDxeControllerNameTable[] = {
|
EFI_UNICODE_STRING_TABLE mHttpBootDxeControllerNameTable[] = {
|
||||||
{ "eng;en", (CHAR16 *)L"UEFI Http Boot Controller" },
|
{ "eng;en", (CHAR16 *)L"UEFI Http Boot Controller" },
|
||||||
{ NULL, NULL }
|
{ NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -81,7 +81,7 @@ HttpBootDxeComponentNameGetDriverName (
|
|||||||
This->SupportedLanguages,
|
This->SupportedLanguages,
|
||||||
mHttpBootDxeDriverNameTable,
|
mHttpBootDxeDriverNameTable,
|
||||||
DriverName,
|
DriverName,
|
||||||
(BOOLEAN) (This != &gHttpBootDxeComponentName2)
|
(BOOLEAN)(This != &gHttpBootDxeComponentName2)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -135,17 +135,17 @@ HttpBootDxeComponentNameGetControllerName (
|
|||||||
OUT CHAR16 **ControllerName
|
OUT CHAR16 **ControllerName
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_HANDLE NicHandle;
|
EFI_HANDLE NicHandle;
|
||||||
UINT32 *Id;
|
UINT32 *Id;
|
||||||
|
|
||||||
if (ControllerHandle == NULL || ChildHandle != NULL) {
|
if ((ControllerHandle == NULL) || (ChildHandle != NULL)) {
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
NicHandle = HttpBootGetNicByIp4Children (ControllerHandle);
|
NicHandle = HttpBootGetNicByIp4Children (ControllerHandle);
|
||||||
if (NicHandle == NULL) {
|
if (NicHandle == NULL) {
|
||||||
NicHandle = HttpBootGetNicByIp6Children(ControllerHandle);
|
NicHandle = HttpBootGetNicByIp6Children (ControllerHandle);
|
||||||
if (NicHandle == NULL) {
|
if (NicHandle == NULL) {
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
@ -157,7 +157,7 @@ HttpBootDxeComponentNameGetControllerName (
|
|||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
NicHandle,
|
NicHandle,
|
||||||
&gEfiCallerIdGuid,
|
&gEfiCallerIdGuid,
|
||||||
(VOID **) &Id,
|
(VOID **)&Id,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||||
@ -173,5 +173,4 @@ HttpBootDxeComponentNameGetControllerName (
|
|||||||
ControllerName,
|
ControllerName,
|
||||||
(BOOLEAN)(This != &gHttpBootDxeComponentName2)
|
(BOOLEAN)(This != &gHttpBootDxeComponentName2)
|
||||||
);
|
);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -9,7 +9,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#include "HttpBootDxe.h"
|
#include "HttpBootDxe.h"
|
||||||
#include <Library/UefiBootManagerLib.h>
|
#include <Library/UefiBootManagerLib.h>
|
||||||
|
|
||||||
CHAR16 mHttpBootConfigStorageName[] = L"HTTP_BOOT_CONFIG_IFR_NVDATA";
|
CHAR16 mHttpBootConfigStorageName[] = L"HTTP_BOOT_CONFIG_IFR_NVDATA";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Add new boot option for HTTP boot.
|
Add new boot option for HTTP boot.
|
||||||
@ -25,20 +25,20 @@ CHAR16 mHttpBootConfigStorageName[] = L"HTTP_BOOT_CONFIG_IFR_NVDATA";
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpBootAddBootOption (
|
HttpBootAddBootOption (
|
||||||
IN HTTP_BOOT_PRIVATE_DATA *Private,
|
IN HTTP_BOOT_PRIVATE_DATA *Private,
|
||||||
IN BOOLEAN UsingIpv6,
|
IN BOOLEAN UsingIpv6,
|
||||||
IN CHAR16 *Description,
|
IN CHAR16 *Description,
|
||||||
IN CHAR16 *Uri
|
IN CHAR16 *Uri
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_DEV_PATH *Node;
|
EFI_DEV_PATH *Node;
|
||||||
EFI_DEVICE_PATH_PROTOCOL *TmpDevicePath;
|
EFI_DEVICE_PATH_PROTOCOL *TmpDevicePath;
|
||||||
EFI_DEVICE_PATH_PROTOCOL *NewDevicePath;
|
EFI_DEVICE_PATH_PROTOCOL *NewDevicePath;
|
||||||
UINTN Length;
|
UINTN Length;
|
||||||
CHAR8 AsciiUri[URI_STR_MAX_SIZE];
|
CHAR8 AsciiUri[URI_STR_MAX_SIZE];
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
EFI_BOOT_MANAGER_LOAD_OPTION NewOption;
|
EFI_BOOT_MANAGER_LOAD_OPTION NewOption;
|
||||||
|
|
||||||
NewDevicePath = NULL;
|
NewDevicePath = NULL;
|
||||||
Node = NULL;
|
Node = NULL;
|
||||||
@ -55,7 +55,8 @@ HttpBootAddBootOption (
|
|||||||
if (Uri[Index] == L':') {
|
if (Uri[Index] == L':') {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (Uri[Index] >= L'A' && Uri[Index] <= L'Z') {
|
|
||||||
|
if ((Uri[Index] >= L'A') && (Uri[Index] <= L'Z')) {
|
||||||
Uri[Index] -= (CHAR16)(L'A' - L'a');
|
Uri[Index] -= (CHAR16)(L'A' - L'a');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -77,6 +78,7 @@ HttpBootAddBootOption (
|
|||||||
Status = EFI_OUT_OF_RESOURCES;
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
Node->Ipv4.Header.Type = MESSAGING_DEVICE_PATH;
|
Node->Ipv4.Header.Type = MESSAGING_DEVICE_PATH;
|
||||||
Node->Ipv4.Header.SubType = MSG_IPv4_DP;
|
Node->Ipv4.Header.SubType = MSG_IPv4_DP;
|
||||||
SetDevicePathNodeLength (Node, sizeof (IPv4_DEVICE_PATH));
|
SetDevicePathNodeLength (Node, sizeof (IPv4_DEVICE_PATH));
|
||||||
@ -86,31 +88,35 @@ HttpBootAddBootOption (
|
|||||||
Status = EFI_OUT_OF_RESOURCES;
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
}
|
}
|
||||||
Node->Ipv6.Header.Type = MESSAGING_DEVICE_PATH;
|
|
||||||
Node->Ipv6.Header.SubType = MSG_IPv6_DP;
|
Node->Ipv6.Header.Type = MESSAGING_DEVICE_PATH;
|
||||||
|
Node->Ipv6.Header.SubType = MSG_IPv6_DP;
|
||||||
SetDevicePathNodeLength (Node, sizeof (IPv6_DEVICE_PATH));
|
SetDevicePathNodeLength (Node, sizeof (IPv6_DEVICE_PATH));
|
||||||
}
|
}
|
||||||
TmpDevicePath = AppendDevicePathNode (Private->ParentDevicePath, (EFI_DEVICE_PATH_PROTOCOL*) Node);
|
|
||||||
|
TmpDevicePath = AppendDevicePathNode (Private->ParentDevicePath, (EFI_DEVICE_PATH_PROTOCOL *)Node);
|
||||||
FreePool (Node);
|
FreePool (Node);
|
||||||
if (TmpDevicePath == NULL) {
|
if (TmpDevicePath == NULL) {
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Update the URI node with the input boot file URI.
|
// Update the URI node with the input boot file URI.
|
||||||
//
|
//
|
||||||
UnicodeStrToAsciiStrS (Uri, AsciiUri, sizeof (AsciiUri));
|
UnicodeStrToAsciiStrS (Uri, AsciiUri, sizeof (AsciiUri));
|
||||||
Length = sizeof (EFI_DEVICE_PATH_PROTOCOL) + AsciiStrSize (AsciiUri);
|
Length = sizeof (EFI_DEVICE_PATH_PROTOCOL) + AsciiStrSize (AsciiUri);
|
||||||
Node = AllocatePool (Length);
|
Node = AllocatePool (Length);
|
||||||
if (Node == NULL) {
|
if (Node == NULL) {
|
||||||
Status = EFI_OUT_OF_RESOURCES;
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
FreePool (TmpDevicePath);
|
FreePool (TmpDevicePath);
|
||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
Node->DevPath.Type = MESSAGING_DEVICE_PATH;
|
Node->DevPath.Type = MESSAGING_DEVICE_PATH;
|
||||||
Node->DevPath.SubType = MSG_URI_DP;
|
Node->DevPath.SubType = MSG_URI_DP;
|
||||||
SetDevicePathNodeLength (Node, Length);
|
SetDevicePathNodeLength (Node, Length);
|
||||||
CopyMem ((UINT8*) Node + sizeof (EFI_DEVICE_PATH_PROTOCOL), AsciiUri, AsciiStrSize (AsciiUri));
|
CopyMem ((UINT8 *)Node + sizeof (EFI_DEVICE_PATH_PROTOCOL), AsciiUri, AsciiStrSize (AsciiUri));
|
||||||
NewDevicePath = AppendDevicePathNode (TmpDevicePath, (EFI_DEVICE_PATH_PROTOCOL*) Node);
|
NewDevicePath = AppendDevicePathNode (TmpDevicePath, (EFI_DEVICE_PATH_PROTOCOL *)Node);
|
||||||
FreePool (Node);
|
FreePool (Node);
|
||||||
FreePool (TmpDevicePath);
|
FreePool (TmpDevicePath);
|
||||||
if (NewDevicePath == NULL) {
|
if (NewDevicePath == NULL) {
|
||||||
@ -122,20 +128,20 @@ HttpBootAddBootOption (
|
|||||||
// Add a new load option.
|
// Add a new load option.
|
||||||
//
|
//
|
||||||
Status = EfiBootManagerInitializeLoadOption (
|
Status = EfiBootManagerInitializeLoadOption (
|
||||||
&NewOption,
|
&NewOption,
|
||||||
LoadOptionNumberUnassigned,
|
LoadOptionNumberUnassigned,
|
||||||
LoadOptionTypeBoot,
|
LoadOptionTypeBoot,
|
||||||
LOAD_OPTION_ACTIVE,
|
LOAD_OPTION_ACTIVE,
|
||||||
Description,
|
Description,
|
||||||
NewDevicePath,
|
NewDevicePath,
|
||||||
NULL,
|
NULL,
|
||||||
0
|
0
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = EfiBootManagerAddLoadOptionVariable (&NewOption, (UINTN) -1);
|
Status = EfiBootManagerAddLoadOptionVariable (&NewOption, (UINTN)-1);
|
||||||
EfiBootManagerFreeLoadOption (&NewOption);
|
EfiBootManagerFreeLoadOption (&NewOption);
|
||||||
|
|
||||||
ON_EXIT:
|
ON_EXIT:
|
||||||
@ -221,21 +227,21 @@ ON_EXIT:
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
HttpBootFormExtractConfig (
|
HttpBootFormExtractConfig (
|
||||||
IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
|
IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
|
||||||
IN CONST EFI_STRING Request,
|
IN CONST EFI_STRING Request,
|
||||||
OUT EFI_STRING *Progress,
|
OUT EFI_STRING *Progress,
|
||||||
OUT EFI_STRING *Results
|
OUT EFI_STRING *Results
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
UINTN BufferSize;
|
UINTN BufferSize;
|
||||||
HTTP_BOOT_FORM_CALLBACK_INFO *CallbackInfo;
|
HTTP_BOOT_FORM_CALLBACK_INFO *CallbackInfo;
|
||||||
EFI_STRING ConfigRequestHdr;
|
EFI_STRING ConfigRequestHdr;
|
||||||
EFI_STRING ConfigRequest;
|
EFI_STRING ConfigRequest;
|
||||||
BOOLEAN AllocatedRequest;
|
BOOLEAN AllocatedRequest;
|
||||||
UINTN Size;
|
UINTN Size;
|
||||||
|
|
||||||
if (Progress == NULL || Results == NULL) {
|
if ((Progress == NULL) || (Results == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -265,11 +271,12 @@ HttpBootFormExtractConfig (
|
|||||||
// followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW" followed by a Null-terminator
|
// followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW" followed by a Null-terminator
|
||||||
//
|
//
|
||||||
ConfigRequestHdr = HiiConstructConfigHdr (&gHttpBootConfigGuid, mHttpBootConfigStorageName, CallbackInfo->ChildHandle);
|
ConfigRequestHdr = HiiConstructConfigHdr (&gHttpBootConfigGuid, mHttpBootConfigStorageName, CallbackInfo->ChildHandle);
|
||||||
Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16);
|
Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16);
|
||||||
ConfigRequest = AllocateZeroPool (Size);
|
ConfigRequest = AllocateZeroPool (Size);
|
||||||
if (ConfigRequest == NULL) {
|
if (ConfigRequest == NULL) {
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
AllocatedRequest = TRUE;
|
AllocatedRequest = TRUE;
|
||||||
UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX", ConfigRequestHdr, (UINT64)BufferSize);
|
UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX", ConfigRequestHdr, (UINT64)BufferSize);
|
||||||
FreePool (ConfigRequestHdr);
|
FreePool (ConfigRequestHdr);
|
||||||
@ -278,7 +285,7 @@ HttpBootFormExtractConfig (
|
|||||||
Status = gHiiConfigRouting->BlockToConfig (
|
Status = gHiiConfigRouting->BlockToConfig (
|
||||||
gHiiConfigRouting,
|
gHiiConfigRouting,
|
||||||
ConfigRequest,
|
ConfigRequest,
|
||||||
(UINT8 *) &CallbackInfo->HttpBootNvData,
|
(UINT8 *)&CallbackInfo->HttpBootNvData,
|
||||||
BufferSize,
|
BufferSize,
|
||||||
Results,
|
Results,
|
||||||
Progress
|
Progress
|
||||||
@ -291,6 +298,7 @@ HttpBootFormExtractConfig (
|
|||||||
FreePool (ConfigRequest);
|
FreePool (ConfigRequest);
|
||||||
ConfigRequest = NULL;
|
ConfigRequest = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Set Progress string to the original request string.
|
// Set Progress string to the original request string.
|
||||||
//
|
//
|
||||||
@ -346,19 +354,20 @@ HttpBootFormExtractConfig (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
HttpBootFormRouteConfig (
|
HttpBootFormRouteConfig (
|
||||||
IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
|
IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
|
||||||
IN CONST EFI_STRING Configuration,
|
IN CONST EFI_STRING Configuration,
|
||||||
OUT EFI_STRING *Progress
|
OUT EFI_STRING *Progress
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
UINTN BufferSize;
|
UINTN BufferSize;
|
||||||
HTTP_BOOT_FORM_CALLBACK_INFO *CallbackInfo;
|
HTTP_BOOT_FORM_CALLBACK_INFO *CallbackInfo;
|
||||||
HTTP_BOOT_PRIVATE_DATA *Private;
|
HTTP_BOOT_PRIVATE_DATA *Private;
|
||||||
|
|
||||||
if (Progress == NULL) {
|
if (Progress == NULL) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
*Progress = Configuration;
|
*Progress = Configuration;
|
||||||
|
|
||||||
if (Configuration == NULL) {
|
if (Configuration == NULL) {
|
||||||
@ -380,12 +389,12 @@ HttpBootFormRouteConfig (
|
|||||||
ZeroMem (&CallbackInfo->HttpBootNvData, BufferSize);
|
ZeroMem (&CallbackInfo->HttpBootNvData, BufferSize);
|
||||||
|
|
||||||
Status = gHiiConfigRouting->ConfigToBlock (
|
Status = gHiiConfigRouting->ConfigToBlock (
|
||||||
gHiiConfigRouting,
|
gHiiConfigRouting,
|
||||||
Configuration,
|
Configuration,
|
||||||
(UINT8 *) &CallbackInfo->HttpBootNvData,
|
(UINT8 *)&CallbackInfo->HttpBootNvData,
|
||||||
&BufferSize,
|
&BufferSize,
|
||||||
Progress
|
Progress
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
@ -431,27 +440,27 @@ HttpBootFormRouteConfig (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
HttpBootFormCallback (
|
HttpBootFormCallback (
|
||||||
IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
|
IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
|
||||||
IN EFI_BROWSER_ACTION Action,
|
IN EFI_BROWSER_ACTION Action,
|
||||||
IN EFI_QUESTION_ID QuestionId,
|
IN EFI_QUESTION_ID QuestionId,
|
||||||
IN UINT8 Type,
|
IN UINT8 Type,
|
||||||
IN OUT EFI_IFR_TYPE_VALUE *Value,
|
IN OUT EFI_IFR_TYPE_VALUE *Value,
|
||||||
OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest
|
OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_INPUT_KEY Key;
|
EFI_INPUT_KEY Key;
|
||||||
CHAR16 *Uri;
|
CHAR16 *Uri;
|
||||||
UINTN UriLen;
|
UINTN UriLen;
|
||||||
CHAR8 *AsciiUri;
|
CHAR8 *AsciiUri;
|
||||||
HTTP_BOOT_FORM_CALLBACK_INFO *CallbackInfo;
|
HTTP_BOOT_FORM_CALLBACK_INFO *CallbackInfo;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
Uri = NULL;
|
Uri = NULL;
|
||||||
UriLen = 0;
|
UriLen = 0;
|
||||||
AsciiUri = NULL;
|
AsciiUri = NULL;
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
|
|
||||||
if (This == NULL || Value == NULL) {
|
if ((This == NULL) || (Value == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -462,68 +471,66 @@ HttpBootFormCallback (
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch (QuestionId) {
|
switch (QuestionId) {
|
||||||
case KEY_INITIATOR_URI:
|
case KEY_INITIATOR_URI:
|
||||||
//
|
//
|
||||||
// Get user input URI string
|
// Get user input URI string
|
||||||
//
|
//
|
||||||
Uri = HiiGetString (CallbackInfo->RegisteredHandle, Value->string, NULL);
|
Uri = HiiGetString (CallbackInfo->RegisteredHandle, Value->string, NULL);
|
||||||
if(Uri == NULL) {
|
if (Uri == NULL) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// The URI should be either an empty string (for corporate environment) ,or http(s) for home environment.
|
// The URI should be either an empty string (for corporate environment) ,or http(s) for home environment.
|
||||||
// Pop up a message box for the unsupported URI.
|
// Pop up a message box for the unsupported URI.
|
||||||
//
|
//
|
||||||
if (StrLen (Uri) != 0) {
|
if (StrLen (Uri) != 0) {
|
||||||
UriLen = StrLen (Uri) + 1;
|
UriLen = StrLen (Uri) + 1;
|
||||||
AsciiUri = AllocateZeroPool (UriLen);
|
AsciiUri = AllocateZeroPool (UriLen);
|
||||||
if (AsciiUri == NULL) {
|
if (AsciiUri == NULL) {
|
||||||
|
FreePool (Uri);
|
||||||
|
return EFI_OUT_OF_RESOURCES;
|
||||||
|
}
|
||||||
|
|
||||||
|
UnicodeStrToAsciiStrS (Uri, AsciiUri, UriLen);
|
||||||
|
|
||||||
|
Status = HttpBootCheckUriScheme (AsciiUri);
|
||||||
|
|
||||||
|
if (Status == EFI_INVALID_PARAMETER) {
|
||||||
|
DEBUG ((DEBUG_ERROR, "HttpBootFormCallback: %r.\n", Status));
|
||||||
|
|
||||||
|
CreatePopUp (
|
||||||
|
EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
|
||||||
|
&Key,
|
||||||
|
L"ERROR: Unsupported URI!",
|
||||||
|
L"Only supports HTTP and HTTPS",
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
} else if (Status == EFI_ACCESS_DENIED) {
|
||||||
|
DEBUG ((DEBUG_ERROR, "HttpBootFormCallback: %r.\n", Status));
|
||||||
|
|
||||||
|
CreatePopUp (
|
||||||
|
EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
|
||||||
|
&Key,
|
||||||
|
L"ERROR: Unsupported URI!",
|
||||||
|
L"HTTP is disabled",
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Uri != NULL) {
|
||||||
FreePool (Uri);
|
FreePool (Uri);
|
||||||
return EFI_OUT_OF_RESOURCES;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
UnicodeStrToAsciiStrS (Uri, AsciiUri, UriLen);
|
if (AsciiUri != NULL) {
|
||||||
|
FreePool (AsciiUri);
|
||||||
Status = HttpBootCheckUriScheme (AsciiUri);
|
|
||||||
|
|
||||||
if (Status == EFI_INVALID_PARAMETER) {
|
|
||||||
|
|
||||||
DEBUG ((DEBUG_ERROR, "HttpBootFormCallback: %r.\n", Status));
|
|
||||||
|
|
||||||
CreatePopUp (
|
|
||||||
EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
|
|
||||||
&Key,
|
|
||||||
L"ERROR: Unsupported URI!",
|
|
||||||
L"Only supports HTTP and HTTPS",
|
|
||||||
NULL
|
|
||||||
);
|
|
||||||
} else if (Status == EFI_ACCESS_DENIED) {
|
|
||||||
|
|
||||||
DEBUG ((DEBUG_ERROR, "HttpBootFormCallback: %r.\n", Status));
|
|
||||||
|
|
||||||
CreatePopUp (
|
|
||||||
EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE,
|
|
||||||
&Key,
|
|
||||||
L"ERROR: Unsupported URI!",
|
|
||||||
L"HTTP is disabled",
|
|
||||||
NULL
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (Uri != NULL) {
|
break;
|
||||||
FreePool (Uri);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (AsciiUri != NULL) {
|
default:
|
||||||
FreePool (AsciiUri);
|
break;
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
@ -540,15 +547,15 @@ HttpBootFormCallback (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpBootConfigFormInit (
|
HttpBootConfigFormInit (
|
||||||
IN HTTP_BOOT_PRIVATE_DATA *Private
|
IN HTTP_BOOT_PRIVATE_DATA *Private
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
HTTP_BOOT_FORM_CALLBACK_INFO *CallbackInfo;
|
HTTP_BOOT_FORM_CALLBACK_INFO *CallbackInfo;
|
||||||
VENDOR_DEVICE_PATH VendorDeviceNode;
|
VENDOR_DEVICE_PATH VendorDeviceNode;
|
||||||
CHAR16 *MacString;
|
CHAR16 *MacString;
|
||||||
CHAR16 *OldMenuString;
|
CHAR16 *OldMenuString;
|
||||||
CHAR16 MenuString[128];
|
CHAR16 MenuString[128];
|
||||||
|
|
||||||
CallbackInfo = &Private->CallbackInfo;
|
CallbackInfo = &Private->CallbackInfo;
|
||||||
|
|
||||||
@ -570,7 +577,7 @@ HttpBootConfigFormInit (
|
|||||||
SetDevicePathNodeLength (&VendorDeviceNode.Header, sizeof (VENDOR_DEVICE_PATH));
|
SetDevicePathNodeLength (&VendorDeviceNode.Header, sizeof (VENDOR_DEVICE_PATH));
|
||||||
CallbackInfo->HiiVendorDevicePath = AppendDevicePathNode (
|
CallbackInfo->HiiVendorDevicePath = AppendDevicePathNode (
|
||||||
Private->ParentDevicePath,
|
Private->ParentDevicePath,
|
||||||
(EFI_DEVICE_PATH_PROTOCOL *) &VendorDeviceNode
|
(EFI_DEVICE_PATH_PROTOCOL *)&VendorDeviceNode
|
||||||
);
|
);
|
||||||
if (CallbackInfo->HiiVendorDevicePath == NULL) {
|
if (CallbackInfo->HiiVendorDevicePath == NULL) {
|
||||||
Status = EFI_OUT_OF_RESOURCES;
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
@ -655,12 +662,12 @@ Error:
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpBootConfigFormUnload (
|
HttpBootConfigFormUnload (
|
||||||
IN HTTP_BOOT_PRIVATE_DATA *Private
|
IN HTTP_BOOT_PRIVATE_DATA *Private
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
HTTP_BOOT_FORM_CALLBACK_INFO *CallbackInfo;
|
HTTP_BOOT_FORM_CALLBACK_INFO *CallbackInfo;
|
||||||
|
|
||||||
if (Private->Ip4Nic != NULL || Private->Ip6Nic != NULL) {
|
if ((Private->Ip4Nic != NULL) || (Private->Ip6Nic != NULL)) {
|
||||||
//
|
//
|
||||||
// Only unload the configuration form when both IP4 and IP6 stack are stopped.
|
// Only unload the configuration form when both IP4 and IP6 stack are stopped.
|
||||||
//
|
//
|
||||||
|
@ -10,13 +10,12 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#ifndef _HTTP_BOOT_CONFIG_H_
|
#ifndef _HTTP_BOOT_CONFIG_H_
|
||||||
#define _HTTP_BOOT_CONFIG_H_
|
#define _HTTP_BOOT_CONFIG_H_
|
||||||
|
|
||||||
|
|
||||||
#include "HttpBootConfigNVDataStruc.h"
|
#include "HttpBootConfigNVDataStruc.h"
|
||||||
|
|
||||||
typedef struct _HTTP_BOOT_FORM_CALLBACK_INFO HTTP_BOOT_FORM_CALLBACK_INFO;
|
typedef struct _HTTP_BOOT_FORM_CALLBACK_INFO HTTP_BOOT_FORM_CALLBACK_INFO;
|
||||||
|
|
||||||
extern UINT8 HttpBootDxeStrings[];
|
extern UINT8 HttpBootDxeStrings[];
|
||||||
extern UINT8 HttpBootConfigVfrBin[];
|
extern UINT8 HttpBootConfigVfrBin[];
|
||||||
|
|
||||||
#pragma pack()
|
#pragma pack()
|
||||||
|
|
||||||
@ -31,13 +30,13 @@ extern UINT8 HttpBootConfigVfrBin[];
|
|||||||
)
|
)
|
||||||
|
|
||||||
struct _HTTP_BOOT_FORM_CALLBACK_INFO {
|
struct _HTTP_BOOT_FORM_CALLBACK_INFO {
|
||||||
UINT32 Signature;
|
UINT32 Signature;
|
||||||
BOOLEAN Initialized;
|
BOOLEAN Initialized;
|
||||||
EFI_HANDLE ChildHandle;
|
EFI_HANDLE ChildHandle;
|
||||||
EFI_DEVICE_PATH_PROTOCOL *HiiVendorDevicePath;
|
EFI_DEVICE_PATH_PROTOCOL *HiiVendorDevicePath;
|
||||||
EFI_HII_HANDLE RegisteredHandle;
|
EFI_HII_HANDLE RegisteredHandle;
|
||||||
EFI_HII_CONFIG_ACCESS_PROTOCOL ConfigAccess;
|
EFI_HII_CONFIG_ACCESS_PROTOCOL ConfigAccess;
|
||||||
HTTP_BOOT_CONFIG_IFR_NVDATA HttpBootNvData;
|
HTTP_BOOT_CONFIG_IFR_NVDATA HttpBootNvData;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -51,7 +50,7 @@ struct _HTTP_BOOT_FORM_CALLBACK_INFO {
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpBootConfigFormInit (
|
HttpBootConfigFormInit (
|
||||||
IN HTTP_BOOT_PRIVATE_DATA *Private
|
IN HTTP_BOOT_PRIVATE_DATA *Private
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -67,7 +66,7 @@ HttpBootConfigFormInit (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpBootConfigFormUnload (
|
HttpBootConfigFormUnload (
|
||||||
IN HTTP_BOOT_PRIVATE_DATA *Private
|
IN HTTP_BOOT_PRIVATE_DATA *Private
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -11,25 +11,25 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
|
|
||||||
#include <Guid/HttpBootConfigHii.h>
|
#include <Guid/HttpBootConfigHii.h>
|
||||||
|
|
||||||
#define HTTP_BOOT_IP_VERSION_4 0
|
#define HTTP_BOOT_IP_VERSION_4 0
|
||||||
#define HTTP_BOOT_IP_VERSION_6 1
|
#define HTTP_BOOT_IP_VERSION_6 1
|
||||||
|
|
||||||
//
|
//
|
||||||
// Macros used for an IPv4 or an IPv6 address.
|
// Macros used for an IPv4 or an IPv6 address.
|
||||||
//
|
//
|
||||||
#define URI_STR_MIN_SIZE 0
|
#define URI_STR_MIN_SIZE 0
|
||||||
#define URI_STR_MAX_SIZE 255
|
#define URI_STR_MAX_SIZE 255
|
||||||
|
|
||||||
#define DESCRIPTION_STR_MIN_SIZE 6
|
#define DESCRIPTION_STR_MIN_SIZE 6
|
||||||
#define DESCRIPTION_STR_MAX_SIZE 75
|
#define DESCRIPTION_STR_MAX_SIZE 75
|
||||||
|
|
||||||
#define CONFIGURATION_VARSTORE_ID 0x1234
|
#define CONFIGURATION_VARSTORE_ID 0x1234
|
||||||
|
|
||||||
#define FORMID_MAIN_FORM 1
|
#define FORMID_MAIN_FORM 1
|
||||||
|
|
||||||
#define KEY_INITIATOR_URI 0x101
|
#define KEY_INITIATOR_URI 0x101
|
||||||
|
|
||||||
#define HTTP_BOOT_DEFAULT_DESCRIPTION_STR L"UEFI HTTP"
|
#define HTTP_BOOT_DEFAULT_DESCRIPTION_STR L"UEFI HTTP"
|
||||||
|
|
||||||
#pragma pack(1)
|
#pragma pack(1)
|
||||||
typedef struct _HTTP_BOOT_CONFIG_IFR_NVDATA {
|
typedef struct _HTTP_BOOT_CONFIG_IFR_NVDATA {
|
||||||
@ -40,5 +40,4 @@ typedef struct _HTTP_BOOT_CONFIG_IFR_NVDATA {
|
|||||||
} HTTP_BOOT_CONFIG_IFR_NVDATA;
|
} HTTP_BOOT_CONFIG_IFR_NVDATA;
|
||||||
#pragma pack()
|
#pragma pack()
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -11,7 +11,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
//
|
//
|
||||||
// This is a map from the interested DHCP4 option tags' index to the tag value.
|
// This is a map from the interested DHCP4 option tags' index to the tag value.
|
||||||
//
|
//
|
||||||
UINT8 mInterestedDhcp4Tags[HTTP_BOOT_DHCP4_TAG_INDEX_MAX] = {
|
UINT8 mInterestedDhcp4Tags[HTTP_BOOT_DHCP4_TAG_INDEX_MAX] = {
|
||||||
DHCP4_TAG_BOOTFILE_LEN,
|
DHCP4_TAG_BOOTFILE_LEN,
|
||||||
DHCP4_TAG_OVERLOAD,
|
DHCP4_TAG_OVERLOAD,
|
||||||
DHCP4_TAG_MSG_TYPE,
|
DHCP4_TAG_MSG_TYPE,
|
||||||
@ -24,7 +24,7 @@ UINT8 mInterestedDhcp4Tags[HTTP_BOOT_DHCP4_TAG_INDEX_MAX] = {
|
|||||||
//
|
//
|
||||||
// There are 4 times retries with the value of 4, 8, 16 and 32, refers to UEFI 2.5 spec.
|
// There are 4 times retries with the value of 4, 8, 16 and 32, refers to UEFI 2.5 spec.
|
||||||
//
|
//
|
||||||
UINT32 mHttpDhcpTimeout[4] = {4, 8, 16, 32};
|
UINT32 mHttpDhcpTimeout[4] = { 4, 8, 16, 32 };
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Build the options buffer for the DHCPv4 request packet.
|
Build the options buffer for the DHCPv4 request packet.
|
||||||
@ -38,9 +38,9 @@ UINT32 mHttpDhcpTimeout[4] = {4, 8, 16, 32};
|
|||||||
**/
|
**/
|
||||||
UINT32
|
UINT32
|
||||||
HttpBootBuildDhcp4Options (
|
HttpBootBuildDhcp4Options (
|
||||||
IN HTTP_BOOT_PRIVATE_DATA *Private,
|
IN HTTP_BOOT_PRIVATE_DATA *Private,
|
||||||
OUT EFI_DHCP4_PACKET_OPTION **OptList,
|
OUT EFI_DHCP4_PACKET_OPTION **OptList,
|
||||||
IN UINT8 *Buffer
|
IN UINT8 *Buffer
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
HTTP_BOOT_DHCP4_OPTION_ENTRY OptEnt;
|
HTTP_BOOT_DHCP4_OPTION_ENTRY OptEnt;
|
||||||
@ -48,14 +48,14 @@ HttpBootBuildDhcp4Options (
|
|||||||
UINT32 Index;
|
UINT32 Index;
|
||||||
|
|
||||||
Index = 0;
|
Index = 0;
|
||||||
OptList[0] = (EFI_DHCP4_PACKET_OPTION *) Buffer;
|
OptList[0] = (EFI_DHCP4_PACKET_OPTION *)Buffer;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Append parameter request list option.
|
// Append parameter request list option.
|
||||||
//
|
//
|
||||||
OptList[Index]->OpCode = DHCP4_TAG_PARA_LIST;
|
OptList[Index]->OpCode = DHCP4_TAG_PARA_LIST;
|
||||||
OptList[Index]->Length = 27;
|
OptList[Index]->Length = 27;
|
||||||
OptEnt.Para = (HTTP_BOOT_DHCP4_OPTION_PARA *) OptList[Index]->Data;
|
OptEnt.Para = (HTTP_BOOT_DHCP4_OPTION_PARA *)OptList[Index]->Data;
|
||||||
OptEnt.Para->ParaList[0] = DHCP4_TAG_NETMASK;
|
OptEnt.Para->ParaList[0] = DHCP4_TAG_NETMASK;
|
||||||
OptEnt.Para->ParaList[1] = DHCP4_TAG_TIME_OFFSET;
|
OptEnt.Para->ParaList[1] = DHCP4_TAG_TIME_OFFSET;
|
||||||
OptEnt.Para->ParaList[2] = DHCP4_TAG_ROUTER;
|
OptEnt.Para->ParaList[2] = DHCP4_TAG_ROUTER;
|
||||||
@ -83,30 +83,31 @@ HttpBootBuildDhcp4Options (
|
|||||||
OptEnt.Para->ParaList[25] = DHCP4_TAG_BOOTFILE;
|
OptEnt.Para->ParaList[25] = DHCP4_TAG_BOOTFILE;
|
||||||
OptEnt.Para->ParaList[26] = DHCP4_TAG_UUID;
|
OptEnt.Para->ParaList[26] = DHCP4_TAG_UUID;
|
||||||
Index++;
|
Index++;
|
||||||
OptList[Index] = GET_NEXT_DHCP_OPTION (OptList[Index - 1]);
|
OptList[Index] = GET_NEXT_DHCP_OPTION (OptList[Index - 1]);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Append UUID/Guid-based client identifier option
|
// Append UUID/Guid-based client identifier option
|
||||||
//
|
//
|
||||||
OptList[Index]->OpCode = DHCP4_TAG_UUID;
|
OptList[Index]->OpCode = DHCP4_TAG_UUID;
|
||||||
OptList[Index]->Length = (UINT8) sizeof (HTTP_BOOT_DHCP4_OPTION_UUID);
|
OptList[Index]->Length = (UINT8)sizeof (HTTP_BOOT_DHCP4_OPTION_UUID);
|
||||||
OptEnt.Uuid = (HTTP_BOOT_DHCP4_OPTION_UUID *) OptList[Index]->Data;
|
OptEnt.Uuid = (HTTP_BOOT_DHCP4_OPTION_UUID *)OptList[Index]->Data;
|
||||||
OptEnt.Uuid->Type = 0;
|
OptEnt.Uuid->Type = 0;
|
||||||
if (EFI_ERROR (NetLibGetSystemGuid ((EFI_GUID *) OptEnt.Uuid->Guid))) {
|
if (EFI_ERROR (NetLibGetSystemGuid ((EFI_GUID *)OptEnt.Uuid->Guid))) {
|
||||||
//
|
//
|
||||||
// Zero the Guid to indicate NOT programmable if failed to get system Guid.
|
// Zero the Guid to indicate NOT programmable if failed to get system Guid.
|
||||||
//
|
//
|
||||||
ZeroMem (OptEnt.Uuid->Guid, sizeof (EFI_GUID));
|
ZeroMem (OptEnt.Uuid->Guid, sizeof (EFI_GUID));
|
||||||
}
|
}
|
||||||
|
|
||||||
Index++;
|
Index++;
|
||||||
OptList[Index] = GET_NEXT_DHCP_OPTION (OptList[Index - 1]);
|
OptList[Index] = GET_NEXT_DHCP_OPTION (OptList[Index - 1]);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Append client network device interface option
|
// Append client network device interface option
|
||||||
//
|
//
|
||||||
OptList[Index]->OpCode = DHCP4_TAG_UNDI;
|
OptList[Index]->OpCode = DHCP4_TAG_UNDI;
|
||||||
OptList[Index]->Length = (UINT8) sizeof (HTTP_BOOT_DHCP4_OPTION_UNDI);
|
OptList[Index]->Length = (UINT8)sizeof (HTTP_BOOT_DHCP4_OPTION_UNDI);
|
||||||
OptEnt.Undi = (HTTP_BOOT_DHCP4_OPTION_UNDI *) OptList[Index]->Data;
|
OptEnt.Undi = (HTTP_BOOT_DHCP4_OPTION_UNDI *)OptList[Index]->Data;
|
||||||
|
|
||||||
if (Private->Nii != NULL) {
|
if (Private->Nii != NULL) {
|
||||||
OptEnt.Undi->Type = Private->Nii->Type;
|
OptEnt.Undi->Type = Private->Nii->Type;
|
||||||
@ -124,20 +125,20 @@ HttpBootBuildDhcp4Options (
|
|||||||
//
|
//
|
||||||
// Append client system architecture option
|
// Append client system architecture option
|
||||||
//
|
//
|
||||||
OptList[Index]->OpCode = DHCP4_TAG_ARCH;
|
OptList[Index]->OpCode = DHCP4_TAG_ARCH;
|
||||||
OptList[Index]->Length = (UINT8) sizeof (HTTP_BOOT_DHCP4_OPTION_ARCH);
|
OptList[Index]->Length = (UINT8)sizeof (HTTP_BOOT_DHCP4_OPTION_ARCH);
|
||||||
OptEnt.Arch = (HTTP_BOOT_DHCP4_OPTION_ARCH *) OptList[Index]->Data;
|
OptEnt.Arch = (HTTP_BOOT_DHCP4_OPTION_ARCH *)OptList[Index]->Data;
|
||||||
Value = HTONS (EFI_HTTP_BOOT_CLIENT_SYSTEM_ARCHITECTURE);
|
Value = HTONS (EFI_HTTP_BOOT_CLIENT_SYSTEM_ARCHITECTURE);
|
||||||
CopyMem (&OptEnt.Arch->Type, &Value, sizeof (UINT16));
|
CopyMem (&OptEnt.Arch->Type, &Value, sizeof (UINT16));
|
||||||
Index++;
|
Index++;
|
||||||
OptList[Index] = GET_NEXT_DHCP_OPTION (OptList[Index - 1]);
|
OptList[Index] = GET_NEXT_DHCP_OPTION (OptList[Index - 1]);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Append vendor class identify option
|
// Append vendor class identify option
|
||||||
//
|
//
|
||||||
OptList[Index]->OpCode = DHCP4_TAG_VENDOR_CLASS_ID;
|
OptList[Index]->OpCode = DHCP4_TAG_VENDOR_CLASS_ID;
|
||||||
OptList[Index]->Length = (UINT8) sizeof (HTTP_BOOT_DHCP4_OPTION_CLID);
|
OptList[Index]->Length = (UINT8)sizeof (HTTP_BOOT_DHCP4_OPTION_CLID);
|
||||||
OptEnt.Clid = (HTTP_BOOT_DHCP4_OPTION_CLID *) OptList[Index]->Data;
|
OptEnt.Clid = (HTTP_BOOT_DHCP4_OPTION_CLID *)OptList[Index]->Data;
|
||||||
CopyMem (
|
CopyMem (
|
||||||
OptEnt.Clid,
|
OptEnt.Clid,
|
||||||
DEFAULT_CLASS_ID_DATA,
|
DEFAULT_CLASS_ID_DATA,
|
||||||
@ -173,19 +174,18 @@ HttpBootBuildDhcp4Options (
|
|||||||
**/
|
**/
|
||||||
EFI_DHCP4_PACKET_OPTION *
|
EFI_DHCP4_PACKET_OPTION *
|
||||||
HttpBootParseDhcp4Options (
|
HttpBootParseDhcp4Options (
|
||||||
IN UINT8 *Buffer,
|
IN UINT8 *Buffer,
|
||||||
IN UINT32 Length,
|
IN UINT32 Length,
|
||||||
IN UINT8 OptTag
|
IN UINT8 OptTag
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_DHCP4_PACKET_OPTION *Option;
|
EFI_DHCP4_PACKET_OPTION *Option;
|
||||||
UINT32 Offset;
|
UINT32 Offset;
|
||||||
|
|
||||||
Option = (EFI_DHCP4_PACKET_OPTION *) Buffer;
|
Option = (EFI_DHCP4_PACKET_OPTION *)Buffer;
|
||||||
Offset = 0;
|
Offset = 0;
|
||||||
|
|
||||||
while (Offset < Length && Option->OpCode != DHCP4_TAG_EOP) {
|
while (Offset < Length && Option->OpCode != DHCP4_TAG_EOP) {
|
||||||
|
|
||||||
if (Option->OpCode == OptTag) {
|
if (Option->OpCode == OptTag) {
|
||||||
//
|
//
|
||||||
// Found the required option.
|
// Found the required option.
|
||||||
@ -202,7 +202,7 @@ HttpBootParseDhcp4Options (
|
|||||||
Offset += Option->Length + 2;
|
Offset += Option->Length + 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
Option = (EFI_DHCP4_PACKET_OPTION *) (Buffer + Offset);
|
Option = (EFI_DHCP4_PACKET_OPTION *)(Buffer + Offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
@ -220,8 +220,8 @@ HttpBootParseDhcp4Options (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpBootCacheDhcp4Packet (
|
HttpBootCacheDhcp4Packet (
|
||||||
IN EFI_DHCP4_PACKET *Dst,
|
IN EFI_DHCP4_PACKET *Dst,
|
||||||
IN EFI_DHCP4_PACKET *Src
|
IN EFI_DHCP4_PACKET *Src
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
if (Dst->Size < Src->Length) {
|
if (Dst->Size < Src->Length) {
|
||||||
@ -245,27 +245,27 @@ HttpBootCacheDhcp4Packet (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpBootParseDhcp4Packet (
|
HttpBootParseDhcp4Packet (
|
||||||
IN HTTP_BOOT_DHCP4_PACKET_CACHE *Cache4
|
IN HTTP_BOOT_DHCP4_PACKET_CACHE *Cache4
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_DHCP4_PACKET *Offer;
|
EFI_DHCP4_PACKET *Offer;
|
||||||
EFI_DHCP4_PACKET_OPTION **Options;
|
EFI_DHCP4_PACKET_OPTION **Options;
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
EFI_DHCP4_PACKET_OPTION *Option;
|
EFI_DHCP4_PACKET_OPTION *Option;
|
||||||
BOOLEAN IsProxyOffer;
|
BOOLEAN IsProxyOffer;
|
||||||
BOOLEAN IsHttpOffer;
|
BOOLEAN IsHttpOffer;
|
||||||
BOOLEAN IsDnsOffer;
|
BOOLEAN IsDnsOffer;
|
||||||
BOOLEAN IpExpressedUri;
|
BOOLEAN IpExpressedUri;
|
||||||
UINT8 *Ptr8;
|
UINT8 *Ptr8;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
HTTP_BOOT_OFFER_TYPE OfferType;
|
HTTP_BOOT_OFFER_TYPE OfferType;
|
||||||
EFI_IPv4_ADDRESS IpAddr;
|
EFI_IPv4_ADDRESS IpAddr;
|
||||||
BOOLEAN FileFieldOverloaded;
|
BOOLEAN FileFieldOverloaded;
|
||||||
|
|
||||||
IsDnsOffer = FALSE;
|
IsDnsOffer = FALSE;
|
||||||
IpExpressedUri = FALSE;
|
IpExpressedUri = FALSE;
|
||||||
IsProxyOffer = FALSE;
|
IsProxyOffer = FALSE;
|
||||||
IsHttpOffer = FALSE;
|
IsHttpOffer = FALSE;
|
||||||
FileFieldOverloaded = FALSE;
|
FileFieldOverloaded = FALSE;
|
||||||
|
|
||||||
ZeroMem (Cache4->OptList, sizeof (Cache4->OptList));
|
ZeroMem (Cache4->OptList, sizeof (Cache4->OptList));
|
||||||
@ -284,6 +284,7 @@ HttpBootParseDhcp4Packet (
|
|||||||
mInterestedDhcp4Tags[Index]
|
mInterestedDhcp4Tags[Index]
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Second, Check if bootfilename and serverhostname is overloaded to carry DHCP options refers to rfc-2132.
|
// Second, Check if bootfilename and serverhostname is overloaded to carry DHCP options refers to rfc-2132.
|
||||||
// If yes, try to parse options from the BootFileName field, then ServerName field.
|
// If yes, try to parse options from the BootFileName field, then ServerName field.
|
||||||
@ -295,18 +296,19 @@ HttpBootParseDhcp4Packet (
|
|||||||
for (Index = 0; Index < HTTP_BOOT_DHCP4_TAG_INDEX_MAX; Index++) {
|
for (Index = 0; Index < HTTP_BOOT_DHCP4_TAG_INDEX_MAX; Index++) {
|
||||||
if (Options[Index] == NULL) {
|
if (Options[Index] == NULL) {
|
||||||
Options[Index] = HttpBootParseDhcp4Options (
|
Options[Index] = HttpBootParseDhcp4Options (
|
||||||
(UINT8 *) Offer->Dhcp4.Header.BootFileName,
|
(UINT8 *)Offer->Dhcp4.Header.BootFileName,
|
||||||
sizeof (Offer->Dhcp4.Header.BootFileName),
|
sizeof (Offer->Dhcp4.Header.BootFileName),
|
||||||
mInterestedDhcp4Tags[Index]
|
mInterestedDhcp4Tags[Index]
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((Option->Data[0] & HTTP_BOOT_DHCP4_OVERLOAD_SERVER_NAME) != 0) {
|
if ((Option->Data[0] & HTTP_BOOT_DHCP4_OVERLOAD_SERVER_NAME) != 0) {
|
||||||
for (Index = 0; Index < HTTP_BOOT_DHCP4_TAG_INDEX_MAX; Index++) {
|
for (Index = 0; Index < HTTP_BOOT_DHCP4_TAG_INDEX_MAX; Index++) {
|
||||||
if (Options[Index] == NULL) {
|
if (Options[Index] == NULL) {
|
||||||
Options[Index] = HttpBootParseDhcp4Options (
|
Options[Index] = HttpBootParseDhcp4Options (
|
||||||
(UINT8 *) Offer->Dhcp4.Header.ServerName,
|
(UINT8 *)Offer->Dhcp4.Header.ServerName,
|
||||||
sizeof (Offer->Dhcp4.Header.ServerName),
|
sizeof (Offer->Dhcp4.Header.ServerName),
|
||||||
mInterestedDhcp4Tags[Index]
|
mInterestedDhcp4Tags[Index]
|
||||||
);
|
);
|
||||||
@ -327,7 +329,8 @@ HttpBootParseDhcp4Packet (
|
|||||||
//
|
//
|
||||||
Option = Options[HTTP_BOOT_DHCP4_TAG_INDEX_CLASS_ID];
|
Option = Options[HTTP_BOOT_DHCP4_TAG_INDEX_CLASS_ID];
|
||||||
if ((Option != NULL) && (Option->Length >= 10) &&
|
if ((Option != NULL) && (Option->Length >= 10) &&
|
||||||
(CompareMem (Option->Data, DEFAULT_CLASS_ID_DATA, 10) == 0)) {
|
(CompareMem (Option->Data, DEFAULT_CLASS_ID_DATA, 10) == 0))
|
||||||
|
{
|
||||||
IsHttpOffer = TRUE;
|
IsHttpOffer = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -350,25 +353,25 @@ HttpBootParseDhcp4Packet (
|
|||||||
// RFC 2132, Section 9.5 does not strictly state Bootfile name (option 67) is null
|
// RFC 2132, Section 9.5 does not strictly state Bootfile name (option 67) is null
|
||||||
// terminated string. So force to append null terminated character at the end of string.
|
// terminated string. So force to append null terminated character at the end of string.
|
||||||
//
|
//
|
||||||
Ptr8 = (UINT8*)&Options[HTTP_BOOT_DHCP4_TAG_INDEX_BOOTFILE]->Data[0];
|
Ptr8 = (UINT8 *)&Options[HTTP_BOOT_DHCP4_TAG_INDEX_BOOTFILE]->Data[0];
|
||||||
Ptr8 += Options[HTTP_BOOT_DHCP4_TAG_INDEX_BOOTFILE]->Length;
|
Ptr8 += Options[HTTP_BOOT_DHCP4_TAG_INDEX_BOOTFILE]->Length;
|
||||||
if (*(Ptr8 - 1) != '\0') {
|
if (*(Ptr8 - 1) != '\0') {
|
||||||
*Ptr8 = '\0';
|
*Ptr8 = '\0';
|
||||||
}
|
}
|
||||||
} else if (!FileFieldOverloaded && Offer->Dhcp4.Header.BootFileName[0] != 0) {
|
} else if (!FileFieldOverloaded && (Offer->Dhcp4.Header.BootFileName[0] != 0)) {
|
||||||
//
|
//
|
||||||
// If the bootfile is not present and bootfilename is present in DHCPv4 packet, just parse it.
|
// If the bootfile is not present and bootfilename is present in DHCPv4 packet, just parse it.
|
||||||
// Do not count dhcp option header here, or else will destroy the serverhostname.
|
// Do not count dhcp option header here, or else will destroy the serverhostname.
|
||||||
//
|
//
|
||||||
Options[HTTP_BOOT_DHCP4_TAG_INDEX_BOOTFILE] = (EFI_DHCP4_PACKET_OPTION *)
|
Options[HTTP_BOOT_DHCP4_TAG_INDEX_BOOTFILE] = (EFI_DHCP4_PACKET_OPTION *)
|
||||||
(&Offer->Dhcp4.Header.BootFileName[0] -
|
(&Offer->Dhcp4.Header.BootFileName[0] -
|
||||||
OFFSET_OF (EFI_DHCP4_PACKET_OPTION, Data[0]));
|
OFFSET_OF (EFI_DHCP4_PACKET_OPTION, Data[0]));
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Http offer must have a boot URI.
|
// Http offer must have a boot URI.
|
||||||
//
|
//
|
||||||
if (IsHttpOffer && Options[HTTP_BOOT_DHCP4_TAG_INDEX_BOOTFILE] == NULL) {
|
if (IsHttpOffer && (Options[HTTP_BOOT_DHCP4_TAG_INDEX_BOOTFILE] == NULL)) {
|
||||||
return EFI_DEVICE_ERROR;
|
return EFI_DEVICE_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -377,8 +380,8 @@ HttpBootParseDhcp4Packet (
|
|||||||
//
|
//
|
||||||
if (IsHttpOffer) {
|
if (IsHttpOffer) {
|
||||||
Status = HttpParseUrl (
|
Status = HttpParseUrl (
|
||||||
(CHAR8*) Options[HTTP_BOOT_DHCP4_TAG_INDEX_BOOTFILE]->Data,
|
(CHAR8 *)Options[HTTP_BOOT_DHCP4_TAG_INDEX_BOOTFILE]->Data,
|
||||||
(UINT32) AsciiStrLen ((CHAR8*) Options[HTTP_BOOT_DHCP4_TAG_INDEX_BOOTFILE]->Data),
|
(UINT32)AsciiStrLen ((CHAR8 *)Options[HTTP_BOOT_DHCP4_TAG_INDEX_BOOTFILE]->Data),
|
||||||
FALSE,
|
FALSE,
|
||||||
&Cache4->UriParser
|
&Cache4->UriParser
|
||||||
);
|
);
|
||||||
@ -387,7 +390,7 @@ HttpBootParseDhcp4Packet (
|
|||||||
}
|
}
|
||||||
|
|
||||||
Status = HttpUrlGetIp4 (
|
Status = HttpUrlGetIp4 (
|
||||||
(CHAR8*) Options[HTTP_BOOT_DHCP4_TAG_INDEX_BOOTFILE]->Data,
|
(CHAR8 *)Options[HTTP_BOOT_DHCP4_TAG_INDEX_BOOTFILE]->Data,
|
||||||
Cache4->UriParser,
|
Cache4->UriParser,
|
||||||
&IpAddr
|
&IpAddr
|
||||||
);
|
);
|
||||||
@ -411,7 +414,6 @@ HttpBootParseDhcp4Packet (
|
|||||||
OfferType = HttpOfferTypeProxyNameUri;
|
OfferType = HttpOfferTypeProxyNameUri;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
if (!IsProxyOffer) {
|
if (!IsProxyOffer) {
|
||||||
OfferType = IsDnsOffer ? HttpOfferTypeDhcpDns : HttpOfferTypeDhcpOnly;
|
OfferType = IsDnsOffer ? HttpOfferTypeDhcpDns : HttpOfferTypeDhcpOnly;
|
||||||
@ -419,6 +421,7 @@ HttpBootParseDhcp4Packet (
|
|||||||
if (Cache4->UriParser != NULL) {
|
if (Cache4->UriParser != NULL) {
|
||||||
FreePool (Cache4->UriParser);
|
FreePool (Cache4->UriParser);
|
||||||
}
|
}
|
||||||
|
|
||||||
return EFI_DEVICE_ERROR;
|
return EFI_DEVICE_ERROR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -490,7 +493,7 @@ HttpBootSelectDhcpOffer (
|
|||||||
IN HTTP_BOOT_PRIVATE_DATA *Private
|
IN HTTP_BOOT_PRIVATE_DATA *Private
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
Private->SelectIndex = 0;
|
Private->SelectIndex = 0;
|
||||||
Private->SelectProxyType = HttpOfferTypeMax;
|
Private->SelectProxyType = HttpOfferTypeMax;
|
||||||
|
|
||||||
if (Private->FilePathUri != NULL) {
|
if (Private->FilePathUri != NULL) {
|
||||||
@ -500,26 +503,16 @@ HttpBootSelectDhcpOffer (
|
|||||||
// The offer with DNS server address takes priority here.
|
// The offer with DNS server address takes priority here.
|
||||||
//
|
//
|
||||||
if (Private->OfferCount[HttpOfferTypeDhcpDns] > 0) {
|
if (Private->OfferCount[HttpOfferTypeDhcpDns] > 0) {
|
||||||
|
|
||||||
Private->SelectIndex = Private->OfferIndex[HttpOfferTypeDhcpDns][0] + 1;
|
Private->SelectIndex = Private->OfferIndex[HttpOfferTypeDhcpDns][0] + 1;
|
||||||
|
|
||||||
} else if (Private->OfferCount[HttpOfferTypeDhcpIpUriDns] > 0) {
|
} else if (Private->OfferCount[HttpOfferTypeDhcpIpUriDns] > 0) {
|
||||||
|
|
||||||
Private->SelectIndex = Private->OfferIndex[HttpOfferTypeDhcpIpUriDns][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->SelectIndex = Private->OfferIndex[HttpOfferTypeDhcpOnly][0] + 1;
|
Private->SelectIndex = Private->OfferIndex[HttpOfferTypeDhcpOnly][0] + 1;
|
||||||
|
} else if (Private->OfferCount[HttpOfferTypeDhcpIpUri] > 0) {
|
||||||
} else if (Private->OfferCount[HttpOfferTypeDhcpIpUri] > 0) {
|
|
||||||
|
|
||||||
Private->SelectIndex = Private->OfferIndex[HttpOfferTypeDhcpIpUri][0] + 1;
|
Private->SelectIndex = Private->OfferIndex[HttpOfferTypeDhcpIpUri][0] + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
//
|
//
|
||||||
// We are in corporate environment.
|
// We are in corporate environment.
|
||||||
@ -532,45 +525,35 @@ HttpBootSelectDhcpOffer (
|
|||||||
// Priority6: HttpOfferTypeDhcpDns + HttpOfferTypeDhcpNameUri
|
// Priority6: HttpOfferTypeDhcpDns + HttpOfferTypeDhcpNameUri
|
||||||
//
|
//
|
||||||
if (Private->OfferCount[HttpOfferTypeDhcpIpUri] > 0) {
|
if (Private->OfferCount[HttpOfferTypeDhcpIpUri] > 0) {
|
||||||
|
|
||||||
Private->SelectIndex = Private->OfferIndex[HttpOfferTypeDhcpIpUri][0] + 1;
|
Private->SelectIndex = Private->OfferIndex[HttpOfferTypeDhcpIpUri][0] + 1;
|
||||||
|
|
||||||
} else if (Private->OfferCount[HttpOfferTypeDhcpIpUriDns] > 0) {
|
} else if (Private->OfferCount[HttpOfferTypeDhcpIpUriDns] > 0) {
|
||||||
|
|
||||||
Private->SelectIndex = Private->OfferIndex[HttpOfferTypeDhcpIpUriDns][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->OfferCount[HttpOfferTypeProxyIpUri] > 0) {
|
{
|
||||||
|
|
||||||
Private->SelectIndex = Private->OfferIndex[HttpOfferTypeDhcpOnly][0] + 1;
|
Private->SelectIndex = Private->OfferIndex[HttpOfferTypeDhcpOnly][0] + 1;
|
||||||
Private->SelectProxyType = HttpOfferTypeProxyIpUri;
|
Private->SelectProxyType = HttpOfferTypeProxyIpUri;
|
||||||
|
} else if ((Private->OfferCount[HttpOfferTypeDhcpDns] > 0) &&
|
||||||
} else if (Private->OfferCount[HttpOfferTypeDhcpDns] > 0 &&
|
(Private->OfferCount[HttpOfferTypeProxyIpUri] > 0))
|
||||||
Private->OfferCount[HttpOfferTypeProxyIpUri] > 0) {
|
{
|
||||||
|
|
||||||
Private->SelectIndex = Private->OfferIndex[HttpOfferTypeDhcpDns][0] + 1;
|
Private->SelectIndex = Private->OfferIndex[HttpOfferTypeDhcpDns][0] + 1;
|
||||||
Private->SelectProxyType = HttpOfferTypeProxyIpUri;
|
Private->SelectProxyType = HttpOfferTypeProxyIpUri;
|
||||||
|
} else if ((Private->OfferCount[HttpOfferTypeDhcpDns] > 0) &&
|
||||||
} else if (Private->OfferCount[HttpOfferTypeDhcpDns] > 0 &&
|
(Private->OfferCount[HttpOfferTypeProxyNameUri] > 0))
|
||||||
Private->OfferCount[HttpOfferTypeProxyNameUri] > 0) {
|
{
|
||||||
|
|
||||||
Private->SelectIndex = Private->OfferIndex[HttpOfferTypeDhcpDns][0] + 1;
|
Private->SelectIndex = Private->OfferIndex[HttpOfferTypeDhcpDns][0] + 1;
|
||||||
Private->SelectProxyType = HttpOfferTypeProxyNameUri;
|
Private->SelectProxyType = HttpOfferTypeProxyNameUri;
|
||||||
|
} else if ((Private->OfferCount[HttpOfferTypeDhcpDns] > 0) &&
|
||||||
} else if (Private->OfferCount[HttpOfferTypeDhcpDns] > 0 &&
|
(Private->OfferCount[HttpOfferTypeDhcpNameUri] > 0))
|
||||||
Private->OfferCount[HttpOfferTypeDhcpNameUri] > 0) {
|
{
|
||||||
|
|
||||||
Private->SelectIndex = Private->OfferIndex[HttpOfferTypeDhcpDns][0] + 1;
|
Private->SelectIndex = Private->OfferIndex[HttpOfferTypeDhcpDns][0] + 1;
|
||||||
Private->SelectProxyType = HttpOfferTypeDhcpNameUri;
|
Private->SelectProxyType = HttpOfferTypeDhcpNameUri;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
EFI_DHCP4_CALLBACK is provided by the consumer of the EFI DHCPv4 Protocol driver
|
EFI_DHCP4_CALLBACK is provided by the consumer of the EFI DHCPv4 Protocol driver
|
||||||
to intercept events that occurred in the configuration process.
|
to intercept events that occurred in the configuration process.
|
||||||
@ -594,29 +577,30 @@ HttpBootSelectDhcpOffer (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
HttpBootDhcp4CallBack (
|
HttpBootDhcp4CallBack (
|
||||||
IN EFI_DHCP4_PROTOCOL *This,
|
IN EFI_DHCP4_PROTOCOL *This,
|
||||||
IN VOID *Context,
|
IN VOID *Context,
|
||||||
IN EFI_DHCP4_STATE CurrentState,
|
IN EFI_DHCP4_STATE CurrentState,
|
||||||
IN EFI_DHCP4_EVENT Dhcp4Event,
|
IN EFI_DHCP4_EVENT Dhcp4Event,
|
||||||
IN EFI_DHCP4_PACKET *Packet OPTIONAL,
|
IN EFI_DHCP4_PACKET *Packet OPTIONAL,
|
||||||
OUT EFI_DHCP4_PACKET **NewPacket OPTIONAL
|
OUT EFI_DHCP4_PACKET **NewPacket OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
HTTP_BOOT_PRIVATE_DATA *Private;
|
HTTP_BOOT_PRIVATE_DATA *Private;
|
||||||
EFI_DHCP4_PACKET_OPTION *MaxMsgSize;
|
EFI_DHCP4_PACKET_OPTION *MaxMsgSize;
|
||||||
UINT16 Value;
|
UINT16 Value;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
BOOLEAN Received;
|
BOOLEAN Received;
|
||||||
|
|
||||||
if ((Dhcp4Event != Dhcp4SendDiscover) &&
|
if ((Dhcp4Event != Dhcp4SendDiscover) &&
|
||||||
(Dhcp4Event != Dhcp4RcvdOffer) &&
|
(Dhcp4Event != Dhcp4RcvdOffer) &&
|
||||||
(Dhcp4Event != Dhcp4SendRequest) &&
|
(Dhcp4Event != Dhcp4SendRequest) &&
|
||||||
(Dhcp4Event != Dhcp4RcvdAck) &&
|
(Dhcp4Event != Dhcp4RcvdAck) &&
|
||||||
(Dhcp4Event != Dhcp4SelectOffer)) {
|
(Dhcp4Event != Dhcp4SelectOffer))
|
||||||
|
{
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
Private = (HTTP_BOOT_PRIVATE_DATA *) Context;
|
Private = (HTTP_BOOT_PRIVATE_DATA *)Context;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Override the Maximum DHCP Message Size.
|
// Override the Maximum DHCP Message Size.
|
||||||
@ -634,15 +618,15 @@ HttpBootDhcp4CallBack (
|
|||||||
//
|
//
|
||||||
// Callback to user if any packets sent or received.
|
// Callback to user if any packets sent or received.
|
||||||
//
|
//
|
||||||
if (Private->HttpBootCallback != NULL && Dhcp4Event != Dhcp4SelectOffer) {
|
if ((Private->HttpBootCallback != NULL) && (Dhcp4Event != Dhcp4SelectOffer)) {
|
||||||
Received = (BOOLEAN) (Dhcp4Event == Dhcp4RcvdOffer || Dhcp4Event == Dhcp4RcvdAck);
|
Received = (BOOLEAN)(Dhcp4Event == Dhcp4RcvdOffer || Dhcp4Event == Dhcp4RcvdAck);
|
||||||
Status = Private->HttpBootCallback->Callback (
|
Status = Private->HttpBootCallback->Callback (
|
||||||
Private->HttpBootCallback,
|
Private->HttpBootCallback,
|
||||||
HttpBootDhcp4,
|
HttpBootDhcp4,
|
||||||
Received,
|
Received,
|
||||||
Packet->Length,
|
Packet->Length,
|
||||||
&Packet->Dhcp4
|
&Packet->Dhcp4
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return EFI_ABORTED;
|
return EFI_ABORTED;
|
||||||
}
|
}
|
||||||
@ -650,40 +634,43 @@ HttpBootDhcp4CallBack (
|
|||||||
|
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
switch (Dhcp4Event) {
|
switch (Dhcp4Event) {
|
||||||
case Dhcp4RcvdOffer:
|
case Dhcp4RcvdOffer:
|
||||||
Status = EFI_NOT_READY;
|
Status = EFI_NOT_READY;
|
||||||
if (Packet->Length > HTTP_BOOT_DHCP4_PACKET_MAX_SIZE) {
|
if (Packet->Length > HTTP_BOOT_DHCP4_PACKET_MAX_SIZE) {
|
||||||
//
|
//
|
||||||
// Ignore the incoming packets which exceed the maximum length.
|
// Ignore the incoming packets which exceed the maximum length.
|
||||||
//
|
//
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Private->OfferNum < HTTP_BOOT_OFFER_MAX_NUM) {
|
||||||
|
//
|
||||||
|
// Cache the DHCPv4 offers to OfferBuffer[] for select later, and record
|
||||||
|
// the OfferIndex and OfferCount.
|
||||||
|
// If error happens, just ignore this packet and continue to wait more offer.
|
||||||
|
//
|
||||||
|
HttpBootCacheDhcp4Offer (Private, Packet);
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
if (Private->OfferNum < HTTP_BOOT_OFFER_MAX_NUM) {
|
case Dhcp4SelectOffer:
|
||||||
//
|
//
|
||||||
// Cache the DHCPv4 offers to OfferBuffer[] for select later, and record
|
// Select offer according to the priority in UEFI spec, and record the SelectIndex
|
||||||
// the OfferIndex and OfferCount.
|
// and SelectProxyType.
|
||||||
// If error happens, just ignore this packet and continue to wait more offer.
|
|
||||||
//
|
//
|
||||||
HttpBootCacheDhcp4Offer (Private, Packet);
|
HttpBootSelectDhcpOffer (Private);
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Dhcp4SelectOffer:
|
if (Private->SelectIndex == 0) {
|
||||||
//
|
Status = EFI_ABORTED;
|
||||||
// Select offer according to the priority in UEFI spec, and record the SelectIndex
|
} else {
|
||||||
// and SelectProxyType.
|
*NewPacket = &Private->OfferBuffer[Private->SelectIndex - 1].Dhcp4.Packet.Offer;
|
||||||
//
|
}
|
||||||
HttpBootSelectDhcpOffer (Private);
|
|
||||||
|
|
||||||
if (Private->SelectIndex == 0) {
|
break;
|
||||||
Status = EFI_ABORTED;
|
|
||||||
} else {
|
|
||||||
*NewPacket = &Private->OfferBuffer[Private->SelectIndex - 1].Dhcp4.Packet.Offer;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
@ -700,11 +687,11 @@ HttpBootDhcp4CallBack (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpBootRegisterIp4Gateway (
|
HttpBootRegisterIp4Gateway (
|
||||||
IN HTTP_BOOT_PRIVATE_DATA *Private
|
IN HTTP_BOOT_PRIVATE_DATA *Private
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_IP4_CONFIG2_PROTOCOL *Ip4Config2;
|
EFI_IP4_CONFIG2_PROTOCOL *Ip4Config2;
|
||||||
|
|
||||||
ASSERT (!Private->UsingIpv6);
|
ASSERT (!Private->UsingIpv6);
|
||||||
|
|
||||||
@ -742,12 +729,12 @@ HttpBootRegisterIp4Gateway (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpBootRegisterIp4Dns (
|
HttpBootRegisterIp4Dns (
|
||||||
IN HTTP_BOOT_PRIVATE_DATA *Private,
|
IN HTTP_BOOT_PRIVATE_DATA *Private,
|
||||||
IN UINTN DataLength,
|
IN UINTN DataLength,
|
||||||
IN VOID *DnsServerData
|
IN VOID *DnsServerData
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_IP4_CONFIG2_PROTOCOL *Ip4Config2;
|
EFI_IP4_CONFIG2_PROTOCOL *Ip4Config2;
|
||||||
|
|
||||||
ASSERT (!Private->UsingIpv6);
|
ASSERT (!Private->UsingIpv6);
|
||||||
|
|
||||||
@ -761,7 +748,6 @@ HttpBootRegisterIp4Dns (
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This function will switch the IP4 configuration policy to Static.
|
This function will switch the IP4 configuration policy to Static.
|
||||||
|
|
||||||
@ -773,35 +759,35 @@ HttpBootRegisterIp4Dns (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpBootSetIp4Policy (
|
HttpBootSetIp4Policy (
|
||||||
IN HTTP_BOOT_PRIVATE_DATA *Private
|
IN HTTP_BOOT_PRIVATE_DATA *Private
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_IP4_CONFIG2_POLICY Policy;
|
EFI_IP4_CONFIG2_POLICY Policy;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_IP4_CONFIG2_PROTOCOL *Ip4Config2;
|
EFI_IP4_CONFIG2_PROTOCOL *Ip4Config2;
|
||||||
UINTN DataSize;
|
UINTN DataSize;
|
||||||
|
|
||||||
Ip4Config2 = Private->Ip4Config2;
|
Ip4Config2 = Private->Ip4Config2;
|
||||||
|
|
||||||
DataSize = sizeof (EFI_IP4_CONFIG2_POLICY);
|
DataSize = sizeof (EFI_IP4_CONFIG2_POLICY);
|
||||||
Status = Ip4Config2->GetData (
|
Status = Ip4Config2->GetData (
|
||||||
Ip4Config2,
|
Ip4Config2,
|
||||||
Ip4Config2DataTypePolicy,
|
Ip4Config2DataTypePolicy,
|
||||||
&DataSize,
|
&DataSize,
|
||||||
&Policy
|
&Policy
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Policy != Ip4Config2PolicyStatic) {
|
if (Policy != Ip4Config2PolicyStatic) {
|
||||||
Policy = Ip4Config2PolicyStatic;
|
Policy = Ip4Config2PolicyStatic;
|
||||||
Status= Ip4Config2->SetData (
|
Status = Ip4Config2->SetData (
|
||||||
Ip4Config2,
|
Ip4Config2,
|
||||||
Ip4Config2DataTypePolicy,
|
Ip4Config2DataTypePolicy,
|
||||||
sizeof (EFI_IP4_CONFIG2_POLICY),
|
sizeof (EFI_IP4_CONFIG2_POLICY),
|
||||||
&Policy
|
&Policy
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
@ -821,16 +807,16 @@ HttpBootSetIp4Policy (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpBootDhcp4Dora (
|
HttpBootDhcp4Dora (
|
||||||
IN HTTP_BOOT_PRIVATE_DATA *Private
|
IN HTTP_BOOT_PRIVATE_DATA *Private
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_DHCP4_PROTOCOL *Dhcp4;
|
EFI_DHCP4_PROTOCOL *Dhcp4;
|
||||||
UINT32 OptCount;
|
UINT32 OptCount;
|
||||||
EFI_DHCP4_PACKET_OPTION *OptList[HTTP_BOOT_DHCP4_OPTION_MAX_NUM];
|
EFI_DHCP4_PACKET_OPTION *OptList[HTTP_BOOT_DHCP4_OPTION_MAX_NUM];
|
||||||
UINT8 Buffer[HTTP_BOOT_DHCP4_OPTION_MAX_SIZE];
|
UINT8 Buffer[HTTP_BOOT_DHCP4_OPTION_MAX_SIZE];
|
||||||
EFI_DHCP4_CONFIG_DATA Config;
|
EFI_DHCP4_CONFIG_DATA Config;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_DHCP4_MODE_DATA Mode;
|
EFI_DHCP4_MODE_DATA Mode;
|
||||||
|
|
||||||
Dhcp4 = Private->Dhcp4;
|
Dhcp4 = Private->Dhcp4;
|
||||||
ASSERT (Dhcp4 != NULL);
|
ASSERT (Dhcp4 != NULL);
|
||||||
@ -846,7 +832,7 @@ HttpBootDhcp4Dora (
|
|||||||
OptCount = HttpBootBuildDhcp4Options (Private, OptList, Buffer);
|
OptCount = HttpBootBuildDhcp4Options (Private, OptList, Buffer);
|
||||||
ASSERT (OptCount > 0);
|
ASSERT (OptCount > 0);
|
||||||
|
|
||||||
ZeroMem (&Config, sizeof(Config));
|
ZeroMem (&Config, sizeof (Config));
|
||||||
Config.OptionCount = OptCount;
|
Config.OptionCount = OptCount;
|
||||||
Config.OptionList = OptList;
|
Config.OptionList = OptList;
|
||||||
Config.Dhcp4Callback = HttpBootDhcp4CallBack;
|
Config.Dhcp4Callback = HttpBootDhcp4CallBack;
|
||||||
|
@ -10,17 +10,17 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#ifndef __EFI_UEFI_HTTP_BOOT_DHCP4_H__
|
#ifndef __EFI_UEFI_HTTP_BOOT_DHCP4_H__
|
||||||
#define __EFI_UEFI_HTTP_BOOT_DHCP4_H__
|
#define __EFI_UEFI_HTTP_BOOT_DHCP4_H__
|
||||||
|
|
||||||
#define HTTP_BOOT_DHCP4_OPTION_MAX_NUM 16
|
#define HTTP_BOOT_DHCP4_OPTION_MAX_NUM 16
|
||||||
#define HTTP_BOOT_DHCP4_OPTION_MAX_SIZE 312
|
#define HTTP_BOOT_DHCP4_OPTION_MAX_SIZE 312
|
||||||
#define HTTP_BOOT_DHCP4_PACKET_MAX_SIZE 1472
|
#define HTTP_BOOT_DHCP4_PACKET_MAX_SIZE 1472
|
||||||
|
|
||||||
#define HTTP_BOOT_DHCP4_OPCODE_REQUEST 1
|
#define HTTP_BOOT_DHCP4_OPCODE_REQUEST 1
|
||||||
#define HTTP_BOOT_DHCP4_OPCODE_REPLY 2
|
#define HTTP_BOOT_DHCP4_OPCODE_REPLY 2
|
||||||
#define HTTP_BOOT_DHCP4_MSG_TYPE_REQUEST 3
|
#define HTTP_BOOT_DHCP4_MSG_TYPE_REQUEST 3
|
||||||
#define HTTP_BOOT_DHCP4_MAGIC 0x63538263 // network byte order
|
#define HTTP_BOOT_DHCP4_MAGIC 0x63538263 // network byte order
|
||||||
|
|
||||||
#define HTTP_BOOT_DHCP4_OVERLOAD_FILE 1
|
#define HTTP_BOOT_DHCP4_OVERLOAD_FILE 1
|
||||||
#define HTTP_BOOT_DHCP4_OVERLOAD_SERVER_NAME 2
|
#define HTTP_BOOT_DHCP4_OVERLOAD_SERVER_NAME 2
|
||||||
|
|
||||||
///
|
///
|
||||||
/// HTTP Tag definition that identifies the processor
|
/// HTTP Tag definition that identifies the processor
|
||||||
@ -29,17 +29,17 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
/// http://www.ietf.org/assignments/dhcpv6-parameters/dhcpv6-parameters.xml
|
/// http://www.ietf.org/assignments/dhcpv6-parameters/dhcpv6-parameters.xml
|
||||||
///
|
///
|
||||||
#if defined (MDE_CPU_IA32)
|
#if defined (MDE_CPU_IA32)
|
||||||
#define EFI_HTTP_BOOT_CLIENT_SYSTEM_ARCHITECTURE HTTP_CLIENT_ARCH_IA32
|
#define EFI_HTTP_BOOT_CLIENT_SYSTEM_ARCHITECTURE HTTP_CLIENT_ARCH_IA32
|
||||||
#elif defined (MDE_CPU_X64)
|
#elif defined (MDE_CPU_X64)
|
||||||
#define EFI_HTTP_BOOT_CLIENT_SYSTEM_ARCHITECTURE HTTP_CLIENT_ARCH_X64
|
#define EFI_HTTP_BOOT_CLIENT_SYSTEM_ARCHITECTURE HTTP_CLIENT_ARCH_X64
|
||||||
#elif defined (MDE_CPU_ARM)
|
#elif defined (MDE_CPU_ARM)
|
||||||
#define EFI_HTTP_BOOT_CLIENT_SYSTEM_ARCHITECTURE HTTP_CLIENT_ARCH_ARM
|
#define EFI_HTTP_BOOT_CLIENT_SYSTEM_ARCHITECTURE HTTP_CLIENT_ARCH_ARM
|
||||||
#elif defined (MDE_CPU_AARCH64)
|
#elif defined (MDE_CPU_AARCH64)
|
||||||
#define EFI_HTTP_BOOT_CLIENT_SYSTEM_ARCHITECTURE HTTP_CLIENT_ARCH_AARCH64
|
#define EFI_HTTP_BOOT_CLIENT_SYSTEM_ARCHITECTURE HTTP_CLIENT_ARCH_AARCH64
|
||||||
#elif defined (MDE_CPU_RISCV64)
|
#elif defined (MDE_CPU_RISCV64)
|
||||||
#define EFI_HTTP_BOOT_CLIENT_SYSTEM_ARCHITECTURE HTTP_CLIENT_ARCH_RISCV64
|
#define EFI_HTTP_BOOT_CLIENT_SYSTEM_ARCHITECTURE HTTP_CLIENT_ARCH_RISCV64
|
||||||
#elif defined (MDE_CPU_EBC)
|
#elif defined (MDE_CPU_EBC)
|
||||||
#define EFI_HTTP_BOOT_CLIENT_SYSTEM_ARCHITECTURE HTTP_CLIENT_ARCH_EBC
|
#define EFI_HTTP_BOOT_CLIENT_SYSTEM_ARCHITECTURE HTTP_CLIENT_ARCH_EBC
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/// DHCP offer types among HTTP boot.
|
/// DHCP offer types among HTTP boot.
|
||||||
@ -88,75 +88,75 @@ typedef enum {
|
|||||||
HttpOfferTypeMax
|
HttpOfferTypeMax
|
||||||
} HTTP_BOOT_OFFER_TYPE;
|
} HTTP_BOOT_OFFER_TYPE;
|
||||||
|
|
||||||
#define HTTP_BOOT_DHCP_RETRIES 4
|
#define HTTP_BOOT_DHCP_RETRIES 4
|
||||||
#define HTTP_BOOT_OFFER_MAX_NUM 16
|
#define HTTP_BOOT_OFFER_MAX_NUM 16
|
||||||
|
|
||||||
// The array index of the DHCP4 option tag interested
|
// The array index of the DHCP4 option tag interested
|
||||||
//
|
//
|
||||||
#define HTTP_BOOT_DHCP4_TAG_INDEX_BOOTFILE_LEN 0
|
#define HTTP_BOOT_DHCP4_TAG_INDEX_BOOTFILE_LEN 0
|
||||||
#define HTTP_BOOT_DHCP4_TAG_INDEX_OVERLOAD 1
|
#define HTTP_BOOT_DHCP4_TAG_INDEX_OVERLOAD 1
|
||||||
#define HTTP_BOOT_DHCP4_TAG_INDEX_MSG_TYPE 2
|
#define HTTP_BOOT_DHCP4_TAG_INDEX_MSG_TYPE 2
|
||||||
#define HTTP_BOOT_DHCP4_TAG_INDEX_SERVER_ID 3
|
#define HTTP_BOOT_DHCP4_TAG_INDEX_SERVER_ID 3
|
||||||
#define HTTP_BOOT_DHCP4_TAG_INDEX_CLASS_ID 4
|
#define HTTP_BOOT_DHCP4_TAG_INDEX_CLASS_ID 4
|
||||||
#define HTTP_BOOT_DHCP4_TAG_INDEX_BOOTFILE 5
|
#define HTTP_BOOT_DHCP4_TAG_INDEX_BOOTFILE 5
|
||||||
#define HTTP_BOOT_DHCP4_TAG_INDEX_DNS_SERVER 6
|
#define HTTP_BOOT_DHCP4_TAG_INDEX_DNS_SERVER 6
|
||||||
#define HTTP_BOOT_DHCP4_TAG_INDEX_MAX 7
|
#define HTTP_BOOT_DHCP4_TAG_INDEX_MAX 7
|
||||||
|
|
||||||
#pragma pack(1)
|
#pragma pack(1)
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINT8 ParaList[135];
|
UINT8 ParaList[135];
|
||||||
} HTTP_BOOT_DHCP4_OPTION_PARA;
|
} HTTP_BOOT_DHCP4_OPTION_PARA;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINT16 Size;
|
UINT16 Size;
|
||||||
} HTTP_BOOT_DHCP4_OPTION_MAX_MESG_SIZE;
|
} HTTP_BOOT_DHCP4_OPTION_MAX_MESG_SIZE;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINT8 Type;
|
UINT8 Type;
|
||||||
UINT8 MajorVer;
|
UINT8 MajorVer;
|
||||||
UINT8 MinorVer;
|
UINT8 MinorVer;
|
||||||
} HTTP_BOOT_DHCP4_OPTION_UNDI;
|
} HTTP_BOOT_DHCP4_OPTION_UNDI;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINT8 Type;
|
UINT8 Type;
|
||||||
} HTTP_BOOT_DHCP4_OPTION_MESG;
|
} HTTP_BOOT_DHCP4_OPTION_MESG;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINT16 Type;
|
UINT16 Type;
|
||||||
} HTTP_BOOT_DHCP4_OPTION_ARCH;
|
} HTTP_BOOT_DHCP4_OPTION_ARCH;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINT8 ClassIdentifier[11];
|
UINT8 ClassIdentifier[11];
|
||||||
UINT8 ArchitecturePrefix[5];
|
UINT8 ArchitecturePrefix[5];
|
||||||
UINT8 ArchitectureType[5];
|
UINT8 ArchitectureType[5];
|
||||||
UINT8 Lit3[1];
|
UINT8 Lit3[1];
|
||||||
UINT8 InterfaceName[4];
|
UINT8 InterfaceName[4];
|
||||||
UINT8 Lit4[1];
|
UINT8 Lit4[1];
|
||||||
UINT8 UndiMajor[3];
|
UINT8 UndiMajor[3];
|
||||||
UINT8 UndiMinor[3];
|
UINT8 UndiMinor[3];
|
||||||
} HTTP_BOOT_DHCP4_OPTION_CLID;
|
} HTTP_BOOT_DHCP4_OPTION_CLID;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINT8 Type;
|
UINT8 Type;
|
||||||
UINT8 Guid[16];
|
UINT8 Guid[16];
|
||||||
} HTTP_BOOT_DHCP4_OPTION_UUID;
|
} HTTP_BOOT_DHCP4_OPTION_UUID;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINT16 Type;
|
UINT16 Type;
|
||||||
UINT16 Layer;
|
UINT16 Layer;
|
||||||
} HTTP_BOOT_OPTION_BOOT_ITEM;
|
} HTTP_BOOT_OPTION_BOOT_ITEM;
|
||||||
|
|
||||||
#pragma pack()
|
#pragma pack()
|
||||||
|
|
||||||
typedef union {
|
typedef union {
|
||||||
HTTP_BOOT_DHCP4_OPTION_PARA *Para;
|
HTTP_BOOT_DHCP4_OPTION_PARA *Para;
|
||||||
HTTP_BOOT_DHCP4_OPTION_UNDI *Undi;
|
HTTP_BOOT_DHCP4_OPTION_UNDI *Undi;
|
||||||
HTTP_BOOT_DHCP4_OPTION_ARCH *Arch;
|
HTTP_BOOT_DHCP4_OPTION_ARCH *Arch;
|
||||||
HTTP_BOOT_DHCP4_OPTION_CLID *Clid;
|
HTTP_BOOT_DHCP4_OPTION_CLID *Clid;
|
||||||
HTTP_BOOT_DHCP4_OPTION_UUID *Uuid;
|
HTTP_BOOT_DHCP4_OPTION_UUID *Uuid;
|
||||||
HTTP_BOOT_DHCP4_OPTION_MESG *Mesg;
|
HTTP_BOOT_DHCP4_OPTION_MESG *Mesg;
|
||||||
HTTP_BOOT_DHCP4_OPTION_MAX_MESG_SIZE *MaxMesgSize;
|
HTTP_BOOT_DHCP4_OPTION_MAX_MESG_SIZE *MaxMesgSize;
|
||||||
} HTTP_BOOT_DHCP4_OPTION_ENTRY;
|
} HTTP_BOOT_DHCP4_OPTION_ENTRY;
|
||||||
|
|
||||||
#define GET_NEXT_DHCP_OPTION(Opt) \
|
#define GET_NEXT_DHCP_OPTION(Opt) \
|
||||||
@ -166,44 +166,44 @@ typedef union {
|
|||||||
#define GET_OPTION_BUFFER_LEN(Pkt) \
|
#define GET_OPTION_BUFFER_LEN(Pkt) \
|
||||||
((Pkt)->Length - sizeof (EFI_DHCP4_HEADER) - 4)
|
((Pkt)->Length - sizeof (EFI_DHCP4_HEADER) - 4)
|
||||||
|
|
||||||
#define DEFAULT_CLASS_ID_DATA "HTTPClient:Arch:xxxxx:UNDI:003000"
|
#define DEFAULT_CLASS_ID_DATA "HTTPClient:Arch:xxxxx:UNDI:003000"
|
||||||
#define DEFAULT_UNDI_TYPE 1
|
#define DEFAULT_UNDI_TYPE 1
|
||||||
#define DEFAULT_UNDI_MAJOR 3
|
#define DEFAULT_UNDI_MAJOR 3
|
||||||
#define DEFAULT_UNDI_MINOR 0
|
#define DEFAULT_UNDI_MINOR 0
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINT32 Reserved;
|
UINT32 Reserved;
|
||||||
} HTTP_BOOT_VENDOR_OPTION;
|
} HTTP_BOOT_VENDOR_OPTION;
|
||||||
|
|
||||||
#define HTTP_CACHED_DHCP4_PACKET_MAX_SIZE (OFFSET_OF (EFI_DHCP4_PACKET, Dhcp4) + HTTP_BOOT_DHCP4_PACKET_MAX_SIZE)
|
#define HTTP_CACHED_DHCP4_PACKET_MAX_SIZE (OFFSET_OF (EFI_DHCP4_PACKET, Dhcp4) + HTTP_BOOT_DHCP4_PACKET_MAX_SIZE)
|
||||||
|
|
||||||
typedef union {
|
typedef union {
|
||||||
EFI_DHCP4_PACKET Offer;
|
EFI_DHCP4_PACKET Offer;
|
||||||
EFI_DHCP4_PACKET Ack;
|
EFI_DHCP4_PACKET Ack;
|
||||||
UINT8 Buffer[HTTP_CACHED_DHCP4_PACKET_MAX_SIZE];
|
UINT8 Buffer[HTTP_CACHED_DHCP4_PACKET_MAX_SIZE];
|
||||||
} HTTP_BOOT_DHCP4_PACKET;
|
} HTTP_BOOT_DHCP4_PACKET;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
//
|
//
|
||||||
// URI component
|
// URI component
|
||||||
//
|
//
|
||||||
CHAR8 *Scheme;
|
CHAR8 *Scheme;
|
||||||
CHAR8 *Authority;
|
CHAR8 *Authority;
|
||||||
CHAR8 *Path;
|
CHAR8 *Path;
|
||||||
CHAR8 *Query;
|
CHAR8 *Query;
|
||||||
CHAR8 *Fragment; /// TODO: may not required in HTTP URL
|
CHAR8 *Fragment; /// TODO: may not required in HTTP URL
|
||||||
|
|
||||||
CHAR8 *RegName; /// Point to somewhere in Authority
|
CHAR8 *RegName; /// Point to somewhere in Authority
|
||||||
BOOLEAN AddrIsOk;
|
BOOLEAN AddrIsOk;
|
||||||
EFI_IP_ADDRESS Address;
|
EFI_IP_ADDRESS Address;
|
||||||
UINT16 Port;
|
UINT16 Port;
|
||||||
} HTTP_BOOT_URI_CONTENT;
|
} HTTP_BOOT_URI_CONTENT;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
HTTP_BOOT_DHCP4_PACKET Packet;
|
HTTP_BOOT_DHCP4_PACKET Packet;
|
||||||
HTTP_BOOT_OFFER_TYPE OfferType;
|
HTTP_BOOT_OFFER_TYPE OfferType;
|
||||||
VOID *UriParser;
|
VOID *UriParser;
|
||||||
EFI_DHCP4_PACKET_OPTION *OptList[HTTP_BOOT_DHCP4_TAG_INDEX_MAX];
|
EFI_DHCP4_PACKET_OPTION *OptList[HTTP_BOOT_DHCP4_TAG_INDEX_MAX];
|
||||||
} HTTP_BOOT_DHCP4_PACKET_CACHE;
|
} HTTP_BOOT_DHCP4_PACKET_CACHE;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -228,7 +228,7 @@ HttpBootSelectDhcpOffer (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpBootDhcp4Dora (
|
HttpBootDhcp4Dora (
|
||||||
IN HTTP_BOOT_PRIVATE_DATA *Private
|
IN HTTP_BOOT_PRIVATE_DATA *Private
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -245,9 +245,9 @@ HttpBootDhcp4Dora (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpBootRegisterIp4Dns (
|
HttpBootRegisterIp4Dns (
|
||||||
IN HTTP_BOOT_PRIVATE_DATA *Private,
|
IN HTTP_BOOT_PRIVATE_DATA *Private,
|
||||||
IN UINTN DataLength,
|
IN UINTN DataLength,
|
||||||
IN VOID *DnsServerData
|
IN VOID *DnsServerData
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -20,70 +20,70 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
**/
|
**/
|
||||||
UINT32
|
UINT32
|
||||||
HttpBootBuildDhcp6Options (
|
HttpBootBuildDhcp6Options (
|
||||||
IN HTTP_BOOT_PRIVATE_DATA *Private,
|
IN HTTP_BOOT_PRIVATE_DATA *Private,
|
||||||
OUT EFI_DHCP6_PACKET_OPTION **OptList,
|
OUT EFI_DHCP6_PACKET_OPTION **OptList,
|
||||||
IN UINT8 *Buffer
|
IN UINT8 *Buffer
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
HTTP_BOOT_DHCP6_OPTION_ENTRY OptEnt;
|
HTTP_BOOT_DHCP6_OPTION_ENTRY OptEnt;
|
||||||
UINT16 Value;
|
UINT16 Value;
|
||||||
UINT32 Index;
|
UINT32 Index;
|
||||||
|
|
||||||
Index = 0;
|
Index = 0;
|
||||||
OptList[0] = (EFI_DHCP6_PACKET_OPTION *) Buffer;
|
OptList[0] = (EFI_DHCP6_PACKET_OPTION *)Buffer;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Append client option request option
|
// Append client option request option
|
||||||
//
|
//
|
||||||
OptList[Index]->OpCode = HTONS (DHCP6_OPT_ORO);
|
OptList[Index]->OpCode = HTONS (DHCP6_OPT_ORO);
|
||||||
OptList[Index]->OpLen = HTONS (8);
|
OptList[Index]->OpLen = HTONS (8);
|
||||||
OptEnt.Oro = (HTTP_BOOT_DHCP6_OPTION_ORO *) OptList[Index]->Data;
|
OptEnt.Oro = (HTTP_BOOT_DHCP6_OPTION_ORO *)OptList[Index]->Data;
|
||||||
OptEnt.Oro->OpCode[0] = HTONS(DHCP6_OPT_BOOT_FILE_URL);
|
OptEnt.Oro->OpCode[0] = HTONS (DHCP6_OPT_BOOT_FILE_URL);
|
||||||
OptEnt.Oro->OpCode[1] = HTONS(DHCP6_OPT_BOOT_FILE_PARAM);
|
OptEnt.Oro->OpCode[1] = HTONS (DHCP6_OPT_BOOT_FILE_PARAM);
|
||||||
OptEnt.Oro->OpCode[2] = HTONS(DHCP6_OPT_DNS_SERVERS);
|
OptEnt.Oro->OpCode[2] = HTONS (DHCP6_OPT_DNS_SERVERS);
|
||||||
OptEnt.Oro->OpCode[3] = HTONS(DHCP6_OPT_VENDOR_CLASS);
|
OptEnt.Oro->OpCode[3] = HTONS (DHCP6_OPT_VENDOR_CLASS);
|
||||||
Index++;
|
Index++;
|
||||||
OptList[Index] = GET_NEXT_DHCP6_OPTION (OptList[Index - 1]);
|
OptList[Index] = GET_NEXT_DHCP6_OPTION (OptList[Index - 1]);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Append client network device interface option
|
// Append client network device interface option
|
||||||
//
|
//
|
||||||
OptList[Index]->OpCode = HTONS (DHCP6_OPT_UNDI);
|
OptList[Index]->OpCode = HTONS (DHCP6_OPT_UNDI);
|
||||||
OptList[Index]->OpLen = HTONS ((UINT16)3);
|
OptList[Index]->OpLen = HTONS ((UINT16)3);
|
||||||
OptEnt.Undi = (HTTP_BOOT_DHCP6_OPTION_UNDI *) OptList[Index]->Data;
|
OptEnt.Undi = (HTTP_BOOT_DHCP6_OPTION_UNDI *)OptList[Index]->Data;
|
||||||
|
|
||||||
if (Private->Nii != NULL) {
|
if (Private->Nii != NULL) {
|
||||||
OptEnt.Undi->Type = Private->Nii->Type;
|
OptEnt.Undi->Type = Private->Nii->Type;
|
||||||
OptEnt.Undi->MajorVer = Private->Nii->MajorVer;
|
OptEnt.Undi->MajorVer = Private->Nii->MajorVer;
|
||||||
OptEnt.Undi->MinorVer = Private->Nii->MinorVer;
|
OptEnt.Undi->MinorVer = Private->Nii->MinorVer;
|
||||||
} else {
|
} else {
|
||||||
OptEnt.Undi->Type = DEFAULT_UNDI_TYPE;
|
OptEnt.Undi->Type = DEFAULT_UNDI_TYPE;
|
||||||
OptEnt.Undi->MajorVer = DEFAULT_UNDI_MAJOR;
|
OptEnt.Undi->MajorVer = DEFAULT_UNDI_MAJOR;
|
||||||
OptEnt.Undi->MinorVer = DEFAULT_UNDI_MINOR;
|
OptEnt.Undi->MinorVer = DEFAULT_UNDI_MINOR;
|
||||||
}
|
}
|
||||||
|
|
||||||
Index++;
|
Index++;
|
||||||
OptList[Index] = GET_NEXT_DHCP6_OPTION (OptList[Index - 1]);
|
OptList[Index] = GET_NEXT_DHCP6_OPTION (OptList[Index - 1]);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Append client system architecture option
|
// Append client system architecture option
|
||||||
//
|
//
|
||||||
OptList[Index]->OpCode = HTONS (DHCP6_OPT_ARCH);
|
OptList[Index]->OpCode = HTONS (DHCP6_OPT_ARCH);
|
||||||
OptList[Index]->OpLen = HTONS ((UINT16) sizeof (HTTP_BOOT_DHCP6_OPTION_ARCH));
|
OptList[Index]->OpLen = HTONS ((UINT16)sizeof (HTTP_BOOT_DHCP6_OPTION_ARCH));
|
||||||
OptEnt.Arch = (HTTP_BOOT_DHCP6_OPTION_ARCH *) OptList[Index]->Data;
|
OptEnt.Arch = (HTTP_BOOT_DHCP6_OPTION_ARCH *)OptList[Index]->Data;
|
||||||
Value = HTONS (EFI_HTTP_BOOT_CLIENT_SYSTEM_ARCHITECTURE);
|
Value = HTONS (EFI_HTTP_BOOT_CLIENT_SYSTEM_ARCHITECTURE);
|
||||||
CopyMem (&OptEnt.Arch->Type, &Value, sizeof (UINT16));
|
CopyMem (&OptEnt.Arch->Type, &Value, sizeof (UINT16));
|
||||||
Index++;
|
Index++;
|
||||||
OptList[Index] = GET_NEXT_DHCP6_OPTION (OptList[Index - 1]);
|
OptList[Index] = GET_NEXT_DHCP6_OPTION (OptList[Index - 1]);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Append vendor class identify option.
|
// Append vendor class identify option.
|
||||||
//
|
//
|
||||||
OptList[Index]->OpCode = HTONS (DHCP6_OPT_VENDOR_CLASS);
|
OptList[Index]->OpCode = HTONS (DHCP6_OPT_VENDOR_CLASS);
|
||||||
OptList[Index]->OpLen = HTONS ((UINT16) sizeof (HTTP_BOOT_DHCP6_OPTION_VENDOR_CLASS));
|
OptList[Index]->OpLen = HTONS ((UINT16)sizeof (HTTP_BOOT_DHCP6_OPTION_VENDOR_CLASS));
|
||||||
OptEnt.VendorClass = (HTTP_BOOT_DHCP6_OPTION_VENDOR_CLASS *) OptList[Index]->Data;
|
OptEnt.VendorClass = (HTTP_BOOT_DHCP6_OPTION_VENDOR_CLASS *)OptList[Index]->Data;
|
||||||
OptEnt.VendorClass->Vendor = HTONL (HTTP_BOOT_DHCP6_ENTERPRISE_NUM);
|
OptEnt.VendorClass->Vendor = HTONL (HTTP_BOOT_DHCP6_ENTERPRISE_NUM);
|
||||||
OptEnt.VendorClass->ClassLen = HTONS ((UINT16) sizeof (HTTP_BOOT_CLASS_ID));
|
OptEnt.VendorClass->ClassLen = HTONS ((UINT16)sizeof (HTTP_BOOT_CLASS_ID));
|
||||||
CopyMem (
|
CopyMem (
|
||||||
&OptEnt.VendorClass->ClassId,
|
&OptEnt.VendorClass->ClassId,
|
||||||
DEFAULT_CLASS_ID_DATA,
|
DEFAULT_CLASS_ID_DATA,
|
||||||
@ -131,33 +131,30 @@ HttpBootBuildDhcp6Options (
|
|||||||
**/
|
**/
|
||||||
EFI_DHCP6_PACKET_OPTION *
|
EFI_DHCP6_PACKET_OPTION *
|
||||||
HttpBootParseDhcp6Options (
|
HttpBootParseDhcp6Options (
|
||||||
IN UINT8 *Buffer,
|
IN UINT8 *Buffer,
|
||||||
IN UINT32 Length,
|
IN UINT32 Length,
|
||||||
IN UINT16 OptTag
|
IN UINT16 OptTag
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_DHCP6_PACKET_OPTION *Option;
|
EFI_DHCP6_PACKET_OPTION *Option;
|
||||||
UINT32 Offset;
|
UINT32 Offset;
|
||||||
|
|
||||||
Option = (EFI_DHCP6_PACKET_OPTION *) Buffer;
|
Option = (EFI_DHCP6_PACKET_OPTION *)Buffer;
|
||||||
Offset = 0;
|
Offset = 0;
|
||||||
|
|
||||||
//
|
//
|
||||||
// OpLen and OpCode here are both stored in network order.
|
// OpLen and OpCode here are both stored in network order.
|
||||||
//
|
//
|
||||||
while (Offset < Length) {
|
while (Offset < Length) {
|
||||||
|
|
||||||
if (NTOHS (Option->OpCode) == OptTag) {
|
if (NTOHS (Option->OpCode) == OptTag) {
|
||||||
|
|
||||||
return Option;
|
return Option;
|
||||||
}
|
}
|
||||||
|
|
||||||
Offset += (NTOHS(Option->OpLen) + 4);
|
Offset += (NTOHS (Option->OpLen) + 4);
|
||||||
Option = (EFI_DHCP6_PACKET_OPTION *) (Buffer + Offset);
|
Option = (EFI_DHCP6_PACKET_OPTION *)(Buffer + Offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -171,40 +168,39 @@ HttpBootParseDhcp6Options (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpBootParseDhcp6Packet (
|
HttpBootParseDhcp6Packet (
|
||||||
IN HTTP_BOOT_DHCP6_PACKET_CACHE *Cache6
|
IN HTTP_BOOT_DHCP6_PACKET_CACHE *Cache6
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_DHCP6_PACKET *Offer;
|
EFI_DHCP6_PACKET *Offer;
|
||||||
EFI_DHCP6_PACKET_OPTION **Options;
|
EFI_DHCP6_PACKET_OPTION **Options;
|
||||||
EFI_DHCP6_PACKET_OPTION *Option;
|
EFI_DHCP6_PACKET_OPTION *Option;
|
||||||
HTTP_BOOT_OFFER_TYPE OfferType;
|
HTTP_BOOT_OFFER_TYPE OfferType;
|
||||||
EFI_IPv6_ADDRESS IpAddr;
|
EFI_IPv6_ADDRESS IpAddr;
|
||||||
BOOLEAN IsProxyOffer;
|
BOOLEAN IsProxyOffer;
|
||||||
BOOLEAN IsHttpOffer;
|
BOOLEAN IsHttpOffer;
|
||||||
BOOLEAN IsDnsOffer;
|
BOOLEAN IsDnsOffer;
|
||||||
BOOLEAN IpExpressedUri;
|
BOOLEAN IpExpressedUri;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
UINT32 Offset;
|
UINT32 Offset;
|
||||||
UINT32 Length;
|
UINT32 Length;
|
||||||
|
|
||||||
IsDnsOffer = FALSE;
|
IsDnsOffer = FALSE;
|
||||||
IpExpressedUri = FALSE;
|
IpExpressedUri = FALSE;
|
||||||
IsProxyOffer = TRUE;
|
IsProxyOffer = TRUE;
|
||||||
IsHttpOffer = FALSE;
|
IsHttpOffer = FALSE;
|
||||||
Offer = &Cache6->Packet.Offer;
|
Offer = &Cache6->Packet.Offer;
|
||||||
Options = Cache6->OptList;
|
Options = Cache6->OptList;
|
||||||
|
|
||||||
ZeroMem (Cache6->OptList, sizeof (Cache6->OptList));
|
ZeroMem (Cache6->OptList, sizeof (Cache6->OptList));
|
||||||
|
|
||||||
Option = (EFI_DHCP6_PACKET_OPTION *) (Offer->Dhcp6.Option);
|
Option = (EFI_DHCP6_PACKET_OPTION *)(Offer->Dhcp6.Option);
|
||||||
Offset = 0;
|
Offset = 0;
|
||||||
Length = GET_DHCP6_OPTION_SIZE (Offer);
|
Length = GET_DHCP6_OPTION_SIZE (Offer);
|
||||||
|
|
||||||
//
|
//
|
||||||
// OpLen and OpCode here are both stored in network order, since they are from original packet.
|
// OpLen and OpCode here are both stored in network order, since they are from original packet.
|
||||||
//
|
//
|
||||||
while (Offset < Length) {
|
while (Offset < Length) {
|
||||||
|
|
||||||
if (NTOHS (Option->OpCode) == DHCP6_OPT_IA_NA) {
|
if (NTOHS (Option->OpCode) == DHCP6_OPT_IA_NA) {
|
||||||
Options[HTTP_BOOT_DHCP6_IDX_IA_NA] = Option;
|
Options[HTTP_BOOT_DHCP6_IDX_IA_NA] = Option;
|
||||||
} else if (NTOHS (Option->OpCode) == DHCP6_OPT_BOOT_FILE_URL) {
|
} else if (NTOHS (Option->OpCode) == DHCP6_OPT_BOOT_FILE_URL) {
|
||||||
@ -221,8 +217,9 @@ HttpBootParseDhcp6Packet (
|
|||||||
}
|
}
|
||||||
|
|
||||||
Offset += (NTOHS (Option->OpLen) + 4);
|
Offset += (NTOHS (Option->OpLen) + 4);
|
||||||
Option = (EFI_DHCP6_PACKET_OPTION *) (Offer->Dhcp6.Option + Offset);
|
Option = (EFI_DHCP6_PACKET_OPTION *)(Offer->Dhcp6.Option + Offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// The offer with assigned client address is NOT a proxy offer.
|
// The offer with assigned client address is NOT a proxy offer.
|
||||||
// An ia_na option, embedded with valid ia_addr option and a status_code of success.
|
// An ia_na option, embedded with valid ia_addr option and a status_code of success.
|
||||||
@ -234,7 +231,7 @@ HttpBootParseDhcp6Packet (
|
|||||||
NTOHS (Option->OpLen),
|
NTOHS (Option->OpLen),
|
||||||
DHCP6_OPT_STATUS_CODE
|
DHCP6_OPT_STATUS_CODE
|
||||||
);
|
);
|
||||||
if ((Option != NULL && Option->Data[0] == 0) || (Option == NULL)) {
|
if (((Option != NULL) && (Option->Data[0] == 0)) || (Option == NULL)) {
|
||||||
IsProxyOffer = FALSE;
|
IsProxyOffer = FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -244,10 +241,11 @@ HttpBootParseDhcp6Packet (
|
|||||||
//
|
//
|
||||||
Option = Options[HTTP_BOOT_DHCP6_IDX_VENDOR_CLASS];
|
Option = Options[HTTP_BOOT_DHCP6_IDX_VENDOR_CLASS];
|
||||||
|
|
||||||
if (Option != NULL &&
|
if ((Option != NULL) &&
|
||||||
NTOHS(Option->OpLen) >= 16 &&
|
(NTOHS (Option->OpLen) >= 16) &&
|
||||||
CompareMem ((Option->Data + 6), DEFAULT_CLASS_ID_DATA, 10) == 0) {
|
(CompareMem ((Option->Data + 6), DEFAULT_CLASS_ID_DATA, 10) == 0))
|
||||||
IsHttpOffer = TRUE;
|
{
|
||||||
|
IsHttpOffer = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -261,7 +259,7 @@ HttpBootParseDhcp6Packet (
|
|||||||
//
|
//
|
||||||
// Http offer must have a boot URI.
|
// Http offer must have a boot URI.
|
||||||
//
|
//
|
||||||
if (IsHttpOffer && Options[HTTP_BOOT_DHCP6_IDX_BOOT_FILE_URL] == NULL) {
|
if (IsHttpOffer && (Options[HTTP_BOOT_DHCP6_IDX_BOOT_FILE_URL] == NULL)) {
|
||||||
return EFI_DEVICE_ERROR;
|
return EFI_DEVICE_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -270,8 +268,8 @@ HttpBootParseDhcp6Packet (
|
|||||||
//
|
//
|
||||||
if (IsHttpOffer) {
|
if (IsHttpOffer) {
|
||||||
Status = HttpParseUrl (
|
Status = HttpParseUrl (
|
||||||
(CHAR8*) Options[HTTP_BOOT_DHCP6_IDX_BOOT_FILE_URL]->Data,
|
(CHAR8 *)Options[HTTP_BOOT_DHCP6_IDX_BOOT_FILE_URL]->Data,
|
||||||
(UINT32) AsciiStrLen ((CHAR8*) Options[HTTP_BOOT_DHCP6_IDX_BOOT_FILE_URL]->Data),
|
(UINT32)AsciiStrLen ((CHAR8 *)Options[HTTP_BOOT_DHCP6_IDX_BOOT_FILE_URL]->Data),
|
||||||
FALSE,
|
FALSE,
|
||||||
&Cache6->UriParser
|
&Cache6->UriParser
|
||||||
);
|
);
|
||||||
@ -280,7 +278,7 @@ HttpBootParseDhcp6Packet (
|
|||||||
}
|
}
|
||||||
|
|
||||||
Status = HttpUrlGetIp6 (
|
Status = HttpUrlGetIp6 (
|
||||||
(CHAR8*) Options[HTTP_BOOT_DHCP6_IDX_BOOT_FILE_URL]->Data,
|
(CHAR8 *)Options[HTTP_BOOT_DHCP6_IDX_BOOT_FILE_URL]->Data,
|
||||||
Cache6->UriParser,
|
Cache6->UriParser,
|
||||||
&IpAddr
|
&IpAddr
|
||||||
);
|
);
|
||||||
@ -304,7 +302,6 @@ HttpBootParseDhcp6Packet (
|
|||||||
OfferType = HttpOfferTypeProxyNameUri;
|
OfferType = HttpOfferTypeProxyNameUri;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
if (!IsProxyOffer) {
|
if (!IsProxyOffer) {
|
||||||
OfferType = IsDnsOffer ? HttpOfferTypeDhcpDns : HttpOfferTypeDhcpOnly;
|
OfferType = IsDnsOffer ? HttpOfferTypeDhcpDns : HttpOfferTypeDhcpOnly;
|
||||||
@ -329,8 +326,8 @@ HttpBootParseDhcp6Packet (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpBootCacheDhcp6Packet (
|
HttpBootCacheDhcp6Packet (
|
||||||
IN EFI_DHCP6_PACKET *Dst,
|
IN EFI_DHCP6_PACKET *Dst,
|
||||||
IN EFI_DHCP6_PACKET *Src
|
IN EFI_DHCP6_PACKET *Src
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
if (Dst->Size < Src->Length) {
|
if (Dst->Size < Src->Length) {
|
||||||
@ -359,10 +356,10 @@ HttpBootCacheDhcp6Offer (
|
|||||||
IN EFI_DHCP6_PACKET *RcvdOffer
|
IN EFI_DHCP6_PACKET *RcvdOffer
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
HTTP_BOOT_DHCP6_PACKET_CACHE *Cache6;
|
HTTP_BOOT_DHCP6_PACKET_CACHE *Cache6;
|
||||||
EFI_DHCP6_PACKET *Offer;
|
EFI_DHCP6_PACKET *Offer;
|
||||||
HTTP_BOOT_OFFER_TYPE OfferType;
|
HTTP_BOOT_OFFER_TYPE OfferType;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
Cache6 = &Private->OfferBuffer[Private->OfferNum].Dhcp6;
|
Cache6 = &Private->OfferBuffer[Private->OfferNum].Dhcp6;
|
||||||
Offer = &Cache6->Packet.Offer;
|
Offer = &Cache6->Packet.Offer;
|
||||||
@ -370,7 +367,7 @@ HttpBootCacheDhcp6Offer (
|
|||||||
//
|
//
|
||||||
// Cache the content of DHCPv6 packet firstly.
|
// Cache the content of DHCPv6 packet firstly.
|
||||||
//
|
//
|
||||||
Status = HttpBootCacheDhcp6Packet(Offer, RcvdOffer);
|
Status = HttpBootCacheDhcp6Packet (Offer, RcvdOffer);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
@ -417,86 +414,91 @@ HttpBootCacheDhcp6Offer (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
HttpBootDhcp6CallBack (
|
HttpBootDhcp6CallBack (
|
||||||
IN EFI_DHCP6_PROTOCOL *This,
|
IN EFI_DHCP6_PROTOCOL *This,
|
||||||
IN VOID *Context,
|
IN VOID *Context,
|
||||||
IN EFI_DHCP6_STATE CurrentState,
|
IN EFI_DHCP6_STATE CurrentState,
|
||||||
IN EFI_DHCP6_EVENT Dhcp6Event,
|
IN EFI_DHCP6_EVENT Dhcp6Event,
|
||||||
IN EFI_DHCP6_PACKET *Packet,
|
IN EFI_DHCP6_PACKET *Packet,
|
||||||
OUT EFI_DHCP6_PACKET **NewPacket OPTIONAL
|
OUT EFI_DHCP6_PACKET **NewPacket OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
HTTP_BOOT_PRIVATE_DATA *Private;
|
HTTP_BOOT_PRIVATE_DATA *Private;
|
||||||
EFI_DHCP6_PACKET *SelectAd;
|
EFI_DHCP6_PACKET *SelectAd;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
BOOLEAN Received;
|
BOOLEAN Received;
|
||||||
|
|
||||||
if ((Dhcp6Event != Dhcp6SendSolicit) &&
|
if ((Dhcp6Event != Dhcp6SendSolicit) &&
|
||||||
(Dhcp6Event != Dhcp6RcvdAdvertise) &&
|
(Dhcp6Event != Dhcp6RcvdAdvertise) &&
|
||||||
(Dhcp6Event != Dhcp6SendRequest) &&
|
(Dhcp6Event != Dhcp6SendRequest) &&
|
||||||
(Dhcp6Event != Dhcp6RcvdReply) &&
|
(Dhcp6Event != Dhcp6RcvdReply) &&
|
||||||
(Dhcp6Event != Dhcp6SelectAdvertise)) {
|
(Dhcp6Event != Dhcp6SelectAdvertise))
|
||||||
|
{
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
ASSERT (Packet != NULL);
|
ASSERT (Packet != NULL);
|
||||||
|
|
||||||
Private = (HTTP_BOOT_PRIVATE_DATA *) Context;
|
Private = (HTTP_BOOT_PRIVATE_DATA *)Context;
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
if (Private->HttpBootCallback != NULL && Dhcp6Event != Dhcp6SelectAdvertise) {
|
if ((Private->HttpBootCallback != NULL) && (Dhcp6Event != Dhcp6SelectAdvertise)) {
|
||||||
Received = (BOOLEAN) (Dhcp6Event == Dhcp6RcvdAdvertise || Dhcp6Event == Dhcp6RcvdReply);
|
Received = (BOOLEAN)(Dhcp6Event == Dhcp6RcvdAdvertise || Dhcp6Event == Dhcp6RcvdReply);
|
||||||
Status = Private->HttpBootCallback->Callback (
|
Status = Private->HttpBootCallback->Callback (
|
||||||
Private->HttpBootCallback,
|
Private->HttpBootCallback,
|
||||||
HttpBootDhcp6,
|
HttpBootDhcp6,
|
||||||
Received,
|
Received,
|
||||||
Packet->Length,
|
Packet->Length,
|
||||||
&Packet->Dhcp6
|
&Packet->Dhcp6
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return EFI_ABORTED;
|
return EFI_ABORTED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (Dhcp6Event) {
|
switch (Dhcp6Event) {
|
||||||
|
case Dhcp6RcvdAdvertise:
|
||||||
case Dhcp6RcvdAdvertise:
|
Status = EFI_NOT_READY;
|
||||||
Status = EFI_NOT_READY;
|
if (Packet->Length > HTTP_BOOT_DHCP6_PACKET_MAX_SIZE) {
|
||||||
if (Packet->Length > HTTP_BOOT_DHCP6_PACKET_MAX_SIZE) {
|
//
|
||||||
//
|
// Ignore the incoming packets which exceed the maximum length.
|
||||||
// Ignore the incoming packets which exceed the maximum length.
|
//
|
||||||
//
|
break;
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (Private->OfferNum < HTTP_BOOT_OFFER_MAX_NUM) {
|
|
||||||
//
|
|
||||||
// Cache the dhcp offers to OfferBuffer[] for select later, and record
|
|
||||||
// the OfferIndex and OfferCount.
|
|
||||||
// If error happens, just ignore this packet and continue to wait more offer.
|
|
||||||
//
|
|
||||||
HttpBootCacheDhcp6Offer (Private, Packet);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case Dhcp6SelectAdvertise:
|
|
||||||
//
|
|
||||||
// Select offer by the default policy or by order, and record the SelectIndex
|
|
||||||
// and SelectProxyType.
|
|
||||||
//
|
|
||||||
HttpBootSelectDhcpOffer (Private);
|
|
||||||
|
|
||||||
if (Private->SelectIndex == 0) {
|
|
||||||
Status = EFI_ABORTED;
|
|
||||||
} else {
|
|
||||||
ASSERT (NewPacket != NULL);
|
|
||||||
SelectAd = &Private->OfferBuffer[Private->SelectIndex - 1].Dhcp6.Packet.Offer;
|
|
||||||
*NewPacket = AllocateZeroPool (SelectAd->Size);
|
|
||||||
if (*NewPacket == NULL) {
|
|
||||||
return EFI_OUT_OF_RESOURCES;
|
|
||||||
}
|
}
|
||||||
CopyMem (*NewPacket, SelectAd, SelectAd->Size);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
if (Private->OfferNum < HTTP_BOOT_OFFER_MAX_NUM) {
|
||||||
break;
|
//
|
||||||
|
// Cache the dhcp offers to OfferBuffer[] for select later, and record
|
||||||
|
// the OfferIndex and OfferCount.
|
||||||
|
// If error happens, just ignore this packet and continue to wait more offer.
|
||||||
|
//
|
||||||
|
HttpBootCacheDhcp6Offer (Private, Packet);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Dhcp6SelectAdvertise:
|
||||||
|
//
|
||||||
|
// Select offer by the default policy or by order, and record the SelectIndex
|
||||||
|
// and SelectProxyType.
|
||||||
|
//
|
||||||
|
HttpBootSelectDhcpOffer (Private);
|
||||||
|
|
||||||
|
if (Private->SelectIndex == 0) {
|
||||||
|
Status = EFI_ABORTED;
|
||||||
|
} else {
|
||||||
|
ASSERT (NewPacket != NULL);
|
||||||
|
SelectAd = &Private->OfferBuffer[Private->SelectIndex - 1].Dhcp6.Packet.Offer;
|
||||||
|
*NewPacket = AllocateZeroPool (SelectAd->Size);
|
||||||
|
if (*NewPacket == NULL) {
|
||||||
|
return EFI_OUT_OF_RESOURCES;
|
||||||
|
}
|
||||||
|
|
||||||
|
CopyMem (*NewPacket, SelectAd, SelectAd->Size);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
@ -519,18 +521,18 @@ HttpBootDhcp6CallBack (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpBootCheckRouteTable (
|
HttpBootCheckRouteTable (
|
||||||
IN HTTP_BOOT_PRIVATE_DATA *Private,
|
IN HTTP_BOOT_PRIVATE_DATA *Private,
|
||||||
IN UINTN TimeOutInSecond,
|
IN UINTN TimeOutInSecond,
|
||||||
OUT EFI_IPv6_ADDRESS *GatewayAddr
|
OUT EFI_IPv6_ADDRESS *GatewayAddr
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_IP6_PROTOCOL *Ip6;
|
EFI_IP6_PROTOCOL *Ip6;
|
||||||
EFI_IP6_MODE_DATA Ip6ModeData;
|
EFI_IP6_MODE_DATA Ip6ModeData;
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
EFI_EVENT TimeOutEvt;
|
EFI_EVENT TimeOutEvt;
|
||||||
UINTN RetryCount;
|
UINTN RetryCount;
|
||||||
BOOLEAN GatewayIsFound;
|
BOOLEAN GatewayIsFound;
|
||||||
|
|
||||||
ASSERT (GatewayAddr != NULL);
|
ASSERT (GatewayAddr != NULL);
|
||||||
ASSERT (Private != NULL);
|
ASSERT (Private != NULL);
|
||||||
@ -562,23 +564,28 @@ HttpBootCheckRouteTable (
|
|||||||
if (Ip6ModeData.AddressList != NULL) {
|
if (Ip6ModeData.AddressList != NULL) {
|
||||||
FreePool (Ip6ModeData.AddressList);
|
FreePool (Ip6ModeData.AddressList);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Ip6ModeData.GroupTable != NULL) {
|
if (Ip6ModeData.GroupTable != NULL) {
|
||||||
FreePool (Ip6ModeData.GroupTable);
|
FreePool (Ip6ModeData.GroupTable);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Ip6ModeData.RouteTable != NULL) {
|
if (Ip6ModeData.RouteTable != NULL) {
|
||||||
FreePool (Ip6ModeData.RouteTable);
|
FreePool (Ip6ModeData.RouteTable);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Ip6ModeData.NeighborCache != NULL) {
|
if (Ip6ModeData.NeighborCache != NULL) {
|
||||||
FreePool (Ip6ModeData.NeighborCache);
|
FreePool (Ip6ModeData.NeighborCache);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Ip6ModeData.PrefixTable != NULL) {
|
if (Ip6ModeData.PrefixTable != NULL) {
|
||||||
FreePool (Ip6ModeData.PrefixTable);
|
FreePool (Ip6ModeData.PrefixTable);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Ip6ModeData.IcmpTypeList != NULL) {
|
if (Ip6ModeData.IcmpTypeList != NULL) {
|
||||||
FreePool (Ip6ModeData.IcmpTypeList);
|
FreePool (Ip6ModeData.IcmpTypeList);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GatewayIsFound || RetryCount == TimeOutInSecond) {
|
if (GatewayIsFound || (RetryCount == TimeOutInSecond)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -604,6 +611,7 @@ HttpBootCheckRouteTable (
|
|||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (EFI_ERROR (gBS->CheckEvent (TimeOutEvt))) {
|
while (EFI_ERROR (gBS->CheckEvent (TimeOutEvt))) {
|
||||||
Ip6->Poll (Ip6);
|
Ip6->Poll (Ip6);
|
||||||
}
|
}
|
||||||
@ -634,16 +642,16 @@ ON_EXIT:
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpBootSetIp6Policy (
|
HttpBootSetIp6Policy (
|
||||||
IN HTTP_BOOT_PRIVATE_DATA *Private
|
IN HTTP_BOOT_PRIVATE_DATA *Private
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_IP6_CONFIG_POLICY Policy;
|
EFI_IP6_CONFIG_POLICY Policy;
|
||||||
EFI_IP6_CONFIG_PROTOCOL *Ip6Config;
|
EFI_IP6_CONFIG_PROTOCOL *Ip6Config;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
UINTN DataSize;
|
UINTN DataSize;
|
||||||
|
|
||||||
Ip6Config = Private->Ip6Config;
|
Ip6Config = Private->Ip6Config;
|
||||||
DataSize = sizeof (EFI_IP6_CONFIG_POLICY);
|
DataSize = sizeof (EFI_IP6_CONFIG_POLICY);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Get and store the current policy of IP6 driver.
|
// Get and store the current policy of IP6 driver.
|
||||||
@ -663,13 +671,14 @@ HttpBootSetIp6Policy (
|
|||||||
Status = Ip6Config->SetData (
|
Status = Ip6Config->SetData (
|
||||||
Ip6Config,
|
Ip6Config,
|
||||||
Ip6ConfigDataTypePolicy,
|
Ip6ConfigDataTypePolicy,
|
||||||
sizeof(EFI_IP6_CONFIG_POLICY),
|
sizeof (EFI_IP6_CONFIG_POLICY),
|
||||||
&Policy
|
&Policy
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -687,12 +696,12 @@ HttpBootSetIp6Policy (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpBootSetIp6Dns (
|
HttpBootSetIp6Dns (
|
||||||
IN HTTP_BOOT_PRIVATE_DATA *Private,
|
IN HTTP_BOOT_PRIVATE_DATA *Private,
|
||||||
IN UINTN DataLength,
|
IN UINTN DataLength,
|
||||||
IN VOID *DnsServerData
|
IN VOID *DnsServerData
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_IP6_CONFIG_PROTOCOL *Ip6Config;
|
EFI_IP6_CONFIG_PROTOCOL *Ip6Config;
|
||||||
|
|
||||||
ASSERT (Private->UsingIpv6);
|
ASSERT (Private->UsingIpv6);
|
||||||
|
|
||||||
@ -717,11 +726,11 @@ HttpBootSetIp6Dns (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpBootSetIp6Gateway (
|
HttpBootSetIp6Gateway (
|
||||||
IN HTTP_BOOT_PRIVATE_DATA *Private
|
IN HTTP_BOOT_PRIVATE_DATA *Private
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_IP6_CONFIG_PROTOCOL *Ip6Config;
|
EFI_IP6_CONFIG_PROTOCOL *Ip6Config;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
ASSERT (Private->UsingIpv6);
|
ASSERT (Private->UsingIpv6);
|
||||||
Ip6Config = Private->Ip6Config;
|
Ip6Config = Private->Ip6Config;
|
||||||
@ -736,7 +745,7 @@ HttpBootSetIp6Gateway (
|
|||||||
sizeof (EFI_IPv6_ADDRESS),
|
sizeof (EFI_IPv6_ADDRESS),
|
||||||
&Private->GatewayIp.v6
|
&Private->GatewayIp.v6
|
||||||
);
|
);
|
||||||
if (EFI_ERROR(Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -755,21 +764,21 @@ HttpBootSetIp6Gateway (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpBootSetIp6Address (
|
HttpBootSetIp6Address (
|
||||||
IN HTTP_BOOT_PRIVATE_DATA *Private
|
IN HTTP_BOOT_PRIVATE_DATA *Private
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_IP6_PROTOCOL *Ip6;
|
EFI_IP6_PROTOCOL *Ip6;
|
||||||
EFI_IP6_CONFIG_PROTOCOL *Ip6Cfg;
|
EFI_IP6_CONFIG_PROTOCOL *Ip6Cfg;
|
||||||
EFI_IP6_CONFIG_POLICY Policy;
|
EFI_IP6_CONFIG_POLICY Policy;
|
||||||
EFI_IP6_CONFIG_MANUAL_ADDRESS CfgAddr;
|
EFI_IP6_CONFIG_MANUAL_ADDRESS CfgAddr;
|
||||||
EFI_IPv6_ADDRESS *Ip6Addr;
|
EFI_IPv6_ADDRESS *Ip6Addr;
|
||||||
EFI_IPv6_ADDRESS GatewayAddr;
|
EFI_IPv6_ADDRESS GatewayAddr;
|
||||||
EFI_IP6_CONFIG_DATA Ip6CfgData;
|
EFI_IP6_CONFIG_DATA Ip6CfgData;
|
||||||
EFI_EVENT MappedEvt;
|
EFI_EVENT MappedEvt;
|
||||||
UINTN DataSize;
|
UINTN DataSize;
|
||||||
BOOLEAN IsAddressOk;
|
BOOLEAN IsAddressOk;
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
|
|
||||||
ASSERT (Private->UsingIpv6);
|
ASSERT (Private->UsingIpv6);
|
||||||
|
|
||||||
@ -783,11 +792,11 @@ HttpBootSetIp6Address (
|
|||||||
CopyMem (&CfgAddr, &Private->StationIp.v6, sizeof (EFI_IPv6_ADDRESS));
|
CopyMem (&CfgAddr, &Private->StationIp.v6, sizeof (EFI_IPv6_ADDRESS));
|
||||||
ZeroMem (&Ip6CfgData, sizeof (EFI_IP6_CONFIG_DATA));
|
ZeroMem (&Ip6CfgData, sizeof (EFI_IP6_CONFIG_DATA));
|
||||||
|
|
||||||
Ip6CfgData.AcceptIcmpErrors = TRUE;
|
Ip6CfgData.AcceptIcmpErrors = TRUE;
|
||||||
Ip6CfgData.DefaultProtocol = IP6_ICMP;
|
Ip6CfgData.DefaultProtocol = IP6_ICMP;
|
||||||
Ip6CfgData.HopLimit = HTTP_BOOT_DEFAULT_HOPLIMIT;
|
Ip6CfgData.HopLimit = HTTP_BOOT_DEFAULT_HOPLIMIT;
|
||||||
Ip6CfgData.ReceiveTimeout = HTTP_BOOT_DEFAULT_LIFETIME;
|
Ip6CfgData.ReceiveTimeout = HTTP_BOOT_DEFAULT_LIFETIME;
|
||||||
Ip6CfgData.TransmitTimeout = HTTP_BOOT_DEFAULT_LIFETIME;
|
Ip6CfgData.TransmitTimeout = HTTP_BOOT_DEFAULT_LIFETIME;
|
||||||
|
|
||||||
Status = Ip6->Configure (Ip6, &Ip6CfgData);
|
Status = Ip6->Configure (Ip6, &Ip6CfgData);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
@ -811,7 +820,7 @@ HttpBootSetIp6Address (
|
|||||||
Status = Ip6Cfg->SetData (
|
Status = Ip6Cfg->SetData (
|
||||||
Ip6Cfg,
|
Ip6Cfg,
|
||||||
Ip6ConfigDataTypePolicy,
|
Ip6ConfigDataTypePolicy,
|
||||||
sizeof(EFI_IP6_CONFIG_POLICY),
|
sizeof (EFI_IP6_CONFIG_POLICY),
|
||||||
&Policy
|
&Policy
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
@ -840,7 +849,7 @@ HttpBootSetIp6Address (
|
|||||||
Ip6ConfigDataTypeManualAddress,
|
Ip6ConfigDataTypeManualAddress,
|
||||||
MappedEvt
|
MappedEvt
|
||||||
);
|
);
|
||||||
if (EFI_ERROR(Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -850,7 +859,7 @@ HttpBootSetIp6Address (
|
|||||||
sizeof (EFI_IP6_CONFIG_MANUAL_ADDRESS),
|
sizeof (EFI_IP6_CONFIG_MANUAL_ADDRESS),
|
||||||
&CfgAddr
|
&CfgAddr
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status) && Status != EFI_NOT_READY) {
|
if (EFI_ERROR (Status) && (Status != EFI_NOT_READY)) {
|
||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
} else if (Status == EFI_NOT_READY) {
|
} else if (Status == EFI_NOT_READY) {
|
||||||
//
|
//
|
||||||
@ -859,17 +868,18 @@ HttpBootSetIp6Address (
|
|||||||
while (!IsAddressOk) {
|
while (!IsAddressOk) {
|
||||||
Ip6->Poll (Ip6);
|
Ip6->Poll (Ip6);
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Check whether the Ip6 Address setting is successed.
|
// Check whether the Ip6 Address setting is successed.
|
||||||
//
|
//
|
||||||
DataSize = 0;
|
DataSize = 0;
|
||||||
Status = Ip6Cfg->GetData (
|
Status = Ip6Cfg->GetData (
|
||||||
Ip6Cfg,
|
Ip6Cfg,
|
||||||
Ip6ConfigDataTypeManualAddress,
|
Ip6ConfigDataTypeManualAddress,
|
||||||
&DataSize,
|
&DataSize,
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
if (Status != EFI_BUFFER_TOO_SMALL || DataSize == 0) {
|
if ((Status != EFI_BUFFER_TOO_SMALL) || (DataSize == 0)) {
|
||||||
Status = EFI_DEVICE_ERROR;
|
Status = EFI_DEVICE_ERROR;
|
||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
}
|
}
|
||||||
@ -878,22 +888,24 @@ HttpBootSetIp6Address (
|
|||||||
if (Ip6Addr == NULL) {
|
if (Ip6Addr == NULL) {
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = Ip6Cfg->GetData (
|
Status = Ip6Cfg->GetData (
|
||||||
Ip6Cfg,
|
Ip6Cfg,
|
||||||
Ip6ConfigDataTypeManualAddress,
|
Ip6ConfigDataTypeManualAddress,
|
||||||
&DataSize,
|
&DataSize,
|
||||||
(VOID *) Ip6Addr
|
(VOID *)Ip6Addr
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
Status = EFI_DEVICE_ERROR;
|
Status = EFI_DEVICE_ERROR;
|
||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Index = 0; Index < DataSize / sizeof (EFI_IPv6_ADDRESS); Index ++) {
|
for (Index = 0; Index < DataSize / sizeof (EFI_IPv6_ADDRESS); Index++) {
|
||||||
if (CompareMem (Ip6Addr + Index, &CfgAddr, sizeof (EFI_IPv6_ADDRESS)) == 0) {
|
if (CompareMem (Ip6Addr + Index, &CfgAddr, sizeof (EFI_IPv6_ADDRESS)) == 0) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Index == DataSize / sizeof (EFI_IPv6_ADDRESS)) {
|
if (Index == DataSize / sizeof (EFI_IPv6_ADDRESS)) {
|
||||||
Status = EFI_ABORTED;
|
Status = EFI_ABORTED;
|
||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
@ -928,17 +940,17 @@ ON_EXIT:
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpBootDhcp6Sarr (
|
HttpBootDhcp6Sarr (
|
||||||
IN HTTP_BOOT_PRIVATE_DATA *Private
|
IN HTTP_BOOT_PRIVATE_DATA *Private
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_DHCP6_PROTOCOL *Dhcp6;
|
EFI_DHCP6_PROTOCOL *Dhcp6;
|
||||||
EFI_DHCP6_CONFIG_DATA Config;
|
EFI_DHCP6_CONFIG_DATA Config;
|
||||||
EFI_DHCP6_MODE_DATA Mode;
|
EFI_DHCP6_MODE_DATA Mode;
|
||||||
EFI_DHCP6_RETRANSMISSION *Retransmit;
|
EFI_DHCP6_RETRANSMISSION *Retransmit;
|
||||||
EFI_DHCP6_PACKET_OPTION *OptList[HTTP_BOOT_DHCP6_OPTION_MAX_NUM];
|
EFI_DHCP6_PACKET_OPTION *OptList[HTTP_BOOT_DHCP6_OPTION_MAX_NUM];
|
||||||
UINT32 OptCount;
|
UINT32 OptCount;
|
||||||
UINT8 Buffer[HTTP_BOOT_DHCP6_OPTION_MAX_SIZE];
|
UINT8 Buffer[HTTP_BOOT_DHCP6_OPTION_MAX_SIZE];
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
Dhcp6 = Private->Dhcp6;
|
Dhcp6 = Private->Dhcp6;
|
||||||
ASSERT (Dhcp6 != NULL);
|
ASSERT (Dhcp6 != NULL);
|
||||||
@ -947,7 +959,7 @@ HttpBootDhcp6Sarr (
|
|||||||
// Build options list for the request packet.
|
// Build options list for the request packet.
|
||||||
//
|
//
|
||||||
OptCount = HttpBootBuildDhcp6Options (Private, OptList, Buffer);
|
OptCount = HttpBootBuildDhcp6Options (Private, OptList, Buffer);
|
||||||
ASSERT (OptCount >0);
|
ASSERT (OptCount > 0);
|
||||||
|
|
||||||
Retransmit = AllocateZeroPool (sizeof (EFI_DHCP6_RETRANSMISSION));
|
Retransmit = AllocateZeroPool (sizeof (EFI_DHCP6_RETRANSMISSION));
|
||||||
if (Retransmit == NULL) {
|
if (Retransmit == NULL) {
|
||||||
@ -980,11 +992,12 @@ HttpBootDhcp6Sarr (
|
|||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Initialize the record fields for DHCPv6 offer in private data.
|
// Initialize the record fields for DHCPv6 offer in private data.
|
||||||
//
|
//
|
||||||
Private->OfferNum = 0;
|
Private->OfferNum = 0;
|
||||||
Private->SelectIndex = 0;
|
Private->SelectIndex = 0;
|
||||||
ZeroMem (Private->OfferCount, sizeof (Private->OfferCount));
|
ZeroMem (Private->OfferCount, sizeof (Private->OfferCount));
|
||||||
ZeroMem (Private->OfferIndex, sizeof (Private->OfferIndex));
|
ZeroMem (Private->OfferIndex, sizeof (Private->OfferIndex));
|
||||||
|
|
||||||
@ -1021,12 +1034,11 @@ ON_EXIT:
|
|||||||
if (Mode.ClientId != NULL) {
|
if (Mode.ClientId != NULL) {
|
||||||
FreePool (Mode.ClientId);
|
FreePool (Mode.ClientId);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Mode.Ia != NULL) {
|
if (Mode.Ia != NULL) {
|
||||||
FreePool (Mode.Ia);
|
FreePool (Mode.Ia);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,82 +6,81 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
|
|
||||||
#ifndef __EFI_HTTP_BOOT_DHCP6_H__
|
#ifndef __EFI_HTTP_BOOT_DHCP6_H__
|
||||||
#define __EFI_HTTP_BOOT_DHCP6_H__
|
#define __EFI_HTTP_BOOT_DHCP6_H__
|
||||||
|
|
||||||
#define HTTP_BOOT_OFFER_MAX_NUM 16
|
#define HTTP_BOOT_OFFER_MAX_NUM 16
|
||||||
#define HTTP_BOOT_DHCP6_OPTION_MAX_NUM 16
|
#define HTTP_BOOT_DHCP6_OPTION_MAX_NUM 16
|
||||||
#define HTTP_BOOT_DHCP6_OPTION_MAX_SIZE 312
|
#define HTTP_BOOT_DHCP6_OPTION_MAX_SIZE 312
|
||||||
#define HTTP_BOOT_DHCP6_PACKET_MAX_SIZE 1472
|
#define HTTP_BOOT_DHCP6_PACKET_MAX_SIZE 1472
|
||||||
#define HTTP_BOOT_IP6_ROUTE_TABLE_TIMEOUT 10
|
#define HTTP_BOOT_IP6_ROUTE_TABLE_TIMEOUT 10
|
||||||
#define HTTP_BOOT_DEFAULT_HOPLIMIT 64
|
#define HTTP_BOOT_DEFAULT_HOPLIMIT 64
|
||||||
#define HTTP_BOOT_DEFAULT_LIFETIME 50000
|
#define HTTP_BOOT_DEFAULT_LIFETIME 50000
|
||||||
|
|
||||||
#define HTTP_BOOT_DHCP6_ENTERPRISE_NUM 343 // TODO: IANA TBD: temporarily using Intel's
|
#define HTTP_BOOT_DHCP6_ENTERPRISE_NUM 343 // TODO: IANA TBD: temporarily using Intel's
|
||||||
#define HTTP_BOOT_DHCP6_MAX_BOOT_FILE_SIZE 65535 // It's a limitation of bit length, 65535*512 bytes.
|
#define HTTP_BOOT_DHCP6_MAX_BOOT_FILE_SIZE 65535 // It's a limitation of bit length, 65535*512 bytes.
|
||||||
|
|
||||||
#define HTTP_BOOT_DHCP6_IDX_IA_NA 0
|
#define HTTP_BOOT_DHCP6_IDX_IA_NA 0
|
||||||
#define HTTP_BOOT_DHCP6_IDX_BOOT_FILE_URL 1
|
#define HTTP_BOOT_DHCP6_IDX_BOOT_FILE_URL 1
|
||||||
#define HTTP_BOOT_DHCP6_IDX_BOOT_FILE_PARAM 2
|
#define HTTP_BOOT_DHCP6_IDX_BOOT_FILE_PARAM 2
|
||||||
#define HTTP_BOOT_DHCP6_IDX_VENDOR_CLASS 3
|
#define HTTP_BOOT_DHCP6_IDX_VENDOR_CLASS 3
|
||||||
#define HTTP_BOOT_DHCP6_IDX_DNS_SERVER 4
|
#define HTTP_BOOT_DHCP6_IDX_DNS_SERVER 4
|
||||||
#define HTTP_BOOT_DHCP6_IDX_MAX 5
|
#define HTTP_BOOT_DHCP6_IDX_MAX 5
|
||||||
|
|
||||||
#pragma pack(1)
|
#pragma pack(1)
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINT16 OpCode[256];
|
UINT16 OpCode[256];
|
||||||
} HTTP_BOOT_DHCP6_OPTION_ORO;
|
} HTTP_BOOT_DHCP6_OPTION_ORO;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINT8 Type;
|
UINT8 Type;
|
||||||
UINT8 MajorVer;
|
UINT8 MajorVer;
|
||||||
UINT8 MinorVer;
|
UINT8 MinorVer;
|
||||||
} HTTP_BOOT_DHCP6_OPTION_UNDI;
|
} HTTP_BOOT_DHCP6_OPTION_UNDI;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINT16 Type;
|
UINT16 Type;
|
||||||
} HTTP_BOOT_DHCP6_OPTION_ARCH;
|
} HTTP_BOOT_DHCP6_OPTION_ARCH;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINT8 ClassIdentifier[11];
|
UINT8 ClassIdentifier[11];
|
||||||
UINT8 ArchitecturePrefix[5];
|
UINT8 ArchitecturePrefix[5];
|
||||||
UINT8 ArchitectureType[5];
|
UINT8 ArchitectureType[5];
|
||||||
UINT8 Lit3[1];
|
UINT8 Lit3[1];
|
||||||
UINT8 InterfaceName[4];
|
UINT8 InterfaceName[4];
|
||||||
UINT8 Lit4[1];
|
UINT8 Lit4[1];
|
||||||
UINT8 UndiMajor[3];
|
UINT8 UndiMajor[3];
|
||||||
UINT8 UndiMinor[3];
|
UINT8 UndiMinor[3];
|
||||||
} HTTP_BOOT_CLASS_ID;
|
} HTTP_BOOT_CLASS_ID;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINT32 Vendor;
|
UINT32 Vendor;
|
||||||
UINT16 ClassLen;
|
UINT16 ClassLen;
|
||||||
HTTP_BOOT_CLASS_ID ClassId;
|
HTTP_BOOT_CLASS_ID ClassId;
|
||||||
} HTTP_BOOT_DHCP6_OPTION_VENDOR_CLASS;
|
} HTTP_BOOT_DHCP6_OPTION_VENDOR_CLASS;
|
||||||
|
|
||||||
#pragma pack()
|
#pragma pack()
|
||||||
|
|
||||||
typedef union {
|
typedef union {
|
||||||
HTTP_BOOT_DHCP6_OPTION_ORO *Oro;
|
HTTP_BOOT_DHCP6_OPTION_ORO *Oro;
|
||||||
HTTP_BOOT_DHCP6_OPTION_UNDI *Undi;
|
HTTP_BOOT_DHCP6_OPTION_UNDI *Undi;
|
||||||
HTTP_BOOT_DHCP6_OPTION_ARCH *Arch;
|
HTTP_BOOT_DHCP6_OPTION_ARCH *Arch;
|
||||||
HTTP_BOOT_DHCP6_OPTION_VENDOR_CLASS *VendorClass;
|
HTTP_BOOT_DHCP6_OPTION_VENDOR_CLASS *VendorClass;
|
||||||
} HTTP_BOOT_DHCP6_OPTION_ENTRY;
|
} HTTP_BOOT_DHCP6_OPTION_ENTRY;
|
||||||
|
|
||||||
#define HTTP_CACHED_DHCP6_PACKET_MAX_SIZE (OFFSET_OF (EFI_DHCP6_PACKET, Dhcp6) + HTTP_BOOT_DHCP6_PACKET_MAX_SIZE)
|
#define HTTP_CACHED_DHCP6_PACKET_MAX_SIZE (OFFSET_OF (EFI_DHCP6_PACKET, Dhcp6) + HTTP_BOOT_DHCP6_PACKET_MAX_SIZE)
|
||||||
|
|
||||||
typedef union {
|
typedef union {
|
||||||
EFI_DHCP6_PACKET Offer;
|
EFI_DHCP6_PACKET Offer;
|
||||||
EFI_DHCP6_PACKET Ack;
|
EFI_DHCP6_PACKET Ack;
|
||||||
UINT8 Buffer[HTTP_CACHED_DHCP6_PACKET_MAX_SIZE];
|
UINT8 Buffer[HTTP_CACHED_DHCP6_PACKET_MAX_SIZE];
|
||||||
} HTTP_BOOT_DHCP6_PACKET;
|
} HTTP_BOOT_DHCP6_PACKET;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
HTTP_BOOT_DHCP6_PACKET Packet;
|
HTTP_BOOT_DHCP6_PACKET Packet;
|
||||||
HTTP_BOOT_OFFER_TYPE OfferType;
|
HTTP_BOOT_OFFER_TYPE OfferType;
|
||||||
EFI_DHCP6_PACKET_OPTION *OptList[HTTP_BOOT_DHCP6_IDX_MAX];
|
EFI_DHCP6_PACKET_OPTION *OptList[HTTP_BOOT_DHCP6_IDX_MAX];
|
||||||
VOID *UriParser;
|
VOID *UriParser;
|
||||||
} HTTP_BOOT_DHCP6_PACKET_CACHE;
|
} HTTP_BOOT_DHCP6_PACKET_CACHE;
|
||||||
|
|
||||||
#define GET_NEXT_DHCP6_OPTION(Opt) \
|
#define GET_NEXT_DHCP6_OPTION(Opt) \
|
||||||
@ -102,7 +101,7 @@ typedef struct {
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpBootDhcp6Sarr (
|
HttpBootDhcp6Sarr (
|
||||||
IN HTTP_BOOT_PRIVATE_DATA *Private
|
IN HTTP_BOOT_PRIVATE_DATA *Private
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -116,7 +115,7 @@ HttpBootDhcp6Sarr (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpBootSetIp6Policy (
|
HttpBootSetIp6Policy (
|
||||||
IN HTTP_BOOT_PRIVATE_DATA *Private
|
IN HTTP_BOOT_PRIVATE_DATA *Private
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -133,9 +132,9 @@ HttpBootSetIp6Policy (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpBootSetIp6Dns (
|
HttpBootSetIp6Dns (
|
||||||
IN HTTP_BOOT_PRIVATE_DATA *Private,
|
IN HTTP_BOOT_PRIVATE_DATA *Private,
|
||||||
IN UINTN DataLength,
|
IN UINTN DataLength,
|
||||||
IN VOID *DnsServerData
|
IN VOID *DnsServerData
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -149,7 +148,7 @@ HttpBootSetIp6Dns (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpBootSetIp6Gateway (
|
HttpBootSetIp6Gateway (
|
||||||
IN HTTP_BOOT_PRIVATE_DATA *Private
|
IN HTTP_BOOT_PRIVATE_DATA *Private
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -163,7 +162,7 @@ HttpBootSetIp6Gateway (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpBootSetIp6Address (
|
HttpBootSetIp6Address (
|
||||||
IN HTTP_BOOT_PRIVATE_DATA *Private
|
IN HTTP_BOOT_PRIVATE_DATA *Private
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -11,7 +11,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
///
|
///
|
||||||
/// Driver Binding Protocol instance
|
/// Driver Binding Protocol instance
|
||||||
///
|
///
|
||||||
EFI_DRIVER_BINDING_PROTOCOL gHttpBootIp4DxeDriverBinding = {
|
EFI_DRIVER_BINDING_PROTOCOL gHttpBootIp4DxeDriverBinding = {
|
||||||
HttpBootIp4DxeDriverBindingSupported,
|
HttpBootIp4DxeDriverBindingSupported,
|
||||||
HttpBootIp4DxeDriverBindingStart,
|
HttpBootIp4DxeDriverBindingStart,
|
||||||
HttpBootIp4DxeDriverBindingStop,
|
HttpBootIp4DxeDriverBindingStop,
|
||||||
@ -20,7 +20,7 @@ EFI_DRIVER_BINDING_PROTOCOL gHttpBootIp4DxeDriverBinding = {
|
|||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
EFI_DRIVER_BINDING_PROTOCOL gHttpBootIp6DxeDriverBinding = {
|
EFI_DRIVER_BINDING_PROTOCOL gHttpBootIp6DxeDriverBinding = {
|
||||||
HttpBootIp6DxeDriverBindingSupported,
|
HttpBootIp6DxeDriverBindingSupported,
|
||||||
HttpBootIp6DxeDriverBindingStart,
|
HttpBootIp6DxeDriverBindingStart,
|
||||||
HttpBootIp6DxeDriverBindingStop,
|
HttpBootIp6DxeDriverBindingStop,
|
||||||
@ -29,8 +29,6 @@ EFI_DRIVER_BINDING_PROTOCOL gHttpBootIp6DxeDriverBinding = {
|
|||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Check whether UNDI protocol supports IPv6.
|
Check whether UNDI protocol supports IPv6.
|
||||||
|
|
||||||
@ -43,19 +41,19 @@ EFI_DRIVER_BINDING_PROTOCOL gHttpBootIp6DxeDriverBinding = {
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpBootCheckIpv6Support (
|
HttpBootCheckIpv6Support (
|
||||||
IN HTTP_BOOT_PRIVATE_DATA *Private,
|
IN HTTP_BOOT_PRIVATE_DATA *Private,
|
||||||
OUT BOOLEAN *Ipv6Support
|
OUT BOOLEAN *Ipv6Support
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_HANDLE Handle;
|
EFI_HANDLE Handle;
|
||||||
EFI_ADAPTER_INFORMATION_PROTOCOL *Aip;
|
EFI_ADAPTER_INFORMATION_PROTOCOL *Aip;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_GUID *InfoTypesBuffer;
|
EFI_GUID *InfoTypesBuffer;
|
||||||
UINTN InfoTypeBufferCount;
|
UINTN InfoTypeBufferCount;
|
||||||
UINTN TypeIndex;
|
UINTN TypeIndex;
|
||||||
BOOLEAN Supported;
|
BOOLEAN Supported;
|
||||||
VOID *InfoBlock;
|
VOID *InfoBlock;
|
||||||
UINTN InfoBlockSize;
|
UINTN InfoBlockSize;
|
||||||
|
|
||||||
ASSERT (Private != NULL && Ipv6Support != NULL);
|
ASSERT (Private != NULL && Ipv6Support != NULL);
|
||||||
|
|
||||||
@ -79,16 +77,16 @@ HttpBootCheckIpv6Support (
|
|||||||
Status = gBS->HandleProtocol (
|
Status = gBS->HandleProtocol (
|
||||||
Handle,
|
Handle,
|
||||||
&gEfiAdapterInformationProtocolGuid,
|
&gEfiAdapterInformationProtocolGuid,
|
||||||
(VOID *) &Aip
|
(VOID *)&Aip
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status) || Aip == NULL) {
|
if (EFI_ERROR (Status) || (Aip == NULL)) {
|
||||||
return EFI_NOT_FOUND;
|
return EFI_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
InfoTypesBuffer = NULL;
|
InfoTypesBuffer = NULL;
|
||||||
InfoTypeBufferCount = 0;
|
InfoTypeBufferCount = 0;
|
||||||
Status = Aip->GetSupportedTypes (Aip, &InfoTypesBuffer, &InfoTypeBufferCount);
|
Status = Aip->GetSupportedTypes (Aip, &InfoTypesBuffer, &InfoTypeBufferCount);
|
||||||
if (EFI_ERROR (Status) || InfoTypesBuffer == NULL) {
|
if (EFI_ERROR (Status) || (InfoTypesBuffer == NULL)) {
|
||||||
FreePool (InfoTypesBuffer);
|
FreePool (InfoTypesBuffer);
|
||||||
return EFI_NOT_FOUND;
|
return EFI_NOT_FOUND;
|
||||||
}
|
}
|
||||||
@ -111,13 +109,13 @@ HttpBootCheckIpv6Support (
|
|||||||
//
|
//
|
||||||
InfoBlock = NULL;
|
InfoBlock = NULL;
|
||||||
InfoBlockSize = 0;
|
InfoBlockSize = 0;
|
||||||
Status = Aip->GetInformation (Aip, &gEfiAdapterInfoUndiIpv6SupportGuid, &InfoBlock, &InfoBlockSize);
|
Status = Aip->GetInformation (Aip, &gEfiAdapterInfoUndiIpv6SupportGuid, &InfoBlock, &InfoBlockSize);
|
||||||
if (EFI_ERROR (Status) || InfoBlock == NULL) {
|
if (EFI_ERROR (Status) || (InfoBlock == NULL)) {
|
||||||
FreePool (InfoBlock);
|
FreePool (InfoBlock);
|
||||||
return EFI_NOT_FOUND;
|
return EFI_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
*Ipv6Support = ((EFI_ADAPTER_INFO_UNDI_IPV6_SUPPORT *) InfoBlock)->Ipv6Support;
|
*Ipv6Support = ((EFI_ADAPTER_INFO_UNDI_IPV6_SUPPORT *)InfoBlock)->Ipv6Support;
|
||||||
FreePool (InfoBlock);
|
FreePool (InfoBlock);
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
@ -155,13 +153,12 @@ HttpBootDestroyIp4Children (
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Private->Ip6Nic == NULL && Private->HttpCreated) {
|
if ((Private->Ip6Nic == NULL) && Private->HttpCreated) {
|
||||||
HttpIoDestroyIo (&Private->HttpIo);
|
HttpIoDestroyIo (&Private->HttpIo);
|
||||||
Private->HttpCreated = FALSE;
|
Private->HttpCreated = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Private->Ip4Nic != NULL) {
|
if (Private->Ip4Nic != NULL) {
|
||||||
|
|
||||||
gBS->CloseProtocol (
|
gBS->CloseProtocol (
|
||||||
Private->Controller,
|
Private->Controller,
|
||||||
&gEfiCallerIdGuid,
|
&gEfiCallerIdGuid,
|
||||||
@ -180,7 +177,6 @@ HttpBootDestroyIp4Children (
|
|||||||
FreePool (Private->Ip4Nic);
|
FreePool (Private->Ip4Nic);
|
||||||
Private->Ip4Nic = NULL;
|
Private->Ip4Nic = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -231,13 +227,12 @@ HttpBootDestroyIp6Children (
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Private->Ip4Nic == NULL && Private->HttpCreated) {
|
if ((Private->Ip4Nic == NULL) && Private->HttpCreated) {
|
||||||
HttpIoDestroyIo(&Private->HttpIo);
|
HttpIoDestroyIo (&Private->HttpIo);
|
||||||
Private->HttpCreated = FALSE;
|
Private->HttpCreated = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Private->Ip6Nic != NULL) {
|
if (Private->Ip6Nic != NULL) {
|
||||||
|
|
||||||
gBS->CloseProtocol (
|
gBS->CloseProtocol (
|
||||||
Private->Controller,
|
Private->Controller,
|
||||||
&gEfiCallerIdGuid,
|
&gEfiCallerIdGuid,
|
||||||
@ -308,7 +303,7 @@ HttpBootIp4DxeDriverBindingSupported (
|
|||||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
|
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Try to open the DHCP4, HTTP4 and Device Path protocol.
|
// Try to open the DHCP4, HTTP4 and Device Path protocol.
|
||||||
@ -349,7 +344,6 @@ HttpBootIp4DxeDriverBindingSupported (
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Starts a device controller or a bus controller.
|
Starts a device controller or a bus controller.
|
||||||
|
|
||||||
@ -393,26 +387,26 @@ HttpBootIp4DxeDriverBindingStart (
|
|||||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
|
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
HTTP_BOOT_PRIVATE_DATA *Private;
|
HTTP_BOOT_PRIVATE_DATA *Private;
|
||||||
EFI_DEV_PATH *Node;
|
EFI_DEV_PATH *Node;
|
||||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||||
UINT32 *Id;
|
UINT32 *Id;
|
||||||
BOOLEAN FirstStart;
|
BOOLEAN FirstStart;
|
||||||
|
|
||||||
FirstStart = FALSE;
|
FirstStart = FALSE;
|
||||||
|
|
||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
&gEfiCallerIdGuid,
|
&gEfiCallerIdGuid,
|
||||||
(VOID **) &Id,
|
(VOID **)&Id,
|
||||||
This->DriverBindingHandle,
|
This->DriverBindingHandle,
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!EFI_ERROR (Status)) {
|
if (!EFI_ERROR (Status)) {
|
||||||
Private = HTTP_BOOT_PRIVATE_DATA_FROM_ID(Id);
|
Private = HTTP_BOOT_PRIVATE_DATA_FROM_ID (Id);
|
||||||
} else {
|
} else {
|
||||||
FirstStart = TRUE;
|
FirstStart = TRUE;
|
||||||
|
|
||||||
@ -423,7 +417,8 @@ HttpBootIp4DxeDriverBindingStart (
|
|||||||
if (Private == NULL) {
|
if (Private == NULL) {
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
Private->Signature = HTTP_BOOT_PRIVATE_DATA_SIGNATURE;
|
|
||||||
|
Private->Signature = HTTP_BOOT_PRIVATE_DATA_SIGNATURE;
|
||||||
Private->Controller = ControllerHandle;
|
Private->Controller = ControllerHandle;
|
||||||
InitializeListHead (&Private->CacheList);
|
InitializeListHead (&Private->CacheList);
|
||||||
//
|
//
|
||||||
@ -432,7 +427,7 @@ HttpBootIp4DxeDriverBindingStart (
|
|||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
&gEfiNetworkInterfaceIdentifierProtocolGuid_31,
|
&gEfiNetworkInterfaceIdentifierProtocolGuid_31,
|
||||||
(VOID **) &Private->Nii,
|
(VOID **)&Private->Nii,
|
||||||
This->DriverBindingHandle,
|
This->DriverBindingHandle,
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||||
@ -447,7 +442,7 @@ HttpBootIp4DxeDriverBindingStart (
|
|||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
&gEfiDevicePathProtocolGuid,
|
&gEfiDevicePathProtocolGuid,
|
||||||
(VOID **) &Private->ParentDevicePath,
|
(VOID **)&Private->ParentDevicePath,
|
||||||
This->DriverBindingHandle,
|
This->DriverBindingHandle,
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||||
@ -477,7 +472,6 @@ HttpBootIp4DxeDriverBindingStart (
|
|||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
goto ON_ERROR;
|
goto ON_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Private->Ip4Nic != NULL) {
|
if (Private->Ip4Nic != NULL) {
|
||||||
@ -492,6 +486,7 @@ HttpBootIp4DxeDriverBindingStart (
|
|||||||
Status = EFI_OUT_OF_RESOURCES;
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
goto ON_ERROR;
|
goto ON_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
Private->Ip4Nic->Private = Private;
|
Private->Ip4Nic->Private = Private;
|
||||||
Private->Ip4Nic->ImageHandle = This->DriverBindingHandle;
|
Private->Ip4Nic->ImageHandle = This->DriverBindingHandle;
|
||||||
Private->Ip4Nic->Signature = HTTP_BOOT_VIRTUAL_NIC_SIGNATURE;
|
Private->Ip4Nic->Signature = HTTP_BOOT_VIRTUAL_NIC_SIGNATURE;
|
||||||
@ -512,7 +507,7 @@ HttpBootIp4DxeDriverBindingStart (
|
|||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
Private->Dhcp4Child,
|
Private->Dhcp4Child,
|
||||||
&gEfiDhcp4ProtocolGuid,
|
&gEfiDhcp4ProtocolGuid,
|
||||||
(VOID **) &Private->Dhcp4,
|
(VOID **)&Private->Dhcp4,
|
||||||
This->DriverBindingHandle,
|
This->DriverBindingHandle,
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||||
@ -527,7 +522,7 @@ HttpBootIp4DxeDriverBindingStart (
|
|||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
&gEfiIp4Config2ProtocolGuid,
|
&gEfiIp4Config2ProtocolGuid,
|
||||||
(VOID **) &Private->Ip4Config2,
|
(VOID **)&Private->Ip4Config2,
|
||||||
This->DriverBindingHandle,
|
This->DriverBindingHandle,
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||||
@ -544,11 +539,12 @@ HttpBootIp4DxeDriverBindingStart (
|
|||||||
Status = EFI_OUT_OF_RESOURCES;
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
goto ON_ERROR;
|
goto ON_ERROR;
|
||||||
}
|
}
|
||||||
Node->Ipv4.Header.Type = MESSAGING_DEVICE_PATH;
|
|
||||||
|
Node->Ipv4.Header.Type = MESSAGING_DEVICE_PATH;
|
||||||
Node->Ipv4.Header.SubType = MSG_IPv4_DP;
|
Node->Ipv4.Header.SubType = MSG_IPv4_DP;
|
||||||
SetDevicePathNodeLength (Node, sizeof (IPv4_DEVICE_PATH));
|
SetDevicePathNodeLength (Node, sizeof (IPv4_DEVICE_PATH));
|
||||||
Node->Ipv4.StaticIpAddress = FALSE;
|
Node->Ipv4.StaticIpAddress = FALSE;
|
||||||
DevicePath = AppendDevicePathNode (Private->ParentDevicePath, (EFI_DEVICE_PATH_PROTOCOL*) Node);
|
DevicePath = AppendDevicePathNode (Private->ParentDevicePath, (EFI_DEVICE_PATH_PROTOCOL *)Node);
|
||||||
FreePool (Node);
|
FreePool (Node);
|
||||||
if (DevicePath == NULL) {
|
if (DevicePath == NULL) {
|
||||||
Status = EFI_OUT_OF_RESOURCES;
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
@ -563,10 +559,11 @@ HttpBootIp4DxeDriverBindingStart (
|
|||||||
Status = EFI_OUT_OF_RESOURCES;
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
goto ON_ERROR;
|
goto ON_ERROR;
|
||||||
}
|
}
|
||||||
Node->DevPath.Type = MESSAGING_DEVICE_PATH;
|
|
||||||
|
Node->DevPath.Type = MESSAGING_DEVICE_PATH;
|
||||||
Node->DevPath.SubType = MSG_URI_DP;
|
Node->DevPath.SubType = MSG_URI_DP;
|
||||||
SetDevicePathNodeLength (Node, sizeof (EFI_DEVICE_PATH_PROTOCOL));
|
SetDevicePathNodeLength (Node, sizeof (EFI_DEVICE_PATH_PROTOCOL));
|
||||||
Private->Ip4Nic->DevicePath = AppendDevicePathNode (DevicePath, (EFI_DEVICE_PATH_PROTOCOL*) Node);
|
Private->Ip4Nic->DevicePath = AppendDevicePathNode (DevicePath, (EFI_DEVICE_PATH_PROTOCOL *)Node);
|
||||||
FreePool (Node);
|
FreePool (Node);
|
||||||
FreePool (DevicePath);
|
FreePool (DevicePath);
|
||||||
if (Private->Ip4Nic->DevicePath == NULL) {
|
if (Private->Ip4Nic->DevicePath == NULL) {
|
||||||
@ -597,7 +594,7 @@ HttpBootIp4DxeDriverBindingStart (
|
|||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
&gEfiCallerIdGuid,
|
&gEfiCallerIdGuid,
|
||||||
(VOID **) &Id,
|
(VOID **)&Id,
|
||||||
This->DriverBindingHandle,
|
This->DriverBindingHandle,
|
||||||
Private->Ip4Nic->Controller,
|
Private->Ip4Nic->Controller,
|
||||||
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
||||||
@ -629,7 +626,6 @@ ON_ERROR:
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Stops a device controller or a bus controller.
|
Stops a device controller or a bus controller.
|
||||||
|
|
||||||
@ -665,11 +661,11 @@ HttpBootIp4DxeDriverBindingStop (
|
|||||||
IN EFI_HANDLE *ChildHandleBuffer OPTIONAL
|
IN EFI_HANDLE *ChildHandleBuffer OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_LOAD_FILE_PROTOCOL *LoadFile;
|
EFI_LOAD_FILE_PROTOCOL *LoadFile;
|
||||||
HTTP_BOOT_PRIVATE_DATA *Private;
|
HTTP_BOOT_PRIVATE_DATA *Private;
|
||||||
EFI_HANDLE NicHandle;
|
EFI_HANDLE NicHandle;
|
||||||
UINT32 *Id;
|
UINT32 *Id;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Try to get the Load File Protocol from the controller handle.
|
// Try to get the Load File Protocol from the controller handle.
|
||||||
@ -677,7 +673,7 @@ HttpBootIp4DxeDriverBindingStop (
|
|||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
&gEfiLoadFileProtocolGuid,
|
&gEfiLoadFileProtocolGuid,
|
||||||
(VOID **) &LoadFile,
|
(VOID **)&LoadFile,
|
||||||
This->DriverBindingHandle,
|
This->DriverBindingHandle,
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||||
@ -697,7 +693,7 @@ HttpBootIp4DxeDriverBindingStop (
|
|||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
NicHandle,
|
NicHandle,
|
||||||
&gEfiCallerIdGuid,
|
&gEfiCallerIdGuid,
|
||||||
(VOID **) &Id,
|
(VOID **)&Id,
|
||||||
This->DriverBindingHandle,
|
This->DriverBindingHandle,
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||||
@ -705,9 +701,10 @@ HttpBootIp4DxeDriverBindingStop (
|
|||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
Private = HTTP_BOOT_PRIVATE_DATA_FROM_ID (Id);
|
Private = HTTP_BOOT_PRIVATE_DATA_FROM_ID (Id);
|
||||||
} else {
|
} else {
|
||||||
Private = HTTP_BOOT_PRIVATE_DATA_FROM_LOADFILE (LoadFile);
|
Private = HTTP_BOOT_PRIVATE_DATA_FROM_LOADFILE (LoadFile);
|
||||||
NicHandle = Private->Controller;
|
NicHandle = Private->Controller;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -715,7 +712,7 @@ HttpBootIp4DxeDriverBindingStop (
|
|||||||
// Disable the HTTP boot function.
|
// Disable the HTTP boot function.
|
||||||
//
|
//
|
||||||
Status = HttpBootStop (Private);
|
Status = HttpBootStop (Private);
|
||||||
if (Status != EFI_SUCCESS && Status != EFI_NOT_STARTED) {
|
if ((Status != EFI_SUCCESS) && (Status != EFI_NOT_STARTED)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -724,7 +721,7 @@ HttpBootIp4DxeDriverBindingStop (
|
|||||||
//
|
//
|
||||||
HttpBootDestroyIp4Children (This, Private);
|
HttpBootDestroyIp4Children (This, Private);
|
||||||
|
|
||||||
if (Private->Ip4Nic == NULL && Private->Ip6Nic == NULL) {
|
if ((Private->Ip4Nic == NULL) && (Private->Ip6Nic == NULL)) {
|
||||||
//
|
//
|
||||||
// Release the cached data.
|
// Release the cached data.
|
||||||
//
|
//
|
||||||
@ -741,7 +738,6 @@ HttpBootIp4DxeDriverBindingStop (
|
|||||||
&Private->Id
|
&Private->Id
|
||||||
);
|
);
|
||||||
FreePool (Private);
|
FreePool (Private);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
@ -797,7 +793,7 @@ HttpBootIp6DxeDriverBindingSupported (
|
|||||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
|
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Try to open the DHCP6, HTTP and Device Path protocol.
|
// Try to open the DHCP6, HTTP and Device Path protocol.
|
||||||
@ -836,7 +832,6 @@ HttpBootIp6DxeDriverBindingSupported (
|
|||||||
);
|
);
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -882,27 +877,27 @@ HttpBootIp6DxeDriverBindingStart (
|
|||||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
|
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
HTTP_BOOT_PRIVATE_DATA *Private;
|
HTTP_BOOT_PRIVATE_DATA *Private;
|
||||||
EFI_DEV_PATH *Node;
|
EFI_DEV_PATH *Node;
|
||||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||||
UINT32 *Id;
|
UINT32 *Id;
|
||||||
BOOLEAN Ipv6Available;
|
BOOLEAN Ipv6Available;
|
||||||
BOOLEAN FirstStart;
|
BOOLEAN FirstStart;
|
||||||
|
|
||||||
FirstStart = FALSE;
|
FirstStart = FALSE;
|
||||||
|
|
||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
&gEfiCallerIdGuid,
|
&gEfiCallerIdGuid,
|
||||||
(VOID **) &Id,
|
(VOID **)&Id,
|
||||||
This->DriverBindingHandle,
|
This->DriverBindingHandle,
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!EFI_ERROR (Status)) {
|
if (!EFI_ERROR (Status)) {
|
||||||
Private = HTTP_BOOT_PRIVATE_DATA_FROM_ID(Id);
|
Private = HTTP_BOOT_PRIVATE_DATA_FROM_ID (Id);
|
||||||
} else {
|
} else {
|
||||||
FirstStart = TRUE;
|
FirstStart = TRUE;
|
||||||
|
|
||||||
@ -913,7 +908,8 @@ HttpBootIp6DxeDriverBindingStart (
|
|||||||
if (Private == NULL) {
|
if (Private == NULL) {
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
Private->Signature = HTTP_BOOT_PRIVATE_DATA_SIGNATURE;
|
|
||||||
|
Private->Signature = HTTP_BOOT_PRIVATE_DATA_SIGNATURE;
|
||||||
Private->Controller = ControllerHandle;
|
Private->Controller = ControllerHandle;
|
||||||
InitializeListHead (&Private->CacheList);
|
InitializeListHead (&Private->CacheList);
|
||||||
//
|
//
|
||||||
@ -922,7 +918,7 @@ HttpBootIp6DxeDriverBindingStart (
|
|||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
&gEfiNetworkInterfaceIdentifierProtocolGuid_31,
|
&gEfiNetworkInterfaceIdentifierProtocolGuid_31,
|
||||||
(VOID **) &Private->Nii,
|
(VOID **)&Private->Nii,
|
||||||
This->DriverBindingHandle,
|
This->DriverBindingHandle,
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||||
@ -937,7 +933,7 @@ HttpBootIp6DxeDriverBindingStart (
|
|||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
&gEfiDevicePathProtocolGuid,
|
&gEfiDevicePathProtocolGuid,
|
||||||
(VOID **) &Private->ParentDevicePath,
|
(VOID **)&Private->ParentDevicePath,
|
||||||
This->DriverBindingHandle,
|
This->DriverBindingHandle,
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||||
@ -967,7 +963,6 @@ HttpBootIp6DxeDriverBindingStart (
|
|||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
goto ON_ERROR;
|
goto ON_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -999,6 +994,7 @@ HttpBootIp6DxeDriverBindingStart (
|
|||||||
Status = EFI_OUT_OF_RESOURCES;
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
goto ON_ERROR;
|
goto ON_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
Private->Ip6Nic->Private = Private;
|
Private->Ip6Nic->Private = Private;
|
||||||
Private->Ip6Nic->ImageHandle = This->DriverBindingHandle;
|
Private->Ip6Nic->ImageHandle = This->DriverBindingHandle;
|
||||||
Private->Ip6Nic->Signature = HTTP_BOOT_VIRTUAL_NIC_SIGNATURE;
|
Private->Ip6Nic->Signature = HTTP_BOOT_VIRTUAL_NIC_SIGNATURE;
|
||||||
@ -1018,7 +1014,7 @@ HttpBootIp6DxeDriverBindingStart (
|
|||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
Private->Dhcp6Child,
|
Private->Dhcp6Child,
|
||||||
&gEfiDhcp6ProtocolGuid,
|
&gEfiDhcp6ProtocolGuid,
|
||||||
(VOID **) &Private->Dhcp6,
|
(VOID **)&Private->Dhcp6,
|
||||||
This->DriverBindingHandle,
|
This->DriverBindingHandle,
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||||
@ -1031,11 +1027,11 @@ HttpBootIp6DxeDriverBindingStart (
|
|||||||
// Create Ip6 child and open Ip6 protocol for background ICMP packets.
|
// Create Ip6 child and open Ip6 protocol for background ICMP packets.
|
||||||
//
|
//
|
||||||
Status = NetLibCreateServiceChild (
|
Status = NetLibCreateServiceChild (
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
This->DriverBindingHandle,
|
This->DriverBindingHandle,
|
||||||
&gEfiIp6ServiceBindingProtocolGuid,
|
&gEfiIp6ServiceBindingProtocolGuid,
|
||||||
&Private->Ip6Child
|
&Private->Ip6Child
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
goto ON_ERROR;
|
goto ON_ERROR;
|
||||||
}
|
}
|
||||||
@ -1043,7 +1039,7 @@ HttpBootIp6DxeDriverBindingStart (
|
|||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
Private->Ip6Child,
|
Private->Ip6Child,
|
||||||
&gEfiIp6ProtocolGuid,
|
&gEfiIp6ProtocolGuid,
|
||||||
(VOID **) &Private->Ip6,
|
(VOID **)&Private->Ip6,
|
||||||
This->DriverBindingHandle,
|
This->DriverBindingHandle,
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||||
@ -1058,7 +1054,7 @@ HttpBootIp6DxeDriverBindingStart (
|
|||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
&gEfiIp6ConfigProtocolGuid,
|
&gEfiIp6ConfigProtocolGuid,
|
||||||
(VOID **) &Private->Ip6Config,
|
(VOID **)&Private->Ip6Config,
|
||||||
This->DriverBindingHandle,
|
This->DriverBindingHandle,
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||||
@ -1075,12 +1071,13 @@ HttpBootIp6DxeDriverBindingStart (
|
|||||||
Status = EFI_OUT_OF_RESOURCES;
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
goto ON_ERROR;
|
goto ON_ERROR;
|
||||||
}
|
}
|
||||||
Node->Ipv6.Header.Type = MESSAGING_DEVICE_PATH;
|
|
||||||
|
Node->Ipv6.Header.Type = MESSAGING_DEVICE_PATH;
|
||||||
Node->Ipv6.Header.SubType = MSG_IPv6_DP;
|
Node->Ipv6.Header.SubType = MSG_IPv6_DP;
|
||||||
Node->Ipv6.PrefixLength = IP6_PREFIX_LENGTH;
|
Node->Ipv6.PrefixLength = IP6_PREFIX_LENGTH;
|
||||||
SetDevicePathNodeLength (Node, sizeof (IPv6_DEVICE_PATH));
|
SetDevicePathNodeLength (Node, sizeof (IPv6_DEVICE_PATH));
|
||||||
DevicePath = AppendDevicePathNode(Private->ParentDevicePath, (EFI_DEVICE_PATH*) Node);
|
DevicePath = AppendDevicePathNode (Private->ParentDevicePath, (EFI_DEVICE_PATH *)Node);
|
||||||
FreePool(Node);
|
FreePool (Node);
|
||||||
if (DevicePath == NULL) {
|
if (DevicePath == NULL) {
|
||||||
Status = EFI_OUT_OF_RESOURCES;
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
goto ON_ERROR;
|
goto ON_ERROR;
|
||||||
@ -1094,10 +1091,11 @@ HttpBootIp6DxeDriverBindingStart (
|
|||||||
Status = EFI_OUT_OF_RESOURCES;
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
goto ON_ERROR;
|
goto ON_ERROR;
|
||||||
}
|
}
|
||||||
Node->DevPath.Type = MESSAGING_DEVICE_PATH;
|
|
||||||
|
Node->DevPath.Type = MESSAGING_DEVICE_PATH;
|
||||||
Node->DevPath.SubType = MSG_URI_DP;
|
Node->DevPath.SubType = MSG_URI_DP;
|
||||||
SetDevicePathNodeLength (Node, sizeof (EFI_DEVICE_PATH_PROTOCOL));
|
SetDevicePathNodeLength (Node, sizeof (EFI_DEVICE_PATH_PROTOCOL));
|
||||||
Private->Ip6Nic->DevicePath = AppendDevicePathNode (DevicePath, (EFI_DEVICE_PATH_PROTOCOL*) Node);
|
Private->Ip6Nic->DevicePath = AppendDevicePathNode (DevicePath, (EFI_DEVICE_PATH_PROTOCOL *)Node);
|
||||||
FreePool (Node);
|
FreePool (Node);
|
||||||
FreePool (DevicePath);
|
FreePool (DevicePath);
|
||||||
if (Private->Ip6Nic->DevicePath == NULL) {
|
if (Private->Ip6Nic->DevicePath == NULL) {
|
||||||
@ -1128,7 +1126,7 @@ HttpBootIp6DxeDriverBindingStart (
|
|||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
&gEfiCallerIdGuid,
|
&gEfiCallerIdGuid,
|
||||||
(VOID **) &Id,
|
(VOID **)&Id,
|
||||||
This->DriverBindingHandle,
|
This->DriverBindingHandle,
|
||||||
Private->Ip6Nic->Controller,
|
Private->Ip6Nic->Controller,
|
||||||
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
||||||
@ -1149,7 +1147,7 @@ ON_ERROR:
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
HttpBootDestroyIp6Children(This, Private);
|
HttpBootDestroyIp6Children (This, Private);
|
||||||
HttpBootConfigFormUnload (Private);
|
HttpBootConfigFormUnload (Private);
|
||||||
|
|
||||||
if (FirstStart) {
|
if (FirstStart) {
|
||||||
@ -1195,11 +1193,11 @@ HttpBootIp6DxeDriverBindingStop (
|
|||||||
IN EFI_HANDLE *ChildHandleBuffer OPTIONAL
|
IN EFI_HANDLE *ChildHandleBuffer OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_LOAD_FILE_PROTOCOL *LoadFile;
|
EFI_LOAD_FILE_PROTOCOL *LoadFile;
|
||||||
HTTP_BOOT_PRIVATE_DATA *Private;
|
HTTP_BOOT_PRIVATE_DATA *Private;
|
||||||
EFI_HANDLE NicHandle;
|
EFI_HANDLE NicHandle;
|
||||||
UINT32 *Id;
|
UINT32 *Id;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Try to get the Load File Protocol from the controller handle.
|
// Try to get the Load File Protocol from the controller handle.
|
||||||
@ -1207,7 +1205,7 @@ HttpBootIp6DxeDriverBindingStop (
|
|||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
&gEfiLoadFileProtocolGuid,
|
&gEfiLoadFileProtocolGuid,
|
||||||
(VOID **) &LoadFile,
|
(VOID **)&LoadFile,
|
||||||
This->DriverBindingHandle,
|
This->DriverBindingHandle,
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||||
@ -1227,7 +1225,7 @@ HttpBootIp6DxeDriverBindingStop (
|
|||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
NicHandle,
|
NicHandle,
|
||||||
&gEfiCallerIdGuid,
|
&gEfiCallerIdGuid,
|
||||||
(VOID **) &Id,
|
(VOID **)&Id,
|
||||||
This->DriverBindingHandle,
|
This->DriverBindingHandle,
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||||
@ -1235,9 +1233,10 @@ HttpBootIp6DxeDriverBindingStop (
|
|||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
Private = HTTP_BOOT_PRIVATE_DATA_FROM_ID (Id);
|
Private = HTTP_BOOT_PRIVATE_DATA_FROM_ID (Id);
|
||||||
} else {
|
} else {
|
||||||
Private = HTTP_BOOT_PRIVATE_DATA_FROM_LOADFILE (LoadFile);
|
Private = HTTP_BOOT_PRIVATE_DATA_FROM_LOADFILE (LoadFile);
|
||||||
NicHandle = Private->Controller;
|
NicHandle = Private->Controller;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1245,7 +1244,7 @@ HttpBootIp6DxeDriverBindingStop (
|
|||||||
// Disable the HTTP boot function.
|
// Disable the HTTP boot function.
|
||||||
//
|
//
|
||||||
Status = HttpBootStop (Private);
|
Status = HttpBootStop (Private);
|
||||||
if (Status != EFI_SUCCESS && Status != EFI_NOT_STARTED) {
|
if ((Status != EFI_SUCCESS) && (Status != EFI_NOT_STARTED)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1254,7 +1253,7 @@ HttpBootIp6DxeDriverBindingStop (
|
|||||||
//
|
//
|
||||||
HttpBootDestroyIp6Children (This, Private);
|
HttpBootDestroyIp6Children (This, Private);
|
||||||
|
|
||||||
if (Private->Ip4Nic == NULL && Private->Ip6Nic == NULL) {
|
if ((Private->Ip4Nic == NULL) && (Private->Ip6Nic == NULL)) {
|
||||||
//
|
//
|
||||||
// Release the cached data.
|
// Release the cached data.
|
||||||
//
|
//
|
||||||
@ -1271,11 +1270,11 @@ HttpBootIp6DxeDriverBindingStop (
|
|||||||
&Private->Id
|
&Private->Id
|
||||||
);
|
);
|
||||||
FreePool (Private);
|
FreePool (Private);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This is the declaration of an EFI image entry point. This entry point is
|
This is the declaration of an EFI image entry point. This entry point is
|
||||||
the same for UEFI Applications, UEFI OS Loaders, and UEFI Drivers including
|
the same for UEFI Applications, UEFI OS Loaders, and UEFI Drivers including
|
||||||
@ -1295,7 +1294,7 @@ HttpBootDxeDriverEntryPoint (
|
|||||||
IN EFI_SYSTEM_TABLE *SystemTable
|
IN EFI_SYSTEM_TABLE *SystemTable
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Install UEFI Driver Model protocol(s).
|
// Install UEFI Driver Model protocol(s).
|
||||||
@ -1321,12 +1320,12 @@ HttpBootDxeDriverEntryPoint (
|
|||||||
&gHttpBootDxeComponentName2
|
&gHttpBootDxeComponentName2
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
EfiLibUninstallDriverBindingComponentName2(
|
EfiLibUninstallDriverBindingComponentName2 (
|
||||||
&gHttpBootIp4DxeDriverBinding,
|
&gHttpBootIp4DxeDriverBinding,
|
||||||
&gHttpBootDxeComponentName,
|
&gHttpBootDxeComponentName,
|
||||||
&gHttpBootDxeComponentName2
|
&gHttpBootDxeComponentName2
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -75,22 +75,22 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
// Standard Media Types defined in
|
// Standard Media Types defined in
|
||||||
// http://www.iana.org/assignments/media-types
|
// http://www.iana.org/assignments/media-types
|
||||||
//
|
//
|
||||||
#define HTTP_CONTENT_TYPE_APP_EFI "application/efi"
|
#define HTTP_CONTENT_TYPE_APP_EFI "application/efi"
|
||||||
#define HTTP_CONTENT_TYPE_APP_IMG "application/vnd.efi-img"
|
#define HTTP_CONTENT_TYPE_APP_IMG "application/vnd.efi-img"
|
||||||
#define HTTP_CONTENT_TYPE_APP_ISO "application/vnd.efi-iso"
|
#define HTTP_CONTENT_TYPE_APP_ISO "application/vnd.efi-iso"
|
||||||
|
|
||||||
//
|
//
|
||||||
// Protocol instances
|
// Protocol instances
|
||||||
//
|
//
|
||||||
extern EFI_DRIVER_BINDING_PROTOCOL gHttpBootDxeDriverBinding;
|
extern EFI_DRIVER_BINDING_PROTOCOL gHttpBootDxeDriverBinding;
|
||||||
extern EFI_COMPONENT_NAME2_PROTOCOL gHttpBootDxeComponentName2;
|
extern EFI_COMPONENT_NAME2_PROTOCOL gHttpBootDxeComponentName2;
|
||||||
extern EFI_COMPONENT_NAME_PROTOCOL gHttpBootDxeComponentName;
|
extern EFI_COMPONENT_NAME_PROTOCOL gHttpBootDxeComponentName;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Private data structure
|
// Private data structure
|
||||||
//
|
//
|
||||||
typedef struct _HTTP_BOOT_PRIVATE_DATA HTTP_BOOT_PRIVATE_DATA;
|
typedef struct _HTTP_BOOT_PRIVATE_DATA HTTP_BOOT_PRIVATE_DATA;
|
||||||
typedef struct _HTTP_BOOT_VIRTUAL_NIC HTTP_BOOT_VIRTUAL_NIC;
|
typedef struct _HTTP_BOOT_VIRTUAL_NIC HTTP_BOOT_VIRTUAL_NIC;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
ImageTypeEfi,
|
ImageTypeEfi,
|
||||||
@ -111,17 +111,17 @@ typedef enum {
|
|||||||
#include "HttpBootConfig.h"
|
#include "HttpBootConfig.h"
|
||||||
|
|
||||||
typedef union {
|
typedef union {
|
||||||
HTTP_BOOT_DHCP4_PACKET_CACHE Dhcp4;
|
HTTP_BOOT_DHCP4_PACKET_CACHE Dhcp4;
|
||||||
HTTP_BOOT_DHCP6_PACKET_CACHE Dhcp6;
|
HTTP_BOOT_DHCP6_PACKET_CACHE Dhcp6;
|
||||||
} HTTP_BOOT_DHCP_PACKET_CACHE;
|
} HTTP_BOOT_DHCP_PACKET_CACHE;
|
||||||
|
|
||||||
struct _HTTP_BOOT_VIRTUAL_NIC {
|
struct _HTTP_BOOT_VIRTUAL_NIC {
|
||||||
UINT32 Signature;
|
UINT32 Signature;
|
||||||
EFI_HANDLE Controller;
|
EFI_HANDLE Controller;
|
||||||
EFI_HANDLE ImageHandle;
|
EFI_HANDLE ImageHandle;
|
||||||
EFI_LOAD_FILE_PROTOCOL LoadFile;
|
EFI_LOAD_FILE_PROTOCOL LoadFile;
|
||||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||||
HTTP_BOOT_PRIVATE_DATA *Private;
|
HTTP_BOOT_PRIVATE_DATA *Private;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define HTTP_BOOT_PRIVATE_DATA_FROM_CALLBACK_INFO(Callback) \
|
#define HTTP_BOOT_PRIVATE_DATA_FROM_CALLBACK_INFO(Callback) \
|
||||||
@ -141,87 +141,86 @@ struct _HTTP_BOOT_VIRTUAL_NIC {
|
|||||||
)
|
)
|
||||||
|
|
||||||
struct _HTTP_BOOT_PRIVATE_DATA {
|
struct _HTTP_BOOT_PRIVATE_DATA {
|
||||||
UINT32 Signature;
|
UINT32 Signature;
|
||||||
EFI_HANDLE Controller;
|
EFI_HANDLE Controller;
|
||||||
|
|
||||||
HTTP_BOOT_VIRTUAL_NIC *Ip4Nic;
|
HTTP_BOOT_VIRTUAL_NIC *Ip4Nic;
|
||||||
HTTP_BOOT_VIRTUAL_NIC *Ip6Nic;
|
HTTP_BOOT_VIRTUAL_NIC *Ip6Nic;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Consumed children
|
// Consumed children
|
||||||
//
|
//
|
||||||
EFI_HANDLE Ip6Child;
|
EFI_HANDLE Ip6Child;
|
||||||
EFI_HANDLE Dhcp4Child;
|
EFI_HANDLE Dhcp4Child;
|
||||||
EFI_HANDLE Dhcp6Child;
|
EFI_HANDLE Dhcp6Child;
|
||||||
HTTP_IO HttpIo;
|
HTTP_IO HttpIo;
|
||||||
BOOLEAN HttpCreated;
|
BOOLEAN HttpCreated;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Consumed protocol
|
// Consumed protocol
|
||||||
//
|
//
|
||||||
EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL *Nii;
|
EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL *Nii;
|
||||||
EFI_IP6_PROTOCOL *Ip6;
|
EFI_IP6_PROTOCOL *Ip6;
|
||||||
EFI_IP4_CONFIG2_PROTOCOL *Ip4Config2;
|
EFI_IP4_CONFIG2_PROTOCOL *Ip4Config2;
|
||||||
EFI_IP6_CONFIG_PROTOCOL *Ip6Config;
|
EFI_IP6_CONFIG_PROTOCOL *Ip6Config;
|
||||||
EFI_DHCP4_PROTOCOL *Dhcp4;
|
EFI_DHCP4_PROTOCOL *Dhcp4;
|
||||||
EFI_DHCP6_PROTOCOL *Dhcp6;
|
EFI_DHCP6_PROTOCOL *Dhcp6;
|
||||||
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
|
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Produced protocol
|
// Produced protocol
|
||||||
//
|
//
|
||||||
EFI_LOAD_FILE_PROTOCOL LoadFile;
|
EFI_LOAD_FILE_PROTOCOL LoadFile;
|
||||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||||
UINT32 Id;
|
UINT32 Id;
|
||||||
EFI_HTTP_BOOT_CALLBACK_PROTOCOL *HttpBootCallback;
|
EFI_HTTP_BOOT_CALLBACK_PROTOCOL *HttpBootCallback;
|
||||||
EFI_HTTP_BOOT_CALLBACK_PROTOCOL LoadFileCallback;
|
EFI_HTTP_BOOT_CALLBACK_PROTOCOL LoadFileCallback;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Data for the default HTTP Boot callback protocol
|
// Data for the default HTTP Boot callback protocol
|
||||||
//
|
//
|
||||||
UINT64 FileSize;
|
UINT64 FileSize;
|
||||||
UINT64 ReceivedSize;
|
UINT64 ReceivedSize;
|
||||||
UINT32 Percentage;
|
UINT32 Percentage;
|
||||||
|
|
||||||
//
|
//
|
||||||
// HII callback info block
|
// HII callback info block
|
||||||
//
|
//
|
||||||
HTTP_BOOT_FORM_CALLBACK_INFO CallbackInfo;
|
HTTP_BOOT_FORM_CALLBACK_INFO CallbackInfo;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Mode data
|
// Mode data
|
||||||
//
|
//
|
||||||
BOOLEAN UsingIpv6;
|
BOOLEAN UsingIpv6;
|
||||||
BOOLEAN Started;
|
BOOLEAN Started;
|
||||||
EFI_IP_ADDRESS StationIp;
|
EFI_IP_ADDRESS StationIp;
|
||||||
EFI_IP_ADDRESS SubnetMask;
|
EFI_IP_ADDRESS SubnetMask;
|
||||||
EFI_IP_ADDRESS GatewayIp;
|
EFI_IP_ADDRESS GatewayIp;
|
||||||
EFI_IP_ADDRESS ServerIp;
|
EFI_IP_ADDRESS ServerIp;
|
||||||
UINT16 Port;
|
UINT16 Port;
|
||||||
UINT32 DnsServerCount;
|
UINT32 DnsServerCount;
|
||||||
EFI_IP_ADDRESS *DnsServerIp;
|
EFI_IP_ADDRESS *DnsServerIp;
|
||||||
|
|
||||||
//
|
//
|
||||||
// The URI string attempt to download through HTTP, may point to
|
// The URI string attempt to download through HTTP, may point to
|
||||||
// the memory in cached DHCP offer, or to the memory in FilePathUri.
|
// the memory in cached DHCP offer, or to the memory in FilePathUri.
|
||||||
//
|
//
|
||||||
CHAR8 *BootFileUri;
|
CHAR8 *BootFileUri;
|
||||||
VOID *BootFileUriParser;
|
VOID *BootFileUriParser;
|
||||||
UINTN BootFileSize;
|
UINTN BootFileSize;
|
||||||
BOOLEAN NoGateway;
|
BOOLEAN NoGateway;
|
||||||
HTTP_BOOT_IMAGE_TYPE ImageType;
|
HTTP_BOOT_IMAGE_TYPE ImageType;
|
||||||
|
|
||||||
//
|
//
|
||||||
// URI string extracted from the input FilePath parameter.
|
// URI string extracted from the input FilePath parameter.
|
||||||
//
|
//
|
||||||
CHAR8 *FilePathUri;
|
CHAR8 *FilePathUri;
|
||||||
VOID *FilePathUriParser;
|
VOID *FilePathUriParser;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Cached HTTP data
|
// Cached HTTP data
|
||||||
//
|
//
|
||||||
LIST_ENTRY CacheList;
|
LIST_ENTRY CacheList;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Cached DHCP offer
|
// Cached DHCP offer
|
||||||
@ -252,20 +251,20 @@ struct _HTTP_BOOT_PRIVATE_DATA {
|
|||||||
// (OfferIndex is 0-based.)
|
// (OfferIndex is 0-based.)
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
UINT32 SelectIndex;
|
UINT32 SelectIndex;
|
||||||
UINT32 SelectProxyType;
|
UINT32 SelectProxyType;
|
||||||
HTTP_BOOT_DHCP_PACKET_CACHE OfferBuffer[HTTP_BOOT_OFFER_MAX_NUM];
|
HTTP_BOOT_DHCP_PACKET_CACHE OfferBuffer[HTTP_BOOT_OFFER_MAX_NUM];
|
||||||
UINT32 OfferNum;
|
UINT32 OfferNum;
|
||||||
UINT32 OfferCount[HttpOfferTypeMax];
|
UINT32 OfferCount[HttpOfferTypeMax];
|
||||||
UINT32 OfferIndex[HttpOfferTypeMax][HTTP_BOOT_OFFER_MAX_NUM];
|
UINT32 OfferIndex[HttpOfferTypeMax][HTTP_BOOT_OFFER_MAX_NUM];
|
||||||
};
|
};
|
||||||
|
|
||||||
#define HTTP_BOOT_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('H', 'B', 'P', 'D')
|
#define HTTP_BOOT_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('H', 'B', 'P', 'D')
|
||||||
#define HTTP_BOOT_VIRTUAL_NIC_SIGNATURE SIGNATURE_32 ('H', 'B', 'V', 'N')
|
#define HTTP_BOOT_VIRTUAL_NIC_SIGNATURE SIGNATURE_32 ('H', 'B', 'V', 'N')
|
||||||
#define HTTP_BOOT_PRIVATE_DATA_FROM_LOADFILE(a) CR (a, HTTP_BOOT_PRIVATE_DATA, LoadFile, HTTP_BOOT_PRIVATE_DATA_SIGNATURE)
|
#define HTTP_BOOT_PRIVATE_DATA_FROM_LOADFILE(a) CR (a, HTTP_BOOT_PRIVATE_DATA, LoadFile, HTTP_BOOT_PRIVATE_DATA_SIGNATURE)
|
||||||
#define HTTP_BOOT_PRIVATE_DATA_FROM_ID(a) CR (a, HTTP_BOOT_PRIVATE_DATA, Id, HTTP_BOOT_PRIVATE_DATA_SIGNATURE)
|
#define HTTP_BOOT_PRIVATE_DATA_FROM_ID(a) CR (a, HTTP_BOOT_PRIVATE_DATA, Id, HTTP_BOOT_PRIVATE_DATA_SIGNATURE)
|
||||||
#define HTTP_BOOT_VIRTUAL_NIC_FROM_LOADFILE(a) CR (a, HTTP_BOOT_VIRTUAL_NIC, LoadFile, HTTP_BOOT_VIRTUAL_NIC_SIGNATURE)
|
#define HTTP_BOOT_VIRTUAL_NIC_FROM_LOADFILE(a) CR (a, HTTP_BOOT_VIRTUAL_NIC, LoadFile, HTTP_BOOT_VIRTUAL_NIC_SIGNATURE)
|
||||||
extern EFI_LOAD_FILE_PROTOCOL gHttpBootDxeLoadFile;
|
extern EFI_LOAD_FILE_PROTOCOL gHttpBootDxeLoadFile;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Tests to see if this driver supports a given controller. If a child device is provided,
|
Tests to see if this driver supports a given controller. If a child device is provided,
|
||||||
@ -522,4 +521,5 @@ HttpBootIp6DxeDriverBindingStop (
|
|||||||
IN UINTN NumberOfChildren,
|
IN UINTN NumberOfChildren,
|
||||||
IN EFI_HANDLE *ChildHandleBuffer OPTIONAL
|
IN EFI_HANDLE *ChildHandleBuffer OPTIONAL
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -20,11 +20,11 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpBootInstallCallback (
|
HttpBootInstallCallback (
|
||||||
IN HTTP_BOOT_PRIVATE_DATA *Private
|
IN HTTP_BOOT_PRIVATE_DATA *Private
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_HANDLE ControllerHandle;
|
EFI_HANDLE ControllerHandle;
|
||||||
|
|
||||||
if (!Private->UsingIpv6) {
|
if (!Private->UsingIpv6) {
|
||||||
ControllerHandle = Private->Ip4Nic->Controller;
|
ControllerHandle = Private->Ip4Nic->Controller;
|
||||||
@ -38,10 +38,9 @@ HttpBootInstallCallback (
|
|||||||
Status = gBS->HandleProtocol (
|
Status = gBS->HandleProtocol (
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
&gEfiHttpBootCallbackProtocolGuid,
|
&gEfiHttpBootCallbackProtocolGuid,
|
||||||
(VOID **) &Private->HttpBootCallback
|
(VOID **)&Private->HttpBootCallback
|
||||||
);
|
);
|
||||||
if (Status == EFI_UNSUPPORTED) {
|
if (Status == EFI_UNSUPPORTED) {
|
||||||
|
|
||||||
CopyMem (
|
CopyMem (
|
||||||
&Private->LoadFileCallback,
|
&Private->LoadFileCallback,
|
||||||
&gHttpBootDxeHttpBootCallback,
|
&gHttpBootDxeHttpBootCallback,
|
||||||
@ -60,6 +59,7 @@ HttpBootInstallCallback (
|
|||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
Private->HttpBootCallback = &Private->LoadFileCallback;
|
Private->HttpBootCallback = &Private->LoadFileCallback;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -74,15 +74,15 @@ HttpBootInstallCallback (
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
HttpBootUninstallCallback (
|
HttpBootUninstallCallback (
|
||||||
IN HTTP_BOOT_PRIVATE_DATA *Private
|
IN HTTP_BOOT_PRIVATE_DATA *Private
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
if (Private->HttpBootCallback == &Private->LoadFileCallback) {
|
if (Private->HttpBootCallback == &Private->LoadFileCallback) {
|
||||||
gBS->UninstallProtocolInterface (
|
gBS->UninstallProtocolInterface (
|
||||||
Private->Controller,
|
Private->Controller,
|
||||||
&gEfiHttpBootCallbackProtocolGuid,
|
&gEfiHttpBootCallbackProtocolGuid,
|
||||||
&Private->HttpBootCallback
|
&Private->HttpBootCallback
|
||||||
);
|
);
|
||||||
Private->HttpBootCallback = NULL;
|
Private->HttpBootCallback = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -108,18 +108,18 @@ HttpBootUninstallCallback (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpBootStart (
|
HttpBootStart (
|
||||||
IN HTTP_BOOT_PRIVATE_DATA *Private,
|
IN HTTP_BOOT_PRIVATE_DATA *Private,
|
||||||
IN BOOLEAN UsingIpv6,
|
IN BOOLEAN UsingIpv6,
|
||||||
IN EFI_DEVICE_PATH_PROTOCOL *FilePath
|
IN EFI_DEVICE_PATH_PROTOCOL *FilePath
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
CHAR8 *Uri;
|
CHAR8 *Uri;
|
||||||
|
|
||||||
Uri = NULL;
|
Uri = NULL;
|
||||||
|
|
||||||
if (Private == NULL || FilePath == NULL) {
|
if ((Private == NULL) || (FilePath == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -143,7 +143,8 @@ HttpBootStart (
|
|||||||
// recorded before.
|
// recorded before.
|
||||||
//
|
//
|
||||||
if ((UsingIpv6 != Private->UsingIpv6) ||
|
if ((UsingIpv6 != Private->UsingIpv6) ||
|
||||||
((Uri != NULL) && (AsciiStrCmp (Private->BootFileUri, Uri) != 0))) {
|
((Uri != NULL) && (AsciiStrCmp (Private->BootFileUri, Uri) != 0)))
|
||||||
|
{
|
||||||
//
|
//
|
||||||
// Restart is required, first stop then continue this start function.
|
// Restart is required, first stop then continue this start function.
|
||||||
//
|
//
|
||||||
@ -152,6 +153,7 @@ HttpBootStart (
|
|||||||
if (Uri != NULL) {
|
if (Uri != NULL) {
|
||||||
FreePool (Uri);
|
FreePool (Uri);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -161,6 +163,7 @@ HttpBootStart (
|
|||||||
if (Uri != NULL) {
|
if (Uri != NULL) {
|
||||||
FreePool (Uri);
|
FreePool (Uri);
|
||||||
}
|
}
|
||||||
|
|
||||||
return EFI_ALREADY_STARTED;
|
return EFI_ALREADY_STARTED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -168,14 +171,15 @@ HttpBootStart (
|
|||||||
//
|
//
|
||||||
// Detect whether using ipv6 or not, and set it to the private data.
|
// Detect whether using ipv6 or not, and set it to the private data.
|
||||||
//
|
//
|
||||||
if (UsingIpv6 && Private->Ip6Nic != NULL) {
|
if (UsingIpv6 && (Private->Ip6Nic != NULL)) {
|
||||||
Private->UsingIpv6 = TRUE;
|
Private->UsingIpv6 = TRUE;
|
||||||
} else if (!UsingIpv6 && Private->Ip4Nic != NULL) {
|
} else if (!UsingIpv6 && (Private->Ip4Nic != NULL)) {
|
||||||
Private->UsingIpv6 = FALSE;
|
Private->UsingIpv6 = FALSE;
|
||||||
} else {
|
} else {
|
||||||
if (Uri != NULL) {
|
if (Uri != NULL) {
|
||||||
FreePool (Uri);
|
FreePool (Uri);
|
||||||
}
|
}
|
||||||
|
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -186,7 +190,7 @@ HttpBootStart (
|
|||||||
if (Private->FilePathUri != NULL) {
|
if (Private->FilePathUri != NULL) {
|
||||||
Status = HttpParseUrl (
|
Status = HttpParseUrl (
|
||||||
Private->FilePathUri,
|
Private->FilePathUri,
|
||||||
(UINT32) AsciiStrLen (Private->FilePathUri),
|
(UINT32)AsciiStrLen (Private->FilePathUri),
|
||||||
FALSE,
|
FALSE,
|
||||||
&Private->FilePathUriParser
|
&Private->FilePathUriParser
|
||||||
);
|
);
|
||||||
@ -219,7 +223,8 @@ HttpBootStart (
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Private->Started = TRUE;
|
|
||||||
|
Private->Started = TRUE;
|
||||||
Print (L"\n>>Start HTTP Boot over IPv%d", Private->UsingIpv6 ? 6 : 4);
|
Print (L"\n>>Start HTTP Boot over IPv%d", Private->UsingIpv6 ? 6 : 4);
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
@ -239,10 +244,10 @@ HttpBootStart (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpBootDhcp (
|
HttpBootDhcp (
|
||||||
IN HTTP_BOOT_PRIVATE_DATA *Private
|
IN HTTP_BOOT_PRIVATE_DATA *Private
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
if (Private == NULL) {
|
if (Private == NULL) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
@ -260,7 +265,7 @@ HttpBootDhcp (
|
|||||||
//
|
//
|
||||||
Status = HttpBootDhcp4Dora (Private);
|
Status = HttpBootDhcp4Dora (Private);
|
||||||
} else {
|
} else {
|
||||||
//
|
//
|
||||||
// Start S.A.R.R process to get a IPv6 address and other boot information.
|
// Start S.A.R.R process to get a IPv6 address and other boot information.
|
||||||
//
|
//
|
||||||
Status = HttpBootDhcp6Sarr (Private);
|
Status = HttpBootDhcp6Sarr (Private);
|
||||||
@ -294,19 +299,19 @@ HttpBootDhcp (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpBootLoadFile (
|
HttpBootLoadFile (
|
||||||
IN HTTP_BOOT_PRIVATE_DATA *Private,
|
IN HTTP_BOOT_PRIVATE_DATA *Private,
|
||||||
IN OUT UINTN *BufferSize,
|
IN OUT UINTN *BufferSize,
|
||||||
IN VOID *Buffer OPTIONAL,
|
IN VOID *Buffer OPTIONAL,
|
||||||
OUT HTTP_BOOT_IMAGE_TYPE *ImageType
|
OUT HTTP_BOOT_IMAGE_TYPE *ImageType
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
if (Private == NULL || ImageType == NULL || BufferSize == NULL ) {
|
if ((Private == NULL) || (ImageType == NULL) || (BufferSize == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (*BufferSize != 0 && Buffer == NULL) {
|
if ((*BufferSize != 0) && (Buffer == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -315,7 +320,7 @@ HttpBootLoadFile (
|
|||||||
}
|
}
|
||||||
|
|
||||||
Status = HttpBootInstallCallback (Private);
|
Status = HttpBootInstallCallback (Private);
|
||||||
if (EFI_ERROR(Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -355,7 +360,7 @@ HttpBootLoadFile (
|
|||||||
NULL,
|
NULL,
|
||||||
&Private->ImageType
|
&Private->ImageType
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status) && Status != EFI_BUFFER_TOO_SMALL) {
|
if (EFI_ERROR (Status) && (Status != EFI_BUFFER_TOO_SMALL)) {
|
||||||
//
|
//
|
||||||
// Failed to get file size by HEAD method, may be trunked encoding, try HTTP GET method.
|
// Failed to get file size by HEAD method, may be trunked encoding, try HTTP GET method.
|
||||||
//
|
//
|
||||||
@ -367,7 +372,7 @@ HttpBootLoadFile (
|
|||||||
NULL,
|
NULL,
|
||||||
&Private->ImageType
|
&Private->ImageType
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status) && Status != EFI_BUFFER_TOO_SMALL) {
|
if (EFI_ERROR (Status) && (Status != EFI_BUFFER_TOO_SMALL)) {
|
||||||
AsciiPrint ("\n Error: Could not retrieve NBP file size from HTTP server.\n");
|
AsciiPrint ("\n Error: Could not retrieve NBP file size from HTTP server.\n");
|
||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
}
|
}
|
||||||
@ -376,8 +381,8 @@ HttpBootLoadFile (
|
|||||||
|
|
||||||
if (*BufferSize < Private->BootFileSize) {
|
if (*BufferSize < Private->BootFileSize) {
|
||||||
*BufferSize = Private->BootFileSize;
|
*BufferSize = Private->BootFileSize;
|
||||||
*ImageType = Private->ImageType;
|
*ImageType = Private->ImageType;
|
||||||
Status = EFI_BUFFER_TOO_SMALL;
|
Status = EFI_BUFFER_TOO_SMALL;
|
||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -398,7 +403,7 @@ ON_EXIT:
|
|||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
if (Status == EFI_ACCESS_DENIED) {
|
if (Status == EFI_ACCESS_DENIED) {
|
||||||
AsciiPrint ("\n Error: Could not establish connection with HTTP server.\n");
|
AsciiPrint ("\n Error: Could not establish connection with HTTP server.\n");
|
||||||
} else if (Status == EFI_BUFFER_TOO_SMALL && Buffer != NULL) {
|
} else if ((Status == EFI_BUFFER_TOO_SMALL) && (Buffer != NULL)) {
|
||||||
AsciiPrint ("\n Error: Buffer size is smaller than the requested file.\n");
|
AsciiPrint ("\n Error: Buffer size is smaller than the requested file.\n");
|
||||||
} else if (Status == EFI_OUT_OF_RESOURCES) {
|
} else if (Status == EFI_OUT_OF_RESOURCES) {
|
||||||
AsciiPrint ("\n Error: Could not allocate I/O buffers.\n");
|
AsciiPrint ("\n Error: Could not allocate I/O buffers.\n");
|
||||||
@ -429,10 +434,10 @@ ON_EXIT:
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpBootStop (
|
HttpBootStop (
|
||||||
IN HTTP_BOOT_PRIVATE_DATA *Private
|
IN HTTP_BOOT_PRIVATE_DATA *Private
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
|
|
||||||
if (Private == NULL) {
|
if (Private == NULL) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
@ -451,12 +456,12 @@ HttpBootStop (
|
|||||||
ZeroMem (&Private->StationIp, sizeof (EFI_IP_ADDRESS));
|
ZeroMem (&Private->StationIp, sizeof (EFI_IP_ADDRESS));
|
||||||
ZeroMem (&Private->SubnetMask, sizeof (EFI_IP_ADDRESS));
|
ZeroMem (&Private->SubnetMask, sizeof (EFI_IP_ADDRESS));
|
||||||
ZeroMem (&Private->GatewayIp, sizeof (EFI_IP_ADDRESS));
|
ZeroMem (&Private->GatewayIp, sizeof (EFI_IP_ADDRESS));
|
||||||
Private->Port = 0;
|
Private->Port = 0;
|
||||||
Private->BootFileUri = NULL;
|
Private->BootFileUri = NULL;
|
||||||
Private->BootFileUriParser = NULL;
|
Private->BootFileUriParser = NULL;
|
||||||
Private->BootFileSize = 0;
|
Private->BootFileSize = 0;
|
||||||
Private->SelectIndex = 0;
|
Private->SelectIndex = 0;
|
||||||
Private->SelectProxyType = HttpOfferTypeMax;
|
Private->SelectProxyType = HttpOfferTypeMax;
|
||||||
|
|
||||||
if (!Private->UsingIpv6) {
|
if (!Private->UsingIpv6) {
|
||||||
//
|
//
|
||||||
@ -489,10 +494,10 @@ HttpBootStop (
|
|||||||
Private->DnsServerIp = NULL;
|
Private->DnsServerIp = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Private->FilePathUri!= NULL) {
|
if (Private->FilePathUri != NULL) {
|
||||||
FreePool (Private->FilePathUri);
|
FreePool (Private->FilePathUri);
|
||||||
HttpUrlFreeParser (Private->FilePathUriParser);
|
HttpUrlFreeParser (Private->FilePathUriParser);
|
||||||
Private->FilePathUri = NULL;
|
Private->FilePathUri = NULL;
|
||||||
Private->FilePathUriParser = NULL;
|
Private->FilePathUriParser = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -540,21 +545,21 @@ HttpBootStop (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
HttpBootDxeLoadFile (
|
HttpBootDxeLoadFile (
|
||||||
IN EFI_LOAD_FILE_PROTOCOL *This,
|
IN EFI_LOAD_FILE_PROTOCOL *This,
|
||||||
IN EFI_DEVICE_PATH_PROTOCOL *FilePath,
|
IN EFI_DEVICE_PATH_PROTOCOL *FilePath,
|
||||||
IN BOOLEAN BootPolicy,
|
IN BOOLEAN BootPolicy,
|
||||||
IN OUT UINTN *BufferSize,
|
IN OUT UINTN *BufferSize,
|
||||||
IN VOID *Buffer OPTIONAL
|
IN VOID *Buffer OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
HTTP_BOOT_PRIVATE_DATA *Private;
|
HTTP_BOOT_PRIVATE_DATA *Private;
|
||||||
HTTP_BOOT_VIRTUAL_NIC *VirtualNic;
|
HTTP_BOOT_VIRTUAL_NIC *VirtualNic;
|
||||||
EFI_STATUS MediaStatus;
|
EFI_STATUS MediaStatus;
|
||||||
BOOLEAN UsingIpv6;
|
BOOLEAN UsingIpv6;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
HTTP_BOOT_IMAGE_TYPE ImageType;
|
HTTP_BOOT_IMAGE_TYPE ImageType;
|
||||||
|
|
||||||
if (This == NULL || BufferSize == NULL || FilePath == NULL) {
|
if ((This == NULL) || (BufferSize == NULL) || (FilePath == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -566,7 +571,7 @@ HttpBootDxeLoadFile (
|
|||||||
}
|
}
|
||||||
|
|
||||||
VirtualNic = HTTP_BOOT_VIRTUAL_NIC_FROM_LOADFILE (This);
|
VirtualNic = HTTP_BOOT_VIRTUAL_NIC_FROM_LOADFILE (This);
|
||||||
Private = VirtualNic->Private;
|
Private = VirtualNic->Private;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Check media status before HTTP boot start
|
// Check media status before HTTP boot start
|
||||||
@ -590,7 +595,7 @@ HttpBootDxeLoadFile (
|
|||||||
// Initialize HTTP boot.
|
// Initialize HTTP boot.
|
||||||
//
|
//
|
||||||
Status = HttpBootStart (Private, UsingIpv6, FilePath);
|
Status = HttpBootStart (Private, UsingIpv6, FilePath);
|
||||||
if (Status != EFI_SUCCESS && Status != EFI_ALREADY_STARTED) {
|
if ((Status != EFI_SUCCESS) && (Status != EFI_ALREADY_STARTED)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -598,20 +603,21 @@ HttpBootDxeLoadFile (
|
|||||||
// Load the boot file.
|
// Load the boot file.
|
||||||
//
|
//
|
||||||
ImageType = ImageTypeMax;
|
ImageType = ImageTypeMax;
|
||||||
Status = HttpBootLoadFile (Private, BufferSize, Buffer, &ImageType);
|
Status = HttpBootLoadFile (Private, BufferSize, Buffer, &ImageType);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
if (Status == EFI_BUFFER_TOO_SMALL && (ImageType == ImageTypeVirtualCd || ImageType == ImageTypeVirtualDisk)) {
|
if ((Status == EFI_BUFFER_TOO_SMALL) && ((ImageType == ImageTypeVirtualCd) || (ImageType == ImageTypeVirtualDisk))) {
|
||||||
Status = EFI_WARN_FILE_SYSTEM;
|
Status = EFI_WARN_FILE_SYSTEM;
|
||||||
} else if (Status != EFI_BUFFER_TOO_SMALL) {
|
} else if (Status != EFI_BUFFER_TOO_SMALL) {
|
||||||
HttpBootStop (Private);
|
HttpBootStop (Private);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Register the RAM Disk to the system if needed.
|
// Register the RAM Disk to the system if needed.
|
||||||
//
|
//
|
||||||
if (ImageType == ImageTypeVirtualCd || ImageType == ImageTypeVirtualDisk) {
|
if ((ImageType == ImageTypeVirtualCd) || (ImageType == ImageTypeVirtualDisk)) {
|
||||||
Status = HttpBootRegisterRamDisk (Private, *BufferSize, Buffer, ImageType);
|
Status = HttpBootRegisterRamDisk (Private, *BufferSize, Buffer, ImageType);
|
||||||
if (!EFI_ERROR (Status)) {
|
if (!EFI_ERROR (Status)) {
|
||||||
Status = EFI_WARN_FILE_SYSTEM;
|
Status = EFI_WARN_FILE_SYSTEM;
|
||||||
@ -659,11 +665,11 @@ EFI_LOAD_FILE_PROTOCOL gHttpBootDxeLoadFile = {
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
HttpBootCallback (
|
HttpBootCallback (
|
||||||
IN EFI_HTTP_BOOT_CALLBACK_PROTOCOL *This,
|
IN EFI_HTTP_BOOT_CALLBACK_PROTOCOL *This,
|
||||||
IN EFI_HTTP_BOOT_CALLBACK_DATA_TYPE DataType,
|
IN EFI_HTTP_BOOT_CALLBACK_DATA_TYPE DataType,
|
||||||
IN BOOLEAN Received,
|
IN BOOLEAN Received,
|
||||||
IN UINT32 DataLength,
|
IN UINT32 DataLength,
|
||||||
IN VOID *Data OPTIONAL
|
IN VOID *Data OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_HTTP_MESSAGE *HttpMessage;
|
EFI_HTTP_MESSAGE *HttpMessage;
|
||||||
@ -671,89 +677,95 @@ HttpBootCallback (
|
|||||||
HTTP_BOOT_PRIVATE_DATA *Private;
|
HTTP_BOOT_PRIVATE_DATA *Private;
|
||||||
UINT32 Percentage;
|
UINT32 Percentage;
|
||||||
|
|
||||||
Private = HTTP_BOOT_PRIVATE_DATA_FROM_CALLBACK_PROTOCOL(This);
|
Private = HTTP_BOOT_PRIVATE_DATA_FROM_CALLBACK_PROTOCOL (This);
|
||||||
|
|
||||||
switch (DataType) {
|
switch (DataType) {
|
||||||
case HttpBootDhcp4:
|
case HttpBootDhcp4:
|
||||||
case HttpBootDhcp6:
|
case HttpBootDhcp6:
|
||||||
Print (L".");
|
Print (L".");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HttpBootHttpRequest:
|
case HttpBootHttpRequest:
|
||||||
if (Data != NULL) {
|
if (Data != NULL) {
|
||||||
HttpMessage = (EFI_HTTP_MESSAGE *) Data;
|
HttpMessage = (EFI_HTTP_MESSAGE *)Data;
|
||||||
if (HttpMessage->Data.Request->Method == HttpMethodGet &&
|
if ((HttpMessage->Data.Request->Method == HttpMethodGet) &&
|
||||||
HttpMessage->Data.Request->Url != NULL) {
|
(HttpMessage->Data.Request->Url != NULL))
|
||||||
Print (L"\n URI: %s\n", HttpMessage->Data.Request->Url);
|
{
|
||||||
|
Print (L"\n URI: %s\n", HttpMessage->Data.Request->Url);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HttpBootHttpResponse:
|
break;
|
||||||
if (Data != NULL) {
|
|
||||||
HttpMessage = (EFI_HTTP_MESSAGE *) Data;
|
|
||||||
|
|
||||||
if (HttpMessage->Data.Response != NULL) {
|
case HttpBootHttpResponse:
|
||||||
if (HttpBootIsHttpRedirectStatusCode (HttpMessage->Data.Response->StatusCode)) {
|
if (Data != NULL) {
|
||||||
//
|
HttpMessage = (EFI_HTTP_MESSAGE *)Data;
|
||||||
// Server indicates the resource has been redirected to a different URL
|
|
||||||
// according to the section 6.4 of RFC7231 and the RFC 7538.
|
if (HttpMessage->Data.Response != NULL) {
|
||||||
// Display the redirect information on the screen.
|
if (HttpBootIsHttpRedirectStatusCode (HttpMessage->Data.Response->StatusCode)) {
|
||||||
//
|
//
|
||||||
HttpHeader = HttpFindHeader (
|
// Server indicates the resource has been redirected to a different URL
|
||||||
HttpMessage->HeaderCount,
|
// according to the section 6.4 of RFC7231 and the RFC 7538.
|
||||||
HttpMessage->Headers,
|
// Display the redirect information on the screen.
|
||||||
HTTP_HEADER_LOCATION
|
//
|
||||||
);
|
HttpHeader = HttpFindHeader (
|
||||||
if (HttpHeader != NULL) {
|
HttpMessage->HeaderCount,
|
||||||
Print (L"\n HTTP ERROR: Resource Redirected.\n New Location: %a\n", HttpHeader->FieldValue);
|
HttpMessage->Headers,
|
||||||
|
HTTP_HEADER_LOCATION
|
||||||
|
);
|
||||||
|
if (HttpHeader != NULL) {
|
||||||
|
Print (L"\n HTTP ERROR: Resource Redirected.\n New Location: %a\n", HttpHeader->FieldValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
}
|
||||||
|
|
||||||
|
HttpHeader = HttpFindHeader (
|
||||||
|
HttpMessage->HeaderCount,
|
||||||
|
HttpMessage->Headers,
|
||||||
|
HTTP_HEADER_CONTENT_LENGTH
|
||||||
|
);
|
||||||
|
if (HttpHeader != NULL) {
|
||||||
|
Private->FileSize = AsciiStrDecimalToUintn (HttpHeader->FieldValue);
|
||||||
|
Private->ReceivedSize = 0;
|
||||||
|
Private->Percentage = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
HttpHeader = HttpFindHeader (
|
break;
|
||||||
HttpMessage->HeaderCount,
|
|
||||||
HttpMessage->Headers,
|
|
||||||
HTTP_HEADER_CONTENT_LENGTH
|
|
||||||
);
|
|
||||||
if (HttpHeader != NULL) {
|
|
||||||
Private->FileSize = AsciiStrDecimalToUintn (HttpHeader->FieldValue);
|
|
||||||
Private->ReceivedSize = 0;
|
|
||||||
Private->Percentage = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case HttpBootHttpEntityBody:
|
case HttpBootHttpEntityBody:
|
||||||
if (DataLength != 0) {
|
if (DataLength != 0) {
|
||||||
if (Private->FileSize != 0) {
|
if (Private->FileSize != 0) {
|
||||||
//
|
//
|
||||||
// We already know the file size, print in percentage format.
|
// We already know the file size, print in percentage format.
|
||||||
//
|
//
|
||||||
if (Private->ReceivedSize == 0) {
|
if (Private->ReceivedSize == 0) {
|
||||||
Print (L" File Size: %lu Bytes\n", Private->FileSize);
|
Print (L" File Size: %lu Bytes\n", Private->FileSize);
|
||||||
}
|
}
|
||||||
Private->ReceivedSize += DataLength;
|
|
||||||
Percentage = (UINT32) DivU64x64Remainder (MultU64x32 (Private->ReceivedSize, 100), Private->FileSize, NULL);
|
|
||||||
if (Private->Percentage != Percentage) {
|
|
||||||
Private->Percentage = Percentage;
|
|
||||||
Print (L"\r Downloading...%d%%", Percentage);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
//
|
|
||||||
// In some case we couldn't get the file size from the HTTP header, so we
|
|
||||||
// just print the downloaded file size.
|
|
||||||
//
|
|
||||||
Private->ReceivedSize += DataLength;
|
|
||||||
Print (L"\r Downloading...%lu Bytes", Private->ReceivedSize);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
Private->ReceivedSize += DataLength;
|
||||||
break;
|
Percentage = (UINT32)DivU64x64Remainder (MultU64x32 (Private->ReceivedSize, 100), Private->FileSize, NULL);
|
||||||
};
|
if (Private->Percentage != Percentage) {
|
||||||
|
Private->Percentage = Percentage;
|
||||||
|
Print (L"\r Downloading...%d%%", Percentage);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
//
|
||||||
|
// In some case we couldn't get the file size from the HTTP header, so we
|
||||||
|
// just print the downloaded file size.
|
||||||
|
//
|
||||||
|
Private->ReceivedSize += DataLength;
|
||||||
|
Print (L"\r Downloading...%lu Bytes", Private->ReceivedSize);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -5,10 +5,11 @@ Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.<BR>
|
|||||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||||
|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#ifndef __EFI_HTTP_BOOT_IMPL_H__
|
#ifndef __EFI_HTTP_BOOT_IMPL_H__
|
||||||
#define __EFI_HTTP_BOOT_IMPL_H__
|
#define __EFI_HTTP_BOOT_IMPL_H__
|
||||||
|
|
||||||
#define HTTP_BOOT_CHECK_MEDIA_WAITING_TIME EFI_TIMER_PERIOD_SECONDS(20)
|
#define HTTP_BOOT_CHECK_MEDIA_WAITING_TIME EFI_TIMER_PERIOD_SECONDS(20)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Attempt to complete a DHCPv4 D.O.R.A or DHCPv6 S.R.A.A sequence to retrieve the boot resource information.
|
Attempt to complete a DHCPv4 D.O.R.A or DHCPv6 S.R.A.A sequence to retrieve the boot resource information.
|
||||||
@ -24,7 +25,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpBootDhcp (
|
HttpBootDhcp (
|
||||||
IN HTTP_BOOT_PRIVATE_DATA *Private
|
IN HTTP_BOOT_PRIVATE_DATA *Private
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -40,7 +41,7 @@ HttpBootDhcp (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpBootStop (
|
HttpBootStop (
|
||||||
IN HTTP_BOOT_PRIVATE_DATA *Private
|
IN HTTP_BOOT_PRIVATE_DATA *Private
|
||||||
);
|
);
|
||||||
|
|
||||||
extern EFI_HTTP_BOOT_CALLBACK_PROTOCOL gHttpBootDxeHttpBootCallback;
|
extern EFI_HTTP_BOOT_CALLBACK_PROTOCOL gHttpBootDxeHttpBootCallback;
|
||||||
|
@ -9,7 +9,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
|
|
||||||
#include "HttpBootDxe.h"
|
#include "HttpBootDxe.h"
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Get the Nic handle using any child handle in the IPv4 stack.
|
Get the Nic handle using any child handle in the IPv4 stack.
|
||||||
|
|
||||||
@ -21,10 +20,10 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
**/
|
**/
|
||||||
EFI_HANDLE
|
EFI_HANDLE
|
||||||
HttpBootGetNicByIp4Children (
|
HttpBootGetNicByIp4Children (
|
||||||
IN EFI_HANDLE ControllerHandle
|
IN EFI_HANDLE ControllerHandle
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_HANDLE NicHandle;
|
EFI_HANDLE NicHandle;
|
||||||
|
|
||||||
NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiHttpProtocolGuid);
|
NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiHttpProtocolGuid);
|
||||||
if (NicHandle == NULL) {
|
if (NicHandle == NULL) {
|
||||||
@ -48,10 +47,11 @@ HttpBootGetNicByIp4Children (
|
|||||||
**/
|
**/
|
||||||
EFI_HANDLE
|
EFI_HANDLE
|
||||||
HttpBootGetNicByIp6Children (
|
HttpBootGetNicByIp6Children (
|
||||||
IN EFI_HANDLE ControllerHandle
|
IN EFI_HANDLE ControllerHandle
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_HANDLE NicHandle;
|
EFI_HANDLE NicHandle;
|
||||||
|
|
||||||
NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiHttpProtocolGuid);
|
NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiHttpProtocolGuid);
|
||||||
if (NicHandle == NULL) {
|
if (NicHandle == NULL) {
|
||||||
NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiDhcp6ProtocolGuid);
|
NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiDhcp6ProtocolGuid);
|
||||||
@ -73,17 +73,17 @@ HttpBootGetNicByIp6Children (
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
HttpBootUintnToAscDecWithFormat (
|
HttpBootUintnToAscDecWithFormat (
|
||||||
IN UINTN Number,
|
IN UINTN Number,
|
||||||
IN UINT8 *Buffer,
|
IN UINT8 *Buffer,
|
||||||
IN INTN Length
|
IN INTN Length
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINTN Remainder;
|
UINTN Remainder;
|
||||||
|
|
||||||
for (; Length > 0; Length--) {
|
for ( ; Length > 0; Length--) {
|
||||||
Remainder = Number % 10;
|
Remainder = Number % 10;
|
||||||
Number /= 10;
|
Number /= 10;
|
||||||
Buffer[Length - 1] = (UINT8) ('0' + Remainder);
|
Buffer[Length - 1] = (UINT8)('0' + Remainder);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -95,10 +95,10 @@ HttpBootUintnToAscDecWithFormat (
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
HttpBootShowIp4Addr (
|
HttpBootShowIp4Addr (
|
||||||
IN EFI_IPv4_ADDRESS *Ip
|
IN EFI_IPv4_ADDRESS *Ip
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
|
|
||||||
for (Index = 0; Index < 4; Index++) {
|
for (Index = 0; Index < 4; Index++) {
|
||||||
AsciiPrint ("%d", Ip->Addr[Index]);
|
AsciiPrint ("%d", Ip->Addr[Index]);
|
||||||
@ -116,23 +116,25 @@ HttpBootShowIp4Addr (
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
HttpBootShowIp6Addr (
|
HttpBootShowIp6Addr (
|
||||||
IN EFI_IPv6_ADDRESS *Ip
|
IN EFI_IPv6_ADDRESS *Ip
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
|
|
||||||
for (Index = 0; Index < 16; Index++) {
|
for (Index = 0; Index < 16; Index++) {
|
||||||
|
|
||||||
if (Ip->Addr[Index] != 0) {
|
if (Ip->Addr[Index] != 0) {
|
||||||
AsciiPrint ("%x", Ip->Addr[Index]);
|
AsciiPrint ("%x", Ip->Addr[Index]);
|
||||||
}
|
}
|
||||||
|
|
||||||
Index++;
|
Index++;
|
||||||
if (Index > 15) {
|
if (Index > 15) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (((Ip->Addr[Index] & 0xf0) == 0) && (Ip->Addr[Index - 1] != 0)) {
|
if (((Ip->Addr[Index] & 0xf0) == 0) && (Ip->Addr[Index - 1] != 0)) {
|
||||||
AsciiPrint ("0");
|
AsciiPrint ("0");
|
||||||
}
|
}
|
||||||
|
|
||||||
AsciiPrint ("%x", Ip->Addr[Index]);
|
AsciiPrint ("%x", Ip->Addr[Index]);
|
||||||
if (Index < 15) {
|
if (Index < 15) {
|
||||||
AsciiPrint (":");
|
AsciiPrint (":");
|
||||||
@ -148,142 +150,141 @@ HttpBootShowIp6Addr (
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
HttpBootPrintErrorMessage (
|
HttpBootPrintErrorMessage (
|
||||||
EFI_HTTP_STATUS_CODE StatusCode
|
EFI_HTTP_STATUS_CODE StatusCode
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
AsciiPrint ("\n");
|
AsciiPrint ("\n");
|
||||||
|
|
||||||
switch (StatusCode) {
|
switch (StatusCode) {
|
||||||
case HTTP_STATUS_300_MULTIPLE_CHOICES:
|
case HTTP_STATUS_300_MULTIPLE_CHOICES:
|
||||||
AsciiPrint ("\n Redirection: 300 Multiple Choices");
|
AsciiPrint ("\n Redirection: 300 Multiple Choices");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HTTP_STATUS_301_MOVED_PERMANENTLY:
|
case HTTP_STATUS_301_MOVED_PERMANENTLY:
|
||||||
AsciiPrint ("\n Redirection: 301 Moved Permanently");
|
AsciiPrint ("\n Redirection: 301 Moved Permanently");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HTTP_STATUS_302_FOUND:
|
case HTTP_STATUS_302_FOUND:
|
||||||
AsciiPrint ("\n Redirection: 302 Found");
|
AsciiPrint ("\n Redirection: 302 Found");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HTTP_STATUS_303_SEE_OTHER:
|
case HTTP_STATUS_303_SEE_OTHER:
|
||||||
AsciiPrint ("\n Redirection: 303 See Other");
|
AsciiPrint ("\n Redirection: 303 See Other");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HTTP_STATUS_304_NOT_MODIFIED:
|
case HTTP_STATUS_304_NOT_MODIFIED:
|
||||||
AsciiPrint ("\n Redirection: 304 Not Modified");
|
AsciiPrint ("\n Redirection: 304 Not Modified");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HTTP_STATUS_305_USE_PROXY:
|
case HTTP_STATUS_305_USE_PROXY:
|
||||||
AsciiPrint ("\n Redirection: 305 Use Proxy");
|
AsciiPrint ("\n Redirection: 305 Use Proxy");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HTTP_STATUS_307_TEMPORARY_REDIRECT:
|
case HTTP_STATUS_307_TEMPORARY_REDIRECT:
|
||||||
AsciiPrint ("\n Redirection: 307 Temporary Redirect");
|
AsciiPrint ("\n Redirection: 307 Temporary Redirect");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HTTP_STATUS_308_PERMANENT_REDIRECT:
|
case HTTP_STATUS_308_PERMANENT_REDIRECT:
|
||||||
AsciiPrint ("\n Redirection: 308 Permanent Redirect");
|
AsciiPrint ("\n Redirection: 308 Permanent Redirect");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HTTP_STATUS_400_BAD_REQUEST:
|
case HTTP_STATUS_400_BAD_REQUEST:
|
||||||
AsciiPrint ("\n Client Error: 400 Bad Request");
|
AsciiPrint ("\n Client Error: 400 Bad Request");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HTTP_STATUS_401_UNAUTHORIZED:
|
case HTTP_STATUS_401_UNAUTHORIZED:
|
||||||
AsciiPrint ("\n Client Error: 401 Unauthorized");
|
AsciiPrint ("\n Client Error: 401 Unauthorized");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HTTP_STATUS_402_PAYMENT_REQUIRED:
|
case HTTP_STATUS_402_PAYMENT_REQUIRED:
|
||||||
AsciiPrint ("\n Client Error: 402 Payment Required");
|
AsciiPrint ("\n Client Error: 402 Payment Required");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HTTP_STATUS_403_FORBIDDEN:
|
case HTTP_STATUS_403_FORBIDDEN:
|
||||||
AsciiPrint ("\n Client Error: 403 Forbidden");
|
AsciiPrint ("\n Client Error: 403 Forbidden");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HTTP_STATUS_404_NOT_FOUND:
|
case HTTP_STATUS_404_NOT_FOUND:
|
||||||
AsciiPrint ("\n Client Error: 404 Not Found");
|
AsciiPrint ("\n Client Error: 404 Not Found");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HTTP_STATUS_405_METHOD_NOT_ALLOWED:
|
case HTTP_STATUS_405_METHOD_NOT_ALLOWED:
|
||||||
AsciiPrint ("\n Client Error: 405 Method Not Allowed");
|
AsciiPrint ("\n Client Error: 405 Method Not Allowed");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HTTP_STATUS_406_NOT_ACCEPTABLE:
|
case HTTP_STATUS_406_NOT_ACCEPTABLE:
|
||||||
AsciiPrint ("\n Client Error: 406 Not Acceptable");
|
AsciiPrint ("\n Client Error: 406 Not Acceptable");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HTTP_STATUS_407_PROXY_AUTHENTICATION_REQUIRED:
|
case HTTP_STATUS_407_PROXY_AUTHENTICATION_REQUIRED:
|
||||||
AsciiPrint ("\n Client Error: 407 Proxy Authentication Required");
|
AsciiPrint ("\n Client Error: 407 Proxy Authentication Required");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HTTP_STATUS_408_REQUEST_TIME_OUT:
|
case HTTP_STATUS_408_REQUEST_TIME_OUT:
|
||||||
AsciiPrint ("\n Client Error: 408 Request Timeout");
|
AsciiPrint ("\n Client Error: 408 Request Timeout");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HTTP_STATUS_409_CONFLICT:
|
case HTTP_STATUS_409_CONFLICT:
|
||||||
AsciiPrint ("\n Client Error: 409 Conflict");
|
AsciiPrint ("\n Client Error: 409 Conflict");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HTTP_STATUS_410_GONE:
|
case HTTP_STATUS_410_GONE:
|
||||||
AsciiPrint ("\n Client Error: 410 Gone");
|
AsciiPrint ("\n Client Error: 410 Gone");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HTTP_STATUS_411_LENGTH_REQUIRED:
|
case HTTP_STATUS_411_LENGTH_REQUIRED:
|
||||||
AsciiPrint ("\n Client Error: 411 Length Required");
|
AsciiPrint ("\n Client Error: 411 Length Required");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HTTP_STATUS_412_PRECONDITION_FAILED:
|
case HTTP_STATUS_412_PRECONDITION_FAILED:
|
||||||
AsciiPrint ("\n Client Error: 412 Precondition Failed");
|
AsciiPrint ("\n Client Error: 412 Precondition Failed");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HTTP_STATUS_413_REQUEST_ENTITY_TOO_LARGE:
|
case HTTP_STATUS_413_REQUEST_ENTITY_TOO_LARGE:
|
||||||
AsciiPrint ("\n Client Error: 413 Request Entity Too Large");
|
AsciiPrint ("\n Client Error: 413 Request Entity Too Large");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HTTP_STATUS_414_REQUEST_URI_TOO_LARGE:
|
case HTTP_STATUS_414_REQUEST_URI_TOO_LARGE:
|
||||||
AsciiPrint ("\n Client Error: 414 Request URI Too Long");
|
AsciiPrint ("\n Client Error: 414 Request URI Too Long");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HTTP_STATUS_415_UNSUPPORTED_MEDIA_TYPE:
|
case HTTP_STATUS_415_UNSUPPORTED_MEDIA_TYPE:
|
||||||
AsciiPrint ("\n Client Error: 415 Unsupported Media Type");
|
AsciiPrint ("\n Client Error: 415 Unsupported Media Type");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HTTP_STATUS_416_REQUESTED_RANGE_NOT_SATISFIED:
|
case HTTP_STATUS_416_REQUESTED_RANGE_NOT_SATISFIED:
|
||||||
AsciiPrint ("\n Client Error: 416 Requested Range Not Satisfiable");
|
AsciiPrint ("\n Client Error: 416 Requested Range Not Satisfiable");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HTTP_STATUS_417_EXPECTATION_FAILED:
|
case HTTP_STATUS_417_EXPECTATION_FAILED:
|
||||||
AsciiPrint ("\n Client Error: 417 Expectation Failed");
|
AsciiPrint ("\n Client Error: 417 Expectation Failed");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HTTP_STATUS_500_INTERNAL_SERVER_ERROR:
|
case HTTP_STATUS_500_INTERNAL_SERVER_ERROR:
|
||||||
AsciiPrint ("\n Server Error: 500 Internal Server Error");
|
AsciiPrint ("\n Server Error: 500 Internal Server Error");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HTTP_STATUS_501_NOT_IMPLEMENTED:
|
case HTTP_STATUS_501_NOT_IMPLEMENTED:
|
||||||
AsciiPrint ("\n Server Error: 501 Not Implemented");
|
AsciiPrint ("\n Server Error: 501 Not Implemented");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HTTP_STATUS_502_BAD_GATEWAY:
|
case HTTP_STATUS_502_BAD_GATEWAY:
|
||||||
AsciiPrint ("\n Server Error: 502 Bad Gateway");
|
AsciiPrint ("\n Server Error: 502 Bad Gateway");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HTTP_STATUS_503_SERVICE_UNAVAILABLE:
|
case HTTP_STATUS_503_SERVICE_UNAVAILABLE:
|
||||||
AsciiPrint ("\n Server Error: 503 Service Unavailable");
|
AsciiPrint ("\n Server Error: 503 Service Unavailable");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HTTP_STATUS_504_GATEWAY_TIME_OUT:
|
case HTTP_STATUS_504_GATEWAY_TIME_OUT:
|
||||||
AsciiPrint ("\n Server Error: 504 Gateway Timeout");
|
AsciiPrint ("\n Server Error: 504 Gateway Timeout");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HTTP_STATUS_505_HTTP_VERSION_NOT_SUPPORTED:
|
case HTTP_STATUS_505_HTTP_VERSION_NOT_SUPPORTED:
|
||||||
AsciiPrint ("\n Server Error: 505 HTTP Version Not Supported");
|
AsciiPrint ("\n Server Error: 505 HTTP Version Not Supported");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default: ;
|
|
||||||
|
|
||||||
|
default:;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -297,11 +298,11 @@ HttpBootPrintErrorMessage (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
HttpBootCommonNotify (
|
HttpBootCommonNotify (
|
||||||
IN EFI_EVENT Event,
|
IN EFI_EVENT Event,
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
*((BOOLEAN *) Context) = TRUE;
|
*((BOOLEAN *)Context) = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -317,38 +318,38 @@ HttpBootCommonNotify (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpBootDns (
|
HttpBootDns (
|
||||||
IN HTTP_BOOT_PRIVATE_DATA *Private,
|
IN HTTP_BOOT_PRIVATE_DATA *Private,
|
||||||
IN CHAR16 *HostName,
|
IN CHAR16 *HostName,
|
||||||
OUT EFI_IPv6_ADDRESS *IpAddress
|
OUT EFI_IPv6_ADDRESS *IpAddress
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_DNS6_PROTOCOL *Dns6;
|
EFI_DNS6_PROTOCOL *Dns6;
|
||||||
EFI_DNS6_CONFIG_DATA Dns6ConfigData;
|
EFI_DNS6_CONFIG_DATA Dns6ConfigData;
|
||||||
EFI_DNS6_COMPLETION_TOKEN Token;
|
EFI_DNS6_COMPLETION_TOKEN Token;
|
||||||
EFI_HANDLE Dns6Handle;
|
EFI_HANDLE Dns6Handle;
|
||||||
EFI_IP6_CONFIG_PROTOCOL *Ip6Config;
|
EFI_IP6_CONFIG_PROTOCOL *Ip6Config;
|
||||||
EFI_IPv6_ADDRESS *DnsServerList;
|
EFI_IPv6_ADDRESS *DnsServerList;
|
||||||
UINTN DnsServerListCount;
|
UINTN DnsServerListCount;
|
||||||
UINTN DataSize;
|
UINTN DataSize;
|
||||||
BOOLEAN IsDone;
|
BOOLEAN IsDone;
|
||||||
|
|
||||||
DnsServerList = NULL;
|
DnsServerList = NULL;
|
||||||
DnsServerListCount = 0;
|
DnsServerListCount = 0;
|
||||||
Dns6 = NULL;
|
Dns6 = NULL;
|
||||||
Dns6Handle = NULL;
|
Dns6Handle = NULL;
|
||||||
ZeroMem (&Token, sizeof (EFI_DNS6_COMPLETION_TOKEN));
|
ZeroMem (&Token, sizeof (EFI_DNS6_COMPLETION_TOKEN));
|
||||||
|
|
||||||
//
|
//
|
||||||
// Get DNS server list from EFI IPv6 Configuration protocol.
|
// Get DNS server list from EFI IPv6 Configuration protocol.
|
||||||
//
|
//
|
||||||
Status = gBS->HandleProtocol (Private->Controller, &gEfiIp6ConfigProtocolGuid, (VOID **) &Ip6Config);
|
Status = gBS->HandleProtocol (Private->Controller, &gEfiIp6ConfigProtocolGuid, (VOID **)&Ip6Config);
|
||||||
if (!EFI_ERROR (Status)) {
|
if (!EFI_ERROR (Status)) {
|
||||||
//
|
//
|
||||||
// Get the required size.
|
// Get the required size.
|
||||||
//
|
//
|
||||||
DataSize = 0;
|
DataSize = 0;
|
||||||
Status = Ip6Config->GetData (Ip6Config, Ip6ConfigDataTypeDnsServer, &DataSize, NULL);
|
Status = Ip6Config->GetData (Ip6Config, Ip6ConfigDataTypeDnsServer, &DataSize, NULL);
|
||||||
if (Status == EFI_BUFFER_TOO_SMALL) {
|
if (Status == EFI_BUFFER_TOO_SMALL) {
|
||||||
DnsServerList = AllocatePool (DataSize);
|
DnsServerList = AllocatePool (DataSize);
|
||||||
if (DnsServerList == NULL) {
|
if (DnsServerList == NULL) {
|
||||||
@ -364,6 +365,7 @@ HttpBootDns (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Create a DNSv6 child instance and get the protocol.
|
// Create a DNSv6 child instance and get the protocol.
|
||||||
//
|
//
|
||||||
@ -380,7 +382,7 @@ HttpBootDns (
|
|||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
Dns6Handle,
|
Dns6Handle,
|
||||||
&gEfiDns6ProtocolGuid,
|
&gEfiDns6ProtocolGuid,
|
||||||
(VOID **) &Dns6,
|
(VOID **)&Dns6,
|
||||||
Private->Ip6Nic->ImageHandle,
|
Private->Ip6Nic->ImageHandle,
|
||||||
Private->Controller,
|
Private->Controller,
|
||||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||||
@ -397,11 +399,11 @@ HttpBootDns (
|
|||||||
Dns6ConfigData.DnsServerList = DnsServerList;
|
Dns6ConfigData.DnsServerList = DnsServerList;
|
||||||
Dns6ConfigData.EnableDnsCache = TRUE;
|
Dns6ConfigData.EnableDnsCache = TRUE;
|
||||||
Dns6ConfigData.Protocol = EFI_IP_PROTO_UDP;
|
Dns6ConfigData.Protocol = EFI_IP_PROTO_UDP;
|
||||||
IP6_COPY_ADDRESS (&Dns6ConfigData.StationIp,&Private->StationIp.v6);
|
IP6_COPY_ADDRESS (&Dns6ConfigData.StationIp, &Private->StationIp.v6);
|
||||||
Status = Dns6->Configure (
|
Status = Dns6->Configure (
|
||||||
Dns6,
|
Dns6,
|
||||||
&Dns6ConfigData
|
&Dns6ConfigData
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
goto Exit;
|
goto Exit;
|
||||||
}
|
}
|
||||||
@ -443,25 +445,30 @@ HttpBootDns (
|
|||||||
Status = EFI_DEVICE_ERROR;
|
Status = EFI_DEVICE_ERROR;
|
||||||
goto Exit;
|
goto Exit;
|
||||||
}
|
}
|
||||||
if (Token.RspData.H2AData->IpCount == 0 || Token.RspData.H2AData->IpList == NULL) {
|
|
||||||
|
if ((Token.RspData.H2AData->IpCount == 0) || (Token.RspData.H2AData->IpList == NULL)) {
|
||||||
Status = EFI_DEVICE_ERROR;
|
Status = EFI_DEVICE_ERROR;
|
||||||
goto Exit;
|
goto Exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// We just return the first IPv6 address from DNS protocol.
|
// We just return the first IPv6 address from DNS protocol.
|
||||||
//
|
//
|
||||||
IP6_COPY_ADDRESS (IpAddress, Token.RspData.H2AData->IpList);
|
IP6_COPY_ADDRESS (IpAddress, Token.RspData.H2AData->IpList);
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
Exit:
|
Exit:
|
||||||
|
|
||||||
if (Token.Event != NULL) {
|
if (Token.Event != NULL) {
|
||||||
gBS->CloseEvent (Token.Event);
|
gBS->CloseEvent (Token.Event);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Token.RspData.H2AData != NULL) {
|
if (Token.RspData.H2AData != NULL) {
|
||||||
if (Token.RspData.H2AData->IpList != NULL) {
|
if (Token.RspData.H2AData->IpList != NULL) {
|
||||||
FreePool (Token.RspData.H2AData->IpList);
|
FreePool (Token.RspData.H2AData->IpList);
|
||||||
}
|
}
|
||||||
|
|
||||||
FreePool (Token.RspData.H2AData);
|
FreePool (Token.RspData.H2AData);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -504,11 +511,11 @@ Exit:
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpBootCheckUriScheme (
|
HttpBootCheckUriScheme (
|
||||||
IN CHAR8 *Uri
|
IN CHAR8 *Uri
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
|
|
||||||
@ -519,7 +526,8 @@ HttpBootCheckUriScheme (
|
|||||||
if (Uri[Index] == ':') {
|
if (Uri[Index] == ':') {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (Uri[Index] >= 'A' && Uri[Index] <= 'Z') {
|
|
||||||
|
if ((Uri[Index] >= 'A') && (Uri[Index] <= 'Z')) {
|
||||||
Uri[Index] -= (CHAR8)('A' - 'a');
|
Uri[Index] -= (CHAR8)('A' - 'a');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -557,8 +565,8 @@ HttpBootCheckUriScheme (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpBootParseFilePath (
|
HttpBootParseFilePath (
|
||||||
IN EFI_DEVICE_PATH_PROTOCOL *FilePath,
|
IN EFI_DEVICE_PATH_PROTOCOL *FilePath,
|
||||||
OUT CHAR8 **UriAddress
|
OUT CHAR8 **UriAddress
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_DEVICE_PATH_PROTOCOL *TempDevicePath;
|
EFI_DEVICE_PATH_PROTOCOL *TempDevicePath;
|
||||||
@ -578,28 +586,32 @@ HttpBootParseFilePath (
|
|||||||
TempDevicePath = FilePath;
|
TempDevicePath = FilePath;
|
||||||
while (!IsDevicePathEnd (TempDevicePath)) {
|
while (!IsDevicePathEnd (TempDevicePath)) {
|
||||||
if ((DevicePathType (TempDevicePath) == MESSAGING_DEVICE_PATH) &&
|
if ((DevicePathType (TempDevicePath) == MESSAGING_DEVICE_PATH) &&
|
||||||
(DevicePathSubType (TempDevicePath) == MSG_URI_DP)) {
|
(DevicePathSubType (TempDevicePath) == MSG_URI_DP))
|
||||||
UriDevicePath = (URI_DEVICE_PATH*) TempDevicePath;
|
{
|
||||||
|
UriDevicePath = (URI_DEVICE_PATH *)TempDevicePath;
|
||||||
//
|
//
|
||||||
// UEFI Spec doesn't require the URI to be a NULL-terminated string
|
// 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.
|
// So we allocate a new buffer and always append a '\0' to it.
|
||||||
//
|
//
|
||||||
UriStrLength = DevicePathNodeLength (UriDevicePath) - sizeof(EFI_DEVICE_PATH_PROTOCOL);
|
UriStrLength = DevicePathNodeLength (UriDevicePath) - sizeof (EFI_DEVICE_PATH_PROTOCOL);
|
||||||
if (UriStrLength == 0) {
|
if (UriStrLength == 0) {
|
||||||
//
|
//
|
||||||
// return a NULL UriAddress if it's a empty URI device path node.
|
// return a NULL UriAddress if it's a empty URI device path node.
|
||||||
//
|
//
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
Uri = AllocatePool (UriStrLength + 1);
|
Uri = AllocatePool (UriStrLength + 1);
|
||||||
if (Uri == NULL) {
|
if (Uri == NULL) {
|
||||||
return EFI_OUT_OF_RESOURCES;
|
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';
|
CopyMem (Uri, UriDevicePath->Uri, DevicePathNodeLength (UriDevicePath) - sizeof (EFI_DEVICE_PATH_PROTOCOL));
|
||||||
|
Uri[DevicePathNodeLength (UriDevicePath) - sizeof (EFI_DEVICE_PATH_PROTOCOL)] = '\0';
|
||||||
|
|
||||||
*UriAddress = Uri;
|
*UriAddress = Uri;
|
||||||
}
|
}
|
||||||
|
|
||||||
TempDevicePath = NextDevicePathNode (TempDevicePath);
|
TempDevicePath = NextDevicePathNode (TempDevicePath);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -625,23 +637,23 @@ HttpBootParseFilePath (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpBootCheckImageType (
|
HttpBootCheckImageType (
|
||||||
IN CHAR8 *Uri,
|
IN CHAR8 *Uri,
|
||||||
IN VOID *UriParser,
|
IN VOID *UriParser,
|
||||||
IN UINTN HeaderCount,
|
IN UINTN HeaderCount,
|
||||||
IN EFI_HTTP_HEADER *Headers,
|
IN EFI_HTTP_HEADER *Headers,
|
||||||
OUT HTTP_BOOT_IMAGE_TYPE *ImageType
|
OUT HTTP_BOOT_IMAGE_TYPE *ImageType
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_HTTP_HEADER *Header;
|
EFI_HTTP_HEADER *Header;
|
||||||
CHAR8 *FilePath;
|
CHAR8 *FilePath;
|
||||||
CHAR8 *FilePost;
|
CHAR8 *FilePost;
|
||||||
|
|
||||||
if (Uri == NULL || UriParser == NULL || ImageType == NULL) {
|
if ((Uri == NULL) || (UriParser == NULL) || (ImageType == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (HeaderCount != 0 && Headers == NULL) {
|
if ((HeaderCount != 0) && (Headers == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -712,22 +724,22 @@ HttpBootCheckImageType (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpBootRegisterRamDisk (
|
HttpBootRegisterRamDisk (
|
||||||
IN HTTP_BOOT_PRIVATE_DATA *Private,
|
IN HTTP_BOOT_PRIVATE_DATA *Private,
|
||||||
IN UINTN BufferSize,
|
IN UINTN BufferSize,
|
||||||
IN VOID *Buffer,
|
IN VOID *Buffer,
|
||||||
IN HTTP_BOOT_IMAGE_TYPE ImageType
|
IN HTTP_BOOT_IMAGE_TYPE ImageType
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_RAM_DISK_PROTOCOL *RamDisk;
|
EFI_RAM_DISK_PROTOCOL *RamDisk;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||||
EFI_GUID *RamDiskType;
|
EFI_GUID *RamDiskType;
|
||||||
|
|
||||||
ASSERT (Private != NULL);
|
ASSERT (Private != NULL);
|
||||||
ASSERT (Buffer != NULL);
|
ASSERT (Buffer != NULL);
|
||||||
ASSERT (BufferSize != 0);
|
ASSERT (BufferSize != 0);
|
||||||
|
|
||||||
Status = gBS->LocateProtocol (&gEfiRamDiskProtocolGuid, NULL, (VOID**) &RamDisk);
|
Status = gBS->LocateProtocol (&gEfiRamDiskProtocolGuid, NULL, (VOID **)&RamDisk);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
DEBUG ((DEBUG_ERROR, "HTTP Boot: Couldn't find the RAM Disk protocol - %r\n", Status));
|
DEBUG ((DEBUG_ERROR, "HTTP Boot: Couldn't find the RAM Disk protocol - %r\n", Status));
|
||||||
return Status;
|
return Status;
|
||||||
@ -742,12 +754,12 @@ HttpBootRegisterRamDisk (
|
|||||||
}
|
}
|
||||||
|
|
||||||
Status = RamDisk->Register (
|
Status = RamDisk->Register (
|
||||||
(UINTN)Buffer,
|
(UINTN)Buffer,
|
||||||
(UINT64)BufferSize,
|
(UINT64)BufferSize,
|
||||||
RamDiskType,
|
RamDiskType,
|
||||||
Private->UsingIpv6 ? Private->Ip6Nic->DevicePath : Private->Ip4Nic->DevicePath,
|
Private->UsingIpv6 ? Private->Ip6Nic->DevicePath : Private->Ip4Nic->DevicePath,
|
||||||
&DevicePath
|
&DevicePath
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
DEBUG ((DEBUG_ERROR, "HTTP Boot: Failed to register RAM Disk - %r\n", Status));
|
DEBUG ((DEBUG_ERROR, "HTTP Boot: Failed to register RAM Disk - %r\n", Status));
|
||||||
}
|
}
|
||||||
@ -765,13 +777,14 @@ HttpBootRegisterRamDisk (
|
|||||||
**/
|
**/
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
HttpBootIsHttpRedirectStatusCode (
|
HttpBootIsHttpRedirectStatusCode (
|
||||||
IN EFI_HTTP_STATUS_CODE StatusCode
|
IN EFI_HTTP_STATUS_CODE StatusCode
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
if (StatusCode == HTTP_STATUS_301_MOVED_PERMANENTLY ||
|
if ((StatusCode == HTTP_STATUS_301_MOVED_PERMANENTLY) ||
|
||||||
StatusCode == HTTP_STATUS_302_FOUND ||
|
(StatusCode == HTTP_STATUS_302_FOUND) ||
|
||||||
StatusCode == HTTP_STATUS_307_TEMPORARY_REDIRECT ||
|
(StatusCode == HTTP_STATUS_307_TEMPORARY_REDIRECT) ||
|
||||||
StatusCode == HTTP_STATUS_308_PERMANENT_REDIRECT) {
|
(StatusCode == HTTP_STATUS_308_PERMANENT_REDIRECT))
|
||||||
|
{
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -21,7 +21,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
**/
|
**/
|
||||||
EFI_HANDLE
|
EFI_HANDLE
|
||||||
HttpBootGetNicByIp4Children (
|
HttpBootGetNicByIp4Children (
|
||||||
IN EFI_HANDLE ControllerHandle
|
IN EFI_HANDLE ControllerHandle
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -35,7 +35,7 @@ HttpBootGetNicByIp4Children (
|
|||||||
**/
|
**/
|
||||||
EFI_HANDLE
|
EFI_HANDLE
|
||||||
HttpBootGetNicByIp6Children (
|
HttpBootGetNicByIp6Children (
|
||||||
IN EFI_HANDLE ControllerHandle
|
IN EFI_HANDLE ControllerHandle
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -48,12 +48,11 @@ HttpBootGetNicByIp6Children (
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
HttpBootUintnToAscDecWithFormat (
|
HttpBootUintnToAscDecWithFormat (
|
||||||
IN UINTN Number,
|
IN UINTN Number,
|
||||||
IN UINT8 *Buffer,
|
IN UINT8 *Buffer,
|
||||||
IN INTN Length
|
IN INTN Length
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This function is to display the IPv4 address.
|
This function is to display the IPv4 address.
|
||||||
|
|
||||||
@ -62,7 +61,7 @@ HttpBootUintnToAscDecWithFormat (
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
HttpBootShowIp4Addr (
|
HttpBootShowIp4Addr (
|
||||||
IN EFI_IPv4_ADDRESS *Ip
|
IN EFI_IPv4_ADDRESS *Ip
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -73,7 +72,7 @@ HttpBootShowIp4Addr (
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
HttpBootShowIp6Addr (
|
HttpBootShowIp6Addr (
|
||||||
IN EFI_IPv6_ADDRESS *Ip
|
IN EFI_IPv6_ADDRESS *Ip
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -84,7 +83,7 @@ HttpBootShowIp6Addr (
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
HttpBootPrintErrorMessage (
|
HttpBootPrintErrorMessage (
|
||||||
EFI_HTTP_STATUS_CODE StatusCode
|
EFI_HTTP_STATUS_CODE StatusCode
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -100,9 +99,9 @@ HttpBootPrintErrorMessage (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpBootDns (
|
HttpBootDns (
|
||||||
IN HTTP_BOOT_PRIVATE_DATA *Private,
|
IN HTTP_BOOT_PRIVATE_DATA *Private,
|
||||||
IN CHAR16 *HostName,
|
IN CHAR16 *HostName,
|
||||||
OUT EFI_IPv6_ADDRESS *IpAddress
|
OUT EFI_IPv6_ADDRESS *IpAddress
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -115,8 +114,8 @@ HttpBootDns (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
HttpBootCommonNotify (
|
HttpBootCommonNotify (
|
||||||
IN EFI_EVENT Event,
|
IN EFI_EVENT Event,
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -131,7 +130,7 @@ HttpBootCommonNotify (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpBootCheckUriScheme (
|
HttpBootCheckUriScheme (
|
||||||
IN CHAR8 *Uri
|
IN CHAR8 *Uri
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -148,8 +147,8 @@ HttpBootCheckUriScheme (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpBootParseFilePath (
|
HttpBootParseFilePath (
|
||||||
IN EFI_DEVICE_PATH_PROTOCOL *FilePath,
|
IN EFI_DEVICE_PATH_PROTOCOL *FilePath,
|
||||||
OUT CHAR8 **UriAddress
|
OUT CHAR8 **UriAddress
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -171,11 +170,11 @@ HttpBootParseFilePath (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpBootCheckImageType (
|
HttpBootCheckImageType (
|
||||||
IN CHAR8 *Uri,
|
IN CHAR8 *Uri,
|
||||||
IN VOID *UriParser,
|
IN VOID *UriParser,
|
||||||
IN UINTN HeaderCount,
|
IN UINTN HeaderCount,
|
||||||
IN EFI_HTTP_HEADER *Headers,
|
IN EFI_HTTP_HEADER *Headers,
|
||||||
OUT HTTP_BOOT_IMAGE_TYPE *ImageType
|
OUT HTTP_BOOT_IMAGE_TYPE *ImageType
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -194,10 +193,10 @@ HttpBootCheckImageType (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpBootRegisterRamDisk (
|
HttpBootRegisterRamDisk (
|
||||||
IN HTTP_BOOT_PRIVATE_DATA *Private,
|
IN HTTP_BOOT_PRIVATE_DATA *Private,
|
||||||
IN UINTN BufferSize,
|
IN UINTN BufferSize,
|
||||||
IN VOID *Buffer,
|
IN VOID *Buffer,
|
||||||
IN HTTP_BOOT_IMAGE_TYPE ImageType
|
IN HTTP_BOOT_IMAGE_TYPE ImageType
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -210,6 +209,7 @@ HttpBootRegisterRamDisk (
|
|||||||
**/
|
**/
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
HttpBootIsHttpRedirectStatusCode (
|
HttpBootIsHttpRedirectStatusCode (
|
||||||
IN EFI_HTTP_STATUS_CODE StatusCode
|
IN EFI_HTTP_STATUS_CODE StatusCode
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -15,8 +15,8 @@
|
|||||||
///
|
///
|
||||||
GLOBAL_REMOVE_IF_UNREFERENCED
|
GLOBAL_REMOVE_IF_UNREFERENCED
|
||||||
EFI_COMPONENT_NAME_PROTOCOL gHttpDxeComponentName = {
|
EFI_COMPONENT_NAME_PROTOCOL gHttpDxeComponentName = {
|
||||||
(EFI_COMPONENT_NAME_GET_DRIVER_NAME) HttpDxeComponentNameGetDriverName,
|
(EFI_COMPONENT_NAME_GET_DRIVER_NAME)HttpDxeComponentNameGetDriverName,
|
||||||
(EFI_COMPONENT_NAME_GET_CONTROLLER_NAME) HttpDxeComponentNameGetControllerName,
|
(EFI_COMPONENT_NAME_GET_CONTROLLER_NAME)HttpDxeComponentNameGetControllerName,
|
||||||
"eng"
|
"eng"
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -34,9 +34,9 @@ EFI_COMPONENT_NAME2_PROTOCOL gHttpDxeComponentName2 = {
|
|||||||
/// Table of driver names
|
/// Table of driver names
|
||||||
///
|
///
|
||||||
GLOBAL_REMOVE_IF_UNREFERENCED
|
GLOBAL_REMOVE_IF_UNREFERENCED
|
||||||
EFI_UNICODE_STRING_TABLE mHttpDxeDriverNameTable[] = {
|
EFI_UNICODE_STRING_TABLE mHttpDxeDriverNameTable[] = {
|
||||||
{ "eng;en", (CHAR16 *) L"HttpDxe" },
|
{ "eng;en", (CHAR16 *)L"HttpDxe" },
|
||||||
{ NULL, NULL }
|
{ NULL, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -23,23 +23,22 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpDns4 (
|
HttpDns4 (
|
||||||
IN HTTP_PROTOCOL *HttpInstance,
|
IN HTTP_PROTOCOL *HttpInstance,
|
||||||
IN CHAR16 *HostName,
|
IN CHAR16 *HostName,
|
||||||
OUT EFI_IPv4_ADDRESS *IpAddress
|
OUT EFI_IPv4_ADDRESS *IpAddress
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_DNS4_PROTOCOL *Dns4;
|
EFI_DNS4_PROTOCOL *Dns4;
|
||||||
EFI_DNS4_CONFIG_DATA Dns4CfgData;
|
EFI_DNS4_CONFIG_DATA Dns4CfgData;
|
||||||
EFI_DNS4_COMPLETION_TOKEN Token;
|
EFI_DNS4_COMPLETION_TOKEN Token;
|
||||||
BOOLEAN IsDone;
|
BOOLEAN IsDone;
|
||||||
HTTP_SERVICE *Service;
|
HTTP_SERVICE *Service;
|
||||||
EFI_HANDLE Dns4Handle;
|
EFI_HANDLE Dns4Handle;
|
||||||
EFI_IP4_CONFIG2_PROTOCOL *Ip4Config2;
|
EFI_IP4_CONFIG2_PROTOCOL *Ip4Config2;
|
||||||
UINTN DnsServerListCount;
|
UINTN DnsServerListCount;
|
||||||
EFI_IPv4_ADDRESS *DnsServerList;
|
EFI_IPv4_ADDRESS *DnsServerList;
|
||||||
UINTN DataSize;
|
UINTN DataSize;
|
||||||
|
|
||||||
|
|
||||||
Service = HttpInstance->Service;
|
Service = HttpInstance->Service;
|
||||||
ASSERT (Service != NULL);
|
ASSERT (Service != NULL);
|
||||||
@ -51,7 +50,7 @@ HttpDns4 (
|
|||||||
//
|
//
|
||||||
// Get DNS server list from EFI IPv4 Configuration II protocol.
|
// Get DNS server list from EFI IPv4 Configuration II protocol.
|
||||||
//
|
//
|
||||||
Status = gBS->HandleProtocol (Service->ControllerHandle, &gEfiIp4Config2ProtocolGuid, (VOID **) &Ip4Config2);
|
Status = gBS->HandleProtocol (Service->ControllerHandle, &gEfiIp4Config2ProtocolGuid, (VOID **)&Ip4Config2);
|
||||||
if (!EFI_ERROR (Status)) {
|
if (!EFI_ERROR (Status)) {
|
||||||
//
|
//
|
||||||
// Get the required size.
|
// Get the required size.
|
||||||
@ -64,7 +63,7 @@ HttpDns4 (
|
|||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = Ip4Config2->GetData (Ip4Config2, Ip4Config2DataTypeDnsServer, &DataSize, DnsServerList);
|
Status = Ip4Config2->GetData (Ip4Config2, Ip4Config2DataTypeDnsServer, &DataSize, DnsServerList);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
FreePool (DnsServerList);
|
FreePool (DnsServerList);
|
||||||
DnsServerList = NULL;
|
DnsServerList = NULL;
|
||||||
@ -93,7 +92,7 @@ HttpDns4 (
|
|||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
Dns4Handle,
|
Dns4Handle,
|
||||||
&gEfiDns4ProtocolGuid,
|
&gEfiDns4ProtocolGuid,
|
||||||
(VOID **) &Dns4,
|
(VOID **)&Dns4,
|
||||||
Service->Ip4DriverBindingHandle,
|
Service->Ip4DriverBindingHandle,
|
||||||
Service->ControllerHandle,
|
Service->ControllerHandle,
|
||||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||||
@ -113,12 +112,13 @@ HttpDns4 (
|
|||||||
IP4_COPY_ADDRESS (&Dns4CfgData.StationIp, &HttpInstance->IPv4Node.LocalAddress);
|
IP4_COPY_ADDRESS (&Dns4CfgData.StationIp, &HttpInstance->IPv4Node.LocalAddress);
|
||||||
IP4_COPY_ADDRESS (&Dns4CfgData.SubnetMask, &HttpInstance->IPv4Node.LocalSubnet);
|
IP4_COPY_ADDRESS (&Dns4CfgData.SubnetMask, &HttpInstance->IPv4Node.LocalSubnet);
|
||||||
}
|
}
|
||||||
Dns4CfgData.EnableDnsCache = TRUE;
|
|
||||||
Dns4CfgData.Protocol = EFI_IP_PROTO_UDP;
|
Dns4CfgData.EnableDnsCache = TRUE;
|
||||||
Status = Dns4->Configure (
|
Dns4CfgData.Protocol = EFI_IP_PROTO_UDP;
|
||||||
Dns4,
|
Status = Dns4->Configure (
|
||||||
&Dns4CfgData
|
Dns4,
|
||||||
);
|
&Dns4CfgData
|
||||||
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
goto Exit;
|
goto Exit;
|
||||||
}
|
}
|
||||||
@ -143,7 +143,7 @@ HttpDns4 (
|
|||||||
//
|
//
|
||||||
Token.Status = EFI_NOT_READY;
|
Token.Status = EFI_NOT_READY;
|
||||||
IsDone = FALSE;
|
IsDone = FALSE;
|
||||||
Status = Dns4->HostNameToIp (Dns4, HostName, &Token);
|
Status = Dns4->HostNameToIp (Dns4, HostName, &Token);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
goto Exit;
|
goto Exit;
|
||||||
}
|
}
|
||||||
@ -161,10 +161,12 @@ HttpDns4 (
|
|||||||
Status = EFI_DEVICE_ERROR;
|
Status = EFI_DEVICE_ERROR;
|
||||||
goto Exit;
|
goto Exit;
|
||||||
}
|
}
|
||||||
if (Token.RspData.H2AData->IpCount == 0 || Token.RspData.H2AData->IpList == NULL) {
|
|
||||||
|
if ((Token.RspData.H2AData->IpCount == 0) || (Token.RspData.H2AData->IpList == NULL)) {
|
||||||
Status = EFI_DEVICE_ERROR;
|
Status = EFI_DEVICE_ERROR;
|
||||||
goto Exit;
|
goto Exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// We just return the first IP address from DNS protocol.
|
// We just return the first IP address from DNS protocol.
|
||||||
//
|
//
|
||||||
@ -177,10 +179,12 @@ Exit:
|
|||||||
if (Token.Event != NULL) {
|
if (Token.Event != NULL) {
|
||||||
gBS->CloseEvent (Token.Event);
|
gBS->CloseEvent (Token.Event);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Token.RspData.H2AData != NULL) {
|
if (Token.RspData.H2AData != NULL) {
|
||||||
if (Token.RspData.H2AData->IpList != NULL) {
|
if (Token.RspData.H2AData->IpList != NULL) {
|
||||||
FreePool (Token.RspData.H2AData->IpList);
|
FreePool (Token.RspData.H2AData->IpList);
|
||||||
}
|
}
|
||||||
|
|
||||||
FreePool (Token.RspData.H2AData);
|
FreePool (Token.RspData.H2AData);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -226,43 +230,42 @@ Exit:
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpDns6 (
|
HttpDns6 (
|
||||||
IN HTTP_PROTOCOL *HttpInstance,
|
IN HTTP_PROTOCOL *HttpInstance,
|
||||||
IN CHAR16 *HostName,
|
IN CHAR16 *HostName,
|
||||||
OUT EFI_IPv6_ADDRESS *IpAddress
|
OUT EFI_IPv6_ADDRESS *IpAddress
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
HTTP_SERVICE *Service;
|
HTTP_SERVICE *Service;
|
||||||
EFI_DNS6_PROTOCOL *Dns6;
|
EFI_DNS6_PROTOCOL *Dns6;
|
||||||
EFI_DNS6_CONFIG_DATA Dns6ConfigData;
|
EFI_DNS6_CONFIG_DATA Dns6ConfigData;
|
||||||
EFI_DNS6_COMPLETION_TOKEN Token;
|
EFI_DNS6_COMPLETION_TOKEN Token;
|
||||||
EFI_HANDLE Dns6Handle;
|
EFI_HANDLE Dns6Handle;
|
||||||
EFI_IP6_CONFIG_PROTOCOL *Ip6Config;
|
EFI_IP6_CONFIG_PROTOCOL *Ip6Config;
|
||||||
EFI_IPv6_ADDRESS *DnsServerList;
|
EFI_IPv6_ADDRESS *DnsServerList;
|
||||||
UINTN DnsServerListCount;
|
UINTN DnsServerListCount;
|
||||||
UINTN DataSize;
|
UINTN DataSize;
|
||||||
BOOLEAN IsDone;
|
BOOLEAN IsDone;
|
||||||
|
|
||||||
|
|
||||||
Service = HttpInstance->Service;
|
Service = HttpInstance->Service;
|
||||||
ASSERT (Service != NULL);
|
ASSERT (Service != NULL);
|
||||||
|
|
||||||
DnsServerList = NULL;
|
DnsServerList = NULL;
|
||||||
DnsServerListCount = 0;
|
DnsServerListCount = 0;
|
||||||
Dns6 = NULL;
|
Dns6 = NULL;
|
||||||
Dns6Handle = NULL;
|
Dns6Handle = NULL;
|
||||||
ZeroMem (&Token, sizeof (EFI_DNS6_COMPLETION_TOKEN));
|
ZeroMem (&Token, sizeof (EFI_DNS6_COMPLETION_TOKEN));
|
||||||
|
|
||||||
//
|
//
|
||||||
// Get DNS server list from EFI IPv6 Configuration protocol.
|
// Get DNS server list from EFI IPv6 Configuration protocol.
|
||||||
//
|
//
|
||||||
Status = gBS->HandleProtocol (Service->ControllerHandle, &gEfiIp6ConfigProtocolGuid, (VOID **) &Ip6Config);
|
Status = gBS->HandleProtocol (Service->ControllerHandle, &gEfiIp6ConfigProtocolGuid, (VOID **)&Ip6Config);
|
||||||
if (!EFI_ERROR (Status)) {
|
if (!EFI_ERROR (Status)) {
|
||||||
//
|
//
|
||||||
// Get the required size.
|
// Get the required size.
|
||||||
//
|
//
|
||||||
DataSize = 0;
|
DataSize = 0;
|
||||||
Status = Ip6Config->GetData (Ip6Config, Ip6ConfigDataTypeDnsServer, &DataSize, NULL);
|
Status = Ip6Config->GetData (Ip6Config, Ip6ConfigDataTypeDnsServer, &DataSize, NULL);
|
||||||
if (Status == EFI_BUFFER_TOO_SMALL) {
|
if (Status == EFI_BUFFER_TOO_SMALL) {
|
||||||
DnsServerList = AllocatePool (DataSize);
|
DnsServerList = AllocatePool (DataSize);
|
||||||
if (DnsServerList == NULL) {
|
if (DnsServerList == NULL) {
|
||||||
@ -295,7 +298,7 @@ HttpDns6 (
|
|||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
Dns6Handle,
|
Dns6Handle,
|
||||||
&gEfiDns6ProtocolGuid,
|
&gEfiDns6ProtocolGuid,
|
||||||
(VOID **) &Dns6,
|
(VOID **)&Dns6,
|
||||||
Service->Ip6DriverBindingHandle,
|
Service->Ip6DriverBindingHandle,
|
||||||
Service->ControllerHandle,
|
Service->ControllerHandle,
|
||||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||||
@ -358,10 +361,12 @@ HttpDns6 (
|
|||||||
Status = EFI_DEVICE_ERROR;
|
Status = EFI_DEVICE_ERROR;
|
||||||
goto Exit;
|
goto Exit;
|
||||||
}
|
}
|
||||||
if (Token.RspData.H2AData->IpCount == 0 || Token.RspData.H2AData->IpList == NULL) {
|
|
||||||
|
if ((Token.RspData.H2AData->IpCount == 0) || (Token.RspData.H2AData->IpList == NULL)) {
|
||||||
Status = EFI_DEVICE_ERROR;
|
Status = EFI_DEVICE_ERROR;
|
||||||
goto Exit;
|
goto Exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// We just return the first IPv6 address from DNS protocol.
|
// We just return the first IPv6 address from DNS protocol.
|
||||||
//
|
//
|
||||||
@ -374,10 +379,12 @@ Exit:
|
|||||||
if (Token.Event != NULL) {
|
if (Token.Event != NULL) {
|
||||||
gBS->CloseEvent (Token.Event);
|
gBS->CloseEvent (Token.Event);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Token.RspData.H2AData != NULL) {
|
if (Token.RspData.H2AData != NULL) {
|
||||||
if (Token.RspData.H2AData->IpList != NULL) {
|
if (Token.RspData.H2AData->IpList != NULL) {
|
||||||
FreePool (Token.RspData.H2AData->IpList);
|
FreePool (Token.RspData.H2AData->IpList);
|
||||||
}
|
}
|
||||||
|
|
||||||
FreePool (Token.RspData.H2AData);
|
FreePool (Token.RspData.H2AData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -24,9 +24,9 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpDns4 (
|
HttpDns4 (
|
||||||
IN HTTP_PROTOCOL *HttpInstance,
|
IN HTTP_PROTOCOL *HttpInstance,
|
||||||
IN CHAR16 *HostName,
|
IN CHAR16 *HostName,
|
||||||
OUT EFI_IPv4_ADDRESS *IpAddress
|
OUT EFI_IPv4_ADDRESS *IpAddress
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -44,9 +44,9 @@ HttpDns4 (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpDns6 (
|
HttpDns6 (
|
||||||
IN HTTP_PROTOCOL *HttpInstance,
|
IN HTTP_PROTOCOL *HttpInstance,
|
||||||
IN CHAR16 *HostName,
|
IN CHAR16 *HostName,
|
||||||
OUT EFI_IPv6_ADDRESS *IpAddress
|
OUT EFI_IPv6_ADDRESS *IpAddress
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -10,12 +10,12 @@
|
|||||||
|
|
||||||
#include "HttpDriver.h"
|
#include "HttpDriver.h"
|
||||||
|
|
||||||
EFI_HTTP_UTILITIES_PROTOCOL *mHttpUtilities = NULL;
|
EFI_HTTP_UTILITIES_PROTOCOL *mHttpUtilities = NULL;
|
||||||
|
|
||||||
///
|
///
|
||||||
/// Driver Binding Protocol instance
|
/// Driver Binding Protocol instance
|
||||||
///
|
///
|
||||||
EFI_DRIVER_BINDING_PROTOCOL gHttpDxeIp4DriverBinding = {
|
EFI_DRIVER_BINDING_PROTOCOL gHttpDxeIp4DriverBinding = {
|
||||||
HttpDxeIp4DriverBindingSupported,
|
HttpDxeIp4DriverBindingSupported,
|
||||||
HttpDxeIp4DriverBindingStart,
|
HttpDxeIp4DriverBindingStart,
|
||||||
HttpDxeIp4DriverBindingStop,
|
HttpDxeIp4DriverBindingStop,
|
||||||
@ -24,7 +24,7 @@ EFI_DRIVER_BINDING_PROTOCOL gHttpDxeIp4DriverBinding = {
|
|||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
EFI_DRIVER_BINDING_PROTOCOL gHttpDxeIp6DriverBinding = {
|
EFI_DRIVER_BINDING_PROTOCOL gHttpDxeIp6DriverBinding = {
|
||||||
HttpDxeIp6DriverBindingSupported,
|
HttpDxeIp6DriverBindingSupported,
|
||||||
HttpDxeIp6DriverBindingStart,
|
HttpDxeIp6DriverBindingStart,
|
||||||
HttpDxeIp6DriverBindingStop,
|
HttpDxeIp6DriverBindingStop,
|
||||||
@ -33,7 +33,6 @@ EFI_DRIVER_BINDING_PROTOCOL gHttpDxeIp6DriverBinding = {
|
|||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Create a HTTP driver service binding private instance.
|
Create a HTTP driver service binding private instance.
|
||||||
|
|
||||||
@ -47,11 +46,11 @@ EFI_DRIVER_BINDING_PROTOCOL gHttpDxeIp6DriverBinding = {
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpCreateService (
|
HttpCreateService (
|
||||||
IN EFI_HANDLE Controller,
|
IN EFI_HANDLE Controller,
|
||||||
OUT HTTP_SERVICE **ServiceData
|
OUT HTTP_SERVICE **ServiceData
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
HTTP_SERVICE *HttpService;
|
HTTP_SERVICE *HttpService;
|
||||||
|
|
||||||
ASSERT (ServiceData != NULL);
|
ASSERT (ServiceData != NULL);
|
||||||
*ServiceData = NULL;
|
*ServiceData = NULL;
|
||||||
@ -61,11 +60,11 @@ HttpCreateService (
|
|||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
HttpService->Signature = HTTP_SERVICE_SIGNATURE;
|
HttpService->Signature = HTTP_SERVICE_SIGNATURE;
|
||||||
HttpService->ServiceBinding.CreateChild = HttpServiceBindingCreateChild;
|
HttpService->ServiceBinding.CreateChild = HttpServiceBindingCreateChild;
|
||||||
HttpService->ServiceBinding.DestroyChild = HttpServiceBindingDestroyChild;
|
HttpService->ServiceBinding.DestroyChild = HttpServiceBindingDestroyChild;
|
||||||
HttpService->ControllerHandle = Controller;
|
HttpService->ControllerHandle = Controller;
|
||||||
HttpService->ChildrenNumber = 0;
|
HttpService->ChildrenNumber = 0;
|
||||||
InitializeListHead (&HttpService->ChildrenList);
|
InitializeListHead (&HttpService->ChildrenList);
|
||||||
|
|
||||||
*ServiceData = HttpService;
|
*ServiceData = HttpService;
|
||||||
@ -82,14 +81,14 @@ HttpCreateService (
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
HttpCleanService (
|
HttpCleanService (
|
||||||
IN HTTP_SERVICE *HttpService,
|
IN HTTP_SERVICE *HttpService,
|
||||||
IN BOOLEAN UsingIpv6
|
IN BOOLEAN UsingIpv6
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (HttpService == NULL) {
|
if (HttpService == NULL) {
|
||||||
return ;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!UsingIpv6) {
|
if (!UsingIpv6) {
|
||||||
if (HttpService->Tcp4ChildHandle != NULL) {
|
if (HttpService->Tcp4ChildHandle != NULL) {
|
||||||
gBS->CloseProtocol (
|
gBS->CloseProtocol (
|
||||||
@ -127,7 +126,6 @@ HttpCleanService (
|
|||||||
HttpService->Tcp6ChildHandle = NULL;
|
HttpService->Tcp6ChildHandle = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -148,14 +146,14 @@ HttpUtilitiesInstalledCallback (
|
|||||||
gBS->LocateProtocol (
|
gBS->LocateProtocol (
|
||||||
&gEfiHttpUtilitiesProtocolGuid,
|
&gEfiHttpUtilitiesProtocolGuid,
|
||||||
NULL,
|
NULL,
|
||||||
(VOID **) &mHttpUtilities
|
(VOID **)&mHttpUtilities
|
||||||
);
|
);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Close the event if Http utilities protocol is located.
|
// Close the event if Http utilities protocol is located.
|
||||||
//
|
//
|
||||||
if (mHttpUtilities != NULL && Event != NULL) {
|
if ((mHttpUtilities != NULL) && (Event != NULL)) {
|
||||||
gBS->CloseEvent (Event);
|
gBS->CloseEvent (Event);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -178,13 +176,13 @@ HttpDxeDriverEntryPoint (
|
|||||||
IN EFI_SYSTEM_TABLE *SystemTable
|
IN EFI_SYSTEM_TABLE *SystemTable
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
VOID *Registration;
|
VOID *Registration;
|
||||||
|
|
||||||
gBS->LocateProtocol (
|
gBS->LocateProtocol (
|
||||||
&gEfiHttpUtilitiesProtocolGuid,
|
&gEfiHttpUtilitiesProtocolGuid,
|
||||||
NULL,
|
NULL,
|
||||||
(VOID **) &mHttpUtilities
|
(VOID **)&mHttpUtilities
|
||||||
);
|
);
|
||||||
|
|
||||||
if (mHttpUtilities == NULL) {
|
if (mHttpUtilities == NULL) {
|
||||||
@ -230,6 +228,7 @@ HttpDxeDriverEntryPoint (
|
|||||||
&gHttpDxeComponentName2
|
&gHttpDxeComponentName2
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -247,8 +246,8 @@ HttpDxeDriverEntryPoint (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
HttpDestroyChildEntryInHandleBuffer (
|
HttpDestroyChildEntryInHandleBuffer (
|
||||||
IN LIST_ENTRY *Entry,
|
IN LIST_ENTRY *Entry,
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
HTTP_PROTOCOL *HttpInstance;
|
HTTP_PROTOCOL *HttpInstance;
|
||||||
@ -256,14 +255,14 @@ HttpDestroyChildEntryInHandleBuffer (
|
|||||||
UINTN NumberOfChildren;
|
UINTN NumberOfChildren;
|
||||||
EFI_HANDLE *ChildHandleBuffer;
|
EFI_HANDLE *ChildHandleBuffer;
|
||||||
|
|
||||||
if (Entry == NULL || Context == NULL) {
|
if ((Entry == NULL) || (Context == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
HttpInstance = NET_LIST_USER_STRUCT_S (Entry, HTTP_PROTOCOL, Link, HTTP_PROTOCOL_SIGNATURE);
|
HttpInstance = NET_LIST_USER_STRUCT_S (Entry, HTTP_PROTOCOL, Link, HTTP_PROTOCOL_SIGNATURE);
|
||||||
ServiceBinding = ((HTTP_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT *) Context)->ServiceBinding;
|
ServiceBinding = ((HTTP_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT *)Context)->ServiceBinding;
|
||||||
NumberOfChildren = ((HTTP_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT *) Context)->NumberOfChildren;
|
NumberOfChildren = ((HTTP_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT *)Context)->NumberOfChildren;
|
||||||
ChildHandleBuffer = ((HTTP_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT *) Context)->ChildHandleBuffer;
|
ChildHandleBuffer = ((HTTP_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT *)Context)->ChildHandleBuffer;
|
||||||
|
|
||||||
if (!NetIsInHandleBuffer (HttpInstance->Handle, NumberOfChildren, ChildHandleBuffer)) {
|
if (!NetIsInHandleBuffer (HttpInstance->Handle, NumberOfChildren, ChildHandleBuffer)) {
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
@ -295,8 +294,8 @@ HttpDxeSupported (
|
|||||||
IN UINT8 IpVersion
|
IN UINT8 IpVersion
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_GUID *TcpServiceBindingProtocolGuid;
|
EFI_GUID *TcpServiceBindingProtocolGuid;
|
||||||
|
|
||||||
if (IpVersion == IP_VERSION_4) {
|
if (IpVersion == IP_VERSION_4) {
|
||||||
TcpServiceBindingProtocolGuid = &gEfiTcp4ServiceBindingProtocolGuid;
|
TcpServiceBindingProtocolGuid = &gEfiTcp4ServiceBindingProtocolGuid;
|
||||||
@ -305,13 +304,13 @@ HttpDxeSupported (
|
|||||||
}
|
}
|
||||||
|
|
||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
TcpServiceBindingProtocolGuid,
|
TcpServiceBindingProtocolGuid,
|
||||||
NULL,
|
NULL,
|
||||||
This->DriverBindingHandle,
|
This->DriverBindingHandle,
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
EFI_OPEN_PROTOCOL_TEST_PROTOCOL
|
EFI_OPEN_PROTOCOL_TEST_PROTOCOL
|
||||||
);
|
);
|
||||||
|
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
@ -345,11 +344,11 @@ HttpDxeStart (
|
|||||||
IN UINT8 IpVersion
|
IN UINT8 IpVersion
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding;
|
EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding;
|
||||||
HTTP_SERVICE *HttpService;
|
HTTP_SERVICE *HttpService;
|
||||||
VOID *Interface;
|
VOID *Interface;
|
||||||
BOOLEAN UsingIpv6;
|
BOOLEAN UsingIpv6;
|
||||||
|
|
||||||
UsingIpv6 = FALSE;
|
UsingIpv6 = FALSE;
|
||||||
|
|
||||||
@ -359,7 +358,7 @@ HttpDxeStart (
|
|||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
&gEfiHttpServiceBindingProtocolGuid,
|
&gEfiHttpServiceBindingProtocolGuid,
|
||||||
(VOID **) &ServiceBinding,
|
(VOID **)&ServiceBinding,
|
||||||
This->DriverBindingHandle,
|
This->DriverBindingHandle,
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||||
@ -420,13 +419,11 @@ HttpDxeStart (
|
|||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
goto ON_ERROR;
|
goto ON_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
return EFI_ALREADY_STARTED;
|
return EFI_ALREADY_STARTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
UsingIpv6 = TRUE;
|
UsingIpv6 = TRUE;
|
||||||
HttpService->Ip6DriverBindingHandle = This->DriverBindingHandle;
|
HttpService->Ip6DriverBindingHandle = This->DriverBindingHandle;
|
||||||
|
|
||||||
if (HttpService->Tcp6ChildHandle == NULL) {
|
if (HttpService->Tcp6ChildHandle == NULL) {
|
||||||
@ -456,11 +453,9 @@ HttpDxeStart (
|
|||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
goto ON_ERROR;
|
goto ON_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
return EFI_ALREADY_STARTED;
|
return EFI_ALREADY_STARTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
@ -469,14 +464,12 @@ ON_ERROR:
|
|||||||
|
|
||||||
if (HttpService != NULL) {
|
if (HttpService != NULL) {
|
||||||
HttpCleanService (HttpService, UsingIpv6);
|
HttpCleanService (HttpService, UsingIpv6);
|
||||||
if (HttpService->Tcp4ChildHandle == NULL && HttpService->Tcp6ChildHandle == NULL) {
|
if ((HttpService->Tcp4ChildHandle == NULL) && (HttpService->Tcp6ChildHandle == NULL)) {
|
||||||
FreePool (HttpService);
|
FreePool (HttpService);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -505,13 +498,13 @@ HttpDxeStop (
|
|||||||
IN UINT8 IpVersion
|
IN UINT8 IpVersion
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_HANDLE NicHandle;
|
EFI_HANDLE NicHandle;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding;
|
EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding;
|
||||||
HTTP_SERVICE *HttpService;
|
HTTP_SERVICE *HttpService;
|
||||||
LIST_ENTRY *List;
|
LIST_ENTRY *List;
|
||||||
HTTP_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT Context;
|
HTTP_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT Context;
|
||||||
BOOLEAN UsingIpv6;
|
BOOLEAN UsingIpv6;
|
||||||
|
|
||||||
//
|
//
|
||||||
// HTTP driver opens TCP4(6) child, So, Controller is a TCP4(6)
|
// HTTP driver opens TCP4(6) child, So, Controller is a TCP4(6)
|
||||||
@ -533,35 +526,33 @@ HttpDxeStop (
|
|||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
NicHandle,
|
NicHandle,
|
||||||
&gEfiHttpServiceBindingProtocolGuid,
|
&gEfiHttpServiceBindingProtocolGuid,
|
||||||
(VOID **) &ServiceBinding,
|
(VOID **)&ServiceBinding,
|
||||||
This->DriverBindingHandle,
|
This->DriverBindingHandle,
|
||||||
NicHandle,
|
NicHandle,
|
||||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!EFI_ERROR (Status)) {
|
if (!EFI_ERROR (Status)) {
|
||||||
|
|
||||||
HttpService = HTTP_SERVICE_FROM_PROTOCOL (ServiceBinding);
|
HttpService = HTTP_SERVICE_FROM_PROTOCOL (ServiceBinding);
|
||||||
|
|
||||||
if (NumberOfChildren != 0) {
|
if (NumberOfChildren != 0) {
|
||||||
//
|
//
|
||||||
// Destroy the HTTP child instance in ChildHandleBuffer.
|
// Destroy the HTTP child instance in ChildHandleBuffer.
|
||||||
//
|
//
|
||||||
List = &HttpService->ChildrenList;
|
List = &HttpService->ChildrenList;
|
||||||
Context.ServiceBinding = ServiceBinding;
|
Context.ServiceBinding = ServiceBinding;
|
||||||
Context.NumberOfChildren = NumberOfChildren;
|
Context.NumberOfChildren = NumberOfChildren;
|
||||||
Context.ChildHandleBuffer = ChildHandleBuffer;
|
Context.ChildHandleBuffer = ChildHandleBuffer;
|
||||||
Status = NetDestroyLinkList (
|
Status = NetDestroyLinkList (
|
||||||
List,
|
List,
|
||||||
HttpDestroyChildEntryInHandleBuffer,
|
HttpDestroyChildEntryInHandleBuffer,
|
||||||
&Context,
|
&Context,
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
HttpCleanService (HttpService, UsingIpv6);
|
HttpCleanService (HttpService, UsingIpv6);
|
||||||
|
|
||||||
if (HttpService->Tcp4ChildHandle == NULL && HttpService->Tcp6ChildHandle == NULL) {
|
if ((HttpService->Tcp4ChildHandle == NULL) && (HttpService->Tcp6ChildHandle == NULL)) {
|
||||||
gBS->UninstallProtocolInterface (
|
gBS->UninstallProtocolInterface (
|
||||||
NicHandle,
|
NicHandle,
|
||||||
&gEfiHttpServiceBindingProtocolGuid,
|
&gEfiHttpServiceBindingProtocolGuid,
|
||||||
@ -569,12 +560,12 @@ HttpDxeStop (
|
|||||||
);
|
);
|
||||||
FreePool (HttpService);
|
FreePool (HttpService);
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -787,7 +778,6 @@ HttpDxeIp6DriverBindingSupported (
|
|||||||
RemainingDevicePath,
|
RemainingDevicePath,
|
||||||
IP_VERSION_6
|
IP_VERSION_6
|
||||||
);
|
);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -885,6 +875,7 @@ HttpDxeIp6DriverBindingStop (
|
|||||||
IP_VERSION_6
|
IP_VERSION_6
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Creates a child handle and installs a protocol.
|
Creates a child handle and installs a protocol.
|
||||||
|
|
||||||
@ -911,10 +902,10 @@ HttpServiceBindingCreateChild (
|
|||||||
IN OUT EFI_HANDLE *ChildHandle
|
IN OUT EFI_HANDLE *ChildHandle
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
HTTP_SERVICE *HttpService;
|
HTTP_SERVICE *HttpService;
|
||||||
HTTP_PROTOCOL *HttpInstance;
|
HTTP_PROTOCOL *HttpInstance;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
|
|
||||||
if ((This == NULL) || (ChildHandle == NULL)) {
|
if ((This == NULL) || (ChildHandle == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
@ -928,7 +919,7 @@ HttpServiceBindingCreateChild (
|
|||||||
|
|
||||||
HttpInstance->Signature = HTTP_PROTOCOL_SIGNATURE;
|
HttpInstance->Signature = HTTP_PROTOCOL_SIGNATURE;
|
||||||
HttpInstance->Service = HttpService;
|
HttpInstance->Service = HttpService;
|
||||||
HttpInstance->Method = HttpMethodMax;
|
HttpInstance->Method = HttpMethodMax;
|
||||||
|
|
||||||
CopyMem (&HttpInstance->Http, &mEfiHttpTemplate, sizeof (HttpInstance->Http));
|
CopyMem (&HttpInstance->Http, &mEfiHttpTemplate, sizeof (HttpInstance->Http));
|
||||||
NetMapInit (&HttpInstance->TxTokens);
|
NetMapInit (&HttpInstance->TxTokens);
|
||||||
@ -948,7 +939,7 @@ HttpServiceBindingCreateChild (
|
|||||||
goto ON_ERROR;
|
goto ON_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
HttpInstance->Handle = *ChildHandle;
|
HttpInstance->Handle = *ChildHandle;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Add it to the HTTP service's child list.
|
// Add it to the HTTP service's child list.
|
||||||
@ -994,25 +985,25 @@ HttpServiceBindingDestroyChild (
|
|||||||
IN EFI_HANDLE ChildHandle
|
IN EFI_HANDLE ChildHandle
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
HTTP_SERVICE *HttpService;
|
HTTP_SERVICE *HttpService;
|
||||||
HTTP_PROTOCOL *HttpInstance;
|
HTTP_PROTOCOL *HttpInstance;
|
||||||
EFI_HTTP_PROTOCOL *Http;
|
EFI_HTTP_PROTOCOL *Http;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_TPL OldTpl;
|
EFI_TPL OldTpl;
|
||||||
|
|
||||||
if ((This == NULL) || (ChildHandle == NULL)) {
|
if ((This == NULL) || (ChildHandle == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
HttpService = HTTP_SERVICE_FROM_PROTOCOL (This);
|
HttpService = HTTP_SERVICE_FROM_PROTOCOL (This);
|
||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
ChildHandle,
|
ChildHandle,
|
||||||
&gEfiHttpProtocolGuid,
|
&gEfiHttpProtocolGuid,
|
||||||
(VOID **) &Http,
|
(VOID **)&Http,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
@ -63,7 +63,7 @@
|
|||||||
//
|
//
|
||||||
// Driver Version
|
// Driver Version
|
||||||
//
|
//
|
||||||
#define HTTP_DRIVER_VERSION 0xa
|
#define HTTP_DRIVER_VERSION 0xa
|
||||||
|
|
||||||
//
|
//
|
||||||
// Protocol instances
|
// Protocol instances
|
||||||
@ -71,8 +71,8 @@
|
|||||||
extern EFI_DRIVER_BINDING_PROTOCOL gHttpDxeIp4DriverBinding;
|
extern EFI_DRIVER_BINDING_PROTOCOL gHttpDxeIp4DriverBinding;
|
||||||
extern EFI_DRIVER_BINDING_PROTOCOL gHttpDxeIp6DriverBinding;
|
extern EFI_DRIVER_BINDING_PROTOCOL gHttpDxeIp6DriverBinding;
|
||||||
|
|
||||||
extern EFI_COMPONENT_NAME2_PROTOCOL gHttpDxeComponentName2;
|
extern EFI_COMPONENT_NAME2_PROTOCOL gHttpDxeComponentName2;
|
||||||
extern EFI_COMPONENT_NAME_PROTOCOL gHttpDxeComponentName;
|
extern EFI_COMPONENT_NAME_PROTOCOL gHttpDxeComponentName;
|
||||||
|
|
||||||
extern EFI_HTTP_UTILITIES_PROTOCOL *mHttpUtilities;
|
extern EFI_HTTP_UTILITIES_PROTOCOL *mHttpUtilities;
|
||||||
|
|
||||||
@ -86,9 +86,9 @@ extern EFI_HTTP_UTILITIES_PROTOCOL *mHttpUtilities;
|
|||||||
#include "HttpDns.h"
|
#include "HttpDns.h"
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding;
|
EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding;
|
||||||
UINTN NumberOfChildren;
|
UINTN NumberOfChildren;
|
||||||
EFI_HANDLE *ChildHandleBuffer;
|
EFI_HANDLE *ChildHandleBuffer;
|
||||||
} HTTP_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT;
|
} HTTP_DESTROY_CHILD_IN_HANDLE_BUF_CONTEXT;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -45,11 +45,11 @@ EFI_HTTP_PROTOCOL mEfiHttpTemplate = {
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EfiHttpGetModeData (
|
EfiHttpGetModeData (
|
||||||
IN EFI_HTTP_PROTOCOL *This,
|
IN EFI_HTTP_PROTOCOL *This,
|
||||||
OUT EFI_HTTP_CONFIG_DATA *HttpConfigData
|
OUT EFI_HTTP_CONFIG_DATA *HttpConfigData
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
HTTP_PROTOCOL *HttpInstance;
|
HTTP_PROTOCOL *HttpInstance;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Check input parameters.
|
// Check input parameters.
|
||||||
@ -61,7 +61,8 @@ EfiHttpGetModeData (
|
|||||||
HttpInstance = HTTP_INSTANCE_FROM_PROTOCOL (This);
|
HttpInstance = HTTP_INSTANCE_FROM_PROTOCOL (This);
|
||||||
|
|
||||||
if ((HttpConfigData->AccessPoint.IPv6Node == NULL) ||
|
if ((HttpConfigData->AccessPoint.IPv6Node == NULL) ||
|
||||||
(HttpConfigData->AccessPoint.IPv4Node == NULL)) {
|
(HttpConfigData->AccessPoint.IPv4Node == NULL))
|
||||||
|
{
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -78,7 +79,7 @@ EfiHttpGetModeData (
|
|||||||
HttpConfigData->AccessPoint.IPv6Node,
|
HttpConfigData->AccessPoint.IPv6Node,
|
||||||
&HttpInstance->Ipv6Node,
|
&HttpInstance->Ipv6Node,
|
||||||
sizeof (HttpInstance->Ipv6Node)
|
sizeof (HttpInstance->Ipv6Node)
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
CopyMem (
|
CopyMem (
|
||||||
HttpConfigData->AccessPoint.IPv4Node,
|
HttpConfigData->AccessPoint.IPv4Node,
|
||||||
@ -124,20 +125,21 @@ EfiHttpGetModeData (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EfiHttpConfigure (
|
EfiHttpConfigure (
|
||||||
IN EFI_HTTP_PROTOCOL *This,
|
IN EFI_HTTP_PROTOCOL *This,
|
||||||
IN EFI_HTTP_CONFIG_DATA *HttpConfigData OPTIONAL
|
IN EFI_HTTP_CONFIG_DATA *HttpConfigData OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
HTTP_PROTOCOL *HttpInstance;
|
HTTP_PROTOCOL *HttpInstance;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Check input parameters.
|
// Check input parameters.
|
||||||
//
|
//
|
||||||
if (This == NULL ||
|
if ((This == NULL) ||
|
||||||
(HttpConfigData != NULL &&
|
((HttpConfigData != NULL) &&
|
||||||
((HttpConfigData->LocalAddressIsIPv6 && HttpConfigData->AccessPoint.IPv6Node == NULL) ||
|
((HttpConfigData->LocalAddressIsIPv6 && (HttpConfigData->AccessPoint.IPv6Node == NULL)) ||
|
||||||
(!HttpConfigData->LocalAddressIsIPv6 && HttpConfigData->AccessPoint.IPv4Node == NULL)))) {
|
(!HttpConfigData->LocalAddressIsIPv6 && (HttpConfigData->AccessPoint.IPv4Node == NULL)))))
|
||||||
|
{
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -145,7 +147,6 @@ EfiHttpConfigure (
|
|||||||
ASSERT (HttpInstance->Service != NULL);
|
ASSERT (HttpInstance->Service != NULL);
|
||||||
|
|
||||||
if (HttpConfigData != NULL) {
|
if (HttpConfigData != NULL) {
|
||||||
|
|
||||||
if (HttpConfigData->HttpVersion >= HttpVersionUnsupported) {
|
if (HttpConfigData->HttpVersion >= HttpVersionUnsupported) {
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
@ -185,7 +186,6 @@ EfiHttpConfigure (
|
|||||||
|
|
||||||
HttpInstance->State = HTTP_STATE_HTTP_CONFIGED;
|
HttpInstance->State = HTTP_STATE_HTTP_CONFIGED;
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
//
|
//
|
||||||
// Reset all the resources related to HttpInstance.
|
// Reset all the resources related to HttpInstance.
|
||||||
@ -196,7 +196,6 @@ EfiHttpConfigure (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The Request() function queues an HTTP request to this HTTP instance.
|
The Request() function queues an HTTP request to this HTTP instance.
|
||||||
|
|
||||||
@ -226,41 +225,41 @@ EfiHttpConfigure (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EfiHttpRequest (
|
EfiHttpRequest (
|
||||||
IN EFI_HTTP_PROTOCOL *This,
|
IN EFI_HTTP_PROTOCOL *This,
|
||||||
IN EFI_HTTP_TOKEN *Token
|
IN EFI_HTTP_TOKEN *Token
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_HTTP_MESSAGE *HttpMsg;
|
EFI_HTTP_MESSAGE *HttpMsg;
|
||||||
EFI_HTTP_REQUEST_DATA *Request;
|
EFI_HTTP_REQUEST_DATA *Request;
|
||||||
VOID *UrlParser;
|
VOID *UrlParser;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
CHAR8 *HostName;
|
CHAR8 *HostName;
|
||||||
UINTN HostNameSize;
|
UINTN HostNameSize;
|
||||||
UINT16 RemotePort;
|
UINT16 RemotePort;
|
||||||
HTTP_PROTOCOL *HttpInstance;
|
HTTP_PROTOCOL *HttpInstance;
|
||||||
BOOLEAN Configure;
|
BOOLEAN Configure;
|
||||||
BOOLEAN ReConfigure;
|
BOOLEAN ReConfigure;
|
||||||
BOOLEAN TlsConfigure;
|
BOOLEAN TlsConfigure;
|
||||||
CHAR8 *RequestMsg;
|
CHAR8 *RequestMsg;
|
||||||
CHAR8 *Url;
|
CHAR8 *Url;
|
||||||
UINTN UrlLen;
|
UINTN UrlLen;
|
||||||
CHAR16 *HostNameStr;
|
CHAR16 *HostNameStr;
|
||||||
HTTP_TOKEN_WRAP *Wrap;
|
HTTP_TOKEN_WRAP *Wrap;
|
||||||
CHAR8 *FileUrl;
|
CHAR8 *FileUrl;
|
||||||
UINTN RequestMsgSize;
|
UINTN RequestMsgSize;
|
||||||
EFI_HANDLE ImageHandle;
|
EFI_HANDLE ImageHandle;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Initializations
|
// Initializations
|
||||||
//
|
//
|
||||||
Url = NULL;
|
Url = NULL;
|
||||||
UrlParser = NULL;
|
UrlParser = NULL;
|
||||||
RemotePort = 0;
|
RemotePort = 0;
|
||||||
HostName = NULL;
|
HostName = NULL;
|
||||||
RequestMsg = NULL;
|
RequestMsg = NULL;
|
||||||
HostNameStr = NULL;
|
HostNameStr = NULL;
|
||||||
Wrap = NULL;
|
Wrap = NULL;
|
||||||
FileUrl = NULL;
|
FileUrl = NULL;
|
||||||
TlsConfigure = FALSE;
|
TlsConfigure = FALSE;
|
||||||
|
|
||||||
if ((This == NULL) || (Token == NULL)) {
|
if ((This == NULL) || (Token == NULL)) {
|
||||||
@ -280,7 +279,8 @@ EfiHttpRequest (
|
|||||||
if ((Request != NULL) && (Request->Method != HttpMethodGet) &&
|
if ((Request != NULL) && (Request->Method != HttpMethodGet) &&
|
||||||
(Request->Method != HttpMethodHead) && (Request->Method != HttpMethodDelete) &&
|
(Request->Method != HttpMethodHead) && (Request->Method != HttpMethodDelete) &&
|
||||||
(Request->Method != HttpMethodPut) && (Request->Method != HttpMethodPost) &&
|
(Request->Method != HttpMethodPut) && (Request->Method != HttpMethodPost) &&
|
||||||
(Request->Method != HttpMethodPatch)) {
|
(Request->Method != HttpMethodPatch))
|
||||||
|
{
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -303,7 +303,8 @@ EfiHttpRequest (
|
|||||||
//
|
//
|
||||||
if ((HttpInstance->Method != HttpMethodPut) &&
|
if ((HttpInstance->Method != HttpMethodPut) &&
|
||||||
(HttpInstance->Method != HttpMethodPost) &&
|
(HttpInstance->Method != HttpMethodPost) &&
|
||||||
(HttpInstance->Method != HttpMethodPatch)) {
|
(HttpInstance->Method != HttpMethodPatch))
|
||||||
|
{
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -317,7 +318,7 @@ EfiHttpRequest (
|
|||||||
//
|
//
|
||||||
// We need to have the Message Body for sending the HTTP message across in these cases.
|
// We need to have the Message Body for sending the HTTP message across in these cases.
|
||||||
//
|
//
|
||||||
if (HttpMsg->Body == NULL || HttpMsg->BodyLength == 0) {
|
if ((HttpMsg->Body == NULL) || (HttpMsg->BodyLength == 0)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -337,18 +338,18 @@ EfiHttpRequest (
|
|||||||
//
|
//
|
||||||
// Parse the URI of the remote host.
|
// Parse the URI of the remote host.
|
||||||
//
|
//
|
||||||
Url = HttpInstance->Url;
|
Url = HttpInstance->Url;
|
||||||
UrlLen = StrLen (Request->Url) + 1;
|
UrlLen = StrLen (Request->Url) + 1;
|
||||||
if (UrlLen > HTTP_URL_BUFFER_LEN) {
|
if (UrlLen > HTTP_URL_BUFFER_LEN) {
|
||||||
Url = AllocateZeroPool (UrlLen);
|
Url = AllocateZeroPool (UrlLen);
|
||||||
if (Url == NULL) {
|
if (Url == NULL) {
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
FreePool (HttpInstance->Url);
|
FreePool (HttpInstance->Url);
|
||||||
HttpInstance->Url = Url;
|
HttpInstance->Url = Url;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
UnicodeStrToAsciiStrS (Request->Url, Url, UrlLen);
|
UnicodeStrToAsciiStrS (Request->Url, Url, UrlLen);
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -361,7 +362,6 @@ EfiHttpRequest (
|
|||||||
// HTTP is disabled, return directly if the URI is not HTTPS.
|
// HTTP is disabled, return directly if the URI is not HTTPS.
|
||||||
//
|
//
|
||||||
if (!PcdGetBool (PcdAllowHttpConnections) && !(HttpInstance->UseHttps)) {
|
if (!PcdGetBool (PcdAllowHttpConnections) && !(HttpInstance->UseHttps)) {
|
||||||
|
|
||||||
DEBUG ((DEBUG_ERROR, "EfiHttpRequest: HTTP is disabled.\n"));
|
DEBUG ((DEBUG_ERROR, "EfiHttpRequest: HTTP is disabled.\n"));
|
||||||
|
|
||||||
return EFI_ACCESS_DENIED;
|
return EFI_ACCESS_DENIED;
|
||||||
@ -370,7 +370,7 @@ EfiHttpRequest (
|
|||||||
//
|
//
|
||||||
// Check whether we need to create Tls child and open the TLS protocol.
|
// Check whether we need to create Tls child and open the TLS protocol.
|
||||||
//
|
//
|
||||||
if (HttpInstance->UseHttps && HttpInstance->TlsChildHandle == NULL) {
|
if (HttpInstance->UseHttps && (HttpInstance->TlsChildHandle == NULL)) {
|
||||||
//
|
//
|
||||||
// Use TlsSb to create Tls child and open the TLS protocol.
|
// Use TlsSb to create Tls child and open the TLS protocol.
|
||||||
//
|
//
|
||||||
@ -394,7 +394,7 @@ EfiHttpRequest (
|
|||||||
}
|
}
|
||||||
|
|
||||||
UrlParser = NULL;
|
UrlParser = NULL;
|
||||||
Status = HttpParseUrl (Url, (UINT32) AsciiStrLen (Url), FALSE, &UrlParser);
|
Status = HttpParseUrl (Url, (UINT32)AsciiStrLen (Url), FALSE, &UrlParser);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
goto Error1;
|
goto Error1;
|
||||||
}
|
}
|
||||||
@ -407,7 +407,7 @@ EfiHttpRequest (
|
|||||||
if (HttpInstance->LocalAddressIsIPv6) {
|
if (HttpInstance->LocalAddressIsIPv6) {
|
||||||
HostNameSize = AsciiStrSize (HostName);
|
HostNameSize = AsciiStrSize (HostName);
|
||||||
|
|
||||||
if (HostNameSize > 2 && HostName[0] == '[' && HostName[HostNameSize - 2] == ']') {
|
if ((HostNameSize > 2) && (HostName[0] == '[') && (HostName[HostNameSize - 2] == ']')) {
|
||||||
//
|
//
|
||||||
// HostName format is expressed as IPv6, so, remove '[' and ']'.
|
// HostName format is expressed as IPv6, so, remove '[' and ']'.
|
||||||
//
|
//
|
||||||
@ -425,6 +425,7 @@ EfiHttpRequest (
|
|||||||
RemotePort = HTTP_DEFAULT_PORT;
|
RemotePort = HTTP_DEFAULT_PORT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// If Configure is TRUE, it indicates the first time to call Request();
|
// If Configure is TRUE, it indicates the first time to call Request();
|
||||||
// If ReConfigure is TRUE, it indicates the request URL is not same
|
// If ReConfigure is TRUE, it indicates the request URL is not same
|
||||||
@ -443,7 +444,8 @@ EfiHttpRequest (
|
|||||||
(AsciiStrCmp (HttpInstance->RemoteHost, HostName) == 0) &&
|
(AsciiStrCmp (HttpInstance->RemoteHost, HostName) == 0) &&
|
||||||
(!HttpInstance->UseHttps || (HttpInstance->UseHttps &&
|
(!HttpInstance->UseHttps || (HttpInstance->UseHttps &&
|
||||||
!TlsConfigure &&
|
!TlsConfigure &&
|
||||||
HttpInstance->TlsSessionState == EfiTlsSessionDataTransferring))) {
|
(HttpInstance->TlsSessionState == EfiTlsSessionDataTransferring))))
|
||||||
|
{
|
||||||
//
|
//
|
||||||
// Host Name and port number of the request URL are the same with previous call to Request().
|
// Host Name and port number of the request URL are the same with previous call to Request().
|
||||||
// If Https protocol used, the corresponding SessionState is EfiTlsSessionDataTransferring.
|
// If Https protocol used, the corresponding SessionState is EfiTlsSessionDataTransferring.
|
||||||
@ -515,7 +517,7 @@ EfiHttpRequest (
|
|||||||
|
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
HostNameSize = AsciiStrSize (HostName);
|
HostNameSize = AsciiStrSize (HostName);
|
||||||
HostNameStr = AllocateZeroPool (HostNameSize * sizeof (CHAR16));
|
HostNameStr = AllocateZeroPool (HostNameSize * sizeof (CHAR16));
|
||||||
if (HostNameStr == NULL) {
|
if (HostNameStr == NULL) {
|
||||||
Status = EFI_OUT_OF_RESOURCES;
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
goto Error1;
|
goto Error1;
|
||||||
@ -527,6 +529,7 @@ EfiHttpRequest (
|
|||||||
} else {
|
} else {
|
||||||
Status = HttpDns6 (HttpInstance, HostNameStr, &HttpInstance->RemoteIpv6Addr);
|
Status = HttpDns6 (HttpInstance, HostNameStr, &HttpInstance->RemoteIpv6Addr);
|
||||||
}
|
}
|
||||||
|
|
||||||
HttpNotify (HttpEventDns, Status);
|
HttpNotify (HttpEventDns, Status);
|
||||||
|
|
||||||
FreePool (HostNameStr);
|
FreePool (HostNameStr);
|
||||||
@ -542,7 +545,7 @@ EfiHttpRequest (
|
|||||||
ASSERT (HttpInstance->RemoteHost == NULL);
|
ASSERT (HttpInstance->RemoteHost == NULL);
|
||||||
HttpInstance->RemotePort = RemotePort;
|
HttpInstance->RemotePort = RemotePort;
|
||||||
HttpInstance->RemoteHost = HostName;
|
HttpInstance->RemoteHost = HostName;
|
||||||
HostName = NULL;
|
HostName = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ReConfigure) {
|
if (ReConfigure) {
|
||||||
@ -577,8 +580,8 @@ EfiHttpRequest (
|
|||||||
goto Error1;
|
goto Error1;
|
||||||
}
|
}
|
||||||
|
|
||||||
Wrap->HttpToken = Token;
|
Wrap->HttpToken = Token;
|
||||||
Wrap->HttpInstance = HttpInstance;
|
Wrap->HttpInstance = HttpInstance;
|
||||||
if (Request != NULL) {
|
if (Request != NULL) {
|
||||||
Wrap->TcpWrap.Method = Request->Method;
|
Wrap->TcpWrap.Method = Request->Method;
|
||||||
}
|
}
|
||||||
@ -608,13 +611,14 @@ EfiHttpRequest (
|
|||||||
// Create request message.
|
// Create request message.
|
||||||
//
|
//
|
||||||
FileUrl = Url;
|
FileUrl = Url;
|
||||||
if (Url != NULL && *FileUrl != '/') {
|
if ((Url != NULL) && (*FileUrl != '/')) {
|
||||||
//
|
//
|
||||||
// Convert the absolute-URI to the absolute-path
|
// Convert the absolute-URI to the absolute-path
|
||||||
//
|
//
|
||||||
while (*FileUrl != ':') {
|
while (*FileUrl != ':') {
|
||||||
FileUrl++;
|
FileUrl++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((*(FileUrl+1) == '/') && (*(FileUrl+2) == '/')) {
|
if ((*(FileUrl+1) == '/') && (*(FileUrl+2) == '/')) {
|
||||||
FileUrl += 3;
|
FileUrl += 3;
|
||||||
while (*FileUrl != '/') {
|
while (*FileUrl != '/') {
|
||||||
@ -628,7 +632,7 @@ EfiHttpRequest (
|
|||||||
|
|
||||||
Status = HttpGenRequestMessage (HttpMsg, FileUrl, &RequestMsg, &RequestMsgSize);
|
Status = HttpGenRequestMessage (HttpMsg, FileUrl, &RequestMsg, &RequestMsgSize);
|
||||||
|
|
||||||
if (EFI_ERROR (Status) || NULL == RequestMsg) {
|
if (EFI_ERROR (Status) || (NULL == RequestMsg)) {
|
||||||
goto Error3;
|
goto Error3;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -651,7 +655,7 @@ EfiHttpRequest (
|
|||||||
Status = HttpTransmitTcp (
|
Status = HttpTransmitTcp (
|
||||||
HttpInstance,
|
HttpInstance,
|
||||||
Wrap,
|
Wrap,
|
||||||
(UINT8*) RequestMsg,
|
(UINT8 *)RequestMsg,
|
||||||
RequestMsgSize
|
RequestMsgSize
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
@ -698,6 +702,7 @@ Error2:
|
|||||||
gBS->CloseEvent (Wrap->TcpWrap.Tx4Token.CompletionToken.Event);
|
gBS->CloseEvent (Wrap->TcpWrap.Tx4Token.CompletionToken.Event);
|
||||||
Wrap->TcpWrap.Tx4Token.CompletionToken.Event = NULL;
|
Wrap->TcpWrap.Tx4Token.CompletionToken.Event = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (NULL != Wrap->TcpWrap.Tx6Token.CompletionToken.Event) {
|
if (NULL != Wrap->TcpWrap.Tx6Token.CompletionToken.Event) {
|
||||||
gBS->CloseEvent (Wrap->TcpWrap.Tx6Token.CompletionToken.Event);
|
gBS->CloseEvent (Wrap->TcpWrap.Tx6Token.CompletionToken.Event);
|
||||||
Wrap->TcpWrap.Tx6Token.CompletionToken.Event = NULL;
|
Wrap->TcpWrap.Tx6Token.CompletionToken.Event = NULL;
|
||||||
@ -707,15 +712,16 @@ Error1:
|
|||||||
if (HostName != NULL) {
|
if (HostName != NULL) {
|
||||||
FreePool (HostName);
|
FreePool (HostName);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Wrap != NULL) {
|
if (Wrap != NULL) {
|
||||||
FreePool (Wrap);
|
FreePool (Wrap);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (UrlParser != NULL) {
|
if (UrlParser != NULL) {
|
||||||
HttpUrlFreeParser (UrlParser);
|
HttpUrlFreeParser (UrlParser);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -732,16 +738,16 @@ Error1:
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
HttpCancelTokens (
|
HttpCancelTokens (
|
||||||
IN NET_MAP *Map,
|
IN NET_MAP *Map,
|
||||||
IN NET_MAP_ITEM *Item,
|
IN NET_MAP_ITEM *Item,
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_HTTP_TOKEN *Token;
|
EFI_HTTP_TOKEN *Token;
|
||||||
HTTP_TOKEN_WRAP *Wrap;
|
HTTP_TOKEN_WRAP *Wrap;
|
||||||
HTTP_PROTOCOL *HttpInstance;
|
HTTP_PROTOCOL *HttpInstance;
|
||||||
|
|
||||||
Token = (EFI_HTTP_TOKEN *) Context;
|
Token = (EFI_HTTP_TOKEN *)Context;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Return EFI_SUCCESS to check the next item in the map if
|
// Return EFI_SUCCESS to check the next item in the map if
|
||||||
@ -751,7 +757,7 @@ HttpCancelTokens (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
Wrap = (HTTP_TOKEN_WRAP *) Item->Value;
|
Wrap = (HTTP_TOKEN_WRAP *)Item->Value;
|
||||||
ASSERT (Wrap != NULL);
|
ASSERT (Wrap != NULL);
|
||||||
HttpInstance = Wrap->HttpInstance;
|
HttpInstance = Wrap->HttpInstance;
|
||||||
|
|
||||||
@ -808,11 +814,11 @@ HttpCancelTokens (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpCancel (
|
HttpCancel (
|
||||||
IN HTTP_PROTOCOL *HttpInstance,
|
IN HTTP_PROTOCOL *HttpInstance,
|
||||||
IN EFI_HTTP_TOKEN *Token
|
IN EFI_HTTP_TOKEN *Token
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
//
|
//
|
||||||
// First check the tokens queued by EfiHttpRequest().
|
// First check the tokens queued by EfiHttpRequest().
|
||||||
@ -855,7 +861,6 @@ HttpCancel (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Abort an asynchronous HTTP request or response token.
|
Abort an asynchronous HTTP request or response token.
|
||||||
|
|
||||||
@ -881,11 +886,11 @@ HttpCancel (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EfiHttpCancel (
|
EfiHttpCancel (
|
||||||
IN EFI_HTTP_PROTOCOL *This,
|
IN EFI_HTTP_PROTOCOL *This,
|
||||||
IN EFI_HTTP_TOKEN *Token
|
IN EFI_HTTP_TOKEN *Token
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
HTTP_PROTOCOL *HttpInstance;
|
HTTP_PROTOCOL *HttpInstance;
|
||||||
|
|
||||||
if (This == NULL) {
|
if (This == NULL) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
@ -898,7 +903,6 @@ EfiHttpCancel (
|
|||||||
}
|
}
|
||||||
|
|
||||||
return HttpCancel (HttpInstance, Token);
|
return HttpCancel (HttpInstance, Token);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -918,28 +922,28 @@ EfiHttpCancel (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
HttpBodyParserCallback (
|
HttpBodyParserCallback (
|
||||||
IN HTTP_BODY_PARSE_EVENT EventType,
|
IN HTTP_BODY_PARSE_EVENT EventType,
|
||||||
IN CHAR8 *Data,
|
IN CHAR8 *Data,
|
||||||
IN UINTN Length,
|
IN UINTN Length,
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
HTTP_CALLBACK_DATA *CallbackData;
|
HTTP_CALLBACK_DATA *CallbackData;
|
||||||
HTTP_TOKEN_WRAP *Wrap;
|
HTTP_TOKEN_WRAP *Wrap;
|
||||||
UINTN BodyLength;
|
UINTN BodyLength;
|
||||||
CHAR8 *Body;
|
CHAR8 *Body;
|
||||||
|
|
||||||
if (EventType != BodyParseEventOnComplete) {
|
if (EventType != BodyParseEventOnComplete) {
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Data == NULL || Length != 0 || Context == NULL) {
|
if ((Data == NULL) || (Length != 0) || (Context == NULL)) {
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
CallbackData = (HTTP_CALLBACK_DATA *) Context;
|
CallbackData = (HTTP_CALLBACK_DATA *)Context;
|
||||||
|
|
||||||
Wrap = (HTTP_TOKEN_WRAP *) (CallbackData->Wrap);
|
Wrap = (HTTP_TOKEN_WRAP *)(CallbackData->Wrap);
|
||||||
Body = CallbackData->ParseData;
|
Body = CallbackData->ParseData;
|
||||||
BodyLength = CallbackData->ParseDataLength;
|
BodyLength = CallbackData->ParseDataLength;
|
||||||
|
|
||||||
@ -965,35 +969,35 @@ HttpBodyParserCallback (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpResponseWorker (
|
HttpResponseWorker (
|
||||||
IN HTTP_TOKEN_WRAP *Wrap
|
IN HTTP_TOKEN_WRAP *Wrap
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_HTTP_MESSAGE *HttpMsg;
|
EFI_HTTP_MESSAGE *HttpMsg;
|
||||||
CHAR8 *EndofHeader;
|
CHAR8 *EndofHeader;
|
||||||
CHAR8 *HttpHeaders;
|
CHAR8 *HttpHeaders;
|
||||||
UINTN SizeofHeaders;
|
UINTN SizeofHeaders;
|
||||||
UINTN BufferSize;
|
UINTN BufferSize;
|
||||||
UINTN StatusCode;
|
UINTN StatusCode;
|
||||||
CHAR8 *Tmp;
|
CHAR8 *Tmp;
|
||||||
CHAR8 *HeaderTmp;
|
CHAR8 *HeaderTmp;
|
||||||
CHAR8 *StatusCodeStr;
|
CHAR8 *StatusCodeStr;
|
||||||
UINTN BodyLen;
|
UINTN BodyLen;
|
||||||
HTTP_PROTOCOL *HttpInstance;
|
HTTP_PROTOCOL *HttpInstance;
|
||||||
EFI_HTTP_TOKEN *Token;
|
EFI_HTTP_TOKEN *Token;
|
||||||
NET_MAP_ITEM *Item;
|
NET_MAP_ITEM *Item;
|
||||||
HTTP_TOKEN_WRAP *ValueInItem;
|
HTTP_TOKEN_WRAP *ValueInItem;
|
||||||
UINTN HdrLen;
|
UINTN HdrLen;
|
||||||
NET_FRAGMENT Fragment;
|
NET_FRAGMENT Fragment;
|
||||||
UINT32 TimeoutValue;
|
UINT32 TimeoutValue;
|
||||||
|
|
||||||
if (Wrap == NULL || Wrap->HttpInstance == NULL) {
|
if ((Wrap == NULL) || (Wrap->HttpInstance == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
HttpInstance = Wrap->HttpInstance;
|
HttpInstance = Wrap->HttpInstance;
|
||||||
Token = Wrap->HttpToken;
|
Token = Wrap->HttpToken;
|
||||||
HttpMsg = Token->Message;
|
HttpMsg = Token->Message;
|
||||||
|
|
||||||
HttpInstance->EndofHeader = NULL;
|
HttpInstance->EndofHeader = NULL;
|
||||||
HttpInstance->HttpHeaders = NULL;
|
HttpInstance->HttpHeaders = NULL;
|
||||||
@ -1014,7 +1018,7 @@ HttpResponseWorker (
|
|||||||
//
|
//
|
||||||
// The data is stored at [NextMsg, CacheBody + CacheLen].
|
// The data is stored at [NextMsg, CacheBody + CacheLen].
|
||||||
//
|
//
|
||||||
HdrLen = HttpInstance->CacheBody + HttpInstance->CacheLen - HttpInstance->NextMsg;
|
HdrLen = HttpInstance->CacheBody + HttpInstance->CacheLen - HttpInstance->NextMsg;
|
||||||
HttpHeaders = AllocateZeroPool (HdrLen);
|
HttpHeaders = AllocateZeroPool (HdrLen);
|
||||||
if (HttpHeaders == NULL) {
|
if (HttpHeaders == NULL) {
|
||||||
Status = EFI_OUT_OF_RESOURCES;
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
@ -1026,8 +1030,8 @@ HttpResponseWorker (
|
|||||||
HttpInstance->CacheBody = NULL;
|
HttpInstance->CacheBody = NULL;
|
||||||
HttpInstance->NextMsg = NULL;
|
HttpInstance->NextMsg = NULL;
|
||||||
HttpInstance->CacheOffset = 0;
|
HttpInstance->CacheOffset = 0;
|
||||||
SizeofHeaders = HdrLen;
|
SizeofHeaders = HdrLen;
|
||||||
BufferSize = HttpInstance->CacheLen;
|
BufferSize = HttpInstance->CacheLen;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Check whether we cached the whole HTTP headers.
|
// Check whether we cached the whole HTTP headers.
|
||||||
@ -1038,7 +1042,6 @@ HttpResponseWorker (
|
|||||||
HttpInstance->EndofHeader = &EndofHeader;
|
HttpInstance->EndofHeader = &EndofHeader;
|
||||||
HttpInstance->HttpHeaders = &HttpHeaders;
|
HttpInstance->HttpHeaders = &HttpHeaders;
|
||||||
|
|
||||||
|
|
||||||
if (HttpInstance->TimeoutEvent == NULL) {
|
if (HttpInstance->TimeoutEvent == NULL) {
|
||||||
//
|
//
|
||||||
// Create TimeoutEvent for response
|
// Create TimeoutEvent for response
|
||||||
@ -1131,9 +1134,9 @@ HttpResponseWorker (
|
|||||||
}
|
}
|
||||||
|
|
||||||
HttpMsg->Data.Response->StatusCode = HttpMappingToStatusCode (StatusCode);
|
HttpMsg->Data.Response->StatusCode = HttpMappingToStatusCode (StatusCode);
|
||||||
HttpInstance->StatusCode = StatusCode;
|
HttpInstance->StatusCode = StatusCode;
|
||||||
|
|
||||||
Status = EFI_NOT_READY;
|
Status = EFI_NOT_READY;
|
||||||
ValueInItem = NULL;
|
ValueInItem = NULL;
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -1144,8 +1147,8 @@ HttpResponseWorker (
|
|||||||
// Hence, check that case before doing a NetMapRemoveHead.
|
// Hence, check that case before doing a NetMapRemoveHead.
|
||||||
//
|
//
|
||||||
if (!NetMapIsEmpty (&HttpInstance->TxTokens)) {
|
if (!NetMapIsEmpty (&HttpInstance->TxTokens)) {
|
||||||
NetMapRemoveHead (&HttpInstance->TxTokens, (VOID**) &ValueInItem);
|
NetMapRemoveHead (&HttpInstance->TxTokens, (VOID **)&ValueInItem);
|
||||||
if (ValueInItem == NULL) {
|
if (ValueInItem == NULL) {
|
||||||
goto Error;
|
goto Error;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1193,7 +1196,6 @@ HttpResponseWorker (
|
|||||||
FreePool (HttpHeaders);
|
FreePool (HttpHeaders);
|
||||||
HttpHeaders = NULL;
|
HttpHeaders = NULL;
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Init message-body parser by header information.
|
// Init message-body parser by header information.
|
||||||
//
|
//
|
||||||
@ -1203,7 +1205,7 @@ HttpResponseWorker (
|
|||||||
HttpMsg->HeaderCount,
|
HttpMsg->HeaderCount,
|
||||||
HttpMsg->Headers,
|
HttpMsg->Headers,
|
||||||
HttpBodyParserCallback,
|
HttpBodyParserCallback,
|
||||||
(VOID *) (&HttpInstance->CallbackData),
|
(VOID *)(&HttpInstance->CallbackData),
|
||||||
&HttpInstance->MsgParser
|
&HttpInstance->MsgParser
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
@ -1217,8 +1219,8 @@ HttpResponseWorker (
|
|||||||
//
|
//
|
||||||
// Record the CallbackData data.
|
// Record the CallbackData data.
|
||||||
//
|
//
|
||||||
HttpInstance->CallbackData.Wrap = (VOID *) Wrap;
|
HttpInstance->CallbackData.Wrap = (VOID *)Wrap;
|
||||||
HttpInstance->CallbackData.ParseData = (VOID *) HttpInstance->CacheBody;
|
HttpInstance->CallbackData.ParseData = (VOID *)HttpInstance->CacheBody;
|
||||||
HttpInstance->CallbackData.ParseDataLength = HttpInstance->CacheLen;
|
HttpInstance->CallbackData.ParseDataLength = HttpInstance->CacheLen;
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -1279,7 +1281,7 @@ HttpResponseWorker (
|
|||||||
//
|
//
|
||||||
CopyMem (HttpMsg->Body, HttpInstance->CacheBody + HttpInstance->CacheOffset, BodyLen);
|
CopyMem (HttpMsg->Body, HttpInstance->CacheBody + HttpInstance->CacheOffset, BodyLen);
|
||||||
HttpInstance->CacheOffset = BodyLen + HttpInstance->CacheOffset;
|
HttpInstance->CacheOffset = BodyLen + HttpInstance->CacheOffset;
|
||||||
HttpMsg->BodyLength = BodyLen;
|
HttpMsg->BodyLength = BodyLen;
|
||||||
|
|
||||||
if (HttpInstance->NextMsg == NULL) {
|
if (HttpInstance->NextMsg == NULL) {
|
||||||
//
|
//
|
||||||
@ -1291,6 +1293,7 @@ HttpResponseWorker (
|
|||||||
HttpInstance->CacheOffset = 0;
|
HttpInstance->CacheOffset = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Return since we already received required data.
|
// Return since we already received required data.
|
||||||
//
|
//
|
||||||
@ -1298,12 +1301,12 @@ HttpResponseWorker (
|
|||||||
goto Exit;
|
goto Exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (BodyLen == 0 && HttpInstance->MsgParser == NULL) {
|
if ((BodyLen == 0) && (HttpInstance->MsgParser == NULL)) {
|
||||||
//
|
//
|
||||||
// We received a complete HTTP message, and we don't have more data to return to caller.
|
// We received a complete HTTP message, and we don't have more data to return to caller.
|
||||||
//
|
//
|
||||||
HttpMsg->BodyLength = 0;
|
HttpMsg->BodyLength = 0;
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
goto Exit;
|
goto Exit;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1319,7 +1322,6 @@ HttpResponseWorker (
|
|||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
goto Error2;
|
goto Error2;
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
if (HttpInstance->TimeoutEvent == NULL) {
|
if (HttpInstance->TimeoutEvent == NULL) {
|
||||||
//
|
//
|
||||||
@ -1361,15 +1363,15 @@ HttpResponseWorker (
|
|||||||
//
|
//
|
||||||
// Process the received the body packet.
|
// Process the received the body packet.
|
||||||
//
|
//
|
||||||
HttpMsg->BodyLength = MIN ((UINTN) Fragment.Len, HttpMsg->BodyLength);
|
HttpMsg->BodyLength = MIN ((UINTN)Fragment.Len, HttpMsg->BodyLength);
|
||||||
|
|
||||||
CopyMem (HttpMsg->Body, Fragment.Bulk, HttpMsg->BodyLength);
|
CopyMem (HttpMsg->Body, Fragment.Bulk, HttpMsg->BodyLength);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Record the CallbackData data.
|
// Record the CallbackData data.
|
||||||
//
|
//
|
||||||
HttpInstance->CallbackData.Wrap = (VOID *) Wrap;
|
HttpInstance->CallbackData.Wrap = (VOID *)Wrap;
|
||||||
HttpInstance->CallbackData.ParseData = HttpMsg->Body;
|
HttpInstance->CallbackData.ParseData = HttpMsg->Body;
|
||||||
HttpInstance->CallbackData.ParseDataLength = HttpMsg->BodyLength;
|
HttpInstance->CallbackData.ParseDataLength = HttpMsg->BodyLength;
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -1396,7 +1398,7 @@ HttpResponseWorker (
|
|||||||
// Check whether there is the next message header in the HttpMsg->Body.
|
// Check whether there is the next message header in the HttpMsg->Body.
|
||||||
//
|
//
|
||||||
if (HttpInstance->NextMsg != NULL) {
|
if (HttpInstance->NextMsg != NULL) {
|
||||||
HttpMsg->BodyLength = HttpInstance->NextMsg - (CHAR8 *) HttpMsg->Body;
|
HttpMsg->BodyLength = HttpInstance->NextMsg - (CHAR8 *)HttpMsg->Body;
|
||||||
}
|
}
|
||||||
|
|
||||||
HttpInstance->CacheLen = Fragment.Len - HttpMsg->BodyLength;
|
HttpInstance->CacheLen = Fragment.Len - HttpMsg->BodyLength;
|
||||||
@ -1491,10 +1493,8 @@ Error:
|
|||||||
gBS->SignalEvent (Token->Event);
|
gBS->SignalEvent (Token->Event);
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The Response() function queues an HTTP response to this HTTP instance, similar to
|
The Response() function queues an HTTP response to this HTTP instance, similar to
|
||||||
Receive() function in the EFI TCP driver. When the HTTP response is received successfully,
|
Receive() function in the EFI TCP driver. When the HTTP response is received successfully,
|
||||||
@ -1545,14 +1545,14 @@ Error:
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EfiHttpResponse (
|
EfiHttpResponse (
|
||||||
IN EFI_HTTP_PROTOCOL *This,
|
IN EFI_HTTP_PROTOCOL *This,
|
||||||
IN EFI_HTTP_TOKEN *Token
|
IN EFI_HTTP_TOKEN *Token
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_HTTP_MESSAGE *HttpMsg;
|
EFI_HTTP_MESSAGE *HttpMsg;
|
||||||
HTTP_PROTOCOL *HttpInstance;
|
HTTP_PROTOCOL *HttpInstance;
|
||||||
HTTP_TOKEN_WRAP *Wrap;
|
HTTP_TOKEN_WRAP *Wrap;
|
||||||
|
|
||||||
if ((This == NULL) || (Token == NULL)) {
|
if ((This == NULL) || (Token == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
@ -1619,6 +1619,7 @@ Error:
|
|||||||
if (Wrap->TcpWrap.Rx6Token.CompletionToken.Event != NULL) {
|
if (Wrap->TcpWrap.Rx6Token.CompletionToken.Event != NULL) {
|
||||||
gBS->CloseEvent (Wrap->TcpWrap.Rx6Token.CompletionToken.Event);
|
gBS->CloseEvent (Wrap->TcpWrap.Rx6Token.CompletionToken.Event);
|
||||||
}
|
}
|
||||||
|
|
||||||
FreePool (Wrap);
|
FreePool (Wrap);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1648,11 +1649,11 @@ Error:
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EfiHttpPoll (
|
EfiHttpPoll (
|
||||||
IN EFI_HTTP_PROTOCOL *This
|
IN EFI_HTTP_PROTOCOL *This
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
HTTP_PROTOCOL *HttpInstance;
|
HTTP_PROTOCOL *HttpInstance;
|
||||||
|
|
||||||
if (This == NULL) {
|
if (This == NULL) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
@ -1668,11 +1669,13 @@ EfiHttpPoll (
|
|||||||
if (HttpInstance->Tcp6 == NULL) {
|
if (HttpInstance->Tcp6 == NULL) {
|
||||||
return EFI_NOT_STARTED;
|
return EFI_NOT_STARTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = HttpInstance->Tcp6->Poll (HttpInstance->Tcp6);
|
Status = HttpInstance->Tcp6->Poll (HttpInstance->Tcp6);
|
||||||
} else {
|
} else {
|
||||||
if (HttpInstance->Tcp4 == NULL) {
|
if (HttpInstance->Tcp4 == NULL) {
|
||||||
return EFI_NOT_STARTED;
|
return EFI_NOT_STARTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = HttpInstance->Tcp4->Poll (HttpInstance->Tcp4);
|
Status = HttpInstance->Tcp4->Poll (HttpInstance->Tcp4);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,13 +11,12 @@
|
|||||||
#ifndef __EFI_HTTP_IMPL_H__
|
#ifndef __EFI_HTTP_IMPL_H__
|
||||||
#define __EFI_HTTP_IMPL_H__
|
#define __EFI_HTTP_IMPL_H__
|
||||||
|
|
||||||
#define HTTP_DEFAULT_PORT 80
|
#define HTTP_DEFAULT_PORT 80
|
||||||
#define HTTP_END_OF_HDR_STR "\r\n\r\n"
|
#define HTTP_END_OF_HDR_STR "\r\n\r\n"
|
||||||
#define HTTP_CRLF_STR "\r\n"
|
#define HTTP_CRLF_STR "\r\n"
|
||||||
#define HTTP_VERSION_STR HTTP_VERSION
|
#define HTTP_VERSION_STR HTTP_VERSION
|
||||||
#define HTTP_VERSION_CRLF_STR " HTTP/1.1\r\n"
|
#define HTTP_VERSION_CRLF_STR " HTTP/1.1\r\n"
|
||||||
#define HTTP_ERROR_OR_NOT_SUPPORT_STATUS_CODE 300
|
#define HTTP_ERROR_OR_NOT_SUPPORT_STATUS_CODE 300
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Returns the operational parameters for the current HTTP child instance.
|
Returns the operational parameters for the current HTTP child instance.
|
||||||
@ -45,8 +44,8 @@
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EfiHttpGetModeData (
|
EfiHttpGetModeData (
|
||||||
IN EFI_HTTP_PROTOCOL *This,
|
IN EFI_HTTP_PROTOCOL *This,
|
||||||
OUT EFI_HTTP_CONFIG_DATA *HttpConfigData
|
OUT EFI_HTTP_CONFIG_DATA *HttpConfigData
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -83,8 +82,8 @@ EfiHttpGetModeData (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EfiHttpConfigure (
|
EfiHttpConfigure (
|
||||||
IN EFI_HTTP_PROTOCOL *This,
|
IN EFI_HTTP_PROTOCOL *This,
|
||||||
IN EFI_HTTP_CONFIG_DATA *HttpConfigData
|
IN EFI_HTTP_CONFIG_DATA *HttpConfigData
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -116,8 +115,8 @@ EfiHttpConfigure (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EfiHttpRequest (
|
EfiHttpRequest (
|
||||||
IN EFI_HTTP_PROTOCOL *This,
|
IN EFI_HTTP_PROTOCOL *This,
|
||||||
IN EFI_HTTP_TOKEN *Token
|
IN EFI_HTTP_TOKEN *Token
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -144,8 +143,8 @@ EfiHttpRequest (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EfiHttpCancel (
|
EfiHttpCancel (
|
||||||
IN EFI_HTTP_PROTOCOL *This,
|
IN EFI_HTTP_PROTOCOL *This,
|
||||||
IN EFI_HTTP_TOKEN *Token
|
IN EFI_HTTP_TOKEN *Token
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -198,8 +197,8 @@ EfiHttpCancel (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EfiHttpResponse (
|
EfiHttpResponse (
|
||||||
IN EFI_HTTP_PROTOCOL *This,
|
IN EFI_HTTP_PROTOCOL *This,
|
||||||
IN EFI_HTTP_TOKEN *Token
|
IN EFI_HTTP_TOKEN *Token
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -225,7 +224,7 @@ EfiHttpResponse (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
EfiHttpPoll (
|
EfiHttpPoll (
|
||||||
IN EFI_HTTP_PROTOCOL *This
|
IN EFI_HTTP_PROTOCOL *This
|
||||||
);
|
);
|
||||||
|
|
||||||
extern EFI_HTTP_PROTOCOL mEfiHttpTemplate;
|
extern EFI_HTTP_PROTOCOL mEfiHttpTemplate;
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -10,7 +10,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#ifndef __EFI_HTTP_PROTO_H__
|
#ifndef __EFI_HTTP_PROTO_H__
|
||||||
#define __EFI_HTTP_PROTO_H__
|
#define __EFI_HTTP_PROTO_H__
|
||||||
|
|
||||||
#define DEF_BUF_LEN 2048
|
#define DEF_BUF_LEN 2048
|
||||||
|
|
||||||
#define HTTP_SERVICE_SIGNATURE SIGNATURE_32('H', 't', 't', 'S')
|
#define HTTP_SERVICE_SIGNATURE SIGNATURE_32('H', 't', 't', 'S')
|
||||||
|
|
||||||
@ -22,188 +22,186 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
HTTP_SERVICE_SIGNATURE \
|
HTTP_SERVICE_SIGNATURE \
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// The state of HTTP protocol. It starts from UNCONFIGED.
|
// The state of HTTP protocol. It starts from UNCONFIGED.
|
||||||
//
|
//
|
||||||
#define HTTP_STATE_UNCONFIGED 0
|
#define HTTP_STATE_UNCONFIGED 0
|
||||||
#define HTTP_STATE_HTTP_CONFIGED 1
|
#define HTTP_STATE_HTTP_CONFIGED 1
|
||||||
#define HTTP_STATE_TCP_CONFIGED 2
|
#define HTTP_STATE_TCP_CONFIGED 2
|
||||||
#define HTTP_STATE_TCP_UNCONFIGED 3
|
#define HTTP_STATE_TCP_UNCONFIGED 3
|
||||||
#define HTTP_STATE_TCP_CONNECTED 4
|
#define HTTP_STATE_TCP_CONNECTED 4
|
||||||
#define HTTP_STATE_TCP_CLOSED 5
|
#define HTTP_STATE_TCP_CLOSED 5
|
||||||
|
|
||||||
//
|
//
|
||||||
// TCP configured data.
|
// TCP configured data.
|
||||||
//
|
//
|
||||||
#define HTTP_TOS_DEAULT 8
|
#define HTTP_TOS_DEAULT 8
|
||||||
#define HTTP_TTL_DEAULT 255
|
#define HTTP_TTL_DEAULT 255
|
||||||
#define HTTP_BUFFER_SIZE_DEAULT 65535
|
#define HTTP_BUFFER_SIZE_DEAULT 65535
|
||||||
#define HTTP_MAX_SYN_BACK_LOG 5
|
#define HTTP_MAX_SYN_BACK_LOG 5
|
||||||
#define HTTP_CONNECTION_TIMEOUT 60
|
#define HTTP_CONNECTION_TIMEOUT 60
|
||||||
#define HTTP_DATA_RETRIES 12
|
#define HTTP_DATA_RETRIES 12
|
||||||
#define HTTP_FIN_TIMEOUT 2
|
#define HTTP_FIN_TIMEOUT 2
|
||||||
#define HTTP_KEEP_ALIVE_PROBES 6
|
#define HTTP_KEEP_ALIVE_PROBES 6
|
||||||
#define HTTP_KEEP_ALIVE_TIME 7200
|
#define HTTP_KEEP_ALIVE_TIME 7200
|
||||||
#define HTTP_KEEP_ALIVE_INTERVAL 30
|
#define HTTP_KEEP_ALIVE_INTERVAL 30
|
||||||
|
|
||||||
#define HTTP_URL_BUFFER_LEN 4096
|
#define HTTP_URL_BUFFER_LEN 4096
|
||||||
|
|
||||||
typedef struct _HTTP_SERVICE {
|
typedef struct _HTTP_SERVICE {
|
||||||
UINT32 Signature;
|
UINT32 Signature;
|
||||||
EFI_SERVICE_BINDING_PROTOCOL ServiceBinding;
|
EFI_SERVICE_BINDING_PROTOCOL ServiceBinding;
|
||||||
EFI_HANDLE Ip4DriverBindingHandle;
|
EFI_HANDLE Ip4DriverBindingHandle;
|
||||||
EFI_HANDLE Ip6DriverBindingHandle;
|
EFI_HANDLE Ip6DriverBindingHandle;
|
||||||
EFI_HANDLE ControllerHandle;
|
EFI_HANDLE ControllerHandle;
|
||||||
EFI_HANDLE Tcp4ChildHandle;
|
EFI_HANDLE Tcp4ChildHandle;
|
||||||
EFI_HANDLE Tcp6ChildHandle;
|
EFI_HANDLE Tcp6ChildHandle;
|
||||||
LIST_ENTRY ChildrenList;
|
LIST_ENTRY ChildrenList;
|
||||||
UINTN ChildrenNumber;
|
UINTN ChildrenNumber;
|
||||||
INTN State;
|
INTN State;
|
||||||
} HTTP_SERVICE;
|
} HTTP_SERVICE;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
EFI_TCP4_IO_TOKEN Tx4Token;
|
EFI_TCP4_IO_TOKEN Tx4Token;
|
||||||
EFI_TCP4_TRANSMIT_DATA Tx4Data;
|
EFI_TCP4_TRANSMIT_DATA Tx4Data;
|
||||||
EFI_TCP6_IO_TOKEN Tx6Token;
|
EFI_TCP6_IO_TOKEN Tx6Token;
|
||||||
EFI_TCP6_TRANSMIT_DATA Tx6Data;
|
EFI_TCP6_TRANSMIT_DATA Tx6Data;
|
||||||
EFI_TCP4_IO_TOKEN Rx4Token;
|
EFI_TCP4_IO_TOKEN Rx4Token;
|
||||||
EFI_TCP4_RECEIVE_DATA Rx4Data;
|
EFI_TCP4_RECEIVE_DATA Rx4Data;
|
||||||
EFI_TCP6_IO_TOKEN Rx6Token;
|
EFI_TCP6_IO_TOKEN Rx6Token;
|
||||||
EFI_TCP6_RECEIVE_DATA Rx6Data;
|
EFI_TCP6_RECEIVE_DATA Rx6Data;
|
||||||
BOOLEAN IsTxDone;
|
BOOLEAN IsTxDone;
|
||||||
BOOLEAN IsRxDone;
|
BOOLEAN IsRxDone;
|
||||||
UINTN BodyLen;
|
UINTN BodyLen;
|
||||||
EFI_HTTP_METHOD Method;
|
EFI_HTTP_METHOD Method;
|
||||||
} HTTP_TCP_TOKEN_WRAP;
|
} HTTP_TCP_TOKEN_WRAP;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
EFI_TLS_VERSION Version;
|
EFI_TLS_VERSION Version;
|
||||||
EFI_TLS_CONNECTION_END ConnectionEnd;
|
EFI_TLS_CONNECTION_END ConnectionEnd;
|
||||||
EFI_TLS_VERIFY VerifyMethod;
|
EFI_TLS_VERIFY VerifyMethod;
|
||||||
EFI_TLS_VERIFY_HOST VerifyHost;
|
EFI_TLS_VERIFY_HOST VerifyHost;
|
||||||
EFI_TLS_SESSION_STATE SessionState;
|
EFI_TLS_SESSION_STATE SessionState;
|
||||||
} TLS_CONFIG_DATA;
|
} TLS_CONFIG_DATA;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Callback data for HTTP_PARSER_CALLBACK()
|
// Callback data for HTTP_PARSER_CALLBACK()
|
||||||
//
|
//
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINTN ParseDataLength;
|
UINTN ParseDataLength;
|
||||||
VOID *ParseData;
|
VOID *ParseData;
|
||||||
VOID *Wrap;
|
VOID *Wrap;
|
||||||
} HTTP_CALLBACK_DATA;
|
} HTTP_CALLBACK_DATA;
|
||||||
|
|
||||||
typedef struct _HTTP_PROTOCOL {
|
typedef struct _HTTP_PROTOCOL {
|
||||||
UINT32 Signature;
|
UINT32 Signature;
|
||||||
EFI_HTTP_PROTOCOL Http;
|
EFI_HTTP_PROTOCOL Http;
|
||||||
EFI_HANDLE Handle;
|
EFI_HANDLE Handle;
|
||||||
HTTP_SERVICE *Service;
|
HTTP_SERVICE *Service;
|
||||||
LIST_ENTRY Link; // Link to all HTTP instance from the service.
|
LIST_ENTRY Link; // Link to all HTTP instance from the service.
|
||||||
BOOLEAN InDestroy;
|
BOOLEAN InDestroy;
|
||||||
INTN State;
|
INTN State;
|
||||||
EFI_HTTP_METHOD Method;
|
EFI_HTTP_METHOD Method;
|
||||||
|
|
||||||
UINTN StatusCode;
|
UINTN StatusCode;
|
||||||
|
|
||||||
EFI_EVENT TimeoutEvent;
|
EFI_EVENT TimeoutEvent;
|
||||||
|
|
||||||
EFI_HANDLE Tcp4ChildHandle;
|
EFI_HANDLE Tcp4ChildHandle;
|
||||||
EFI_TCP4_PROTOCOL *Tcp4;
|
EFI_TCP4_PROTOCOL *Tcp4;
|
||||||
EFI_TCP4_CONFIG_DATA Tcp4CfgData;
|
EFI_TCP4_CONFIG_DATA Tcp4CfgData;
|
||||||
EFI_TCP4_OPTION Tcp4Option;
|
EFI_TCP4_OPTION Tcp4Option;
|
||||||
|
|
||||||
EFI_TCP4_CONNECTION_TOKEN Tcp4ConnToken;
|
EFI_TCP4_CONNECTION_TOKEN Tcp4ConnToken;
|
||||||
BOOLEAN IsTcp4ConnDone;
|
BOOLEAN IsTcp4ConnDone;
|
||||||
EFI_TCP4_CLOSE_TOKEN Tcp4CloseToken;
|
EFI_TCP4_CLOSE_TOKEN Tcp4CloseToken;
|
||||||
BOOLEAN IsTcp4CloseDone;
|
BOOLEAN IsTcp4CloseDone;
|
||||||
CHAR8 *RemoteHost;
|
CHAR8 *RemoteHost;
|
||||||
UINT16 RemotePort;
|
UINT16 RemotePort;
|
||||||
EFI_IPv4_ADDRESS RemoteAddr;
|
EFI_IPv4_ADDRESS RemoteAddr;
|
||||||
|
|
||||||
EFI_HANDLE Tcp6ChildHandle;
|
EFI_HANDLE Tcp6ChildHandle;
|
||||||
EFI_TCP6_PROTOCOL *Tcp6;
|
EFI_TCP6_PROTOCOL *Tcp6;
|
||||||
EFI_TCP6_CONFIG_DATA Tcp6CfgData;
|
EFI_TCP6_CONFIG_DATA Tcp6CfgData;
|
||||||
EFI_TCP6_OPTION Tcp6Option;
|
EFI_TCP6_OPTION Tcp6Option;
|
||||||
|
|
||||||
EFI_TCP6_CONNECTION_TOKEN Tcp6ConnToken;
|
EFI_TCP6_CONNECTION_TOKEN Tcp6ConnToken;
|
||||||
BOOLEAN IsTcp6ConnDone;
|
BOOLEAN IsTcp6ConnDone;
|
||||||
EFI_TCP6_CLOSE_TOKEN Tcp6CloseToken;
|
EFI_TCP6_CLOSE_TOKEN Tcp6CloseToken;
|
||||||
BOOLEAN IsTcp6CloseDone;
|
BOOLEAN IsTcp6CloseDone;
|
||||||
EFI_IPv6_ADDRESS RemoteIpv6Addr;
|
EFI_IPv6_ADDRESS RemoteIpv6Addr;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Rx4Token or Rx6Token used for receiving HTTP header.
|
// Rx4Token or Rx6Token used for receiving HTTP header.
|
||||||
//
|
//
|
||||||
EFI_TCP4_IO_TOKEN Rx4Token;
|
EFI_TCP4_IO_TOKEN Rx4Token;
|
||||||
EFI_TCP4_RECEIVE_DATA Rx4Data;
|
EFI_TCP4_RECEIVE_DATA Rx4Data;
|
||||||
EFI_TCP6_IO_TOKEN Rx6Token;
|
EFI_TCP6_IO_TOKEN Rx6Token;
|
||||||
EFI_TCP6_RECEIVE_DATA Rx6Data;
|
EFI_TCP6_RECEIVE_DATA Rx6Data;
|
||||||
BOOLEAN IsRxDone;
|
BOOLEAN IsRxDone;
|
||||||
|
|
||||||
CHAR8 **EndofHeader;
|
CHAR8 **EndofHeader;
|
||||||
CHAR8 **HttpHeaders;
|
CHAR8 **HttpHeaders;
|
||||||
CHAR8 *CacheBody;
|
CHAR8 *CacheBody;
|
||||||
CHAR8 *NextMsg;
|
CHAR8 *NextMsg;
|
||||||
UINTN CacheLen;
|
UINTN CacheLen;
|
||||||
UINTN CacheOffset;
|
UINTN CacheOffset;
|
||||||
|
|
||||||
//
|
//
|
||||||
// HTTP message-body parser.
|
// HTTP message-body parser.
|
||||||
//
|
//
|
||||||
VOID *MsgParser;
|
VOID *MsgParser;
|
||||||
HTTP_CALLBACK_DATA CallbackData;
|
HTTP_CALLBACK_DATA CallbackData;
|
||||||
|
|
||||||
EFI_HTTP_VERSION HttpVersion;
|
EFI_HTTP_VERSION HttpVersion;
|
||||||
UINT32 TimeOutMillisec;
|
UINT32 TimeOutMillisec;
|
||||||
BOOLEAN LocalAddressIsIPv6;
|
BOOLEAN LocalAddressIsIPv6;
|
||||||
|
|
||||||
EFI_HTTPv4_ACCESS_POINT IPv4Node;
|
EFI_HTTPv4_ACCESS_POINT IPv4Node;
|
||||||
EFI_HTTPv6_ACCESS_POINT Ipv6Node;
|
EFI_HTTPv6_ACCESS_POINT Ipv6Node;
|
||||||
|
|
||||||
NET_MAP TxTokens;
|
NET_MAP TxTokens;
|
||||||
NET_MAP RxTokens;
|
NET_MAP RxTokens;
|
||||||
|
|
||||||
CHAR8 *Url;
|
CHAR8 *Url;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Https Support
|
// Https Support
|
||||||
//
|
//
|
||||||
BOOLEAN UseHttps;
|
BOOLEAN UseHttps;
|
||||||
|
|
||||||
EFI_SERVICE_BINDING_PROTOCOL *TlsSb;
|
EFI_SERVICE_BINDING_PROTOCOL *TlsSb;
|
||||||
EFI_HANDLE TlsChildHandle; /// Tls ChildHandle
|
EFI_HANDLE TlsChildHandle; /// Tls ChildHandle
|
||||||
TLS_CONFIG_DATA TlsConfigData;
|
TLS_CONFIG_DATA TlsConfigData;
|
||||||
EFI_TLS_PROTOCOL *Tls;
|
EFI_TLS_PROTOCOL *Tls;
|
||||||
EFI_TLS_CONFIGURATION_PROTOCOL *TlsConfiguration;
|
EFI_TLS_CONFIGURATION_PROTOCOL *TlsConfiguration;
|
||||||
EFI_TLS_SESSION_STATE TlsSessionState;
|
EFI_TLS_SESSION_STATE TlsSessionState;
|
||||||
|
|
||||||
//
|
//
|
||||||
// TlsTxData used for transmitting TLS related messages.
|
// TlsTxData used for transmitting TLS related messages.
|
||||||
//
|
//
|
||||||
EFI_TCP4_IO_TOKEN Tcp4TlsTxToken;
|
EFI_TCP4_IO_TOKEN Tcp4TlsTxToken;
|
||||||
EFI_TCP4_TRANSMIT_DATA Tcp4TlsTxData;
|
EFI_TCP4_TRANSMIT_DATA Tcp4TlsTxData;
|
||||||
EFI_TCP6_IO_TOKEN Tcp6TlsTxToken;
|
EFI_TCP6_IO_TOKEN Tcp6TlsTxToken;
|
||||||
EFI_TCP6_TRANSMIT_DATA Tcp6TlsTxData;
|
EFI_TCP6_TRANSMIT_DATA Tcp6TlsTxData;
|
||||||
BOOLEAN TlsIsTxDone;
|
BOOLEAN TlsIsTxDone;
|
||||||
|
|
||||||
//
|
//
|
||||||
// TlsRxData used for receiving TLS related messages.
|
// TlsRxData used for receiving TLS related messages.
|
||||||
//
|
//
|
||||||
EFI_TCP4_IO_TOKEN Tcp4TlsRxToken;
|
EFI_TCP4_IO_TOKEN Tcp4TlsRxToken;
|
||||||
EFI_TCP4_RECEIVE_DATA Tcp4TlsRxData;
|
EFI_TCP4_RECEIVE_DATA Tcp4TlsRxData;
|
||||||
EFI_TCP6_IO_TOKEN Tcp6TlsRxToken;
|
EFI_TCP6_IO_TOKEN Tcp6TlsRxToken;
|
||||||
EFI_TCP6_RECEIVE_DATA Tcp6TlsRxData;
|
EFI_TCP6_RECEIVE_DATA Tcp6TlsRxData;
|
||||||
BOOLEAN TlsIsRxDone;
|
BOOLEAN TlsIsRxDone;
|
||||||
} HTTP_PROTOCOL;
|
} HTTP_PROTOCOL;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
EFI_HTTP_TOKEN *HttpToken;
|
EFI_HTTP_TOKEN *HttpToken;
|
||||||
HTTP_PROTOCOL *HttpInstance;
|
HTTP_PROTOCOL *HttpInstance;
|
||||||
HTTP_TCP_TOKEN_WRAP TcpWrap;
|
HTTP_TCP_TOKEN_WRAP TcpWrap;
|
||||||
} HTTP_TOKEN_WRAP;
|
} HTTP_TOKEN_WRAP;
|
||||||
|
|
||||||
|
|
||||||
#define HTTP_PROTOCOL_SIGNATURE SIGNATURE_32('H', 't', 't', 'P')
|
#define HTTP_PROTOCOL_SIGNATURE SIGNATURE_32('H', 't', 't', 'P')
|
||||||
|
|
||||||
#define HTTP_INSTANCE_FROM_PROTOCOL(a) \
|
#define HTTP_INSTANCE_FROM_PROTOCOL(a) \
|
||||||
@ -239,7 +237,7 @@ HttpCommonNotify (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpCreateTcpConnCloseEvent (
|
HttpCreateTcpConnCloseEvent (
|
||||||
IN HTTP_PROTOCOL *HttpInstance
|
IN HTTP_PROTOCOL *HttpInstance
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -250,7 +248,7 @@ HttpCreateTcpConnCloseEvent (
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
HttpCloseTcpConnCloseEvent (
|
HttpCloseTcpConnCloseEvent (
|
||||||
IN HTTP_PROTOCOL *HttpInstance
|
IN HTTP_PROTOCOL *HttpInstance
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -264,7 +262,7 @@ HttpCloseTcpConnCloseEvent (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpCreateTcpTxEvent (
|
HttpCreateTcpTxEvent (
|
||||||
IN HTTP_TOKEN_WRAP *Wrap
|
IN HTTP_TOKEN_WRAP *Wrap
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -278,7 +276,7 @@ HttpCreateTcpTxEvent (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpCreateTcpRxEventForHeader (
|
HttpCreateTcpRxEventForHeader (
|
||||||
IN HTTP_PROTOCOL *HttpInstance
|
IN HTTP_PROTOCOL *HttpInstance
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -292,7 +290,7 @@ HttpCreateTcpRxEventForHeader (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpCreateTcpRxEvent (
|
HttpCreateTcpRxEvent (
|
||||||
IN HTTP_TOKEN_WRAP *Wrap
|
IN HTTP_TOKEN_WRAP *Wrap
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -303,7 +301,7 @@ HttpCreateTcpRxEvent (
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
HttpCloseTcpRxEvent (
|
HttpCloseTcpRxEvent (
|
||||||
IN HTTP_TOKEN_WRAP *Wrap
|
IN HTTP_TOKEN_WRAP *Wrap
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -318,8 +316,8 @@ HttpCloseTcpRxEvent (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpInitProtocol (
|
HttpInitProtocol (
|
||||||
IN OUT HTTP_PROTOCOL *HttpInstance,
|
IN OUT HTTP_PROTOCOL *HttpInstance,
|
||||||
IN BOOLEAN IpVersion
|
IN BOOLEAN IpVersion
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -330,7 +328,7 @@ HttpInitProtocol (
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
HttpCleanProtocol (
|
HttpCleanProtocol (
|
||||||
IN HTTP_PROTOCOL *HttpInstance
|
IN HTTP_PROTOCOL *HttpInstance
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -344,7 +342,7 @@ HttpCleanProtocol (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpCreateConnection (
|
HttpCreateConnection (
|
||||||
IN HTTP_PROTOCOL *HttpInstance
|
IN HTTP_PROTOCOL *HttpInstance
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -358,7 +356,7 @@ HttpCreateConnection (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpCloseConnection (
|
HttpCloseConnection (
|
||||||
IN HTTP_PROTOCOL *HttpInstance
|
IN HTTP_PROTOCOL *HttpInstance
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -373,8 +371,8 @@ HttpCloseConnection (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpConfigureTcp4 (
|
HttpConfigureTcp4 (
|
||||||
IN HTTP_PROTOCOL *HttpInstance,
|
IN HTTP_PROTOCOL *HttpInstance,
|
||||||
IN HTTP_TOKEN_WRAP *Wrap
|
IN HTTP_TOKEN_WRAP *Wrap
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -389,8 +387,8 @@ HttpConfigureTcp4 (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpConfigureTcp6 (
|
HttpConfigureTcp6 (
|
||||||
IN HTTP_PROTOCOL *HttpInstance,
|
IN HTTP_PROTOCOL *HttpInstance,
|
||||||
IN HTTP_TOKEN_WRAP *Wrap
|
IN HTTP_TOKEN_WRAP *Wrap
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -406,7 +404,7 @@ HttpConfigureTcp6 (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpConnectTcp4 (
|
HttpConnectTcp4 (
|
||||||
IN HTTP_PROTOCOL *HttpInstance
|
IN HTTP_PROTOCOL *HttpInstance
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -422,7 +420,7 @@ HttpConnectTcp4 (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpConnectTcp6 (
|
HttpConnectTcp6 (
|
||||||
IN HTTP_PROTOCOL *HttpInstance
|
IN HTTP_PROTOCOL *HttpInstance
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -462,9 +460,9 @@ HttpTransmitTcp (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
HttpTokenExist (
|
HttpTokenExist (
|
||||||
IN NET_MAP *Map,
|
IN NET_MAP *Map,
|
||||||
IN NET_MAP_ITEM *Item,
|
IN NET_MAP_ITEM *Item,
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -481,9 +479,9 @@ HttpTokenExist (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
HttpTcpNotReady (
|
HttpTcpNotReady (
|
||||||
IN NET_MAP *Map,
|
IN NET_MAP *Map,
|
||||||
IN NET_MAP_ITEM *Item,
|
IN NET_MAP_ITEM *Item,
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -521,9 +519,9 @@ HttpInitSession (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
HttpTcpTransmit (
|
HttpTcpTransmit (
|
||||||
IN NET_MAP *Map,
|
IN NET_MAP *Map,
|
||||||
IN NET_MAP_ITEM *Item,
|
IN NET_MAP_ITEM *Item,
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -541,9 +539,9 @@ HttpTcpTransmit (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
HttpTcpReceive (
|
HttpTcpReceive (
|
||||||
IN NET_MAP *Map,
|
IN NET_MAP *Map,
|
||||||
IN NET_MAP_ITEM *Item,
|
IN NET_MAP_ITEM *Item,
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -560,10 +558,10 @@ HttpTcpReceive (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpTcpReceiveHeader (
|
HttpTcpReceiveHeader (
|
||||||
IN HTTP_PROTOCOL *HttpInstance,
|
IN HTTP_PROTOCOL *HttpInstance,
|
||||||
IN OUT UINTN *SizeofHeaders,
|
IN OUT UINTN *SizeofHeaders,
|
||||||
IN OUT UINTN *BufferSize,
|
IN OUT UINTN *BufferSize,
|
||||||
IN EFI_EVENT Timeout
|
IN EFI_EVENT Timeout
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -578,8 +576,8 @@ HttpTcpReceiveHeader (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpTcpReceiveBody (
|
HttpTcpReceiveBody (
|
||||||
IN HTTP_TOKEN_WRAP *Wrap,
|
IN HTTP_TOKEN_WRAP *Wrap,
|
||||||
IN EFI_HTTP_MESSAGE *HttpMsg
|
IN EFI_HTTP_MESSAGE *HttpMsg
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -590,7 +588,7 @@ HttpTcpReceiveBody (
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
HttpTcpTokenCleanup (
|
HttpTcpTokenCleanup (
|
||||||
IN HTTP_TOKEN_WRAP *Wrap
|
IN HTTP_TOKEN_WRAP *Wrap
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -605,7 +603,7 @@ HttpTcpTokenCleanup (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpResponseWorker (
|
HttpResponseWorker (
|
||||||
IN HTTP_TOKEN_WRAP *Wrap
|
IN HTTP_TOKEN_WRAP *Wrap
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -617,8 +615,8 @@ HttpResponseWorker (
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
HttpNotify (
|
HttpNotify (
|
||||||
IN EDKII_HTTP_CALLBACK_EVENT Event,
|
IN EDKII_HTTP_CALLBACK_EVENT Event,
|
||||||
IN EFI_STATUS EventStatus
|
IN EFI_STATUS EventStatus
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -9,9 +9,9 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#ifndef __EFI_HTTPS_SUPPORT_H__
|
#ifndef __EFI_HTTPS_SUPPORT_H__
|
||||||
#define __EFI_HTTPS_SUPPORT_H__
|
#define __EFI_HTTPS_SUPPORT_H__
|
||||||
|
|
||||||
#define HTTPS_DEFAULT_PORT 443
|
#define HTTPS_DEFAULT_PORT 443
|
||||||
|
|
||||||
#define HTTPS_FLAG "https://"
|
#define HTTPS_FLAG "https://"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Check whether the Url is from Https.
|
Check whether the Url is from Https.
|
||||||
@ -24,7 +24,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
**/
|
**/
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
IsHttpsUrl (
|
IsHttpsUrl (
|
||||||
IN CHAR8 *Url
|
IN CHAR8 *Url
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -41,10 +41,10 @@ IsHttpsUrl (
|
|||||||
EFI_HANDLE
|
EFI_HANDLE
|
||||||
EFIAPI
|
EFIAPI
|
||||||
TlsCreateChild (
|
TlsCreateChild (
|
||||||
IN EFI_HANDLE ImageHandle,
|
IN EFI_HANDLE ImageHandle,
|
||||||
OUT EFI_SERVICE_BINDING_PROTOCOL **TlsSb,
|
OUT EFI_SERVICE_BINDING_PROTOCOL **TlsSb,
|
||||||
OUT EFI_TLS_PROTOCOL **TlsProto,
|
OUT EFI_TLS_PROTOCOL **TlsProto,
|
||||||
OUT EFI_TLS_CONFIGURATION_PROTOCOL **TlsConfiguration
|
OUT EFI_TLS_CONFIGURATION_PROTOCOL **TlsConfiguration
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -60,7 +60,7 @@ TlsCreateChild (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
TlsCreateTxRxEvent (
|
TlsCreateTxRxEvent (
|
||||||
IN OUT HTTP_PROTOCOL *HttpInstance
|
IN OUT HTTP_PROTOCOL *HttpInstance
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -72,7 +72,7 @@ TlsCreateTxRxEvent (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
TlsCloseTxRxEvent (
|
TlsCloseTxRxEvent (
|
||||||
IN HTTP_PROTOCOL *HttpInstance
|
IN HTTP_PROTOCOL *HttpInstance
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -88,7 +88,7 @@ TlsCloseTxRxEvent (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
TlsConfigCertificate (
|
TlsConfigCertificate (
|
||||||
IN OUT HTTP_PROTOCOL *HttpInstance
|
IN OUT HTTP_PROTOCOL *HttpInstance
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -103,7 +103,7 @@ TlsConfigCertificate (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
TlsConfigureSession (
|
TlsConfigureSession (
|
||||||
IN OUT HTTP_PROTOCOL *HttpInstance
|
IN OUT HTTP_PROTOCOL *HttpInstance
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -122,8 +122,8 @@ TlsConfigureSession (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
TlsCommonTransmit (
|
TlsCommonTransmit (
|
||||||
IN OUT HTTP_PROTOCOL *HttpInstance,
|
IN OUT HTTP_PROTOCOL *HttpInstance,
|
||||||
IN NET_BUF *Packet
|
IN NET_BUF *Packet
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -143,9 +143,9 @@ TlsCommonTransmit (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
TlsCommonReceive (
|
TlsCommonReceive (
|
||||||
IN OUT HTTP_PROTOCOL *HttpInstance,
|
IN OUT HTTP_PROTOCOL *HttpInstance,
|
||||||
IN NET_BUF *Packet,
|
IN NET_BUF *Packet,
|
||||||
IN EFI_EVENT Timeout
|
IN EFI_EVENT Timeout
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -166,9 +166,9 @@ TlsCommonReceive (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
TlsReceiveOnePdu (
|
TlsReceiveOnePdu (
|
||||||
IN OUT HTTP_PROTOCOL *HttpInstance,
|
IN OUT HTTP_PROTOCOL *HttpInstance,
|
||||||
OUT NET_BUF **Pdu,
|
OUT NET_BUF **Pdu,
|
||||||
IN EFI_EVENT Timeout
|
IN EFI_EVENT Timeout
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -186,8 +186,8 @@ TlsReceiveOnePdu (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
TlsConnectSession (
|
TlsConnectSession (
|
||||||
IN HTTP_PROTOCOL *HttpInstance,
|
IN HTTP_PROTOCOL *HttpInstance,
|
||||||
IN EFI_EVENT Timeout
|
IN EFI_EVENT Timeout
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -204,7 +204,7 @@ TlsConnectSession (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
TlsCloseSession (
|
TlsCloseSession (
|
||||||
IN HTTP_PROTOCOL *HttpInstance
|
IN HTTP_PROTOCOL *HttpInstance
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -233,11 +233,11 @@ TlsCloseSession (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
TlsProcessMessage (
|
TlsProcessMessage (
|
||||||
IN HTTP_PROTOCOL *HttpInstance,
|
IN HTTP_PROTOCOL *HttpInstance,
|
||||||
IN UINT8 *Message,
|
IN UINT8 *Message,
|
||||||
IN UINTN MessageSize,
|
IN UINTN MessageSize,
|
||||||
IN EFI_TLS_CRYPT_MODE ProcessMode,
|
IN EFI_TLS_CRYPT_MODE ProcessMode,
|
||||||
IN OUT NET_FRAGMENT *Fragment
|
IN OUT NET_FRAGMENT *Fragment
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -256,10 +256,9 @@ TlsProcessMessage (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
HttpsReceive (
|
HttpsReceive (
|
||||||
IN HTTP_PROTOCOL *HttpInstance,
|
IN HTTP_PROTOCOL *HttpInstance,
|
||||||
IN OUT NET_FRAGMENT *Fragment,
|
IN OUT NET_FRAGMENT *Fragment,
|
||||||
IN EFI_EVENT Timeout
|
IN EFI_EVENT Timeout
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -9,7 +9,6 @@
|
|||||||
|
|
||||||
#include "HttpUtilitiesDxe.h"
|
#include "HttpUtilitiesDxe.h"
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Unloads an image.
|
Unloads an image.
|
||||||
|
|
||||||
@ -25,14 +24,13 @@ HttpUtilitiesDxeUnload (
|
|||||||
IN EFI_HANDLE ImageHandle
|
IN EFI_HANDLE ImageHandle
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
UINTN HandleNum;
|
UINTN HandleNum;
|
||||||
EFI_HANDLE *HandleBuffer;
|
EFI_HANDLE *HandleBuffer;
|
||||||
UINT32 Index;
|
UINT32 Index;
|
||||||
EFI_HTTP_UTILITIES_PROTOCOL *HttpUtilitiesProtocol;
|
EFI_HTTP_UTILITIES_PROTOCOL *HttpUtilitiesProtocol;
|
||||||
|
|
||||||
|
HandleBuffer = NULL;
|
||||||
HandleBuffer = NULL;
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Locate all the handles with HttpUtilities protocol.
|
// Locate all the handles with HttpUtilities protocol.
|
||||||
@ -55,7 +53,7 @@ HttpUtilitiesDxeUnload (
|
|||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
HandleBuffer[Index],
|
HandleBuffer[Index],
|
||||||
&gEfiHttpUtilitiesProtocolGuid,
|
&gEfiHttpUtilitiesProtocolGuid,
|
||||||
(VOID **) &HttpUtilitiesProtocol,
|
(VOID **)&HttpUtilitiesProtocol,
|
||||||
ImageHandle,
|
ImageHandle,
|
||||||
NULL,
|
NULL,
|
||||||
EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL
|
EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL
|
||||||
@ -69,7 +67,8 @@ HttpUtilitiesDxeUnload (
|
|||||||
//
|
//
|
||||||
Status = gBS->UninstallMultipleProtocolInterfaces (
|
Status = gBS->UninstallMultipleProtocolInterfaces (
|
||||||
HandleBuffer[Index],
|
HandleBuffer[Index],
|
||||||
&gEfiHttpUtilitiesProtocolGuid, HttpUtilitiesProtocol,
|
&gEfiHttpUtilitiesProtocolGuid,
|
||||||
|
HttpUtilitiesProtocol,
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
@ -80,7 +79,6 @@ HttpUtilitiesDxeUnload (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This is the declaration of an EFI image entry point. This entry point is
|
This is the declaration of an EFI image entry point. This entry point is
|
||||||
the same for UEFI Applications, UEFI OS Loaders, and UEFI Drivers including
|
the same for UEFI Applications, UEFI OS Loaders, and UEFI Drivers including
|
||||||
@ -99,9 +97,9 @@ HttpUtilitiesDxeDriverEntryPoint (
|
|||||||
IN EFI_SYSTEM_TABLE *SystemTable
|
IN EFI_SYSTEM_TABLE *SystemTable
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
EFI_HANDLE Handle;
|
EFI_HANDLE Handle;
|
||||||
|
|
||||||
Handle = NULL;
|
Handle = NULL;
|
||||||
|
|
||||||
@ -117,4 +115,3 @@ HttpUtilitiesDxeDriverEntryPoint (
|
|||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -33,7 +33,7 @@
|
|||||||
//
|
//
|
||||||
// Protocol instances
|
// Protocol instances
|
||||||
//
|
//
|
||||||
extern EFI_HTTP_UTILITIES_PROTOCOL mHttpUtilitiesProtocol;
|
extern EFI_HTTP_UTILITIES_PROTOCOL mHttpUtilitiesProtocol;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Create HTTP header based on a combination of seed header, fields
|
Create HTTP header based on a combination of seed header, fields
|
||||||
@ -70,18 +70,17 @@ extern EFI_HTTP_UTILITIES_PROTOCOL mHttpUtilitiesProtocol;
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
HttpUtilitiesBuild (
|
HttpUtilitiesBuild (
|
||||||
IN EFI_HTTP_UTILITIES_PROTOCOL *This,
|
IN EFI_HTTP_UTILITIES_PROTOCOL *This,
|
||||||
IN UINTN SeedMessageSize,
|
IN UINTN SeedMessageSize,
|
||||||
IN VOID *SeedMessage OPTIONAL,
|
IN VOID *SeedMessage OPTIONAL,
|
||||||
IN UINTN DeleteCount,
|
IN UINTN DeleteCount,
|
||||||
IN CHAR8 *DeleteList[] OPTIONAL,
|
IN CHAR8 *DeleteList[] OPTIONAL,
|
||||||
IN UINTN AppendCount,
|
IN UINTN AppendCount,
|
||||||
IN EFI_HTTP_HEADER *AppendList[] OPTIONAL,
|
IN EFI_HTTP_HEADER *AppendList[] OPTIONAL,
|
||||||
OUT UINTN *NewMessageSize,
|
OUT UINTN *NewMessageSize,
|
||||||
OUT VOID **NewMessage
|
OUT VOID **NewMessage
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Parses HTTP header and produces an array of key/value pairs.
|
Parses HTTP header and produces an array of key/value pairs.
|
||||||
|
|
||||||
|
@ -9,12 +9,11 @@
|
|||||||
|
|
||||||
#include "HttpUtilitiesDxe.h"
|
#include "HttpUtilitiesDxe.h"
|
||||||
|
|
||||||
EFI_HTTP_UTILITIES_PROTOCOL mHttpUtilitiesProtocol = {
|
EFI_HTTP_UTILITIES_PROTOCOL mHttpUtilitiesProtocol = {
|
||||||
HttpUtilitiesBuild,
|
HttpUtilitiesBuild,
|
||||||
HttpUtilitiesParse
|
HttpUtilitiesParse
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Create HTTP header based on a combination of seed header, fields
|
Create HTTP header based on a combination of seed header, fields
|
||||||
to delete, and fields to append.
|
to delete, and fields to append.
|
||||||
@ -50,28 +49,28 @@ EFI_HTTP_UTILITIES_PROTOCOL mHttpUtilitiesProtocol = {
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
HttpUtilitiesBuild (
|
HttpUtilitiesBuild (
|
||||||
IN EFI_HTTP_UTILITIES_PROTOCOL *This,
|
IN EFI_HTTP_UTILITIES_PROTOCOL *This,
|
||||||
IN UINTN SeedMessageSize,
|
IN UINTN SeedMessageSize,
|
||||||
IN VOID *SeedMessage OPTIONAL,
|
IN VOID *SeedMessage OPTIONAL,
|
||||||
IN UINTN DeleteCount,
|
IN UINTN DeleteCount,
|
||||||
IN CHAR8 *DeleteList[] OPTIONAL,
|
IN CHAR8 *DeleteList[] OPTIONAL,
|
||||||
IN UINTN AppendCount,
|
IN UINTN AppendCount,
|
||||||
IN EFI_HTTP_HEADER *AppendList[] OPTIONAL,
|
IN EFI_HTTP_HEADER *AppendList[] OPTIONAL,
|
||||||
OUT UINTN *NewMessageSize,
|
OUT UINTN *NewMessageSize,
|
||||||
OUT VOID **NewMessage
|
OUT VOID **NewMessage
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_HTTP_HEADER *SeedHeaderFields;
|
EFI_HTTP_HEADER *SeedHeaderFields;
|
||||||
UINTN SeedFieldCount;
|
UINTN SeedFieldCount;
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
EFI_HTTP_HEADER *TempHeaderFields;
|
EFI_HTTP_HEADER *TempHeaderFields;
|
||||||
UINTN TempFieldCount;
|
UINTN TempFieldCount;
|
||||||
EFI_HTTP_HEADER *NewHeaderFields;
|
EFI_HTTP_HEADER *NewHeaderFields;
|
||||||
UINTN NewFieldCount;
|
UINTN NewFieldCount;
|
||||||
EFI_HTTP_HEADER *HttpHeader;
|
EFI_HTTP_HEADER *HttpHeader;
|
||||||
UINTN StrLength;
|
UINTN StrLength;
|
||||||
UINT8 *NewMessagePtr;
|
UINT8 *NewMessagePtr;
|
||||||
|
|
||||||
SeedHeaderFields = NULL;
|
SeedHeaderFields = NULL;
|
||||||
SeedFieldCount = 0;
|
SeedFieldCount = 0;
|
||||||
@ -80,11 +79,11 @@ HttpUtilitiesBuild (
|
|||||||
NewHeaderFields = NULL;
|
NewHeaderFields = NULL;
|
||||||
NewFieldCount = 0;
|
NewFieldCount = 0;
|
||||||
|
|
||||||
HttpHeader = NULL;
|
HttpHeader = NULL;
|
||||||
StrLength = 0;
|
StrLength = 0;
|
||||||
NewMessagePtr = NULL;
|
NewMessagePtr = NULL;
|
||||||
*NewMessageSize = 0;
|
*NewMessageSize = 0;
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
|
|
||||||
if (This == NULL) {
|
if (This == NULL) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
@ -106,8 +105,8 @@ HttpUtilitiesBuild (
|
|||||||
//
|
//
|
||||||
// Handle DeleteList
|
// Handle DeleteList
|
||||||
//
|
//
|
||||||
if (SeedFieldCount != 0 && DeleteCount != 0) {
|
if ((SeedFieldCount != 0) && (DeleteCount != 0)) {
|
||||||
TempHeaderFields = AllocateZeroPool (SeedFieldCount * sizeof(EFI_HTTP_HEADER));
|
TempHeaderFields = AllocateZeroPool (SeedFieldCount * sizeof (EFI_HTTP_HEADER));
|
||||||
if (TempHeaderFields == NULL) {
|
if (TempHeaderFields == NULL) {
|
||||||
Status = EFI_OUT_OF_RESOURCES;
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
@ -117,7 +116,7 @@ HttpUtilitiesBuild (
|
|||||||
//
|
//
|
||||||
// Check whether each SeedHeaderFields member is in DeleteList
|
// Check whether each SeedHeaderFields member is in DeleteList
|
||||||
//
|
//
|
||||||
if (HttpIsValidHttpHeader( DeleteList, DeleteCount, SeedHeaderFields[Index].FieldName)) {
|
if (HttpIsValidHttpHeader (DeleteList, DeleteCount, SeedHeaderFields[Index].FieldName)) {
|
||||||
Status = HttpSetFieldNameAndValue (
|
Status = HttpSetFieldNameAndValue (
|
||||||
&TempHeaderFields[TempFieldCount],
|
&TempHeaderFields[TempFieldCount],
|
||||||
SeedHeaderFields[Index].FieldName,
|
SeedHeaderFields[Index].FieldName,
|
||||||
@ -126,12 +125,13 @@ HttpUtilitiesBuild (
|
|||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
TempFieldCount++;
|
TempFieldCount++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
TempHeaderFields = SeedHeaderFields;
|
TempHeaderFields = SeedHeaderFields;
|
||||||
TempFieldCount = SeedFieldCount;
|
TempFieldCount = SeedFieldCount;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -176,6 +176,7 @@ HttpUtilitiesBuild (
|
|||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
NewFieldCount++;
|
NewFieldCount++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -186,19 +187,20 @@ HttpUtilitiesBuild (
|
|||||||
for (Index = 0; Index < NewFieldCount; Index++) {
|
for (Index = 0; Index < NewFieldCount; Index++) {
|
||||||
HttpHeader = &NewHeaderFields[Index];
|
HttpHeader = &NewHeaderFields[Index];
|
||||||
|
|
||||||
StrLength = AsciiStrLen (HttpHeader->FieldName);
|
StrLength = AsciiStrLen (HttpHeader->FieldName);
|
||||||
*NewMessageSize += StrLength;
|
*NewMessageSize += StrLength;
|
||||||
|
|
||||||
StrLength = sizeof(": ") - 1;
|
StrLength = sizeof (": ") - 1;
|
||||||
*NewMessageSize += StrLength;
|
*NewMessageSize += StrLength;
|
||||||
|
|
||||||
StrLength = AsciiStrLen (HttpHeader->FieldValue);
|
StrLength = AsciiStrLen (HttpHeader->FieldValue);
|
||||||
*NewMessageSize += StrLength;
|
*NewMessageSize += StrLength;
|
||||||
|
|
||||||
StrLength = sizeof("\r\n") - 1;
|
StrLength = sizeof ("\r\n") - 1;
|
||||||
*NewMessageSize += StrLength;
|
*NewMessageSize += StrLength;
|
||||||
}
|
}
|
||||||
StrLength = sizeof("\r\n") - 1;
|
|
||||||
|
StrLength = sizeof ("\r\n") - 1;
|
||||||
*NewMessageSize += StrLength;
|
*NewMessageSize += StrLength;
|
||||||
|
|
||||||
*NewMessage = AllocateZeroPool (*NewMessageSize);
|
*NewMessage = AllocateZeroPool (*NewMessageSize);
|
||||||
@ -216,7 +218,7 @@ HttpUtilitiesBuild (
|
|||||||
CopyMem (NewMessagePtr, HttpHeader->FieldName, StrLength);
|
CopyMem (NewMessagePtr, HttpHeader->FieldName, StrLength);
|
||||||
NewMessagePtr += StrLength;
|
NewMessagePtr += StrLength;
|
||||||
|
|
||||||
StrLength = sizeof(": ") - 1;
|
StrLength = sizeof (": ") - 1;
|
||||||
CopyMem (NewMessagePtr, ": ", StrLength);
|
CopyMem (NewMessagePtr, ": ", StrLength);
|
||||||
NewMessagePtr += StrLength;
|
NewMessagePtr += StrLength;
|
||||||
|
|
||||||
@ -224,11 +226,12 @@ HttpUtilitiesBuild (
|
|||||||
CopyMem (NewMessagePtr, HttpHeader->FieldValue, StrLength);
|
CopyMem (NewMessagePtr, HttpHeader->FieldValue, StrLength);
|
||||||
NewMessagePtr += StrLength;
|
NewMessagePtr += StrLength;
|
||||||
|
|
||||||
StrLength = sizeof("\r\n") - 1;
|
StrLength = sizeof ("\r\n") - 1;
|
||||||
CopyMem (NewMessagePtr, "\r\n", StrLength);
|
CopyMem (NewMessagePtr, "\r\n", StrLength);
|
||||||
NewMessagePtr += StrLength;
|
NewMessagePtr += StrLength;
|
||||||
}
|
}
|
||||||
StrLength = sizeof("\r\n") - 1;
|
|
||||||
|
StrLength = sizeof ("\r\n") - 1;
|
||||||
CopyMem (NewMessagePtr, "\r\n", StrLength);
|
CopyMem (NewMessagePtr, "\r\n", StrLength);
|
||||||
NewMessagePtr += StrLength;
|
NewMessagePtr += StrLength;
|
||||||
|
|
||||||
@ -239,21 +242,20 @@ HttpUtilitiesBuild (
|
|||||||
//
|
//
|
||||||
ON_EXIT:
|
ON_EXIT:
|
||||||
if (SeedHeaderFields != NULL) {
|
if (SeedHeaderFields != NULL) {
|
||||||
HttpFreeHeaderFields(SeedHeaderFields, SeedFieldCount);
|
HttpFreeHeaderFields (SeedHeaderFields, SeedFieldCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TempHeaderFields != NULL) {
|
if (TempHeaderFields != NULL) {
|
||||||
HttpFreeHeaderFields(TempHeaderFields, TempFieldCount);
|
HttpFreeHeaderFields (TempHeaderFields, TempFieldCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (NewHeaderFields != NULL) {
|
if (NewHeaderFields != NULL) {
|
||||||
HttpFreeHeaderFields(NewHeaderFields, NewFieldCount);
|
HttpFreeHeaderFields (NewHeaderFields, NewFieldCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Parses HTTP header and produces an array of key/value pairs.
|
Parses HTTP header and produces an array of key/value pairs.
|
||||||
|
|
||||||
@ -285,14 +287,14 @@ HttpUtilitiesParse (
|
|||||||
OUT UINTN *FieldCount
|
OUT UINTN *FieldCount
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
CHAR8 *TempHttpMessage;
|
CHAR8 *TempHttpMessage;
|
||||||
CHAR8 *Token;
|
CHAR8 *Token;
|
||||||
CHAR8 *NextToken;
|
CHAR8 *NextToken;
|
||||||
CHAR8 *FieldName;
|
CHAR8 *FieldName;
|
||||||
CHAR8 *FieldValue;
|
CHAR8 *FieldValue;
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
UINTN HttpBufferSize;
|
UINTN HttpBufferSize;
|
||||||
|
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
TempHttpMessage = NULL;
|
TempHttpMessage = NULL;
|
||||||
@ -302,14 +304,14 @@ HttpUtilitiesParse (
|
|||||||
FieldValue = NULL;
|
FieldValue = NULL;
|
||||||
Index = 0;
|
Index = 0;
|
||||||
|
|
||||||
if (This == NULL || HttpMessage == NULL || HeaderFields == NULL || FieldCount == NULL) {
|
if ((This == NULL) || (HttpMessage == NULL) || (HeaderFields == NULL) || (FieldCount == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Append the http response string along with a Null-terminator.
|
// Append the http response string along with a Null-terminator.
|
||||||
//
|
//
|
||||||
HttpBufferSize = HttpMessageSize + 1;
|
HttpBufferSize = HttpMessageSize + 1;
|
||||||
TempHttpMessage = AllocatePool (HttpBufferSize);
|
TempHttpMessage = AllocatePool (HttpBufferSize);
|
||||||
if (TempHttpMessage == NULL) {
|
if (TempHttpMessage == NULL) {
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
@ -322,13 +324,13 @@ HttpUtilitiesParse (
|
|||||||
// Get header number
|
// Get header number
|
||||||
//
|
//
|
||||||
*FieldCount = 0;
|
*FieldCount = 0;
|
||||||
Token = TempHttpMessage;
|
Token = TempHttpMessage;
|
||||||
while (TRUE) {
|
while (TRUE) {
|
||||||
FieldName = NULL;
|
FieldName = NULL;
|
||||||
FieldValue = NULL;
|
FieldValue = NULL;
|
||||||
NextToken = HttpGetFieldNameAndValue (Token, &FieldName, &FieldValue);
|
NextToken = HttpGetFieldNameAndValue (Token, &FieldName, &FieldValue);
|
||||||
Token = NextToken;
|
Token = NextToken;
|
||||||
if (FieldName == NULL || FieldValue == NULL) {
|
if ((FieldName == NULL) || (FieldValue == NULL)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -343,10 +345,10 @@ HttpUtilitiesParse (
|
|||||||
//
|
//
|
||||||
// Allocate buffer for header
|
// Allocate buffer for header
|
||||||
//
|
//
|
||||||
*HeaderFields = AllocateZeroPool ((*FieldCount) * sizeof(EFI_HTTP_HEADER));
|
*HeaderFields = AllocateZeroPool ((*FieldCount) * sizeof (EFI_HTTP_HEADER));
|
||||||
if (*HeaderFields == NULL) {
|
if (*HeaderFields == NULL) {
|
||||||
*FieldCount = 0;
|
*FieldCount = 0;
|
||||||
Status = EFI_OUT_OF_RESOURCES;
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -357,11 +359,11 @@ HttpUtilitiesParse (
|
|||||||
//
|
//
|
||||||
Token = TempHttpMessage;
|
Token = TempHttpMessage;
|
||||||
while (Index < *FieldCount) {
|
while (Index < *FieldCount) {
|
||||||
FieldName = NULL;
|
FieldName = NULL;
|
||||||
FieldValue = NULL;
|
FieldValue = NULL;
|
||||||
NextToken = HttpGetFieldNameAndValue (Token, &FieldName, &FieldValue);
|
NextToken = HttpGetFieldNameAndValue (Token, &FieldName, &FieldValue);
|
||||||
Token = NextToken;
|
Token = NextToken;
|
||||||
if (FieldName == NULL || FieldValue == NULL) {
|
if ((FieldName == NULL) || (FieldValue == NULL)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -11,7 +11,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
//
|
//
|
||||||
// EFI Component Name Protocol
|
// EFI Component Name Protocol
|
||||||
//
|
//
|
||||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gIScsiComponentName = {
|
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gIScsiComponentName = {
|
||||||
IScsiComponentNameGetDriverName,
|
IScsiComponentNameGetDriverName,
|
||||||
IScsiComponentNameGetControllerName,
|
IScsiComponentNameGetControllerName,
|
||||||
"eng"
|
"eng"
|
||||||
@ -20,13 +20,13 @@ GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gIScsiComponentName =
|
|||||||
//
|
//
|
||||||
// EFI Component Name 2 Protocol
|
// EFI Component Name 2 Protocol
|
||||||
//
|
//
|
||||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gIScsiComponentName2 = {
|
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gIScsiComponentName2 = {
|
||||||
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME) IScsiComponentNameGetDriverName,
|
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME)IScsiComponentNameGetDriverName,
|
||||||
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) IScsiComponentNameGetControllerName,
|
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME)IScsiComponentNameGetControllerName,
|
||||||
"en"
|
"en"
|
||||||
};
|
};
|
||||||
|
|
||||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mIScsiDriverNameTable[] = {
|
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mIScsiDriverNameTable[] = {
|
||||||
{
|
{
|
||||||
"eng;en",
|
"eng;en",
|
||||||
L"iSCSI Driver"
|
L"iSCSI Driver"
|
||||||
@ -81,9 +81,9 @@ GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE *gIScsiControllerNameTab
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
IScsiComponentNameGetDriverName (
|
IScsiComponentNameGetDriverName (
|
||||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||||
IN CHAR8 *Language,
|
IN CHAR8 *Language,
|
||||||
OUT CHAR16 **DriverName
|
OUT CHAR16 **DriverName
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return LookupUnicodeString2 (
|
return LookupUnicodeString2 (
|
||||||
@ -91,7 +91,7 @@ IScsiComponentNameGetDriverName (
|
|||||||
This->SupportedLanguages,
|
This->SupportedLanguages,
|
||||||
mIScsiDriverNameTable,
|
mIScsiDriverNameTable,
|
||||||
DriverName,
|
DriverName,
|
||||||
(BOOLEAN) (This == &gIScsiComponentName)
|
(BOOLEAN)(This == &gIScsiComponentName)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -108,14 +108,14 @@ IScsiComponentNameGetDriverName (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
UpdateName (
|
UpdateName (
|
||||||
IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *IScsiExtScsiPassThru,
|
IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *IScsiExtScsiPassThru,
|
||||||
IN BOOLEAN Ipv6Flag
|
IN BOOLEAN Ipv6Flag
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
CHAR16 HandleName[80];
|
CHAR16 HandleName[80];
|
||||||
ISCSI_DRIVER_DATA *Private;
|
ISCSI_DRIVER_DATA *Private;
|
||||||
UINT8 NicIndex;
|
UINT8 NicIndex;
|
||||||
|
|
||||||
if (IScsiExtScsiPassThru == NULL) {
|
if (IScsiExtScsiPassThru == NULL) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
@ -130,7 +130,7 @@ UpdateName (
|
|||||||
L"iSCSI (%s, NicIndex=%d)",
|
L"iSCSI (%s, NicIndex=%d)",
|
||||||
Ipv6Flag ? L"IPv6" : L"IPv4",
|
Ipv6Flag ? L"IPv6" : L"IPv4",
|
||||||
NicIndex
|
NicIndex
|
||||||
);
|
);
|
||||||
|
|
||||||
if (gIScsiControllerNameTable != NULL) {
|
if (gIScsiControllerNameTable != NULL) {
|
||||||
FreeUnicodeStringTable (gIScsiControllerNameTable);
|
FreeUnicodeStringTable (gIScsiControllerNameTable);
|
||||||
@ -228,21 +228,21 @@ UpdateName (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
IScsiComponentNameGetControllerName (
|
IScsiComponentNameGetControllerName (
|
||||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||||
IN EFI_HANDLE ControllerHandle,
|
IN EFI_HANDLE ControllerHandle,
|
||||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||||
IN CHAR8 *Language,
|
IN CHAR8 *Language,
|
||||||
OUT CHAR16 **ControllerName
|
OUT CHAR16 **ControllerName
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
EFI_HANDLE IScsiController;
|
EFI_HANDLE IScsiController;
|
||||||
BOOLEAN Ipv6Flag;
|
BOOLEAN Ipv6Flag;
|
||||||
EFI_GUID *IScsiPrivateGuid;
|
EFI_GUID *IScsiPrivateGuid;
|
||||||
ISCSI_PRIVATE_PROTOCOL *IScsiIdentifier;
|
ISCSI_PRIVATE_PROTOCOL *IScsiIdentifier;
|
||||||
|
|
||||||
EFI_EXT_SCSI_PASS_THRU_PROTOCOL *IScsiExtScsiPassThru;
|
EFI_EXT_SCSI_PASS_THRU_PROTOCOL *IScsiExtScsiPassThru;
|
||||||
|
|
||||||
if (ControllerHandle == NULL) {
|
if (ControllerHandle == NULL) {
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
@ -254,12 +254,12 @@ IScsiComponentNameGetControllerName (
|
|||||||
IScsiController = NetLibGetNicHandle (ControllerHandle, &gEfiTcp4ProtocolGuid);
|
IScsiController = NetLibGetNicHandle (ControllerHandle, &gEfiTcp4ProtocolGuid);
|
||||||
if (IScsiController != NULL) {
|
if (IScsiController != NULL) {
|
||||||
IScsiPrivateGuid = &gIScsiV4PrivateGuid;
|
IScsiPrivateGuid = &gIScsiV4PrivateGuid;
|
||||||
Ipv6Flag = FALSE;
|
Ipv6Flag = FALSE;
|
||||||
} else {
|
} else {
|
||||||
IScsiController = NetLibGetNicHandle (ControllerHandle, &gEfiTcp6ProtocolGuid);
|
IScsiController = NetLibGetNicHandle (ControllerHandle, &gEfiTcp6ProtocolGuid);
|
||||||
if (IScsiController != NULL) {
|
if (IScsiController != NULL) {
|
||||||
IScsiPrivateGuid = &gIScsiV6PrivateGuid;
|
IScsiPrivateGuid = &gIScsiV6PrivateGuid;
|
||||||
Ipv6Flag = TRUE;
|
Ipv6Flag = TRUE;
|
||||||
} else {
|
} else {
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
@ -268,7 +268,7 @@ IScsiComponentNameGetControllerName (
|
|||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
IScsiController,
|
IScsiController,
|
||||||
IScsiPrivateGuid,
|
IScsiPrivateGuid,
|
||||||
(VOID **) &IScsiIdentifier,
|
(VOID **)&IScsiIdentifier,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||||
@ -277,8 +277,8 @@ IScsiComponentNameGetControllerName (
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(ChildHandle != NULL) {
|
if (ChildHandle != NULL) {
|
||||||
if(!Ipv6Flag) {
|
if (!Ipv6Flag) {
|
||||||
//
|
//
|
||||||
// Make sure this driver produced ChildHandle
|
// Make sure this driver produced ChildHandle
|
||||||
//
|
//
|
||||||
@ -310,7 +310,7 @@ IScsiComponentNameGetControllerName (
|
|||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
ChildHandle,
|
ChildHandle,
|
||||||
&gEfiExtScsiPassThruProtocolGuid,
|
&gEfiExtScsiPassThruProtocolGuid,
|
||||||
(VOID **)&IScsiExtScsiPassThru,
|
(VOID **)&IScsiExtScsiPassThru,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||||
|
@ -9,7 +9,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
|
|
||||||
#include "IScsiImpl.h"
|
#include "IScsiImpl.h"
|
||||||
|
|
||||||
EFI_AUTHENTICATION_INFO_PROTOCOL gIScsiAuthenticationInfo = {
|
EFI_AUTHENTICATION_INFO_PROTOCOL gIScsiAuthenticationInfo = {
|
||||||
IScsiGetAuthenticationInfo,
|
IScsiGetAuthenticationInfo,
|
||||||
IScsiSetAuthenticationInfo
|
IScsiSetAuthenticationInfo
|
||||||
};
|
};
|
||||||
@ -30,9 +30,9 @@ EFI_AUTHENTICATION_INFO_PROTOCOL gIScsiAuthenticationInfo = {
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
IScsiGetAuthenticationInfo (
|
IScsiGetAuthenticationInfo (
|
||||||
IN EFI_AUTHENTICATION_INFO_PROTOCOL *This,
|
IN EFI_AUTHENTICATION_INFO_PROTOCOL *This,
|
||||||
IN EFI_HANDLE ControllerHandle,
|
IN EFI_HANDLE ControllerHandle,
|
||||||
OUT VOID **Buffer
|
OUT VOID **Buffer
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return EFI_DEVICE_ERROR;
|
return EFI_DEVICE_ERROR;
|
||||||
|
@ -14,7 +14,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
// macros. CHAP_HASH structures at lower subscripts in the array are preferred
|
// macros. CHAP_HASH structures at lower subscripts in the array are preferred
|
||||||
// by the initiator.
|
// by the initiator.
|
||||||
//
|
//
|
||||||
STATIC CONST CHAP_HASH mChapHash[] = {
|
STATIC CONST CHAP_HASH mChapHash[] = {
|
||||||
{
|
{
|
||||||
ISCSI_CHAP_ALGORITHM_SHA256,
|
ISCSI_CHAP_ALGORITHM_SHA256,
|
||||||
SHA256_DIGEST_SIZE,
|
SHA256_DIGEST_SIZE,
|
||||||
@ -23,7 +23,7 @@ STATIC CONST CHAP_HASH mChapHash[] = {
|
|||||||
Sha256Update,
|
Sha256Update,
|
||||||
Sha256Final
|
Sha256Final
|
||||||
},
|
},
|
||||||
#ifdef ENABLE_MD5_DEPRECATED_INTERFACES
|
#ifdef ENABLE_MD5_DEPRECATED_INTERFACES
|
||||||
//
|
//
|
||||||
// Keep the deprecated MD5 entry at the end of the array (making MD5 the
|
// Keep the deprecated MD5 entry at the end of the array (making MD5 the
|
||||||
// least preferred choice of the initiator).
|
// least preferred choice of the initiator).
|
||||||
@ -36,7 +36,7 @@ STATIC CONST CHAP_HASH mChapHash[] = {
|
|||||||
Md5Update,
|
Md5Update,
|
||||||
Md5Final
|
Md5Final
|
||||||
},
|
},
|
||||||
#endif // ENABLE_MD5_DEPRECATED_INTERFACES
|
#endif // ENABLE_MD5_DEPRECATED_INTERFACES
|
||||||
};
|
};
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -44,17 +44,17 @@ STATIC CONST CHAP_HASH mChapHash[] = {
|
|||||||
// CHAP_A=<A1,A2...> value string, by the IScsiCHAPInitHashList() function. It
|
// CHAP_A=<A1,A2...> value string, by the IScsiCHAPInitHashList() function. It
|
||||||
// is sent by the initiator in ISCSI_CHAP_STEP_ONE.
|
// is sent by the initiator in ISCSI_CHAP_STEP_ONE.
|
||||||
//
|
//
|
||||||
STATIC CHAR8 mChapHashListString[
|
STATIC CHAR8 mChapHashListString[
|
||||||
3 + // UINT8 identifier in
|
3 + // UINT8 identifier in
|
||||||
// decimal
|
// decimal
|
||||||
(1 + 3) * (ARRAY_SIZE (mChapHash) - 1) + // comma prepended for
|
(1 + 3) * (ARRAY_SIZE (mChapHash) - 1) + // comma prepended for
|
||||||
// entries after the
|
// entries after the
|
||||||
// first
|
// first
|
||||||
1 + // extra character for
|
1 + // extra character for
|
||||||
// AsciiSPrint()
|
// AsciiSPrint()
|
||||||
// truncation check
|
// truncation check
|
||||||
1 // terminating NUL
|
1 // terminating NUL
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Initiator calculates its own expected hash value.
|
Initiator calculates its own expected hash value.
|
||||||
@ -82,13 +82,13 @@ STATIC CHAR8 mChapHashListString[
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
IScsiCHAPCalculateResponse (
|
IScsiCHAPCalculateResponse (
|
||||||
IN UINT32 ChapIdentifier,
|
IN UINT32 ChapIdentifier,
|
||||||
IN CHAR8 *ChapSecret,
|
IN CHAR8 *ChapSecret,
|
||||||
IN UINT32 SecretLength,
|
IN UINT32 SecretLength,
|
||||||
IN UINT8 *ChapChallenge,
|
IN UINT8 *ChapChallenge,
|
||||||
IN UINT32 ChallengeLength,
|
IN UINT32 ChallengeLength,
|
||||||
IN CONST CHAP_HASH *Hash,
|
IN CONST CHAP_HASH *Hash,
|
||||||
OUT UINT8 *ChapResponse
|
OUT UINT8 *ChapResponse
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINTN ContextSize;
|
UINTN ContextSize;
|
||||||
@ -103,7 +103,7 @@ IScsiCHAPCalculateResponse (
|
|||||||
ASSERT (Hash != NULL);
|
ASSERT (Hash != NULL);
|
||||||
|
|
||||||
ContextSize = Hash->GetContextSize ();
|
ContextSize = Hash->GetContextSize ();
|
||||||
Ctx = AllocatePool (ContextSize);
|
Ctx = AllocatePool (ContextSize);
|
||||||
if (Ctx == NULL) {
|
if (Ctx == NULL) {
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
@ -117,7 +117,7 @@ IScsiCHAPCalculateResponse (
|
|||||||
//
|
//
|
||||||
// Hash Identifier - Only calculate 1 byte data (RFC1994)
|
// Hash Identifier - Only calculate 1 byte data (RFC1994)
|
||||||
//
|
//
|
||||||
IdByte[0] = (CHAR8) ChapIdentifier;
|
IdByte[0] = (CHAR8)ChapIdentifier;
|
||||||
if (!Hash->Update (Ctx, IdByte, 1)) {
|
if (!Hash->Update (Ctx, IdByte, 1)) {
|
||||||
goto Exit;
|
goto Exit;
|
||||||
}
|
}
|
||||||
@ -170,9 +170,9 @@ IScsiCHAPAuthTarget (
|
|||||||
UINT8 VerifyRsp[ISCSI_CHAP_MAX_DIGEST_SIZE];
|
UINT8 VerifyRsp[ISCSI_CHAP_MAX_DIGEST_SIZE];
|
||||||
INTN Mismatch;
|
INTN Mismatch;
|
||||||
|
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
|
|
||||||
SecretSize = (UINT32) AsciiStrLen (AuthData->AuthConfig->ReverseCHAPSecret);
|
SecretSize = (UINT32)AsciiStrLen (AuthData->AuthConfig->ReverseCHAPSecret);
|
||||||
|
|
||||||
ASSERT (AuthData->Hash != NULL);
|
ASSERT (AuthData->Hash != NULL);
|
||||||
|
|
||||||
@ -198,7 +198,6 @@ IScsiCHAPAuthTarget (
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This function checks the received iSCSI Login Response during the security
|
This function checks the received iSCSI Login Response during the security
|
||||||
negotiation stage.
|
negotiation stage.
|
||||||
@ -216,33 +215,34 @@ IScsiCHAPOnRspReceived (
|
|||||||
IN ISCSI_CONNECTION *Conn
|
IN ISCSI_CONNECTION *Conn
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
ISCSI_SESSION *Session;
|
ISCSI_SESSION *Session;
|
||||||
ISCSI_CHAP_AUTH_DATA *AuthData;
|
ISCSI_CHAP_AUTH_DATA *AuthData;
|
||||||
CHAR8 *Value;
|
CHAR8 *Value;
|
||||||
UINT8 *Data;
|
UINT8 *Data;
|
||||||
UINT32 Len;
|
UINT32 Len;
|
||||||
LIST_ENTRY *KeyValueList;
|
LIST_ENTRY *KeyValueList;
|
||||||
UINTN Algorithm;
|
UINTN Algorithm;
|
||||||
CHAR8 *Identifier;
|
CHAR8 *Identifier;
|
||||||
CHAR8 *Challenge;
|
CHAR8 *Challenge;
|
||||||
CHAR8 *Name;
|
CHAR8 *Name;
|
||||||
CHAR8 *Response;
|
CHAR8 *Response;
|
||||||
UINT8 TargetRsp[ISCSI_CHAP_MAX_DIGEST_SIZE];
|
UINT8 TargetRsp[ISCSI_CHAP_MAX_DIGEST_SIZE];
|
||||||
UINT32 RspLen;
|
UINT32 RspLen;
|
||||||
UINTN Result;
|
UINTN Result;
|
||||||
UINTN HashIndex;
|
UINTN HashIndex;
|
||||||
|
|
||||||
ASSERT (Conn->CurrentStage == ISCSI_SECURITY_NEGOTIATION);
|
ASSERT (Conn->CurrentStage == ISCSI_SECURITY_NEGOTIATION);
|
||||||
ASSERT (Conn->RspQue.BufNum != 0);
|
ASSERT (Conn->RspQue.BufNum != 0);
|
||||||
|
|
||||||
Session = Conn->Session;
|
Session = Conn->Session;
|
||||||
AuthData = &Session->AuthData.CHAP;
|
AuthData = &Session->AuthData.CHAP;
|
||||||
Len = Conn->RspQue.BufSize;
|
Len = Conn->RspQue.BufSize;
|
||||||
Data = AllocateZeroPool (Len);
|
Data = AllocateZeroPool (Len);
|
||||||
if (Data == NULL) {
|
if (Data == NULL) {
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Copy the data in case the data spans over multiple PDUs.
|
// Copy the data in case the data spans over multiple PDUs.
|
||||||
//
|
//
|
||||||
@ -251,7 +251,7 @@ IScsiCHAPOnRspReceived (
|
|||||||
//
|
//
|
||||||
// Build the key-value list from the data segment of the Login Response.
|
// Build the key-value list from the data segment of the Login Response.
|
||||||
//
|
//
|
||||||
KeyValueList = IScsiBuildKeyValueList ((CHAR8 *) Data, Len);
|
KeyValueList = IScsiBuildKeyValueList ((CHAR8 *)Data, Len);
|
||||||
if (KeyValueList == NULL) {
|
if (KeyValueList == NULL) {
|
||||||
Status = EFI_OUT_OF_RESOURCES;
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
@ -260,179 +260,184 @@ IScsiCHAPOnRspReceived (
|
|||||||
Status = EFI_PROTOCOL_ERROR;
|
Status = EFI_PROTOCOL_ERROR;
|
||||||
|
|
||||||
switch (Conn->AuthStep) {
|
switch (Conn->AuthStep) {
|
||||||
case ISCSI_AUTH_INITIAL:
|
case ISCSI_AUTH_INITIAL:
|
||||||
//
|
//
|
||||||
// The first Login Response.
|
// The first Login Response.
|
||||||
//
|
//
|
||||||
Value = IScsiGetValueByKeyFromList (
|
Value = IScsiGetValueByKeyFromList (
|
||||||
KeyValueList,
|
KeyValueList,
|
||||||
ISCSI_KEY_TARGET_PORTAL_GROUP_TAG
|
ISCSI_KEY_TARGET_PORTAL_GROUP_TAG
|
||||||
);
|
);
|
||||||
if (Value == NULL) {
|
if (Value == NULL) {
|
||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
Result = IScsiNetNtoi (Value);
|
Result = IScsiNetNtoi (Value);
|
||||||
if (Result > 0xFFFF) {
|
if (Result > 0xFFFF) {
|
||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
Session->TargetPortalGroupTag = (UINT16) Result;
|
Session->TargetPortalGroupTag = (UINT16)Result;
|
||||||
|
|
||||||
Value = IScsiGetValueByKeyFromList (
|
Value = IScsiGetValueByKeyFromList (
|
||||||
KeyValueList,
|
KeyValueList,
|
||||||
ISCSI_KEY_AUTH_METHOD
|
ISCSI_KEY_AUTH_METHOD
|
||||||
|
);
|
||||||
|
if (Value == NULL) {
|
||||||
|
goto ON_EXIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Initiator mandates CHAP authentication but target replies without
|
||||||
|
// "CHAP", or initiator suggets "None" but target replies with some kind of
|
||||||
|
// auth method.
|
||||||
|
//
|
||||||
|
if (Session->AuthType == ISCSI_AUTH_TYPE_NONE) {
|
||||||
|
if (AsciiStrCmp (Value, ISCSI_KEY_VALUE_NONE) != 0) {
|
||||||
|
goto ON_EXIT;
|
||||||
|
}
|
||||||
|
} else if (Session->AuthType == ISCSI_AUTH_TYPE_CHAP) {
|
||||||
|
if (AsciiStrCmp (Value, ISCSI_AUTH_METHOD_CHAP) != 0) {
|
||||||
|
goto ON_EXIT;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
goto ON_EXIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Transit to CHAP step one.
|
||||||
|
//
|
||||||
|
Conn->AuthStep = ISCSI_CHAP_STEP_ONE;
|
||||||
|
Status = EFI_SUCCESS;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ISCSI_CHAP_STEP_TWO:
|
||||||
|
//
|
||||||
|
// The Target replies with CHAP_A=<A> CHAP_I=<I> CHAP_C=<C>
|
||||||
|
//
|
||||||
|
Value = IScsiGetValueByKeyFromList (
|
||||||
|
KeyValueList,
|
||||||
|
ISCSI_KEY_CHAP_ALGORITHM
|
||||||
|
);
|
||||||
|
if (Value == NULL) {
|
||||||
|
goto ON_EXIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
Algorithm = IScsiNetNtoi (Value);
|
||||||
|
for (HashIndex = 0; HashIndex < ARRAY_SIZE (mChapHash); HashIndex++) {
|
||||||
|
if (Algorithm == mChapHash[HashIndex].Algorithm) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (HashIndex == ARRAY_SIZE (mChapHash)) {
|
||||||
|
//
|
||||||
|
// Unsupported algorithm is chosen by target.
|
||||||
|
//
|
||||||
|
goto ON_EXIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Remember the target's chosen hash algorithm.
|
||||||
|
//
|
||||||
|
ASSERT (AuthData->Hash == NULL);
|
||||||
|
AuthData->Hash = &mChapHash[HashIndex];
|
||||||
|
|
||||||
|
Identifier = IScsiGetValueByKeyFromList (
|
||||||
|
KeyValueList,
|
||||||
|
ISCSI_KEY_CHAP_IDENTIFIER
|
||||||
|
);
|
||||||
|
if (Identifier == NULL) {
|
||||||
|
goto ON_EXIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
Challenge = IScsiGetValueByKeyFromList (
|
||||||
|
KeyValueList,
|
||||||
|
ISCSI_KEY_CHAP_CHALLENGE
|
||||||
|
);
|
||||||
|
if (Challenge == NULL) {
|
||||||
|
goto ON_EXIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Process the CHAP identifier and CHAP Challenge from Target.
|
||||||
|
// Calculate Response value.
|
||||||
|
//
|
||||||
|
Result = IScsiNetNtoi (Identifier);
|
||||||
|
if (Result > 0xFF) {
|
||||||
|
goto ON_EXIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
AuthData->InIdentifier = (UINT32)Result;
|
||||||
|
AuthData->InChallengeLength = (UINT32)sizeof (AuthData->InChallenge);
|
||||||
|
Status = IScsiHexToBin (
|
||||||
|
(UINT8 *)AuthData->InChallenge,
|
||||||
|
&AuthData->InChallengeLength,
|
||||||
|
Challenge
|
||||||
);
|
);
|
||||||
if (Value == NULL) {
|
if (EFI_ERROR (Status)) {
|
||||||
goto ON_EXIT;
|
Status = EFI_PROTOCOL_ERROR;
|
||||||
}
|
|
||||||
//
|
|
||||||
// Initiator mandates CHAP authentication but target replies without
|
|
||||||
// "CHAP", or initiator suggets "None" but target replies with some kind of
|
|
||||||
// auth method.
|
|
||||||
//
|
|
||||||
if (Session->AuthType == ISCSI_AUTH_TYPE_NONE) {
|
|
||||||
if (AsciiStrCmp (Value, ISCSI_KEY_VALUE_NONE) != 0) {
|
|
||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
}
|
}
|
||||||
} else if (Session->AuthType == ISCSI_AUTH_TYPE_CHAP) {
|
|
||||||
if (AsciiStrCmp (Value, ISCSI_AUTH_METHOD_CHAP) != 0) {
|
|
||||||
goto ON_EXIT;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
goto ON_EXIT;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
Status = IScsiCHAPCalculateResponse (
|
||||||
// Transit to CHAP step one.
|
AuthData->InIdentifier,
|
||||||
//
|
AuthData->AuthConfig->CHAPSecret,
|
||||||
Conn->AuthStep = ISCSI_CHAP_STEP_ONE;
|
(UINT32)AsciiStrLen (AuthData->AuthConfig->CHAPSecret),
|
||||||
Status = EFI_SUCCESS;
|
AuthData->InChallenge,
|
||||||
break;
|
AuthData->InChallengeLength,
|
||||||
|
AuthData->Hash,
|
||||||
case ISCSI_CHAP_STEP_TWO:
|
AuthData->CHAPResponse
|
||||||
//
|
|
||||||
// The Target replies with CHAP_A=<A> CHAP_I=<I> CHAP_C=<C>
|
|
||||||
//
|
|
||||||
Value = IScsiGetValueByKeyFromList (
|
|
||||||
KeyValueList,
|
|
||||||
ISCSI_KEY_CHAP_ALGORITHM
|
|
||||||
);
|
|
||||||
if (Value == NULL) {
|
|
||||||
goto ON_EXIT;
|
|
||||||
}
|
|
||||||
|
|
||||||
Algorithm = IScsiNetNtoi (Value);
|
|
||||||
for (HashIndex = 0; HashIndex < ARRAY_SIZE (mChapHash); HashIndex++) {
|
|
||||||
if (Algorithm == mChapHash[HashIndex].Algorithm) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (HashIndex == ARRAY_SIZE (mChapHash)) {
|
|
||||||
//
|
|
||||||
// Unsupported algorithm is chosen by target.
|
|
||||||
//
|
|
||||||
goto ON_EXIT;
|
|
||||||
}
|
|
||||||
//
|
|
||||||
// Remember the target's chosen hash algorithm.
|
|
||||||
//
|
|
||||||
ASSERT (AuthData->Hash == NULL);
|
|
||||||
AuthData->Hash = &mChapHash[HashIndex];
|
|
||||||
|
|
||||||
Identifier = IScsiGetValueByKeyFromList (
|
|
||||||
KeyValueList,
|
|
||||||
ISCSI_KEY_CHAP_IDENTIFIER
|
|
||||||
);
|
|
||||||
if (Identifier == NULL) {
|
|
||||||
goto ON_EXIT;
|
|
||||||
}
|
|
||||||
|
|
||||||
Challenge = IScsiGetValueByKeyFromList (
|
|
||||||
KeyValueList,
|
|
||||||
ISCSI_KEY_CHAP_CHALLENGE
|
|
||||||
);
|
|
||||||
if (Challenge == NULL) {
|
|
||||||
goto ON_EXIT;
|
|
||||||
}
|
|
||||||
//
|
|
||||||
// Process the CHAP identifier and CHAP Challenge from Target.
|
|
||||||
// Calculate Response value.
|
|
||||||
//
|
|
||||||
Result = IScsiNetNtoi (Identifier);
|
|
||||||
if (Result > 0xFF) {
|
|
||||||
goto ON_EXIT;
|
|
||||||
}
|
|
||||||
|
|
||||||
AuthData->InIdentifier = (UINT32) Result;
|
|
||||||
AuthData->InChallengeLength = (UINT32) sizeof (AuthData->InChallenge);
|
|
||||||
Status = IScsiHexToBin (
|
|
||||||
(UINT8 *) AuthData->InChallenge,
|
|
||||||
&AuthData->InChallengeLength,
|
|
||||||
Challenge
|
|
||||||
);
|
|
||||||
if (EFI_ERROR (Status)) {
|
|
||||||
Status = EFI_PROTOCOL_ERROR;
|
|
||||||
goto ON_EXIT;
|
|
||||||
}
|
|
||||||
Status = IScsiCHAPCalculateResponse (
|
|
||||||
AuthData->InIdentifier,
|
|
||||||
AuthData->AuthConfig->CHAPSecret,
|
|
||||||
(UINT32) AsciiStrLen (AuthData->AuthConfig->CHAPSecret),
|
|
||||||
AuthData->InChallenge,
|
|
||||||
AuthData->InChallengeLength,
|
|
||||||
AuthData->Hash,
|
|
||||||
AuthData->CHAPResponse
|
|
||||||
);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Transit to next step.
|
|
||||||
//
|
|
||||||
Conn->AuthStep = ISCSI_CHAP_STEP_THREE;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ISCSI_CHAP_STEP_THREE:
|
|
||||||
//
|
|
||||||
// One way CHAP authentication and the target would like to
|
|
||||||
// authenticate us.
|
|
||||||
//
|
|
||||||
Status = EFI_SUCCESS;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ISCSI_CHAP_STEP_FOUR:
|
|
||||||
ASSERT (AuthData->AuthConfig->CHAPType == ISCSI_CHAP_MUTUAL);
|
|
||||||
//
|
|
||||||
// The forth step, CHAP_N=<N> CHAP_R=<R> is received from Target.
|
|
||||||
//
|
|
||||||
Name = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_CHAP_NAME);
|
|
||||||
if (Name == NULL) {
|
|
||||||
goto ON_EXIT;
|
|
||||||
}
|
|
||||||
|
|
||||||
Response = IScsiGetValueByKeyFromList (
|
|
||||||
KeyValueList,
|
|
||||||
ISCSI_KEY_CHAP_RESPONSE
|
|
||||||
);
|
);
|
||||||
if (Response == NULL) {
|
|
||||||
goto ON_EXIT;
|
|
||||||
}
|
|
||||||
|
|
||||||
ASSERT (AuthData->Hash != NULL);
|
//
|
||||||
RspLen = AuthData->Hash->DigestSize;
|
// Transit to next step.
|
||||||
Status = IScsiHexToBin (TargetRsp, &RspLen, Response);
|
//
|
||||||
if (EFI_ERROR (Status) || RspLen != AuthData->Hash->DigestSize) {
|
Conn->AuthStep = ISCSI_CHAP_STEP_THREE;
|
||||||
Status = EFI_PROTOCOL_ERROR;
|
break;
|
||||||
goto ON_EXIT;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
case ISCSI_CHAP_STEP_THREE:
|
||||||
// Check the CHAP Name and Response replied by Target.
|
//
|
||||||
//
|
// One way CHAP authentication and the target would like to
|
||||||
Status = IScsiCHAPAuthTarget (AuthData, TargetRsp);
|
// authenticate us.
|
||||||
break;
|
//
|
||||||
|
Status = EFI_SUCCESS;
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
case ISCSI_CHAP_STEP_FOUR:
|
||||||
break;
|
ASSERT (AuthData->AuthConfig->CHAPType == ISCSI_CHAP_MUTUAL);
|
||||||
|
//
|
||||||
|
// The forth step, CHAP_N=<N> CHAP_R=<R> is received from Target.
|
||||||
|
//
|
||||||
|
Name = IScsiGetValueByKeyFromList (KeyValueList, ISCSI_KEY_CHAP_NAME);
|
||||||
|
if (Name == NULL) {
|
||||||
|
goto ON_EXIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
Response = IScsiGetValueByKeyFromList (
|
||||||
|
KeyValueList,
|
||||||
|
ISCSI_KEY_CHAP_RESPONSE
|
||||||
|
);
|
||||||
|
if (Response == NULL) {
|
||||||
|
goto ON_EXIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
ASSERT (AuthData->Hash != NULL);
|
||||||
|
RspLen = AuthData->Hash->DigestSize;
|
||||||
|
Status = IScsiHexToBin (TargetRsp, &RspLen, Response);
|
||||||
|
if (EFI_ERROR (Status) || (RspLen != AuthData->Hash->DigestSize)) {
|
||||||
|
Status = EFI_PROTOCOL_ERROR;
|
||||||
|
goto ON_EXIT;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Check the CHAP Name and Response replied by Target.
|
||||||
|
//
|
||||||
|
Status = IScsiCHAPAuthTarget (AuthData, TargetRsp);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
ON_EXIT:
|
ON_EXIT:
|
||||||
@ -446,7 +451,6 @@ ON_EXIT:
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This function fills the CHAP authentication information into the login PDU
|
This function fills the CHAP authentication information into the login PDU
|
||||||
during the security negotiation stage in the iSCSI connection login.
|
during the security negotiation stage in the iSCSI connection login.
|
||||||
@ -467,140 +471,142 @@ IScsiCHAPToSendReq (
|
|||||||
IN OUT NET_BUF *Pdu
|
IN OUT NET_BUF *Pdu
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
ISCSI_SESSION *Session;
|
ISCSI_SESSION *Session;
|
||||||
ISCSI_LOGIN_REQUEST *LoginReq;
|
ISCSI_LOGIN_REQUEST *LoginReq;
|
||||||
ISCSI_CHAP_AUTH_DATA *AuthData;
|
ISCSI_CHAP_AUTH_DATA *AuthData;
|
||||||
CHAR8 *Value;
|
CHAR8 *Value;
|
||||||
CHAR8 ValueStr[256];
|
CHAR8 ValueStr[256];
|
||||||
CHAR8 *Response;
|
CHAR8 *Response;
|
||||||
UINT32 RspLen;
|
UINT32 RspLen;
|
||||||
CHAR8 *Challenge;
|
CHAR8 *Challenge;
|
||||||
UINT32 ChallengeLen;
|
UINT32 ChallengeLen;
|
||||||
EFI_STATUS BinToHexStatus;
|
EFI_STATUS BinToHexStatus;
|
||||||
|
|
||||||
ASSERT (Conn->CurrentStage == ISCSI_SECURITY_NEGOTIATION);
|
ASSERT (Conn->CurrentStage == ISCSI_SECURITY_NEGOTIATION);
|
||||||
|
|
||||||
Session = Conn->Session;
|
Session = Conn->Session;
|
||||||
AuthData = &Session->AuthData.CHAP;
|
AuthData = &Session->AuthData.CHAP;
|
||||||
LoginReq = (ISCSI_LOGIN_REQUEST *) NetbufGetByte (Pdu, 0, 0);
|
LoginReq = (ISCSI_LOGIN_REQUEST *)NetbufGetByte (Pdu, 0, 0);
|
||||||
if (LoginReq == NULL) {
|
if (LoginReq == NULL) {
|
||||||
return EFI_PROTOCOL_ERROR;
|
return EFI_PROTOCOL_ERROR;
|
||||||
}
|
}
|
||||||
Status = EFI_SUCCESS;
|
|
||||||
|
|
||||||
RspLen = 2 * ISCSI_CHAP_MAX_DIGEST_SIZE + 3;
|
Status = EFI_SUCCESS;
|
||||||
Response = AllocateZeroPool (RspLen);
|
|
||||||
|
RspLen = 2 * ISCSI_CHAP_MAX_DIGEST_SIZE + 3;
|
||||||
|
Response = AllocateZeroPool (RspLen);
|
||||||
if (Response == NULL) {
|
if (Response == NULL) {
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
ChallengeLen = 2 * ISCSI_CHAP_MAX_DIGEST_SIZE + 3;
|
ChallengeLen = 2 * ISCSI_CHAP_MAX_DIGEST_SIZE + 3;
|
||||||
Challenge = AllocateZeroPool (ChallengeLen);
|
Challenge = AllocateZeroPool (ChallengeLen);
|
||||||
if (Challenge == NULL) {
|
if (Challenge == NULL) {
|
||||||
FreePool (Response);
|
FreePool (Response);
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (Conn->AuthStep) {
|
switch (Conn->AuthStep) {
|
||||||
case ISCSI_AUTH_INITIAL:
|
case ISCSI_AUTH_INITIAL:
|
||||||
//
|
|
||||||
// It's the initial Login Request. Fill in the key=value pairs mandatory
|
|
||||||
// for the initial Login Request.
|
|
||||||
//
|
|
||||||
IScsiAddKeyValuePair (
|
|
||||||
Pdu,
|
|
||||||
ISCSI_KEY_INITIATOR_NAME,
|
|
||||||
mPrivate->InitiatorName
|
|
||||||
);
|
|
||||||
IScsiAddKeyValuePair (Pdu, ISCSI_KEY_SESSION_TYPE, "Normal");
|
|
||||||
IScsiAddKeyValuePair (
|
|
||||||
Pdu,
|
|
||||||
ISCSI_KEY_TARGET_NAME,
|
|
||||||
Session->ConfigData->SessionConfigData.TargetName
|
|
||||||
);
|
|
||||||
|
|
||||||
if (Session->AuthType == ISCSI_AUTH_TYPE_NONE) {
|
|
||||||
Value = ISCSI_KEY_VALUE_NONE;
|
|
||||||
ISCSI_SET_FLAG (LoginReq, ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT);
|
|
||||||
} else {
|
|
||||||
Value = ISCSI_AUTH_METHOD_CHAP;
|
|
||||||
}
|
|
||||||
|
|
||||||
IScsiAddKeyValuePair (Pdu, ISCSI_KEY_AUTH_METHOD, Value);
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ISCSI_CHAP_STEP_ONE:
|
|
||||||
//
|
|
||||||
// First step, send the Login Request with CHAP_A=<A1,A2...> key-value
|
|
||||||
// pair.
|
|
||||||
//
|
|
||||||
IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_ALGORITHM, mChapHashListString);
|
|
||||||
|
|
||||||
Conn->AuthStep = ISCSI_CHAP_STEP_TWO;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case ISCSI_CHAP_STEP_THREE:
|
|
||||||
//
|
|
||||||
// Third step, send the Login Request with CHAP_N=<N> CHAP_R=<R> or
|
|
||||||
// CHAP_N=<N> CHAP_R=<R> CHAP_I=<I> CHAP_C=<C> if target authentication is
|
|
||||||
// required too.
|
|
||||||
//
|
|
||||||
// CHAP_N=<N>
|
|
||||||
//
|
|
||||||
IScsiAddKeyValuePair (
|
|
||||||
Pdu,
|
|
||||||
ISCSI_KEY_CHAP_NAME,
|
|
||||||
(CHAR8 *) &AuthData->AuthConfig->CHAPName
|
|
||||||
);
|
|
||||||
//
|
|
||||||
// CHAP_R=<R>
|
|
||||||
//
|
|
||||||
ASSERT (AuthData->Hash != NULL);
|
|
||||||
BinToHexStatus = IScsiBinToHex (
|
|
||||||
(UINT8 *) AuthData->CHAPResponse,
|
|
||||||
AuthData->Hash->DigestSize,
|
|
||||||
Response,
|
|
||||||
&RspLen
|
|
||||||
);
|
|
||||||
ASSERT_EFI_ERROR (BinToHexStatus);
|
|
||||||
IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_RESPONSE, Response);
|
|
||||||
|
|
||||||
if (AuthData->AuthConfig->CHAPType == ISCSI_CHAP_MUTUAL) {
|
|
||||||
//
|
//
|
||||||
// CHAP_I=<I>
|
// It's the initial Login Request. Fill in the key=value pairs mandatory
|
||||||
|
// for the initial Login Request.
|
||||||
//
|
//
|
||||||
IScsiGenRandom ((UINT8 *) &AuthData->OutIdentifier, 1);
|
IScsiAddKeyValuePair (
|
||||||
AsciiSPrint (ValueStr, sizeof (ValueStr), "%d", AuthData->OutIdentifier);
|
Pdu,
|
||||||
IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_IDENTIFIER, ValueStr);
|
ISCSI_KEY_INITIATOR_NAME,
|
||||||
//
|
mPrivate->InitiatorName
|
||||||
// CHAP_C=<C>
|
|
||||||
//
|
|
||||||
IScsiGenRandom (
|
|
||||||
(UINT8 *) AuthData->OutChallenge,
|
|
||||||
AuthData->Hash->DigestSize
|
|
||||||
);
|
);
|
||||||
|
IScsiAddKeyValuePair (Pdu, ISCSI_KEY_SESSION_TYPE, "Normal");
|
||||||
|
IScsiAddKeyValuePair (
|
||||||
|
Pdu,
|
||||||
|
ISCSI_KEY_TARGET_NAME,
|
||||||
|
Session->ConfigData->SessionConfigData.TargetName
|
||||||
|
);
|
||||||
|
|
||||||
|
if (Session->AuthType == ISCSI_AUTH_TYPE_NONE) {
|
||||||
|
Value = ISCSI_KEY_VALUE_NONE;
|
||||||
|
ISCSI_SET_FLAG (LoginReq, ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT);
|
||||||
|
} else {
|
||||||
|
Value = ISCSI_AUTH_METHOD_CHAP;
|
||||||
|
}
|
||||||
|
|
||||||
|
IScsiAddKeyValuePair (Pdu, ISCSI_KEY_AUTH_METHOD, Value);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ISCSI_CHAP_STEP_ONE:
|
||||||
|
//
|
||||||
|
// First step, send the Login Request with CHAP_A=<A1,A2...> key-value
|
||||||
|
// pair.
|
||||||
|
//
|
||||||
|
IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_ALGORITHM, mChapHashListString);
|
||||||
|
|
||||||
|
Conn->AuthStep = ISCSI_CHAP_STEP_TWO;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case ISCSI_CHAP_STEP_THREE:
|
||||||
|
//
|
||||||
|
// Third step, send the Login Request with CHAP_N=<N> CHAP_R=<R> or
|
||||||
|
// CHAP_N=<N> CHAP_R=<R> CHAP_I=<I> CHAP_C=<C> if target authentication is
|
||||||
|
// required too.
|
||||||
|
//
|
||||||
|
// CHAP_N=<N>
|
||||||
|
//
|
||||||
|
IScsiAddKeyValuePair (
|
||||||
|
Pdu,
|
||||||
|
ISCSI_KEY_CHAP_NAME,
|
||||||
|
(CHAR8 *)&AuthData->AuthConfig->CHAPName
|
||||||
|
);
|
||||||
|
//
|
||||||
|
// CHAP_R=<R>
|
||||||
|
//
|
||||||
|
ASSERT (AuthData->Hash != NULL);
|
||||||
BinToHexStatus = IScsiBinToHex (
|
BinToHexStatus = IScsiBinToHex (
|
||||||
(UINT8 *) AuthData->OutChallenge,
|
(UINT8 *)AuthData->CHAPResponse,
|
||||||
AuthData->Hash->DigestSize,
|
AuthData->Hash->DigestSize,
|
||||||
Challenge,
|
Response,
|
||||||
&ChallengeLen
|
&RspLen
|
||||||
);
|
);
|
||||||
ASSERT_EFI_ERROR (BinToHexStatus);
|
ASSERT_EFI_ERROR (BinToHexStatus);
|
||||||
IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_CHALLENGE, Challenge);
|
IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_RESPONSE, Response);
|
||||||
|
|
||||||
Conn->AuthStep = ISCSI_CHAP_STEP_FOUR;
|
if (AuthData->AuthConfig->CHAPType == ISCSI_CHAP_MUTUAL) {
|
||||||
}
|
//
|
||||||
//
|
// CHAP_I=<I>
|
||||||
// Set the stage transition flag.
|
//
|
||||||
//
|
IScsiGenRandom ((UINT8 *)&AuthData->OutIdentifier, 1);
|
||||||
ISCSI_SET_FLAG (LoginReq, ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT);
|
AsciiSPrint (ValueStr, sizeof (ValueStr), "%d", AuthData->OutIdentifier);
|
||||||
break;
|
IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_IDENTIFIER, ValueStr);
|
||||||
|
//
|
||||||
|
// CHAP_C=<C>
|
||||||
|
//
|
||||||
|
IScsiGenRandom (
|
||||||
|
(UINT8 *)AuthData->OutChallenge,
|
||||||
|
AuthData->Hash->DigestSize
|
||||||
|
);
|
||||||
|
BinToHexStatus = IScsiBinToHex (
|
||||||
|
(UINT8 *)AuthData->OutChallenge,
|
||||||
|
AuthData->Hash->DigestSize,
|
||||||
|
Challenge,
|
||||||
|
&ChallengeLen
|
||||||
|
);
|
||||||
|
ASSERT_EFI_ERROR (BinToHexStatus);
|
||||||
|
IScsiAddKeyValuePair (Pdu, ISCSI_KEY_CHAP_CHALLENGE, Challenge);
|
||||||
|
|
||||||
default:
|
Conn->AuthStep = ISCSI_CHAP_STEP_FOUR;
|
||||||
Status = EFI_PROTOCOL_ERROR;
|
}
|
||||||
break;
|
|
||||||
|
//
|
||||||
|
// Set the stage transition flag.
|
||||||
|
//
|
||||||
|
ISCSI_SET_FLAG (LoginReq, ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT);
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
Status = EFI_PROTOCOL_ERROR;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
FreePool (Response);
|
FreePool (Response);
|
||||||
@ -621,14 +627,14 @@ IScsiCHAPInitHashList (
|
|||||||
VOID
|
VOID
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
CHAR8 *Position;
|
CHAR8 *Position;
|
||||||
UINTN Left;
|
UINTN Left;
|
||||||
UINTN HashIndex;
|
UINTN HashIndex;
|
||||||
CONST CHAP_HASH *Hash;
|
CONST CHAP_HASH *Hash;
|
||||||
UINTN Printed;
|
UINTN Printed;
|
||||||
|
|
||||||
Position = mChapHashListString;
|
Position = mChapHashListString;
|
||||||
Left = sizeof (mChapHashListString);
|
Left = sizeof (mChapHashListString);
|
||||||
for (HashIndex = 0; HashIndex < ARRAY_SIZE (mChapHash); HashIndex++) {
|
for (HashIndex = 0; HashIndex < ARRAY_SIZE (mChapHash); HashIndex++) {
|
||||||
Hash = &mChapHash[HashIndex];
|
Hash = &mChapHash[HashIndex];
|
||||||
|
|
||||||
@ -657,7 +663,7 @@ IScsiCHAPInitHashList (
|
|||||||
ASSERT (Printed + 1 < Left);
|
ASSERT (Printed + 1 < Left);
|
||||||
|
|
||||||
Position += Printed;
|
Position += Printed;
|
||||||
Left -= Printed;
|
Left -= Printed;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Sanity-check the digest size for Hash.
|
// Sanity-check the digest size for Hash.
|
||||||
|
@ -9,41 +9,40 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#ifndef _ISCSI_CHAP_H_
|
#ifndef _ISCSI_CHAP_H_
|
||||||
#define _ISCSI_CHAP_H_
|
#define _ISCSI_CHAP_H_
|
||||||
|
|
||||||
#define ISCSI_AUTH_METHOD_CHAP "CHAP"
|
#define ISCSI_AUTH_METHOD_CHAP "CHAP"
|
||||||
|
|
||||||
#define ISCSI_KEY_CHAP_ALGORITHM "CHAP_A"
|
#define ISCSI_KEY_CHAP_ALGORITHM "CHAP_A"
|
||||||
#define ISCSI_KEY_CHAP_IDENTIFIER "CHAP_I"
|
#define ISCSI_KEY_CHAP_IDENTIFIER "CHAP_I"
|
||||||
#define ISCSI_KEY_CHAP_CHALLENGE "CHAP_C"
|
#define ISCSI_KEY_CHAP_CHALLENGE "CHAP_C"
|
||||||
#define ISCSI_KEY_CHAP_NAME "CHAP_N"
|
#define ISCSI_KEY_CHAP_NAME "CHAP_N"
|
||||||
#define ISCSI_KEY_CHAP_RESPONSE "CHAP_R"
|
#define ISCSI_KEY_CHAP_RESPONSE "CHAP_R"
|
||||||
|
|
||||||
//
|
//
|
||||||
// Identifiers of supported CHAP hash algorithms:
|
// Identifiers of supported CHAP hash algorithms:
|
||||||
// https://www.iana.org/assignments/ppp-numbers/ppp-numbers.xhtml#ppp-numbers-9
|
// https://www.iana.org/assignments/ppp-numbers/ppp-numbers.xhtml#ppp-numbers-9
|
||||||
//
|
//
|
||||||
#define ISCSI_CHAP_ALGORITHM_MD5 5
|
#define ISCSI_CHAP_ALGORITHM_MD5 5
|
||||||
#define ISCSI_CHAP_ALGORITHM_SHA256 7
|
#define ISCSI_CHAP_ALGORITHM_SHA256 7
|
||||||
|
|
||||||
//
|
//
|
||||||
// Byte count of the largest digest over the above-listed
|
// Byte count of the largest digest over the above-listed
|
||||||
// ISCSI_CHAP_ALGORITHM_* hash algorithms.
|
// ISCSI_CHAP_ALGORITHM_* hash algorithms.
|
||||||
//
|
//
|
||||||
#define ISCSI_CHAP_MAX_DIGEST_SIZE SHA256_DIGEST_SIZE
|
#define ISCSI_CHAP_MAX_DIGEST_SIZE SHA256_DIGEST_SIZE
|
||||||
|
|
||||||
#define ISCSI_CHAP_STEP_ONE 1
|
|
||||||
#define ISCSI_CHAP_STEP_TWO 2
|
|
||||||
#define ISCSI_CHAP_STEP_THREE 3
|
|
||||||
#define ISCSI_CHAP_STEP_FOUR 4
|
|
||||||
|
|
||||||
|
#define ISCSI_CHAP_STEP_ONE 1
|
||||||
|
#define ISCSI_CHAP_STEP_TWO 2
|
||||||
|
#define ISCSI_CHAP_STEP_THREE 3
|
||||||
|
#define ISCSI_CHAP_STEP_FOUR 4
|
||||||
|
|
||||||
#pragma pack(1)
|
#pragma pack(1)
|
||||||
|
|
||||||
typedef struct _ISCSI_CHAP_AUTH_CONFIG_NVDATA {
|
typedef struct _ISCSI_CHAP_AUTH_CONFIG_NVDATA {
|
||||||
UINT8 CHAPType;
|
UINT8 CHAPType;
|
||||||
CHAR8 CHAPName[ISCSI_CHAP_NAME_STORAGE];
|
CHAR8 CHAPName[ISCSI_CHAP_NAME_STORAGE];
|
||||||
CHAR8 CHAPSecret[ISCSI_CHAP_SECRET_STORAGE];
|
CHAR8 CHAPSecret[ISCSI_CHAP_SECRET_STORAGE];
|
||||||
CHAR8 ReverseCHAPName[ISCSI_CHAP_NAME_STORAGE];
|
CHAR8 ReverseCHAPName[ISCSI_CHAP_NAME_STORAGE];
|
||||||
CHAR8 ReverseCHAPSecret[ISCSI_CHAP_SECRET_STORAGE];
|
CHAR8 ReverseCHAPSecret[ISCSI_CHAP_SECRET_STORAGE];
|
||||||
} ISCSI_CHAP_AUTH_CONFIG_NVDATA;
|
} ISCSI_CHAP_AUTH_CONFIG_NVDATA;
|
||||||
|
|
||||||
#pragma pack()
|
#pragma pack()
|
||||||
@ -53,19 +52,19 @@ typedef struct _ISCSI_CHAP_AUTH_CONFIG_NVDATA {
|
|||||||
//
|
//
|
||||||
typedef
|
typedef
|
||||||
UINTN
|
UINTN
|
||||||
(EFIAPI *CHAP_HASH_GET_CONTEXT_SIZE) (
|
(EFIAPI *CHAP_HASH_GET_CONTEXT_SIZE)(
|
||||||
VOID
|
VOID
|
||||||
);
|
);
|
||||||
|
|
||||||
typedef
|
typedef
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
(EFIAPI *CHAP_HASH_INIT) (
|
(EFIAPI *CHAP_HASH_INIT)(
|
||||||
OUT VOID *Context
|
OUT VOID *Context
|
||||||
);
|
);
|
||||||
|
|
||||||
typedef
|
typedef
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
(EFIAPI *CHAP_HASH_UPDATE) (
|
(EFIAPI *CHAP_HASH_UPDATE)(
|
||||||
IN OUT VOID *Context,
|
IN OUT VOID *Context,
|
||||||
IN CONST VOID *Data,
|
IN CONST VOID *Data,
|
||||||
IN UINTN DataSize
|
IN UINTN DataSize
|
||||||
@ -73,37 +72,37 @@ BOOLEAN
|
|||||||
|
|
||||||
typedef
|
typedef
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
(EFIAPI *CHAP_HASH_FINAL) (
|
(EFIAPI *CHAP_HASH_FINAL)(
|
||||||
IN OUT VOID *Context,
|
IN OUT VOID *Context,
|
||||||
OUT UINT8 *HashValue
|
OUT UINT8 *HashValue
|
||||||
);
|
);
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINT8 Algorithm; // ISCSI_CHAP_ALGORITHM_*, CHAP_A
|
UINT8 Algorithm; // ISCSI_CHAP_ALGORITHM_*, CHAP_A
|
||||||
UINT32 DigestSize;
|
UINT32 DigestSize;
|
||||||
CHAP_HASH_GET_CONTEXT_SIZE GetContextSize;
|
CHAP_HASH_GET_CONTEXT_SIZE GetContextSize;
|
||||||
CHAP_HASH_INIT Init;
|
CHAP_HASH_INIT Init;
|
||||||
CHAP_HASH_UPDATE Update;
|
CHAP_HASH_UPDATE Update;
|
||||||
CHAP_HASH_FINAL Final;
|
CHAP_HASH_FINAL Final;
|
||||||
} CHAP_HASH;
|
} CHAP_HASH;
|
||||||
|
|
||||||
///
|
///
|
||||||
/// ISCSI CHAP Authentication Data
|
/// ISCSI CHAP Authentication Data
|
||||||
///
|
///
|
||||||
typedef struct _ISCSI_CHAP_AUTH_DATA {
|
typedef struct _ISCSI_CHAP_AUTH_DATA {
|
||||||
ISCSI_CHAP_AUTH_CONFIG_NVDATA *AuthConfig;
|
ISCSI_CHAP_AUTH_CONFIG_NVDATA *AuthConfig;
|
||||||
UINT32 InIdentifier;
|
UINT32 InIdentifier;
|
||||||
UINT8 InChallenge[1024];
|
UINT8 InChallenge[1024];
|
||||||
UINT32 InChallengeLength;
|
UINT32 InChallengeLength;
|
||||||
//
|
//
|
||||||
// The hash algorithm (CHAP_A) that the target selects in
|
// The hash algorithm (CHAP_A) that the target selects in
|
||||||
// ISCSI_CHAP_STEP_TWO.
|
// ISCSI_CHAP_STEP_TWO.
|
||||||
//
|
//
|
||||||
CONST CHAP_HASH *Hash;
|
CONST CHAP_HASH *Hash;
|
||||||
//
|
//
|
||||||
// Calculated CHAP Response (CHAP_R) value.
|
// Calculated CHAP Response (CHAP_R) value.
|
||||||
//
|
//
|
||||||
UINT8 CHAPResponse[ISCSI_CHAP_MAX_DIGEST_SIZE];
|
UINT8 CHAPResponse[ISCSI_CHAP_MAX_DIGEST_SIZE];
|
||||||
|
|
||||||
//
|
//
|
||||||
// Auth-data to be sent out for mutual authentication.
|
// Auth-data to be sent out for mutual authentication.
|
||||||
@ -113,8 +112,8 @@ typedef struct _ISCSI_CHAP_AUTH_DATA {
|
|||||||
// digest size. In other words, it's good practice to feed *at least as many
|
// digest size. In other words, it's good practice to feed *at least as many
|
||||||
// bytes* to the hashing algorithm as the hashing algorithm will output.
|
// bytes* to the hashing algorithm as the hashing algorithm will output.
|
||||||
//
|
//
|
||||||
UINT32 OutIdentifier;
|
UINT32 OutIdentifier;
|
||||||
UINT8 OutChallenge[ISCSI_CHAP_MAX_DIGEST_SIZE];
|
UINT8 OutChallenge[ISCSI_CHAP_MAX_DIGEST_SIZE];
|
||||||
} ISCSI_CHAP_AUTH_DATA;
|
} ISCSI_CHAP_AUTH_DATA;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -133,6 +132,7 @@ EFI_STATUS
|
|||||||
IScsiCHAPOnRspReceived (
|
IScsiCHAPOnRspReceived (
|
||||||
IN ISCSI_CONNECTION *Conn
|
IN ISCSI_CONNECTION *Conn
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This function fills the CHAP authentication information into the login PDU
|
This function fills the CHAP authentication information into the login PDU
|
||||||
during the security negotiation stage in the iSCSI connection login.
|
during the security negotiation stage in the iSCSI connection login.
|
||||||
@ -164,4 +164,5 @@ VOID
|
|||||||
IScsiCHAPInitHashList (
|
IScsiCHAPInitHashList (
|
||||||
VOID
|
VOID
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -14,10 +14,9 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
|
|
||||||
typedef struct _ISCSI_FORM_CALLBACK_INFO ISCSI_FORM_CALLBACK_INFO;
|
typedef struct _ISCSI_FORM_CALLBACK_INFO ISCSI_FORM_CALLBACK_INFO;
|
||||||
|
|
||||||
extern UINT8 IScsiConfigVfrBin[];
|
extern UINT8 IScsiConfigVfrBin[];
|
||||||
extern UINT8 IScsiDxeStrings[];
|
extern UINT8 IScsiDxeStrings[];
|
||||||
extern ISCSI_FORM_CALLBACK_INFO *mCallbackInfo;
|
extern ISCSI_FORM_CALLBACK_INFO *mCallbackInfo;
|
||||||
|
|
||||||
|
|
||||||
#define VAR_OFFSET(Field) \
|
#define VAR_OFFSET(Field) \
|
||||||
((UINT16) ((UINTN) &(((ISCSI_CONFIG_IFR_NVDATA *) 0)->Field)))
|
((UINT16) ((UINTN) &(((ISCSI_CONFIG_IFR_NVDATA *) 0)->Field)))
|
||||||
@ -25,65 +24,64 @@ extern ISCSI_FORM_CALLBACK_INFO *mCallbackInfo;
|
|||||||
#define QUESTION_ID(Field) \
|
#define QUESTION_ID(Field) \
|
||||||
((UINT16) (VAR_OFFSET (Field) + CONFIG_OPTION_OFFSET))
|
((UINT16) (VAR_OFFSET (Field) + CONFIG_OPTION_OFFSET))
|
||||||
|
|
||||||
#define DYNAMIC_ONE_OF_VAR_OFFSET VAR_OFFSET (Enabled)
|
#define DYNAMIC_ONE_OF_VAR_OFFSET VAR_OFFSET (Enabled)
|
||||||
#define DYNAMIC_ORDERED_LIST_QUESTION_ID QUESTION_ID (DynamicOrderedList)
|
#define DYNAMIC_ORDERED_LIST_QUESTION_ID QUESTION_ID (DynamicOrderedList)
|
||||||
#define DYNAMIC_ORDERED_LIST_VAR_OFFSET VAR_OFFSET (DynamicOrderedList)
|
#define DYNAMIC_ORDERED_LIST_VAR_OFFSET VAR_OFFSET (DynamicOrderedList)
|
||||||
#define ATTEMPT_DEL_QUESTION_ID QUESTION_ID (DeleteAttemptList)
|
#define ATTEMPT_DEL_QUESTION_ID QUESTION_ID (DeleteAttemptList)
|
||||||
#define ATTEMPT_DEL_VAR_OFFSET VAR_OFFSET (DeleteAttemptList)
|
#define ATTEMPT_DEL_VAR_OFFSET VAR_OFFSET (DeleteAttemptList)
|
||||||
#define ATTEMPT_ADD_QUESTION_ID QUESTION_ID (AddAttemptList)
|
#define ATTEMPT_ADD_QUESTION_ID QUESTION_ID (AddAttemptList)
|
||||||
#define ATTEMPT_ADD_VAR_OFFSET VAR_OFFSET (AddAttemptList)
|
#define ATTEMPT_ADD_VAR_OFFSET VAR_OFFSET (AddAttemptList)
|
||||||
|
|
||||||
//
|
//
|
||||||
// Define QuestionId and OffSet for Keywords.
|
// Define QuestionId and OffSet for Keywords.
|
||||||
//
|
//
|
||||||
#define ATTEMPT_MAC_ADDR_VAR_OFFSET VAR_OFFSET (ISCSIMacAddr)
|
#define ATTEMPT_MAC_ADDR_VAR_OFFSET VAR_OFFSET (ISCSIMacAddr)
|
||||||
#define ATTEMPT_ATTEMPT_NAME_QUESTION_ID QUESTION_ID (ISCSIAttemptName)
|
#define ATTEMPT_ATTEMPT_NAME_QUESTION_ID QUESTION_ID (ISCSIAttemptName)
|
||||||
#define ATTEMPT_ATTEMPT_NAME_VAR_OFFSET VAR_OFFSET (ISCSIAttemptName)
|
#define ATTEMPT_ATTEMPT_NAME_VAR_OFFSET VAR_OFFSET (ISCSIAttemptName)
|
||||||
#define ATTEMPT_BOOTENABLE_QUESTION_ID QUESTION_ID (ISCSIBootEnableList)
|
#define ATTEMPT_BOOTENABLE_QUESTION_ID QUESTION_ID (ISCSIBootEnableList)
|
||||||
#define ATTEMPT_BOOTENABLE_VAR_OFFSET VAR_OFFSET (ISCSIBootEnableList)
|
#define ATTEMPT_BOOTENABLE_VAR_OFFSET VAR_OFFSET (ISCSIBootEnableList)
|
||||||
#define ATTEMPT_ADDRESS_TYPE_QUESTION_ID QUESTION_ID (ISCSIIpAddressTypeList)
|
#define ATTEMPT_ADDRESS_TYPE_QUESTION_ID QUESTION_ID (ISCSIIpAddressTypeList)
|
||||||
#define ATTEMPT_ADDRESS_TYPE_VAR_OFFSET VAR_OFFSET (ISCSIIpAddressTypeList)
|
#define ATTEMPT_ADDRESS_TYPE_VAR_OFFSET VAR_OFFSET (ISCSIIpAddressTypeList)
|
||||||
#define ATTEMPT_CONNECT_RETRY_QUESTION_ID QUESTION_ID (ISCSIConnectRetry)
|
#define ATTEMPT_CONNECT_RETRY_QUESTION_ID QUESTION_ID (ISCSIConnectRetry)
|
||||||
#define ATTEMPT_CONNECT_RETRY_VAR_OFFSET VAR_OFFSET (ISCSIConnectRetry)
|
#define ATTEMPT_CONNECT_RETRY_VAR_OFFSET VAR_OFFSET (ISCSIConnectRetry)
|
||||||
#define ATTEMPT_CONNECT_TIMEOUT_QUESTION_ID QUESTION_ID (ISCSIConnectTimeout)
|
#define ATTEMPT_CONNECT_TIMEOUT_QUESTION_ID QUESTION_ID (ISCSIConnectTimeout)
|
||||||
#define ATTEMPT_CONNECT_TIMEOUT_VAR_OFFSET VAR_OFFSET (ISCSIConnectTimeout)
|
#define ATTEMPT_CONNECT_TIMEOUT_VAR_OFFSET VAR_OFFSET (ISCSIConnectTimeout)
|
||||||
#define ATTEMPT_ISID_QUESTION_ID QUESTION_ID (Keyword->ISCSIIsId)
|
#define ATTEMPT_ISID_QUESTION_ID QUESTION_ID (Keyword->ISCSIIsId)
|
||||||
#define ATTEMPT_ISID_VAR_OFFSET VAR_OFFSET (Keyword->ISCSIIsId)
|
#define ATTEMPT_ISID_VAR_OFFSET VAR_OFFSET (Keyword->ISCSIIsId)
|
||||||
#define ATTEMPT_INITIATOR_VIA_DHCP_QUESTION_ID QUESTION_ID (ISCSIInitiatorInfoViaDHCP)
|
#define ATTEMPT_INITIATOR_VIA_DHCP_QUESTION_ID QUESTION_ID (ISCSIInitiatorInfoViaDHCP)
|
||||||
#define ATTEMPT_INITIATOR_VIA_DHCP_VAR_OFFSET VAR_OFFSET (ISCSIInitiatorInfoViaDHCP)
|
#define ATTEMPT_INITIATOR_VIA_DHCP_VAR_OFFSET VAR_OFFSET (ISCSIInitiatorInfoViaDHCP)
|
||||||
#define ATTEMPT_INITIATOR_IP_ADDRESS_QUESTION_ID QUESTION_ID (Keyword->ISCSIInitiatorIpAddress)
|
#define ATTEMPT_INITIATOR_IP_ADDRESS_QUESTION_ID QUESTION_ID (Keyword->ISCSIInitiatorIpAddress)
|
||||||
#define ATTEMPT_INITIATOR_IP_ADDRESS_VAR_OFFSET VAR_OFFSET (Keyword->ISCSIInitiatorIpAddress)
|
#define ATTEMPT_INITIATOR_IP_ADDRESS_VAR_OFFSET VAR_OFFSET (Keyword->ISCSIInitiatorIpAddress)
|
||||||
#define ATTEMPT_INITIATOR_NET_MASK_QUESTION_ID QUESTION_ID (Keyword->ISCSIInitiatorNetmask)
|
#define ATTEMPT_INITIATOR_NET_MASK_QUESTION_ID QUESTION_ID (Keyword->ISCSIInitiatorNetmask)
|
||||||
#define ATTEMPT_INITIATOR_NET_MASK_VAR_OFFSET VAR_OFFSET (Keyword->ISCSIInitiatorNetmask)
|
#define ATTEMPT_INITIATOR_NET_MASK_VAR_OFFSET VAR_OFFSET (Keyword->ISCSIInitiatorNetmask)
|
||||||
#define ATTEMPT_INITIATOR_GATE_WAY_QUESTION_ID QUESTION_ID (Keyword->ISCSIInitiatorGateway)
|
#define ATTEMPT_INITIATOR_GATE_WAY_QUESTION_ID QUESTION_ID (Keyword->ISCSIInitiatorGateway)
|
||||||
#define ATTEMPT_INITIATOR_GATE_WAY_VAR_OFFSET VAR_OFFSET (Keyword->ISCSIInitiatorGateway)
|
#define ATTEMPT_INITIATOR_GATE_WAY_VAR_OFFSET VAR_OFFSET (Keyword->ISCSIInitiatorGateway)
|
||||||
#define ATTEMPT_TARGET_VIA_DHCP_QUESTION_ID QUESTION_ID (ISCSITargetInfoViaDHCP)
|
#define ATTEMPT_TARGET_VIA_DHCP_QUESTION_ID QUESTION_ID (ISCSITargetInfoViaDHCP)
|
||||||
#define ATTEMPT_TARGET_VIA_DHCP_VAR_OFFSET VAR_OFFSET (ISCSITargetInfoViaDHCP)
|
#define ATTEMPT_TARGET_VIA_DHCP_VAR_OFFSET VAR_OFFSET (ISCSITargetInfoViaDHCP)
|
||||||
#define ATTEMPT_TARGET_NAME_QUESTION_ID QUESTION_ID (Keyword->ISCSITargetName)
|
#define ATTEMPT_TARGET_NAME_QUESTION_ID QUESTION_ID (Keyword->ISCSITargetName)
|
||||||
#define ATTEMPT_TARGET_NAME_VAR_OFFSET VAR_OFFSET (Keyword->ISCSITargetName)
|
#define ATTEMPT_TARGET_NAME_VAR_OFFSET VAR_OFFSET (Keyword->ISCSITargetName)
|
||||||
#define ATTEMPT_TARGET_IP_ADDRESS_QUESTION_ID QUESTION_ID (Keyword->ISCSITargetIpAddress)
|
#define ATTEMPT_TARGET_IP_ADDRESS_QUESTION_ID QUESTION_ID (Keyword->ISCSITargetIpAddress)
|
||||||
#define ATTEMPT_TARGET_IP_ADDRESS_VAR_OFFSET VAR_OFFSET (Keyword->ISCSITargetIpAddress)
|
#define ATTEMPT_TARGET_IP_ADDRESS_VAR_OFFSET VAR_OFFSET (Keyword->ISCSITargetIpAddress)
|
||||||
#define ATTEMPT_TARGET_TCP_PORT_QUESTION_ID QUESTION_ID (ISCSITargetTcpPort)
|
#define ATTEMPT_TARGET_TCP_PORT_QUESTION_ID QUESTION_ID (ISCSITargetTcpPort)
|
||||||
#define ATTEMPT_TARGET_TCP_PORT_VAR_OFFSET VAR_OFFSET (ISCSITargetTcpPort)
|
#define ATTEMPT_TARGET_TCP_PORT_VAR_OFFSET VAR_OFFSET (ISCSITargetTcpPort)
|
||||||
#define ATTEMPT_LUN_QUESTION_ID QUESTION_ID (Keyword->ISCSILun)
|
#define ATTEMPT_LUN_QUESTION_ID QUESTION_ID (Keyword->ISCSILun)
|
||||||
#define ATTEMPT_LUN_VAR_OFFSET VAR_OFFSET (Keyword->ISCSILun)
|
#define ATTEMPT_LUN_VAR_OFFSET VAR_OFFSET (Keyword->ISCSILun)
|
||||||
#define ATTEMPT_AUTHENTICATION_METHOD_QUESTION_ID QUESTION_ID (ISCSIAuthenticationMethod)
|
#define ATTEMPT_AUTHENTICATION_METHOD_QUESTION_ID QUESTION_ID (ISCSIAuthenticationMethod)
|
||||||
#define ATTEMPT_AUTHENTICATION_METHOD_VAR_OFFSET VAR_OFFSET (ISCSIAuthenticationMethod)
|
#define ATTEMPT_AUTHENTICATION_METHOD_VAR_OFFSET VAR_OFFSET (ISCSIAuthenticationMethod)
|
||||||
#define ATTEMPT_CHARTYPE_QUESTION_ID QUESTION_ID (ISCSIChapType)
|
#define ATTEMPT_CHARTYPE_QUESTION_ID QUESTION_ID (ISCSIChapType)
|
||||||
#define ATTEMPT_CHARTYPE_VAR_OFFSET VAR_OFFSET (ISCSIChapType)
|
#define ATTEMPT_CHARTYPE_VAR_OFFSET VAR_OFFSET (ISCSIChapType)
|
||||||
#define ATTEMPT_CHAR_USER_NAME_QUESTION_ID QUESTION_ID (Keyword->ISCSIChapUsername)
|
#define ATTEMPT_CHAR_USER_NAME_QUESTION_ID QUESTION_ID (Keyword->ISCSIChapUsername)
|
||||||
#define ATTEMPT_CHAR_USER_NAME_VAR_OFFSET VAR_OFFSET (Keyword->ISCSIChapUsername)
|
#define ATTEMPT_CHAR_USER_NAME_VAR_OFFSET VAR_OFFSET (Keyword->ISCSIChapUsername)
|
||||||
#define ATTEMPT_CHAR_SECRET_QUESTION_ID QUESTION_ID (Keyword->ISCSIChapSecret)
|
#define ATTEMPT_CHAR_SECRET_QUESTION_ID QUESTION_ID (Keyword->ISCSIChapSecret)
|
||||||
#define ATTEMPT_CHAR_SECRET_VAR_OFFSET VAR_OFFSET (Keyword->ISCSIChapSecret)
|
#define ATTEMPT_CHAR_SECRET_VAR_OFFSET VAR_OFFSET (Keyword->ISCSIChapSecret)
|
||||||
#define ATTEMPT_CHAR_REVERSE_USER_NAME_QUESTION_ID QUESTION_ID (Keyword->ISCSIReverseChapUsername)
|
#define ATTEMPT_CHAR_REVERSE_USER_NAME_QUESTION_ID QUESTION_ID (Keyword->ISCSIReverseChapUsername)
|
||||||
#define ATTEMPT_CHAR_REVERSE_USER_NAME_VAR_OFFSET VAR_OFFSET (Keyword->ISCSIReverseChapUsername)
|
#define ATTEMPT_CHAR_REVERSE_USER_NAME_VAR_OFFSET VAR_OFFSET (Keyword->ISCSIReverseChapUsername)
|
||||||
#define ATTEMPT_CHAR_REVERSE_SECRET_QUESTION_ID QUESTION_ID (Keyword->ISCSIReverseChapSecret)
|
#define ATTEMPT_CHAR_REVERSE_SECRET_QUESTION_ID QUESTION_ID (Keyword->ISCSIReverseChapSecret)
|
||||||
#define ATTEMPT_CHAR_REVERSE_SECRET_VAR_OFFSET VAR_OFFSET (Keyword->ISCSIReverseChapSecret)
|
#define ATTEMPT_CHAR_REVERSE_SECRET_VAR_OFFSET VAR_OFFSET (Keyword->ISCSIReverseChapSecret)
|
||||||
|
|
||||||
|
#define ISCSI_INITATOR_NAME_VAR_NAME L"I_NAME"
|
||||||
|
|
||||||
#define ISCSI_INITATOR_NAME_VAR_NAME L"I_NAME"
|
#define ISCSI_CONFIG_VAR_ATTR (EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE)
|
||||||
|
|
||||||
#define ISCSI_CONFIG_VAR_ATTR (EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE)
|
|
||||||
|
|
||||||
#define ISCSI_FORM_CALLBACK_INFO_SIGNATURE SIGNATURE_32 ('I', 'f', 'c', 'i')
|
#define ISCSI_FORM_CALLBACK_INFO_SIGNATURE SIGNATURE_32 ('I', 'f', 'c', 'i')
|
||||||
|
|
||||||
@ -97,47 +95,47 @@ extern ISCSI_FORM_CALLBACK_INFO *mCallbackInfo;
|
|||||||
|
|
||||||
#pragma pack(1)
|
#pragma pack(1)
|
||||||
struct _ISCSI_ATTEMPT_CONFIG_NVDATA {
|
struct _ISCSI_ATTEMPT_CONFIG_NVDATA {
|
||||||
LIST_ENTRY Link;
|
LIST_ENTRY Link;
|
||||||
UINT8 NicIndex;
|
UINT8 NicIndex;
|
||||||
UINT8 AttemptConfigIndex;
|
UINT8 AttemptConfigIndex;
|
||||||
BOOLEAN DhcpSuccess;
|
BOOLEAN DhcpSuccess;
|
||||||
BOOLEAN ValidiBFTPath;
|
BOOLEAN ValidiBFTPath;
|
||||||
BOOLEAN ValidPath;
|
BOOLEAN ValidPath;
|
||||||
UINT8 AutoConfigureMode;
|
UINT8 AutoConfigureMode;
|
||||||
EFI_STRING_ID AttemptTitleToken;
|
EFI_STRING_ID AttemptTitleToken;
|
||||||
EFI_STRING_ID AttemptTitleHelpToken;
|
EFI_STRING_ID AttemptTitleHelpToken;
|
||||||
CHAR8 AttemptName[ATTEMPT_NAME_SIZE];
|
CHAR8 AttemptName[ATTEMPT_NAME_SIZE];
|
||||||
CHAR8 MacString[ISCSI_MAX_MAC_STRING_LEN];
|
CHAR8 MacString[ISCSI_MAX_MAC_STRING_LEN];
|
||||||
EFI_IP_ADDRESS PrimaryDns;
|
EFI_IP_ADDRESS PrimaryDns;
|
||||||
EFI_IP_ADDRESS SecondaryDns;
|
EFI_IP_ADDRESS SecondaryDns;
|
||||||
EFI_IP_ADDRESS DhcpServer;
|
EFI_IP_ADDRESS DhcpServer;
|
||||||
ISCSI_SESSION_CONFIG_NVDATA SessionConfigData;
|
ISCSI_SESSION_CONFIG_NVDATA SessionConfigData;
|
||||||
UINT8 AuthenticationType;
|
UINT8 AuthenticationType;
|
||||||
union {
|
union {
|
||||||
ISCSI_CHAP_AUTH_CONFIG_NVDATA CHAP;
|
ISCSI_CHAP_AUTH_CONFIG_NVDATA CHAP;
|
||||||
} AuthConfigData;
|
} AuthConfigData;
|
||||||
BOOLEAN AutoConfigureSuccess;
|
BOOLEAN AutoConfigureSuccess;
|
||||||
UINT8 Actived;
|
UINT8 Actived;
|
||||||
};
|
};
|
||||||
|
|
||||||
///
|
///
|
||||||
/// HII specific Vendor Device Path definition.
|
/// HII specific Vendor Device Path definition.
|
||||||
///
|
///
|
||||||
typedef struct {
|
typedef struct {
|
||||||
VENDOR_DEVICE_PATH VendorDevicePath;
|
VENDOR_DEVICE_PATH VendorDevicePath;
|
||||||
EFI_DEVICE_PATH_PROTOCOL End;
|
EFI_DEVICE_PATH_PROTOCOL End;
|
||||||
} HII_VENDOR_DEVICE_PATH;
|
} HII_VENDOR_DEVICE_PATH;
|
||||||
|
|
||||||
#pragma pack()
|
#pragma pack()
|
||||||
|
|
||||||
struct _ISCSI_FORM_CALLBACK_INFO {
|
struct _ISCSI_FORM_CALLBACK_INFO {
|
||||||
UINT32 Signature;
|
UINT32 Signature;
|
||||||
EFI_HANDLE DriverHandle;
|
EFI_HANDLE DriverHandle;
|
||||||
EFI_HII_CONFIG_ACCESS_PROTOCOL ConfigAccess;
|
EFI_HII_CONFIG_ACCESS_PROTOCOL ConfigAccess;
|
||||||
UINT16 *KeyList;
|
UINT16 *KeyList;
|
||||||
VOID *FormBuffer;
|
VOID *FormBuffer;
|
||||||
EFI_HII_HANDLE RegisteredHandle;
|
EFI_HII_HANDLE RegisteredHandle;
|
||||||
ISCSI_ATTEMPT_CONFIG_NVDATA *Current;
|
ISCSI_ATTEMPT_CONFIG_NVDATA *Current;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -158,11 +156,11 @@ struct _ISCSI_FORM_CALLBACK_INFO {
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
IScsiCreateOpCode (
|
IScsiCreateOpCode (
|
||||||
IN UINT16 StartLabelNumber,
|
IN UINT16 StartLabelNumber,
|
||||||
OUT VOID **StartOpCodeHandle,
|
OUT VOID **StartOpCodeHandle,
|
||||||
OUT EFI_IFR_GUID_LABEL **StartLabel,
|
OUT EFI_IFR_GUID_LABEL **StartLabel,
|
||||||
OUT VOID **EndOpCodeHandle,
|
OUT VOID **EndOpCodeHandle,
|
||||||
OUT EFI_IFR_GUID_LABEL **EndLabel
|
OUT EFI_IFR_GUID_LABEL **EndLabel
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -215,7 +213,7 @@ IScsiConfigUpdateAttempt (
|
|||||||
**/
|
**/
|
||||||
ISCSI_ATTEMPT_CONFIG_NVDATA *
|
ISCSI_ATTEMPT_CONFIG_NVDATA *
|
||||||
IScsiConfigGetAttemptByConfigIndex (
|
IScsiConfigGetAttemptByConfigIndex (
|
||||||
IN UINT8 AttemptConfigIndex
|
IN UINT8 AttemptConfigIndex
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -11,139 +11,139 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
|
|
||||||
#include <Guid/IScsiConfigHii.h>
|
#include <Guid/IScsiConfigHii.h>
|
||||||
|
|
||||||
#define VAR_EQ_TEST_NAME 0x100
|
#define VAR_EQ_TEST_NAME 0x100
|
||||||
#define CONFIGURATION_VARSTORE_ID 0x6666
|
#define CONFIGURATION_VARSTORE_ID 0x6666
|
||||||
|
|
||||||
#define FORMID_MAIN_FORM 1
|
#define FORMID_MAIN_FORM 1
|
||||||
#define FORMID_MAC_FORM 2
|
#define FORMID_MAC_FORM 2
|
||||||
#define FORMID_ATTEMPT_FORM 3
|
#define FORMID_ATTEMPT_FORM 3
|
||||||
#define FORMID_ORDER_FORM 4
|
#define FORMID_ORDER_FORM 4
|
||||||
#define FORMID_DELETE_FORM 5
|
#define FORMID_DELETE_FORM 5
|
||||||
|
|
||||||
#define ISCSI_MAX_ATTEMPTS_NUM FixedPcdGet8 (PcdMaxIScsiAttemptNumber)
|
#define ISCSI_MAX_ATTEMPTS_NUM FixedPcdGet8 (PcdMaxIScsiAttemptNumber)
|
||||||
|
|
||||||
#define ISCSI_NAME_IFR_MIN_SIZE 4
|
#define ISCSI_NAME_IFR_MIN_SIZE 4
|
||||||
#define ISCSI_NAME_IFR_MAX_SIZE 223
|
#define ISCSI_NAME_IFR_MAX_SIZE 223
|
||||||
#define ISCSI_NAME_MAX_SIZE 224
|
#define ISCSI_NAME_MAX_SIZE 224
|
||||||
|
|
||||||
#define ATTEMPT_NAME_LIST_SIZE 96
|
#define ATTEMPT_NAME_LIST_SIZE 96
|
||||||
#define ATTEMPT_NAME_SIZE 12
|
#define ATTEMPT_NAME_SIZE 12
|
||||||
|
|
||||||
#define CONNECT_MIN_RETRY 0
|
#define CONNECT_MIN_RETRY 0
|
||||||
#define CONNECT_MAX_RETRY 16
|
#define CONNECT_MAX_RETRY 16
|
||||||
|
|
||||||
#define CONNECT_MIN_TIMEOUT 100
|
#define CONNECT_MIN_TIMEOUT 100
|
||||||
#define CONNECT_MAX_TIMEOUT 20000
|
#define CONNECT_MAX_TIMEOUT 20000
|
||||||
#define CONNECT_DEFAULT_TIMEOUT 1000
|
#define CONNECT_DEFAULT_TIMEOUT 1000
|
||||||
|
|
||||||
#define ISCSI_ACTIVE_DISABLED 0
|
#define ISCSI_ACTIVE_DISABLED 0
|
||||||
#define ISCSI_ACTIVE_ENABLED 1
|
#define ISCSI_ACTIVE_ENABLED 1
|
||||||
|
|
||||||
#define ISCSI_DISABLED 0
|
#define ISCSI_DISABLED 0
|
||||||
#define ISCSI_ENABLED 1
|
#define ISCSI_ENABLED 1
|
||||||
#define ISCSI_ENABLED_FOR_MPIO 2
|
#define ISCSI_ENABLED_FOR_MPIO 2
|
||||||
|
|
||||||
#define IP_MODE_IP4 0
|
#define IP_MODE_IP4 0
|
||||||
#define IP_MODE_IP6 1
|
#define IP_MODE_IP6 1
|
||||||
#define IP_MODE_AUTOCONFIG 2
|
#define IP_MODE_AUTOCONFIG 2
|
||||||
|
|
||||||
#define ISCSI_AUTH_TYPE_NONE 0
|
#define ISCSI_AUTH_TYPE_NONE 0
|
||||||
#define ISCSI_AUTH_TYPE_CHAP 1
|
#define ISCSI_AUTH_TYPE_CHAP 1
|
||||||
#define ISCSI_AUTH_TYPE_KRB 2
|
#define ISCSI_AUTH_TYPE_KRB 2
|
||||||
|
|
||||||
#define IP4_MIN_SIZE 7
|
#define IP4_MIN_SIZE 7
|
||||||
#define IP4_MAX_SIZE 15
|
#define IP4_MAX_SIZE 15
|
||||||
#define IP4_STR_MAX_SIZE 16
|
#define IP4_STR_MAX_SIZE 16
|
||||||
|
|
||||||
//
|
//
|
||||||
// Macros used for an IPv4 or an IPv6 address.
|
// Macros used for an IPv4 or an IPv6 address.
|
||||||
//
|
//
|
||||||
#define IP_MIN_SIZE 2
|
#define IP_MIN_SIZE 2
|
||||||
#define IP_MAX_SIZE 39
|
#define IP_MAX_SIZE 39
|
||||||
#define IP_STR_MAX_SIZE 40
|
#define IP_STR_MAX_SIZE 40
|
||||||
|
|
||||||
#define LUN_MIN_SIZE 1
|
#define LUN_MIN_SIZE 1
|
||||||
#define LUN_MAX_SIZE 20
|
#define LUN_MAX_SIZE 20
|
||||||
#define ISCSI_LUN_STR_MAX_LEN 21
|
#define ISCSI_LUN_STR_MAX_LEN 21
|
||||||
|
|
||||||
#define ISCSI_CHAP_UNI 0
|
#define ISCSI_CHAP_UNI 0
|
||||||
#define ISCSI_CHAP_MUTUAL 1
|
#define ISCSI_CHAP_MUTUAL 1
|
||||||
|
|
||||||
#define TARGET_PORT_MIN_NUM 0
|
#define TARGET_PORT_MIN_NUM 0
|
||||||
#define TARGET_PORT_MAX_NUM 65535
|
#define TARGET_PORT_MAX_NUM 65535
|
||||||
#define LABEL_END 0xffff
|
#define LABEL_END 0xffff
|
||||||
|
|
||||||
#define KEY_INITIATOR_NAME 0x101
|
#define KEY_INITIATOR_NAME 0x101
|
||||||
#define KEY_DHCP_ENABLE 0x102
|
#define KEY_DHCP_ENABLE 0x102
|
||||||
#define KEY_LOCAL_IP 0x103
|
#define KEY_LOCAL_IP 0x103
|
||||||
#define KEY_SUBNET_MASK 0x104
|
#define KEY_SUBNET_MASK 0x104
|
||||||
#define KEY_GATE_WAY 0x105
|
#define KEY_GATE_WAY 0x105
|
||||||
#define KEY_TARGET_IP 0x106
|
#define KEY_TARGET_IP 0x106
|
||||||
#define KEY_CHAP_NAME 0x107
|
#define KEY_CHAP_NAME 0x107
|
||||||
#define KEY_CHAP_SECRET 0x108
|
#define KEY_CHAP_SECRET 0x108
|
||||||
#define KEY_REVERSE_CHAP_NAME 0x109
|
#define KEY_REVERSE_CHAP_NAME 0x109
|
||||||
#define KEY_REVERSE_CHAP_SECRET 0x10a
|
#define KEY_REVERSE_CHAP_SECRET 0x10a
|
||||||
#define KEY_SAVE_CHANGES 0x10b
|
#define KEY_SAVE_CHANGES 0x10b
|
||||||
#define KEY_TARGET_NAME 0x10c
|
#define KEY_TARGET_NAME 0x10c
|
||||||
#define KEY_BOOT_LUN 0x10d
|
#define KEY_BOOT_LUN 0x10d
|
||||||
|
|
||||||
#define KEY_ADD_ATTEMPT 0x10e
|
#define KEY_ADD_ATTEMPT 0x10e
|
||||||
#define KEY_SAVE_ATTEMPT_CONFIG 0x10f
|
#define KEY_SAVE_ATTEMPT_CONFIG 0x10f
|
||||||
#define KEY_ORDER_ATTEMPT_CONFIG 0x110
|
#define KEY_ORDER_ATTEMPT_CONFIG 0x110
|
||||||
#define KEY_SAVE_ORDER_CHANGES 0x111
|
#define KEY_SAVE_ORDER_CHANGES 0x111
|
||||||
#define KEY_IGNORE_ORDER_CHANGES 0x112
|
#define KEY_IGNORE_ORDER_CHANGES 0x112
|
||||||
#define KEY_ATTEMPT_NAME 0x113
|
#define KEY_ATTEMPT_NAME 0x113
|
||||||
#define KEY_SAVE_DELETE_ATTEMPT 0x114
|
#define KEY_SAVE_DELETE_ATTEMPT 0x114
|
||||||
#define KEY_IGNORE_DELETE_ATTEMPT 0x115
|
#define KEY_IGNORE_DELETE_ATTEMPT 0x115
|
||||||
#define KEY_DELETE_ATTEMPT 0x116
|
#define KEY_DELETE_ATTEMPT 0x116
|
||||||
|
|
||||||
#define KEY_IP_MODE 0x11c
|
#define KEY_IP_MODE 0x11c
|
||||||
#define KEY_AUTH_TYPE 0x11d
|
#define KEY_AUTH_TYPE 0x11d
|
||||||
#define KEY_CONFIG_ISID 0x11e
|
#define KEY_CONFIG_ISID 0x11e
|
||||||
|
|
||||||
#define ATTEMPT_ENTRY_LABEL 0x9000
|
#define ATTEMPT_ENTRY_LABEL 0x9000
|
||||||
#define KEY_ATTEMPT_ENTRY_BASE 0xa000
|
#define KEY_ATTEMPT_ENTRY_BASE 0xa000
|
||||||
#define KEY_DE_ATTEMPT_ENTRY_BASE 0xb000
|
#define KEY_DE_ATTEMPT_ENTRY_BASE 0xb000
|
||||||
|
|
||||||
#define KEY_DEVICE_ENTRY_BASE 0x1000
|
#define KEY_DEVICE_ENTRY_BASE 0x1000
|
||||||
#define KEY_MAC_ENTRY_BASE 0x2000
|
#define KEY_MAC_ENTRY_BASE 0x2000
|
||||||
#define MAC_ENTRY_LABEL 0x3000
|
#define MAC_ENTRY_LABEL 0x3000
|
||||||
#define ORDER_ENTRY_LABEL 0x4000
|
#define ORDER_ENTRY_LABEL 0x4000
|
||||||
#define DELETE_ENTRY_LABEL 0x5000
|
#define DELETE_ENTRY_LABEL 0x5000
|
||||||
#define KEYWORD_ENTRY_LABEL 0x6000
|
#define KEYWORD_ENTRY_LABEL 0x6000
|
||||||
#define CONFIG_OPTION_OFFSET 0x9000
|
#define CONFIG_OPTION_OFFSET 0x9000
|
||||||
|
|
||||||
#define ISCSI_CHAP_SECRET_MIN_LEN 12
|
#define ISCSI_CHAP_SECRET_MIN_LEN 12
|
||||||
#define ISCSI_CHAP_SECRET_MAX_LEN 16
|
#define ISCSI_CHAP_SECRET_MAX_LEN 16
|
||||||
//
|
//
|
||||||
// ISCSI_CHAP_SECRET_STORAGE = ISCSI_CHAP_SECRET_MAX_LEN + sizeof (NULL-Terminator)
|
// ISCSI_CHAP_SECRET_STORAGE = ISCSI_CHAP_SECRET_MAX_LEN + sizeof (NULL-Terminator)
|
||||||
//
|
//
|
||||||
#define ISCSI_CHAP_SECRET_STORAGE 17
|
#define ISCSI_CHAP_SECRET_STORAGE 17
|
||||||
|
|
||||||
#define ISCSI_CHAP_NAME_MAX_LEN 126
|
#define ISCSI_CHAP_NAME_MAX_LEN 126
|
||||||
#define ISCSI_CHAP_NAME_STORAGE 127
|
#define ISCSI_CHAP_NAME_STORAGE 127
|
||||||
|
|
||||||
#define KERBEROS_SECRET_MIN_LEN 12
|
#define KERBEROS_SECRET_MIN_LEN 12
|
||||||
#define KERBEROS_SECRET_MAX_LEN 16
|
#define KERBEROS_SECRET_MAX_LEN 16
|
||||||
#define KERBEROS_SECRET_STORAGE 17
|
#define KERBEROS_SECRET_STORAGE 17
|
||||||
#define KERBEROS_NAME_MAX_LEN 96
|
#define KERBEROS_NAME_MAX_LEN 96
|
||||||
#define KERBEROS_KDC_PORT_MIN_NUM 0
|
#define KERBEROS_KDC_PORT_MIN_NUM 0
|
||||||
#define KERBEROS_KDC_PORT_MAX_NUM 65535
|
#define KERBEROS_KDC_PORT_MAX_NUM 65535
|
||||||
|
|
||||||
#define ISID_CONFIGURABLE_MIN_LEN 6
|
#define ISID_CONFIGURABLE_MIN_LEN 6
|
||||||
#define ISID_CONFIGURABLE_MAX_LEN 12
|
#define ISID_CONFIGURABLE_MAX_LEN 12
|
||||||
#define ISID_CONFIGURABLE_STORAGE 13
|
#define ISID_CONFIGURABLE_STORAGE 13
|
||||||
|
|
||||||
//
|
//
|
||||||
// sizeof (EFI_MAC_ADDRESS) * 3
|
// sizeof (EFI_MAC_ADDRESS) * 3
|
||||||
//
|
//
|
||||||
#define ISCSI_MAX_MAC_STRING_LEN 96
|
#define ISCSI_MAX_MAC_STRING_LEN 96
|
||||||
|
|
||||||
///
|
///
|
||||||
/// Macro used for target Url.
|
/// Macro used for target Url.
|
||||||
///
|
///
|
||||||
#define ISCSI_TARGET_URI_MIN_SIZE 0
|
#define ISCSI_TARGET_URI_MIN_SIZE 0
|
||||||
#define ISCSI_TARGET_URI_MAX_SIZE 255
|
#define ISCSI_TARGET_URI_MAX_SIZE 255
|
||||||
|
|
||||||
#pragma pack(1)
|
#pragma pack(1)
|
||||||
|
|
||||||
@ -151,81 +151,81 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
// Used by keyword.
|
// Used by keyword.
|
||||||
//
|
//
|
||||||
typedef struct {
|
typedef struct {
|
||||||
CHAR16 ISCSIIsId[ISID_CONFIGURABLE_STORAGE];
|
CHAR16 ISCSIIsId[ISID_CONFIGURABLE_STORAGE];
|
||||||
CHAR16 ISCSIInitiatorIpAddress[IP4_STR_MAX_SIZE];
|
CHAR16 ISCSIInitiatorIpAddress[IP4_STR_MAX_SIZE];
|
||||||
CHAR16 ISCSIInitiatorNetmask[IP4_STR_MAX_SIZE];
|
CHAR16 ISCSIInitiatorNetmask[IP4_STR_MAX_SIZE];
|
||||||
CHAR16 ISCSIInitiatorGateway[IP4_STR_MAX_SIZE];
|
CHAR16 ISCSIInitiatorGateway[IP4_STR_MAX_SIZE];
|
||||||
CHAR16 ISCSITargetName[ISCSI_NAME_MAX_SIZE];
|
CHAR16 ISCSITargetName[ISCSI_NAME_MAX_SIZE];
|
||||||
CHAR16 ISCSITargetIpAddress[ISCSI_TARGET_URI_MAX_SIZE];
|
CHAR16 ISCSITargetIpAddress[ISCSI_TARGET_URI_MAX_SIZE];
|
||||||
CHAR16 ISCSILun[ISCSI_LUN_STR_MAX_LEN];
|
CHAR16 ISCSILun[ISCSI_LUN_STR_MAX_LEN];
|
||||||
CHAR16 ISCSIChapUsername[ISCSI_CHAP_NAME_STORAGE];
|
CHAR16 ISCSIChapUsername[ISCSI_CHAP_NAME_STORAGE];
|
||||||
CHAR16 ISCSIChapSecret[ISCSI_CHAP_SECRET_STORAGE];
|
CHAR16 ISCSIChapSecret[ISCSI_CHAP_SECRET_STORAGE];
|
||||||
CHAR16 ISCSIReverseChapUsername[ISCSI_CHAP_NAME_STORAGE];
|
CHAR16 ISCSIReverseChapUsername[ISCSI_CHAP_NAME_STORAGE];
|
||||||
CHAR16 ISCSIReverseChapSecret[ISCSI_CHAP_SECRET_STORAGE];
|
CHAR16 ISCSIReverseChapSecret[ISCSI_CHAP_SECRET_STORAGE];
|
||||||
} KEYWORD_STR;
|
} KEYWORD_STR;
|
||||||
|
|
||||||
typedef struct _ISCSI_CONFIG_IFR_NVDATA {
|
typedef struct _ISCSI_CONFIG_IFR_NVDATA {
|
||||||
CHAR16 InitiatorName[ISCSI_NAME_MAX_SIZE];
|
CHAR16 InitiatorName[ISCSI_NAME_MAX_SIZE];
|
||||||
CHAR16 AttemptName[ATTEMPT_NAME_SIZE];
|
CHAR16 AttemptName[ATTEMPT_NAME_SIZE];
|
||||||
UINT8 Enabled;
|
UINT8 Enabled;
|
||||||
UINT8 IpMode;
|
UINT8 IpMode;
|
||||||
|
|
||||||
UINT8 ConnectRetryCount;
|
UINT8 ConnectRetryCount;
|
||||||
UINT8 Padding1;
|
UINT8 Padding1;
|
||||||
UINT16 ConnectTimeout; // Timeout value in milliseconds.
|
UINT16 ConnectTimeout; // Timeout value in milliseconds.
|
||||||
|
|
||||||
UINT8 InitiatorInfoFromDhcp;
|
UINT8 InitiatorInfoFromDhcp;
|
||||||
UINT8 TargetInfoFromDhcp;
|
UINT8 TargetInfoFromDhcp;
|
||||||
CHAR16 LocalIp[IP4_STR_MAX_SIZE];
|
CHAR16 LocalIp[IP4_STR_MAX_SIZE];
|
||||||
CHAR16 SubnetMask[IP4_STR_MAX_SIZE];
|
CHAR16 SubnetMask[IP4_STR_MAX_SIZE];
|
||||||
CHAR16 Gateway[IP4_STR_MAX_SIZE];
|
CHAR16 Gateway[IP4_STR_MAX_SIZE];
|
||||||
|
|
||||||
CHAR16 TargetName[ISCSI_NAME_MAX_SIZE];
|
CHAR16 TargetName[ISCSI_NAME_MAX_SIZE];
|
||||||
CHAR16 TargetIp[ISCSI_TARGET_URI_MAX_SIZE];
|
CHAR16 TargetIp[ISCSI_TARGET_URI_MAX_SIZE];
|
||||||
UINT16 TargetPort;
|
UINT16 TargetPort;
|
||||||
CHAR16 BootLun[ISCSI_LUN_STR_MAX_LEN];
|
CHAR16 BootLun[ISCSI_LUN_STR_MAX_LEN];
|
||||||
|
|
||||||
UINT8 AuthenticationType;
|
UINT8 AuthenticationType;
|
||||||
|
|
||||||
UINT8 CHAPType;
|
UINT8 CHAPType;
|
||||||
CHAR16 CHAPName[ISCSI_CHAP_NAME_STORAGE];
|
CHAR16 CHAPName[ISCSI_CHAP_NAME_STORAGE];
|
||||||
CHAR16 CHAPSecret[ISCSI_CHAP_SECRET_STORAGE];
|
CHAR16 CHAPSecret[ISCSI_CHAP_SECRET_STORAGE];
|
||||||
CHAR16 ReverseCHAPName[ISCSI_CHAP_NAME_STORAGE];
|
CHAR16 ReverseCHAPName[ISCSI_CHAP_NAME_STORAGE];
|
||||||
CHAR16 ReverseCHAPSecret[ISCSI_CHAP_SECRET_STORAGE];
|
CHAR16 ReverseCHAPSecret[ISCSI_CHAP_SECRET_STORAGE];
|
||||||
|
|
||||||
BOOLEAN MutualRequired;
|
BOOLEAN MutualRequired;
|
||||||
UINT8 Padding2;
|
UINT8 Padding2;
|
||||||
CHAR16 KerberosUserName[KERBEROS_NAME_MAX_LEN];
|
CHAR16 KerberosUserName[KERBEROS_NAME_MAX_LEN];
|
||||||
CHAR16 KerberosUserSecret[KERBEROS_SECRET_STORAGE];
|
CHAR16 KerberosUserSecret[KERBEROS_SECRET_STORAGE];
|
||||||
CHAR16 KerberosKDCName[KERBEROS_NAME_MAX_LEN];
|
CHAR16 KerberosKDCName[KERBEROS_NAME_MAX_LEN];
|
||||||
CHAR16 KerberosKDCRealm[KERBEROS_NAME_MAX_LEN];
|
CHAR16 KerberosKDCRealm[KERBEROS_NAME_MAX_LEN];
|
||||||
CHAR16 KerberosKDCIp[IP_STR_MAX_SIZE];
|
CHAR16 KerberosKDCIp[IP_STR_MAX_SIZE];
|
||||||
UINT16 KerberosKDCPort;
|
UINT16 KerberosKDCPort;
|
||||||
|
|
||||||
UINT8 DynamicOrderedList[ISCSI_MAX_ATTEMPTS_NUM];
|
UINT8 DynamicOrderedList[ISCSI_MAX_ATTEMPTS_NUM];
|
||||||
UINT8 DeleteAttemptList[ISCSI_MAX_ATTEMPTS_NUM];
|
UINT8 DeleteAttemptList[ISCSI_MAX_ATTEMPTS_NUM];
|
||||||
UINT8 AddAttemptList[ISCSI_MAX_ATTEMPTS_NUM];
|
UINT8 AddAttemptList[ISCSI_MAX_ATTEMPTS_NUM];
|
||||||
CHAR16 IsId[ISID_CONFIGURABLE_STORAGE];
|
CHAR16 IsId[ISID_CONFIGURABLE_STORAGE];
|
||||||
|
|
||||||
//
|
//
|
||||||
// This will be used by keywords.
|
// This will be used by keywords.
|
||||||
//
|
//
|
||||||
CHAR16 ISCSIMacAddr[ISCSI_MAX_MAC_STRING_LEN];
|
CHAR16 ISCSIMacAddr[ISCSI_MAX_MAC_STRING_LEN];
|
||||||
CHAR16 ISCSIAttemptOrder[ATTEMPT_NAME_LIST_SIZE];
|
CHAR16 ISCSIAttemptOrder[ATTEMPT_NAME_LIST_SIZE];
|
||||||
CHAR16 ISCSIAddAttemptList[ATTEMPT_NAME_LIST_SIZE];
|
CHAR16 ISCSIAddAttemptList[ATTEMPT_NAME_LIST_SIZE];
|
||||||
CHAR16 ISCSIDeleteAttemptList[ATTEMPT_NAME_LIST_SIZE];
|
CHAR16 ISCSIDeleteAttemptList[ATTEMPT_NAME_LIST_SIZE];
|
||||||
CHAR16 ISCSIDisplayAttemptList[ATTEMPT_NAME_LIST_SIZE];
|
CHAR16 ISCSIDisplayAttemptList[ATTEMPT_NAME_LIST_SIZE];
|
||||||
CHAR16 ISCSIAttemptName[ATTEMPT_NAME_LIST_SIZE];
|
CHAR16 ISCSIAttemptName[ATTEMPT_NAME_LIST_SIZE];
|
||||||
UINT8 ISCSIBootEnableList[ISCSI_MAX_ATTEMPTS_NUM];
|
UINT8 ISCSIBootEnableList[ISCSI_MAX_ATTEMPTS_NUM];
|
||||||
UINT8 ISCSIIpAddressTypeList[ISCSI_MAX_ATTEMPTS_NUM];
|
UINT8 ISCSIIpAddressTypeList[ISCSI_MAX_ATTEMPTS_NUM];
|
||||||
UINT8 ISCSIConnectRetry[ISCSI_MAX_ATTEMPTS_NUM];
|
UINT8 ISCSIConnectRetry[ISCSI_MAX_ATTEMPTS_NUM];
|
||||||
UINT16 ISCSIConnectTimeout[ISCSI_MAX_ATTEMPTS_NUM];
|
UINT16 ISCSIConnectTimeout[ISCSI_MAX_ATTEMPTS_NUM];
|
||||||
UINT8 ISCSIInitiatorInfoViaDHCP[ISCSI_MAX_ATTEMPTS_NUM];
|
UINT8 ISCSIInitiatorInfoViaDHCP[ISCSI_MAX_ATTEMPTS_NUM];
|
||||||
UINT8 ISCSITargetInfoViaDHCP[ISCSI_MAX_ATTEMPTS_NUM];
|
UINT8 ISCSITargetInfoViaDHCP[ISCSI_MAX_ATTEMPTS_NUM];
|
||||||
UINT16 ISCSITargetTcpPort[ISCSI_MAX_ATTEMPTS_NUM];
|
UINT16 ISCSITargetTcpPort[ISCSI_MAX_ATTEMPTS_NUM];
|
||||||
UINT8 ISCSIAuthenticationMethod[ISCSI_MAX_ATTEMPTS_NUM];
|
UINT8 ISCSIAuthenticationMethod[ISCSI_MAX_ATTEMPTS_NUM];
|
||||||
UINT8 ISCSIChapType[ISCSI_MAX_ATTEMPTS_NUM];
|
UINT8 ISCSIChapType[ISCSI_MAX_ATTEMPTS_NUM];
|
||||||
KEYWORD_STR Keyword[ISCSI_MAX_ATTEMPTS_NUM];
|
KEYWORD_STR Keyword[ISCSI_MAX_ATTEMPTS_NUM];
|
||||||
} ISCSI_CONFIG_IFR_NVDATA;
|
} ISCSI_CONFIG_IFR_NVDATA;
|
||||||
#pragma pack()
|
#pragma pack()
|
||||||
|
|
||||||
|
@ -8,7 +8,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
|
|
||||||
#include "IScsiImpl.h"
|
#include "IScsiImpl.h"
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Extract the Root Path option and get the required target information.
|
Extract the Root Path option and get the required target information.
|
||||||
|
|
||||||
@ -27,46 +26,47 @@ EFI_STATUS
|
|||||||
IScsiDhcpExtractRootPath (
|
IScsiDhcpExtractRootPath (
|
||||||
IN CHAR8 *RootPath,
|
IN CHAR8 *RootPath,
|
||||||
IN UINT8 Length,
|
IN UINT8 Length,
|
||||||
IN OUT ISCSI_ATTEMPT_CONFIG_NVDATA *ConfigData
|
IN OUT ISCSI_ATTEMPT_CONFIG_NVDATA *ConfigData
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
UINT8 IScsiRootPathIdLen;
|
UINT8 IScsiRootPathIdLen;
|
||||||
CHAR8 *TmpStr;
|
CHAR8 *TmpStr;
|
||||||
ISCSI_ROOT_PATH_FIELD Fields[RP_FIELD_IDX_MAX];
|
ISCSI_ROOT_PATH_FIELD Fields[RP_FIELD_IDX_MAX];
|
||||||
ISCSI_ROOT_PATH_FIELD *Field;
|
ISCSI_ROOT_PATH_FIELD *Field;
|
||||||
UINT32 FieldIndex;
|
UINT32 FieldIndex;
|
||||||
UINT8 Index;
|
UINT8 Index;
|
||||||
ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData;
|
ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData;
|
||||||
EFI_IP_ADDRESS Ip;
|
EFI_IP_ADDRESS Ip;
|
||||||
UINT8 IpMode;
|
UINT8 IpMode;
|
||||||
|
|
||||||
ConfigNvData = &ConfigData->SessionConfigData;
|
ConfigNvData = &ConfigData->SessionConfigData;
|
||||||
|
|
||||||
//
|
//
|
||||||
// "iscsi:"<servername>":"<protocol>":"<port>":"<LUN>":"<targetname>
|
// "iscsi:"<servername>":"<protocol>":"<port>":"<LUN>":"<targetname>
|
||||||
//
|
//
|
||||||
IScsiRootPathIdLen = (UINT8) AsciiStrLen (ISCSI_ROOT_PATH_ID);
|
IScsiRootPathIdLen = (UINT8)AsciiStrLen (ISCSI_ROOT_PATH_ID);
|
||||||
|
|
||||||
if ((Length <= IScsiRootPathIdLen) || (CompareMem (RootPath, ISCSI_ROOT_PATH_ID, IScsiRootPathIdLen) != 0)) {
|
if ((Length <= IScsiRootPathIdLen) || (CompareMem (RootPath, ISCSI_ROOT_PATH_ID, IScsiRootPathIdLen) != 0)) {
|
||||||
return EFI_NOT_FOUND;
|
return EFI_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Skip the iSCSI RootPath ID "iscsi:".
|
// Skip the iSCSI RootPath ID "iscsi:".
|
||||||
//
|
//
|
||||||
RootPath += IScsiRootPathIdLen;
|
RootPath += IScsiRootPathIdLen;
|
||||||
Length = (UINT8) (Length - IScsiRootPathIdLen);
|
Length = (UINT8)(Length - IScsiRootPathIdLen);
|
||||||
|
|
||||||
TmpStr = (CHAR8 *) AllocatePool (Length + 1);
|
TmpStr = (CHAR8 *)AllocatePool (Length + 1);
|
||||||
if (TmpStr == NULL) {
|
if (TmpStr == NULL) {
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
CopyMem (TmpStr, RootPath, Length);
|
CopyMem (TmpStr, RootPath, Length);
|
||||||
TmpStr[Length] = '\0';
|
TmpStr[Length] = '\0';
|
||||||
|
|
||||||
Index = 0;
|
Index = 0;
|
||||||
FieldIndex = RP_FIELD_IDX_SERVERNAME;
|
FieldIndex = RP_FIELD_IDX_SERVERNAME;
|
||||||
ZeroMem (&Fields[0], sizeof (Fields));
|
ZeroMem (&Fields[0], sizeof (Fields));
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -88,7 +88,7 @@ IScsiDhcpExtractRootPath (
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (Fields[FieldIndex].Str != NULL) {
|
if (Fields[FieldIndex].Str != NULL) {
|
||||||
Fields[FieldIndex].Len = (UINT8) AsciiStrLen (Fields[FieldIndex].Str);
|
Fields[FieldIndex].Len = (UINT8)AsciiStrLen (Fields[FieldIndex].Str);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -101,15 +101,16 @@ IScsiDhcpExtractRootPath (
|
|||||||
if ((Fields[RP_FIELD_IDX_SERVERNAME].Str == NULL) ||
|
if ((Fields[RP_FIELD_IDX_SERVERNAME].Str == NULL) ||
|
||||||
(Fields[RP_FIELD_IDX_TARGETNAME].Str == NULL) ||
|
(Fields[RP_FIELD_IDX_TARGETNAME].Str == NULL) ||
|
||||||
(Fields[RP_FIELD_IDX_PROTOCOL].Len > 1)
|
(Fields[RP_FIELD_IDX_PROTOCOL].Len > 1)
|
||||||
) {
|
)
|
||||||
|
{
|
||||||
Status = EFI_INVALID_PARAMETER;
|
Status = EFI_INVALID_PARAMETER;
|
||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Get the IP address of the target.
|
// Get the IP address of the target.
|
||||||
//
|
//
|
||||||
Field = &Fields[RP_FIELD_IDX_SERVERNAME];
|
Field = &Fields[RP_FIELD_IDX_SERVERNAME];
|
||||||
|
|
||||||
if (ConfigNvData->IpMode < IP_MODE_AUTOCONFIG) {
|
if (ConfigNvData->IpMode < IP_MODE_AUTOCONFIG) {
|
||||||
IpMode = ConfigNvData->IpMode;
|
IpMode = ConfigNvData->IpMode;
|
||||||
@ -125,11 +126,12 @@ IScsiDhcpExtractRootPath (
|
|||||||
if ((Field->Len + 2) > sizeof (ConfigNvData->TargetUrl)) {
|
if ((Field->Len + 2) > sizeof (ConfigNvData->TargetUrl)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
CopyMem (&ConfigNvData->TargetUrl, Field->Str, Field->Len);
|
CopyMem (&ConfigNvData->TargetUrl, Field->Str, Field->Len);
|
||||||
ConfigNvData->TargetUrl[Field->Len + 1] = '\0';
|
ConfigNvData->TargetUrl[Field->Len + 1] = '\0';
|
||||||
} else {
|
} else {
|
||||||
ConfigNvData->DnsMode = FALSE;
|
ConfigNvData->DnsMode = FALSE;
|
||||||
ZeroMem(ConfigNvData->TargetUrl, sizeof (ConfigNvData->TargetUrl));
|
ZeroMem (ConfigNvData->TargetUrl, sizeof (ConfigNvData->TargetUrl));
|
||||||
Status = IScsiAsciiStrToIp (Field->Str, IpMode, &Ip);
|
Status = IScsiAsciiStrToIp (Field->Str, IpMode, &Ip);
|
||||||
CopyMem (&ConfigNvData->TargetIp, &Ip, sizeof (EFI_IP_ADDRESS));
|
CopyMem (&ConfigNvData->TargetIp, &Ip, sizeof (EFI_IP_ADDRESS));
|
||||||
|
|
||||||
@ -137,6 +139,7 @@ IScsiDhcpExtractRootPath (
|
|||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Check the protocol type.
|
// Check the protocol type.
|
||||||
//
|
//
|
||||||
@ -145,15 +148,17 @@ IScsiDhcpExtractRootPath (
|
|||||||
Status = EFI_INVALID_PARAMETER;
|
Status = EFI_INVALID_PARAMETER;
|
||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Get the port of the iSCSI target.
|
// Get the port of the iSCSI target.
|
||||||
//
|
//
|
||||||
Field = &Fields[RP_FIELD_IDX_PORT];
|
Field = &Fields[RP_FIELD_IDX_PORT];
|
||||||
if (Field->Str != NULL) {
|
if (Field->Str != NULL) {
|
||||||
ConfigNvData->TargetPort = (UINT16) AsciiStrDecimalToUintn (Field->Str);
|
ConfigNvData->TargetPort = (UINT16)AsciiStrDecimalToUintn (Field->Str);
|
||||||
} else {
|
} else {
|
||||||
ConfigNvData->TargetPort = ISCSI_WELL_KNOWN_PORT;
|
ConfigNvData->TargetPort = ISCSI_WELL_KNOWN_PORT;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Get the LUN.
|
// Get the LUN.
|
||||||
//
|
//
|
||||||
@ -166,6 +171,7 @@ IScsiDhcpExtractRootPath (
|
|||||||
} else {
|
} else {
|
||||||
ZeroMem (ConfigNvData->BootLun, sizeof (ConfigNvData->BootLun));
|
ZeroMem (ConfigNvData->BootLun, sizeof (ConfigNvData->BootLun));
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Get the target iSCSI Name.
|
// Get the target iSCSI Name.
|
||||||
//
|
//
|
||||||
@ -175,6 +181,7 @@ IScsiDhcpExtractRootPath (
|
|||||||
Status = EFI_INVALID_PARAMETER;
|
Status = EFI_INVALID_PARAMETER;
|
||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Validate the iSCSI name.
|
// Validate the iSCSI name.
|
||||||
//
|
//
|
||||||
@ -220,10 +227,10 @@ IScsiDhcpSelectOffer (
|
|||||||
OUT EFI_DHCP4_PACKET **NewPacket OPTIONAL
|
OUT EFI_DHCP4_PACKET **NewPacket OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
UINT32 OptionCount;
|
UINT32 OptionCount;
|
||||||
EFI_DHCP4_PACKET_OPTION **OptionList;
|
EFI_DHCP4_PACKET_OPTION **OptionList;
|
||||||
UINT32 Index;
|
UINT32 Index;
|
||||||
|
|
||||||
if ((Dhcp4Event != Dhcp4RcvdOffer) && (Dhcp4Event != Dhcp4SelectOffer)) {
|
if ((Dhcp4Event != Dhcp4RcvdOffer) && (Dhcp4Event != Dhcp4SelectOffer)) {
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
@ -231,7 +238,7 @@ IScsiDhcpSelectOffer (
|
|||||||
|
|
||||||
OptionCount = 0;
|
OptionCount = 0;
|
||||||
|
|
||||||
Status = This->Parse (This, Packet, &OptionCount, NULL);
|
Status = This->Parse (This, Packet, &OptionCount, NULL);
|
||||||
if (Status != EFI_BUFFER_TOO_SMALL) {
|
if (Status != EFI_BUFFER_TOO_SMALL) {
|
||||||
return EFI_NOT_READY;
|
return EFI_NOT_READY;
|
||||||
}
|
}
|
||||||
@ -253,9 +260,9 @@ IScsiDhcpSelectOffer (
|
|||||||
}
|
}
|
||||||
|
|
||||||
Status = IScsiDhcpExtractRootPath (
|
Status = IScsiDhcpExtractRootPath (
|
||||||
(CHAR8 *) &OptionList[Index]->Data[0],
|
(CHAR8 *)&OptionList[Index]->Data[0],
|
||||||
OptionList[Index]->Length,
|
OptionList[Index]->Length,
|
||||||
(ISCSI_ATTEMPT_CONFIG_NVDATA *) Context
|
(ISCSI_ATTEMPT_CONFIG_NVDATA *)Context
|
||||||
);
|
);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@ -285,16 +292,16 @@ IScsiDhcpSelectOffer (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
IScsiParseDhcpAck (
|
IScsiParseDhcpAck (
|
||||||
IN EFI_DHCP4_PROTOCOL *Dhcp4,
|
IN EFI_DHCP4_PROTOCOL *Dhcp4,
|
||||||
IN OUT ISCSI_ATTEMPT_CONFIG_NVDATA *ConfigData
|
IN OUT ISCSI_ATTEMPT_CONFIG_NVDATA *ConfigData
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_DHCP4_MODE_DATA Dhcp4ModeData;
|
EFI_DHCP4_MODE_DATA Dhcp4ModeData;
|
||||||
UINT32 OptionCount;
|
UINT32 OptionCount;
|
||||||
EFI_DHCP4_PACKET_OPTION **OptionList;
|
EFI_DHCP4_PACKET_OPTION **OptionList;
|
||||||
UINT32 Index;
|
UINT32 Index;
|
||||||
ISCSI_SESSION_CONFIG_NVDATA *NvData;
|
ISCSI_SESSION_CONFIG_NVDATA *NvData;
|
||||||
|
|
||||||
Status = Dhcp4->GetModeData (Dhcp4, &Dhcp4ModeData);
|
Status = Dhcp4->GetModeData (Dhcp4, &Dhcp4ModeData);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
@ -314,7 +321,7 @@ IScsiParseDhcpAck (
|
|||||||
OptionCount = 0;
|
OptionCount = 0;
|
||||||
OptionList = NULL;
|
OptionList = NULL;
|
||||||
|
|
||||||
Status = Dhcp4->Parse (Dhcp4, Dhcp4ModeData.ReplyPacket, &OptionCount, OptionList);
|
Status = Dhcp4->Parse (Dhcp4, Dhcp4ModeData.ReplyPacket, &OptionCount, OptionList);
|
||||||
if (Status != EFI_BUFFER_TOO_SMALL) {
|
if (Status != EFI_BUFFER_TOO_SMALL) {
|
||||||
return EFI_DEVICE_ERROR;
|
return EFI_DEVICE_ERROR;
|
||||||
}
|
}
|
||||||
@ -335,11 +342,11 @@ IScsiParseDhcpAck (
|
|||||||
// Get DNS server addresses and DHCP server address from this offer.
|
// Get DNS server addresses and DHCP server address from this offer.
|
||||||
//
|
//
|
||||||
if (OptionList[Index]->OpCode == DHCP4_TAG_DNS_SERVER) {
|
if (OptionList[Index]->OpCode == DHCP4_TAG_DNS_SERVER) {
|
||||||
|
|
||||||
if (((OptionList[Index]->Length & 0x3) != 0) || (OptionList[Index]->Length == 0)) {
|
if (((OptionList[Index]->Length & 0x3) != 0) || (OptionList[Index]->Length == 0)) {
|
||||||
Status = EFI_INVALID_PARAMETER;
|
Status = EFI_INVALID_PARAMETER;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Primary DNS server address.
|
// Primary DNS server address.
|
||||||
//
|
//
|
||||||
@ -377,32 +384,32 @@ IScsiParseDhcpAck (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
IScsiSetIp4Policy (
|
IScsiSetIp4Policy (
|
||||||
IN EFI_IP4_CONFIG2_PROTOCOL *Ip4Config2
|
IN EFI_IP4_CONFIG2_PROTOCOL *Ip4Config2
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_IP4_CONFIG2_POLICY Policy;
|
EFI_IP4_CONFIG2_POLICY Policy;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
UINTN DataSize;
|
UINTN DataSize;
|
||||||
|
|
||||||
DataSize = sizeof (EFI_IP4_CONFIG2_POLICY);
|
DataSize = sizeof (EFI_IP4_CONFIG2_POLICY);
|
||||||
Status = Ip4Config2->GetData (
|
Status = Ip4Config2->GetData (
|
||||||
Ip4Config2,
|
Ip4Config2,
|
||||||
Ip4Config2DataTypePolicy,
|
Ip4Config2DataTypePolicy,
|
||||||
&DataSize,
|
&DataSize,
|
||||||
&Policy
|
&Policy
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Policy != Ip4Config2PolicyStatic) {
|
if (Policy != Ip4Config2PolicyStatic) {
|
||||||
Policy = Ip4Config2PolicyStatic;
|
Policy = Ip4Config2PolicyStatic;
|
||||||
Status= Ip4Config2->SetData (
|
Status = Ip4Config2->SetData (
|
||||||
Ip4Config2,
|
Ip4Config2,
|
||||||
Ip4Config2DataTypePolicy,
|
Ip4Config2DataTypePolicy,
|
||||||
sizeof (EFI_IP4_CONFIG2_POLICY),
|
sizeof (EFI_IP4_CONFIG2_POLICY),
|
||||||
&Policy
|
&Policy
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
@ -426,19 +433,19 @@ IScsiSetIp4Policy (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
IScsiDoDhcp (
|
IScsiDoDhcp (
|
||||||
IN EFI_HANDLE Image,
|
IN EFI_HANDLE Image,
|
||||||
IN EFI_HANDLE Controller,
|
IN EFI_HANDLE Controller,
|
||||||
IN OUT ISCSI_ATTEMPT_CONFIG_NVDATA *ConfigData
|
IN OUT ISCSI_ATTEMPT_CONFIG_NVDATA *ConfigData
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_HANDLE Dhcp4Handle;
|
EFI_HANDLE Dhcp4Handle;
|
||||||
EFI_IP4_CONFIG2_PROTOCOL *Ip4Config2;
|
EFI_IP4_CONFIG2_PROTOCOL *Ip4Config2;
|
||||||
EFI_DHCP4_PROTOCOL *Dhcp4;
|
EFI_DHCP4_PROTOCOL *Dhcp4;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_DHCP4_PACKET_OPTION *ParaList;
|
EFI_DHCP4_PACKET_OPTION *ParaList;
|
||||||
EFI_DHCP4_CONFIG_DATA Dhcp4ConfigData;
|
EFI_DHCP4_CONFIG_DATA Dhcp4ConfigData;
|
||||||
ISCSI_SESSION_CONFIG_NVDATA *NvData;
|
ISCSI_SESSION_CONFIG_NVDATA *NvData;
|
||||||
EFI_STATUS MediaStatus;
|
EFI_STATUS MediaStatus;
|
||||||
|
|
||||||
Dhcp4Handle = NULL;
|
Dhcp4Handle = NULL;
|
||||||
Ip4Config2 = NULL;
|
Ip4Config2 = NULL;
|
||||||
@ -450,7 +457,7 @@ IScsiDoDhcp (
|
|||||||
//
|
//
|
||||||
MediaStatus = EFI_SUCCESS;
|
MediaStatus = EFI_SUCCESS;
|
||||||
NetLibDetectMediaWaitTimeout (Controller, ISCSI_CHECK_MEDIA_GET_DHCP_WAITING_TIME, &MediaStatus);
|
NetLibDetectMediaWaitTimeout (Controller, ISCSI_CHECK_MEDIA_GET_DHCP_WAITING_TIME, &MediaStatus);
|
||||||
if (MediaStatus!= EFI_SUCCESS) {
|
if (MediaStatus != EFI_SUCCESS) {
|
||||||
AsciiPrint ("\n Error: Could not detect network connection.\n");
|
AsciiPrint ("\n Error: Could not detect network connection.\n");
|
||||||
return EFI_NO_MEDIA;
|
return EFI_NO_MEDIA;
|
||||||
}
|
}
|
||||||
@ -462,7 +469,7 @@ IScsiDoDhcp (
|
|||||||
// will not be in the right state for the iSCSI to start a new round D.O.R.A.
|
// will not be in the right state for the iSCSI to start a new round D.O.R.A.
|
||||||
// So, we need to switch its policy to static.
|
// So, we need to switch its policy to static.
|
||||||
//
|
//
|
||||||
Status = gBS->HandleProtocol (Controller, &gEfiIp4Config2ProtocolGuid, (VOID **) &Ip4Config2);
|
Status = gBS->HandleProtocol (Controller, &gEfiIp4Config2ProtocolGuid, (VOID **)&Ip4Config2);
|
||||||
if (!EFI_ERROR (Status)) {
|
if (!EFI_ERROR (Status)) {
|
||||||
Status = IScsiSetIp4Policy (Ip4Config2);
|
Status = IScsiSetIp4Policy (Ip4Config2);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
@ -486,7 +493,7 @@ IScsiDoDhcp (
|
|||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
Dhcp4Handle,
|
Dhcp4Handle,
|
||||||
&gEfiDhcp4ProtocolGuid,
|
&gEfiDhcp4ProtocolGuid,
|
||||||
(VOID **) &Dhcp4,
|
(VOID **)&Dhcp4,
|
||||||
Image,
|
Image,
|
||||||
Controller,
|
Controller,
|
||||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||||
@ -495,7 +502,7 @@ IScsiDoDhcp (
|
|||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
NvData = &ConfigData->SessionConfigData;
|
NvData = &ConfigData->SessionConfigData;
|
||||||
|
|
||||||
ParaList = AllocatePool (sizeof (EFI_DHCP4_PACKET_OPTION) + 3);
|
ParaList = AllocatePool (sizeof (EFI_DHCP4_PACKET_OPTION) + 3);
|
||||||
if (ParaList == NULL) {
|
if (ParaList == NULL) {
|
||||||
@ -507,7 +514,7 @@ IScsiDoDhcp (
|
|||||||
// Ask the server to reply with Netmask, Router, DNS, and RootPath options.
|
// Ask the server to reply with Netmask, Router, DNS, and RootPath options.
|
||||||
//
|
//
|
||||||
ParaList->OpCode = DHCP4_TAG_PARA_LIST;
|
ParaList->OpCode = DHCP4_TAG_PARA_LIST;
|
||||||
ParaList->Length = (UINT8) (NvData->TargetInfoFromDhcp ? 4 : 3);
|
ParaList->Length = (UINT8)(NvData->TargetInfoFromDhcp ? 4 : 3);
|
||||||
ParaList->Data[0] = DHCP4_TAG_NETMASK;
|
ParaList->Data[0] = DHCP4_TAG_NETMASK;
|
||||||
ParaList->Data[1] = DHCP4_TAG_ROUTER;
|
ParaList->Data[1] = DHCP4_TAG_ROUTER;
|
||||||
ParaList->Data[2] = DHCP4_TAG_DNS_SERVER;
|
ParaList->Data[2] = DHCP4_TAG_DNS_SERVER;
|
||||||
@ -534,6 +541,7 @@ IScsiDoDhcp (
|
|||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Parse the ACK to get required information.
|
// Parse the ACK to get required information.
|
||||||
//
|
//
|
||||||
|
@ -9,21 +9,21 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#ifndef _ISCSI_DHCP_H_
|
#ifndef _ISCSI_DHCP_H_
|
||||||
#define _ISCSI_DHCP_H_
|
#define _ISCSI_DHCP_H_
|
||||||
|
|
||||||
#define ISCSI_ROOT_PATH_ID "iscsi:"
|
#define ISCSI_ROOT_PATH_ID "iscsi:"
|
||||||
#define ISCSI_ROOT_PATH_FIELD_DELIMITER ':'
|
#define ISCSI_ROOT_PATH_FIELD_DELIMITER ':'
|
||||||
|
|
||||||
#define RP_FIELD_IDX_SERVERNAME 0
|
#define RP_FIELD_IDX_SERVERNAME 0
|
||||||
#define RP_FIELD_IDX_PROTOCOL 1
|
#define RP_FIELD_IDX_PROTOCOL 1
|
||||||
#define RP_FIELD_IDX_PORT 2
|
#define RP_FIELD_IDX_PORT 2
|
||||||
#define RP_FIELD_IDX_LUN 3
|
#define RP_FIELD_IDX_LUN 3
|
||||||
#define RP_FIELD_IDX_TARGETNAME 4
|
#define RP_FIELD_IDX_TARGETNAME 4
|
||||||
#define RP_FIELD_IDX_MAX 5
|
#define RP_FIELD_IDX_MAX 5
|
||||||
|
|
||||||
typedef struct _ISCSI_ATTEMPT_CONFIG_NVDATA ISCSI_ATTEMPT_CONFIG_NVDATA;
|
typedef struct _ISCSI_ATTEMPT_CONFIG_NVDATA ISCSI_ATTEMPT_CONFIG_NVDATA;
|
||||||
|
|
||||||
typedef struct _ISCSI_ROOT_PATH_FIELD {
|
typedef struct _ISCSI_ROOT_PATH_FIELD {
|
||||||
CHAR8 *Str;
|
CHAR8 *Str;
|
||||||
UINT8 Len;
|
UINT8 Len;
|
||||||
} ISCSI_ROOT_PATH_FIELD;
|
} ISCSI_ROOT_PATH_FIELD;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -41,9 +41,9 @@ typedef struct _ISCSI_ROOT_PATH_FIELD {
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
IScsiDoDhcp (
|
IScsiDoDhcp (
|
||||||
IN EFI_HANDLE Image,
|
IN EFI_HANDLE Image,
|
||||||
IN EFI_HANDLE Controller,
|
IN EFI_HANDLE Controller,
|
||||||
IN OUT ISCSI_ATTEMPT_CONFIG_NVDATA *ConfigData
|
IN OUT ISCSI_ATTEMPT_CONFIG_NVDATA *ConfigData
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -8,7 +8,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
|
|
||||||
#include "IScsiImpl.h"
|
#include "IScsiImpl.h"
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Extract the Root Path option and get the required target information from
|
Extract the Root Path option and get the required target information from
|
||||||
Boot File Uniform Resource Locator (URL) Option.
|
Boot File Uniform Resource Locator (URL) Option.
|
||||||
@ -29,47 +28,49 @@ EFI_STATUS
|
|||||||
IScsiDhcp6ExtractRootPath (
|
IScsiDhcp6ExtractRootPath (
|
||||||
IN CHAR8 *RootPath,
|
IN CHAR8 *RootPath,
|
||||||
IN UINT16 Length,
|
IN UINT16 Length,
|
||||||
IN OUT ISCSI_ATTEMPT_CONFIG_NVDATA *ConfigData
|
IN OUT ISCSI_ATTEMPT_CONFIG_NVDATA *ConfigData
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
UINT16 IScsiRootPathIdLen;
|
UINT16 IScsiRootPathIdLen;
|
||||||
CHAR8 *TmpStr;
|
CHAR8 *TmpStr;
|
||||||
ISCSI_ROOT_PATH_FIELD Fields[RP_FIELD_IDX_MAX];
|
ISCSI_ROOT_PATH_FIELD Fields[RP_FIELD_IDX_MAX];
|
||||||
ISCSI_ROOT_PATH_FIELD *Field;
|
ISCSI_ROOT_PATH_FIELD *Field;
|
||||||
UINT32 FieldIndex;
|
UINT32 FieldIndex;
|
||||||
UINT8 Index;
|
UINT8 Index;
|
||||||
ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData;
|
ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData;
|
||||||
EFI_IP_ADDRESS Ip;
|
EFI_IP_ADDRESS Ip;
|
||||||
UINT8 IpMode;
|
UINT8 IpMode;
|
||||||
|
|
||||||
ConfigNvData = &ConfigData->SessionConfigData;
|
ConfigNvData = &ConfigData->SessionConfigData;
|
||||||
ConfigNvData->DnsMode = FALSE;
|
ConfigNvData->DnsMode = FALSE;
|
||||||
//
|
//
|
||||||
// "iscsi:"<servername>":"<protocol>":"<port>":"<LUN>":"<targetname>
|
// "iscsi:"<servername>":"<protocol>":"<port>":"<LUN>":"<targetname>
|
||||||
//
|
//
|
||||||
IScsiRootPathIdLen = (UINT16) AsciiStrLen (ISCSI_ROOT_PATH_ID);
|
IScsiRootPathIdLen = (UINT16)AsciiStrLen (ISCSI_ROOT_PATH_ID);
|
||||||
|
|
||||||
if ((Length <= IScsiRootPathIdLen) ||
|
if ((Length <= IScsiRootPathIdLen) ||
|
||||||
(CompareMem (RootPath, ISCSI_ROOT_PATH_ID, IScsiRootPathIdLen) != 0)) {
|
(CompareMem (RootPath, ISCSI_ROOT_PATH_ID, IScsiRootPathIdLen) != 0))
|
||||||
|
{
|
||||||
return EFI_NOT_FOUND;
|
return EFI_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Skip the iSCSI RootPath ID "iscsi:".
|
// Skip the iSCSI RootPath ID "iscsi:".
|
||||||
//
|
//
|
||||||
RootPath = RootPath + IScsiRootPathIdLen;
|
RootPath = RootPath + IScsiRootPathIdLen;
|
||||||
Length = (UINT16) (Length - IScsiRootPathIdLen);
|
Length = (UINT16)(Length - IScsiRootPathIdLen);
|
||||||
|
|
||||||
TmpStr = (CHAR8 *) AllocatePool (Length + 1);
|
TmpStr = (CHAR8 *)AllocatePool (Length + 1);
|
||||||
if (TmpStr == NULL) {
|
if (TmpStr == NULL) {
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
CopyMem (TmpStr, RootPath, Length);
|
CopyMem (TmpStr, RootPath, Length);
|
||||||
TmpStr[Length] = '\0';
|
TmpStr[Length] = '\0';
|
||||||
|
|
||||||
Index = 0;
|
Index = 0;
|
||||||
FieldIndex = 0;
|
FieldIndex = 0;
|
||||||
ZeroMem (&Fields[0], sizeof (Fields));
|
ZeroMem (&Fields[0], sizeof (Fields));
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -87,7 +88,7 @@ IScsiDhcp6ExtractRootPath (
|
|||||||
Fields[RP_FIELD_IDX_SERVERNAME].Str = &TmpStr[Index];
|
Fields[RP_FIELD_IDX_SERVERNAME].Str = &TmpStr[Index];
|
||||||
|
|
||||||
if (!ConfigNvData->DnsMode) {
|
if (!ConfigNvData->DnsMode) {
|
||||||
while ((TmpStr[Index] != ISCSI_ROOT_PATH_ADDR_END_DELIMITER)&& (Index < Length)) {
|
while ((TmpStr[Index] != ISCSI_ROOT_PATH_ADDR_END_DELIMITER) && (Index < Length)) {
|
||||||
Index++;
|
Index++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -95,25 +96,25 @@ IScsiDhcp6ExtractRootPath (
|
|||||||
// Skip ']' and ':'.
|
// Skip ']' and ':'.
|
||||||
//
|
//
|
||||||
TmpStr[Index] = '\0';
|
TmpStr[Index] = '\0';
|
||||||
Index += 2;
|
Index += 2;
|
||||||
} else {
|
} else {
|
||||||
while ((TmpStr[Index] != ISCSI_ROOT_PATH_FIELD_DELIMITER) && (Index < Length)) {
|
while ((TmpStr[Index] != ISCSI_ROOT_PATH_FIELD_DELIMITER) && (Index < Length)) {
|
||||||
Index++;
|
Index++;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Skip ':'.
|
// Skip ':'.
|
||||||
//
|
//
|
||||||
TmpStr[Index] = '\0';
|
TmpStr[Index] = '\0';
|
||||||
Index += 1;
|
Index += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
Fields[RP_FIELD_IDX_SERVERNAME].Len = (UINT8) AsciiStrLen (Fields[RP_FIELD_IDX_SERVERNAME].Str);
|
Fields[RP_FIELD_IDX_SERVERNAME].Len = (UINT8)AsciiStrLen (Fields[RP_FIELD_IDX_SERVERNAME].Str);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Extract others fields in the Root Path option string.
|
// Extract others fields in the Root Path option string.
|
||||||
//
|
//
|
||||||
for (FieldIndex = 1; (FieldIndex < RP_FIELD_IDX_MAX) && (Index < Length); FieldIndex++) {
|
for (FieldIndex = 1; (FieldIndex < RP_FIELD_IDX_MAX) && (Index < Length); FieldIndex++) {
|
||||||
|
|
||||||
if (TmpStr[Index] != ISCSI_ROOT_PATH_FIELD_DELIMITER) {
|
if (TmpStr[Index] != ISCSI_ROOT_PATH_FIELD_DELIMITER) {
|
||||||
Fields[FieldIndex].Str = &TmpStr[Index];
|
Fields[FieldIndex].Str = &TmpStr[Index];
|
||||||
}
|
}
|
||||||
@ -129,7 +130,7 @@ IScsiDhcp6ExtractRootPath (
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (Fields[FieldIndex].Str != NULL) {
|
if (Fields[FieldIndex].Str != NULL) {
|
||||||
Fields[FieldIndex].Len = (UINT8) AsciiStrLen (Fields[FieldIndex].Str);
|
Fields[FieldIndex].Len = (UINT8)AsciiStrLen (Fields[FieldIndex].Str);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -142,15 +143,16 @@ IScsiDhcp6ExtractRootPath (
|
|||||||
if ((Fields[RP_FIELD_IDX_SERVERNAME].Str == NULL) ||
|
if ((Fields[RP_FIELD_IDX_SERVERNAME].Str == NULL) ||
|
||||||
(Fields[RP_FIELD_IDX_TARGETNAME].Str == NULL) ||
|
(Fields[RP_FIELD_IDX_TARGETNAME].Str == NULL) ||
|
||||||
(Fields[RP_FIELD_IDX_PROTOCOL].Len > 1)
|
(Fields[RP_FIELD_IDX_PROTOCOL].Len > 1)
|
||||||
) {
|
)
|
||||||
|
{
|
||||||
Status = EFI_INVALID_PARAMETER;
|
Status = EFI_INVALID_PARAMETER;
|
||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Get the IP address of the target.
|
// Get the IP address of the target.
|
||||||
//
|
//
|
||||||
Field = &Fields[RP_FIELD_IDX_SERVERNAME];
|
Field = &Fields[RP_FIELD_IDX_SERVERNAME];
|
||||||
if (ConfigNvData->IpMode < IP_MODE_AUTOCONFIG) {
|
if (ConfigNvData->IpMode < IP_MODE_AUTOCONFIG) {
|
||||||
IpMode = ConfigNvData->IpMode;
|
IpMode = ConfigNvData->IpMode;
|
||||||
} else {
|
} else {
|
||||||
@ -164,10 +166,11 @@ IScsiDhcp6ExtractRootPath (
|
|||||||
if ((Field->Len + 2) > sizeof (ConfigNvData->TargetUrl)) {
|
if ((Field->Len + 2) > sizeof (ConfigNvData->TargetUrl)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
CopyMem (&ConfigNvData->TargetUrl, Field->Str, Field->Len);
|
CopyMem (&ConfigNvData->TargetUrl, Field->Str, Field->Len);
|
||||||
ConfigNvData->TargetUrl[Field->Len + 1] = '\0';
|
ConfigNvData->TargetUrl[Field->Len + 1] = '\0';
|
||||||
} else {
|
} else {
|
||||||
ZeroMem(&ConfigNvData->TargetUrl, sizeof (ConfigNvData->TargetUrl));
|
ZeroMem (&ConfigNvData->TargetUrl, sizeof (ConfigNvData->TargetUrl));
|
||||||
Status = IScsiAsciiStrToIp (Field->Str, IpMode, &Ip);
|
Status = IScsiAsciiStrToIp (Field->Str, IpMode, &Ip);
|
||||||
CopyMem (&ConfigNvData->TargetIp, &Ip, sizeof (EFI_IP_ADDRESS));
|
CopyMem (&ConfigNvData->TargetIp, &Ip, sizeof (EFI_IP_ADDRESS));
|
||||||
|
|
||||||
@ -184,15 +187,17 @@ IScsiDhcp6ExtractRootPath (
|
|||||||
Status = EFI_INVALID_PARAMETER;
|
Status = EFI_INVALID_PARAMETER;
|
||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Get the port of the iSCSI target.
|
// Get the port of the iSCSI target.
|
||||||
//
|
//
|
||||||
Field = &Fields[RP_FIELD_IDX_PORT];
|
Field = &Fields[RP_FIELD_IDX_PORT];
|
||||||
if (Field->Str != NULL) {
|
if (Field->Str != NULL) {
|
||||||
ConfigNvData->TargetPort = (UINT16) AsciiStrDecimalToUintn (Field->Str);
|
ConfigNvData->TargetPort = (UINT16)AsciiStrDecimalToUintn (Field->Str);
|
||||||
} else {
|
} else {
|
||||||
ConfigNvData->TargetPort = ISCSI_WELL_KNOWN_PORT;
|
ConfigNvData->TargetPort = ISCSI_WELL_KNOWN_PORT;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Get the LUN.
|
// Get the LUN.
|
||||||
//
|
//
|
||||||
@ -205,6 +210,7 @@ IScsiDhcp6ExtractRootPath (
|
|||||||
} else {
|
} else {
|
||||||
ZeroMem (ConfigNvData->BootLun, sizeof (ConfigNvData->BootLun));
|
ZeroMem (ConfigNvData->BootLun, sizeof (ConfigNvData->BootLun));
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Get the target iSCSI Name.
|
// Get the target iSCSI Name.
|
||||||
//
|
//
|
||||||
@ -214,6 +220,7 @@ IScsiDhcp6ExtractRootPath (
|
|||||||
Status = EFI_INVALID_PARAMETER;
|
Status = EFI_INVALID_PARAMETER;
|
||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Validate the iSCSI name.
|
// Validate the iSCSI name.
|
||||||
//
|
//
|
||||||
@ -258,23 +265,23 @@ ON_EXIT:
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
IScsiDhcp6ParseReply (
|
IScsiDhcp6ParseReply (
|
||||||
IN EFI_DHCP6_PROTOCOL *This,
|
IN EFI_DHCP6_PROTOCOL *This,
|
||||||
IN VOID *Context,
|
IN VOID *Context,
|
||||||
IN EFI_DHCP6_PACKET *Packet
|
IN EFI_DHCP6_PACKET *Packet
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
UINT32 Index;
|
UINT32 Index;
|
||||||
UINT32 OptionCount;
|
UINT32 OptionCount;
|
||||||
EFI_DHCP6_PACKET_OPTION *BootFileOpt;
|
EFI_DHCP6_PACKET_OPTION *BootFileOpt;
|
||||||
EFI_DHCP6_PACKET_OPTION **OptionList;
|
EFI_DHCP6_PACKET_OPTION **OptionList;
|
||||||
ISCSI_ATTEMPT_CONFIG_NVDATA *ConfigData;
|
ISCSI_ATTEMPT_CONFIG_NVDATA *ConfigData;
|
||||||
UINT16 ParaLen;
|
UINT16 ParaLen;
|
||||||
|
|
||||||
OptionCount = 0;
|
OptionCount = 0;
|
||||||
BootFileOpt = NULL;
|
BootFileOpt = NULL;
|
||||||
|
|
||||||
Status = This->Parse (This, Packet, &OptionCount, NULL);
|
Status = This->Parse (This, Packet, &OptionCount, NULL);
|
||||||
if (Status != EFI_BUFFER_TOO_SMALL) {
|
if (Status != EFI_BUFFER_TOO_SMALL) {
|
||||||
return EFI_NOT_READY;
|
return EFI_NOT_READY;
|
||||||
}
|
}
|
||||||
@ -290,7 +297,7 @@ IScsiDhcp6ParseReply (
|
|||||||
goto Exit;
|
goto Exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
ConfigData = (ISCSI_ATTEMPT_CONFIG_NVDATA *) Context;
|
ConfigData = (ISCSI_ATTEMPT_CONFIG_NVDATA *)Context;
|
||||||
|
|
||||||
for (Index = 0; Index < OptionCount; Index++) {
|
for (Index = 0; Index < OptionCount; Index++) {
|
||||||
OptionList[Index]->OpCode = NTOHS (OptionList[Index]->OpCode);
|
OptionList[Index]->OpCode = NTOHS (OptionList[Index]->OpCode);
|
||||||
@ -300,11 +307,11 @@ IScsiDhcp6ParseReply (
|
|||||||
// Get DNS server addresses from this reply packet.
|
// Get DNS server addresses from this reply packet.
|
||||||
//
|
//
|
||||||
if (OptionList[Index]->OpCode == DHCP6_OPT_DNS_SERVERS) {
|
if (OptionList[Index]->OpCode == DHCP6_OPT_DNS_SERVERS) {
|
||||||
|
|
||||||
if (((OptionList[Index]->OpLen & 0xf) != 0) || (OptionList[Index]->OpLen == 0)) {
|
if (((OptionList[Index]->OpLen & 0xf) != 0) || (OptionList[Index]->OpLen == 0)) {
|
||||||
Status = EFI_UNSUPPORTED;
|
Status = EFI_UNSUPPORTED;
|
||||||
goto Exit;
|
goto Exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Primary DNS server address.
|
// Primary DNS server address.
|
||||||
//
|
//
|
||||||
@ -316,7 +323,6 @@ IScsiDhcp6ParseReply (
|
|||||||
//
|
//
|
||||||
CopyMem (&ConfigData->SecondaryDns, &OptionList[Index]->Data[16], sizeof (EFI_IPv6_ADDRESS));
|
CopyMem (&ConfigData->SecondaryDns, &OptionList[Index]->Data[16], sizeof (EFI_IPv6_ADDRESS));
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (OptionList[Index]->OpCode == DHCP6_OPT_BOOT_FILE_URL) {
|
} else if (OptionList[Index]->OpCode == DHCP6_OPT_BOOT_FILE_URL) {
|
||||||
//
|
//
|
||||||
// The server sends this option to inform the client about an URL to a boot file.
|
// The server sends this option to inform the client about an URL to a boot file.
|
||||||
@ -330,6 +336,7 @@ IScsiDhcp6ParseReply (
|
|||||||
Status = EFI_UNSUPPORTED;
|
Status = EFI_UNSUPPORTED;
|
||||||
goto Exit;
|
goto Exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Check param-len 1, should be 16 bytes.
|
// Check param-len 1, should be 16 bytes.
|
||||||
//
|
//
|
||||||
@ -352,7 +359,7 @@ IScsiDhcp6ParseReply (
|
|||||||
// Get iSCSI root path from Boot File Uniform Resource Locator (URL) Option
|
// Get iSCSI root path from Boot File Uniform Resource Locator (URL) Option
|
||||||
//
|
//
|
||||||
Status = IScsiDhcp6ExtractRootPath (
|
Status = IScsiDhcp6ExtractRootPath (
|
||||||
(CHAR8 *) BootFileOpt->Data,
|
(CHAR8 *)BootFileOpt->Data,
|
||||||
BootFileOpt->OpLen,
|
BootFileOpt->OpLen,
|
||||||
ConfigData
|
ConfigData
|
||||||
);
|
);
|
||||||
@ -363,7 +370,6 @@ Exit:
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Parse the DHCP ACK to get the address configuration and DNS information.
|
Parse the DHCP ACK to get the address configuration and DNS information.
|
||||||
|
|
||||||
@ -383,9 +389,9 @@ Exit:
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
IScsiDoDhcp6 (
|
IScsiDoDhcp6 (
|
||||||
IN EFI_HANDLE Image,
|
IN EFI_HANDLE Image,
|
||||||
IN EFI_HANDLE Controller,
|
IN EFI_HANDLE Controller,
|
||||||
IN OUT ISCSI_ATTEMPT_CONFIG_NVDATA *ConfigData
|
IN OUT ISCSI_ATTEMPT_CONFIG_NVDATA *ConfigData
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_HANDLE Dhcp6Handle;
|
EFI_HANDLE Dhcp6Handle;
|
||||||
@ -435,7 +441,7 @@ IScsiDoDhcp6 (
|
|||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
Dhcp6Handle,
|
Dhcp6Handle,
|
||||||
&gEfiDhcp6ProtocolGuid,
|
&gEfiDhcp6ProtocolGuid,
|
||||||
(VOID **) &Dhcp6,
|
(VOID **)&Dhcp6,
|
||||||
Image,
|
Image,
|
||||||
Controller,
|
Controller,
|
||||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||||
@ -493,7 +499,6 @@ IScsiDoDhcp6 (
|
|||||||
}
|
}
|
||||||
|
|
||||||
do {
|
do {
|
||||||
|
|
||||||
TimerStatus = gBS->CheckEvent (Timer);
|
TimerStatus = gBS->CheckEvent (Timer);
|
||||||
|
|
||||||
if (!EFI_ERROR (TimerStatus)) {
|
if (!EFI_ERROR (TimerStatus)) {
|
||||||
@ -509,9 +514,7 @@ IScsiDoDhcp6 (
|
|||||||
ConfigData
|
ConfigData
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
} while (TimerStatus == EFI_NOT_READY);
|
} while (TimerStatus == EFI_NOT_READY);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ON_EXIT:
|
ON_EXIT:
|
||||||
@ -542,4 +545,3 @@ ON_EXIT:
|
|||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,11 +9,10 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#ifndef _ISCSI_DHCP6_H_
|
#ifndef _ISCSI_DHCP6_H_
|
||||||
#define _ISCSI_DHCP6_H_
|
#define _ISCSI_DHCP6_H_
|
||||||
|
|
||||||
#define ISCSI_ROOT_PATH_ID "iscsi:"
|
#define ISCSI_ROOT_PATH_ID "iscsi:"
|
||||||
#define ISCSI_ROOT_PATH_FIELD_DELIMITER ':'
|
#define ISCSI_ROOT_PATH_FIELD_DELIMITER ':'
|
||||||
#define ISCSI_ROOT_PATH_ADDR_START_DELIMITER '['
|
#define ISCSI_ROOT_PATH_ADDR_START_DELIMITER '['
|
||||||
#define ISCSI_ROOT_PATH_ADDR_END_DELIMITER ']'
|
#define ISCSI_ROOT_PATH_ADDR_END_DELIMITER ']'
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Extract the Root Path option and get the required target information from
|
Extract the Root Path option and get the required target information from
|
||||||
@ -35,7 +34,7 @@ EFI_STATUS
|
|||||||
IScsiDhcp6ExtractRootPath (
|
IScsiDhcp6ExtractRootPath (
|
||||||
IN CHAR8 *RootPath,
|
IN CHAR8 *RootPath,
|
||||||
IN UINT16 Length,
|
IN UINT16 Length,
|
||||||
IN OUT ISCSI_ATTEMPT_CONFIG_NVDATA *ConfigData
|
IN OUT ISCSI_ATTEMPT_CONFIG_NVDATA *ConfigData
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -57,9 +56,9 @@ IScsiDhcp6ExtractRootPath (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
IScsiDoDhcp6 (
|
IScsiDoDhcp6 (
|
||||||
IN EFI_HANDLE Image,
|
IN EFI_HANDLE Image,
|
||||||
IN EFI_HANDLE Controller,
|
IN EFI_HANDLE Controller,
|
||||||
IN OUT ISCSI_ATTEMPT_CONFIG_NVDATA *ConfigData
|
IN OUT ISCSI_ATTEMPT_CONFIG_NVDATA *ConfigData
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -18,11 +18,11 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
IScsiCommonNotify (
|
IScsiCommonNotify (
|
||||||
IN EFI_EVENT Event,
|
IN EFI_EVENT Event,
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
*((BOOLEAN *) Context) = TRUE;
|
*((BOOLEAN *)Context) = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -40,22 +40,22 @@ IScsiCommonNotify (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
IScsiDns4 (
|
IScsiDns4 (
|
||||||
IN EFI_HANDLE Image,
|
IN EFI_HANDLE Image,
|
||||||
IN EFI_HANDLE Controller,
|
IN EFI_HANDLE Controller,
|
||||||
IN OUT ISCSI_SESSION_CONFIG_NVDATA *NvData
|
IN OUT ISCSI_SESSION_CONFIG_NVDATA *NvData
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_DNS4_PROTOCOL *Dns4;
|
EFI_DNS4_PROTOCOL *Dns4;
|
||||||
EFI_DNS4_CONFIG_DATA Dns4CfgData;
|
EFI_DNS4_CONFIG_DATA Dns4CfgData;
|
||||||
EFI_DNS4_COMPLETION_TOKEN Token;
|
EFI_DNS4_COMPLETION_TOKEN Token;
|
||||||
BOOLEAN IsDone;
|
BOOLEAN IsDone;
|
||||||
EFI_HANDLE Dns4Handle;
|
EFI_HANDLE Dns4Handle;
|
||||||
EFI_IP4_CONFIG2_PROTOCOL *Ip4Config2;
|
EFI_IP4_CONFIG2_PROTOCOL *Ip4Config2;
|
||||||
EFI_IPv4_ADDRESS *DnsServerList;
|
EFI_IPv4_ADDRESS *DnsServerList;
|
||||||
UINTN DnsServerListCount;
|
UINTN DnsServerListCount;
|
||||||
UINTN DataSize;
|
UINTN DataSize;
|
||||||
CHAR16 *HostName;
|
CHAR16 *HostName;
|
||||||
|
|
||||||
DnsServerList = NULL;
|
DnsServerList = NULL;
|
||||||
DnsServerListCount = 0;
|
DnsServerListCount = 0;
|
||||||
@ -66,7 +66,7 @@ IScsiDns4 (
|
|||||||
//
|
//
|
||||||
// Get DNS server list from EFI IPv4 Configuration II protocol.
|
// Get DNS server list from EFI IPv4 Configuration II protocol.
|
||||||
//
|
//
|
||||||
Status = gBS->HandleProtocol (Controller, &gEfiIp4Config2ProtocolGuid, (VOID **) &Ip4Config2);
|
Status = gBS->HandleProtocol (Controller, &gEfiIp4Config2ProtocolGuid, (VOID **)&Ip4Config2);
|
||||||
if (!EFI_ERROR (Status)) {
|
if (!EFI_ERROR (Status)) {
|
||||||
//
|
//
|
||||||
// Get the required size.
|
// Get the required size.
|
||||||
@ -79,7 +79,7 @@ IScsiDns4 (
|
|||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = Ip4Config2->GetData (Ip4Config2, Ip4Config2DataTypeDnsServer, &DataSize, DnsServerList);
|
Status = Ip4Config2->GetData (Ip4Config2, Ip4Config2DataTypeDnsServer, &DataSize, DnsServerList);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
FreePool (DnsServerList);
|
FreePool (DnsServerList);
|
||||||
DnsServerList = NULL;
|
DnsServerList = NULL;
|
||||||
@ -89,7 +89,6 @@ IScsiDns4 (
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Create a DNS child instance and get the protocol.
|
// Create a DNS child instance and get the protocol.
|
||||||
//
|
//
|
||||||
@ -106,7 +105,7 @@ IScsiDns4 (
|
|||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
Dns4Handle,
|
Dns4Handle,
|
||||||
&gEfiDns4ProtocolGuid,
|
&gEfiDns4ProtocolGuid,
|
||||||
(VOID **) &Dns4,
|
(VOID **)&Dns4,
|
||||||
Image,
|
Image,
|
||||||
Controller,
|
Controller,
|
||||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||||
@ -124,11 +123,11 @@ IScsiDns4 (
|
|||||||
Dns4CfgData.EnableDnsCache = TRUE;
|
Dns4CfgData.EnableDnsCache = TRUE;
|
||||||
IP4_COPY_ADDRESS (&Dns4CfgData.StationIp, &NvData->LocalIp);
|
IP4_COPY_ADDRESS (&Dns4CfgData.StationIp, &NvData->LocalIp);
|
||||||
IP4_COPY_ADDRESS (&Dns4CfgData.SubnetMask, &NvData->SubnetMask);
|
IP4_COPY_ADDRESS (&Dns4CfgData.SubnetMask, &NvData->SubnetMask);
|
||||||
Dns4CfgData.Protocol = EFI_IP_PROTO_UDP;
|
Dns4CfgData.Protocol = EFI_IP_PROTO_UDP;
|
||||||
Status = Dns4->Configure (
|
Status = Dns4->Configure (
|
||||||
Dns4,
|
Dns4,
|
||||||
&Dns4CfgData
|
&Dns4CfgData
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
goto Exit;
|
goto Exit;
|
||||||
}
|
}
|
||||||
@ -154,7 +153,7 @@ IScsiDns4 (
|
|||||||
Token.Status = EFI_NOT_READY;
|
Token.Status = EFI_NOT_READY;
|
||||||
IsDone = FALSE;
|
IsDone = FALSE;
|
||||||
|
|
||||||
HostName = (CHAR16 *) AllocateZeroPool (ISCSI_NAME_MAX_SIZE);
|
HostName = (CHAR16 *)AllocateZeroPool (ISCSI_NAME_MAX_SIZE);
|
||||||
if (HostName == NULL) {
|
if (HostName == NULL) {
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
@ -183,10 +182,12 @@ IScsiDns4 (
|
|||||||
Status = EFI_DEVICE_ERROR;
|
Status = EFI_DEVICE_ERROR;
|
||||||
goto Exit;
|
goto Exit;
|
||||||
}
|
}
|
||||||
if (Token.RspData.H2AData->IpCount == 0 || Token.RspData.H2AData->IpList == NULL) {
|
|
||||||
|
if ((Token.RspData.H2AData->IpCount == 0) || (Token.RspData.H2AData->IpList == NULL)) {
|
||||||
Status = EFI_DEVICE_ERROR;
|
Status = EFI_DEVICE_ERROR;
|
||||||
goto Exit;
|
goto Exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// We just return the first IP address from DNS protocol.
|
// We just return the first IP address from DNS protocol.
|
||||||
//
|
//
|
||||||
@ -199,10 +200,12 @@ Exit:
|
|||||||
if (Token.Event != NULL) {
|
if (Token.Event != NULL) {
|
||||||
gBS->CloseEvent (Token.Event);
|
gBS->CloseEvent (Token.Event);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Token.RspData.H2AData != NULL) {
|
if (Token.RspData.H2AData != NULL) {
|
||||||
if (Token.RspData.H2AData->IpList != NULL) {
|
if (Token.RspData.H2AData->IpList != NULL) {
|
||||||
FreePool (Token.RspData.H2AData->IpList);
|
FreePool (Token.RspData.H2AData->IpList);
|
||||||
}
|
}
|
||||||
|
|
||||||
FreePool (Token.RspData.H2AData);
|
FreePool (Token.RspData.H2AData);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -244,39 +247,39 @@ Exit:
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
IScsiDns6 (
|
IScsiDns6 (
|
||||||
IN EFI_HANDLE Image,
|
IN EFI_HANDLE Image,
|
||||||
IN EFI_HANDLE Controller,
|
IN EFI_HANDLE Controller,
|
||||||
IN OUT ISCSI_SESSION_CONFIG_NVDATA *NvData
|
IN OUT ISCSI_SESSION_CONFIG_NVDATA *NvData
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_DNS6_PROTOCOL *Dns6;
|
EFI_DNS6_PROTOCOL *Dns6;
|
||||||
EFI_DNS6_CONFIG_DATA Dns6ConfigData;
|
EFI_DNS6_CONFIG_DATA Dns6ConfigData;
|
||||||
EFI_DNS6_COMPLETION_TOKEN Token;
|
EFI_DNS6_COMPLETION_TOKEN Token;
|
||||||
EFI_HANDLE Dns6Handle;
|
EFI_HANDLE Dns6Handle;
|
||||||
EFI_IP6_CONFIG_PROTOCOL *Ip6Config;
|
EFI_IP6_CONFIG_PROTOCOL *Ip6Config;
|
||||||
EFI_IPv6_ADDRESS *DnsServerList;
|
EFI_IPv6_ADDRESS *DnsServerList;
|
||||||
UINTN DnsServerListCount;
|
UINTN DnsServerListCount;
|
||||||
UINTN DataSize;
|
UINTN DataSize;
|
||||||
BOOLEAN IsDone;
|
BOOLEAN IsDone;
|
||||||
CHAR16 *HostName;
|
CHAR16 *HostName;
|
||||||
|
|
||||||
DnsServerList = NULL;
|
DnsServerList = NULL;
|
||||||
DnsServerListCount = 0;
|
DnsServerListCount = 0;
|
||||||
Dns6 = NULL;
|
Dns6 = NULL;
|
||||||
Dns6Handle = NULL;
|
Dns6Handle = NULL;
|
||||||
ZeroMem (&Token, sizeof (EFI_DNS6_COMPLETION_TOKEN));
|
ZeroMem (&Token, sizeof (EFI_DNS6_COMPLETION_TOKEN));
|
||||||
|
|
||||||
//
|
//
|
||||||
// Get DNS server list from EFI IPv6 Configuration protocol.
|
// Get DNS server list from EFI IPv6 Configuration protocol.
|
||||||
//
|
//
|
||||||
Status = gBS->HandleProtocol (Controller, &gEfiIp6ConfigProtocolGuid, (VOID **) &Ip6Config);
|
Status = gBS->HandleProtocol (Controller, &gEfiIp6ConfigProtocolGuid, (VOID **)&Ip6Config);
|
||||||
if (!EFI_ERROR (Status)) {
|
if (!EFI_ERROR (Status)) {
|
||||||
//
|
//
|
||||||
// Get the required size.
|
// Get the required size.
|
||||||
//
|
//
|
||||||
DataSize = 0;
|
DataSize = 0;
|
||||||
Status = Ip6Config->GetData (Ip6Config, Ip6ConfigDataTypeDnsServer, &DataSize, NULL);
|
Status = Ip6Config->GetData (Ip6Config, Ip6ConfigDataTypeDnsServer, &DataSize, NULL);
|
||||||
if (Status == EFI_BUFFER_TOO_SMALL) {
|
if (Status == EFI_BUFFER_TOO_SMALL) {
|
||||||
DnsServerList = AllocatePool (DataSize);
|
DnsServerList = AllocatePool (DataSize);
|
||||||
if (DnsServerList == NULL) {
|
if (DnsServerList == NULL) {
|
||||||
@ -309,7 +312,7 @@ IScsiDns6 (
|
|||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
Dns6Handle,
|
Dns6Handle,
|
||||||
&gEfiDns6ProtocolGuid,
|
&gEfiDns6ProtocolGuid,
|
||||||
(VOID **) &Dns6,
|
(VOID **)&Dns6,
|
||||||
Image,
|
Image,
|
||||||
Controller,
|
Controller,
|
||||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||||
@ -326,10 +329,10 @@ IScsiDns6 (
|
|||||||
Dns6ConfigData.DnsServerList = DnsServerList;
|
Dns6ConfigData.DnsServerList = DnsServerList;
|
||||||
Dns6ConfigData.EnableDnsCache = TRUE;
|
Dns6ConfigData.EnableDnsCache = TRUE;
|
||||||
Dns6ConfigData.Protocol = EFI_IP_PROTO_UDP;
|
Dns6ConfigData.Protocol = EFI_IP_PROTO_UDP;
|
||||||
Status = Dns6->Configure (
|
Status = Dns6->Configure (
|
||||||
Dns6,
|
Dns6,
|
||||||
&Dns6ConfigData
|
&Dns6ConfigData
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
goto Exit;
|
goto Exit;
|
||||||
}
|
}
|
||||||
@ -353,7 +356,7 @@ IScsiDns6 (
|
|||||||
//
|
//
|
||||||
// Start asynchronous name resolution.
|
// Start asynchronous name resolution.
|
||||||
//
|
//
|
||||||
HostName = (CHAR16 *) AllocateZeroPool (ISCSI_NAME_MAX_SIZE);
|
HostName = (CHAR16 *)AllocateZeroPool (ISCSI_NAME_MAX_SIZE);
|
||||||
if (HostName == NULL) {
|
if (HostName == NULL) {
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
@ -381,10 +384,12 @@ IScsiDns6 (
|
|||||||
Status = EFI_DEVICE_ERROR;
|
Status = EFI_DEVICE_ERROR;
|
||||||
goto Exit;
|
goto Exit;
|
||||||
}
|
}
|
||||||
if (Token.RspData.H2AData->IpCount == 0 || Token.RspData.H2AData->IpList == NULL) {
|
|
||||||
|
if ((Token.RspData.H2AData->IpCount == 0) || (Token.RspData.H2AData->IpList == NULL)) {
|
||||||
Status = EFI_DEVICE_ERROR;
|
Status = EFI_DEVICE_ERROR;
|
||||||
goto Exit;
|
goto Exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// We just return the first IPv6 address from DNS protocol.
|
// We just return the first IPv6 address from DNS protocol.
|
||||||
//
|
//
|
||||||
@ -397,10 +402,12 @@ Exit:
|
|||||||
if (Token.Event != NULL) {
|
if (Token.Event != NULL) {
|
||||||
gBS->CloseEvent (Token.Event);
|
gBS->CloseEvent (Token.Event);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Token.RspData.H2AData != NULL) {
|
if (Token.RspData.H2AData != NULL) {
|
||||||
if (Token.RspData.H2AData->IpList != NULL) {
|
if (Token.RspData.H2AData->IpList != NULL) {
|
||||||
FreePool (Token.RspData.H2AData->IpList);
|
FreePool (Token.RspData.H2AData->IpList);
|
||||||
}
|
}
|
||||||
|
|
||||||
FreePool (Token.RspData.H2AData);
|
FreePool (Token.RspData.H2AData);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -426,4 +433,3 @@ Exit:
|
|||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -25,9 +25,9 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
IScsiDns4 (
|
IScsiDns4 (
|
||||||
IN EFI_HANDLE Image,
|
IN EFI_HANDLE Image,
|
||||||
IN EFI_HANDLE Controller,
|
IN EFI_HANDLE Controller,
|
||||||
IN OUT ISCSI_SESSION_CONFIG_NVDATA *NvData
|
IN OUT ISCSI_SESSION_CONFIG_NVDATA *NvData
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -45,9 +45,9 @@ IScsiDns4 (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
IScsiDns6 (
|
IScsiDns6 (
|
||||||
IN EFI_HANDLE Image,
|
IN EFI_HANDLE Image,
|
||||||
IN EFI_HANDLE Controller,
|
IN EFI_HANDLE Controller,
|
||||||
IN OUT ISCSI_SESSION_CONFIG_NVDATA *NvData
|
IN OUT ISCSI_SESSION_CONFIG_NVDATA *NvData
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -11,7 +11,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
|
|
||||||
#include "IScsiImpl.h"
|
#include "IScsiImpl.h"
|
||||||
|
|
||||||
EFI_DRIVER_BINDING_PROTOCOL gIScsiIp4DriverBinding = {
|
EFI_DRIVER_BINDING_PROTOCOL gIScsiIp4DriverBinding = {
|
||||||
IScsiIp4DriverBindingSupported,
|
IScsiIp4DriverBindingSupported,
|
||||||
IScsiIp4DriverBindingStart,
|
IScsiIp4DriverBindingStart,
|
||||||
IScsiIp4DriverBindingStop,
|
IScsiIp4DriverBindingStop,
|
||||||
@ -20,7 +20,7 @@ EFI_DRIVER_BINDING_PROTOCOL gIScsiIp4DriverBinding = {
|
|||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
EFI_DRIVER_BINDING_PROTOCOL gIScsiIp6DriverBinding = {
|
EFI_DRIVER_BINDING_PROTOCOL gIScsiIp6DriverBinding = {
|
||||||
IScsiIp6DriverBindingSupported,
|
IScsiIp6DriverBindingSupported,
|
||||||
IScsiIp6DriverBindingStart,
|
IScsiIp6DriverBindingStart,
|
||||||
IScsiIp6DriverBindingStop,
|
IScsiIp6DriverBindingStop,
|
||||||
@ -29,9 +29,9 @@ EFI_DRIVER_BINDING_PROTOCOL gIScsiIp6DriverBinding = {
|
|||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
EFI_GUID gIScsiV4PrivateGuid = ISCSI_V4_PRIVATE_GUID;
|
EFI_GUID gIScsiV4PrivateGuid = ISCSI_V4_PRIVATE_GUID;
|
||||||
EFI_GUID gIScsiV6PrivateGuid = ISCSI_V6_PRIVATE_GUID;
|
EFI_GUID gIScsiV6PrivateGuid = ISCSI_V6_PRIVATE_GUID;
|
||||||
ISCSI_PRIVATE_DATA *mPrivate = NULL;
|
ISCSI_PRIVATE_DATA *mPrivate = NULL;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Tests to see if this driver supports the RemainingDevicePath.
|
Tests to see if this driver supports the RemainingDevicePath.
|
||||||
@ -50,7 +50,7 @@ ISCSI_PRIVATE_DATA *mPrivate = NULL;
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
IScsiIsDevicePathSupported (
|
IScsiIsDevicePathSupported (
|
||||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
|
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_DEVICE_PATH_PROTOCOL *CurrentDevicePath;
|
EFI_DEVICE_PATH_PROTOCOL *CurrentDevicePath;
|
||||||
@ -85,34 +85,34 @@ IScsiCheckAip (
|
|||||||
VOID
|
VOID
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINTN AipHandleCount;
|
UINTN AipHandleCount;
|
||||||
EFI_HANDLE *AipHandleBuffer;
|
EFI_HANDLE *AipHandleBuffer;
|
||||||
UINTN AipIndex;
|
UINTN AipIndex;
|
||||||
EFI_ADAPTER_INFORMATION_PROTOCOL *Aip;
|
EFI_ADAPTER_INFORMATION_PROTOCOL *Aip;
|
||||||
EFI_EXT_SCSI_PASS_THRU_PROTOCOL *ExtScsiPassThru;
|
EFI_EXT_SCSI_PASS_THRU_PROTOCOL *ExtScsiPassThru;
|
||||||
EFI_GUID *InfoTypesBuffer;
|
EFI_GUID *InfoTypesBuffer;
|
||||||
UINTN InfoTypeBufferCount;
|
UINTN InfoTypeBufferCount;
|
||||||
UINTN TypeIndex;
|
UINTN TypeIndex;
|
||||||
VOID *InfoBlock;
|
VOID *InfoBlock;
|
||||||
UINTN InfoBlockSize;
|
UINTN InfoBlockSize;
|
||||||
BOOLEAN Supported;
|
BOOLEAN Supported;
|
||||||
EFI_ADAPTER_INFO_NETWORK_BOOT *NetworkBoot;
|
EFI_ADAPTER_INFO_NETWORK_BOOT *NetworkBoot;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
UINT8 NetworkBootPolicy;
|
UINT8 NetworkBootPolicy;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Check any AIP instances exist in system.
|
// Check any AIP instances exist in system.
|
||||||
//
|
//
|
||||||
AipHandleCount = 0;
|
AipHandleCount = 0;
|
||||||
AipHandleBuffer = NULL;
|
AipHandleBuffer = NULL;
|
||||||
Status = gBS->LocateHandleBuffer (
|
Status = gBS->LocateHandleBuffer (
|
||||||
ByProtocol,
|
ByProtocol,
|
||||||
&gEfiAdapterInformationProtocolGuid,
|
&gEfiAdapterInformationProtocolGuid,
|
||||||
NULL,
|
NULL,
|
||||||
&AipHandleCount,
|
&AipHandleCount,
|
||||||
&AipHandleBuffer
|
&AipHandleBuffer
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status) || AipHandleCount == 0) {
|
if (EFI_ERROR (Status) || (AipHandleCount == 0)) {
|
||||||
return EFI_NOT_FOUND;
|
return EFI_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -124,7 +124,7 @@ IScsiCheckAip (
|
|||||||
Status = gBS->HandleProtocol (
|
Status = gBS->HandleProtocol (
|
||||||
AipHandleBuffer[AipIndex],
|
AipHandleBuffer[AipIndex],
|
||||||
&gEfiAdapterInformationProtocolGuid,
|
&gEfiAdapterInformationProtocolGuid,
|
||||||
(VOID *) &Aip
|
(VOID *)&Aip
|
||||||
);
|
);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
ASSERT (Aip != NULL);
|
ASSERT (Aip != NULL);
|
||||||
@ -132,18 +132,19 @@ IScsiCheckAip (
|
|||||||
Status = gBS->HandleProtocol (
|
Status = gBS->HandleProtocol (
|
||||||
AipHandleBuffer[AipIndex],
|
AipHandleBuffer[AipIndex],
|
||||||
&gEfiExtScsiPassThruProtocolGuid,
|
&gEfiExtScsiPassThruProtocolGuid,
|
||||||
(VOID *) &ExtScsiPassThru
|
(VOID *)&ExtScsiPassThru
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status) || ExtScsiPassThru == NULL) {
|
if (EFI_ERROR (Status) || (ExtScsiPassThru == NULL)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
InfoTypesBuffer = NULL;
|
InfoTypesBuffer = NULL;
|
||||||
InfoTypeBufferCount = 0;
|
InfoTypeBufferCount = 0;
|
||||||
Status = Aip->GetSupportedTypes (Aip, &InfoTypesBuffer, &InfoTypeBufferCount);
|
Status = Aip->GetSupportedTypes (Aip, &InfoTypesBuffer, &InfoTypeBufferCount);
|
||||||
if (EFI_ERROR (Status) || InfoTypesBuffer == NULL) {
|
if (EFI_ERROR (Status) || (InfoTypesBuffer == NULL)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Check whether the AIP instance has Network boot information block.
|
// Check whether the AIP instance has Network boot information block.
|
||||||
//
|
//
|
||||||
@ -165,33 +166,35 @@ IScsiCheckAip (
|
|||||||
//
|
//
|
||||||
InfoBlock = NULL;
|
InfoBlock = NULL;
|
||||||
InfoBlockSize = 0;
|
InfoBlockSize = 0;
|
||||||
Status = Aip->GetInformation (Aip, &gEfiAdapterInfoNetworkBootGuid, &InfoBlock, &InfoBlockSize);
|
Status = Aip->GetInformation (Aip, &gEfiAdapterInfoNetworkBootGuid, &InfoBlock, &InfoBlockSize);
|
||||||
if (EFI_ERROR (Status) || InfoBlock == NULL) {
|
if (EFI_ERROR (Status) || (InfoBlock == NULL)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Check whether the network boot policy matches.
|
// Check whether the network boot policy matches.
|
||||||
//
|
//
|
||||||
NetworkBoot = (EFI_ADAPTER_INFO_NETWORK_BOOT *) InfoBlock;
|
NetworkBoot = (EFI_ADAPTER_INFO_NETWORK_BOOT *)InfoBlock;
|
||||||
NetworkBootPolicy = PcdGet8 (PcdIScsiAIPNetworkBootPolicy);
|
NetworkBootPolicy = PcdGet8 (PcdIScsiAIPNetworkBootPolicy);
|
||||||
|
|
||||||
if (NetworkBootPolicy == STOP_UEFI_ISCSI_IF_HBA_INSTALL_AIP) {
|
if (NetworkBootPolicy == STOP_UEFI_ISCSI_IF_HBA_INSTALL_AIP) {
|
||||||
Status = EFI_SUCCESS;
|
Status = EFI_SUCCESS;
|
||||||
goto Exit;
|
goto Exit;
|
||||||
}
|
}
|
||||||
if (((NetworkBootPolicy & STOP_UEFI_ISCSI_IF_AIP_SUPPORT_IP4) != 0 &&
|
|
||||||
|
if ((((NetworkBootPolicy & STOP_UEFI_ISCSI_IF_AIP_SUPPORT_IP4) != 0) &&
|
||||||
!NetworkBoot->iScsiIpv4BootCapablity) ||
|
!NetworkBoot->iScsiIpv4BootCapablity) ||
|
||||||
((NetworkBootPolicy & STOP_UEFI_ISCSI_IF_AIP_SUPPORT_IP6) != 0 &&
|
(((NetworkBootPolicy & STOP_UEFI_ISCSI_IF_AIP_SUPPORT_IP6) != 0) &&
|
||||||
!NetworkBoot->iScsiIpv6BootCapablity) ||
|
!NetworkBoot->iScsiIpv6BootCapablity) ||
|
||||||
((NetworkBootPolicy & STOP_UEFI_ISCSI_IF_AIP_SUPPORT_OFFLOAD) != 0 &&
|
(((NetworkBootPolicy & STOP_UEFI_ISCSI_IF_AIP_SUPPORT_OFFLOAD) != 0) &&
|
||||||
!NetworkBoot->OffloadCapability) ||
|
!NetworkBoot->OffloadCapability) ||
|
||||||
((NetworkBootPolicy & STOP_UEFI_ISCSI_IF_AIP_SUPPORT_MPIO) != 0 &&
|
(((NetworkBootPolicy & STOP_UEFI_ISCSI_IF_AIP_SUPPORT_MPIO) != 0) &&
|
||||||
!NetworkBoot->iScsiMpioCapability) ||
|
!NetworkBoot->iScsiMpioCapability) ||
|
||||||
((NetworkBootPolicy & STOP_UEFI_ISCSI_IF_AIP_CONFIGURED_IP4) != 0 &&
|
(((NetworkBootPolicy & STOP_UEFI_ISCSI_IF_AIP_CONFIGURED_IP4) != 0) &&
|
||||||
!NetworkBoot->iScsiIpv4Boot) ||
|
!NetworkBoot->iScsiIpv4Boot) ||
|
||||||
((NetworkBootPolicy & STOP_UEFI_ISCSI_IF_AIP_CONFIGURED_IP6) != 0 &&
|
(((NetworkBootPolicy & STOP_UEFI_ISCSI_IF_AIP_CONFIGURED_IP6) != 0) &&
|
||||||
!NetworkBoot->iScsiIpv6Boot)) {
|
!NetworkBoot->iScsiIpv6Boot))
|
||||||
|
{
|
||||||
FreePool (InfoBlock);
|
FreePool (InfoBlock);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -206,9 +209,11 @@ Exit:
|
|||||||
if (InfoBlock != NULL) {
|
if (InfoBlock != NULL) {
|
||||||
FreePool (InfoBlock);
|
FreePool (InfoBlock);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (AipHandleBuffer != NULL) {
|
if (AipHandleBuffer != NULL) {
|
||||||
FreePool (AipHandleBuffer);
|
FreePool (AipHandleBuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -246,23 +251,22 @@ IScsiSupported (
|
|||||||
IN UINT8 IpVersion
|
IN UINT8 IpVersion
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_GUID *IScsiServiceBindingGuid;
|
EFI_GUID *IScsiServiceBindingGuid;
|
||||||
EFI_GUID *TcpServiceBindingGuid;
|
EFI_GUID *TcpServiceBindingGuid;
|
||||||
EFI_GUID *DhcpServiceBindingGuid;
|
EFI_GUID *DhcpServiceBindingGuid;
|
||||||
EFI_GUID *DnsServiceBindingGuid;
|
EFI_GUID *DnsServiceBindingGuid;
|
||||||
|
|
||||||
if (IpVersion == IP_VERSION_4) {
|
if (IpVersion == IP_VERSION_4) {
|
||||||
IScsiServiceBindingGuid = &gIScsiV4PrivateGuid;
|
IScsiServiceBindingGuid = &gIScsiV4PrivateGuid;
|
||||||
TcpServiceBindingGuid = &gEfiTcp4ServiceBindingProtocolGuid;
|
TcpServiceBindingGuid = &gEfiTcp4ServiceBindingProtocolGuid;
|
||||||
DhcpServiceBindingGuid = &gEfiDhcp4ServiceBindingProtocolGuid;
|
DhcpServiceBindingGuid = &gEfiDhcp4ServiceBindingProtocolGuid;
|
||||||
DnsServiceBindingGuid = &gEfiDns4ServiceBindingProtocolGuid;
|
DnsServiceBindingGuid = &gEfiDns4ServiceBindingProtocolGuid;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
IScsiServiceBindingGuid = &gIScsiV6PrivateGuid;
|
IScsiServiceBindingGuid = &gIScsiV6PrivateGuid;
|
||||||
TcpServiceBindingGuid = &gEfiTcp6ServiceBindingProtocolGuid;
|
TcpServiceBindingGuid = &gEfiTcp6ServiceBindingProtocolGuid;
|
||||||
DhcpServiceBindingGuid = &gEfiDhcp6ServiceBindingProtocolGuid;
|
DhcpServiceBindingGuid = &gEfiDhcp6ServiceBindingProtocolGuid;
|
||||||
DnsServiceBindingGuid = &gEfiDns6ServiceBindingProtocolGuid;
|
DnsServiceBindingGuid = &gEfiDns6ServiceBindingProtocolGuid;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
@ -325,7 +329,6 @@ IScsiSupported (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Start to manage the controller. This is the worker function for
|
Start to manage the controller. This is the worker function for
|
||||||
IScsiIp4(6)DriverBindingStart.
|
IScsiIp4(6)DriverBindingStart.
|
||||||
@ -347,33 +350,33 @@ IScsiSupported (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
IScsiStart (
|
IScsiStart (
|
||||||
IN EFI_HANDLE Image,
|
IN EFI_HANDLE Image,
|
||||||
IN EFI_HANDLE ControllerHandle,
|
IN EFI_HANDLE ControllerHandle,
|
||||||
IN UINT8 IpVersion
|
IN UINT8 IpVersion
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
ISCSI_DRIVER_DATA *Private;
|
ISCSI_DRIVER_DATA *Private;
|
||||||
LIST_ENTRY *Entry;
|
LIST_ENTRY *Entry;
|
||||||
LIST_ENTRY *NextEntry;
|
LIST_ENTRY *NextEntry;
|
||||||
ISCSI_ATTEMPT_CONFIG_NVDATA *AttemptConfigData;
|
ISCSI_ATTEMPT_CONFIG_NVDATA *AttemptConfigData;
|
||||||
ISCSI_SESSION *Session;
|
ISCSI_SESSION *Session;
|
||||||
UINT8 Index;
|
UINT8 Index;
|
||||||
EFI_EXT_SCSI_PASS_THRU_PROTOCOL *ExistIScsiExtScsiPassThru;
|
EFI_EXT_SCSI_PASS_THRU_PROTOCOL *ExistIScsiExtScsiPassThru;
|
||||||
ISCSI_DRIVER_DATA *ExistPrivate;
|
ISCSI_DRIVER_DATA *ExistPrivate;
|
||||||
UINT8 *AttemptConfigOrder;
|
UINT8 *AttemptConfigOrder;
|
||||||
UINTN AttemptConfigOrderSize;
|
UINTN AttemptConfigOrderSize;
|
||||||
UINT8 BootSelected;
|
UINT8 BootSelected;
|
||||||
EFI_HANDLE *HandleBuffer;
|
EFI_HANDLE *HandleBuffer;
|
||||||
UINTN NumberOfHandles;
|
UINTN NumberOfHandles;
|
||||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||||
EFI_GUID *IScsiPrivateGuid;
|
EFI_GUID *IScsiPrivateGuid;
|
||||||
EFI_GUID *TcpServiceBindingGuid;
|
EFI_GUID *TcpServiceBindingGuid;
|
||||||
BOOLEAN NeedUpdate;
|
BOOLEAN NeedUpdate;
|
||||||
VOID *Interface;
|
VOID *Interface;
|
||||||
EFI_GUID *ProtocolGuid;
|
EFI_GUID *ProtocolGuid;
|
||||||
UINT8 NetworkBootPolicy;
|
UINT8 NetworkBootPolicy;
|
||||||
ISCSI_SESSION_CONFIG_NVDATA *NvData;
|
ISCSI_SESSION_CONFIG_NVDATA *NvData;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Test to see if iSCSI driver supports the given controller.
|
// Test to see if iSCSI driver supports the given controller.
|
||||||
@ -518,7 +521,7 @@ IScsiStart (
|
|||||||
if (mPrivate->OneSessionEstablished && mPrivate->EnableMpio) {
|
if (mPrivate->OneSessionEstablished && mPrivate->EnableMpio) {
|
||||||
AttemptConfigData = NULL;
|
AttemptConfigData = NULL;
|
||||||
NET_LIST_FOR_EACH (Entry, &mPrivate->AttemptConfigs) {
|
NET_LIST_FOR_EACH (Entry, &mPrivate->AttemptConfigs) {
|
||||||
AttemptConfigData = NET_LIST_USER_STRUCT (Entry, ISCSI_ATTEMPT_CONFIG_NVDATA, Link);
|
AttemptConfigData = NET_LIST_USER_STRUCT (Entry, ISCSI_ATTEMPT_CONFIG_NVDATA, Link);
|
||||||
if (AttemptConfigData->SessionConfigData.Enabled == ISCSI_ENABLED_FOR_MPIO) {
|
if (AttemptConfigData->SessionConfigData.Enabled == ISCSI_ENABLED_FOR_MPIO) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -558,7 +561,7 @@ IScsiStart (
|
|||||||
Status = gBS->HandleProtocol (
|
Status = gBS->HandleProtocol (
|
||||||
HandleBuffer[Index],
|
HandleBuffer[Index],
|
||||||
&gEfiDevicePathProtocolGuid,
|
&gEfiDevicePathProtocolGuid,
|
||||||
(VOID **) &DevicePath
|
(VOID **)&DevicePath
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
continue;
|
continue;
|
||||||
@ -572,7 +575,7 @@ IScsiStart (
|
|||||||
Status = gBS->HandleProtocol (
|
Status = gBS->HandleProtocol (
|
||||||
HandleBuffer[Index],
|
HandleBuffer[Index],
|
||||||
&gEfiExtScsiPassThruProtocolGuid,
|
&gEfiExtScsiPassThruProtocolGuid,
|
||||||
(VOID **) &ExistIScsiExtScsiPassThru
|
(VOID **)&ExistIScsiExtScsiPassThru
|
||||||
);
|
);
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
break;
|
break;
|
||||||
@ -622,9 +625,10 @@ IScsiStart (
|
|||||||
// Don't process the attempt that does not associate with the current NIC or
|
// Don't process the attempt that does not associate with the current NIC or
|
||||||
// this attempt is disabled or established.
|
// this attempt is disabled or established.
|
||||||
//
|
//
|
||||||
if (AttemptConfigData->NicIndex != mPrivate->CurrentNic ||
|
if ((AttemptConfigData->NicIndex != mPrivate->CurrentNic) ||
|
||||||
AttemptConfigData->SessionConfigData.Enabled == ISCSI_DISABLED ||
|
(AttemptConfigData->SessionConfigData.Enabled == ISCSI_DISABLED) ||
|
||||||
AttemptConfigData->ValidPath) {
|
AttemptConfigData->ValidPath)
|
||||||
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -633,9 +637,10 @@ IScsiStart (
|
|||||||
// In default single path mode, don't process attempts configured for multipath.
|
// In default single path mode, don't process attempts configured for multipath.
|
||||||
//
|
//
|
||||||
if ((mPrivate->EnableMpio &&
|
if ((mPrivate->EnableMpio &&
|
||||||
AttemptConfigData->SessionConfigData.Enabled != ISCSI_ENABLED_FOR_MPIO) ||
|
(AttemptConfigData->SessionConfigData.Enabled != ISCSI_ENABLED_FOR_MPIO)) ||
|
||||||
(!mPrivate->EnableMpio &&
|
(!mPrivate->EnableMpio &&
|
||||||
AttemptConfigData->SessionConfigData.Enabled != ISCSI_ENABLED)) {
|
(AttemptConfigData->SessionConfigData.Enabled != ISCSI_ENABLED)))
|
||||||
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -643,18 +648,21 @@ IScsiStart (
|
|||||||
// Don't process the attempt that fails to get the init/target information from DHCP.
|
// Don't process the attempt that fails to get the init/target information from DHCP.
|
||||||
//
|
//
|
||||||
if (AttemptConfigData->SessionConfigData.InitiatorInfoFromDhcp &&
|
if (AttemptConfigData->SessionConfigData.InitiatorInfoFromDhcp &&
|
||||||
!AttemptConfigData->DhcpSuccess) {
|
!AttemptConfigData->DhcpSuccess)
|
||||||
if (!mPrivate->EnableMpio && mPrivate->ValidSinglePathCount > 0) {
|
{
|
||||||
|
if (!mPrivate->EnableMpio && (mPrivate->ValidSinglePathCount > 0)) {
|
||||||
mPrivate->ValidSinglePathCount--;
|
mPrivate->ValidSinglePathCount--;
|
||||||
}
|
}
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Don't process the autoconfigure path if it is already established.
|
// Don't process the autoconfigure path if it is already established.
|
||||||
//
|
//
|
||||||
if (AttemptConfigData->SessionConfigData.IpMode == IP_MODE_AUTOCONFIG &&
|
if ((AttemptConfigData->SessionConfigData.IpMode == IP_MODE_AUTOCONFIG) &&
|
||||||
AttemptConfigData->AutoConfigureSuccess) {
|
AttemptConfigData->AutoConfigureSuccess)
|
||||||
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -665,16 +673,20 @@ IScsiStart (
|
|||||||
if (AttemptConfigData->SessionConfigData.IpMode == IP_MODE_IP6) {
|
if (AttemptConfigData->SessionConfigData.IpMode == IP_MODE_IP6) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (AttemptConfigData->SessionConfigData.IpMode == IP_MODE_AUTOCONFIG &&
|
|
||||||
AttemptConfigData->AutoConfigureMode == IP_MODE_AUTOCONFIG_IP6) {
|
if ((AttemptConfigData->SessionConfigData.IpMode == IP_MODE_AUTOCONFIG) &&
|
||||||
|
(AttemptConfigData->AutoConfigureMode == IP_MODE_AUTOCONFIG_IP6))
|
||||||
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (AttemptConfigData->SessionConfigData.IpMode == IP_MODE_IP4) {
|
if (AttemptConfigData->SessionConfigData.IpMode == IP_MODE_IP4) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (AttemptConfigData->SessionConfigData.IpMode == IP_MODE_AUTOCONFIG &&
|
|
||||||
AttemptConfigData->AutoConfigureMode == IP_MODE_AUTOCONFIG_IP4) {
|
if ((AttemptConfigData->SessionConfigData.IpMode == IP_MODE_AUTOCONFIG) &&
|
||||||
|
(AttemptConfigData->AutoConfigureMode == IP_MODE_AUTOCONFIG_IP4))
|
||||||
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -682,7 +694,7 @@ IScsiStart (
|
|||||||
//
|
//
|
||||||
// Fill in the Session and init it.
|
// Fill in the Session and init it.
|
||||||
//
|
//
|
||||||
Session = (ISCSI_SESSION *) AllocateZeroPool (sizeof (ISCSI_SESSION));
|
Session = (ISCSI_SESSION *)AllocateZeroPool (sizeof (ISCSI_SESSION));
|
||||||
if (Session == NULL) {
|
if (Session == NULL) {
|
||||||
Status = EFI_OUT_OF_RESOURCES;
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
goto ON_ERROR;
|
goto ON_ERROR;
|
||||||
@ -694,9 +706,9 @@ IScsiStart (
|
|||||||
|
|
||||||
UnicodeSPrint (
|
UnicodeSPrint (
|
||||||
mPrivate->PortString,
|
mPrivate->PortString,
|
||||||
(UINTN) ISCSI_NAME_IFR_MAX_SIZE,
|
(UINTN)ISCSI_NAME_IFR_MAX_SIZE,
|
||||||
L"Attempt %d",
|
L"Attempt %d",
|
||||||
(UINTN) AttemptConfigData->AttemptConfigIndex
|
(UINTN)AttemptConfigData->AttemptConfigIndex
|
||||||
);
|
);
|
||||||
|
|
||||||
if (Session->AuthType == ISCSI_AUTH_TYPE_CHAP) {
|
if (Session->AuthType == ISCSI_AUTH_TYPE_CHAP) {
|
||||||
@ -742,12 +754,11 @@ IScsiStart (
|
|||||||
// In Single path mode, only the successful attempt will be recorded in iBFT;
|
// In Single path mode, only the successful attempt will be recorded in iBFT;
|
||||||
// in multi-path mode, all the attempt entries in MPIO will be recorded in iBFT.
|
// in multi-path mode, all the attempt entries in MPIO will be recorded in iBFT.
|
||||||
//
|
//
|
||||||
if (!mPrivate->EnableMpio && mPrivate->ValidSinglePathCount > 0) {
|
if (!mPrivate->EnableMpio && (mPrivate->ValidSinglePathCount > 0)) {
|
||||||
mPrivate->ValidSinglePathCount--;
|
mPrivate->ValidSinglePathCount--;
|
||||||
}
|
}
|
||||||
|
|
||||||
FreePool (Session);
|
FreePool (Session);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
AttemptConfigData->ValidPath = TRUE;
|
AttemptConfigData->ValidPath = TRUE;
|
||||||
|
|
||||||
@ -756,7 +767,7 @@ IScsiStart (
|
|||||||
// TODO: record KRB5 attempt information in the iSCSI device path.
|
// TODO: record KRB5 attempt information in the iSCSI device path.
|
||||||
//
|
//
|
||||||
if (Session->AuthType == ISCSI_AUTH_TYPE_KRB) {
|
if (Session->AuthType == ISCSI_AUTH_TYPE_KRB) {
|
||||||
if (!mPrivate->EnableMpio && mPrivate->ValidSinglePathCount > 0) {
|
if (!mPrivate->EnableMpio && (mPrivate->ValidSinglePathCount > 0)) {
|
||||||
mPrivate->ValidSinglePathCount--;
|
mPrivate->ValidSinglePathCount--;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -814,7 +825,7 @@ IScsiStart (
|
|||||||
//
|
//
|
||||||
// Reinstall the original ExtScsiPassThru back.
|
// Reinstall the original ExtScsiPassThru back.
|
||||||
//
|
//
|
||||||
if (mPrivate->OneSessionEstablished && ExistPrivate != NULL) {
|
if (mPrivate->OneSessionEstablished && (ExistPrivate != NULL)) {
|
||||||
Status = gBS->InstallProtocolInterface (
|
Status = gBS->InstallProtocolInterface (
|
||||||
&ExistPrivate->ExtScsiPassThruHandle,
|
&ExistPrivate->ExtScsiPassThruHandle,
|
||||||
&gEfiExtScsiPassThruProtocolGuid,
|
&gEfiExtScsiPassThruProtocolGuid,
|
||||||
@ -837,8 +848,7 @@ IScsiStart (
|
|||||||
//
|
//
|
||||||
// More than one attempt successes.
|
// More than one attempt successes.
|
||||||
//
|
//
|
||||||
if (Private->Session != NULL && mPrivate->OneSessionEstablished) {
|
if ((Private->Session != NULL) && mPrivate->OneSessionEstablished) {
|
||||||
|
|
||||||
AttemptConfigOrder = IScsiGetVariableAndSize (
|
AttemptConfigOrder = IScsiGetVariableAndSize (
|
||||||
L"AttemptOrder",
|
L"AttemptOrder",
|
||||||
&gIScsiConfigGuid,
|
&gIScsiConfigGuid,
|
||||||
@ -847,9 +857,11 @@ IScsiStart (
|
|||||||
if (AttemptConfigOrder == NULL) {
|
if (AttemptConfigOrder == NULL) {
|
||||||
goto ON_ERROR;
|
goto ON_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Index = 0; Index < AttemptConfigOrderSize / sizeof (UINT8); Index++) {
|
for (Index = 0; Index < AttemptConfigOrderSize / sizeof (UINT8); Index++) {
|
||||||
if (AttemptConfigOrder[Index] == mPrivate->BootSelectedIndex ||
|
if ((AttemptConfigOrder[Index] == mPrivate->BootSelectedIndex) ||
|
||||||
AttemptConfigOrder[Index] == BootSelected) {
|
(AttemptConfigOrder[Index] == BootSelected))
|
||||||
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -887,6 +899,7 @@ IScsiStart (
|
|||||||
if (AttemptConfigOrder[Index] != BootSelected) {
|
if (AttemptConfigOrder[Index] != BootSelected) {
|
||||||
goto ON_ERROR;
|
goto ON_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
mPrivate->BootSelectedIndex = BootSelected;
|
mPrivate->BootSelectedIndex = BootSelected;
|
||||||
//
|
//
|
||||||
// Clear the resource in ExistPrivate.
|
// Clear the resource in ExistPrivate.
|
||||||
@ -917,7 +930,6 @@ IScsiStart (
|
|||||||
|
|
||||||
gBS->CloseEvent (ExistPrivate->ExitBootServiceEvent);
|
gBS->CloseEvent (ExistPrivate->ExitBootServiceEvent);
|
||||||
FreePool (ExistPrivate);
|
FreePool (ExistPrivate);
|
||||||
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
//
|
//
|
||||||
@ -927,7 +939,6 @@ IScsiStart (
|
|||||||
NeedUpdate = FALSE;
|
NeedUpdate = FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (NeedUpdate) {
|
if (NeedUpdate) {
|
||||||
@ -945,6 +956,7 @@ IScsiStart (
|
|||||||
Status = EFI_DEVICE_ERROR;
|
Status = EFI_DEVICE_ERROR;
|
||||||
goto ON_ERROR;
|
goto ON_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Install the updated device path onto the ExtScsiPassThruHandle.
|
// Install the updated device path onto the ExtScsiPassThruHandle.
|
||||||
//
|
//
|
||||||
@ -1032,16 +1044,15 @@ IScsiStop (
|
|||||||
IN UINT8 IpVersion
|
IN UINT8 IpVersion
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_HANDLE IScsiController;
|
EFI_HANDLE IScsiController;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
ISCSI_PRIVATE_PROTOCOL *IScsiIdentifier;
|
ISCSI_PRIVATE_PROTOCOL *IScsiIdentifier;
|
||||||
ISCSI_DRIVER_DATA *Private;
|
ISCSI_DRIVER_DATA *Private;
|
||||||
EFI_EXT_SCSI_PASS_THRU_PROTOCOL *PassThru;
|
EFI_EXT_SCSI_PASS_THRU_PROTOCOL *PassThru;
|
||||||
ISCSI_CONNECTION *Conn;
|
ISCSI_CONNECTION *Conn;
|
||||||
EFI_GUID *ProtocolGuid;
|
EFI_GUID *ProtocolGuid;
|
||||||
EFI_GUID *TcpServiceBindingGuid;
|
EFI_GUID *TcpServiceBindingGuid;
|
||||||
EFI_GUID *TcpProtocolGuid;
|
EFI_GUID *TcpProtocolGuid;
|
||||||
|
|
||||||
|
|
||||||
if (NumberOfChildren != 0) {
|
if (NumberOfChildren != 0) {
|
||||||
//
|
//
|
||||||
@ -1050,7 +1061,7 @@ IScsiStop (
|
|||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
ChildHandleBuffer[0],
|
ChildHandleBuffer[0],
|
||||||
&gEfiExtScsiPassThruProtocolGuid,
|
&gEfiExtScsiPassThruProtocolGuid,
|
||||||
(VOID **) &PassThru,
|
(VOID **)&PassThru,
|
||||||
This->DriverBindingHandle,
|
This->DriverBindingHandle,
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||||
@ -1094,14 +1105,15 @@ IScsiStop (
|
|||||||
// Get the handle of the controller we are controlling.
|
// Get the handle of the controller we are controlling.
|
||||||
//
|
//
|
||||||
if (IpVersion == IP_VERSION_4) {
|
if (IpVersion == IP_VERSION_4) {
|
||||||
ProtocolGuid = &gIScsiV4PrivateGuid;
|
ProtocolGuid = &gIScsiV4PrivateGuid;
|
||||||
TcpProtocolGuid = &gEfiTcp4ProtocolGuid;
|
TcpProtocolGuid = &gEfiTcp4ProtocolGuid;
|
||||||
TcpServiceBindingGuid = &gEfiTcp4ServiceBindingProtocolGuid;
|
TcpServiceBindingGuid = &gEfiTcp4ServiceBindingProtocolGuid;
|
||||||
} else {
|
} else {
|
||||||
ProtocolGuid = &gIScsiV6PrivateGuid;
|
ProtocolGuid = &gIScsiV6PrivateGuid;
|
||||||
TcpProtocolGuid = &gEfiTcp6ProtocolGuid;
|
TcpProtocolGuid = &gEfiTcp6ProtocolGuid;
|
||||||
TcpServiceBindingGuid = &gEfiTcp6ServiceBindingProtocolGuid;
|
TcpServiceBindingGuid = &gEfiTcp6ServiceBindingProtocolGuid;
|
||||||
}
|
}
|
||||||
|
|
||||||
IScsiController = NetLibGetNicHandle (ControllerHandle, TcpProtocolGuid);
|
IScsiController = NetLibGetNicHandle (ControllerHandle, TcpProtocolGuid);
|
||||||
if (IScsiController == NULL) {
|
if (IScsiController == NULL) {
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
@ -1110,7 +1122,7 @@ IScsiStop (
|
|||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
IScsiController,
|
IScsiController,
|
||||||
ProtocolGuid,
|
ProtocolGuid,
|
||||||
(VOID **) &IScsiIdentifier,
|
(VOID **)&IScsiIdentifier,
|
||||||
This->DriverBindingHandle,
|
This->DriverBindingHandle,
|
||||||
ControllerHandle,
|
ControllerHandle,
|
||||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||||
@ -1272,7 +1284,7 @@ IScsiIp4DriverBindingStart (
|
|||||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
|
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
Status = IScsiStart (This->DriverBindingHandle, ControllerHandle, IP_VERSION_4);
|
Status = IScsiStart (This->DriverBindingHandle, ControllerHandle, IP_VERSION_4);
|
||||||
if (Status == EFI_ALREADY_STARTED) {
|
if (Status == EFI_ALREADY_STARTED) {
|
||||||
@ -1427,7 +1439,7 @@ IScsiIp6DriverBindingStart (
|
|||||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
|
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
|
|
||||||
Status = IScsiStart (This->DriverBindingHandle, ControllerHandle, IP_VERSION_6);
|
Status = IScsiStart (This->DriverBindingHandle, ControllerHandle, IP_VERSION_6);
|
||||||
if (Status == EFI_ALREADY_STARTED) {
|
if (Status == EFI_ALREADY_STARTED) {
|
||||||
@ -1496,12 +1508,12 @@ IScsiUnload (
|
|||||||
IN EFI_HANDLE ImageHandle
|
IN EFI_HANDLE ImageHandle
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
UINTN DeviceHandleCount;
|
UINTN DeviceHandleCount;
|
||||||
EFI_HANDLE *DeviceHandleBuffer;
|
EFI_HANDLE *DeviceHandleBuffer;
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
EFI_COMPONENT_NAME_PROTOCOL *ComponentName;
|
EFI_COMPONENT_NAME_PROTOCOL *ComponentName;
|
||||||
EFI_COMPONENT_NAME2_PROTOCOL *ComponentName2;
|
EFI_COMPONENT_NAME2_PROTOCOL *ComponentName2;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Try to disconnect the driver from the devices it's controlling.
|
// Try to disconnect the driver from the devices it's controlling.
|
||||||
@ -1524,11 +1536,13 @@ IScsiUnload (
|
|||||||
Status = IScsiTestManagedDevice (
|
Status = IScsiTestManagedDevice (
|
||||||
DeviceHandleBuffer[Index],
|
DeviceHandleBuffer[Index],
|
||||||
gIScsiIp4DriverBinding.DriverBindingHandle,
|
gIScsiIp4DriverBinding.DriverBindingHandle,
|
||||||
&gEfiTcp4ProtocolGuid)
|
&gEfiTcp4ProtocolGuid
|
||||||
;
|
)
|
||||||
|
;
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = gBS->DisconnectController (
|
Status = gBS->DisconnectController (
|
||||||
DeviceHandleBuffer[Index],
|
DeviceHandleBuffer[Index],
|
||||||
gIScsiIp4DriverBinding.DriverBindingHandle,
|
gIScsiIp4DriverBinding.DriverBindingHandle,
|
||||||
@ -1551,6 +1565,7 @@ IScsiUnload (
|
|||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = gBS->DisconnectController (
|
Status = gBS->DisconnectController (
|
||||||
DeviceHandleBuffer[Index],
|
DeviceHandleBuffer[Index],
|
||||||
gIScsiIp6DriverBinding.DriverBindingHandle,
|
gIScsiIp6DriverBinding.DriverBindingHandle,
|
||||||
@ -1582,11 +1597,12 @@ IScsiUnload (
|
|||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gIScsiControllerNameTable!= NULL) {
|
if (gIScsiControllerNameTable != NULL) {
|
||||||
Status = FreeUnicodeStringTable (gIScsiControllerNameTable);
|
Status = FreeUnicodeStringTable (gIScsiControllerNameTable);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
gIScsiControllerNameTable = NULL;
|
gIScsiControllerNameTable = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1597,15 +1613,15 @@ IScsiUnload (
|
|||||||
Status = gBS->HandleProtocol (
|
Status = gBS->HandleProtocol (
|
||||||
gIScsiIp4DriverBinding.DriverBindingHandle,
|
gIScsiIp4DriverBinding.DriverBindingHandle,
|
||||||
&gEfiComponentNameProtocolGuid,
|
&gEfiComponentNameProtocolGuid,
|
||||||
(VOID **) &ComponentName
|
(VOID **)&ComponentName
|
||||||
);
|
);
|
||||||
if (!EFI_ERROR (Status)) {
|
if (!EFI_ERROR (Status)) {
|
||||||
Status = gBS->UninstallMultipleProtocolInterfaces (
|
Status = gBS->UninstallMultipleProtocolInterfaces (
|
||||||
gIScsiIp4DriverBinding.DriverBindingHandle,
|
gIScsiIp4DriverBinding.DriverBindingHandle,
|
||||||
&gEfiComponentNameProtocolGuid,
|
&gEfiComponentNameProtocolGuid,
|
||||||
ComponentName,
|
ComponentName,
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
}
|
}
|
||||||
@ -1614,7 +1630,7 @@ IScsiUnload (
|
|||||||
Status = gBS->HandleProtocol (
|
Status = gBS->HandleProtocol (
|
||||||
gIScsiIp4DriverBinding.DriverBindingHandle,
|
gIScsiIp4DriverBinding.DriverBindingHandle,
|
||||||
&gEfiComponentName2ProtocolGuid,
|
&gEfiComponentName2ProtocolGuid,
|
||||||
(VOID **) &ComponentName2
|
(VOID **)&ComponentName2
|
||||||
);
|
);
|
||||||
if (!EFI_ERROR (Status)) {
|
if (!EFI_ERROR (Status)) {
|
||||||
gBS->UninstallMultipleProtocolInterfaces (
|
gBS->UninstallMultipleProtocolInterfaces (
|
||||||
@ -1635,15 +1651,15 @@ IScsiUnload (
|
|||||||
Status = gBS->HandleProtocol (
|
Status = gBS->HandleProtocol (
|
||||||
gIScsiIp6DriverBinding.DriverBindingHandle,
|
gIScsiIp6DriverBinding.DriverBindingHandle,
|
||||||
&gEfiComponentNameProtocolGuid,
|
&gEfiComponentNameProtocolGuid,
|
||||||
(VOID **) &ComponentName
|
(VOID **)&ComponentName
|
||||||
);
|
);
|
||||||
if (!EFI_ERROR (Status)) {
|
if (!EFI_ERROR (Status)) {
|
||||||
Status = gBS->UninstallMultipleProtocolInterfaces (
|
Status = gBS->UninstallMultipleProtocolInterfaces (
|
||||||
gIScsiIp6DriverBinding.DriverBindingHandle,
|
gIScsiIp6DriverBinding.DriverBindingHandle,
|
||||||
&gEfiComponentNameProtocolGuid,
|
&gEfiComponentNameProtocolGuid,
|
||||||
ComponentName,
|
ComponentName,
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
goto ON_EXIT;
|
goto ON_EXIT;
|
||||||
}
|
}
|
||||||
@ -1652,7 +1668,7 @@ IScsiUnload (
|
|||||||
Status = gBS->HandleProtocol (
|
Status = gBS->HandleProtocol (
|
||||||
gIScsiIp6DriverBinding.DriverBindingHandle,
|
gIScsiIp6DriverBinding.DriverBindingHandle,
|
||||||
&gEfiComponentName2ProtocolGuid,
|
&gEfiComponentName2ProtocolGuid,
|
||||||
(VOID **) &ComponentName2
|
(VOID **)&ComponentName2
|
||||||
);
|
);
|
||||||
if (!EFI_ERROR (Status)) {
|
if (!EFI_ERROR (Status)) {
|
||||||
gBS->UninstallMultipleProtocolInterfaces (
|
gBS->UninstallMultipleProtocolInterfaces (
|
||||||
@ -1716,8 +1732,8 @@ ON_EXIT:
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
IScsiDriverEntryPoint (
|
IScsiDriverEntryPoint (
|
||||||
IN EFI_HANDLE ImageHandle,
|
IN EFI_HANDLE ImageHandle,
|
||||||
IN EFI_SYSTEM_TABLE *SystemTable
|
IN EFI_SYSTEM_TABLE *SystemTable
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
@ -1730,7 +1746,7 @@ IScsiDriverEntryPoint (
|
|||||||
Status = gBS->LocateProtocol (
|
Status = gBS->LocateProtocol (
|
||||||
&gEfiIScsiInitiatorNameProtocolGuid,
|
&gEfiIScsiInitiatorNameProtocolGuid,
|
||||||
NULL,
|
NULL,
|
||||||
(VOID **) &IScsiInitiatorName
|
(VOID **)&IScsiInitiatorName
|
||||||
);
|
);
|
||||||
if (!EFI_ERROR (Status)) {
|
if (!EFI_ERROR (Status)) {
|
||||||
return EFI_ACCESS_DENIED;
|
return EFI_ACCESS_DENIED;
|
||||||
@ -1821,7 +1837,7 @@ IScsiDriverEntryPoint (
|
|||||||
Status = gBS->LocateProtocol (
|
Status = gBS->LocateProtocol (
|
||||||
&gEfiAuthenticationInfoProtocolGuid,
|
&gEfiAuthenticationInfoProtocolGuid,
|
||||||
NULL,
|
NULL,
|
||||||
(VOID **) &AuthenticationInfo
|
(VOID **)&AuthenticationInfo
|
||||||
);
|
);
|
||||||
if (Status == EFI_NOT_FOUND) {
|
if (Status == EFI_NOT_FOUND) {
|
||||||
Status = gBS->InstallProtocolInterface (
|
Status = gBS->InstallProtocolInterface (
|
||||||
@ -1873,4 +1889,3 @@ Error1:
|
|||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -21,10 +21,10 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
0x28be27e5, 0x66cc, 0x4a31, { 0xa3, 0x15, 0xdb, 0x14, 0xc3, 0x74, 0x4d, 0x85 } \
|
0x28be27e5, 0x66cc, 0x4a31, { 0xa3, 0x15, 0xdb, 0x14, 0xc3, 0x74, 0x4d, 0x85 } \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define ISCSI_INITIATOR_NAME_VAR_NAME L"I_NAME"
|
#define ISCSI_INITIATOR_NAME_VAR_NAME L"I_NAME"
|
||||||
|
|
||||||
#define IP_MODE_AUTOCONFIG_IP4 3
|
#define IP_MODE_AUTOCONFIG_IP4 3
|
||||||
#define IP_MODE_AUTOCONFIG_IP6 4
|
#define IP_MODE_AUTOCONFIG_IP6 4
|
||||||
#define ALWAYS_USE_UEFI_ISCSI_AND_IGNORE_ISCSI_HBA 0x00
|
#define ALWAYS_USE_UEFI_ISCSI_AND_IGNORE_ISCSI_HBA 0x00
|
||||||
#define STOP_UEFI_ISCSI_IF_HBA_INSTALL_AIP 0x01
|
#define STOP_UEFI_ISCSI_IF_HBA_INSTALL_AIP 0x01
|
||||||
#define STOP_UEFI_ISCSI_IF_AIP_SUPPORT_IP4 0x02
|
#define STOP_UEFI_ISCSI_IF_AIP_SUPPORT_IP4 0x02
|
||||||
@ -45,41 +45,41 @@ extern EFI_GUID gIScsiV4PrivateGuid;
|
|||||||
extern EFI_GUID gIScsiV6PrivateGuid;
|
extern EFI_GUID gIScsiV6PrivateGuid;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
CHAR16 PortString[ISCSI_NAME_IFR_MAX_SIZE];
|
CHAR16 PortString[ISCSI_NAME_IFR_MAX_SIZE];
|
||||||
LIST_ENTRY NicInfoList;
|
LIST_ENTRY NicInfoList;
|
||||||
UINT8 NicCount;
|
UINT8 NicCount;
|
||||||
UINT8 CurrentNic;
|
UINT8 CurrentNic;
|
||||||
UINT8 MaxNic;
|
UINT8 MaxNic;
|
||||||
BOOLEAN Ipv6Flag;
|
BOOLEAN Ipv6Flag;
|
||||||
BOOLEAN OneSessionEstablished;
|
BOOLEAN OneSessionEstablished;
|
||||||
BOOLEAN EnableMpio;
|
BOOLEAN EnableMpio;
|
||||||
UINT8 MpioCount; // The number of attempts in MPIO.
|
UINT8 MpioCount; // The number of attempts in MPIO.
|
||||||
UINT8 Krb5MpioCount; // The number of attempts login with KRB5 in MPIO.
|
UINT8 Krb5MpioCount; // The number of attempts login with KRB5 in MPIO.
|
||||||
UINT8 SinglePathCount; // The number of single path attempts.
|
UINT8 SinglePathCount; // The number of single path attempts.
|
||||||
UINT8 ValidSinglePathCount; // The number of valid single path attempts.
|
UINT8 ValidSinglePathCount; // The number of valid single path attempts.
|
||||||
UINT8 BootSelectedIndex;
|
UINT8 BootSelectedIndex;
|
||||||
UINT8 AttemptCount;
|
UINT8 AttemptCount;
|
||||||
LIST_ENTRY AttemptConfigs; // User configured Attempt list.
|
LIST_ENTRY AttemptConfigs; // User configured Attempt list.
|
||||||
CHAR8 InitiatorName[ISCSI_NAME_MAX_SIZE];
|
CHAR8 InitiatorName[ISCSI_NAME_MAX_SIZE];
|
||||||
UINTN InitiatorNameLength;
|
UINTN InitiatorNameLength;
|
||||||
} ISCSI_PRIVATE_DATA;
|
} ISCSI_PRIVATE_DATA;
|
||||||
|
|
||||||
extern ISCSI_PRIVATE_DATA *mPrivate;
|
extern ISCSI_PRIVATE_DATA *mPrivate;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
LIST_ENTRY Link;
|
LIST_ENTRY Link;
|
||||||
UINT32 HwAddressSize;
|
UINT32 HwAddressSize;
|
||||||
EFI_MAC_ADDRESS PermanentAddress;
|
EFI_MAC_ADDRESS PermanentAddress;
|
||||||
UINT8 NicIndex;
|
UINT8 NicIndex;
|
||||||
UINT16 VlanId;
|
UINT16 VlanId;
|
||||||
UINTN BusNumber;
|
UINTN BusNumber;
|
||||||
UINTN DeviceNumber;
|
UINTN DeviceNumber;
|
||||||
UINTN FunctionNumber;
|
UINTN FunctionNumber;
|
||||||
BOOLEAN Ipv6Available;
|
BOOLEAN Ipv6Available;
|
||||||
} ISCSI_NIC_INFO;
|
} ISCSI_NIC_INFO;
|
||||||
|
|
||||||
typedef struct _ISCSI_PRIVATE_PROTOCOL {
|
typedef struct _ISCSI_PRIVATE_PROTOCOL {
|
||||||
UINT32 Reserved;
|
UINT32 Reserved;
|
||||||
} ISCSI_PRIVATE_PROTOCOL;
|
} ISCSI_PRIVATE_PROTOCOL;
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -388,9 +388,9 @@ IScsiIp6DriverBindingStop (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
IScsiComponentNameGetDriverName (
|
IScsiComponentNameGetDriverName (
|
||||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||||
IN CHAR8 *Language,
|
IN CHAR8 *Language,
|
||||||
OUT CHAR16 **DriverName
|
OUT CHAR16 **DriverName
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -465,11 +465,11 @@ IScsiComponentNameGetDriverName (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
IScsiComponentNameGetControllerName (
|
IScsiComponentNameGetControllerName (
|
||||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||||
IN EFI_HANDLE ControllerHandle,
|
IN EFI_HANDLE ControllerHandle,
|
||||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||||
IN CHAR8 *Language,
|
IN CHAR8 *Language,
|
||||||
OUT CHAR16 **ControllerName
|
OUT CHAR16 **ControllerName
|
||||||
);
|
);
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -560,9 +560,9 @@ IScsiSetInitiatorName (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
IScsiGetAuthenticationInfo (
|
IScsiGetAuthenticationInfo (
|
||||||
IN EFI_AUTHENTICATION_INFO_PROTOCOL *This,
|
IN EFI_AUTHENTICATION_INFO_PROTOCOL *This,
|
||||||
IN EFI_HANDLE ControllerHandle,
|
IN EFI_HANDLE ControllerHandle,
|
||||||
OUT VOID **Buffer
|
OUT VOID **Buffer
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -641,11 +641,11 @@ IScsiSetAuthenticationInfo (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
IScsiExtScsiPassThruFunction (
|
IScsiExtScsiPassThruFunction (
|
||||||
IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
|
IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
|
||||||
IN UINT8 *Target,
|
IN UINT8 *Target,
|
||||||
IN UINT64 Lun,
|
IN UINT64 Lun,
|
||||||
IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet,
|
IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet,
|
||||||
IN EFI_EVENT Event OPTIONAL
|
IN EFI_EVENT Event OPTIONAL
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -8,7 +8,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
|
|
||||||
#include "IScsiImpl.h"
|
#include "IScsiImpl.h"
|
||||||
|
|
||||||
EFI_EXT_SCSI_PASS_THRU_PROTOCOL gIScsiExtScsiPassThruProtocolTemplate = {
|
EFI_EXT_SCSI_PASS_THRU_PROTOCOL gIScsiExtScsiPassThruProtocolTemplate = {
|
||||||
NULL,
|
NULL,
|
||||||
IScsiExtScsiPassThruFunction,
|
IScsiExtScsiPassThruFunction,
|
||||||
IScsiExtScsiPassThruGetNextTargetLun,
|
IScsiExtScsiPassThruGetNextTargetLun,
|
||||||
@ -19,7 +19,6 @@ EFI_EXT_SCSI_PASS_THRU_PROTOCOL gIScsiExtScsiPassThruProtocolTemplate = {
|
|||||||
IScsiExtScsiPassThruGetNextTarget
|
IScsiExtScsiPassThruGetNextTarget
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Sends a SCSI Request Packet to a SCSI device that is attached to the SCSI channel.
|
Sends a SCSI Request Packet to a SCSI device that is attached to the SCSI channel.
|
||||||
This function supports both blocking I/O and nonblocking I/O. The blocking I/O
|
This function supports both blocking I/O and nonblocking I/O. The blocking I/O
|
||||||
@ -73,11 +72,11 @@ EFI_EXT_SCSI_PASS_THRU_PROTOCOL gIScsiExtScsiPassThruProtocolTemplate = {
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
IScsiExtScsiPassThruFunction (
|
IScsiExtScsiPassThruFunction (
|
||||||
IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
|
IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
|
||||||
IN UINT8 *Target,
|
IN UINT8 *Target,
|
||||||
IN UINT64 Lun,
|
IN UINT64 Lun,
|
||||||
IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet,
|
IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet,
|
||||||
IN EFI_EVENT Event OPTIONAL
|
IN EFI_EVENT Event OPTIONAL
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
@ -107,7 +106,6 @@ IScsiExtScsiPassThruFunction (
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Used to retrieve the list of legal Target IDs and LUNs for SCSI devices on
|
Used to retrieve the list of legal Target IDs and LUNs for SCSI devices on
|
||||||
a SCSI channel. These can either be the list SCSI devices that are actually
|
a SCSI channel. These can either be the list SCSI devices that are actually
|
||||||
@ -145,14 +143,14 @@ IScsiExtScsiPassThruGetNextTargetLun (
|
|||||||
IN OUT UINT64 *Lun
|
IN OUT UINT64 *Lun
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
ISCSI_DRIVER_DATA *Private;
|
ISCSI_DRIVER_DATA *Private;
|
||||||
ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData;
|
ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData;
|
||||||
UINT8 TargetId[TARGET_MAX_BYTES];
|
UINT8 TargetId[TARGET_MAX_BYTES];
|
||||||
|
|
||||||
Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (This);
|
Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (This);
|
||||||
ConfigNvData = &Private->Session->ConfigData->SessionConfigData;
|
ConfigNvData = &Private->Session->ConfigData->SessionConfigData;
|
||||||
|
|
||||||
if ((*Target)[0] == 0 && (CompareMem (Lun, ConfigNvData->BootLun, sizeof (UINT64)) == 0)) {
|
if (((*Target)[0] == 0) && (CompareMem (Lun, ConfigNvData->BootLun, sizeof (UINT64)) == 0)) {
|
||||||
//
|
//
|
||||||
// Only one <Target, Lun> pair per iSCSI Driver instance.
|
// Only one <Target, Lun> pair per iSCSI Driver instance.
|
||||||
//
|
//
|
||||||
@ -170,7 +168,6 @@ IScsiExtScsiPassThruGetNextTargetLun (
|
|||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Allocate and build a device path node for a SCSI device on a SCSI channel.
|
Allocate and build a device path node for a SCSI device on a SCSI channel.
|
||||||
|
|
||||||
@ -206,12 +203,12 @@ IScsiExtScsiPassThruBuildDevicePath (
|
|||||||
IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
|
IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
ISCSI_DRIVER_DATA *Private;
|
ISCSI_DRIVER_DATA *Private;
|
||||||
ISCSI_SESSION *Session;
|
ISCSI_SESSION *Session;
|
||||||
ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData;
|
ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData;
|
||||||
ISCSI_CHAP_AUTH_CONFIG_NVDATA *AuthConfig;
|
ISCSI_CHAP_AUTH_CONFIG_NVDATA *AuthConfig;
|
||||||
EFI_DEV_PATH *Node;
|
EFI_DEV_PATH *Node;
|
||||||
UINTN DevPathNodeLen;
|
UINTN DevPathNodeLen;
|
||||||
|
|
||||||
if (DevicePath == NULL) {
|
if (DevicePath == NULL) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
@ -221,17 +218,17 @@ IScsiExtScsiPassThruBuildDevicePath (
|
|||||||
return EFI_NOT_FOUND;
|
return EFI_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (This);
|
Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (This);
|
||||||
Session = Private->Session;
|
Session = Private->Session;
|
||||||
ConfigNvData = &Session->ConfigData->SessionConfigData;
|
ConfigNvData = &Session->ConfigData->SessionConfigData;
|
||||||
AuthConfig = Session->AuthData.CHAP.AuthConfig;
|
AuthConfig = Session->AuthData.CHAP.AuthConfig;
|
||||||
|
|
||||||
if (CompareMem (&Lun, ConfigNvData->BootLun, sizeof (UINT64)) != 0) {
|
if (CompareMem (&Lun, ConfigNvData->BootLun, sizeof (UINT64)) != 0) {
|
||||||
return EFI_NOT_FOUND;
|
return EFI_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
DevPathNodeLen = sizeof (ISCSI_DEVICE_PATH) + AsciiStrLen (ConfigNvData->TargetName) + 1;
|
DevPathNodeLen = sizeof (ISCSI_DEVICE_PATH) + AsciiStrLen (ConfigNvData->TargetName) + 1;
|
||||||
Node = AllocateZeroPool (DevPathNodeLen);
|
Node = AllocateZeroPool (DevPathNodeLen);
|
||||||
if (Node == NULL) {
|
if (Node == NULL) {
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
@ -245,36 +242,36 @@ IScsiExtScsiPassThruBuildDevicePath (
|
|||||||
//
|
//
|
||||||
Node->Iscsi.NetworkProtocol = 0;
|
Node->Iscsi.NetworkProtocol = 0;
|
||||||
|
|
||||||
Node->Iscsi.LoginOption = 0;
|
Node->Iscsi.LoginOption = 0;
|
||||||
|
|
||||||
switch (Session->AuthType) {
|
switch (Session->AuthType) {
|
||||||
case ISCSI_AUTH_TYPE_NONE:
|
case ISCSI_AUTH_TYPE_NONE:
|
||||||
Node->Iscsi.LoginOption |= 0x0800;
|
Node->Iscsi.LoginOption |= 0x0800;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ISCSI_AUTH_TYPE_CHAP:
|
case ISCSI_AUTH_TYPE_CHAP:
|
||||||
//
|
//
|
||||||
// Bit12: 0=CHAP_BI, 1=CHAP_UNI
|
// Bit12: 0=CHAP_BI, 1=CHAP_UNI
|
||||||
//
|
//
|
||||||
if (AuthConfig->CHAPType == ISCSI_CHAP_UNI) {
|
if (AuthConfig->CHAPType == ISCSI_CHAP_UNI) {
|
||||||
Node->Iscsi.LoginOption |= 0x1000;
|
Node->Iscsi.LoginOption |= 0x1000;
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
break;
|
||||||
break;
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
CopyMem (&Node->Iscsi.Lun, ConfigNvData->BootLun, sizeof (UINT64));
|
CopyMem (&Node->Iscsi.Lun, ConfigNvData->BootLun, sizeof (UINT64));
|
||||||
Node->Iscsi.TargetPortalGroupTag = Session->TargetPortalGroupTag;
|
Node->Iscsi.TargetPortalGroupTag = Session->TargetPortalGroupTag;
|
||||||
AsciiStrCpyS ((CHAR8 *) Node + sizeof (ISCSI_DEVICE_PATH), AsciiStrLen (ConfigNvData->TargetName) + 1, ConfigNvData->TargetName);
|
AsciiStrCpyS ((CHAR8 *)Node + sizeof (ISCSI_DEVICE_PATH), AsciiStrLen (ConfigNvData->TargetName) + 1, ConfigNvData->TargetName);
|
||||||
|
|
||||||
*DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) Node;
|
*DevicePath = (EFI_DEVICE_PATH_PROTOCOL *)Node;
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Translate a device path node to a Target ID and LUN.
|
Translate a device path node to a Target ID and LUN.
|
||||||
|
|
||||||
@ -305,8 +302,8 @@ IScsiExtScsiPassThruGetTargetLun (
|
|||||||
OUT UINT64 *Lun
|
OUT UINT64 *Lun
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
ISCSI_DRIVER_DATA *Private;
|
ISCSI_DRIVER_DATA *Private;
|
||||||
ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData;
|
ISCSI_SESSION_CONFIG_NVDATA *ConfigNvData;
|
||||||
|
|
||||||
if ((DevicePath == NULL) || (Target == NULL) || (Lun == NULL)) {
|
if ((DevicePath == NULL) || (Target == NULL) || (Lun == NULL)) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
@ -315,17 +312,18 @@ IScsiExtScsiPassThruGetTargetLun (
|
|||||||
if ((DevicePath->Type != MESSAGING_DEVICE_PATH) ||
|
if ((DevicePath->Type != MESSAGING_DEVICE_PATH) ||
|
||||||
(DevicePath->SubType != MSG_ISCSI_DP) ||
|
(DevicePath->SubType != MSG_ISCSI_DP) ||
|
||||||
(DevicePathNodeLength (DevicePath) <= sizeof (ISCSI_DEVICE_PATH))
|
(DevicePathNodeLength (DevicePath) <= sizeof (ISCSI_DEVICE_PATH))
|
||||||
) {
|
)
|
||||||
|
{
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (This);
|
Private = ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU (This);
|
||||||
ConfigNvData = &Private->Session->ConfigData->SessionConfigData;
|
ConfigNvData = &Private->Session->ConfigData->SessionConfigData;
|
||||||
|
|
||||||
SetMem (*Target, TARGET_MAX_BYTES, 0xFF);
|
SetMem (*Target, TARGET_MAX_BYTES, 0xFF);
|
||||||
(*Target)[0] = 0;
|
(*Target)[0] = 0;
|
||||||
|
|
||||||
if (AsciiStrCmp (ConfigNvData->TargetName, (CHAR8 *) DevicePath + sizeof (ISCSI_DEVICE_PATH)) != 0) {
|
if (AsciiStrCmp (ConfigNvData->TargetName, (CHAR8 *)DevicePath + sizeof (ISCSI_DEVICE_PATH)) != 0) {
|
||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -334,7 +332,6 @@ IScsiExtScsiPassThruGetTargetLun (
|
|||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Resets a SCSI channel. This operation resets all the SCSI devices connected to
|
Resets a SCSI channel. This operation resets all the SCSI devices connected to
|
||||||
the SCSI channel.
|
the SCSI channel.
|
||||||
@ -353,7 +350,6 @@ IScsiExtScsiPassThruResetChannel (
|
|||||||
return EFI_UNSUPPORTED;
|
return EFI_UNSUPPORTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Resets a SCSI device that is connected to a SCSI channel.
|
Resets a SCSI device that is connected to a SCSI channel.
|
||||||
|
|
||||||
@ -403,7 +399,7 @@ IScsiExtScsiPassThruGetNextTarget (
|
|||||||
IN OUT UINT8 **Target
|
IN OUT UINT8 **Target
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINT8 TargetId[TARGET_MAX_BYTES];
|
UINT8 TargetId[TARGET_MAX_BYTES];
|
||||||
|
|
||||||
SetMem (TargetId, TARGET_MAX_BYTES, 0xFF);
|
SetMem (TargetId, TARGET_MAX_BYTES, 0xFF);
|
||||||
|
|
||||||
@ -416,4 +412,3 @@ IScsiExtScsiPassThruGetNextTarget (
|
|||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,8 +8,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
|
|
||||||
#include "IScsiImpl.h"
|
#include "IScsiImpl.h"
|
||||||
|
|
||||||
BOOLEAN mIbftInstalled = FALSE;
|
BOOLEAN mIbftInstalled = FALSE;
|
||||||
UINTN mTableKey;
|
UINTN mTableKey;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Initialize the header of the iSCSI Boot Firmware Table.
|
Initialize the header of the iSCSI Boot Firmware Table.
|
||||||
@ -21,9 +21,9 @@ UINTN mTableKey;
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
IScsiInitIbfTableHeader (
|
IScsiInitIbfTableHeader (
|
||||||
OUT EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER *Header,
|
OUT EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_HEADER *Header,
|
||||||
IN UINT8 *OemId,
|
IN UINT8 *OemId,
|
||||||
IN UINT64 *OemTableId
|
IN UINT64 *OemTableId
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
Header->Signature = EFI_ACPI_3_0_ISCSI_BOOT_FIRMWARE_TABLE_SIGNATURE;
|
Header->Signature = EFI_ACPI_3_0_ISCSI_BOOT_FIRMWARE_TABLE_SIGNATURE;
|
||||||
@ -35,7 +35,6 @@ IScsiInitIbfTableHeader (
|
|||||||
CopyMem (&Header->OemTableId, OemTableId, sizeof (UINT64));
|
CopyMem (&Header->OemTableId, OemTableId, sizeof (UINT64));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Initialize the control section of the iSCSI Boot Firmware Table.
|
Initialize the control section of the iSCSI Boot Firmware Table.
|
||||||
|
|
||||||
@ -50,11 +49,11 @@ IScsiInitControlSection (
|
|||||||
EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *Control;
|
EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *Control;
|
||||||
UINTN NumOffset;
|
UINTN NumOffset;
|
||||||
|
|
||||||
Control = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *) (Table + 1);
|
Control = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *)(Table + 1);
|
||||||
|
|
||||||
Control->Header.StructureId = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE_ID;
|
Control->Header.StructureId = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE_ID;
|
||||||
Control->Header.Version = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE_VERSION;
|
Control->Header.Version = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE_VERSION;
|
||||||
Control->Header.Length = (UINT16) sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE);
|
Control->Header.Length = (UINT16)sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE);
|
||||||
|
|
||||||
//
|
//
|
||||||
// If in multipathing mode, enable the Boot Failover Flag.
|
// If in multipathing mode, enable the Boot Failover Flag.
|
||||||
@ -65,7 +64,7 @@ IScsiInitControlSection (
|
|||||||
//
|
//
|
||||||
if (mPrivate->EnableMpio) {
|
if (mPrivate->EnableMpio) {
|
||||||
Control->Header.Flags = 0;
|
Control->Header.Flags = 0;
|
||||||
NumOffset = 2 * (mPrivate->MpioCount - mPrivate->Krb5MpioCount);
|
NumOffset = 2 * (mPrivate->MpioCount - mPrivate->Krb5MpioCount);
|
||||||
} else {
|
} else {
|
||||||
NumOffset = 2 * mPrivate->ValidSinglePathCount;
|
NumOffset = 2 * mPrivate->ValidSinglePathCount;
|
||||||
}
|
}
|
||||||
@ -79,11 +78,10 @@ IScsiInitControlSection (
|
|||||||
// Need expand the control section if more than 2 NIC/Target attempts
|
// Need expand the control section if more than 2 NIC/Target attempts
|
||||||
// exist.
|
// exist.
|
||||||
//
|
//
|
||||||
Control->Header.Length = (UINT16) (Control->Header.Length + (NumOffset - 4) * sizeof (UINT16));
|
Control->Header.Length = (UINT16)(Control->Header.Length + (NumOffset - 4) * sizeof (UINT16));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Add one item into the heap.
|
Add one item into the heap.
|
||||||
|
|
||||||
@ -109,7 +107,6 @@ IScsiAddHeapItem (
|
|||||||
*(*Heap + Len) = 0;
|
*(*Heap + Len) = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Fill the Initiator section of the iSCSI Boot Firmware Table.
|
Fill the Initiator section of the iSCSI Boot Firmware Table.
|
||||||
|
|
||||||
@ -126,19 +123,19 @@ IScsiFillInitiatorSection (
|
|||||||
EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *Control;
|
EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *Control;
|
||||||
EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE *Initiator;
|
EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE *Initiator;
|
||||||
|
|
||||||
Control = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *) (Table + 1);
|
Control = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *)(Table + 1);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Initiator section immediately follows the control section.
|
// Initiator section immediately follows the control section.
|
||||||
//
|
//
|
||||||
Initiator = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE *)
|
Initiator = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE *)
|
||||||
((UINT8 *) Control + IBFT_ROUNDUP (Control->Header.Length));
|
((UINT8 *)Control + IBFT_ROUNDUP (Control->Header.Length));
|
||||||
|
|
||||||
Control->InitiatorOffset = (UINT16) ((UINTN) Initiator - (UINTN) Table);
|
Control->InitiatorOffset = (UINT16)((UINTN)Initiator - (UINTN)Table);
|
||||||
|
|
||||||
Initiator->Header.StructureId = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_ID;
|
Initiator->Header.StructureId = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_ID;
|
||||||
Initiator->Header.Version = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_VERSION;
|
Initiator->Header.Version = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_VERSION;
|
||||||
Initiator->Header.Length = (UINT16) sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE);
|
Initiator->Header.Length = (UINT16)sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE);
|
||||||
Initiator->Header.Flags = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_FLAG_BLOCK_VALID |
|
Initiator->Header.Flags = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_FLAG_BLOCK_VALID |
|
||||||
EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_FLAG_BOOT_SELECTED;
|
EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE_FLAG_BOOT_SELECTED;
|
||||||
|
|
||||||
@ -147,11 +144,10 @@ IScsiFillInitiatorSection (
|
|||||||
//
|
//
|
||||||
IScsiAddHeapItem (Heap, mPrivate->InitiatorName, mPrivate->InitiatorNameLength - 1);
|
IScsiAddHeapItem (Heap, mPrivate->InitiatorName, mPrivate->InitiatorNameLength - 1);
|
||||||
|
|
||||||
Initiator->IScsiNameLength = (UINT16) (mPrivate->InitiatorNameLength - 1);
|
Initiator->IScsiNameLength = (UINT16)(mPrivate->InitiatorNameLength - 1);
|
||||||
Initiator->IScsiNameOffset = (UINT16) ((UINTN) *Heap - (UINTN) Table);
|
Initiator->IScsiNameOffset = (UINT16)((UINTN)*Heap - (UINTN)Table);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Map the v4 IP address into v6 IP address.
|
Map the v4 IP address into v6 IP address.
|
||||||
|
|
||||||
@ -161,23 +157,22 @@ IScsiFillInitiatorSection (
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
IScsiMapV4ToV6Addr (
|
IScsiMapV4ToV6Addr (
|
||||||
IN EFI_IPv4_ADDRESS *V4,
|
IN EFI_IPv4_ADDRESS *V4,
|
||||||
OUT EFI_IPv6_ADDRESS *V6
|
OUT EFI_IPv6_ADDRESS *V6
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
|
|
||||||
ZeroMem (V6, sizeof (EFI_IPv6_ADDRESS));
|
ZeroMem (V6, sizeof (EFI_IPv6_ADDRESS));
|
||||||
|
|
||||||
V6->Addr[10] = 0xff;
|
V6->Addr[10] = 0xff;
|
||||||
V6->Addr[11] = 0xff;
|
V6->Addr[11] = 0xff;
|
||||||
|
|
||||||
for (Index = 0; Index < 4; Index++) {
|
for (Index = 0; Index < 4; Index++) {
|
||||||
V6->Addr[12 + Index] = V4->Addr[Index];
|
V6->Addr[12 + Index] = V4->Addr[Index];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Fill the NIC and target sections in iSCSI Boot Firmware Table.
|
Fill the NIC and target sections in iSCSI Boot Firmware Table.
|
||||||
|
|
||||||
@ -208,11 +203,11 @@ IScsiFillNICAndTargetSections (
|
|||||||
//
|
//
|
||||||
// Get the offset of the first Nic and Target section.
|
// Get the offset of the first Nic and Target section.
|
||||||
//
|
//
|
||||||
Control = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *) (Table + 1);
|
Control = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_CONTROL_STRUCTURE *)(Table + 1);
|
||||||
Nic = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE *) ((UINTN) Table +
|
Nic = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE *)((UINTN)Table +
|
||||||
Control->InitiatorOffset + IBFT_ROUNDUP (sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE)));
|
Control->InitiatorOffset + IBFT_ROUNDUP (sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_INITIATOR_STRUCTURE)));
|
||||||
Target = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE *) ((UINTN) Nic +
|
Target = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE *)((UINTN)Nic +
|
||||||
IBFT_ROUNDUP (sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE)));
|
IBFT_ROUNDUP (sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE)));
|
||||||
|
|
||||||
SectionOffset = &Control->NIC0Offset;
|
SectionOffset = &Control->NIC0Offset;
|
||||||
|
|
||||||
@ -233,11 +228,10 @@ IScsiFillNICAndTargetSections (
|
|||||||
}
|
}
|
||||||
|
|
||||||
ASSERT (Attempt->SessionConfigData.Enabled != ISCSI_DISABLED);
|
ASSERT (Attempt->SessionConfigData.Enabled != ISCSI_DISABLED);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
if (Index == 1 && Flag) {
|
if ((Index == 1) && Flag) {
|
||||||
Entry = mPrivate->AttemptConfigs.ForwardLink;
|
Entry = mPrivate->AttemptConfigs.ForwardLink;
|
||||||
Flag = FALSE;
|
Flag = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
Attempt = NET_LIST_USER_STRUCT (Entry, ISCSI_ATTEMPT_CONFIG_NVDATA, Link);
|
Attempt = NET_LIST_USER_STRUCT (Entry, ISCSI_ATTEMPT_CONFIG_NVDATA, Link);
|
||||||
@ -260,7 +254,7 @@ IScsiFillNICAndTargetSections (
|
|||||||
//
|
//
|
||||||
// If multipath mode is enabled, only the attempts in MPIO will be recorded in iBFT.
|
// If multipath mode is enabled, only the attempts in MPIO will be recorded in iBFT.
|
||||||
//
|
//
|
||||||
if (mPrivate->EnableMpio && Attempt->SessionConfigData.Enabled != ISCSI_ENABLED_FOR_MPIO) {
|
if (mPrivate->EnableMpio && (Attempt->SessionConfigData.Enabled != ISCSI_ENABLED_FOR_MPIO)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -280,13 +274,13 @@ IScsiFillNICAndTargetSections (
|
|||||||
|
|
||||||
Nic->Header.StructureId = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_ID;
|
Nic->Header.StructureId = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_ID;
|
||||||
Nic->Header.Version = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_VERSION;
|
Nic->Header.Version = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_VERSION;
|
||||||
Nic->Header.Length = (UINT16) sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE);
|
Nic->Header.Length = (UINT16)sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE);
|
||||||
Nic->Header.Index = (UINT8) Index;
|
Nic->Header.Index = (UINT8)Index;
|
||||||
Nic->Header.Flags = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_FLAG_BLOCK_VALID |
|
Nic->Header.Flags = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_FLAG_BLOCK_VALID |
|
||||||
EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_FLAG_GLOBAL;
|
EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_FLAG_GLOBAL;
|
||||||
|
|
||||||
if (Index == 0) {
|
if (Index == 0) {
|
||||||
Nic->Header.Flags |= EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_FLAG_BOOT_SELECTED;
|
Nic->Header.Flags |= EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE_FLAG_BOOT_SELECTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (NvData->InitiatorInfoFromDhcp) {
|
if (NvData->InitiatorInfoFromDhcp) {
|
||||||
@ -295,7 +289,7 @@ IScsiFillNICAndTargetSections (
|
|||||||
Nic->Origin = IpPrefixOriginManual;
|
Nic->Origin = IpPrefixOriginManual;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (NvData->IpMode == IP_MODE_IP4 || NvData->IpMode == IP_MODE_AUTOCONFIG) {
|
if ((NvData->IpMode == IP_MODE_IP4) || (NvData->IpMode == IP_MODE_AUTOCONFIG)) {
|
||||||
//
|
//
|
||||||
// Get the subnet mask prefix length.
|
// Get the subnet mask prefix length.
|
||||||
//
|
//
|
||||||
@ -309,16 +303,13 @@ IScsiFillNICAndTargetSections (
|
|||||||
IScsiMapV4ToV6Addr (&Attempt->PrimaryDns.v4, &Nic->PrimaryDns);
|
IScsiMapV4ToV6Addr (&Attempt->PrimaryDns.v4, &Nic->PrimaryDns);
|
||||||
IScsiMapV4ToV6Addr (&Attempt->SecondaryDns.v4, &Nic->SecondaryDns);
|
IScsiMapV4ToV6Addr (&Attempt->SecondaryDns.v4, &Nic->SecondaryDns);
|
||||||
IScsiMapV4ToV6Addr (&Attempt->DhcpServer.v4, &Nic->DhcpServer);
|
IScsiMapV4ToV6Addr (&Attempt->DhcpServer.v4, &Nic->DhcpServer);
|
||||||
|
} else if ((NvData->IpMode == IP_MODE_IP6) || (NvData->IpMode == IP_MODE_AUTOCONFIG)) {
|
||||||
} else if (NvData->IpMode == IP_MODE_IP6 || NvData->IpMode == IP_MODE_AUTOCONFIG) {
|
|
||||||
|
|
||||||
Nic->SubnetMaskPrefixLength = NvData->PrefixLength;
|
Nic->SubnetMaskPrefixLength = NvData->PrefixLength;
|
||||||
CopyMem (&Nic->Ip, &NvData->LocalIp, sizeof (EFI_IPv6_ADDRESS));
|
CopyMem (&Nic->Ip, &NvData->LocalIp, sizeof (EFI_IPv6_ADDRESS));
|
||||||
CopyMem (&Nic->Gateway, &NvData->Gateway, sizeof (EFI_IPv6_ADDRESS));
|
CopyMem (&Nic->Gateway, &NvData->Gateway, sizeof (EFI_IPv6_ADDRESS));
|
||||||
CopyMem (&Nic->PrimaryDns, &Attempt->PrimaryDns, sizeof (EFI_IPv6_ADDRESS));
|
CopyMem (&Nic->PrimaryDns, &Attempt->PrimaryDns, sizeof (EFI_IPv6_ADDRESS));
|
||||||
CopyMem (&Nic->SecondaryDns, &Attempt->SecondaryDns, sizeof (EFI_IPv6_ADDRESS));
|
CopyMem (&Nic->SecondaryDns, &Attempt->SecondaryDns, sizeof (EFI_IPv6_ADDRESS));
|
||||||
CopyMem (&Nic->DhcpServer, &Attempt->DhcpServer, sizeof (EFI_IPv6_ADDRESS));
|
CopyMem (&Nic->DhcpServer, &Attempt->DhcpServer, sizeof (EFI_IPv6_ADDRESS));
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
ASSERT (FALSE);
|
ASSERT (FALSE);
|
||||||
}
|
}
|
||||||
@ -331,26 +322,26 @@ IScsiFillNICAndTargetSections (
|
|||||||
|
|
||||||
Nic->VLanTag = NicInfo->VlanId;
|
Nic->VLanTag = NicInfo->VlanId;
|
||||||
CopyMem (Nic->Mac, &NicInfo->PermanentAddress, sizeof (Nic->Mac));
|
CopyMem (Nic->Mac, &NicInfo->PermanentAddress, sizeof (Nic->Mac));
|
||||||
Nic->PciLocation = (UINT16) ((NicInfo->BusNumber << 8) |
|
Nic->PciLocation = (UINT16)((NicInfo->BusNumber << 8) |
|
||||||
(NicInfo->DeviceNumber << 3) | NicInfo->FunctionNumber);
|
(NicInfo->DeviceNumber << 3) | NicInfo->FunctionNumber);
|
||||||
*SectionOffset = (UINT16) ((UINTN) Nic - (UINTN) Table);
|
*SectionOffset = (UINT16)((UINTN)Nic - (UINTN)Table);
|
||||||
SectionOffset++;
|
SectionOffset++;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Fill the Target section.
|
// Fill the Target section.
|
||||||
//
|
//
|
||||||
|
|
||||||
Target->Header.StructureId = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_ID;
|
Target->Header.StructureId = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_ID;
|
||||||
Target->Header.Version = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_VERSION;
|
Target->Header.Version = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_VERSION;
|
||||||
Target->Header.Length = (UINT16) sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE);
|
Target->Header.Length = (UINT16)sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE);
|
||||||
Target->Header.Index = (UINT8) Index;
|
Target->Header.Index = (UINT8)Index;
|
||||||
Target->Header.Flags = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_FLAG_BLOCK_VALID;
|
Target->Header.Flags = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_FLAG_BLOCK_VALID;
|
||||||
|
|
||||||
if (Index == 0) {
|
if (Index == 0) {
|
||||||
Target->Header.Flags |= EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_FLAG_BOOT_SELECTED;
|
Target->Header.Flags |= EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_FLAG_BOOT_SELECTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
Target->Port = NvData->TargetPort;
|
Target->Port = NvData->TargetPort;
|
||||||
|
|
||||||
if (Attempt->AuthenticationType == ISCSI_AUTH_TYPE_CHAP) {
|
if (Attempt->AuthenticationType == ISCSI_AUTH_TYPE_CHAP) {
|
||||||
if (AuthConfig->CHAPType == ISCSI_CHAP_UNI) {
|
if (AuthConfig->CHAPType == ISCSI_CHAP_UNI) {
|
||||||
@ -362,11 +353,11 @@ IScsiFillNICAndTargetSections (
|
|||||||
Target->CHAPType = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYPE_NO_CHAP;
|
Target->CHAPType = EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYPE_NO_CHAP;
|
||||||
}
|
}
|
||||||
|
|
||||||
Target->NicIndex = (UINT8) Index;
|
Target->NicIndex = (UINT8)Index;
|
||||||
|
|
||||||
if (NvData->IpMode == IP_MODE_IP4 || NvData->IpMode == IP_MODE_AUTOCONFIG) {
|
if ((NvData->IpMode == IP_MODE_IP4) || (NvData->IpMode == IP_MODE_AUTOCONFIG)) {
|
||||||
IScsiMapV4ToV6Addr (&NvData->TargetIp.v4, &Target->Ip);
|
IScsiMapV4ToV6Addr (&NvData->TargetIp.v4, &Target->Ip);
|
||||||
} else if (NvData->IpMode == IP_MODE_IP6 || NvData->IpMode == IP_MODE_AUTOCONFIG) {
|
} else if ((NvData->IpMode == IP_MODE_IP6) || (NvData->IpMode == IP_MODE_AUTOCONFIG)) {
|
||||||
CopyMem (&Target->Ip, &NvData->TargetIp, sizeof (EFI_IPv6_ADDRESS));
|
CopyMem (&Target->Ip, &NvData->TargetIp, sizeof (EFI_IPv6_ADDRESS));
|
||||||
} else {
|
} else {
|
||||||
ASSERT (FALSE);
|
ASSERT (FALSE);
|
||||||
@ -377,64 +368,63 @@ IScsiFillNICAndTargetSections (
|
|||||||
//
|
//
|
||||||
// Target iSCSI Name, CHAP name/secret, reverse CHAP name/secret.
|
// Target iSCSI Name, CHAP name/secret, reverse CHAP name/secret.
|
||||||
//
|
//
|
||||||
Length = (UINT16) AsciiStrLen (NvData->TargetName);
|
Length = (UINT16)AsciiStrLen (NvData->TargetName);
|
||||||
IScsiAddHeapItem (Heap, NvData->TargetName, Length);
|
IScsiAddHeapItem (Heap, NvData->TargetName, Length);
|
||||||
|
|
||||||
Target->IScsiNameLength = Length;
|
Target->IScsiNameLength = Length;
|
||||||
Target->IScsiNameOffset = (UINT16) ((UINTN) *Heap - (UINTN) Table);
|
Target->IScsiNameOffset = (UINT16)((UINTN)*Heap - (UINTN)Table);
|
||||||
|
|
||||||
if (Attempt->AuthenticationType == ISCSI_AUTH_TYPE_CHAP) {
|
if (Attempt->AuthenticationType == ISCSI_AUTH_TYPE_CHAP) {
|
||||||
//
|
//
|
||||||
// CHAP Name
|
// CHAP Name
|
||||||
//
|
//
|
||||||
Length = (UINT16) AsciiStrLen (AuthConfig->CHAPName);
|
Length = (UINT16)AsciiStrLen (AuthConfig->CHAPName);
|
||||||
IScsiAddHeapItem (Heap, AuthConfig->CHAPName, Length);
|
IScsiAddHeapItem (Heap, AuthConfig->CHAPName, Length);
|
||||||
Target->CHAPNameLength = Length;
|
Target->CHAPNameLength = Length;
|
||||||
Target->CHAPNameOffset = (UINT16) ((UINTN) *Heap - (UINTN) Table);
|
Target->CHAPNameOffset = (UINT16)((UINTN)*Heap - (UINTN)Table);
|
||||||
|
|
||||||
//
|
//
|
||||||
// CHAP Secret
|
// CHAP Secret
|
||||||
//
|
//
|
||||||
Length = (UINT16) AsciiStrLen (AuthConfig->CHAPSecret);
|
Length = (UINT16)AsciiStrLen (AuthConfig->CHAPSecret);
|
||||||
IScsiAddHeapItem (Heap, AuthConfig->CHAPSecret, Length);
|
IScsiAddHeapItem (Heap, AuthConfig->CHAPSecret, Length);
|
||||||
Target->CHAPSecretLength = Length;
|
Target->CHAPSecretLength = Length;
|
||||||
Target->CHAPSecretOffset = (UINT16) ((UINTN) *Heap - (UINTN) Table);
|
Target->CHAPSecretOffset = (UINT16)((UINTN)*Heap - (UINTN)Table);
|
||||||
|
|
||||||
if (Target->CHAPType == EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYPE_MUTUAL_CHAP) {
|
if (Target->CHAPType == EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE_CHAP_TYPE_MUTUAL_CHAP) {
|
||||||
//
|
//
|
||||||
// Reverse CHAP Name.
|
// Reverse CHAP Name.
|
||||||
//
|
//
|
||||||
Length = (UINT16) AsciiStrLen (AuthConfig->ReverseCHAPName);
|
Length = (UINT16)AsciiStrLen (AuthConfig->ReverseCHAPName);
|
||||||
IScsiAddHeapItem (Heap, AuthConfig->ReverseCHAPName, Length);
|
IScsiAddHeapItem (Heap, AuthConfig->ReverseCHAPName, Length);
|
||||||
Target->ReverseCHAPNameLength = Length;
|
Target->ReverseCHAPNameLength = Length;
|
||||||
Target->ReverseCHAPNameOffset = (UINT16) ((UINTN) *Heap - (UINTN) Table);
|
Target->ReverseCHAPNameOffset = (UINT16)((UINTN)*Heap - (UINTN)Table);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Reverse CHAP Secret.
|
// Reverse CHAP Secret.
|
||||||
//
|
//
|
||||||
Length = (UINT16) AsciiStrLen (AuthConfig->ReverseCHAPSecret);
|
Length = (UINT16)AsciiStrLen (AuthConfig->ReverseCHAPSecret);
|
||||||
IScsiAddHeapItem (Heap, AuthConfig->ReverseCHAPSecret, Length);
|
IScsiAddHeapItem (Heap, AuthConfig->ReverseCHAPSecret, Length);
|
||||||
Target->ReverseCHAPSecretLength = Length;
|
Target->ReverseCHAPSecretLength = Length;
|
||||||
Target->ReverseCHAPSecretOffset = (UINT16) ((UINTN) *Heap - (UINTN) Table);
|
Target->ReverseCHAPSecretOffset = (UINT16)((UINTN)*Heap - (UINTN)Table);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
*SectionOffset = (UINT16) ((UINTN) Target - (UINTN) Table);
|
*SectionOffset = (UINT16)((UINTN)Target - (UINTN)Table);
|
||||||
SectionOffset++;
|
SectionOffset++;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Advance to the next NIC/Target pair.
|
// Advance to the next NIC/Target pair.
|
||||||
//
|
//
|
||||||
Nic = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE *) ((UINTN) Target +
|
Nic = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE *)((UINTN)Target +
|
||||||
IBFT_ROUNDUP (sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE)));
|
IBFT_ROUNDUP (sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE)));
|
||||||
Target = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE *) ((UINTN) Nic +
|
Target = (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_TARGET_STRUCTURE *)((UINTN)Nic +
|
||||||
IBFT_ROUNDUP (sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE)));
|
IBFT_ROUNDUP (sizeof (EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_NIC_STRUCTURE)));
|
||||||
|
|
||||||
Index++;
|
Index++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Publish and remove the iSCSI Boot Firmware Table according to the iSCSI
|
Publish and remove the iSCSI Boot Firmware Table according to the iSCSI
|
||||||
session status.
|
session status.
|
||||||
@ -457,29 +447,29 @@ IScsiPublishIbft (
|
|||||||
Rsdt = NULL;
|
Rsdt = NULL;
|
||||||
Xsdt = NULL;
|
Xsdt = NULL;
|
||||||
|
|
||||||
Status = gBS->LocateProtocol (&gEfiAcpiTableProtocolGuid, NULL, (VOID **) &AcpiTableProtocol);
|
Status = gBS->LocateProtocol (&gEfiAcpiTableProtocolGuid, NULL, (VOID **)&AcpiTableProtocol);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return ;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Find ACPI table RSD_PTR from the system table.
|
// Find ACPI table RSD_PTR from the system table.
|
||||||
//
|
//
|
||||||
Status = EfiGetSystemConfigurationTable (&gEfiAcpiTableGuid, (VOID **) &Rsdp);
|
Status = EfiGetSystemConfigurationTable (&gEfiAcpiTableGuid, (VOID **)&Rsdp);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
Status = EfiGetSystemConfigurationTable (&gEfiAcpi10TableGuid, (VOID **) &Rsdp);
|
Status = EfiGetSystemConfigurationTable (&gEfiAcpi10TableGuid, (VOID **)&Rsdp);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (EFI_ERROR (Status) || (Rsdp == NULL)) {
|
if (EFI_ERROR (Status) || (Rsdp == NULL)) {
|
||||||
return ;
|
return;
|
||||||
} else if (Rsdp->Revision >= EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER_REVISION && Rsdp->XsdtAddress != 0) {
|
} else if ((Rsdp->Revision >= EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER_REVISION) && (Rsdp->XsdtAddress != 0)) {
|
||||||
Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *) (UINTN) Rsdp->XsdtAddress;
|
Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)Rsdp->XsdtAddress;
|
||||||
} else if (Rsdp->RsdtAddress != 0) {
|
} else if (Rsdp->RsdtAddress != 0) {
|
||||||
Rsdt = (EFI_ACPI_DESCRIPTION_HEADER *) (UINTN) Rsdp->RsdtAddress;
|
Rsdt = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)Rsdp->RsdtAddress;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((Xsdt == NULL) && (Rsdt == NULL)) {
|
if ((Xsdt == NULL) && (Rsdt == NULL)) {
|
||||||
return ;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mIbftInstalled) {
|
if (mIbftInstalled) {
|
||||||
@ -488,17 +478,19 @@ IScsiPublishIbft (
|
|||||||
mTableKey
|
mTableKey
|
||||||
);
|
);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return ;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
mIbftInstalled = FALSE;
|
mIbftInstalled = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// If there is no valid attempt configuration, just return.
|
// If there is no valid attempt configuration, just return.
|
||||||
//
|
//
|
||||||
if ((!mPrivate->EnableMpio && mPrivate->ValidSinglePathCount == 0) ||
|
if ((!mPrivate->EnableMpio && (mPrivate->ValidSinglePathCount == 0)) ||
|
||||||
(mPrivate->EnableMpio && mPrivate->MpioCount <= mPrivate->Krb5MpioCount)) {
|
(mPrivate->EnableMpio && (mPrivate->MpioCount <= mPrivate->Krb5MpioCount)))
|
||||||
return ;
|
{
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -506,10 +498,10 @@ IScsiPublishIbft (
|
|||||||
//
|
//
|
||||||
Table = AllocateZeroPool (IBFT_MAX_SIZE);
|
Table = AllocateZeroPool (IBFT_MAX_SIZE);
|
||||||
if (Table == NULL) {
|
if (Table == NULL) {
|
||||||
return ;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Heap = (UINT8 *) Table + IBFT_HEAP_OFFSET;
|
Heap = (UINT8 *)Table + IBFT_HEAP_OFFSET;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Fill in the various section of the iSCSI Boot Firmware Table.
|
// Fill in the various section of the iSCSI Boot Firmware Table.
|
||||||
@ -524,7 +516,7 @@ IScsiPublishIbft (
|
|||||||
IScsiFillInitiatorSection (Table, &Heap);
|
IScsiFillInitiatorSection (Table, &Heap);
|
||||||
IScsiFillNICAndTargetSections (Table, &Heap);
|
IScsiFillNICAndTargetSections (Table, &Heap);
|
||||||
|
|
||||||
Checksum = CalculateCheckSum8((UINT8 *)Table, Table->Length);
|
Checksum = CalculateCheckSum8 ((UINT8 *)Table, Table->Length);
|
||||||
Table->Checksum = Checksum;
|
Table->Checksum = Checksum;
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -536,7 +528,7 @@ IScsiPublishIbft (
|
|||||||
Table->Length,
|
Table->Length,
|
||||||
&mTableKey
|
&mTableKey
|
||||||
);
|
);
|
||||||
if (EFI_ERROR(Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,9 +14,9 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#include <Protocol/AcpiTable.h>
|
#include <Protocol/AcpiTable.h>
|
||||||
#include <Protocol/PciIo.h>
|
#include <Protocol/PciIo.h>
|
||||||
|
|
||||||
#define IBFT_TABLE_VAR_NAME L"iBFT"
|
#define IBFT_TABLE_VAR_NAME L"iBFT"
|
||||||
#define IBFT_MAX_SIZE 4096
|
#define IBFT_MAX_SIZE 4096
|
||||||
#define IBFT_HEAP_OFFSET 2048
|
#define IBFT_HEAP_OFFSET 2048
|
||||||
|
|
||||||
#define IBFT_ROUNDUP(size) NET_ROUNDUP ((size), EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_STRUCTURE_ALIGNMENT)
|
#define IBFT_ROUNDUP(size) NET_ROUNDUP ((size), EFI_ACPI_ISCSI_BOOT_FIRMWARE_TABLE_STRUCTURE_ALIGNMENT)
|
||||||
|
|
||||||
|
@ -67,105 +67,105 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#include "IScsiDns.h"
|
#include "IScsiDns.h"
|
||||||
#include "IScsiConfig.h"
|
#include "IScsiConfig.h"
|
||||||
|
|
||||||
#define ISCSI_AUTH_INITIAL 0
|
#define ISCSI_AUTH_INITIAL 0
|
||||||
|
|
||||||
#define ISCSI_SESSION_SIGNATURE SIGNATURE_32 ('I', 'S', 'S', 'N')
|
#define ISCSI_SESSION_SIGNATURE SIGNATURE_32 ('I', 'S', 'S', 'N')
|
||||||
///
|
///
|
||||||
/// 10 seconds
|
/// 10 seconds
|
||||||
///
|
///
|
||||||
#define ISCSI_GET_MAPPING_TIMEOUT 100000000U
|
#define ISCSI_GET_MAPPING_TIMEOUT 100000000U
|
||||||
///
|
///
|
||||||
/// 3 seconds
|
/// 3 seconds
|
||||||
///
|
///
|
||||||
#define ISCSI_WAIT_IPSEC_TIMEOUT 30000000U
|
#define ISCSI_WAIT_IPSEC_TIMEOUT 30000000U
|
||||||
|
|
||||||
struct _ISCSI_SESSION {
|
struct _ISCSI_SESSION {
|
||||||
UINT32 Signature;
|
UINT32 Signature;
|
||||||
|
|
||||||
ISCSI_DRIVER_DATA *Private;
|
ISCSI_DRIVER_DATA *Private;
|
||||||
ISCSI_ATTEMPT_CONFIG_NVDATA *ConfigData;
|
ISCSI_ATTEMPT_CONFIG_NVDATA *ConfigData;
|
||||||
|
|
||||||
UINT8 AuthType;
|
UINT8 AuthType;
|
||||||
union {
|
union {
|
||||||
ISCSI_CHAP_AUTH_DATA CHAP;
|
ISCSI_CHAP_AUTH_DATA CHAP;
|
||||||
} AuthData;
|
} AuthData;
|
||||||
|
|
||||||
UINT8 State;
|
UINT8 State;
|
||||||
|
|
||||||
UINT8 Isid[6];
|
UINT8 Isid[6];
|
||||||
UINT16 Tsih;
|
UINT16 Tsih;
|
||||||
|
|
||||||
UINT32 CmdSN;
|
UINT32 CmdSN;
|
||||||
UINT32 ExpCmdSN;
|
UINT32 ExpCmdSN;
|
||||||
UINT32 MaxCmdSN;
|
UINT32 MaxCmdSN;
|
||||||
|
|
||||||
UINT32 InitiatorTaskTag;
|
UINT32 InitiatorTaskTag;
|
||||||
UINT16 NextCid;
|
UINT16 NextCid;
|
||||||
|
|
||||||
LIST_ENTRY Conns;
|
LIST_ENTRY Conns;
|
||||||
UINT32 NumConns;
|
UINT32 NumConns;
|
||||||
|
|
||||||
LIST_ENTRY TcbList;
|
LIST_ENTRY TcbList;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Session-wide parameters
|
// Session-wide parameters
|
||||||
//
|
//
|
||||||
UINT16 TargetPortalGroupTag;
|
UINT16 TargetPortalGroupTag;
|
||||||
UINT32 MaxConnections;
|
UINT32 MaxConnections;
|
||||||
BOOLEAN InitialR2T;
|
BOOLEAN InitialR2T;
|
||||||
BOOLEAN ImmediateData;
|
BOOLEAN ImmediateData;
|
||||||
UINT32 MaxBurstLength;
|
UINT32 MaxBurstLength;
|
||||||
UINT32 FirstBurstLength;
|
UINT32 FirstBurstLength;
|
||||||
UINT32 DefaultTime2Wait;
|
UINT32 DefaultTime2Wait;
|
||||||
UINT32 DefaultTime2Retain;
|
UINT32 DefaultTime2Retain;
|
||||||
UINT16 MaxOutstandingR2T;
|
UINT16 MaxOutstandingR2T;
|
||||||
BOOLEAN DataPDUInOrder;
|
BOOLEAN DataPDUInOrder;
|
||||||
BOOLEAN DataSequenceInOrder;
|
BOOLEAN DataSequenceInOrder;
|
||||||
UINT8 ErrorRecoveryLevel;
|
UINT8 ErrorRecoveryLevel;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define ISCSI_CONNECTION_SIGNATURE SIGNATURE_32 ('I', 'S', 'C', 'N')
|
#define ISCSI_CONNECTION_SIGNATURE SIGNATURE_32 ('I', 'S', 'C', 'N')
|
||||||
|
|
||||||
struct _ISCSI_CONNECTION {
|
struct _ISCSI_CONNECTION {
|
||||||
UINT32 Signature;
|
UINT32 Signature;
|
||||||
LIST_ENTRY Link;
|
LIST_ENTRY Link;
|
||||||
|
|
||||||
EFI_EVENT TimeoutEvent;
|
EFI_EVENT TimeoutEvent;
|
||||||
|
|
||||||
ISCSI_SESSION *Session;
|
ISCSI_SESSION *Session;
|
||||||
|
|
||||||
UINT8 State;
|
UINT8 State;
|
||||||
UINT8 CurrentStage;
|
UINT8 CurrentStage;
|
||||||
UINT8 NextStage;
|
UINT8 NextStage;
|
||||||
|
|
||||||
UINT8 AuthStep;
|
UINT8 AuthStep;
|
||||||
|
|
||||||
BOOLEAN PartialReqSent;
|
BOOLEAN PartialReqSent;
|
||||||
BOOLEAN PartialRspRcvd;
|
BOOLEAN PartialRspRcvd;
|
||||||
|
|
||||||
BOOLEAN TransitInitiated;
|
BOOLEAN TransitInitiated;
|
||||||
BOOLEAN ParamNegotiated;
|
BOOLEAN ParamNegotiated;
|
||||||
|
|
||||||
UINT16 Cid;
|
UINT16 Cid;
|
||||||
UINT32 ExpStatSN;
|
UINT32 ExpStatSN;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Queues...
|
// Queues...
|
||||||
//
|
//
|
||||||
NET_BUF_QUEUE RspQue;
|
NET_BUF_QUEUE RspQue;
|
||||||
|
|
||||||
BOOLEAN Ipv6Flag;
|
BOOLEAN Ipv6Flag;
|
||||||
TCP_IO TcpIo;
|
TCP_IO TcpIo;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Connection-only parameters.
|
// Connection-only parameters.
|
||||||
//
|
//
|
||||||
UINT32 MaxRecvDataSegmentLength;
|
UINT32 MaxRecvDataSegmentLength;
|
||||||
ISCSI_DIGEST_TYPE HeaderDigest;
|
ISCSI_DIGEST_TYPE HeaderDigest;
|
||||||
ISCSI_DIGEST_TYPE DataDigest;
|
ISCSI_DIGEST_TYPE DataDigest;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define ISCSI_DRIVER_DATA_SIGNATURE SIGNATURE_32 ('I', 'S', 'D', 'A')
|
#define ISCSI_DRIVER_DATA_SIGNATURE SIGNATURE_32 ('I', 'S', 'D', 'A')
|
||||||
|
|
||||||
#define ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU(PassThru) \
|
#define ISCSI_DRIVER_DATA_FROM_EXT_SCSI_PASS_THRU(PassThru) \
|
||||||
CR ( \
|
CR ( \
|
||||||
@ -184,19 +184,19 @@ struct _ISCSI_CONNECTION {
|
|||||||
)
|
)
|
||||||
|
|
||||||
struct _ISCSI_DRIVER_DATA {
|
struct _ISCSI_DRIVER_DATA {
|
||||||
UINT32 Signature;
|
UINT32 Signature;
|
||||||
EFI_HANDLE Image;
|
EFI_HANDLE Image;
|
||||||
EFI_HANDLE Controller;
|
EFI_HANDLE Controller;
|
||||||
ISCSI_PRIVATE_PROTOCOL IScsiIdentifier;
|
ISCSI_PRIVATE_PROTOCOL IScsiIdentifier;
|
||||||
|
|
||||||
EFI_EVENT ExitBootServiceEvent;
|
EFI_EVENT ExitBootServiceEvent;
|
||||||
|
|
||||||
EFI_EXT_SCSI_PASS_THRU_PROTOCOL IScsiExtScsiPassThru;
|
EFI_EXT_SCSI_PASS_THRU_PROTOCOL IScsiExtScsiPassThru;
|
||||||
EFI_EXT_SCSI_PASS_THRU_MODE ExtScsiPassThruMode;
|
EFI_EXT_SCSI_PASS_THRU_MODE ExtScsiPassThruMode;
|
||||||
EFI_HANDLE ExtScsiPassThruHandle;
|
EFI_HANDLE ExtScsiPassThruHandle;
|
||||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||||
EFI_HANDLE ChildHandle;
|
EFI_HANDLE ChildHandle;
|
||||||
ISCSI_SESSION *Session;
|
ISCSI_SESSION *Session;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -8,12 +8,11 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
|
|
||||||
#include "IScsiImpl.h"
|
#include "IScsiImpl.h"
|
||||||
|
|
||||||
EFI_ISCSI_INITIATOR_NAME_PROTOCOL gIScsiInitiatorName = {
|
EFI_ISCSI_INITIATOR_NAME_PROTOCOL gIScsiInitiatorName = {
|
||||||
IScsiGetInitiatorName,
|
IScsiGetInitiatorName,
|
||||||
IScsiSetInitiatorName
|
IScsiSetInitiatorName
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Retrieves the current set value of iSCSI Initiator Name.
|
Retrieves the current set value of iSCSI Initiator Name.
|
||||||
|
|
||||||
@ -64,7 +63,6 @@ IScsiGetInitiatorName (
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Sets the iSSI Initiator Name.
|
Sets the iSSI Initiator Name.
|
||||||
|
|
||||||
@ -110,10 +108,11 @@ IScsiSetInitiatorName (
|
|||||||
*BufferSize = ISCSI_NAME_MAX_SIZE;
|
*BufferSize = ISCSI_NAME_MAX_SIZE;
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Only support iqn iSCSI names.
|
// Only support iqn iSCSI names.
|
||||||
//
|
//
|
||||||
Status = IScsiNormalizeName ((CHAR8 *) Buffer, *BufferSize - 1);
|
Status = IScsiNormalizeName ((CHAR8 *)Buffer, *BufferSize - 1);
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -14,49 +14,47 @@ typedef struct _ISCSI_DRIVER_DATA ISCSI_DRIVER_DATA;
|
|||||||
///
|
///
|
||||||
/// IPv4 Device Path Node Length
|
/// IPv4 Device Path Node Length
|
||||||
///
|
///
|
||||||
#define IP4_NODE_LEN_NEW_VERSIONS 27
|
#define IP4_NODE_LEN_NEW_VERSIONS 27
|
||||||
|
|
||||||
///
|
///
|
||||||
/// IPv6 Device Path Node Length
|
/// IPv6 Device Path Node Length
|
||||||
///
|
///
|
||||||
#define IP6_NODE_LEN_OLD_VERSIONS 43
|
#define IP6_NODE_LEN_OLD_VERSIONS 43
|
||||||
#define IP6_NODE_LEN_NEW_VERSIONS 60
|
#define IP6_NODE_LEN_NEW_VERSIONS 60
|
||||||
|
|
||||||
///
|
///
|
||||||
/// The ignored field StaticIpAddress's offset in old IPv6 Device Path
|
/// The ignored field StaticIpAddress's offset in old IPv6 Device Path
|
||||||
///
|
///
|
||||||
#define IP6_OLD_IPADDRESS_OFFSET 42
|
#define IP6_OLD_IPADDRESS_OFFSET 42
|
||||||
|
|
||||||
|
|
||||||
#pragma pack(1)
|
#pragma pack(1)
|
||||||
typedef struct _ISCSI_SESSION_CONFIG_NVDATA {
|
typedef struct _ISCSI_SESSION_CONFIG_NVDATA {
|
||||||
UINT16 TargetPort;
|
UINT16 TargetPort;
|
||||||
UINT8 Enabled;
|
UINT8 Enabled;
|
||||||
UINT8 IpMode;
|
UINT8 IpMode;
|
||||||
|
|
||||||
EFI_IP_ADDRESS LocalIp;
|
EFI_IP_ADDRESS LocalIp;
|
||||||
EFI_IPv4_ADDRESS SubnetMask;
|
EFI_IPv4_ADDRESS SubnetMask;
|
||||||
EFI_IP_ADDRESS Gateway;
|
EFI_IP_ADDRESS Gateway;
|
||||||
|
|
||||||
BOOLEAN InitiatorInfoFromDhcp;
|
BOOLEAN InitiatorInfoFromDhcp;
|
||||||
BOOLEAN TargetInfoFromDhcp;
|
BOOLEAN TargetInfoFromDhcp;
|
||||||
|
|
||||||
CHAR8 TargetName[ISCSI_NAME_MAX_SIZE];
|
CHAR8 TargetName[ISCSI_NAME_MAX_SIZE];
|
||||||
EFI_IP_ADDRESS TargetIp;
|
EFI_IP_ADDRESS TargetIp;
|
||||||
UINT8 PrefixLength;
|
UINT8 PrefixLength;
|
||||||
UINT8 BootLun[8];
|
UINT8 BootLun[8];
|
||||||
|
|
||||||
UINT16 ConnectTimeout; ///< timeout value in milliseconds.
|
UINT16 ConnectTimeout; ///< timeout value in milliseconds.
|
||||||
UINT8 ConnectRetryCount;
|
UINT8 ConnectRetryCount;
|
||||||
UINT8 IsId[6];
|
UINT8 IsId[6];
|
||||||
|
|
||||||
BOOLEAN RedirectFlag;
|
BOOLEAN RedirectFlag;
|
||||||
UINT16 OriginalTargetPort; // The port of proxy/virtual target.
|
UINT16 OriginalTargetPort; // The port of proxy/virtual target.
|
||||||
EFI_IP_ADDRESS OriginalTargetIp; // The address of proxy/virtual target.
|
EFI_IP_ADDRESS OriginalTargetIp; // The address of proxy/virtual target.
|
||||||
|
|
||||||
BOOLEAN DnsMode; // Flag indicate whether the Target address is expressed as URL format.
|
|
||||||
CHAR8 TargetUrl[ISCSI_TARGET_URI_MAX_SIZE];
|
|
||||||
|
|
||||||
|
BOOLEAN DnsMode; // Flag indicate whether the Target address is expressed as URL format.
|
||||||
|
CHAR8 TargetUrl[ISCSI_TARGET_URI_MAX_SIZE];
|
||||||
} ISCSI_SESSION_CONFIG_NVDATA;
|
} ISCSI_SESSION_CONFIG_NVDATA;
|
||||||
#pragma pack()
|
#pragma pack()
|
||||||
|
|
||||||
@ -134,9 +132,9 @@ IScsiMacAddrToStr (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
IScsiAsciiStrToIp (
|
IScsiAsciiStrToIp (
|
||||||
IN CHAR8 *Str,
|
IN CHAR8 *Str,
|
||||||
IN UINT8 IpMode,
|
IN UINT8 IpMode,
|
||||||
OUT EFI_IP_ADDRESS *Ip
|
OUT EFI_IP_ADDRESS *Ip
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -156,10 +154,10 @@ IScsiAsciiStrToIp (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
IScsiBinToHex (
|
IScsiBinToHex (
|
||||||
IN UINT8 *BinBuffer,
|
IN UINT8 *BinBuffer,
|
||||||
IN UINT32 BinLength,
|
IN UINT32 BinLength,
|
||||||
IN OUT CHAR8 *HexStr,
|
IN OUT CHAR8 *HexStr,
|
||||||
IN OUT UINT32 *HexLength
|
IN OUT UINT32 *HexLength
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -180,12 +178,11 @@ IScsiBinToHex (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
IScsiHexToBin (
|
IScsiHexToBin (
|
||||||
IN OUT UINT8 *BinBuffer,
|
IN OUT UINT8 *BinBuffer,
|
||||||
IN OUT UINT32 *BinLength,
|
IN OUT UINT32 *BinLength,
|
||||||
IN CHAR8 *HexStr
|
IN CHAR8 *HexStr
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Convert the decimal-constant string or hex-constant string into a numerical value.
|
Convert the decimal-constant string or hex-constant string into a numerical value.
|
||||||
|
|
||||||
@ -255,7 +252,7 @@ IScsiRemoveNic (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
IScsiCreateAttempts (
|
IScsiCreateAttempts (
|
||||||
IN UINTN AttemptNum
|
IN UINTN AttemptNum
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -269,7 +266,7 @@ IScsiCreateAttempts (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
IScsiCreateKeywords (
|
IScsiCreateKeywords (
|
||||||
IN UINTN KeywordNum
|
IN UINTN KeywordNum
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -292,10 +289,9 @@ IScsiCleanAttemptVariable (
|
|||||||
**/
|
**/
|
||||||
ISCSI_NIC_INFO *
|
ISCSI_NIC_INFO *
|
||||||
IScsiGetNicInfoByIndex (
|
IScsiGetNicInfoByIndex (
|
||||||
IN UINT8 NicIndex
|
IN UINT8 NicIndex
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Get the NIC's PCI location and return it according to the composited
|
Get the NIC's PCI location and return it according to the composited
|
||||||
format defined in iSCSI Boot Firmware Table.
|
format defined in iSCSI Boot Firmware Table.
|
||||||
@ -331,9 +327,9 @@ IScsiGetNICPciLocation (
|
|||||||
**/
|
**/
|
||||||
VOID *
|
VOID *
|
||||||
IScsiGetVariableAndSize (
|
IScsiGetVariableAndSize (
|
||||||
IN CHAR16 *Name,
|
IN CHAR16 *Name,
|
||||||
IN EFI_GUID *VendorGuid,
|
IN EFI_GUID *VendorGuid,
|
||||||
OUT UINTN *VariableSize
|
OUT UINTN *VariableSize
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -422,7 +418,7 @@ IScsiGetConfigData (
|
|||||||
**/
|
**/
|
||||||
EFI_DEVICE_PATH_PROTOCOL *
|
EFI_DEVICE_PATH_PROTOCOL *
|
||||||
IScsiGetTcpConnDevicePath (
|
IScsiGetTcpConnDevicePath (
|
||||||
IN ISCSI_SESSION *Session
|
IN ISCSI_SESSION *Session
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -465,8 +461,9 @@ IScsiOnExitBootService (
|
|||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
EFIAPI
|
EFIAPI
|
||||||
IScsiTestManagedDevice (
|
IScsiTestManagedDevice (
|
||||||
IN EFI_HANDLE ControllerHandle,
|
IN EFI_HANDLE ControllerHandle,
|
||||||
IN EFI_HANDLE DriverBindingHandle,
|
IN EFI_HANDLE DriverBindingHandle,
|
||||||
IN EFI_GUID *ProtocolGuid
|
IN EFI_GUID *ProtocolGuid
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -24,21 +24,21 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
(((INT32) (s1) > (INT32) (s2)) && (s1 - s2) < ((UINT32) 1 << 31)) \
|
(((INT32) (s1) > (INT32) (s2)) && (s1 - s2) < ((UINT32) 1 << 31)) \
|
||||||
)
|
)
|
||||||
|
|
||||||
#define ISCSI_WELL_KNOWN_PORT 3260
|
#define ISCSI_WELL_KNOWN_PORT 3260
|
||||||
#define ISCSI_MAX_CONNS_PER_SESSION 1
|
#define ISCSI_MAX_CONNS_PER_SESSION 1
|
||||||
|
|
||||||
#define DEFAULT_MAX_RECV_DATA_SEG_LEN 8192
|
#define DEFAULT_MAX_RECV_DATA_SEG_LEN 8192
|
||||||
#define MAX_RECV_DATA_SEG_LEN_IN_FFP 65536
|
#define MAX_RECV_DATA_SEG_LEN_IN_FFP 65536
|
||||||
#define DEFAULT_MAX_OUTSTANDING_R2T 1
|
#define DEFAULT_MAX_OUTSTANDING_R2T 1
|
||||||
|
|
||||||
#define ISCSI_VERSION_MAX 0x00
|
#define ISCSI_VERSION_MAX 0x00
|
||||||
#define ISCSI_VERSION_MIN 0x00
|
#define ISCSI_VERSION_MIN 0x00
|
||||||
|
|
||||||
#define ISCSI_CHECK_MEDIA_LOGIN_WAITING_TIME EFI_TIMER_PERIOD_SECONDS(20)
|
#define ISCSI_CHECK_MEDIA_LOGIN_WAITING_TIME EFI_TIMER_PERIOD_SECONDS(20)
|
||||||
#define ISCSI_CHECK_MEDIA_GET_DHCP_WAITING_TIME EFI_TIMER_PERIOD_SECONDS(20)
|
#define ISCSI_CHECK_MEDIA_GET_DHCP_WAITING_TIME EFI_TIMER_PERIOD_SECONDS(20)
|
||||||
|
|
||||||
#define ISCSI_REDIRECT_ADDR_START_DELIMITER '['
|
#define ISCSI_REDIRECT_ADDR_START_DELIMITER '['
|
||||||
#define ISCSI_REDIRECT_ADDR_END_DELIMITER ']'
|
#define ISCSI_REDIRECT_ADDR_END_DELIMITER ']'
|
||||||
|
|
||||||
#define ISCSI_KEY_AUTH_METHOD "AuthMethod"
|
#define ISCSI_KEY_AUTH_METHOD "AuthMethod"
|
||||||
#define ISCSI_KEY_HEADER_DIGEST "HeaderDigest"
|
#define ISCSI_KEY_HEADER_DIGEST "HeaderDigest"
|
||||||
@ -63,32 +63,32 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#define ISCSI_KEY_SESSION_TYPE "SessionType"
|
#define ISCSI_KEY_SESSION_TYPE "SessionType"
|
||||||
#define ISCSI_KEY_MAX_RECV_DATA_SEGMENT_LENGTH "MaxRecvDataSegmentLength"
|
#define ISCSI_KEY_MAX_RECV_DATA_SEGMENT_LENGTH "MaxRecvDataSegmentLength"
|
||||||
|
|
||||||
#define ISCSI_KEY_VALUE_NONE "None"
|
#define ISCSI_KEY_VALUE_NONE "None"
|
||||||
|
|
||||||
///
|
///
|
||||||
/// connection state for initiator
|
/// connection state for initiator
|
||||||
///
|
///
|
||||||
|
|
||||||
#define CONN_STATE_FREE 0
|
#define CONN_STATE_FREE 0
|
||||||
#define CONN_STATE_XPT_WAIT 1
|
#define CONN_STATE_XPT_WAIT 1
|
||||||
#define CONN_STATE_IN_LOGIN 2
|
#define CONN_STATE_IN_LOGIN 2
|
||||||
#define CONN_STATE_LOGGED_IN 3
|
#define CONN_STATE_LOGGED_IN 3
|
||||||
#define CONN_STATE_IN_LOGOUT 4
|
#define CONN_STATE_IN_LOGOUT 4
|
||||||
#define CONN_STATE_LOGOUT_REQUESTED 5
|
#define CONN_STATE_LOGOUT_REQUESTED 5
|
||||||
#define CONN_STATE_CLEANUP_WAIT 6
|
#define CONN_STATE_CLEANUP_WAIT 6
|
||||||
#define CONN_STATE_IN_CLEANUP 7
|
#define CONN_STATE_IN_CLEANUP 7
|
||||||
|
|
||||||
///
|
///
|
||||||
/// session state for initiator
|
/// session state for initiator
|
||||||
///
|
///
|
||||||
#define SESSION_STATE_FREE 0
|
#define SESSION_STATE_FREE 0
|
||||||
#define SESSION_STATE_LOGGED_IN 1
|
#define SESSION_STATE_LOGGED_IN 1
|
||||||
#define SESSION_STATE_FAILED 2
|
#define SESSION_STATE_FAILED 2
|
||||||
|
|
||||||
#define ISCSI_RESERVED_TAG 0xffffffff
|
#define ISCSI_RESERVED_TAG 0xffffffff
|
||||||
|
|
||||||
#define ISCSI_REQ_IMMEDIATE 0x40
|
#define ISCSI_REQ_IMMEDIATE 0x40
|
||||||
#define ISCSI_OPCODE_MASK 0x3F
|
#define ISCSI_OPCODE_MASK 0x3F
|
||||||
|
|
||||||
#define ISCSI_SET_OPCODE(PduHdr, Op, Flgs) ((((ISCSI_BASIC_HEADER *) (PduHdr))->OpCode) = ((Op) | (Flgs)))
|
#define ISCSI_SET_OPCODE(PduHdr, Op, Flgs) ((((ISCSI_BASIC_HEADER *) (PduHdr))->OpCode) = ((Op) | (Flgs)))
|
||||||
#define ISCSI_GET_OPCODE(PduHdr) ((((ISCSI_BASIC_HEADER *) (PduHdr))->OpCode) & ISCSI_OPCODE_MASK)
|
#define ISCSI_GET_OPCODE(PduHdr) ((((ISCSI_BASIC_HEADER *) (PduHdr))->OpCode) & ISCSI_OPCODE_MASK)
|
||||||
@ -101,8 +101,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#define ISCSI_GET_CURRENT_STAGE(PduHdr) ((UINT8) (((PduHdr)->Flags >> 2) & 0x3))
|
#define ISCSI_GET_CURRENT_STAGE(PduHdr) ((UINT8) (((PduHdr)->Flags >> 2) & 0x3))
|
||||||
#define ISCSI_GET_NEXT_STAGE(PduHdr) ((UINT8) (((PduHdr)->Flags) & 0x3))
|
#define ISCSI_GET_NEXT_STAGE(PduHdr) ((UINT8) (((PduHdr)->Flags) & 0x3))
|
||||||
|
|
||||||
#define ISCSI_GET_PAD_LEN(DataLen) ((~(DataLen) + 1) & 0x3)
|
#define ISCSI_GET_PAD_LEN(DataLen) ((~(DataLen) + 1) & 0x3)
|
||||||
#define ISCSI_ROUNDUP(DataLen) (((DataLen) + 3) &~(0x3))
|
#define ISCSI_ROUNDUP(DataLen) (((DataLen) + 3) &~(0x3))
|
||||||
|
|
||||||
#define HTON24(Dst, Src) \
|
#define HTON24(Dst, Src) \
|
||||||
do { \
|
do { \
|
||||||
@ -111,7 +111,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
(Dst)[2] = (UINT8) ((UINT8) (Src) & 0xFF); \
|
(Dst)[2] = (UINT8) ((UINT8) (Src) & 0xFF); \
|
||||||
} while (0);
|
} while (0);
|
||||||
|
|
||||||
#define NTOH24(src) (((src)[0] << 16) | ((src)[1] << 8) | ((src)[2]))
|
#define NTOH24(src) (((src)[0] << 16) | ((src)[1] << 8) | ((src)[2]))
|
||||||
|
|
||||||
#define ISCSI_GET_DATASEG_LEN(PduHdr) NTOH24 (((ISCSI_BASIC_HEADER *) (PduHdr))->DataSegmentLength)
|
#define ISCSI_GET_DATASEG_LEN(PduHdr) NTOH24 (((ISCSI_BASIC_HEADER *) (PduHdr))->DataSegmentLength)
|
||||||
#define ISCSI_SET_DATASEG_LEN(PduHdr, Len) HTON24 (((ISCSI_BASIC_HEADER *) (PduHdr))->DataSegmentLength, (Len))
|
#define ISCSI_SET_DATASEG_LEN(PduHdr, Len) HTON24 (((ISCSI_BASIC_HEADER *) (PduHdr))->DataSegmentLength, (Len))
|
||||||
@ -135,30 +135,30 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
//
|
//
|
||||||
// Target opcodes.
|
// Target opcodes.
|
||||||
//
|
//
|
||||||
#define ISCSI_OPCODE_NOP_IN 0x20
|
#define ISCSI_OPCODE_NOP_IN 0x20
|
||||||
#define ISCSI_OPCODE_SCSI_RSP 0x21
|
#define ISCSI_OPCODE_SCSI_RSP 0x21
|
||||||
#define ISCSI_OPCODE_SCSI_TMF_RSP 0x22
|
#define ISCSI_OPCODE_SCSI_TMF_RSP 0x22
|
||||||
#define ISCSI_OPCODE_LOGIN_RSP 0x23
|
#define ISCSI_OPCODE_LOGIN_RSP 0x23
|
||||||
#define ISCSI_OPCODE_TEXT_RSP 0x24
|
#define ISCSI_OPCODE_TEXT_RSP 0x24
|
||||||
#define ISCSI_OPCODE_SCSI_DATA_IN 0x25
|
#define ISCSI_OPCODE_SCSI_DATA_IN 0x25
|
||||||
#define ISCSI_OPCODE_LOGOUT_RSP 0x26
|
#define ISCSI_OPCODE_LOGOUT_RSP 0x26
|
||||||
#define ISCSI_OPCODE_R2T 0x31
|
#define ISCSI_OPCODE_R2T 0x31
|
||||||
#define ISCSI_OPCODE_ASYNC_MSG 0x32
|
#define ISCSI_OPCODE_ASYNC_MSG 0x32
|
||||||
#define ISCSI_OPCODE_VENDOR_T0 0x3c
|
#define ISCSI_OPCODE_VENDOR_T0 0x3c
|
||||||
#define ISCSI_OPCODE_VENDOR_T1 0x3d
|
#define ISCSI_OPCODE_VENDOR_T1 0x3d
|
||||||
#define ISCSI_OPCODE_VENDOR_T2 0x3e
|
#define ISCSI_OPCODE_VENDOR_T2 0x3e
|
||||||
#define ISCSI_OPCODE_REJECT 0x3f
|
#define ISCSI_OPCODE_REJECT 0x3f
|
||||||
|
|
||||||
#define ISCSI_BHS_FLAG_FINAL 0x80
|
#define ISCSI_BHS_FLAG_FINAL 0x80
|
||||||
|
|
||||||
//
|
//
|
||||||
// Defined AHS types, others are reserved.
|
// Defined AHS types, others are reserved.
|
||||||
//
|
//
|
||||||
#define ISCSI_AHS_TYPE_EXT_CDB 0x1
|
#define ISCSI_AHS_TYPE_EXT_CDB 0x1
|
||||||
#define ISCSI_AHS_TYPE_BI_EXP_READ_DATA_LEN 0x2
|
#define ISCSI_AHS_TYPE_BI_EXP_READ_DATA_LEN 0x2
|
||||||
|
|
||||||
#define SCSI_CMD_PDU_FLAG_READ 0x40
|
#define SCSI_CMD_PDU_FLAG_READ 0x40
|
||||||
#define SCSI_CMD_PDU_FLAG_WRITE 0x20
|
#define SCSI_CMD_PDU_FLAG_WRITE 0x20
|
||||||
|
|
||||||
#define ISCSI_CMD_PDU_TASK_ATTR_MASK 0x07
|
#define ISCSI_CMD_PDU_TASK_ATTR_MASK 0x07
|
||||||
|
|
||||||
@ -174,10 +174,10 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
//
|
//
|
||||||
// Flag bit definitions in SCSI response.
|
// Flag bit definitions in SCSI response.
|
||||||
//
|
//
|
||||||
#define SCSI_RSP_PDU_FLAG_BI_READ_OVERFLOW 0x10
|
#define SCSI_RSP_PDU_FLAG_BI_READ_OVERFLOW 0x10
|
||||||
#define SCSI_RSP_PDU_FLAG_BI_READ_UNDERFLOW 0x08
|
#define SCSI_RSP_PDU_FLAG_BI_READ_UNDERFLOW 0x08
|
||||||
#define SCSI_RSP_PDU_FLAG_OVERFLOW 0x04
|
#define SCSI_RSP_PDU_FLAG_OVERFLOW 0x04
|
||||||
#define SCSI_RSP_PDU_FLAG_UNDERFLOW 0x02
|
#define SCSI_RSP_PDU_FLAG_UNDERFLOW 0x02
|
||||||
|
|
||||||
//
|
//
|
||||||
// iSCSI service response codes.
|
// iSCSI service response codes.
|
||||||
@ -185,25 +185,25 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#define ISCSI_SERVICE_RSP_COMMAND_COMPLETE_AT_TARGET 0x00
|
#define ISCSI_SERVICE_RSP_COMMAND_COMPLETE_AT_TARGET 0x00
|
||||||
#define ISCSI_SERVICE_RSP_TARGET_FAILURE 0x01
|
#define ISCSI_SERVICE_RSP_TARGET_FAILURE 0x01
|
||||||
|
|
||||||
#define ISCSI_TMF_RSP_PDU_RSP_FUNCTION_COMPLETE 0
|
#define ISCSI_TMF_RSP_PDU_RSP_FUNCTION_COMPLETE 0
|
||||||
#define ISCSI_TMF_RSP_PDU_RSP_TASK_NOT_EXIST 1
|
#define ISCSI_TMF_RSP_PDU_RSP_TASK_NOT_EXIST 1
|
||||||
#define ISCSI_TMF_RSP_PDU_RSP_LUN_NOT_EXIST 2
|
#define ISCSI_TMF_RSP_PDU_RSP_LUN_NOT_EXIST 2
|
||||||
#define ISCSI_TMF_RSP_PDU_RSP_TASK_STILL_ALLEGIANT 3
|
#define ISCSI_TMF_RSP_PDU_RSP_TASK_STILL_ALLEGIANT 3
|
||||||
#define ISCSI_TMF_RSP_PDU_RSP_TASK_REASSGIN_NOT_SUPPORTED 4
|
#define ISCSI_TMF_RSP_PDU_RSP_TASK_REASSGIN_NOT_SUPPORTED 4
|
||||||
#define ISCSI_TMF_RSP_PDU_RSP_NOT_SUPPORTED 5
|
#define ISCSI_TMF_RSP_PDU_RSP_NOT_SUPPORTED 5
|
||||||
#define ISCSI_TMF_RSP_PDU_RSP_FUNCTION_AHTH_FAILED 6
|
#define ISCSI_TMF_RSP_PDU_RSP_FUNCTION_AHTH_FAILED 6
|
||||||
#define ISCSI_TMF_RSP_PDU_RSP_FUNCTION_REJECTED 255
|
#define ISCSI_TMF_RSP_PDU_RSP_FUNCTION_REJECTED 255
|
||||||
|
|
||||||
#define SCSI_DATA_IN_PDU_FLAG_ACKKNOWLEDGE 0x40
|
#define SCSI_DATA_IN_PDU_FLAG_ACKKNOWLEDGE 0x40
|
||||||
#define SCSI_DATA_IN_PDU_FLAG_OVERFLOW SCSI_RSP_PDU_FLAG_OVERFLOW
|
#define SCSI_DATA_IN_PDU_FLAG_OVERFLOW SCSI_RSP_PDU_FLAG_OVERFLOW
|
||||||
#define SCSI_DATA_IN_PDU_FLAG_UNDERFLOW SCSI_RSP_PDU_FLAG_UNDERFLOW
|
#define SCSI_DATA_IN_PDU_FLAG_UNDERFLOW SCSI_RSP_PDU_FLAG_UNDERFLOW
|
||||||
#define SCSI_DATA_IN_PDU_FLAG_STATUS_VALID 0x01
|
#define SCSI_DATA_IN_PDU_FLAG_STATUS_VALID 0x01
|
||||||
|
|
||||||
#define ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT 0x80
|
#define ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT 0x80
|
||||||
#define ISCSI_LOGIN_REQ_PDU_FLAG_CONTINUE 0x40
|
#define ISCSI_LOGIN_REQ_PDU_FLAG_CONTINUE 0x40
|
||||||
|
|
||||||
#define ISCSI_LOGIN_RSP_PDU_FLAG_TRANSIT ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT
|
#define ISCSI_LOGIN_RSP_PDU_FLAG_TRANSIT ISCSI_LOGIN_REQ_PDU_FLAG_TRANSIT
|
||||||
#define ISCSI_LOGIN_RSP_PDU_FLAG_CONTINUE ISCSI_LOGIN_REQ_PDU_FLAG_CONTINUE
|
#define ISCSI_LOGIN_RSP_PDU_FLAG_CONTINUE ISCSI_LOGIN_REQ_PDU_FLAG_CONTINUE
|
||||||
|
|
||||||
#define ISCSI_LOGIN_STATUS_SUCCESS 0
|
#define ISCSI_LOGIN_STATUS_SUCCESS 0
|
||||||
#define ISCSI_LOGIN_STATUS_REDIRECTION 1
|
#define ISCSI_LOGIN_STATUS_REDIRECTION 1
|
||||||
@ -224,12 +224,12 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#define ISCSI_SNACK_REQUEST_TYPE_DATA_ACK 2
|
#define ISCSI_SNACK_REQUEST_TYPE_DATA_ACK 2
|
||||||
#define ISCSI_SNACK_REQUEST_TYPE_RDATA 3
|
#define ISCSI_SNACK_REQUEST_TYPE_RDATA 3
|
||||||
|
|
||||||
#define ISCSI_SECURITY_NEGOTIATION 0
|
#define ISCSI_SECURITY_NEGOTIATION 0
|
||||||
#define ISCSI_LOGIN_OPERATIONAL_NEGOTIATION 1
|
#define ISCSI_LOGIN_OPERATIONAL_NEGOTIATION 1
|
||||||
#define ISCSI_FULL_FEATURE_PHASE 3
|
#define ISCSI_FULL_FEATURE_PHASE 3
|
||||||
|
|
||||||
typedef struct _ISCSI_SESSION ISCSI_SESSION;
|
typedef struct _ISCSI_SESSION ISCSI_SESSION;
|
||||||
typedef struct _ISCSI_CONNECTION ISCSI_CONNECTION;
|
typedef struct _ISCSI_CONNECTION ISCSI_CONNECTION;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
DataIn = 0,
|
DataIn = 0,
|
||||||
@ -241,340 +241,340 @@ typedef enum {
|
|||||||
/// iSCSI Basic Header Segment
|
/// iSCSI Basic Header Segment
|
||||||
///
|
///
|
||||||
typedef struct _ISCSI_BASIC_HEADER {
|
typedef struct _ISCSI_BASIC_HEADER {
|
||||||
UINT8 OpCode;
|
UINT8 OpCode;
|
||||||
UINT8 Flags;
|
UINT8 Flags;
|
||||||
UINT16 OpCodeSpecific1;
|
UINT16 OpCodeSpecific1;
|
||||||
UINT8 TotalAHSLength;
|
UINT8 TotalAHSLength;
|
||||||
UINT8 DataSegmentLength[3];
|
UINT8 DataSegmentLength[3];
|
||||||
UINT8 Lun[8];
|
UINT8 Lun[8];
|
||||||
UINT32 InitiatorTaskTag;
|
UINT32 InitiatorTaskTag;
|
||||||
UINT32 OpCodeSpecific2[7];
|
UINT32 OpCodeSpecific2[7];
|
||||||
} ISCSI_BASIC_HEADER;
|
} ISCSI_BASIC_HEADER;
|
||||||
|
|
||||||
typedef struct _ISCSI_ADDTIONAL_HEADER {
|
typedef struct _ISCSI_ADDTIONAL_HEADER {
|
||||||
UINT16 Length;
|
UINT16 Length;
|
||||||
UINT8 Type;
|
UINT8 Type;
|
||||||
UINT8 TypeSpecific[1];
|
UINT8 TypeSpecific[1];
|
||||||
} ISCSI_ADDITIONAL_HEADER;
|
} ISCSI_ADDITIONAL_HEADER;
|
||||||
|
|
||||||
typedef struct _ISCSI_BI_EXP_READ_DATA_LEN_AHS {
|
typedef struct _ISCSI_BI_EXP_READ_DATA_LEN_AHS {
|
||||||
UINT16 Length;
|
UINT16 Length;
|
||||||
UINT8 Type;
|
UINT8 Type;
|
||||||
UINT8 Reserved;
|
UINT8 Reserved;
|
||||||
UINT32 ExpReadDataLength;
|
UINT32 ExpReadDataLength;
|
||||||
} ISCSI_BI_EXP_READ_DATA_LEN_AHS;
|
} ISCSI_BI_EXP_READ_DATA_LEN_AHS;
|
||||||
|
|
||||||
///
|
///
|
||||||
/// SCSI Command
|
/// SCSI Command
|
||||||
///
|
///
|
||||||
typedef struct _SCSI_COMMAND {
|
typedef struct _SCSI_COMMAND {
|
||||||
UINT8 OpCode;
|
UINT8 OpCode;
|
||||||
UINT8 Flags;
|
UINT8 Flags;
|
||||||
UINT16 Reserved;
|
UINT16 Reserved;
|
||||||
UINT8 TotalAHSLength;
|
UINT8 TotalAHSLength;
|
||||||
UINT8 DataSegmentLength[3];
|
UINT8 DataSegmentLength[3];
|
||||||
UINT8 Lun[8];
|
UINT8 Lun[8];
|
||||||
UINT32 InitiatorTaskTag;
|
UINT32 InitiatorTaskTag;
|
||||||
UINT32 ExpDataXferLength;
|
UINT32 ExpDataXferLength;
|
||||||
UINT32 CmdSN;
|
UINT32 CmdSN;
|
||||||
UINT32 ExpStatSN;
|
UINT32 ExpStatSN;
|
||||||
UINT8 Cdb[16];
|
UINT8 Cdb[16];
|
||||||
} SCSI_COMMAND;
|
} SCSI_COMMAND;
|
||||||
|
|
||||||
///
|
///
|
||||||
/// SCSI Response
|
/// SCSI Response
|
||||||
///
|
///
|
||||||
typedef struct _SCSI_RESPONSE {
|
typedef struct _SCSI_RESPONSE {
|
||||||
UINT8 OpCode;
|
UINT8 OpCode;
|
||||||
UINT8 Flags;
|
UINT8 Flags;
|
||||||
UINT8 Response;
|
UINT8 Response;
|
||||||
UINT8 Status;
|
UINT8 Status;
|
||||||
UINT8 TotalAHSLength;
|
UINT8 TotalAHSLength;
|
||||||
UINT8 DataSegmentLength[3];
|
UINT8 DataSegmentLength[3];
|
||||||
UINT8 Reserved[8];
|
UINT8 Reserved[8];
|
||||||
UINT32 InitiatorTaskTag;
|
UINT32 InitiatorTaskTag;
|
||||||
UINT32 SNACKTag;
|
UINT32 SNACKTag;
|
||||||
UINT32 StatSN;
|
UINT32 StatSN;
|
||||||
UINT32 ExpCmdSN;
|
UINT32 ExpCmdSN;
|
||||||
UINT32 MaxCmdSN;
|
UINT32 MaxCmdSN;
|
||||||
UINT32 ExpDataSN;
|
UINT32 ExpDataSN;
|
||||||
UINT32 BiReadResidualCount;
|
UINT32 BiReadResidualCount;
|
||||||
UINT32 ResidualCount;
|
UINT32 ResidualCount;
|
||||||
} SCSI_RESPONSE;
|
} SCSI_RESPONSE;
|
||||||
|
|
||||||
typedef struct _ISCSI_SENSE_DATA {
|
typedef struct _ISCSI_SENSE_DATA {
|
||||||
UINT16 Length;
|
UINT16 Length;
|
||||||
UINT8 Data[2];
|
UINT8 Data[2];
|
||||||
} ISCSI_SENSE_DATA;
|
} ISCSI_SENSE_DATA;
|
||||||
|
|
||||||
///
|
///
|
||||||
/// iSCSI Task Management Function Request.
|
/// iSCSI Task Management Function Request.
|
||||||
///
|
///
|
||||||
typedef struct _ISCSI_TMF_REQUEST {
|
typedef struct _ISCSI_TMF_REQUEST {
|
||||||
UINT8 OpCode;
|
UINT8 OpCode;
|
||||||
UINT8 Fuction;
|
UINT8 Fuction;
|
||||||
UINT16 Reserved1;
|
UINT16 Reserved1;
|
||||||
UINT8 TotalAHSLength;
|
UINT8 TotalAHSLength;
|
||||||
UINT8 DataSegmentLength[3];
|
UINT8 DataSegmentLength[3];
|
||||||
UINT8 Lun[8];
|
UINT8 Lun[8];
|
||||||
UINT32 InitiatorTaskTag;
|
UINT32 InitiatorTaskTag;
|
||||||
UINT32 ReferencedTaskTag;
|
UINT32 ReferencedTaskTag;
|
||||||
UINT32 CmdSN;
|
UINT32 CmdSN;
|
||||||
UINT32 ExpStatSN;
|
UINT32 ExpStatSN;
|
||||||
UINT32 RefCmdSN;
|
UINT32 RefCmdSN;
|
||||||
UINT32 ExpDataSN;
|
UINT32 ExpDataSN;
|
||||||
UINT32 Reserved2[2];
|
UINT32 Reserved2[2];
|
||||||
} ISCSI_TMF_REQUEST;
|
} ISCSI_TMF_REQUEST;
|
||||||
|
|
||||||
///
|
///
|
||||||
/// iSCSI Task Management Function Response.
|
/// iSCSI Task Management Function Response.
|
||||||
///
|
///
|
||||||
typedef struct _ISCSI_TMF_RESPONSE {
|
typedef struct _ISCSI_TMF_RESPONSE {
|
||||||
UINT8 OpCode;
|
UINT8 OpCode;
|
||||||
UINT8 Reserved1;
|
UINT8 Reserved1;
|
||||||
UINT8 Response;
|
UINT8 Response;
|
||||||
UINT8 Reserved2;
|
UINT8 Reserved2;
|
||||||
UINT8 TotalAHSLength;
|
UINT8 TotalAHSLength;
|
||||||
UINT8 DataSegmentLength[3];
|
UINT8 DataSegmentLength[3];
|
||||||
UINT32 Reserver3[2];
|
UINT32 Reserver3[2];
|
||||||
UINT32 InitiatorTaskTag;
|
UINT32 InitiatorTaskTag;
|
||||||
UINT32 Reserved4;
|
UINT32 Reserved4;
|
||||||
UINT32 StatSN;
|
UINT32 StatSN;
|
||||||
UINT32 ExpCmdSN;
|
UINT32 ExpCmdSN;
|
||||||
UINT32 MaxCmdSN;
|
UINT32 MaxCmdSN;
|
||||||
UINT32 Reserved[3];
|
UINT32 Reserved[3];
|
||||||
} ISCSI_TMF_RESPONSE;
|
} ISCSI_TMF_RESPONSE;
|
||||||
|
|
||||||
///
|
///
|
||||||
/// SCSI Data-Out
|
/// SCSI Data-Out
|
||||||
///
|
///
|
||||||
typedef struct _ISCSI_SCSI_DATA_OUT {
|
typedef struct _ISCSI_SCSI_DATA_OUT {
|
||||||
UINT8 OpCode;
|
UINT8 OpCode;
|
||||||
UINT8 Reserved1[3];
|
UINT8 Reserved1[3];
|
||||||
UINT8 TotalAHSLength;
|
UINT8 TotalAHSLength;
|
||||||
UINT8 DataSegmentLength[3];
|
UINT8 DataSegmentLength[3];
|
||||||
UINT8 Lun[8];
|
UINT8 Lun[8];
|
||||||
UINT32 InitiatorTaskTag;
|
UINT32 InitiatorTaskTag;
|
||||||
UINT32 TargetTransferTag;
|
UINT32 TargetTransferTag;
|
||||||
UINT32 Reserved2;
|
UINT32 Reserved2;
|
||||||
UINT32 ExpStatSN;
|
UINT32 ExpStatSN;
|
||||||
UINT32 Reserved3;
|
UINT32 Reserved3;
|
||||||
UINT32 DataSN;
|
UINT32 DataSN;
|
||||||
UINT32 BufferOffset;
|
UINT32 BufferOffset;
|
||||||
UINT32 Reserved4;
|
UINT32 Reserved4;
|
||||||
} ISCSI_SCSI_DATA_OUT;
|
} ISCSI_SCSI_DATA_OUT;
|
||||||
|
|
||||||
///
|
///
|
||||||
/// SCSI Data-In
|
/// SCSI Data-In
|
||||||
///
|
///
|
||||||
typedef struct _ISCSI_SCSI_DATA_IN {
|
typedef struct _ISCSI_SCSI_DATA_IN {
|
||||||
UINT8 OpCode;
|
UINT8 OpCode;
|
||||||
UINT8 Flags;
|
UINT8 Flags;
|
||||||
UINT8 Reserved1;
|
UINT8 Reserved1;
|
||||||
UINT8 Status;
|
UINT8 Status;
|
||||||
UINT8 TotalAHSLength;
|
UINT8 TotalAHSLength;
|
||||||
UINT8 DataSegmentLength[3];
|
UINT8 DataSegmentLength[3];
|
||||||
UINT8 Lun[8];
|
UINT8 Lun[8];
|
||||||
UINT32 InitiatorTaskTag;
|
UINT32 InitiatorTaskTag;
|
||||||
UINT32 TargetTransferTag;
|
UINT32 TargetTransferTag;
|
||||||
UINT32 StatSN;
|
UINT32 StatSN;
|
||||||
UINT32 ExpCmdSN;
|
UINT32 ExpCmdSN;
|
||||||
UINT32 MaxCmdSN;
|
UINT32 MaxCmdSN;
|
||||||
UINT32 DataSN;
|
UINT32 DataSN;
|
||||||
UINT32 BufferOffset;
|
UINT32 BufferOffset;
|
||||||
UINT32 ResidualCount;
|
UINT32 ResidualCount;
|
||||||
} ISCSI_SCSI_DATA_IN;
|
} ISCSI_SCSI_DATA_IN;
|
||||||
|
|
||||||
///
|
///
|
||||||
/// Ready To Transfer.
|
/// Ready To Transfer.
|
||||||
///
|
///
|
||||||
typedef struct _ISCSI_READY_TO_TRANSFER {
|
typedef struct _ISCSI_READY_TO_TRANSFER {
|
||||||
UINT8 OpCode;
|
UINT8 OpCode;
|
||||||
UINT8 Reserved1[3];
|
UINT8 Reserved1[3];
|
||||||
UINT8 TotalAHSLength;
|
UINT8 TotalAHSLength;
|
||||||
UINT8 DataSegmentLength[3];
|
UINT8 DataSegmentLength[3];
|
||||||
UINT8 Lun[8];
|
UINT8 Lun[8];
|
||||||
UINT32 InitiatorTaskTag;
|
UINT32 InitiatorTaskTag;
|
||||||
UINT32 TargetTransferTag;
|
UINT32 TargetTransferTag;
|
||||||
UINT32 StatSN;
|
UINT32 StatSN;
|
||||||
UINT32 ExpCmdSN;
|
UINT32 ExpCmdSN;
|
||||||
UINT32 MaxCmdSN;
|
UINT32 MaxCmdSN;
|
||||||
UINT32 R2TSeqNum;
|
UINT32 R2TSeqNum;
|
||||||
UINT32 BufferOffset;
|
UINT32 BufferOffset;
|
||||||
UINT32 DesiredDataTransferLength;
|
UINT32 DesiredDataTransferLength;
|
||||||
} ISCSI_READY_TO_TRANSFER;
|
} ISCSI_READY_TO_TRANSFER;
|
||||||
|
|
||||||
typedef struct _ISCSI_ASYNC_MESSAGE {
|
typedef struct _ISCSI_ASYNC_MESSAGE {
|
||||||
UINT8 OpCode;
|
UINT8 OpCode;
|
||||||
UINT8 Reserved1[8];
|
UINT8 Reserved1[8];
|
||||||
UINT8 TotalAHSLength;
|
UINT8 TotalAHSLength;
|
||||||
UINT8 DataSegmentLength[3];
|
UINT8 DataSegmentLength[3];
|
||||||
UINT8 Lun[8];
|
UINT8 Lun[8];
|
||||||
UINT32 InitiatorTaskTag;
|
UINT32 InitiatorTaskTag;
|
||||||
UINT32 Reserved2;
|
UINT32 Reserved2;
|
||||||
UINT32 StatSN;
|
UINT32 StatSN;
|
||||||
UINT32 ExpCmdSN;
|
UINT32 ExpCmdSN;
|
||||||
UINT32 MaxCmdSN;
|
UINT32 MaxCmdSN;
|
||||||
UINT8 AsyncEvent;
|
UINT8 AsyncEvent;
|
||||||
UINT8 AsyncVCode;
|
UINT8 AsyncVCode;
|
||||||
UINT16 Parameter1;
|
UINT16 Parameter1;
|
||||||
UINT16 Parameter2;
|
UINT16 Parameter2;
|
||||||
UINT16 Parameter3;
|
UINT16 Parameter3;
|
||||||
UINT32 Reserved3;
|
UINT32 Reserved3;
|
||||||
} ISCSI_ASYNC_MESSAGE;
|
} ISCSI_ASYNC_MESSAGE;
|
||||||
|
|
||||||
///
|
///
|
||||||
/// Login Request.
|
/// Login Request.
|
||||||
///
|
///
|
||||||
typedef struct _ISCSI_LOGIN_REQUEST {
|
typedef struct _ISCSI_LOGIN_REQUEST {
|
||||||
UINT8 OpCode;
|
UINT8 OpCode;
|
||||||
UINT8 Flags;
|
UINT8 Flags;
|
||||||
UINT8 VersionMax;
|
UINT8 VersionMax;
|
||||||
UINT8 VersionMin;
|
UINT8 VersionMin;
|
||||||
UINT8 TotalAHSLength;
|
UINT8 TotalAHSLength;
|
||||||
UINT8 DataSegmentLength[3];
|
UINT8 DataSegmentLength[3];
|
||||||
UINT8 Isid[6];
|
UINT8 Isid[6];
|
||||||
UINT16 Tsih;
|
UINT16 Tsih;
|
||||||
UINT32 InitiatorTaskTag;
|
UINT32 InitiatorTaskTag;
|
||||||
UINT16 Cid;
|
UINT16 Cid;
|
||||||
UINT16 Reserved1;
|
UINT16 Reserved1;
|
||||||
UINT32 CmdSN;
|
UINT32 CmdSN;
|
||||||
UINT32 ExpStatSN;
|
UINT32 ExpStatSN;
|
||||||
UINT32 Reserved2[4];
|
UINT32 Reserved2[4];
|
||||||
} ISCSI_LOGIN_REQUEST;
|
} ISCSI_LOGIN_REQUEST;
|
||||||
|
|
||||||
///
|
///
|
||||||
/// Login Response.
|
/// Login Response.
|
||||||
///
|
///
|
||||||
typedef struct _ISCSI_LOGIN_RESPONSE {
|
typedef struct _ISCSI_LOGIN_RESPONSE {
|
||||||
UINT8 OpCode;
|
UINT8 OpCode;
|
||||||
UINT8 Flags;
|
UINT8 Flags;
|
||||||
UINT8 VersionMax;
|
UINT8 VersionMax;
|
||||||
UINT8 VersionActive;
|
UINT8 VersionActive;
|
||||||
UINT8 TotalAHSLength;
|
UINT8 TotalAHSLength;
|
||||||
UINT8 DataSegmentLength[3];
|
UINT8 DataSegmentLength[3];
|
||||||
UINT8 Isid[6];
|
UINT8 Isid[6];
|
||||||
UINT16 Tsih;
|
UINT16 Tsih;
|
||||||
UINT32 InitiatorTaskTag;
|
UINT32 InitiatorTaskTag;
|
||||||
UINT32 Reserved1;
|
UINT32 Reserved1;
|
||||||
UINT32 StatSN;
|
UINT32 StatSN;
|
||||||
UINT32 ExpCmdSN;
|
UINT32 ExpCmdSN;
|
||||||
UINT32 MaxCmdSN;
|
UINT32 MaxCmdSN;
|
||||||
UINT8 StatusClass;
|
UINT8 StatusClass;
|
||||||
UINT8 StatusDetail;
|
UINT8 StatusDetail;
|
||||||
UINT8 Reserved2[10];
|
UINT8 Reserved2[10];
|
||||||
} ISCSI_LOGIN_RESPONSE;
|
} ISCSI_LOGIN_RESPONSE;
|
||||||
|
|
||||||
///
|
///
|
||||||
/// Logout Request.
|
/// Logout Request.
|
||||||
///
|
///
|
||||||
typedef struct _ISCSI_LOGOUT_REQUEST {
|
typedef struct _ISCSI_LOGOUT_REQUEST {
|
||||||
UINT8 OpCode;
|
UINT8 OpCode;
|
||||||
UINT8 ReasonCode;
|
UINT8 ReasonCode;
|
||||||
UINT16 Reserved1;
|
UINT16 Reserved1;
|
||||||
UINT8 TotalAHSLength;
|
UINT8 TotalAHSLength;
|
||||||
UINT8 DataSegmentLength[3];
|
UINT8 DataSegmentLength[3];
|
||||||
UINT32 Reserved2[2];
|
UINT32 Reserved2[2];
|
||||||
UINT32 InitiatorTaskTag;
|
UINT32 InitiatorTaskTag;
|
||||||
UINT16 Cid;
|
UINT16 Cid;
|
||||||
UINT16 Reserved3;
|
UINT16 Reserved3;
|
||||||
UINT32 CmdSN;
|
UINT32 CmdSN;
|
||||||
UINT32 ExpStatSN;
|
UINT32 ExpStatSN;
|
||||||
UINT32 Reserved4[4];
|
UINT32 Reserved4[4];
|
||||||
} ISCSI_LOGOUT_REQUEST;
|
} ISCSI_LOGOUT_REQUEST;
|
||||||
|
|
||||||
///
|
///
|
||||||
/// Logout Response.
|
/// Logout Response.
|
||||||
///
|
///
|
||||||
typedef struct _ISCSI_LOGOUT_RESPONSE {
|
typedef struct _ISCSI_LOGOUT_RESPONSE {
|
||||||
UINT8 OpCode;
|
UINT8 OpCode;
|
||||||
UINT8 Reserved1;
|
UINT8 Reserved1;
|
||||||
UINT8 Response;
|
UINT8 Response;
|
||||||
UINT8 Reserved2;
|
UINT8 Reserved2;
|
||||||
UINT8 TotalAHSLength;
|
UINT8 TotalAHSLength;
|
||||||
UINT8 DataSegmentLength[3];
|
UINT8 DataSegmentLength[3];
|
||||||
UINT32 Reserved3[2];
|
UINT32 Reserved3[2];
|
||||||
UINT32 InitiatorTaskTag;
|
UINT32 InitiatorTaskTag;
|
||||||
UINT32 Reserved4;
|
UINT32 Reserved4;
|
||||||
UINT32 StatSN;
|
UINT32 StatSN;
|
||||||
UINT32 ExpCmdSN;
|
UINT32 ExpCmdSN;
|
||||||
UINT32 MaxCmdSN;
|
UINT32 MaxCmdSN;
|
||||||
UINT32 Reserved5;
|
UINT32 Reserved5;
|
||||||
UINT16 Time2Wait;
|
UINT16 Time2Wait;
|
||||||
UINT16 Time2Retain;
|
UINT16 Time2Retain;
|
||||||
UINT32 Reserved6;
|
UINT32 Reserved6;
|
||||||
} ISCSI_LOGOUT_RESPONSE;
|
} ISCSI_LOGOUT_RESPONSE;
|
||||||
|
|
||||||
///
|
///
|
||||||
/// SNACK Request.
|
/// SNACK Request.
|
||||||
///
|
///
|
||||||
typedef struct _ISCSI_SNACK_REQUEST {
|
typedef struct _ISCSI_SNACK_REQUEST {
|
||||||
UINT8 OpCode;
|
UINT8 OpCode;
|
||||||
UINT8 Type;
|
UINT8 Type;
|
||||||
UINT16 Reserved1;
|
UINT16 Reserved1;
|
||||||
UINT8 TotalAHSLength;
|
UINT8 TotalAHSLength;
|
||||||
UINT8 DataSegmentLength[3];
|
UINT8 DataSegmentLength[3];
|
||||||
UINT8 Lun[8];
|
UINT8 Lun[8];
|
||||||
UINT32 InitiatorTaskTag;
|
UINT32 InitiatorTaskTag;
|
||||||
UINT32 TargetTransferTag;
|
UINT32 TargetTransferTag;
|
||||||
UINT32 Reserved2;
|
UINT32 Reserved2;
|
||||||
UINT32 ExpStatSN;
|
UINT32 ExpStatSN;
|
||||||
UINT32 Reserved[2];
|
UINT32 Reserved[2];
|
||||||
UINT32 BegRun;
|
UINT32 BegRun;
|
||||||
UINT32 RunLength;
|
UINT32 RunLength;
|
||||||
} ISCSI_SNACK_REQUEST;
|
} ISCSI_SNACK_REQUEST;
|
||||||
|
|
||||||
///
|
///
|
||||||
/// Reject.
|
/// Reject.
|
||||||
///
|
///
|
||||||
typedef struct _ISCSI_REJECT {
|
typedef struct _ISCSI_REJECT {
|
||||||
UINT8 OpCode;
|
UINT8 OpCode;
|
||||||
UINT8 Reserved1;
|
UINT8 Reserved1;
|
||||||
UINT8 Reason;
|
UINT8 Reason;
|
||||||
UINT8 Reserved2;
|
UINT8 Reserved2;
|
||||||
UINT8 TotalAHSLength;
|
UINT8 TotalAHSLength;
|
||||||
UINT8 DataSegmentLength[3];
|
UINT8 DataSegmentLength[3];
|
||||||
UINT32 Reserved3[2];
|
UINT32 Reserved3[2];
|
||||||
UINT32 InitiatorTaskTag;
|
UINT32 InitiatorTaskTag;
|
||||||
UINT32 Reserved4;
|
UINT32 Reserved4;
|
||||||
UINT32 StatSN;
|
UINT32 StatSN;
|
||||||
UINT32 ExpCmdSN;
|
UINT32 ExpCmdSN;
|
||||||
UINT32 MaxCmdSN;
|
UINT32 MaxCmdSN;
|
||||||
UINT32 DataSN;
|
UINT32 DataSN;
|
||||||
UINT32 Reserved5[2];
|
UINT32 Reserved5[2];
|
||||||
} ISCSI_REJECT;
|
} ISCSI_REJECT;
|
||||||
|
|
||||||
///
|
///
|
||||||
/// NOP-Out.
|
/// NOP-Out.
|
||||||
///
|
///
|
||||||
typedef struct _ISCSI_NOP_OUT {
|
typedef struct _ISCSI_NOP_OUT {
|
||||||
UINT8 OpCode;
|
UINT8 OpCode;
|
||||||
UINT8 Reserved1[3];
|
UINT8 Reserved1[3];
|
||||||
UINT8 TotalAHSLength;
|
UINT8 TotalAHSLength;
|
||||||
UINT8 DataSegmentLength[3];
|
UINT8 DataSegmentLength[3];
|
||||||
UINT8 Lun[8];
|
UINT8 Lun[8];
|
||||||
UINT32 InitiatorTaskTag;
|
UINT32 InitiatorTaskTag;
|
||||||
UINT32 TargetTransferTag;
|
UINT32 TargetTransferTag;
|
||||||
UINT32 CmdSN;
|
UINT32 CmdSN;
|
||||||
UINT32 ExpStatSN;
|
UINT32 ExpStatSN;
|
||||||
UINT32 Reserved2[4];
|
UINT32 Reserved2[4];
|
||||||
} ISCSI_NOP_OUT;
|
} ISCSI_NOP_OUT;
|
||||||
|
|
||||||
///
|
///
|
||||||
/// NOP-In.
|
/// NOP-In.
|
||||||
///
|
///
|
||||||
typedef struct _ISCSI_NOP_IN {
|
typedef struct _ISCSI_NOP_IN {
|
||||||
UINT8 OpCode;
|
UINT8 OpCode;
|
||||||
UINT8 Reserved1[3];
|
UINT8 Reserved1[3];
|
||||||
UINT8 TotalAHSLength;
|
UINT8 TotalAHSLength;
|
||||||
UINT8 DataSegmentLength[3];
|
UINT8 DataSegmentLength[3];
|
||||||
UINT8 Lun[8];
|
UINT8 Lun[8];
|
||||||
UINT32 InitiatorTaskTag;
|
UINT32 InitiatorTaskTag;
|
||||||
UINT32 TargetTransferTag;
|
UINT32 TargetTransferTag;
|
||||||
UINT32 StatSN;
|
UINT32 StatSN;
|
||||||
UINT32 ExpCmdSN;
|
UINT32 ExpCmdSN;
|
||||||
UINT32 MaxCmdSN;
|
UINT32 MaxCmdSN;
|
||||||
UINT32 Reserved2[3];
|
UINT32 Reserved2[3];
|
||||||
} ISCSI_NOP_IN;
|
} ISCSI_NOP_IN;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
@ -583,41 +583,41 @@ typedef enum {
|
|||||||
} ISCSI_DIGEST_TYPE;
|
} ISCSI_DIGEST_TYPE;
|
||||||
|
|
||||||
typedef struct _ISCSI_XFER_CONTEXT {
|
typedef struct _ISCSI_XFER_CONTEXT {
|
||||||
UINT32 TargetTransferTag;
|
UINT32 TargetTransferTag;
|
||||||
UINT32 Offset;
|
UINT32 Offset;
|
||||||
UINT32 DesiredLength;
|
UINT32 DesiredLength;
|
||||||
UINT32 ExpDataSN;
|
UINT32 ExpDataSN;
|
||||||
} ISCSI_XFER_CONTEXT;
|
} ISCSI_XFER_CONTEXT;
|
||||||
|
|
||||||
typedef struct _ISCSI_IN_BUFFER_CONTEXT {
|
typedef struct _ISCSI_IN_BUFFER_CONTEXT {
|
||||||
UINT8 *InData;
|
UINT8 *InData;
|
||||||
UINT32 InDataLen;
|
UINT32 InDataLen;
|
||||||
} ISCSI_IN_BUFFER_CONTEXT;
|
} ISCSI_IN_BUFFER_CONTEXT;
|
||||||
|
|
||||||
typedef struct _ISCSI_TCB {
|
typedef struct _ISCSI_TCB {
|
||||||
LIST_ENTRY Link;
|
LIST_ENTRY Link;
|
||||||
|
|
||||||
BOOLEAN SoFarInOrder;
|
BOOLEAN SoFarInOrder;
|
||||||
UINT32 ExpDataSN;
|
UINT32 ExpDataSN;
|
||||||
BOOLEAN FbitReceived;
|
BOOLEAN FbitReceived;
|
||||||
BOOLEAN StatusXferd;
|
BOOLEAN StatusXferd;
|
||||||
UINT32 ActiveR2Ts;
|
UINT32 ActiveR2Ts;
|
||||||
UINT32 Response;
|
UINT32 Response;
|
||||||
CHAR8 *Reason;
|
CHAR8 *Reason;
|
||||||
UINT32 InitiatorTaskTag;
|
UINT32 InitiatorTaskTag;
|
||||||
UINT32 CmdSN;
|
UINT32 CmdSN;
|
||||||
UINT32 SNACKTag;
|
UINT32 SNACKTag;
|
||||||
|
|
||||||
ISCSI_XFER_CONTEXT XferContext;
|
ISCSI_XFER_CONTEXT XferContext;
|
||||||
|
|
||||||
ISCSI_CONNECTION *Conn;
|
ISCSI_CONNECTION *Conn;
|
||||||
} ISCSI_TCB;
|
} ISCSI_TCB;
|
||||||
|
|
||||||
typedef struct _ISCSI_KEY_VALUE_PAIR {
|
typedef struct _ISCSI_KEY_VALUE_PAIR {
|
||||||
LIST_ENTRY List;
|
LIST_ENTRY List;
|
||||||
|
|
||||||
CHAR8 *Key;
|
CHAR8 *Key;
|
||||||
CHAR8 *Value;
|
CHAR8 *Value;
|
||||||
} ISCSI_KEY_VALUE_PAIR;
|
} ISCSI_KEY_VALUE_PAIR;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -657,8 +657,8 @@ IScsiDetatchConnection (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
IScsiConnLogin (
|
IScsiConnLogin (
|
||||||
IN OUT ISCSI_CONNECTION *Conn,
|
IN OUT ISCSI_CONNECTION *Conn,
|
||||||
IN UINT16 Timeout
|
IN UINT16 Timeout
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -671,7 +671,7 @@ IScsiConnLogin (
|
|||||||
**/
|
**/
|
||||||
ISCSI_CONNECTION *
|
ISCSI_CONNECTION *
|
||||||
IScsiCreateConnection (
|
IScsiCreateConnection (
|
||||||
IN ISCSI_SESSION *Session
|
IN ISCSI_SESSION *Session
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -764,9 +764,9 @@ IScsiReceiveLoginRsp (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
IScsiAddKeyValuePair (
|
IScsiAddKeyValuePair (
|
||||||
IN OUT NET_BUF *Pdu,
|
IN OUT NET_BUF *Pdu,
|
||||||
IN CHAR8 *Key,
|
IN CHAR8 *Key,
|
||||||
IN CHAR8 *Value
|
IN CHAR8 *Value
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -818,9 +818,9 @@ IScsiProcessLoginRsp (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
IScsiUpdateTargetAddress (
|
IScsiUpdateTargetAddress (
|
||||||
IN OUT ISCSI_SESSION *Session,
|
IN OUT ISCSI_SESSION *Session,
|
||||||
IN CHAR8 *Data,
|
IN CHAR8 *Data,
|
||||||
IN UINT32 Len
|
IN UINT32 Len
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -832,7 +832,7 @@ IScsiUpdateTargetAddress (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
IScsiFreeNbufList (
|
IScsiFreeNbufList (
|
||||||
VOID *Arg
|
VOID *Arg
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -857,12 +857,12 @@ IScsiFreeNbufList (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
IScsiReceivePdu (
|
IScsiReceivePdu (
|
||||||
IN ISCSI_CONNECTION *Conn,
|
IN ISCSI_CONNECTION *Conn,
|
||||||
OUT NET_BUF **Pdu,
|
OUT NET_BUF **Pdu,
|
||||||
IN ISCSI_IN_BUFFER_CONTEXT *Context OPTIONAL,
|
IN ISCSI_IN_BUFFER_CONTEXT *Context OPTIONAL,
|
||||||
IN BOOLEAN HeaderDigest,
|
IN BOOLEAN HeaderDigest,
|
||||||
IN BOOLEAN DataDigest,
|
IN BOOLEAN DataDigest,
|
||||||
IN EFI_EVENT TimeoutEvent OPTIONAL
|
IN EFI_EVENT TimeoutEvent OPTIONAL
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -905,8 +905,8 @@ IScsiFillOpParams (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
IScsiPadSegment (
|
IScsiPadSegment (
|
||||||
IN OUT NET_BUF *Pdu,
|
IN OUT NET_BUF *Pdu,
|
||||||
IN UINT32 Len
|
IN UINT32 Len
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -921,8 +921,8 @@ IScsiPadSegment (
|
|||||||
**/
|
**/
|
||||||
LIST_ENTRY *
|
LIST_ENTRY *
|
||||||
IScsiBuildKeyValueList (
|
IScsiBuildKeyValueList (
|
||||||
IN CHAR8 *Data,
|
IN CHAR8 *Data,
|
||||||
IN UINT32 Len
|
IN UINT32 Len
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -938,8 +938,8 @@ IScsiBuildKeyValueList (
|
|||||||
**/
|
**/
|
||||||
CHAR8 *
|
CHAR8 *
|
||||||
IScsiGetValueByKeyFromList (
|
IScsiGetValueByKeyFromList (
|
||||||
IN OUT LIST_ENTRY *KeyValueList,
|
IN OUT LIST_ENTRY *KeyValueList,
|
||||||
IN CHAR8 *Key
|
IN CHAR8 *Key
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -950,7 +950,7 @@ IScsiGetValueByKeyFromList (
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
IScsiFreeKeyValueList (
|
IScsiFreeKeyValueList (
|
||||||
IN LIST_ENTRY *KeyValueList
|
IN LIST_ENTRY *KeyValueList
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -965,8 +965,8 @@ IScsiFreeKeyValueList (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
IScsiNormalizeName (
|
IScsiNormalizeName (
|
||||||
IN OUT CHAR8 *Name,
|
IN OUT CHAR8 *Name,
|
||||||
IN UINTN Len
|
IN UINTN Len
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -14,6 +14,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
0x4d20583a, 0x7765, 0x4e7a, { 0x8a, 0x67, 0xdc, 0xde, 0x74, 0xee, 0x3e, 0xc5 } \
|
0x4d20583a, 0x7765, 0x4e7a, { 0x8a, 0x67, 0xdc, 0xde, 0x74, 0xee, 0x3e, 0xc5 } \
|
||||||
}
|
}
|
||||||
|
|
||||||
extern EFI_GUID gHttpBootConfigGuid;
|
extern EFI_GUID gHttpBootConfigGuid;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -24,9 +24,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
0x46ddb415, 0x5244, 0x49c7, { 0x93, 0x74, 0xf0, 0xe2, 0x98, 0xe7, 0xd3, 0x86 } \
|
0x46ddb415, 0x5244, 0x49c7, { 0x93, 0x74, 0xf0, 0xe2, 0x98, 0xe7, 0xd3, 0x86 } \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define EDKII_HTTP_TLS_CIPHER_LIST_VARIABLE L"HttpTlsCipherList"
|
#define EDKII_HTTP_TLS_CIPHER_LIST_VARIABLE L"HttpTlsCipherList"
|
||||||
|
|
||||||
extern EFI_GUID gEdkiiHttpTlsCipherListGuid;
|
extern EFI_GUID gEdkiiHttpTlsCipherListGuid;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -15,6 +15,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
0x4b47d616, 0xa8d6, 0x4552, { 0x9d, 0x44, 0xcc, 0xad, 0x2e, 0xf, 0x4c, 0xf9 } \
|
0x4b47d616, 0xa8d6, 0x4552, { 0x9d, 0x44, 0xcc, 0xad, 0x2e, 0xf, 0x4c, 0xf9 } \
|
||||||
}
|
}
|
||||||
|
|
||||||
extern EFI_GUID gIScsiConfigGuid;
|
extern EFI_GUID gIScsiConfigGuid;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -14,6 +14,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
0x9b942747, 0x154e, 0x4d29, { 0xa4, 0x36, 0xbf, 0x71, 0x0, 0xc8, 0xb5, 0x3b } \
|
0x9b942747, 0x154e, 0x4d29, { 0xa4, 0x36, 0xbf, 0x71, 0x0, 0xc8, 0xb5, 0x3b } \
|
||||||
}
|
}
|
||||||
|
|
||||||
extern EFI_GUID gIp4Config2NvDataGuid;
|
extern EFI_GUID gIp4Config2NvDataGuid;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -19,7 +19,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
0x786ec0ac, 0x65ae, 0x4d1b, {0xb1, 0x37, 0xd, 0x11, 0xa, 0x48, 0x37, 0x97} \
|
0x786ec0ac, 0x65ae, 0x4d1b, {0xb1, 0x37, 0xd, 0x11, 0xa, 0x48, 0x37, 0x97} \
|
||||||
}
|
}
|
||||||
|
|
||||||
extern EFI_GUID gIp4IScsiConfigGuid;
|
extern EFI_GUID gIp4IScsiConfigGuid;
|
||||||
extern EFI_GUID gIScsiCHAPAuthInfoGuid;
|
extern EFI_GUID gIScsiCHAPAuthInfoGuid;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -14,6 +14,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
0x2eea107, 0x98db, 0x400e, { 0x98, 0x30, 0x46, 0xa, 0x15, 0x42, 0xd7, 0x99 } \
|
0x2eea107, 0x98db, 0x400e, { 0x98, 0x30, 0x46, 0xa, 0x15, 0x42, 0xd7, 0x99 } \
|
||||||
}
|
}
|
||||||
|
|
||||||
extern EFI_GUID gIp6ConfigNvDataGuid;
|
extern EFI_GUID gIp6ConfigNvDataGuid;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -14,7 +14,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
0xb0eae4f8, 0x9a04, 0x4c6d, { 0xa7, 0x48, 0x79, 0x3d, 0xaa, 0xf, 0x65, 0xdf } \
|
0xb0eae4f8, 0x9a04, 0x4c6d, { 0xa7, 0x48, 0x79, 0x3d, 0xaa, 0xf, 0x65, 0xdf } \
|
||||||
}
|
}
|
||||||
|
|
||||||
extern EFI_GUID gTlsAuthConfigGuid;
|
extern EFI_GUID gTlsAuthConfigGuid;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -16,9 +16,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
0xfd2340D0, 0x3dab, 0x4349, { 0xa6, 0xc7, 0x3b, 0x4f, 0x12, 0xb4, 0x8e, 0xae } \
|
0xfd2340D0, 0x3dab, 0x4349, { 0xa6, 0xc7, 0x3b, 0x4f, 0x12, 0xb4, 0x8e, 0xae } \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define EFI_TLS_CA_CERTIFICATE_VARIABLE L"TlsCaCertificate"
|
#define EFI_TLS_CA_CERTIFICATE_VARIABLE L"TlsCaCertificate"
|
||||||
|
|
||||||
extern EFI_GUID gEfiTlsCaCertificateGuid;
|
extern EFI_GUID gEfiTlsCaCertificateGuid;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -14,6 +14,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
0xd79df6b0, 0xef44, 0x43bd, {0x97, 0x97, 0x43, 0xe9, 0x3b, 0xcf, 0x5f, 0xa8 } \
|
0xd79df6b0, 0xef44, 0x43bd, {0x97, 0x97, 0x43, 0xe9, 0x3b, 0xcf, 0x5f, 0xa8 } \
|
||||||
}
|
}
|
||||||
|
|
||||||
extern EFI_GUID gVlanConfigFormSetGuid;
|
extern EFI_GUID gVlanConfigFormSetGuid;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -14,6 +14,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
0x9f94d327, 0x0b18, 0x4245, { 0x8f, 0xf2, 0x83, 0x2e, 0x30, 0xd, 0x2c, 0xef } \
|
0x9f94d327, 0x0b18, 0x4245, { 0x8f, 0xf2, 0x83, 0x2e, 0x30, 0xd, 0x2c, 0xef } \
|
||||||
}
|
}
|
||||||
|
|
||||||
extern EFI_GUID gWifiConfigGuid;
|
extern EFI_GUID gWifiConfigGuid;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -15,9 +15,9 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
|||||||
#include <Library/HttpLib.h>
|
#include <Library/HttpLib.h>
|
||||||
#include <Library/NetLib.h>
|
#include <Library/NetLib.h>
|
||||||
|
|
||||||
#define HTTP_IO_MAX_SEND_PAYLOAD 1024
|
#define HTTP_IO_MAX_SEND_PAYLOAD 1024
|
||||||
#define HTTP_IO_CHUNK_SIZE_STRING_LEN 50
|
#define HTTP_IO_CHUNK_SIZE_STRING_LEN 50
|
||||||
#define HTTP_IO_CHUNKED_TRANSFER_CODING_DATA_LENGTH 256
|
#define HTTP_IO_CHUNKED_TRANSFER_CODING_DATA_LENGTH 256
|
||||||
|
|
||||||
///
|
///
|
||||||
/// HTTP_IO_CALLBACK_EVENT
|
/// HTTP_IO_CALLBACK_EVENT
|
||||||
@ -39,7 +39,7 @@ typedef enum {
|
|||||||
**/
|
**/
|
||||||
typedef
|
typedef
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
(EFIAPI * HTTP_IO_CALLBACK) (
|
(EFIAPI *HTTP_IO_CALLBACK)(
|
||||||
IN HTTP_IO_CALLBACK_EVENT EventType,
|
IN HTTP_IO_CALLBACK_EVENT EventType,
|
||||||
IN EFI_HTTP_MESSAGE *Message,
|
IN EFI_HTTP_MESSAGE *Message,
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
@ -49,70 +49,70 @@ EFI_STATUS
|
|||||||
/// A wrapper structure to hold the received HTTP response data.
|
/// A wrapper structure to hold the received HTTP response data.
|
||||||
///
|
///
|
||||||
typedef struct {
|
typedef struct {
|
||||||
EFI_HTTP_RESPONSE_DATA Response;
|
EFI_HTTP_RESPONSE_DATA Response;
|
||||||
UINTN HeaderCount;
|
UINTN HeaderCount;
|
||||||
EFI_HTTP_HEADER *Headers;
|
EFI_HTTP_HEADER *Headers;
|
||||||
UINTN BodyLength;
|
UINTN BodyLength;
|
||||||
CHAR8 *Body;
|
CHAR8 *Body;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
} HTTP_IO_RESPONSE_DATA;
|
} HTTP_IO_RESPONSE_DATA;
|
||||||
|
|
||||||
///
|
///
|
||||||
/// HTTP_IO configuration data for IPv4
|
/// HTTP_IO configuration data for IPv4
|
||||||
///
|
///
|
||||||
typedef struct {
|
typedef struct {
|
||||||
EFI_HTTP_VERSION HttpVersion;
|
EFI_HTTP_VERSION HttpVersion;
|
||||||
UINT32 RequestTimeOut; ///< In milliseconds.
|
UINT32 RequestTimeOut; ///< In milliseconds.
|
||||||
UINT32 ResponseTimeOut; ///< In milliseconds.
|
UINT32 ResponseTimeOut; ///< In milliseconds.
|
||||||
BOOLEAN UseDefaultAddress;
|
BOOLEAN UseDefaultAddress;
|
||||||
EFI_IPv4_ADDRESS LocalIp;
|
EFI_IPv4_ADDRESS LocalIp;
|
||||||
EFI_IPv4_ADDRESS SubnetMask;
|
EFI_IPv4_ADDRESS SubnetMask;
|
||||||
UINT16 LocalPort;
|
UINT16 LocalPort;
|
||||||
} HTTP4_IO_CONFIG_DATA;
|
} HTTP4_IO_CONFIG_DATA;
|
||||||
|
|
||||||
///
|
///
|
||||||
/// HTTP_IO configuration data for IPv6
|
/// HTTP_IO configuration data for IPv6
|
||||||
///
|
///
|
||||||
typedef struct {
|
typedef struct {
|
||||||
EFI_HTTP_VERSION HttpVersion;
|
EFI_HTTP_VERSION HttpVersion;
|
||||||
UINT32 RequestTimeOut; ///< In milliseconds.
|
UINT32 RequestTimeOut; ///< In milliseconds.
|
||||||
BOOLEAN UseDefaultAddress;
|
BOOLEAN UseDefaultAddress;
|
||||||
EFI_IPv6_ADDRESS LocalIp;
|
EFI_IPv6_ADDRESS LocalIp;
|
||||||
UINT16 LocalPort;
|
UINT16 LocalPort;
|
||||||
} HTTP6_IO_CONFIG_DATA;
|
} HTTP6_IO_CONFIG_DATA;
|
||||||
|
|
||||||
///
|
///
|
||||||
/// HTTP_IO configuration
|
/// HTTP_IO configuration
|
||||||
///
|
///
|
||||||
typedef union {
|
typedef union {
|
||||||
HTTP4_IO_CONFIG_DATA Config4;
|
HTTP4_IO_CONFIG_DATA Config4;
|
||||||
HTTP6_IO_CONFIG_DATA Config6;
|
HTTP6_IO_CONFIG_DATA Config6;
|
||||||
} HTTP_IO_CONFIG_DATA;
|
} HTTP_IO_CONFIG_DATA;
|
||||||
|
|
||||||
///
|
///
|
||||||
/// HTTP_IO wrapper of the EFI HTTP service.
|
/// HTTP_IO wrapper of the EFI HTTP service.
|
||||||
///
|
///
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINT8 IpVersion;
|
UINT8 IpVersion;
|
||||||
EFI_HANDLE Image;
|
EFI_HANDLE Image;
|
||||||
EFI_HANDLE Controller;
|
EFI_HANDLE Controller;
|
||||||
EFI_HANDLE Handle;
|
EFI_HANDLE Handle;
|
||||||
|
|
||||||
EFI_HTTP_PROTOCOL *Http;
|
EFI_HTTP_PROTOCOL *Http;
|
||||||
|
|
||||||
HTTP_IO_CALLBACK Callback;
|
HTTP_IO_CALLBACK Callback;
|
||||||
VOID *Context;
|
VOID *Context;
|
||||||
|
|
||||||
EFI_HTTP_TOKEN ReqToken;
|
EFI_HTTP_TOKEN ReqToken;
|
||||||
EFI_HTTP_MESSAGE ReqMessage;
|
EFI_HTTP_MESSAGE ReqMessage;
|
||||||
EFI_HTTP_TOKEN RspToken;
|
EFI_HTTP_TOKEN RspToken;
|
||||||
EFI_HTTP_MESSAGE RspMessage;
|
EFI_HTTP_MESSAGE RspMessage;
|
||||||
|
|
||||||
BOOLEAN IsTxDone;
|
BOOLEAN IsTxDone;
|
||||||
BOOLEAN IsRxDone;
|
BOOLEAN IsRxDone;
|
||||||
|
|
||||||
EFI_EVENT TimeoutEvent;
|
EFI_EVENT TimeoutEvent;
|
||||||
UINT32 Timeout;
|
UINT32 Timeout;
|
||||||
} HTTP_IO;
|
} HTTP_IO;
|
||||||
|
|
||||||
///
|
///
|
||||||
@ -140,9 +140,9 @@ typedef enum {
|
|||||||
/// Chunk links for HTTP chunked transfer coding.
|
/// Chunk links for HTTP chunked transfer coding.
|
||||||
///
|
///
|
||||||
typedef struct {
|
typedef struct {
|
||||||
LIST_ENTRY NextChunk;
|
LIST_ENTRY NextChunk;
|
||||||
UINTN Length;
|
UINTN Length;
|
||||||
CHAR8 *Data;
|
CHAR8 *Data;
|
||||||
} HTTP_IO_CHUNKS;
|
} HTTP_IO_CHUNKS;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -154,7 +154,7 @@ typedef struct {
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
HttpIoNotifyDpc (
|
HttpIoNotifyDpc (
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -167,8 +167,8 @@ HttpIoNotifyDpc (
|
|||||||
VOID
|
VOID
|
||||||
EFIAPI
|
EFIAPI
|
||||||
HttpIoNotify (
|
HttpIoNotify (
|
||||||
IN EFI_EVENT Event,
|
IN EFI_EVENT Event,
|
||||||
IN VOID *Context
|
IN VOID *Context
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -179,7 +179,7 @@ HttpIoNotify (
|
|||||||
**/
|
**/
|
||||||
VOID
|
VOID
|
||||||
HttpIoDestroyIo (
|
HttpIoDestroyIo (
|
||||||
IN HTTP_IO *HttpIo
|
IN HTTP_IO *HttpIo
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -205,13 +205,13 @@ HttpIoDestroyIo (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpIoCreateIo (
|
HttpIoCreateIo (
|
||||||
IN EFI_HANDLE Image,
|
IN EFI_HANDLE Image,
|
||||||
IN EFI_HANDLE Controller,
|
IN EFI_HANDLE Controller,
|
||||||
IN UINT8 IpVersion,
|
IN UINT8 IpVersion,
|
||||||
IN HTTP_IO_CONFIG_DATA *ConfigData,
|
IN HTTP_IO_CONFIG_DATA *ConfigData,
|
||||||
IN HTTP_IO_CALLBACK Callback,
|
IN HTTP_IO_CALLBACK Callback,
|
||||||
IN VOID *Context,
|
IN VOID *Context,
|
||||||
OUT HTTP_IO *HttpIo
|
OUT HTTP_IO *HttpIo
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -258,9 +258,9 @@ HttpIoSendRequest (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpIoRecvResponse (
|
HttpIoRecvResponse (
|
||||||
IN HTTP_IO *HttpIo,
|
IN HTTP_IO *HttpIo,
|
||||||
IN BOOLEAN RecvMsgHeader,
|
IN BOOLEAN RecvMsgHeader,
|
||||||
OUT HTTP_IO_RESPONSE_DATA *ResponseData
|
OUT HTTP_IO_RESPONSE_DATA *ResponseData
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -276,9 +276,9 @@ HttpIoRecvResponse (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpIoGetContentLength (
|
HttpIoGetContentLength (
|
||||||
IN UINTN HeaderCount,
|
IN UINTN HeaderCount,
|
||||||
IN EFI_HTTP_HEADER *Headers,
|
IN EFI_HTTP_HEADER *Headers,
|
||||||
OUT UINTN *ContentLength
|
OUT UINTN *ContentLength
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -301,11 +301,11 @@ HttpIoGetContentLength (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpIoGetChunkedTransferContent (
|
HttpIoGetChunkedTransferContent (
|
||||||
IN HTTP_IO *HttpIo,
|
IN HTTP_IO *HttpIo,
|
||||||
IN UINTN HeaderCount,
|
IN UINTN HeaderCount,
|
||||||
IN EFI_HTTP_HEADER *Headers,
|
IN EFI_HTTP_HEADER *Headers,
|
||||||
OUT LIST_ENTRY **ChunkListHead,
|
OUT LIST_ENTRY **ChunkListHead,
|
||||||
OUT UINTN *ContentLength
|
OUT UINTN *ContentLength
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -321,8 +321,9 @@ HttpIoGetChunkedTransferContent (
|
|||||||
**/
|
**/
|
||||||
EFI_STATUS
|
EFI_STATUS
|
||||||
HttpIoSendChunkedTransfer (
|
HttpIoSendChunkedTransfer (
|
||||||
IN HTTP_IO *HttpIo,
|
IN HTTP_IO *HttpIo,
|
||||||
IN HTTP_IO_SEND_CHUNK_PROCESS *SendChunkProcess,
|
IN HTTP_IO_SEND_CHUNK_PROCESS *SendChunkProcess,
|
||||||
IN EFI_HTTP_MESSAGE *RequestMessage
|
IN EFI_HTTP_MESSAGE *RequestMessage
|
||||||
);
|
);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user