Home | History | Annotate | Download | only in ArpDxe
      1 /** @file
      2   EFI Address Resolution Protocol (ARP) Protocol interface header file.
      3 
      4 Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
      5 This program and the accompanying materials
      6 are licensed and made available under the terms and conditions of the BSD License
      7 which accompanies this distribution.  The full text of the license may be found at<BR>
      8 http://opensource.org/licenses/bsd-license.php
      9 
     10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     12 
     13 **/
     14 
     15 #ifndef _ARP_IMPL_H_
     16 #define _ARP_IMPL_H_
     17 
     18 
     19 #include <Uefi.h>
     20 
     21 #include <Protocol/Arp.h>
     22 #include <Protocol/ManagedNetwork.h>
     23 #include <Protocol/ServiceBinding.h>
     24 
     25 #include <Library/DebugLib.h>
     26 #include <Library/UefiDriverEntryPoint.h>
     27 #include <Library/UefiBootServicesTableLib.h>
     28 #include <Library/UefiLib.h>
     29 #include <Library/NetLib.h>
     30 #include <Library/BaseLib.h>
     31 #include <Library/BaseMemoryLib.h>
     32 #include <Library/MemoryAllocationLib.h>
     33 #include <Library/DpcLib.h>
     34 
     35 //
     36 // Ethernet protocol type definitions.
     37 //
     38 #define ARP_ETHER_PROTO_TYPE         0x0806
     39 #define IPV4_ETHER_PROTO_TYPE        0x0800
     40 #define IPV6_ETHER_PROTO_TYPE        0x86DD
     41 
     42 //
     43 // ARP opcode definitions.
     44 //
     45 #define ARP_OPCODE_REQUEST           0x0001
     46 #define ARP_OPCODE_REPLY             0x0002
     47 
     48 //
     49 // ARP timeout, retry count and interval definitions.
     50 //
     51 #define ARP_DEFAULT_TIMEOUT_VALUE    (400 * TICKS_PER_SECOND)
     52 #define ARP_DEFAULT_RETRY_COUNT      2
     53 #define ARP_DEFAULT_RETRY_INTERVAL   (5   * TICKS_PER_MS)
     54 #define ARP_PERIODIC_TIMER_INTERVAL  (500 * TICKS_PER_MS)
     55 
     56 //
     57 // ARP packet head definition.
     58 //
     59 #pragma pack(1)
     60 typedef struct {
     61   UINT16  HwType;
     62   UINT16  ProtoType;
     63   UINT8   HwAddrLen;
     64   UINT8   ProtoAddrLen;
     65   UINT16  OpCode;
     66 } ARP_HEAD;
     67 #pragma pack()
     68 
     69 //
     70 // ARP Address definition for internal use.
     71 //
     72 typedef struct {
     73   UINT8  *SenderHwAddr;
     74   UINT8  *SenderProtoAddr;
     75   UINT8  *TargetHwAddr;
     76   UINT8  *TargetProtoAddr;
     77 } ARP_ADDRESS;
     78 
     79 #define MATCH_SW_ADDRESS  0x1
     80 #define MATCH_HW_ADDRESS  0x2
     81 
     82 //
     83 // Enumeration for the search type. A search type is specified as the keyword to find
     84 // a cache entry in the cache table.
     85 //
     86 typedef enum {
     87   ByNone         = 0,
     88   ByProtoAddress = MATCH_SW_ADDRESS,
     89   ByHwAddress    = MATCH_HW_ADDRESS,
     90   ByBoth         = MATCH_SW_ADDRESS | MATCH_HW_ADDRESS
     91 } FIND_OPTYPE;
     92 
     93 #define ARP_INSTANCE_DATA_SIGNATURE  SIGNATURE_32('A', 'R', 'P', 'I')
     94 
     95 /**
     96   Returns a pointer to the ARP_INSTANCE_DATA structure from the input a.
     97 
     98   If the signatures matches, then a pointer to the data structure that contains
     99   a specified field of that data structure is returned.
    100 
    101   @param  a              Pointer to the field specified by ArpProto within a data
    102                          structure of type ARP_INSTANCE_DATA.
    103 
    104 **/
    105 #define ARP_INSTANCE_DATA_FROM_THIS(a) \
    106   CR ( \
    107   (a), \
    108   ARP_INSTANCE_DATA, \
    109   ArpProto, \
    110   ARP_INSTANCE_DATA_SIGNATURE \
    111   )
    112 
    113 typedef struct _ARP_SERVICE_DATA  ARP_SERVICE_DATA;
    114 
    115 //
    116 // ARP instance context data structure.
    117 //
    118 typedef struct {
    119   UINT32               Signature;
    120   ARP_SERVICE_DATA     *ArpService;
    121   EFI_HANDLE           Handle;
    122   EFI_ARP_PROTOCOL     ArpProto;
    123   LIST_ENTRY           List;
    124   EFI_ARP_CONFIG_DATA  ConfigData;
    125   BOOLEAN              Configured;
    126   BOOLEAN              InDestroy;
    127 } ARP_INSTANCE_DATA;
    128 
    129 #define ARP_SERVICE_DATA_SIGNATURE  SIGNATURE_32('A', 'R', 'P', 'S')
    130 
    131 /**
    132   Returns a pointer to the ARP_SERVICE_DATA structure from the input a.
    133 
    134   If the signatures matches, then a pointer to the data structure that contains
    135   a specified field of that data structure is returned.
    136 
    137   @param  a              Pointer to the field specified by ServiceBinding within
    138                          a data structure of type ARP_SERVICE_DATA.
    139 
    140 **/
    141 #define ARP_SERVICE_DATA_FROM_THIS(a) \
    142   CR ( \
    143   (a), \
    144   ARP_SERVICE_DATA, \
    145   ServiceBinding, \
    146   ARP_SERVICE_DATA_SIGNATURE \
    147   )
    148 
    149 //
    150 // ARP service data structure.
    151 //
    152 struct _ARP_SERVICE_DATA {
    153   UINT32                           Signature;
    154   EFI_SERVICE_BINDING_PROTOCOL     ServiceBinding;
    155 
    156   EFI_HANDLE                       MnpChildHandle;
    157   EFI_HANDLE                       ImageHandle;
    158   EFI_HANDLE                       ControllerHandle;
    159 
    160   EFI_MANAGED_NETWORK_PROTOCOL          *Mnp;
    161   EFI_MANAGED_NETWORK_CONFIG_DATA       MnpConfigData;
    162   EFI_MANAGED_NETWORK_COMPLETION_TOKEN  RxToken;
    163 
    164   EFI_SIMPLE_NETWORK_MODE          SnpMode;
    165 
    166   UINTN                            ChildrenNumber;
    167   LIST_ENTRY                       ChildrenList;
    168 
    169   LIST_ENTRY                       PendingRequestTable;
    170   LIST_ENTRY                       DeniedCacheTable;
    171   LIST_ENTRY                       ResolvedCacheTable;
    172 
    173   EFI_EVENT                        PeriodicTimer;
    174 };
    175 
    176 //
    177 // User request context structure.
    178 //
    179 typedef struct {
    180   LIST_ENTRY         List;
    181   ARP_INSTANCE_DATA  *Instance;
    182   EFI_EVENT          UserRequestEvent;
    183   VOID               *UserHwAddrBuffer;
    184 } USER_REQUEST_CONTEXT;
    185 
    186 #define ARP_MAX_PROTOCOL_ADDRESS_LEN  sizeof(EFI_IP_ADDRESS)
    187 #define ARP_MAX_HARDWARE_ADDRESS_LEN  sizeof(EFI_MAC_ADDRESS)
    188 
    189 typedef union {
    190   UINT8  ProtoAddress[ARP_MAX_PROTOCOL_ADDRESS_LEN];
    191   UINT8  HwAddress[ARP_MAX_HARDWARE_ADDRESS_LEN];
    192 } NET_ARP_ADDRESS_UNION;
    193 
    194 //
    195 // ARP address structure in an ARP packet.
    196 //
    197 typedef struct {
    198   UINT16                Type;
    199   UINT8                 Length;
    200   UINT8                 *AddressPtr;
    201   NET_ARP_ADDRESS_UNION Buffer;
    202 } NET_ARP_ADDRESS;
    203 
    204 //
    205 // Enumeration for ARP address type.
    206 //
    207 typedef enum {
    208   Hardware,
    209   Protocol
    210 } ARP_ADDRESS_TYPE;
    211 
    212 //
    213 // ARP cache entry definition.
    214 //
    215 typedef struct {
    216   LIST_ENTRY      List;
    217 
    218   UINT32          RetryCount;
    219   UINT32          DefaultDecayTime;
    220   UINT32          DecayTime;
    221   UINT32          NextRetryTime;
    222 
    223   NET_ARP_ADDRESS  Addresses[2];
    224 
    225   LIST_ENTRY      UserRequestList;
    226 } ARP_CACHE_ENTRY;
    227 
    228 /**
    229   This function is used to assign a station address to the ARP cache for this instance
    230   of the ARP driver.
    231 
    232   Each ARP instance has one station address. The EFI_ARP_PROTOCOL driver will
    233   respond to ARP requests that match this registered station address. A call to
    234   this function with the ConfigData field set to NULL will reset this ARP instance.
    235 
    236   Once a protocol type and station address have been assigned to this ARP instance,
    237   all the following ARP functions will use this information. Attempting to change
    238   the protocol type or station address to a configured ARP instance will result in errors.
    239 
    240   @param  This                   Pointer to the EFI_ARP_PROTOCOL instance.
    241   @param  ConfigData             Pointer to the EFI_ARP_CONFIG_DATA structure.
    242 
    243   @retval EFI_SUCCESS            The new station address was successfully
    244                                  registered.
    245   @retval EFI_INVALID_PARAMETER  One or more of the following conditions is TRUE:
    246                                  This is NULL. SwAddressLength is zero when
    247                                  ConfigData is not NULL. StationAddress is NULL
    248                                  when ConfigData is not NULL.
    249   @retval EFI_ACCESS_DENIED      The SwAddressType, SwAddressLength, or
    250                                  StationAddress is different from the one that is
    251                                  already registered.
    252   @retval EFI_OUT_OF_RESOURCES   Storage for the new StationAddress could not be
    253                                  allocated.
    254 
    255 **/
    256 EFI_STATUS
    257 EFIAPI
    258 ArpConfigure (
    259   IN EFI_ARP_PROTOCOL     *This,
    260   IN EFI_ARP_CONFIG_DATA  *ConfigData OPTIONAL
    261   );
    262 
    263 /**
    264   This function is used to insert entries into the ARP cache.
    265 
    266   ARP cache entries are typically inserted and updated by network protocol drivers
    267   as network traffic is processed. Most ARP cache entries will time out and be
    268   deleted if the network traffic stops. ARP cache entries that were inserted
    269   by the Add() function may be static (will not time out) or dynamic (will time out).
    270   Default ARP cache timeout values are not covered in most network protocol
    271   specifications (although RFC 1122 comes pretty close) and will only be
    272   discussed in general in this specification. The timeout values that are
    273   used in the EFI Sample Implementation should be used only as a guideline.
    274   Final product implementations of the EFI network stack should be tuned for
    275   their expected network environments.
    276 
    277   @param  This                   Pointer to the EFI_ARP_PROTOCOL instance.
    278   @param  DenyFlag               Set to TRUE if this entry is a deny entry. Set to
    279                                  FALSE if this  entry is a normal entry.
    280   @param  TargetSwAddress        Pointer to a protocol address to add (or deny).
    281                                  May be set to NULL if DenyFlag is TRUE.
    282   @param  TargetHwAddress        Pointer to a hardware address to add (or deny).
    283                                  May be set to NULL if DenyFlag is TRUE.
    284   @param  TimeoutValue           Time in 100-ns units that this entry will remain
    285                                  in the ARP cache. A value of zero means that the
    286                                  entry is permanent. A nonzero value will override
    287                                  the one given by Configure() if the entry to be
    288                                  added is a dynamic entry.
    289   @param  Overwrite              If TRUE, the matching cache entry will be
    290                                  overwritten with the supplied parameters. If
    291                                  FALSE, EFI_ACCESS_DENIED is returned if the
    292                                  corresponding cache entry already exists.
    293 
    294   @retval EFI_SUCCESS            The entry has been added or updated.
    295   @retval EFI_INVALID_PARAMETER  One or more of the following conditions is TRUE:
    296                                  This is NULL. DenyFlag is FALSE and
    297                                  TargetHwAddress is NULL. DenyFlag is FALSE and
    298                                  TargetSwAddress is NULL. TargetHwAddress is NULL
    299                                  and TargetSwAddress is NULL. Both TargetSwAddress
    300                                  and TargetHwAddress are not NULL when DenyFlag is
    301                                  TRUE.
    302   @retval EFI_OUT_OF_RESOURCES   The new ARP cache entry could not be allocated.
    303   @retval EFI_ACCESS_DENIED      The ARP cache entry already exists and Overwrite
    304                                  is not true.
    305   @retval EFI_NOT_STARTED        The ARP driver instance has not been configured.
    306 
    307 **/
    308 EFI_STATUS
    309 EFIAPI
    310 ArpAdd (
    311   IN EFI_ARP_PROTOCOL  *This,
    312   IN BOOLEAN           DenyFlag,
    313   IN VOID              *TargetSwAddress OPTIONAL,
    314   IN VOID              *TargetHwAddress OPTIONAL,
    315   IN UINT32            TimeoutValue,
    316   IN BOOLEAN           Overwrite
    317   );
    318 
    319 /**
    320   This function searches the ARP cache for matching entries and allocates a buffer into
    321   which those entries are copied.
    322 
    323   The first part of the allocated buffer is EFI_ARP_FIND_DATA, following which
    324   are protocol address pairs and hardware address pairs.
    325   When finding a specific protocol address (BySwAddress is TRUE and AddressBuffer
    326   is not NULL), the ARP cache timeout for the found entry is reset if Refresh is
    327   set to TRUE. If the found ARP cache entry is a permanent entry, it is not
    328   affected by Refresh.
    329 
    330   @param  This                   Pointer to the EFI_ARP_PROTOCOL instance.
    331   @param  BySwAddress            Set to TRUE to look for matching software protocol
    332                                  addresses. Set to FALSE to look for matching
    333                                  hardware protocol addresses.
    334   @param  AddressBuffer          Pointer to address buffer. Set to NULL to match
    335                                  all addresses.
    336   @param  EntryLength            The size of an entry in the entries buffer.
    337   @param  EntryCount             The number of ARP cache entries that are found by
    338                                  the specified criteria.
    339   @param  Entries                Pointer to the buffer that will receive the ARP
    340                                  cache entries.
    341   @param  Refresh                Set to TRUE to refresh the timeout value of the
    342                                  matching ARP cache entry.
    343 
    344   @retval EFI_SUCCESS            The requested ARP cache entries were copied into
    345                                  the buffer.
    346   @retval EFI_INVALID_PARAMETER  One or more of the following conditions is TRUE:
    347                                  This is NULL. Both EntryCount and EntryLength are
    348                                  NULL, when Refresh is FALSE.
    349   @retval EFI_NOT_FOUND          No matching entries were found.
    350   @retval EFI_NOT_STARTED        The ARP driver instance has not been configured.
    351 
    352 **/
    353 EFI_STATUS
    354 EFIAPI
    355 ArpFind (
    356   IN EFI_ARP_PROTOCOL    *This,
    357   IN BOOLEAN             BySwAddress,
    358   IN VOID                *AddressBuffer OPTIONAL,
    359   OUT UINT32             *EntryLength   OPTIONAL,
    360   OUT UINT32             *EntryCount    OPTIONAL,
    361   OUT EFI_ARP_FIND_DATA  **Entries      OPTIONAL,
    362   IN BOOLEAN             Refresh
    363   );
    364 
    365 /**
    366   This function removes specified ARP cache entries.
    367 
    368   @param  This                   Pointer to the EFI_ARP_PROTOCOL instance.
    369   @param  BySwAddress            Set to TRUE to delete matching protocol addresses.
    370                                  Set to FALSE to delete matching hardware
    371                                  addresses.
    372   @param  AddressBuffer          Pointer to the address buffer that is used as a
    373                                  key to look for the cache entry. Set to NULL to
    374                                  delete all entries.
    375 
    376   @retval EFI_SUCCESS            The entry was removed from the ARP cache.
    377   @retval EFI_INVALID_PARAMETER  This is NULL.
    378   @retval EFI_NOT_FOUND          The specified deletion key was not found.
    379   @retval EFI_NOT_STARTED        The ARP driver instance has not been configured.
    380 
    381 **/
    382 EFI_STATUS
    383 EFIAPI
    384 ArpDelete (
    385   IN EFI_ARP_PROTOCOL  *This,
    386   IN BOOLEAN           BySwAddress,
    387   IN VOID              *AddressBuffer OPTIONAL
    388   );
    389 
    390 /**
    391   This function delete all dynamic entries from the ARP cache that match the specified
    392   software protocol type.
    393 
    394   @param  This                   Pointer to the EFI_ARP_PROTOCOL instance.
    395 
    396   @retval EFI_SUCCESS            The cache has been flushed.
    397   @retval EFI_INVALID_PARAMETER  This is NULL.
    398   @retval EFI_NOT_FOUND          There are no matching dynamic cache entries.
    399   @retval EFI_NOT_STARTED        The ARP driver instance has not been configured.
    400 
    401 **/
    402 EFI_STATUS
    403 EFIAPI
    404 ArpFlush (
    405   IN EFI_ARP_PROTOCOL  *This
    406   );
    407 
    408 /**
    409   This function tries to resolve the TargetSwAddress and optionally returns a
    410   TargetHwAddress if it already exists in the ARP cache.
    411 
    412   @param  This                   Pointer to the EFI_ARP_PROTOCOL instance.
    413   @param  TargetSwAddress        Pointer to the protocol address to resolve.
    414   @param  ResolvedEvent          Pointer to the event that will be signaled when
    415                                  the address is resolved or some error occurs.
    416   @param  TargetHwAddress        Pointer to the buffer for the resolved hardware
    417                                  address in network byte order.
    418 
    419   @retval EFI_SUCCESS            The data is copied from the ARP cache into the
    420                                  TargetHwAddress buffer.
    421   @retval EFI_INVALID_PARAMETER  One or more of the following conditions is TRUE:
    422                                  This is NULL. TargetHwAddress is NULL.
    423   @retval EFI_ACCESS_DENIED      The requested address is not present in the normal
    424                                  ARP cache but is present in the deny address list.
    425                                  Outgoing traffic to that address is forbidden.
    426   @retval EFI_NOT_STARTED        The ARP driver instance has not been configured.
    427   @retval EFI_NOT_READY          The request has been started and is not finished.
    428 
    429 **/
    430 EFI_STATUS
    431 EFIAPI
    432 ArpRequest (
    433   IN EFI_ARP_PROTOCOL  *This,
    434   IN VOID              *TargetSwAddress OPTIONAL,
    435   IN EFI_EVENT         ResolvedEvent    OPTIONAL,
    436   OUT VOID             *TargetHwAddress
    437   );
    438 
    439 /**
    440   This function aborts the previous ARP request (identified by This,  TargetSwAddress
    441   and ResolvedEvent) that is issued by EFI_ARP_PROTOCOL.Request().
    442 
    443   If the request is in the internal ARP request queue, the request is aborted
    444   immediately and its ResolvedEvent is signaled. Only an asynchronous address
    445   request needs to be canceled. If TargeSwAddress and ResolveEvent are both
    446   NULL, all the pending asynchronous requests that have been issued by This
    447   instance will be cancelled and their corresponding events will be signaled.
    448 
    449   @param  This                   Pointer to the EFI_ARP_PROTOCOL instance.
    450   @param  TargetSwAddress        Pointer to the protocol address in previous
    451                                  request session.
    452   @param  ResolvedEvent          Pointer to the event that is used as the
    453                                  notification event in previous request session.
    454 
    455   @retval EFI_SUCCESS            The pending request session(s) is/are aborted and
    456                                  corresponding event(s) is/are signaled.
    457   @retval EFI_INVALID_PARAMETER  One or more of the following conditions is TRUE:
    458                                  This is NULL. TargetSwAddress is not NULL and
    459                                  ResolvedEvent is NULL. TargetSwAddress is NULL and
    460                                  ResolvedEvent is not NULL.
    461   @retval EFI_NOT_STARTED        The ARP driver instance has not been configured.
    462   @retval EFI_NOT_FOUND          The request is not issued by
    463                                  EFI_ARP_PROTOCOL.Request().
    464 
    465 **/
    466 EFI_STATUS
    467 EFIAPI
    468 ArpCancel (
    469   IN EFI_ARP_PROTOCOL  *This,
    470   IN VOID              *TargetSwAddress OPTIONAL,
    471   IN EFI_EVENT         ResolvedEvent    OPTIONAL
    472   );
    473 
    474 /**
    475   Configure the instance using the ConfigData. ConfigData is already validated.
    476 
    477   @param[in]  Instance           Pointer to the instance context data to be
    478                                  configured.
    479   @param[in]  ConfigData         Pointer to the configuration data used to
    480                                  configure the instance.
    481 
    482   @retval EFI_SUCCESS            The instance is configured with the ConfigData.
    483   @retval EFI_ACCESS_DENIED      The instance is already configured and the
    484                                  ConfigData tries to reset some unchangeable
    485                                  fields.
    486   @retval EFI_INVALID_PARAMETER  The ConfigData provides a non-unicast IPv4 address
    487                                  when the SwAddressType is IPv4.
    488   @retval EFI_OUT_OF_RESOURCES   The instance fails to configure due to memory
    489                                  limitation.
    490 
    491 **/
    492 EFI_STATUS
    493 ArpConfigureInstance (
    494   IN ARP_INSTANCE_DATA    *Instance,
    495   IN EFI_ARP_CONFIG_DATA  *ConfigData OPTIONAL
    496   );
    497 
    498 /**
    499   Find the CacheEntry, using ProtocolAddress or HardwareAddress or both, as the keyword,
    500   in the DeniedCacheTable.
    501 
    502   @param[in]  ArpService             Pointer to the arp service context data.
    503   @param[in]  ProtocolAddress        Pointer to the protocol address.
    504   @param[in]  HardwareAddress        Pointer to the hardware address.
    505 
    506   @return Pointer to the matched cache entry, if NULL no match is found.
    507 
    508 **/
    509 ARP_CACHE_ENTRY *
    510 ArpFindDeniedCacheEntry (
    511   IN ARP_SERVICE_DATA  *ArpService,
    512   IN NET_ARP_ADDRESS   *ProtocolAddress OPTIONAL,
    513   IN NET_ARP_ADDRESS   *HardwareAddress OPTIONAL
    514   );
    515 
    516 /**
    517   Find the CacheEntry which matches the requirements in the specified CacheTable.
    518 
    519   @param[in]  CacheTable             Pointer to the arp cache table.
    520   @param[in]  StartEntry             Pointer to the start entry this search begins with
    521                                      in the cache table.
    522   @param[in]  FindOpType             The search type.
    523   @param[in]  ProtocolAddress        Pointer to the protocol address to match.
    524   @param[in]  HardwareAddress        Pointer to the hardware address to match.
    525 
    526   @return Pointer to the matched arp cache entry, if NULL, no match is found.
    527 
    528 **/
    529 ARP_CACHE_ENTRY *
    530 ArpFindNextCacheEntryInTable (
    531   IN LIST_ENTRY        *CacheTable,
    532   IN LIST_ENTRY        *StartEntry,
    533   IN FIND_OPTYPE       FindOpType,
    534   IN NET_ARP_ADDRESS   *ProtocolAddress OPTIONAL,
    535   IN NET_ARP_ADDRESS   *HardwareAddress OPTIONAL
    536   );
    537 
    538 /**
    539   Allocate a cache entry and initialize it.
    540 
    541   @param[in]  Instance               Pointer to the instance context data.
    542 
    543   @return Pointer to the new created cache entry.
    544 
    545 **/
    546 ARP_CACHE_ENTRY *
    547 ArpAllocCacheEntry (
    548   IN ARP_INSTANCE_DATA  *Instance
    549   );
    550 
    551 /**
    552   Fill the addresses in the CacheEntry using the information passed in by
    553   HwAddr and SwAddr.
    554 
    555   @param[in]  CacheEntry             Pointer to the cache entry.
    556   @param[in]  HwAddr                 Pointer to the software address.
    557   @param[in]  SwAddr                 Pointer to the hardware address.
    558 
    559   @return None.
    560 
    561 **/
    562 VOID
    563 ArpFillAddressInCacheEntry (
    564   IN ARP_CACHE_ENTRY  *CacheEntry,
    565   IN NET_ARP_ADDRESS  *HwAddr OPTIONAL,
    566   IN NET_ARP_ADDRESS  *SwAddr OPTIONAL
    567   );
    568 
    569 /**
    570   Turn the CacheEntry into the resolved status.
    571 
    572   @param[in]  CacheEntry             Pointer to the resolved cache entry.
    573   @param[in]  Instance               Pointer to the instance context data.
    574   @param[in]  UserEvent              Pointer to the UserEvent to notify.
    575 
    576   @return The count of notifications sent to the instance.
    577 
    578 **/
    579 UINTN
    580 ArpAddressResolved (
    581   IN ARP_CACHE_ENTRY    *CacheEntry,
    582   IN ARP_INSTANCE_DATA  *Instance OPTIONAL,
    583   IN EFI_EVENT          UserEvent OPTIONAL
    584   );
    585 
    586 /**
    587   Delete cache entries in all the cache tables.
    588 
    589   @param[in]  Instance               Pointer to the instance context data.
    590   @param[in]  BySwAddress            Delete the cache entry by software address or by
    591                                      hardware address.
    592   @param[in]  AddressBuffer          Pointer to the buffer containing the address to
    593                                      match for the deletion.
    594   @param[in]  Force                  This deletion is forced or not.
    595 
    596   @return The count of the deleted cache entries.
    597 
    598 **/
    599 UINTN
    600 ArpDeleteCacheEntry (
    601   IN ARP_INSTANCE_DATA  *Instance,
    602   IN BOOLEAN            BySwAddress,
    603   IN UINT8              *AddressBuffer OPTIONAL,
    604   IN BOOLEAN            Force
    605   );
    606 
    607 /**
    608   Send out an arp frame using the CachEntry and the ArpOpCode.
    609 
    610   @param[in]  Instance               Pointer to the instance context data.
    611   @param[in]  CacheEntry             Pointer to the configuration data used to
    612                                      configure the instance.
    613   @param[in]  ArpOpCode              The opcode used to send out this Arp frame, either
    614                                      request or reply.
    615 
    616   @return None.
    617 
    618 **/
    619 VOID
    620 ArpSendFrame (
    621   IN ARP_INSTANCE_DATA  *Instance,
    622   IN ARP_CACHE_ENTRY    *CacheEntry,
    623   IN UINT16             ArpOpCode
    624   );
    625 
    626 /**
    627   Initialize the instance context data.
    628 
    629   @param[in]   ArpService        Pointer to the arp service context data this
    630                                  instance belongs to.
    631   @param[out]  Instance          Pointer to the instance context data.
    632 
    633   @return None.
    634 
    635 **/
    636 VOID
    637 ArpInitInstance (
    638   IN  ARP_SERVICE_DATA   *ArpService,
    639   OUT ARP_INSTANCE_DATA  *Instance
    640   );
    641 
    642 /**
    643   Process the Arp packets received from Mnp, the procedure conforms to RFC826.
    644 
    645   @param[in]  Context            Pointer to the context data registerd to the
    646                                  Event.
    647 
    648   @return None.
    649 
    650 **/
    651 VOID
    652 EFIAPI
    653 ArpOnFrameRcvdDpc (
    654   IN VOID       *Context
    655   );
    656 
    657 /**
    658   Queue ArpOnFrameRcvdDpc as a DPC at TPL_CALLBACK.
    659 
    660   @param[in]  Event                  The Event this notify function registered to.
    661   @param[in]  Context                Pointer to the context data registerd to the
    662                                      Event.
    663 
    664   @return None.
    665 
    666 **/
    667 VOID
    668 EFIAPI
    669 ArpOnFrameRcvd (
    670   IN EFI_EVENT  Event,
    671   IN VOID       *Context
    672   );
    673 
    674 /**
    675   Process the already sent arp packets.
    676 
    677   @param[in]  Context                Pointer to the context data registerd to the
    678                                      Event.
    679 
    680   @return None.
    681 
    682 **/
    683 VOID
    684 EFIAPI
    685 ArpOnFrameSentDpc (
    686   IN VOID       *Context
    687   );
    688 
    689 /**
    690   Request ArpOnFrameSentDpc as a DPC at TPL_CALLBACK.
    691 
    692   @param[in]  Event                  The Event this notify function registered to.
    693   @param[in]  Context                Pointer to the context data registerd to the
    694                                      Event.
    695 
    696   @return None.
    697 
    698 **/
    699 VOID
    700 EFIAPI
    701 ArpOnFrameSent (
    702   IN EFI_EVENT  Event,
    703   IN VOID       *Context
    704   );
    705 
    706 /**
    707   Process the arp cache olding and drive the retrying arp requests.
    708 
    709   @param[in]  Event                  The Event this notify function registered to.
    710   @param[in]  Context                Pointer to the context data registerd to the
    711                                      Event.
    712 
    713   @return None.
    714 
    715 **/
    716 VOID
    717 EFIAPI
    718 ArpTimerHandler (
    719   IN EFI_EVENT  Event,
    720   IN VOID       *Context
    721   );
    722 
    723 /**
    724   Cancel the arp request.
    725 
    726   @param[in]  Instance               Pointer to the instance context data.
    727   @param[in]  TargetSwAddress        Pointer to the buffer containing the target
    728                                      software address to match the arp request.
    729   @param[in]  UserEvent              The user event used to notify this request
    730                                      cancellation.
    731 
    732   @return The count of the cancelled requests.
    733 
    734 **/
    735 UINTN
    736 ArpCancelRequest (
    737   IN ARP_INSTANCE_DATA  *Instance,
    738   IN VOID               *TargetSwAddress OPTIONAL,
    739   IN EFI_EVENT          UserEvent        OPTIONAL
    740   );
    741 
    742 /**
    743   Find the cache entry in the cache table.
    744 
    745   @param[in]  Instance           Pointer to the instance context data.
    746   @param[in]  BySwAddress        Set to TRUE to look for matching software protocol
    747                                  addresses. Set to FALSE to look for matching
    748                                  hardware protocol addresses.
    749   @param[in]  AddressBuffer      Pointer to address buffer. Set to NULL to match
    750                                  all addresses.
    751   @param[out] EntryLength        The size of an entry in the entries buffer.
    752   @param[out] EntryCount         The number of ARP cache entries that are found by
    753                                  the specified criteria.
    754   @param[out] Entries            Pointer to the buffer that will receive the ARP
    755                                  cache entries.
    756   @param[in]  Refresh            Set to TRUE to refresh the timeout value of the
    757                                  matching ARP cache entry.
    758 
    759   @retval EFI_SUCCESS            The requested ARP cache entries are copied into
    760                                  the buffer.
    761   @retval EFI_NOT_FOUND          No matching entries found.
    762   @retval EFI_OUT_OF_RESOURCE    There is a memory allocation failure.
    763 
    764 **/
    765 EFI_STATUS
    766 ArpFindCacheEntry (
    767   IN ARP_INSTANCE_DATA   *Instance,
    768   IN BOOLEAN             BySwAddress,
    769   IN VOID                *AddressBuffer OPTIONAL,
    770   OUT UINT32             *EntryLength   OPTIONAL,
    771   OUT UINT32             *EntryCount    OPTIONAL,
    772   OUT EFI_ARP_FIND_DATA  **Entries      OPTIONAL,
    773   IN BOOLEAN             Refresh
    774   );
    775 
    776 #endif
    777