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
;
128 UINTN ChildrenNumber
;
129 NET_LIST_ENTRY ChildrenList
;
131 NET_LIST_ENTRY PendingRequestTable
;
132 NET_LIST_ENTRY DeniedCacheTable
;
133 NET_LIST_ENTRY ResolvedCacheTable
;
135 EFI_EVENT PeriodicTimer
;
138 typedef struct _USER_REQUEST_CONTEXT
{
140 ARP_INSTANCE_DATA
*Instance
;
141 EFI_EVENT UserRequestEvent
;
142 VOID
*UserHwAddrBuffer
;
143 } USER_REQUEST_CONTEXT
;
145 #define ARP_MAX_PROTOCOL_ADDRESS_LEN sizeof(EFI_IP_ADDRESS)
146 #define ARP_MAX_HARDWARE_ADDRESS_LEN sizeof(EFI_MAC_ADDRESS)
148 typedef struct _NET_ARP_ADDRESS
{
153 UINT8 ProtoAddress
[ARP_MAX_PROTOCOL_ADDRESS_LEN
];
154 UINT8 HwAddress
[ARP_MAX_HARDWARE_ADDRESS_LEN
];
163 typedef struct _ARP_CACHE_ENTRY
{
167 UINT32 DefaultDecayTime
;
169 UINT32 NextRetryTime
;
171 NET_ARP_ADDRESS Addresses
[2];
173 NET_LIST_ENTRY UserRequestList
;
179 IN EFI_ARP_PROTOCOL
*This
,
180 IN EFI_ARP_CONFIG_DATA
*ConfigData OPTIONAL
186 IN EFI_ARP_PROTOCOL
*This
,
188 IN VOID
*TargetSwAddress OPTIONAL
,
189 IN VOID
*TargetHwAddress OPTIONAL
,
190 IN UINT32 TimeoutValue
,
197 IN EFI_ARP_PROTOCOL
*This
,
198 IN BOOLEAN BySwAddress
,
199 IN VOID
*AddressBuffer OPTIONAL
,
200 OUT UINT32
*EntryLength OPTIONAL
,
201 OUT UINT32
*EntryCount OPTIONAL
,
202 OUT EFI_ARP_FIND_DATA
**Entries OPTIONAL
,
209 IN EFI_ARP_PROTOCOL
*This
,
210 IN BOOLEAN BySwAddress
,
211 IN VOID
*AddressBuffer OPTIONAL
217 IN EFI_ARP_PROTOCOL
*This
223 IN EFI_ARP_PROTOCOL
*This
,
224 IN VOID
*TargetSwAddress OPTIONAL
,
225 IN EFI_EVENT ResolvedEvent OPTIONAL
,
226 OUT VOID
*TargetHwAddress
232 IN EFI_ARP_PROTOCOL
*This
,
233 IN VOID
*TargetSwAddress OPTIONAL
,
234 IN EFI_EVENT ResolvedEvent OPTIONAL
238 ArpConfigureInstance (
239 IN ARP_INSTANCE_DATA
*Instance
,
240 IN EFI_ARP_CONFIG_DATA
*ConfigData OPTIONAL
244 ArpFindDeniedCacheEntry (
245 IN ARP_SERVICE_DATA
*ArpService
,
246 IN NET_ARP_ADDRESS
*ProtocolAddress OPTIONAL
,
247 IN NET_ARP_ADDRESS
*HardwareAddress OPTIONAL
251 ArpFindNextCacheEntryInTable (
252 IN NET_LIST_ENTRY
*CacheTable
,
253 IN NET_LIST_ENTRY
*StartEntry
,
254 IN FIND_OPTYPE FindOpType
,
255 IN NET_ARP_ADDRESS
*ProtocolAddress OPTIONAL
,
256 IN NET_ARP_ADDRESS
*HardwareAddress OPTIONAL
261 IN ARP_INSTANCE_DATA
*Instance
265 ArpFillAddressInCacheEntry (
266 IN ARP_CACHE_ENTRY
*CacheEntry
,
267 IN NET_ARP_ADDRESS
*HwAddr OPTIONAL
,
268 IN NET_ARP_ADDRESS
*SwAddr OPTIONAL
273 IN ARP_CACHE_ENTRY
*CacheEntry
,
274 IN ARP_INSTANCE_DATA
*Instance OPTIONAL
,
275 IN EFI_EVENT UserEvent OPTIONAL
279 ArpDeleteCacheEntry (
280 IN ARP_INSTANCE_DATA
*Instance
,
281 IN BOOLEAN BySwAddress
,
282 IN UINT8
*AddressBuffer OPTIONAL
,
288 IN ARP_INSTANCE_DATA
*Instance
,
289 IN ARP_CACHE_ENTRY
*CacheEntry
,
295 IN ARP_SERVICE_DATA
*ArpService
,
296 IN ARP_INSTANCE_DATA
*Instance
334 IN ARP_INSTANCE_DATA
*Instance
,
335 IN VOID
*TargetSwAddress OPTIONAL
,
336 IN EFI_EVENT UserEvent OPTIONAL
341 IN ARP_INSTANCE_DATA
*Instance
,
342 IN BOOLEAN BySwAddress
,
343 IN VOID
*AddressBuffer OPTIONAL
,
344 OUT UINT32
*EntryLength OPTIONAL
,
345 OUT UINT32
*EntryCount OPTIONAL
,
346 OUT EFI_ARP_FIND_DATA
**Entries OPTIONAL
,