mirror of https://github.com/acidanthera/audk.git
342 lines
7.8 KiB
C
342 lines
7.8 KiB
C
|
/** @file
|
||
|
|
||
|
Copyright (c) 2006 - 2007, 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
|
||
|
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_
|
||
|
#define _ARP_IMPL_H_
|
||
|
|
||
|
|
||
|
#include <PiDxe.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 "ArpDebug.h"
|
||
|
|
||
|
#define ARP_ETHER_PROTO_TYPE 0x0806
|
||
|
#define IPv4_ETHER_PROTO_TYPE 0x0800
|
||
|
#define IPv6_ETHER_PROTO_TYPE 0x86DD
|
||
|
|
||
|
#define ARP_OPCODE_REQUEST 0x0001
|
||
|
#define ARP_OPCODE_REPLY 0x0002
|
||
|
|
||
|
#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)
|
||
|
|
||
|
#pragma pack(1)
|
||
|
typedef struct _ARP_HEAD {
|
||
|
UINT16 HwType;
|
||
|
UINT16 ProtoType;
|
||
|
UINT8 HwAddrLen;
|
||
|
UINT8 ProtoAddrLen;
|
||
|
UINT16 OpCode;
|
||
|
} ARP_HEAD;
|
||
|
#pragma pack()
|
||
|
|
||
|
typedef struct _ARP_ADDRESS {
|
||
|
UINT8 *SenderHwAddr;
|
||
|
UINT8 *SenderProtoAddr;
|
||
|
UINT8 *TargetHwAddr;
|
||
|
UINT8 *TargetProtoAddr;
|
||
|
} ARP_ADDRESS;
|
||
|
|
||
|
#define MATCH_SW_ADDRESS 0x1
|
||
|
#define MATCH_HW_ADDRESS 0x2
|
||
|
|
||
|
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 EFI_SIGNATURE_32('A', 'R', 'P', 'I')
|
||
|
|
||
|
#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;
|
||
|
|
||
|
typedef struct _ARP_INSTANCE_DATA {
|
||
|
UINT32 Signature;
|
||
|
ARP_SERVICE_DATA *ArpService;
|
||
|
EFI_HANDLE Handle;
|
||
|
EFI_ARP_PROTOCOL ArpProto;
|
||
|
NET_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_FROM_THIS(a) \
|
||
|
CR ( \
|
||
|
(a), \
|
||
|
ARP_SERVICE_DATA, \
|
||
|
ServiceBinding, \
|
||
|
ARP_SERVICE_DATA_SIGNATURE \
|
||
|
)
|
||
|
|
||
|
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;
|
||
|
|
||
|
NET_LOCK Lock;
|
||
|
|
||
|
UINTN ChildrenNumber;
|
||
|
NET_LIST_ENTRY ChildrenList;
|
||
|
|
||
|
NET_LIST_ENTRY PendingRequestTable;
|
||
|
NET_LIST_ENTRY DeniedCacheTable;
|
||
|
NET_LIST_ENTRY ResolvedCacheTable;
|
||
|
|
||
|
EFI_EVENT PeriodicTimer;
|
||
|
};
|
||
|
|
||
|
typedef struct _USER_REQUEST_CONTEXT {
|
||
|
NET_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 struct _NET_ARP_ADDRESS {
|
||
|
UINT16 Type;
|
||
|
UINT8 Length;
|
||
|
UINT8 *AddressPtr;
|
||
|
union {
|
||
|
UINT8 ProtoAddress[ARP_MAX_PROTOCOL_ADDRESS_LEN];
|
||
|
UINT8 HwAddress[ARP_MAX_HARDWARE_ADDRESS_LEN];
|
||
|
} Buffer;
|
||
|
} NET_ARP_ADDRESS;
|
||
|
|
||
|
typedef enum {
|
||
|
Hardware,
|
||
|
Protocol
|
||
|
} ARP_ADDRESS_TYPE;
|
||
|
|
||
|
typedef struct _ARP_CACHE_ENTRY {
|
||
|
NET_LIST_ENTRY List;
|
||
|
|
||
|
UINT32 RetryCount;
|
||
|
UINT32 DefaultDecayTime;
|
||
|
UINT32 DecayTime;
|
||
|
UINT32 NextRetryTime;
|
||
|
|
||
|
NET_ARP_ADDRESS Addresses[2];
|
||
|
|
||
|
NET_LIST_ENTRY UserRequestList;
|
||
|
} ARP_CACHE_ENTRY;
|
||
|
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
ArpConfigure (
|
||
|
IN EFI_ARP_PROTOCOL *This,
|
||
|
IN EFI_ARP_CONFIG_DATA *ConfigData OPTIONAL
|
||
|
);
|
||
|
|
||
|
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
|
||
|
);
|
||
|
|
||
|
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
|
||
|
);
|
||
|
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
ArpDelete (
|
||
|
IN EFI_ARP_PROTOCOL *This,
|
||
|
IN BOOLEAN BySwAddress,
|
||
|
IN VOID *AddressBuffer OPTIONAL
|
||
|
);
|
||
|
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
ArpFlush (
|
||
|
IN EFI_ARP_PROTOCOL *This
|
||
|
);
|
||
|
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
ArpRequest (
|
||
|
IN EFI_ARP_PROTOCOL *This,
|
||
|
IN VOID *TargetSwAddress OPTIONAL,
|
||
|
IN EFI_EVENT ResolvedEvent OPTIONAL,
|
||
|
OUT VOID *TargetHwAddress
|
||
|
);
|
||
|
|
||
|
EFI_STATUS
|
||
|
EFIAPI
|
||
|
ArpCancel (
|
||
|
IN EFI_ARP_PROTOCOL *This,
|
||
|
IN VOID *TargetSwAddress OPTIONAL,
|
||
|
IN EFI_EVENT ResolvedEvent OPTIONAL
|
||
|
);
|
||
|
|
||
|
EFI_STATUS
|
||
|
ArpConfigureInstance (
|
||
|
IN ARP_INSTANCE_DATA *Instance,
|
||
|
IN EFI_ARP_CONFIG_DATA *ConfigData OPTIONAL
|
||
|
);
|
||
|
|
||
|
ARP_CACHE_ENTRY *
|
||
|
ArpFindDeniedCacheEntry (
|
||
|
IN ARP_SERVICE_DATA *ArpService,
|
||
|
IN NET_ARP_ADDRESS *ProtocolAddress OPTIONAL,
|
||
|
IN NET_ARP_ADDRESS *HardwareAddress OPTIONAL
|
||
|
);
|
||
|
|
||
|
ARP_CACHE_ENTRY *
|
||
|
ArpFindNextCacheEntryInTable (
|
||
|
IN NET_LIST_ENTRY *CacheTable,
|
||
|
IN NET_LIST_ENTRY *StartEntry,
|
||
|
IN FIND_OPTYPE FindOpType,
|
||
|
IN NET_ARP_ADDRESS *ProtocolAddress OPTIONAL,
|
||
|
IN NET_ARP_ADDRESS *HardwareAddress OPTIONAL
|
||
|
);
|
||
|
|
||
|
ARP_CACHE_ENTRY *
|
||
|
ArpAllocCacheEntry (
|
||
|
IN ARP_INSTANCE_DATA *Instance
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
ArpFillAddressInCacheEntry (
|
||
|
IN ARP_CACHE_ENTRY *CacheEntry,
|
||
|
IN NET_ARP_ADDRESS *HwAddr OPTIONAL,
|
||
|
IN NET_ARP_ADDRESS *SwAddr OPTIONAL
|
||
|
);
|
||
|
|
||
|
UINTN
|
||
|
ArpAddressResolved (
|
||
|
IN ARP_CACHE_ENTRY *CacheEntry,
|
||
|
IN ARP_INSTANCE_DATA *Instance OPTIONAL,
|
||
|
IN EFI_EVENT UserEvent OPTIONAL
|
||
|
);
|
||
|
|
||
|
UINTN
|
||
|
ArpDeleteCacheEntry (
|
||
|
IN ARP_INSTANCE_DATA *Instance,
|
||
|
IN BOOLEAN BySwAddress,
|
||
|
IN UINT8 *AddressBuffer OPTIONAL,
|
||
|
IN BOOLEAN Force
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
ArpSendFrame (
|
||
|
IN ARP_INSTANCE_DATA *Instance,
|
||
|
IN ARP_CACHE_ENTRY *CacheEntry,
|
||
|
IN UINT16 ArpOpCode
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
ArpInitInstance (
|
||
|
IN ARP_SERVICE_DATA *ArpService,
|
||
|
IN ARP_INSTANCE_DATA *Instance
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
EFIAPI
|
||
|
ArpOnFrameRcvd (
|
||
|
IN EFI_EVENT Event,
|
||
|
IN VOID *Context
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
EFIAPI
|
||
|
ArpOnFrameSent (
|
||
|
IN EFI_EVENT Event,
|
||
|
IN VOID *Context
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
EFIAPI
|
||
|
ArpTimerHandler (
|
||
|
IN EFI_EVENT Event,
|
||
|
IN VOID *Context
|
||
|
);
|
||
|
|
||
|
UINTN
|
||
|
ArpCancelRequest (
|
||
|
IN ARP_INSTANCE_DATA *Instance,
|
||
|
IN VOID *TargetSwAddress OPTIONAL,
|
||
|
IN EFI_EVENT UserEvent OPTIONAL
|
||
|
);
|
||
|
|
||
|
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
|
||
|
|