mirror of
https://github.com/CloverHackyColor/CloverBootloader.git
synced 2024-12-27 16:58:09 +01:00
380 lines
16 KiB
C
380 lines
16 KiB
C
|
/** @file
|
||
|
EFI ARP Protocol Definition
|
||
|
|
||
|
The EFI ARP Service Binding Protocol is used to locate EFI
|
||
|
ARP Protocol drivers to create and destroy child of the
|
||
|
driver to communicate with other host using ARP protocol.
|
||
|
The EFI ARP Protocol provides services to map IP network
|
||
|
address to hardware address used by a data link protocol.
|
||
|
|
||
|
Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
|
||
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||
|
|
||
|
@par Revision Reference:
|
||
|
This Protocol was introduced in UEFI Specification 2.0.
|
||
|
|
||
|
**/
|
||
|
|
||
|
#ifndef __EFI_ARP_PROTOCOL_H__
|
||
|
#define __EFI_ARP_PROTOCOL_H__
|
||
|
|
||
|
#define EFI_ARP_SERVICE_BINDING_PROTOCOL_GUID \
|
||
|
{ \
|
||
|
0xf44c00ee, 0x1f2c, 0x4a00, {0xaa, 0x9, 0x1c, 0x9f, 0x3e, 0x8, 0x0, 0xa3 } \
|
||
|
}
|
||
|
|
||
|
#define EFI_ARP_PROTOCOL_GUID \
|
||
|
{ \
|
||
|
0xf4b427bb, 0xba21, 0x4f16, {0xbc, 0x4e, 0x43, 0xe4, 0x16, 0xab, 0x61, 0x9c } \
|
||
|
}
|
||
|
|
||
|
typedef struct _EFI_ARP_PROTOCOL EFI_ARP_PROTOCOL;
|
||
|
|
||
|
typedef struct {
|
||
|
///
|
||
|
/// Length in bytes of this entry.
|
||
|
///
|
||
|
UINT32 Size;
|
||
|
|
||
|
///
|
||
|
/// Set to TRUE if this entry is a "deny" entry.
|
||
|
/// Set to FALSE if this entry is a "normal" entry.
|
||
|
///
|
||
|
BOOLEAN DenyFlag;
|
||
|
|
||
|
///
|
||
|
/// Set to TRUE if this entry will not time out.
|
||
|
/// Set to FALSE if this entry will time out.
|
||
|
///
|
||
|
BOOLEAN StaticFlag;
|
||
|
|
||
|
///
|
||
|
/// 16-bit ARP hardware identifier number.
|
||
|
///
|
||
|
UINT16 HwAddressType;
|
||
|
|
||
|
///
|
||
|
/// 16-bit protocol type number.
|
||
|
///
|
||
|
UINT16 SwAddressType;
|
||
|
|
||
|
///
|
||
|
/// The length of the hardware address.
|
||
|
///
|
||
|
UINT8 HwAddressLength;
|
||
|
|
||
|
///
|
||
|
/// The length of the protocol address.
|
||
|
///
|
||
|
UINT8 SwAddressLength;
|
||
|
} EFI_ARP_FIND_DATA;
|
||
|
|
||
|
typedef struct {
|
||
|
///
|
||
|
/// 16-bit protocol type number in host byte order.
|
||
|
///
|
||
|
UINT16 SwAddressType;
|
||
|
|
||
|
///
|
||
|
/// The length in bytes of the station's protocol address to register.
|
||
|
///
|
||
|
UINT8 SwAddressLength;
|
||
|
|
||
|
///
|
||
|
/// The pointer to the first byte of the protocol address to register. For
|
||
|
/// example, if SwAddressType is 0x0800 (IP), then
|
||
|
/// StationAddress points to the first byte of this station's IP
|
||
|
/// address stored in network byte order.
|
||
|
///
|
||
|
VOID *StationAddress;
|
||
|
|
||
|
///
|
||
|
/// The timeout value in 100-ns units that is associated with each
|
||
|
/// new dynamic ARP cache entry. If it is set to zero, the value is
|
||
|
/// implementation-specific.
|
||
|
///
|
||
|
UINT32 EntryTimeOut;
|
||
|
|
||
|
///
|
||
|
/// The number of retries before a MAC address is resolved. If it is
|
||
|
/// set to zero, the value is implementation-specific.
|
||
|
///
|
||
|
UINT32 RetryCount;
|
||
|
|
||
|
///
|
||
|
/// The timeout value in 100-ns units that is used to wait for the ARP
|
||
|
/// reply packet or the timeout value between two retries. Set to zero
|
||
|
/// to use implementation-specific value.
|
||
|
///
|
||
|
UINT32 RetryTimeOut;
|
||
|
} EFI_ARP_CONFIG_DATA;
|
||
|
|
||
|
|
||
|
/**
|
||
|
This function is used to assign a station address to the ARP cache for this instance
|
||
|
of the ARP driver.
|
||
|
|
||
|
Each ARP instance has one station address. The EFI_ARP_PROTOCOL driver will
|
||
|
respond to ARP requests that match this registered station address. A call to
|
||
|
this function with the ConfigData field set to NULL will reset this ARP instance.
|
||
|
|
||
|
Once a protocol type and station address have been assigned to this ARP instance,
|
||
|
all the following ARP functions will use this information. Attempting to change
|
||
|
the protocol type or station address to a configured ARP instance will result in errors.
|
||
|
|
||
|
@param This The pointer to the EFI_ARP_PROTOCOL instance.
|
||
|
@param ConfigData The pointer to the EFI_ARP_CONFIG_DATA structure.
|
||
|
|
||
|
@retval EFI_SUCCESS The new station address was successfully
|
||
|
registered.
|
||
|
@retval EFI_INVALID_PARAMETER One or more of the following conditions is TRUE:
|
||
|
* This is NULL.
|
||
|
* SwAddressLength is zero when ConfigData is not NULL.
|
||
|
* StationAddress is NULL when ConfigData is not NULL.
|
||
|
@retval EFI_ACCESS_DENIED The SwAddressType, SwAddressLength, or
|
||
|
StationAddress is different from the one that is
|
||
|
already registered.
|
||
|
@retval EFI_OUT_OF_RESOURCES Storage for the new StationAddress could not be
|
||
|
allocated.
|
||
|
|
||
|
**/
|
||
|
typedef
|
||
|
EFI_STATUS
|
||
|
(EFIAPI *EFI_ARP_CONFIGURE)(
|
||
|
IN EFI_ARP_PROTOCOL *This,
|
||
|
IN EFI_ARP_CONFIG_DATA *ConfigData OPTIONAL
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
This function is used to insert entries into the ARP cache.
|
||
|
|
||
|
ARP cache entries are typically inserted and updated by network protocol drivers
|
||
|
as network traffic is processed. Most ARP cache entries will time out and be
|
||
|
deleted if the network traffic stops. ARP cache entries that were inserted
|
||
|
by the Add() function may be static (will not time out) or dynamic (will time out).
|
||
|
Default ARP cache timeout values are not covered in most network protocol
|
||
|
specifications (although RFC 1122 comes pretty close) and will only be
|
||
|
discussed in general terms in this specification. The timeout values that are
|
||
|
used in the EFI Sample Implementation should be used only as a guideline.
|
||
|
Final product implementations of the EFI network stack should be tuned for
|
||
|
their expected network environments.
|
||
|
|
||
|
@param This Pointer to the EFI_ARP_PROTOCOL instance.
|
||
|
@param DenyFlag Set to TRUE if this entry is a deny entry. Set to
|
||
|
FALSE if this entry is a normal entry.
|
||
|
@param TargetSwAddress Pointer to a protocol address to add (or deny).
|
||
|
May be set to NULL if DenyFlag is TRUE.
|
||
|
@param TargetHwAddress Pointer to a hardware address to add (or deny).
|
||
|
May be set to NULL if DenyFlag is TRUE.
|
||
|
@param TimeoutValue Time in 100-ns units that this entry will remain
|
||
|
in the ARP cache. A value of zero means that the
|
||
|
entry is permanent. A nonzero value will override
|
||
|
the one given by Configure() if the entry to be
|
||
|
added is a dynamic entry.
|
||
|
@param Overwrite If TRUE, the matching cache entry will be
|
||
|
overwritten with the supplied parameters. If
|
||
|
FALSE, EFI_ACCESS_DENIED is returned if the
|
||
|
corresponding cache entry already exists.
|
||
|
|
||
|
@retval EFI_SUCCESS The entry has been added or updated.
|
||
|
@retval EFI_INVALID_PARAMETER One or more of the following conditions is TRUE:
|
||
|
* This is NULL.
|
||
|
* DenyFlag is FALSE and TargetHwAddress is NULL.
|
||
|
* DenyFlag is FALSE and TargetSwAddress is NULL.
|
||
|
* TargetHwAddress is NULL and TargetSwAddress is NULL.
|
||
|
* Neither TargetSwAddress nor TargetHwAddress are NULL when DenyFlag is
|
||
|
TRUE.
|
||
|
@retval EFI_OUT_OF_RESOURCES The new ARP cache entry could not be allocated.
|
||
|
@retval EFI_ACCESS_DENIED The ARP cache entry already exists and Overwrite
|
||
|
is not true.
|
||
|
@retval EFI_NOT_STARTED The ARP driver instance has not been configured.
|
||
|
|
||
|
**/
|
||
|
typedef
|
||
|
EFI_STATUS
|
||
|
(EFIAPI *EFI_ARP_ADD)(
|
||
|
IN EFI_ARP_PROTOCOL *This,
|
||
|
IN BOOLEAN DenyFlag,
|
||
|
IN VOID *TargetSwAddress OPTIONAL,
|
||
|
IN VOID *TargetHwAddress OPTIONAL,
|
||
|
IN UINT32 TimeoutValue,
|
||
|
IN BOOLEAN Overwrite
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
This function searches the ARP cache for matching entries and allocates a buffer into
|
||
|
which those entries are copied.
|
||
|
|
||
|
The first part of the allocated buffer is EFI_ARP_FIND_DATA, following which
|
||
|
are protocol address pairs and hardware address pairs.
|
||
|
When finding a specific protocol address (BySwAddress is TRUE and AddressBuffer
|
||
|
is not NULL), the ARP cache timeout for the found entry is reset if Refresh is
|
||
|
set to TRUE. If the found ARP cache entry is a permanent entry, it is not
|
||
|
affected by Refresh.
|
||
|
|
||
|
@param This The pointer to the EFI_ARP_PROTOCOL instance.
|
||
|
@param BySwAddress Set to TRUE to look for matching software protocol
|
||
|
addresses. Set to FALSE to look for matching
|
||
|
hardware protocol addresses.
|
||
|
@param AddressBuffer The pointer to the address buffer. Set to NULL
|
||
|
to match all addresses.
|
||
|
@param EntryLength The size of an entry in the entries buffer.
|
||
|
@param EntryCount The number of ARP cache entries that are found by
|
||
|
the specified criteria.
|
||
|
@param Entries The pointer to the buffer that will receive the ARP
|
||
|
cache entries.
|
||
|
@param Refresh Set to TRUE to refresh the timeout value of the
|
||
|
matching ARP cache entry.
|
||
|
|
||
|
@retval EFI_SUCCESS The requested ARP cache entries were copied into
|
||
|
the buffer.
|
||
|
@retval EFI_INVALID_PARAMETER One or more of the following conditions is TRUE:
|
||
|
This is NULL. Both EntryCount and EntryLength are
|
||
|
NULL, when Refresh is FALSE.
|
||
|
@retval EFI_NOT_FOUND No matching entries were found.
|
||
|
@retval EFI_NOT_STARTED The ARP driver instance has not been configured.
|
||
|
|
||
|
**/
|
||
|
typedef
|
||
|
EFI_STATUS
|
||
|
(EFIAPI *EFI_ARP_FIND)(
|
||
|
IN EFI_ARP_PROTOCOL *This,
|
||
|
IN BOOLEAN BySwAddress,
|
||
|
IN VOID *AddressBuffer OPTIONAL,
|
||
|
OUT UINT32 *EntryLength OPTIONAL,
|
||
|
OUT UINT32 *EntryCount OPTIONAL,
|
||
|
OUT EFI_ARP_FIND_DATA **Entries OPTIONAL,
|
||
|
IN BOOLEAN Refresh
|
||
|
);
|
||
|
|
||
|
|
||
|
/**
|
||
|
This function removes specified ARP cache entries.
|
||
|
|
||
|
@param This The pointer to the EFI_ARP_PROTOCOL instance.
|
||
|
@param BySwAddress Set to TRUE to delete matching protocol addresses.
|
||
|
Set to FALSE to delete matching hardware
|
||
|
addresses.
|
||
|
@param AddressBuffer The pointer to the address buffer that is used as a
|
||
|
key to look for the cache entry. Set to NULL to
|
||
|
delete all entries.
|
||
|
|
||
|
@retval EFI_SUCCESS The entry was removed from the ARP cache.
|
||
|
@retval EFI_INVALID_PARAMETER This is NULL.
|
||
|
@retval EFI_NOT_FOUND The specified deletion key was not found.
|
||
|
@retval EFI_NOT_STARTED The ARP driver instance has not been configured.
|
||
|
|
||
|
**/
|
||
|
typedef
|
||
|
EFI_STATUS
|
||
|
(EFIAPI *EFI_ARP_DELETE)(
|
||
|
IN EFI_ARP_PROTOCOL *This,
|
||
|
IN BOOLEAN BySwAddress,
|
||
|
IN VOID *AddressBuffer OPTIONAL
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
This function delete all dynamic entries from the ARP cache that match the specified
|
||
|
software protocol type.
|
||
|
|
||
|
@param This The pointer to the EFI_ARP_PROTOCOL instance.
|
||
|
|
||
|
@retval EFI_SUCCESS The cache has been flushed.
|
||
|
@retval EFI_INVALID_PARAMETER This is NULL.
|
||
|
@retval EFI_NOT_FOUND There are no matching dynamic cache entries.
|
||
|
@retval EFI_NOT_STARTED The ARP driver instance has not been configured.
|
||
|
|
||
|
**/
|
||
|
typedef
|
||
|
EFI_STATUS
|
||
|
(EFIAPI *EFI_ARP_FLUSH)(
|
||
|
IN EFI_ARP_PROTOCOL *This
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
This function tries to resolve the TargetSwAddress and optionally returns a
|
||
|
TargetHwAddress if it already exists in the ARP cache.
|
||
|
|
||
|
@param This The pointer to the EFI_ARP_PROTOCOL instance.
|
||
|
@param TargetSwAddress The pointer to the protocol address to resolve.
|
||
|
@param ResolvedEvent The pointer to the event that will be signaled when
|
||
|
the address is resolved or some error occurs.
|
||
|
@param TargetHwAddress The pointer to the buffer for the resolved hardware
|
||
|
address in network byte order.
|
||
|
|
||
|
@retval EFI_SUCCESS The data is copied from the ARP cache into the
|
||
|
TargetHwAddress buffer.
|
||
|
@retval EFI_INVALID_PARAMETER One or more of the following conditions is TRUE:
|
||
|
This is NULL. TargetHwAddress is NULL.
|
||
|
@retval EFI_ACCESS_DENIED The requested address is not present in the normal
|
||
|
ARP cache but is present in the deny address list.
|
||
|
Outgoing traffic to that address is forbidden.
|
||
|
@retval EFI_NOT_STARTED The ARP driver instance has not been configured.
|
||
|
@retval EFI_NOT_READY The request has been started and is not finished.
|
||
|
|
||
|
**/
|
||
|
typedef
|
||
|
EFI_STATUS
|
||
|
(EFIAPI *EFI_ARP_REQUEST)(
|
||
|
IN EFI_ARP_PROTOCOL *This,
|
||
|
IN VOID *TargetSwAddress OPTIONAL,
|
||
|
IN EFI_EVENT ResolvedEvent OPTIONAL,
|
||
|
OUT VOID *TargetHwAddress
|
||
|
);
|
||
|
|
||
|
/**
|
||
|
This function aborts the previous ARP request (identified by This, TargetSwAddress
|
||
|
and ResolvedEvent) that is issued by EFI_ARP_PROTOCOL.Request().
|
||
|
|
||
|
If the request is in the internal ARP request queue, the request is aborted
|
||
|
immediately and its ResolvedEvent is signaled. Only an asynchronous address
|
||
|
request needs to be canceled. If TargeSwAddress and ResolveEvent are both
|
||
|
NULL, all the pending asynchronous requests that have been issued by This
|
||
|
instance will be cancelled and their corresponding events will be signaled.
|
||
|
|
||
|
@param This The pointer to the EFI_ARP_PROTOCOL instance.
|
||
|
@param TargetSwAddress The pointer to the protocol address in previous
|
||
|
request session.
|
||
|
@param ResolvedEvent Pointer to the event that is used as the
|
||
|
notification event in previous request session.
|
||
|
|
||
|
@retval EFI_SUCCESS The pending request session(s) is/are aborted and
|
||
|
corresponding event(s) is/are signaled.
|
||
|
@retval EFI_INVALID_PARAMETER One or more of the following conditions is TRUE:
|
||
|
This is NULL. TargetSwAddress is not NULL and
|
||
|
ResolvedEvent is NULL. TargetSwAddress is NULL and
|
||
|
ResolvedEvent is not NULL.
|
||
|
@retval EFI_NOT_STARTED The ARP driver instance has not been configured.
|
||
|
@retval EFI_NOT_FOUND The request is not issued by
|
||
|
EFI_ARP_PROTOCOL.Request().
|
||
|
|
||
|
|
||
|
**/
|
||
|
typedef
|
||
|
EFI_STATUS
|
||
|
(EFIAPI *EFI_ARP_CANCEL)(
|
||
|
IN EFI_ARP_PROTOCOL *This,
|
||
|
IN VOID *TargetSwAddress OPTIONAL,
|
||
|
IN EFI_EVENT ResolvedEvent OPTIONAL
|
||
|
);
|
||
|
|
||
|
///
|
||
|
/// ARP is used to resolve local network protocol addresses into
|
||
|
/// network hardware addresses.
|
||
|
///
|
||
|
struct _EFI_ARP_PROTOCOL {
|
||
|
EFI_ARP_CONFIGURE Configure;
|
||
|
EFI_ARP_ADD Add;
|
||
|
EFI_ARP_FIND Find;
|
||
|
EFI_ARP_DELETE Delete;
|
||
|
EFI_ARP_FLUSH Flush;
|
||
|
EFI_ARP_REQUEST Request;
|
||
|
EFI_ARP_CANCEL Cancel;
|
||
|
};
|
||
|
|
||
|
|
||
|
extern EFI_GUID gEfiArpServiceBindingProtocolGuid;
|
||
|
extern EFI_GUID gEfiArpProtocolGuid;
|
||
|
|
||
|
#endif
|