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