X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=MdeModulePkg%2FUniversal%2FNetwork%2FArpDxe%2FArpImpl.h;h=7fd5e1bf31a5674e06f1f4ef91daeb7c00695fac;hb=f3f2e05db8c89628498ec4efdb16184747824c63;hp=729cb5d68e189c6ad780618fcce1007092538708;hpb=83cbd279b64f3081af5c06d50fa26e15a99fc066;p=mirror_edk2.git diff --git a/MdeModulePkg/Universal/Network/ArpDxe/ArpImpl.h b/MdeModulePkg/Universal/Network/ArpDxe/ArpImpl.h index 729cb5d68e..7fd5e1bf31 100644 --- a/MdeModulePkg/Universal/Network/ArpDxe/ArpImpl.h +++ b/MdeModulePkg/Universal/Network/ArpDxe/ArpImpl.h @@ -1,21 +1,15 @@ /** @file + Abstract: -Copyright (c) 2006 - 2007, Intel Corporation +Copyright (c) 2006 - 2008, Intel Corporation.
All rights reserved. This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at +which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -Module Name: - - ArpImpl.h - -Abstract: - - **/ #ifndef _ARP_IMPL_H_ @@ -37,11 +31,10 @@ Abstract: #include #include -#include "ArpDebug.h" #define ARP_ETHER_PROTO_TYPE 0x0806 -#define IPv4_ETHER_PROTO_TYPE 0x0800 -#define IPv6_ETHER_PROTO_TYPE 0x86DD +#define IPV4_ETHER_PROTO_TYPE 0x0800 +#define IPV6_ETHER_PROTO_TYPE 0x86DD #define ARP_OPCODE_REQUEST 0x0001 #define ARP_OPCODE_REPLY 0x0002 @@ -52,7 +45,7 @@ Abstract: #define ARP_PERIODIC_TIMER_INTERVAL (500 * TICKS_PER_MS) #pragma pack(1) -typedef struct _ARP_HEAD { +typedef struct { UINT16 HwType; UINT16 ProtoType; UINT8 HwAddrLen; @@ -61,7 +54,7 @@ typedef struct _ARP_HEAD { } ARP_HEAD; #pragma pack() -typedef struct _ARP_ADDRESS { +typedef struct { UINT8 *SenderHwAddr; UINT8 *SenderProtoAddr; UINT8 *TargetHwAddr; @@ -78,8 +71,11 @@ typedef enum { ByBoth = MATCH_SW_ADDRESS | MATCH_HW_ADDRESS } FIND_OPTYPE; -#define ARP_INSTANCE_DATA_SIGNATURE EFI_SIGNATURE_32('A', 'R', 'P', 'I') +#define ARP_INSTANCE_DATA_SIGNATURE SIGNATURE_32('A', 'R', 'P', 'I') +// +//comment for macro +// #define ARP_INSTANCE_DATA_FROM_THIS(a) \ CR ( \ (a), \ @@ -90,19 +86,22 @@ typedef enum { typedef struct _ARP_SERVICE_DATA ARP_SERVICE_DATA; -typedef struct _ARP_INSTANCE_DATA { +typedef struct { UINT32 Signature; ARP_SERVICE_DATA *ArpService; EFI_HANDLE Handle; EFI_ARP_PROTOCOL ArpProto; - NET_LIST_ENTRY List; + LIST_ENTRY List; EFI_ARP_CONFIG_DATA ConfigData; BOOLEAN Configured; BOOLEAN Destroyed; } ARP_INSTANCE_DATA; -#define ARP_SERVICE_DATA_SIGNATURE EFI_SIGNATURE_32('A', 'R', 'P', 'S') +#define ARP_SERVICE_DATA_SIGNATURE SIGNATURE_32('A', 'R', 'P', 'S') +// +//comment for macro +// #define ARP_SERVICE_DATA_FROM_THIS(a) \ CR ( \ (a), \ @@ -125,20 +124,18 @@ struct _ARP_SERVICE_DATA { EFI_SIMPLE_NETWORK_MODE SnpMode; - NET_LOCK Lock; - UINTN ChildrenNumber; - NET_LIST_ENTRY ChildrenList; + LIST_ENTRY ChildrenList; - NET_LIST_ENTRY PendingRequestTable; - NET_LIST_ENTRY DeniedCacheTable; - NET_LIST_ENTRY ResolvedCacheTable; + LIST_ENTRY PendingRequestTable; + LIST_ENTRY DeniedCacheTable; + LIST_ENTRY ResolvedCacheTable; EFI_EVENT PeriodicTimer; }; -typedef struct _USER_REQUEST_CONTEXT { - NET_LIST_ENTRY List; +typedef struct { + LIST_ENTRY List; ARP_INSTANCE_DATA *Instance; EFI_EVENT UserRequestEvent; VOID *UserHwAddrBuffer; @@ -147,7 +144,7 @@ typedef struct _USER_REQUEST_CONTEXT { #define ARP_MAX_PROTOCOL_ADDRESS_LEN sizeof(EFI_IP_ADDRESS) #define ARP_MAX_HARDWARE_ADDRESS_LEN sizeof(EFI_MAC_ADDRESS) -typedef struct _NET_ARP_ADDRESS { +typedef struct { UINT16 Type; UINT8 Length; UINT8 *AddressPtr; @@ -162,8 +159,8 @@ typedef enum { Protocol } ARP_ADDRESS_TYPE; -typedef struct _ARP_CACHE_ENTRY { - NET_LIST_ENTRY List; +typedef struct { + LIST_ENTRY List; UINT32 RetryCount; UINT32 DefaultDecayTime; @@ -172,9 +169,36 @@ typedef struct _ARP_CACHE_ENTRY { NET_ARP_ADDRESS Addresses[2]; - NET_LIST_ENTRY UserRequestList; + LIST_ENTRY UserRequestList; } ARP_CACHE_ENTRY; +/** + 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[in] This Pointer to the EFI_ARP_PROTOCOL instance. + @param[in] ConfigData 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. + +**/ EFI_STATUS EFIAPI ArpConfigure ( @@ -182,6 +206,51 @@ ArpConfigure ( 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 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[in] This Pointer to the EFI_ARP_PROTOCOL instance. + @param[in] DenyFlag Set to TRUE if this entry is a deny entry. Set to + FALSE if this entry is a normal entry. + @param[in] TargetSwAddress Pointer to a protocol address to add (or deny). + May be set to NULL if DenyFlag is TRUE. + @param[in] TargetHwAddress Pointer to a hardware address to add (or deny). + May be set to NULL if DenyFlag is TRUE. + @param[in] 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[in] 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. Both TargetSwAddress + and TargetHwAddress are not 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. + +**/ EFI_STATUS EFIAPI ArpAdd ( @@ -193,6 +262,40 @@ ArpAdd ( 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[in] This Pointer to the EFI_ARP_PROTOCOL instance. + @param[in] BySwAddress Set to TRUE to look for matching software protocol + addresses. Set to FALSE to look for matching + hardware protocol addresses. + @param[in] AddressBuffer Pointer to address buffer. Set to NULL to match + all addresses. + @param[out] EntryLength The size of an entry in the entries buffer. + @param[out] EntryCount The number of ARP cache entries that are found by + the specified criteria. + @param[out] Entries Pointer to the buffer that will receive the ARP + cache entries. + @param[in] 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. + +**/ EFI_STATUS EFIAPI ArpFind ( @@ -205,6 +308,23 @@ ArpFind ( IN BOOLEAN Refresh ); +/** + This function removes specified ARP cache entries. + + @param[in] This Pointer to the EFI_ARP_PROTOCOL instance. + @param[in] BySwAddress Set to TRUE to delete matching protocol addresses. + Set to FALSE to delete matching hardware + addresses. + @param[in] AddressBuffer 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. + +**/ EFI_STATUS EFIAPI ArpDelete ( @@ -213,12 +333,46 @@ ArpDelete ( IN VOID *AddressBuffer OPTIONAL ); +/** + This function delete all dynamic entries from the ARP cache that match the specified + software protocol type. + + @param[in] This 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. + +**/ EFI_STATUS EFIAPI ArpFlush ( 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[in] This Pointer to the EFI_ARP_PROTOCOL instance. + @param[in] TargetSwAddress Pointer to the protocol address to resolve. + @param[in] ResolvedEvent Pointer to the event that will be signaled when + the address is resolved or some error occurs. + @param[out] TargetHwAddress 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. + +**/ EFI_STATUS EFIAPI ArpRequest ( @@ -228,6 +382,33 @@ ArpRequest ( 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[in] This Pointer to the EFI_ARP_PROTOCOL instance. + @param[in] TargetSwAddress Pointer to the protocol address in previous + request session. + @param[in] 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(). + +**/ EFI_STATUS EFIAPI ArpCancel ( @@ -236,12 +417,41 @@ ArpCancel ( IN EFI_EVENT ResolvedEvent OPTIONAL ); +/** + Configure the instance using the ConfigData. ConfigData is already validated. + + @param[in] Instance Pointer to the instance context data to be + configured. + @param[in] ConfigData Pointer to the configuration data used to + configure the instance. + + @retval EFI_SUCCESS The instance is configured with the ConfigData. + @retval EFI_ACCESS_DENIED The instance is already configured and the + ConfigData tries to reset some unchangeable + fields. + @retval EFI_INVALID_PARAMETER The ConfigData provides a non-unicast IPv4 address + when the SwAddressType is IPv4. + @retval EFI_OUT_OF_RESOURCES The instance fails to configure due to memory + limitation. + +**/ EFI_STATUS ArpConfigureInstance ( IN ARP_INSTANCE_DATA *Instance, IN EFI_ARP_CONFIG_DATA *ConfigData OPTIONAL ); +/** + Find the CacheEntry, using ProtocolAddress or HardwareAddress or both, as the keyword, + in the DeniedCacheTable. + + @param[in] ArpService Pointer to the arp service context data. + @param[in] ProtocolAddress Pointer to the protocol address. + @param[in] HardwareAddress Pointer to the hardware address. + + @return Pointer to the matched cache entry, if NULL no match is found. + +**/ ARP_CACHE_ENTRY * ArpFindDeniedCacheEntry ( IN ARP_SERVICE_DATA *ArpService, @@ -249,20 +459,52 @@ ArpFindDeniedCacheEntry ( IN NET_ARP_ADDRESS *HardwareAddress OPTIONAL ); +/** + Find the CacheEntry which matches the requirements in the specified CacheTable. + + @param[in] CacheTable Pointer to the arp cache table. + @param[in] StartEntry Pointer to the start entry this search begins with + in the cache table. + @param[in] FindOpType The search type. + @param[in] ProtocolAddress Pointer to the protocol address to match. + @param[in] HardwareAddress Pointer to the hardware address to match. + + @return Pointer to the matched arp cache entry, if NULL, no match is found. + +**/ ARP_CACHE_ENTRY * ArpFindNextCacheEntryInTable ( - IN NET_LIST_ENTRY *CacheTable, - IN NET_LIST_ENTRY *StartEntry, + IN LIST_ENTRY *CacheTable, + IN LIST_ENTRY *StartEntry, IN FIND_OPTYPE FindOpType, IN NET_ARP_ADDRESS *ProtocolAddress OPTIONAL, IN NET_ARP_ADDRESS *HardwareAddress OPTIONAL ); +/** + Allocate a cache entry and initialize it. + + @param[in] Instance Pointer to the instance context data. + + @return Pointer to the new created cache entry. + +**/ ARP_CACHE_ENTRY * ArpAllocCacheEntry ( IN ARP_INSTANCE_DATA *Instance ); +/** + Fill the addresses in the CacheEntry using the information passed in by + HwAddr and SwAddr. + + @param[in] CacheEntry Pointer to the cache entry. + @param[in] HwAddr Pointer to the software address. + @param[in] SwAddr Pointer to the hardware address. + + @return None. + +**/ VOID ArpFillAddressInCacheEntry ( IN ARP_CACHE_ENTRY *CacheEntry, @@ -270,6 +512,16 @@ ArpFillAddressInCacheEntry ( IN NET_ARP_ADDRESS *SwAddr OPTIONAL ); +/** + Turn the CacheEntry into the resolved status. + + @param[in] CacheEntry Pointer to the resolved cache entry. + @param[in] Instance Pointer to the instance context data. + @param[in] UserEvent Pointer to the UserEvent to notify. + + @return The count of notifications sent to the instance. + +**/ UINTN ArpAddressResolved ( IN ARP_CACHE_ENTRY *CacheEntry, @@ -277,6 +529,19 @@ ArpAddressResolved ( IN EFI_EVENT UserEvent OPTIONAL ); +/** + Delete cache entries in all the cache tables. + + @param[in] Instance Pointer to the instance context data. + @param[in] BySwAddress Delete the cache entry by software address or by + hardware address. + @param[in] AddressBuffer Pointer to the buffer containing the address to + match for the deletion. + @param[in] Force This deletion is forced or not. + + @return The count of the deleted cache entries. + +**/ UINTN ArpDeleteCacheEntry ( IN ARP_INSTANCE_DATA *Instance, @@ -285,6 +550,18 @@ ArpDeleteCacheEntry ( IN BOOLEAN Force ); +/** + Send out an arp frame using the CachEntry and the ArpOpCode. + + @param[in] Instance Pointer to the instance context data. + @param[in] CacheEntry Pointer to the configuration data used to + configure the instance. + @param[in] ArpOpCode The opcode used to send out this Arp frame, either + request or reply. + + @return None. + +**/ VOID ArpSendFrame ( IN ARP_INSTANCE_DATA *Instance, @@ -292,12 +569,47 @@ ArpSendFrame ( IN UINT16 ArpOpCode ); +/** + Initialize the instance context data. + + @param[in] ArpService Pointer to the arp service context data this + instance belongs to. + @param[in] Instance Pointer to the instance context data. + + @return None. + +**/ VOID ArpInitInstance ( IN ARP_SERVICE_DATA *ArpService, IN ARP_INSTANCE_DATA *Instance ); +/** + Process the Arp packets received from Mnp, the procedure conforms to RFC826. + + @param[in] Context Pointer to the context data registerd to the + Event. + + @return None. + +**/ +VOID +EFIAPI +ArpOnFrameRcvdDpc ( + IN VOID *Context + ); + +/** + Queue ArpOnFrameRcvdDpc as a DPC at TPL_CALLBACK. + + @param[in] Event The Event this notify function registered to. + @param[in] Context Pointer to the context data registerd to the + Event. + + @return None. + +**/ VOID EFIAPI ArpOnFrameRcvd ( @@ -305,6 +617,31 @@ ArpOnFrameRcvd ( IN VOID *Context ); +/** + Process the already sent arp packets. + + @param[in] Context Pointer to the context data registerd to the + Event. + + @return None. + +**/ +VOID +EFIAPI +ArpOnFrameSentDpc ( + IN VOID *Context + ); + +/** + Queue ArpOnFrameRcvdDpc as a DPC at TPL_CALLBACK. + + @param[in] Event The Event this notify function registered to. + @param[in] Context Pointer to the context data registerd to the + Event. + + @return None. + +**/ VOID EFIAPI ArpOnFrameSent ( @@ -312,6 +649,16 @@ ArpOnFrameSent ( IN VOID *Context ); +/** + Process the arp cache olding and drive the retrying arp requests. + + @param[in] Event The Event this notify function registered to. + @param[in] Context Pointer to the context data registerd to the + Event. + + @return None. + +**/ VOID EFIAPI ArpTimerHandler ( @@ -319,6 +666,18 @@ ArpTimerHandler ( IN VOID *Context ); +/** + Cancel the arp request. + + @param[in] Instance Pointer to the instance context data. + @param[in] TargetSwAddress Pointer to the buffer containing the target + software address to match the arp request. + @param[in] UserEvent The user event used to notify this request + cancellation. + + @return The count of the cancelled requests. + +**/ UINTN ArpCancelRequest ( IN ARP_INSTANCE_DATA *Instance, @@ -326,6 +685,29 @@ ArpCancelRequest ( IN EFI_EVENT UserEvent OPTIONAL ); +/** + Find the cache entry in the cache table. + + @param[in] Instance Pointer to the instance context data. + @param[in] BySwAddress Set to TRUE to look for matching software protocol + addresses. Set to FALSE to look for matching + hardware protocol addresses. + @param[in] AddressBuffer Pointer to address buffer. Set to NULL to match + all addresses. + @param[out] EntryLength The size of an entry in the entries buffer. + @param[out] EntryCount The number of ARP cache entries that are found by + the specified criteria. + @param[out] Entries Pointer to the buffer that will receive the ARP + cache entries. + @param[in] Refresh Set to TRUE to refresh the timeout value of the + matching ARP cache entry. + + @retval EFI_SUCCESS The requested ARP cache entries are copied into + the buffer. + @retval EFI_NOT_FOUND No matching entries found. + @retval EFI_OUT_OF_RESOURCE There is a memory allocation failure. + +**/ EFI_STATUS ArpFindCacheEntry ( IN ARP_INSTANCE_DATA *Instance, @@ -338,4 +720,3 @@ ArpFindCacheEntry ( ); #endif -