]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/Network/ArpDxe/ArpImpl.h
1. Sync the latest network stack. Add NetLibCreateIPv4DPathNode () in netlib library.
[mirror_edk2.git] / MdeModulePkg / Universal / Network / ArpDxe / ArpImpl.h
CommitLineData
772db4bb 1/** @file
2
3Copyright (c) 2006 - 2007, Intel Corporation
4All rights reserved. This program and the accompanying materials
5are licensed and made available under the terms and conditions of the BSD License
6which accompanies this distribution. The full text of the license may be found at
7http://opensource.org/licenses/bsd-license.php
8
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
11
12Module Name:
13
14 ArpImpl.h
15
16Abstract:
17
18
19**/
20
21#ifndef _ARP_IMPL_H_
22#define _ARP_IMPL_H_
23
24\r
25#include <PiDxe.h>\r
26\r
27#include <Protocol/Arp.h>\r
28#include <Protocol/ManagedNetwork.h>
29#include <Protocol/ServiceBinding.h>\r
30\r
31#include <Library/DebugLib.h>\r
32#include <Library/UefiDriverEntryPoint.h>\r
33#include <Library/UefiBootServicesTableLib.h>\r
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>
39
40#include "ArpDebug.h"
41
42#define ARP_ETHER_PROTO_TYPE 0x0806
43#define IPv4_ETHER_PROTO_TYPE 0x0800
44#define IPv6_ETHER_PROTO_TYPE 0x86DD
45
46#define ARP_OPCODE_REQUEST 0x0001
47#define ARP_OPCODE_REPLY 0x0002
48
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)
53
54#pragma pack(1)
55typedef struct _ARP_HEAD {
56 UINT16 HwType;
57 UINT16 ProtoType;
58 UINT8 HwAddrLen;
59 UINT8 ProtoAddrLen;
60 UINT16 OpCode;
61} ARP_HEAD;
62#pragma pack()
63
64typedef struct _ARP_ADDRESS {
65 UINT8 *SenderHwAddr;
66 UINT8 *SenderProtoAddr;
67 UINT8 *TargetHwAddr;
68 UINT8 *TargetProtoAddr;
69} ARP_ADDRESS;
70
71#define MATCH_SW_ADDRESS 0x1
72#define MATCH_HW_ADDRESS 0x2
73
74typedef enum {
75 ByNone = 0,
76 ByProtoAddress = MATCH_SW_ADDRESS,
77 ByHwAddress = MATCH_HW_ADDRESS,
78 ByBoth = MATCH_SW_ADDRESS | MATCH_HW_ADDRESS
79} FIND_OPTYPE;
80
81#define ARP_INSTANCE_DATA_SIGNATURE EFI_SIGNATURE_32('A', 'R', 'P', 'I')
82
83#define ARP_INSTANCE_DATA_FROM_THIS(a) \
84 CR ( \
85 (a), \
86 ARP_INSTANCE_DATA, \
87 ArpProto, \
88 ARP_INSTANCE_DATA_SIGNATURE \
89 )
90
91typedef struct _ARP_SERVICE_DATA ARP_SERVICE_DATA;
92
93typedef struct _ARP_INSTANCE_DATA {
94 UINT32 Signature;
95 ARP_SERVICE_DATA *ArpService;
96 EFI_HANDLE Handle;
97 EFI_ARP_PROTOCOL ArpProto;
98 NET_LIST_ENTRY List;
99 EFI_ARP_CONFIG_DATA ConfigData;
100 BOOLEAN Configured;
101 BOOLEAN Destroyed;
102} ARP_INSTANCE_DATA;
103
104#define ARP_SERVICE_DATA_SIGNATURE EFI_SIGNATURE_32('A', 'R', 'P', 'S')
105
106#define ARP_SERVICE_DATA_FROM_THIS(a) \
107 CR ( \
108 (a), \
109 ARP_SERVICE_DATA, \
110 ServiceBinding, \
111 ARP_SERVICE_DATA_SIGNATURE \
112 )
113
114struct _ARP_SERVICE_DATA {
115 UINT32 Signature;
116 EFI_SERVICE_BINDING_PROTOCOL ServiceBinding;
117
118 EFI_HANDLE MnpChildHandle;
119 EFI_HANDLE ImageHandle;
120 EFI_HANDLE ControllerHandle;
121
122 EFI_MANAGED_NETWORK_PROTOCOL *Mnp;
123 EFI_MANAGED_NETWORK_CONFIG_DATA MnpConfigData;
124 EFI_MANAGED_NETWORK_COMPLETION_TOKEN RxToken;
125
126 EFI_SIMPLE_NETWORK_MODE SnpMode;
127
128 NET_LOCK Lock;
129
130 UINTN ChildrenNumber;
131 NET_LIST_ENTRY ChildrenList;
132
133 NET_LIST_ENTRY PendingRequestTable;
134 NET_LIST_ENTRY DeniedCacheTable;
135 NET_LIST_ENTRY ResolvedCacheTable;
136
137 EFI_EVENT PeriodicTimer;
138};
139
140typedef struct _USER_REQUEST_CONTEXT {
141 NET_LIST_ENTRY List;
142 ARP_INSTANCE_DATA *Instance;
143 EFI_EVENT UserRequestEvent;
144 VOID *UserHwAddrBuffer;
145} USER_REQUEST_CONTEXT;
146
147#define ARP_MAX_PROTOCOL_ADDRESS_LEN sizeof(EFI_IP_ADDRESS)
148#define ARP_MAX_HARDWARE_ADDRESS_LEN sizeof(EFI_MAC_ADDRESS)
149
150typedef struct _NET_ARP_ADDRESS {
151 UINT16 Type;
152 UINT8 Length;
153 UINT8 *AddressPtr;
154 union {
155 UINT8 ProtoAddress[ARP_MAX_PROTOCOL_ADDRESS_LEN];
156 UINT8 HwAddress[ARP_MAX_HARDWARE_ADDRESS_LEN];
157 } Buffer;
158} NET_ARP_ADDRESS;
159
160typedef enum {
161 Hardware,
162 Protocol
163} ARP_ADDRESS_TYPE;
164
165typedef struct _ARP_CACHE_ENTRY {
166 NET_LIST_ENTRY List;
167
168 UINT32 RetryCount;
169 UINT32 DefaultDecayTime;
170 UINT32 DecayTime;
171 UINT32 NextRetryTime;
172
173 NET_ARP_ADDRESS Addresses[2];
174
175 NET_LIST_ENTRY UserRequestList;
176} ARP_CACHE_ENTRY;
177
178EFI_STATUS
179EFIAPI
180ArpConfigure (
181 IN EFI_ARP_PROTOCOL *This,
182 IN EFI_ARP_CONFIG_DATA *ConfigData OPTIONAL
183 );
184
185EFI_STATUS
186EFIAPI
187ArpAdd (
188 IN EFI_ARP_PROTOCOL *This,
189 IN BOOLEAN DenyFlag,
190 IN VOID *TargetSwAddress OPTIONAL,
191 IN VOID *TargetHwAddress OPTIONAL,
192 IN UINT32 TimeoutValue,
193 IN BOOLEAN Overwrite
194 );
195
196EFI_STATUS
197EFIAPI
198ArpFind (
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,
205 IN BOOLEAN Refresh
206 );
207
208EFI_STATUS
209EFIAPI
210ArpDelete (
211 IN EFI_ARP_PROTOCOL *This,
212 IN BOOLEAN BySwAddress,
213 IN VOID *AddressBuffer OPTIONAL
214 );
215
216EFI_STATUS
217EFIAPI
218ArpFlush (
219 IN EFI_ARP_PROTOCOL *This
220 );
221
222EFI_STATUS
223EFIAPI
224ArpRequest (
225 IN EFI_ARP_PROTOCOL *This,
226 IN VOID *TargetSwAddress OPTIONAL,
227 IN EFI_EVENT ResolvedEvent OPTIONAL,
228 OUT VOID *TargetHwAddress
229 );
230
231EFI_STATUS
232EFIAPI
233ArpCancel (
234 IN EFI_ARP_PROTOCOL *This,
235 IN VOID *TargetSwAddress OPTIONAL,
236 IN EFI_EVENT ResolvedEvent OPTIONAL
237 );
238
239EFI_STATUS
240ArpConfigureInstance (
241 IN ARP_INSTANCE_DATA *Instance,
242 IN EFI_ARP_CONFIG_DATA *ConfigData OPTIONAL
243 );
244
245ARP_CACHE_ENTRY *
246ArpFindDeniedCacheEntry (
247 IN ARP_SERVICE_DATA *ArpService,
248 IN NET_ARP_ADDRESS *ProtocolAddress OPTIONAL,
249 IN NET_ARP_ADDRESS *HardwareAddress OPTIONAL
250 );
251
252ARP_CACHE_ENTRY *
253ArpFindNextCacheEntryInTable (
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
259 );
260
261ARP_CACHE_ENTRY *
262ArpAllocCacheEntry (
263 IN ARP_INSTANCE_DATA *Instance
264 );
265
266VOID
267ArpFillAddressInCacheEntry (
268 IN ARP_CACHE_ENTRY *CacheEntry,
269 IN NET_ARP_ADDRESS *HwAddr OPTIONAL,
270 IN NET_ARP_ADDRESS *SwAddr OPTIONAL
271 );
272
273UINTN
274ArpAddressResolved (
275 IN ARP_CACHE_ENTRY *CacheEntry,
276 IN ARP_INSTANCE_DATA *Instance OPTIONAL,
277 IN EFI_EVENT UserEvent OPTIONAL
278 );
279
280UINTN
281ArpDeleteCacheEntry (
282 IN ARP_INSTANCE_DATA *Instance,
283 IN BOOLEAN BySwAddress,
284 IN UINT8 *AddressBuffer OPTIONAL,
285 IN BOOLEAN Force
286 );
287
288VOID
289ArpSendFrame (
290 IN ARP_INSTANCE_DATA *Instance,
291 IN ARP_CACHE_ENTRY *CacheEntry,
292 IN UINT16 ArpOpCode
293 );
294
295VOID
296ArpInitInstance (
297 IN ARP_SERVICE_DATA *ArpService,
298 IN ARP_INSTANCE_DATA *Instance
299 );
300
301VOID
302EFIAPI
303ArpOnFrameRcvd (
304 IN EFI_EVENT Event,
305 IN VOID *Context
306 );
307
308VOID
309EFIAPI
310ArpOnFrameSent (
311 IN EFI_EVENT Event,
312 IN VOID *Context
313 );
314
315VOID
316EFIAPI
317ArpTimerHandler (
318 IN EFI_EVENT Event,
319 IN VOID *Context
320 );
321
322UINTN
323ArpCancelRequest (
324 IN ARP_INSTANCE_DATA *Instance,
325 IN VOID *TargetSwAddress OPTIONAL,
326 IN EFI_EVENT UserEvent OPTIONAL
327 );
328
329EFI_STATUS
330ArpFindCacheEntry (
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,
337 IN BOOLEAN Refresh
338 );
339
340#endif
341