+++ /dev/null
-/** @file\r
- DpcLib.h.\r
-\r
-Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>\r
-SPDX-License-Identifier: BSD-2-Clause-Patent\r
-\r
-**/\r
-\r
-#ifndef _DPC_LIB_H_\r
-#define _DPC_LIB_H_\r
-\r
-#include <Protocol/Dpc.h>\r
-\r
-/**\r
- Add a Deferred Procedure Call to the end of the DPC queue.\r
-\r
- @param[in] DpcTpl The EFI_TPL that the DPC should invoke.\r
- @param[in] DpcProcedure The pointer to the DPC's function.\r
- @param[in] DpcContext The pointer to the DPC's context. Passed to DpcProcedure\r
- when DpcProcedure is invoked.\r
-\r
- @retval EFI_SUCCESS The DPC was queued.\r
- @retval EFI_INVALID_PARAMETER DpcTpl is not a valid EFI_TPL.\r
- @retval EFI_INVALID_PARAMETER DpcProcedure is NULL.\r
- @retval EFI_OUT_OF_RESOURCES There are not enough resources available to\r
- add the DPC to the queue.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-QueueDpc (\r
- IN EFI_TPL DpcTpl,\r
- IN EFI_DPC_PROCEDURE DpcProcedure,\r
- IN VOID *DpcContext OPTIONAL\r
- );\r
-\r
-/**\r
- Dispatch the queue of DPCs. All DPCs that have been queued with a DpcTpl\r
- value greater than or equal to the current TPL are invoked in the order that\r
- they were queued. DPCs with higher DpcTpl values are invoked before DPCs with\r
- lower DpcTpl values.\r
-\r
- @retval EFI_SUCCESS One or more DPCs were invoked.\r
- @retval EFI_NOT_FOUND No DPCs were invoked.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-DispatchDpc (\r
- VOID\r
- );\r
-\r
-#endif\r
+++ /dev/null
-/** @file\r
- This library is used to share code between UEFI network stack modules.\r
- It provides the helper routines to parse the HTTP message byte stream.\r
-\r
-Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.<BR>\r
-(C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>\r
-SPDX-License-Identifier: BSD-2-Clause-Patent\r
-\r
-**/\r
-\r
-#ifndef _HTTP_LIB_H_\r
-#define _HTTP_LIB_H_\r
-\r
-#include <Protocol/Http.h>\r
-\r
-\r
-/**\r
- Decode a percent-encoded URI component to the ASCII character.\r
-\r
- Decode the input component in Buffer according to RFC 3986. The caller is responsible to make\r
- sure ResultBuffer points to a buffer with size equal or greater than ((AsciiStrSize (Buffer))\r
- in bytes.\r
-\r
- @param[in] Buffer The pointer to a percent-encoded URI component.\r
- @param[in] BufferLength Length of Buffer in bytes.\r
- @param[out] ResultBuffer Point to the buffer to store the decode result.\r
- @param[out] ResultLength Length of decoded string in ResultBuffer in bytes.\r
-\r
- @retval EFI_SUCCESS Successfully decoded the URI.\r
- @retval EFI_INVALID_PARAMETER Buffer is not a valid percent-encoded string.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-UriPercentDecode (\r
- IN CHAR8 *Buffer,\r
- IN UINT32 BufferLength,\r
- OUT CHAR8 *ResultBuffer,\r
- OUT UINT32 *ResultLength\r
- );\r
-\r
-/**\r
- Create a URL parser for the input URL string.\r
-\r
- This function will parse and dereference the input HTTP URL into it components. The original\r
- content of the URL won't be modified and the result will be returned in UrlParser, which can\r
- be used in other functions like NetHttpUrlGetHostName(). It is the caller's responsibility to\r
- free the buffer returned in *UrlParser by HttpUrlFreeParser().\r
-\r
- @param[in] Url The pointer to a HTTP URL string.\r
- @param[in] Length Length of Url in bytes.\r
- @param[in] IsConnectMethod Whether the Url is used in HTTP CONNECT method or not.\r
- @param[out] UrlParser Pointer to the returned buffer to store the parse result.\r
-\r
- @retval EFI_SUCCESS Successfully dereferenced the HTTP URL.\r
- @retval EFI_INVALID_PARAMETER UrlParser is NULL or Url is not a valid HTTP URL.\r
- @retval EFI_OUT_OF_RESOURCES Could not allocate needed resources.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-HttpParseUrl (\r
- IN CHAR8 *Url,\r
- IN UINT32 Length,\r
- IN BOOLEAN IsConnectMethod,\r
- OUT VOID **UrlParser\r
- );\r
-\r
-/**\r
- Get the Hostname from a HTTP URL.\r
-\r
- This function will return the HostName according to the Url and previous parse result ,and\r
- it is the caller's responsibility to free the buffer returned in *HostName.\r
-\r
- @param[in] Url The pointer to a HTTP URL string.\r
- @param[in] UrlParser URL Parse result returned by NetHttpParseUrl().\r
- @param[out] HostName Pointer to a buffer to store the HostName.\r
-\r
- @retval EFI_SUCCESS Successfully get the required component.\r
- @retval EFI_INVALID_PARAMETER Uri is NULL or HostName is NULL or UrlParser is invalid.\r
- @retval EFI_NOT_FOUND No hostName component in the URL.\r
- @retval EFI_OUT_OF_RESOURCES Could not allocate needed resources.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-HttpUrlGetHostName (\r
- IN CHAR8 *Url,\r
- IN VOID *UrlParser,\r
- OUT CHAR8 **HostName\r
- );\r
-\r
-/**\r
- Get the IPv4 address from a HTTP URL.\r
-\r
- This function will return the IPv4 address according to the Url and previous parse result.\r
-\r
- @param[in] Url The pointer to a HTTP URL string.\r
- @param[in] UrlParser URL Parse result returned by NetHttpParseUrl().\r
- @param[out] Ip4Address Pointer to a buffer to store the IP address.\r
-\r
- @retval EFI_SUCCESS Successfully get the required component.\r
- @retval EFI_INVALID_PARAMETER Uri is NULL or Ip4Address is NULL or UrlParser is invalid.\r
- @retval EFI_NOT_FOUND No IPv4 address component in the URL.\r
- @retval EFI_OUT_OF_RESOURCES Could not allocate needed resources.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-HttpUrlGetIp4 (\r
- IN CHAR8 *Url,\r
- IN VOID *UrlParser,\r
- OUT EFI_IPv4_ADDRESS *Ip4Address\r
- );\r
-\r
-/**\r
- Get the IPv6 address from a HTTP URL.\r
-\r
- This function will return the IPv6 address according to the Url and previous parse result.\r
-\r
- @param[in] Url The pointer to a HTTP URL string.\r
- @param[in] UrlParser URL Parse result returned by NetHttpParseUrl().\r
- @param[out] Ip6Address Pointer to a buffer to store the IP address.\r
-\r
- @retval EFI_SUCCESS Successfully get the required component.\r
- @retval EFI_INVALID_PARAMETER Uri is NULL or Ip6Address is NULL or UrlParser is invalid.\r
- @retval EFI_NOT_FOUND No IPv6 address component in the URL.\r
- @retval EFI_OUT_OF_RESOURCES Could not allocate needed resources.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-HttpUrlGetIp6 (\r
- IN CHAR8 *Url,\r
- IN VOID *UrlParser,\r
- OUT EFI_IPv6_ADDRESS *Ip6Address\r
- );\r
-\r
-/**\r
- Get the port number from a HTTP URL.\r
-\r
- This function will return the port number according to the Url and previous parse result.\r
-\r
- @param[in] Url The pointer to a HTTP URL string.\r
- @param[in] UrlParser URL Parse result returned by NetHttpParseUrl().\r
- @param[out] Port Pointer to a buffer to store the port number.\r
-\r
- @retval EFI_SUCCESS Successfully get the required component.\r
- @retval EFI_INVALID_PARAMETER Uri is NULL or Port is NULL or UrlParser is invalid.\r
- @retval EFI_NOT_FOUND No port number in the URL.\r
- @retval EFI_OUT_OF_RESOURCES Could not allocate needed resources.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-HttpUrlGetPort (\r
- IN CHAR8 *Url,\r
- IN VOID *UrlParser,\r
- OUT UINT16 *Port\r
- );\r
-\r
-/**\r
- Get the Path from a HTTP URL.\r
-\r
- This function will return the Path according to the Url and previous parse result,and\r
- it is the caller's responsibility to free the buffer returned in *Path.\r
-\r
- @param[in] Url The pointer to a HTTP URL string.\r
- @param[in] UrlParser URL Parse result returned by NetHttpParseUrl().\r
- @param[out] Path Pointer to a buffer to store the Path.\r
-\r
- @retval EFI_SUCCESS Successfully get the required component.\r
- @retval EFI_INVALID_PARAMETER Uri is NULL or HostName is NULL or UrlParser is invalid.\r
- @retval EFI_NOT_FOUND No hostName component in the URL.\r
- @retval EFI_OUT_OF_RESOURCES Could not allocate needed resources.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-HttpUrlGetPath (\r
- IN CHAR8 *Url,\r
- IN VOID *UrlParser,\r
- OUT CHAR8 **Path\r
- );\r
-\r
-/**\r
- Release the resource of the URL parser.\r
-\r
- @param[in] UrlParser Pointer to the parser.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-HttpUrlFreeParser (\r
- IN VOID *UrlParser\r
- );\r
-\r
-//\r
-// HTTP body parser interface.\r
-//\r
-\r
-typedef enum {\r
- //\r
- // Part of entity data.\r
- // Length of entity body in Data.\r
- //\r
- BodyParseEventOnData,\r
- //\r
- // End of message body.\r
- // Length is 0 and Data points to next byte after the end of the message.\r
- //\r
- BodyParseEventOnComplete\r
-} HTTP_BODY_PARSE_EVENT;\r
-\r
-/**\r
- A callback function to intercept events during message parser.\r
-\r
- This function will be invoked during HttpParseMessageBody() with various events type. An error\r
- return status of the callback function will cause the HttpParseMessageBody() aborted.\r
-\r
- @param[in] EventType Event type of this callback call.\r
- @param[in] Data A pointer to data buffer.\r
- @param[in] Length Length in bytes of the Data.\r
- @param[in] Context Callback context set by HttpInitMsgParser().\r
-\r
- @retval EFI_SUCCESS Continue to parser the message body.\r
- @retval Others Abort the parse.\r
-\r
-**/\r
-typedef\r
-EFI_STATUS\r
-(EFIAPI *HTTP_BODY_PARSER_CALLBACK) (\r
- IN HTTP_BODY_PARSE_EVENT EventType,\r
- IN CHAR8 *Data,\r
- IN UINTN Length,\r
- IN VOID *Context\r
-);\r
-\r
-/**\r
- Initialize a HTTP message-body parser.\r
-\r
- This function will create and initialize a HTTP message parser according to caller provided HTTP message\r
- header information. It is the caller's responsibility to free the buffer returned in *UrlParser by HttpFreeMsgParser().\r
-\r
- @param[in] Method The HTTP method (e.g. GET, POST) for this HTTP message.\r
- @param[in] StatusCode Response status code returned by the remote host.\r
- @param[in] HeaderCount Number of HTTP header structures in Headers.\r
- @param[in] Headers Array containing list of HTTP headers.\r
- @param[in] Callback Callback function that is invoked when parsing the HTTP message-body,\r
- set to NULL to ignore all events.\r
- @param[in] Context Pointer to the context that will be passed to Callback.\r
- @param[out] MsgParser Pointer to the returned buffer to store the message parser.\r
-\r
- @retval EFI_SUCCESS Successfully initialized the parser.\r
- @retval EFI_OUT_OF_RESOURCES Could not allocate needed resources.\r
- @retval EFI_INVALID_PARAMETER MsgParser is NULL or HeaderCount is not NULL but Headers is NULL.\r
- @retval Others Failed to initialize the parser.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-HttpInitMsgParser (\r
- IN EFI_HTTP_METHOD Method,\r
- IN EFI_HTTP_STATUS_CODE StatusCode,\r
- IN UINTN HeaderCount,\r
- IN EFI_HTTP_HEADER *Headers,\r
- IN HTTP_BODY_PARSER_CALLBACK Callback,\r
- IN VOID *Context,\r
- OUT VOID **MsgParser\r
- );\r
-\r
-/**\r
- Parse message body.\r
-\r
- Parse BodyLength of message-body. This function can be called repeatedly to parse the message-body partially.\r
-\r
- @param[in, out] MsgParser Pointer to the message parser.\r
- @param[in] BodyLength Length in bytes of the Body.\r
- @param[in] Body Pointer to the buffer of the message-body to be parsed.\r
-\r
- @retval EFI_SUCCESS Successfully parse the message-body.\r
- @retval EFI_INVALID_PARAMETER MsgParser is NULL or Body is NULL or BodyLength is 0.\r
- @retval EFI_ABORTED Operation aborted.\r
- @retval Other Error happened while parsing message body.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-HttpParseMessageBody (\r
- IN OUT VOID *MsgParser,\r
- IN UINTN BodyLength,\r
- IN CHAR8 *Body\r
- );\r
-\r
-/**\r
- Check whether the message-body is complete or not.\r
-\r
- @param[in] MsgParser Pointer to the message parser.\r
-\r
- @retval TRUE Message-body is complete.\r
- @retval FALSE Message-body is not complete.\r
-\r
-**/\r
-BOOLEAN\r
-EFIAPI\r
-HttpIsMessageComplete (\r
- IN VOID *MsgParser\r
- );\r
-\r
-/**\r
- Get the content length of the entity.\r
-\r
- Note that in trunk transfer, the entity length is not valid until the whole message body is received.\r
-\r
- @param[in] MsgParser Pointer to the message parser.\r
- @param[out] ContentLength Pointer to store the length of the entity.\r
-\r
- @retval EFI_SUCCESS Successfully to get the entity length.\r
- @retval EFI_NOT_READY Entity length is not valid yet.\r
- @retval EFI_INVALID_PARAMETER MsgParser is NULL or ContentLength is NULL.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-HttpGetEntityLength (\r
- IN VOID *MsgParser,\r
- OUT UINTN *ContentLength\r
- );\r
-\r
-/**\r
- Release the resource of the message parser.\r
-\r
- @param[in] MsgParser Pointer to the message parser.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-HttpFreeMsgParser (\r
- IN VOID *MsgParser\r
- );\r
-\r
-\r
-/**\r
- Find a specified header field according to the field name.\r
-\r
- @param[in] HeaderCount Number of HTTP header structures in Headers list.\r
- @param[in] Headers Array containing list of HTTP headers.\r
- @param[in] FieldName Null terminated string which describes a field name.\r
-\r
- @return Pointer to the found header or NULL.\r
-\r
-**/\r
-EFI_HTTP_HEADER *\r
-EFIAPI\r
-HttpFindHeader (\r
- IN UINTN HeaderCount,\r
- IN EFI_HTTP_HEADER *Headers,\r
- IN CHAR8 *FieldName\r
- );\r
-\r
-/**\r
- Set FieldName and FieldValue into specified HttpHeader.\r
-\r
- @param[in,out] HttpHeader Specified HttpHeader.\r
- @param[in] FieldName FieldName of this HttpHeader, a NULL terminated ASCII string.\r
- @param[in] FieldValue FieldValue of this HttpHeader, a NULL terminated ASCII string.\r
-\r
-\r
- @retval EFI_SUCCESS The FieldName and FieldValue are set into HttpHeader successfully.\r
- @retval EFI_INVALID_PARAMETER The parameter is invalid.\r
- @retval EFI_OUT_OF_RESOURCES Failed to allocate resources.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-HttpSetFieldNameAndValue (\r
- IN OUT EFI_HTTP_HEADER *HttpHeader,\r
- IN CONST CHAR8 *FieldName,\r
- IN CONST CHAR8 *FieldValue\r
- );\r
-\r
-/**\r
- Get one key/value header pair from the raw string.\r
-\r
- @param[in] String Pointer to the raw string.\r
- @param[out] FieldName Points directly to field name within 'HttpHeader'.\r
- @param[out] FieldValue Points directly to field value within 'HttpHeader'.\r
-\r
- @return Pointer to the next raw string.\r
- @return NULL if no key/value header pair from this raw string.\r
-\r
-**/\r
-CHAR8 *\r
-EFIAPI\r
-HttpGetFieldNameAndValue (\r
- IN CHAR8 *String,\r
- OUT CHAR8 **FieldName,\r
- OUT CHAR8 **FieldValue\r
- );\r
-\r
-/**\r
- Free existing HeaderFields.\r
-\r
- @param[in] HeaderFields Pointer to array of key/value header pairs waiting for free.\r
- @param[in] FieldCount The number of header pairs in HeaderFields.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-HttpFreeHeaderFields (\r
- IN EFI_HTTP_HEADER *HeaderFields,\r
- IN UINTN FieldCount\r
- );\r
-\r
-/**\r
- Generate HTTP request message.\r
-\r
- This function will allocate memory for the whole HTTP message and generate a\r
- well formatted HTTP Request message in it, include the Request-Line, header\r
- fields and also the message body. It is the caller's responsibility to free\r
- the buffer returned in *RequestMsg.\r
-\r
- @param[in] Message Pointer to the EFI_HTTP_MESSAGE structure which\r
- contains the required information to generate\r
- the HTTP request message.\r
- @param[in] Url The URL of a remote host.\r
- @param[out] RequestMsg Pointer to the created HTTP request message.\r
- NULL if any error occured.\r
- @param[out] RequestMsgSize Size of the RequestMsg (in bytes).\r
-\r
- @retval EFI_SUCCESS If HTTP request string was created successfully.\r
- @retval EFI_OUT_OF_RESOURCES Failed to allocate resources.\r
- @retval EFI_INVALID_PARAMETER The input arguments are invalid.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-HttpGenRequestMessage (\r
- IN CONST EFI_HTTP_MESSAGE *Message,\r
- IN CONST CHAR8 *Url,\r
- OUT CHAR8 **RequestMsg,\r
- OUT UINTN *RequestMsgSize\r
- );\r
-\r
-/**\r
- Translate the status code in HTTP message to EFI_HTTP_STATUS_CODE defined\r
- in UEFI 2.5 specification.\r
-\r
- @param[in] StatusCode The status code value in HTTP message.\r
-\r
- @return Value defined in EFI_HTTP_STATUS_CODE .\r
-\r
-**/\r
-EFI_HTTP_STATUS_CODE\r
-EFIAPI\r
-HttpMappingToStatusCode (\r
- IN UINTN StatusCode\r
- );\r
-\r
-/**\r
- Check whether header field called FieldName is in DeleteList.\r
-\r
- @param[in] DeleteList Pointer to array of key/value header pairs.\r
- @param[in] DeleteCount The number of header pairs.\r
- @param[in] FieldName Pointer to header field's name.\r
-\r
- @return TRUE if FieldName is not in DeleteList, that means this header field is valid.\r
- @return FALSE if FieldName is in DeleteList, that means this header field is invalid.\r
-\r
-**/\r
-BOOLEAN\r
-EFIAPI\r
-HttpIsValidHttpHeader (\r
- IN CHAR8 *DeleteList[],\r
- IN UINTN DeleteCount,\r
- IN CHAR8 *FieldName\r
- );\r
-\r
-\r
-#endif\r
-\r
+++ /dev/null
-/** @file\r
- This library is only intended to be used by UEFI network stack modules.\r
- It provides the combined IpIo layer on the EFI IP4 Protocol and EFI IP6 protocol.\r
-\r
-Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR>\r
-SPDX-License-Identifier: BSD-2-Clause-Patent\r
-\r
-**/\r
-\r
-#ifndef _IP_IO_H_\r
-#define _IP_IO_H_\r
-\r
-#include <Protocol/Ip4.h>\r
-#include <Protocol/Ip6.h>\r
-\r
-#include <Library/NetLib.h>\r
-\r
-//\r
-// type and code define for ICMP protocol error\r
-// from IP\r
-//\r
-#define ICMP_TYPE_UNREACH 3\r
-#define ICMP_TYPE_TIMXCEED 11\r
-#define ICMP_TYPE_PARAMPROB 12\r
-#define ICMP_TYPE_SOURCEQUENCH 4\r
-\r
-#define ICMP_CODE_UNREACH_NET 0\r
-#define ICMP_CODE_UNREACH_HOST 1\r
-#define ICMP_CODE_UNREACH_PROTOCOL 2\r
-#define ICMP_CODE_UNREACH_PORT 3\r
-#define ICMP_CODE_UNREACH_NEEDFRAG 4\r
-#define ICMP_CODE_UNREACH_SRCFAIL 5\r
-#define ICMP_CODE_UNREACH_NET_UNKNOWN 6\r
-#define ICMP_CODE_UNREACH_HOST_UNKNOWN 7\r
-#define ICMP_CODE_UNREACH_ISOLATED 8\r
-#define ICMP_CODE_UNREACH_NET_PROHIB 9\r
-#define ICMP_CODE_UNREACH_HOST_PROHIB 10\r
-#define ICMP_CODE_UNREACH_TOSNET 11\r
-#define ICMP_CODE_UNREACH_TOSHOST 12\r
-\r
-/**\r
- Get the IP header length from the struct EFI_IP4_HEADER. HeaderLength is\r
- Internet header length in 32-bit words, so HeaderLength<<2 is the real\r
- length of IP header.\r
-\r
- @param[out] HdrPtr A pointer to EFI_IP4_HEADER.\r
-\r
- @return The IP header length.\r
-**/\r
-#define EFI_IP4_HEADER_LEN(HdrPtr) ((HdrPtr)->HeaderLength << 2)\r
-\r
-/**\r
- To types of ICMP error which consist of ICMP header, IP header and original\r
- datagram's data, get length from sum of ICMP header length, IP header length\r
- and first 64 bits of datagram's data length.\r
-\r
- @param[in] IpHdr A pointer to EFI_IP4_HEADER.\r
-\r
- @return The ICMP error length.\r
-**/\r
-#define ICMP_ERRLEN(IpHdr) \\r
- (sizeof(IP4_ICMP_HEAD) + EFI_IP4_HEADER_LEN(IpHdr) + 8)\r
-\r
-/**\r
- Get the packet header from NET_BUF.\r
-\r
- @param[out] Buf A pointer to NET_BUF.\r
- @param[in] Type Header type.\r
-\r
- @return The pointer to packet header.\r
-**/\r
-#define NET_PROTO_HDR(Buf, Type) ((Type *) ((Buf)->BlockOp[0].Head))\r
-\r
-\r
-extern EFI_IP4_CONFIG_DATA mIp4IoDefaultIpConfigData;\r
-extern EFI_IP6_CONFIG_DATA mIp6IoDefaultIpConfigData;\r
-\r
-\r
-///\r
-/// This error will be delivered to the\r
-/// listening transportation layer protocol\r
-/// that consumes IpIO.\r
-///\r
-\r
-#define ICMP_ERR_UNREACH_NET 0\r
-#define ICMP_ERR_UNREACH_HOST 1\r
-#define ICMP_ERR_UNREACH_PROTOCOL 2\r
-#define ICMP_ERR_UNREACH_PORT 3\r
-#define ICMP_ERR_MSGSIZE 4\r
-#define ICMP_ERR_UNREACH_SRCFAIL 5\r
-#define ICMP_ERR_TIMXCEED_INTRANS 6\r
-#define ICMP_ERR_TIMXCEED_REASS 7\r
-#define ICMP_ERR_QUENCH 8\r
-#define ICMP_ERR_PARAMPROB 9\r
-\r
-#define ICMP6_ERR_UNREACH_NET 0\r
-#define ICMP6_ERR_UNREACH_HOST 1\r
-#define ICMP6_ERR_UNREACH_PROTOCOL 2\r
-#define ICMP6_ERR_UNREACH_PORT 3\r
-#define ICMP6_ERR_PACKAGE_TOOBIG 4\r
-#define ICMP6_ERR_TIMXCEED_HOPLIMIT 5\r
-#define ICMP6_ERR_TIMXCEED_REASS 6\r
-#define ICMP6_ERR_PARAMPROB_HEADER 7\r
-#define ICMP6_ERR_PARAMPROB_NEXHEADER 8\r
-#define ICMP6_ERR_PARAMPROB_IPV6OPTION 9\r
-\r
-///\r
-/// The helper struct for IpIoGetIcmpErrStatus(). It is for internal use only.\r
-///\r
-typedef struct {\r
- BOOLEAN IsHard;\r
- BOOLEAN Notify;\r
-} ICMP_ERROR_INFO;\r
-\r
-typedef union {\r
- EFI_IP4_COMPLETION_TOKEN Ip4Token;\r
- EFI_IP6_COMPLETION_TOKEN Ip6Token;\r
-} IP_IO_IP_COMPLETION_TOKEN;\r
-\r
-typedef union {\r
- EFI_IP4_TRANSMIT_DATA Ip4TxData;\r
- EFI_IP6_TRANSMIT_DATA Ip6TxData;\r
-} IP_IO_IP_TX_DATA;\r
-\r
-typedef union {\r
- EFI_IP4_RECEIVE_DATA Ip4RxData;\r
- EFI_IP6_RECEIVE_DATA Ip6RxData;\r
-} IP_IO_IP_RX_DATA;\r
-\r
-typedef union {\r
- EFI_IP4_OVERRIDE_DATA Ip4OverrideData;\r
- EFI_IP6_OVERRIDE_DATA Ip6OverrideData;\r
-} IP_IO_OVERRIDE;\r
-\r
-typedef union {\r
- EFI_IP4_CONFIG_DATA Ip4CfgData;\r
- EFI_IP6_CONFIG_DATA Ip6CfgData;\r
-} IP_IO_IP_CONFIG_DATA;\r
-\r
-typedef union {\r
- EFI_IP4_HEADER *Ip4Hdr;\r
- EFI_IP6_HEADER *Ip6Hdr;\r
-} IP_IO_IP_HEADER;\r
-\r
-typedef union {\r
- IP4_ADDR SubnetMask;\r
- UINT8 PrefixLength;\r
-} IP_IO_IP_MASK;\r
-\r
-typedef union {\r
- EFI_IP4_PROTOCOL *Ip4;\r
- EFI_IP6_PROTOCOL *Ip6;\r
-} IP_IO_IP_PROTOCOL;\r
-\r
-///\r
-/// The IP session for an IP receive packet.\r
-///\r
-typedef struct _EFI_NET_SESSION_DATA {\r
- EFI_IP_ADDRESS Source; ///< Source IP of the received packet.\r
- EFI_IP_ADDRESS Dest; ///< Destination IP of the received packet.\r
- IP_IO_IP_HEADER IpHdr; ///< IP header of the received packet.\r
- UINT32 IpHdrLen; ///< IP header length of the received packet.\r
- ///< For IPv6, it includes the IP6 header\r
- ///< length and extension header length. For\r
- ///< IPv4, it includes the IP4 header length\r
- ///< and options length.\r
- UINT8 IpVersion; ///< The IP version of the received packet.\r
-} EFI_NET_SESSION_DATA;\r
-\r
-/**\r
- The prototype is called back when an IP packet is received.\r
-\r
- @param[in] Status The result of the receive request.\r
- @param[in] IcmpErr Valid when Status is EFI_ICMP_ERROR.\r
- @param[in] NetSession The IP session for the received packet.\r
- @param[in] Pkt The packet received.\r
- @param[in] Context The data provided by the user for the received packet when\r
- the callback is registered in IP_IO_OPEN_DATA::RcvdContext.\r
-\r
-**/\r
-typedef\r
-VOID\r
-(EFIAPI *PKT_RCVD_NOTIFY) (\r
- IN EFI_STATUS Status,\r
- IN UINT8 IcmpErr,\r
- IN EFI_NET_SESSION_DATA *NetSession,\r
- IN NET_BUF *Pkt,\r
- IN VOID *Context\r
- );\r
-\r
-/**\r
- The prototype is called back when an IP packet is sent.\r
-\r
- @param[in] Status Result of the IP packet being sent.\r
- @param[in] Context The data provided by user for the received packet when\r
- the callback is registered in IP_IO_OPEN_DATA::SndContext.\r
- @param[in] Sender A Union type to specify a pointer of EFI_IP4_PROTOCOL\r
- or EFI_IP6_PROTOCOL.\r
- @param[in] NotifyData The Context data specified when calling IpIoSend()\r
-\r
-**/\r
-typedef\r
-VOID\r
-(EFIAPI *PKT_SENT_NOTIFY) (\r
- IN EFI_STATUS Status,\r
- IN VOID *Context,\r
- IN IP_IO_IP_PROTOCOL Sender,\r
- IN VOID *NotifyData\r
- );\r
-\r
-///\r
-/// This data structure wraps Ip4/Ip6 instances. The IpIo Library uses it for all\r
-/// Ip4/Ip6 operations.\r
-///\r
-typedef struct _IP_IO {\r
- ///\r
- /// The node used to link this IpIo to the active IpIo list.\r
- ///\r
- LIST_ENTRY Entry;\r
-\r
- ///\r
- /// The list used to maintain the IP instance for different sending purpose.\r
- ///\r
- LIST_ENTRY IpList;\r
-\r
- EFI_HANDLE Controller;\r
- EFI_HANDLE Image;\r
- EFI_HANDLE ChildHandle;\r
- //\r
- // The IP instance consumed by this IP_IO\r
- //\r
- IP_IO_IP_PROTOCOL Ip;\r
- BOOLEAN IsConfigured;\r
-\r
- ///\r
- /// Some ip configuration data can be changed.\r
- ///\r
- UINT8 Protocol;\r
-\r
- ///\r
- /// Token and event used to get data from IP.\r
- ///\r
- IP_IO_IP_COMPLETION_TOKEN RcvToken;\r
-\r
- ///\r
- /// List entry used to link the token passed to IP_IO.\r
- ///\r
- LIST_ENTRY PendingSndList;\r
-\r
- //\r
- // User interface used to get notify from IP_IO\r
- //\r
- VOID *RcvdContext; ///< See IP_IO_OPEN_DATA::RcvdContext.\r
- VOID *SndContext; ///< See IP_IO_OPEN_DATA::SndContext.\r
- PKT_RCVD_NOTIFY PktRcvdNotify; ///< See IP_IO_OPEN_DATA::PktRcvdNotify.\r
- PKT_SENT_NOTIFY PktSentNotify; ///< See IP_IO_OPEN_DATA::PktSentNotify.\r
- UINT8 IpVersion;\r
- IP4_ADDR StationIp;\r
- IP4_ADDR SubnetMask;\r
-} IP_IO;\r
-\r
-///\r
-/// The struct is for the user to pass IP configuration and callbacks to IP_IO.\r
-/// It is used by IpIoOpen().\r
-///\r
-typedef struct _IP_IO_OPEN_DATA {\r
- IP_IO_IP_CONFIG_DATA IpConfigData; ///< Configuration of the IP instance.\r
- VOID *RcvdContext; ///< Context data used by receive callback.\r
- VOID *SndContext; ///< Context data used by send callback.\r
- PKT_RCVD_NOTIFY PktRcvdNotify; ///< Receive callback.\r
- PKT_SENT_NOTIFY PktSentNotify; ///< Send callback.\r
-} IP_IO_OPEN_DATA;\r
-\r
-///\r
-/// Internal struct book-keeping send request of IP_IO.\r
-///\r
-/// An IP_IO_SEND_ENTRY will be created each time a send request is issued to\r
-/// IP_IO via IpIoSend().\r
-///\r
-typedef struct _IP_IO_SEND_ENTRY {\r
- LIST_ENTRY Entry;\r
- IP_IO *IpIo;\r
- VOID *Context;\r
- VOID *NotifyData;\r
- IP_IO_IP_PROTOCOL Ip;\r
- NET_BUF *Pkt;\r
- IP_IO_IP_COMPLETION_TOKEN SndToken;\r
-} IP_IO_SEND_ENTRY;\r
-\r
-///\r
-/// The IP_IO_IP_INFO is used in IpIoSend() to override the default IP instance\r
-/// in IP_IO.\r
-///\r
-typedef struct _IP_IO_IP_INFO {\r
- EFI_IP_ADDRESS Addr;\r
- IP_IO_IP_MASK PreMask;\r
- LIST_ENTRY Entry;\r
- EFI_HANDLE ChildHandle;\r
- IP_IO_IP_PROTOCOL Ip;\r
- IP_IO_IP_COMPLETION_TOKEN DummyRcvToken;\r
- INTN RefCnt;\r
- UINT8 IpVersion;\r
-} IP_IO_IP_INFO;\r
-\r
-/**\r
- Create a new IP_IO instance.\r
-\r
- If IpVersion is not IP_VERSION_4 or IP_VERSION_6, then ASSERT().\r
-\r
- This function uses IP4/IP6 service binding protocol in Controller to create\r
- an IP4/IP6 child (aka IP4/IP6 instance).\r
-\r
- @param[in] Image The image handle of the driver or application that\r
- consumes IP_IO.\r
- @param[in] Controller The controller handle that has IP4 or IP6 service\r
- binding protocol installed.\r
- @param[in] IpVersion The version of the IP protocol to use, either\r
- IPv4 or IPv6.\r
-\r
- @return The pointer to a newly created IP_IO instance, or NULL if failed.\r
-\r
-**/\r
-IP_IO *\r
-EFIAPI\r
-IpIoCreate (\r
- IN EFI_HANDLE Image,\r
- IN EFI_HANDLE Controller,\r
- IN UINT8 IpVersion\r
- );\r
-\r
-/**\r
- Destroy an IP_IO instance.\r
-\r
- This function is paired with IpIoCreate(). The IP_IO will be closed first.\r
- Resource will be freed afterwards. See IpIoClose().\r
-\r
- @param[in, out] IpIo The pointer to the IP_IO instance that needs to be\r
- destroyed.\r
-\r
- @retval EFI_SUCCESS The IP_IO instance was destroyed successfully.\r
- @retval Others An error condition occurred.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-IpIoDestroy (\r
- IN OUT IP_IO *IpIo\r
- );\r
-\r
-/**\r
- Stop an IP_IO instance.\r
-\r
- If Ip version is not IP_VERSION_4 or IP_VERSION_6, then ASSERT().\r
-\r
- This function is paired with IpIoOpen(). The IP_IO will be unconfigured, and all\r
- pending send/receive tokens will be canceled.\r
-\r
- @param[in, out] IpIo The pointer to the IP_IO instance that needs to stop.\r
-\r
- @retval EFI_SUCCESS The IP_IO instance stopped successfully.\r
- @retval EFI_INVALID_PARAMETER Invalid input parameter.\r
- @retval Others Anrror condition occurred.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-IpIoStop (\r
- IN OUT IP_IO *IpIo\r
- );\r
-\r
-/**\r
- Open an IP_IO instance for use.\r
-\r
- If Ip version is not IP_VERSION_4 or IP_VERSION_6, then ASSERT().\r
-\r
- This function is called after IpIoCreate(). It is used for configuring the IP\r
- instance and register the callbacks and their context data for sending and\r
- receiving IP packets.\r
-\r
- @param[in, out] IpIo The pointer to an IP_IO instance that needs\r
- to open.\r
- @param[in] OpenData The configuration data and callbacks for\r
- the IP_IO instance.\r
-\r
- @retval EFI_SUCCESS The IP_IO instance opened with OpenData\r
- successfully.\r
- @retval EFI_ACCESS_DENIED The IP_IO instance is configured, avoid to\r
- reopen it.\r
- @retval EFI_UNSUPPORTED IPv4 RawData mode is no supported.\r
- @retval EFI_INVALID_PARAMETER Invalid input parameter.\r
- @retval Others Error condition occurred.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-IpIoOpen (\r
- IN OUT IP_IO *IpIo,\r
- IN IP_IO_OPEN_DATA *OpenData\r
- );\r
-\r
-/**\r
- Send out an IP packet.\r
-\r
- This function is called after IpIoOpen(). The data to be sent is wrapped in\r
- Pkt. The IP instance wrapped in IpIo is used for sending by default but can be\r
- overriden by Sender. Other sending configs, like source address and gateway\r
- address etc., are specified in OverrideData.\r
-\r
- @param[in, out] IpIo Pointer to an IP_IO instance used for sending IP\r
- packet.\r
- @param[in, out] Pkt Pointer to the IP packet to be sent.\r
- @param[in] Sender The IP protocol instance used for sending.\r
- @param[in] Context Optional context data.\r
- @param[in] NotifyData Optional notify data.\r
- @param[in] Dest The destination IP address to send this packet to.\r
- This parameter is optional when using IPv6.\r
- @param[in] OverrideData The data to override some configuration of the IP\r
- instance used for sending.\r
-\r
- @retval EFI_SUCCESS The operation is completed successfully.\r
- @retval EFI_INVALID_PARAMETER The input parameter is not correct.\r
- @retval EFI_NOT_STARTED The IpIo is not configured.\r
- @retval EFI_OUT_OF_RESOURCES Failed due to resource limit.\r
- @retval Others Error condition occurred.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-IpIoSend (\r
- IN OUT IP_IO *IpIo,\r
- IN OUT NET_BUF *Pkt,\r
- IN IP_IO_IP_INFO *Sender OPTIONAL,\r
- IN VOID *Context OPTIONAL,\r
- IN VOID *NotifyData OPTIONAL,\r
- IN EFI_IP_ADDRESS *Dest OPTIONAL,\r
- IN IP_IO_OVERRIDE *OverrideData OPTIONAL\r
- );\r
-\r
-/**\r
- Cancel the IP transmit token that wraps this Packet.\r
-\r
- If IpIo is NULL, then ASSERT().\r
- If Packet is NULL, then ASSERT().\r
-\r
- @param[in] IpIo The pointer to the IP_IO instance.\r
- @param[in] Packet The pointer to the packet of NET_BUF to cancel.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-IpIoCancelTxToken (\r
- IN IP_IO *IpIo,\r
- IN VOID *Packet\r
- );\r
-\r
-/**\r
- Add a new IP instance for sending data.\r
-\r
- If IpIo is NULL, then ASSERT().\r
- If Ip version is not IP_VERSION_4 or IP_VERSION_6, then ASSERT().\r
-\r
- The function is used to add the IP_IO to the IP_IO sending list. The caller\r
- can later use IpIoFindSender() to get the IP_IO and call IpIoSend() to send\r
- data.\r
-\r
- @param[in, out] IpIo The pointer to an IP_IO instance to add a new IP\r
- instance for sending purposes.\r
-\r
- @return The pointer to the created IP_IO_IP_INFO structure; NULL if failed.\r
-\r
-**/\r
-IP_IO_IP_INFO *\r
-EFIAPI\r
-IpIoAddIp (\r
- IN OUT IP_IO *IpIo\r
- );\r
-\r
-/**\r
- Configure the IP instance of this IpInfo and start the receiving if IpConfigData\r
- is not NULL.\r
-\r
- If Ip version is not IP_VERSION_4 or IP_VERSION_6, then ASSERT().\r
-\r
- @param[in, out] IpInfo The pointer to the IP_IO_IP_INFO instance.\r
- @param[in, out] IpConfigData The IP4 or IP6 configure data used to configure\r
- the IP instance. If NULL, the IP instance is reset.\r
- If UseDefaultAddress is set to TRUE, and the configure\r
- operation succeeds, the default address information\r
- is written back in this IpConfigData.\r
-\r
- @retval EFI_SUCCESS The IP instance of this IpInfo was configured successfully,\r
- or there is no need to reconfigure it.\r
- @retval Others The configuration failed.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-IpIoConfigIp (\r
- IN OUT IP_IO_IP_INFO *IpInfo,\r
- IN OUT VOID *IpConfigData OPTIONAL\r
- );\r
-\r
-/**\r
- Destroy an IP instance maintained in IpIo->IpList for\r
- sending purpose.\r
-\r
- If Ip version is not IP_VERSION_4 or IP_VERSION_6, then ASSERT().\r
-\r
- This function pairs with IpIoAddIp(). The IpInfo is previously created by\r
- IpIoAddIp(). The IP_IO_IP_INFO::RefCnt is decremented and the IP instance\r
- will be dstroyed if the RefCnt is zero.\r
-\r
- @param[in] IpIo The pointer to the IP_IO instance.\r
- @param[in] IpInfo The pointer to the IpInfo to be removed.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-IpIoRemoveIp (\r
- IN IP_IO *IpIo,\r
- IN IP_IO_IP_INFO *IpInfo\r
- );\r
-\r
-/**\r
- Find the first IP protocol maintained in IpIo whose local\r
- address is the same as Src.\r
-\r
- This function is called when the caller needs the IpIo to send data to the\r
- specified Src. The IpIo was added previously by IpIoAddIp().\r
-\r
- @param[in, out] IpIo The pointer to the pointer of the IP_IO instance.\r
- @param[in] IpVersion The version of the IP protocol to use, either\r
- IPv4 or IPv6.\r
- @param[in] Src The local IP address.\r
-\r
- @return The pointer to the IP protocol can be used for sending purpose and its local\r
- address is the same with Src. NULL if failed.\r
-\r
-**/\r
-IP_IO_IP_INFO *\r
-EFIAPI\r
-IpIoFindSender (\r
- IN OUT IP_IO **IpIo,\r
- IN UINT8 IpVersion,\r
- IN EFI_IP_ADDRESS *Src\r
- );\r
-\r
-/**\r
- Get the ICMP error map information.\r
-\r
- The ErrorStatus will be returned. The IsHard and Notify are optional. If they\r
- are not NULL, this routine will fill them.\r
-\r
- @param[in] IcmpError IcmpError Type.\r
- @param[in] IpVersion The version of the IP protocol to use,\r
- either IPv4 or IPv6.\r
- @param[out] IsHard If TRUE, indicates that it is a hard error.\r
- @param[out] Notify If TRUE, SockError needs to be notified.\r
-\r
- @retval EFI_UNSUPPORTED Unrecognizable ICMP error code\r
- @return The ICMP Error Status, such as EFI_NETWORK_UNREACHABLE.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-IpIoGetIcmpErrStatus (\r
- IN UINT8 IcmpError,\r
- IN UINT8 IpVersion,\r
- OUT BOOLEAN *IsHard OPTIONAL,\r
- OUT BOOLEAN *Notify OPTIONAL\r
- );\r
-\r
-/**\r
- Refresh the remote peer's Neighbor Cache entries.\r
-\r
- This function is called when the caller needs the IpIo to refresh the existing\r
- IPv6 neighbor cache entries since the neighbor is considered reachable by the\r
- node has recently received a confirmation that packets sent recently to the\r
- neighbor were received by its IP layer.\r
-\r
- @param[in] IpIo The pointer to an IP_IO instance\r
- @param[in] Neighbor The IP address of the neighbor\r
- @param[in] Timeout The time in 100-ns units that this entry will\r
- remain in the neighbor cache. A value of\r
- zero means that the entry is permanent.\r
- A value of non-zero means that the entry is\r
- dynamic and will be deleted after Timeout.\r
-\r
- @retval EFI_SUCCESS The operation completed successfully.\r
- @retval EFI_NOT_STARTED The IpIo is not configured.\r
- @retval EFI_INVALID_PARAMETER The Neighbor Address is invalid.\r
- @retval EFI_NOT_FOUND The neighbor cache entry is not in the\r
- neighbor table.\r
- @retval EFI_UNSUPPORTED IP version is IPv4, which doesn't support neighbor cache refresh.\r
- @retval EFI_OUT_OF_RESOURCES Failed due to resource limitations.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-IpIoRefreshNeighbor (\r
- IN IP_IO *IpIo,\r
- IN EFI_IP_ADDRESS *Neighbor,\r
- IN UINT32 Timeout\r
- );\r
-\r
-#endif\r
-\r
+++ /dev/null
-/** @file\r
- This library is only intended to be used by UEFI network stack modules.\r
- It provides basic functions for the UEFI network stack.\r
-\r
-Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR>\r
-SPDX-License-Identifier: BSD-2-Clause-Patent\r
-\r
-**/\r
-\r
-#ifndef _NET_LIB_H_\r
-#define _NET_LIB_H_\r
-\r
-#include <Protocol/Ip6.h>\r
-\r
-#include <Library/BaseLib.h>\r
-#include <Library/BaseMemoryLib.h>\r
-\r
-typedef UINT32 IP4_ADDR;\r
-typedef UINT32 TCP_SEQNO;\r
-typedef UINT16 TCP_PORTNO;\r
-\r
-\r
-#define NET_ETHER_ADDR_LEN 6\r
-#define NET_IFTYPE_ETHERNET 0x01\r
-\r
-#define NET_VLAN_TAG_LEN 4\r
-#define ETHER_TYPE_VLAN 0x8100\r
-\r
-#define EFI_IP_PROTO_UDP 0x11\r
-#define EFI_IP_PROTO_TCP 0x06\r
-#define EFI_IP_PROTO_ICMP 0x01\r
-#define IP4_PROTO_IGMP 0x02\r
-#define IP6_ICMP 58\r
-#define DNS_MAX_NAME_SIZE 255\r
-#define DNS_MAX_MESSAGE_SIZE 512\r
-\r
-//\r
-// The address classification\r
-//\r
-#define IP4_ADDR_CLASSA 1 // Deprecated\r
-#define IP4_ADDR_CLASSB 2 // Deprecated\r
-#define IP4_ADDR_CLASSC 3 // Deprecated\r
-#define IP4_ADDR_CLASSD 4\r
-#define IP4_ADDR_CLASSE 5\r
-\r
-#define IP4_MASK_NUM 33\r
-#define IP6_PREFIX_NUM 129\r
-\r
-#define IP4_MASK_MAX 32\r
-#define IP6_PREFIX_MAX 128\r
-\r
-#define IP6_HOP_BY_HOP 0\r
-#define IP6_DESTINATION 60\r
-#define IP6_ROUTING 43\r
-#define IP6_FRAGMENT 44\r
-#define IP6_AH 51\r
-#define IP6_ESP 50\r
-#define IP6_NO_NEXT_HEADER 59\r
-\r
-#define IP_VERSION_4 4\r
-#define IP_VERSION_6 6\r
-\r
-#define IP6_PREFIX_LENGTH 64\r
-\r
-//\r
-// DNS QTYPE values\r
-//\r
-#define DNS_TYPE_A 1\r
-#define DNS_TYPE_NS 2\r
-#define DNS_TYPE_CNAME 5\r
-#define DNS_TYPE_SOA 6\r
-#define DNS_TYPE_WKS 11\r
-#define DNS_TYPE_PTR 12\r
-#define DNS_TYPE_HINFO 13\r
-#define DNS_TYPE_MINFO 14\r
-#define DNS_TYPE_MX 15\r
-#define DNS_TYPE_TXT 16\r
-#define DNS_TYPE_AAAA 28\r
-#define DNS_TYPE_SRV_RR 33\r
-#define DNS_TYPE_AXFR 252\r
-#define DNS_TYPE_MAILB 253\r
-#define DNS_TYPE_ANY 255\r
-\r
-//\r
-// DNS QCLASS values\r
-//\r
-#define DNS_CLASS_INET 1\r
-#define DNS_CLASS_CH 3\r
-#define DNS_CLASS_HS 4\r
-#define DNS_CLASS_ANY 255\r
-\r
-//\r
-// Number of 100ns units time Interval for network media state detect\r
-//\r
-#define MEDIA_STATE_DETECT_TIME_INTERVAL 1000000U\r
-\r
-\r
-#pragma pack(1)\r
-\r
-//\r
-// Ethernet head definition\r
-//\r
-typedef struct {\r
- UINT8 DstMac [NET_ETHER_ADDR_LEN];\r
- UINT8 SrcMac [NET_ETHER_ADDR_LEN];\r
- UINT16 EtherType;\r
-} ETHER_HEAD;\r
-\r
-//\r
-// 802.1Q VLAN Tag Control Information\r
-//\r
-typedef union {\r
- struct {\r
- UINT16 Vid : 12; // Unique VLAN identifier (0 to 4094)\r
- UINT16 Cfi : 1; // Canonical Format Indicator\r
- UINT16 Priority : 3; // 802.1Q priority level (0 to 7)\r
- } Bits;\r
- UINT16 Uint16;\r
-} VLAN_TCI;\r
-\r
-#define VLAN_TCI_CFI_CANONICAL_MAC 0\r
-#define VLAN_TCI_CFI_NON_CANONICAL_MAC 1\r
-\r
-//\r
-// The EFI_IP4_HEADER is hard to use because the source and\r
-// destination address are defined as EFI_IPv4_ADDRESS, which\r
-// is a structure. Two structures can't be compared or masked\r
-// directly. This is why there is an internal representation.\r
-//\r
-typedef struct {\r
- UINT8 HeadLen : 4;\r
- UINT8 Ver : 4;\r
- UINT8 Tos;\r
- UINT16 TotalLen;\r
- UINT16 Id;\r
- UINT16 Fragment;\r
- UINT8 Ttl;\r
- UINT8 Protocol;\r
- UINT16 Checksum;\r
- IP4_ADDR Src;\r
- IP4_ADDR Dst;\r
-} IP4_HEAD;\r
-\r
-\r
-//\r
-// ICMP head definition. Each ICMP message is categorized as either an error\r
-// message or query message. Two message types have their own head format.\r
-//\r
-typedef struct {\r
- UINT8 Type;\r
- UINT8 Code;\r
- UINT16 Checksum;\r
-} IP4_ICMP_HEAD;\r
-\r
-typedef struct {\r
- IP4_ICMP_HEAD Head;\r
- UINT32 Fourth; // 4th filed of the head, it depends on Type.\r
- IP4_HEAD IpHead;\r
-} IP4_ICMP_ERROR_HEAD;\r
-\r
-typedef struct {\r
- IP4_ICMP_HEAD Head;\r
- UINT16 Id;\r
- UINT16 Seq;\r
-} IP4_ICMP_QUERY_HEAD;\r
-\r
-typedef struct {\r
- UINT8 Type;\r
- UINT8 Code;\r
- UINT16 Checksum;\r
-} IP6_ICMP_HEAD;\r
-\r
-typedef struct {\r
- IP6_ICMP_HEAD Head;\r
- UINT32 Fourth;\r
- EFI_IP6_HEADER IpHead;\r
-} IP6_ICMP_ERROR_HEAD;\r
-\r
-typedef struct {\r
- IP6_ICMP_HEAD Head;\r
- UINT32 Fourth;\r
-} IP6_ICMP_INFORMATION_HEAD;\r
-\r
-//\r
-// UDP header definition\r
-//\r
-typedef struct {\r
- UINT16 SrcPort;\r
- UINT16 DstPort;\r
- UINT16 Length;\r
- UINT16 Checksum;\r
-} EFI_UDP_HEADER;\r
-\r
-//\r
-// TCP header definition\r
-//\r
-typedef struct {\r
- TCP_PORTNO SrcPort;\r
- TCP_PORTNO DstPort;\r
- TCP_SEQNO Seq;\r
- TCP_SEQNO Ack;\r
- UINT8 Res : 4;\r
- UINT8 HeadLen : 4;\r
- UINT8 Flag;\r
- UINT16 Wnd;\r
- UINT16 Checksum;\r
- UINT16 Urg;\r
-} TCP_HEAD;\r
-\r
-#pragma pack()\r
-\r
-#define NET_MAC_EQUAL(pMac1, pMac2, Len) \\r
- (CompareMem ((pMac1), (pMac2), Len) == 0)\r
-\r
-#define NET_MAC_IS_MULTICAST(Mac, BMac, Len) \\r
- (((*((UINT8 *) Mac) & 0x01) == 0x01) && (!NET_MAC_EQUAL (Mac, BMac, Len)))\r
-\r
-#define NTOHL(x) SwapBytes32 (x)\r
-\r
-#define HTONL(x) NTOHL(x)\r
-\r
-#define NTOHS(x) SwapBytes16 (x)\r
-\r
-#define HTONS(x) NTOHS(x)\r
-#define NTOHLL(x) SwapBytes64 (x)\r
-#define HTONLL(x) NTOHLL(x)\r
-#define NTOHLLL(x) Ip6Swap128 (x)\r
-#define HTONLLL(x) NTOHLLL(x)\r
-\r
-//\r
-// Test the IP's attribute, All the IPs are in host byte order.\r
-//\r
-#define IP4_IS_MULTICAST(Ip) (((Ip) & 0xF0000000) == 0xE0000000)\r
-#define IP4_IS_UNSPECIFIED(Ip) ((Ip) == 0)\r
-#define IP4_IS_LOCAL_BROADCAST(Ip) ((Ip) == 0xFFFFFFFF)\r
-#define IP4_NET_EQUAL(Ip1, Ip2, NetMask) (((Ip1) & (NetMask)) == ((Ip2) & (NetMask)))\r
-#define IP4_IS_VALID_NETMASK(Ip) (NetGetMaskLength (Ip) != (IP4_MASK_MAX + 1))\r
-\r
-#define IP6_IS_MULTICAST(Ip6) (((Ip6)->Addr[0]) == 0xFF)\r
-\r
-//\r
-// Convert the EFI_IP4_ADDRESS to plain UINT32 IP4 address.\r
-//\r
-#define EFI_IP4(EfiIpAddr) (*(IP4_ADDR *) ((EfiIpAddr).Addr))\r
-#define EFI_NTOHL(EfiIp) (NTOHL (EFI_IP4 ((EfiIp))))\r
-#define EFI_IP4_EQUAL(Ip1, Ip2) (CompareMem ((Ip1), (Ip2), sizeof (EFI_IPv4_ADDRESS)) == 0)\r
-\r
-#define EFI_IP6_EQUAL(Ip1, Ip2) (CompareMem ((Ip1), (Ip2), sizeof (EFI_IPv6_ADDRESS)) == 0)\r
-\r
-#define IP4_COPY_ADDRESS(Dest, Src) (CopyMem ((Dest), (Src), sizeof (EFI_IPv4_ADDRESS)))\r
-#define IP6_COPY_ADDRESS(Dest, Src) (CopyMem ((Dest), (Src), sizeof (EFI_IPv6_ADDRESS)))\r
-#define IP6_COPY_LINK_ADDRESS(Mac1, Mac2) (CopyMem ((Mac1), (Mac2), sizeof (EFI_MAC_ADDRESS)))\r
-\r
-//\r
-// The debug level definition. This value is also used as the\r
-// syslog's severity level. Don't change it.\r
-//\r
-#define NETDEBUG_LEVEL_TRACE 5\r
-#define NETDEBUG_LEVEL_WARNING 4\r
-#define NETDEBUG_LEVEL_ERROR 3\r
-\r
-//\r
-// Network debug message is sent out as syslog packet.\r
-//\r
-#define NET_SYSLOG_FACILITY 16 // Syslog local facility local use\r
-#define NET_SYSLOG_PACKET_LEN 512\r
-#define NET_SYSLOG_TX_TIMEOUT (500 * 1000 * 10) // 500ms\r
-#define NET_DEBUG_MSG_LEN 470 // 512 - (ether+ip4+udp4 head length)\r
-\r
-//\r
-// The debug output expects the ASCII format string, Use %a to print ASCII\r
-// string, and %s to print UNICODE string. PrintArg must be enclosed in ().\r
-// For example: NET_DEBUG_TRACE ("Tcp", ("State transit to %a\n", Name));\r
-//\r
-#define NET_DEBUG_TRACE(Module, PrintArg) \\r
- NetDebugOutput ( \\r
- NETDEBUG_LEVEL_TRACE, \\r
- Module, \\r
- __FILE__, \\r
- __LINE__, \\r
- NetDebugASPrint PrintArg \\r
- )\r
-\r
-#define NET_DEBUG_WARNING(Module, PrintArg) \\r
- NetDebugOutput ( \\r
- NETDEBUG_LEVEL_WARNING, \\r
- Module, \\r
- __FILE__, \\r
- __LINE__, \\r
- NetDebugASPrint PrintArg \\r
- )\r
-\r
-#define NET_DEBUG_ERROR(Module, PrintArg) \\r
- NetDebugOutput ( \\r
- NETDEBUG_LEVEL_ERROR, \\r
- Module, \\r
- __FILE__, \\r
- __LINE__, \\r
- NetDebugASPrint PrintArg \\r
- )\r
-\r
-/**\r
- Allocate a buffer, then format the message to it. This is a\r
- help function for the NET_DEBUG_XXX macros. The PrintArg of\r
- these macros treats the variable length print parameters as a\r
- single parameter, and pass it to the NetDebugASPrint. For\r
- example, NET_DEBUG_TRACE ("Tcp", ("State transit to %a\n", Name))\r
- if extracted to:\r
-\r
- NetDebugOutput (\r
- NETDEBUG_LEVEL_TRACE,\r
- "Tcp",\r
- __FILE__,\r
- __LINE__,\r
- NetDebugASPrint ("State transit to %a\n", Name)\r
- )\r
-\r
- @param Format The ASCII format string.\r
- @param ... The variable length parameter whose format is determined\r
- by the Format string.\r
-\r
- @return The buffer containing the formatted message,\r
- or NULL if memory allocation failed.\r
-\r
-**/\r
-CHAR8 *\r
-EFIAPI\r
-NetDebugASPrint (\r
- IN CHAR8 *Format,\r
- ...\r
- );\r
-\r
-/**\r
- Builds an UDP4 syslog packet and send it using SNP.\r
-\r
- This function will locate a instance of SNP then send the message through it.\r
- Because it isn't open the SNP BY_DRIVER, apply caution when using it.\r
-\r
- @param Level The severity level of the message.\r
- @param Module The Module that generates the log.\r
- @param File The file that contains the log.\r
- @param Line The exact line that contains the log.\r
- @param Message The user message to log.\r
-\r
- @retval EFI_INVALID_PARAMETER Any input parameter is invalid.\r
- @retval EFI_OUT_OF_RESOURCES Failed to allocate memory for the packet\r
- @retval EFI_SUCCESS The log is discard because that it is more verbose\r
- than the mNetDebugLevelMax. Or, it has been sent out.\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-NetDebugOutput (\r
- IN UINT32 Level,\r
- IN UINT8 *Module,\r
- IN UINT8 *File,\r
- IN UINT32 Line,\r
- IN UINT8 *Message\r
- );\r
-\r
-\r
-/**\r
- Return the length of the mask.\r
-\r
- Return the length of the mask. Valid values are 0 to 32.\r
- If the mask is invalid, return the invalid length 33, which is IP4_MASK_NUM.\r
- NetMask is in the host byte order.\r
-\r
- @param[in] NetMask The netmask to get the length from.\r
-\r
- @return The length of the netmask, or IP4_MASK_NUM (33) if the mask is invalid.\r
-\r
-**/\r
-INTN\r
-EFIAPI\r
-NetGetMaskLength (\r
- IN IP4_ADDR NetMask\r
- );\r
-\r
-/**\r
- Return the class of the IP address, such as class A, B, C.\r
- Addr is in host byte order.\r
-\r
- [ATTENTION]\r
- Classful addressing (IP class A/B/C) has been deprecated according to RFC4632.\r
- Caller of this function could only check the returned value against\r
- IP4_ADDR_CLASSD (multicast) or IP4_ADDR_CLASSE (reserved) now.\r
-\r
- The address of class A starts with 0.\r
- If the address belong to class A, return IP4_ADDR_CLASSA.\r
- The address of class B starts with 10.\r
- If the address belong to class B, return IP4_ADDR_CLASSB.\r
- The address of class C starts with 110.\r
- If the address belong to class C, return IP4_ADDR_CLASSC.\r
- The address of class D starts with 1110.\r
- If the address belong to class D, return IP4_ADDR_CLASSD.\r
- The address of class E starts with 1111.\r
- If the address belong to class E, return IP4_ADDR_CLASSE.\r
-\r
-\r
- @param[in] Addr The address to get the class from.\r
-\r
- @return IP address class, such as IP4_ADDR_CLASSA.\r
-\r
-**/\r
-INTN\r
-EFIAPI\r
-NetGetIpClass (\r
- IN IP4_ADDR Addr\r
- );\r
-\r
-/**\r
- Check whether the IP is a valid unicast address according to\r
- the netmask.\r
-\r
- ASSERT if NetMask is zero.\r
-\r
- If all bits of the host address of IP are 0 or 1, IP is also not a valid unicast address,\r
- except when the originator is one of the endpoints of a point-to-point link with a 31-bit\r
- mask (RFC3021), or a 32bit NetMask (all 0xFF) is used for special network environment (e.g.\r
- PPP link).\r
-\r
- @param[in] Ip The IP to check against.\r
- @param[in] NetMask The mask of the IP.\r
-\r
- @return TRUE if IP is a valid unicast address on the network, otherwise FALSE.\r
-\r
-**/\r
-BOOLEAN\r
-EFIAPI\r
-NetIp4IsUnicast (\r
- IN IP4_ADDR Ip,\r
- IN IP4_ADDR NetMask\r
- );\r
-\r
-/**\r
- Check whether the incoming IPv6 address is a valid unicast address.\r
-\r
- ASSERT if Ip6 is NULL.\r
-\r
- If the address is a multicast address has binary 0xFF at the start, it is not\r
- a valid unicast address. If the address is unspecified ::, it is not a valid\r
- unicast address to be assigned to any node. If the address is loopback address\r
- ::1, it is also not a valid unicast address to be assigned to any physical\r
- interface.\r
-\r
- @param[in] Ip6 The IPv6 address to check against.\r
-\r
- @return TRUE if Ip6 is a valid unicast address on the network, otherwise FALSE.\r
-\r
-**/\r
-BOOLEAN\r
-EFIAPI\r
-NetIp6IsValidUnicast (\r
- IN EFI_IPv6_ADDRESS *Ip6\r
- );\r
-\r
-\r
-/**\r
- Check whether the incoming Ipv6 address is the unspecified address or not.\r
-\r
- ASSERT if Ip6 is NULL.\r
-\r
- @param[in] Ip6 - Ip6 address, in network order.\r
-\r
- @retval TRUE - Yes, incoming Ipv6 address is the unspecified address.\r
- @retval FALSE - The incoming Ipv6 address is not the unspecified address\r
-\r
-**/\r
-BOOLEAN\r
-EFIAPI\r
-NetIp6IsUnspecifiedAddr (\r
- IN EFI_IPv6_ADDRESS *Ip6\r
- );\r
-\r
-/**\r
- Check whether the incoming Ipv6 address is a link-local address.\r
-\r
- ASSERT if Ip6 is NULL.\r
-\r
- @param[in] Ip6 - Ip6 address, in network order.\r
-\r
- @retval TRUE - The incoming Ipv6 address is a link-local address.\r
- @retval FALSE - The incoming Ipv6 address is not a link-local address.\r
-\r
-**/\r
-BOOLEAN\r
-EFIAPI\r
-NetIp6IsLinkLocalAddr (\r
- IN EFI_IPv6_ADDRESS *Ip6\r
- );\r
-\r
-/**\r
- Check whether the Ipv6 address1 and address2 are on the connected network.\r
-\r
- ASSERT if Ip1 or Ip2 is NULL.\r
- ASSERT if PrefixLength exceeds or equals to IP6_PREFIX_MAX.\r
-\r
- @param[in] Ip1 - Ip6 address1, in network order.\r
- @param[in] Ip2 - Ip6 address2, in network order.\r
- @param[in] PrefixLength - The prefix length of the checking net.\r
-\r
- @retval TRUE - Yes, the Ipv6 address1 and address2 are connected.\r
- @retval FALSE - No the Ipv6 address1 and address2 are not connected.\r
-\r
-**/\r
-BOOLEAN\r
-EFIAPI\r
-NetIp6IsNetEqual (\r
- EFI_IPv6_ADDRESS *Ip1,\r
- EFI_IPv6_ADDRESS *Ip2,\r
- UINT8 PrefixLength\r
- );\r
-\r
-/**\r
- Switches the endianess of an IPv6 address.\r
-\r
- ASSERT if Ip6 is NULL.\r
-\r
- This function swaps the bytes in a 128-bit IPv6 address to switch the value\r
- from little endian to big endian or vice versa. The byte swapped value is\r
- returned.\r
-\r
- @param Ip6 Points to an IPv6 address.\r
-\r
- @return The byte swapped IPv6 address.\r
-\r
-**/\r
-EFI_IPv6_ADDRESS *\r
-EFIAPI\r
-Ip6Swap128 (\r
- EFI_IPv6_ADDRESS *Ip6\r
- );\r
-\r
-extern IP4_ADDR gIp4AllMasks[IP4_MASK_NUM];\r
-\r
-\r
-extern EFI_IPv4_ADDRESS mZeroIp4Addr;\r
-\r
-#define NET_IS_DIGIT(Ch) (('0' <= (Ch)) && ((Ch) <= '9'))\r
-#define NET_IS_HEX(Ch) ((('0' <= (Ch)) && ((Ch) <= '9')) || (('A' <= (Ch)) && ((Ch) <= 'F')) || (('a' <= (Ch)) && ((Ch) <= 'f')))\r
-#define NET_ROUNDUP(size, unit) (((size) + (unit) - 1) & (~((unit) - 1)))\r
-#define NET_IS_LOWER_CASE_CHAR(Ch) (('a' <= (Ch)) && ((Ch) <= 'z'))\r
-#define NET_IS_UPPER_CASE_CHAR(Ch) (('A' <= (Ch)) && ((Ch) <= 'Z'))\r
-\r
-#define TICKS_PER_MS 10000U\r
-#define TICKS_PER_SECOND 10000000U\r
-\r
-#define NET_RANDOM(Seed) ((UINT32) ((UINT32) (Seed) * 1103515245UL + 12345) % 4294967295UL)\r
-\r
-/**\r
- Extract a UINT32 from a byte stream.\r
-\r
- ASSERT if Buf is NULL.\r
-\r
- This function copies a UINT32 from a byte stream, and then converts it from Network\r
- byte order to host byte order. Use this function to avoid alignment error.\r
-\r
- @param[in] Buf The buffer to extract the UINT32.\r
-\r
- @return The UINT32 extracted.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-NetGetUint32 (\r
- IN UINT8 *Buf\r
- );\r
-\r
-/**\r
- Puts a UINT32 into the byte stream in network byte order.\r
-\r
- ASSERT if Buf is NULL.\r
-\r
- Converts a UINT32 from host byte order to network byte order, then copies it to the\r
- byte stream.\r
-\r
- @param[in, out] Buf The buffer in which to put the UINT32.\r
- @param[in] Data The data to be converted and put into the byte stream.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-NetPutUint32 (\r
- IN OUT UINT8 *Buf,\r
- IN UINT32 Data\r
- );\r
-\r
-/**\r
- Initialize a random seed using current time and monotonic count.\r
-\r
- Get current time and monotonic count first. Then initialize a random seed\r
- based on some basic mathematics operation on the hour, day, minute, second,\r
- nanosecond and year of the current time and the monotonic count value.\r
-\r
- @return The random seed initialized with current time.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-NetRandomInitSeed (\r
- VOID\r
- );\r
-\r
-\r
-#define NET_LIST_USER_STRUCT(Entry, Type, Field) \\r
- BASE_CR(Entry, Type, Field)\r
-\r
-#define NET_LIST_USER_STRUCT_S(Entry, Type, Field, Sig) \\r
- CR(Entry, Type, Field, Sig)\r
-\r
-//\r
-// Iterate through the double linked list. It is NOT delete safe\r
-//\r
-#define NET_LIST_FOR_EACH(Entry, ListHead) \\r
- for(Entry = (ListHead)->ForwardLink; Entry != (ListHead); Entry = Entry->ForwardLink)\r
-\r
-//\r
-// Iterate through the double linked list. This is delete-safe.\r
-// Don't touch NextEntry. Also, don't use this macro if list\r
-// entries other than the Entry may be deleted when processing\r
-// the current Entry.\r
-//\r
-#define NET_LIST_FOR_EACH_SAFE(Entry, NextEntry, ListHead) \\r
- for(Entry = (ListHead)->ForwardLink, NextEntry = Entry->ForwardLink; \\r
- Entry != (ListHead); \\r
- Entry = NextEntry, NextEntry = Entry->ForwardLink \\r
- )\r
-\r
-//\r
-// Make sure the list isn't empty before getting the first/last record.\r
-//\r
-#define NET_LIST_HEAD(ListHead, Type, Field) \\r
- NET_LIST_USER_STRUCT((ListHead)->ForwardLink, Type, Field)\r
-\r
-#define NET_LIST_TAIL(ListHead, Type, Field) \\r
- NET_LIST_USER_STRUCT((ListHead)->BackLink, Type, Field)\r
-\r
-\r
-/**\r
- Remove the first node entry on the list, and return the removed node entry.\r
-\r
- Removes the first node entry from a doubly linked list. It is up to the caller of\r
- this function to release the memory used by the first node, if that is required. On\r
- exit, the removed node is returned.\r
-\r
- If Head is NULL, then ASSERT().\r
- If Head was not initialized, then ASSERT().\r
- If PcdMaximumLinkedListLength is not zero, and the number of nodes in the\r
- linked list including the head node is greater than or equal to PcdMaximumLinkedListLength,\r
- then ASSERT().\r
-\r
- @param[in, out] Head The list header.\r
-\r
- @return The first node entry that is removed from the list, NULL if the list is empty.\r
-\r
-**/\r
-LIST_ENTRY *\r
-EFIAPI\r
-NetListRemoveHead (\r
- IN OUT LIST_ENTRY *Head\r
- );\r
-\r
-/**\r
- Remove the last node entry on the list and return the removed node entry.\r
-\r
- Removes the last node entry from a doubly linked list. It is up to the caller of\r
- this function to release the memory used by the first node, if that is required. On\r
- exit, the removed node is returned.\r
-\r
- If Head is NULL, then ASSERT().\r
- If Head was not initialized, then ASSERT().\r
- If PcdMaximumLinkedListLength is not zero, and the number of nodes in the\r
- linked list including the head node is greater than or equal to PcdMaximumLinkedListLength,\r
- then ASSERT().\r
-\r
- @param[in, out] Head The list head.\r
-\r
- @return The last node entry that is removed from the list, NULL if the list is empty.\r
-\r
-**/\r
-LIST_ENTRY *\r
-EFIAPI\r
-NetListRemoveTail (\r
- IN OUT LIST_ENTRY *Head\r
- );\r
-\r
-/**\r
- Insert a new node entry after a designated node entry of a doubly linked list.\r
-\r
- ASSERT if PrevEntry or NewEntry is NULL.\r
-\r
- Inserts a new node entry designated by NewEntry after the node entry designated by PrevEntry\r
- of the doubly linked list.\r
-\r
- @param[in, out] PrevEntry The entry after which to insert.\r
- @param[in, out] NewEntry The new entry to insert.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-NetListInsertAfter (\r
- IN OUT LIST_ENTRY *PrevEntry,\r
- IN OUT LIST_ENTRY *NewEntry\r
- );\r
-\r
-/**\r
- Insert a new node entry before a designated node entry of a doubly linked list.\r
-\r
- ASSERT if PostEntry or NewEntry is NULL.\r
-\r
- Inserts a new node entry designated by NewEntry before the node entry designated by PostEntry\r
- of the doubly linked list.\r
-\r
- @param[in, out] PostEntry The entry to insert before.\r
- @param[in, out] NewEntry The new entry to insert.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-NetListInsertBefore (\r
- IN OUT LIST_ENTRY *PostEntry,\r
- IN OUT LIST_ENTRY *NewEntry\r
- );\r
-\r
-/**\r
- Callback function which provided by user to remove one node in NetDestroyLinkList process.\r
-\r
- @param[in] Entry The entry to be removed.\r
- @param[in] Context Pointer to the callback context corresponds to the Context in NetDestroyLinkList.\r
-\r
- @retval EFI_SUCCESS The entry has been removed successfully.\r
- @retval Others Fail to remove the entry.\r
-\r
-**/\r
-typedef\r
-EFI_STATUS\r
-(EFIAPI *NET_DESTROY_LINK_LIST_CALLBACK) (\r
- IN LIST_ENTRY *Entry,\r
- IN VOID *Context OPTIONAL\r
- );\r
-\r
-/**\r
- Safe destroy nodes in a linked list, and return the length of the list after all possible operations finished.\r
-\r
- Destroy network children list by list traversals is not safe due to graph dependencies between nodes.\r
- This function performs a safe traversal to destroy these nodes by checking to see if the node being destroyed\r
- has been removed from the list or not.\r
- If it has been removed, then restart the traversal from the head.\r
- If it hasn't been removed, then continue with the next node directly.\r
- This function will end the iterate and return the CallBack's last return value if error happens,\r
- or retrun EFI_SUCCESS if 2 complete passes are made with no changes in the number of children in the list.\r
-\r
- @param[in] List The head of the list.\r
- @param[in] CallBack Pointer to the callback function to destroy one node in the list.\r
- @param[in] Context Pointer to the callback function's context: corresponds to the\r
- parameter Context in NET_DESTROY_LINK_LIST_CALLBACK.\r
- @param[out] ListLength The length of the link list if the function returns successfully.\r
-\r
- @retval EFI_SUCCESS Two complete passes are made with no changes in the number of children.\r
- @retval EFI_INVALID_PARAMETER The input parameter is invalid.\r
- @retval Others Return the CallBack's last return value.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-NetDestroyLinkList (\r
- IN LIST_ENTRY *List,\r
- IN NET_DESTROY_LINK_LIST_CALLBACK CallBack,\r
- IN VOID *Context, OPTIONAL\r
- OUT UINTN *ListLength OPTIONAL\r
- );\r
-\r
-/**\r
- This function checks the input Handle to see if it's one of these handles in ChildHandleBuffer.\r
-\r
- @param[in] Handle Handle to be checked.\r
- @param[in] NumberOfChildren Number of Handles in ChildHandleBuffer.\r
- @param[in] ChildHandleBuffer An array of child handles to be freed. May be NULL\r
- if NumberOfChildren is 0.\r
-\r
- @retval TRUE Found the input Handle in ChildHandleBuffer.\r
- @retval FALSE Can't find the input Handle in ChildHandleBuffer.\r
-\r
-**/\r
-BOOLEAN\r
-EFIAPI\r
-NetIsInHandleBuffer (\r
- IN EFI_HANDLE Handle,\r
- IN UINTN NumberOfChildren,\r
- IN EFI_HANDLE *ChildHandleBuffer OPTIONAL\r
- );\r
-\r
-//\r
-// Object container: EFI network stack spec defines various kinds of\r
-// tokens. The drivers can share code to manage those objects.\r
-//\r
-typedef struct {\r
- LIST_ENTRY Link;\r
- VOID *Key;\r
- VOID *Value;\r
-} NET_MAP_ITEM;\r
-\r
-typedef struct {\r
- LIST_ENTRY Used;\r
- LIST_ENTRY Recycled;\r
- UINTN Count;\r
-} NET_MAP;\r
-\r
-#define NET_MAP_INCREAMENT 64\r
-\r
-/**\r
- Initialize the netmap. Netmap is a reposity to keep the <Key, Value> pairs.\r
-\r
- Initialize the forward and backward links of two head nodes donated by Map->Used\r
- and Map->Recycled of two doubly linked lists.\r
- Initializes the count of the <Key, Value> pairs in the netmap to zero.\r
-\r
- If Map is NULL, then ASSERT().\r
- If the address of Map->Used is NULL, then ASSERT().\r
- If the address of Map->Recycled is NULl, then ASSERT().\r
-\r
- @param[in, out] Map The netmap to initialize.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-NetMapInit (\r
- IN OUT NET_MAP *Map\r
- );\r
-\r
-/**\r
- To clean up the netmap, that is, release allocated memories.\r
-\r
- Removes all nodes of the Used doubly linked list and frees memory of all related netmap items.\r
- Removes all nodes of the Recycled doubly linked list and free memory of all related netmap items.\r
- The number of the <Key, Value> pairs in the netmap is set to zero.\r
-\r
- If Map is NULL, then ASSERT().\r
-\r
- @param[in, out] Map The netmap to clean up.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-NetMapClean (\r
- IN OUT NET_MAP *Map\r
- );\r
-\r
-/**\r
- Test whether the netmap is empty and return true if it is.\r
-\r
- If the number of the <Key, Value> pairs in the netmap is zero, return TRUE.\r
-\r
- If Map is NULL, then ASSERT().\r
-\r
- @param[in] Map The net map to test.\r
-\r
- @return TRUE if the netmap is empty, otherwise FALSE.\r
-\r
-**/\r
-BOOLEAN\r
-EFIAPI\r
-NetMapIsEmpty (\r
- IN NET_MAP *Map\r
- );\r
-\r
-/**\r
- Return the number of the <Key, Value> pairs in the netmap.\r
-\r
- If Map is NULL, then ASSERT().\r
-\r
- @param[in] Map The netmap to get the entry number.\r
-\r
- @return The entry number in the netmap.\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-NetMapGetCount (\r
- IN NET_MAP *Map\r
- );\r
-\r
-/**\r
- Allocate an item to save the <Key, Value> pair to the head of the netmap.\r
-\r
- Allocate an item to save the <Key, Value> pair and add corresponding node entry\r
- to the beginning of the Used doubly linked list. The number of the <Key, Value>\r
- pairs in the netmap increase by 1.\r
-\r
- If Map is NULL, then ASSERT().\r
- If Key is NULL, then ASSERT().\r
-\r
- @param[in, out] Map The netmap to insert into.\r
- @param[in] Key The user's key.\r
- @param[in] Value The user's value for the key.\r
-\r
- @retval EFI_OUT_OF_RESOURCES Failed to allocate the memory for the item.\r
- @retval EFI_SUCCESS The item is inserted to the head.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-NetMapInsertHead (\r
- IN OUT NET_MAP *Map,\r
- IN VOID *Key,\r
- IN VOID *Value OPTIONAL\r
- );\r
-\r
-/**\r
- Allocate an item to save the <Key, Value> pair to the tail of the netmap.\r
-\r
- Allocate an item to save the <Key, Value> pair and add corresponding node entry\r
- to the tail of the Used doubly linked list. The number of the <Key, Value>\r
- pairs in the netmap increase by 1.\r
-\r
- If Map is NULL, then ASSERT().\r
- If Key is NULL, then ASSERT().\r
-\r
- @param[in, out] Map The netmap to insert into.\r
- @param[in] Key The user's key.\r
- @param[in] Value The user's value for the key.\r
-\r
- @retval EFI_OUT_OF_RESOURCES Failed to allocate the memory for the item.\r
- @retval EFI_SUCCESS The item is inserted to the tail.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-NetMapInsertTail (\r
- IN OUT NET_MAP *Map,\r
- IN VOID *Key,\r
- IN VOID *Value OPTIONAL\r
- );\r
-\r
-/**\r
- Finds the key in the netmap and returns the point to the item containing the Key.\r
-\r
- Iterate the Used doubly linked list of the netmap to get every item. Compare the key of every\r
- item with the key to search. It returns the point to the item contains the Key if found.\r
-\r
- If Map is NULL, then ASSERT().\r
- If Key is NULL, then ASSERT().\r
-\r
- @param[in] Map The netmap to search within.\r
- @param[in] Key The key to search.\r
-\r
- @return The point to the item contains the Key, or NULL if Key isn't in the map.\r
-\r
-**/\r
-NET_MAP_ITEM *\r
-EFIAPI\r
-NetMapFindKey (\r
- IN NET_MAP *Map,\r
- IN VOID *Key\r
- );\r
-\r
-/**\r
- Remove the node entry of the item from the netmap and return the key of the removed item.\r
-\r
- Remove the node entry of the item from the Used doubly linked list of the netmap.\r
- The number of the <Key, Value> pairs in the netmap decrease by 1. Then add the node\r
- entry of the item to the Recycled doubly linked list of the netmap. If Value is not NULL,\r
- Value will point to the value of the item. It returns the key of the removed item.\r
-\r
- If Map is NULL, then ASSERT().\r
- If Item is NULL, then ASSERT().\r
- if item in not in the netmap, then ASSERT().\r
-\r
- @param[in, out] Map The netmap to remove the item from.\r
- @param[in, out] Item The item to remove.\r
- @param[out] Value The variable to receive the value if not NULL.\r
-\r
- @return The key of the removed item.\r
-\r
-**/\r
-VOID *\r
-EFIAPI\r
-NetMapRemoveItem (\r
- IN OUT NET_MAP *Map,\r
- IN OUT NET_MAP_ITEM *Item,\r
- OUT VOID **Value OPTIONAL\r
- );\r
-\r
-/**\r
- Remove the first node entry on the netmap and return the key of the removed item.\r
-\r
- Remove the first node entry from the Used doubly linked list of the netmap.\r
- The number of the <Key, Value> pairs in the netmap decrease by 1. Then add the node\r
- entry to the Recycled doubly linked list of the netmap. If parameter Value is not NULL,\r
- parameter Value will point to the value of the item. It returns the key of the removed item.\r
-\r
- If Map is NULL, then ASSERT().\r
- If the Used doubly linked list is empty, then ASSERT().\r
-\r
- @param[in, out] Map The netmap to remove the head from.\r
- @param[out] Value The variable to receive the value if not NULL.\r
-\r
- @return The key of the item removed.\r
-\r
-**/\r
-VOID *\r
-EFIAPI\r
-NetMapRemoveHead (\r
- IN OUT NET_MAP *Map,\r
- OUT VOID **Value OPTIONAL\r
- );\r
-\r
-/**\r
- Remove the last node entry on the netmap and return the key of the removed item.\r
-\r
- Remove the last node entry from the Used doubly linked list of the netmap.\r
- The number of the <Key, Value> pairs in the netmap decrease by 1. Then add the node\r
- entry to the Recycled doubly linked list of the netmap. If parameter Value is not NULL,\r
- parameter Value will point to the value of the item. It returns the key of the removed item.\r
-\r
- If Map is NULL, then ASSERT().\r
- If the Used doubly linked list is empty, then ASSERT().\r
-\r
- @param[in, out] Map The netmap to remove the tail from.\r
- @param[out] Value The variable to receive the value if not NULL.\r
-\r
- @return The key of the item removed.\r
-\r
-**/\r
-VOID *\r
-EFIAPI\r
-NetMapRemoveTail (\r
- IN OUT NET_MAP *Map,\r
- OUT VOID **Value OPTIONAL\r
- );\r
-\r
-typedef\r
-EFI_STATUS\r
-(EFIAPI *NET_MAP_CALLBACK) (\r
- IN NET_MAP *Map,\r
- IN NET_MAP_ITEM *Item,\r
- IN VOID *Arg\r
- );\r
-\r
-/**\r
- Iterate through the netmap and call CallBack for each item.\r
-\r
- It will continue the traverse if CallBack returns EFI_SUCCESS, otherwise, break\r
- from the loop. It returns the CallBack's last return value. This function is\r
- delete safe for the current item.\r
-\r
- If Map is NULL, then ASSERT().\r
- If CallBack is NULL, then ASSERT().\r
-\r
- @param[in] Map The Map to iterate through.\r
- @param[in] CallBack The callback function to call for each item.\r
- @param[in] Arg The opaque parameter to the callback.\r
-\r
- @retval EFI_SUCCESS There is no item in the netmap, or CallBack for each item\r
- returns EFI_SUCCESS.\r
- @retval Others It returns the CallBack's last return value.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-NetMapIterate (\r
- IN NET_MAP *Map,\r
- IN NET_MAP_CALLBACK CallBack,\r
- IN VOID *Arg OPTIONAL\r
- );\r
-\r
-\r
-//\r
-// Helper functions to implement driver binding and service binding protocols.\r
-//\r
-/**\r
- Create a child of the service that is identified by ServiceBindingGuid.\r
-\r
- Get the ServiceBinding Protocol first, then use it to create a child.\r
-\r
- If ServiceBindingGuid is NULL, then ASSERT().\r
- If ChildHandle is NULL, then ASSERT().\r
-\r
- @param[in] Controller The controller which has the service installed.\r
- @param[in] Image The image handle used to open service.\r
- @param[in] ServiceBindingGuid The service's Guid.\r
- @param[in, out] ChildHandle The handle to receive the created child.\r
-\r
- @retval EFI_SUCCESS The child was successfully created.\r
- @retval Others Failed to create the child.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-NetLibCreateServiceChild (\r
- IN EFI_HANDLE Controller,\r
- IN EFI_HANDLE Image,\r
- IN EFI_GUID *ServiceBindingGuid,\r
- IN OUT EFI_HANDLE *ChildHandle\r
- );\r
-\r
-/**\r
- Destroy a child of the service that is identified by ServiceBindingGuid.\r
-\r
- Get the ServiceBinding Protocol first, then use it to destroy a child.\r
-\r
- If ServiceBindingGuid is NULL, then ASSERT().\r
-\r
- @param[in] Controller The controller which has the service installed.\r
- @param[in] Image The image handle used to open service.\r
- @param[in] ServiceBindingGuid The service's Guid.\r
- @param[in] ChildHandle The child to destroy.\r
-\r
- @retval EFI_SUCCESS The child was destroyed.\r
- @retval Others Failed to destroy the child.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-NetLibDestroyServiceChild (\r
- IN EFI_HANDLE Controller,\r
- IN EFI_HANDLE Image,\r
- IN EFI_GUID *ServiceBindingGuid,\r
- IN EFI_HANDLE ChildHandle\r
- );\r
-\r
-/**\r
- Get handle with Simple Network Protocol installed on it.\r
-\r
- There should be MNP Service Binding Protocol installed on the input ServiceHandle.\r
- If Simple Network Protocol is already installed on the ServiceHandle, the\r
- ServiceHandle will be returned. If SNP is not installed on the ServiceHandle,\r
- try to find its parent handle with SNP installed.\r
-\r
- @param[in] ServiceHandle The handle where network service binding protocols are\r
- installed on.\r
- @param[out] Snp The pointer to store the address of the SNP instance.\r
- This is an optional parameter that may be NULL.\r
-\r
- @return The SNP handle, or NULL if not found.\r
-\r
-**/\r
-EFI_HANDLE\r
-EFIAPI\r
-NetLibGetSnpHandle (\r
- IN EFI_HANDLE ServiceHandle,\r
- OUT EFI_SIMPLE_NETWORK_PROTOCOL **Snp OPTIONAL\r
- );\r
-\r
-/**\r
- Retrieve VLAN ID of a VLAN device handle.\r
-\r
- Search VLAN device path node in Device Path of specified ServiceHandle and\r
- return its VLAN ID. If no VLAN device path node found, then this ServiceHandle\r
- is not a VLAN device handle, and 0 will be returned.\r
-\r
- @param[in] ServiceHandle The handle where network service binding protocols are\r
- installed on.\r
-\r
- @return VLAN ID of the device handle, or 0 if not a VLAN device.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-NetLibGetVlanId (\r
- IN EFI_HANDLE ServiceHandle\r
- );\r
-\r
-/**\r
- Find VLAN device handle with specified VLAN ID.\r
-\r
- The VLAN child device handle is created by VLAN Config Protocol on ControllerHandle.\r
- This function will append VLAN device path node to the parent device path,\r
- and then use LocateDevicePath() to find the correct VLAN device handle.\r
-\r
- @param[in] ControllerHandle The handle where network service binding protocols are\r
- installed on.\r
- @param[in] VlanId The configured VLAN ID for the VLAN device.\r
-\r
- @return The VLAN device handle, or NULL if not found.\r
-\r
-**/\r
-EFI_HANDLE\r
-EFIAPI\r
-NetLibGetVlanHandle (\r
- IN EFI_HANDLE ControllerHandle,\r
- IN UINT16 VlanId\r
- );\r
-\r
-/**\r
- Get MAC address associated with the network service handle.\r
-\r
- If MacAddress is NULL, then ASSERT().\r
- If AddressSize is NULL, then ASSERT().\r
-\r
- There should be MNP Service Binding Protocol installed on the input ServiceHandle.\r
- If SNP is installed on the ServiceHandle or its parent handle, MAC address will\r
- be retrieved from SNP. If no SNP found, try to get SNP mode data use MNP.\r
-\r
- @param[in] ServiceHandle The handle where network service binding protocols are\r
- installed on.\r
- @param[out] MacAddress The pointer to store the returned MAC address.\r
- @param[out] AddressSize The length of returned MAC address.\r
-\r
- @retval EFI_SUCCESS MAC address was returned successfully.\r
- @retval Others Failed to get SNP mode data.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-NetLibGetMacAddress (\r
- IN EFI_HANDLE ServiceHandle,\r
- OUT EFI_MAC_ADDRESS *MacAddress,\r
- OUT UINTN *AddressSize\r
- );\r
-\r
-/**\r
- Convert MAC address of the NIC associated with specified Service Binding Handle\r
- to a unicode string. Callers are responsible for freeing the string storage.\r
-\r
- If MacString is NULL, then ASSERT().\r
-\r
- Locate simple network protocol associated with the Service Binding Handle and\r
- get the mac address from SNP. Then convert the mac address into a unicode\r
- string. It takes 2 unicode characters to represent a 1 byte binary buffer.\r
- Plus one unicode character for the null-terminator.\r
-\r
- @param[in] ServiceHandle The handle where network service binding protocol is\r
- installed.\r
- @param[in] ImageHandle The image handle used to act as the agent handle to\r
- get the simple network protocol. This parameter is\r
- optional and may be NULL.\r
- @param[out] MacString The pointer to store the address of the string\r
- representation of the mac address.\r
-\r
- @retval EFI_SUCCESS Converted the mac address a unicode string successfully.\r
- @retval EFI_OUT_OF_RESOURCES There are not enough memory resources.\r
- @retval Others Failed to open the simple network protocol.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-NetLibGetMacString (\r
- IN EFI_HANDLE ServiceHandle,\r
- IN EFI_HANDLE ImageHandle, OPTIONAL\r
- OUT CHAR16 **MacString\r
- );\r
-\r
-/**\r
- Detect media status for specified network device.\r
-\r
- If MediaPresent is NULL, then ASSERT().\r
-\r
- The underlying UNDI driver may or may not support reporting media status from\r
- GET_STATUS command (PXE_STATFLAGS_GET_STATUS_NO_MEDIA_SUPPORTED). This routine\r
- will try to invoke Snp->GetStatus() to get the media status. If media is already\r
- present, it returns directly. If media is not present, it will stop SNP and then\r
- restart SNP to get the latest media status. This provides an opportunity to get\r
- the correct media status for old UNDI driver, which doesn't support reporting\r
- media status from GET_STATUS command.\r
- Note: there are two limitations for the current algorithm:\r
- 1) For UNDI with this capability, when the cable is not attached, there will\r
- be an redundant Stop/Start() process.\r
- 2) for UNDI without this capability, in case that network cable is attached when\r
- Snp->Initialize() is invoked while network cable is unattached later,\r
- NetLibDetectMedia() will report MediaPresent as TRUE, causing upper layer\r
- apps to wait for timeout time.\r
-\r
- @param[in] ServiceHandle The handle where network service binding protocols are\r
- installed.\r
- @param[out] MediaPresent The pointer to store the media status.\r
-\r
- @retval EFI_SUCCESS Media detection success.\r
- @retval EFI_INVALID_PARAMETER ServiceHandle is not a valid network device handle.\r
- @retval EFI_UNSUPPORTED The network device does not support media detection.\r
- @retval EFI_DEVICE_ERROR SNP is in an unknown state.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-NetLibDetectMedia (\r
- IN EFI_HANDLE ServiceHandle,\r
- OUT BOOLEAN *MediaPresent\r
- );\r
-\r
-/**\r
- Detect media state for a network device. This routine will wait for a period of time at\r
- a specified checking interval when a certain network is under connecting until connection\r
- process finishes or timeout. If Aip protocol is supported by low layer drivers, three kinds\r
- of media states can be detected: EFI_SUCCESS, EFI_NOT_READY and EFI_NO_MEDIA, represents\r
- connected state, connecting state and no media state respectively. When function detects\r
- the current state is EFI_NOT_READY, it will loop to wait for next time's check until state\r
- turns to be EFI_SUCCESS or EFI_NO_MEDIA. If Aip protocol is not supported, function will\r
- call NetLibDetectMedia() and return state directly.\r
-\r
- @param[in] ServiceHandle The handle where network service binding protocols are\r
- installed on.\r
- @param[in] Timeout The maximum number of 100ns units to wait when network\r
- is connecting. Zero value means detect once and return\r
- immediately.\r
- @param[out] MediaState The pointer to the detected media state.\r
-\r
- @retval EFI_SUCCESS Media detection success.\r
- @retval EFI_INVALID_PARAMETER ServiceHandle is not a valid network device handle or\r
- MediaState pointer is NULL.\r
- @retval EFI_DEVICE_ERROR A device error occurred.\r
- @retval EFI_TIMEOUT Network is connecting but timeout.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-NetLibDetectMediaWaitTimeout (\r
- IN EFI_HANDLE ServiceHandle,\r
- IN UINT64 Timeout,\r
- OUT EFI_STATUS *MediaState\r
- );\r
-\r
-\r
-/**\r
- Create an IPv4 device path node.\r
-\r
- If Node is NULL, then ASSERT().\r
-\r
- The header type of IPv4 device path node is MESSAGING_DEVICE_PATH.\r
- The header subtype of IPv4 device path node is MSG_IPv4_DP.\r
- The length of the IPv4 device path node in bytes is 19.\r
- Get other information from parameters to make up the whole IPv4 device path node.\r
-\r
- @param[in, out] Node The pointer to the IPv4 device path node.\r
- @param[in] Controller The controller handle.\r
- @param[in] LocalIp The local IPv4 address.\r
- @param[in] LocalPort The local port.\r
- @param[in] RemoteIp The remote IPv4 address.\r
- @param[in] RemotePort The remote port.\r
- @param[in] Protocol The protocol type in the IP header.\r
- @param[in] UseDefaultAddress Whether this instance is using default address or not.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-NetLibCreateIPv4DPathNode (\r
- IN OUT IPv4_DEVICE_PATH *Node,\r
- IN EFI_HANDLE Controller,\r
- IN IP4_ADDR LocalIp,\r
- IN UINT16 LocalPort,\r
- IN IP4_ADDR RemoteIp,\r
- IN UINT16 RemotePort,\r
- IN UINT16 Protocol,\r
- IN BOOLEAN UseDefaultAddress\r
- );\r
-\r
-/**\r
- Create an IPv6 device path node.\r
-\r
- If Node is NULL, then ASSERT().\r
- If LocalIp is NULL, then ASSERT().\r
- If RemoteIp is NULL, then ASSERT().\r
-\r
- The header type of IPv6 device path node is MESSAGING_DEVICE_PATH.\r
- The header subtype of IPv6 device path node is MSG_IPv6_DP.\r
- The length of the IPv6 device path node in bytes is 43.\r
- Get other information from parameters to make up the whole IPv6 device path node.\r
-\r
- @param[in, out] Node The pointer to the IPv6 device path node.\r
- @param[in] Controller The controller handle.\r
- @param[in] LocalIp The local IPv6 address.\r
- @param[in] LocalPort The local port.\r
- @param[in] RemoteIp The remote IPv6 address.\r
- @param[in] RemotePort The remote port.\r
- @param[in] Protocol The protocol type in the IP header.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-NetLibCreateIPv6DPathNode (\r
- IN OUT IPv6_DEVICE_PATH *Node,\r
- IN EFI_HANDLE Controller,\r
- IN EFI_IPv6_ADDRESS *LocalIp,\r
- IN UINT16 LocalPort,\r
- IN EFI_IPv6_ADDRESS *RemoteIp,\r
- IN UINT16 RemotePort,\r
- IN UINT16 Protocol\r
- );\r
-\r
-\r
-/**\r
- Find the UNDI/SNP handle from controller and protocol GUID.\r
-\r
- If ProtocolGuid is NULL, then ASSERT().\r
-\r
- For example, IP will open an MNP child to transmit/receive\r
- packets. When MNP is stopped, IP should also be stopped. IP\r
- needs to find its own private data that is related the IP's\r
- service binding instance that is installed on the UNDI/SNP handle.\r
- The controller is then either an MNP or an ARP child handle. Note that\r
- IP opens these handles using BY_DRIVER. Use that information to get the\r
- UNDI/SNP handle.\r
-\r
- @param[in] Controller The protocol handle to check.\r
- @param[in] ProtocolGuid The protocol that is related with the handle.\r
-\r
- @return The UNDI/SNP handle or NULL for errors.\r
-\r
-**/\r
-EFI_HANDLE\r
-EFIAPI\r
-NetLibGetNicHandle (\r
- IN EFI_HANDLE Controller,\r
- IN EFI_GUID *ProtocolGuid\r
- );\r
-\r
-/**\r
- This is the default unload handle for all the network drivers.\r
-\r
- Disconnect the driver specified by ImageHandle from all the devices in the handle database.\r
- Uninstall all the protocols installed in the driver entry point.\r
-\r
- @param[in] ImageHandle The drivers' driver image.\r
-\r
- @retval EFI_SUCCESS The image is unloaded.\r
- @retval Others Failed to unload the image.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-NetLibDefaultUnload (\r
- IN EFI_HANDLE ImageHandle\r
- );\r
-\r
-/**\r
- Convert one Null-terminated ASCII string (decimal dotted) to EFI_IPv4_ADDRESS.\r
-\r
- @param[in] String The pointer to the Ascii string.\r
- @param[out] Ip4Address The pointer to the converted IPv4 address.\r
-\r
- @retval EFI_SUCCESS Converted to an IPv4 address successfully.\r
- @retval EFI_INVALID_PARAMETER The string is malformatted, or Ip4Address is NULL.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-NetLibAsciiStrToIp4 (\r
- IN CONST CHAR8 *String,\r
- OUT EFI_IPv4_ADDRESS *Ip4Address\r
- );\r
-\r
-/**\r
- Convert one Null-terminated ASCII string to EFI_IPv6_ADDRESS. The format of the\r
- string is defined in RFC 4291 - Text Representation of Addresses.\r
-\r
- @param[in] String The pointer to the Ascii string.\r
- @param[out] Ip6Address The pointer to the converted IPv6 address.\r
-\r
- @retval EFI_SUCCESS Converted to an IPv6 address successfully.\r
- @retval EFI_INVALID_PARAMETER The string is malformatted, or Ip6Address is NULL.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-NetLibAsciiStrToIp6 (\r
- IN CONST CHAR8 *String,\r
- OUT EFI_IPv6_ADDRESS *Ip6Address\r
- );\r
-\r
-/**\r
- Convert one Null-terminated Unicode string (decimal dotted) to EFI_IPv4_ADDRESS.\r
-\r
- @param[in] String The pointer to the Ascii string.\r
- @param[out] Ip4Address The pointer to the converted IPv4 address.\r
-\r
- @retval EFI_SUCCESS Converted to an IPv4 address successfully.\r
- @retval EFI_INVALID_PARAMETER The string is mal-formatted or Ip4Address is NULL.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-NetLibStrToIp4 (\r
- IN CONST CHAR16 *String,\r
- OUT EFI_IPv4_ADDRESS *Ip4Address\r
- );\r
-\r
-/**\r
- Convert one Null-terminated Unicode string to EFI_IPv6_ADDRESS. The format of\r
- the string is defined in RFC 4291 - Text Representation of Addresses.\r
-\r
- @param[in] String The pointer to the Ascii string.\r
- @param[out] Ip6Address The pointer to the converted IPv6 address.\r
-\r
- @retval EFI_SUCCESS Converted to an IPv6 address successfully.\r
- @retval EFI_INVALID_PARAMETER The string is malformatted or Ip6Address is NULL.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-NetLibStrToIp6 (\r
- IN CONST CHAR16 *String,\r
- OUT EFI_IPv6_ADDRESS *Ip6Address\r
- );\r
-\r
-/**\r
- Convert one Null-terminated Unicode string to EFI_IPv6_ADDRESS and prefix length.\r
- The format of the string is defined in RFC 4291 - Text Representation of Addresses\r
- Prefixes: ipv6-address/prefix-length.\r
-\r
- @param[in] String The pointer to the Ascii string.\r
- @param[out] Ip6Address The pointer to the converted IPv6 address.\r
- @param[out] PrefixLength The pointer to the converted prefix length.\r
-\r
- @retval EFI_SUCCESS Converted to an IPv6 address successfully.\r
- @retval EFI_INVALID_PARAMETER The string is malformatted, or Ip6Address is NULL.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-NetLibStrToIp6andPrefix (\r
- IN CONST CHAR16 *String,\r
- OUT EFI_IPv6_ADDRESS *Ip6Address,\r
- OUT UINT8 *PrefixLength\r
- );\r
-\r
-/**\r
-\r
- Convert one EFI_IPv6_ADDRESS to Null-terminated Unicode string.\r
- The text representation of address is defined in RFC 4291.\r
-\r
- @param[in] Ip6Address The pointer to the IPv6 address.\r
- @param[out] String The buffer to return the converted string.\r
- @param[in] StringSize The length in bytes of the input String.\r
-\r
- @retval EFI_SUCCESS Convert to string successfully.\r
- @retval EFI_INVALID_PARAMETER The input parameter is invalid.\r
- @retval EFI_BUFFER_TOO_SMALL The BufferSize is too small for the result. BufferSize has been\r
- updated with the size needed to complete the request.\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-NetLibIp6ToStr (\r
- IN EFI_IPv6_ADDRESS *Ip6Address,\r
- OUT CHAR16 *String,\r
- IN UINTN StringSize\r
- );\r
-\r
-//\r
-// Various signatures\r
-//\r
-#define NET_BUF_SIGNATURE SIGNATURE_32 ('n', 'b', 'u', 'f')\r
-#define NET_VECTOR_SIGNATURE SIGNATURE_32 ('n', 'v', 'e', 'c')\r
-#define NET_QUE_SIGNATURE SIGNATURE_32 ('n', 'b', 'q', 'u')\r
-\r
-\r
-#define NET_PROTO_DATA 64 // Opaque buffer for protocols\r
-#define NET_BUF_HEAD 1 // Trim or allocate space from head\r
-#define NET_BUF_TAIL 0 // Trim or allocate space from tail\r
-#define NET_VECTOR_OWN_FIRST 0x01 // We allocated the 1st block in the vector\r
-\r
-#define NET_CHECK_SIGNATURE(PData, SIGNATURE) \\r
- ASSERT (((PData) != NULL) && ((PData)->Signature == (SIGNATURE)))\r
-\r
-//\r
-// Single memory block in the vector.\r
-//\r
-typedef struct {\r
- UINT32 Len; // The block's length\r
- UINT8 *Bulk; // The block's Data\r
-} NET_BLOCK;\r
-\r
-typedef VOID (EFIAPI *NET_VECTOR_EXT_FREE) (VOID *Arg);\r
-\r
-//\r
-//NET_VECTOR contains several blocks to hold all packet's\r
-//fragments and other house-keeping stuff for sharing. It\r
-//doesn't specify the where actual packet fragment begins.\r
-//\r
-typedef struct {\r
- UINT32 Signature;\r
- INTN RefCnt; // Reference count to share NET_VECTOR.\r
- NET_VECTOR_EXT_FREE Free; // external function to free NET_VECTOR\r
- VOID *Arg; // opaque argument to Free\r
- UINT32 Flag; // Flags, NET_VECTOR_OWN_FIRST\r
- UINT32 Len; // Total length of the associated BLOCKs\r
-\r
- UINT32 BlockNum;\r
- NET_BLOCK Block[1];\r
-} NET_VECTOR;\r
-\r
-//\r
-//NET_BLOCK_OP operates on the NET_BLOCK. It specifies\r
-//where the actual fragment begins and ends\r
-//\r
-typedef struct {\r
- UINT8 *BlockHead; // Block's head, or the smallest valid Head\r
- UINT8 *BlockTail; // Block's tail. BlockTail-BlockHead=block length\r
- UINT8 *Head; // 1st byte of the data in the block\r
- UINT8 *Tail; // Tail of the data in the block, Tail-Head=Size\r
- UINT32 Size; // The size of the data\r
-} NET_BLOCK_OP;\r
-\r
-typedef union {\r
- IP4_HEAD *Ip4;\r
- EFI_IP6_HEADER *Ip6;\r
-} NET_IP_HEAD;\r
-\r
-//\r
-//NET_BUF is the buffer manage structure used by the\r
-//network stack. Every network packet may be fragmented. The Vector points to\r
-//memory blocks used by each fragment, and BlockOp\r
-//specifies where each fragment begins and ends.\r
-//\r
-//It also contains an opaque area for the protocol to store\r
-//per-packet information. Protocol must be careful not\r
-//to overwrite the members after that.\r
-//\r
-typedef struct {\r
- UINT32 Signature;\r
- INTN RefCnt;\r
- LIST_ENTRY List; // The List this NET_BUF is on\r
-\r
- NET_IP_HEAD Ip; // Network layer header, for fast access\r
- TCP_HEAD *Tcp; // Transport layer header, for fast access\r
- EFI_UDP_HEADER *Udp; // User Datagram Protocol header\r
- UINT8 ProtoData [NET_PROTO_DATA]; //Protocol specific data\r
-\r
- NET_VECTOR *Vector; // The vector containing the packet\r
-\r
- UINT32 BlockOpNum; // Total number of BlockOp in the buffer\r
- UINT32 TotalSize; // Total size of the actual packet\r
- NET_BLOCK_OP BlockOp[1]; // Specify the position of actual packet\r
-} NET_BUF;\r
-\r
-//\r
-//A queue of NET_BUFs. It is a thin extension of\r
-//NET_BUF functions.\r
-//\r
-typedef struct {\r
- UINT32 Signature;\r
- INTN RefCnt;\r
- LIST_ENTRY List; // The List this buffer queue is on\r
-\r
- LIST_ENTRY BufList; // list of queued buffers\r
- UINT32 BufSize; // total length of DATA in the buffers\r
- UINT32 BufNum; // total number of buffers on the chain\r
-} NET_BUF_QUEUE;\r
-\r
-//\r
-// Pseudo header for TCP and UDP checksum\r
-//\r
-#pragma pack(1)\r
-typedef struct {\r
- IP4_ADDR SrcIp;\r
- IP4_ADDR DstIp;\r
- UINT8 Reserved;\r
- UINT8 Protocol;\r
- UINT16 Len;\r
-} NET_PSEUDO_HDR;\r
-\r
-typedef struct {\r
- EFI_IPv6_ADDRESS SrcIp;\r
- EFI_IPv6_ADDRESS DstIp;\r
- UINT32 Len;\r
- UINT32 Reserved:24;\r
- UINT32 NextHeader:8;\r
-} NET_IP6_PSEUDO_HDR;\r
-#pragma pack()\r
-\r
-//\r
-// The fragment entry table used in network interfaces. This is\r
-// the same as NET_BLOCK now. Use two different to distinguish\r
-// the two in case that NET_BLOCK be enhanced later.\r
-//\r
-typedef struct {\r
- UINT32 Len;\r
- UINT8 *Bulk;\r
-} NET_FRAGMENT;\r
-\r
-#define NET_GET_REF(PData) ((PData)->RefCnt++)\r
-#define NET_PUT_REF(PData) ((PData)->RefCnt--)\r
-#define NETBUF_FROM_PROTODATA(Info) BASE_CR((Info), NET_BUF, ProtoData)\r
-\r
-#define NET_BUF_SHARED(Buf) \\r
- (((Buf)->RefCnt > 1) || ((Buf)->Vector->RefCnt > 1))\r
-\r
-#define NET_VECTOR_SIZE(BlockNum) \\r
- (sizeof (NET_VECTOR) + ((BlockNum) - 1) * sizeof (NET_BLOCK))\r
-\r
-#define NET_BUF_SIZE(BlockOpNum) \\r
- (sizeof (NET_BUF) + ((BlockOpNum) - 1) * sizeof (NET_BLOCK_OP))\r
-\r
-#define NET_HEADSPACE(BlockOp) \\r
- ((UINTN)((BlockOp)->Head) - (UINTN)((BlockOp)->BlockHead))\r
-\r
-#define NET_TAILSPACE(BlockOp) \\r
- ((UINTN)((BlockOp)->BlockTail) - (UINTN)((BlockOp)->Tail))\r
-\r
-/**\r
- Allocate a single block NET_BUF. Upon allocation, all the\r
- free space is in the tail room.\r
-\r
- @param[in] Len The length of the block.\r
-\r
- @return The pointer to the allocated NET_BUF, or NULL if the\r
- allocation failed due to resource limitations.\r
-\r
-**/\r
-NET_BUF *\r
-EFIAPI\r
-NetbufAlloc (\r
- IN UINT32 Len\r
- );\r
-\r
-/**\r
- Free the net buffer and its associated NET_VECTOR.\r
-\r
- Decrease the reference count of the net buffer by one. Free the associated net\r
- vector and itself if the reference count of the net buffer is decreased to 0.\r
- The net vector free operation decreases the reference count of the net\r
- vector by one, and performs the resource free operation when the reference count\r
- of the net vector is 0.\r
-\r
- @param[in] Nbuf The pointer to the NET_BUF to be freed.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-NetbufFree (\r
- IN NET_BUF *Nbuf\r
- );\r
-\r
-/**\r
- Get the index of NET_BLOCK_OP that contains the byte at Offset in the net\r
- buffer.\r
-\r
- For example, this function can be used to retrieve the IP header in the packet. It\r
- also can be used to get the fragment that contains the byte used\r
- mainly by the library implementation itself.\r
-\r
- @param[in] Nbuf The pointer to the net buffer.\r
- @param[in] Offset The offset of the byte.\r
- @param[out] Index Index of the NET_BLOCK_OP that contains the byte at\r
- Offset.\r
-\r
- @return The pointer to the Offset'th byte of data in the net buffer, or NULL\r
- if there is no such data in the net buffer.\r
-\r
-**/\r
-UINT8 *\r
-EFIAPI\r
-NetbufGetByte (\r
- IN NET_BUF *Nbuf,\r
- IN UINT32 Offset,\r
- OUT UINT32 *Index OPTIONAL\r
- );\r
-\r
-/**\r
- Create a copy of the net buffer that shares the associated net vector.\r
-\r
- The reference count of the newly created net buffer is set to 1. The reference\r
- count of the associated net vector is increased by one.\r
-\r
- @param[in] Nbuf The pointer to the net buffer to be cloned.\r
-\r
- @return The pointer to the cloned net buffer, or NULL if the\r
- allocation failed due to resource limitations.\r
-\r
-**/\r
-NET_BUF *\r
-EFIAPI\r
-NetbufClone (\r
- IN NET_BUF *Nbuf\r
- );\r
-\r
-/**\r
- Create a duplicated copy of the net buffer with data copied and HeadSpace\r
- bytes of head space reserved.\r
-\r
- The duplicated net buffer will allocate its own memory to hold the data of the\r
- source net buffer.\r
-\r
- @param[in] Nbuf The pointer to the net buffer to be duplicated from.\r
- @param[in, out] Duplicate The pointer to the net buffer to duplicate to. If\r
- NULL, a new net buffer is allocated.\r
- @param[in] HeadSpace The length of the head space to reserve.\r
-\r
- @return The pointer to the duplicated net buffer, or NULL if\r
- the allocation failed due to resource limitations.\r
-\r
-**/\r
-NET_BUF *\r
-EFIAPI\r
-NetbufDuplicate (\r
- IN NET_BUF *Nbuf,\r
- IN OUT NET_BUF *Duplicate OPTIONAL,\r
- IN UINT32 HeadSpace\r
- );\r
-\r
-/**\r
- Create a NET_BUF structure which contains Len byte data of Nbuf starting from\r
- Offset.\r
-\r
- A new NET_BUF structure will be created but the associated data in NET_VECTOR\r
- is shared. This function exists to perform IP packet fragmentation.\r
-\r
- @param[in] Nbuf The pointer to the net buffer to be extracted.\r
- @param[in] Offset Starting point of the data to be included in the new\r
- net buffer.\r
- @param[in] Len The bytes of data to be included in the new net buffer.\r
- @param[in] HeadSpace The bytes of the head space to reserve for the protocol header.\r
-\r
- @return The pointer to the cloned net buffer, or NULL if the\r
- allocation failed due to resource limitations.\r
-\r
-**/\r
-NET_BUF *\r
-EFIAPI\r
-NetbufGetFragment (\r
- IN NET_BUF *Nbuf,\r
- IN UINT32 Offset,\r
- IN UINT32 Len,\r
- IN UINT32 HeadSpace\r
- );\r
-\r
-/**\r
- Reserve some space in the header room of the net buffer.\r
-\r
- Upon allocation, all the space is in the tail room of the buffer. Call this\r
- function to move space to the header room. This function is quite limited\r
- in that it can only reserve space from the first block of an empty NET_BUF not\r
- built from the external. However, it should be enough for the network stack.\r
-\r
- @param[in, out] Nbuf The pointer to the net buffer.\r
- @param[in] Len The length of buffer to be reserved from the header.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-NetbufReserve (\r
- IN OUT NET_BUF *Nbuf,\r
- IN UINT32 Len\r
- );\r
-\r
-/**\r
- Allocate Len bytes of space from the header or tail of the buffer.\r
-\r
- @param[in, out] Nbuf The pointer to the net buffer.\r
- @param[in] Len The length of the buffer to be allocated.\r
- @param[in] FromHead The flag to indicate whether to reserve the data\r
- from head (TRUE) or tail (FALSE).\r
-\r
- @return The pointer to the first byte of the allocated buffer,\r
- or NULL, if there is no sufficient space.\r
-\r
-**/\r
-UINT8*\r
-EFIAPI\r
-NetbufAllocSpace (\r
- IN OUT NET_BUF *Nbuf,\r
- IN UINT32 Len,\r
- IN BOOLEAN FromHead\r
- );\r
-\r
-/**\r
- Trim Len bytes from the header or the tail of the net buffer.\r
-\r
- @param[in, out] Nbuf The pointer to the net buffer.\r
- @param[in] Len The length of the data to be trimmed.\r
- @param[in] FromHead The flag to indicate whether trim data is from the\r
- head (TRUE) or the tail (FALSE).\r
-\r
- @return The length of the actual trimmed data, which may be less\r
- than Len if the TotalSize of Nbuf is less than Len.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-NetbufTrim (\r
- IN OUT NET_BUF *Nbuf,\r
- IN UINT32 Len,\r
- IN BOOLEAN FromHead\r
- );\r
-\r
-/**\r
- Copy Len bytes of data from the specific offset of the net buffer to the\r
- destination memory.\r
-\r
- The Len bytes of data may cross several fragments of the net buffer.\r
-\r
- @param[in] Nbuf The pointer to the net buffer.\r
- @param[in] Offset The sequence number of the first byte to copy.\r
- @param[in] Len The length of the data to copy.\r
- @param[in] Dest The destination of the data to copy to.\r
-\r
- @return The length of the actual copied data, or 0 if the offset\r
- specified exceeds the total size of net buffer.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-NetbufCopy (\r
- IN NET_BUF *Nbuf,\r
- IN UINT32 Offset,\r
- IN UINT32 Len,\r
- IN UINT8 *Dest\r
- );\r
-\r
-/**\r
- Build a NET_BUF from external blocks.\r
-\r
- A new NET_BUF structure will be created from external blocks. An additional block\r
- of memory will be allocated to hold reserved HeadSpace bytes of header room\r
- and existing HeadLen bytes of header, but the external blocks are shared by the\r
- net buffer to avoid data copying.\r
-\r
- @param[in] ExtFragment The pointer to the data block.\r
- @param[in] ExtNum The number of the data blocks.\r
- @param[in] HeadSpace The head space to be reserved.\r
- @param[in] HeadLen The length of the protocol header. The function\r
- pulls this amount of data into a linear block.\r
- @param[in] ExtFree The pointer to the caller-provided free function.\r
- @param[in] Arg The argument passed to ExtFree when ExtFree is\r
- called.\r
-\r
- @return The pointer to the net buffer built from the data blocks,\r
- or NULL if the allocation failed due to resource\r
- limit.\r
-\r
-**/\r
-NET_BUF *\r
-EFIAPI\r
-NetbufFromExt (\r
- IN NET_FRAGMENT *ExtFragment,\r
- IN UINT32 ExtNum,\r
- IN UINT32 HeadSpace,\r
- IN UINT32 HeadLen,\r
- IN NET_VECTOR_EXT_FREE ExtFree,\r
- IN VOID *Arg OPTIONAL\r
- );\r
-\r
-/**\r
- Build a fragment table to contain the fragments in the net buffer. This is the\r
- opposite operation of the NetbufFromExt.\r
-\r
- @param[in] Nbuf Points to the net buffer.\r
- @param[in, out] ExtFragment The pointer to the data block.\r
- @param[in, out] ExtNum The number of the data blocks.\r
-\r
- @retval EFI_BUFFER_TOO_SMALL The number of non-empty blocks is bigger than\r
- ExtNum.\r
- @retval EFI_SUCCESS The fragment table was built successfully.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-NetbufBuildExt (\r
- IN NET_BUF *Nbuf,\r
- IN OUT NET_FRAGMENT *ExtFragment,\r
- IN OUT UINT32 *ExtNum\r
- );\r
-\r
-/**\r
- Build a net buffer from a list of net buffers.\r
-\r
- All the fragments will be collected from the list of NEW_BUF, and then a new\r
- net buffer will be created through NetbufFromExt.\r
-\r
- @param[in] BufList A List of the net buffer.\r
- @param[in] HeadSpace The head space to be reserved.\r
- @param[in] HeaderLen The length of the protocol header. The function\r
- pulls this amount of data into a linear block.\r
- @param[in] ExtFree The pointer to the caller provided free function.\r
- @param[in] Arg The argument passed to ExtFree when ExtFree is called.\r
-\r
- @return The pointer to the net buffer built from the list of net\r
- buffers.\r
-\r
-**/\r
-NET_BUF *\r
-EFIAPI\r
-NetbufFromBufList (\r
- IN LIST_ENTRY *BufList,\r
- IN UINT32 HeadSpace,\r
- IN UINT32 HeaderLen,\r
- IN NET_VECTOR_EXT_FREE ExtFree,\r
- IN VOID *Arg OPTIONAL\r
- );\r
-\r
-/**\r
- Free a list of net buffers.\r
-\r
- @param[in, out] Head The pointer to the head of linked net buffers.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-NetbufFreeList (\r
- IN OUT LIST_ENTRY *Head\r
- );\r
-\r
-/**\r
- Initiate the net buffer queue.\r
-\r
- @param[in, out] NbufQue The pointer to the net buffer queue to be initialized.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-NetbufQueInit (\r
- IN OUT NET_BUF_QUEUE *NbufQue\r
- );\r
-\r
-/**\r
- Allocate and initialize a net buffer queue.\r
-\r
- @return The pointer to the allocated net buffer queue, or NULL if the\r
- allocation failed due to resource limit.\r
-\r
-**/\r
-NET_BUF_QUEUE *\r
-EFIAPI\r
-NetbufQueAlloc (\r
- VOID\r
- );\r
-\r
-/**\r
- Free a net buffer queue.\r
-\r
- Decrease the reference count of the net buffer queue by one. The real resource\r
- free operation isn't performed until the reference count of the net buffer\r
- queue is decreased to 0.\r
-\r
- @param[in] NbufQue The pointer to the net buffer queue to be freed.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-NetbufQueFree (\r
- IN NET_BUF_QUEUE *NbufQue\r
- );\r
-\r
-/**\r
- Remove a net buffer from the head in the specific queue and return it.\r
-\r
- @param[in, out] NbufQue The pointer to the net buffer queue.\r
-\r
- @return The pointer to the net buffer removed from the specific queue,\r
- or NULL if there is no net buffer in the specific queue.\r
-\r
-**/\r
-NET_BUF *\r
-EFIAPI\r
-NetbufQueRemove (\r
- IN OUT NET_BUF_QUEUE *NbufQue\r
- );\r
-\r
-/**\r
- Append a net buffer to the net buffer queue.\r
-\r
- @param[in, out] NbufQue The pointer to the net buffer queue.\r
- @param[in, out] Nbuf The pointer to the net buffer to be appended.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-NetbufQueAppend (\r
- IN OUT NET_BUF_QUEUE *NbufQue,\r
- IN OUT NET_BUF *Nbuf\r
- );\r
-\r
-/**\r
- Copy Len bytes of data from the net buffer queue at the specific offset to the\r
- destination memory.\r
-\r
- The copying operation is the same as NetbufCopy, but applies to the net buffer\r
- queue instead of the net buffer.\r
-\r
- @param[in] NbufQue The pointer to the net buffer queue.\r
- @param[in] Offset The sequence number of the first byte to copy.\r
- @param[in] Len The length of the data to copy.\r
- @param[out] Dest The destination of the data to copy to.\r
-\r
- @return The length of the actual copied data, or 0 if the offset\r
- specified exceeds the total size of net buffer queue.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-NetbufQueCopy (\r
- IN NET_BUF_QUEUE *NbufQue,\r
- IN UINT32 Offset,\r
- IN UINT32 Len,\r
- OUT UINT8 *Dest\r
- );\r
-\r
-/**\r
- Trim Len bytes of data from the buffer queue and free any net buffer\r
- that is completely trimmed.\r
-\r
- The trimming operation is the same as NetbufTrim but applies to the net buffer\r
- queue instead of the net buffer.\r
-\r
- @param[in, out] NbufQue The pointer to the net buffer queue.\r
- @param[in] Len The length of the data to trim.\r
-\r
- @return The actual length of the data trimmed.\r
-\r
-**/\r
-UINT32\r
-EFIAPI\r
-NetbufQueTrim (\r
- IN OUT NET_BUF_QUEUE *NbufQue,\r
- IN UINT32 Len\r
- );\r
-\r
-\r
-/**\r
- Flush the net buffer queue.\r
-\r
- @param[in, out] NbufQue The pointer to the queue to be flushed.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-NetbufQueFlush (\r
- IN OUT NET_BUF_QUEUE *NbufQue\r
- );\r
-\r
-/**\r
- Compute the checksum for a bulk of data.\r
-\r
- @param[in] Bulk The pointer to the data.\r
- @param[in] Len The length of the data, in bytes.\r
-\r
- @return The computed checksum.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-NetblockChecksum (\r
- IN UINT8 *Bulk,\r
- IN UINT32 Len\r
- );\r
-\r
-/**\r
- Add two checksums.\r
-\r
- @param[in] Checksum1 The first checksum to be added.\r
- @param[in] Checksum2 The second checksum to be added.\r
-\r
- @return The new checksum.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-NetAddChecksum (\r
- IN UINT16 Checksum1,\r
- IN UINT16 Checksum2\r
- );\r
-\r
-/**\r
- Compute the checksum for a NET_BUF.\r
-\r
- @param[in] Nbuf The pointer to the net buffer.\r
-\r
- @return The computed checksum.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-NetbufChecksum (\r
- IN NET_BUF *Nbuf\r
- );\r
-\r
-/**\r
- Compute the checksum for TCP/UDP pseudo header.\r
-\r
- Src and Dst are in network byte order, and Len is in host byte order.\r
-\r
- @param[in] Src The source address of the packet.\r
- @param[in] Dst The destination address of the packet.\r
- @param[in] Proto The protocol type of the packet.\r
- @param[in] Len The length of the packet.\r
-\r
- @return The computed checksum.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-NetPseudoHeadChecksum (\r
- IN IP4_ADDR Src,\r
- IN IP4_ADDR Dst,\r
- IN UINT8 Proto,\r
- IN UINT16 Len\r
- );\r
-\r
-/**\r
- Compute the checksum for the TCP6/UDP6 pseudo header.\r
-\r
- Src and Dst are in network byte order, and Len is in host byte order.\r
-\r
- @param[in] Src The source address of the packet.\r
- @param[in] Dst The destination address of the packet.\r
- @param[in] NextHeader The protocol type of the packet.\r
- @param[in] Len The length of the packet.\r
-\r
- @return The computed checksum.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-NetIp6PseudoHeadChecksum (\r
- IN EFI_IPv6_ADDRESS *Src,\r
- IN EFI_IPv6_ADDRESS *Dst,\r
- IN UINT8 NextHeader,\r
- IN UINT32 Len\r
- );\r
-\r
-/**\r
- The function frees the net buffer which allocated by the IP protocol. It releases\r
- only the net buffer and doesn't call the external free function.\r
-\r
- This function should be called after finishing the process of mIpSec->ProcessExt()\r
- for outbound traffic. The (EFI_IPSEC2_PROTOCOL)->ProcessExt() allocates a new\r
- buffer for the ESP, so there needs a function to free the old net buffer.\r
-\r
- @param[in] Nbuf The network buffer to be freed.\r
-\r
-**/\r
-VOID\r
-NetIpSecNetbufFree (\r
- NET_BUF *Nbuf\r
- );\r
-\r
-/**\r
- This function obtains the system guid from the smbios table.\r
-\r
- If SystemGuid is NULL, then ASSERT().\r
-\r
- @param[out] SystemGuid The pointer of the returned system guid.\r
-\r
- @retval EFI_SUCCESS Successfully obtained the system guid.\r
- @retval EFI_NOT_FOUND Did not find the SMBIOS table.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-NetLibGetSystemGuid (\r
- OUT EFI_GUID *SystemGuid\r
- );\r
-\r
-/**\r
- Create Dns QName according the queried domain name.\r
-\r
- If DomainName is NULL, then ASSERT().\r
-\r
- QName is a domain name represented as a sequence of labels,\r
- where each label consists of a length octet followed by that\r
- number of octets. The QName terminates with the zero\r
- length octet for the null label of the root. Caller should\r
- take responsibility to free the buffer in returned pointer.\r
-\r
- @param DomainName The pointer to the queried domain name string.\r
-\r
- @retval NULL Failed to fill QName.\r
- @return QName filled successfully.\r
-\r
-**/\r
-CHAR8 *\r
-EFIAPI\r
-NetLibCreateDnsQName (\r
- IN CHAR16 *DomainName\r
- );\r
-\r
-#endif\r
+++ /dev/null
-/** @file\r
- This library is used to share code between UEFI network stack modules.\r
- It provides the helper routines to access TCP service.\r
-\r
-Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.<BR>\r
-SPDX-License-Identifier: BSD-2-Clause-Patent\r
-\r
-**/\r
-\r
-#ifndef _TCP_IO_H_\r
-#define _TCP_IO_H_\r
-\r
-\r
-#include <Protocol/Tcp4.h>\r
-#include <Protocol/Tcp6.h>\r
-\r
-#include <Library/NetLib.h>\r
-\r
-#define TCP_VERSION_4 IP_VERSION_4\r
-#define TCP_VERSION_6 IP_VERSION_6\r
-\r
-///\r
-/// 10 seconds\r
-///\r
-#define TCP_GET_MAPPING_TIMEOUT 100000000U\r
-\r
-\r
-typedef struct {\r
- EFI_IPv4_ADDRESS LocalIp;\r
- EFI_IPv4_ADDRESS SubnetMask;\r
- EFI_IPv4_ADDRESS Gateway;\r
-\r
- UINT16 StationPort;\r
- EFI_IPv4_ADDRESS RemoteIp;\r
- UINT16 RemotePort;\r
- BOOLEAN ActiveFlag;\r
-} TCP4_IO_CONFIG_DATA;\r
-\r
-typedef struct {\r
- UINT16 StationPort;\r
- EFI_IPv6_ADDRESS RemoteIp;\r
- UINT16 RemotePort;\r
- BOOLEAN ActiveFlag;\r
-} TCP6_IO_CONFIG_DATA;\r
-\r
-typedef union {\r
- TCP4_IO_CONFIG_DATA Tcp4IoConfigData;\r
- TCP6_IO_CONFIG_DATA Tcp6IoConfigData;\r
-} TCP_IO_CONFIG_DATA;\r
-\r
-typedef union {\r
- EFI_TCP4_PROTOCOL *Tcp4;\r
- EFI_TCP6_PROTOCOL *Tcp6;\r
-} TCP_IO_PROTOCOL;\r
-\r
-typedef union {\r
- EFI_TCP4_CONNECTION_TOKEN Tcp4Token;\r
- EFI_TCP6_CONNECTION_TOKEN Tcp6Token;\r
-} TCP_IO_CONNECTION_TOKEN;\r
-\r
-typedef union {\r
- EFI_TCP4_IO_TOKEN Tcp4Token;\r
- EFI_TCP6_IO_TOKEN Tcp6Token;\r
-} TCP_IO_IO_TOKEN;\r
-\r
-typedef union {\r
- EFI_TCP4_CLOSE_TOKEN Tcp4Token;\r
- EFI_TCP6_CLOSE_TOKEN Tcp6Token;\r
-} TCP_IO_CLOSE_TOKEN;\r
-\r
-typedef union {\r
- EFI_TCP4_LISTEN_TOKEN Tcp4Token;\r
- EFI_TCP6_LISTEN_TOKEN Tcp6Token;\r
-} TCP_IO_LISTEN_TOKEN;\r
-\r
-\r
-typedef struct {\r
- UINT8 TcpVersion;\r
- EFI_HANDLE Image;\r
- EFI_HANDLE Controller;\r
- EFI_HANDLE Handle;\r
-\r
- TCP_IO_PROTOCOL Tcp;\r
- TCP_IO_PROTOCOL NewTcp;\r
- TCP_IO_CONNECTION_TOKEN ConnToken;\r
- TCP_IO_IO_TOKEN TxToken;\r
- TCP_IO_IO_TOKEN RxToken;\r
- TCP_IO_CLOSE_TOKEN CloseToken;\r
- TCP_IO_LISTEN_TOKEN ListenToken;\r
-\r
- BOOLEAN IsConnDone;\r
- BOOLEAN IsTxDone;\r
- BOOLEAN IsRxDone;\r
- BOOLEAN IsCloseDone;\r
- BOOLEAN IsListenDone;\r
-} TCP_IO;\r
-\r
-/**\r
- Create a TCP socket with the specified configuration data.\r
-\r
- @param[in] Image The handle of the driver image.\r
- @param[in] Controller The handle of the controller.\r
- @param[in] TcpVersion The version of Tcp, TCP_VERSION_4 or TCP_VERSION_6.\r
- @param[in] ConfigData The Tcp configuration data.\r
- @param[out] TcpIo The TcpIo.\r
-\r
- @retval EFI_SUCCESS The TCP socket is created and configured.\r
- @retval EFI_INVALID_PARAMETER One or more parameters are invalid.\r
- @retval EFI_UNSUPPORTED One or more of the control options are not\r
- supported in the implementation.\r
- @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.\r
- @retval Others Failed to create the TCP socket or configure it.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-TcpIoCreateSocket (\r
- IN EFI_HANDLE Image,\r
- IN EFI_HANDLE Controller,\r
- IN UINT8 TcpVersion,\r
- IN TCP_IO_CONFIG_DATA *ConfigData,\r
- OUT TCP_IO *TcpIo\r
- );\r
-\r
-/**\r
- Destroy the socket.\r
-\r
- @param[in] TcpIo The TcpIo which wraps the socket to be destroyed.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-TcpIoDestroySocket (\r
- IN TCP_IO *TcpIo\r
- );\r
-\r
-/**\r
- Connect to the other endpoint of the TCP socket.\r
-\r
- @param[in, out] TcpIo The TcpIo wrapping the TCP socket.\r
- @param[in] Timeout The time to wait for connection done. Set to NULL for infinite wait.\r
-\r
- @retval EFI_SUCCESS Connect to the other endpoint of the TCP socket\r
- successfully.\r
- @retval EFI_TIMEOUT Failed to connect to the other endpoint of the\r
- TCP socket in the specified time period.\r
- @retval EFI_INVALID_PARAMETER One or more parameters are invalid.\r
- @retval EFI_UNSUPPORTED One or more of the control options are not\r
- supported in the implementation.\r
- @retval Others Other errors as indicated.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-TcpIoConnect (\r
- IN OUT TCP_IO *TcpIo,\r
- IN EFI_EVENT Timeout OPTIONAL\r
- );\r
-\r
-/**\r
- Accept the incomding request from the other endpoint of the TCP socket.\r
-\r
- @param[in, out] TcpIo The TcpIo wrapping the TCP socket.\r
- @param[in] Timeout The time to wait for connection done. Set to NULL for infinite wait.\r
-\r
-\r
- @retval EFI_SUCCESS Connect to the other endpoint of the TCP socket\r
- successfully.\r
- @retval EFI_INVALID_PARAMETER One or more parameters are invalid.\r
- @retval EFI_UNSUPPORTED One or more of the control options are not\r
- supported in the implementation.\r
-\r
- @retval EFI_TIMEOUT Failed to connect to the other endpoint of the\r
- TCP socket in the specified time period.\r
- @retval Others Other errors as indicated.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-TcpIoAccept (\r
- IN OUT TCP_IO *TcpIo,\r
- IN EFI_EVENT Timeout OPTIONAL\r
- );\r
-\r
-/**\r
- Reset the socket.\r
-\r
- @param[in, out] TcpIo The TcpIo wrapping the TCP socket.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-TcpIoReset (\r
- IN OUT TCP_IO *TcpIo\r
- );\r
-\r
-/**\r
- Transmit the Packet to the other endpoint of the socket.\r
-\r
- @param[in] TcpIo The TcpIo wrapping the TCP socket.\r
- @param[in] Packet The packet to transmit.\r
-\r
- @retval EFI_SUCCESS The packet is trasmitted.\r
- @retval EFI_INVALID_PARAMETER One or more parameters are invalid.\r
- @retval EFI_UNSUPPORTED One or more of the control options are not\r
- supported in the implementation.\r
- @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.\r
- @retval EFI_DEVICE_ERROR An unexpected network or system error occurred.\r
- @retval Others Other errors as indicated.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-TcpIoTransmit (\r
- IN TCP_IO *TcpIo,\r
- IN NET_BUF *Packet\r
- );\r
-\r
-/**\r
- Receive data from the socket.\r
-\r
- @param[in, out] TcpIo The TcpIo which wraps the socket to be destroyed.\r
- @param[in] Packet The buffer to hold the data copy from the socket rx buffer.\r
- @param[in] AsyncMode Is this receive asyncronous or not.\r
- @param[in] Timeout The time to wait for receiving the amount of data the Packet\r
- can hold. Set to NULL for infinite wait.\r
-\r
- @retval EFI_SUCCESS The required amount of data is received from the socket.\r
- @retval EFI_INVALID_PARAMETER One or more parameters are invalid.\r
- @retval EFI_DEVICE_ERROR An unexpected network or system error occurred.\r
- @retval EFI_OUT_OF_RESOURCES Failed to allocate momery.\r
- @retval EFI_TIMEOUT Failed to receive the required amount of data in the\r
- specified time period.\r
- @retval Others Other errors as indicated.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-TcpIoReceive (\r
- IN OUT TCP_IO *TcpIo,\r
- IN NET_BUF *Packet,\r
- IN BOOLEAN AsyncMode,\r
- IN EFI_EVENT Timeout OPTIONAL\r
- );\r
-\r
-#endif\r
-\r
+++ /dev/null
-/** @file\r
- This library is used to share code between UEFI network stack modules.\r
- It provides the helper routines to access UDP service. It is used by both DHCP and MTFTP.\r
-\r
-Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
-SPDX-License-Identifier: BSD-2-Clause-Patent\r
-\r
-**/\r
-\r
-#ifndef _UDP_IO_H_\r
-#define _UDP_IO_H_\r
-\r
-#include <Protocol/Udp4.h>\r
-#include <Protocol/Udp6.h>\r
-\r
-#include <Library/NetLib.h>\r
-\r
-typedef struct _UDP_IO UDP_IO;\r
-\r
-///\r
-/// Signatures used by UdpIo Library.\r
-///\r
-\r
-#define UDP_IO_RX_SIGNATURE SIGNATURE_32 ('U', 'D', 'P', 'R')\r
-#define UDP_IO_TX_SIGNATURE SIGNATURE_32 ('U', 'D', 'P', 'T')\r
-#define UDP_IO_SIGNATURE SIGNATURE_32 ('U', 'D', 'P', 'I')\r
-\r
-#define UDP_IO_UDP4_VERSION 4\r
-#define UDP_IO_UDP6_VERSION 6\r
-\r
-///\r
-/// The UDP address pair.\r
-///\r
-typedef struct {\r
- EFI_IP_ADDRESS LocalAddr;\r
- UINT16 LocalPort;\r
- EFI_IP_ADDRESS RemoteAddr;\r
- UINT16 RemotePort;\r
-} UDP_END_POINT;\r
-\r
-/**\r
- Prototype called when receiving or sending packets to or from a UDP point.\r
-\r
- This prototype is used by both receive and sending when calling\r
- UdpIoRecvDatagram() or UdpIoSendDatagram(). When receiving, Netbuf is allocated by the\r
- UDP access point and released by the user. When sending, the user allocates the the NetBuf,\r
- which is then provided to the callback as a reference.\r
-\r
- @param[in] Packet The packet received or sent.\r
- @param[in] EndPoint The UDP address pair corresponds to the UDP IO.\r
- @param[in] IoStatus The packet receiving or sending status.\r
- @param[in] Context The user-defined data when calling UdpIoRecvDatagram() or\r
- UdpIoSendDatagram().\r
-**/\r
-typedef\r
-VOID\r
-(EFIAPI *UDP_IO_CALLBACK) (\r
- IN NET_BUF *Packet,\r
- IN UDP_END_POINT *EndPoint,\r
- IN EFI_STATUS IoStatus,\r
- IN VOID *Context\r
- );\r
-\r
-///\r
-/// This structure is used internally by the UdpIo Library.\r
-///\r
-/// Each receive request is wrapped in an UDP_RX_TOKEN. Upon completion,\r
-/// the CallBack will be called. Only one receive request is sent to UDP at a\r
-/// time. HeadLen gives the length of the application's header. UDP_IO will\r
-/// make the application's header continuous before delivering up.\r
-///\r
-typedef union {\r
- EFI_UDP4_COMPLETION_TOKEN Udp4;\r
- EFI_UDP6_COMPLETION_TOKEN Udp6;\r
-} UDP_COMPLETION_TOKEN;\r
-\r
-typedef struct {\r
- UINT32 Signature;\r
- UDP_IO *UdpIo;\r
-\r
- UDP_IO_CALLBACK CallBack;\r
- VOID *Context;\r
- UINT32 HeadLen;\r
-\r
- UDP_COMPLETION_TOKEN Token;\r
-} UDP_RX_TOKEN;\r
-\r
-\r
-\r
-///\r
-/// This structure is used internally by UdpIo Library.\r
-///\r
-/// Each transmit request is wrapped in an UDP_TX_TOKEN. Upon completion,\r
-/// the CallBack will be called. There can be several transmit requests. All transmit\r
-/// requests are linked in a list.\r
-///\r
-\r
-typedef union {\r
- EFI_UDP4_SESSION_DATA Udp4;\r
- EFI_UDP6_SESSION_DATA Udp6;\r
-} UDP_SESSION_DATA;\r
-\r
-typedef union {\r
- EFI_UDP4_TRANSMIT_DATA Udp4;\r
- EFI_UDP6_TRANSMIT_DATA Udp6;\r
-} UDP_TRANSMIT_DATA;\r
-\r
-typedef struct {\r
- UINT32 Signature;\r
- LIST_ENTRY Link;\r
- UDP_IO *UdpIo;\r
- UDP_IO_CALLBACK CallBack;\r
- NET_BUF *Packet;\r
- VOID *Context;\r
- EFI_IPv4_ADDRESS Gateway;\r
- UDP_SESSION_DATA Session;\r
- UDP_COMPLETION_TOKEN Token;\r
- UDP_TRANSMIT_DATA Data;\r
-} UDP_TX_TOKEN;\r
-\r
-///\r
-/// Type defined as UDP_IO.\r
-///\r
-/// This data structure wraps the UDP instance and configuration.\r
-/// UdpIo Library uses this structure for all Udp4 or Udp6 operations.\r
-///\r
-struct _UDP_IO {\r
- UINT32 Signature;\r
- LIST_ENTRY Link;\r
- INTN RefCnt;\r
- UINT8 UdpVersion;\r
-\r
- //\r
- // Handle used to create/destroy UDP child\r
- //\r
- EFI_HANDLE Controller;\r
- EFI_HANDLE Image;\r
- EFI_HANDLE UdpHandle;\r
-\r
- EFI_SIMPLE_NETWORK_MODE SnpMode;\r
-\r
- LIST_ENTRY SentDatagram; ///< A list of UDP_TX_TOKEN.\r
- UDP_RX_TOKEN *RecvRequest;\r
-\r
- union {\r
- EFI_UDP4_PROTOCOL *Udp4;\r
- EFI_UDP6_PROTOCOL *Udp6;\r
- } Protocol;\r
-\r
- union {\r
- EFI_UDP4_CONFIG_DATA Udp4;\r
- EFI_UDP6_CONFIG_DATA Udp6;\r
- } Config;\r
-};\r
-\r
-/**\r
- The prototype called when UdpIo Library configures a UDP instance.\r
-\r
- The prototype is set and called when creating a UDP_IO in UdpIoCreatePort().\r
-\r
- @param[in] UdpIo The UDP_IO to configure.\r
- @param[in] Context The user-defined data when calling UdpIoCreatePort().\r
-\r
- @retval EFI_SUCCESS The configuration succeeded.\r
- @retval Others The UDP_IO fails to configure indicating\r
- UdpIoCreatePort() should fail.\r
-**/\r
-typedef\r
-EFI_STATUS\r
-(EFIAPI *UDP_IO_CONFIG) (\r
- IN UDP_IO *UdpIo,\r
- IN VOID *Context\r
- );\r
-\r
-/**\r
- The select function to decide whether to cancel the UDP_TX_TOKEN.\r
-\r
- @param[in] Token The UDP_TX_TOKEN to decide whether to cancel.\r
- @param[in] Context User-defined data in UdpIoCancelDgrams().\r
-\r
- @retval TRUE Cancel the UDP_TX_TOKEN.\r
- @retval FALSE Do not cancel this UDP_TX_TOKEN.\r
-\r
-**/\r
-typedef\r
-BOOLEAN\r
-(EFIAPI *UDP_IO_TO_CANCEL) (\r
- IN UDP_TX_TOKEN *Token,\r
- IN VOID *Context\r
- );\r
-\r
-/**\r
- Cancel all the sent datagram that pass the selection criteria of ToCancel.\r
-\r
- If ToCancel is NULL, all the datagrams are cancelled.\r
- If Udp version is not UDP_IO_UDP4_VERSION or UDP_IO_UDP6_VERSION, then ASSERT().\r
-\r
- @param[in] UdpIo The UDP_IO to cancel packet.\r
- @param[in] IoStatus The IoStatus to return to the packet owners.\r
- @param[in] ToCancel The select funtion to test whether to cancel this\r
- packet or not.\r
- @param[in] Context The opaque parameter to the ToCancel.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-UdpIoCancelDgrams (\r
- IN UDP_IO *UdpIo,\r
- IN EFI_STATUS IoStatus,\r
- IN UDP_IO_TO_CANCEL ToCancel, OPTIONAL\r
- IN VOID *Context OPTIONAL\r
- );\r
-\r
-/**\r
- Creates a UDP_IO to access the UDP service. It creates and configures\r
- a UDP child.\r
-\r
- If Configure is NULL, then ASSERT().\r
- If Udp version is not UDP_IO_UDP4_VERSION or UDP_IO_UDP6_VERSION, then ASSERT().\r
-\r
- It locates the UDP service binding prototype on the Controller parameter\r
- uses the UDP service binding prototype to create a UDP child (also known as\r
- a UDP instance) configures the UDP child by calling Configure function prototype.\r
- Any failures in creating or configuring the UDP child return NULL for failure.\r
-\r
- @param[in] Controller The controller that has the UDP service binding.\r
- protocol installed.\r
- @param[in] ImageHandle The image handle for the driver.\r
- @param[in] Configure The function to configure the created UDP child.\r
- @param[in] UdpVersion The UDP protocol version, UDP4 or UDP6.\r
- @param[in] Context The opaque parameter for the Configure funtion.\r
-\r
- @return The newly-created UDP_IO, or NULL if failed.\r
-\r
-**/\r
-UDP_IO *\r
-EFIAPI\r
-UdpIoCreateIo (\r
- IN EFI_HANDLE Controller,\r
- IN EFI_HANDLE ImageHandle,\r
- IN UDP_IO_CONFIG Configure,\r
- IN UINT8 UdpVersion,\r
- IN VOID *Context\r
- );\r
-\r
-/**\r
- Free the UDP_IO and all its related resources.\r
-\r
- If Udp version is not UDP_IO_UDP4_VERSION or UDP_IO_UDP6_VERSION, then ASSERT().\r
-\r
- The function cancels all sent datagrams and receive requests.\r
-\r
- @param[in] UdpIo The UDP_IO to free.\r
-\r
- @retval EFI_SUCCESS The UDP_IO is freed.\r
- @retval Others Failed to free UDP_IO.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-UdpIoFreeIo (\r
- IN UDP_IO *UdpIo\r
- );\r
-\r
-/**\r
- Cleans up the UDP_IO without freeing it. Call this function\r
- if you intend to later re-use the UDP_IO.\r
-\r
- If Udp version is not UDP_IO_UDP4_VERSION or UDP_IO_UDP6_VERSION, then ASSERT().\r
-\r
- This function releases all transmitted datagrams and receive requests and configures NULL for the UDP instance.\r
-\r
- @param[in] UdpIo The UDP_IO to clean up.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-UdpIoCleanIo (\r
- IN UDP_IO *UdpIo\r
- );\r
-\r
-/**\r
- Send a packet through the UDP_IO.\r
-\r
- If Udp version is not UDP_IO_UDP4_VERSION or UDP_IO_UDP6_VERSION, then ASSERT().\r
-\r
- The packet will be wrapped in UDP_TX_TOKEN. Function Callback will be called\r
- when the packet is sent. The optional parameter EndPoint overrides the default\r
- address pair if specified.\r
-\r
- @param[in] UdpIo The UDP_IO to send the packet through.\r
- @param[in] Packet The packet to send.\r
- @param[in] EndPoint The local and remote access point. Override the\r
- default address pair set during configuration.\r
- @param[in] Gateway The gateway to use.\r
- @param[in] CallBack The function being called when packet is\r
- transmitted or failed.\r
- @param[in] Context The opaque parameter passed to CallBack.\r
-\r
- @retval EFI_OUT_OF_RESOURCES Failed to allocate resource for the packet.\r
- @retval EFI_SUCCESS The packet is successfully delivered to UDP for\r
- transmission.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-UdpIoSendDatagram (\r
- IN UDP_IO *UdpIo,\r
- IN NET_BUF *Packet,\r
- IN UDP_END_POINT *EndPoint OPTIONAL,\r
- IN EFI_IP_ADDRESS *Gateway OPTIONAL,\r
- IN UDP_IO_CALLBACK CallBack,\r
- IN VOID *Context\r
- );\r
-\r
-/**\r
- Cancel a single sent datagram.\r
-\r
- @param[in] UdpIo The UDP_IO from which to cancel the packet\r
- @param[in] Packet The packet to cancel\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-UdpIoCancelSentDatagram (\r
- IN UDP_IO *UdpIo,\r
- IN NET_BUF *Packet\r
- );\r
-\r
-/**\r
- Issue a receive request to the UDP_IO.\r
-\r
- If Udp version is not UDP_IO_UDP4_VERSION or UDP_IO_UDP6_VERSION, then ASSERT().\r
-\r
- This function is called when upper-layer needs packet from UDP for processing.\r
- Only one receive request is acceptable at a time. Therefore, one common usage model is\r
- to invoke this function inside its Callback function when the former packet\r
- is processed.\r
-\r
- @param[in] UdpIo The UDP_IO to receive the packet from.\r
- @param[in] CallBack The call back function to execute when the packet\r
- is received.\r
- @param[in] Context The opaque context passed to Callback.\r
- @param[in] HeadLen The length of the upper-layer's protocol header.\r
-\r
- @retval EFI_ALREADY_STARTED There is already a pending receive request. Only\r
- one receive request is supported at a time.\r
- @retval EFI_OUT_OF_RESOURCES Failed to allocate needed resources.\r
- @retval EFI_SUCCESS The receive request was issued successfully.\r
- @retval EFI_UNSUPPORTED The UDP version in UDP_IO is not supported.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-UdpIoRecvDatagram (\r
- IN UDP_IO *UdpIo,\r
- IN UDP_IO_CALLBACK CallBack,\r
- IN VOID *Context,\r
- IN UINT32 HeadLen\r
- );\r
-\r
-#endif\r
-\r
[Packages]\r
MdePkg/MdePkg.dec\r
MdeModulePkg/MdeModulePkg.dec\r
+ NetworkPkg/NetworkPkg.dec\r
ShellPkg/ShellPkg.dec\r
\r
[LibraryClasses]\r
[Packages]\r
MdePkg/MdePkg.dec\r
MdeModulePkg/MdeModulePkg.dec\r
+ NetworkPkg/NetworkPkg.dec\r
\r
\r
[LibraryClasses]\r
[Packages]\r
MdePkg/MdePkg.dec\r
MdeModulePkg/MdeModulePkg.dec\r
+ NetworkPkg/NetworkPkg.dec\r
\r
\r
[LibraryClasses]\r
[Packages]\r
MdePkg/MdePkg.dec\r
MdeModulePkg/MdeModulePkg.dec\r
+ NetworkPkg/NetworkPkg.dec\r
\r
[Sources]\r
ComponentName.c\r
[Packages]\r
MdePkg/MdePkg.dec\r
MdeModulePkg/MdeModulePkg.dec\r
+ NetworkPkg/NetworkPkg.dec\r
\r
[LibraryClasses]\r
UefiDriverEntryPoint\r
[Packages]\r
MdePkg/MdePkg.dec\r
MdeModulePkg/MdeModulePkg.dec\r
+ NetworkPkg/NetworkPkg.dec\r
\r
[Sources]\r
HttpUtilitiesDxe.h\r
--- /dev/null
+/** @file\r
+ DpcLib.h.\r
+\r
+Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
+\r
+**/\r
+\r
+#ifndef _DPC_LIB_H_\r
+#define _DPC_LIB_H_\r
+\r
+#include <Protocol/Dpc.h>\r
+\r
+/**\r
+ Add a Deferred Procedure Call to the end of the DPC queue.\r
+\r
+ @param[in] DpcTpl The EFI_TPL that the DPC should invoke.\r
+ @param[in] DpcProcedure The pointer to the DPC's function.\r
+ @param[in] DpcContext The pointer to the DPC's context. Passed to DpcProcedure\r
+ when DpcProcedure is invoked.\r
+\r
+ @retval EFI_SUCCESS The DPC was queued.\r
+ @retval EFI_INVALID_PARAMETER DpcTpl is not a valid EFI_TPL.\r
+ @retval EFI_INVALID_PARAMETER DpcProcedure is NULL.\r
+ @retval EFI_OUT_OF_RESOURCES There are not enough resources available to\r
+ add the DPC to the queue.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+QueueDpc (\r
+ IN EFI_TPL DpcTpl,\r
+ IN EFI_DPC_PROCEDURE DpcProcedure,\r
+ IN VOID *DpcContext OPTIONAL\r
+ );\r
+\r
+/**\r
+ Dispatch the queue of DPCs. All DPCs that have been queued with a DpcTpl\r
+ value greater than or equal to the current TPL are invoked in the order that\r
+ they were queued. DPCs with higher DpcTpl values are invoked before DPCs with\r
+ lower DpcTpl values.\r
+\r
+ @retval EFI_SUCCESS One or more DPCs were invoked.\r
+ @retval EFI_NOT_FOUND No DPCs were invoked.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+DispatchDpc (\r
+ VOID\r
+ );\r
+\r
+#endif\r
--- /dev/null
+/** @file\r
+ This library is used to share code between UEFI network stack modules.\r
+ It provides the helper routines to parse the HTTP message byte stream.\r
+\r
+Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.<BR>\r
+(C) Copyright 2016 Hewlett Packard Enterprise Development LP<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
+\r
+**/\r
+\r
+#ifndef _HTTP_LIB_H_\r
+#define _HTTP_LIB_H_\r
+\r
+#include <Protocol/Http.h>\r
+\r
+\r
+/**\r
+ Decode a percent-encoded URI component to the ASCII character.\r
+\r
+ Decode the input component in Buffer according to RFC 3986. The caller is responsible to make\r
+ sure ResultBuffer points to a buffer with size equal or greater than ((AsciiStrSize (Buffer))\r
+ in bytes.\r
+\r
+ @param[in] Buffer The pointer to a percent-encoded URI component.\r
+ @param[in] BufferLength Length of Buffer in bytes.\r
+ @param[out] ResultBuffer Point to the buffer to store the decode result.\r
+ @param[out] ResultLength Length of decoded string in ResultBuffer in bytes.\r
+\r
+ @retval EFI_SUCCESS Successfully decoded the URI.\r
+ @retval EFI_INVALID_PARAMETER Buffer is not a valid percent-encoded string.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+UriPercentDecode (\r
+ IN CHAR8 *Buffer,\r
+ IN UINT32 BufferLength,\r
+ OUT CHAR8 *ResultBuffer,\r
+ OUT UINT32 *ResultLength\r
+ );\r
+\r
+/**\r
+ Create a URL parser for the input URL string.\r
+\r
+ This function will parse and dereference the input HTTP URL into it components. The original\r
+ content of the URL won't be modified and the result will be returned in UrlParser, which can\r
+ be used in other functions like NetHttpUrlGetHostName(). It is the caller's responsibility to\r
+ free the buffer returned in *UrlParser by HttpUrlFreeParser().\r
+\r
+ @param[in] Url The pointer to a HTTP URL string.\r
+ @param[in] Length Length of Url in bytes.\r
+ @param[in] IsConnectMethod Whether the Url is used in HTTP CONNECT method or not.\r
+ @param[out] UrlParser Pointer to the returned buffer to store the parse result.\r
+\r
+ @retval EFI_SUCCESS Successfully dereferenced the HTTP URL.\r
+ @retval EFI_INVALID_PARAMETER UrlParser is NULL or Url is not a valid HTTP URL.\r
+ @retval EFI_OUT_OF_RESOURCES Could not allocate needed resources.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HttpParseUrl (\r
+ IN CHAR8 *Url,\r
+ IN UINT32 Length,\r
+ IN BOOLEAN IsConnectMethod,\r
+ OUT VOID **UrlParser\r
+ );\r
+\r
+/**\r
+ Get the Hostname from a HTTP URL.\r
+\r
+ This function will return the HostName according to the Url and previous parse result ,and\r
+ it is the caller's responsibility to free the buffer returned in *HostName.\r
+\r
+ @param[in] Url The pointer to a HTTP URL string.\r
+ @param[in] UrlParser URL Parse result returned by NetHttpParseUrl().\r
+ @param[out] HostName Pointer to a buffer to store the HostName.\r
+\r
+ @retval EFI_SUCCESS Successfully get the required component.\r
+ @retval EFI_INVALID_PARAMETER Uri is NULL or HostName is NULL or UrlParser is invalid.\r
+ @retval EFI_NOT_FOUND No hostName component in the URL.\r
+ @retval EFI_OUT_OF_RESOURCES Could not allocate needed resources.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HttpUrlGetHostName (\r
+ IN CHAR8 *Url,\r
+ IN VOID *UrlParser,\r
+ OUT CHAR8 **HostName\r
+ );\r
+\r
+/**\r
+ Get the IPv4 address from a HTTP URL.\r
+\r
+ This function will return the IPv4 address according to the Url and previous parse result.\r
+\r
+ @param[in] Url The pointer to a HTTP URL string.\r
+ @param[in] UrlParser URL Parse result returned by NetHttpParseUrl().\r
+ @param[out] Ip4Address Pointer to a buffer to store the IP address.\r
+\r
+ @retval EFI_SUCCESS Successfully get the required component.\r
+ @retval EFI_INVALID_PARAMETER Uri is NULL or Ip4Address is NULL or UrlParser is invalid.\r
+ @retval EFI_NOT_FOUND No IPv4 address component in the URL.\r
+ @retval EFI_OUT_OF_RESOURCES Could not allocate needed resources.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HttpUrlGetIp4 (\r
+ IN CHAR8 *Url,\r
+ IN VOID *UrlParser,\r
+ OUT EFI_IPv4_ADDRESS *Ip4Address\r
+ );\r
+\r
+/**\r
+ Get the IPv6 address from a HTTP URL.\r
+\r
+ This function will return the IPv6 address according to the Url and previous parse result.\r
+\r
+ @param[in] Url The pointer to a HTTP URL string.\r
+ @param[in] UrlParser URL Parse result returned by NetHttpParseUrl().\r
+ @param[out] Ip6Address Pointer to a buffer to store the IP address.\r
+\r
+ @retval EFI_SUCCESS Successfully get the required component.\r
+ @retval EFI_INVALID_PARAMETER Uri is NULL or Ip6Address is NULL or UrlParser is invalid.\r
+ @retval EFI_NOT_FOUND No IPv6 address component in the URL.\r
+ @retval EFI_OUT_OF_RESOURCES Could not allocate needed resources.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HttpUrlGetIp6 (\r
+ IN CHAR8 *Url,\r
+ IN VOID *UrlParser,\r
+ OUT EFI_IPv6_ADDRESS *Ip6Address\r
+ );\r
+\r
+/**\r
+ Get the port number from a HTTP URL.\r
+\r
+ This function will return the port number according to the Url and previous parse result.\r
+\r
+ @param[in] Url The pointer to a HTTP URL string.\r
+ @param[in] UrlParser URL Parse result returned by NetHttpParseUrl().\r
+ @param[out] Port Pointer to a buffer to store the port number.\r
+\r
+ @retval EFI_SUCCESS Successfully get the required component.\r
+ @retval EFI_INVALID_PARAMETER Uri is NULL or Port is NULL or UrlParser is invalid.\r
+ @retval EFI_NOT_FOUND No port number in the URL.\r
+ @retval EFI_OUT_OF_RESOURCES Could not allocate needed resources.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HttpUrlGetPort (\r
+ IN CHAR8 *Url,\r
+ IN VOID *UrlParser,\r
+ OUT UINT16 *Port\r
+ );\r
+\r
+/**\r
+ Get the Path from a HTTP URL.\r
+\r
+ This function will return the Path according to the Url and previous parse result,and\r
+ it is the caller's responsibility to free the buffer returned in *Path.\r
+\r
+ @param[in] Url The pointer to a HTTP URL string.\r
+ @param[in] UrlParser URL Parse result returned by NetHttpParseUrl().\r
+ @param[out] Path Pointer to a buffer to store the Path.\r
+\r
+ @retval EFI_SUCCESS Successfully get the required component.\r
+ @retval EFI_INVALID_PARAMETER Uri is NULL or HostName is NULL or UrlParser is invalid.\r
+ @retval EFI_NOT_FOUND No hostName component in the URL.\r
+ @retval EFI_OUT_OF_RESOURCES Could not allocate needed resources.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HttpUrlGetPath (\r
+ IN CHAR8 *Url,\r
+ IN VOID *UrlParser,\r
+ OUT CHAR8 **Path\r
+ );\r
+\r
+/**\r
+ Release the resource of the URL parser.\r
+\r
+ @param[in] UrlParser Pointer to the parser.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+HttpUrlFreeParser (\r
+ IN VOID *UrlParser\r
+ );\r
+\r
+//\r
+// HTTP body parser interface.\r
+//\r
+\r
+typedef enum {\r
+ //\r
+ // Part of entity data.\r
+ // Length of entity body in Data.\r
+ //\r
+ BodyParseEventOnData,\r
+ //\r
+ // End of message body.\r
+ // Length is 0 and Data points to next byte after the end of the message.\r
+ //\r
+ BodyParseEventOnComplete\r
+} HTTP_BODY_PARSE_EVENT;\r
+\r
+/**\r
+ A callback function to intercept events during message parser.\r
+\r
+ This function will be invoked during HttpParseMessageBody() with various events type. An error\r
+ return status of the callback function will cause the HttpParseMessageBody() aborted.\r
+\r
+ @param[in] EventType Event type of this callback call.\r
+ @param[in] Data A pointer to data buffer.\r
+ @param[in] Length Length in bytes of the Data.\r
+ @param[in] Context Callback context set by HttpInitMsgParser().\r
+\r
+ @retval EFI_SUCCESS Continue to parser the message body.\r
+ @retval Others Abort the parse.\r
+\r
+**/\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *HTTP_BODY_PARSER_CALLBACK) (\r
+ IN HTTP_BODY_PARSE_EVENT EventType,\r
+ IN CHAR8 *Data,\r
+ IN UINTN Length,\r
+ IN VOID *Context\r
+);\r
+\r
+/**\r
+ Initialize a HTTP message-body parser.\r
+\r
+ This function will create and initialize a HTTP message parser according to caller provided HTTP message\r
+ header information. It is the caller's responsibility to free the buffer returned in *UrlParser by HttpFreeMsgParser().\r
+\r
+ @param[in] Method The HTTP method (e.g. GET, POST) for this HTTP message.\r
+ @param[in] StatusCode Response status code returned by the remote host.\r
+ @param[in] HeaderCount Number of HTTP header structures in Headers.\r
+ @param[in] Headers Array containing list of HTTP headers.\r
+ @param[in] Callback Callback function that is invoked when parsing the HTTP message-body,\r
+ set to NULL to ignore all events.\r
+ @param[in] Context Pointer to the context that will be passed to Callback.\r
+ @param[out] MsgParser Pointer to the returned buffer to store the message parser.\r
+\r
+ @retval EFI_SUCCESS Successfully initialized the parser.\r
+ @retval EFI_OUT_OF_RESOURCES Could not allocate needed resources.\r
+ @retval EFI_INVALID_PARAMETER MsgParser is NULL or HeaderCount is not NULL but Headers is NULL.\r
+ @retval Others Failed to initialize the parser.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HttpInitMsgParser (\r
+ IN EFI_HTTP_METHOD Method,\r
+ IN EFI_HTTP_STATUS_CODE StatusCode,\r
+ IN UINTN HeaderCount,\r
+ IN EFI_HTTP_HEADER *Headers,\r
+ IN HTTP_BODY_PARSER_CALLBACK Callback,\r
+ IN VOID *Context,\r
+ OUT VOID **MsgParser\r
+ );\r
+\r
+/**\r
+ Parse message body.\r
+\r
+ Parse BodyLength of message-body. This function can be called repeatedly to parse the message-body partially.\r
+\r
+ @param[in, out] MsgParser Pointer to the message parser.\r
+ @param[in] BodyLength Length in bytes of the Body.\r
+ @param[in] Body Pointer to the buffer of the message-body to be parsed.\r
+\r
+ @retval EFI_SUCCESS Successfully parse the message-body.\r
+ @retval EFI_INVALID_PARAMETER MsgParser is NULL or Body is NULL or BodyLength is 0.\r
+ @retval EFI_ABORTED Operation aborted.\r
+ @retval Other Error happened while parsing message body.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HttpParseMessageBody (\r
+ IN OUT VOID *MsgParser,\r
+ IN UINTN BodyLength,\r
+ IN CHAR8 *Body\r
+ );\r
+\r
+/**\r
+ Check whether the message-body is complete or not.\r
+\r
+ @param[in] MsgParser Pointer to the message parser.\r
+\r
+ @retval TRUE Message-body is complete.\r
+ @retval FALSE Message-body is not complete.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+HttpIsMessageComplete (\r
+ IN VOID *MsgParser\r
+ );\r
+\r
+/**\r
+ Get the content length of the entity.\r
+\r
+ Note that in trunk transfer, the entity length is not valid until the whole message body is received.\r
+\r
+ @param[in] MsgParser Pointer to the message parser.\r
+ @param[out] ContentLength Pointer to store the length of the entity.\r
+\r
+ @retval EFI_SUCCESS Successfully to get the entity length.\r
+ @retval EFI_NOT_READY Entity length is not valid yet.\r
+ @retval EFI_INVALID_PARAMETER MsgParser is NULL or ContentLength is NULL.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HttpGetEntityLength (\r
+ IN VOID *MsgParser,\r
+ OUT UINTN *ContentLength\r
+ );\r
+\r
+/**\r
+ Release the resource of the message parser.\r
+\r
+ @param[in] MsgParser Pointer to the message parser.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+HttpFreeMsgParser (\r
+ IN VOID *MsgParser\r
+ );\r
+\r
+\r
+/**\r
+ Find a specified header field according to the field name.\r
+\r
+ @param[in] HeaderCount Number of HTTP header structures in Headers list.\r
+ @param[in] Headers Array containing list of HTTP headers.\r
+ @param[in] FieldName Null terminated string which describes a field name.\r
+\r
+ @return Pointer to the found header or NULL.\r
+\r
+**/\r
+EFI_HTTP_HEADER *\r
+EFIAPI\r
+HttpFindHeader (\r
+ IN UINTN HeaderCount,\r
+ IN EFI_HTTP_HEADER *Headers,\r
+ IN CHAR8 *FieldName\r
+ );\r
+\r
+/**\r
+ Set FieldName and FieldValue into specified HttpHeader.\r
+\r
+ @param[in,out] HttpHeader Specified HttpHeader.\r
+ @param[in] FieldName FieldName of this HttpHeader, a NULL terminated ASCII string.\r
+ @param[in] FieldValue FieldValue of this HttpHeader, a NULL terminated ASCII string.\r
+\r
+\r
+ @retval EFI_SUCCESS The FieldName and FieldValue are set into HttpHeader successfully.\r
+ @retval EFI_INVALID_PARAMETER The parameter is invalid.\r
+ @retval EFI_OUT_OF_RESOURCES Failed to allocate resources.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HttpSetFieldNameAndValue (\r
+ IN OUT EFI_HTTP_HEADER *HttpHeader,\r
+ IN CONST CHAR8 *FieldName,\r
+ IN CONST CHAR8 *FieldValue\r
+ );\r
+\r
+/**\r
+ Get one key/value header pair from the raw string.\r
+\r
+ @param[in] String Pointer to the raw string.\r
+ @param[out] FieldName Points directly to field name within 'HttpHeader'.\r
+ @param[out] FieldValue Points directly to field value within 'HttpHeader'.\r
+\r
+ @return Pointer to the next raw string.\r
+ @return NULL if no key/value header pair from this raw string.\r
+\r
+**/\r
+CHAR8 *\r
+EFIAPI\r
+HttpGetFieldNameAndValue (\r
+ IN CHAR8 *String,\r
+ OUT CHAR8 **FieldName,\r
+ OUT CHAR8 **FieldValue\r
+ );\r
+\r
+/**\r
+ Free existing HeaderFields.\r
+\r
+ @param[in] HeaderFields Pointer to array of key/value header pairs waiting for free.\r
+ @param[in] FieldCount The number of header pairs in HeaderFields.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+HttpFreeHeaderFields (\r
+ IN EFI_HTTP_HEADER *HeaderFields,\r
+ IN UINTN FieldCount\r
+ );\r
+\r
+/**\r
+ Generate HTTP request message.\r
+\r
+ This function will allocate memory for the whole HTTP message and generate a\r
+ well formatted HTTP Request message in it, include the Request-Line, header\r
+ fields and also the message body. It is the caller's responsibility to free\r
+ the buffer returned in *RequestMsg.\r
+\r
+ @param[in] Message Pointer to the EFI_HTTP_MESSAGE structure which\r
+ contains the required information to generate\r
+ the HTTP request message.\r
+ @param[in] Url The URL of a remote host.\r
+ @param[out] RequestMsg Pointer to the created HTTP request message.\r
+ NULL if any error occured.\r
+ @param[out] RequestMsgSize Size of the RequestMsg (in bytes).\r
+\r
+ @retval EFI_SUCCESS If HTTP request string was created successfully.\r
+ @retval EFI_OUT_OF_RESOURCES Failed to allocate resources.\r
+ @retval EFI_INVALID_PARAMETER The input arguments are invalid.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HttpGenRequestMessage (\r
+ IN CONST EFI_HTTP_MESSAGE *Message,\r
+ IN CONST CHAR8 *Url,\r
+ OUT CHAR8 **RequestMsg,\r
+ OUT UINTN *RequestMsgSize\r
+ );\r
+\r
+/**\r
+ Translate the status code in HTTP message to EFI_HTTP_STATUS_CODE defined\r
+ in UEFI 2.5 specification.\r
+\r
+ @param[in] StatusCode The status code value in HTTP message.\r
+\r
+ @return Value defined in EFI_HTTP_STATUS_CODE .\r
+\r
+**/\r
+EFI_HTTP_STATUS_CODE\r
+EFIAPI\r
+HttpMappingToStatusCode (\r
+ IN UINTN StatusCode\r
+ );\r
+\r
+/**\r
+ Check whether header field called FieldName is in DeleteList.\r
+\r
+ @param[in] DeleteList Pointer to array of key/value header pairs.\r
+ @param[in] DeleteCount The number of header pairs.\r
+ @param[in] FieldName Pointer to header field's name.\r
+\r
+ @return TRUE if FieldName is not in DeleteList, that means this header field is valid.\r
+ @return FALSE if FieldName is in DeleteList, that means this header field is invalid.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+HttpIsValidHttpHeader (\r
+ IN CHAR8 *DeleteList[],\r
+ IN UINTN DeleteCount,\r
+ IN CHAR8 *FieldName\r
+ );\r
+\r
+\r
+#endif\r
+\r
--- /dev/null
+/** @file\r
+ This library is only intended to be used by UEFI network stack modules.\r
+ It provides the combined IpIo layer on the EFI IP4 Protocol and EFI IP6 protocol.\r
+\r
+Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
+\r
+**/\r
+\r
+#ifndef _IP_IO_H_\r
+#define _IP_IO_H_\r
+\r
+#include <Protocol/Ip4.h>\r
+#include <Protocol/Ip6.h>\r
+\r
+#include <Library/NetLib.h>\r
+\r
+//\r
+// type and code define for ICMP protocol error\r
+// from IP\r
+//\r
+#define ICMP_TYPE_UNREACH 3\r
+#define ICMP_TYPE_TIMXCEED 11\r
+#define ICMP_TYPE_PARAMPROB 12\r
+#define ICMP_TYPE_SOURCEQUENCH 4\r
+\r
+#define ICMP_CODE_UNREACH_NET 0\r
+#define ICMP_CODE_UNREACH_HOST 1\r
+#define ICMP_CODE_UNREACH_PROTOCOL 2\r
+#define ICMP_CODE_UNREACH_PORT 3\r
+#define ICMP_CODE_UNREACH_NEEDFRAG 4\r
+#define ICMP_CODE_UNREACH_SRCFAIL 5\r
+#define ICMP_CODE_UNREACH_NET_UNKNOWN 6\r
+#define ICMP_CODE_UNREACH_HOST_UNKNOWN 7\r
+#define ICMP_CODE_UNREACH_ISOLATED 8\r
+#define ICMP_CODE_UNREACH_NET_PROHIB 9\r
+#define ICMP_CODE_UNREACH_HOST_PROHIB 10\r
+#define ICMP_CODE_UNREACH_TOSNET 11\r
+#define ICMP_CODE_UNREACH_TOSHOST 12\r
+\r
+/**\r
+ Get the IP header length from the struct EFI_IP4_HEADER. HeaderLength is\r
+ Internet header length in 32-bit words, so HeaderLength<<2 is the real\r
+ length of IP header.\r
+\r
+ @param[out] HdrPtr A pointer to EFI_IP4_HEADER.\r
+\r
+ @return The IP header length.\r
+**/\r
+#define EFI_IP4_HEADER_LEN(HdrPtr) ((HdrPtr)->HeaderLength << 2)\r
+\r
+/**\r
+ To types of ICMP error which consist of ICMP header, IP header and original\r
+ datagram's data, get length from sum of ICMP header length, IP header length\r
+ and first 64 bits of datagram's data length.\r
+\r
+ @param[in] IpHdr A pointer to EFI_IP4_HEADER.\r
+\r
+ @return The ICMP error length.\r
+**/\r
+#define ICMP_ERRLEN(IpHdr) \\r
+ (sizeof(IP4_ICMP_HEAD) + EFI_IP4_HEADER_LEN(IpHdr) + 8)\r
+\r
+/**\r
+ Get the packet header from NET_BUF.\r
+\r
+ @param[out] Buf A pointer to NET_BUF.\r
+ @param[in] Type Header type.\r
+\r
+ @return The pointer to packet header.\r
+**/\r
+#define NET_PROTO_HDR(Buf, Type) ((Type *) ((Buf)->BlockOp[0].Head))\r
+\r
+\r
+extern EFI_IP4_CONFIG_DATA mIp4IoDefaultIpConfigData;\r
+extern EFI_IP6_CONFIG_DATA mIp6IoDefaultIpConfigData;\r
+\r
+\r
+///\r
+/// This error will be delivered to the\r
+/// listening transportation layer protocol\r
+/// that consumes IpIO.\r
+///\r
+\r
+#define ICMP_ERR_UNREACH_NET 0\r
+#define ICMP_ERR_UNREACH_HOST 1\r
+#define ICMP_ERR_UNREACH_PROTOCOL 2\r
+#define ICMP_ERR_UNREACH_PORT 3\r
+#define ICMP_ERR_MSGSIZE 4\r
+#define ICMP_ERR_UNREACH_SRCFAIL 5\r
+#define ICMP_ERR_TIMXCEED_INTRANS 6\r
+#define ICMP_ERR_TIMXCEED_REASS 7\r
+#define ICMP_ERR_QUENCH 8\r
+#define ICMP_ERR_PARAMPROB 9\r
+\r
+#define ICMP6_ERR_UNREACH_NET 0\r
+#define ICMP6_ERR_UNREACH_HOST 1\r
+#define ICMP6_ERR_UNREACH_PROTOCOL 2\r
+#define ICMP6_ERR_UNREACH_PORT 3\r
+#define ICMP6_ERR_PACKAGE_TOOBIG 4\r
+#define ICMP6_ERR_TIMXCEED_HOPLIMIT 5\r
+#define ICMP6_ERR_TIMXCEED_REASS 6\r
+#define ICMP6_ERR_PARAMPROB_HEADER 7\r
+#define ICMP6_ERR_PARAMPROB_NEXHEADER 8\r
+#define ICMP6_ERR_PARAMPROB_IPV6OPTION 9\r
+\r
+///\r
+/// The helper struct for IpIoGetIcmpErrStatus(). It is for internal use only.\r
+///\r
+typedef struct {\r
+ BOOLEAN IsHard;\r
+ BOOLEAN Notify;\r
+} ICMP_ERROR_INFO;\r
+\r
+typedef union {\r
+ EFI_IP4_COMPLETION_TOKEN Ip4Token;\r
+ EFI_IP6_COMPLETION_TOKEN Ip6Token;\r
+} IP_IO_IP_COMPLETION_TOKEN;\r
+\r
+typedef union {\r
+ EFI_IP4_TRANSMIT_DATA Ip4TxData;\r
+ EFI_IP6_TRANSMIT_DATA Ip6TxData;\r
+} IP_IO_IP_TX_DATA;\r
+\r
+typedef union {\r
+ EFI_IP4_RECEIVE_DATA Ip4RxData;\r
+ EFI_IP6_RECEIVE_DATA Ip6RxData;\r
+} IP_IO_IP_RX_DATA;\r
+\r
+typedef union {\r
+ EFI_IP4_OVERRIDE_DATA Ip4OverrideData;\r
+ EFI_IP6_OVERRIDE_DATA Ip6OverrideData;\r
+} IP_IO_OVERRIDE;\r
+\r
+typedef union {\r
+ EFI_IP4_CONFIG_DATA Ip4CfgData;\r
+ EFI_IP6_CONFIG_DATA Ip6CfgData;\r
+} IP_IO_IP_CONFIG_DATA;\r
+\r
+typedef union {\r
+ EFI_IP4_HEADER *Ip4Hdr;\r
+ EFI_IP6_HEADER *Ip6Hdr;\r
+} IP_IO_IP_HEADER;\r
+\r
+typedef union {\r
+ IP4_ADDR SubnetMask;\r
+ UINT8 PrefixLength;\r
+} IP_IO_IP_MASK;\r
+\r
+typedef union {\r
+ EFI_IP4_PROTOCOL *Ip4;\r
+ EFI_IP6_PROTOCOL *Ip6;\r
+} IP_IO_IP_PROTOCOL;\r
+\r
+///\r
+/// The IP session for an IP receive packet.\r
+///\r
+typedef struct _EFI_NET_SESSION_DATA {\r
+ EFI_IP_ADDRESS Source; ///< Source IP of the received packet.\r
+ EFI_IP_ADDRESS Dest; ///< Destination IP of the received packet.\r
+ IP_IO_IP_HEADER IpHdr; ///< IP header of the received packet.\r
+ UINT32 IpHdrLen; ///< IP header length of the received packet.\r
+ ///< For IPv6, it includes the IP6 header\r
+ ///< length and extension header length. For\r
+ ///< IPv4, it includes the IP4 header length\r
+ ///< and options length.\r
+ UINT8 IpVersion; ///< The IP version of the received packet.\r
+} EFI_NET_SESSION_DATA;\r
+\r
+/**\r
+ The prototype is called back when an IP packet is received.\r
+\r
+ @param[in] Status The result of the receive request.\r
+ @param[in] IcmpErr Valid when Status is EFI_ICMP_ERROR.\r
+ @param[in] NetSession The IP session for the received packet.\r
+ @param[in] Pkt The packet received.\r
+ @param[in] Context The data provided by the user for the received packet when\r
+ the callback is registered in IP_IO_OPEN_DATA::RcvdContext.\r
+\r
+**/\r
+typedef\r
+VOID\r
+(EFIAPI *PKT_RCVD_NOTIFY) (\r
+ IN EFI_STATUS Status,\r
+ IN UINT8 IcmpErr,\r
+ IN EFI_NET_SESSION_DATA *NetSession,\r
+ IN NET_BUF *Pkt,\r
+ IN VOID *Context\r
+ );\r
+\r
+/**\r
+ The prototype is called back when an IP packet is sent.\r
+\r
+ @param[in] Status Result of the IP packet being sent.\r
+ @param[in] Context The data provided by user for the received packet when\r
+ the callback is registered in IP_IO_OPEN_DATA::SndContext.\r
+ @param[in] Sender A Union type to specify a pointer of EFI_IP4_PROTOCOL\r
+ or EFI_IP6_PROTOCOL.\r
+ @param[in] NotifyData The Context data specified when calling IpIoSend()\r
+\r
+**/\r
+typedef\r
+VOID\r
+(EFIAPI *PKT_SENT_NOTIFY) (\r
+ IN EFI_STATUS Status,\r
+ IN VOID *Context,\r
+ IN IP_IO_IP_PROTOCOL Sender,\r
+ IN VOID *NotifyData\r
+ );\r
+\r
+///\r
+/// This data structure wraps Ip4/Ip6 instances. The IpIo Library uses it for all\r
+/// Ip4/Ip6 operations.\r
+///\r
+typedef struct _IP_IO {\r
+ ///\r
+ /// The node used to link this IpIo to the active IpIo list.\r
+ ///\r
+ LIST_ENTRY Entry;\r
+\r
+ ///\r
+ /// The list used to maintain the IP instance for different sending purpose.\r
+ ///\r
+ LIST_ENTRY IpList;\r
+\r
+ EFI_HANDLE Controller;\r
+ EFI_HANDLE Image;\r
+ EFI_HANDLE ChildHandle;\r
+ //\r
+ // The IP instance consumed by this IP_IO\r
+ //\r
+ IP_IO_IP_PROTOCOL Ip;\r
+ BOOLEAN IsConfigured;\r
+\r
+ ///\r
+ /// Some ip configuration data can be changed.\r
+ ///\r
+ UINT8 Protocol;\r
+\r
+ ///\r
+ /// Token and event used to get data from IP.\r
+ ///\r
+ IP_IO_IP_COMPLETION_TOKEN RcvToken;\r
+\r
+ ///\r
+ /// List entry used to link the token passed to IP_IO.\r
+ ///\r
+ LIST_ENTRY PendingSndList;\r
+\r
+ //\r
+ // User interface used to get notify from IP_IO\r
+ //\r
+ VOID *RcvdContext; ///< See IP_IO_OPEN_DATA::RcvdContext.\r
+ VOID *SndContext; ///< See IP_IO_OPEN_DATA::SndContext.\r
+ PKT_RCVD_NOTIFY PktRcvdNotify; ///< See IP_IO_OPEN_DATA::PktRcvdNotify.\r
+ PKT_SENT_NOTIFY PktSentNotify; ///< See IP_IO_OPEN_DATA::PktSentNotify.\r
+ UINT8 IpVersion;\r
+ IP4_ADDR StationIp;\r
+ IP4_ADDR SubnetMask;\r
+} IP_IO;\r
+\r
+///\r
+/// The struct is for the user to pass IP configuration and callbacks to IP_IO.\r
+/// It is used by IpIoOpen().\r
+///\r
+typedef struct _IP_IO_OPEN_DATA {\r
+ IP_IO_IP_CONFIG_DATA IpConfigData; ///< Configuration of the IP instance.\r
+ VOID *RcvdContext; ///< Context data used by receive callback.\r
+ VOID *SndContext; ///< Context data used by send callback.\r
+ PKT_RCVD_NOTIFY PktRcvdNotify; ///< Receive callback.\r
+ PKT_SENT_NOTIFY PktSentNotify; ///< Send callback.\r
+} IP_IO_OPEN_DATA;\r
+\r
+///\r
+/// Internal struct book-keeping send request of IP_IO.\r
+///\r
+/// An IP_IO_SEND_ENTRY will be created each time a send request is issued to\r
+/// IP_IO via IpIoSend().\r
+///\r
+typedef struct _IP_IO_SEND_ENTRY {\r
+ LIST_ENTRY Entry;\r
+ IP_IO *IpIo;\r
+ VOID *Context;\r
+ VOID *NotifyData;\r
+ IP_IO_IP_PROTOCOL Ip;\r
+ NET_BUF *Pkt;\r
+ IP_IO_IP_COMPLETION_TOKEN SndToken;\r
+} IP_IO_SEND_ENTRY;\r
+\r
+///\r
+/// The IP_IO_IP_INFO is used in IpIoSend() to override the default IP instance\r
+/// in IP_IO.\r
+///\r
+typedef struct _IP_IO_IP_INFO {\r
+ EFI_IP_ADDRESS Addr;\r
+ IP_IO_IP_MASK PreMask;\r
+ LIST_ENTRY Entry;\r
+ EFI_HANDLE ChildHandle;\r
+ IP_IO_IP_PROTOCOL Ip;\r
+ IP_IO_IP_COMPLETION_TOKEN DummyRcvToken;\r
+ INTN RefCnt;\r
+ UINT8 IpVersion;\r
+} IP_IO_IP_INFO;\r
+\r
+/**\r
+ Create a new IP_IO instance.\r
+\r
+ If IpVersion is not IP_VERSION_4 or IP_VERSION_6, then ASSERT().\r
+\r
+ This function uses IP4/IP6 service binding protocol in Controller to create\r
+ an IP4/IP6 child (aka IP4/IP6 instance).\r
+\r
+ @param[in] Image The image handle of the driver or application that\r
+ consumes IP_IO.\r
+ @param[in] Controller The controller handle that has IP4 or IP6 service\r
+ binding protocol installed.\r
+ @param[in] IpVersion The version of the IP protocol to use, either\r
+ IPv4 or IPv6.\r
+\r
+ @return The pointer to a newly created IP_IO instance, or NULL if failed.\r
+\r
+**/\r
+IP_IO *\r
+EFIAPI\r
+IpIoCreate (\r
+ IN EFI_HANDLE Image,\r
+ IN EFI_HANDLE Controller,\r
+ IN UINT8 IpVersion\r
+ );\r
+\r
+/**\r
+ Destroy an IP_IO instance.\r
+\r
+ This function is paired with IpIoCreate(). The IP_IO will be closed first.\r
+ Resource will be freed afterwards. See IpIoClose().\r
+\r
+ @param[in, out] IpIo The pointer to the IP_IO instance that needs to be\r
+ destroyed.\r
+\r
+ @retval EFI_SUCCESS The IP_IO instance was destroyed successfully.\r
+ @retval Others An error condition occurred.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+IpIoDestroy (\r
+ IN OUT IP_IO *IpIo\r
+ );\r
+\r
+/**\r
+ Stop an IP_IO instance.\r
+\r
+ If Ip version is not IP_VERSION_4 or IP_VERSION_6, then ASSERT().\r
+\r
+ This function is paired with IpIoOpen(). The IP_IO will be unconfigured, and all\r
+ pending send/receive tokens will be canceled.\r
+\r
+ @param[in, out] IpIo The pointer to the IP_IO instance that needs to stop.\r
+\r
+ @retval EFI_SUCCESS The IP_IO instance stopped successfully.\r
+ @retval EFI_INVALID_PARAMETER Invalid input parameter.\r
+ @retval Others Anrror condition occurred.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+IpIoStop (\r
+ IN OUT IP_IO *IpIo\r
+ );\r
+\r
+/**\r
+ Open an IP_IO instance for use.\r
+\r
+ If Ip version is not IP_VERSION_4 or IP_VERSION_6, then ASSERT().\r
+\r
+ This function is called after IpIoCreate(). It is used for configuring the IP\r
+ instance and register the callbacks and their context data for sending and\r
+ receiving IP packets.\r
+\r
+ @param[in, out] IpIo The pointer to an IP_IO instance that needs\r
+ to open.\r
+ @param[in] OpenData The configuration data and callbacks for\r
+ the IP_IO instance.\r
+\r
+ @retval EFI_SUCCESS The IP_IO instance opened with OpenData\r
+ successfully.\r
+ @retval EFI_ACCESS_DENIED The IP_IO instance is configured, avoid to\r
+ reopen it.\r
+ @retval EFI_UNSUPPORTED IPv4 RawData mode is no supported.\r
+ @retval EFI_INVALID_PARAMETER Invalid input parameter.\r
+ @retval Others Error condition occurred.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+IpIoOpen (\r
+ IN OUT IP_IO *IpIo,\r
+ IN IP_IO_OPEN_DATA *OpenData\r
+ );\r
+\r
+/**\r
+ Send out an IP packet.\r
+\r
+ This function is called after IpIoOpen(). The data to be sent is wrapped in\r
+ Pkt. The IP instance wrapped in IpIo is used for sending by default but can be\r
+ overriden by Sender. Other sending configs, like source address and gateway\r
+ address etc., are specified in OverrideData.\r
+\r
+ @param[in, out] IpIo Pointer to an IP_IO instance used for sending IP\r
+ packet.\r
+ @param[in, out] Pkt Pointer to the IP packet to be sent.\r
+ @param[in] Sender The IP protocol instance used for sending.\r
+ @param[in] Context Optional context data.\r
+ @param[in] NotifyData Optional notify data.\r
+ @param[in] Dest The destination IP address to send this packet to.\r
+ This parameter is optional when using IPv6.\r
+ @param[in] OverrideData The data to override some configuration of the IP\r
+ instance used for sending.\r
+\r
+ @retval EFI_SUCCESS The operation is completed successfully.\r
+ @retval EFI_INVALID_PARAMETER The input parameter is not correct.\r
+ @retval EFI_NOT_STARTED The IpIo is not configured.\r
+ @retval EFI_OUT_OF_RESOURCES Failed due to resource limit.\r
+ @retval Others Error condition occurred.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+IpIoSend (\r
+ IN OUT IP_IO *IpIo,\r
+ IN OUT NET_BUF *Pkt,\r
+ IN IP_IO_IP_INFO *Sender OPTIONAL,\r
+ IN VOID *Context OPTIONAL,\r
+ IN VOID *NotifyData OPTIONAL,\r
+ IN EFI_IP_ADDRESS *Dest OPTIONAL,\r
+ IN IP_IO_OVERRIDE *OverrideData OPTIONAL\r
+ );\r
+\r
+/**\r
+ Cancel the IP transmit token that wraps this Packet.\r
+\r
+ If IpIo is NULL, then ASSERT().\r
+ If Packet is NULL, then ASSERT().\r
+\r
+ @param[in] IpIo The pointer to the IP_IO instance.\r
+ @param[in] Packet The pointer to the packet of NET_BUF to cancel.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+IpIoCancelTxToken (\r
+ IN IP_IO *IpIo,\r
+ IN VOID *Packet\r
+ );\r
+\r
+/**\r
+ Add a new IP instance for sending data.\r
+\r
+ If IpIo is NULL, then ASSERT().\r
+ If Ip version is not IP_VERSION_4 or IP_VERSION_6, then ASSERT().\r
+\r
+ The function is used to add the IP_IO to the IP_IO sending list. The caller\r
+ can later use IpIoFindSender() to get the IP_IO and call IpIoSend() to send\r
+ data.\r
+\r
+ @param[in, out] IpIo The pointer to an IP_IO instance to add a new IP\r
+ instance for sending purposes.\r
+\r
+ @return The pointer to the created IP_IO_IP_INFO structure; NULL if failed.\r
+\r
+**/\r
+IP_IO_IP_INFO *\r
+EFIAPI\r
+IpIoAddIp (\r
+ IN OUT IP_IO *IpIo\r
+ );\r
+\r
+/**\r
+ Configure the IP instance of this IpInfo and start the receiving if IpConfigData\r
+ is not NULL.\r
+\r
+ If Ip version is not IP_VERSION_4 or IP_VERSION_6, then ASSERT().\r
+\r
+ @param[in, out] IpInfo The pointer to the IP_IO_IP_INFO instance.\r
+ @param[in, out] IpConfigData The IP4 or IP6 configure data used to configure\r
+ the IP instance. If NULL, the IP instance is reset.\r
+ If UseDefaultAddress is set to TRUE, and the configure\r
+ operation succeeds, the default address information\r
+ is written back in this IpConfigData.\r
+\r
+ @retval EFI_SUCCESS The IP instance of this IpInfo was configured successfully,\r
+ or there is no need to reconfigure it.\r
+ @retval Others The configuration failed.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+IpIoConfigIp (\r
+ IN OUT IP_IO_IP_INFO *IpInfo,\r
+ IN OUT VOID *IpConfigData OPTIONAL\r
+ );\r
+\r
+/**\r
+ Destroy an IP instance maintained in IpIo->IpList for\r
+ sending purpose.\r
+\r
+ If Ip version is not IP_VERSION_4 or IP_VERSION_6, then ASSERT().\r
+\r
+ This function pairs with IpIoAddIp(). The IpInfo is previously created by\r
+ IpIoAddIp(). The IP_IO_IP_INFO::RefCnt is decremented and the IP instance\r
+ will be dstroyed if the RefCnt is zero.\r
+\r
+ @param[in] IpIo The pointer to the IP_IO instance.\r
+ @param[in] IpInfo The pointer to the IpInfo to be removed.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+IpIoRemoveIp (\r
+ IN IP_IO *IpIo,\r
+ IN IP_IO_IP_INFO *IpInfo\r
+ );\r
+\r
+/**\r
+ Find the first IP protocol maintained in IpIo whose local\r
+ address is the same as Src.\r
+\r
+ This function is called when the caller needs the IpIo to send data to the\r
+ specified Src. The IpIo was added previously by IpIoAddIp().\r
+\r
+ @param[in, out] IpIo The pointer to the pointer of the IP_IO instance.\r
+ @param[in] IpVersion The version of the IP protocol to use, either\r
+ IPv4 or IPv6.\r
+ @param[in] Src The local IP address.\r
+\r
+ @return The pointer to the IP protocol can be used for sending purpose and its local\r
+ address is the same with Src. NULL if failed.\r
+\r
+**/\r
+IP_IO_IP_INFO *\r
+EFIAPI\r
+IpIoFindSender (\r
+ IN OUT IP_IO **IpIo,\r
+ IN UINT8 IpVersion,\r
+ IN EFI_IP_ADDRESS *Src\r
+ );\r
+\r
+/**\r
+ Get the ICMP error map information.\r
+\r
+ The ErrorStatus will be returned. The IsHard and Notify are optional. If they\r
+ are not NULL, this routine will fill them.\r
+\r
+ @param[in] IcmpError IcmpError Type.\r
+ @param[in] IpVersion The version of the IP protocol to use,\r
+ either IPv4 or IPv6.\r
+ @param[out] IsHard If TRUE, indicates that it is a hard error.\r
+ @param[out] Notify If TRUE, SockError needs to be notified.\r
+\r
+ @retval EFI_UNSUPPORTED Unrecognizable ICMP error code\r
+ @return The ICMP Error Status, such as EFI_NETWORK_UNREACHABLE.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+IpIoGetIcmpErrStatus (\r
+ IN UINT8 IcmpError,\r
+ IN UINT8 IpVersion,\r
+ OUT BOOLEAN *IsHard OPTIONAL,\r
+ OUT BOOLEAN *Notify OPTIONAL\r
+ );\r
+\r
+/**\r
+ Refresh the remote peer's Neighbor Cache entries.\r
+\r
+ This function is called when the caller needs the IpIo to refresh the existing\r
+ IPv6 neighbor cache entries since the neighbor is considered reachable by the\r
+ node has recently received a confirmation that packets sent recently to the\r
+ neighbor were received by its IP layer.\r
+\r
+ @param[in] IpIo The pointer to an IP_IO instance\r
+ @param[in] Neighbor The IP address of the neighbor\r
+ @param[in] Timeout The time in 100-ns units that this entry will\r
+ remain in the neighbor cache. A value of\r
+ zero means that the entry is permanent.\r
+ A value of non-zero means that the entry is\r
+ dynamic and will be deleted after Timeout.\r
+\r
+ @retval EFI_SUCCESS The operation completed successfully.\r
+ @retval EFI_NOT_STARTED The IpIo is not configured.\r
+ @retval EFI_INVALID_PARAMETER The Neighbor Address is invalid.\r
+ @retval EFI_NOT_FOUND The neighbor cache entry is not in the\r
+ neighbor table.\r
+ @retval EFI_UNSUPPORTED IP version is IPv4, which doesn't support neighbor cache refresh.\r
+ @retval EFI_OUT_OF_RESOURCES Failed due to resource limitations.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+IpIoRefreshNeighbor (\r
+ IN IP_IO *IpIo,\r
+ IN EFI_IP_ADDRESS *Neighbor,\r
+ IN UINT32 Timeout\r
+ );\r
+\r
+#endif\r
+\r
--- /dev/null
+/** @file\r
+ This library is only intended to be used by UEFI network stack modules.\r
+ It provides basic functions for the UEFI network stack.\r
+\r
+Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
+\r
+**/\r
+\r
+#ifndef _NET_LIB_H_\r
+#define _NET_LIB_H_\r
+\r
+#include <Protocol/Ip6.h>\r
+\r
+#include <Library/BaseLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+\r
+typedef UINT32 IP4_ADDR;\r
+typedef UINT32 TCP_SEQNO;\r
+typedef UINT16 TCP_PORTNO;\r
+\r
+\r
+#define NET_ETHER_ADDR_LEN 6\r
+#define NET_IFTYPE_ETHERNET 0x01\r
+\r
+#define NET_VLAN_TAG_LEN 4\r
+#define ETHER_TYPE_VLAN 0x8100\r
+\r
+#define EFI_IP_PROTO_UDP 0x11\r
+#define EFI_IP_PROTO_TCP 0x06\r
+#define EFI_IP_PROTO_ICMP 0x01\r
+#define IP4_PROTO_IGMP 0x02\r
+#define IP6_ICMP 58\r
+#define DNS_MAX_NAME_SIZE 255\r
+#define DNS_MAX_MESSAGE_SIZE 512\r
+\r
+//\r
+// The address classification\r
+//\r
+#define IP4_ADDR_CLASSA 1 // Deprecated\r
+#define IP4_ADDR_CLASSB 2 // Deprecated\r
+#define IP4_ADDR_CLASSC 3 // Deprecated\r
+#define IP4_ADDR_CLASSD 4\r
+#define IP4_ADDR_CLASSE 5\r
+\r
+#define IP4_MASK_NUM 33\r
+#define IP6_PREFIX_NUM 129\r
+\r
+#define IP4_MASK_MAX 32\r
+#define IP6_PREFIX_MAX 128\r
+\r
+#define IP6_HOP_BY_HOP 0\r
+#define IP6_DESTINATION 60\r
+#define IP6_ROUTING 43\r
+#define IP6_FRAGMENT 44\r
+#define IP6_AH 51\r
+#define IP6_ESP 50\r
+#define IP6_NO_NEXT_HEADER 59\r
+\r
+#define IP_VERSION_4 4\r
+#define IP_VERSION_6 6\r
+\r
+#define IP6_PREFIX_LENGTH 64\r
+\r
+//\r
+// DNS QTYPE values\r
+//\r
+#define DNS_TYPE_A 1\r
+#define DNS_TYPE_NS 2\r
+#define DNS_TYPE_CNAME 5\r
+#define DNS_TYPE_SOA 6\r
+#define DNS_TYPE_WKS 11\r
+#define DNS_TYPE_PTR 12\r
+#define DNS_TYPE_HINFO 13\r
+#define DNS_TYPE_MINFO 14\r
+#define DNS_TYPE_MX 15\r
+#define DNS_TYPE_TXT 16\r
+#define DNS_TYPE_AAAA 28\r
+#define DNS_TYPE_SRV_RR 33\r
+#define DNS_TYPE_AXFR 252\r
+#define DNS_TYPE_MAILB 253\r
+#define DNS_TYPE_ANY 255\r
+\r
+//\r
+// DNS QCLASS values\r
+//\r
+#define DNS_CLASS_INET 1\r
+#define DNS_CLASS_CH 3\r
+#define DNS_CLASS_HS 4\r
+#define DNS_CLASS_ANY 255\r
+\r
+//\r
+// Number of 100ns units time Interval for network media state detect\r
+//\r
+#define MEDIA_STATE_DETECT_TIME_INTERVAL 1000000U\r
+\r
+\r
+#pragma pack(1)\r
+\r
+//\r
+// Ethernet head definition\r
+//\r
+typedef struct {\r
+ UINT8 DstMac [NET_ETHER_ADDR_LEN];\r
+ UINT8 SrcMac [NET_ETHER_ADDR_LEN];\r
+ UINT16 EtherType;\r
+} ETHER_HEAD;\r
+\r
+//\r
+// 802.1Q VLAN Tag Control Information\r
+//\r
+typedef union {\r
+ struct {\r
+ UINT16 Vid : 12; // Unique VLAN identifier (0 to 4094)\r
+ UINT16 Cfi : 1; // Canonical Format Indicator\r
+ UINT16 Priority : 3; // 802.1Q priority level (0 to 7)\r
+ } Bits;\r
+ UINT16 Uint16;\r
+} VLAN_TCI;\r
+\r
+#define VLAN_TCI_CFI_CANONICAL_MAC 0\r
+#define VLAN_TCI_CFI_NON_CANONICAL_MAC 1\r
+\r
+//\r
+// The EFI_IP4_HEADER is hard to use because the source and\r
+// destination address are defined as EFI_IPv4_ADDRESS, which\r
+// is a structure. Two structures can't be compared or masked\r
+// directly. This is why there is an internal representation.\r
+//\r
+typedef struct {\r
+ UINT8 HeadLen : 4;\r
+ UINT8 Ver : 4;\r
+ UINT8 Tos;\r
+ UINT16 TotalLen;\r
+ UINT16 Id;\r
+ UINT16 Fragment;\r
+ UINT8 Ttl;\r
+ UINT8 Protocol;\r
+ UINT16 Checksum;\r
+ IP4_ADDR Src;\r
+ IP4_ADDR Dst;\r
+} IP4_HEAD;\r
+\r
+\r
+//\r
+// ICMP head definition. Each ICMP message is categorized as either an error\r
+// message or query message. Two message types have their own head format.\r
+//\r
+typedef struct {\r
+ UINT8 Type;\r
+ UINT8 Code;\r
+ UINT16 Checksum;\r
+} IP4_ICMP_HEAD;\r
+\r
+typedef struct {\r
+ IP4_ICMP_HEAD Head;\r
+ UINT32 Fourth; // 4th filed of the head, it depends on Type.\r
+ IP4_HEAD IpHead;\r
+} IP4_ICMP_ERROR_HEAD;\r
+\r
+typedef struct {\r
+ IP4_ICMP_HEAD Head;\r
+ UINT16 Id;\r
+ UINT16 Seq;\r
+} IP4_ICMP_QUERY_HEAD;\r
+\r
+typedef struct {\r
+ UINT8 Type;\r
+ UINT8 Code;\r
+ UINT16 Checksum;\r
+} IP6_ICMP_HEAD;\r
+\r
+typedef struct {\r
+ IP6_ICMP_HEAD Head;\r
+ UINT32 Fourth;\r
+ EFI_IP6_HEADER IpHead;\r
+} IP6_ICMP_ERROR_HEAD;\r
+\r
+typedef struct {\r
+ IP6_ICMP_HEAD Head;\r
+ UINT32 Fourth;\r
+} IP6_ICMP_INFORMATION_HEAD;\r
+\r
+//\r
+// UDP header definition\r
+//\r
+typedef struct {\r
+ UINT16 SrcPort;\r
+ UINT16 DstPort;\r
+ UINT16 Length;\r
+ UINT16 Checksum;\r
+} EFI_UDP_HEADER;\r
+\r
+//\r
+// TCP header definition\r
+//\r
+typedef struct {\r
+ TCP_PORTNO SrcPort;\r
+ TCP_PORTNO DstPort;\r
+ TCP_SEQNO Seq;\r
+ TCP_SEQNO Ack;\r
+ UINT8 Res : 4;\r
+ UINT8 HeadLen : 4;\r
+ UINT8 Flag;\r
+ UINT16 Wnd;\r
+ UINT16 Checksum;\r
+ UINT16 Urg;\r
+} TCP_HEAD;\r
+\r
+#pragma pack()\r
+\r
+#define NET_MAC_EQUAL(pMac1, pMac2, Len) \\r
+ (CompareMem ((pMac1), (pMac2), Len) == 0)\r
+\r
+#define NET_MAC_IS_MULTICAST(Mac, BMac, Len) \\r
+ (((*((UINT8 *) Mac) & 0x01) == 0x01) && (!NET_MAC_EQUAL (Mac, BMac, Len)))\r
+\r
+#define NTOHL(x) SwapBytes32 (x)\r
+\r
+#define HTONL(x) NTOHL(x)\r
+\r
+#define NTOHS(x) SwapBytes16 (x)\r
+\r
+#define HTONS(x) NTOHS(x)\r
+#define NTOHLL(x) SwapBytes64 (x)\r
+#define HTONLL(x) NTOHLL(x)\r
+#define NTOHLLL(x) Ip6Swap128 (x)\r
+#define HTONLLL(x) NTOHLLL(x)\r
+\r
+//\r
+// Test the IP's attribute, All the IPs are in host byte order.\r
+//\r
+#define IP4_IS_MULTICAST(Ip) (((Ip) & 0xF0000000) == 0xE0000000)\r
+#define IP4_IS_UNSPECIFIED(Ip) ((Ip) == 0)\r
+#define IP4_IS_LOCAL_BROADCAST(Ip) ((Ip) == 0xFFFFFFFF)\r
+#define IP4_NET_EQUAL(Ip1, Ip2, NetMask) (((Ip1) & (NetMask)) == ((Ip2) & (NetMask)))\r
+#define IP4_IS_VALID_NETMASK(Ip) (NetGetMaskLength (Ip) != (IP4_MASK_MAX + 1))\r
+\r
+#define IP6_IS_MULTICAST(Ip6) (((Ip6)->Addr[0]) == 0xFF)\r
+\r
+//\r
+// Convert the EFI_IP4_ADDRESS to plain UINT32 IP4 address.\r
+//\r
+#define EFI_IP4(EfiIpAddr) (*(IP4_ADDR *) ((EfiIpAddr).Addr))\r
+#define EFI_NTOHL(EfiIp) (NTOHL (EFI_IP4 ((EfiIp))))\r
+#define EFI_IP4_EQUAL(Ip1, Ip2) (CompareMem ((Ip1), (Ip2), sizeof (EFI_IPv4_ADDRESS)) == 0)\r
+\r
+#define EFI_IP6_EQUAL(Ip1, Ip2) (CompareMem ((Ip1), (Ip2), sizeof (EFI_IPv6_ADDRESS)) == 0)\r
+\r
+#define IP4_COPY_ADDRESS(Dest, Src) (CopyMem ((Dest), (Src), sizeof (EFI_IPv4_ADDRESS)))\r
+#define IP6_COPY_ADDRESS(Dest, Src) (CopyMem ((Dest), (Src), sizeof (EFI_IPv6_ADDRESS)))\r
+#define IP6_COPY_LINK_ADDRESS(Mac1, Mac2) (CopyMem ((Mac1), (Mac2), sizeof (EFI_MAC_ADDRESS)))\r
+\r
+//\r
+// The debug level definition. This value is also used as the\r
+// syslog's severity level. Don't change it.\r
+//\r
+#define NETDEBUG_LEVEL_TRACE 5\r
+#define NETDEBUG_LEVEL_WARNING 4\r
+#define NETDEBUG_LEVEL_ERROR 3\r
+\r
+//\r
+// Network debug message is sent out as syslog packet.\r
+//\r
+#define NET_SYSLOG_FACILITY 16 // Syslog local facility local use\r
+#define NET_SYSLOG_PACKET_LEN 512\r
+#define NET_SYSLOG_TX_TIMEOUT (500 * 1000 * 10) // 500ms\r
+#define NET_DEBUG_MSG_LEN 470 // 512 - (ether+ip4+udp4 head length)\r
+\r
+//\r
+// The debug output expects the ASCII format string, Use %a to print ASCII\r
+// string, and %s to print UNICODE string. PrintArg must be enclosed in ().\r
+// For example: NET_DEBUG_TRACE ("Tcp", ("State transit to %a\n", Name));\r
+//\r
+#define NET_DEBUG_TRACE(Module, PrintArg) \\r
+ NetDebugOutput ( \\r
+ NETDEBUG_LEVEL_TRACE, \\r
+ Module, \\r
+ __FILE__, \\r
+ __LINE__, \\r
+ NetDebugASPrint PrintArg \\r
+ )\r
+\r
+#define NET_DEBUG_WARNING(Module, PrintArg) \\r
+ NetDebugOutput ( \\r
+ NETDEBUG_LEVEL_WARNING, \\r
+ Module, \\r
+ __FILE__, \\r
+ __LINE__, \\r
+ NetDebugASPrint PrintArg \\r
+ )\r
+\r
+#define NET_DEBUG_ERROR(Module, PrintArg) \\r
+ NetDebugOutput ( \\r
+ NETDEBUG_LEVEL_ERROR, \\r
+ Module, \\r
+ __FILE__, \\r
+ __LINE__, \\r
+ NetDebugASPrint PrintArg \\r
+ )\r
+\r
+/**\r
+ Allocate a buffer, then format the message to it. This is a\r
+ help function for the NET_DEBUG_XXX macros. The PrintArg of\r
+ these macros treats the variable length print parameters as a\r
+ single parameter, and pass it to the NetDebugASPrint. For\r
+ example, NET_DEBUG_TRACE ("Tcp", ("State transit to %a\n", Name))\r
+ if extracted to:\r
+\r
+ NetDebugOutput (\r
+ NETDEBUG_LEVEL_TRACE,\r
+ "Tcp",\r
+ __FILE__,\r
+ __LINE__,\r
+ NetDebugASPrint ("State transit to %a\n", Name)\r
+ )\r
+\r
+ @param Format The ASCII format string.\r
+ @param ... The variable length parameter whose format is determined\r
+ by the Format string.\r
+\r
+ @return The buffer containing the formatted message,\r
+ or NULL if memory allocation failed.\r
+\r
+**/\r
+CHAR8 *\r
+EFIAPI\r
+NetDebugASPrint (\r
+ IN CHAR8 *Format,\r
+ ...\r
+ );\r
+\r
+/**\r
+ Builds an UDP4 syslog packet and send it using SNP.\r
+\r
+ This function will locate a instance of SNP then send the message through it.\r
+ Because it isn't open the SNP BY_DRIVER, apply caution when using it.\r
+\r
+ @param Level The severity level of the message.\r
+ @param Module The Module that generates the log.\r
+ @param File The file that contains the log.\r
+ @param Line The exact line that contains the log.\r
+ @param Message The user message to log.\r
+\r
+ @retval EFI_INVALID_PARAMETER Any input parameter is invalid.\r
+ @retval EFI_OUT_OF_RESOURCES Failed to allocate memory for the packet\r
+ @retval EFI_SUCCESS The log is discard because that it is more verbose\r
+ than the mNetDebugLevelMax. Or, it has been sent out.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+NetDebugOutput (\r
+ IN UINT32 Level,\r
+ IN UINT8 *Module,\r
+ IN UINT8 *File,\r
+ IN UINT32 Line,\r
+ IN UINT8 *Message\r
+ );\r
+\r
+\r
+/**\r
+ Return the length of the mask.\r
+\r
+ Return the length of the mask. Valid values are 0 to 32.\r
+ If the mask is invalid, return the invalid length 33, which is IP4_MASK_NUM.\r
+ NetMask is in the host byte order.\r
+\r
+ @param[in] NetMask The netmask to get the length from.\r
+\r
+ @return The length of the netmask, or IP4_MASK_NUM (33) if the mask is invalid.\r
+\r
+**/\r
+INTN\r
+EFIAPI\r
+NetGetMaskLength (\r
+ IN IP4_ADDR NetMask\r
+ );\r
+\r
+/**\r
+ Return the class of the IP address, such as class A, B, C.\r
+ Addr is in host byte order.\r
+\r
+ [ATTENTION]\r
+ Classful addressing (IP class A/B/C) has been deprecated according to RFC4632.\r
+ Caller of this function could only check the returned value against\r
+ IP4_ADDR_CLASSD (multicast) or IP4_ADDR_CLASSE (reserved) now.\r
+\r
+ The address of class A starts with 0.\r
+ If the address belong to class A, return IP4_ADDR_CLASSA.\r
+ The address of class B starts with 10.\r
+ If the address belong to class B, return IP4_ADDR_CLASSB.\r
+ The address of class C starts with 110.\r
+ If the address belong to class C, return IP4_ADDR_CLASSC.\r
+ The address of class D starts with 1110.\r
+ If the address belong to class D, return IP4_ADDR_CLASSD.\r
+ The address of class E starts with 1111.\r
+ If the address belong to class E, return IP4_ADDR_CLASSE.\r
+\r
+\r
+ @param[in] Addr The address to get the class from.\r
+\r
+ @return IP address class, such as IP4_ADDR_CLASSA.\r
+\r
+**/\r
+INTN\r
+EFIAPI\r
+NetGetIpClass (\r
+ IN IP4_ADDR Addr\r
+ );\r
+\r
+/**\r
+ Check whether the IP is a valid unicast address according to\r
+ the netmask.\r
+\r
+ ASSERT if NetMask is zero.\r
+\r
+ If all bits of the host address of IP are 0 or 1, IP is also not a valid unicast address,\r
+ except when the originator is one of the endpoints of a point-to-point link with a 31-bit\r
+ mask (RFC3021), or a 32bit NetMask (all 0xFF) is used for special network environment (e.g.\r
+ PPP link).\r
+\r
+ @param[in] Ip The IP to check against.\r
+ @param[in] NetMask The mask of the IP.\r
+\r
+ @return TRUE if IP is a valid unicast address on the network, otherwise FALSE.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+NetIp4IsUnicast (\r
+ IN IP4_ADDR Ip,\r
+ IN IP4_ADDR NetMask\r
+ );\r
+\r
+/**\r
+ Check whether the incoming IPv6 address is a valid unicast address.\r
+\r
+ ASSERT if Ip6 is NULL.\r
+\r
+ If the address is a multicast address has binary 0xFF at the start, it is not\r
+ a valid unicast address. If the address is unspecified ::, it is not a valid\r
+ unicast address to be assigned to any node. If the address is loopback address\r
+ ::1, it is also not a valid unicast address to be assigned to any physical\r
+ interface.\r
+\r
+ @param[in] Ip6 The IPv6 address to check against.\r
+\r
+ @return TRUE if Ip6 is a valid unicast address on the network, otherwise FALSE.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+NetIp6IsValidUnicast (\r
+ IN EFI_IPv6_ADDRESS *Ip6\r
+ );\r
+\r
+\r
+/**\r
+ Check whether the incoming Ipv6 address is the unspecified address or not.\r
+\r
+ ASSERT if Ip6 is NULL.\r
+\r
+ @param[in] Ip6 - Ip6 address, in network order.\r
+\r
+ @retval TRUE - Yes, incoming Ipv6 address is the unspecified address.\r
+ @retval FALSE - The incoming Ipv6 address is not the unspecified address\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+NetIp6IsUnspecifiedAddr (\r
+ IN EFI_IPv6_ADDRESS *Ip6\r
+ );\r
+\r
+/**\r
+ Check whether the incoming Ipv6 address is a link-local address.\r
+\r
+ ASSERT if Ip6 is NULL.\r
+\r
+ @param[in] Ip6 - Ip6 address, in network order.\r
+\r
+ @retval TRUE - The incoming Ipv6 address is a link-local address.\r
+ @retval FALSE - The incoming Ipv6 address is not a link-local address.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+NetIp6IsLinkLocalAddr (\r
+ IN EFI_IPv6_ADDRESS *Ip6\r
+ );\r
+\r
+/**\r
+ Check whether the Ipv6 address1 and address2 are on the connected network.\r
+\r
+ ASSERT if Ip1 or Ip2 is NULL.\r
+ ASSERT if PrefixLength exceeds or equals to IP6_PREFIX_MAX.\r
+\r
+ @param[in] Ip1 - Ip6 address1, in network order.\r
+ @param[in] Ip2 - Ip6 address2, in network order.\r
+ @param[in] PrefixLength - The prefix length of the checking net.\r
+\r
+ @retval TRUE - Yes, the Ipv6 address1 and address2 are connected.\r
+ @retval FALSE - No the Ipv6 address1 and address2 are not connected.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+NetIp6IsNetEqual (\r
+ EFI_IPv6_ADDRESS *Ip1,\r
+ EFI_IPv6_ADDRESS *Ip2,\r
+ UINT8 PrefixLength\r
+ );\r
+\r
+/**\r
+ Switches the endianess of an IPv6 address.\r
+\r
+ ASSERT if Ip6 is NULL.\r
+\r
+ This function swaps the bytes in a 128-bit IPv6 address to switch the value\r
+ from little endian to big endian or vice versa. The byte swapped value is\r
+ returned.\r
+\r
+ @param Ip6 Points to an IPv6 address.\r
+\r
+ @return The byte swapped IPv6 address.\r
+\r
+**/\r
+EFI_IPv6_ADDRESS *\r
+EFIAPI\r
+Ip6Swap128 (\r
+ EFI_IPv6_ADDRESS *Ip6\r
+ );\r
+\r
+extern IP4_ADDR gIp4AllMasks[IP4_MASK_NUM];\r
+\r
+\r
+extern EFI_IPv4_ADDRESS mZeroIp4Addr;\r
+\r
+#define NET_IS_DIGIT(Ch) (('0' <= (Ch)) && ((Ch) <= '9'))\r
+#define NET_IS_HEX(Ch) ((('0' <= (Ch)) && ((Ch) <= '9')) || (('A' <= (Ch)) && ((Ch) <= 'F')) || (('a' <= (Ch)) && ((Ch) <= 'f')))\r
+#define NET_ROUNDUP(size, unit) (((size) + (unit) - 1) & (~((unit) - 1)))\r
+#define NET_IS_LOWER_CASE_CHAR(Ch) (('a' <= (Ch)) && ((Ch) <= 'z'))\r
+#define NET_IS_UPPER_CASE_CHAR(Ch) (('A' <= (Ch)) && ((Ch) <= 'Z'))\r
+\r
+#define TICKS_PER_MS 10000U\r
+#define TICKS_PER_SECOND 10000000U\r
+\r
+#define NET_RANDOM(Seed) ((UINT32) ((UINT32) (Seed) * 1103515245UL + 12345) % 4294967295UL)\r
+\r
+/**\r
+ Extract a UINT32 from a byte stream.\r
+\r
+ ASSERT if Buf is NULL.\r
+\r
+ This function copies a UINT32 from a byte stream, and then converts it from Network\r
+ byte order to host byte order. Use this function to avoid alignment error.\r
+\r
+ @param[in] Buf The buffer to extract the UINT32.\r
+\r
+ @return The UINT32 extracted.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+NetGetUint32 (\r
+ IN UINT8 *Buf\r
+ );\r
+\r
+/**\r
+ Puts a UINT32 into the byte stream in network byte order.\r
+\r
+ ASSERT if Buf is NULL.\r
+\r
+ Converts a UINT32 from host byte order to network byte order, then copies it to the\r
+ byte stream.\r
+\r
+ @param[in, out] Buf The buffer in which to put the UINT32.\r
+ @param[in] Data The data to be converted and put into the byte stream.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+NetPutUint32 (\r
+ IN OUT UINT8 *Buf,\r
+ IN UINT32 Data\r
+ );\r
+\r
+/**\r
+ Initialize a random seed using current time and monotonic count.\r
+\r
+ Get current time and monotonic count first. Then initialize a random seed\r
+ based on some basic mathematics operation on the hour, day, minute, second,\r
+ nanosecond and year of the current time and the monotonic count value.\r
+\r
+ @return The random seed initialized with current time.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+NetRandomInitSeed (\r
+ VOID\r
+ );\r
+\r
+\r
+#define NET_LIST_USER_STRUCT(Entry, Type, Field) \\r
+ BASE_CR(Entry, Type, Field)\r
+\r
+#define NET_LIST_USER_STRUCT_S(Entry, Type, Field, Sig) \\r
+ CR(Entry, Type, Field, Sig)\r
+\r
+//\r
+// Iterate through the double linked list. It is NOT delete safe\r
+//\r
+#define NET_LIST_FOR_EACH(Entry, ListHead) \\r
+ for(Entry = (ListHead)->ForwardLink; Entry != (ListHead); Entry = Entry->ForwardLink)\r
+\r
+//\r
+// Iterate through the double linked list. This is delete-safe.\r
+// Don't touch NextEntry. Also, don't use this macro if list\r
+// entries other than the Entry may be deleted when processing\r
+// the current Entry.\r
+//\r
+#define NET_LIST_FOR_EACH_SAFE(Entry, NextEntry, ListHead) \\r
+ for(Entry = (ListHead)->ForwardLink, NextEntry = Entry->ForwardLink; \\r
+ Entry != (ListHead); \\r
+ Entry = NextEntry, NextEntry = Entry->ForwardLink \\r
+ )\r
+\r
+//\r
+// Make sure the list isn't empty before getting the first/last record.\r
+//\r
+#define NET_LIST_HEAD(ListHead, Type, Field) \\r
+ NET_LIST_USER_STRUCT((ListHead)->ForwardLink, Type, Field)\r
+\r
+#define NET_LIST_TAIL(ListHead, Type, Field) \\r
+ NET_LIST_USER_STRUCT((ListHead)->BackLink, Type, Field)\r
+\r
+\r
+/**\r
+ Remove the first node entry on the list, and return the removed node entry.\r
+\r
+ Removes the first node entry from a doubly linked list. It is up to the caller of\r
+ this function to release the memory used by the first node, if that is required. On\r
+ exit, the removed node is returned.\r
+\r
+ If Head is NULL, then ASSERT().\r
+ If Head was not initialized, then ASSERT().\r
+ If PcdMaximumLinkedListLength is not zero, and the number of nodes in the\r
+ linked list including the head node is greater than or equal to PcdMaximumLinkedListLength,\r
+ then ASSERT().\r
+\r
+ @param[in, out] Head The list header.\r
+\r
+ @return The first node entry that is removed from the list, NULL if the list is empty.\r
+\r
+**/\r
+LIST_ENTRY *\r
+EFIAPI\r
+NetListRemoveHead (\r
+ IN OUT LIST_ENTRY *Head\r
+ );\r
+\r
+/**\r
+ Remove the last node entry on the list and return the removed node entry.\r
+\r
+ Removes the last node entry from a doubly linked list. It is up to the caller of\r
+ this function to release the memory used by the first node, if that is required. On\r
+ exit, the removed node is returned.\r
+\r
+ If Head is NULL, then ASSERT().\r
+ If Head was not initialized, then ASSERT().\r
+ If PcdMaximumLinkedListLength is not zero, and the number of nodes in the\r
+ linked list including the head node is greater than or equal to PcdMaximumLinkedListLength,\r
+ then ASSERT().\r
+\r
+ @param[in, out] Head The list head.\r
+\r
+ @return The last node entry that is removed from the list, NULL if the list is empty.\r
+\r
+**/\r
+LIST_ENTRY *\r
+EFIAPI\r
+NetListRemoveTail (\r
+ IN OUT LIST_ENTRY *Head\r
+ );\r
+\r
+/**\r
+ Insert a new node entry after a designated node entry of a doubly linked list.\r
+\r
+ ASSERT if PrevEntry or NewEntry is NULL.\r
+\r
+ Inserts a new node entry designated by NewEntry after the node entry designated by PrevEntry\r
+ of the doubly linked list.\r
+\r
+ @param[in, out] PrevEntry The entry after which to insert.\r
+ @param[in, out] NewEntry The new entry to insert.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+NetListInsertAfter (\r
+ IN OUT LIST_ENTRY *PrevEntry,\r
+ IN OUT LIST_ENTRY *NewEntry\r
+ );\r
+\r
+/**\r
+ Insert a new node entry before a designated node entry of a doubly linked list.\r
+\r
+ ASSERT if PostEntry or NewEntry is NULL.\r
+\r
+ Inserts a new node entry designated by NewEntry before the node entry designated by PostEntry\r
+ of the doubly linked list.\r
+\r
+ @param[in, out] PostEntry The entry to insert before.\r
+ @param[in, out] NewEntry The new entry to insert.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+NetListInsertBefore (\r
+ IN OUT LIST_ENTRY *PostEntry,\r
+ IN OUT LIST_ENTRY *NewEntry\r
+ );\r
+\r
+/**\r
+ Callback function which provided by user to remove one node in NetDestroyLinkList process.\r
+\r
+ @param[in] Entry The entry to be removed.\r
+ @param[in] Context Pointer to the callback context corresponds to the Context in NetDestroyLinkList.\r
+\r
+ @retval EFI_SUCCESS The entry has been removed successfully.\r
+ @retval Others Fail to remove the entry.\r
+\r
+**/\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *NET_DESTROY_LINK_LIST_CALLBACK) (\r
+ IN LIST_ENTRY *Entry,\r
+ IN VOID *Context OPTIONAL\r
+ );\r
+\r
+/**\r
+ Safe destroy nodes in a linked list, and return the length of the list after all possible operations finished.\r
+\r
+ Destroy network children list by list traversals is not safe due to graph dependencies between nodes.\r
+ This function performs a safe traversal to destroy these nodes by checking to see if the node being destroyed\r
+ has been removed from the list or not.\r
+ If it has been removed, then restart the traversal from the head.\r
+ If it hasn't been removed, then continue with the next node directly.\r
+ This function will end the iterate and return the CallBack's last return value if error happens,\r
+ or retrun EFI_SUCCESS if 2 complete passes are made with no changes in the number of children in the list.\r
+\r
+ @param[in] List The head of the list.\r
+ @param[in] CallBack Pointer to the callback function to destroy one node in the list.\r
+ @param[in] Context Pointer to the callback function's context: corresponds to the\r
+ parameter Context in NET_DESTROY_LINK_LIST_CALLBACK.\r
+ @param[out] ListLength The length of the link list if the function returns successfully.\r
+\r
+ @retval EFI_SUCCESS Two complete passes are made with no changes in the number of children.\r
+ @retval EFI_INVALID_PARAMETER The input parameter is invalid.\r
+ @retval Others Return the CallBack's last return value.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+NetDestroyLinkList (\r
+ IN LIST_ENTRY *List,\r
+ IN NET_DESTROY_LINK_LIST_CALLBACK CallBack,\r
+ IN VOID *Context, OPTIONAL\r
+ OUT UINTN *ListLength OPTIONAL\r
+ );\r
+\r
+/**\r
+ This function checks the input Handle to see if it's one of these handles in ChildHandleBuffer.\r
+\r
+ @param[in] Handle Handle to be checked.\r
+ @param[in] NumberOfChildren Number of Handles in ChildHandleBuffer.\r
+ @param[in] ChildHandleBuffer An array of child handles to be freed. May be NULL\r
+ if NumberOfChildren is 0.\r
+\r
+ @retval TRUE Found the input Handle in ChildHandleBuffer.\r
+ @retval FALSE Can't find the input Handle in ChildHandleBuffer.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+NetIsInHandleBuffer (\r
+ IN EFI_HANDLE Handle,\r
+ IN UINTN NumberOfChildren,\r
+ IN EFI_HANDLE *ChildHandleBuffer OPTIONAL\r
+ );\r
+\r
+//\r
+// Object container: EFI network stack spec defines various kinds of\r
+// tokens. The drivers can share code to manage those objects.\r
+//\r
+typedef struct {\r
+ LIST_ENTRY Link;\r
+ VOID *Key;\r
+ VOID *Value;\r
+} NET_MAP_ITEM;\r
+\r
+typedef struct {\r
+ LIST_ENTRY Used;\r
+ LIST_ENTRY Recycled;\r
+ UINTN Count;\r
+} NET_MAP;\r
+\r
+#define NET_MAP_INCREAMENT 64\r
+\r
+/**\r
+ Initialize the netmap. Netmap is a reposity to keep the <Key, Value> pairs.\r
+\r
+ Initialize the forward and backward links of two head nodes donated by Map->Used\r
+ and Map->Recycled of two doubly linked lists.\r
+ Initializes the count of the <Key, Value> pairs in the netmap to zero.\r
+\r
+ If Map is NULL, then ASSERT().\r
+ If the address of Map->Used is NULL, then ASSERT().\r
+ If the address of Map->Recycled is NULl, then ASSERT().\r
+\r
+ @param[in, out] Map The netmap to initialize.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+NetMapInit (\r
+ IN OUT NET_MAP *Map\r
+ );\r
+\r
+/**\r
+ To clean up the netmap, that is, release allocated memories.\r
+\r
+ Removes all nodes of the Used doubly linked list and frees memory of all related netmap items.\r
+ Removes all nodes of the Recycled doubly linked list and free memory of all related netmap items.\r
+ The number of the <Key, Value> pairs in the netmap is set to zero.\r
+\r
+ If Map is NULL, then ASSERT().\r
+\r
+ @param[in, out] Map The netmap to clean up.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+NetMapClean (\r
+ IN OUT NET_MAP *Map\r
+ );\r
+\r
+/**\r
+ Test whether the netmap is empty and return true if it is.\r
+\r
+ If the number of the <Key, Value> pairs in the netmap is zero, return TRUE.\r
+\r
+ If Map is NULL, then ASSERT().\r
+\r
+ @param[in] Map The net map to test.\r
+\r
+ @return TRUE if the netmap is empty, otherwise FALSE.\r
+\r
+**/\r
+BOOLEAN\r
+EFIAPI\r
+NetMapIsEmpty (\r
+ IN NET_MAP *Map\r
+ );\r
+\r
+/**\r
+ Return the number of the <Key, Value> pairs in the netmap.\r
+\r
+ If Map is NULL, then ASSERT().\r
+\r
+ @param[in] Map The netmap to get the entry number.\r
+\r
+ @return The entry number in the netmap.\r
+\r
+**/\r
+UINTN\r
+EFIAPI\r
+NetMapGetCount (\r
+ IN NET_MAP *Map\r
+ );\r
+\r
+/**\r
+ Allocate an item to save the <Key, Value> pair to the head of the netmap.\r
+\r
+ Allocate an item to save the <Key, Value> pair and add corresponding node entry\r
+ to the beginning of the Used doubly linked list. The number of the <Key, Value>\r
+ pairs in the netmap increase by 1.\r
+\r
+ If Map is NULL, then ASSERT().\r
+ If Key is NULL, then ASSERT().\r
+\r
+ @param[in, out] Map The netmap to insert into.\r
+ @param[in] Key The user's key.\r
+ @param[in] Value The user's value for the key.\r
+\r
+ @retval EFI_OUT_OF_RESOURCES Failed to allocate the memory for the item.\r
+ @retval EFI_SUCCESS The item is inserted to the head.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+NetMapInsertHead (\r
+ IN OUT NET_MAP *Map,\r
+ IN VOID *Key,\r
+ IN VOID *Value OPTIONAL\r
+ );\r
+\r
+/**\r
+ Allocate an item to save the <Key, Value> pair to the tail of the netmap.\r
+\r
+ Allocate an item to save the <Key, Value> pair and add corresponding node entry\r
+ to the tail of the Used doubly linked list. The number of the <Key, Value>\r
+ pairs in the netmap increase by 1.\r
+\r
+ If Map is NULL, then ASSERT().\r
+ If Key is NULL, then ASSERT().\r
+\r
+ @param[in, out] Map The netmap to insert into.\r
+ @param[in] Key The user's key.\r
+ @param[in] Value The user's value for the key.\r
+\r
+ @retval EFI_OUT_OF_RESOURCES Failed to allocate the memory for the item.\r
+ @retval EFI_SUCCESS The item is inserted to the tail.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+NetMapInsertTail (\r
+ IN OUT NET_MAP *Map,\r
+ IN VOID *Key,\r
+ IN VOID *Value OPTIONAL\r
+ );\r
+\r
+/**\r
+ Finds the key in the netmap and returns the point to the item containing the Key.\r
+\r
+ Iterate the Used doubly linked list of the netmap to get every item. Compare the key of every\r
+ item with the key to search. It returns the point to the item contains the Key if found.\r
+\r
+ If Map is NULL, then ASSERT().\r
+ If Key is NULL, then ASSERT().\r
+\r
+ @param[in] Map The netmap to search within.\r
+ @param[in] Key The key to search.\r
+\r
+ @return The point to the item contains the Key, or NULL if Key isn't in the map.\r
+\r
+**/\r
+NET_MAP_ITEM *\r
+EFIAPI\r
+NetMapFindKey (\r
+ IN NET_MAP *Map,\r
+ IN VOID *Key\r
+ );\r
+\r
+/**\r
+ Remove the node entry of the item from the netmap and return the key of the removed item.\r
+\r
+ Remove the node entry of the item from the Used doubly linked list of the netmap.\r
+ The number of the <Key, Value> pairs in the netmap decrease by 1. Then add the node\r
+ entry of the item to the Recycled doubly linked list of the netmap. If Value is not NULL,\r
+ Value will point to the value of the item. It returns the key of the removed item.\r
+\r
+ If Map is NULL, then ASSERT().\r
+ If Item is NULL, then ASSERT().\r
+ if item in not in the netmap, then ASSERT().\r
+\r
+ @param[in, out] Map The netmap to remove the item from.\r
+ @param[in, out] Item The item to remove.\r
+ @param[out] Value The variable to receive the value if not NULL.\r
+\r
+ @return The key of the removed item.\r
+\r
+**/\r
+VOID *\r
+EFIAPI\r
+NetMapRemoveItem (\r
+ IN OUT NET_MAP *Map,\r
+ IN OUT NET_MAP_ITEM *Item,\r
+ OUT VOID **Value OPTIONAL\r
+ );\r
+\r
+/**\r
+ Remove the first node entry on the netmap and return the key of the removed item.\r
+\r
+ Remove the first node entry from the Used doubly linked list of the netmap.\r
+ The number of the <Key, Value> pairs in the netmap decrease by 1. Then add the node\r
+ entry to the Recycled doubly linked list of the netmap. If parameter Value is not NULL,\r
+ parameter Value will point to the value of the item. It returns the key of the removed item.\r
+\r
+ If Map is NULL, then ASSERT().\r
+ If the Used doubly linked list is empty, then ASSERT().\r
+\r
+ @param[in, out] Map The netmap to remove the head from.\r
+ @param[out] Value The variable to receive the value if not NULL.\r
+\r
+ @return The key of the item removed.\r
+\r
+**/\r
+VOID *\r
+EFIAPI\r
+NetMapRemoveHead (\r
+ IN OUT NET_MAP *Map,\r
+ OUT VOID **Value OPTIONAL\r
+ );\r
+\r
+/**\r
+ Remove the last node entry on the netmap and return the key of the removed item.\r
+\r
+ Remove the last node entry from the Used doubly linked list of the netmap.\r
+ The number of the <Key, Value> pairs in the netmap decrease by 1. Then add the node\r
+ entry to the Recycled doubly linked list of the netmap. If parameter Value is not NULL,\r
+ parameter Value will point to the value of the item. It returns the key of the removed item.\r
+\r
+ If Map is NULL, then ASSERT().\r
+ If the Used doubly linked list is empty, then ASSERT().\r
+\r
+ @param[in, out] Map The netmap to remove the tail from.\r
+ @param[out] Value The variable to receive the value if not NULL.\r
+\r
+ @return The key of the item removed.\r
+\r
+**/\r
+VOID *\r
+EFIAPI\r
+NetMapRemoveTail (\r
+ IN OUT NET_MAP *Map,\r
+ OUT VOID **Value OPTIONAL\r
+ );\r
+\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *NET_MAP_CALLBACK) (\r
+ IN NET_MAP *Map,\r
+ IN NET_MAP_ITEM *Item,\r
+ IN VOID *Arg\r
+ );\r
+\r
+/**\r
+ Iterate through the netmap and call CallBack for each item.\r
+\r
+ It will continue the traverse if CallBack returns EFI_SUCCESS, otherwise, break\r
+ from the loop. It returns the CallBack's last return value. This function is\r
+ delete safe for the current item.\r
+\r
+ If Map is NULL, then ASSERT().\r
+ If CallBack is NULL, then ASSERT().\r
+\r
+ @param[in] Map The Map to iterate through.\r
+ @param[in] CallBack The callback function to call for each item.\r
+ @param[in] Arg The opaque parameter to the callback.\r
+\r
+ @retval EFI_SUCCESS There is no item in the netmap, or CallBack for each item\r
+ returns EFI_SUCCESS.\r
+ @retval Others It returns the CallBack's last return value.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+NetMapIterate (\r
+ IN NET_MAP *Map,\r
+ IN NET_MAP_CALLBACK CallBack,\r
+ IN VOID *Arg OPTIONAL\r
+ );\r
+\r
+\r
+//\r
+// Helper functions to implement driver binding and service binding protocols.\r
+//\r
+/**\r
+ Create a child of the service that is identified by ServiceBindingGuid.\r
+\r
+ Get the ServiceBinding Protocol first, then use it to create a child.\r
+\r
+ If ServiceBindingGuid is NULL, then ASSERT().\r
+ If ChildHandle is NULL, then ASSERT().\r
+\r
+ @param[in] Controller The controller which has the service installed.\r
+ @param[in] Image The image handle used to open service.\r
+ @param[in] ServiceBindingGuid The service's Guid.\r
+ @param[in, out] ChildHandle The handle to receive the created child.\r
+\r
+ @retval EFI_SUCCESS The child was successfully created.\r
+ @retval Others Failed to create the child.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+NetLibCreateServiceChild (\r
+ IN EFI_HANDLE Controller,\r
+ IN EFI_HANDLE Image,\r
+ IN EFI_GUID *ServiceBindingGuid,\r
+ IN OUT EFI_HANDLE *ChildHandle\r
+ );\r
+\r
+/**\r
+ Destroy a child of the service that is identified by ServiceBindingGuid.\r
+\r
+ Get the ServiceBinding Protocol first, then use it to destroy a child.\r
+\r
+ If ServiceBindingGuid is NULL, then ASSERT().\r
+\r
+ @param[in] Controller The controller which has the service installed.\r
+ @param[in] Image The image handle used to open service.\r
+ @param[in] ServiceBindingGuid The service's Guid.\r
+ @param[in] ChildHandle The child to destroy.\r
+\r
+ @retval EFI_SUCCESS The child was destroyed.\r
+ @retval Others Failed to destroy the child.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+NetLibDestroyServiceChild (\r
+ IN EFI_HANDLE Controller,\r
+ IN EFI_HANDLE Image,\r
+ IN EFI_GUID *ServiceBindingGuid,\r
+ IN EFI_HANDLE ChildHandle\r
+ );\r
+\r
+/**\r
+ Get handle with Simple Network Protocol installed on it.\r
+\r
+ There should be MNP Service Binding Protocol installed on the input ServiceHandle.\r
+ If Simple Network Protocol is already installed on the ServiceHandle, the\r
+ ServiceHandle will be returned. If SNP is not installed on the ServiceHandle,\r
+ try to find its parent handle with SNP installed.\r
+\r
+ @param[in] ServiceHandle The handle where network service binding protocols are\r
+ installed on.\r
+ @param[out] Snp The pointer to store the address of the SNP instance.\r
+ This is an optional parameter that may be NULL.\r
+\r
+ @return The SNP handle, or NULL if not found.\r
+\r
+**/\r
+EFI_HANDLE\r
+EFIAPI\r
+NetLibGetSnpHandle (\r
+ IN EFI_HANDLE ServiceHandle,\r
+ OUT EFI_SIMPLE_NETWORK_PROTOCOL **Snp OPTIONAL\r
+ );\r
+\r
+/**\r
+ Retrieve VLAN ID of a VLAN device handle.\r
+\r
+ Search VLAN device path node in Device Path of specified ServiceHandle and\r
+ return its VLAN ID. If no VLAN device path node found, then this ServiceHandle\r
+ is not a VLAN device handle, and 0 will be returned.\r
+\r
+ @param[in] ServiceHandle The handle where network service binding protocols are\r
+ installed on.\r
+\r
+ @return VLAN ID of the device handle, or 0 if not a VLAN device.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+NetLibGetVlanId (\r
+ IN EFI_HANDLE ServiceHandle\r
+ );\r
+\r
+/**\r
+ Find VLAN device handle with specified VLAN ID.\r
+\r
+ The VLAN child device handle is created by VLAN Config Protocol on ControllerHandle.\r
+ This function will append VLAN device path node to the parent device path,\r
+ and then use LocateDevicePath() to find the correct VLAN device handle.\r
+\r
+ @param[in] ControllerHandle The handle where network service binding protocols are\r
+ installed on.\r
+ @param[in] VlanId The configured VLAN ID for the VLAN device.\r
+\r
+ @return The VLAN device handle, or NULL if not found.\r
+\r
+**/\r
+EFI_HANDLE\r
+EFIAPI\r
+NetLibGetVlanHandle (\r
+ IN EFI_HANDLE ControllerHandle,\r
+ IN UINT16 VlanId\r
+ );\r
+\r
+/**\r
+ Get MAC address associated with the network service handle.\r
+\r
+ If MacAddress is NULL, then ASSERT().\r
+ If AddressSize is NULL, then ASSERT().\r
+\r
+ There should be MNP Service Binding Protocol installed on the input ServiceHandle.\r
+ If SNP is installed on the ServiceHandle or its parent handle, MAC address will\r
+ be retrieved from SNP. If no SNP found, try to get SNP mode data use MNP.\r
+\r
+ @param[in] ServiceHandle The handle where network service binding protocols are\r
+ installed on.\r
+ @param[out] MacAddress The pointer to store the returned MAC address.\r
+ @param[out] AddressSize The length of returned MAC address.\r
+\r
+ @retval EFI_SUCCESS MAC address was returned successfully.\r
+ @retval Others Failed to get SNP mode data.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+NetLibGetMacAddress (\r
+ IN EFI_HANDLE ServiceHandle,\r
+ OUT EFI_MAC_ADDRESS *MacAddress,\r
+ OUT UINTN *AddressSize\r
+ );\r
+\r
+/**\r
+ Convert MAC address of the NIC associated with specified Service Binding Handle\r
+ to a unicode string. Callers are responsible for freeing the string storage.\r
+\r
+ If MacString is NULL, then ASSERT().\r
+\r
+ Locate simple network protocol associated with the Service Binding Handle and\r
+ get the mac address from SNP. Then convert the mac address into a unicode\r
+ string. It takes 2 unicode characters to represent a 1 byte binary buffer.\r
+ Plus one unicode character for the null-terminator.\r
+\r
+ @param[in] ServiceHandle The handle where network service binding protocol is\r
+ installed.\r
+ @param[in] ImageHandle The image handle used to act as the agent handle to\r
+ get the simple network protocol. This parameter is\r
+ optional and may be NULL.\r
+ @param[out] MacString The pointer to store the address of the string\r
+ representation of the mac address.\r
+\r
+ @retval EFI_SUCCESS Converted the mac address a unicode string successfully.\r
+ @retval EFI_OUT_OF_RESOURCES There are not enough memory resources.\r
+ @retval Others Failed to open the simple network protocol.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+NetLibGetMacString (\r
+ IN EFI_HANDLE ServiceHandle,\r
+ IN EFI_HANDLE ImageHandle, OPTIONAL\r
+ OUT CHAR16 **MacString\r
+ );\r
+\r
+/**\r
+ Detect media status for specified network device.\r
+\r
+ If MediaPresent is NULL, then ASSERT().\r
+\r
+ The underlying UNDI driver may or may not support reporting media status from\r
+ GET_STATUS command (PXE_STATFLAGS_GET_STATUS_NO_MEDIA_SUPPORTED). This routine\r
+ will try to invoke Snp->GetStatus() to get the media status. If media is already\r
+ present, it returns directly. If media is not present, it will stop SNP and then\r
+ restart SNP to get the latest media status. This provides an opportunity to get\r
+ the correct media status for old UNDI driver, which doesn't support reporting\r
+ media status from GET_STATUS command.\r
+ Note: there are two limitations for the current algorithm:\r
+ 1) For UNDI with this capability, when the cable is not attached, there will\r
+ be an redundant Stop/Start() process.\r
+ 2) for UNDI without this capability, in case that network cable is attached when\r
+ Snp->Initialize() is invoked while network cable is unattached later,\r
+ NetLibDetectMedia() will report MediaPresent as TRUE, causing upper layer\r
+ apps to wait for timeout time.\r
+\r
+ @param[in] ServiceHandle The handle where network service binding protocols are\r
+ installed.\r
+ @param[out] MediaPresent The pointer to store the media status.\r
+\r
+ @retval EFI_SUCCESS Media detection success.\r
+ @retval EFI_INVALID_PARAMETER ServiceHandle is not a valid network device handle.\r
+ @retval EFI_UNSUPPORTED The network device does not support media detection.\r
+ @retval EFI_DEVICE_ERROR SNP is in an unknown state.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+NetLibDetectMedia (\r
+ IN EFI_HANDLE ServiceHandle,\r
+ OUT BOOLEAN *MediaPresent\r
+ );\r
+\r
+/**\r
+ Detect media state for a network device. This routine will wait for a period of time at\r
+ a specified checking interval when a certain network is under connecting until connection\r
+ process finishes or timeout. If Aip protocol is supported by low layer drivers, three kinds\r
+ of media states can be detected: EFI_SUCCESS, EFI_NOT_READY and EFI_NO_MEDIA, represents\r
+ connected state, connecting state and no media state respectively. When function detects\r
+ the current state is EFI_NOT_READY, it will loop to wait for next time's check until state\r
+ turns to be EFI_SUCCESS or EFI_NO_MEDIA. If Aip protocol is not supported, function will\r
+ call NetLibDetectMedia() and return state directly.\r
+\r
+ @param[in] ServiceHandle The handle where network service binding protocols are\r
+ installed on.\r
+ @param[in] Timeout The maximum number of 100ns units to wait when network\r
+ is connecting. Zero value means detect once and return\r
+ immediately.\r
+ @param[out] MediaState The pointer to the detected media state.\r
+\r
+ @retval EFI_SUCCESS Media detection success.\r
+ @retval EFI_INVALID_PARAMETER ServiceHandle is not a valid network device handle or\r
+ MediaState pointer is NULL.\r
+ @retval EFI_DEVICE_ERROR A device error occurred.\r
+ @retval EFI_TIMEOUT Network is connecting but timeout.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+NetLibDetectMediaWaitTimeout (\r
+ IN EFI_HANDLE ServiceHandle,\r
+ IN UINT64 Timeout,\r
+ OUT EFI_STATUS *MediaState\r
+ );\r
+\r
+\r
+/**\r
+ Create an IPv4 device path node.\r
+\r
+ If Node is NULL, then ASSERT().\r
+\r
+ The header type of IPv4 device path node is MESSAGING_DEVICE_PATH.\r
+ The header subtype of IPv4 device path node is MSG_IPv4_DP.\r
+ The length of the IPv4 device path node in bytes is 19.\r
+ Get other information from parameters to make up the whole IPv4 device path node.\r
+\r
+ @param[in, out] Node The pointer to the IPv4 device path node.\r
+ @param[in] Controller The controller handle.\r
+ @param[in] LocalIp The local IPv4 address.\r
+ @param[in] LocalPort The local port.\r
+ @param[in] RemoteIp The remote IPv4 address.\r
+ @param[in] RemotePort The remote port.\r
+ @param[in] Protocol The protocol type in the IP header.\r
+ @param[in] UseDefaultAddress Whether this instance is using default address or not.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+NetLibCreateIPv4DPathNode (\r
+ IN OUT IPv4_DEVICE_PATH *Node,\r
+ IN EFI_HANDLE Controller,\r
+ IN IP4_ADDR LocalIp,\r
+ IN UINT16 LocalPort,\r
+ IN IP4_ADDR RemoteIp,\r
+ IN UINT16 RemotePort,\r
+ IN UINT16 Protocol,\r
+ IN BOOLEAN UseDefaultAddress\r
+ );\r
+\r
+/**\r
+ Create an IPv6 device path node.\r
+\r
+ If Node is NULL, then ASSERT().\r
+ If LocalIp is NULL, then ASSERT().\r
+ If RemoteIp is NULL, then ASSERT().\r
+\r
+ The header type of IPv6 device path node is MESSAGING_DEVICE_PATH.\r
+ The header subtype of IPv6 device path node is MSG_IPv6_DP.\r
+ The length of the IPv6 device path node in bytes is 43.\r
+ Get other information from parameters to make up the whole IPv6 device path node.\r
+\r
+ @param[in, out] Node The pointer to the IPv6 device path node.\r
+ @param[in] Controller The controller handle.\r
+ @param[in] LocalIp The local IPv6 address.\r
+ @param[in] LocalPort The local port.\r
+ @param[in] RemoteIp The remote IPv6 address.\r
+ @param[in] RemotePort The remote port.\r
+ @param[in] Protocol The protocol type in the IP header.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+NetLibCreateIPv6DPathNode (\r
+ IN OUT IPv6_DEVICE_PATH *Node,\r
+ IN EFI_HANDLE Controller,\r
+ IN EFI_IPv6_ADDRESS *LocalIp,\r
+ IN UINT16 LocalPort,\r
+ IN EFI_IPv6_ADDRESS *RemoteIp,\r
+ IN UINT16 RemotePort,\r
+ IN UINT16 Protocol\r
+ );\r
+\r
+\r
+/**\r
+ Find the UNDI/SNP handle from controller and protocol GUID.\r
+\r
+ If ProtocolGuid is NULL, then ASSERT().\r
+\r
+ For example, IP will open an MNP child to transmit/receive\r
+ packets. When MNP is stopped, IP should also be stopped. IP\r
+ needs to find its own private data that is related the IP's\r
+ service binding instance that is installed on the UNDI/SNP handle.\r
+ The controller is then either an MNP or an ARP child handle. Note that\r
+ IP opens these handles using BY_DRIVER. Use that information to get the\r
+ UNDI/SNP handle.\r
+\r
+ @param[in] Controller The protocol handle to check.\r
+ @param[in] ProtocolGuid The protocol that is related with the handle.\r
+\r
+ @return The UNDI/SNP handle or NULL for errors.\r
+\r
+**/\r
+EFI_HANDLE\r
+EFIAPI\r
+NetLibGetNicHandle (\r
+ IN EFI_HANDLE Controller,\r
+ IN EFI_GUID *ProtocolGuid\r
+ );\r
+\r
+/**\r
+ This is the default unload handle for all the network drivers.\r
+\r
+ Disconnect the driver specified by ImageHandle from all the devices in the handle database.\r
+ Uninstall all the protocols installed in the driver entry point.\r
+\r
+ @param[in] ImageHandle The drivers' driver image.\r
+\r
+ @retval EFI_SUCCESS The image is unloaded.\r
+ @retval Others Failed to unload the image.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+NetLibDefaultUnload (\r
+ IN EFI_HANDLE ImageHandle\r
+ );\r
+\r
+/**\r
+ Convert one Null-terminated ASCII string (decimal dotted) to EFI_IPv4_ADDRESS.\r
+\r
+ @param[in] String The pointer to the Ascii string.\r
+ @param[out] Ip4Address The pointer to the converted IPv4 address.\r
+\r
+ @retval EFI_SUCCESS Converted to an IPv4 address successfully.\r
+ @retval EFI_INVALID_PARAMETER The string is malformatted, or Ip4Address is NULL.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+NetLibAsciiStrToIp4 (\r
+ IN CONST CHAR8 *String,\r
+ OUT EFI_IPv4_ADDRESS *Ip4Address\r
+ );\r
+\r
+/**\r
+ Convert one Null-terminated ASCII string to EFI_IPv6_ADDRESS. The format of the\r
+ string is defined in RFC 4291 - Text Representation of Addresses.\r
+\r
+ @param[in] String The pointer to the Ascii string.\r
+ @param[out] Ip6Address The pointer to the converted IPv6 address.\r
+\r
+ @retval EFI_SUCCESS Converted to an IPv6 address successfully.\r
+ @retval EFI_INVALID_PARAMETER The string is malformatted, or Ip6Address is NULL.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+NetLibAsciiStrToIp6 (\r
+ IN CONST CHAR8 *String,\r
+ OUT EFI_IPv6_ADDRESS *Ip6Address\r
+ );\r
+\r
+/**\r
+ Convert one Null-terminated Unicode string (decimal dotted) to EFI_IPv4_ADDRESS.\r
+\r
+ @param[in] String The pointer to the Ascii string.\r
+ @param[out] Ip4Address The pointer to the converted IPv4 address.\r
+\r
+ @retval EFI_SUCCESS Converted to an IPv4 address successfully.\r
+ @retval EFI_INVALID_PARAMETER The string is mal-formatted or Ip4Address is NULL.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+NetLibStrToIp4 (\r
+ IN CONST CHAR16 *String,\r
+ OUT EFI_IPv4_ADDRESS *Ip4Address\r
+ );\r
+\r
+/**\r
+ Convert one Null-terminated Unicode string to EFI_IPv6_ADDRESS. The format of\r
+ the string is defined in RFC 4291 - Text Representation of Addresses.\r
+\r
+ @param[in] String The pointer to the Ascii string.\r
+ @param[out] Ip6Address The pointer to the converted IPv6 address.\r
+\r
+ @retval EFI_SUCCESS Converted to an IPv6 address successfully.\r
+ @retval EFI_INVALID_PARAMETER The string is malformatted or Ip6Address is NULL.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+NetLibStrToIp6 (\r
+ IN CONST CHAR16 *String,\r
+ OUT EFI_IPv6_ADDRESS *Ip6Address\r
+ );\r
+\r
+/**\r
+ Convert one Null-terminated Unicode string to EFI_IPv6_ADDRESS and prefix length.\r
+ The format of the string is defined in RFC 4291 - Text Representation of Addresses\r
+ Prefixes: ipv6-address/prefix-length.\r
+\r
+ @param[in] String The pointer to the Ascii string.\r
+ @param[out] Ip6Address The pointer to the converted IPv6 address.\r
+ @param[out] PrefixLength The pointer to the converted prefix length.\r
+\r
+ @retval EFI_SUCCESS Converted to an IPv6 address successfully.\r
+ @retval EFI_INVALID_PARAMETER The string is malformatted, or Ip6Address is NULL.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+NetLibStrToIp6andPrefix (\r
+ IN CONST CHAR16 *String,\r
+ OUT EFI_IPv6_ADDRESS *Ip6Address,\r
+ OUT UINT8 *PrefixLength\r
+ );\r
+\r
+/**\r
+\r
+ Convert one EFI_IPv6_ADDRESS to Null-terminated Unicode string.\r
+ The text representation of address is defined in RFC 4291.\r
+\r
+ @param[in] Ip6Address The pointer to the IPv6 address.\r
+ @param[out] String The buffer to return the converted string.\r
+ @param[in] StringSize The length in bytes of the input String.\r
+\r
+ @retval EFI_SUCCESS Convert to string successfully.\r
+ @retval EFI_INVALID_PARAMETER The input parameter is invalid.\r
+ @retval EFI_BUFFER_TOO_SMALL The BufferSize is too small for the result. BufferSize has been\r
+ updated with the size needed to complete the request.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+NetLibIp6ToStr (\r
+ IN EFI_IPv6_ADDRESS *Ip6Address,\r
+ OUT CHAR16 *String,\r
+ IN UINTN StringSize\r
+ );\r
+\r
+//\r
+// Various signatures\r
+//\r
+#define NET_BUF_SIGNATURE SIGNATURE_32 ('n', 'b', 'u', 'f')\r
+#define NET_VECTOR_SIGNATURE SIGNATURE_32 ('n', 'v', 'e', 'c')\r
+#define NET_QUE_SIGNATURE SIGNATURE_32 ('n', 'b', 'q', 'u')\r
+\r
+\r
+#define NET_PROTO_DATA 64 // Opaque buffer for protocols\r
+#define NET_BUF_HEAD 1 // Trim or allocate space from head\r
+#define NET_BUF_TAIL 0 // Trim or allocate space from tail\r
+#define NET_VECTOR_OWN_FIRST 0x01 // We allocated the 1st block in the vector\r
+\r
+#define NET_CHECK_SIGNATURE(PData, SIGNATURE) \\r
+ ASSERT (((PData) != NULL) && ((PData)->Signature == (SIGNATURE)))\r
+\r
+//\r
+// Single memory block in the vector.\r
+//\r
+typedef struct {\r
+ UINT32 Len; // The block's length\r
+ UINT8 *Bulk; // The block's Data\r
+} NET_BLOCK;\r
+\r
+typedef VOID (EFIAPI *NET_VECTOR_EXT_FREE) (VOID *Arg);\r
+\r
+//\r
+//NET_VECTOR contains several blocks to hold all packet's\r
+//fragments and other house-keeping stuff for sharing. It\r
+//doesn't specify the where actual packet fragment begins.\r
+//\r
+typedef struct {\r
+ UINT32 Signature;\r
+ INTN RefCnt; // Reference count to share NET_VECTOR.\r
+ NET_VECTOR_EXT_FREE Free; // external function to free NET_VECTOR\r
+ VOID *Arg; // opaque argument to Free\r
+ UINT32 Flag; // Flags, NET_VECTOR_OWN_FIRST\r
+ UINT32 Len; // Total length of the associated BLOCKs\r
+\r
+ UINT32 BlockNum;\r
+ NET_BLOCK Block[1];\r
+} NET_VECTOR;\r
+\r
+//\r
+//NET_BLOCK_OP operates on the NET_BLOCK. It specifies\r
+//where the actual fragment begins and ends\r
+//\r
+typedef struct {\r
+ UINT8 *BlockHead; // Block's head, or the smallest valid Head\r
+ UINT8 *BlockTail; // Block's tail. BlockTail-BlockHead=block length\r
+ UINT8 *Head; // 1st byte of the data in the block\r
+ UINT8 *Tail; // Tail of the data in the block, Tail-Head=Size\r
+ UINT32 Size; // The size of the data\r
+} NET_BLOCK_OP;\r
+\r
+typedef union {\r
+ IP4_HEAD *Ip4;\r
+ EFI_IP6_HEADER *Ip6;\r
+} NET_IP_HEAD;\r
+\r
+//\r
+//NET_BUF is the buffer manage structure used by the\r
+//network stack. Every network packet may be fragmented. The Vector points to\r
+//memory blocks used by each fragment, and BlockOp\r
+//specifies where each fragment begins and ends.\r
+//\r
+//It also contains an opaque area for the protocol to store\r
+//per-packet information. Protocol must be careful not\r
+//to overwrite the members after that.\r
+//\r
+typedef struct {\r
+ UINT32 Signature;\r
+ INTN RefCnt;\r
+ LIST_ENTRY List; // The List this NET_BUF is on\r
+\r
+ NET_IP_HEAD Ip; // Network layer header, for fast access\r
+ TCP_HEAD *Tcp; // Transport layer header, for fast access\r
+ EFI_UDP_HEADER *Udp; // User Datagram Protocol header\r
+ UINT8 ProtoData [NET_PROTO_DATA]; //Protocol specific data\r
+\r
+ NET_VECTOR *Vector; // The vector containing the packet\r
+\r
+ UINT32 BlockOpNum; // Total number of BlockOp in the buffer\r
+ UINT32 TotalSize; // Total size of the actual packet\r
+ NET_BLOCK_OP BlockOp[1]; // Specify the position of actual packet\r
+} NET_BUF;\r
+\r
+//\r
+//A queue of NET_BUFs. It is a thin extension of\r
+//NET_BUF functions.\r
+//\r
+typedef struct {\r
+ UINT32 Signature;\r
+ INTN RefCnt;\r
+ LIST_ENTRY List; // The List this buffer queue is on\r
+\r
+ LIST_ENTRY BufList; // list of queued buffers\r
+ UINT32 BufSize; // total length of DATA in the buffers\r
+ UINT32 BufNum; // total number of buffers on the chain\r
+} NET_BUF_QUEUE;\r
+\r
+//\r
+// Pseudo header for TCP and UDP checksum\r
+//\r
+#pragma pack(1)\r
+typedef struct {\r
+ IP4_ADDR SrcIp;\r
+ IP4_ADDR DstIp;\r
+ UINT8 Reserved;\r
+ UINT8 Protocol;\r
+ UINT16 Len;\r
+} NET_PSEUDO_HDR;\r
+\r
+typedef struct {\r
+ EFI_IPv6_ADDRESS SrcIp;\r
+ EFI_IPv6_ADDRESS DstIp;\r
+ UINT32 Len;\r
+ UINT32 Reserved:24;\r
+ UINT32 NextHeader:8;\r
+} NET_IP6_PSEUDO_HDR;\r
+#pragma pack()\r
+\r
+//\r
+// The fragment entry table used in network interfaces. This is\r
+// the same as NET_BLOCK now. Use two different to distinguish\r
+// the two in case that NET_BLOCK be enhanced later.\r
+//\r
+typedef struct {\r
+ UINT32 Len;\r
+ UINT8 *Bulk;\r
+} NET_FRAGMENT;\r
+\r
+#define NET_GET_REF(PData) ((PData)->RefCnt++)\r
+#define NET_PUT_REF(PData) ((PData)->RefCnt--)\r
+#define NETBUF_FROM_PROTODATA(Info) BASE_CR((Info), NET_BUF, ProtoData)\r
+\r
+#define NET_BUF_SHARED(Buf) \\r
+ (((Buf)->RefCnt > 1) || ((Buf)->Vector->RefCnt > 1))\r
+\r
+#define NET_VECTOR_SIZE(BlockNum) \\r
+ (sizeof (NET_VECTOR) + ((BlockNum) - 1) * sizeof (NET_BLOCK))\r
+\r
+#define NET_BUF_SIZE(BlockOpNum) \\r
+ (sizeof (NET_BUF) + ((BlockOpNum) - 1) * sizeof (NET_BLOCK_OP))\r
+\r
+#define NET_HEADSPACE(BlockOp) \\r
+ ((UINTN)((BlockOp)->Head) - (UINTN)((BlockOp)->BlockHead))\r
+\r
+#define NET_TAILSPACE(BlockOp) \\r
+ ((UINTN)((BlockOp)->BlockTail) - (UINTN)((BlockOp)->Tail))\r
+\r
+/**\r
+ Allocate a single block NET_BUF. Upon allocation, all the\r
+ free space is in the tail room.\r
+\r
+ @param[in] Len The length of the block.\r
+\r
+ @return The pointer to the allocated NET_BUF, or NULL if the\r
+ allocation failed due to resource limitations.\r
+\r
+**/\r
+NET_BUF *\r
+EFIAPI\r
+NetbufAlloc (\r
+ IN UINT32 Len\r
+ );\r
+\r
+/**\r
+ Free the net buffer and its associated NET_VECTOR.\r
+\r
+ Decrease the reference count of the net buffer by one. Free the associated net\r
+ vector and itself if the reference count of the net buffer is decreased to 0.\r
+ The net vector free operation decreases the reference count of the net\r
+ vector by one, and performs the resource free operation when the reference count\r
+ of the net vector is 0.\r
+\r
+ @param[in] Nbuf The pointer to the NET_BUF to be freed.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+NetbufFree (\r
+ IN NET_BUF *Nbuf\r
+ );\r
+\r
+/**\r
+ Get the index of NET_BLOCK_OP that contains the byte at Offset in the net\r
+ buffer.\r
+\r
+ For example, this function can be used to retrieve the IP header in the packet. It\r
+ also can be used to get the fragment that contains the byte used\r
+ mainly by the library implementation itself.\r
+\r
+ @param[in] Nbuf The pointer to the net buffer.\r
+ @param[in] Offset The offset of the byte.\r
+ @param[out] Index Index of the NET_BLOCK_OP that contains the byte at\r
+ Offset.\r
+\r
+ @return The pointer to the Offset'th byte of data in the net buffer, or NULL\r
+ if there is no such data in the net buffer.\r
+\r
+**/\r
+UINT8 *\r
+EFIAPI\r
+NetbufGetByte (\r
+ IN NET_BUF *Nbuf,\r
+ IN UINT32 Offset,\r
+ OUT UINT32 *Index OPTIONAL\r
+ );\r
+\r
+/**\r
+ Create a copy of the net buffer that shares the associated net vector.\r
+\r
+ The reference count of the newly created net buffer is set to 1. The reference\r
+ count of the associated net vector is increased by one.\r
+\r
+ @param[in] Nbuf The pointer to the net buffer to be cloned.\r
+\r
+ @return The pointer to the cloned net buffer, or NULL if the\r
+ allocation failed due to resource limitations.\r
+\r
+**/\r
+NET_BUF *\r
+EFIAPI\r
+NetbufClone (\r
+ IN NET_BUF *Nbuf\r
+ );\r
+\r
+/**\r
+ Create a duplicated copy of the net buffer with data copied and HeadSpace\r
+ bytes of head space reserved.\r
+\r
+ The duplicated net buffer will allocate its own memory to hold the data of the\r
+ source net buffer.\r
+\r
+ @param[in] Nbuf The pointer to the net buffer to be duplicated from.\r
+ @param[in, out] Duplicate The pointer to the net buffer to duplicate to. If\r
+ NULL, a new net buffer is allocated.\r
+ @param[in] HeadSpace The length of the head space to reserve.\r
+\r
+ @return The pointer to the duplicated net buffer, or NULL if\r
+ the allocation failed due to resource limitations.\r
+\r
+**/\r
+NET_BUF *\r
+EFIAPI\r
+NetbufDuplicate (\r
+ IN NET_BUF *Nbuf,\r
+ IN OUT NET_BUF *Duplicate OPTIONAL,\r
+ IN UINT32 HeadSpace\r
+ );\r
+\r
+/**\r
+ Create a NET_BUF structure which contains Len byte data of Nbuf starting from\r
+ Offset.\r
+\r
+ A new NET_BUF structure will be created but the associated data in NET_VECTOR\r
+ is shared. This function exists to perform IP packet fragmentation.\r
+\r
+ @param[in] Nbuf The pointer to the net buffer to be extracted.\r
+ @param[in] Offset Starting point of the data to be included in the new\r
+ net buffer.\r
+ @param[in] Len The bytes of data to be included in the new net buffer.\r
+ @param[in] HeadSpace The bytes of the head space to reserve for the protocol header.\r
+\r
+ @return The pointer to the cloned net buffer, or NULL if the\r
+ allocation failed due to resource limitations.\r
+\r
+**/\r
+NET_BUF *\r
+EFIAPI\r
+NetbufGetFragment (\r
+ IN NET_BUF *Nbuf,\r
+ IN UINT32 Offset,\r
+ IN UINT32 Len,\r
+ IN UINT32 HeadSpace\r
+ );\r
+\r
+/**\r
+ Reserve some space in the header room of the net buffer.\r
+\r
+ Upon allocation, all the space is in the tail room of the buffer. Call this\r
+ function to move space to the header room. This function is quite limited\r
+ in that it can only reserve space from the first block of an empty NET_BUF not\r
+ built from the external. However, it should be enough for the network stack.\r
+\r
+ @param[in, out] Nbuf The pointer to the net buffer.\r
+ @param[in] Len The length of buffer to be reserved from the header.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+NetbufReserve (\r
+ IN OUT NET_BUF *Nbuf,\r
+ IN UINT32 Len\r
+ );\r
+\r
+/**\r
+ Allocate Len bytes of space from the header or tail of the buffer.\r
+\r
+ @param[in, out] Nbuf The pointer to the net buffer.\r
+ @param[in] Len The length of the buffer to be allocated.\r
+ @param[in] FromHead The flag to indicate whether to reserve the data\r
+ from head (TRUE) or tail (FALSE).\r
+\r
+ @return The pointer to the first byte of the allocated buffer,\r
+ or NULL, if there is no sufficient space.\r
+\r
+**/\r
+UINT8*\r
+EFIAPI\r
+NetbufAllocSpace (\r
+ IN OUT NET_BUF *Nbuf,\r
+ IN UINT32 Len,\r
+ IN BOOLEAN FromHead\r
+ );\r
+\r
+/**\r
+ Trim Len bytes from the header or the tail of the net buffer.\r
+\r
+ @param[in, out] Nbuf The pointer to the net buffer.\r
+ @param[in] Len The length of the data to be trimmed.\r
+ @param[in] FromHead The flag to indicate whether trim data is from the\r
+ head (TRUE) or the tail (FALSE).\r
+\r
+ @return The length of the actual trimmed data, which may be less\r
+ than Len if the TotalSize of Nbuf is less than Len.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+NetbufTrim (\r
+ IN OUT NET_BUF *Nbuf,\r
+ IN UINT32 Len,\r
+ IN BOOLEAN FromHead\r
+ );\r
+\r
+/**\r
+ Copy Len bytes of data from the specific offset of the net buffer to the\r
+ destination memory.\r
+\r
+ The Len bytes of data may cross several fragments of the net buffer.\r
+\r
+ @param[in] Nbuf The pointer to the net buffer.\r
+ @param[in] Offset The sequence number of the first byte to copy.\r
+ @param[in] Len The length of the data to copy.\r
+ @param[in] Dest The destination of the data to copy to.\r
+\r
+ @return The length of the actual copied data, or 0 if the offset\r
+ specified exceeds the total size of net buffer.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+NetbufCopy (\r
+ IN NET_BUF *Nbuf,\r
+ IN UINT32 Offset,\r
+ IN UINT32 Len,\r
+ IN UINT8 *Dest\r
+ );\r
+\r
+/**\r
+ Build a NET_BUF from external blocks.\r
+\r
+ A new NET_BUF structure will be created from external blocks. An additional block\r
+ of memory will be allocated to hold reserved HeadSpace bytes of header room\r
+ and existing HeadLen bytes of header, but the external blocks are shared by the\r
+ net buffer to avoid data copying.\r
+\r
+ @param[in] ExtFragment The pointer to the data block.\r
+ @param[in] ExtNum The number of the data blocks.\r
+ @param[in] HeadSpace The head space to be reserved.\r
+ @param[in] HeadLen The length of the protocol header. The function\r
+ pulls this amount of data into a linear block.\r
+ @param[in] ExtFree The pointer to the caller-provided free function.\r
+ @param[in] Arg The argument passed to ExtFree when ExtFree is\r
+ called.\r
+\r
+ @return The pointer to the net buffer built from the data blocks,\r
+ or NULL if the allocation failed due to resource\r
+ limit.\r
+\r
+**/\r
+NET_BUF *\r
+EFIAPI\r
+NetbufFromExt (\r
+ IN NET_FRAGMENT *ExtFragment,\r
+ IN UINT32 ExtNum,\r
+ IN UINT32 HeadSpace,\r
+ IN UINT32 HeadLen,\r
+ IN NET_VECTOR_EXT_FREE ExtFree,\r
+ IN VOID *Arg OPTIONAL\r
+ );\r
+\r
+/**\r
+ Build a fragment table to contain the fragments in the net buffer. This is the\r
+ opposite operation of the NetbufFromExt.\r
+\r
+ @param[in] Nbuf Points to the net buffer.\r
+ @param[in, out] ExtFragment The pointer to the data block.\r
+ @param[in, out] ExtNum The number of the data blocks.\r
+\r
+ @retval EFI_BUFFER_TOO_SMALL The number of non-empty blocks is bigger than\r
+ ExtNum.\r
+ @retval EFI_SUCCESS The fragment table was built successfully.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+NetbufBuildExt (\r
+ IN NET_BUF *Nbuf,\r
+ IN OUT NET_FRAGMENT *ExtFragment,\r
+ IN OUT UINT32 *ExtNum\r
+ );\r
+\r
+/**\r
+ Build a net buffer from a list of net buffers.\r
+\r
+ All the fragments will be collected from the list of NEW_BUF, and then a new\r
+ net buffer will be created through NetbufFromExt.\r
+\r
+ @param[in] BufList A List of the net buffer.\r
+ @param[in] HeadSpace The head space to be reserved.\r
+ @param[in] HeaderLen The length of the protocol header. The function\r
+ pulls this amount of data into a linear block.\r
+ @param[in] ExtFree The pointer to the caller provided free function.\r
+ @param[in] Arg The argument passed to ExtFree when ExtFree is called.\r
+\r
+ @return The pointer to the net buffer built from the list of net\r
+ buffers.\r
+\r
+**/\r
+NET_BUF *\r
+EFIAPI\r
+NetbufFromBufList (\r
+ IN LIST_ENTRY *BufList,\r
+ IN UINT32 HeadSpace,\r
+ IN UINT32 HeaderLen,\r
+ IN NET_VECTOR_EXT_FREE ExtFree,\r
+ IN VOID *Arg OPTIONAL\r
+ );\r
+\r
+/**\r
+ Free a list of net buffers.\r
+\r
+ @param[in, out] Head The pointer to the head of linked net buffers.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+NetbufFreeList (\r
+ IN OUT LIST_ENTRY *Head\r
+ );\r
+\r
+/**\r
+ Initiate the net buffer queue.\r
+\r
+ @param[in, out] NbufQue The pointer to the net buffer queue to be initialized.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+NetbufQueInit (\r
+ IN OUT NET_BUF_QUEUE *NbufQue\r
+ );\r
+\r
+/**\r
+ Allocate and initialize a net buffer queue.\r
+\r
+ @return The pointer to the allocated net buffer queue, or NULL if the\r
+ allocation failed due to resource limit.\r
+\r
+**/\r
+NET_BUF_QUEUE *\r
+EFIAPI\r
+NetbufQueAlloc (\r
+ VOID\r
+ );\r
+\r
+/**\r
+ Free a net buffer queue.\r
+\r
+ Decrease the reference count of the net buffer queue by one. The real resource\r
+ free operation isn't performed until the reference count of the net buffer\r
+ queue is decreased to 0.\r
+\r
+ @param[in] NbufQue The pointer to the net buffer queue to be freed.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+NetbufQueFree (\r
+ IN NET_BUF_QUEUE *NbufQue\r
+ );\r
+\r
+/**\r
+ Remove a net buffer from the head in the specific queue and return it.\r
+\r
+ @param[in, out] NbufQue The pointer to the net buffer queue.\r
+\r
+ @return The pointer to the net buffer removed from the specific queue,\r
+ or NULL if there is no net buffer in the specific queue.\r
+\r
+**/\r
+NET_BUF *\r
+EFIAPI\r
+NetbufQueRemove (\r
+ IN OUT NET_BUF_QUEUE *NbufQue\r
+ );\r
+\r
+/**\r
+ Append a net buffer to the net buffer queue.\r
+\r
+ @param[in, out] NbufQue The pointer to the net buffer queue.\r
+ @param[in, out] Nbuf The pointer to the net buffer to be appended.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+NetbufQueAppend (\r
+ IN OUT NET_BUF_QUEUE *NbufQue,\r
+ IN OUT NET_BUF *Nbuf\r
+ );\r
+\r
+/**\r
+ Copy Len bytes of data from the net buffer queue at the specific offset to the\r
+ destination memory.\r
+\r
+ The copying operation is the same as NetbufCopy, but applies to the net buffer\r
+ queue instead of the net buffer.\r
+\r
+ @param[in] NbufQue The pointer to the net buffer queue.\r
+ @param[in] Offset The sequence number of the first byte to copy.\r
+ @param[in] Len The length of the data to copy.\r
+ @param[out] Dest The destination of the data to copy to.\r
+\r
+ @return The length of the actual copied data, or 0 if the offset\r
+ specified exceeds the total size of net buffer queue.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+NetbufQueCopy (\r
+ IN NET_BUF_QUEUE *NbufQue,\r
+ IN UINT32 Offset,\r
+ IN UINT32 Len,\r
+ OUT UINT8 *Dest\r
+ );\r
+\r
+/**\r
+ Trim Len bytes of data from the buffer queue and free any net buffer\r
+ that is completely trimmed.\r
+\r
+ The trimming operation is the same as NetbufTrim but applies to the net buffer\r
+ queue instead of the net buffer.\r
+\r
+ @param[in, out] NbufQue The pointer to the net buffer queue.\r
+ @param[in] Len The length of the data to trim.\r
+\r
+ @return The actual length of the data trimmed.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+NetbufQueTrim (\r
+ IN OUT NET_BUF_QUEUE *NbufQue,\r
+ IN UINT32 Len\r
+ );\r
+\r
+\r
+/**\r
+ Flush the net buffer queue.\r
+\r
+ @param[in, out] NbufQue The pointer to the queue to be flushed.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+NetbufQueFlush (\r
+ IN OUT NET_BUF_QUEUE *NbufQue\r
+ );\r
+\r
+/**\r
+ Compute the checksum for a bulk of data.\r
+\r
+ @param[in] Bulk The pointer to the data.\r
+ @param[in] Len The length of the data, in bytes.\r
+\r
+ @return The computed checksum.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+NetblockChecksum (\r
+ IN UINT8 *Bulk,\r
+ IN UINT32 Len\r
+ );\r
+\r
+/**\r
+ Add two checksums.\r
+\r
+ @param[in] Checksum1 The first checksum to be added.\r
+ @param[in] Checksum2 The second checksum to be added.\r
+\r
+ @return The new checksum.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+NetAddChecksum (\r
+ IN UINT16 Checksum1,\r
+ IN UINT16 Checksum2\r
+ );\r
+\r
+/**\r
+ Compute the checksum for a NET_BUF.\r
+\r
+ @param[in] Nbuf The pointer to the net buffer.\r
+\r
+ @return The computed checksum.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+NetbufChecksum (\r
+ IN NET_BUF *Nbuf\r
+ );\r
+\r
+/**\r
+ Compute the checksum for TCP/UDP pseudo header.\r
+\r
+ Src and Dst are in network byte order, and Len is in host byte order.\r
+\r
+ @param[in] Src The source address of the packet.\r
+ @param[in] Dst The destination address of the packet.\r
+ @param[in] Proto The protocol type of the packet.\r
+ @param[in] Len The length of the packet.\r
+\r
+ @return The computed checksum.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+NetPseudoHeadChecksum (\r
+ IN IP4_ADDR Src,\r
+ IN IP4_ADDR Dst,\r
+ IN UINT8 Proto,\r
+ IN UINT16 Len\r
+ );\r
+\r
+/**\r
+ Compute the checksum for the TCP6/UDP6 pseudo header.\r
+\r
+ Src and Dst are in network byte order, and Len is in host byte order.\r
+\r
+ @param[in] Src The source address of the packet.\r
+ @param[in] Dst The destination address of the packet.\r
+ @param[in] NextHeader The protocol type of the packet.\r
+ @param[in] Len The length of the packet.\r
+\r
+ @return The computed checksum.\r
+\r
+**/\r
+UINT16\r
+EFIAPI\r
+NetIp6PseudoHeadChecksum (\r
+ IN EFI_IPv6_ADDRESS *Src,\r
+ IN EFI_IPv6_ADDRESS *Dst,\r
+ IN UINT8 NextHeader,\r
+ IN UINT32 Len\r
+ );\r
+\r
+/**\r
+ The function frees the net buffer which allocated by the IP protocol. It releases\r
+ only the net buffer and doesn't call the external free function.\r
+\r
+ This function should be called after finishing the process of mIpSec->ProcessExt()\r
+ for outbound traffic. The (EFI_IPSEC2_PROTOCOL)->ProcessExt() allocates a new\r
+ buffer for the ESP, so there needs a function to free the old net buffer.\r
+\r
+ @param[in] Nbuf The network buffer to be freed.\r
+\r
+**/\r
+VOID\r
+NetIpSecNetbufFree (\r
+ NET_BUF *Nbuf\r
+ );\r
+\r
+/**\r
+ This function obtains the system guid from the smbios table.\r
+\r
+ If SystemGuid is NULL, then ASSERT().\r
+\r
+ @param[out] SystemGuid The pointer of the returned system guid.\r
+\r
+ @retval EFI_SUCCESS Successfully obtained the system guid.\r
+ @retval EFI_NOT_FOUND Did not find the SMBIOS table.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+NetLibGetSystemGuid (\r
+ OUT EFI_GUID *SystemGuid\r
+ );\r
+\r
+/**\r
+ Create Dns QName according the queried domain name.\r
+\r
+ If DomainName is NULL, then ASSERT().\r
+\r
+ QName is a domain name represented as a sequence of labels,\r
+ where each label consists of a length octet followed by that\r
+ number of octets. The QName terminates with the zero\r
+ length octet for the null label of the root. Caller should\r
+ take responsibility to free the buffer in returned pointer.\r
+\r
+ @param DomainName The pointer to the queried domain name string.\r
+\r
+ @retval NULL Failed to fill QName.\r
+ @return QName filled successfully.\r
+\r
+**/\r
+CHAR8 *\r
+EFIAPI\r
+NetLibCreateDnsQName (\r
+ IN CHAR16 *DomainName\r
+ );\r
+\r
+#endif\r
--- /dev/null
+/** @file\r
+ This library is used to share code between UEFI network stack modules.\r
+ It provides the helper routines to access TCP service.\r
+\r
+Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
+\r
+**/\r
+\r
+#ifndef _TCP_IO_H_\r
+#define _TCP_IO_H_\r
+\r
+\r
+#include <Protocol/Tcp4.h>\r
+#include <Protocol/Tcp6.h>\r
+\r
+#include <Library/NetLib.h>\r
+\r
+#define TCP_VERSION_4 IP_VERSION_4\r
+#define TCP_VERSION_6 IP_VERSION_6\r
+\r
+///\r
+/// 10 seconds\r
+///\r
+#define TCP_GET_MAPPING_TIMEOUT 100000000U\r
+\r
+\r
+typedef struct {\r
+ EFI_IPv4_ADDRESS LocalIp;\r
+ EFI_IPv4_ADDRESS SubnetMask;\r
+ EFI_IPv4_ADDRESS Gateway;\r
+\r
+ UINT16 StationPort;\r
+ EFI_IPv4_ADDRESS RemoteIp;\r
+ UINT16 RemotePort;\r
+ BOOLEAN ActiveFlag;\r
+} TCP4_IO_CONFIG_DATA;\r
+\r
+typedef struct {\r
+ UINT16 StationPort;\r
+ EFI_IPv6_ADDRESS RemoteIp;\r
+ UINT16 RemotePort;\r
+ BOOLEAN ActiveFlag;\r
+} TCP6_IO_CONFIG_DATA;\r
+\r
+typedef union {\r
+ TCP4_IO_CONFIG_DATA Tcp4IoConfigData;\r
+ TCP6_IO_CONFIG_DATA Tcp6IoConfigData;\r
+} TCP_IO_CONFIG_DATA;\r
+\r
+typedef union {\r
+ EFI_TCP4_PROTOCOL *Tcp4;\r
+ EFI_TCP6_PROTOCOL *Tcp6;\r
+} TCP_IO_PROTOCOL;\r
+\r
+typedef union {\r
+ EFI_TCP4_CONNECTION_TOKEN Tcp4Token;\r
+ EFI_TCP6_CONNECTION_TOKEN Tcp6Token;\r
+} TCP_IO_CONNECTION_TOKEN;\r
+\r
+typedef union {\r
+ EFI_TCP4_IO_TOKEN Tcp4Token;\r
+ EFI_TCP6_IO_TOKEN Tcp6Token;\r
+} TCP_IO_IO_TOKEN;\r
+\r
+typedef union {\r
+ EFI_TCP4_CLOSE_TOKEN Tcp4Token;\r
+ EFI_TCP6_CLOSE_TOKEN Tcp6Token;\r
+} TCP_IO_CLOSE_TOKEN;\r
+\r
+typedef union {\r
+ EFI_TCP4_LISTEN_TOKEN Tcp4Token;\r
+ EFI_TCP6_LISTEN_TOKEN Tcp6Token;\r
+} TCP_IO_LISTEN_TOKEN;\r
+\r
+\r
+typedef struct {\r
+ UINT8 TcpVersion;\r
+ EFI_HANDLE Image;\r
+ EFI_HANDLE Controller;\r
+ EFI_HANDLE Handle;\r
+\r
+ TCP_IO_PROTOCOL Tcp;\r
+ TCP_IO_PROTOCOL NewTcp;\r
+ TCP_IO_CONNECTION_TOKEN ConnToken;\r
+ TCP_IO_IO_TOKEN TxToken;\r
+ TCP_IO_IO_TOKEN RxToken;\r
+ TCP_IO_CLOSE_TOKEN CloseToken;\r
+ TCP_IO_LISTEN_TOKEN ListenToken;\r
+\r
+ BOOLEAN IsConnDone;\r
+ BOOLEAN IsTxDone;\r
+ BOOLEAN IsRxDone;\r
+ BOOLEAN IsCloseDone;\r
+ BOOLEAN IsListenDone;\r
+} TCP_IO;\r
+\r
+/**\r
+ Create a TCP socket with the specified configuration data.\r
+\r
+ @param[in] Image The handle of the driver image.\r
+ @param[in] Controller The handle of the controller.\r
+ @param[in] TcpVersion The version of Tcp, TCP_VERSION_4 or TCP_VERSION_6.\r
+ @param[in] ConfigData The Tcp configuration data.\r
+ @param[out] TcpIo The TcpIo.\r
+\r
+ @retval EFI_SUCCESS The TCP socket is created and configured.\r
+ @retval EFI_INVALID_PARAMETER One or more parameters are invalid.\r
+ @retval EFI_UNSUPPORTED One or more of the control options are not\r
+ supported in the implementation.\r
+ @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.\r
+ @retval Others Failed to create the TCP socket or configure it.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+TcpIoCreateSocket (\r
+ IN EFI_HANDLE Image,\r
+ IN EFI_HANDLE Controller,\r
+ IN UINT8 TcpVersion,\r
+ IN TCP_IO_CONFIG_DATA *ConfigData,\r
+ OUT TCP_IO *TcpIo\r
+ );\r
+\r
+/**\r
+ Destroy the socket.\r
+\r
+ @param[in] TcpIo The TcpIo which wraps the socket to be destroyed.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+TcpIoDestroySocket (\r
+ IN TCP_IO *TcpIo\r
+ );\r
+\r
+/**\r
+ Connect to the other endpoint of the TCP socket.\r
+\r
+ @param[in, out] TcpIo The TcpIo wrapping the TCP socket.\r
+ @param[in] Timeout The time to wait for connection done. Set to NULL for infinite wait.\r
+\r
+ @retval EFI_SUCCESS Connect to the other endpoint of the TCP socket\r
+ successfully.\r
+ @retval EFI_TIMEOUT Failed to connect to the other endpoint of the\r
+ TCP socket in the specified time period.\r
+ @retval EFI_INVALID_PARAMETER One or more parameters are invalid.\r
+ @retval EFI_UNSUPPORTED One or more of the control options are not\r
+ supported in the implementation.\r
+ @retval Others Other errors as indicated.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+TcpIoConnect (\r
+ IN OUT TCP_IO *TcpIo,\r
+ IN EFI_EVENT Timeout OPTIONAL\r
+ );\r
+\r
+/**\r
+ Accept the incomding request from the other endpoint of the TCP socket.\r
+\r
+ @param[in, out] TcpIo The TcpIo wrapping the TCP socket.\r
+ @param[in] Timeout The time to wait for connection done. Set to NULL for infinite wait.\r
+\r
+\r
+ @retval EFI_SUCCESS Connect to the other endpoint of the TCP socket\r
+ successfully.\r
+ @retval EFI_INVALID_PARAMETER One or more parameters are invalid.\r
+ @retval EFI_UNSUPPORTED One or more of the control options are not\r
+ supported in the implementation.\r
+\r
+ @retval EFI_TIMEOUT Failed to connect to the other endpoint of the\r
+ TCP socket in the specified time period.\r
+ @retval Others Other errors as indicated.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+TcpIoAccept (\r
+ IN OUT TCP_IO *TcpIo,\r
+ IN EFI_EVENT Timeout OPTIONAL\r
+ );\r
+\r
+/**\r
+ Reset the socket.\r
+\r
+ @param[in, out] TcpIo The TcpIo wrapping the TCP socket.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+TcpIoReset (\r
+ IN OUT TCP_IO *TcpIo\r
+ );\r
+\r
+/**\r
+ Transmit the Packet to the other endpoint of the socket.\r
+\r
+ @param[in] TcpIo The TcpIo wrapping the TCP socket.\r
+ @param[in] Packet The packet to transmit.\r
+\r
+ @retval EFI_SUCCESS The packet is trasmitted.\r
+ @retval EFI_INVALID_PARAMETER One or more parameters are invalid.\r
+ @retval EFI_UNSUPPORTED One or more of the control options are not\r
+ supported in the implementation.\r
+ @retval EFI_OUT_OF_RESOURCES Failed to allocate memory.\r
+ @retval EFI_DEVICE_ERROR An unexpected network or system error occurred.\r
+ @retval Others Other errors as indicated.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+TcpIoTransmit (\r
+ IN TCP_IO *TcpIo,\r
+ IN NET_BUF *Packet\r
+ );\r
+\r
+/**\r
+ Receive data from the socket.\r
+\r
+ @param[in, out] TcpIo The TcpIo which wraps the socket to be destroyed.\r
+ @param[in] Packet The buffer to hold the data copy from the socket rx buffer.\r
+ @param[in] AsyncMode Is this receive asyncronous or not.\r
+ @param[in] Timeout The time to wait for receiving the amount of data the Packet\r
+ can hold. Set to NULL for infinite wait.\r
+\r
+ @retval EFI_SUCCESS The required amount of data is received from the socket.\r
+ @retval EFI_INVALID_PARAMETER One or more parameters are invalid.\r
+ @retval EFI_DEVICE_ERROR An unexpected network or system error occurred.\r
+ @retval EFI_OUT_OF_RESOURCES Failed to allocate momery.\r
+ @retval EFI_TIMEOUT Failed to receive the required amount of data in the\r
+ specified time period.\r
+ @retval Others Other errors as indicated.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+TcpIoReceive (\r
+ IN OUT TCP_IO *TcpIo,\r
+ IN NET_BUF *Packet,\r
+ IN BOOLEAN AsyncMode,\r
+ IN EFI_EVENT Timeout OPTIONAL\r
+ );\r
+\r
+#endif\r
+\r
--- /dev/null
+/** @file\r
+ This library is used to share code between UEFI network stack modules.\r
+ It provides the helper routines to access UDP service. It is used by both DHCP and MTFTP.\r
+\r
+Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
+\r
+**/\r
+\r
+#ifndef _UDP_IO_H_\r
+#define _UDP_IO_H_\r
+\r
+#include <Protocol/Udp4.h>\r
+#include <Protocol/Udp6.h>\r
+\r
+#include <Library/NetLib.h>\r
+\r
+typedef struct _UDP_IO UDP_IO;\r
+\r
+///\r
+/// Signatures used by UdpIo Library.\r
+///\r
+\r
+#define UDP_IO_RX_SIGNATURE SIGNATURE_32 ('U', 'D', 'P', 'R')\r
+#define UDP_IO_TX_SIGNATURE SIGNATURE_32 ('U', 'D', 'P', 'T')\r
+#define UDP_IO_SIGNATURE SIGNATURE_32 ('U', 'D', 'P', 'I')\r
+\r
+#define UDP_IO_UDP4_VERSION 4\r
+#define UDP_IO_UDP6_VERSION 6\r
+\r
+///\r
+/// The UDP address pair.\r
+///\r
+typedef struct {\r
+ EFI_IP_ADDRESS LocalAddr;\r
+ UINT16 LocalPort;\r
+ EFI_IP_ADDRESS RemoteAddr;\r
+ UINT16 RemotePort;\r
+} UDP_END_POINT;\r
+\r
+/**\r
+ Prototype called when receiving or sending packets to or from a UDP point.\r
+\r
+ This prototype is used by both receive and sending when calling\r
+ UdpIoRecvDatagram() or UdpIoSendDatagram(). When receiving, Netbuf is allocated by the\r
+ UDP access point and released by the user. When sending, the user allocates the the NetBuf,\r
+ which is then provided to the callback as a reference.\r
+\r
+ @param[in] Packet The packet received or sent.\r
+ @param[in] EndPoint The UDP address pair corresponds to the UDP IO.\r
+ @param[in] IoStatus The packet receiving or sending status.\r
+ @param[in] Context The user-defined data when calling UdpIoRecvDatagram() or\r
+ UdpIoSendDatagram().\r
+**/\r
+typedef\r
+VOID\r
+(EFIAPI *UDP_IO_CALLBACK) (\r
+ IN NET_BUF *Packet,\r
+ IN UDP_END_POINT *EndPoint,\r
+ IN EFI_STATUS IoStatus,\r
+ IN VOID *Context\r
+ );\r
+\r
+///\r
+/// This structure is used internally by the UdpIo Library.\r
+///\r
+/// Each receive request is wrapped in an UDP_RX_TOKEN. Upon completion,\r
+/// the CallBack will be called. Only one receive request is sent to UDP at a\r
+/// time. HeadLen gives the length of the application's header. UDP_IO will\r
+/// make the application's header continuous before delivering up.\r
+///\r
+typedef union {\r
+ EFI_UDP4_COMPLETION_TOKEN Udp4;\r
+ EFI_UDP6_COMPLETION_TOKEN Udp6;\r
+} UDP_COMPLETION_TOKEN;\r
+\r
+typedef struct {\r
+ UINT32 Signature;\r
+ UDP_IO *UdpIo;\r
+\r
+ UDP_IO_CALLBACK CallBack;\r
+ VOID *Context;\r
+ UINT32 HeadLen;\r
+\r
+ UDP_COMPLETION_TOKEN Token;\r
+} UDP_RX_TOKEN;\r
+\r
+\r
+\r
+///\r
+/// This structure is used internally by UdpIo Library.\r
+///\r
+/// Each transmit request is wrapped in an UDP_TX_TOKEN. Upon completion,\r
+/// the CallBack will be called. There can be several transmit requests. All transmit\r
+/// requests are linked in a list.\r
+///\r
+\r
+typedef union {\r
+ EFI_UDP4_SESSION_DATA Udp4;\r
+ EFI_UDP6_SESSION_DATA Udp6;\r
+} UDP_SESSION_DATA;\r
+\r
+typedef union {\r
+ EFI_UDP4_TRANSMIT_DATA Udp4;\r
+ EFI_UDP6_TRANSMIT_DATA Udp6;\r
+} UDP_TRANSMIT_DATA;\r
+\r
+typedef struct {\r
+ UINT32 Signature;\r
+ LIST_ENTRY Link;\r
+ UDP_IO *UdpIo;\r
+ UDP_IO_CALLBACK CallBack;\r
+ NET_BUF *Packet;\r
+ VOID *Context;\r
+ EFI_IPv4_ADDRESS Gateway;\r
+ UDP_SESSION_DATA Session;\r
+ UDP_COMPLETION_TOKEN Token;\r
+ UDP_TRANSMIT_DATA Data;\r
+} UDP_TX_TOKEN;\r
+\r
+///\r
+/// Type defined as UDP_IO.\r
+///\r
+/// This data structure wraps the UDP instance and configuration.\r
+/// UdpIo Library uses this structure for all Udp4 or Udp6 operations.\r
+///\r
+struct _UDP_IO {\r
+ UINT32 Signature;\r
+ LIST_ENTRY Link;\r
+ INTN RefCnt;\r
+ UINT8 UdpVersion;\r
+\r
+ //\r
+ // Handle used to create/destroy UDP child\r
+ //\r
+ EFI_HANDLE Controller;\r
+ EFI_HANDLE Image;\r
+ EFI_HANDLE UdpHandle;\r
+\r
+ EFI_SIMPLE_NETWORK_MODE SnpMode;\r
+\r
+ LIST_ENTRY SentDatagram; ///< A list of UDP_TX_TOKEN.\r
+ UDP_RX_TOKEN *RecvRequest;\r
+\r
+ union {\r
+ EFI_UDP4_PROTOCOL *Udp4;\r
+ EFI_UDP6_PROTOCOL *Udp6;\r
+ } Protocol;\r
+\r
+ union {\r
+ EFI_UDP4_CONFIG_DATA Udp4;\r
+ EFI_UDP6_CONFIG_DATA Udp6;\r
+ } Config;\r
+};\r
+\r
+/**\r
+ The prototype called when UdpIo Library configures a UDP instance.\r
+\r
+ The prototype is set and called when creating a UDP_IO in UdpIoCreatePort().\r
+\r
+ @param[in] UdpIo The UDP_IO to configure.\r
+ @param[in] Context The user-defined data when calling UdpIoCreatePort().\r
+\r
+ @retval EFI_SUCCESS The configuration succeeded.\r
+ @retval Others The UDP_IO fails to configure indicating\r
+ UdpIoCreatePort() should fail.\r
+**/\r
+typedef\r
+EFI_STATUS\r
+(EFIAPI *UDP_IO_CONFIG) (\r
+ IN UDP_IO *UdpIo,\r
+ IN VOID *Context\r
+ );\r
+\r
+/**\r
+ The select function to decide whether to cancel the UDP_TX_TOKEN.\r
+\r
+ @param[in] Token The UDP_TX_TOKEN to decide whether to cancel.\r
+ @param[in] Context User-defined data in UdpIoCancelDgrams().\r
+\r
+ @retval TRUE Cancel the UDP_TX_TOKEN.\r
+ @retval FALSE Do not cancel this UDP_TX_TOKEN.\r
+\r
+**/\r
+typedef\r
+BOOLEAN\r
+(EFIAPI *UDP_IO_TO_CANCEL) (\r
+ IN UDP_TX_TOKEN *Token,\r
+ IN VOID *Context\r
+ );\r
+\r
+/**\r
+ Cancel all the sent datagram that pass the selection criteria of ToCancel.\r
+\r
+ If ToCancel is NULL, all the datagrams are cancelled.\r
+ If Udp version is not UDP_IO_UDP4_VERSION or UDP_IO_UDP6_VERSION, then ASSERT().\r
+\r
+ @param[in] UdpIo The UDP_IO to cancel packet.\r
+ @param[in] IoStatus The IoStatus to return to the packet owners.\r
+ @param[in] ToCancel The select funtion to test whether to cancel this\r
+ packet or not.\r
+ @param[in] Context The opaque parameter to the ToCancel.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+UdpIoCancelDgrams (\r
+ IN UDP_IO *UdpIo,\r
+ IN EFI_STATUS IoStatus,\r
+ IN UDP_IO_TO_CANCEL ToCancel, OPTIONAL\r
+ IN VOID *Context OPTIONAL\r
+ );\r
+\r
+/**\r
+ Creates a UDP_IO to access the UDP service. It creates and configures\r
+ a UDP child.\r
+\r
+ If Configure is NULL, then ASSERT().\r
+ If Udp version is not UDP_IO_UDP4_VERSION or UDP_IO_UDP6_VERSION, then ASSERT().\r
+\r
+ It locates the UDP service binding prototype on the Controller parameter\r
+ uses the UDP service binding prototype to create a UDP child (also known as\r
+ a UDP instance) configures the UDP child by calling Configure function prototype.\r
+ Any failures in creating or configuring the UDP child return NULL for failure.\r
+\r
+ @param[in] Controller The controller that has the UDP service binding.\r
+ protocol installed.\r
+ @param[in] ImageHandle The image handle for the driver.\r
+ @param[in] Configure The function to configure the created UDP child.\r
+ @param[in] UdpVersion The UDP protocol version, UDP4 or UDP6.\r
+ @param[in] Context The opaque parameter for the Configure funtion.\r
+\r
+ @return The newly-created UDP_IO, or NULL if failed.\r
+\r
+**/\r
+UDP_IO *\r
+EFIAPI\r
+UdpIoCreateIo (\r
+ IN EFI_HANDLE Controller,\r
+ IN EFI_HANDLE ImageHandle,\r
+ IN UDP_IO_CONFIG Configure,\r
+ IN UINT8 UdpVersion,\r
+ IN VOID *Context\r
+ );\r
+\r
+/**\r
+ Free the UDP_IO and all its related resources.\r
+\r
+ If Udp version is not UDP_IO_UDP4_VERSION or UDP_IO_UDP6_VERSION, then ASSERT().\r
+\r
+ The function cancels all sent datagrams and receive requests.\r
+\r
+ @param[in] UdpIo The UDP_IO to free.\r
+\r
+ @retval EFI_SUCCESS The UDP_IO is freed.\r
+ @retval Others Failed to free UDP_IO.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+UdpIoFreeIo (\r
+ IN UDP_IO *UdpIo\r
+ );\r
+\r
+/**\r
+ Cleans up the UDP_IO without freeing it. Call this function\r
+ if you intend to later re-use the UDP_IO.\r
+\r
+ If Udp version is not UDP_IO_UDP4_VERSION or UDP_IO_UDP6_VERSION, then ASSERT().\r
+\r
+ This function releases all transmitted datagrams and receive requests and configures NULL for the UDP instance.\r
+\r
+ @param[in] UdpIo The UDP_IO to clean up.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+UdpIoCleanIo (\r
+ IN UDP_IO *UdpIo\r
+ );\r
+\r
+/**\r
+ Send a packet through the UDP_IO.\r
+\r
+ If Udp version is not UDP_IO_UDP4_VERSION or UDP_IO_UDP6_VERSION, then ASSERT().\r
+\r
+ The packet will be wrapped in UDP_TX_TOKEN. Function Callback will be called\r
+ when the packet is sent. The optional parameter EndPoint overrides the default\r
+ address pair if specified.\r
+\r
+ @param[in] UdpIo The UDP_IO to send the packet through.\r
+ @param[in] Packet The packet to send.\r
+ @param[in] EndPoint The local and remote access point. Override the\r
+ default address pair set during configuration.\r
+ @param[in] Gateway The gateway to use.\r
+ @param[in] CallBack The function being called when packet is\r
+ transmitted or failed.\r
+ @param[in] Context The opaque parameter passed to CallBack.\r
+\r
+ @retval EFI_OUT_OF_RESOURCES Failed to allocate resource for the packet.\r
+ @retval EFI_SUCCESS The packet is successfully delivered to UDP for\r
+ transmission.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+UdpIoSendDatagram (\r
+ IN UDP_IO *UdpIo,\r
+ IN NET_BUF *Packet,\r
+ IN UDP_END_POINT *EndPoint OPTIONAL,\r
+ IN EFI_IP_ADDRESS *Gateway OPTIONAL,\r
+ IN UDP_IO_CALLBACK CallBack,\r
+ IN VOID *Context\r
+ );\r
+\r
+/**\r
+ Cancel a single sent datagram.\r
+\r
+ @param[in] UdpIo The UDP_IO from which to cancel the packet\r
+ @param[in] Packet The packet to cancel\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+UdpIoCancelSentDatagram (\r
+ IN UDP_IO *UdpIo,\r
+ IN NET_BUF *Packet\r
+ );\r
+\r
+/**\r
+ Issue a receive request to the UDP_IO.\r
+\r
+ If Udp version is not UDP_IO_UDP4_VERSION or UDP_IO_UDP6_VERSION, then ASSERT().\r
+\r
+ This function is called when upper-layer needs packet from UDP for processing.\r
+ Only one receive request is acceptable at a time. Therefore, one common usage model is\r
+ to invoke this function inside its Callback function when the former packet\r
+ is processed.\r
+\r
+ @param[in] UdpIo The UDP_IO to receive the packet from.\r
+ @param[in] CallBack The call back function to execute when the packet\r
+ is received.\r
+ @param[in] Context The opaque context passed to Callback.\r
+ @param[in] HeadLen The length of the upper-layer's protocol header.\r
+\r
+ @retval EFI_ALREADY_STARTED There is already a pending receive request. Only\r
+ one receive request is supported at a time.\r
+ @retval EFI_OUT_OF_RESOURCES Failed to allocate needed resources.\r
+ @retval EFI_SUCCESS The receive request was issued successfully.\r
+ @retval EFI_UNSUPPORTED The UDP version in UDP_IO is not supported.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+UdpIoRecvDatagram (\r
+ IN UDP_IO *UdpIo,\r
+ IN UDP_IO_CALLBACK CallBack,\r
+ IN VOID *Context,\r
+ IN UINT32 HeadLen\r
+ );\r
+\r
+#endif\r
+\r
[Packages]\r
MdePkg/MdePkg.dec\r
MdeModulePkg/MdeModulePkg.dec\r
+ NetworkPkg/NetworkPkg.dec\r
\r
[LibraryClasses]\r
UefiLib\r
[Packages]\r
MdePkg/MdePkg.dec\r
MdeModulePkg/MdeModulePkg.dec\r
+ NetworkPkg/NetworkPkg.dec\r
\r
[LibraryClasses]\r
DebugLib\r
[Packages]\r
MdePkg/MdePkg.dec\r
MdeModulePkg/MdeModulePkg.dec\r
+ NetworkPkg/NetworkPkg.dec\r
\r
[LibraryClasses]\r
BaseLib\r
[Packages]\r
MdePkg/MdePkg.dec\r
MdeModulePkg/MdeModulePkg.dec\r
+ NetworkPkg/NetworkPkg.dec\r
\r
\r
[LibraryClasses]\r
[Packages]\r
MdePkg/MdePkg.dec\r
MdeModulePkg/MdeModulePkg.dec\r
+ NetworkPkg/NetworkPkg.dec\r
\r
\r
[LibraryClasses]\r
[Packages]\r
MdePkg/MdePkg.dec\r
MdeModulePkg/MdeModulePkg.dec\r
+ NetworkPkg/NetworkPkg.dec\r
\r
\r
[LibraryClasses]\r
[Packages]\r
MdePkg/MdePkg.dec\r
MdeModulePkg/MdeModulePkg.dec\r
+ NetworkPkg/NetworkPkg.dec\r
\r
\r
[LibraryClasses]\r
[Packages]\r
MdePkg/MdePkg.dec\r
MdeModulePkg/MdeModulePkg.dec\r
+ NetworkPkg/NetworkPkg.dec\r
\r
[LibraryClasses]\r
BaseLib\r
[Packages]\r
MdePkg/MdePkg.dec\r
MdeModulePkg/MdeModulePkg.dec\r
+ NetworkPkg/NetworkPkg.dec\r
\r
\r
[LibraryClasses]\r
[Packages]\r
MdePkg/MdePkg.dec\r
MdeModulePkg/MdeModulePkg.dec\r
+ NetworkPkg/NetworkPkg.dec\r
\r
\r
[LibraryClasses]\r
[Includes]\r
Include\r
\r
+[LibraryClasses]\r
+ ## @libraryclass IpIo layer upon EFI IP4 Protocol.\r
+ # This library is only intended to be used by UEFI network stack modules.\r
+ IpIoLib|Include/Library/IpIoLib.h\r
+\r
+ ## @libraryclass Basic function for UEFI network stack.\r
+ # This library is only intended to be used by UEFI network stack modules.\r
+ NetLib|Include/Library/NetLib.h\r
+\r
+ ## @libraryclass The helper routines to access UDP service.\r
+ # This library is only intended to be used by UEFI network stack modules.\r
+ UdpIoLib|Include/Library/UdpIoLib.h\r
+\r
+ ## @libraryclass The helper routines to access TCP service.\r
+ # This library is only intended to be used by UEFI network stack modules.\r
+ TcpIoLib|Include/Library/TcpIoLib.h\r
+\r
+ ## @libraryclass The helper routines to access HTTP service.\r
+ # This library is only intended to be used by UEFI network stack modules.\r
+ HttpLib|Include/Library/HttpLib.h\r
+\r
+ ## @libraryclass Library for Deferred Procedure Calls.\r
+ DpcLib|Include/Library/DpcLib.h\r
+\r
[Guids]\r
## Network package token space guid.\r
# Include/Guid/NetworkPkgTokenSpace.h\r
[Packages]\r
MdePkg/MdePkg.dec\r
MdeModulePkg/MdeModulePkg.dec\r
+ NetworkPkg/NetworkPkg.dec\r
\r
\r
[LibraryClasses]\r
[Packages]\r
MdePkg/MdePkg.dec\r
MdeModulePkg/MdeModulePkg.dec\r
+ NetworkPkg/NetworkPkg.dec\r
\r
\r
[LibraryClasses]\r
[Packages]\r
MdePkg/MdePkg.dec\r
MdeModulePkg/MdeModulePkg.dec\r
+ NetworkPkg/NetworkPkg.dec\r
CryptoPkg/CryptoPkg.dec\r
\r
[Sources]\r
[Packages]\r
MdePkg/MdePkg.dec\r
MdeModulePkg/MdeModulePkg.dec\r
+ NetworkPkg/NetworkPkg.dec\r
\r
\r
[LibraryClasses]\r
[Packages]\r
MdePkg/MdePkg.dec\r
MdeModulePkg/MdeModulePkg.dec\r
+ NetworkPkg/NetworkPkg.dec\r
\r
[LibraryClasses]\r
BaseLib\r
[Packages]\r
MdePkg/MdePkg.dec\r
MdeModulePkg/MdeModulePkg.dec\r
+ NetworkPkg/NetworkPkg.dec\r
\r
[LibraryClasses]\r
BaseLib\r