| /** @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 - 2016, 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; | |
| 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. | |
| 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 | |