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:
Michael Kubacki
2021-12-05 14:54:07 -08:00
committed by mergify[bot]
parent 2f88bd3a12
commit d1050b9dff
294 changed files with 29888 additions and 30440 deletions

View File

@ -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;
} }

View File

@ -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;

View File

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

View File

@ -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;

View File

@ -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
); );
/** /**

View File

@ -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;
} }

View File

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

View File

@ -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.

View File

@ -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;
// //

View File

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

View File

@ -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));
} }

View File

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

View File

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

View File

@ -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) {

View File

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

View File

@ -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)
); );
} }

View File

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

View File

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

View File

@ -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;
} }

View File

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

View File

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

View File

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

View File

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

View File

@ -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;
} }

View File

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

View File

@ -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;

View File

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

View File

@ -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
); );
/** /**

View File

@ -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;
} }

View File

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

View File

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

View File

@ -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);

View File

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

View File

@ -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)
); );
} }

View File

@ -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.
// //

View File

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

View File

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

View File

@ -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;

View File

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

View File

@ -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;
} }

View File

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

View File

@ -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;
} }

View File

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

View File

@ -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;
} }

View File

@ -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;

View File

@ -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;
} }

View File

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

View File

@ -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 }
}; };
/** /**

View File

@ -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);
} }

View File

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

View File

@ -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;
} }

View File

@ -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;
/** /**

View File

@ -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);
} }

View File

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

View File

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

View File

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

View File

@ -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;
} }

View File

@ -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.

View File

@ -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;
} }

View File

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

View File

@ -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;

View File

@ -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.

View File

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

View File

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

View File

@ -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()

View File

@ -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.
// //

View File

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

View File

@ -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;
} }

View File

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

View File

@ -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;
} }

View File

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

View File

@ -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;
} }

View File

@ -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
); );
/** /**

View File

@ -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;
} }
} }

View File

@ -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;
} }

View File

@ -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)

View File

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

View File

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

View File

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

View File

@ -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
); );
/** /**

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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