Signed-off-by: Liming Gao <liming.gao@intel.com> Cc: Siyuan Fu <siyuan.fu@intel.com> Cc: Jiaxin Wu <jiaxin.wu@intel.com> Reviewed-by: Jiaxin Wu <jiaxin.wu@intel.com> Reviewed-by: Siyuan Fu <siyuan.fu@intel.com>
		
			
				
	
	
		
			608 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			608 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
  This library is only intended to be used by UEFI network stack modules.
 | 
						|
  It provides the combined IpIo layer on the EFI IP4 Protocol and EFI IP6 protocol.
 | 
						|
 | 
						|
Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR>
 | 
						|
SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
						|
 | 
						|
**/
 | 
						|
 | 
						|
#ifndef _IP_IO_H_
 | 
						|
#define _IP_IO_H_
 | 
						|
 | 
						|
#include <Protocol/Ip4.h>
 | 
						|
#include <Protocol/Ip6.h>
 | 
						|
 | 
						|
#include <Library/NetLib.h>
 | 
						|
 | 
						|
//
 | 
						|
// type and code define for ICMP protocol error
 | 
						|
// from IP
 | 
						|
//
 | 
						|
#define ICMP_TYPE_UNREACH              3
 | 
						|
#define ICMP_TYPE_TIMXCEED             11
 | 
						|
#define ICMP_TYPE_PARAMPROB            12
 | 
						|
#define ICMP_TYPE_SOURCEQUENCH         4
 | 
						|
 | 
						|
#define ICMP_CODE_UNREACH_NET          0
 | 
						|
#define ICMP_CODE_UNREACH_HOST         1
 | 
						|
#define ICMP_CODE_UNREACH_PROTOCOL     2
 | 
						|
#define ICMP_CODE_UNREACH_PORT         3
 | 
						|
#define ICMP_CODE_UNREACH_NEEDFRAG     4
 | 
						|
#define ICMP_CODE_UNREACH_SRCFAIL      5
 | 
						|
#define ICMP_CODE_UNREACH_NET_UNKNOWN  6
 | 
						|
#define ICMP_CODE_UNREACH_HOST_UNKNOWN 7
 | 
						|
#define ICMP_CODE_UNREACH_ISOLATED     8
 | 
						|
#define ICMP_CODE_UNREACH_NET_PROHIB   9
 | 
						|
#define ICMP_CODE_UNREACH_HOST_PROHIB  10
 | 
						|
#define ICMP_CODE_UNREACH_TOSNET       11
 | 
						|
#define ICMP_CODE_UNREACH_TOSHOST      12
 | 
						|
 | 
						|
/**
 | 
						|
  Get the IP header length from the struct EFI_IP4_HEADER. HeaderLength is
 | 
						|
  Internet header length in 32-bit words, so HeaderLength<<2 is the real
 | 
						|
  length of IP header.
 | 
						|
 | 
						|
  @param[out] HdrPtr   A pointer to EFI_IP4_HEADER.
 | 
						|
 | 
						|
  @return The IP header length.
 | 
						|
**/
 | 
						|
#define EFI_IP4_HEADER_LEN(HdrPtr) ((HdrPtr)->HeaderLength << 2)
 | 
						|
 | 
						|
/**
 | 
						|
  To types of ICMP error which consist of ICMP header, IP header and original
 | 
						|
  datagram's data, get length from sum of ICMP header length, IP header length
 | 
						|
  and first 64 bits of datagram's data length.
 | 
						|
 | 
						|
  @param[in] IpHdr   A pointer to EFI_IP4_HEADER.
 | 
						|
 | 
						|
  @return The ICMP error length.
 | 
						|
**/
 | 
						|
#define ICMP_ERRLEN(IpHdr) \
 | 
						|
  (sizeof(IP4_ICMP_HEAD) + EFI_IP4_HEADER_LEN(IpHdr) + 8)
 | 
						|
 | 
						|
/**
 | 
						|
  Get the packet header from NET_BUF.
 | 
						|
 | 
						|
  @param[out]  Buf    A pointer to NET_BUF.
 | 
						|
  @param[in]   Type   Header type.
 | 
						|
 | 
						|
  @return The pointer to packet header.
 | 
						|
**/
 | 
						|
#define NET_PROTO_HDR(Buf, Type)  ((Type *) ((Buf)->BlockOp[0].Head))
 | 
						|
 | 
						|
 | 
						|
extern EFI_IP4_CONFIG_DATA  mIp4IoDefaultIpConfigData;
 | 
						|
extern EFI_IP6_CONFIG_DATA  mIp6IoDefaultIpConfigData;
 | 
						|
 | 
						|
 | 
						|
///
 | 
						|
/// This error will be delivered to the
 | 
						|
/// listening transportation layer protocol
 | 
						|
/// that consumes IpIO.
 | 
						|
///
 | 
						|
 | 
						|
#define  ICMP_ERR_UNREACH_NET           0
 | 
						|
#define  ICMP_ERR_UNREACH_HOST          1
 | 
						|
#define  ICMP_ERR_UNREACH_PROTOCOL      2
 | 
						|
#define  ICMP_ERR_UNREACH_PORT          3
 | 
						|
#define  ICMP_ERR_MSGSIZE               4
 | 
						|
#define  ICMP_ERR_UNREACH_SRCFAIL       5
 | 
						|
#define  ICMP_ERR_TIMXCEED_INTRANS      6
 | 
						|
#define  ICMP_ERR_TIMXCEED_REASS        7
 | 
						|
#define  ICMP_ERR_QUENCH                8
 | 
						|
#define  ICMP_ERR_PARAMPROB             9
 | 
						|
 | 
						|
#define  ICMP6_ERR_UNREACH_NET          0
 | 
						|
#define  ICMP6_ERR_UNREACH_HOST         1
 | 
						|
#define  ICMP6_ERR_UNREACH_PROTOCOL     2
 | 
						|
#define  ICMP6_ERR_UNREACH_PORT         3
 | 
						|
#define  ICMP6_ERR_PACKAGE_TOOBIG       4
 | 
						|
#define  ICMP6_ERR_TIMXCEED_HOPLIMIT    5
 | 
						|
#define  ICMP6_ERR_TIMXCEED_REASS       6
 | 
						|
#define  ICMP6_ERR_PARAMPROB_HEADER     7
 | 
						|
#define  ICMP6_ERR_PARAMPROB_NEXHEADER  8
 | 
						|
#define  ICMP6_ERR_PARAMPROB_IPV6OPTION 9
 | 
						|
 | 
						|
///
 | 
						|
/// The helper struct for IpIoGetIcmpErrStatus(). It is for internal use only.
 | 
						|
///
 | 
						|
typedef struct {
 | 
						|
  BOOLEAN                   IsHard;
 | 
						|
  BOOLEAN                   Notify;
 | 
						|
} ICMP_ERROR_INFO;
 | 
						|
 | 
						|
typedef union {
 | 
						|
  EFI_IP4_COMPLETION_TOKEN  Ip4Token;
 | 
						|
  EFI_IP6_COMPLETION_TOKEN  Ip6Token;
 | 
						|
} IP_IO_IP_COMPLETION_TOKEN;
 | 
						|
 | 
						|
typedef union {
 | 
						|
  EFI_IP4_TRANSMIT_DATA     Ip4TxData;
 | 
						|
  EFI_IP6_TRANSMIT_DATA     Ip6TxData;
 | 
						|
} IP_IO_IP_TX_DATA;
 | 
						|
 | 
						|
typedef union {
 | 
						|
  EFI_IP4_RECEIVE_DATA      Ip4RxData;
 | 
						|
  EFI_IP6_RECEIVE_DATA      Ip6RxData;
 | 
						|
} IP_IO_IP_RX_DATA;
 | 
						|
 | 
						|
typedef union {
 | 
						|
  EFI_IP4_OVERRIDE_DATA     Ip4OverrideData;
 | 
						|
  EFI_IP6_OVERRIDE_DATA     Ip6OverrideData;
 | 
						|
} IP_IO_OVERRIDE;
 | 
						|
 | 
						|
typedef union {
 | 
						|
  EFI_IP4_CONFIG_DATA       Ip4CfgData;
 | 
						|
  EFI_IP6_CONFIG_DATA       Ip6CfgData;
 | 
						|
} IP_IO_IP_CONFIG_DATA;
 | 
						|
 | 
						|
typedef union {
 | 
						|
  EFI_IP4_HEADER            *Ip4Hdr;
 | 
						|
  EFI_IP6_HEADER            *Ip6Hdr;
 | 
						|
} IP_IO_IP_HEADER;
 | 
						|
 | 
						|
typedef union {
 | 
						|
  IP4_ADDR                  SubnetMask;
 | 
						|
  UINT8                     PrefixLength;
 | 
						|
} IP_IO_IP_MASK;
 | 
						|
 | 
						|
typedef union {
 | 
						|
  EFI_IP4_PROTOCOL  *Ip4;
 | 
						|
  EFI_IP6_PROTOCOL  *Ip6;
 | 
						|
} IP_IO_IP_PROTOCOL;
 | 
						|
 | 
						|
///
 | 
						|
/// The IP session for an IP receive packet.
 | 
						|
///
 | 
						|
typedef struct _EFI_NET_SESSION_DATA {
 | 
						|
  EFI_IP_ADDRESS        Source;     ///< Source IP of the received packet.
 | 
						|
  EFI_IP_ADDRESS        Dest;       ///< Destination IP of the received packet.
 | 
						|
  IP_IO_IP_HEADER       IpHdr;      ///< IP header of the received packet.
 | 
						|
  UINT32                IpHdrLen;   ///< IP header length of the received packet.
 | 
						|
                                    ///< For IPv6, it includes the IP6 header
 | 
						|
                                    ///< length and extension header length. For
 | 
						|
                                    ///< IPv4, it includes the IP4 header length
 | 
						|
                                    ///< and options length.
 | 
						|
  UINT8                 IpVersion;  ///< The IP version of the received packet.
 | 
						|
} EFI_NET_SESSION_DATA;
 | 
						|
 | 
						|
/**
 | 
						|
  The prototype is called back when an IP packet is received.
 | 
						|
 | 
						|
  @param[in] Status        The result of the receive request.
 | 
						|
  @param[in] IcmpErr       Valid when Status is EFI_ICMP_ERROR.
 | 
						|
  @param[in] NetSession    The IP session for the received packet.
 | 
						|
  @param[in] Pkt           The packet received.
 | 
						|
  @param[in] Context       The data provided by the user for the received packet when
 | 
						|
                           the callback is registered in IP_IO_OPEN_DATA::RcvdContext.
 | 
						|
 | 
						|
**/
 | 
						|
typedef
 | 
						|
VOID
 | 
						|
(EFIAPI *PKT_RCVD_NOTIFY) (
 | 
						|
  IN EFI_STATUS           Status,
 | 
						|
  IN UINT8                IcmpErr,
 | 
						|
  IN EFI_NET_SESSION_DATA *NetSession,
 | 
						|
  IN NET_BUF              *Pkt,
 | 
						|
  IN VOID                 *Context
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  The prototype is called back when an IP packet is sent.
 | 
						|
 | 
						|
  @param[in] Status        Result of the IP packet being sent.
 | 
						|
  @param[in] Context       The data provided by user for the received packet when
 | 
						|
                           the callback is registered in IP_IO_OPEN_DATA::SndContext.
 | 
						|
  @param[in] Sender        A Union type to specify a pointer of EFI_IP4_PROTOCOL
 | 
						|
                           or EFI_IP6_PROTOCOL.
 | 
						|
  @param[in] NotifyData    The Context data specified when calling IpIoSend()
 | 
						|
 | 
						|
**/
 | 
						|
typedef
 | 
						|
VOID
 | 
						|
(EFIAPI *PKT_SENT_NOTIFY) (
 | 
						|
  IN EFI_STATUS        Status,
 | 
						|
  IN VOID              *Context,
 | 
						|
  IN IP_IO_IP_PROTOCOL Sender,
 | 
						|
  IN VOID              *NotifyData
 | 
						|
  );
 | 
						|
 | 
						|
///
 | 
						|
/// This data structure wraps Ip4/Ip6 instances. The IpIo Library uses it for all
 | 
						|
/// Ip4/Ip6 operations.
 | 
						|
///
 | 
						|
typedef struct _IP_IO {
 | 
						|
  ///
 | 
						|
  /// The node used to link this IpIo to the active IpIo list.
 | 
						|
  ///
 | 
						|
  LIST_ENTRY                    Entry;
 | 
						|
 | 
						|
  ///
 | 
						|
  /// The list used to maintain the IP instance for different sending purpose.
 | 
						|
  ///
 | 
						|
  LIST_ENTRY                    IpList;
 | 
						|
 | 
						|
  EFI_HANDLE                    Controller;
 | 
						|
  EFI_HANDLE                    Image;
 | 
						|
  EFI_HANDLE                    ChildHandle;
 | 
						|
  //
 | 
						|
  // The IP instance consumed by this IP_IO
 | 
						|
  //
 | 
						|
  IP_IO_IP_PROTOCOL             Ip;
 | 
						|
  BOOLEAN                       IsConfigured;
 | 
						|
 | 
						|
  ///
 | 
						|
  /// Some ip configuration data can be changed.
 | 
						|
  ///
 | 
						|
  UINT8                         Protocol;
 | 
						|
 | 
						|
  ///
 | 
						|
  /// Token and event used to get data from IP.
 | 
						|
  ///
 | 
						|
  IP_IO_IP_COMPLETION_TOKEN     RcvToken;
 | 
						|
 | 
						|
  ///
 | 
						|
  /// List entry used to link the token passed to IP_IO.
 | 
						|
  ///
 | 
						|
  LIST_ENTRY                    PendingSndList;
 | 
						|
 | 
						|
  //
 | 
						|
  // User interface used to get notify from IP_IO
 | 
						|
  //
 | 
						|
  VOID                          *RcvdContext;    ///< See IP_IO_OPEN_DATA::RcvdContext.
 | 
						|
  VOID                          *SndContext;     ///< See IP_IO_OPEN_DATA::SndContext.
 | 
						|
  PKT_RCVD_NOTIFY               PktRcvdNotify;   ///< See IP_IO_OPEN_DATA::PktRcvdNotify.
 | 
						|
  PKT_SENT_NOTIFY               PktSentNotify;   ///< See IP_IO_OPEN_DATA::PktSentNotify.
 | 
						|
  UINT8                         IpVersion;
 | 
						|
  IP4_ADDR                      StationIp;
 | 
						|
  IP4_ADDR                      SubnetMask;
 | 
						|
} IP_IO;
 | 
						|
 | 
						|
///
 | 
						|
/// The struct is for the user to pass IP configuration and callbacks to IP_IO.
 | 
						|
/// It is used by IpIoOpen().
 | 
						|
///
 | 
						|
typedef struct _IP_IO_OPEN_DATA {
 | 
						|
  IP_IO_IP_CONFIG_DATA IpConfigData;    ///< Configuration of the IP instance.
 | 
						|
  VOID                 *RcvdContext;    ///< Context data used by receive callback.
 | 
						|
  VOID                 *SndContext;     ///< Context data used by send callback.
 | 
						|
  PKT_RCVD_NOTIFY      PktRcvdNotify;   ///< Receive callback.
 | 
						|
  PKT_SENT_NOTIFY      PktSentNotify;   ///< Send callback.
 | 
						|
} IP_IO_OPEN_DATA;
 | 
						|
 | 
						|
///
 | 
						|
/// Internal struct book-keeping send request of IP_IO.
 | 
						|
///
 | 
						|
/// An IP_IO_SEND_ENTRY will be created each time a send request is issued to
 | 
						|
/// IP_IO via IpIoSend().
 | 
						|
///
 | 
						|
typedef struct _IP_IO_SEND_ENTRY {
 | 
						|
  LIST_ENTRY                Entry;
 | 
						|
  IP_IO                     *IpIo;
 | 
						|
  VOID                      *Context;
 | 
						|
  VOID                      *NotifyData;
 | 
						|
  IP_IO_IP_PROTOCOL         Ip;
 | 
						|
  NET_BUF                   *Pkt;
 | 
						|
  IP_IO_IP_COMPLETION_TOKEN SndToken;
 | 
						|
} IP_IO_SEND_ENTRY;
 | 
						|
 | 
						|
///
 | 
						|
/// The IP_IO_IP_INFO is used in IpIoSend() to override the default IP instance
 | 
						|
/// in IP_IO.
 | 
						|
///
 | 
						|
typedef struct _IP_IO_IP_INFO {
 | 
						|
  EFI_IP_ADDRESS            Addr;
 | 
						|
  IP_IO_IP_MASK             PreMask;
 | 
						|
  LIST_ENTRY                Entry;
 | 
						|
  EFI_HANDLE                ChildHandle;
 | 
						|
  IP_IO_IP_PROTOCOL         Ip;
 | 
						|
  IP_IO_IP_COMPLETION_TOKEN DummyRcvToken;
 | 
						|
  INTN                      RefCnt;
 | 
						|
  UINT8                     IpVersion;
 | 
						|
} IP_IO_IP_INFO;
 | 
						|
 | 
						|
/**
 | 
						|
  Create a new IP_IO instance.
 | 
						|
 | 
						|
  If IpVersion is not IP_VERSION_4 or IP_VERSION_6, then ASSERT().
 | 
						|
 | 
						|
  This function uses IP4/IP6 service binding protocol in Controller to create
 | 
						|
  an IP4/IP6 child (aka IP4/IP6 instance).
 | 
						|
 | 
						|
  @param[in]  Image             The image handle of the driver or application that
 | 
						|
                                consumes IP_IO.
 | 
						|
  @param[in]  Controller        The controller handle that has IP4 or IP6 service
 | 
						|
                                binding protocol installed.
 | 
						|
  @param[in]  IpVersion         The version of the IP protocol to use, either
 | 
						|
                                IPv4 or IPv6.
 | 
						|
 | 
						|
  @return The pointer to a newly created IP_IO instance, or NULL if failed.
 | 
						|
 | 
						|
**/
 | 
						|
IP_IO *
 | 
						|
EFIAPI
 | 
						|
IpIoCreate (
 | 
						|
  IN EFI_HANDLE Image,
 | 
						|
  IN EFI_HANDLE Controller,
 | 
						|
  IN UINT8      IpVersion
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Destroy an IP_IO instance.
 | 
						|
 | 
						|
  This function is paired with IpIoCreate(). The IP_IO will be closed first.
 | 
						|
  Resource will be freed afterwards. See IpIoClose().
 | 
						|
 | 
						|
  @param[in, out]  IpIo         The pointer to the IP_IO instance that needs to be
 | 
						|
                                destroyed.
 | 
						|
 | 
						|
  @retval          EFI_SUCCESS  The IP_IO instance was destroyed successfully.
 | 
						|
  @retval          Others       An error condition occurred.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
IpIoDestroy (
 | 
						|
  IN OUT IP_IO *IpIo
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Stop an IP_IO instance.
 | 
						|
 | 
						|
  If Ip version is not IP_VERSION_4 or IP_VERSION_6, then ASSERT().
 | 
						|
 | 
						|
  This function is paired with IpIoOpen(). The IP_IO will be unconfigured, and all
 | 
						|
  pending send/receive tokens will be canceled.
 | 
						|
 | 
						|
  @param[in, out]  IpIo            The pointer to the IP_IO instance that needs to stop.
 | 
						|
 | 
						|
  @retval          EFI_SUCCESS            The IP_IO instance stopped successfully.
 | 
						|
  @retval          EFI_INVALID_PARAMETER  Invalid input parameter.
 | 
						|
  @retval          Others                 Anrror condition occurred.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
IpIoStop (
 | 
						|
  IN OUT IP_IO *IpIo
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Open an IP_IO instance for use.
 | 
						|
 | 
						|
  If Ip version is not IP_VERSION_4 or IP_VERSION_6, then ASSERT().
 | 
						|
 | 
						|
  This function is called after IpIoCreate(). It is used for configuring the IP
 | 
						|
  instance and register the callbacks and their context data for sending and
 | 
						|
  receiving IP packets.
 | 
						|
 | 
						|
  @param[in, out]  IpIo               The pointer to an IP_IO instance that needs
 | 
						|
                                      to open.
 | 
						|
  @param[in]       OpenData           The configuration data and callbacks for
 | 
						|
                                      the IP_IO instance.
 | 
						|
 | 
						|
  @retval          EFI_SUCCESS            The IP_IO instance opened with OpenData
 | 
						|
                                          successfully.
 | 
						|
  @retval          EFI_ACCESS_DENIED      The IP_IO instance is configured, avoid to
 | 
						|
                                          reopen it.
 | 
						|
  @retval          EFI_UNSUPPORTED        IPv4 RawData mode is no supported.
 | 
						|
  @retval          EFI_INVALID_PARAMETER  Invalid input parameter.
 | 
						|
  @retval          Others                 Error condition occurred.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
IpIoOpen (
 | 
						|
  IN OUT IP_IO           *IpIo,
 | 
						|
  IN     IP_IO_OPEN_DATA *OpenData
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Send out an IP packet.
 | 
						|
 | 
						|
  This function is called after IpIoOpen(). The data to be sent is wrapped in
 | 
						|
  Pkt. The IP instance wrapped in IpIo is used for sending by default but can be
 | 
						|
  overriden by Sender. Other sending configs, like source address and gateway
 | 
						|
  address etc., are specified in OverrideData.
 | 
						|
 | 
						|
  @param[in, out]  IpIo                  Pointer to an IP_IO instance used for sending IP
 | 
						|
                                         packet.
 | 
						|
  @param[in, out]  Pkt                   Pointer to the IP packet to be sent.
 | 
						|
  @param[in]       Sender                The IP protocol instance used for sending.
 | 
						|
  @param[in]       Context               Optional context data.
 | 
						|
  @param[in]       NotifyData            Optional notify data.
 | 
						|
  @param[in]       Dest                  The destination IP address to send this packet to.
 | 
						|
                                         This parameter is optional when using IPv6.
 | 
						|
  @param[in]       OverrideData          The data to override some configuration of the IP
 | 
						|
                                         instance used for sending.
 | 
						|
 | 
						|
  @retval          EFI_SUCCESS           The operation is completed successfully.
 | 
						|
  @retval          EFI_INVALID_PARAMETER The input parameter is not correct.
 | 
						|
  @retval          EFI_NOT_STARTED       The IpIo is not configured.
 | 
						|
  @retval          EFI_OUT_OF_RESOURCES  Failed due to resource limit.
 | 
						|
  @retval          Others                Error condition occurred.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
IpIoSend (
 | 
						|
  IN OUT IP_IO          *IpIo,
 | 
						|
  IN OUT NET_BUF        *Pkt,
 | 
						|
  IN     IP_IO_IP_INFO  *Sender        OPTIONAL,
 | 
						|
  IN     VOID           *Context       OPTIONAL,
 | 
						|
  IN     VOID           *NotifyData    OPTIONAL,
 | 
						|
  IN     EFI_IP_ADDRESS *Dest          OPTIONAL,
 | 
						|
  IN     IP_IO_OVERRIDE *OverrideData  OPTIONAL
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Cancel the IP transmit token that wraps this Packet.
 | 
						|
 | 
						|
  If IpIo is NULL, then ASSERT().
 | 
						|
  If Packet is NULL, then ASSERT().
 | 
						|
 | 
						|
  @param[in]  IpIo                  The pointer to the IP_IO instance.
 | 
						|
  @param[in]  Packet                The pointer to the packet of NET_BUF to cancel.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
EFIAPI
 | 
						|
IpIoCancelTxToken (
 | 
						|
  IN IP_IO  *IpIo,
 | 
						|
  IN VOID   *Packet
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Add a new IP instance for sending data.
 | 
						|
 | 
						|
  If IpIo is NULL, then ASSERT().
 | 
						|
  If Ip version is not IP_VERSION_4 or IP_VERSION_6, then ASSERT().
 | 
						|
 | 
						|
  The function is used to add the IP_IO to the IP_IO sending list. The caller
 | 
						|
  can later use IpIoFindSender() to get the IP_IO and call IpIoSend() to send
 | 
						|
  data.
 | 
						|
 | 
						|
  @param[in, out]  IpIo               The pointer to an IP_IO instance to add a new IP
 | 
						|
                                      instance for sending purposes.
 | 
						|
 | 
						|
  @return The pointer to the created IP_IO_IP_INFO structure; NULL if failed.
 | 
						|
 | 
						|
**/
 | 
						|
IP_IO_IP_INFO *
 | 
						|
EFIAPI
 | 
						|
IpIoAddIp (
 | 
						|
  IN OUT IP_IO  *IpIo
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Configure the IP instance of this IpInfo and start the receiving if IpConfigData
 | 
						|
  is not NULL.
 | 
						|
 | 
						|
  If Ip version is not IP_VERSION_4 or IP_VERSION_6, then ASSERT().
 | 
						|
 | 
						|
  @param[in, out]  IpInfo          The pointer to the IP_IO_IP_INFO instance.
 | 
						|
  @param[in, out]  IpConfigData    The IP4 or IP6 configure data used to configure
 | 
						|
                                   the IP instance. If NULL, the IP instance is reset.
 | 
						|
                                   If UseDefaultAddress is set to TRUE, and the configure
 | 
						|
                                   operation succeeds, the default address information
 | 
						|
                                   is written back in this IpConfigData.
 | 
						|
 | 
						|
  @retval          EFI_SUCCESS     The IP instance of this IpInfo was configured successfully,
 | 
						|
                                   or there is no need to reconfigure it.
 | 
						|
  @retval          Others          The configuration failed.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
IpIoConfigIp (
 | 
						|
  IN OUT IP_IO_IP_INFO        *IpInfo,
 | 
						|
  IN OUT VOID                 *IpConfigData OPTIONAL
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Destroy an IP instance maintained in IpIo->IpList for
 | 
						|
  sending purpose.
 | 
						|
 | 
						|
  If Ip version is not IP_VERSION_4 or IP_VERSION_6, then ASSERT().
 | 
						|
 | 
						|
  This function pairs with IpIoAddIp(). The IpInfo is previously created by
 | 
						|
  IpIoAddIp(). The IP_IO_IP_INFO::RefCnt is decremented and the IP instance
 | 
						|
  will be dstroyed if the RefCnt is zero.
 | 
						|
 | 
						|
  @param[in]  IpIo                  The pointer to the IP_IO instance.
 | 
						|
  @param[in]  IpInfo                The pointer to the IpInfo to be removed.
 | 
						|
 | 
						|
**/
 | 
						|
VOID
 | 
						|
EFIAPI
 | 
						|
IpIoRemoveIp (
 | 
						|
  IN IP_IO            *IpIo,
 | 
						|
  IN IP_IO_IP_INFO    *IpInfo
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Find the first IP protocol maintained in IpIo whose local
 | 
						|
  address is the same as Src.
 | 
						|
 | 
						|
  This function is called when the caller needs the IpIo to send data to the
 | 
						|
  specified Src. The IpIo was added previously by IpIoAddIp().
 | 
						|
 | 
						|
  @param[in, out]  IpIo              The pointer to the pointer of the IP_IO instance.
 | 
						|
  @param[in]       IpVersion         The version of the IP protocol to use, either
 | 
						|
                                     IPv4 or IPv6.
 | 
						|
  @param[in]       Src               The local IP address.
 | 
						|
 | 
						|
  @return The pointer to the IP protocol can be used for sending purpose and its local
 | 
						|
          address is the same with Src. NULL if failed.
 | 
						|
 | 
						|
**/
 | 
						|
IP_IO_IP_INFO *
 | 
						|
EFIAPI
 | 
						|
IpIoFindSender (
 | 
						|
  IN OUT IP_IO           **IpIo,
 | 
						|
  IN     UINT8           IpVersion,
 | 
						|
  IN     EFI_IP_ADDRESS  *Src
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Get the ICMP error map information.
 | 
						|
 | 
						|
  The ErrorStatus will be returned. The IsHard and Notify are optional. If they
 | 
						|
  are not NULL, this routine will fill them.
 | 
						|
 | 
						|
  @param[in]   IcmpError             IcmpError Type.
 | 
						|
  @param[in]   IpVersion             The version of the IP protocol to use,
 | 
						|
                                     either IPv4 or IPv6.
 | 
						|
  @param[out]  IsHard                If TRUE, indicates that it is a hard error.
 | 
						|
  @param[out]  Notify                If TRUE, SockError needs to be notified.
 | 
						|
 | 
						|
  @retval EFI_UNSUPPORTED            Unrecognizable ICMP error code
 | 
						|
  @return The ICMP Error Status, such as EFI_NETWORK_UNREACHABLE.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
IpIoGetIcmpErrStatus (
 | 
						|
  IN  UINT8       IcmpError,
 | 
						|
  IN  UINT8       IpVersion,
 | 
						|
  OUT BOOLEAN     *IsHard  OPTIONAL,
 | 
						|
  OUT BOOLEAN     *Notify  OPTIONAL
 | 
						|
  );
 | 
						|
 | 
						|
/**
 | 
						|
  Refresh the remote peer's Neighbor Cache entries.
 | 
						|
 | 
						|
  This function is called when the caller needs the IpIo to refresh the existing
 | 
						|
  IPv6 neighbor cache entries since the neighbor is considered reachable by the
 | 
						|
  node has recently received a confirmation that packets sent recently to the
 | 
						|
  neighbor were received by its IP layer.
 | 
						|
 | 
						|
  @param[in]   IpIo                  The pointer to an IP_IO instance
 | 
						|
  @param[in]   Neighbor              The IP address of the neighbor
 | 
						|
  @param[in]   Timeout               The time in 100-ns units that this entry will
 | 
						|
                                     remain in the neighbor cache. A value of
 | 
						|
                                     zero means that the entry is permanent.
 | 
						|
                                     A value of non-zero means that the entry is
 | 
						|
                                     dynamic and will be deleted after Timeout.
 | 
						|
 | 
						|
  @retval      EFI_SUCCESS           The operation completed successfully.
 | 
						|
  @retval      EFI_NOT_STARTED       The IpIo is not configured.
 | 
						|
  @retval      EFI_INVALID_PARAMETER The Neighbor Address is invalid.
 | 
						|
  @retval      EFI_NOT_FOUND         The neighbor cache entry is not in the
 | 
						|
                                     neighbor table.
 | 
						|
  @retval      EFI_UNSUPPORTED       IP version is IPv4, which doesn't support neighbor cache refresh.
 | 
						|
  @retval      EFI_OUT_OF_RESOURCES  Failed due to resource limitations.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
IpIoRefreshNeighbor (
 | 
						|
  IN IP_IO           *IpIo,
 | 
						|
  IN EFI_IP_ADDRESS  *Neighbor,
 | 
						|
  IN UINT32          Timeout
 | 
						|
  );
 | 
						|
 | 
						|
#endif
 | 
						|
 |