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>
41 #define ARP_ETHER_PROTO_TYPE 0x0806
42 #define IPv4_ETHER_PROTO_TYPE 0x0800
43 #define IPv6_ETHER_PROTO_TYPE 0x86DD
45 #define ARP_OPCODE_REQUEST 0x0001
46 #define ARP_OPCODE_REPLY 0x0002
48 #define ARP_DEFAULT_TIMEOUT_VALUE (400 * TICKS_PER_SECOND)
49 #define ARP_DEFAULT_RETRY_COUNT 2
50 #define ARP_DEFAULT_RETRY_INTERVAL (5 * TICKS_PER_MS)
51 #define ARP_PERIODIC_TIMER_INTERVAL (500 * TICKS_PER_MS)
54 typedef struct _ARP_HEAD
{
63 typedef struct _ARP_ADDRESS
{
65 UINT8
*SenderProtoAddr
;
67 UINT8
*TargetProtoAddr
;
70 #define MATCH_SW_ADDRESS 0x1
71 #define MATCH_HW_ADDRESS 0x2
75 ByProtoAddress
= MATCH_SW_ADDRESS
,
76 ByHwAddress
= MATCH_HW_ADDRESS
,
77 ByBoth
= MATCH_SW_ADDRESS
| MATCH_HW_ADDRESS
80 #define ARP_INSTANCE_DATA_SIGNATURE EFI_SIGNATURE_32('A', 'R', 'P', 'I')
82 #define ARP_INSTANCE_DATA_FROM_THIS(a) \
87 ARP_INSTANCE_DATA_SIGNATURE \
90 typedef struct _ARP_SERVICE_DATA ARP_SERVICE_DATA
;
92 typedef struct _ARP_INSTANCE_DATA
{
94 ARP_SERVICE_DATA
*ArpService
;
96 EFI_ARP_PROTOCOL ArpProto
;
98 EFI_ARP_CONFIG_DATA ConfigData
;
103 #define ARP_SERVICE_DATA_SIGNATURE EFI_SIGNATURE_32('A', 'R', 'P', 'S')
105 #define ARP_SERVICE_DATA_FROM_THIS(a) \
110 ARP_SERVICE_DATA_SIGNATURE \
113 struct _ARP_SERVICE_DATA
{
115 EFI_SERVICE_BINDING_PROTOCOL ServiceBinding
;
117 EFI_HANDLE MnpChildHandle
;
118 EFI_HANDLE ImageHandle
;
119 EFI_HANDLE ControllerHandle
;
121 EFI_MANAGED_NETWORK_PROTOCOL
*Mnp
;
122 EFI_MANAGED_NETWORK_CONFIG_DATA MnpConfigData
;
123 EFI_MANAGED_NETWORK_COMPLETION_TOKEN RxToken
;
125 EFI_SIMPLE_NETWORK_MODE SnpMode
;
127 UINTN ChildrenNumber
;
128 LIST_ENTRY ChildrenList
;
130 LIST_ENTRY PendingRequestTable
;
131 LIST_ENTRY DeniedCacheTable
;
132 LIST_ENTRY ResolvedCacheTable
;
134 EFI_EVENT PeriodicTimer
;
137 typedef struct _USER_REQUEST_CONTEXT
{
139 ARP_INSTANCE_DATA
*Instance
;
140 EFI_EVENT UserRequestEvent
;
141 VOID
*UserHwAddrBuffer
;
142 } USER_REQUEST_CONTEXT
;
144 #define ARP_MAX_PROTOCOL_ADDRESS_LEN sizeof(EFI_IP_ADDRESS)
145 #define ARP_MAX_HARDWARE_ADDRESS_LEN sizeof(EFI_MAC_ADDRESS)
147 typedef struct _NET_ARP_ADDRESS
{
152 UINT8 ProtoAddress
[ARP_MAX_PROTOCOL_ADDRESS_LEN
];
153 UINT8 HwAddress
[ARP_MAX_HARDWARE_ADDRESS_LEN
];
162 typedef struct _ARP_CACHE_ENTRY
{
166 UINT32 DefaultDecayTime
;
168 UINT32 NextRetryTime
;
170 NET_ARP_ADDRESS Addresses
[2];
172 LIST_ENTRY UserRequestList
;
178 IN EFI_ARP_PROTOCOL
*This
,
179 IN EFI_ARP_CONFIG_DATA
*ConfigData OPTIONAL
185 IN EFI_ARP_PROTOCOL
*This
,
187 IN VOID
*TargetSwAddress OPTIONAL
,
188 IN VOID
*TargetHwAddress OPTIONAL
,
189 IN UINT32 TimeoutValue
,
196 IN EFI_ARP_PROTOCOL
*This
,
197 IN BOOLEAN BySwAddress
,
198 IN VOID
*AddressBuffer OPTIONAL
,
199 OUT UINT32
*EntryLength OPTIONAL
,
200 OUT UINT32
*EntryCount OPTIONAL
,
201 OUT EFI_ARP_FIND_DATA
**Entries OPTIONAL
,
208 IN EFI_ARP_PROTOCOL
*This
,
209 IN BOOLEAN BySwAddress
,
210 IN VOID
*AddressBuffer OPTIONAL
216 IN EFI_ARP_PROTOCOL
*This
222 IN EFI_ARP_PROTOCOL
*This
,
223 IN VOID
*TargetSwAddress OPTIONAL
,
224 IN EFI_EVENT ResolvedEvent OPTIONAL
,
225 OUT VOID
*TargetHwAddress
231 IN EFI_ARP_PROTOCOL
*This
,
232 IN VOID
*TargetSwAddress OPTIONAL
,
233 IN EFI_EVENT ResolvedEvent OPTIONAL
237 ArpConfigureInstance (
238 IN ARP_INSTANCE_DATA
*Instance
,
239 IN EFI_ARP_CONFIG_DATA
*ConfigData OPTIONAL
243 ArpFindDeniedCacheEntry (
244 IN ARP_SERVICE_DATA
*ArpService
,
245 IN NET_ARP_ADDRESS
*ProtocolAddress OPTIONAL
,
246 IN NET_ARP_ADDRESS
*HardwareAddress OPTIONAL
250 ArpFindNextCacheEntryInTable (
251 IN LIST_ENTRY
*CacheTable
,
252 IN LIST_ENTRY
*StartEntry
,
253 IN FIND_OPTYPE FindOpType
,
254 IN NET_ARP_ADDRESS
*ProtocolAddress OPTIONAL
,
255 IN NET_ARP_ADDRESS
*HardwareAddress OPTIONAL
260 IN ARP_INSTANCE_DATA
*Instance
264 ArpFillAddressInCacheEntry (
265 IN ARP_CACHE_ENTRY
*CacheEntry
,
266 IN NET_ARP_ADDRESS
*HwAddr OPTIONAL
,
267 IN NET_ARP_ADDRESS
*SwAddr OPTIONAL
272 IN ARP_CACHE_ENTRY
*CacheEntry
,
273 IN ARP_INSTANCE_DATA
*Instance OPTIONAL
,
274 IN EFI_EVENT UserEvent OPTIONAL
278 ArpDeleteCacheEntry (
279 IN ARP_INSTANCE_DATA
*Instance
,
280 IN BOOLEAN BySwAddress
,
281 IN UINT8
*AddressBuffer OPTIONAL
,
287 IN ARP_INSTANCE_DATA
*Instance
,
288 IN ARP_CACHE_ENTRY
*CacheEntry
,
294 IN ARP_SERVICE_DATA
*ArpService
,
295 IN ARP_INSTANCE_DATA
*Instance
333 IN ARP_INSTANCE_DATA
*Instance
,
334 IN VOID
*TargetSwAddress OPTIONAL
,
335 IN EFI_EVENT UserEvent OPTIONAL
340 IN ARP_INSTANCE_DATA
*Instance
,
341 IN BOOLEAN BySwAddress
,
342 IN VOID
*AddressBuffer OPTIONAL
,
343 OUT UINT32
*EntryLength OPTIONAL
,
344 OUT UINT32
*EntryCount OPTIONAL
,
345 OUT EFI_ARP_FIND_DATA
**Entries OPTIONAL
,