]> git.proxmox.com Git - mirror_edk2.git/blob - MdeModulePkg/Universal/Network/ArpDxe/ArpImpl.h
Update to support to produce Component Name and & Component Name 2 protocol based...
[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 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
140 typedef 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
150 typedef 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
160 typedef enum {
161 Hardware,
162 Protocol
163 } ARP_ADDRESS_TYPE;
164
165 typedef 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
178 EFI_STATUS
179 EFIAPI
180 ArpConfigure (
181 IN EFI_ARP_PROTOCOL *This,
182 IN EFI_ARP_CONFIG_DATA *ConfigData OPTIONAL
183 );
184
185 EFI_STATUS
186 EFIAPI
187 ArpAdd (
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
196 EFI_STATUS
197 EFIAPI
198 ArpFind (
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
208 EFI_STATUS
209 EFIAPI
210 ArpDelete (
211 IN EFI_ARP_PROTOCOL *This,
212 IN BOOLEAN BySwAddress,
213 IN VOID *AddressBuffer OPTIONAL
214 );
215
216 EFI_STATUS
217 EFIAPI
218 ArpFlush (
219 IN EFI_ARP_PROTOCOL *This
220 );
221
222 EFI_STATUS
223 EFIAPI
224 ArpRequest (
225 IN EFI_ARP_PROTOCOL *This,
226 IN VOID *TargetSwAddress OPTIONAL,
227 IN EFI_EVENT ResolvedEvent OPTIONAL,
228 OUT VOID *TargetHwAddress
229 );
230
231 EFI_STATUS
232 EFIAPI
233 ArpCancel (
234 IN EFI_ARP_PROTOCOL *This,
235 IN VOID *TargetSwAddress OPTIONAL,
236 IN EFI_EVENT ResolvedEvent OPTIONAL
237 );
238
239 EFI_STATUS
240 ArpConfigureInstance (
241 IN ARP_INSTANCE_DATA *Instance,
242 IN EFI_ARP_CONFIG_DATA *ConfigData OPTIONAL
243 );
244
245 ARP_CACHE_ENTRY *
246 ArpFindDeniedCacheEntry (
247 IN ARP_SERVICE_DATA *ArpService,
248 IN NET_ARP_ADDRESS *ProtocolAddress OPTIONAL,
249 IN NET_ARP_ADDRESS *HardwareAddress OPTIONAL
250 );
251
252 ARP_CACHE_ENTRY *
253 ArpFindNextCacheEntryInTable (
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
261 ARP_CACHE_ENTRY *
262 ArpAllocCacheEntry (
263 IN ARP_INSTANCE_DATA *Instance
264 );
265
266 VOID
267 ArpFillAddressInCacheEntry (
268 IN ARP_CACHE_ENTRY *CacheEntry,
269 IN NET_ARP_ADDRESS *HwAddr OPTIONAL,
270 IN NET_ARP_ADDRESS *SwAddr OPTIONAL
271 );
272
273 UINTN
274 ArpAddressResolved (
275 IN ARP_CACHE_ENTRY *CacheEntry,
276 IN ARP_INSTANCE_DATA *Instance OPTIONAL,
277 IN EFI_EVENT UserEvent OPTIONAL
278 );
279
280 UINTN
281 ArpDeleteCacheEntry (
282 IN ARP_INSTANCE_DATA *Instance,
283 IN BOOLEAN BySwAddress,
284 IN UINT8 *AddressBuffer OPTIONAL,
285 IN BOOLEAN Force
286 );
287
288 VOID
289 ArpSendFrame (
290 IN ARP_INSTANCE_DATA *Instance,
291 IN ARP_CACHE_ENTRY *CacheEntry,
292 IN UINT16 ArpOpCode
293 );
294
295 VOID
296 ArpInitInstance (
297 IN ARP_SERVICE_DATA *ArpService,
298 IN ARP_INSTANCE_DATA *Instance
299 );
300
301 VOID
302 EFIAPI
303 ArpOnFrameRcvd (
304 IN EFI_EVENT Event,
305 IN VOID *Context
306 );
307
308 VOID
309 EFIAPI
310 ArpOnFrameSent (
311 IN EFI_EVENT Event,
312 IN VOID *Context
313 );
314
315 VOID
316 EFIAPI
317 ArpTimerHandler (
318 IN EFI_EVENT Event,
319 IN VOID *Context
320 );
321
322 UINTN
323 ArpCancelRequest (
324 IN ARP_INSTANCE_DATA *Instance,
325 IN VOID *TargetSwAddress OPTIONAL,
326 IN EFI_EVENT UserEvent OPTIONAL
327 );
328
329 EFI_STATUS
330 ArpFindCacheEntry (
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