mirror of
				https://git.proxmox.com/git/mirror_edk2
				synced 2025-11-04 05:38:26 +00:00 
			
		
		
		
	2. Fix the driver binding Stop() hang issue in the network stack. 3. Add Ip4 raw data support. 4. Add iSCSI Dhcp option 60 support. Signed-off-by: Fu Siyuan <siyuan.fu@intel.com> Reviewed-by: Ye Ting <ting.ye@intel.com> Reviewed-by: Ouyang Qian <qian.ouyang@intel.com> git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13995 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			777 lines
		
	
	
		
			27 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			777 lines
		
	
	
		
			27 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
  EFI Address Resolution Protocol (ARP) Protocol interface header file.
 | 
						|
 | 
						|
Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
 | 
						|
This program and the accompanying materials
 | 
						|
are licensed and made available under the terms and conditions of the BSD License
 | 
						|
which accompanies this distribution.  The full text of the license may be found at<BR>
 | 
						|
http://opensource.org/licenses/bsd-license.php
 | 
						|
 | 
						|
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
 | 
						|
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 | 
						|
 | 
						|
**/
 | 
						|
 | 
						|
#ifndef _ARP_IMPL_H_
 | 
						|
#define _ARP_IMPL_H_
 | 
						|
 | 
						|
 | 
						|
#include <Uefi.h>
 | 
						|
 | 
						|
#include <Protocol/Arp.h>
 | 
						|
#include <Protocol/ManagedNetwork.h>
 | 
						|
#include <Protocol/ServiceBinding.h>
 | 
						|
 | 
						|
#include <Library/DebugLib.h>
 | 
						|
#include <Library/UefiDriverEntryPoint.h>
 | 
						|
#include <Library/UefiBootServicesTableLib.h>
 | 
						|
#include <Library/UefiLib.h>
 | 
						|
#include <Library/NetLib.h>
 | 
						|
#include <Library/BaseLib.h>
 | 
						|
#include <Library/BaseMemoryLib.h>
 | 
						|
#include <Library/MemoryAllocationLib.h>
 | 
						|
#include <Library/DpcLib.h>
 | 
						|
 | 
						|
//
 | 
						|
// Ethernet protocol type definitions.
 | 
						|
//
 | 
						|
#define ARP_ETHER_PROTO_TYPE         0x0806
 | 
						|
#define IPV4_ETHER_PROTO_TYPE        0x0800
 | 
						|
#define IPV6_ETHER_PROTO_TYPE        0x86DD
 | 
						|
 | 
						|
//
 | 
						|
// ARP opcode definitions.
 | 
						|
//
 | 
						|
#define ARP_OPCODE_REQUEST           0x0001
 | 
						|
#define ARP_OPCODE_REPLY             0x0002
 | 
						|
 | 
						|
//
 | 
						|
// ARP timeout, retry count and interval definitions.
 | 
						|
//
 | 
						|
#define ARP_DEFAULT_TIMEOUT_VALUE    (400 * TICKS_PER_SECOND)
 | 
						|
#define ARP_DEFAULT_RETRY_COUNT      2
 | 
						|
#define ARP_DEFAULT_RETRY_INTERVAL   (5   * TICKS_PER_MS)
 | 
						|
#define ARP_PERIODIC_TIMER_INTERVAL  (500 * TICKS_PER_MS)
 | 
						|
 | 
						|
//
 | 
						|
// ARP packet head definition.
 | 
						|
//
 | 
						|
#pragma pack(1)
 | 
						|
typedef struct {
 | 
						|
  UINT16  HwType;
 | 
						|
  UINT16  ProtoType;
 | 
						|
  UINT8   HwAddrLen;
 | 
						|
  UINT8   ProtoAddrLen;
 | 
						|
  UINT16  OpCode;
 | 
						|
} ARP_HEAD;
 | 
						|
#pragma pack()
 | 
						|
 | 
						|
//
 | 
						|
// ARP Address definition for internal use.
 | 
						|
//
 | 
						|
typedef struct {
 | 
						|
  UINT8  *SenderHwAddr;
 | 
						|
  UINT8  *SenderProtoAddr;
 | 
						|
  UINT8  *TargetHwAddr;
 | 
						|
  UINT8  *TargetProtoAddr;
 | 
						|
} ARP_ADDRESS;
 | 
						|
 | 
						|
#define MATCH_SW_ADDRESS  0x1
 | 
						|
#define MATCH_HW_ADDRESS  0x2
 | 
						|
 | 
						|
//
 | 
						|
// Enumeration for the search type. A search type is specified as the keyword to find
 | 
						|
// a cache entry in the cache table.
 | 
						|
//
 | 
						|
typedef enum {
 | 
						|
  ByNone         = 0,
 | 
						|
  ByProtoAddress = MATCH_SW_ADDRESS,
 | 
						|
  ByHwAddress    = MATCH_HW_ADDRESS,
 | 
						|
  ByBoth         = MATCH_SW_ADDRESS | MATCH_HW_ADDRESS
 | 
						|
} FIND_OPTYPE;
 | 
						|
 | 
						|
#define ARP_INSTANCE_DATA_SIGNATURE  SIGNATURE_32('A', 'R', 'P', 'I')
 | 
						|
 | 
						|
/**
 | 
						|
  Returns a pointer to the ARP_INSTANCE_DATA structure from the input a.
 | 
						|
  
 | 
						|
  If the signatures matches, then a pointer to the data structure that contains 
 | 
						|
  a specified field of that data structure is returned.
 | 
						|
   
 | 
						|
  @param  a              Pointer to the field specified by ArpProto within a data 
 | 
						|
                         structure of type ARP_INSTANCE_DATA.
 | 
						|
 
 | 
						|
**/
 | 
						|
#define ARP_INSTANCE_DATA_FROM_THIS(a) \
 | 
						|
  CR ( \
 | 
						|
  (a), \
 | 
						|
  ARP_INSTANCE_DATA, \
 | 
						|
  ArpProto, \
 | 
						|
  ARP_INSTANCE_DATA_SIGNATURE \
 | 
						|
  )
 | 
						|
 | 
						|
typedef struct _ARP_SERVICE_DATA  ARP_SERVICE_DATA;
 | 
						|
 | 
						|
//
 | 
						|
// ARP instance context data structure.
 | 
						|
//
 | 
						|
typedef struct {
 | 
						|
  UINT32               Signature;
 | 
						|
  ARP_SERVICE_DATA     *ArpService;
 | 
						|
  EFI_HANDLE           Handle;
 | 
						|
  EFI_ARP_PROTOCOL     ArpProto;
 | 
						|
  LIST_ENTRY           List;
 | 
						|
  EFI_ARP_CONFIG_DATA  ConfigData;
 | 
						|
  BOOLEAN              Configured;
 | 
						|
  BOOLEAN              InDestroy;
 | 
						|
} ARP_INSTANCE_DATA;
 | 
						|
 | 
						|
#define ARP_SERVICE_DATA_SIGNATURE  SIGNATURE_32('A', 'R', 'P', 'S')
 | 
						|
 | 
						|
/**
 | 
						|
  Returns a pointer to the ARP_SERVICE_DATA structure from the input a.
 | 
						|
  
 | 
						|
  If the signatures matches, then a pointer to the data structure that contains 
 | 
						|
  a specified field of that data structure is returned.
 | 
						|
   
 | 
						|
  @param  a              Pointer to the field specified by ServiceBinding within 
 | 
						|
                         a data structure of type ARP_SERVICE_DATA.
 | 
						|
 
 | 
						|
**/
 | 
						|
#define ARP_SERVICE_DATA_FROM_THIS(a) \
 | 
						|
  CR ( \
 | 
						|
  (a), \
 | 
						|
  ARP_SERVICE_DATA, \
 | 
						|
  ServiceBinding, \
 | 
						|
  ARP_SERVICE_DATA_SIGNATURE \
 | 
						|
  )
 | 
						|
 | 
						|
//
 | 
						|
// ARP service data structure.
 | 
						|
//
 | 
						|
struct _ARP_SERVICE_DATA {
 | 
						|
  UINT32                           Signature;
 | 
						|
  EFI_SERVICE_BINDING_PROTOCOL     ServiceBinding;
 | 
						|
 | 
						|
  EFI_HANDLE                       MnpChildHandle;
 | 
						|
  EFI_HANDLE                       ImageHandle;
 | 
						|
  EFI_HANDLE                       ControllerHandle;
 | 
						|
 | 
						|
  EFI_MANAGED_NETWORK_PROTOCOL          *Mnp;
 | 
						|
  EFI_MANAGED_NETWORK_CONFIG_DATA       MnpConfigData;
 | 
						|
  EFI_MANAGED_NETWORK_COMPLETION_TOKEN  RxToken;
 | 
						|
 | 
						|
  EFI_SIMPLE_NETWORK_MODE          SnpMode;
 | 
						|
 | 
						|
  UINTN                            ChildrenNumber;
 | 
						|
  LIST_ENTRY                       ChildrenList;
 | 
						|
 | 
						|
  LIST_ENTRY                       PendingRequestTable;
 | 
						|
  LIST_ENTRY                       DeniedCacheTable;
 | 
						|
  LIST_ENTRY                       ResolvedCacheTable;
 | 
						|
 | 
						|
  EFI_EVENT                        PeriodicTimer;
 | 
						|
};
 | 
						|
 | 
						|
//
 | 
						|
// User request context structure.
 | 
						|
//
 | 
						|
typedef struct {
 | 
						|
  LIST_ENTRY         List;
 | 
						|
  ARP_INSTANCE_DATA  *Instance;
 | 
						|
  EFI_EVENT          UserRequestEvent;
 | 
						|
  VOID               *UserHwAddrBuffer;
 | 
						|
} USER_REQUEST_CONTEXT;
 | 
						|
 | 
						|
#define ARP_MAX_PROTOCOL_ADDRESS_LEN  sizeof(EFI_IP_ADDRESS)
 | 
						|
#define ARP_MAX_HARDWARE_ADDRESS_LEN  sizeof(EFI_MAC_ADDRESS)
 | 
						|
 | 
						|
typedef union {
 | 
						|
  UINT8  ProtoAddress[ARP_MAX_PROTOCOL_ADDRESS_LEN];
 | 
						|
  UINT8  HwAddress[ARP_MAX_HARDWARE_ADDRESS_LEN];
 | 
						|
} NET_ARP_ADDRESS_UNION;
 | 
						|
 | 
						|
//
 | 
						|
// ARP address structure in an ARP packet.
 | 
						|
//
 | 
						|
typedef struct {
 | 
						|
  UINT16                Type;
 | 
						|
  UINT8                 Length;
 | 
						|
  UINT8                 *AddressPtr;
 | 
						|
  NET_ARP_ADDRESS_UNION Buffer;
 | 
						|
} NET_ARP_ADDRESS;
 | 
						|
 | 
						|
//
 | 
						|
// Enumeration for ARP address type.
 | 
						|
//
 | 
						|
typedef enum {
 | 
						|
  Hardware,
 | 
						|
  Protocol
 | 
						|
} ARP_ADDRESS_TYPE;
 | 
						|
 | 
						|
//
 | 
						|
// ARP cache entry definition.
 | 
						|
//
 | 
						|
typedef struct {
 | 
						|
  LIST_ENTRY      List;
 | 
						|
 | 
						|
  UINT32          RetryCount;
 | 
						|
  UINT32          DefaultDecayTime;
 | 
						|
  UINT32          DecayTime;
 | 
						|
  UINT32          NextRetryTime;
 | 
						|
 | 
						|
  NET_ARP_ADDRESS  Addresses[2];
 | 
						|
 | 
						|
  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  This                   Pointer to the EFI_ARP_PROTOCOL instance.
 | 
						|
  @param  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 (
 | 
						|
  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 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. 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 (
 | 
						|
  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                   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          Pointer to 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                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.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
ArpFind (
 | 
						|
  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                   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          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 (
 | 
						|
  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                   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  This                   Pointer to the EFI_ARP_PROTOCOL instance.
 | 
						|
  @param  TargetSwAddress        Pointer to the protocol address to resolve.
 | 
						|
  @param  ResolvedEvent          Pointer to the event that will be signaled when
 | 
						|
                                 the address is resolved or some error occurs.
 | 
						|
  @param  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 (
 | 
						|
  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                   Pointer to the EFI_ARP_PROTOCOL instance.
 | 
						|
  @param  TargetSwAddress        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().
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
ArpCancel (
 | 
						|
  IN EFI_ARP_PROTOCOL  *This,
 | 
						|
  IN VOID              *TargetSwAddress OPTIONAL,
 | 
						|
  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,
 | 
						|
  IN NET_ARP_ADDRESS   *ProtocolAddress OPTIONAL,
 | 
						|
  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 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,
 | 
						|
  IN NET_ARP_ADDRESS  *HwAddr OPTIONAL,
 | 
						|
  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,
 | 
						|
  IN ARP_INSTANCE_DATA  *Instance OPTIONAL,
 | 
						|
  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,
 | 
						|
  IN BOOLEAN            BySwAddress,
 | 
						|
  IN UINT8              *AddressBuffer OPTIONAL,
 | 
						|
  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,
 | 
						|
  IN ARP_CACHE_ENTRY    *CacheEntry,
 | 
						|
  IN UINT16             ArpOpCode
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Initialize the instance context data.
 | 
						|
 | 
						|
  @param[in]   ArpService        Pointer to the arp service context data this
 | 
						|
                                 instance belongs to.
 | 
						|
  @param[out]  Instance          Pointer to the instance context data.
 | 
						|
 | 
						|
  @return None.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
ArpInitInstance (
 | 
						|
  IN  ARP_SERVICE_DATA   *ArpService,
 | 
						|
  OUT 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 (
 | 
						|
  IN EFI_EVENT  Event,
 | 
						|
  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
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Request ArpOnFrameSentDpc 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 (
 | 
						|
  IN EFI_EVENT  Event,
 | 
						|
  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 (
 | 
						|
  IN EFI_EVENT  Event,
 | 
						|
  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,
 | 
						|
  IN VOID               *TargetSwAddress OPTIONAL,
 | 
						|
  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,
 | 
						|
  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
 | 
						|
  );
 | 
						|
 | 
						|
#endif
 |