3 Copyright (c) 2006 - 2007, Intel Corporation
4 All rights reserved. This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
27 #include <Protocol/Arp.h>
28 #include <Protocol/ManagedNetwork.h>
29 #include <Protocol/ServiceBinding.h>
31 #include <Library/DebugLib.h>
32 #include <Library/UefiDriverEntryPoint.h>
33 #include <Library/UefiBootServicesTableLib.h>
34 #include <Library/UefiLib.h>
35 #include <Library/NetLib.h>
36 #include <Library/BaseLib.h>
37 #include <Library/BaseMemoryLib.h>
38 #include <Library/MemoryAllocationLib.h>
42 #define ARP_ETHER_PROTO_TYPE 0x0806
43 #define IPv4_ETHER_PROTO_TYPE 0x0800
44 #define IPv6_ETHER_PROTO_TYPE 0x86DD
46 #define ARP_OPCODE_REQUEST 0x0001
47 #define ARP_OPCODE_REPLY 0x0002
49 #define ARP_DEFAULT_TIMEOUT_VALUE (400 * TICKS_PER_SECOND)
50 #define ARP_DEFAULT_RETRY_COUNT 2
51 #define ARP_DEFAULT_RETRY_INTERVAL (5 * TICKS_PER_MS)
52 #define ARP_PERIODIC_TIMER_INTERVAL (500 * TICKS_PER_MS)
55 typedef struct _ARP_HEAD
{
64 typedef struct _ARP_ADDRESS
{
66 UINT8
*SenderProtoAddr
;
68 UINT8
*TargetProtoAddr
;
71 #define MATCH_SW_ADDRESS 0x1
72 #define MATCH_HW_ADDRESS 0x2
76 ByProtoAddress
= MATCH_SW_ADDRESS
,
77 ByHwAddress
= MATCH_HW_ADDRESS
,
78 ByBoth
= MATCH_SW_ADDRESS
| MATCH_HW_ADDRESS
81 #define ARP_INSTANCE_DATA_SIGNATURE EFI_SIGNATURE_32('A', 'R', 'P', 'I')
83 #define ARP_INSTANCE_DATA_FROM_THIS(a) \
88 ARP_INSTANCE_DATA_SIGNATURE \
91 typedef struct _ARP_SERVICE_DATA ARP_SERVICE_DATA
;
93 typedef struct _ARP_INSTANCE_DATA
{
95 ARP_SERVICE_DATA
*ArpService
;
97 EFI_ARP_PROTOCOL ArpProto
;
99 EFI_ARP_CONFIG_DATA ConfigData
;
104 #define ARP_SERVICE_DATA_SIGNATURE EFI_SIGNATURE_32('A', 'R', 'P', 'S')
106 #define ARP_SERVICE_DATA_FROM_THIS(a) \
111 ARP_SERVICE_DATA_SIGNATURE \
114 struct _ARP_SERVICE_DATA
{
116 EFI_SERVICE_BINDING_PROTOCOL ServiceBinding
;
118 EFI_HANDLE MnpChildHandle
;
119 EFI_HANDLE ImageHandle
;
120 EFI_HANDLE ControllerHandle
;
122 EFI_MANAGED_NETWORK_PROTOCOL
*Mnp
;
123 EFI_MANAGED_NETWORK_CONFIG_DATA MnpConfigData
;
124 EFI_MANAGED_NETWORK_COMPLETION_TOKEN RxToken
;
126 EFI_SIMPLE_NETWORK_MODE SnpMode
;
130 UINTN ChildrenNumber
;
131 NET_LIST_ENTRY ChildrenList
;
133 NET_LIST_ENTRY PendingRequestTable
;
134 NET_LIST_ENTRY DeniedCacheTable
;
135 NET_LIST_ENTRY ResolvedCacheTable
;
137 EFI_EVENT PeriodicTimer
;
140 typedef struct _USER_REQUEST_CONTEXT
{
142 ARP_INSTANCE_DATA
*Instance
;
143 EFI_EVENT UserRequestEvent
;
144 VOID
*UserHwAddrBuffer
;
145 } USER_REQUEST_CONTEXT
;
147 #define ARP_MAX_PROTOCOL_ADDRESS_LEN sizeof(EFI_IP_ADDRESS)
148 #define ARP_MAX_HARDWARE_ADDRESS_LEN sizeof(EFI_MAC_ADDRESS)
150 typedef struct _NET_ARP_ADDRESS
{
155 UINT8 ProtoAddress
[ARP_MAX_PROTOCOL_ADDRESS_LEN
];
156 UINT8 HwAddress
[ARP_MAX_HARDWARE_ADDRESS_LEN
];
165 typedef struct _ARP_CACHE_ENTRY
{
169 UINT32 DefaultDecayTime
;
171 UINT32 NextRetryTime
;
173 NET_ARP_ADDRESS Addresses
[2];
175 NET_LIST_ENTRY UserRequestList
;
181 IN EFI_ARP_PROTOCOL
*This
,
182 IN EFI_ARP_CONFIG_DATA
*ConfigData OPTIONAL
188 IN EFI_ARP_PROTOCOL
*This
,
190 IN VOID
*TargetSwAddress OPTIONAL
,
191 IN VOID
*TargetHwAddress OPTIONAL
,
192 IN UINT32 TimeoutValue
,
199 IN EFI_ARP_PROTOCOL
*This
,
200 IN BOOLEAN BySwAddress
,
201 IN VOID
*AddressBuffer OPTIONAL
,
202 OUT UINT32
*EntryLength OPTIONAL
,
203 OUT UINT32
*EntryCount OPTIONAL
,
204 OUT EFI_ARP_FIND_DATA
**Entries OPTIONAL
,
211 IN EFI_ARP_PROTOCOL
*This
,
212 IN BOOLEAN BySwAddress
,
213 IN VOID
*AddressBuffer OPTIONAL
219 IN EFI_ARP_PROTOCOL
*This
225 IN EFI_ARP_PROTOCOL
*This
,
226 IN VOID
*TargetSwAddress OPTIONAL
,
227 IN EFI_EVENT ResolvedEvent OPTIONAL
,
228 OUT VOID
*TargetHwAddress
234 IN EFI_ARP_PROTOCOL
*This
,
235 IN VOID
*TargetSwAddress OPTIONAL
,
236 IN EFI_EVENT ResolvedEvent OPTIONAL
240 ArpConfigureInstance (
241 IN ARP_INSTANCE_DATA
*Instance
,
242 IN EFI_ARP_CONFIG_DATA
*ConfigData OPTIONAL
246 ArpFindDeniedCacheEntry (
247 IN ARP_SERVICE_DATA
*ArpService
,
248 IN NET_ARP_ADDRESS
*ProtocolAddress OPTIONAL
,
249 IN NET_ARP_ADDRESS
*HardwareAddress OPTIONAL
253 ArpFindNextCacheEntryInTable (
254 IN NET_LIST_ENTRY
*CacheTable
,
255 IN NET_LIST_ENTRY
*StartEntry
,
256 IN FIND_OPTYPE FindOpType
,
257 IN NET_ARP_ADDRESS
*ProtocolAddress OPTIONAL
,
258 IN NET_ARP_ADDRESS
*HardwareAddress OPTIONAL
263 IN ARP_INSTANCE_DATA
*Instance
267 ArpFillAddressInCacheEntry (
268 IN ARP_CACHE_ENTRY
*CacheEntry
,
269 IN NET_ARP_ADDRESS
*HwAddr OPTIONAL
,
270 IN NET_ARP_ADDRESS
*SwAddr OPTIONAL
275 IN ARP_CACHE_ENTRY
*CacheEntry
,
276 IN ARP_INSTANCE_DATA
*Instance OPTIONAL
,
277 IN EFI_EVENT UserEvent OPTIONAL
281 ArpDeleteCacheEntry (
282 IN ARP_INSTANCE_DATA
*Instance
,
283 IN BOOLEAN BySwAddress
,
284 IN UINT8
*AddressBuffer OPTIONAL
,
290 IN ARP_INSTANCE_DATA
*Instance
,
291 IN ARP_CACHE_ENTRY
*CacheEntry
,
297 IN ARP_SERVICE_DATA
*ArpService
,
298 IN ARP_INSTANCE_DATA
*Instance
324 IN ARP_INSTANCE_DATA
*Instance
,
325 IN VOID
*TargetSwAddress OPTIONAL
,
326 IN EFI_EVENT UserEvent OPTIONAL
331 IN ARP_INSTANCE_DATA
*Instance
,
332 IN BOOLEAN BySwAddress
,
333 IN VOID
*AddressBuffer OPTIONAL
,
334 OUT UINT32
*EntryLength OPTIONAL
,
335 OUT UINT32
*EntryCount OPTIONAL
,
336 OUT EFI_ARP_FIND_DATA
**Entries OPTIONAL
,