/** @file
  This file defines the EFI IPv6 (Internet Protocol version 6)
  Protocol interface. It is split into the following three main
  sections:
  - EFI IPv6 Service Binding Protocol
  - EFI IPv6 Variable (deprecated in UEFI 2.4B)
  - EFI IPv6 Protocol
  The EFI IPv6 Protocol provides basic network IPv6 packet I/O services,
  which includes support for Neighbor Discovery Protocol (ND), Multicast
  Listener Discovery Protocol (MLD), and a subset of the Internet Control
  Message Protocol (ICMPv6).

  Copyright (c) 2008 - 2014, Intel Corporation. All rights reserved.<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent

  @par Revision Reference:
  This Protocol is introduced in UEFI Specification 2.2

**/

#ifndef __EFI_IP6_PROTOCOL_H__
#define __EFI_IP6_PROTOCOL_H__

#include <Protocol/ManagedNetwork.h>

#define EFI_IP6_SERVICE_BINDING_PROTOCOL_GUID \
  { \
    0xec835dd3, 0xfe0f, 0x617b, {0xa6, 0x21, 0xb3, 0x50, 0xc3, 0xe1, 0x33, 0x88 } \
  }

#define EFI_IP6_PROTOCOL_GUID \
  { \
    0x2c8759d5, 0x5c2d, 0x66ef, {0x92, 0x5f, 0xb6, 0x6c, 0x10, 0x19, 0x57, 0xe2 } \
  }

typedef struct _EFI_IP6_PROTOCOL EFI_IP6_PROTOCOL;

///
/// EFI_IP6_ADDRESS_PAIR is deprecated in the UEFI 2.4B and should not be used any more.
/// The definition in here is only present to provide backwards compatability.
///
typedef struct {
  ///
  /// The EFI IPv6 Protocol instance handle that is using this address/prefix pair.
  ///
  EFI_HANDLE          InstanceHandle;
  ///
  /// IPv6 address in network byte order.
  ///
  EFI_IPv6_ADDRESS    Ip6Address;
  ///
  /// The length of the prefix associated with the Ip6Address.
  ///
  UINT8               PrefixLength;
} EFI_IP6_ADDRESS_PAIR;

///
/// EFI_IP6_VARIABLE_DATA is deprecated in the UEFI 2.4B and should not be used any more.
/// The definition in here is only present to provide backwards compatability.
///
typedef struct {
  ///
  /// The handle of the driver that creates this entry.
  ///
  EFI_HANDLE              DriverHandle;
  ///
  /// The number of IPv6 address pairs that follow this data structure.
  ///
  UINT32                  AddressCount;
  ///
  /// List of IPv6 address pairs that are currently in use.
  ///
  EFI_IP6_ADDRESS_PAIR    AddressPairs[1];
} EFI_IP6_VARIABLE_DATA;

///
/// ICMPv6 type definitions for error messages
///
///@{
#define ICMP_V6_DEST_UNREACHABLE   0x1
#define ICMP_V6_PACKET_TOO_BIG     0x2
#define ICMP_V6_TIME_EXCEEDED      0x3
#define ICMP_V6_PARAMETER_PROBLEM  0x4
///@}

///
/// ICMPv6 type definition for informational messages
///
///@{
#define ICMP_V6_ECHO_REQUEST        0x80
#define ICMP_V6_ECHO_REPLY          0x81
#define ICMP_V6_LISTENER_QUERY      0x82
#define ICMP_V6_LISTENER_REPORT     0x83
#define ICMP_V6_LISTENER_DONE       0x84
#define ICMP_V6_ROUTER_SOLICIT      0x85
#define ICMP_V6_ROUTER_ADVERTISE    0x86
#define ICMP_V6_NEIGHBOR_SOLICIT    0x87
#define ICMP_V6_NEIGHBOR_ADVERTISE  0x88
#define ICMP_V6_REDIRECT            0x89
#define ICMP_V6_LISTENER_REPORT_2   0x8F
///@}

///
/// ICMPv6 code definitions for ICMP_V6_DEST_UNREACHABLE
///
///@{
#define ICMP_V6_NO_ROUTE_TO_DEST    0x0
#define ICMP_V6_COMM_PROHIBITED     0x1
#define ICMP_V6_BEYOND_SCOPE        0x2
#define ICMP_V6_ADDR_UNREACHABLE    0x3
#define ICMP_V6_PORT_UNREACHABLE    0x4
#define ICMP_V6_SOURCE_ADDR_FAILED  0x5
#define ICMP_V6_ROUTE_REJECTED      0x6
///@}

///
/// ICMPv6 code definitions for ICMP_V6_TIME_EXCEEDED
///
///@{
#define ICMP_V6_TIMEOUT_HOP_LIMIT   0x0
#define ICMP_V6_TIMEOUT_REASSEMBLE  0x1
///@}

///
/// ICMPv6 code definitions for ICMP_V6_PARAMETER_PROBLEM
///
///@{
#define ICMP_V6_ERRONEOUS_HEADER      0x0
#define ICMP_V6_UNRECOGNIZE_NEXT_HDR  0x1
#define ICMP_V6_UNRECOGNIZE_OPTION    0x2
///@}

///
/// EFI_IP6_CONFIG_DATA
/// is used to report and change IPv6 session parameters.
///
typedef struct {
  ///
  /// For the IPv6 packet to send and receive, this is the default value
  /// of the 'Next Header' field in the last IPv6 extension header or in
  /// the IPv6 header if there are no extension headers. Ignored when
  /// AcceptPromiscuous is TRUE.
  ///
  UINT8               DefaultProtocol;
  ///
  /// Set to TRUE to receive all IPv6 packets that get through the
  /// receive filters.
  /// Set to FALSE to receive only the DefaultProtocol IPv6
  /// packets that get through the receive filters. Ignored when
  /// AcceptPromiscuous is TRUE.
  ///
  BOOLEAN             AcceptAnyProtocol;
  ///
  /// Set to TRUE to receive ICMP error report packets. Ignored when
  /// AcceptPromiscuous or AcceptAnyProtocol is TRUE.
  ///
  BOOLEAN             AcceptIcmpErrors;
  ///
  /// Set to TRUE to receive all IPv6 packets that are sent to any
  /// hardware address or any protocol address. Set to FALSE to stop
  /// receiving all promiscuous IPv6 packets.
  ///
  BOOLEAN             AcceptPromiscuous;
  ///
  /// The destination address of the packets that will be transmitted.
  /// Ignored if it is unspecified.
  ///
  EFI_IPv6_ADDRESS    DestinationAddress;
  ///
  /// The station IPv6 address that will be assigned to this EFI IPv6
  /// Protocol instance. This field can be set and changed only when
  /// the EFI IPv6 driver is transitioning from the stopped to the started
  /// states. If the StationAddress is specified, the EFI IPv6 Protocol
  /// driver will deliver only incoming IPv6 packets whose destination
  /// matches this IPv6 address exactly. The StationAddress is required
  /// to be one of currently configured IPv6 addresses. An address
  /// containing all zeroes is also accepted as a special case. Under this
  /// situation, the IPv6 driver is responsible for binding a source
  /// address to this EFI IPv6 protocol instance according to the source
  /// address selection algorithm. Only incoming packets destined to
  /// the selected address will be delivered to the user.  And the
  /// selected station address can be retrieved through later
  /// GetModeData() call. If no address is available for selecting,
  /// EFI_NO_MAPPING will be returned, and the station address will
  /// only be successfully bound to this EFI IPv6 protocol instance
  /// after IP6ModeData.IsConfigured changed to TRUE.
  ///
  EFI_IPv6_ADDRESS    StationAddress;
  ///
  /// TrafficClass field in transmitted IPv6 packets. Default value
  /// is zero.
  ///
  UINT8               TrafficClass;
  ///
  /// HopLimit field in transmitted IPv6 packets.
  ///
  UINT8               HopLimit;
  ///
  /// FlowLabel field in transmitted IPv6 packets. Default value is
  /// zero.
  ///
  UINT32              FlowLabel;
  ///
  /// The timer timeout value (number of microseconds) for the
  /// receive timeout event to be associated with each assembled
  /// packet. Zero means do not drop assembled packets.
  ///
  UINT32              ReceiveTimeout;
  ///
  /// The timer timeout value (number of microseconds) for the
  /// transmit timeout event to be associated with each outgoing
  /// packet. Zero means do not drop outgoing packets.
  ///
  UINT32              TransmitTimeout;
} EFI_IP6_CONFIG_DATA;

///
/// EFI_IP6_ADDRESS_INFO
///
typedef struct {
  EFI_IPv6_ADDRESS    Address;           ///< The IPv6 address.
  UINT8               PrefixLength;      ///< The length of the prefix associated with the Address.
} EFI_IP6_ADDRESS_INFO;

///
/// EFI_IP6_ROUTE_TABLE
/// is the entry structure that is used in routing tables
///
typedef struct {
  ///
  /// The IPv6 address of the gateway to be used as the next hop for
  /// packets to this prefix. If the IPv6 address is all zeros, then the
  /// prefix is on-link.
  ///
  EFI_IPv6_ADDRESS    Gateway;
  ///
  /// The destination prefix to be routed.
  ///
  EFI_IPv6_ADDRESS    Destination;
  ///
  /// The length of the prefix associated with the Destination.
  ///
  UINT8               PrefixLength;
} EFI_IP6_ROUTE_TABLE;

///
/// EFI_IP6_NEIGHBOR_STATE
///
typedef enum {
  ///
  /// Address resolution is being performed on this entry. Specially,
  /// Neighbor Solicitation has been sent to the solicited-node
  /// multicast address of the target, but corresponding Neighbor
  /// Advertisement has not been received.
  ///
  EfiNeighborInComplete,
  ///
  /// Positive confirmation was received that the forward path to the
  /// neighbor was functioning properly.
  ///
  EfiNeighborReachable,
  ///
  /// Reachable Time has elapsed since the last positive confirmation
  /// was received. In this state, the forward path to the neighbor was
  /// functioning properly.
  ///
  EfiNeighborStale,
  ///
  /// This state is an optimization that gives upper-layer protocols
  /// additional time to provide reachability confirmation.
  ///
  EfiNeighborDelay,
  ///
  /// A reachability confirmation is actively sought by retransmitting
  /// Neighbor Solicitations every RetransTimer milliseconds until a
  /// reachability confirmation is received.
  ///
  EfiNeighborProbe
} EFI_IP6_NEIGHBOR_STATE;

///
/// EFI_IP6_NEIGHBOR_CACHE
/// is the entry structure that is used in neighbor cache. It records a set
/// of entries about individual neighbors to which traffic has been sent recently.
///
typedef struct {
  EFI_IPv6_ADDRESS          Neighbor;    ///< The on-link unicast/anycast IP address of the neighbor.
  EFI_MAC_ADDRESS           LinkAddress; ///< Link-layer address of the neighbor.
  EFI_IP6_NEIGHBOR_STATE    State;       ///< State of this neighbor cache entry.
} EFI_IP6_NEIGHBOR_CACHE;

///
/// EFI_IP6_ICMP_TYPE
/// is used to describe those ICMP messages that are supported by this EFI
/// IPv6 Protocol driver.
///
typedef struct {
  UINT8    Type;                  ///< The type of ICMP message.
  UINT8    Code;                  ///< The code of the ICMP message.
} EFI_IP6_ICMP_TYPE;

///
/// EFI_IP6_MODE_DATA
///
typedef struct {
  ///
  /// Set to TRUE after this EFI IPv6 Protocol instance is started.
  /// All other fields in this structure are undefined until this field is TRUE.
  /// Set to FALSE when the EFI IPv6 Protocol instance is stopped.
  ///
  BOOLEAN                   IsStarted;
  ///
  /// The maximum packet size, in bytes, of the packet which the upper layer driver could feed.
  ///
  UINT32                    MaxPacketSize;
  ///
  /// Current configuration settings. Undefined until IsStarted is TRUE.
  ///
  EFI_IP6_CONFIG_DATA       ConfigData;
  ///
  /// Set to TRUE when the EFI IPv6 Protocol instance is configured.
  /// The instance is configured when it has a station address and
  /// corresponding prefix length.
  /// Set to FALSE when the EFI IPv6 Protocol instance is not configured.
  ///
  BOOLEAN                   IsConfigured;
  ///
  /// Number of configured IPv6 addresses on this interface.
  ///
  UINT32                    AddressCount;
  ///
  /// List of currently configured IPv6 addresses and corresponding
  /// prefix lengths assigned to this interface. It is caller's
  /// responsibility to free this buffer.
  ///
  EFI_IP6_ADDRESS_INFO      *AddressList;
  ///
  /// Number of joined multicast groups. Undefined until
  /// IsConfigured is TRUE.
  ///
  UINT32                    GroupCount;
  ///
  /// List of joined multicast group addresses. It is caller's
  /// responsibility to free this buffer. Undefined until
  /// IsConfigured is TRUE.
  ///
  EFI_IPv6_ADDRESS          *GroupTable;
  ///
  /// Number of entries in the routing table. Undefined until
  /// IsConfigured is TRUE.
  ///
  UINT32                    RouteCount;
  ///
  /// Routing table entries. It is caller's responsibility to free this buffer.
  ///
  EFI_IP6_ROUTE_TABLE       *RouteTable;
  ///
  /// Number of entries in the neighbor cache. Undefined until
  /// IsConfigured is TRUE.
  ///
  UINT32                    NeighborCount;
  ///
  /// Neighbor cache entries. It is caller's responsibility to free this
  /// buffer. Undefined until IsConfigured is TRUE.
  ///
  EFI_IP6_NEIGHBOR_CACHE    *NeighborCache;
  ///
  /// Number of entries in the prefix table. Undefined until
  /// IsConfigured is TRUE.
  ///
  UINT32                    PrefixCount;
  ///
  /// On-link Prefix table entries. It is caller's responsibility to free this
  /// buffer. Undefined until IsConfigured is TRUE.
  ///
  EFI_IP6_ADDRESS_INFO      *PrefixTable;
  ///
  /// Number of entries in the supported ICMP types list.
  ///
  UINT32                    IcmpTypeCount;
  ///
  /// Array of ICMP types and codes that are supported by this EFI
  /// IPv6 Protocol driver. It is caller's responsibility to free this
  /// buffer.
  ///
  EFI_IP6_ICMP_TYPE         *IcmpTypeList;
} EFI_IP6_MODE_DATA;

///
/// EFI_IP6_HEADER
/// The fields in the IPv6 header structure are defined in the Internet
/// Protocol version6 specification.
///
#pragma pack(1)
typedef struct _EFI_IP6_HEADER {
  UINT8               TrafficClassH : 4;
  UINT8               Version       : 4;
  UINT8               FlowLabelH    : 4;
  UINT8               TrafficClassL : 4;
  UINT16              FlowLabelL;
  UINT16              PayloadLength;
  UINT8               NextHeader;
  UINT8               HopLimit;
  EFI_IPv6_ADDRESS    SourceAddress;
  EFI_IPv6_ADDRESS    DestinationAddress;
} EFI_IP6_HEADER;
#pragma pack()

///
/// EFI_IP6_FRAGMENT_DATA
/// describes the location and length of the IPv6 packet
/// fragment to transmit or that has been received.
///
typedef struct _EFI_IP6_FRAGMENT_DATA {
  UINT32    FragmentLength;                ///< Length of fragment data. This field may not be set to zero.
  VOID      *FragmentBuffer;               ///< Pointer to fragment data. This field may not be set to NULL.
} EFI_IP6_FRAGMENT_DATA;

///
/// EFI_IP6_RECEIVE_DATA
///
typedef struct _EFI_IP6_RECEIVE_DATA {
  ///
  /// Time when the EFI IPv6 Protocol driver accepted the packet.
  /// Ignored if it is zero.
  ///
  EFI_TIME                 TimeStamp;
  ///
  /// After this event is signaled, the receive data structure is released
  /// and must not be referenced.
  ///
  EFI_EVENT                RecycleSignal;
  ///
  /// Length of the IPv6 packet headers, including both the IPv6
  /// header and any extension headers.
  ///
  UINT32                   HeaderLength;
  ///
  /// Pointer to the IPv6 packet header. If the IPv6 packet was
  /// fragmented, this argument is a pointer to the header in the first
  /// fragment.
  ///
  EFI_IP6_HEADER           *Header;
  ///
  /// Sum of the lengths of IPv6 packet buffers in FragmentTable. May
  /// be zero.
  ///
  UINT32                   DataLength;
  ///
  /// Number of IPv6 payload fragments. May be zero.
  ///
  UINT32                   FragmentCount;
  ///
  /// Array of payload fragment lengths and buffer pointers.
  ///
  EFI_IP6_FRAGMENT_DATA    FragmentTable[1];
} EFI_IP6_RECEIVE_DATA;

///
/// EFI_IP6_OVERRIDE_DATA
/// The information and flags in the override data structure will override
/// default parameters or settings for one Transmit() function call.
///
typedef struct _EFI_IP6_OVERRIDE_DATA {
  UINT8     Protocol;                 ///< Protocol type override.
  UINT8     HopLimit;                 ///< Hop-Limit override.
  UINT32    FlowLabel;                ///< Flow-Label override.
} EFI_IP6_OVERRIDE_DATA;

///
/// EFI_IP6_TRANSMIT_DATA
///
typedef struct _EFI_IP6_TRANSMIT_DATA {
  ///
  /// The destination IPv6 address.  If it is unspecified,
  /// ConfigData.DestinationAddress will be used instead.
  ///
  EFI_IPv6_ADDRESS         DestinationAddress;
  ///
  /// If not NULL, the IPv6 transmission control override data.
  ///
  EFI_IP6_OVERRIDE_DATA    *OverrideData;
  ///
  /// Total length in byte of the IPv6 extension headers specified in
  /// ExtHdrs.
  ///
  UINT32                   ExtHdrsLength;
  ///
  /// Pointer to the IPv6 extension headers. The IP layer will append
  /// the required extension headers if they are not specified by
  /// ExtHdrs. Ignored if ExtHdrsLength is zero.
  ///
  VOID                     *ExtHdrs;
  ///
  /// The protocol of first extension header in ExtHdrs. Ignored if
  /// ExtHdrsLength is zero.
  ///
  UINT8                    NextHeader;
  ///
  /// Total length in bytes of the FragmentTable data to transmit.
  ///
  UINT32                   DataLength;
  ///
  /// Number of entries in the fragment data table.
  ///
  UINT32                   FragmentCount;
  ///
  /// Start of the fragment data table.
  ///
  EFI_IP6_FRAGMENT_DATA    FragmentTable[1];
} EFI_IP6_TRANSMIT_DATA;

///
/// EFI_IP6_COMPLETION_TOKEN
/// structures are used for both transmit and receive operations.
///
typedef struct {
  ///
  /// This Event will be signaled after the Status field is updated by
  /// the EFI IPv6 Protocol driver. The type of Event must be EFI_NOTIFY_SIGNAL.
  ///
  EFI_EVENT    Event;
  ///
  /// Will be set to one of the following values:
  /// - EFI_SUCCESS:  The receive or transmit completed
  ///   successfully.
  /// - EFI_ABORTED:  The receive or transmit was aborted
  /// - EFI_TIMEOUT:  The transmit timeout expired.
  /// - EFI_ICMP_ERROR:  An ICMP error packet was received.
  /// - EFI_DEVICE_ERROR:  An unexpected system or network
  ///   error occurred.
  /// - EFI_SECURITY_VIOLATION: The transmit or receive was
  ///   failed because of an IPsec policy check.
  /// - EFI_NO_MEDIA: There was a media error.
  ///
  EFI_STATUS    Status;
  union {
    ///
    /// When the Token is used for receiving, RxData is a pointer to the EFI_IP6_RECEIVE_DATA.
    ///
    EFI_IP6_RECEIVE_DATA     *RxData;
    ///
    /// When the Token is used for transmitting, TxData is a pointer to the EFI_IP6_TRANSMIT_DATA.
    ///
    EFI_IP6_TRANSMIT_DATA    *TxData;
  } Packet;
} EFI_IP6_COMPLETION_TOKEN;

/**
  Gets the current operational settings for this instance of the EFI IPv6 Protocol driver.

  The GetModeData() function returns the current operational mode data for this driver instance.
  The data fields in EFI_IP6_MODE_DATA are read only. This function is used optionally to
  retrieve the operational mode data of underlying networks or drivers..

  @param[in]  This               Pointer to the EFI_IP6_PROTOCOL instance.
  @param[out] Ip6ModeData        Pointer to the EFI IPv6 Protocol mode data structure.
  @param[out] MnpConfigData      Pointer to the managed network configuration data structure.
  @param[out] SnpModeData        Pointer to the simple network mode data structure.

  @retval EFI_SUCCESS            The operation completed successfully.
  @retval EFI_INVALID_PARAMETER  This is NULL.
  @retval EFI_OUT_OF_RESOURCES   The required mode data could not be allocated.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_IP6_GET_MODE_DATA)(
  IN EFI_IP6_PROTOCOL                 *This,
  OUT EFI_IP6_MODE_DATA               *Ip6ModeData     OPTIONAL,
  OUT EFI_MANAGED_NETWORK_CONFIG_DATA *MnpConfigData   OPTIONAL,
  OUT EFI_SIMPLE_NETWORK_MODE         *SnpModeData     OPTIONAL
  );

/**
  Assigns an IPv6 address and subnet mask to this EFI IPv6 Protocol driver instance.

  The Configure() function is used to set, change, or reset the operational parameters and filter
  settings for this EFI IPv6 Protocol instance. Until these parameters have been set, no network traffic
  can be sent or received by this instance. Once the parameters have been reset (by calling this
  function with Ip6ConfigData set to NULL), no more traffic can be sent or received until these
  parameters have been set again. Each EFI IPv6 Protocol instance can be started and stopped
  independently of each other by enabling or disabling their receive filter settings with the
  Configure() function.

  If Ip6ConfigData.StationAddress is a valid non-zero IPv6 unicast address, it is required
  to be one of the currently configured IPv6 addresses list in the EFI IPv6 drivers, or else
  EFI_INVALID_PARAMETER will be returned. If Ip6ConfigData.StationAddress is
  unspecified, the IPv6 driver will bind a source address according to the source address selection
  algorithm. Clients could frequently call GetModeData() to check get currently configured IPv6
  address list in the EFI IPv6 driver. If both Ip6ConfigData.StationAddress and
  Ip6ConfigData.Destination are unspecified, when transmitting the packet afterwards, the
  source address filled in each outgoing IPv6 packet is decided based on the destination of this packet. .

  If operational parameters are reset or changed, any pending transmit and receive requests will be
  cancelled. Their completion token status will be set to EFI_ABORTED and their events will be
  signaled.

  @param[in]  This               Pointer to the EFI_IP6_PROTOCOL instance.
  @param[in]  Ip6ConfigData      Pointer to the EFI IPv6 Protocol configuration data structure.

  @retval EFI_SUCCESS            The driver instance was successfully opened.
  @retval EFI_INVALID_PARAMETER  One or more of the following conditions is TRUE:
                                 - This is NULL.
                                 - Ip6ConfigData.StationAddress is neither zero nor
                                   a unicast IPv6 address.
                                 - Ip6ConfigData.StationAddress is neither zero nor
                                   one of the configured IP addresses in the EFI IPv6 driver.
                                 - Ip6ConfigData.DefaultProtocol is illegal.
  @retval EFI_OUT_OF_RESOURCES   The EFI IPv6 Protocol driver instance data could not be allocated.
  @retval EFI_NO_MAPPING         The IPv6 driver was responsible for choosing a source address for
                                 this instance, but no source address was available for use.
  @retval EFI_ALREADY_STARTED    The interface is already open and must be stopped before the IPv6
                                 address or prefix length can be changed.
  @retval EFI_DEVICE_ERROR       An unexpected system or network error occurred. The EFI IPv6
                                 Protocol driver instance is not opened.
  @retval EFI_UNSUPPORTED        Default protocol specified through
                                 Ip6ConfigData.DefaulProtocol isn't supported.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_IP6_CONFIGURE)(
  IN EFI_IP6_PROTOCOL            *This,
  IN EFI_IP6_CONFIG_DATA         *Ip6ConfigData OPTIONAL
  );

/**
  Joins and leaves multicast groups.

  The Groups() function is used to join and leave multicast group sessions. Joining a group will
  enable reception of matching multicast packets. Leaving a group will disable reception of matching
  multicast packets. Source-Specific Multicast isn't required to be supported.

  If JoinFlag is FALSE and GroupAddress is NULL, all joined groups will be left.

  @param[in]  This               Pointer to the EFI_IP6_PROTOCOL instance.
  @param[in]  JoinFlag           Set to TRUE to join the multicast group session and FALSE to leave.
  @param[in]  GroupAddress       Pointer to the IPv6 multicast address.

  @retval EFI_SUCCESS            The operation completed successfully.
  @retval EFI_INVALID_PARAMETER  One or more of the following is TRUE:
                                 - This is NULL.
                                 - JoinFlag is TRUE and GroupAddress is NULL.
                                 - GroupAddress is not NULL and *GroupAddress is
                                   not a multicast IPv6 address.
                                 - GroupAddress is not NULL and *GroupAddress is in the
                                   range of SSM destination address.
  @retval EFI_NOT_STARTED        This instance has not been started.
  @retval EFI_OUT_OF_RESOURCES   System resources could not be allocated.
  @retval EFI_UNSUPPORTED        This EFI IPv6 Protocol implementation does not support multicast groups.
  @retval EFI_ALREADY_STARTED    The group address is already in the group table (when
                                 JoinFlag is TRUE).
  @retval EFI_NOT_FOUND          The group address is not in the group table (when JoinFlag is FALSE).
  @retval EFI_DEVICE_ERROR       An unexpected system or network error occurred.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_IP6_GROUPS)(
  IN EFI_IP6_PROTOCOL            *This,
  IN BOOLEAN                     JoinFlag,
  IN EFI_IPv6_ADDRESS            *GroupAddress  OPTIONAL
  );

/**
  Adds and deletes routing table entries.

  The Routes() function adds a route to or deletes a route from the routing table.

  Routes are determined by comparing the leftmost PrefixLength bits of Destination with
  the destination IPv6 address arithmetically. The gateway address must be on the same subnet as the
  configured station address.

  The default route is added with Destination and PrefixLegth both set to all zeros. The
  default route matches all destination IPv6 addresses that do not match any other routes.

  All EFI IPv6 Protocol instances share a routing table.

  @param[in]  This               Pointer to the EFI_IP6_PROTOCOL instance.
  @param[in]  DeleteRoute        Set to TRUE to delete this route from the routing table. Set to
                                 FALSE to add this route to the routing table. Destination,
                                 PrefixLength and Gateway are used as the key to each
                                 route entry.
  @param[in]  Destination        The address prefix of the subnet that needs to be routed.
  @param[in]  PrefixLength       The prefix length of Destination. Ignored if Destination
                                 is NULL.
  @param[in]  GatewayAddress     The unicast gateway IPv6 address for this route.

  @retval EFI_SUCCESS            The operation completed successfully.
  @retval EFI_NOT_STARTED        The driver instance has not been started.
  @retval EFI_INVALID_PARAMETER  One or more of the following conditions is TRUE:
                                 - This is NULL.
                                 - When DeleteRoute is TRUE, both Destination and
                                   GatewayAddress are NULL.
                                 - When DeleteRoute is FALSE, either Destination or
                                   GatewayAddress is NULL.
                                 - *GatewayAddress is not a valid unicast IPv6 address.
                                 - *GatewayAddress is one of the local configured IPv6
                                   addresses.
  @retval EFI_OUT_OF_RESOURCES   Could not add the entry to the routing table.
  @retval EFI_NOT_FOUND          This route is not in the routing table (when DeleteRoute is TRUE).
  @retval EFI_ACCESS_DENIED      The route is already defined in the routing table (when
                                 DeleteRoute is FALSE).

**/
typedef
EFI_STATUS
(EFIAPI *EFI_IP6_ROUTES)(
  IN EFI_IP6_PROTOCOL            *This,
  IN BOOLEAN                     DeleteRoute,
  IN EFI_IPv6_ADDRESS            *Destination OPTIONAL,
  IN UINT8                       PrefixLength,
  IN EFI_IPv6_ADDRESS            *GatewayAddress OPTIONAL
  );

/**
  Add or delete Neighbor cache entries.

  The Neighbors() function is used to add, update, or delete an entry from neighbor cache.
  IPv6 neighbor cache entries are typically inserted and updated by the network protocol driver as
  network traffic is processed. Most neighbor cache entries will time out and be deleted if the network
  traffic stops. Neighbor cache entries that were inserted by Neighbors() may be static (will not
  timeout) or dynamic (will time out).

  The implementation should follow the neighbor cache timeout mechanism which is defined in
  RFC4861. The default neighbor cache timeout value should be tuned for the expected network
  environment

  @param[in]  This               Pointer to the EFI_IP6_PROTOCOL instance.
  @param[in]  DeleteFlag         Set to TRUE to delete the specified cache entry, set to FALSE to
                                 add (or update, if it already exists and Override is TRUE) the
                                 specified cache entry. TargetIp6Address is used as the key
                                 to find the requested cache entry.
  @param[in]  TargetIp6Address   Pointer to Target IPv6 address.
  @param[in]  TargetLinkAddress  Pointer to link-layer address of the target. Ignored if NULL.
  @param[in]  Timeout            Time in 100-ns units that this entry will remain in the neighbor
                                 cache, it will be deleted after Timeout. A value of zero means that
                                 the entry is permanent. A non-zero value means that the entry is
                                 dynamic.
  @param[in]  Override           If TRUE, the cached link-layer address of the matching entry will
                                 be overridden and updated; if FALSE, EFI_ACCESS_DENIED
                                 will be returned if a corresponding cache entry already existed.

  @retval  EFI_SUCCESS           The data has been queued for transmission.
  @retval  EFI_NOT_STARTED       This instance has not been started.
  @retval  EFI_INVALID_PARAMETER One or more of the following conditions is TRUE:
                                 - This is NULL.
                                 - TargetIpAddress is NULL.
                                 - *TargetLinkAddress is invalid when not NULL.
                                 - *TargetIpAddress is not a valid unicast IPv6 address.
                                 - *TargetIpAddress is one of the local configured IPv6
                                   addresses.
  @retval  EFI_OUT_OF_RESOURCES  Could not add the entry to the neighbor cache.
  @retval  EFI_NOT_FOUND         This entry is not in the neighbor cache (when DeleteFlag  is
                                 TRUE or when DeleteFlag  is FALSE while
                                 TargetLinkAddress is NULL.).
  @retval  EFI_ACCESS_DENIED     The to-be-added entry is already defined in the neighbor cache,
                                 and that entry is tagged as un-overridden (when DeleteFlag
                                 is FALSE).

**/
typedef
EFI_STATUS
(EFIAPI *EFI_IP6_NEIGHBORS)(
  IN EFI_IP6_PROTOCOL            *This,
  IN BOOLEAN                     DeleteFlag,
  IN EFI_IPv6_ADDRESS            *TargetIp6Address,
  IN EFI_MAC_ADDRESS             *TargetLinkAddress,
  IN UINT32                      Timeout,
  IN BOOLEAN                     Override
  );

/**
  Places outgoing data packets into the transmit queue.

  The Transmit() function places a sending request in the transmit queue of this
  EFI IPv6 Protocol instance. Whenever the packet in the token is sent out or some
  errors occur, the event in the token will be signaled and the status is updated.

  @param[in]  This               Pointer to the EFI_IP6_PROTOCOL instance.
  @param[in]  Token              Pointer to the transmit token.

  @retval  EFI_SUCCESS           The data has been queued for transmission.
  @retval  EFI_NOT_STARTED       This instance has not been started.
  @retval  EFI_NO_MAPPING        The IPv6 driver was responsible for choosing a source address for
                                 this transmission, but no source address was available for use.
  @retval  EFI_INVALID_PARAMETER One or more of the following is TRUE:
                                 - This is NULL.
                                 - Token is NULL.
                                 - Token.Event is NULL.
                                 - Token.Packet.TxData is NULL.
                                 - Token.Packet.ExtHdrsLength is not zero and Token.Packet.ExtHdrs is NULL.
                                 - Token.Packet.FragmentCount is zero.
                                 - One or more of the Token.Packet.TxData.FragmentTable[].FragmentLength fields is zero.
                                 - One or more of the Token.Packet.TxData.FragmentTable[].FragmentBuffer fields is NULL.
                                 - Token.Packet.TxData.DataLength is zero or not equal to the sum of fragment lengths.
                                 - Token.Packet.TxData.DestinationAddress is non-zero when DestinationAddress is configured as
                                   non-zero when doing Configure() for this EFI IPv6 protocol instance.
                                 - Token.Packet.TxData.DestinationAddress is unspecified when DestinationAddress is unspecified
                                   when doing Configure() for this EFI IPv6 protocol instance.
  @retval  EFI_ACCESS_DENIED     The transmit completion token with the same Token.Event
                                 was already in the transmit queue.
  @retval  EFI_NOT_READY         The completion token could not be queued because the transmit
                                 queue is full.
  @retval  EFI_NOT_FOUND         Not route is found to destination address.
  @retval  EFI_OUT_OF_RESOURCES  Could not queue the transmit data.
  @retval  EFI_BUFFER_TOO_SMALL  Token.Packet.TxData.TotalDataLength is too
                                 short to transmit.
  @retval  EFI_BAD_BUFFER_SIZE   If Token.Packet.TxData.DataLength is beyond the
                                 maximum that which can be described through the Fragment Offset
                                 field in Fragment header when performing fragmentation.
  @retval EFI_DEVICE_ERROR       An unexpected system or network error occurred.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_IP6_TRANSMIT)(
  IN EFI_IP6_PROTOCOL            *This,
  IN EFI_IP6_COMPLETION_TOKEN    *Token
  );

/**
  Places a receiving request into the receiving queue.

  The Receive() function places a completion token into the receive packet queue.
  This function is always asynchronous.

  The Token.Event field in the completion token must be filled in by the caller
  and cannot be NULL. When the receive operation completes, the EFI IPv6 Protocol
  driver updates the Token.Status and Token.Packet.RxData fields and the Token.Event
  is signaled.

  @param[in]  This               Pointer to the EFI_IP6_PROTOCOL instance.
  @param[in]  Token              Pointer to a token that is associated with the receive data descriptor.

  @retval EFI_SUCCESS            The receive completion token was cached.
  @retval EFI_NOT_STARTED        This EFI IPv6 Protocol instance has not been started.
  @retval EFI_NO_MAPPING         When IP6 driver responsible for binding source address to this instance,
                                 while no source address is available for use.
  @retval EFI_INVALID_PARAMETER  One or more of the following conditions is TRUE:
                                 - This is NULL.
                                 - Token is NULL.
                                 - Token.Event is NULL.
  @retval EFI_OUT_OF_RESOURCES   The receive completion token could not be queued due to a lack of system
                                 resources (usually memory).
  @retval EFI_DEVICE_ERROR       An unexpected system or network error occurred.
                                 The EFI IPv6 Protocol instance has been reset to startup defaults.
  @retval EFI_ACCESS_DENIED      The receive completion token with the same Token.Event was already
                                 in the receive queue.
  @retval EFI_NOT_READY          The receive request could not be queued because the receive queue is full.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_IP6_RECEIVE)(
  IN EFI_IP6_PROTOCOL            *This,
  IN EFI_IP6_COMPLETION_TOKEN    *Token
  );

/**
  Abort an asynchronous transmit or receive request.

  The Cancel() function is used to abort a pending transmit or receive request.
  If the token is in the transmit or receive request queues, after calling this
  function, Token->Status will be set to EFI_ABORTED and then Token->Event will
  be signaled. If the token is not in one of the queues, which usually means the
  asynchronous operation has completed, this function will not signal the token
  and EFI_NOT_FOUND is returned.

  @param[in]  This               Pointer to the EFI_IP6_PROTOCOL instance.
  @param[in]  Token              Pointer to a token that has been issued by
                                 EFI_IP6_PROTOCOL.Transmit() or
                                 EFI_IP6_PROTOCOL.Receive(). If NULL, all pending
                                 tokens are aborted. Type EFI_IP6_COMPLETION_TOKEN is
                                 defined in EFI_IP6_PROTOCOL.Transmit().

  @retval EFI_SUCCESS            The asynchronous I/O request was aborted and
                                 Token->Event was signaled. When Token is NULL, all
                                 pending requests were aborted and their events were signaled.
  @retval EFI_INVALID_PARAMETER  This is NULL.
  @retval EFI_NOT_STARTED        This instance has not been started.
  @retval EFI_NOT_FOUND          When Token is not NULL, the asynchronous I/O request was
                                 not found in the transmit or receive queue. It has either completed
                                 or was not issued by Transmit() and Receive().
  @retval EFI_DEVICE_ERROR       An unexpected system or network error occurred.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_IP6_CANCEL)(
  IN EFI_IP6_PROTOCOL            *This,
  IN EFI_IP6_COMPLETION_TOKEN    *Token    OPTIONAL
  );

/**
  Polls for incoming data packets and processes outgoing data packets.

  The Poll() function polls for incoming data packets and processes outgoing data
  packets. Network drivers and applications can call the EFI_IP6_PROTOCOL.Poll()
  function to increase the rate that data packets are moved between the communications
  device and the transmit and receive queues.

  In some systems the periodic timer event may not poll the underlying communications
  device fast enough to transmit and/or receive all data packets without missing
  incoming packets or dropping outgoing packets. Drivers and applications that are
  experiencing packet loss should try calling the EFI_IP6_PROTOCOL.Poll() function
  more often.

  @param[in]  This               Pointer to the EFI_IP6_PROTOCOL instance.

  @retval  EFI_SUCCESS           Incoming or outgoing data was processed.
  @retval  EFI_NOT_STARTED       This EFI IPv6 Protocol instance has not been started.
  @retval  EFI_INVALID_PARAMETER This is NULL.
  @retval  EFI_DEVICE_ERROR      An unexpected system or network error occurred.
  @retval  EFI_NOT_READY         No incoming or outgoing data is processed.
  @retval  EFI_TIMEOUT           Data was dropped out of the transmit and/or receive queue.
                                 Consider increasing the polling rate.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_IP6_POLL)(
  IN EFI_IP6_PROTOCOL            *This
  );

///
/// The EFI IPv6 Protocol implements a simple packet-oriented interface that can be
/// used by drivers, daemons, and applications to transmit and receive network packets.
///
struct _EFI_IP6_PROTOCOL {
  EFI_IP6_GET_MODE_DATA    GetModeData;
  EFI_IP6_CONFIGURE        Configure;
  EFI_IP6_GROUPS           Groups;
  EFI_IP6_ROUTES           Routes;
  EFI_IP6_NEIGHBORS        Neighbors;
  EFI_IP6_TRANSMIT         Transmit;
  EFI_IP6_RECEIVE          Receive;
  EFI_IP6_CANCEL           Cancel;
  EFI_IP6_POLL             Poll;
};

extern EFI_GUID  gEfiIp6ServiceBindingProtocolGuid;
extern EFI_GUID  gEfiIp6ProtocolGuid;

#endif
