/** @file | |
Common definition and functions for IP6 driver. | |
Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved.<BR> | |
SPDX-License-Identifier: BSD-2-Clause-Patent | |
**/ | |
#ifndef __EFI_IP6_COMMON_H__ | |
#define __EFI_IP6_COMMON_H__ | |
#define IP6_LINK_EQUAL(Mac1, Mac2) (CompareMem ((Mac1), (Mac2), sizeof (EFI_MAC_ADDRESS)) == 0) | |
// | |
// Convert the Microsecond to second. IP transmit/receive time is | |
// in the unit of microsecond. IP ticks once per second. | |
// | |
#define IP6_US_TO_SEC(Us) (((Us) + 999999) / 1000000) | |
#define IP6_ETHER_PROTO 0x86DD | |
#define IP6_MAC_LEN 6 | |
#define IP6_IF_ID_LEN 8 | |
#define IP6_INTERFACE_LOCAL_SCOPE 1 | |
#define IP6_LINK_LOCAL_SCOPE 2 | |
#define IP6_SITE_LOCAL_SCOPE 5 | |
#define IP6_INFINIT_LIFETIME 0xFFFFFFFF | |
#define IP6_HOP_LIMIT 255 | |
// | |
// Make it to 64 since all 54 bits are zero. | |
// | |
#define IP6_LINK_LOCAL_PREFIX_LENGTH 64 | |
#define IP6_TIMER_INTERVAL_IN_MS 100 | |
#define IP6_ONE_SECOND_IN_MS 1000 | |
// | |
// The packet is received as link level broadcast/multicast/promiscuous. | |
// | |
#define IP6_LINK_BROADCAST 0x00000001 | |
#define IP6_LINK_MULTICAST 0x00000002 | |
#define IP6_LINK_PROMISC 0x00000004 | |
#define IP6_U_BIT 0x02 | |
typedef enum { | |
Ip6Promiscuous = 1, | |
Ip6Unicast, | |
Ip6Multicast, | |
Ip6AnyCast | |
} IP6_ADDRESS_TYPE; | |
typedef struct { | |
EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding; | |
EFI_IPv6_ADDRESS *Address; | |
} IP6_DESTROY_CHILD_BY_ADDR_CALLBACK_CONTEXT; | |
typedef struct _IP6_INTERFACE IP6_INTERFACE; | |
typedef struct _IP6_PROTOCOL IP6_PROTOCOL; | |
typedef struct _IP6_SERVICE IP6_SERVICE; | |
typedef struct _IP6_ADDRESS_INFO IP6_ADDRESS_INFO; | |
/** | |
Build a array of EFI_IP6_ADDRESS_INFO to be returned to the caller. The number | |
of EFI_IP6_ADDRESS_INFO is also returned. If AddressList is NULL, | |
only the address count is returned. | |
@param[in] IpSb The IP6 service binding instance. | |
@param[out] AddressCount The number of returned addresses. | |
@param[out] AddressList The pointer to the array of EFI_IP6_ADDRESS_INFO. | |
This is an optional parameter. | |
@retval EFI_SUCCESS The address array is successfully build | |
@retval EFI_OUT_OF_RESOURCES Failed to allocate the memory for the address info. | |
@retval EFI_INVALID_PARAMETER Any input parameter is invalid. | |
**/ | |
EFI_STATUS | |
Ip6BuildEfiAddressList ( | |
IN IP6_SERVICE *IpSb, | |
OUT UINT32 *AddressCount, | |
OUT EFI_IP6_ADDRESS_INFO **AddressList OPTIONAL | |
); | |
/** | |
Generate the multicast addresses identify the group of all IPv6 nodes or IPv6 | |
routers defined in RFC4291. | |
All Nodes Addresses: FF01::1, FF02::1. | |
All Router Addresses: FF01::2, FF02::2, FF05::2. | |
@param[in] Router If TRUE, generate all routers addresses, | |
else generate all node addresses. | |
@param[in] Scope interface-local(1), link-local(2), or site-local(5) | |
@param[out] Ip6Addr The generated multicast address. | |
@retval EFI_INVALID_PARAMETER Any input parameter is invalid. | |
@retval EFI_SUCCESS The address is generated. | |
**/ | |
EFI_STATUS | |
Ip6SetToAllNodeMulticast ( | |
IN BOOLEAN Router, | |
IN UINT8 Scope, | |
OUT EFI_IPv6_ADDRESS *Ip6Addr | |
); | |
/** | |
This function converts MAC address to 64 bits interface ID according to RFC4291 | |
and returns the interface ID. Currently only 48-bit MAC address is supported by | |
this function. | |
@param[in, out] IpSb The IP6 service binding instance. | |
@retval NULL The operation fails. | |
@return Pointer to the generated interface ID. | |
**/ | |
UINT8 * | |
Ip6CreateInterfaceID ( | |
IN OUT IP6_SERVICE *IpSb | |
); | |
/** | |
This function creates link-local address from interface identifier. The | |
interface identifier is normally created from MAC address. It might be manually | |
configured by administrator if the link-local address created from MAC address | |
is a duplicate address. | |
@param[in, out] IpSb The IP6 service binding instance. | |
@retval NULL If the operation fails. | |
@return The generated Link Local address, in network order. | |
**/ | |
EFI_IPv6_ADDRESS * | |
Ip6CreateLinkLocalAddr ( | |
IN OUT IP6_SERVICE *IpSb | |
); | |
/** | |
Compute the solicited-node multicast address for an unicast or anycast address, | |
by taking the low-order 24 bits of this address, and appending those bits to | |
the prefix FF02:0:0:0:0:1:FF00::/104. | |
@param Ip6Addr The unicast or anycast address, in network order. | |
@param MulticastAddr The generated solicited-node multicast address, | |
in network order. | |
**/ | |
VOID | |
Ip6CreateSNMulticastAddr ( | |
IN EFI_IPv6_ADDRESS *Ip6Addr, | |
OUT EFI_IPv6_ADDRESS *MulticastAddr | |
); | |
/** | |
Check whether the incoming Ipv6 address is a solicited-node multicast address. | |
@param[in] Ip6 Ip6 address, in network order. | |
@retval TRUE Yes, solicited-node multicast address | |
@retval FALSE No | |
**/ | |
BOOLEAN | |
Ip6IsSNMulticastAddr ( | |
IN EFI_IPv6_ADDRESS *Ip6 | |
); | |
/** | |
Check whether the incoming IPv6 address is one of the maintained address in | |
the IP6 service binding instance. | |
@param[in] IpSb Points to a IP6 service binding instance | |
@param[in] Address The IP6 address to be checked. | |
@param[out] Interface If not NULL, output the IP6 interface which | |
maintains the Address. | |
@param[out] AddressInfo If not NULL, output the IP6 address information | |
of the Address. | |
@retval TRUE Yes, it is one of the maintained addresses. | |
@retval FALSE No, it is not one of the maintained addresses. | |
**/ | |
BOOLEAN | |
Ip6IsOneOfSetAddress ( | |
IN IP6_SERVICE *IpSb, | |
IN EFI_IPv6_ADDRESS *Address, | |
OUT IP6_INTERFACE **Interface OPTIONAL, | |
OUT IP6_ADDRESS_INFO **AddressInfo OPTIONAL | |
); | |
/** | |
Check whether the incoming MAC address is valid. | |
@param[in] IpSb Points to a IP6 service binding instance. | |
@param[in] LinkAddress The MAC address. | |
@retval TRUE Yes, it is valid. | |
@retval FALSE No, it is not valid. | |
**/ | |
BOOLEAN | |
Ip6IsValidLinkAddress ( | |
IN IP6_SERVICE *IpSb, | |
IN EFI_MAC_ADDRESS *LinkAddress | |
); | |
/** | |
Copy the PrefixLength bits from Src to Dest. | |
@param[out] Dest A pointer to the buffer to copy to. | |
@param[in] Src A pointer to the buffer to copy from. | |
@param[in] PrefixLength The number of bits to copy. | |
**/ | |
VOID | |
Ip6CopyAddressByPrefix ( | |
OUT EFI_IPv6_ADDRESS *Dest, | |
IN EFI_IPv6_ADDRESS *Src, | |
IN UINT8 PrefixLength | |
); | |
/** | |
Insert a node IP6_ADDRESS_INFO to an IP6 interface. | |
@param[in, out] IpIf Points to an IP6 interface. | |
@param[in] AddrInfo Points to an IP6_ADDRESS_INFO. | |
**/ | |
VOID | |
Ip6AddAddr ( | |
IN OUT IP6_INTERFACE *IpIf, | |
IN IP6_ADDRESS_INFO *AddrInfo | |
); | |
/** | |
Remove the IPv6 address from the address list node points to IP6_ADDRESS_INFO. | |
This function removes the matching IPv6 addresses from the address list and | |
adjusts the address count of the address list. If IpSb is not NULL, this function | |
calls Ip6LeaveGroup to see whether it should call Mnp->Groups() to remove the | |
its solicited-node multicast MAC address from the filter list and sends out | |
a Multicast Listener Done. If Prefix is NULL, all address in the address list | |
will be removed. If Prefix is not NULL, the address that matching the Prefix | |
with PrefixLength in the address list will be removed. | |
@param[in] IpSb NULL or points to IP6 service binding instance. | |
@param[in, out] AddressList address list array | |
@param[in, out] AddressCount the count of addresses in address list array | |
@param[in] Prefix NULL or an IPv6 address prefix | |
@param[in] PrefixLength the length of Prefix | |
@retval EFI_SUCCESS The operation completed successfully. | |
@retval EFI_NOT_FOUND The address matching the Prefix with PrefixLength | |
cannot be found in address list. | |
@retval EFI_INVALID_PARAMETER Any input parameter is invalid. | |
**/ | |
EFI_STATUS | |
Ip6RemoveAddr ( | |
IN IP6_SERVICE *IpSb OPTIONAL, | |
IN OUT LIST_ENTRY *AddressList, | |
IN OUT UINT32 *AddressCount, | |
IN EFI_IPv6_ADDRESS *Prefix OPTIONAL, | |
IN UINT8 PrefixLength | |
); | |
/** | |
Get the MAC address for a multicast IP address. Call | |
Mnp's McastIpToMac to find the MAC address instead of | |
hard-coding the NIC to be Ethernet. | |
@param[in] Mnp The Mnp instance to get the MAC address. | |
@param[in] Multicast The multicast IP address to translate. | |
@param[out] Mac The buffer to hold the translated address. | |
@retval EFI_SUCCESS The multicast IP is successfully | |
translated to a multicast MAC address. | |
@retval Other The address is not converted because an error occurred. | |
**/ | |
EFI_STATUS | |
Ip6GetMulticastMac ( | |
IN EFI_MANAGED_NETWORK_PROTOCOL *Mnp, | |
IN EFI_IPv6_ADDRESS *Multicast, | |
OUT EFI_MAC_ADDRESS *Mac | |
); | |
/** | |
Convert the multibyte field in IP header's byter order. | |
In spite of its name, it can also be used to convert from | |
host to network byte order. | |
@param[in, out] Head The IP head to convert. | |
@return Point to the converted IP head. | |
**/ | |
EFI_IP6_HEADER * | |
Ip6NtohHead ( | |
IN OUT EFI_IP6_HEADER *Head | |
); | |
#endif |