]> git.proxmox.com Git - mirror_edk2.git/blob - MdeModulePkg/Universal/Network/ArpDxe/ArpImpl.h
1c5e421a045063bed24da5b61329cae020495771
[mirror_edk2.git] / MdeModulePkg / Universal / Network / ArpDxe / ArpImpl.h
1 /** @file
2
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
8
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.
11
12 Module Name:
13
14 ArpImpl.h
15
16 Abstract:
17
18
19 **/
20
21 #ifndef _ARP_IMPL_H_
22 #define _ARP_IMPL_H_
23
24
25 #include <PiDxe.h>
26
27 #include <Protocol/Arp.h>
28 #include <Protocol/ManagedNetwork.h>
29 #include <Protocol/ServiceBinding.h>
30
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>
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)
55 typedef 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
64 typedef 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
74 typedef 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
91 typedef struct _ARP_SERVICE_DATA ARP_SERVICE_DATA;
92
93 typedef 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
114 struct _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 UINTN ChildrenNumber;
129 NET_LIST_ENTRY ChildrenList;
130
131 NET_LIST_ENTRY PendingRequestTable;
132 NET_LIST_ENTRY DeniedCacheTable;
133 NET_LIST_ENTRY ResolvedCacheTable;
134
135 EFI_EVENT PeriodicTimer;
136 };
137
138 typedef struct _USER_REQUEST_CONTEXT {
139 NET_LIST_ENTRY List;
140 ARP_INSTANCE_DATA *Instance;
141 EFI_EVENT UserRequestEvent;
142 VOID *UserHwAddrBuffer;
143 } USER_REQUEST_CONTEXT;
144
145 #define ARP_MAX_PROTOCOL_ADDRESS_LEN sizeof(EFI_IP_ADDRESS)
146 #define ARP_MAX_HARDWARE_ADDRESS_LEN sizeof(EFI_MAC_ADDRESS)
147
148 typedef struct _NET_ARP_ADDRESS {
149 UINT16 Type;
150 UINT8 Length;
151 UINT8 *AddressPtr;
152 union {
153 UINT8 ProtoAddress[ARP_MAX_PROTOCOL_ADDRESS_LEN];
154 UINT8 HwAddress[ARP_MAX_HARDWARE_ADDRESS_LEN];
155 } Buffer;
156 } NET_ARP_ADDRESS;
157
158 typedef enum {
159 Hardware,
160 Protocol
161 } ARP_ADDRESS_TYPE;
162
163 typedef struct _ARP_CACHE_ENTRY {
164 NET_LIST_ENTRY List;
165
166 UINT32 RetryCount;
167 UINT32 DefaultDecayTime;
168 UINT32 DecayTime;
169 UINT32 NextRetryTime;
170
171 NET_ARP_ADDRESS Addresses[2];
172
173 NET_LIST_ENTRY UserRequestList;
174 } ARP_CACHE_ENTRY;
175
176 EFI_STATUS
177 EFIAPI
178 ArpConfigure (
179 IN EFI_ARP_PROTOCOL *This,
180 IN EFI_ARP_CONFIG_DATA *ConfigData OPTIONAL
181 );
182
183 EFI_STATUS
184 EFIAPI
185 ArpAdd (
186 IN EFI_ARP_PROTOCOL *This,
187 IN BOOLEAN DenyFlag,
188 IN VOID *TargetSwAddress OPTIONAL,
189 IN VOID *TargetHwAddress OPTIONAL,
190 IN UINT32 TimeoutValue,
191 IN BOOLEAN Overwrite
192 );
193
194 EFI_STATUS
195 EFIAPI
196 ArpFind (
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,
203 IN BOOLEAN Refresh
204 );
205
206 EFI_STATUS
207 EFIAPI
208 ArpDelete (
209 IN EFI_ARP_PROTOCOL *This,
210 IN BOOLEAN BySwAddress,
211 IN VOID *AddressBuffer OPTIONAL
212 );
213
214 EFI_STATUS
215 EFIAPI
216 ArpFlush (
217 IN EFI_ARP_PROTOCOL *This
218 );
219
220 EFI_STATUS
221 EFIAPI
222 ArpRequest (
223 IN EFI_ARP_PROTOCOL *This,
224 IN VOID *TargetSwAddress OPTIONAL,
225 IN EFI_EVENT ResolvedEvent OPTIONAL,
226 OUT VOID *TargetHwAddress
227 );
228
229 EFI_STATUS
230 EFIAPI
231 ArpCancel (
232 IN EFI_ARP_PROTOCOL *This,
233 IN VOID *TargetSwAddress OPTIONAL,
234 IN EFI_EVENT ResolvedEvent OPTIONAL
235 );
236
237 EFI_STATUS
238 ArpConfigureInstance (
239 IN ARP_INSTANCE_DATA *Instance,
240 IN EFI_ARP_CONFIG_DATA *ConfigData OPTIONAL
241 );
242
243 ARP_CACHE_ENTRY *
244 ArpFindDeniedCacheEntry (
245 IN ARP_SERVICE_DATA *ArpService,
246 IN NET_ARP_ADDRESS *ProtocolAddress OPTIONAL,
247 IN NET_ARP_ADDRESS *HardwareAddress OPTIONAL
248 );
249
250 ARP_CACHE_ENTRY *
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
257 );
258
259 ARP_CACHE_ENTRY *
260 ArpAllocCacheEntry (
261 IN ARP_INSTANCE_DATA *Instance
262 );
263
264 VOID
265 ArpFillAddressInCacheEntry (
266 IN ARP_CACHE_ENTRY *CacheEntry,
267 IN NET_ARP_ADDRESS *HwAddr OPTIONAL,
268 IN NET_ARP_ADDRESS *SwAddr OPTIONAL
269 );
270
271 UINTN
272 ArpAddressResolved (
273 IN ARP_CACHE_ENTRY *CacheEntry,
274 IN ARP_INSTANCE_DATA *Instance OPTIONAL,
275 IN EFI_EVENT UserEvent OPTIONAL
276 );
277
278 UINTN
279 ArpDeleteCacheEntry (
280 IN ARP_INSTANCE_DATA *Instance,
281 IN BOOLEAN BySwAddress,
282 IN UINT8 *AddressBuffer OPTIONAL,
283 IN BOOLEAN Force
284 );
285
286 VOID
287 ArpSendFrame (
288 IN ARP_INSTANCE_DATA *Instance,
289 IN ARP_CACHE_ENTRY *CacheEntry,
290 IN UINT16 ArpOpCode
291 );
292
293 VOID
294 ArpInitInstance (
295 IN ARP_SERVICE_DATA *ArpService,
296 IN ARP_INSTANCE_DATA *Instance
297 );
298
299 VOID
300 EFIAPI
301 ArpOnFrameRcvdDpc (
302 IN VOID *Context
303 );
304
305 VOID
306 EFIAPI
307 ArpOnFrameRcvd (
308 IN EFI_EVENT Event,
309 IN VOID *Context
310 );
311
312 VOID
313 EFIAPI
314 ArpOnFrameSentDpc (
315 IN VOID *Context
316 );
317
318 VOID
319 EFIAPI
320 ArpOnFrameSent (
321 IN EFI_EVENT Event,
322 IN VOID *Context
323 );
324
325 VOID
326 EFIAPI
327 ArpTimerHandler (
328 IN EFI_EVENT Event,
329 IN VOID *Context
330 );
331
332 UINTN
333 ArpCancelRequest (
334 IN ARP_INSTANCE_DATA *Instance,
335 IN VOID *TargetSwAddress OPTIONAL,
336 IN EFI_EVENT UserEvent OPTIONAL
337 );
338
339 EFI_STATUS
340 ArpFindCacheEntry (
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,
347 IN BOOLEAN Refresh
348 );
349
350 #endif
351