NetworkPkg: Move Network library header file from MdeModulePkg to NetworkPkg
authorLiming Gao <liming.gao@intel.com>
Wed, 15 May 2019 12:02:19 +0000 (20:02 +0800)
committerLiming Gao <liming.gao@intel.com>
Mon, 27 May 2019 01:25:18 +0000 (09:25 +0800)
Signed-off-by: Liming Gao <liming.gao@intel.com>
Cc: Siyuan Fu <siyuan.fu@intel.com>
Cc: Jiaxin Wu <jiaxin.wu@intel.com>
Reviewed-by: Jiaxin Wu <jiaxin.wu@intel.com>
Reviewed-by: Siyuan Fu <siyuan.fu@intel.com>
35 files changed:
MdeModulePkg/Include/Library/DpcLib.h [deleted file]
MdeModulePkg/Include/Library/HttpLib.h [deleted file]
MdeModulePkg/Include/Library/IpIoLib.h [deleted file]
MdeModulePkg/Include/Library/NetLib.h [deleted file]
MdeModulePkg/Include/Library/TcpIoLib.h [deleted file]
MdeModulePkg/Include/Library/UdpIoLib.h [deleted file]
NetworkPkg/Application/VConfig/VConfig.inf
NetworkPkg/ArpDxe/ArpDxe.inf
NetworkPkg/Dhcp4Dxe/Dhcp4Dxe.inf
NetworkPkg/DnsDxe/DnsDxe.inf
NetworkPkg/DpcDxe/DpcDxe.inf
NetworkPkg/HttpUtilitiesDxe/HttpUtilitiesDxe.inf
NetworkPkg/Include/Library/DpcLib.h [new file with mode: 0644]
NetworkPkg/Include/Library/HttpLib.h [new file with mode: 0644]
NetworkPkg/Include/Library/IpIoLib.h [new file with mode: 0644]
NetworkPkg/Include/Library/NetLib.h [new file with mode: 0644]
NetworkPkg/Include/Library/TcpIoLib.h [new file with mode: 0644]
NetworkPkg/Include/Library/UdpIoLib.h [new file with mode: 0644]
NetworkPkg/Ip4Dxe/Ip4Dxe.inf
NetworkPkg/Library/DxeDpcLib/DxeDpcLib.inf
NetworkPkg/Library/DxeHttpLib/DxeHttpLib.inf
NetworkPkg/Library/DxeIpIoLib/DxeIpIoLib.inf
NetworkPkg/Library/DxeNetLib/DxeNetLib.inf
NetworkPkg/Library/DxeTcpIoLib/DxeTcpIoLib.inf
NetworkPkg/Library/DxeUdpIoLib/DxeUdpIoLib.inf
NetworkPkg/MnpDxe/MnpDxe.inf
NetworkPkg/Mtftp4Dxe/Mtftp4Dxe.inf
NetworkPkg/Mtftp6Dxe/Mtftp6Dxe.inf
NetworkPkg/NetworkPkg.dec
NetworkPkg/SnpDxe/SnpDxe.inf
NetworkPkg/TcpDxe/TcpDxe.inf
NetworkPkg/TlsDxe/TlsDxe.inf
NetworkPkg/Udp4Dxe/Udp4Dxe.inf
NetworkPkg/Udp6Dxe/Udp6Dxe.inf
NetworkPkg/VlanConfigDxe/VlanConfigDxe.inf

diff --git a/MdeModulePkg/Include/Library/DpcLib.h b/MdeModulePkg/Include/Library/DpcLib.h
deleted file mode 100644 (file)
index a70af1d..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-/** @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
diff --git a/MdeModulePkg/Include/Library/HttpLib.h b/MdeModulePkg/Include/Library/HttpLib.h
deleted file mode 100644 (file)
index 93100eb..0000000
+++ /dev/null
@@ -1,481 +0,0 @@
-/** @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
diff --git a/MdeModulePkg/Include/Library/IpIoLib.h b/MdeModulePkg/Include/Library/IpIoLib.h
deleted file mode 100644 (file)
index 2d6e090..0000000
+++ /dev/null
@@ -1,607 +0,0 @@
-/** @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
diff --git a/MdeModulePkg/Include/Library/NetLib.h b/MdeModulePkg/Include/Library/NetLib.h
deleted file mode 100644 (file)
index 786382a..0000000
+++ /dev/null
@@ -1,2266 +0,0 @@
-/** @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
diff --git a/MdeModulePkg/Include/Library/TcpIoLib.h b/MdeModulePkg/Include/Library/TcpIoLib.h
deleted file mode 100644 (file)
index 63872f6..0000000
+++ /dev/null
@@ -1,247 +0,0 @@
-/** @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
diff --git a/MdeModulePkg/Include/Library/UdpIoLib.h b/MdeModulePkg/Include/Library/UdpIoLib.h
deleted file mode 100644 (file)
index c3cddfa..0000000
+++ /dev/null
@@ -1,363 +0,0 @@
-/** @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
index 2e6cd1a..1d7a812 100644 (file)
@@ -35,6 +35,7 @@
 [Packages]\r
   MdePkg/MdePkg.dec\r
   MdeModulePkg/MdeModulePkg.dec\r
+  NetworkPkg/NetworkPkg.dec\r
   ShellPkg/ShellPkg.dec\r
 \r
 [LibraryClasses]\r
index 78344ed..2ff7489 100644 (file)
@@ -42,6 +42,7 @@
 [Packages]\r
   MdePkg/MdePkg.dec\r
   MdeModulePkg/MdeModulePkg.dec\r
+  NetworkPkg/NetworkPkg.dec\r
 \r
 \r
 [LibraryClasses]\r
index 6288351..e34aab0 100644 (file)
@@ -44,6 +44,7 @@
 [Packages]\r
   MdePkg/MdePkg.dec\r
   MdeModulePkg/MdeModulePkg.dec\r
+  NetworkPkg/NetworkPkg.dec\r
 \r
 \r
 [LibraryClasses]\r
index 6298aad..3a66bdd 100644 (file)
@@ -21,6 +21,7 @@
 [Packages]\r
   MdePkg/MdePkg.dec\r
   MdeModulePkg/MdeModulePkg.dec\r
+  NetworkPkg/NetworkPkg.dec\r
 \r
 [Sources]\r
   ComponentName.c\r
index 8c241d7..1462de2 100644 (file)
@@ -29,6 +29,7 @@
 [Packages]\r
   MdePkg/MdePkg.dec\r
   MdeModulePkg/MdeModulePkg.dec\r
+  NetworkPkg/NetworkPkg.dec\r
 \r
 [LibraryClasses]\r
   UefiDriverEntryPoint\r
index fe08d54..e12c3cc 100644 (file)
@@ -22,6 +22,7 @@
 [Packages]\r
   MdePkg/MdePkg.dec\r
   MdeModulePkg/MdeModulePkg.dec\r
+  NetworkPkg/NetworkPkg.dec\r
 \r
 [Sources]\r
   HttpUtilitiesDxe.h\r
diff --git a/NetworkPkg/Include/Library/DpcLib.h b/NetworkPkg/Include/Library/DpcLib.h
new file mode 100644 (file)
index 0000000..a70af1d
--- /dev/null
@@ -0,0 +1,53 @@
+/** @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
diff --git a/NetworkPkg/Include/Library/HttpLib.h b/NetworkPkg/Include/Library/HttpLib.h
new file mode 100644 (file)
index 0000000..93100eb
--- /dev/null
@@ -0,0 +1,481 @@
+/** @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
diff --git a/NetworkPkg/Include/Library/IpIoLib.h b/NetworkPkg/Include/Library/IpIoLib.h
new file mode 100644 (file)
index 0000000..2d6e090
--- /dev/null
@@ -0,0 +1,607 @@
+/** @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
diff --git a/NetworkPkg/Include/Library/NetLib.h b/NetworkPkg/Include/Library/NetLib.h
new file mode 100644 (file)
index 0000000..786382a
--- /dev/null
@@ -0,0 +1,2266 @@
+/** @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
diff --git a/NetworkPkg/Include/Library/TcpIoLib.h b/NetworkPkg/Include/Library/TcpIoLib.h
new file mode 100644 (file)
index 0000000..63872f6
--- /dev/null
@@ -0,0 +1,247 @@
+/** @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;