NetworkPkg: Move Network library header file from MdeModulePkg to NetworkPkg

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>
This commit is contained in:
Liming Gao
2019-05-15 20:02:19 +08:00
parent 4542f8b813
commit 07135c1220
29 changed files with 46 additions and 0 deletions

View File

@@ -1,53 +0,0 @@
/** @file
DpcLib.h.
Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#ifndef _DPC_LIB_H_
#define _DPC_LIB_H_
#include <Protocol/Dpc.h>
/**
Add a Deferred Procedure Call to the end of the DPC queue.
@param[in] DpcTpl The EFI_TPL that the DPC should invoke.
@param[in] DpcProcedure The pointer to the DPC's function.
@param[in] DpcContext The pointer to the DPC's context. Passed to DpcProcedure
when DpcProcedure is invoked.
@retval EFI_SUCCESS The DPC was queued.
@retval EFI_INVALID_PARAMETER DpcTpl is not a valid EFI_TPL.
@retval EFI_INVALID_PARAMETER DpcProcedure is NULL.
@retval EFI_OUT_OF_RESOURCES There are not enough resources available to
add the DPC to the queue.
**/
EFI_STATUS
EFIAPI
QueueDpc (
IN EFI_TPL DpcTpl,
IN EFI_DPC_PROCEDURE DpcProcedure,
IN VOID *DpcContext OPTIONAL
);
/**
Dispatch the queue of DPCs. All DPCs that have been queued with a DpcTpl
value greater than or equal to the current TPL are invoked in the order that
they were queued. DPCs with higher DpcTpl values are invoked before DPCs with
lower DpcTpl values.
@retval EFI_SUCCESS One or more DPCs were invoked.
@retval EFI_NOT_FOUND No DPCs were invoked.
**/
EFI_STATUS
EFIAPI
DispatchDpc (
VOID
);
#endif

View File

@@ -1,481 +0,0 @@
/** @file
This library is used to share code between UEFI network stack modules.
It provides the helper routines to parse the HTTP message byte stream.
Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.<BR>
(C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#ifndef _HTTP_LIB_H_
#define _HTTP_LIB_H_
#include <Protocol/Http.h>
/**
Decode a percent-encoded URI component to the ASCII character.
Decode the input component in Buffer according to RFC 3986. The caller is responsible to make
sure ResultBuffer points to a buffer with size equal or greater than ((AsciiStrSize (Buffer))
in bytes.
@param[in] Buffer The pointer to a percent-encoded URI component.
@param[in] BufferLength Length of Buffer in bytes.
@param[out] ResultBuffer Point to the buffer to store the decode result.
@param[out] ResultLength Length of decoded string in ResultBuffer in bytes.
@retval EFI_SUCCESS Successfully decoded the URI.
@retval EFI_INVALID_PARAMETER Buffer is not a valid percent-encoded string.
**/
EFI_STATUS
EFIAPI
UriPercentDecode (
IN CHAR8 *Buffer,
IN UINT32 BufferLength,
OUT CHAR8 *ResultBuffer,
OUT UINT32 *ResultLength
);
/**
Create a URL parser for the input URL string.
This function will parse and dereference the input HTTP URL into it components. The original
content of the URL won't be modified and the result will be returned in UrlParser, which can
be used in other functions like NetHttpUrlGetHostName(). It is the caller's responsibility to
free the buffer returned in *UrlParser by HttpUrlFreeParser().
@param[in] Url The pointer to a HTTP URL string.
@param[in] Length Length of Url in bytes.
@param[in] IsConnectMethod Whether the Url is used in HTTP CONNECT method or not.
@param[out] UrlParser Pointer to the returned buffer to store the parse result.
@retval EFI_SUCCESS Successfully dereferenced the HTTP URL.
@retval EFI_INVALID_PARAMETER UrlParser is NULL or Url is not a valid HTTP URL.
@retval EFI_OUT_OF_RESOURCES Could not allocate needed resources.
**/
EFI_STATUS
EFIAPI
HttpParseUrl (
IN CHAR8 *Url,
IN UINT32 Length,
IN BOOLEAN IsConnectMethod,
OUT VOID **UrlParser
);
/**
Get the Hostname from a HTTP URL.
This function will return the HostName according to the Url and previous parse result ,and
it is the caller's responsibility to free the buffer returned in *HostName.
@param[in] Url The pointer to a HTTP URL string.
@param[in] UrlParser URL Parse result returned by NetHttpParseUrl().
@param[out] HostName Pointer to a buffer to store the HostName.
@retval EFI_SUCCESS Successfully get the required component.
@retval EFI_INVALID_PARAMETER Uri is NULL or HostName is NULL or UrlParser is invalid.
@retval EFI_NOT_FOUND No hostName component in the URL.
@retval EFI_OUT_OF_RESOURCES Could not allocate needed resources.
**/
EFI_STATUS
EFIAPI
HttpUrlGetHostName (
IN CHAR8 *Url,
IN VOID *UrlParser,
OUT CHAR8 **HostName
);
/**
Get the IPv4 address from a HTTP URL.
This function will return the IPv4 address according to the Url and previous parse result.
@param[in] Url The pointer to a HTTP URL string.
@param[in] UrlParser URL Parse result returned by NetHttpParseUrl().
@param[out] Ip4Address Pointer to a buffer to store the IP address.
@retval EFI_SUCCESS Successfully get the required component.
@retval EFI_INVALID_PARAMETER Uri is NULL or Ip4Address is NULL or UrlParser is invalid.
@retval EFI_NOT_FOUND No IPv4 address component in the URL.
@retval EFI_OUT_OF_RESOURCES Could not allocate needed resources.
**/
EFI_STATUS
EFIAPI
HttpUrlGetIp4 (
IN CHAR8 *Url,
IN VOID *UrlParser,
OUT EFI_IPv4_ADDRESS *Ip4Address
);
/**
Get the IPv6 address from a HTTP URL.
This function will return the IPv6 address according to the Url and previous parse result.
@param[in] Url The pointer to a HTTP URL string.
@param[in] UrlParser URL Parse result returned by NetHttpParseUrl().
@param[out] Ip6Address Pointer to a buffer to store the IP address.
@retval EFI_SUCCESS Successfully get the required component.
@retval EFI_INVALID_PARAMETER Uri is NULL or Ip6Address is NULL or UrlParser is invalid.
@retval EFI_NOT_FOUND No IPv6 address component in the URL.
@retval EFI_OUT_OF_RESOURCES Could not allocate needed resources.
**/
EFI_STATUS
EFIAPI
HttpUrlGetIp6 (
IN CHAR8 *Url,
IN VOID *UrlParser,
OUT EFI_IPv6_ADDRESS *Ip6Address
);
/**
Get the port number from a HTTP URL.
This function will return the port number according to the Url and previous parse result.
@param[in] Url The pointer to a HTTP URL string.
@param[in] UrlParser URL Parse result returned by NetHttpParseUrl().
@param[out] Port Pointer to a buffer to store the port number.
@retval EFI_SUCCESS Successfully get the required component.
@retval EFI_INVALID_PARAMETER Uri is NULL or Port is NULL or UrlParser is invalid.
@retval EFI_NOT_FOUND No port number in the URL.
@retval EFI_OUT_OF_RESOURCES Could not allocate needed resources.
**/
EFI_STATUS
EFIAPI
HttpUrlGetPort (
IN CHAR8 *Url,
IN VOID *UrlParser,
OUT UINT16 *Port
);
/**
Get the Path from a HTTP URL.
This function will return the Path according to the Url and previous parse result,and
it is the caller's responsibility to free the buffer returned in *Path.
@param[in] Url The pointer to a HTTP URL string.
@param[in] UrlParser URL Parse result returned by NetHttpParseUrl().
@param[out] Path Pointer to a buffer to store the Path.
@retval EFI_SUCCESS Successfully get the required component.
@retval EFI_INVALID_PARAMETER Uri is NULL or HostName is NULL or UrlParser is invalid.
@retval EFI_NOT_FOUND No hostName component in the URL.
@retval EFI_OUT_OF_RESOURCES Could not allocate needed resources.
**/
EFI_STATUS
EFIAPI
HttpUrlGetPath (
IN CHAR8 *Url,
IN VOID *UrlParser,
OUT CHAR8 **Path
);
/**
Release the resource of the URL parser.
@param[in] UrlParser Pointer to the parser.
**/
VOID
EFIAPI
HttpUrlFreeParser (
IN VOID *UrlParser
);
//
// HTTP body parser interface.
//
typedef enum {
//
// Part of entity data.
// Length of entity body in Data.
//
BodyParseEventOnData,
//
// End of message body.
// Length is 0 and Data points to next byte after the end of the message.
//
BodyParseEventOnComplete
} HTTP_BODY_PARSE_EVENT;
/**
A callback function to intercept events during message parser.
This function will be invoked during HttpParseMessageBody() with various events type. An error
return status of the callback function will cause the HttpParseMessageBody() aborted.
@param[in] EventType Event type of this callback call.
@param[in] Data A pointer to data buffer.
@param[in] Length Length in bytes of the Data.
@param[in] Context Callback context set by HttpInitMsgParser().
@retval EFI_SUCCESS Continue to parser the message body.
@retval Others Abort the parse.
**/
typedef
EFI_STATUS
(EFIAPI *HTTP_BODY_PARSER_CALLBACK) (
IN HTTP_BODY_PARSE_EVENT EventType,
IN CHAR8 *Data,
IN UINTN Length,
IN VOID *Context
);
/**
Initialize a HTTP message-body parser.
This function will create and initialize a HTTP message parser according to caller provided HTTP message
header information. It is the caller's responsibility to free the buffer returned in *UrlParser by HttpFreeMsgParser().
@param[in] Method The HTTP method (e.g. GET, POST) for this HTTP message.
@param[in] StatusCode Response status code returned by the remote host.
@param[in] HeaderCount Number of HTTP header structures in Headers.
@param[in] Headers Array containing list of HTTP headers.
@param[in] Callback Callback function that is invoked when parsing the HTTP message-body,
set to NULL to ignore all events.
@param[in] Context Pointer to the context that will be passed to Callback.
@param[out] MsgParser Pointer to the returned buffer to store the message parser.
@retval EFI_SUCCESS Successfully initialized the parser.
@retval EFI_OUT_OF_RESOURCES Could not allocate needed resources.
@retval EFI_INVALID_PARAMETER MsgParser is NULL or HeaderCount is not NULL but Headers is NULL.
@retval Others Failed to initialize the parser.
**/
EFI_STATUS
EFIAPI
HttpInitMsgParser (
IN EFI_HTTP_METHOD Method,
IN EFI_HTTP_STATUS_CODE StatusCode,
IN UINTN HeaderCount,
IN EFI_HTTP_HEADER *Headers,
IN HTTP_BODY_PARSER_CALLBACK Callback,
IN VOID *Context,
OUT VOID **MsgParser
);
/**
Parse message body.
Parse BodyLength of message-body. This function can be called repeatedly to parse the message-body partially.
@param[in, out] MsgParser Pointer to the message parser.
@param[in] BodyLength Length in bytes of the Body.
@param[in] Body Pointer to the buffer of the message-body to be parsed.
@retval EFI_SUCCESS Successfully parse the message-body.
@retval EFI_INVALID_PARAMETER MsgParser is NULL or Body is NULL or BodyLength is 0.
@retval EFI_ABORTED Operation aborted.
@retval Other Error happened while parsing message body.
**/
EFI_STATUS
EFIAPI
HttpParseMessageBody (
IN OUT VOID *MsgParser,
IN UINTN BodyLength,
IN CHAR8 *Body
);
/**
Check whether the message-body is complete or not.
@param[in] MsgParser Pointer to the message parser.
@retval TRUE Message-body is complete.
@retval FALSE Message-body is not complete.
**/
BOOLEAN
EFIAPI
HttpIsMessageComplete (
IN VOID *MsgParser
);
/**
Get the content length of the entity.
Note that in trunk transfer, the entity length is not valid until the whole message body is received.
@param[in] MsgParser Pointer to the message parser.
@param[out] ContentLength Pointer to store the length of the entity.
@retval EFI_SUCCESS Successfully to get the entity length.
@retval EFI_NOT_READY Entity length is not valid yet.
@retval EFI_INVALID_PARAMETER MsgParser is NULL or ContentLength is NULL.
**/
EFI_STATUS
EFIAPI
HttpGetEntityLength (
IN VOID *MsgParser,
OUT UINTN *ContentLength
);
/**
Release the resource of the message parser.
@param[in] MsgParser Pointer to the message parser.
**/
VOID
EFIAPI
HttpFreeMsgParser (
IN VOID *MsgParser
);
/**
Find a specified header field according to the field name.
@param[in] HeaderCount Number of HTTP header structures in Headers list.
@param[in] Headers Array containing list of HTTP headers.
@param[in] FieldName Null terminated string which describes a field name.
@return Pointer to the found header or NULL.
**/
EFI_HTTP_HEADER *
EFIAPI
HttpFindHeader (
IN UINTN HeaderCount,
IN EFI_HTTP_HEADER *Headers,
IN CHAR8 *FieldName
);
/**
Set FieldName and FieldValue into specified HttpHeader.
@param[in,out] HttpHeader Specified HttpHeader.
@param[in] FieldName FieldName of this HttpHeader, a NULL terminated ASCII string.
@param[in] FieldValue FieldValue of this HttpHeader, a NULL terminated ASCII string.
@retval EFI_SUCCESS The FieldName and FieldValue are set into HttpHeader successfully.
@retval EFI_INVALID_PARAMETER The parameter is invalid.
@retval EFI_OUT_OF_RESOURCES Failed to allocate resources.
**/
EFI_STATUS
EFIAPI
HttpSetFieldNameAndValue (
IN OUT EFI_HTTP_HEADER *HttpHeader,
IN CONST CHAR8 *FieldName,
IN CONST CHAR8 *FieldValue
);
/**
Get one key/value header pair from the raw string.
@param[in] String Pointer to the raw string.
@param[out] FieldName Points directly to field name within 'HttpHeader'.
@param[out] FieldValue Points directly to field value within 'HttpHeader'.
@return Pointer to the next raw string.
@return NULL if no key/value header pair from this raw string.
**/
CHAR8 *
EFIAPI
HttpGetFieldNameAndValue (
IN CHAR8 *String,
OUT CHAR8 **FieldName,
OUT CHAR8 **FieldValue
);
/**
Free existing HeaderFields.
@param[in] HeaderFields Pointer to array of key/value header pairs waiting for free.
@param[in] FieldCount The number of header pairs in HeaderFields.
**/
VOID
EFIAPI
HttpFreeHeaderFields (
IN EFI_HTTP_HEADER *HeaderFields,
IN UINTN FieldCount
);
/**
Generate HTTP request message.
This function will allocate memory for the whole HTTP message and generate a
well formatted HTTP Request message in it, include the Request-Line, header
fields and also the message body. It is the caller's responsibility to free
the buffer returned in *RequestMsg.
@param[in] Message Pointer to the EFI_HTTP_MESSAGE structure which
contains the required information to generate
the HTTP request message.
@param[in] Url The URL of a remote host.
@param[out] RequestMsg Pointer to the created HTTP request message.
NULL if any error occured.
@param[out] RequestMsgSize Size of the RequestMsg (in bytes).
@retval EFI_SUCCESS If HTTP request string was created successfully.
@retval EFI_OUT_OF_RESOURCES Failed to allocate resources.
@retval EFI_INVALID_PARAMETER The input arguments are invalid.
**/
EFI_STATUS
EFIAPI
HttpGenRequestMessage (
IN CONST EFI_HTTP_MESSAGE *Message,
IN CONST CHAR8 *Url,
OUT CHAR8 **RequestMsg,
OUT UINTN *RequestMsgSize
);
/**
Translate the status code in HTTP message to EFI_HTTP_STATUS_CODE defined
in UEFI 2.5 specification.
@param[in] StatusCode The status code value in HTTP message.
@return Value defined in EFI_HTTP_STATUS_CODE .
**/
EFI_HTTP_STATUS_CODE
EFIAPI
HttpMappingToStatusCode (
IN UINTN StatusCode
);
/**
Check whether header field called FieldName is in DeleteList.
@param[in] DeleteList Pointer to array of key/value header pairs.
@param[in] DeleteCount The number of header pairs.
@param[in] FieldName Pointer to header field's name.
@return TRUE if FieldName is not in DeleteList, that means this header field is valid.
@return FALSE if FieldName is in DeleteList, that means this header field is invalid.
**/
BOOLEAN
EFIAPI
HttpIsValidHttpHeader (
IN CHAR8 *DeleteList[],
IN UINTN DeleteCount,
IN CHAR8 *FieldName
);
#endif

View File

@@ -1,607 +0,0 @@
/** @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

File diff suppressed because it is too large Load Diff

View File

@@ -1,247 +0,0 @@
/** @file
This library is used to share code between UEFI network stack modules.
It provides the helper routines to access TCP service.
Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#ifndef _TCP_IO_H_
#define _TCP_IO_H_
#include <Protocol/Tcp4.h>
#include <Protocol/Tcp6.h>
#include <Library/NetLib.h>
#define TCP_VERSION_4 IP_VERSION_4
#define TCP_VERSION_6 IP_VERSION_6
///
/// 10 seconds
///
#define TCP_GET_MAPPING_TIMEOUT 100000000U
typedef struct {
EFI_IPv4_ADDRESS LocalIp;
EFI_IPv4_ADDRESS SubnetMask;
EFI_IPv4_ADDRESS Gateway;
UINT16 StationPort;
EFI_IPv4_ADDRESS RemoteIp;
UINT16 RemotePort;
BOOLEAN ActiveFlag;
} TCP4_IO_CONFIG_DATA;
typedef struct {
UINT16 StationPort;
EFI_IPv6_ADDRESS RemoteIp;
UINT16 RemotePort;
BOOLEAN ActiveFlag;
} TCP6_IO_CONFIG_DATA;
typedef union {
TCP4_IO_CONFIG_DATA Tcp4IoConfigData;
TCP6_IO_CONFIG_DATA Tcp6IoConfigData;
} TCP_IO_CONFIG_DATA;
typedef union {
EFI_TCP4_PROTOCOL *Tcp4;
EFI_TCP6_PROTOCOL *Tcp6;
} TCP_IO_PROTOCOL;
typedef union {
EFI_TCP4_CONNECTION_TOKEN Tcp4Token;
EFI_TCP6_CONNECTION_TOKEN Tcp6Token;
} TCP_IO_CONNECTION_TOKEN;
typedef union {
EFI_TCP4_IO_TOKEN Tcp4Token;
EFI_TCP6_IO_TOKEN Tcp6Token;
} TCP_IO_IO_TOKEN;
typedef union {
EFI_TCP4_CLOSE_TOKEN Tcp4Token;
EFI_TCP6_CLOSE_TOKEN Tcp6Token;
} TCP_IO_CLOSE_TOKEN;
typedef union {
EFI_TCP4_LISTEN_TOKEN Tcp4Token;
EFI_TCP6_LISTEN_TOKEN Tcp6Token;
} TCP_IO_LISTEN_TOKEN;
typedef struct {
UINT8 TcpVersion;
EFI_HANDLE Image;
EFI_HANDLE Controller;
EFI_HANDLE Handle;
TCP_IO_PROTOCOL Tcp;
TCP_IO_PROTOCOL NewTcp;
TCP_IO_CONNECTION_TOKEN ConnToken;
TCP_IO_IO_TOKEN TxToken;
TCP_IO_IO_TOKEN RxToken;
TCP_IO_CLOSE_TOKEN CloseToken;
TCP_IO_LISTEN_TOKEN ListenToken;
BOOLEAN IsConnDone;
BOOLEAN IsTxDone;
BOOLEAN IsRxDone;
BOOLEAN IsCloseDone;
BOOLEAN IsListenDone;
} TCP_IO;
/**
Create a TCP socket with the specified configuration data.
@param[in] Image The handle of the driver image.
@param[in] Controller The handle of the controller.
@param[in] TcpVersion The version of Tcp, TCP_VERSION_4 or TCP_VERSION_6.
@param[in] ConfigData The Tcp configuration data.
@param[out] TcpIo The TcpIo.
@retval EFI_SUCCESS The TCP socket is created and configured.
@retval EFI_INVALID_PARAMETER One or more parameters are invalid.
@retval EFI_UNSUPPORTED One or more of the control options are not
supported in the implementation.
@retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
@retval Others Failed to create the TCP socket or configure it.
**/
EFI_STATUS
EFIAPI
TcpIoCreateSocket (
IN EFI_HANDLE Image,
IN EFI_HANDLE Controller,
IN UINT8 TcpVersion,
IN TCP_IO_CONFIG_DATA *ConfigData,
OUT TCP_IO *TcpIo
);
/**
Destroy the socket.
@param[in] TcpIo The TcpIo which wraps the socket to be destroyed.
**/
VOID
EFIAPI
TcpIoDestroySocket (
IN TCP_IO *TcpIo
);
/**
Connect to the other endpoint of the TCP socket.
@param[in, out] TcpIo The TcpIo wrapping the TCP socket.
@param[in] Timeout The time to wait for connection done. Set to NULL for infinite wait.
@retval EFI_SUCCESS Connect to the other endpoint of the TCP socket
successfully.
@retval EFI_TIMEOUT Failed to connect to the other endpoint of the
TCP socket in the specified time period.
@retval EFI_INVALID_PARAMETER One or more parameters are invalid.
@retval EFI_UNSUPPORTED One or more of the control options are not
supported in the implementation.
@retval Others Other errors as indicated.
**/
EFI_STATUS
EFIAPI
TcpIoConnect (
IN OUT TCP_IO *TcpIo,
IN EFI_EVENT Timeout OPTIONAL
);
/**
Accept the incomding request from the other endpoint of the TCP socket.
@param[in, out] TcpIo The TcpIo wrapping the TCP socket.
@param[in] Timeout The time to wait for connection done. Set to NULL for infinite wait.
@retval EFI_SUCCESS Connect to the other endpoint of the TCP socket
successfully.
@retval EFI_INVALID_PARAMETER One or more parameters are invalid.
@retval EFI_UNSUPPORTED One or more of the control options are not
supported in the implementation.
@retval EFI_TIMEOUT Failed to connect to the other endpoint of the
TCP socket in the specified time period.
@retval Others Other errors as indicated.
**/
EFI_STATUS
EFIAPI
TcpIoAccept (
IN OUT TCP_IO *TcpIo,
IN EFI_EVENT Timeout OPTIONAL
);
/**
Reset the socket.
@param[in, out] TcpIo The TcpIo wrapping the TCP socket.
**/
VOID
EFIAPI
TcpIoReset (
IN OUT TCP_IO *TcpIo
);
/**
Transmit the Packet to the other endpoint of the socket.
@param[in] TcpIo The TcpIo wrapping the TCP socket.
@param[in] Packet The packet to transmit.
@retval EFI_SUCCESS The packet is trasmitted.
@retval EFI_INVALID_PARAMETER One or more parameters are invalid.
@retval EFI_UNSUPPORTED One or more of the control options are not
supported in the implementation.
@retval EFI_OUT_OF_RESOURCES Failed to allocate memory.
@retval EFI_DEVICE_ERROR An unexpected network or system error occurred.
@retval Others Other errors as indicated.
**/
EFI_STATUS
EFIAPI
TcpIoTransmit (
IN TCP_IO *TcpIo,
IN NET_BUF *Packet
);
/**
Receive data from the socket.
@param[in, out] TcpIo The TcpIo which wraps the socket to be destroyed.
@param[in] Packet The buffer to hold the data copy from the socket rx buffer.
@param[in] AsyncMode Is this receive asyncronous or not.
@param[in] Timeout The time to wait for receiving the amount of data the Packet
can hold. Set to NULL for infinite wait.
@retval EFI_SUCCESS The required amount of data is received from the socket.
@retval EFI_INVALID_PARAMETER One or more parameters are invalid.
@retval EFI_DEVICE_ERROR An unexpected network or system error occurred.
@retval EFI_OUT_OF_RESOURCES Failed to allocate momery.
@retval EFI_TIMEOUT Failed to receive the required amount of data in the
specified time period.
@retval Others Other errors as indicated.
**/
EFI_STATUS
EFIAPI
TcpIoReceive (
IN OUT TCP_IO *TcpIo,
IN NET_BUF *Packet,
IN BOOLEAN AsyncMode,
IN EFI_EVENT Timeout OPTIONAL
);
#endif

View File

@@ -1,363 +0,0 @@
/** @file
This library is used to share code between UEFI network stack modules.
It provides the helper routines to access UDP service. It is used by both DHCP and MTFTP.
Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#ifndef _UDP_IO_H_
#define _UDP_IO_H_
#include <Protocol/Udp4.h>
#include <Protocol/Udp6.h>
#include <Library/NetLib.h>
typedef struct _UDP_IO UDP_IO;
///
/// Signatures used by UdpIo Library.
///
#define UDP_IO_RX_SIGNATURE SIGNATURE_32 ('U', 'D', 'P', 'R')
#define UDP_IO_TX_SIGNATURE SIGNATURE_32 ('U', 'D', 'P', 'T')
#define UDP_IO_SIGNATURE SIGNATURE_32 ('U', 'D', 'P', 'I')
#define UDP_IO_UDP4_VERSION 4
#define UDP_IO_UDP6_VERSION 6
///
/// The UDP address pair.
///
typedef struct {
EFI_IP_ADDRESS LocalAddr;
UINT16 LocalPort;
EFI_IP_ADDRESS RemoteAddr;
UINT16 RemotePort;
} UDP_END_POINT;
/**
Prototype called when receiving or sending packets to or from a UDP point.
This prototype is used by both receive and sending when calling
UdpIoRecvDatagram() or UdpIoSendDatagram(). When receiving, Netbuf is allocated by the
UDP access point and released by the user. When sending, the user allocates the the NetBuf,
which is then provided to the callback as a reference.
@param[in] Packet The packet received or sent.
@param[in] EndPoint The UDP address pair corresponds to the UDP IO.
@param[in] IoStatus The packet receiving or sending status.
@param[in] Context The user-defined data when calling UdpIoRecvDatagram() or
UdpIoSendDatagram().
**/
typedef
VOID
(EFIAPI *UDP_IO_CALLBACK) (
IN NET_BUF *Packet,
IN UDP_END_POINT *EndPoint,
IN EFI_STATUS IoStatus,
IN VOID *Context
);
///
/// This structure is used internally by the UdpIo Library.
///
/// Each receive request is wrapped in an UDP_RX_TOKEN. Upon completion,
/// the CallBack will be called. Only one receive request is sent to UDP at a
/// time. HeadLen gives the length of the application's header. UDP_IO will
/// make the application's header continuous before delivering up.
///
typedef union {
EFI_UDP4_COMPLETION_TOKEN Udp4;
EFI_UDP6_COMPLETION_TOKEN Udp6;
} UDP_COMPLETION_TOKEN;
typedef struct {
UINT32 Signature;
UDP_IO *UdpIo;
UDP_IO_CALLBACK CallBack;
VOID *Context;
UINT32 HeadLen;
UDP_COMPLETION_TOKEN Token;
} UDP_RX_TOKEN;
///
/// This structure is used internally by UdpIo Library.
///
/// Each transmit request is wrapped in an UDP_TX_TOKEN. Upon completion,
/// the CallBack will be called. There can be several transmit requests. All transmit
/// requests are linked in a list.
///
typedef union {
EFI_UDP4_SESSION_DATA Udp4;
EFI_UDP6_SESSION_DATA Udp6;
} UDP_SESSION_DATA;
typedef union {
EFI_UDP4_TRANSMIT_DATA Udp4;
EFI_UDP6_TRANSMIT_DATA Udp6;
} UDP_TRANSMIT_DATA;
typedef struct {
UINT32 Signature;
LIST_ENTRY Link;
UDP_IO *UdpIo;
UDP_IO_CALLBACK CallBack;
NET_BUF *Packet;
VOID *Context;
EFI_IPv4_ADDRESS Gateway;
UDP_SESSION_DATA Session;
UDP_COMPLETION_TOKEN Token;
UDP_TRANSMIT_DATA Data;
} UDP_TX_TOKEN;
///
/// Type defined as UDP_IO.
///
/// This data structure wraps the UDP instance and configuration.
/// UdpIo Library uses this structure for all Udp4 or Udp6 operations.
///
struct _UDP_IO {
UINT32 Signature;
LIST_ENTRY Link;
INTN RefCnt;
UINT8 UdpVersion;
//
// Handle used to create/destroy UDP child
//
EFI_HANDLE Controller;
EFI_HANDLE Image;
EFI_HANDLE UdpHandle;
EFI_SIMPLE_NETWORK_MODE SnpMode;
LIST_ENTRY SentDatagram; ///< A list of UDP_TX_TOKEN.
UDP_RX_TOKEN *RecvRequest;
union {
EFI_UDP4_PROTOCOL *Udp4;
EFI_UDP6_PROTOCOL *Udp6;
} Protocol;
union {
EFI_UDP4_CONFIG_DATA Udp4;
EFI_UDP6_CONFIG_DATA Udp6;
} Config;
};
/**
The prototype called when UdpIo Library configures a UDP instance.
The prototype is set and called when creating a UDP_IO in UdpIoCreatePort().
@param[in] UdpIo The UDP_IO to configure.
@param[in] Context The user-defined data when calling UdpIoCreatePort().
@retval EFI_SUCCESS The configuration succeeded.
@retval Others The UDP_IO fails to configure indicating
UdpIoCreatePort() should fail.
**/
typedef
EFI_STATUS
(EFIAPI *UDP_IO_CONFIG) (
IN UDP_IO *UdpIo,
IN VOID *Context
);
/**
The select function to decide whether to cancel the UDP_TX_TOKEN.
@param[in] Token The UDP_TX_TOKEN to decide whether to cancel.
@param[in] Context User-defined data in UdpIoCancelDgrams().
@retval TRUE Cancel the UDP_TX_TOKEN.
@retval FALSE Do not cancel this UDP_TX_TOKEN.
**/
typedef
BOOLEAN
(EFIAPI *UDP_IO_TO_CANCEL) (
IN UDP_TX_TOKEN *Token,
IN VOID *Context
);
/**
Cancel all the sent datagram that pass the selection criteria of ToCancel.
If ToCancel is NULL, all the datagrams are cancelled.
If Udp version is not UDP_IO_UDP4_VERSION or UDP_IO_UDP6_VERSION, then ASSERT().
@param[in] UdpIo The UDP_IO to cancel packet.
@param[in] IoStatus The IoStatus to return to the packet owners.
@param[in] ToCancel The select funtion to test whether to cancel this
packet or not.
@param[in] Context The opaque parameter to the ToCancel.
**/
VOID
EFIAPI
UdpIoCancelDgrams (
IN UDP_IO *UdpIo,
IN EFI_STATUS IoStatus,
IN UDP_IO_TO_CANCEL ToCancel, OPTIONAL
IN VOID *Context OPTIONAL
);
/**
Creates a UDP_IO to access the UDP service. It creates and configures
a UDP child.
If Configure is NULL, then ASSERT().
If Udp version is not UDP_IO_UDP4_VERSION or UDP_IO_UDP6_VERSION, then ASSERT().
It locates the UDP service binding prototype on the Controller parameter
uses the UDP service binding prototype to create a UDP child (also known as
a UDP instance) configures the UDP child by calling Configure function prototype.
Any failures in creating or configuring the UDP child return NULL for failure.
@param[in] Controller The controller that has the UDP service binding.
protocol installed.
@param[in] ImageHandle The image handle for the driver.
@param[in] Configure The function to configure the created UDP child.
@param[in] UdpVersion The UDP protocol version, UDP4 or UDP6.
@param[in] Context The opaque parameter for the Configure funtion.
@return The newly-created UDP_IO, or NULL if failed.
**/
UDP_IO *
EFIAPI
UdpIoCreateIo (
IN EFI_HANDLE Controller,
IN EFI_HANDLE ImageHandle,
IN UDP_IO_CONFIG Configure,
IN UINT8 UdpVersion,
IN VOID *Context
);
/**
Free the UDP_IO and all its related resources.
If Udp version is not UDP_IO_UDP4_VERSION or UDP_IO_UDP6_VERSION, then ASSERT().
The function cancels all sent datagrams and receive requests.
@param[in] UdpIo The UDP_IO to free.
@retval EFI_SUCCESS The UDP_IO is freed.
@retval Others Failed to free UDP_IO.
**/
EFI_STATUS
EFIAPI
UdpIoFreeIo (
IN UDP_IO *UdpIo
);
/**
Cleans up the UDP_IO without freeing it. Call this function
if you intend to later re-use the UDP_IO.
If Udp version is not UDP_IO_UDP4_VERSION or UDP_IO_UDP6_VERSION, then ASSERT().
This function releases all transmitted datagrams and receive requests and configures NULL for the UDP instance.
@param[in] UdpIo The UDP_IO to clean up.
**/
VOID
EFIAPI
UdpIoCleanIo (
IN UDP_IO *UdpIo
);
/**
Send a packet through the UDP_IO.
If Udp version is not UDP_IO_UDP4_VERSION or UDP_IO_UDP6_VERSION, then ASSERT().
The packet will be wrapped in UDP_TX_TOKEN. Function Callback will be called
when the packet is sent. The optional parameter EndPoint overrides the default
address pair if specified.
@param[in] UdpIo The UDP_IO to send the packet through.
@param[in] Packet The packet to send.
@param[in] EndPoint The local and remote access point. Override the
default address pair set during configuration.
@param[in] Gateway The gateway to use.
@param[in] CallBack The function being called when packet is
transmitted or failed.
@param[in] Context The opaque parameter passed to CallBack.
@retval EFI_OUT_OF_RESOURCES Failed to allocate resource for the packet.
@retval EFI_SUCCESS The packet is successfully delivered to UDP for
transmission.
**/
EFI_STATUS
EFIAPI
UdpIoSendDatagram (
IN UDP_IO *UdpIo,
IN NET_BUF *Packet,
IN UDP_END_POINT *EndPoint OPTIONAL,
IN EFI_IP_ADDRESS *Gateway OPTIONAL,
IN UDP_IO_CALLBACK CallBack,
IN VOID *Context
);
/**
Cancel a single sent datagram.
@param[in] UdpIo The UDP_IO from which to cancel the packet
@param[in] Packet The packet to cancel
**/
VOID
EFIAPI
UdpIoCancelSentDatagram (
IN UDP_IO *UdpIo,
IN NET_BUF *Packet
);
/**
Issue a receive request to the UDP_IO.
If Udp version is not UDP_IO_UDP4_VERSION or UDP_IO_UDP6_VERSION, then ASSERT().
This function is called when upper-layer needs packet from UDP for processing.
Only one receive request is acceptable at a time. Therefore, one common usage model is
to invoke this function inside its Callback function when the former packet
is processed.
@param[in] UdpIo The UDP_IO to receive the packet from.
@param[in] CallBack The call back function to execute when the packet
is received.
@param[in] Context The opaque context passed to Callback.
@param[in] HeadLen The length of the upper-layer's protocol header.
@retval EFI_ALREADY_STARTED There is already a pending receive request. Only
one receive request is supported at a time.
@retval EFI_OUT_OF_RESOURCES Failed to allocate needed resources.
@retval EFI_SUCCESS The receive request was issued successfully.
@retval EFI_UNSUPPORTED The UDP version in UDP_IO is not supported.
**/
EFI_STATUS
EFIAPI
UdpIoRecvDatagram (
IN UDP_IO *UdpIo,
IN UDP_IO_CALLBACK CallBack,
IN VOID *Context,
IN UINT32 HeadLen
);
#endif