/** @file\r
Definition of Neighbor Discovery support routines.\r
\r
- Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>\r
+ Copyright (c) 2009 - 2012, Intel Corporation. All rights reserved.<BR>\r
\r
- This program and the accompanying materials\r
- are licensed and made available under the terms and conditions of the BSD License\r
- which accompanies this distribution. The full text of the license may be found at\r
- http://opensource.org/licenses/bsd-license.php.\r
-\r
- THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
- WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+ SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
#define IP6_GET_TICKS(Ms) (((Ms) + IP6_TIMER_INTERVAL_IN_MS - 1) / IP6_TIMER_INTERVAL_IN_MS)\r
\r
enum {\r
- IP6_INF_ROUTER_LIFETIME = 0xFFFF,\r
+ IP6_INF_ROUTER_LIFETIME = 0xFFFF,\r
\r
IP6_MAX_RTR_SOLICITATION_DELAY = 1000, ///< 1000 milliseconds\r
IP6_MAX_RTR_SOLICITATIONS = 3,\r
IP6_RTR_SOLICITATION_INTERVAL = 4000,\r
\r
- IP6_MIN_RANDOM_FACTOR_SCALED = 1,\r
- IP6_MAX_RANDOM_FACTOR_SCALED = 3,\r
- IP6_RANDOM_FACTOR_SCALE = 2,\r
+ IP6_MIN_RANDOM_FACTOR_SCALED = 1,\r
+ IP6_MAX_RANDOM_FACTOR_SCALED = 3,\r
+ IP6_RANDOM_FACTOR_SCALE = 2,\r
\r
- IP6_MAX_MULTICAST_SOLICIT = 3,\r
- IP6_MAX_UNICAST_SOLICIT = 3,\r
- IP6_MAX_ANYCAST_DELAY_TIME = 1,\r
- IP6_MAX_NEIGHBOR_ADV = 3,\r
- IP6_REACHABLE_TIME = 30000,\r
- IP6_RETRANS_TIMER = 1000,\r
- IP6_DELAY_FIRST_PROBE_TIME = 5000,\r
+ IP6_MAX_MULTICAST_SOLICIT = 3,\r
+ IP6_MAX_UNICAST_SOLICIT = 3,\r
+ IP6_MAX_ANYCAST_DELAY_TIME = 1,\r
+ IP6_MAX_NEIGHBOR_ADV = 3,\r
+ IP6_REACHABLE_TIME = 30000,\r
+ IP6_RETRANS_TIMER = 1000,\r
+ IP6_DELAY_FIRST_PROBE_TIME = 5000,\r
\r
- IP6_MIN_LINK_MTU = 1280,\r
- IP6_MAX_LINK_MTU = 1500,\r
+ IP6_MIN_LINK_MTU = 1280,\r
+ IP6_MAX_LINK_MTU = 1500,\r
\r
- IP6_IS_ROUTER_FLAG = 0x80,\r
- IP6_SOLICITED_FLAG = 0x40,\r
- IP6_OVERRIDE_FLAG = 0x20,\r
+ IP6_IS_ROUTER_FLAG = 0x80,\r
+ IP6_SOLICITED_FLAG = 0x40,\r
+ IP6_OVERRIDE_FLAG = 0x20,\r
\r
- IP6_M_ADDR_CONFIG_FLAG = 0x80,\r
- IP6_O_CONFIG_FLAG = 0x40,\r
+ IP6_M_ADDR_CONFIG_FLAG = 0x80,\r
+ IP6_O_CONFIG_FLAG = 0x40,\r
\r
- IP6_ON_LINK_FLAG = 0x80,\r
- IP6_AUTO_CONFIG_FLAG = 0x40,\r
+ IP6_ON_LINK_FLAG = 0x80,\r
+ IP6_AUTO_CONFIG_FLAG = 0x40,\r
\r
- IP6_ND_LENGTH = 24,\r
- IP6_RA_LENGTH = 16,\r
- IP6_REDITECT_LENGTH = 40,\r
- IP6_DAD_ENTRY_SIGNATURE = SIGNATURE_32 ('I', 'P', 'D', 'E')\r
+ IP6_ND_LENGTH = 24,\r
+ IP6_RA_LENGTH = 16,\r
+ IP6_REDITECT_LENGTH = 40,\r
+ IP6_DAD_ENTRY_SIGNATURE = SIGNATURE_32 ('I', 'P', 'D', 'E')\r
};\r
\r
typedef\r
VOID\r
(*IP6_ARP_CALLBACK) (\r
- VOID *Context\r
+ VOID *Context\r
);\r
\r
+typedef struct _IP6_OPTION_HEADER {\r
+ UINT8 Type;\r
+ UINT8 Length;\r
+} IP6_OPTION_HEADER;\r
+\r
+STATIC_ASSERT (sizeof (IP6_OPTION_HEADER) == 2, "IP6_OPTION_HEADER is expected to be exactly 2 bytes long.");\r
+\r
typedef struct _IP6_ETHE_ADDR_OPTION {\r
- UINT8 Type;\r
- UINT8 Length;\r
- UINT8 EtherAddr[6];\r
+ UINT8 Type;\r
+ UINT8 Length;\r
+ UINT8 EtherAddr[6];\r
} IP6_ETHER_ADDR_OPTION;\r
\r
+STATIC_ASSERT (sizeof (IP6_ETHER_ADDR_OPTION) == 8, "IP6_ETHER_ADDR_OPTION is expected to be exactly 8 bytes long.");\r
+\r
typedef struct _IP6_MTU_OPTION {\r
- UINT8 Type;\r
- UINT8 Length;\r
- UINT16 Reserved;\r
- UINT32 Mtu;\r
+ UINT8 Type;\r
+ UINT8 Length;\r
+ UINT16 Reserved;\r
+ UINT32 Mtu;\r
} IP6_MTU_OPTION;\r
\r
+STATIC_ASSERT (sizeof (IP6_MTU_OPTION) == 8, "IP6_MTU_OPTION is expected to be exactly 8 bytes long.");\r
+\r
typedef struct _IP6_PREFIX_INFO_OPTION {\r
- UINT8 Type;\r
- UINT8 Length;\r
- UINT8 PrefixLength;\r
- UINT8 Reserved1;\r
- UINT32 ValidLifetime;\r
- UINT32 PreferredLifetime;\r
- UINT32 Reserved2;\r
- EFI_IPv6_ADDRESS Prefix;\r
+ UINT8 Type;\r
+ UINT8 Length;\r
+ UINT8 PrefixLength;\r
+ UINT8 Reserved1;\r
+ UINT32 ValidLifetime;\r
+ UINT32 PreferredLifetime;\r
+ UINT32 Reserved2;\r
+ EFI_IPv6_ADDRESS Prefix;\r
} IP6_PREFIX_INFO_OPTION;\r
\r
+STATIC_ASSERT (sizeof (IP6_PREFIX_INFO_OPTION) == 32, "IP6_PREFIX_INFO_OPTION is expected to be exactly 32 bytes long.");\r
+\r
typedef\r
VOID\r
(*IP6_DAD_CALLBACK) (\r
);\r
\r
typedef struct _IP6_DAD_ENTRY {\r
- UINT32 Signature;\r
- LIST_ENTRY Link;\r
- UINT32 MaxTransmit;\r
- UINT32 Transmit;\r
- UINT32 Receive;\r
- UINT32 RetransTick;\r
- IP6_ADDRESS_INFO *AddressInfo;\r
- EFI_IPv6_ADDRESS Destination;\r
- IP6_DAD_CALLBACK Callback;\r
- VOID *Context;\r
+ UINT32 Signature;\r
+ LIST_ENTRY Link;\r
+ UINT32 MaxTransmit;\r
+ UINT32 Transmit;\r
+ UINT32 Receive;\r
+ UINT32 RetransTick;\r
+ IP6_ADDRESS_INFO *AddressInfo;\r
+ EFI_IPv6_ADDRESS Destination;\r
+ IP6_DAD_CALLBACK Callback;\r
+ VOID *Context;\r
} IP6_DAD_ENTRY;\r
\r
typedef struct _IP6_DELAY_JOIN_LIST {\r
- LIST_ENTRY Link;\r
- UINT32 DelayTime; ///< in tick per 50 milliseconds\r
- IP6_INTERFACE *Interface;\r
- IP6_ADDRESS_INFO *AddressInfo;\r
- IP6_DAD_CALLBACK DadCallback;\r
- VOID *Context;\r
+ LIST_ENTRY Link;\r
+ UINT32 DelayTime; ///< in tick per 50 milliseconds\r
+ IP6_INTERFACE *Interface;\r
+ IP6_ADDRESS_INFO *AddressInfo;\r
+ IP6_DAD_CALLBACK DadCallback;\r
+ VOID *Context;\r
} IP6_DELAY_JOIN_LIST;\r
\r
typedef struct _IP6_NEIGHBOR_ENTRY {\r
} IP6_NEIGHBOR_ENTRY;\r
\r
typedef struct _IP6_DEFAULT_ROUTER {\r
- LIST_ENTRY Link;\r
- INTN RefCnt;\r
- UINT16 Lifetime;\r
- EFI_IPv6_ADDRESS Router;\r
- IP6_NEIGHBOR_ENTRY *NeighborCache;\r
+ LIST_ENTRY Link;\r
+ INTN RefCnt;\r
+ UINT16 Lifetime;\r
+ EFI_IPv6_ADDRESS Router;\r
+ IP6_NEIGHBOR_ENTRY *NeighborCache;\r
} IP6_DEFAULT_ROUTER;\r
\r
typedef struct _IP6_PREFIX_LIST_ENTRY {\r
- LIST_ENTRY Link;\r
- INTN RefCnt;\r
- UINT32 ValidLifetime;\r
- UINT32 PreferredLifetime;\r
- UINT8 PrefixLength;\r
- EFI_IPv6_ADDRESS Prefix;\r
+ LIST_ENTRY Link;\r
+ INTN RefCnt;\r
+ UINT32 ValidLifetime;\r
+ UINT32 PreferredLifetime;\r
+ UINT8 PrefixLength;\r
+ EFI_IPv6_ADDRESS Prefix;\r
} IP6_PREFIX_LIST_ENTRY;\r
\r
/**\r
**/\r
EFI_STATUS\r
Ip6BuildEfiNeighborCache (\r
- IN IP6_PROTOCOL *IpInstance,\r
- OUT UINT32 *NeighborCount,\r
- OUT EFI_IP6_NEIGHBOR_CACHE **NeighborCache\r
+ IN IP6_PROTOCOL *IpInstance,\r
+ OUT UINT32 *NeighborCount,\r
+ OUT EFI_IP6_NEIGHBOR_CACHE **NeighborCache\r
);\r
\r
/**\r
**/\r
IP6_DEFAULT_ROUTER *\r
Ip6CreateDefaultRouter (\r
- IN IP6_SERVICE *IpSb,\r
- IN EFI_IPv6_ADDRESS *Ip6Address,\r
- IN UINT16 RouterLifetime\r
+ IN IP6_SERVICE *IpSb,\r
+ IN EFI_IPv6_ADDRESS *Ip6Address,\r
+ IN UINT16 RouterLifetime\r
);\r
\r
/**\r
**/\r
VOID\r
Ip6DestroyDefaultRouter (\r
- IN IP6_SERVICE *IpSb,\r
- IN IP6_DEFAULT_ROUTER *DefaultRouter\r
+ IN IP6_SERVICE *IpSb,\r
+ IN IP6_DEFAULT_ROUTER *DefaultRouter\r
);\r
\r
/**\r
Clean an IP6 default router list.\r
\r
@param[in] IpSb The pointer to the IP6_SERVICE instance.\r
- @param[in] DefaultRouter The to be destroyed IP6_DEFAULT_ROUTER.\r
\r
**/\r
VOID\r
Ip6CleanDefaultRouterList (\r
- IN IP6_SERVICE *IpSb\r
+ IN IP6_SERVICE *IpSb\r
);\r
\r
/**\r
**/\r
IP6_DEFAULT_ROUTER *\r
Ip6FindDefaultRouter (\r
- IN IP6_SERVICE *IpSb,\r
- IN EFI_IPv6_ADDRESS *Ip6Address\r
+ IN IP6_SERVICE *IpSb,\r
+ IN EFI_IPv6_ADDRESS *Ip6Address\r
);\r
\r
/**\r
**/\r
EFI_STATUS\r
Ip6InitDADProcess (\r
- IN IP6_INTERFACE *IpIf,\r
- IN IP6_ADDRESS_INFO *AddressInfo,\r
- IN IP6_DAD_CALLBACK Callback OPTIONAL,\r
- IN VOID *Context OPTIONAL\r
+ IN IP6_INTERFACE *IpIf,\r
+ IN IP6_ADDRESS_INFO *AddressInfo,\r
+ IN IP6_DAD_CALLBACK Callback OPTIONAL,\r
+ IN VOID *Context OPTIONAL\r
);\r
\r
/**\r
**/\r
IP6_DAD_ENTRY *\r
Ip6FindDADEntry (\r
- IN IP6_SERVICE *IpSb,\r
- IN EFI_IPv6_ADDRESS *Target,\r
- OUT IP6_INTERFACE **Interface OPTIONAL\r
+ IN IP6_SERVICE *IpSb,\r
+ IN EFI_IPv6_ADDRESS *Target,\r
+ OUT IP6_INTERFACE **Interface OPTIONAL\r
);\r
\r
/**\r
**/\r
IP6_PREFIX_LIST_ENTRY *\r
Ip6CreatePrefixListEntry (\r
- IN IP6_SERVICE *IpSb,\r
- IN BOOLEAN OnLinkOrAuto,\r
- IN UINT32 ValidLifetime,\r
- IN UINT32 PreferredLifetime,\r
- IN UINT8 PrefixLength,\r
- IN EFI_IPv6_ADDRESS *Prefix\r
+ IN IP6_SERVICE *IpSb,\r
+ IN BOOLEAN OnLinkOrAuto,\r
+ IN UINT32 ValidLifetime,\r
+ IN UINT32 PreferredLifetime,\r
+ IN UINT8 PrefixLength,\r
+ IN EFI_IPv6_ADDRESS *Prefix\r
);\r
\r
/**\r
- Destory a IP6 prefix list entry.\r
+ Destroy a IP6 prefix list entry.\r
\r
@param[in] IpSb The pointer to IP6_SERVICE instance.\r
@param[in] PrefixEntry The to be destroyed prefix list entry.\r
**/\r
IP6_PREFIX_LIST_ENTRY *\r
Ip6FindPrefixListEntry (\r
- IN IP6_SERVICE *IpSb,\r
- IN BOOLEAN OnLinkOrAuto,\r
- IN UINT8 PrefixLength,\r
- IN EFI_IPv6_ADDRESS *Prefix\r
+ IN IP6_SERVICE *IpSb,\r
+ IN BOOLEAN OnLinkOrAuto,\r
+ IN UINT8 PrefixLength,\r
+ IN EFI_IPv6_ADDRESS *Prefix\r
);\r
\r
/**\r
**/\r
VOID\r
Ip6CleanPrefixListTable (\r
- IN IP6_SERVICE *IpSb,\r
- IN LIST_ENTRY *ListHead\r
+ IN IP6_SERVICE *IpSb,\r
+ IN LIST_ENTRY *ListHead\r
);\r
\r
/**\r
**/\r
IP6_NEIGHBOR_ENTRY *\r
Ip6CreateNeighborEntry (\r
- IN IP6_SERVICE *IpSb,\r
- IN IP6_ARP_CALLBACK CallBack,\r
- IN EFI_IPv6_ADDRESS *Ip6Address,\r
- IN EFI_MAC_ADDRESS *LinkAddress OPTIONAL\r
+ IN IP6_SERVICE *IpSb,\r
+ IN IP6_ARP_CALLBACK CallBack,\r
+ IN EFI_IPv6_ADDRESS *Ip6Address,\r
+ IN EFI_MAC_ADDRESS *LinkAddress OPTIONAL\r
);\r
\r
/**\r
**/\r
IP6_NEIGHBOR_ENTRY *\r
Ip6FindNeighborEntry (\r
- IN IP6_SERVICE *IpSb,\r
- IN EFI_IPv6_ADDRESS *Ip6Address\r
+ IN IP6_SERVICE *IpSb,\r
+ IN EFI_IPv6_ADDRESS *Ip6Address\r
);\r
\r
/**\r
**/\r
EFI_STATUS\r
Ip6FreeNeighborEntry (\r
- IN IP6_SERVICE *IpSb,\r
- IN IP6_NEIGHBOR_ENTRY *NeighborCache,\r
- IN BOOLEAN SendIcmpError,\r
- IN BOOLEAN FullFree,\r
- IN EFI_STATUS IoStatus,\r
- IN IP6_FRAME_TO_CANCEL FrameToCancel OPTIONAL,\r
- IN VOID *Context OPTIONAL\r
+ IN IP6_SERVICE *IpSb,\r
+ IN IP6_NEIGHBOR_ENTRY *NeighborCache,\r
+ IN BOOLEAN SendIcmpError,\r
+ IN BOOLEAN FullFree,\r
+ IN EFI_STATUS IoStatus,\r
+ IN IP6_FRAME_TO_CANCEL FrameToCancel OPTIONAL,\r
+ IN VOID *Context OPTIONAL\r
);\r
\r
/**\r
**/\r
EFI_STATUS\r
Ip6AddNeighbor (\r
- IN IP6_SERVICE *IpSb,\r
- IN EFI_IPv6_ADDRESS *TargetIp6Address,\r
- IN EFI_MAC_ADDRESS *TargetLinkAddress OPTIONAL,\r
- IN UINT32 Timeout,\r
- IN BOOLEAN Override\r
+ IN IP6_SERVICE *IpSb,\r
+ IN EFI_IPv6_ADDRESS *TargetIp6Address,\r
+ IN EFI_MAC_ADDRESS *TargetLinkAddress OPTIONAL,\r
+ IN UINT32 Timeout,\r
+ IN BOOLEAN Override\r
);\r
\r
/**\r
**/\r
EFI_STATUS\r
Ip6DelNeighbor (\r
- IN IP6_SERVICE *IpSb,\r
- IN EFI_IPv6_ADDRESS *TargetIp6Address,\r
- IN EFI_MAC_ADDRESS *TargetLinkAddress OPTIONAL,\r
- IN UINT32 Timeout,\r
- IN BOOLEAN Override\r
+ IN IP6_SERVICE *IpSb,\r
+ IN EFI_IPv6_ADDRESS *TargetIp6Address,\r
+ IN EFI_MAC_ADDRESS *TargetLinkAddress OPTIONAL,\r
+ IN UINT32 Timeout,\r
+ IN BOOLEAN Override\r
);\r
\r
/**\r
**/\r
EFI_STATUS\r
Ip6ProcessNeighborSolicit (\r
- IN IP6_SERVICE *IpSb,\r
- IN EFI_IP6_HEADER *Head,\r
- IN NET_BUF *Packet\r
+ IN IP6_SERVICE *IpSb,\r
+ IN EFI_IP6_HEADER *Head,\r
+ IN NET_BUF *Packet\r
);\r
\r
/**\r
**/\r
EFI_STATUS\r
Ip6ProcessNeighborAdvertise (\r
- IN IP6_SERVICE *IpSb,\r
- IN EFI_IP6_HEADER *Head,\r
- IN NET_BUF *Packet\r
+ IN IP6_SERVICE *IpSb,\r
+ IN EFI_IP6_HEADER *Head,\r
+ IN NET_BUF *Packet\r
);\r
\r
/**\r
**/\r
EFI_STATUS\r
Ip6ProcessRouterAdvertise (\r
- IN IP6_SERVICE *IpSb,\r
- IN EFI_IP6_HEADER *Head,\r
- IN NET_BUF *Packet\r
+ IN IP6_SERVICE *IpSb,\r
+ IN EFI_IP6_HEADER *Head,\r
+ IN NET_BUF *Packet\r
);\r
\r
/**\r
the IP head removed.\r
\r
@retval EFI_INVALID_PARAMETER The parameter is invalid.\r
- @retval EFI_OUT_OF_RESOURCES Insuffcient resources to complete the\r
+ @retval EFI_OUT_OF_RESOURCES Insufficient resources to complete the\r
operation.\r
@retval EFI_SUCCESS Successfully updated the route caches.\r
\r
**/\r
EFI_STATUS\r
Ip6ProcessRedirect (\r
- IN IP6_SERVICE *IpSb,\r
- IN EFI_IP6_HEADER *Head,\r
- IN NET_BUF *Packet\r
+ IN IP6_SERVICE *IpSb,\r
+ IN EFI_IP6_HEADER *Head,\r
+ IN NET_BUF *Packet\r
);\r
\r
/**\r
**/\r
EFI_STATUS\r
Ip6SendRouterSolicit (\r
- IN IP6_SERVICE *IpSb,\r
- IN IP6_INTERFACE *Interface OPTIONAL,\r
- IN EFI_IPv6_ADDRESS *SourceAddress OPTIONAL,\r
- IN EFI_IPv6_ADDRESS *DestinationAddress OPTIONAL,\r
- IN EFI_MAC_ADDRESS *SourceLinkAddress OPTIONAL\r
+ IN IP6_SERVICE *IpSb,\r
+ IN IP6_INTERFACE *Interface OPTIONAL,\r
+ IN EFI_IPv6_ADDRESS *SourceAddress OPTIONAL,\r
+ IN EFI_IPv6_ADDRESS *DestinationAddress OPTIONAL,\r
+ IN EFI_MAC_ADDRESS *SourceLinkAddress OPTIONAL\r
);\r
\r
/**\r
**/\r
EFI_STATUS\r
Ip6SendNeighborSolicit (\r
- IN IP6_SERVICE *IpSb,\r
- IN EFI_IPv6_ADDRESS *SourceAddress,\r
- IN EFI_IPv6_ADDRESS *DestinationAddress,\r
- IN EFI_IPv6_ADDRESS *TargetIp6Address,\r
- IN EFI_MAC_ADDRESS *SourceLinkAddress OPTIONAL\r
+ IN IP6_SERVICE *IpSb,\r
+ IN EFI_IPv6_ADDRESS *SourceAddress,\r
+ IN EFI_IPv6_ADDRESS *DestinationAddress,\r
+ IN EFI_IPv6_ADDRESS *TargetIp6Address,\r
+ IN EFI_MAC_ADDRESS *SourceLinkAddress OPTIONAL\r
);\r
\r
/**\r
**/\r
EFI_STATUS\r
Ip6SetAddress (\r
- IN IP6_INTERFACE *Interface,\r
- IN EFI_IPv6_ADDRESS *Ip6Addr,\r
- IN BOOLEAN IsAnycast,\r
- IN UINT8 PrefixLength,\r
- IN UINT32 ValidLifetime,\r
- IN UINT32 PreferredLifetime,\r
- IN IP6_DAD_CALLBACK DadCallback OPTIONAL,\r
- IN VOID *Context OPTIONAL\r
+ IN IP6_INTERFACE *Interface,\r
+ IN EFI_IPv6_ADDRESS *Ip6Addr,\r
+ IN BOOLEAN IsAnycast,\r
+ IN UINT8 PrefixLength,\r
+ IN UINT32 ValidLifetime,\r
+ IN UINT32 PreferredLifetime,\r
+ IN IP6_DAD_CALLBACK DadCallback OPTIONAL,\r
+ IN VOID *Context OPTIONAL\r
);\r
\r
/**\r
VOID\r
EFIAPI\r
Ip6NdFasterTimerTicking (\r
- IN EFI_EVENT Event,\r
- IN VOID *Context\r
+ IN EFI_EVENT Event,\r
+ IN VOID *Context\r
);\r
\r
/**\r
The heartbeat timer of ND module in 1 second. This time routine handles following\r
- things: 1) maitain default router list; 2) maintain prefix options;\r
+ things: 1) maintain default router list; 2) maintain prefix options;\r
3) maintain route caches.\r
\r
@param[in] IpSb The IP6 service binding instance.\r
**/\r
VOID\r
Ip6NdTimerTicking (\r
- IN IP6_SERVICE *IpSb\r
+ IN IP6_SERVICE *IpSb\r
);\r
\r
/**\r
**/\r
VOID\r
Ip6OnArpResolved (\r
- IN VOID *Context\r
+ IN VOID *Context\r
);\r
\r
/**\r