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