/** @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 - 2010, Intel Corporation. All rights reserved.<BR> | |
This program and the accompanying materials are licensed and made available under | |
the terms and conditions of the BSD License that accompanies this distribution. | |
The full text of the license may be found at | |
http://opensource.org/licenses/bsd-license.php. | |
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
**/ | |
#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; | |
} 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. | |
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. | |
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 Others Anrror condition occurred. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
IpIoStop ( | |
IN OUT IP_IO *IpIo | |
); | |
/** | |
Open an IP_IO instance for use. | |
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 | |
reopening it. | |
@retval Others An 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 are wrapped in | |
Pkt. The IP instance wrapped in IpIo is used for sending by default, but can be | |
overriden by Sender. Other sending configurations, such as source address and gateway | |
address, are specified in OverrideData. | |
@param[in, out] IpIo The pointer to an IP_IO instance used for sending IP | |
packet. | |
@param[in, out] Pkt The pointer to the IP packet to be sent. | |
@param[in] Sender Optional. The IP protocol instance used for sending. | |
@param[in] Context The optional context data. | |
@param[in] NotifyData The optional notify data. | |
@param[in] Dest The destination IP address to send this packet to. | |
@param[in] OverrideData The data to override some configuration of the IP | |
instance used for sending. | |
@retval EFI_SUCCESS The operation completed successfully. | |
@retval EFI_NOT_STARTED The IpIo is not configured. | |
@retval EFI_OUT_OF_RESOURCES Failed due to resource limitations. | |
**/ | |
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, | |
IN IP_IO_OVERRIDE *OverrideData OPTIONAL | |
); | |
/** | |
Cancel the IP transmit token that wraps this Packet. | |
@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. | |
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. | |
@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. | |
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. | |
**/ | |
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. | |
@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_OUT_OF_RESOURCES Failed due to resource limitations. | |
**/ | |
EFI_STATUS | |
IpIoRefreshNeighbor ( | |
IN IP_IO *IpIo, | |
IN EFI_IP_ADDRESS *Neighbor, | |
IN UINT32 Timeout | |
); | |
#endif | |