123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311 |
- /** @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
|