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