]> git.proxmox.com Git - mirror_edk2.git/blob - MdeModulePkg/Universal/Network/ArpDxe/ArpImpl.h
Use Mde library and definition instead of some native definitions in NetLib, to simpl...
[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
41 #define ARP_ETHER_PROTO_TYPE 0x0806
42 #define IPv4_ETHER_PROTO_TYPE 0x0800
43 #define IPv6_ETHER_PROTO_TYPE 0x86DD
44
45 #define ARP_OPCODE_REQUEST 0x0001
46 #define ARP_OPCODE_REPLY 0x0002
47
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)
52
53 #pragma pack(1)
54 typedef struct _ARP_HEAD {
55 UINT16 HwType;
56 UINT16 ProtoType;
57 UINT8 HwAddrLen;
58 UINT8 ProtoAddrLen;
59 UINT16 OpCode;
60 } ARP_HEAD;
61 #pragma pack()
62
63 typedef struct _ARP_ADDRESS {
64 UINT8 *SenderHwAddr;
65 UINT8 *SenderProtoAddr;
66 UINT8 *TargetHwAddr;
67 UINT8 *TargetProtoAddr;
68 } ARP_ADDRESS;
69
70 #define MATCH_SW_ADDRESS 0x1
71 #define MATCH_HW_ADDRESS 0x2
72
73 typedef enum {
74 ByNone = 0,
75 ByProtoAddress = MATCH_SW_ADDRESS,
76 ByHwAddress = MATCH_HW_ADDRESS,
77 ByBoth = MATCH_SW_ADDRESS | MATCH_HW_ADDRESS
78 } FIND_OPTYPE;
79
80 #define ARP_INSTANCE_DATA_SIGNATURE EFI_SIGNATURE_32('A', 'R', 'P', 'I')
81
82 #define ARP_INSTANCE_DATA_FROM_THIS(a) \
83 CR ( \
84 (a), \
85 ARP_INSTANCE_DATA, \
86 ArpProto, \
87 ARP_INSTANCE_DATA_SIGNATURE \
88 )
89
90 typedef struct _ARP_SERVICE_DATA ARP_SERVICE_DATA;
91
92 typedef struct _ARP_INSTANCE_DATA {
93 UINT32 Signature;
94 ARP_SERVICE_DATA *ArpService;
95 EFI_HANDLE Handle;
96 EFI_ARP_PROTOCOL ArpProto;
97 LIST_ENTRY List;
98 EFI_ARP_CONFIG_DATA ConfigData;
99 BOOLEAN Configured;
100 BOOLEAN Destroyed;
101 } ARP_INSTANCE_DATA;
102
103 #define ARP_SERVICE_DATA_SIGNATURE EFI_SIGNATURE_32('A', 'R', 'P', 'S')
104
105 #define ARP_SERVICE_DATA_FROM_THIS(a) \
106 CR ( \
107 (a), \
108 ARP_SERVICE_DATA, \
109 ServiceBinding, \
110 ARP_SERVICE_DATA_SIGNATURE \
111 )
112
113 struct _ARP_SERVICE_DATA {
114 UINT32 Signature;
115 EFI_SERVICE_BINDING_PROTOCOL ServiceBinding;
116
117 EFI_HANDLE MnpChildHandle;
118 EFI_HANDLE ImageHandle;
119 EFI_HANDLE ControllerHandle;
120
121 EFI_MANAGED_NETWORK_PROTOCOL *Mnp;
122 EFI_MANAGED_NETWORK_CONFIG_DATA MnpConfigData;
123 EFI_MANAGED_NETWORK_COMPLETION_TOKEN RxToken;
124
125 EFI_SIMPLE_NETWORK_MODE SnpMode;
126
127 UINTN ChildrenNumber;
128 LIST_ENTRY ChildrenList;
129
130 LIST_ENTRY PendingRequestTable;
131 LIST_ENTRY DeniedCacheTable;
132 LIST_ENTRY ResolvedCacheTable;
133
134 EFI_EVENT PeriodicTimer;
135 };
136
137 typedef struct _USER_REQUEST_CONTEXT {
138 LIST_ENTRY List;
139 ARP_INSTANCE_DATA *Instance;
140 EFI_EVENT UserRequestEvent;
141 VOID *UserHwAddrBuffer;
142 } USER_REQUEST_CONTEXT;
143
144 #define ARP_MAX_PROTOCOL_ADDRESS_LEN sizeof(EFI_IP_ADDRESS)
145 #define ARP_MAX_HARDWARE_ADDRESS_LEN sizeof(EFI_MAC_ADDRESS)
146
147 typedef struct _NET_ARP_ADDRESS {
148 UINT16 Type;
149 UINT8 Length;
150 UINT8 *AddressPtr;
151 union {
152 UINT8 ProtoAddress[ARP_MAX_PROTOCOL_ADDRESS_LEN];
153 UINT8 HwAddress[ARP_MAX_HARDWARE_ADDRESS_LEN];
154 } Buffer;
155 } NET_ARP_ADDRESS;
156
157 typedef enum {
158 Hardware,
159 Protocol
160 } ARP_ADDRESS_TYPE;
161
162 typedef struct _ARP_CACHE_ENTRY {
163 LIST_ENTRY List;
164
165 UINT32 RetryCount;
166 UINT32 DefaultDecayTime;
167 UINT32 DecayTime;
168 UINT32 NextRetryTime;
169
170 NET_ARP_ADDRESS Addresses[2];
171
172 LIST_ENTRY UserRequestList;
173 } ARP_CACHE_ENTRY;
174
175 EFI_STATUS
176 EFIAPI
177 ArpConfigure (
178 IN EFI_ARP_PROTOCOL *This,
179 IN EFI_ARP_CONFIG_DATA *ConfigData OPTIONAL
180 );
181
182 EFI_STATUS
183 EFIAPI
184 ArpAdd (
185 IN EFI_ARP_PROTOCOL *This,
186 IN BOOLEAN DenyFlag,
187 IN VOID *TargetSwAddress OPTIONAL,
188 IN VOID *TargetHwAddress OPTIONAL,
189 IN UINT32 TimeoutValue,
190 IN BOOLEAN Overwrite
191 );
192
193 EFI_STATUS
194 EFIAPI
195 ArpFind (
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,
202 IN BOOLEAN Refresh
203 );
204
205 EFI_STATUS
206 EFIAPI
207 ArpDelete (
208 IN EFI_ARP_PROTOCOL *This,
209 IN BOOLEAN BySwAddress,
210 IN VOID *AddressBuffer OPTIONAL
211 );
212
213 EFI_STATUS
214 EFIAPI
215 ArpFlush (
216 IN EFI_ARP_PROTOCOL *This
217 );
218
219 EFI_STATUS
220 EFIAPI
221 ArpRequest (
222 IN EFI_ARP_PROTOCOL *This,
223 IN VOID *TargetSwAddress OPTIONAL,
224 IN EFI_EVENT ResolvedEvent OPTIONAL,
225 OUT VOID *TargetHwAddress
226 );
227
228 EFI_STATUS
229 EFIAPI
230 ArpCancel (
231 IN EFI_ARP_PROTOCOL *This,
232 IN VOID *TargetSwAddress OPTIONAL,
233 IN EFI_EVENT ResolvedEvent OPTIONAL
234 );
235
236 EFI_STATUS
237 ArpConfigureInstance (
238 IN ARP_INSTANCE_DATA *Instance,
239 IN EFI_ARP_CONFIG_DATA *ConfigData OPTIONAL
240 );
241
242 ARP_CACHE_ENTRY *
243 ArpFindDeniedCacheEntry (
244 IN ARP_SERVICE_DATA *ArpService,
245 IN NET_ARP_ADDRESS *ProtocolAddress OPTIONAL,
246 IN NET_ARP_ADDRESS *HardwareAddress OPTIONAL
247 );
248
249 ARP_CACHE_ENTRY *
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
256 );
257
258 ARP_CACHE_ENTRY *
259 ArpAllocCacheEntry (
260 IN ARP_INSTANCE_DATA *Instance
261 );
262
263 VOID
264 ArpFillAddressInCacheEntry (
265 IN ARP_CACHE_ENTRY *CacheEntry,
266 IN NET_ARP_ADDRESS *HwAddr OPTIONAL,
267 IN NET_ARP_ADDRESS *SwAddr OPTIONAL
268 );
269
270 UINTN
271 ArpAddressResolved (
272 IN ARP_CACHE_ENTRY *CacheEntry,
273 IN ARP_INSTANCE_DATA *Instance OPTIONAL,
274 IN EFI_EVENT UserEvent OPTIONAL
275 );
276
277 UINTN
278 ArpDeleteCacheEntry (
279 IN ARP_INSTANCE_DATA *Instance,
280 IN BOOLEAN BySwAddress,
281 IN UINT8 *AddressBuffer OPTIONAL,
282 IN BOOLEAN Force
283 );
284
285 VOID
286 ArpSendFrame (
287 IN ARP_INSTANCE_DATA *Instance,
288 IN ARP_CACHE_ENTRY *CacheEntry,
289 IN UINT16 ArpOpCode
290 );
291
292 VOID
293 ArpInitInstance (
294 IN ARP_SERVICE_DATA *ArpService,
295 IN ARP_INSTANCE_DATA *Instance
296 );
297
298 VOID
299 EFIAPI
300 ArpOnFrameRcvdDpc (
301 IN VOID *Context
302 );
303
304 VOID
305 EFIAPI
306 ArpOnFrameRcvd (
307 IN EFI_EVENT Event,
308 IN VOID *Context
309 );
310
311 VOID
312 EFIAPI
313 ArpOnFrameSentDpc (
314 IN VOID *Context
315 );
316
317 VOID
318 EFIAPI
319 ArpOnFrameSent (
320 IN EFI_EVENT Event,
321 IN VOID *Context
322 );
323
324 VOID
325 EFIAPI
326 ArpTimerHandler (
327 IN EFI_EVENT Event,
328 IN VOID *Context
329 );
330
331 UINTN
332 ArpCancelRequest (
333 IN ARP_INSTANCE_DATA *Instance,
334 IN VOID *TargetSwAddress OPTIONAL,
335 IN EFI_EVENT UserEvent OPTIONAL
336 );
337
338 EFI_STATUS
339 ArpFindCacheEntry (
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,
346 IN BOOLEAN Refresh
347 );
348
349 #endif
350