]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Update to use DOS format
authorqhuang8 <qhuang8@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 31 Oct 2008 03:46:40 +0000 (03:46 +0000)
committerqhuang8 <qhuang8@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 31 Oct 2008 03:46:40 +0000 (03:46 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@6321 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Include/Library/IpIoLib.h
MdeModulePkg/Include/Library/NetLib.h
MdeModulePkg/Include/Library/UdpIoLib.h

index 19f86799efb66808f4da393a7d2dfb9904943998..67dfb6168dc6fad8cd0bcc9e2a08c4de6ac873ef 100644 (file)
-/** @file
-  This library provides IpIo layer upon EFI IP4 Protocol.
-
-Copyright (c) 2005 - 2008, Intel Corporation
-All rights reserved. This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution.  The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#ifndef _IP_IO_H_
-#define _IP_IO_H_
-
-#include <Protocol/Ip4.h>
-#include <Library/IpIoLib.h>
-#include <Library/NetLib.h>
-
-//
-// type and code define for ICMP protocol error got
-// from IP
-//
-#define ICMP_TYPE_UNREACH              3
-#define ICMP_TYPE_TIMXCEED            11
-#define ICMP_TYPE_PARAMPROB            12
-#define ICMP_TYPE_SOURCEQUENCH         4
-
-#define ICMP_CODE_UNREACH_NET          0
-#define ICMP_CODE_UNREACH_HOST         1
-#define ICMP_CODE_UNREACH_PROTOCOL     2
-#define ICMP_CODE_UNREACH_PORT         3
-#define ICMP_CODE_UNREACH_NEEDFRAG     4
-#define ICMP_CODE_UNREACH_SRCFAIL      5
-#define ICMP_CODE_UNREACH_NET_UNKNOWN  6
-#define ICMP_CODE_UNREACH_HOST_UNKNOWN 7
-#define ICMP_CODE_UNREACH_ISOLATED     8
-#define ICMP_CODE_UNREACH_NET_PROHIB   9
-#define ICMP_CODE_UNREACH_HOST_PROHIB  10
-#define ICMP_CODE_UNREACH_TOSNET       11
-#define ICMP_CODE_UNREACH_TOSHOST      12
-
-//
-// this error will be delivered to the
-// listening transportation layer protocol
-// consuming IpIO
-//
-typedef enum {
-  ICMP_ERR_UNREACH_NET      = 0,
-  ICMP_ERR_UNREACH_HOST,
-  ICMP_ERR_UNREACH_PROTOCOL,
-  ICMP_ERR_UNREACH_PORT,
-  ICMP_ERR_MSGSIZE,
-  ICMP_ERR_UNREACH_SRCFAIL,
-  ICMP_ERR_TIMXCEED_INTRANS,
-  ICMP_ERR_TIMXCEED_REASS,
-  ICMP_ERR_QUENCH,
-  ICMP_ERR_PARAMPROB
-} ICMP_ERROR;
-
-typedef struct _ICMP_ERROR_INFO {
-  BOOLEAN     IsHard;
-  BOOLEAN     Notify;
-} ICMP_ERROR_INFO;
-
-#define EFI_IP4_HEADER_LEN(HdrPtr) ((HdrPtr)->HeaderLength << 2)
-
-extern EFI_IP4_CONFIG_DATA  mIpIoDefaultIpConfigData;
-
-typedef struct _EFI_NET_SESSION_DATA {
-  IP4_ADDR        Source;
-  IP4_ADDR        Dest;
-  EFI_IP4_HEADER  *IpHdr;
-} EFI_NET_SESSION_DATA;
-
-typedef
-VOID
-(*PKT_RCVD_NOTIFY) (
-  IN EFI_STATUS           Status,  // rcvd pkt result
-  IN ICMP_ERROR           IcmpErr, // if Status == EFI_ICMP_ERROR, this
-                                  // field is valid for user
-  IN EFI_NET_SESSION_DATA *NetSession, // the communication point
-  IN NET_BUF              *Pkt,    // packet received
-  IN VOID                 *Context // the Context provided by user for recive data
-  );
-
-typedef
-VOID
-(*PKT_SENT_NOTIFY) (
-  IN EFI_STATUS  Status,      // sent pkt result
-  IN VOID        *Context,    // the context provided by user for sending data
-  IN VOID        *Sender,     // the sender to be notified
-  IN VOID        *NotifyData  // sent pkt related data to notify
-  );
-
-typedef struct _IP_IO {
-
-  //
-  // the node used to link this IpIo to the active IpIo list.
-  //
-  LIST_ENTRY                    Entry;
-
-  // the list used to maintain the IP instance for different sending purpose.
-  //
-  LIST_ENTRY                    IpList;
-
-  //
-  // the ip instance consumed by this IP IO
-  //
-  EFI_HANDLE                    Controller;
-  EFI_HANDLE                    Image;
-  EFI_HANDLE                    ChildHandle;
-  EFI_IP4_PROTOCOL              *Ip;
-  BOOLEAN                       IsConfigured;
-
-  //
-  // some ip config data can be changed
-  //
-  UINT8                         Protocol;
-
-  //
-  // token and event used to get data from IP
-  //
-  EFI_IP4_COMPLETION_TOKEN      RcvToken;
-
-  //
-  // list entry used to link the token passed to IP_IO
-  //
-  LIST_ENTRY                    PendingSndList;
-
-  //
-  // User interface used to get notify from IP_IO
-  //
-  VOID                          *RcvdContext;
-  VOID                          *SndContext;
-  PKT_RCVD_NOTIFY               PktRcvdNotify;
-  PKT_SENT_NOTIFY               PktSentNotify;
-} IP_IO;
-
-typedef struct _IP_IO_OPEN_DATA {
-  EFI_IP4_CONFIG_DATA IpConfigData;
-  VOID                *RcvdContext;
-  VOID                *SndContext;
-  PKT_RCVD_NOTIFY     PktRcvdNotify;
-  PKT_SENT_NOTIFY     PktSentNotify;
-} IP_IO_OPEN_DATA;
-
-typedef struct _IP_IO_SEND_ENTRY {
-  LIST_ENTRY                Entry;
-  IP_IO                     *IpIo;
-  VOID                      *Context;
-  VOID                      *NotifyData;
-  EFI_IP4_PROTOCOL          *Ip;
-  NET_BUF                   *Pkt;
-  EFI_IP4_COMPLETION_TOKEN  *SndToken;
-} IP_IO_SEND_ENTRY;
-
-typedef EFI_IP4_OVERRIDE_DATA IP_IO_OVERRIDE;
-
-typedef struct _IP_IO_IP_INFO {
-  IP4_ADDR                  Addr;
-  IP4_ADDR                  SubnetMask;
-  LIST_ENTRY                Entry;
-  EFI_HANDLE                ChildHandle;
-  EFI_IP4_PROTOCOL          *Ip;
-  EFI_IP4_COMPLETION_TOKEN  DummyRcvToken;
-  INTN                      RefCnt;
-} IP_IO_IP_INFO;
-
-/**
-  Create a new IP_IO instance.
-
-  @param  Image                 The image handle of an IP_IO consumer protocol.
-  @param  Controller            The controller handle of an IP_IO consumer protocol
-                                installed on.
-
-  @return Pointer to a newly created IP_IO instance.
-
-**/
-IP_IO *
-EFIAPI
-IpIoCreate (
-  IN EFI_HANDLE Image,
-  IN EFI_HANDLE Controller
-  );
-
-/**
-  Destroy an IP_IO instance.
-
-  @param  IpIo                  Pointer to the IP_IO instance that needs to
-                                destroy.
-
-  @retval EFI_SUCCESS           The IP_IO instance destroyed successfully.
-  @retval other                 Error condition occurred.
-
-**/
-EFI_STATUS
-EFIAPI
-IpIoDestroy (
-  IN IP_IO *IpIo
-  );
-
-/**
-  Stop an IP_IO instance.
-
-  @param  IpIo                  Pointer to the IP_IO instance that needs to stop.
-
-  @retval EFI_SUCCESS           The IP_IO instance stopped successfully.
-  @retval other                 Error condition occurred.
-
-**/
-EFI_STATUS
-EFIAPI
-IpIoStop (
-  IN IP_IO *IpIo
-  );
-
-/**
-  Open an IP_IO instance for use.
-
-  @param  IpIo                  Pointer to an IP_IO instance that needs to open.
-  @param  OpenData              The configuration data for the IP_IO instance.
-
-  @retval EFI_SUCCESS           The IP_IO instance opened with OpenData
-                                successfully.
-  @retval other                 Error condition occurred.
-
-**/
-EFI_STATUS
-IpIoOpen (
-  IN IP_IO           *IpIo,
-  IN IP_IO_OPEN_DATA *OpenData
-  );
-
-/**
-  Send out an IP packet.
-
-  @param  IpIo                  Pointer to an IP_IO instance used for sending IP
-                                packet.
-  @param  Pkt                   Pointer to the IP packet to be sent.
-  @param  Sender                The IP protocol instance used for sending.
-  @param  Context               
-  @param  NotifyData            
-  @param  Dest                  The destination IP address to send this packet to.
-  @param  OverrideData          The data to override some configuration of the IP
-                                instance used for sending.
-
-  @retval EFI_SUCCESS           The operation is completed successfully.
-  @retval EFI_NOT_STARTED       The IpIo is not configured.
-  @retval EFI_OUT_OF_RESOURCES  Failed due to resource limit.
-
-**/
-EFI_STATUS
-EFIAPI
-IpIoSend (
-  IN IP_IO           *IpIo,
-  IN NET_BUF         *Pkt,
-  IN IP_IO_IP_INFO   *Sender,
-  IN VOID            *Context    OPTIONAL,
-  IN VOID            *NotifyData OPTIONAL,
-  IN IP4_ADDR        Dest,
-  IN IP_IO_OVERRIDE  *OverrideData
-  );
-
-/**
-  Cancel the IP transmit token which wraps this Packet.
-
-  @param  IpIo                  Pointer to the IP_IO instance.
-  @param  Packet                Pointer to the packet to cancel.
-
-**/
-VOID
-EFIAPI
-IpIoCancelTxToken (
-  IN IP_IO  *IpIo,
-  IN VOID   *Packet
-  );
-
-/**
-  Add a new IP instance for sending data.
-
-  @param  IpIo                  Pointer to a IP_IO instance to add a new IP
-                                instance for sending purpose.
-
-  @return Pointer to the created IP_IO_IP_INFO structure, NULL is failed.
-
-**/
-IP_IO_IP_INFO *
-EFIAPI
-IpIoAddIp (
-  IN IP_IO  *IpIo
-  );
-
-/**
-  Configure the IP instance of this IpInfo and start the receiving if Ip4ConfigData
-  is not NULL.
-
-  @param  IpInfo                Pointer to the IP_IO_IP_INFO instance.
-  @param  Ip4ConfigData         The IP4 configure data used to configure the ip
-                                instance, if NULL the ip instance is reseted. If
-                                UseDefaultAddress is set to TRUE, and the configure
-                                operation succeeds, the default address information
-                                is written back in this Ip4ConfigData.
-
-  @retval EFI_STATUS            The status returned by IP4->Configure or
-                                IP4->Receive.
-
-**/
-EFI_STATUS
-EFIAPI
-IpIoConfigIp (
-  IN     IP_IO_IP_INFO        *IpInfo,
-  IN OUT EFI_IP4_CONFIG_DATA  *Ip4ConfigData OPTIONAL
-  );
-
-/**
-  Destroy an IP instance maintained in IpIo->IpList for
-  sending purpose.
-
-  @param  IpIo                  Pointer to the IP_IO instance.
-  @param  IpInfo                Pointer to the IpInfo to be removed.
-
-  @return None.
-
-**/
-VOID
-EFIAPI
-IpIoRemoveIp (
-  IN IP_IO            *IpIo,
-  IN IP_IO_IP_INFO    *IpInfo
-  );
-
-/**
-  Find the first IP protocol maintained in IpIo whose local
-  address is the same with Src.
-
-  @param  IpIo                  Pointer to the pointer of the IP_IO instance.
-  @param  Src                   The local IP address.
-
-  @return Pointer to the IP protocol can be used for sending purpose and its local
-  @return address is the same with Src.
-
-**/
-IP_IO_IP_INFO *
-EFIAPI
-IpIoFindSender (
-  IN OUT IP_IO     **IpIo,
-  IN     IP4_ADDR  Src
-  );
-
-/**
-  Get the ICMP error map information, the ErrorStatus will be returned.
-  The IsHard and Notify are optional. If they are not NULL, this rouine will
-  fill them.
-  We move IcmpErrMap[] to local variable to enable EBC build.
-
-  @param  IcmpError             IcmpError Type
-  @param  IsHard                Whether it is a hard error
-  @param  Notify                Whether it need to notify SockError
-
-  @return ICMP Error Status
-
-**/
-EFI_STATUS
-EFIAPI
-IpIoGetIcmpErrStatus (
-  IN  ICMP_ERROR  IcmpError,
-  OUT BOOLEAN     *IsHard, OPTIONAL
-  OUT BOOLEAN     *Notify OPTIONAL
-  );
-
-#endif
+/** @file\r
+  This library provides IpIo layer upon EFI IP4 Protocol.\r
+\r
+Copyright (c) 2005 - 2008, Intel Corporation\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef _IP_IO_H_\r
+#define _IP_IO_H_\r
+\r
+#include <Protocol/Ip4.h>\r
+#include <Library/IpIoLib.h>\r
+#include <Library/NetLib.h>\r
+\r
+//\r
+// type and code define for ICMP protocol error got\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
+// this error will be delivered to the\r
+// listening transportation layer protocol\r
+// consuming IpIO\r
+//\r
+typedef enum {\r
+  ICMP_ERR_UNREACH_NET      = 0,\r
+  ICMP_ERR_UNREACH_HOST,\r
+  ICMP_ERR_UNREACH_PROTOCOL,\r
+  ICMP_ERR_UNREACH_PORT,\r
+  ICMP_ERR_MSGSIZE,\r
+  ICMP_ERR_UNREACH_SRCFAIL,\r
+  ICMP_ERR_TIMXCEED_INTRANS,\r
+  ICMP_ERR_TIMXCEED_REASS,\r
+  ICMP_ERR_QUENCH,\r
+  ICMP_ERR_PARAMPROB\r
+} ICMP_ERROR;\r
+\r
+typedef struct _ICMP_ERROR_INFO {\r
+  BOOLEAN     IsHard;\r
+  BOOLEAN     Notify;\r
+} ICMP_ERROR_INFO;\r
+\r
+#define EFI_IP4_HEADER_LEN(HdrPtr) ((HdrPtr)->HeaderLength << 2)\r
+\r
+extern EFI_IP4_CONFIG_DATA  mIpIoDefaultIpConfigData;\r
+\r
+typedef struct _EFI_NET_SESSION_DATA {\r
+  IP4_ADDR        Source;\r
+  IP4_ADDR        Dest;\r
+  EFI_IP4_HEADER  *IpHdr;\r
+} EFI_NET_SESSION_DATA;\r
+\r
+typedef\r
+VOID\r
+(*PKT_RCVD_NOTIFY) (\r
+  IN EFI_STATUS           Status,  // rcvd pkt result\r
+  IN ICMP_ERROR           IcmpErr, // if Status == EFI_ICMP_ERROR, this\r
+                                  // field is valid for user\r
+  IN EFI_NET_SESSION_DATA *NetSession, // the communication point\r
+  IN NET_BUF              *Pkt,    // packet received\r
+  IN VOID                 *Context // the Context provided by user for recive data\r
+  );\r
+\r
+typedef\r
+VOID\r
+(*PKT_SENT_NOTIFY) (\r
+  IN EFI_STATUS  Status,      // sent pkt result\r
+  IN VOID        *Context,    // the context provided by user for sending data\r
+  IN VOID        *Sender,     // the sender to be notified\r
+  IN VOID        *NotifyData  // sent pkt related data to notify\r
+  );\r
+\r
+typedef struct _IP_IO {\r
+\r
+  //\r
+  // the node used to link this IpIo to the active IpIo list.\r
+  //\r
+  LIST_ENTRY                    Entry;\r
+\r
+  // the list used to maintain the IP instance for different sending purpose.\r
+  //\r
+  LIST_ENTRY                    IpList;\r
+\r
+  //\r
+  // the ip instance consumed by this IP IO\r
+  //\r
+  EFI_HANDLE                    Controller;\r
+  EFI_HANDLE                    Image;\r
+  EFI_HANDLE                    ChildHandle;\r
+  EFI_IP4_PROTOCOL              *Ip;\r
+  BOOLEAN                       IsConfigured;\r
+\r
+  //\r
+  // some ip config data can be changed\r
+  //\r
+  UINT8                         Protocol;\r
+\r
+  //\r
+  // token and event used to get data from IP\r
+  //\r
+  EFI_IP4_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;\r
+  VOID                          *SndContext;\r
+  PKT_RCVD_NOTIFY               PktRcvdNotify;\r
+  PKT_SENT_NOTIFY               PktSentNotify;\r
+} IP_IO;\r
+\r
+typedef struct _IP_IO_OPEN_DATA {\r
+  EFI_IP4_CONFIG_DATA IpConfigData;\r
+  VOID                *RcvdContext;\r
+  VOID                *SndContext;\r
+  PKT_RCVD_NOTIFY     PktRcvdNotify;\r
+  PKT_SENT_NOTIFY     PktSentNotify;\r
+} IP_IO_OPEN_DATA;\r
+\r
+typedef struct _IP_IO_SEND_ENTRY {\r
+  LIST_ENTRY                Entry;\r
+  IP_IO                     *IpIo;\r
+  VOID                      *Context;\r
+  VOID                      *NotifyData;\r
+  EFI_IP4_PROTOCOL          *Ip;\r
+  NET_BUF                   *Pkt;\r
+  EFI_IP4_COMPLETION_TOKEN  *SndToken;\r
+} IP_IO_SEND_ENTRY;\r
+\r
+typedef EFI_IP4_OVERRIDE_DATA IP_IO_OVERRIDE;\r
+\r
+typedef struct _IP_IO_IP_INFO {\r
+  IP4_ADDR                  Addr;\r
+  IP4_ADDR                  SubnetMask;\r
+  LIST_ENTRY                Entry;\r
+  EFI_HANDLE                ChildHandle;\r
+  EFI_IP4_PROTOCOL          *Ip;\r
+  EFI_IP4_COMPLETION_TOKEN  DummyRcvToken;\r
+  INTN                      RefCnt;\r
+} IP_IO_IP_INFO;\r
+\r
+/**\r
+  Create a new IP_IO instance.\r
+\r
+  @param  Image                 The image handle of an IP_IO consumer protocol.\r
+  @param  Controller            The controller handle of an IP_IO consumer protocol\r
+                                installed on.\r
+\r
+  @return Pointer to a newly created IP_IO instance.\r
+\r
+**/\r
+IP_IO *\r
+EFIAPI\r
+IpIoCreate (\r
+  IN EFI_HANDLE Image,\r
+  IN EFI_HANDLE Controller\r
+  );\r
+\r
+/**\r
+  Destroy an IP_IO instance.\r
+\r
+  @param  IpIo                  Pointer to the IP_IO instance that needs to\r
+                                destroy.\r
+\r
+  @retval EFI_SUCCESS           The IP_IO instance destroyed successfully.\r
+  @retval other                 Error condition occurred.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+IpIoDestroy (\r
+  IN IP_IO *IpIo\r
+  );\r
+\r
+/**\r
+  Stop an IP_IO instance.\r
+\r
+  @param  IpIo                  Pointer to the IP_IO instance that needs to stop.\r
+\r
+  @retval EFI_SUCCESS           The IP_IO instance stopped successfully.\r
+  @retval other                 Error condition occurred.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+IpIoStop (\r
+  IN IP_IO *IpIo\r
+  );\r
+\r
+/**\r
+  Open an IP_IO instance for use.\r
+\r
+  @param  IpIo                  Pointer to an IP_IO instance that needs to open.\r
+  @param  OpenData              The configuration data for the IP_IO instance.\r
+\r
+  @retval EFI_SUCCESS           The IP_IO instance opened with OpenData\r
+                                successfully.\r
+  @retval other                 Error condition occurred.\r
+\r
+**/\r
+EFI_STATUS\r
+IpIoOpen (\r
+  IN IP_IO           *IpIo,\r
+  IN IP_IO_OPEN_DATA *OpenData\r
+  );\r
+\r
+/**\r
+  Send out an IP packet.\r
+\r
+  @param  IpIo                  Pointer to an IP_IO instance used for sending IP\r
+                                packet.\r
+  @param  Pkt                   Pointer to the IP packet to be sent.\r
+  @param  Sender                The IP protocol instance used for sending.\r
+  @param  Context               \r
+  @param  NotifyData            \r
+  @param  Dest                  The destination IP address to send this packet to.\r
+  @param  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_NOT_STARTED       The IpIo is not configured.\r
+  @retval EFI_OUT_OF_RESOURCES  Failed due to resource limit.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+IpIoSend (\r
+  IN IP_IO           *IpIo,\r
+  IN NET_BUF         *Pkt,\r
+  IN IP_IO_IP_INFO   *Sender,\r
+  IN VOID            *Context    OPTIONAL,\r
+  IN VOID            *NotifyData OPTIONAL,\r
+  IN IP4_ADDR        Dest,\r
+  IN IP_IO_OVERRIDE  *OverrideData\r
+  );\r
+\r
+/**\r
+  Cancel the IP transmit token which wraps this Packet.\r
+\r
+  @param  IpIo                  Pointer to the IP_IO instance.\r
+  @param  Packet                Pointer to the packet 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
+  @param  IpIo                  Pointer to a IP_IO instance to add a new IP\r
+                                instance for sending purpose.\r
+\r
+  @return Pointer to the created IP_IO_IP_INFO structure, NULL is failed.\r
+\r
+**/\r
+IP_IO_IP_INFO *\r
+EFIAPI\r
+IpIoAddIp (\r
+  IN IP_IO  *IpIo\r
+  );\r
+\r
+/**\r
+  Configure the IP instance of this IpInfo and start the receiving if Ip4ConfigData\r
+  is not NULL.\r
+\r
+  @param  IpInfo                Pointer to the IP_IO_IP_INFO instance.\r
+  @param  Ip4ConfigData         The IP4 configure data used to configure the ip\r
+                                instance, if NULL the ip instance is reseted. If\r
+                                UseDefaultAddress is set to TRUE, and the configure\r
+                                operation succeeds, the default address information\r
+                                is written back in this Ip4ConfigData.\r
+\r
+  @retval EFI_STATUS            The status returned by IP4->Configure or\r
+                                IP4->Receive.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+IpIoConfigIp (\r
+  IN     IP_IO_IP_INFO        *IpInfo,\r
+  IN OUT EFI_IP4_CONFIG_DATA  *Ip4ConfigData OPTIONAL\r
+  );\r
+\r
+/**\r
+  Destroy an IP instance maintained in IpIo->IpList for\r
+  sending purpose.\r
+\r
+  @param  IpIo                  Pointer to the IP_IO instance.\r
+  @param  IpInfo                Pointer to the IpInfo to be removed.\r
+\r
+  @return None.\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 with Src.\r
+\r
+  @param  IpIo                  Pointer to the pointer of the IP_IO instance.\r
+  @param  Src                   The local IP address.\r
+\r
+  @return Pointer to the IP protocol can be used for sending purpose and its local\r
+  @return address is the same with Src.\r
+\r
+**/\r
+IP_IO_IP_INFO *\r
+EFIAPI\r
+IpIoFindSender (\r
+  IN OUT IP_IO     **IpIo,\r
+  IN     IP4_ADDR  Src\r
+  );\r
+\r
+/**\r
+  Get the ICMP error map information, the ErrorStatus will be returned.\r
+  The IsHard and Notify are optional. If they are not NULL, this rouine will\r
+  fill them.\r
+  We move IcmpErrMap[] to local variable to enable EBC build.\r
+\r
+  @param  IcmpError             IcmpError Type\r
+  @param  IsHard                Whether it is a hard error\r
+  @param  Notify                Whether it need to notify SockError\r
+\r
+  @return ICMP Error Status\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+IpIoGetIcmpErrStatus (\r
+  IN  ICMP_ERROR  IcmpError,\r
+  OUT BOOLEAN     *IsHard, OPTIONAL\r
+  OUT BOOLEAN     *Notify OPTIONAL\r
+  );\r
+\r
+#endif\r
index 636ec81c0c23ce6d0726900d6f52c32b59f1e0b6..29dddc956aacd65762d725e96065102685218518 100644 (file)
-/** @file
-  This library provides basic function for UEFI network stack.
-
-Copyright (c) 2005 - 2008, Intel Corporation
-All rights reserved. This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution.  The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#ifndef _NET_LIB_H_
-#define _NET_LIB_H_
-
-#include <Library/BaseMemoryLib.h>
-#include <Library/MemoryAllocationLib.h>
-#include <Protocol/DriverBinding.h>
-#include <Protocol/ComponentName.h>
-#include <Protocol/DriverConfiguration.h>
-#include <Protocol/DriverDiagnostics.h>
-#include <Protocol/Dpc.h>
-
-typedef UINT32          IP4_ADDR;
-typedef UINT32          TCP_SEQNO;
-typedef UINT16          TCP_PORTNO;
-
-typedef enum {
-  NET_ETHER_ADDR_LEN    = 6,
-  NET_IFTYPE_ETHERNET   = 0x01,
-
-  EFI_IP_PROTO_UDP      = 0x11,
-  EFI_IP_PROTO_TCP      = 0x06,
-  EFI_IP_PROTO_ICMP     = 0x01,
-
-  //
-  // The address classfication
-  //
-  IP4_ADDR_CLASSA       = 1,
-  IP4_ADDR_CLASSB,
-  IP4_ADDR_CLASSC,
-  IP4_ADDR_CLASSD,
-  IP4_ADDR_CLASSE,
-
-  IP4_MASK_NUM          = 33
-} IP4_CLASS_TYPE;
-
-#pragma pack(1)
-
-//
-// Ethernet head definition
-//
-typedef struct {
-  UINT8                 DstMac [NET_ETHER_ADDR_LEN];
-  UINT8                 SrcMac [NET_ETHER_ADDR_LEN];
-  UINT16                EtherType;
-} ETHER_HEAD;
-
-
-//
-// The EFI_IP4_HEADER is hard to use because the source and
-// destination address are defined as EFI_IPv4_ADDRESS, which
-// is a structure. Two structures can't be compared or masked
-// directly. This is why there is an internal representation.
-//
-typedef struct {
-  UINT8                 HeadLen : 4;
-  UINT8                 Ver     : 4;
-  UINT8                 Tos;
-  UINT16                TotalLen;
-  UINT16                Id;
-  UINT16                Fragment;
-  UINT8                 Ttl;
-  UINT8                 Protocol;
-  UINT16                Checksum;
-  IP4_ADDR              Src;
-  IP4_ADDR              Dst;
-} IP4_HEAD;
-
-
-//
-// ICMP head definition. ICMP message is categoried as either an error
-// message or query message. Two message types have their own head format.
-//
-typedef struct {
-  UINT8                 Type;
-  UINT8                 Code;
-  UINT16                Checksum;
-} IP4_ICMP_HEAD;
-
-typedef struct {
-  IP4_ICMP_HEAD         Head;
-  UINT32                Fourth; // 4th filed of the head, it depends on Type.
-  IP4_HEAD              IpHead;
-} IP4_ICMP_ERROR_HEAD;
-
-typedef struct {
-  IP4_ICMP_HEAD         Head;
-  UINT16                Id;
-  UINT16                Seq;
-} IP4_ICMP_QUERY_HEAD;
-
-
-//
-// UDP header definition
-//
-typedef struct {
-  UINT16                SrcPort;
-  UINT16                DstPort;
-  UINT16                Length;
-  UINT16                Checksum;
-} EFI_UDP4_HEADER;
-
-
-//
-// TCP header definition
-//
-typedef struct {
-  TCP_PORTNO            SrcPort;
-  TCP_PORTNO            DstPort;
-  TCP_SEQNO             Seq;
-  TCP_SEQNO             Ack;
-  UINT8                 Res     : 4;
-  UINT8                 HeadLen : 4;
-  UINT8                 Flag;
-  UINT16                Wnd;
-  UINT16                Checksum;
-  UINT16                Urg;
-} TCP_HEAD;
-
-#pragma pack()
-
-#define NET_MAC_EQUAL(pMac1, pMac2, Len)     \
-    (CompareMem ((pMac1), (pMac2), Len) == 0)
-
-#define NET_MAC_IS_MULTICAST(Mac, BMac, Len) \
-    (((*((UINT8 *) Mac) & 0x01) == 0x01) && (!NET_MAC_EQUAL (Mac, BMac, Len)))
-
-#define NTOHL(x) (UINT32)((((UINT32) (x) & 0xff)     << 24) | \
-                          (((UINT32) (x) & 0xff00)   << 8)  | \
-                          (((UINT32) (x) & 0xff0000) >> 8)  | \
-                          (((UINT32) (x) & 0xff000000) >> 24))
-
-#define HTONL(x)  NTOHL(x)
-
-#define NTOHS(x)  (UINT16)((((UINT16) (x) & 0xff) << 8) | \
-                           (((UINT16) (x) & 0xff00) >> 8))
-
-#define HTONS(x)  NTOHS(x)
-
-//
-// Test the IP's attribute, All the IPs are in host byte order.
-//
-#define IP4_IS_MULTICAST(Ip)              (((Ip) & 0xF0000000) == 0xE0000000)
-#define IP4_IS_LOCAL_BROADCAST(Ip)        ((Ip) == 0xFFFFFFFF)
-#define IP4_NET_EQUAL(Ip1, Ip2, NetMask)  (((Ip1) & (NetMask)) == ((Ip2) & (NetMask)))
-#define IP4_IS_VALID_NETMASK(Ip)          (NetGetMaskLength (Ip) != IP4_MASK_NUM)
-
-//
-// Convert the EFI_IP4_ADDRESS to plain UINT32 IP4 address.
-//
-#define EFI_IP4(EfiIpAddr)       (*(IP4_ADDR *) ((EfiIpAddr).Addr))
-#define EFI_NTOHL(EfiIp)         (NTOHL (EFI_IP4 ((EfiIp))))
-#define EFI_IP4_EQUAL(Ip1, Ip2)  (CompareMem ((Ip1), (Ip2), sizeof (EFI_IPv4_ADDRESS)) == 0)
-
-/**
-  Return the length of the mask. If the mask is invalid,
-  return the invalid length 33, which is IP4_MASK_NUM.
-  NetMask is in the host byte order.
-
-  @param  NetMask               The netmask to get the length from
-
-  @return The length of the netmask, IP4_MASK_NUM if the mask isn't
-  @return supported.
-
-**/
-INTN
-EFIAPI
-NetGetMaskLength (
-  IN IP4_ADDR               Mask
-  );
-
-/**
-  Return the class of the address, such as class a, b, c.
-  Addr is in host byte order.
-
-  @param  Addr                  The address to get the class from
-
-  @return IP address class, such as IP4_ADDR_CLASSA
-
-**/
-INTN
-EFIAPI
-NetGetIpClass (
-  IN IP4_ADDR               Addr
-  );
-
-/**
-  Check whether the IP is a valid unicast address according to
-  the netmask. If NetMask is zero, use the IP address's class to
-  get the default mask.
-
-  @param  Ip                    The IP to check againist
-  @param  NetMask               The mask of the IP
-
-  @return TRUE if IP is a valid unicast address on the network, otherwise FALSE
-
-**/
-BOOLEAN
-Ip4IsUnicast (
-  IN IP4_ADDR               Ip,
-  IN IP4_ADDR               NetMask
-  );
-
-extern IP4_ADDR gIp4AllMasks [IP4_MASK_NUM];
-
-
-extern EFI_IPv4_ADDRESS  mZeroIp4Addr;
-
-#define NET_IS_DIGIT(Ch)            (('0' <= (Ch)) && ((Ch) <= '9'))
-#define NET_ROUNDUP(size, unit)     (((size) + (unit) - 1) & (~((unit) - 1)))
-#define NET_IS_LOWER_CASE_CHAR(Ch)  (('a' <= (Ch)) && ((Ch) <= 'z'))
-#define NET_IS_UPPER_CASE_CHAR(Ch)  (('A' <= (Ch)) && ((Ch) <= 'Z'))
-
-#define TICKS_PER_MS            10000U
-#define TICKS_PER_SECOND        10000000U
-
-#define NET_RANDOM(Seed)        ((UINT32) ((UINT32) (Seed) * 1103515245UL + 12345) % 4294967295UL)
-
-/**
-  Extract a UINT32 from a byte stream, then convert it to host
-  byte order. Use this function to avoid alignment error.
-
-  @param  Buf                   The buffer to extract the UINT32.
-
-  @return The UINT32 extracted.
-
-**/
-UINT32
-EFIAPI
-NetGetUint32 (
-  IN UINT8                  *Buf
-  );
-
-/**
-  Put a UINT32 to the byte stream. Convert it from host byte order
-  to network byte order before putting.
-
-  @param  Buf                   The buffer to put the UINT32
-  @param  Data                  The data to put
-
-  @return None
-
-**/
-VOID
-EFIAPI
-NetPutUint32 (
-  IN UINT8                  *Buf,
-  IN UINT32                 Data
-  );
-
-/**
-  Initialize a random seed using current time.
-
-  None
-
-  @return The random seed initialized with current time.
-
-**/
-UINT32
-EFIAPI
-NetRandomInitSeed (
-  VOID
-  );
-
-
-#define NET_LIST_USER_STRUCT(Entry, Type, Field)        \
-          _CR(Entry, Type, Field)
-
-#define NET_LIST_USER_STRUCT_S(Entry, Type, Field, Sig)  \
-          CR(Entry, Type, Field, Sig)
-
-//
-// Iterate through the doule linked list. It is NOT delete safe
-//
-#define NET_LIST_FOR_EACH(Entry, ListHead) \
-  for(Entry = (ListHead)->ForwardLink; Entry != (ListHead); Entry = Entry->ForwardLink)
-
-//
-// Iterate through the doule linked list. This is delete-safe.
-// Don't touch NextEntry. Also, don't use this macro if list
-// entries other than the Entry may be deleted when processing
-// the current Entry.
-//
-#define NET_LIST_FOR_EACH_SAFE(Entry, NextEntry, ListHead) \
-  for(Entry = (ListHead)->ForwardLink, NextEntry = Entry->ForwardLink; \
-      Entry != (ListHead); \
-      Entry = NextEntry, NextEntry = Entry->ForwardLink \
-     )
-
-//
-// Make sure the list isn't empty before get the frist/last record.
-//
-#define NET_LIST_HEAD(ListHead, Type, Field)  \
-          NET_LIST_USER_STRUCT((ListHead)->ForwardLink, Type, Field)
-
-#define NET_LIST_TAIL(ListHead, Type, Field)  \
-          NET_LIST_USER_STRUCT((ListHead)->BackLink, Type, Field)
-
-
-/**
-  Remove the first entry on the list
-
-  @param  Head                  The list header
-
-  @return The entry that is removed from the list, NULL if the list is empty.
-
-**/
-LIST_ENTRY *
-EFIAPI
-NetListRemoveHead (
-  LIST_ENTRY            *Head
-  );
-
-/**
-  Remove the last entry on the list
-
-  @param  Head                  The list head
-
-  @return The entry that is removed from the list, NULL if the list is empty.
-
-**/
-LIST_ENTRY *
-EFIAPI
-NetListRemoveTail (
-  LIST_ENTRY            *Head
-  );
-
-/**
-  Insert the NewEntry after the PrevEntry.
-
-  @param  PrevEntry             The previous entry to insert after
-  @param  NewEntry              The new entry to insert
-
-  @return None
-
-**/
-VOID
-EFIAPI
-NetListInsertAfter (
-  IN LIST_ENTRY         *PrevEntry,
-  IN LIST_ENTRY         *NewEntry
-  );
-
-/**
-  Insert the NewEntry before the PostEntry.
-
-  @param  PostEntry             The entry to insert before
-  @param  NewEntry              The new entry to insert
-
-  @return None
-
-**/
-VOID
-EFIAPI
-NetListInsertBefore (
-  IN LIST_ENTRY         *PostEntry,
-  IN LIST_ENTRY         *NewEntry
-  );
-
-
-//
-// Object container: EFI network stack spec defines various kinds of
-// tokens. The drivers can share code to manage those objects.
-//
-typedef struct {
-  LIST_ENTRY                Link;
-  VOID                      *Key;
-  VOID                      *Value;
-} NET_MAP_ITEM;
-
-typedef struct {
-  LIST_ENTRY                Used;
-  LIST_ENTRY                Recycled;
-  UINTN                     Count;
-} NET_MAP;
-
-#define NET_MAP_INCREAMENT  64
-
-/**
-  Initialize the netmap. Netmap is a reposity to keep the <Key, Value> pairs.
-
-  @param  Map                   The netmap to initialize
-
-  @return None
-
-**/
-VOID
-EFIAPI
-NetMapInit (
-  IN NET_MAP                *Map
-  );
-
-/**
-  To clean up the netmap, that is, release allocated memories.
-
-  @param  Map                   The netmap to clean up.
-
-  @return None
-
-**/
-VOID
-EFIAPI
-NetMapClean (
-  IN NET_MAP                *Map
-  );
-
-/**
-  Test whether the netmap is empty
-
-  @param  Map                   The net map to test
-
-  @return TRUE if the netmap is empty, otherwise FALSE.
-
-**/
-BOOLEAN
-EFIAPI
-NetMapIsEmpty (
-  IN NET_MAP                *Map
-  );
-
-/**
-  Return the number of the <Key, Value> pairs in the netmap.
-
-  @param  Map                   The netmap to get the entry number
-
-  @return The entry number in the netmap.
-
-**/
-UINTN
-EFIAPI
-NetMapGetCount (
-  IN NET_MAP                *Map
-  );
-
-/**
-  Allocate an item to save the <Key, Value> pair to the head of the netmap.
-
-  @param  Map                   The netmap to insert into
-  @param  Key                   The user's key
-  @param  Value                 The user's value for the key
-
-  @retval EFI_OUT_OF_RESOURCES  Failed to allocate the memory for the item
-  @retval EFI_SUCCESS           The item is inserted to the head
-
-**/
-EFI_STATUS
-EFIAPI
-NetMapInsertHead (
-  IN NET_MAP                *Map,
-  IN VOID                   *Key,
-  IN VOID                   *Value    OPTIONAL
-  );
-
-/**
-  Allocate an item to save the <Key, Value> pair to the tail of the netmap.
-
-  @param  Map                   The netmap to insert into
-  @param  Key                   The user's key
-  @param  Value                 The user's value for the key
-
-  @retval EFI_OUT_OF_RESOURCES  Failed to allocate the memory for the item
-  @retval EFI_SUCCESS           The item is inserted to the tail
-
-**/
-EFI_STATUS
-EFIAPI
-NetMapInsertTail (
-  IN NET_MAP                *Map,
-  IN VOID                   *Key,
-  IN VOID                   *Value    OPTIONAL
-  );
-
-/**
-  Find the key in the netmap
-
-  @param  Map                   The netmap to search within
-  @param  Key                   The key to search
-
-  @return The point to the item contains the Key, or NULL if Key isn't in the map.
-
-**/
-NET_MAP_ITEM  *
-EFIAPI
-NetMapFindKey (
-  IN  NET_MAP               *Map,
-  IN  VOID                  *Key
-  );
-
-/**
-  Remove the item from the netmap
-
-  @param  Map                   The netmap to remove the item from
-  @param  Item                  The item to remove
-  @param  Value                 The variable to receive the value if not NULL
-
-  @return The key of the removed item.
-
-**/
-VOID *
-EFIAPI
-NetMapRemoveItem (
-  IN  NET_MAP               *Map,
-  IN  NET_MAP_ITEM          *Item,
-  OUT VOID                  **Value   OPTIONAL
-  );
-
-/**
-  Remove the first entry on the netmap.
-
-  @param  Map                   The netmap to remove the head from
-  @param  Value                 The variable to receive the value if not NULL
-
-  @return The key of the item removed
-
-**/
-VOID *
-EFIAPI
-NetMapRemoveHead (
-  IN  NET_MAP               *Map,
-  OUT VOID                  **Value   OPTIONAL
-  );
-
-/**
-  Remove the last entry on the netmap.
-
-  @param  Map                   The netmap to remove the tail from
-  @param  Value                 The variable to receive the value if not NULL
-
-  @return The key of the item removed
-
-**/
-VOID *
-EFIAPI
-NetMapRemoveTail (
-  IN  NET_MAP               *Map,
-  OUT VOID                  **Value OPTIONAL
-  );
-
-typedef
-EFI_STATUS
-(*NET_MAP_CALLBACK) (
-  IN NET_MAP                *Map,
-  IN NET_MAP_ITEM           *Item,
-  IN VOID                   *Arg
-  );
-
-/**
-  Iterate through the netmap and call CallBack for each item. It will
-  contiue the traverse if CallBack returns EFI_SUCCESS, otherwise, break
-  from the loop. It returns the CallBack's last return value. This
-  function is delete safe for the current item.
-
-  @param  Map                   The Map to iterate through
-  @param  CallBack              The callback function to call for each item.
-  @param  Arg                   The opaque parameter to the callback
-
-  @return It returns the CallBack's last return value.
-
-**/
-EFI_STATUS
-EFIAPI
-NetMapIterate (
-  IN NET_MAP                *Map,
-  IN NET_MAP_CALLBACK       CallBack,
-  IN VOID                   *Arg      OPTIONAL
-  );
-
-
-//
-// Helper functions to implement driver binding and service binding protocols.
-//
-/**
-  Create a child of the service that is identified by ServiceBindingGuid.
-
-  @param  ControllerHandle      The controller which has the service installed.
-  @param  ImageHandle           The image handle used to open service.
-  @param  ServiceBindingGuid    The service's Guid.
-  @param  ChildHandle           The handle to receive the create child
-
-  @retval EFI_SUCCESS           The child is successfully created.
-  @retval Others                Failed to create the child.
-
-**/
-EFI_STATUS
-EFIAPI
-NetLibCreateServiceChild (
-  IN  EFI_HANDLE            ControllerHandle,
-  IN  EFI_HANDLE            ImageHandle,
-  IN  EFI_GUID              *ServiceBindingGuid,
-  OUT EFI_HANDLE            *ChildHandle
-  );
-
-/**
-  Destory a child of the service that is identified by ServiceBindingGuid.
-
-  @param  ControllerHandle      The controller which has the service installed.
-  @param  ImageHandle           The image handle used to open service.
-  @param  ServiceBindingGuid    The service's Guid.
-  @param  ChildHandle           The child to destory
-
-  @retval EFI_SUCCESS           The child is successfully destoried.
-  @retval Others                Failed to destory the child.
-
-**/
-EFI_STATUS
-EFIAPI
-NetLibDestroyServiceChild (
-  IN  EFI_HANDLE            ControllerHandle,
-  IN  EFI_HANDLE            ImageHandle,
-  IN  EFI_GUID              *ServiceBindingGuid,
-  IN  EFI_HANDLE            ChildHandle
-  );
-
-/**
-  Convert the mac address of the simple network protocol installed on
-  SnpHandle to a unicode string. Callers are responsible for freeing the
-  string storage.
-
-  @param  SnpHandle             The handle where the simple network protocol is
-                                installed on.
-  @param  ImageHandle           The image handle used to act as the agent handle to
-                                get the simple network protocol.
-  @param  MacString             The pointer to store the address of the string
-                                representation of  the mac address.
-
-  @retval EFI_OUT_OF_RESOURCES  There are not enough memory resource.
-  @retval other                 Failed to open the simple network protocol.
-
-**/
-EFI_STATUS
-EFIAPI
-NetLibGetMacString (
-  IN           EFI_HANDLE  SnpHandle,
-  IN           EFI_HANDLE  ImageHandle,
-  IN OUT       CHAR16      **MacString
-  );
-
-/**
-  Create an IPv4 device path node.
-
-  @param  Node                  Pointer to the IPv4 device path node.
-  @param  Controller            The handle where the NIC IP4 config protocol resides.
-  @param  LocalIp               The local IPv4 address.
-  @param  LocalPort             The local port.
-  @param  RemoteIp              The remote IPv4 address.
-  @param  RemotePort            The remote port.
-  @param  Protocol              The protocol type in the IP header.
-  @param  UseDefaultAddress     Whether this instance is using default address or not.
-
-  @retval None
-**/
-VOID
-EFIAPI
-NetLibCreateIPv4DPathNode (
-  IN OUT IPv4_DEVICE_PATH  *Node,
-  IN EFI_HANDLE            Controller,
-  IN IP4_ADDR              LocalIp,
-  IN UINT16                LocalPort,
-  IN IP4_ADDR              RemoteIp,
-  IN UINT16                RemotePort,
-  IN UINT16                Protocol,
-  IN BOOLEAN               UseDefaultAddress
-  );
-
-/**
-  Find the UNDI/SNP handle from controller and protocol GUID.
-  For example, IP will open a MNP child to transmit/receive
-  packets, when MNP is stopped, IP should also be stopped. IP
-  needs to find its own private data which is related the IP's
-  service binding instance that is install on UNDI/SNP handle.
-  Now, the controller is either a MNP or ARP child handle. But
-  IP opens these handle BY_DRIVER, use that info, we can get the
-  UNDI/SNP handle.
-
-  @param  Controller            Then protocol handle to check
-  @param  ProtocolGuid          The protocol that is related with the handle.
-
-  @return The UNDI/SNP handle or NULL.
-
-**/
-EFI_HANDLE
-EFIAPI
-NetLibGetNicHandle (
-  IN EFI_HANDLE             Controller,
-  IN EFI_GUID               *ProtocolGuid
-  );
-
-/**
-  Add a Deferred Procedure Call to the end of the DPC queue.
-
-  @param DpcTpl           The EFI_TPL that the DPC should be invoked.
-  @param DpcProcedure     Pointer to the DPC's function.
-  @param DpcContext       Pointer to the DPC's context.  Passed to DpcProcedure
-                          when DpcProcedure is invoked.
-
-  @retval  EFI_SUCCESS              The DPC was queued.
-  @retval  EFI_INVALID_PARAMETER    DpcTpl is not a valid EFI_TPL.
-                                    DpcProcedure is NULL.
-  @retval  EFI_OUT_OF_RESOURCES     There are not enough resources available to
-                                    add the DPC to the queue.
-
-**/
-EFI_STATUS
-EFIAPI
-NetLibQueueDpc (
-  IN EFI_TPL            DpcTpl,
-  IN EFI_DPC_PROCEDURE  DpcProcedure,
-  IN VOID               *DpcContext    OPTIONAL
-  );
-
-/**
-  Add a Deferred Procedure Call to the end of the DPC queue.
-
-  @retval  EFI_SUCCESS              One or more DPCs were invoked.
-  @retval  EFI_NOT_FOUND            No DPCs were invoked.
-
-**/
-EFI_STATUS
-EFIAPI
-NetLibDispatchDpc (
-  VOID
-  );
-
-/**
-  This is the default unload handle for all the network drivers.
-
-  @param  ImageHandle           The drivers' driver image.
-
-  @retval EFI_SUCCESS           The image is unloaded.
-  @retval Others                Failed to unload the image.
-
-**/
-EFI_STATUS
-EFIAPI
-NetLibDefaultUnload (
-  IN EFI_HANDLE             ImageHandle
-  );
-
-typedef enum {
-  //
-  //Various signatures
-  //
-  NET_BUF_SIGNATURE    = EFI_SIGNATURE_32 ('n', 'b', 'u', 'f'),
-  NET_VECTOR_SIGNATURE = EFI_SIGNATURE_32 ('n', 'v', 'e', 'c'),
-  NET_QUE_SIGNATURE    = EFI_SIGNATURE_32 ('n', 'b', 'q', 'u'),
-
-
-  NET_PROTO_DATA       = 64,   // Opaque buffer for protocols
-  NET_BUF_HEAD         = 1,    // Trim or allocate space from head
-  NET_BUF_TAIL         = 0,    // Trim or allocate space from tail
-  NET_VECTOR_OWN_FIRST = 0x01  // We allocated the 1st block in the vector
-} NET_SIGNATURE_TYPE;
-
-#define NET_CHECK_SIGNATURE(PData, SIGNATURE) \
-  ASSERT (((PData) != NULL) && ((PData)->Signature == (SIGNATURE)))
-
-#define NET_SWAP_SHORT(Value) \
-  ((((Value) & 0xff) << 8) | (((Value) >> 8) & 0xff))
-
-//
-// Single memory block in the vector.
-//
-typedef struct {
-  UINT32              Len;        // The block's length
-  UINT8               *Bulk;      // The block's Data
-} NET_BLOCK;
-
-typedef VOID (*NET_VECTOR_EXT_FREE) (VOID *Arg);
-
-//
-//NET_VECTOR contains several blocks to hold all packet's
-//fragments and other house-keeping stuff for sharing. It
-//doesn't specify the where actual packet fragment begins.
-//
-typedef struct {
-  UINT32              Signature;
-  INTN                RefCnt;  // Reference count to share NET_VECTOR.
-  NET_VECTOR_EXT_FREE Free;    // external function to free NET_VECTOR
-  VOID                *Arg;    // opeque argument to Free
-  UINT32              Flag;    // Flags, NET_VECTOR_OWN_FIRST
-  UINT32              Len;     // Total length of the assocated BLOCKs
-
-  UINT32              BlockNum;
-  NET_BLOCK           Block[1];
-} NET_VECTOR;
-
-//
-//NET_BLOCK_OP operate on the NET_BLOCK, It specifies
-//where the actual fragment begins and where it ends
-//
-typedef struct {
-  UINT8               *BlockHead;   // Block's head, or the smallest valid Head
-  UINT8               *BlockTail;   // Block's tail. BlockTail-BlockHead=block length
-  UINT8               *Head;        // 1st byte of the data in the block
-  UINT8               *Tail;        // Tail of the data in the block, Tail-Head=Size
-  UINT32              Size;         // The size of the data
-} NET_BLOCK_OP;
-
-
-//
-//NET_BUF is the buffer manage structure used by the
-//network stack. Every network packet may be fragmented,
-//and contains multiple fragments. The Vector points to
-//memory blocks used by the each fragment, and BlockOp
-//specifies where each fragment begins and ends.
-//
-//It also contains a opaque area for protocol to store
-//per-packet informations. Protocol must be caution not
-//to overwrite the members after that.
-//
-typedef struct {
-  UINT32              Signature;
-  INTN                RefCnt;
-  LIST_ENTRY          List;       // The List this NET_BUF is on
-
-  IP4_HEAD            *Ip;        // Network layer header, for fast access
-  TCP_HEAD            *Tcp;       // Transport layer header, for fast access
-  UINT8               ProtoData [NET_PROTO_DATA]; //Protocol specific data
-
-  NET_VECTOR          *Vector;    // The vector containing the packet
-
-  UINT32              BlockOpNum; // Total number of BlockOp in the buffer
-  UINT32              TotalSize;  // Total size of the actual packet
-  NET_BLOCK_OP        BlockOp[1]; // Specify the position of actual packet
-} NET_BUF;
-
-
-//
-//A queue of NET_BUFs, It is just a thin extension of
-//NET_BUF functions.
-//
-typedef struct {
-  UINT32              Signature;
-  INTN                RefCnt;
-  LIST_ENTRY          List;       // The List this buffer queue is on
-
-  LIST_ENTRY          BufList;    // list of queued buffers
-  UINT32              BufSize;    // total length of DATA in the buffers
-  UINT32              BufNum;     // total number of buffers on the chain
-} NET_BUF_QUEUE;
-
-//
-// Pseudo header for TCP and UDP checksum
-//
-#pragma pack(1)
-typedef struct {
-  IP4_ADDR            SrcIp;
-  IP4_ADDR            DstIp;
-  UINT8               Reserved;
-  UINT8               Protocol;
-  UINT16              Len;
-} NET_PSEUDO_HDR;
-#pragma pack()
-
-//
-// The fragment entry table used in network interfaces. This is
-// the same as NET_BLOCK now. Use two different to distinguish
-// the two in case that NET_BLOCK be enhanced later.
-//
-typedef struct {
-  UINT32              Len;
-  UINT8               *Bulk;
-} NET_FRAGMENT;
-
-#define NET_GET_REF(PData)      ((PData)->RefCnt++)
-#define NET_PUT_REF(PData)      ((PData)->RefCnt--)
-#define NETBUF_FROM_PROTODATA(Info) _CR((Info), NET_BUF, ProtoData)
-
-#define NET_BUF_SHARED(Buf) \
-  (((Buf)->RefCnt > 1) || ((Buf)->Vector->RefCnt > 1))
-
-#define NET_VECTOR_SIZE(BlockNum) \
-  (sizeof (NET_VECTOR) + ((BlockNum) - 1) * sizeof (NET_BLOCK))
-
-#define NET_BUF_SIZE(BlockOpNum)  \
-  (sizeof (NET_BUF) + ((BlockOpNum) - 1) * sizeof (NET_BLOCK_OP))
-
-#define NET_HEADSPACE(BlockOp)  \
-  (UINTN)((BlockOp)->Head - (BlockOp)->BlockHead)
-
-#define NET_TAILSPACE(BlockOp)  \
-  (UINTN)((BlockOp)->BlockTail - (BlockOp)->Tail)
-
-/**
-  Allocate a single block NET_BUF. Upon allocation, all the
-  free space is in the tail room.
-
-  @param  Len                   The length of the block.
-
-  @retval *                     Pointer to the allocated NET_BUF. If NULL  the
-                                allocation failed due to resource limit.
-
-**/
-NET_BUF  *
-EFIAPI
-NetbufAlloc (
-  IN UINT32                 Len
-  );
-
-/**
-  Free the buffer and its associated NET_VECTOR.
-
-  @param  Nbuf                  Pointer to the NET_BUF to be freed.
-
-  @return None.
-
-**/
-VOID
-EFIAPI
-NetbufFree (
-  IN NET_BUF                *Nbuf
-  );
-
-/**
-  Get the position of some byte in the net buffer. This can be used
-  to, for example, retrieve the IP header in the packet. It also
-  returns the fragment that contains the byte which is used mainly by
-  the buffer implementation itself.
-
-  @param  Nbuf                  Pointer to the net buffer.
-  @param  Offset                The index or offset of the byte
-  @param  Index                 Index of the fragment that contains the block
-
-  @retval *                     Pointer to the nth byte of data in the net buffer.
-                                If NULL, there is no such data in the net buffer.
-
-**/
-UINT8  *
-EFIAPI
-NetbufGetByte (
-  IN  NET_BUF               *Nbuf,
-  IN  UINT32                Offset,
-  OUT UINT32                *Index      OPTIONAL
-  );
-
-/**
-  Create a copy of NET_BUF that share the associated NET_DATA.
-
-  @param  Nbuf                  Pointer to the net buffer to be cloned.
-
-  @retval *                     Pointer to the cloned net buffer.
-
-**/
-NET_BUF  *
-EFIAPI
-NetbufClone (
-  IN NET_BUF                *Nbuf
-  );
-
-/**
-  Create a duplicated copy of Nbuf, data is copied. Also leave some
-  head space before the data.
-
-  @param  Nbuf                  Pointer to the net buffer to be cloned.
-  @param  Duplicate             Pointer to the net buffer to duplicate to, if NULL
-                                a new net  buffer is allocated.
-  @param  HeadSpace             Length of the head space to reserve
-
-  @retval *                     Pointer to the duplicated net buffer.
-
-**/
-NET_BUF  *
-EFIAPI
-NetbufDuplicate (
-  IN NET_BUF                *Nbuf,
-  IN NET_BUF                *Duplicate    OPTIONAL,
-  IN UINT32                 HeadSpace
-  );
-
-/**
-  Create a NET_BUF structure which contains Len byte data of
-  Nbuf starting from Offset. A new NET_BUF structure will be
-  created but the associated data in NET_VECTOR is shared.
-  This function exists to do IP packet fragmentation.
-
-  @param  Nbuf                  Pointer to the net buffer to be cloned.
-  @param  Offset                Starting point of the data to be included in new
-                                buffer.
-  @param  Len                   How many data to include in new data
-  @param  HeadSpace             How many bytes of head space to reserve for
-                                protocol header
-
-  @retval *                     Pointer to the cloned net buffer.
-
-**/
-NET_BUF  *
-EFIAPI
-NetbufGetFragment (
-  IN NET_BUF                *Nbuf,
-  IN UINT32                 Offset,
-  IN UINT32                 Len,
-  IN UINT32                 HeadSpace
-  );
-
-/**
-  Reserve some space in the header room of the buffer.
-  Upon allocation, all the space are in the tail room
-  of the buffer. Call this function to move some space
-  to the header room. This function is quite limited in
-  that it can only reserver space from the first block
-  of an empty NET_BUF not built from the external. But
-  it should be enough for the network stack.
-
-  @param  Nbuf                  Pointer to the net buffer.
-  @param  Len                   The length of buffer to be reserverd.
-
-  @return None.
-
-**/
-VOID
-EFIAPI
-NetbufReserve (
-  IN NET_BUF                *Nbuf,
-  IN UINT32                 Len
-  );
-
-/**
-  Allocate some space from the header or tail of the buffer.
-
-  @param  Nbuf                  Pointer to the net buffer.
-  @param  Len                   The length of the buffer to be allocated.
-  @param  FromHead              The flag to indicate whether reserve the data from
-                                head or tail. TRUE for from head, and FALSE for
-                                from tail.
-
-  @retval *                     Pointer to the first byte of the allocated buffer.
-
-**/
-UINT8  *
-EFIAPI
-NetbufAllocSpace (
-  IN NET_BUF                *Nbuf,
-  IN UINT32                 Len,
-  IN BOOLEAN                FromHead
-  );
-
-/**
-  Trim some data from the header or tail of the buffer.
-
-  @param  Nbuf                  Pointer to the net buffer.
-  @param  Len                   The length of the data to be trimmed.
-  @param  FromHead              The flag to indicate whether trim data from head or
-                                tail. TRUE for from head, and FALSE for from tail.
-
-  @retval UINTN                 Length of the actually trimmed data.
-
-**/
-UINT32
-EFIAPI
-NetbufTrim (
-  IN NET_BUF                *Nbuf,
-  IN UINT32                 Len,
-  IN BOOLEAN                FromHead
-  );
-
-/**
-  Copy the data from the specific offset to the destination.
-
-  @param  Nbuf                  Pointer to the net buffer.
-  @param  Offset                The sequence number of the first byte to copy.
-  @param  Len                   Length of the data to copy.
-  @param  Dest                  The destination of the data to copy to.
-
-  @retval UINTN                 The length of the copied data.
-
-**/
-UINT32
-EFIAPI
-NetbufCopy (
-  IN NET_BUF                *Nbuf,
-  IN UINT32                 Offset,
-  IN UINT32                 Len,
-  IN UINT8                  *Dest
-  );
-
-/**
-  Build a NET_BUF from external blocks.
-
-  @param  ExtFragment           Pointer to the data block.
-  @param  ExtNum                The number of the data block.
-  @param  HeadSpace             The head space to be reserved.
-  @param  HeadLen               The length of the protocol header, This function
-                                will pull that number of data into a linear block.
-  @param  ExtFree               Pointer to the caller provided free function.
-  @param  Arg                   The argument passed to ExtFree when ExtFree is
-                                called.
-
-  @retval *                     Pointer to the net buffer built from the data
-                                blocks.
-
-**/
-NET_BUF  *
-EFIAPI
-NetbufFromExt (
-  IN NET_FRAGMENT           *ExtFragment,
-  IN UINT32                 ExtNum,
-  IN UINT32                 HeadSpace,
-  IN UINT32                 HeadLen,
-  IN NET_VECTOR_EXT_FREE    ExtFree,
-  IN VOID                   *Arg          OPTIONAL
-  );
-
-/**
-  Build a fragment table to contain the fragments in the
-  buffer. This is the opposite of the NetbufFromExt.
-
-  @param  Nbuf                  Point to the net buffer
-  @param  ExtFragment           Pointer to the data block.
-  @param  ExtNum                The number of the data block.
-
-  @retval EFI_BUFFER_TOO_SMALL  The number of non-empty block is bigger than ExtNum
-  @retval EFI_SUCCESS           Fragment table built.
-
-**/
-EFI_STATUS
-EFIAPI
-NetbufBuildExt (
-  IN NET_BUF                *Nbuf,
-  IN NET_FRAGMENT           *ExtFragment,
-  IN UINT32                 *ExtNum
-  );
-
-/**
-  Build a NET_BUF from a list of NET_BUF.
-
-  @param  BufList               A List of NET_BUF.
-  @param  HeadSpace             The head space to be reserved.
-  @param  HeaderLen             The length of the protocol header, This function
-                                will pull that number of data into a linear block.
-  @param  ExtFree               Pointer to the caller provided free function.
-  @param  Arg                   The argument passed to ExtFree when ExtFree is
-                                called.
-
-  @retval *                     Pointer to the net buffer built from the data
-                                blocks.
-
-**/
-NET_BUF  *
-EFIAPI
-NetbufFromBufList (
-  IN LIST_ENTRY             *BufList,
-  IN UINT32                 HeadSpace,
-  IN UINT32                 HeaderLen,
-  IN NET_VECTOR_EXT_FREE    ExtFree,
-  IN VOID                   *Arg                OPTIONAL
-  );
-
-/**
-  Free a list of net buffers.
-
-  @param  Head                  Pointer to the head of linked net buffers.
-
-  @return None.
-
-**/
-VOID
-EFIAPI
-NetbufFreeList (
-  IN LIST_ENTRY             *Head
-  );
-
-/**
-  Initiate the net buffer queue.
-
-  @param  NbufQue               Pointer to the net buffer queue to be initiated.
-
-  @return None.
-
-**/
-VOID
-EFIAPI
-NetbufQueInit (
-  IN NET_BUF_QUEUE          *NbufQue
-  );
-
-/**
-  Allocate an initialized net buffer queue.
-
-  None.
-
-  @retval *                     Pointer to the allocated net buffer queue.
-
-**/
-NET_BUF_QUEUE  *
-EFIAPI
-NetbufQueAlloc (
-  VOID
-  );
-
-/**
-  Free a net buffer queue.
-
-  @param  NbufQue               Poitner to the net buffer queue to be freed.
-
-  @return None.
-
-**/
-VOID
-EFIAPI
-NetbufQueFree (
-  IN NET_BUF_QUEUE          *NbufQue
-  );
-
-/**
-  Remove a net buffer from head in the specific queue.
-
-  @param  NbufQue               Pointer to the net buffer queue.
-
-  @retval *                     Pointer to the net buffer removed from the specific
-                                queue.
-
-**/
-NET_BUF  *
-EFIAPI
-NetbufQueRemove (
-  IN NET_BUF_QUEUE          *NbufQue
-  );
-
-/**
-  Append a buffer to the end of the queue.
-
-  @param  NbufQue               Pointer to the net buffer queue.
-  @param  Nbuf                  Pointer to the net buffer to be appended.
-
-  @return None.
-
-**/
-VOID
-EFIAPI
-NetbufQueAppend (
-  IN NET_BUF_QUEUE          *NbufQue,
-  IN NET_BUF                *Nbuf
-  );
-
-/**
-  Copy some data from the buffer queue to the destination.
-
-  @param  NbufQue               Pointer to the net buffer queue.
-  @param  Offset                The sequence number of the first byte to copy.
-  @param  Len                   Length of the data to copy.
-  @param  Dest                  The destination of the data to copy to.
-
-  @retval UINTN                 The length of the copied data.
-
-**/
-UINT32
-EFIAPI
-NetbufQueCopy (
-  IN NET_BUF_QUEUE          *NbufQue,
-  IN UINT32                 Offset,
-  IN UINT32                 Len,
-  IN UINT8                  *Dest
-  );
-
-/**
-  Trim some data from the queue header, release the buffer if
-  whole buffer is trimmed.
-
-  @param  NbufQue               Pointer to the net buffer queue.
-  @param  Len                   Length of the data to trim.
-
-  @retval UINTN                 The length of the data trimmed.
-
-**/
-UINT32
-EFIAPI
-NetbufQueTrim (
-  IN NET_BUF_QUEUE          *NbufQue,
-  IN UINT32                 Len
-  );
-
-
-/**
-  Flush the net buffer queue.
-
-  @param  NbufQue               Pointer to the queue to be flushed.
-
-  @return None.
-
-**/
-VOID
-EFIAPI
-NetbufQueFlush (
-  IN NET_BUF_QUEUE          *NbufQue
-  );
-
-/**
-  Compute checksum for a bulk of data.
-
-  @param  Bulk                  Pointer to the data.
-  @param  Len                   Length of the data, in bytes.
-
-  @retval UINT16                The computed checksum.
-
-**/
-UINT16
-EFIAPI
-NetblockChecksum (
-  IN UINT8                  *Bulk,
-  IN UINT32                 Len
-  );
-
-/**
-  Add two checksums.
-
-  @param  Checksum1             The first checksum to be added.
-  @param  Checksum2             The second checksum to be added.
-
-  @retval UINT16                The new checksum.
-
-**/
-UINT16
-EFIAPI
-NetAddChecksum (
-  IN UINT16                 Checksum1,
-  IN UINT16                 Checksum2
-  );
-
-/**
-  Compute the checksum for a NET_BUF.
-
-  @param  Nbuf                  Pointer to the net buffer.
-
-  @retval UINT16                The computed checksum.
-
-**/
-UINT16
-EFIAPI
-NetbufChecksum (
-  IN NET_BUF                *Nbuf
-  );
-
-/**
-  Compute the checksum for TCP/UDP pseudo header.
-  Src, Dst are in network byte order. and Len is
-  in host byte order.
-
-  @param  Src                   The source address of the packet.
-  @param  Dst                   The destination address of the packet.
-  @param  Proto                 The protocol type of the packet.
-  @param  Len                   The length of the packet.
-
-  @retval UINT16                The computed checksum.
-
-**/
-UINT16
-EFIAPI
-NetPseudoHeadChecksum (
-  IN IP4_ADDR               Src,
-  IN IP4_ADDR               Dst,
-  IN UINT8                  Proto,
-  IN UINT16                 Len
-  );
-
-#endif
+/** @file\r
+  This library provides basic function for UEFI network stack.\r
+\r
+Copyright (c) 2005 - 2008, Intel Corporation\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef _NET_LIB_H_\r
+#define _NET_LIB_H_\r
+\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/MemoryAllocationLib.h>\r
+#include <Protocol/DriverBinding.h>\r
+#include <Protocol/ComponentName.h>\r
+#include <Protocol/DriverConfiguration.h>\r
+#include <Protocol/DriverDiagnostics.h>\r
+#include <Protocol/Dpc.h>\r
+\r
+typedef UINT32          IP4_ADDR;\r
+typedef UINT32          TCP_SEQNO;\r
+typedef UINT16          TCP_PORTNO;\r
+\r
+typedef enum {\r
+  NET_ETHER_ADDR_LEN    = 6,\r
+  NET_IFTYPE_ETHERNET   = 0x01,\r
+\r
+  EFI_IP_PROTO_UDP      = 0x11,\r
+  EFI_IP_PROTO_TCP      = 0x06,\r
+  EFI_IP_PROTO_ICMP     = 0x01,\r
+\r
+  //\r
+  // The address classfication\r
+  //\r
+  IP4_ADDR_CLASSA       = 1,\r
+  IP4_ADDR_CLASSB,\r
+  IP4_ADDR_CLASSC,\r
+  IP4_ADDR_CLASSD,\r
+  IP4_ADDR_CLASSE,\r
+\r
+  IP4_MASK_NUM          = 33\r
+} IP4_CLASS_TYPE;\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
+//\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. ICMP message is categoried 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
+\r
+//\r
+// UDP header definition\r
+//\r
+typedef struct {\r
+  UINT16                SrcPort;\r
+  UINT16                DstPort;\r
+  UINT16                Length;\r
+  UINT16                Checksum;\r
+} EFI_UDP4_HEADER;\r
+\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) (UINT32)((((UINT32) (x) & 0xff)     << 24) | \\r
+                          (((UINT32) (x) & 0xff00)   << 8)  | \\r
+                          (((UINT32) (x) & 0xff0000) >> 8)  | \\r
+                          (((UINT32) (x) & 0xff000000) >> 24))\r
+\r
+#define HTONL(x)  NTOHL(x)\r
+\r
+#define NTOHS(x)  (UINT16)((((UINT16) (x) & 0xff) << 8) | \\r
+                           (((UINT16) (x) & 0xff00) >> 8))\r
+\r
+#define HTONS(x)  NTOHS(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_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_NUM)\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
+/**\r
+  Return the length of the mask. If the mask is invalid,\r
+  return the invalid length 33, which is IP4_MASK_NUM.\r
+  NetMask is in the host byte order.\r
+\r
+  @param  NetMask               The netmask to get the length from\r
+\r
+  @return The length of the netmask, IP4_MASK_NUM if the mask isn't\r
+  @return supported.\r
+\r
+**/\r
+INTN\r
+EFIAPI\r
+NetGetMaskLength (\r
+  IN IP4_ADDR               Mask\r
+  );\r
+\r
+/**\r
+  Return the class of the address, such as class a, b, c.\r
+  Addr is in host byte order.\r
+\r
+  @param  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. If NetMask is zero, use the IP address's class to\r
+  get the default mask.\r
+\r
+  @param  Ip                    The IP to check againist\r
+  @param  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
+Ip4IsUnicast (\r
+  IN IP4_ADDR               Ip,\r
+  IN IP4_ADDR               NetMask\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_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, then convert it to host\r
+  byte order. Use this function to avoid alignment error.\r
+\r
+  @param  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
+  Put a UINT32 to the byte stream. Convert it from host byte order\r
+  to network byte order before putting.\r
+\r
+  @param  Buf                   The buffer to put the UINT32\r
+  @param  Data                  The data to put\r
+\r
+  @return None\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+NetPutUint32 (\r
+  IN UINT8                  *Buf,\r
+  IN UINT32                 Data\r
+  );\r
+\r
+/**\r
+  Initialize a random seed using current time.\r
+\r
+  None\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
+          _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 doule 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 doule 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 get the frist/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 entry on the list\r
+\r
+  @param  Head                  The list header\r
+\r
+  @return The entry that is removed from the list, NULL if the list is empty.\r
+\r
+**/\r
+LIST_ENTRY *\r
+EFIAPI\r
+NetListRemoveHead (\r
+  LIST_ENTRY            *Head\r
+  );\r
+\r
+/**\r
+  Remove the last entry on the list\r
+\r
+  @param  Head                  The list head\r
+\r
+  @return The entry that is removed from the list, NULL if the list is empty.\r
+\r
+**/\r
+LIST_ENTRY *\r
+EFIAPI\r
+NetListRemoveTail (\r
+  LIST_ENTRY            *Head\r
+  );\r
+\r
+/**\r
+  Insert the NewEntry after the PrevEntry.\r
+\r
+  @param  PrevEntry             The previous entry to insert after\r
+  @param  NewEntry              The new entry to insert\r
+\r
+  @return None\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+NetListInsertAfter (\r
+  IN LIST_ENTRY         *PrevEntry,\r
+  IN LIST_ENTRY         *NewEntry\r
+  );\r
+\r
+/**\r
+  Insert the NewEntry before the PostEntry.\r
+\r
+  @param  PostEntry             The entry to insert before\r
+  @param  NewEntry              The new entry to insert\r
+\r
+  @return None\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+NetListInsertBefore (\r
+  IN LIST_ENTRY         *PostEntry,\r
+  IN LIST_ENTRY         *NewEntry\r
+  );\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
+  @param  Map                   The netmap to initialize\r
+\r
+  @return None\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+NetMapInit (\r
+  IN NET_MAP                *Map\r
+  );\r
+\r
+/**\r
+  To clean up the netmap, that is, release allocated memories.\r
+\r
+  @param  Map                   The netmap to clean up.\r
+\r
+  @return None\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+NetMapClean (\r
+  IN NET_MAP                *Map\r
+  );\r
+\r
+/**\r
+  Test whether the netmap is empty\r
+\r
+  @param  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
+  @param  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
+  @param  Map                   The netmap to insert into\r
+  @param  Key                   The user's key\r
+  @param  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 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
+  @param  Map                   The netmap to insert into\r
+  @param  Key                   The user's key\r
+  @param  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 NET_MAP                *Map,\r
+  IN VOID                   *Key,\r
+  IN VOID                   *Value    OPTIONAL\r
+  );\r
+\r
+/**\r
+  Find the key in the netmap\r
+\r
+  @param  Map                   The netmap to search within\r
+  @param  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 item from the netmap\r
+\r
+  @param  Map                   The netmap to remove the item from\r
+  @param  Item                  The item to remove\r
+  @param  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  NET_MAP               *Map,\r
+  IN  NET_MAP_ITEM          *Item,\r
+  OUT VOID                  **Value   OPTIONAL\r
+  );\r
+\r
+/**\r
+  Remove the first entry on the netmap.\r
+\r
+  @param  Map                   The netmap to remove the head from\r
+  @param  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  NET_MAP               *Map,\r
+  OUT VOID                  **Value   OPTIONAL\r
+  );\r
+\r
+/**\r
+  Remove the last entry on the netmap.\r
+\r
+  @param  Map                   The netmap to remove the tail from\r
+  @param  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  NET_MAP               *Map,\r
+  OUT VOID                  **Value OPTIONAL\r
+  );\r
+\r
+typedef\r
+EFI_STATUS\r
+(*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. It will\r
+  contiue the traverse if CallBack returns EFI_SUCCESS, otherwise, break\r
+  from the loop. It returns the CallBack's last return value. This\r
+  function is delete safe for the current item.\r
+\r
+  @param  Map                   The Map to iterate through\r
+  @param  CallBack              The callback function to call for each item.\r
+  @param  Arg                   The opaque parameter to the callback\r
+\r
+  @return 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
+  @param  ControllerHandle      The controller which has the service installed.\r
+  @param  ImageHandle           The image handle used to open service.\r
+  @param  ServiceBindingGuid    The service's Guid.\r
+  @param  ChildHandle           The handle to receive the create child\r
+\r
+  @retval EFI_SUCCESS           The child is successfully created.\r
+  @retval Others                Failed to create the child.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+NetLibCreateServiceChild (\r
+  IN  EFI_HANDLE            ControllerHandle,\r
+  IN  EFI_HANDLE            ImageHandle,\r
+  IN  EFI_GUID              *ServiceBindingGuid,\r
+  OUT EFI_HANDLE            *ChildHandle\r
+  );\r
+\r
+/**\r
+  Destory a child of the service that is identified by ServiceBindingGuid.\r
+\r
+  @param  ControllerHandle      The controller which has the service installed.\r
+  @param  ImageHandle           The image handle used to open service.\r
+  @param  ServiceBindingGuid    The service's Guid.\r
+  @param  ChildHandle           The child to destory\r
+\r
+  @retval EFI_SUCCESS           The child is successfully destoried.\r
+  @retval Others                Failed to destory the child.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+NetLibDestroyServiceChild (\r
+  IN  EFI_HANDLE            ControllerHandle,\r
+  IN  EFI_HANDLE            ImageHandle,\r
+  IN  EFI_GUID              *ServiceBindingGuid,\r
+  IN  EFI_HANDLE            ChildHandle\r
+  );\r
+\r
+/**\r
+  Convert the mac address of the simple network protocol installed on\r
+  SnpHandle to a unicode string. Callers are responsible for freeing the\r
+  string storage.\r
+\r
+  @param  SnpHandle             The handle where the simple network protocol is\r
+                                installed on.\r
+  @param  ImageHandle           The image handle used to act as the agent handle to\r
+                                get the simple network protocol.\r
+  @param  MacString             The pointer to store the address of the string\r
+                                representation of  the mac address.\r
+\r
+  @retval EFI_OUT_OF_RESOURCES  There are not enough memory resource.\r
+  @retval other                 Failed to open the simple network protocol.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+NetLibGetMacString (\r
+  IN           EFI_HANDLE  SnpHandle,\r
+  IN           EFI_HANDLE  ImageHandle,\r
+  IN OUT       CHAR16      **MacString\r
+  );\r
+\r
+/**\r
+  Create an IPv4 device path node.\r
+\r
+  @param  Node                  Pointer to the IPv4 device path node.\r
+  @param  Controller            The handle where the NIC IP4 config protocol resides.\r
+  @param  LocalIp               The local IPv4 address.\r
+  @param  LocalPort             The local port.\r
+  @param  RemoteIp              The remote IPv4 address.\r
+  @param  RemotePort            The remote port.\r
+  @param  Protocol              The protocol type in the IP header.\r
+  @param  UseDefaultAddress     Whether this instance is using default address or not.\r
+\r
+  @retval None\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
+  Find the UNDI/SNP handle from controller and protocol GUID.\r
+  For example, IP will open a 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 which is related the IP's\r
+  service binding instance that is install on UNDI/SNP handle.\r
+  Now, the controller is either a MNP or ARP child handle. But\r
+  IP opens these handle BY_DRIVER, use that info, we can get the\r
+  UNDI/SNP handle.\r
+\r
+  @param  Controller            Then protocol handle to check\r
+  @param  ProtocolGuid          The protocol that is related with the handle.\r
+\r
+  @return The UNDI/SNP handle or NULL.\r
+\r
+**/\r
+EFI_HANDLE\r
+EFIAPI\r
+NetLibGetNicHandle (\r
+  IN EFI_HANDLE             Controller,\r
+  IN EFI_GUID               *ProtocolGuid\r
+  );\r
+\r
+/**\r
+  Add a Deferred Procedure Call to the end of the DPC queue.\r
+\r
+  @param DpcTpl           The EFI_TPL that the DPC should be invoked.\r
+  @param DpcProcedure     Pointer to the DPC's function.\r
+  @param DpcContext       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
+                                    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
+NetLibQueueDpc (\r
+  IN EFI_TPL            DpcTpl,\r
+  IN EFI_DPC_PROCEDURE  DpcProcedure,\r
+  IN VOID               *DpcContext    OPTIONAL\r
+  );\r
+\r
+/**\r
+  Add a Deferred Procedure Call to the end of the DPC queue.\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
+NetLibDispatchDpc (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  This is the default unload handle for all the network drivers.\r
+\r
+  @param  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
+typedef enum {\r
+  //\r
+  //Various signatures\r
+  //\r
+  NET_BUF_SIGNATURE    = EFI_SIGNATURE_32 ('n', 'b', 'u', 'f'),\r
+  NET_VECTOR_SIGNATURE = EFI_SIGNATURE_32 ('n', 'v', 'e', 'c'),\r
+  NET_QUE_SIGNATURE    = EFI_SIGNATURE_32 ('n', 'b', 'q', 'u'),\r
+\r
+\r
+  NET_PROTO_DATA       = 64,   // Opaque buffer for protocols\r
+  NET_BUF_HEAD         = 1,    // Trim or allocate space from head\r
+  NET_BUF_TAIL         = 0,    // Trim or allocate space from tail\r
+  NET_VECTOR_OWN_FIRST = 0x01  // We allocated the 1st block in the vector\r
+} NET_SIGNATURE_TYPE;\r
+\r
+#define NET_CHECK_SIGNATURE(PData, SIGNATURE) \\r
+  ASSERT (((PData) != NULL) && ((PData)->Signature == (SIGNATURE)))\r
+\r
+#define NET_SWAP_SHORT(Value) \\r
+  ((((Value) & 0xff) << 8) | (((Value) >> 8) & 0xff))\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 (*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;    // opeque argument to Free\r
+  UINT32              Flag;    // Flags, NET_VECTOR_OWN_FIRST\r
+  UINT32              Len;     // Total length of the assocated BLOCKs\r
+\r
+  UINT32              BlockNum;\r
+  NET_BLOCK           Block[1];\r
+} NET_VECTOR;\r
+\r
+//\r
+//NET_BLOCK_OP operate on the NET_BLOCK, It specifies\r
+//where the actual fragment begins and where it 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
+\r
+//\r
+//NET_BUF is the buffer manage structure used by the\r
+//network stack. Every network packet may be fragmented,\r
+//and contains multiple fragments. The Vector points to\r
+//memory blocks used by the each fragment, and BlockOp\r
+//specifies where each fragment begins and ends.\r
+//\r
+//It also contains a opaque area for protocol to store\r
+//per-packet informations. Protocol must be caution 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
+  IP4_HEAD            *Ip;        // Network layer header, for fast access\r
+  TCP_HEAD            *Tcp;       // Transport layer header, for fast access\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
+//\r
+//A queue of NET_BUFs, It is just 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
+#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) _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 - (BlockOp)->BlockHead)\r
+\r
+#define NET_TAILSPACE(BlockOp)  \\r
+  (UINTN)((BlockOp)->BlockTail - (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  Len                   The length of the block.\r
+\r
+  @retval *                     Pointer to the allocated NET_BUF. If NULL  the\r
+                                allocation failed due to resource limit.\r
+\r
+**/\r
+NET_BUF  *\r
+EFIAPI\r
+NetbufAlloc (\r
+  IN UINT32                 Len\r
+  );\r
+\r
+/**\r
+  Free the buffer and its associated NET_VECTOR.\r
+\r
+  @param  Nbuf                  Pointer to the NET_BUF to be freed.\r
+\r
+  @return None.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+NetbufFree (\r
+  IN NET_BUF                *Nbuf\r
+  );\r
+\r
+/**\r
+  Get the position of some byte in the net buffer. This can be used\r
+  to, for example, retrieve the IP header in the packet. It also\r
+  returns the fragment that contains the byte which is used mainly by\r
+  the buffer implementation itself.\r
+\r
+  @param  Nbuf                  Pointer to the net buffer.\r
+  @param  Offset                The index or offset of the byte\r
+  @param  Index                 Index of the fragment that contains the block\r
+\r
+  @retval *                     Pointer to the nth byte of data in the net buffer.\r
+                                If NULL, 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 NET_BUF that share the associated NET_DATA.\r
+\r
+  @param  Nbuf                  Pointer to the net buffer to be cloned.\r
+\r
+  @retval *                     Pointer to the cloned net buffer.\r
+\r
+**/\r
+NET_BUF  *\r
+EFIAPI\r
+NetbufClone (\r
+  IN NET_BUF                *Nbuf\r
+  );\r
+\r
+/**\r
+  Create a duplicated copy of Nbuf, data is copied. Also leave some\r
+  head space before the data.\r
+\r
+  @param  Nbuf                  Pointer to the net buffer to be cloned.\r
+  @param  Duplicate             Pointer to the net buffer to duplicate to, if NULL\r
+                                a new net  buffer is allocated.\r
+  @param  HeadSpace             Length of the head space to reserve\r
+\r
+  @retval *                     Pointer to the duplicated net buffer.\r
+\r
+**/\r
+NET_BUF  *\r
+EFIAPI\r
+NetbufDuplicate (\r
+  IN NET_BUF                *Nbuf,\r
+  IN NET_BUF                *Duplicate    OPTIONAL,\r
+  IN UINT32                 HeadSpace\r
+  );\r
+\r
+/**\r
+  Create a NET_BUF structure which contains Len byte data of\r
+  Nbuf starting from Offset. A new NET_BUF structure will be\r
+  created but the associated data in NET_VECTOR is shared.\r
+  This function exists to do IP packet fragmentation.\r
+\r
+  @param  Nbuf                  Pointer to the net buffer to be cloned.\r
+  @param  Offset                Starting point of the data to be included in new\r
+                                buffer.\r
+  @param  Len                   How many data to include in new data\r
+  @param  HeadSpace             How many bytes of head space to reserve for\r
+                                protocol header\r
+\r
+  @retval *                     Pointer to the cloned net buffer.\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 buffer.\r
+  Upon allocation, all the space are in the tail room\r
+  of the buffer. Call this function to move some space\r
+  to the header room. This function is quite limited in\r
+  that it can only reserver space from the first block\r
+  of an empty NET_BUF not built from the external. But\r
+  it should be enough for the network stack.\r
+\r
+  @param  Nbuf                  Pointer to the net buffer.\r
+  @param  Len                   The length of buffer to be reserverd.\r
+\r
+  @return None.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+NetbufReserve (\r
+  IN NET_BUF                *Nbuf,\r
+  IN UINT32                 Len\r
+  );\r
+\r
+/**\r
+  Allocate some space from the header or tail of the buffer.\r
+\r
+  @param  Nbuf                  Pointer to the net buffer.\r
+  @param  Len                   The length of the buffer to be allocated.\r
+  @param  FromHead              The flag to indicate whether reserve the data from\r
+                                head or tail. TRUE for from head, and FALSE for\r
+                                from tail.\r
+\r
+  @retval *                     Pointer to the first byte of the allocated buffer.\r
+\r
+**/\r
+UINT8  *\r
+EFIAPI\r
+NetbufAllocSpace (\r
+  IN NET_BUF                *Nbuf,\r
+  IN UINT32                 Len,\r
+  IN BOOLEAN                FromHead\r
+  );\r
+\r
+/**\r
+  Trim some data from the header or tail of the buffer.\r
+\r
+  @param  Nbuf                  Pointer to the net buffer.\r
+  @param  Len                   The length of the data to be trimmed.\r
+  @param  FromHead              The flag to indicate whether trim data from head or\r
+                                tail. TRUE for from head, and FALSE for from tail.\r
+\r
+  @retval UINTN                 Length of the actually trimmed data.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+NetbufTrim (\r
+  IN NET_BUF                *Nbuf,\r
+  IN UINT32                 Len,\r
+  IN BOOLEAN                FromHead\r
+  );\r
+\r
+/**\r
+  Copy the data from the specific offset to the destination.\r
+\r
+  @param  Nbuf                  Pointer to the net buffer.\r
+  @param  Offset                The sequence number of the first byte to copy.\r
+  @param  Len                   Length of the data to copy.\r
+  @param  Dest                  The destination of the data to copy to.\r
+\r
+  @retval UINTN                 The length of the copied data.\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
+  @param  ExtFragment           Pointer to the data block.\r
+  @param  ExtNum                The number of the data block.\r
+  @param  HeadSpace             The head space to be reserved.\r
+  @param  HeadLen               The length of the protocol header, This function\r
+                                will pull that number of data into a linear block.\r
+  @param  ExtFree               Pointer to the caller provided free function.\r
+  @param  Arg                   The argument passed to ExtFree when ExtFree is\r
+                                called.\r
+\r
+  @retval *                     Pointer to the net buffer built from the data\r
+                                blocks.\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\r
+  buffer. This is the opposite of the NetbufFromExt.\r
+\r
+  @param  Nbuf                  Point to the net buffer\r
+  @param  ExtFragment           Pointer to the data block.\r
+  @param  ExtNum                The number of the data block.\r
+\r
+  @retval EFI_BUFFER_TOO_SMALL  The number of non-empty block is bigger than ExtNum\r
+  @retval EFI_SUCCESS           Fragment table built.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+NetbufBuildExt (\r
+  IN NET_BUF                *Nbuf,\r
+  IN NET_FRAGMENT           *ExtFragment,\r
+  IN UINT32                 *ExtNum\r
+  );\r
+\r
+/**\r
+  Build a NET_BUF from a list of NET_BUF.\r
+\r
+  @param  BufList               A List of NET_BUF.\r
+  @param  HeadSpace             The head space to be reserved.\r
+  @param  HeaderLen             The length of the protocol header, This function\r
+                                will pull that number of data into a linear block.\r
+  @param  ExtFree               Pointer to the caller provided free function.\r
+  @param  Arg                   The argument passed to ExtFree when ExtFree is\r
+                                called.\r
+\r
+  @retval *                     Pointer to the net buffer built from the data\r
+                                blocks.\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  Head                  Pointer to the head of linked net buffers.\r
+\r
+  @return None.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+NetbufFreeList (\r
+  IN LIST_ENTRY             *Head\r
+  );\r
+\r
+/**\r
+  Initiate the net buffer queue.\r
+\r
+  @param  NbufQue               Pointer to the net buffer queue to be initiated.\r
+\r
+  @return None.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+NetbufQueInit (\r
+  IN NET_BUF_QUEUE          *NbufQue\r
+  );\r
+\r
+/**\r
+  Allocate an initialized net buffer queue.\r
+\r
+  None.\r
+\r
+  @retval *                     Pointer to the allocated net buffer queue.\r
+\r
+**/\r
+NET_BUF_QUEUE  *\r
+EFIAPI\r
+NetbufQueAlloc (\r
+  VOID\r
+  );\r
+\r
+/**\r
+  Free a net buffer queue.\r
+\r
+  @param  NbufQue               Poitner to the net buffer queue to be freed.\r
+\r
+  @return None.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+NetbufQueFree (\r
+  IN NET_BUF_QUEUE          *NbufQue\r
+  );\r
+\r
+/**\r
+  Remove a net buffer from head in the specific queue.\r
+\r
+  @param  NbufQue               Pointer to the net buffer queue.\r
+\r
+  @retval *                     Pointer to the net buffer removed from the specific\r
+                                queue.\r
+\r
+**/\r
+NET_BUF  *\r
+EFIAPI\r
+NetbufQueRemove (\r
+  IN NET_BUF_QUEUE          *NbufQue\r
+  );\r
+\r
+/**\r
+  Append a buffer to the end of the queue.\r
+\r
+  @param  NbufQue               Pointer to the net buffer queue.\r
+  @param  Nbuf                  Pointer to the net buffer to be appended.\r
+\r
+  @return None.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+NetbufQueAppend (\r
+  IN NET_BUF_QUEUE          *NbufQue,\r
+  IN NET_BUF                *Nbuf\r
+  );\r
+\r
+/**\r
+  Copy some data from the buffer queue to the destination.\r
+\r
+  @param  NbufQue               Pointer to the net buffer queue.\r
+  @param  Offset                The sequence number of the first byte to copy.\r
+  @param  Len                   Length of the data to copy.\r
+  @param  Dest                  The destination of the data to copy to.\r
+\r
+  @retval UINTN                 The length of the copied data.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+NetbufQueCopy (\r
+  IN NET_BUF_QUEUE          *NbufQue,\r
+  IN UINT32                 Offset,\r
+  IN UINT32                 Len,\r
+  IN UINT8                  *Dest\r
+  );\r
+\r
+/**\r
+  Trim some data from the queue header, release the buffer if\r
+  whole buffer is trimmed.\r
+\r
+  @param  NbufQue               Pointer to the net buffer queue.\r
+  @param  Len                   Length of the data to trim.\r
+\r
+  @retval UINTN                 The length of the data trimmed.\r
+\r
+**/\r
+UINT32\r
+EFIAPI\r
+NetbufQueTrim (\r
+  IN NET_BUF_QUEUE          *NbufQue,\r
+  IN UINT32                 Len\r
+  );\r
+\r
+\r
+/**\r
+  Flush the net buffer queue.\r
+\r
+  @param  NbufQue               Pointer to the queue to be flushed.\r
+\r
+  @return None.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+NetbufQueFlush (\r
+  IN NET_BUF_QUEUE          *NbufQue\r
+  );\r
+\r
+/**\r
+  Compute checksum for a bulk of data.\r
+\r
+  @param  Bulk                  Pointer to the data.\r
+  @param  Len                   Length of the data, in bytes.\r
+\r
+  @retval UINT16                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  Checksum1             The first checksum to be added.\r
+  @param  Checksum2             The second checksum to be added.\r
+\r
+  @retval UINT16                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  Nbuf                  Pointer to the net buffer.\r
+\r
+  @retval UINT16                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
+  Src, Dst are in network byte order. and Len is\r
+  in host byte order.\r
+\r
+  @param  Src                   The source address of the packet.\r
+  @param  Dst                   The destination address of the packet.\r
+  @param  Proto                 The protocol type of the packet.\r
+  @param  Len                   The length of the packet.\r
+\r
+  @retval UINT16                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
+#endif\r
index 21111728071f59b410e5c523cbaa55f6f8e80740..e5006c40fc8e1868a317ee461d19987b91875408 100644 (file)
-/** @file
-  The helper routines to access UDP service. It is used by both
-  DHCP and MTFTP.
-
-Copyright (c) 2006 - 2008, Intel Corporation
-All rights reserved. This program and the accompanying materials
-are licensed and made available under the terms and conditions of the BSD License
-which accompanies this distribution.  The full text of the license may be found at
-http://opensource.org/licenses/bsd-license.php
-
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#ifndef _UDP4IO_H_
-#define _UDP4IO_H_
-
-#include <Protocol/Udp4.h>
-
-#include <Library/UdpIoLib.h>
-#include <Library/NetLib.h>
-
-typedef struct _UDP_IO_PORT UDP_IO_PORT;
-
-typedef enum {
-  UDP_IO_RX_SIGNATURE = EFI_SIGNATURE_32 ('U', 'D', 'P', 'R'),
-  UDP_IO_TX_SIGNATURE = EFI_SIGNATURE_32 ('U', 'D', 'P', 'T'),
-  UDP_IO_SIGNATURE    = EFI_SIGNATURE_32 ('U', 'D', 'P', 'I')
-} UDP_IO_SIGNATURE_TYPE;
-
-typedef struct {
-  IP4_ADDR                  LocalAddr;
-  UINT16                    LocalPort;
-  IP4_ADDR                  RemoteAddr;
-  UINT16                    RemotePort;
-} UDP_POINTS;
-
-//
-// This prototype is used by both receive and transmission.
-// When receiving Netbuf is allocated by UDP access point, and
-// released by user. When transmitting, the NetBuf is from user,
-// and provided to the callback as a reference.
-//
-typedef
-VOID
-(*UDP_IO_CALLBACK) (
-  IN NET_BUF                *Packet,
-  IN UDP_POINTS             *Points,
-  IN EFI_STATUS             IoStatus,
-  IN VOID                   *Context
-  );
-
-//
-// Each receive request is wrapped in an UDP_RX_TOKEN. Upon completion,
-// the CallBack will be called. Only one receive request is send to UDP.
-// HeadLen gives the length of the application's header. UDP_IO will
-// make the application's header continous before delivery up.
-//
-typedef struct {
-  UINT32                    Signature;
-  UDP_IO_PORT               *UdpIo;
-
-  UDP_IO_CALLBACK           CallBack;
-  VOID                      *Context;
-
-  UINT32                    HeadLen;
-  EFI_UDP4_COMPLETION_TOKEN UdpToken;
-} UDP_RX_TOKEN;
-
-//
-// Each transmit request is wrapped in an UDP_TX_TOKEN. Upon completion,
-// the CallBack will be called. There can be several transmit requests.
-//
-typedef struct {
-  UINT32                    Signature;
-  LIST_ENTRY                Link;
-  UDP_IO_PORT               *UdpIo;
-
-  UDP_IO_CALLBACK           CallBack;
-  NET_BUF                   *Packet;
-  VOID                      *Context;
-
-  EFI_UDP4_SESSION_DATA     UdpSession;
-  EFI_IPv4_ADDRESS          Gateway;
-
-  EFI_UDP4_COMPLETION_TOKEN UdpToken;
-  EFI_UDP4_TRANSMIT_DATA    UdpTxData;
-} UDP_TX_TOKEN;
-
-struct _UDP_IO_PORT {
-  UINT32                    Signature;
-  LIST_ENTRY                Link;
-  INTN                      RefCnt;
-
-  //
-  // Handle used to create/destory UDP child
-  //
-  EFI_HANDLE                Controller;
-  EFI_HANDLE                Image;
-  EFI_HANDLE                UdpHandle;
-
-  EFI_UDP4_PROTOCOL         *Udp;
-  EFI_UDP4_CONFIG_DATA      UdpConfig;
-  EFI_SIMPLE_NETWORK_MODE   SnpMode;
-
-  LIST_ENTRY                SentDatagram;
-  UDP_RX_TOKEN              *RecvRequest;
-};
-
-typedef
-EFI_STATUS
-(*UDP_IO_CONFIG) (
-  IN UDP_IO_PORT            *UdpIo,
-  IN VOID                   *Context
-  );
-
-typedef
-BOOLEAN
-(*UDP_IO_TO_CANCEL) (
-  IN UDP_TX_TOKEN           *Token,
-  IN VOID                   *Context
-  );
-
-/**
-  Create a UDP IO port to access the UDP service. It will
-  create and configure a UDP child.
-
-  @param  Controller            The controller that has the UDP service binding
-                                protocol installed.
-  @param  ImageHandle           The image handle for the driver.
-  @param  Configure             The function to configure the created UDP child
-  @param  Context               The opaque parameter for the Configure funtion.
-
-  @return A point to just created UDP IO port or NULL if failed.
-
-**/
-UDP_IO_PORT *
-EFIAPI
-UdpIoCreatePort (
-  IN  EFI_HANDLE            Controller,
-  IN  EFI_HANDLE            ImageHandle,
-  IN  UDP_IO_CONFIG         Configure,
-  IN  VOID                  *Context
-  );
-
-/**
-  Free the UDP IO port and all its related resources including
-  all the transmitted packet.
-
-  @param  UdpIo                 The UDP IO port to free.
-
-  @retval EFI_SUCCESS           The UDP IO port is freed.
-
-**/
-EFI_STATUS
-EFIAPI
-UdpIoFreePort (
-  IN  UDP_IO_PORT           *UdpIo
-  );
-
-/**
-  Clean up the UDP IO port. It will release all the transmitted
-  datagrams and receive request. It will also configure NULL the
-  UDP child.
-
-  @param  UdpIo                 UDP IO port to clean up.
-
-  @return None
-
-**/
-VOID
-EFIAPI
-UdpIoCleanPort (
-  IN  UDP_IO_PORT           *UdpIo
-  );
-
-/**
-  Send a packet through the UDP IO port.
-
-  @param  UdpIo                 The UDP IO Port to send the packet through
-  @param  Packet                The packet to send
-  @param  EndPoint              The local and remote access point
-  @param  Gateway               The gateway to use
-  @param  CallBack              The call back function to call when packet is
-                                transmitted or failed.
-  @param  Context               The opque parameter to the CallBack
-
-  @retval EFI_OUT_OF_RESOURCES  Failed to allocate resource for the packet
-  @retval EFI_SUCCESS           The packet is successfully delivered to UDP  for
-                                transmission.
-
-**/
-EFI_STATUS
-EFIAPI
-UdpIoSendDatagram (
-  IN  UDP_IO_PORT           *UdpIo,
-  IN  NET_BUF               *Packet,
-  IN  UDP_POINTS            *EndPoint, OPTIONAL
-  IN  IP4_ADDR              Gateway,
-  IN  UDP_IO_CALLBACK       CallBack,
-  IN  VOID                  *Context
-  );
-
-/**
-  Cancel a single sent datagram.
-
-  @param  UdpIo                 The UDP IO port to cancel the packet from
-  @param  Packet                The packet to cancel
-
-  @return None
-
-**/
-VOID
-EFIAPI
-UdpIoCancelSentDatagram (
-  IN  UDP_IO_PORT           *UdpIo,
-  IN  NET_BUF               *Packet
-  );
-
-/**
-  Issue a receive request to the UDP IO port.
-
-  @param  UdpIo                 The UDP IO port to recieve the packet from.
-  @param  CallBack              The call back function to execute when receive
-                                finished.
-  @param  Context               The opque context to the call back
-  @param  HeadLen               The lenght of the application's header
-
-  @retval EFI_ALREADY_STARTED   There is already a pending receive request. Only
-                                one receive request is supported.
-  @retval EFI_OUT_OF_RESOURCES  Failed to allocate some resource.
-  @retval EFI_SUCCESS           The receive request is issued successfully.
-
-**/
-EFI_STATUS
-EFIAPI
-UdpIoRecvDatagram (
-  IN  UDP_IO_PORT           *UdpIo,
-  IN  UDP_IO_CALLBACK       CallBack,
-  IN  VOID                  *Context,
-  IN  UINT32                HeadLen
-  );
-#endif
+/** @file\r
+  The helper routines to access UDP service. It is used by both\r
+  DHCP and MTFTP.\r
+\r
+Copyright (c) 2006 - 2008, Intel Corporation\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef _UDP4IO_H_\r
+#define _UDP4IO_H_\r
+\r
+#include <Protocol/Udp4.h>\r
+\r
+#include <Library/UdpIoLib.h>\r
+#include <Library/NetLib.h>\r
+\r
+typedef struct _UDP_IO_PORT UDP_IO_PORT;\r
+\r
+typedef enum {\r
+  UDP_IO_RX_SIGNATURE = EFI_SIGNATURE_32 ('U', 'D', 'P', 'R'),\r
+  UDP_IO_TX_SIGNATURE = EFI_SIGNATURE_32 ('U', 'D', 'P', 'T'),\r
+  UDP_IO_SIGNATURE    = EFI_SIGNATURE_32 ('U', 'D', 'P', 'I')\r
+} UDP_IO_SIGNATURE_TYPE;\r
+\r
+typedef struct {\r
+  IP4_ADDR                  LocalAddr;\r
+  UINT16                    LocalPort;\r
+  IP4_ADDR                  RemoteAddr;\r
+  UINT16                    RemotePort;\r
+} UDP_POINTS;\r
+\r
+//\r
+// This prototype is used by both receive and transmission.\r
+// When receiving Netbuf is allocated by UDP access point, and\r
+// released by user. When transmitting, the NetBuf is from user,\r
+// and provided to the callback as a reference.\r
+//\r
+typedef\r
+VOID\r
+(*UDP_IO_CALLBACK) (\r
+  IN NET_BUF                *Packet,\r
+  IN UDP_POINTS             *Points,\r
+  IN EFI_STATUS             IoStatus,\r
+  IN VOID                   *Context\r
+  );\r
+\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 send to UDP.\r
+// HeadLen gives the length of the application's header. UDP_IO will\r
+// make the application's header continous before delivery up.\r
+//\r
+typedef struct {\r
+  UINT32                    Signature;\r
+  UDP_IO_PORT               *UdpIo;\r
+\r
+  UDP_IO_CALLBACK           CallBack;\r
+  VOID                      *Context;\r
+\r
+  UINT32                    HeadLen;\r
+  EFI_UDP4_COMPLETION_TOKEN UdpToken;\r
+} UDP_RX_TOKEN;\r
+\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.\r
+//\r
+typedef struct {\r
+  UINT32                    Signature;\r
+  LIST_ENTRY                Link;\r
+  UDP_IO_PORT               *UdpIo;\r
+\r
+  UDP_IO_CALLBACK           CallBack;\r
+  NET_BUF                   *Packet;\r
+  VOID                      *Context;\r
+\r
+  EFI_UDP4_SESSION_DATA     UdpSession;\r
+  EFI_IPv4_ADDRESS          Gateway;\r
+\r
+  EFI_UDP4_COMPLETION_TOKEN UdpToken;\r
+  EFI_UDP4_TRANSMIT_DATA    UdpTxData;\r
+} UDP_TX_TOKEN;\r
+\r
+struct _UDP_IO_PORT {\r
+  UINT32                    Signature;\r
+  LIST_ENTRY                Link;\r
+  INTN                      RefCnt;\r
+\r
+  //\r
+  // Handle used to create/destory UDP child\r
+  //\r
+  EFI_HANDLE                Controller;\r
+  EFI_HANDLE                Image;\r
+  EFI_HANDLE                UdpHandle;\r
+\r
+  EFI_UDP4_PROTOCOL         *Udp;\r
+  EFI_UDP4_CONFIG_DATA      UdpConfig;\r
+  EFI_SIMPLE_NETWORK_MODE   SnpMode;\r
+\r
+  LIST_ENTRY                SentDatagram;\r
+  UDP_RX_TOKEN              *RecvRequest;\r
+};\r
+\r
+typedef\r
+EFI_STATUS\r
+(*UDP_IO_CONFIG) (\r
+  IN UDP_IO_PORT            *UdpIo,\r
+  IN VOID                   *Context\r
+  );\r
+\r
+typedef\r
+BOOLEAN\r
+(*UDP_IO_TO_CANCEL) (\r
+  IN UDP_TX_TOKEN           *Token,\r
+  IN VOID                   *Context\r
+  );\r
+\r
+/**\r
+  Create a UDP IO port to access the UDP service. It will\r
+  create and configure a UDP child.\r
+\r
+  @param  Controller            The controller that has the UDP service binding\r
+                                protocol installed.\r
+  @param  ImageHandle           The image handle for the driver.\r
+  @param  Configure             The function to configure the created UDP child\r
+  @param  Context               The opaque parameter for the Configure funtion.\r
+\r
+  @return A point to just created UDP IO port or NULL if failed.\r
+\r
+**/\r
+UDP_IO_PORT *\r
+EFIAPI\r
+UdpIoCreatePort (\r
+  IN  EFI_HANDLE            Controller,\r
+  IN  EFI_HANDLE            ImageHandle,\r
+  IN  UDP_IO_CONFIG         Configure,\r
+  IN  VOID                  *Context\r
+  );\r
+\r
+/**\r
+  Free the UDP IO port and all its related resources including\r
+  all the transmitted packet.\r
+\r
+  @param  UdpIo                 The UDP IO port to free.\r
+\r
+  @retval EFI_SUCCESS           The UDP IO port is freed.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+UdpIoFreePort (\r
+  IN  UDP_IO_PORT           *UdpIo\r
+  );\r
+\r
+/**\r
+  Clean up the UDP IO port. It will release all the transmitted\r
+  datagrams and receive request. It will also configure NULL the\r
+  UDP child.\r
+\r
+  @param  UdpIo                 UDP IO port to clean up.\r
+\r
+  @return None\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+UdpIoCleanPort (\r
+  IN  UDP_IO_PORT           *UdpIo\r
+  );\r
+\r
+/**\r
+  Send a packet through the UDP IO port.\r
+\r
+  @param  UdpIo                 The UDP IO Port to send the packet through\r
+  @param  Packet                The packet to send\r
+  @param  EndPoint              The local and remote access point\r
+  @param  Gateway               The gateway to use\r
+  @param  CallBack              The call back function to call when packet is\r
+                                transmitted or failed.\r
+  @param  Context               The opque parameter to the 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_PORT           *UdpIo,\r
+  IN  NET_BUF               *Packet,\r
+  IN  UDP_POINTS            *EndPoint, OPTIONAL\r
+  IN  IP4_ADDR              Gateway,\r
+  IN  UDP_IO_CALLBACK       CallBack,\r
+  IN  VOID                  *Context\r
+  );\r
+\r
+/**\r
+  Cancel a single sent datagram.\r
+\r
+  @param  UdpIo                 The UDP IO port to cancel the packet from\r
+  @param  Packet                The packet to cancel\r
+\r
+  @return None\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+UdpIoCancelSentDatagram (\r
+  IN  UDP_IO_PORT           *UdpIo,\r
+  IN  NET_BUF               *Packet\r
+  );\r
+\r
+/**\r
+  Issue a receive request to the UDP IO port.\r
+\r
+  @param  UdpIo                 The UDP IO port to recieve the packet from.\r
+  @param  CallBack              The call back function to execute when receive\r
+                                finished.\r
+  @param  Context               The opque context to the call back\r
+  @param  HeadLen               The lenght of the application's header\r
+\r
+  @retval EFI_ALREADY_STARTED   There is already a pending receive request. Only\r
+                                one receive request is supported.\r
+  @retval EFI_OUT_OF_RESOURCES  Failed to allocate some resource.\r
+  @retval EFI_SUCCESS           The receive request is issued successfully.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+UdpIoRecvDatagram (\r
+  IN  UDP_IO_PORT           *UdpIo,\r
+  IN  UDP_IO_CALLBACK       CallBack,\r
+  IN  VOID                  *Context,\r
+  IN  UINT32                HeadLen\r
+  );\r
+#endif\r