mirror of
				https://git.proxmox.com/git/mirror_edk2
				synced 2025-10-31 01:35:30 +00:00 
			
		
		
		
	 9344f09215
			
		
	
	
		9344f09215
		
	
	
	
	
		
			
			https://bugzilla.tianocore.org/show_bug.cgi?id=1373 Replace BSD 2-Clause License with BSD+Patent License. This change is based on the following emails: https://lists.01.org/pipermail/edk2-devel/2019-February/036260.html https://lists.01.org/pipermail/edk2-devel/2018-October/030385.html RFCs with detailed process for the license change: V3: https://lists.01.org/pipermail/edk2-devel/2019-March/038116.html V2: https://lists.01.org/pipermail/edk2-devel/2019-March/037669.html V1: https://lists.01.org/pipermail/edk2-devel/2019-March/037500.html Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com> Reviewed-by: Liming Gao <liming.gao@intel.com>
		
			
				
	
	
		
			948 lines
		
	
	
		
			40 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			948 lines
		
	
	
		
			40 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @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
 |