]>
Commit | Line | Data |
---|---|---|
a3bcde70 HT |
1 | /** @file\r |
2 | Definition of Neighbor Discovery support routines.\r | |
3 | \r | |
75dce340 | 4 | Copyright (c) 2009 - 2012, Intel Corporation. All rights reserved.<BR>\r |
a3bcde70 | 5 | \r |
ecf98fbc | 6 | SPDX-License-Identifier: BSD-2-Clause-Patent\r |
a3bcde70 HT |
7 | \r |
8 | **/\r | |
9 | \r | |
10 | #ifndef __EFI_IP6_ND_H__\r | |
11 | #define __EFI_IP6_ND_H__\r | |
12 | \r | |
13 | #define IP6_GET_TICKS(Ms) (((Ms) + IP6_TIMER_INTERVAL_IN_MS - 1) / IP6_TIMER_INTERVAL_IN_MS)\r | |
14 | \r | |
15 | enum {\r | |
16 | IP6_INF_ROUTER_LIFETIME = 0xFFFF,\r | |
17 | \r | |
18 | IP6_MAX_RTR_SOLICITATION_DELAY = 1000, ///< 1000 milliseconds\r | |
19 | IP6_MAX_RTR_SOLICITATIONS = 3,\r | |
20 | IP6_RTR_SOLICITATION_INTERVAL = 4000,\r | |
21 | \r | |
22 | IP6_MIN_RANDOM_FACTOR_SCALED = 1,\r | |
23 | IP6_MAX_RANDOM_FACTOR_SCALED = 3,\r | |
24 | IP6_RANDOM_FACTOR_SCALE = 2,\r | |
25 | \r | |
26 | IP6_MAX_MULTICAST_SOLICIT = 3,\r | |
27 | IP6_MAX_UNICAST_SOLICIT = 3,\r | |
28 | IP6_MAX_ANYCAST_DELAY_TIME = 1,\r | |
29 | IP6_MAX_NEIGHBOR_ADV = 3,\r | |
30 | IP6_REACHABLE_TIME = 30000,\r | |
31 | IP6_RETRANS_TIMER = 1000,\r | |
32 | IP6_DELAY_FIRST_PROBE_TIME = 5000,\r | |
33 | \r | |
34 | IP6_MIN_LINK_MTU = 1280,\r | |
35 | IP6_MAX_LINK_MTU = 1500,\r | |
36 | \r | |
37 | IP6_IS_ROUTER_FLAG = 0x80,\r | |
38 | IP6_SOLICITED_FLAG = 0x40,\r | |
39 | IP6_OVERRIDE_FLAG = 0x20,\r | |
40 | \r | |
41 | IP6_M_ADDR_CONFIG_FLAG = 0x80,\r | |
42 | IP6_O_CONFIG_FLAG = 0x40,\r | |
43 | \r | |
44 | IP6_ON_LINK_FLAG = 0x80,\r | |
45 | IP6_AUTO_CONFIG_FLAG = 0x40,\r | |
46 | \r | |
47 | IP6_ND_LENGTH = 24,\r | |
48 | IP6_RA_LENGTH = 16,\r | |
49 | IP6_REDITECT_LENGTH = 40,\r | |
50 | IP6_DAD_ENTRY_SIGNATURE = SIGNATURE_32 ('I', 'P', 'D', 'E')\r | |
51 | };\r | |
52 | \r | |
53 | typedef\r | |
54 | VOID\r | |
55 | (*IP6_ARP_CALLBACK) (\r | |
56 | VOID *Context\r | |
57 | );\r | |
58 | \r | |
9c20342e MR |
59 | typedef struct _IP6_OPTION_HEADER {\r |
60 | UINT8 Type;\r | |
61 | UINT8 Length;\r | |
62 | } IP6_OPTION_HEADER;\r | |
63 | \r | |
64 | STATIC_ASSERT (sizeof (IP6_OPTION_HEADER) == 2, "IP6_OPTION_HEADER is expected to be exactly 2 bytes long.");\r | |
65 | \r | |
a3bcde70 HT |
66 | typedef struct _IP6_ETHE_ADDR_OPTION {\r |
67 | UINT8 Type;\r | |
68 | UINT8 Length;\r | |
69 | UINT8 EtherAddr[6];\r | |
70 | } IP6_ETHER_ADDR_OPTION;\r | |
71 | \r | |
9c20342e MR |
72 | STATIC_ASSERT (sizeof (IP6_ETHER_ADDR_OPTION) == 8, "IP6_ETHER_ADDR_OPTION is expected to be exactly 8 bytes long.");\r |
73 | \r | |
a3bcde70 HT |
74 | typedef struct _IP6_MTU_OPTION {\r |
75 | UINT8 Type;\r | |
76 | UINT8 Length;\r | |
77 | UINT16 Reserved;\r | |
78 | UINT32 Mtu;\r | |
79 | } IP6_MTU_OPTION;\r | |
80 | \r | |
9c20342e MR |
81 | STATIC_ASSERT (sizeof (IP6_MTU_OPTION) == 8, "IP6_MTU_OPTION is expected to be exactly 8 bytes long.");\r |
82 | \r | |
a3bcde70 HT |
83 | typedef struct _IP6_PREFIX_INFO_OPTION {\r |
84 | UINT8 Type;\r | |
85 | UINT8 Length;\r | |
86 | UINT8 PrefixLength;\r | |
87 | UINT8 Reserved1;\r | |
88 | UINT32 ValidLifetime;\r | |
89 | UINT32 PreferredLifetime;\r | |
90 | UINT32 Reserved2;\r | |
91 | EFI_IPv6_ADDRESS Prefix;\r | |
92 | } IP6_PREFIX_INFO_OPTION;\r | |
93 | \r | |
9c20342e MR |
94 | STATIC_ASSERT (sizeof (IP6_PREFIX_INFO_OPTION) == 32, "IP6_PREFIX_INFO_OPTION is expected to be exactly 32 bytes long.");\r |
95 | \r | |
a3bcde70 HT |
96 | typedef\r |
97 | VOID\r | |
98 | (*IP6_DAD_CALLBACK) (\r | |
99 | IN BOOLEAN IsDadPassed,\r | |
100 | IN EFI_IPv6_ADDRESS *TargetAddress,\r | |
101 | IN VOID *Context\r | |
102 | );\r | |
103 | \r | |
104 | typedef struct _IP6_DAD_ENTRY {\r | |
105 | UINT32 Signature;\r | |
106 | LIST_ENTRY Link;\r | |
107 | UINT32 MaxTransmit;\r | |
108 | UINT32 Transmit;\r | |
109 | UINT32 Receive;\r | |
110 | UINT32 RetransTick;\r | |
111 | IP6_ADDRESS_INFO *AddressInfo;\r | |
112 | EFI_IPv6_ADDRESS Destination;\r | |
113 | IP6_DAD_CALLBACK Callback;\r | |
114 | VOID *Context;\r | |
115 | } IP6_DAD_ENTRY;\r | |
116 | \r | |
117 | typedef struct _IP6_DELAY_JOIN_LIST {\r | |
118 | LIST_ENTRY Link;\r | |
119 | UINT32 DelayTime; ///< in tick per 50 milliseconds\r | |
120 | IP6_INTERFACE *Interface;\r | |
121 | IP6_ADDRESS_INFO *AddressInfo;\r | |
122 | IP6_DAD_CALLBACK DadCallback;\r | |
123 | VOID *Context;\r | |
124 | } IP6_DELAY_JOIN_LIST;\r | |
125 | \r | |
126 | typedef struct _IP6_NEIGHBOR_ENTRY {\r | |
127 | LIST_ENTRY Link;\r | |
128 | LIST_ENTRY ArpList;\r | |
129 | INTN RefCnt;\r | |
130 | BOOLEAN IsRouter;\r | |
131 | BOOLEAN ArpFree;\r | |
132 | BOOLEAN Dynamic;\r | |
133 | EFI_IPv6_ADDRESS Neighbor;\r | |
134 | EFI_MAC_ADDRESS LinkAddress;\r | |
135 | EFI_IP6_NEIGHBOR_STATE State;\r | |
136 | UINT32 Transmit;\r | |
137 | UINT32 Ticks;\r | |
138 | \r | |
139 | LIST_ENTRY Frames;\r | |
140 | IP6_INTERFACE *Interface;\r | |
141 | IP6_ARP_CALLBACK CallBack;\r | |
142 | } IP6_NEIGHBOR_ENTRY;\r | |
143 | \r | |
144 | typedef struct _IP6_DEFAULT_ROUTER {\r | |
145 | LIST_ENTRY Link;\r | |
146 | INTN RefCnt;\r | |
147 | UINT16 Lifetime;\r | |
148 | EFI_IPv6_ADDRESS Router;\r | |
149 | IP6_NEIGHBOR_ENTRY *NeighborCache;\r | |
150 | } IP6_DEFAULT_ROUTER;\r | |
151 | \r | |
152 | typedef struct _IP6_PREFIX_LIST_ENTRY {\r | |
153 | LIST_ENTRY Link;\r | |
154 | INTN RefCnt;\r | |
155 | UINT32 ValidLifetime;\r | |
156 | UINT32 PreferredLifetime;\r | |
157 | UINT8 PrefixLength;\r | |
158 | EFI_IPv6_ADDRESS Prefix;\r | |
159 | } IP6_PREFIX_LIST_ENTRY;\r | |
160 | \r | |
161 | /**\r | |
162 | Build a array of EFI_IP6_NEIGHBOR_CACHE to be returned to the caller. The number\r | |
163 | of EFI_IP6_NEIGHBOR_CACHE is also returned.\r | |
164 | \r | |
165 | @param[in] IpInstance The pointer to IP6_PROTOCOL instance.\r | |
166 | @param[out] NeighborCount The number of returned neighbor cache entries.\r | |
167 | @param[out] NeighborCache The pointer to the array of EFI_IP6_NEIGHBOR_CACHE.\r | |
168 | \r | |
169 | @retval EFI_SUCCESS The EFI_IP6_NEIGHBOR_CACHE successfully built.\r | |
170 | @retval EFI_OUT_OF_RESOURCES Failed to allocate the memory for the route table.\r | |
171 | \r | |
172 | **/\r | |
173 | EFI_STATUS\r | |
174 | Ip6BuildEfiNeighborCache (\r | |
175 | IN IP6_PROTOCOL *IpInstance,\r | |
176 | OUT UINT32 *NeighborCount,\r | |
177 | OUT EFI_IP6_NEIGHBOR_CACHE **NeighborCache\r | |
178 | );\r | |
179 | \r | |
180 | /**\r | |
181 | Build a array of EFI_IP6_ADDRESS_INFO to be returned to the caller. The number\r | |
182 | of prefix entries is also returned.\r | |
183 | \r | |
184 | @param[in] IpInstance The pointer to IP6_PROTOCOL instance.\r | |
185 | @param[out] PrefixCount The number of returned prefix entries.\r | |
186 | @param[out] PrefixTable The pointer to the array of PrefixTable.\r | |
187 | \r | |
188 | @retval EFI_SUCCESS The prefix table successfully built.\r | |
189 | @retval EFI_OUT_OF_RESOURCES Failed to allocate the memory for the prefix table.\r | |
190 | \r | |
191 | **/\r | |
192 | EFI_STATUS\r | |
193 | Ip6BuildPrefixTable (\r | |
194 | IN IP6_PROTOCOL *IpInstance,\r | |
195 | OUT UINT32 *PrefixCount,\r | |
196 | OUT EFI_IP6_ADDRESS_INFO **PrefixTable\r | |
197 | );\r | |
198 | \r | |
199 | /**\r | |
200 | Allocate and initialize an IP6 default router entry.\r | |
201 | \r | |
202 | @param[in] IpSb The pointer to the IP6_SERVICE instance.\r | |
203 | @param[in] Ip6Address The IPv6 address of the default router.\r | |
204 | @param[in] RouterLifetime The lifetime associated with the default\r | |
205 | router, in units of seconds.\r | |
206 | \r | |
207 | @return NULL if it failed to allocate memory for the default router node.\r | |
208 | Otherwise, point to the created default router node.\r | |
209 | \r | |
210 | **/\r | |
211 | IP6_DEFAULT_ROUTER *\r | |
212 | Ip6CreateDefaultRouter (\r | |
213 | IN IP6_SERVICE *IpSb,\r | |
214 | IN EFI_IPv6_ADDRESS *Ip6Address,\r | |
215 | IN UINT16 RouterLifetime\r | |
216 | );\r | |
217 | \r | |
218 | /**\r | |
219 | Destroy an IP6 default router entry.\r | |
220 | \r | |
221 | @param[in] IpSb The pointer to the IP6_SERVICE instance.\r | |
222 | @param[in] DefaultRouter The to be destroyed IP6_DEFAULT_ROUTER.\r | |
223 | \r | |
224 | **/\r | |
225 | VOID\r | |
226 | Ip6DestroyDefaultRouter (\r | |
227 | IN IP6_SERVICE *IpSb,\r | |
228 | IN IP6_DEFAULT_ROUTER *DefaultRouter\r | |
229 | );\r | |
230 | \r | |
231 | /**\r | |
232 | Clean an IP6 default router list.\r | |
233 | \r | |
234 | @param[in] IpSb The pointer to the IP6_SERVICE instance.\r | |
a3bcde70 HT |
235 | \r |
236 | **/\r | |
237 | VOID\r | |
238 | Ip6CleanDefaultRouterList (\r | |
239 | IN IP6_SERVICE *IpSb\r | |
240 | );\r | |
241 | \r | |
242 | /**\r | |
243 | Search a default router node from an IP6 default router list.\r | |
244 | \r | |
245 | @param[in] IpSb The pointer to the IP6_SERVICE instance.\r | |
246 | @param[in] Ip6Address The IPv6 address of the to be searched default router node.\r | |
247 | \r | |
248 | @return NULL if it failed to find the matching default router node.\r | |
249 | Otherwise, point to the found default router node.\r | |
250 | \r | |
251 | **/\r | |
252 | IP6_DEFAULT_ROUTER *\r | |
253 | Ip6FindDefaultRouter (\r | |
254 | IN IP6_SERVICE *IpSb,\r | |
255 | IN EFI_IPv6_ADDRESS *Ip6Address\r | |
256 | );\r | |
257 | \r | |
258 | /**\r | |
259 | The function to be called after DAD (Duplicate Address Detection) is performed.\r | |
260 | \r | |
261 | @param[in] IsDadPassed If TRUE, the DAD operation succeed. Otherwise, the DAD operation failed.\r | |
262 | @param[in] IpIf Points to the IP6_INTERFACE.\r | |
263 | @param[in] DadEntry The DAD entry which already performed DAD.\r | |
264 | \r | |
265 | **/\r | |
266 | VOID\r | |
267 | Ip6OnDADFinished (\r | |
268 | IN BOOLEAN IsDadPassed,\r | |
269 | IN IP6_INTERFACE *IpIf,\r | |
270 | IN IP6_DAD_ENTRY *DadEntry\r | |
271 | );\r | |
272 | \r | |
273 | /**\r | |
274 | Create a DAD (Duplicate Address Detection) entry and queue it to be performed.\r | |
275 | \r | |
276 | @param[in] IpIf Points to the IP6_INTERFACE.\r | |
277 | @param[in] AddressInfo The address information which needs DAD performed.\r | |
278 | @param[in] Callback The callback routine that will be called after DAD\r | |
279 | is performed. This is an optional parameter that\r | |
280 | may be NULL.\r | |
281 | @param[in] Context The opaque parameter for a DAD callback routine.\r | |
282 | This is an optional parameter that may be NULL.\r | |
283 | \r | |
284 | @retval EFI_SUCCESS The DAD entry was created and queued.\r | |
285 | @retval EFI_OUT_OF_RESOURCES Failed to allocate the memory to complete the\r | |
286 | operation.\r | |
287 | \r | |
288 | \r | |
289 | **/\r | |
290 | EFI_STATUS\r | |
291 | Ip6InitDADProcess (\r | |
292 | IN IP6_INTERFACE *IpIf,\r | |
293 | IN IP6_ADDRESS_INFO *AddressInfo,\r | |
294 | IN IP6_DAD_CALLBACK Callback OPTIONAL,\r | |
295 | IN VOID *Context OPTIONAL\r | |
296 | );\r | |
297 | \r | |
298 | /**\r | |
299 | Search IP6_DAD_ENTRY from the Duplicate Address Detection List.\r | |
300 | \r | |
301 | @param[in] IpSb The pointer to the IP6_SERVICE instance.\r | |
302 | @param[in] Target The address information which needs DAD performed .\r | |
303 | @param[out] Interface If not NULL, output the IP6 interface that configures\r | |
304 | the tentative address.\r | |
305 | \r | |
306 | @return NULL if failed to find the matching DAD entry.\r | |
307 | Otherwise, point to the found DAD entry.\r | |
308 | \r | |
309 | **/\r | |
310 | IP6_DAD_ENTRY *\r | |
311 | Ip6FindDADEntry (\r | |
312 | IN IP6_SERVICE *IpSb,\r | |
313 | IN EFI_IPv6_ADDRESS *Target,\r | |
314 | OUT IP6_INTERFACE **Interface OPTIONAL\r | |
315 | );\r | |
316 | \r | |
317 | /**\r | |
318 | Allocate and initialize a IP6 prefix list entry.\r | |
319 | \r | |
320 | @param[in] IpSb The pointer to IP6_SERVICE instance.\r | |
321 | @param[in] OnLinkOrAuto If TRUE, the entry is created for the on link prefix list.\r | |
322 | Otherwise, it is created for the autoconfiguration prefix list.\r | |
323 | @param[in] ValidLifetime The length of time in seconds that the prefix\r | |
324 | is valid for the purpose of on-link determination.\r | |
325 | @param[in] PreferredLifetime The length of time in seconds that addresses\r | |
326 | generated from the prefix via stateless address\r | |
327 | autoconfiguration remain preferred.\r | |
328 | @param[in] PrefixLength The prefix length of the Prefix.\r | |
329 | @param[in] Prefix The prefix address.\r | |
330 | \r | |
331 | @return NULL if it failed to allocate memory for the prefix node. Otherwise, point\r | |
332 | to the created or existing prefix list entry.\r | |
333 | \r | |
334 | **/\r | |
335 | IP6_PREFIX_LIST_ENTRY *\r | |
336 | Ip6CreatePrefixListEntry (\r | |
337 | IN IP6_SERVICE *IpSb,\r | |
338 | IN BOOLEAN OnLinkOrAuto,\r | |
339 | IN UINT32 ValidLifetime,\r | |
340 | IN UINT32 PreferredLifetime,\r | |
341 | IN UINT8 PrefixLength,\r | |
342 | IN EFI_IPv6_ADDRESS *Prefix\r | |
343 | );\r | |
344 | \r | |
345 | /**\r | |
75dce340 | 346 | Destroy a IP6 prefix list entry.\r |
a3bcde70 HT |
347 | \r |
348 | @param[in] IpSb The pointer to IP6_SERVICE instance.\r | |
349 | @param[in] PrefixEntry The to be destroyed prefix list entry.\r | |
350 | @param[in] OnLinkOrAuto If TRUE, the entry is removed from on link prefix list.\r | |
351 | Otherwise remove from autoconfiguration prefix list.\r | |
352 | @param[in] ImmediateDelete If TRUE, remove the entry directly.\r | |
353 | Otherwise, check the reference count to see whether\r | |
354 | it should be removed.\r | |
355 | \r | |
356 | **/\r | |
357 | VOID\r | |
358 | Ip6DestroyPrefixListEntry (\r | |
359 | IN IP6_SERVICE *IpSb,\r | |
360 | IN IP6_PREFIX_LIST_ENTRY *PrefixEntry,\r | |
361 | IN BOOLEAN OnLinkOrAuto,\r | |
362 | IN BOOLEAN ImmediateDelete\r | |
363 | );\r | |
364 | \r | |
365 | /**\r | |
366 | Search the list array to find an IP6 prefix list entry.\r | |
367 | \r | |
368 | @param[in] IpSb The pointer to IP6_SERVICE instance.\r | |
369 | @param[in] OnLinkOrAuto If TRUE, the search the link prefix list,\r | |
370 | Otherwise search the autoconfiguration prefix list.\r | |
371 | @param[in] PrefixLength The prefix length of the Prefix\r | |
372 | @param[in] Prefix The prefix address.\r | |
373 | \r | |
374 | @return NULL if cannot find the IP6 prefix list entry. Otherwise, return the\r | |
375 | pointer to the IP6 prefix list entry.\r | |
376 | \r | |
377 | **/\r | |
378 | IP6_PREFIX_LIST_ENTRY *\r | |
379 | Ip6FindPrefixListEntry (\r | |
380 | IN IP6_SERVICE *IpSb,\r | |
381 | IN BOOLEAN OnLinkOrAuto,\r | |
382 | IN UINT8 PrefixLength,\r | |
383 | IN EFI_IPv6_ADDRESS *Prefix\r | |
384 | );\r | |
385 | \r | |
386 | /**\r | |
387 | Release the resource in prefix list table, and destroy the list entry and\r | |
388 | corresponding addresses or route entries.\r | |
389 | \r | |
390 | @param[in] IpSb The pointer to the IP6_SERVICE instance.\r | |
391 | @param[in] ListHead The list entry head of the prefix list table.\r | |
392 | \r | |
393 | **/\r | |
394 | VOID\r | |
395 | Ip6CleanPrefixListTable (\r | |
396 | IN IP6_SERVICE *IpSb,\r | |
397 | IN LIST_ENTRY *ListHead\r | |
398 | );\r | |
399 | \r | |
400 | /**\r | |
401 | Allocate and initialize an IP6 neighbor cache entry.\r | |
402 | \r | |
403 | @param[in] IpSb The pointer to the IP6_SERVICE instance.\r | |
404 | @param[in] CallBack The callback function to be called when\r | |
405 | address resolution is finished.\r | |
406 | @param[in] Ip6Address Points to the IPv6 address of the neighbor.\r | |
407 | @param[in] LinkAddress Points to the MAC address of the neighbor.\r | |
408 | Ignored if NULL.\r | |
409 | \r | |
410 | @return NULL if failed to allocate memory for the neighbor cache entry.\r | |
411 | Otherwise, point to the created neighbor cache entry.\r | |
412 | \r | |
413 | **/\r | |
414 | IP6_NEIGHBOR_ENTRY *\r | |
415 | Ip6CreateNeighborEntry (\r | |
416 | IN IP6_SERVICE *IpSb,\r | |
417 | IN IP6_ARP_CALLBACK CallBack,\r | |
418 | IN EFI_IPv6_ADDRESS *Ip6Address,\r | |
419 | IN EFI_MAC_ADDRESS *LinkAddress OPTIONAL\r | |
420 | );\r | |
421 | \r | |
422 | /**\r | |
423 | Search a IP6 neighbor cache entry.\r | |
424 | \r | |
425 | @param[in] IpSb The pointer to the IP6_SERVICE instance.\r | |
426 | @param[in] Ip6Address Points to the IPv6 address of the neighbor.\r | |
427 | \r | |
428 | @return NULL if it failed to find the matching neighbor cache entry.\r | |
429 | Otherwise, point to the found neighbor cache entry.\r | |
430 | \r | |
431 | **/\r | |
432 | IP6_NEIGHBOR_ENTRY *\r | |
433 | Ip6FindNeighborEntry (\r | |
434 | IN IP6_SERVICE *IpSb,\r | |
435 | IN EFI_IPv6_ADDRESS *Ip6Address\r | |
436 | );\r | |
437 | \r | |
438 | /**\r | |
439 | Free a IP6 neighbor cache entry and remove all the frames on the address\r | |
440 | resolution queue that pass the FrameToCancel. That is, either FrameToCancel\r | |
441 | is NULL, or it returns true for the frame.\r | |
442 | \r | |
443 | @param[in] IpSb The pointer to the IP6_SERVICE instance.\r | |
444 | @param[in] NeighborCache The to be free neighbor cache entry.\r | |
445 | @param[in] SendIcmpError If TRUE, send out ICMP error.\r | |
446 | @param[in] FullFree If TRUE, remove the neighbor cache entry.\r | |
447 | Otherwise remove the pending frames.\r | |
448 | @param[in] IoStatus The status returned to the cancelled frames'\r | |
449 | callback function.\r | |
450 | @param[in] FrameToCancel Function to select which frame to cancel.\r | |
451 | This is an optional parameter that may be NULL.\r | |
452 | @param[in] Context Opaque parameter to the FrameToCancel.\r | |
453 | Ignored if FrameToCancel is NULL.\r | |
454 | \r | |
455 | @retval EFI_INVALID_PARAMETER The input parameter is invalid.\r | |
456 | @retval EFI_SUCCESS The operation finished successfully.\r | |
457 | \r | |
458 | **/\r | |
459 | EFI_STATUS\r | |
460 | Ip6FreeNeighborEntry (\r | |
461 | IN IP6_SERVICE *IpSb,\r | |
462 | IN IP6_NEIGHBOR_ENTRY *NeighborCache,\r | |
463 | IN BOOLEAN SendIcmpError,\r | |
464 | IN BOOLEAN FullFree,\r | |
465 | IN EFI_STATUS IoStatus,\r | |
466 | IN IP6_FRAME_TO_CANCEL FrameToCancel OPTIONAL,\r | |
467 | IN VOID *Context OPTIONAL\r | |
468 | );\r | |
469 | \r | |
470 | /**\r | |
471 | Add Neighbor cache entries. It is a work function for EfiIp6Neighbors().\r | |
472 | \r | |
473 | @param[in] IpSb The IP6 service binding instance.\r | |
474 | @param[in] TargetIp6Address Pointer to Target IPv6 address.\r | |
475 | @param[in] TargetLinkAddress Pointer to link-layer address of the target. Ignored if NULL.\r | |
476 | @param[in] Timeout Time in 100-ns units that this entry will remain in the neighbor\r | |
477 | cache. It will be deleted after Timeout. A value of zero means that\r | |
478 | the entry is permanent. A non-zero value means that the entry is\r | |
479 | dynamic.\r | |
480 | @param[in] Override If TRUE, the cached link-layer address of the matching entry will\r | |
481 | be overridden and updated; if FALSE, and if a\r | |
482 | corresponding cache entry already existed, EFI_ACCESS_DENIED\r | |
483 | will be returned.\r | |
484 | \r | |
485 | @retval EFI_SUCCESS The neighbor cache entry has been added.\r | |
486 | @retval EFI_OUT_OF_RESOURCES Could not add the entry to the neighbor cache\r | |
487 | due to insufficient resources.\r | |
488 | @retval EFI_NOT_FOUND TargetLinkAddress is NULL.\r | |
489 | @retval EFI_ACCESS_DENIED The to-be-added entry is already defined in the neighbor cache,\r | |
490 | and that entry is tagged as un-overridden (when DeleteFlag\r | |
491 | is FALSE).\r | |
492 | \r | |
493 | **/\r | |
494 | EFI_STATUS\r | |
495 | Ip6AddNeighbor (\r | |
496 | IN IP6_SERVICE *IpSb,\r | |
497 | IN EFI_IPv6_ADDRESS *TargetIp6Address,\r | |
498 | IN EFI_MAC_ADDRESS *TargetLinkAddress OPTIONAL,\r | |
499 | IN UINT32 Timeout,\r | |
500 | IN BOOLEAN Override\r | |
501 | );\r | |
502 | \r | |
503 | /**\r | |
504 | Delete or update Neighbor cache entries. It is a work function for EfiIp6Neighbors().\r | |
505 | \r | |
506 | @param[in] IpSb The IP6 service binding instance.\r | |
507 | @param[in] TargetIp6Address Pointer to Target IPv6 address.\r | |
508 | @param[in] TargetLinkAddress Pointer to link-layer address of the target. Ignored if NULL.\r | |
509 | @param[in] Timeout Time in 100-ns units that this entry will remain in the neighbor\r | |
510 | cache. It will be deleted after Timeout. A value of zero means that\r | |
511 | the entry is permanent. A non-zero value means that the entry is\r | |
512 | dynamic.\r | |
513 | @param[in] Override If TRUE, the cached link-layer address of the matching entry will\r | |
514 | be overridden and updated; if FALSE, and if a\r | |
515 | corresponding cache entry already existed, EFI_ACCESS_DENIED\r | |
516 | will be returned.\r | |
517 | \r | |
518 | @retval EFI_SUCCESS The neighbor cache entry has been updated or deleted.\r | |
519 | @retval EFI_NOT_FOUND This entry is not in the neighbor cache.\r | |
520 | \r | |
521 | **/\r | |
522 | EFI_STATUS\r | |
523 | Ip6DelNeighbor (\r | |
524 | IN IP6_SERVICE *IpSb,\r | |
525 | IN EFI_IPv6_ADDRESS *TargetIp6Address,\r | |
526 | IN EFI_MAC_ADDRESS *TargetLinkAddress OPTIONAL,\r | |
527 | IN UINT32 Timeout,\r | |
528 | IN BOOLEAN Override\r | |
529 | );\r | |
530 | \r | |
531 | /**\r | |
532 | Process the Neighbor Solicitation message. The message may be sent for Duplicate\r | |
533 | Address Detection or Address Resolution.\r | |
534 | \r | |
535 | @param[in] IpSb The IP service that received the packet.\r | |
536 | @param[in] Head The IP head of the message.\r | |
537 | @param[in] Packet The content of the message with IP head removed.\r | |
538 | \r | |
539 | @retval EFI_SUCCESS The packet processed successfully.\r | |
540 | @retval EFI_INVALID_PARAMETER The packet is invalid.\r | |
541 | @retval EFI_ICMP_ERROR The packet indicates that DAD is failed.\r | |
542 | @retval Others Failed to process the packet.\r | |
543 | \r | |
544 | **/\r | |
545 | EFI_STATUS\r | |
546 | Ip6ProcessNeighborSolicit (\r | |
547 | IN IP6_SERVICE *IpSb,\r | |
548 | IN EFI_IP6_HEADER *Head,\r | |
549 | IN NET_BUF *Packet\r | |
550 | );\r | |
551 | \r | |
552 | /**\r | |
553 | Process the Neighbor Advertisement message.\r | |
554 | \r | |
555 | @param[in] IpSb The IP service that received the packet.\r | |
556 | @param[in] Head The IP head of the message.\r | |
557 | @param[in] Packet The content of the message with IP head removed.\r | |
558 | \r | |
559 | @retval EFI_SUCCESS The packet processed successfully.\r | |
560 | @retval EFI_INVALID_PARAMETER The packet is invalid.\r | |
561 | @retval EFI_ICMP_ERROR The packet indicates that DAD is failed.\r | |
562 | @retval Others Failed to process the packet.\r | |
563 | \r | |
564 | **/\r | |
565 | EFI_STATUS\r | |
566 | Ip6ProcessNeighborAdvertise (\r | |
567 | IN IP6_SERVICE *IpSb,\r | |
568 | IN EFI_IP6_HEADER *Head,\r | |
569 | IN NET_BUF *Packet\r | |
570 | );\r | |
571 | \r | |
572 | /**\r | |
573 | Process the Router Advertisement message according to RFC4861.\r | |
574 | \r | |
575 | @param[in] IpSb The IP service that received the packet.\r | |
576 | @param[in] Head The IP head of the message.\r | |
577 | @param[in] Packet The content of the message with the IP head removed.\r | |
578 | \r | |
579 | @retval EFI_SUCCESS The packet processed successfully.\r | |
580 | @retval EFI_INVALID_PARAMETER The packet is invalid.\r | |
581 | @retval EFI_OUT_OF_RESOURCES Insufficient resources to complete the operation.\r | |
582 | @retval Others Failed to process the packet.\r | |
583 | \r | |
584 | **/\r | |
585 | EFI_STATUS\r | |
586 | Ip6ProcessRouterAdvertise (\r | |
587 | IN IP6_SERVICE *IpSb,\r | |
588 | IN EFI_IP6_HEADER *Head,\r | |
589 | IN NET_BUF *Packet\r | |
590 | );\r | |
591 | \r | |
592 | /**\r | |
593 | Process the ICMPv6 redirect message. Find the instance, then update\r | |
594 | its route cache.\r | |
595 | \r | |
596 | @param[in] IpSb The IP6 service binding instance that received\r | |
597 | the packet.\r | |
598 | @param[in] Head The IP head of the received ICMPv6 packet.\r | |
599 | @param[in] Packet The content of the ICMPv6 redirect packet with\r | |
600 | the IP head removed.\r | |
601 | \r | |
602 | @retval EFI_INVALID_PARAMETER The parameter is invalid.\r | |
7de8045a | 603 | @retval EFI_OUT_OF_RESOURCES Insufficient resources to complete the\r |
a3bcde70 HT |
604 | operation.\r |
605 | @retval EFI_SUCCESS Successfully updated the route caches.\r | |
606 | \r | |
607 | **/\r | |
608 | EFI_STATUS\r | |
609 | Ip6ProcessRedirect (\r | |
610 | IN IP6_SERVICE *IpSb,\r | |
611 | IN EFI_IP6_HEADER *Head,\r | |
612 | IN NET_BUF *Packet\r | |
613 | );\r | |
614 | \r | |
615 | /**\r | |
616 | Generate router solicit message and send it out to Destination Address or\r | |
617 | All Router Link Local scope multicast address.\r | |
618 | \r | |
619 | @param[in] IpSb The IP service to send the packet.\r | |
620 | @param[in] Interface If not NULL, points to the IP6 interface to send\r | |
621 | the packet.\r | |
622 | @param[in] SourceAddress If not NULL, the source address of the message.\r | |
623 | @param[in] DestinationAddress If not NULL, the destination address of the message.\r | |
624 | @param[in] SourceLinkAddress If not NULL, the MAC address of the source.\r | |
625 | A source link-layer address option will be appended\r | |
626 | to the message.\r | |
627 | \r | |
628 | @retval EFI_OUT_OF_RESOURCES Insufficient resources to complete the operation.\r | |
629 | @retval EFI_SUCCESS The router solicit message was successfully sent.\r | |
630 | \r | |
631 | **/\r | |
632 | EFI_STATUS\r | |
633 | Ip6SendRouterSolicit (\r | |
634 | IN IP6_SERVICE *IpSb,\r | |
635 | IN IP6_INTERFACE *Interface OPTIONAL,\r | |
636 | IN EFI_IPv6_ADDRESS *SourceAddress OPTIONAL,\r | |
637 | IN EFI_IPv6_ADDRESS *DestinationAddress OPTIONAL,\r | |
638 | IN EFI_MAC_ADDRESS *SourceLinkAddress OPTIONAL\r | |
639 | );\r | |
640 | \r | |
641 | /**\r | |
642 | Generate the Neighbor Solicitation message and send it to the Destination Address.\r | |
643 | \r | |
644 | @param[in] IpSb The IP service to send the packet\r | |
645 | @param[in] SourceAddress The source address of the message.\r | |
646 | @param[in] DestinationAddress The destination address of the message.\r | |
647 | @param[in] TargetIp6Address The IP address of the target of the solicitation.\r | |
648 | It must not be a multicast address.\r | |
649 | @param[in] SourceLinkAddress The MAC address for the sender. If not NULL,\r | |
650 | a source link-layer address option will be appended\r | |
651 | to the message.\r | |
652 | \r | |
653 | @retval EFI_INVALID_PARAMETER Any input parameter is invalid.\r | |
654 | @retval EFI_OUT_OF_RESOURCES Insufficient resources to complete the\r | |
655 | operation.\r | |
656 | @retval EFI_SUCCESS The Neighbor Advertise message was successfully sent.\r | |
657 | \r | |
658 | **/\r | |
659 | EFI_STATUS\r | |
660 | Ip6SendNeighborSolicit (\r | |
661 | IN IP6_SERVICE *IpSb,\r | |
662 | IN EFI_IPv6_ADDRESS *SourceAddress,\r | |
663 | IN EFI_IPv6_ADDRESS *DestinationAddress,\r | |
664 | IN EFI_IPv6_ADDRESS *TargetIp6Address,\r | |
665 | IN EFI_MAC_ADDRESS *SourceLinkAddress OPTIONAL\r | |
666 | );\r | |
667 | \r | |
668 | /**\r | |
669 | Set the interface's address. This will trigger the DAD process for the\r | |
670 | address to set. To set an already set address, the lifetimes wil be\r | |
671 | updated to the new value passed in.\r | |
672 | \r | |
673 | @param[in] Interface The interface to set the address.\r | |
674 | @param[in] Ip6Addr The interface's to be assigned IPv6 address.\r | |
675 | @param[in] IsAnycast If TRUE, the unicast IPv6 address is anycast.\r | |
676 | Otherwise, it is not anycast.\r | |
677 | @param[in] PrefixLength The prefix length of the Ip6Addr.\r | |
678 | @param[in] ValidLifetime The valid lifetime for this address.\r | |
679 | @param[in] PreferredLifetime The preferred lifetime for this address.\r | |
680 | @param[in] DadCallback The caller's callback to trigger when DAD finishes.\r | |
681 | This is an optional parameter that may be NULL.\r | |
682 | @param[in] Context The context that will be passed to DadCallback.\r | |
683 | This is an optional parameter that may be NULL.\r | |
684 | \r | |
685 | @retval EFI_SUCCESS The interface is scheduled to be configured with\r | |
686 | the specified address.\r | |
687 | @retval EFI_OUT_OF_RESOURCES Failed to set the interface's address due to\r | |
688 | lack of resources.\r | |
689 | \r | |
690 | **/\r | |
691 | EFI_STATUS\r | |
692 | Ip6SetAddress (\r | |
693 | IN IP6_INTERFACE *Interface,\r | |
694 | IN EFI_IPv6_ADDRESS *Ip6Addr,\r | |
695 | IN BOOLEAN IsAnycast,\r | |
696 | IN UINT8 PrefixLength,\r | |
697 | IN UINT32 ValidLifetime,\r | |
698 | IN UINT32 PreferredLifetime,\r | |
699 | IN IP6_DAD_CALLBACK DadCallback OPTIONAL,\r | |
700 | IN VOID *Context OPTIONAL\r | |
701 | );\r | |
702 | \r | |
703 | /**\r | |
704 | The heartbeat timer of ND module in IP6_TIMER_INTERVAL_IN_MS milliseconds.\r | |
705 | This time routine handles DAD module and neighbor state transition.\r | |
706 | It is also responsible for sending out router solicitations.\r | |
707 | \r | |
708 | @param[in] Event The IP6 service instance's heartbeat timer.\r | |
709 | @param[in] Context The IP6 service instance.\r | |
710 | \r | |
711 | **/\r | |
712 | VOID\r | |
713 | EFIAPI\r | |
714 | Ip6NdFasterTimerTicking (\r | |
715 | IN EFI_EVENT Event,\r | |
716 | IN VOID *Context\r | |
717 | );\r | |
718 | \r | |
719 | /**\r | |
720 | The heartbeat timer of ND module in 1 second. This time routine handles following\r | |
7de8045a | 721 | things: 1) maintain default router list; 2) maintain prefix options;\r |
a3bcde70 HT |
722 | 3) maintain route caches.\r |
723 | \r | |
724 | @param[in] IpSb The IP6 service binding instance.\r | |
725 | \r | |
726 | **/\r | |
727 | VOID\r | |
728 | Ip6NdTimerTicking (\r | |
729 | IN IP6_SERVICE *IpSb\r | |
730 | );\r | |
731 | \r | |
732 | /**\r | |
733 | Callback function when address resolution is finished. It will cancel\r | |
734 | all the queued frames if the address resolution failed, or transmit them\r | |
735 | if the request succeeded.\r | |
736 | \r | |
737 | @param[in] Context The context of the callback, a pointer to IP6_NEIGHBOR_ENTRY.\r | |
738 | \r | |
739 | **/\r | |
740 | VOID\r | |
741 | Ip6OnArpResolved (\r | |
742 | IN VOID *Context\r | |
743 | );\r | |
744 | \r | |
745 | /**\r | |
746 | Update the ReachableTime in IP6 service binding instance data, in milliseconds.\r | |
747 | \r | |
748 | @param[in, out] IpSb Points to the IP6_SERVICE.\r | |
749 | \r | |
750 | **/\r | |
751 | VOID\r | |
752 | Ip6UpdateReachableTime (\r | |
753 | IN OUT IP6_SERVICE *IpSb\r | |
754 | );\r | |
755 | \r | |
756 | #endif\r |