]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Include/Library/NetLib.h
1. Add DPC protocol and DpcLib library in MdeModulePkg.
[mirror_edk2.git] / MdeModulePkg / Include / Library / NetLib.h
index 3a8274198dbbc69d95169c88f5a412ba62d8368e..c843b6ce79a0789f9957fec71da6f5fb1ca5d30d 100644 (file)
@@ -28,184 +28,185 @@ Abstract:
 #include <Protocol/ComponentName.h>
 #include <Protocol/DriverConfiguration.h>
 #include <Protocol/DriverDiagnostics.h>
+#include <Protocol/Dpc.h>
+
+#define EFI_NET_LITTLE_ENDIAN
+
+typedef UINT32          IP4_ADDR;
+typedef UINT32          TCP_SEQNO;
+typedef UINT16          TCP_PORTNO;
+
+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,
+};
+
+#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 {
+#ifdef EFI_NET_LITTLE_ENDIAN
+  UINT8                 HeadLen : 4;
+  UINT8                 Ver     : 4;
+#else
+  UINT8                 Ver     : 4;
+  UINT8                 HeadLen : 4;
+#endif
+  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;
+#ifdef EFI_NET_LITTLE_ENDIAN
+  UINT8                 Res     : 4;
+  UINT8                 HeadLen : 4;
+#else
+  UINT8                 HeadLen : 4;
+  UINT8                 Res     : 4;
+#endif
+  UINT8                 Flag;
+  UINT16                Wnd;
+  UINT16                Checksum;
+  UINT16                Urg;
+} TCP_HEAD;
+
+#pragma pack()
+
+#define NET_MAC_EQUAL(pMac1, pMac2, Len)     \
+    (NetCompareMem ((pMac1), (pMac2), Len) == 0)
+
+#define NET_MAC_IS_MULTICAST(Mac, BMac, Len) \
+    (((*((UINT8 *) Mac) & 0x01) == 0x01) && (!NET_MAC_EQUAL (Mac, BMac, Len)))
+
+#ifdef EFI_NET_LITTLE_ENDIAN
+#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)
+#else
+#define NTOHL(x)  (UINT32)(x)
+#define HTONL(x)  (UINT32)(x)
+#define NTOHS(x)  (UINT16)(x)
+#define HTONS(x)  (UINT16)(x)
+#endif
+
+//
+// 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)  (NetCompareMem ((Ip1), (Ip2), sizeof (EFI_IPv4_ADDRESS)) == 0)
+
+INTN
+NetGetMaskLength (
+  IN IP4_ADDR               Mask
+  );
+
+INTN
+NetGetIpClass (
+  IN IP4_ADDR               Addr
+  );
+
+BOOLEAN
+Ip4IsUnicast (
+  IN IP4_ADDR               Ip,
+  IN IP4_ADDR               NetMask
+  );
 
-#define EFI_NET_LITTLE_ENDIAN\r
-\r
-typedef UINT32          IP4_ADDR;\r
-typedef UINT32          TCP_SEQNO;\r
-typedef UINT16          TCP_PORTNO;\r
-\r
-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
-};\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
-#ifdef EFI_NET_LITTLE_ENDIAN\r
-  UINT8                 HeadLen : 4;\r
-  UINT8                 Ver     : 4;\r
-#else\r
-  UINT8                 Ver     : 4;\r
-  UINT8                 HeadLen : 4;\r
-#endif\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
-#ifdef EFI_NET_LITTLE_ENDIAN\r
-  UINT8                 Res     : 4;\r
-  UINT8                 HeadLen : 4;\r
-#else\r
-  UINT8                 HeadLen : 4;\r
-  UINT8                 Res     : 4;\r
-#endif\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
-    (NetCompareMem ((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
-#ifdef EFI_NET_LITTLE_ENDIAN\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
-#else\r
-#define NTOHL(x)  (UINT32)(x)\r
-#define HTONL(x)  (UINT32)(x)\r
-#define NTOHS(x)  (UINT16)(x)\r
-#define HTONS(x)  (UINT16)(x)\r
-#endif\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)  (NetCompareMem ((Ip1), (Ip2), sizeof (EFI_IPv4_ADDRESS)) == 0)\r
-\r
-INTN\r
-NetGetMaskLength (\r
-  IN IP4_ADDR               Mask\r
-  );\r
-\r
-INTN\r
-NetGetIpClass (\r
-  IN IP4_ADDR               Addr\r
-  );\r
-\r
-BOOLEAN\r
-Ip4IsUnicast (\r
-  IN IP4_ADDR               Ip,\r
-  IN IP4_ADDR               NetMask\r
-  );\r
-\r
 extern IP4_ADDR mIp4AllMasks [IP4_MASK_NUM];
 
 
@@ -228,16 +229,13 @@ extern EFI_IPv4_ADDRESS  mZeroIp4Addr;
 // to the standard EFI enviornment. It will NOT consider multiprocessor.
 //
 #define NET_TPL_LOCK            TPL_CALLBACK
-#define NET_TPL_RECYCLE_LOCK    (NET_TPL_LOCK + 1)
-#define NET_TPL_EVENT           TPL_CALLBACK
-#define NET_TPL_RECYCLE         (NET_TPL_LOCK + 1)
-#define NET_TPL_SLOW_TIMER      (TPL_CALLBACK - 1)
-#define NET_TPL_FAST_TIMER      NET_TPL_RECYCLE
-#define NET_TPL_TIMER           TPL_CALLBACK
+#define NET_TPL_EVENT           TPL_NOTIFY
+#define NET_TPL_RECYCLE         TPL_NOTIFY
+#define NET_TPL_TIMER           NET_TPL_LOCK
 
 #define NET_LOCK                 EFI_LOCK
 #define NET_LOCK_INIT(x)         EfiInitializeLock (x, NET_TPL_LOCK)
-#define NET_RECYCLE_LOCK_INIT(x) EfiInitializeLock (x, NET_TPL_RECYCLE_LOCK)
+#define NET_RECYCLE_LOCK_INIT(x) EfiInitializeLock (x, NET_TPL_RECYCLE)
 #define NET_TRYLOCK(x)           EfiAcquireLockOrFail (x)
 #define NET_UNLOCK(x)            EfiReleaseLock (x)
 
@@ -247,8 +245,6 @@ extern EFI_IPv4_ADDRESS  mZeroIp4Addr;
 #define TICKS_PER_MS            10000U
 #define TICKS_PER_SECOND        10000000U
 
-#define NET_MIN(a, b)           ((a) < (b) ? (a) : (b))
-#define NET_MAX(a, b)           ((a) > (b) ? (a) : (b))
 #define NET_RANDOM(Seed)        ((UINT32) ((UINT32) (Seed) * 1103515245UL + 12345) % 4294967295UL)
 
 
@@ -475,6 +471,18 @@ NetLibGetNicHandle (
   IN EFI_GUID               *ProtocolGuid
   );
 
+EFI_STATUS
+NetLibQueueDpc (
+  IN EFI_TPL            DpcTpl,
+  IN EFI_DPC_PROCEDURE  DpcProcedure,
+  IN VOID               *DpcContext    OPTIONAL
+  );
+
+EFI_STATUS
+NetLibDispatchDpc (
+  VOID
+  );
+
 EFI_STATUS
 EFIAPI
 NetLibDefaultUnload (
@@ -793,78 +801,78 @@ NetPseudoHeadChecksum (
   IN UINT16                 Len
   );
 
-//\r
-// The debug level definition. This value is also used as the\r
-// syslog's servity level. Don't change it.\r
-//\r
-enum {\r
-  NETDEBUG_LEVEL_TRACE   = 5,\r
-  NETDEBUG_LEVEL_WARNING = 4,\r
-  NETDEBUG_LEVEL_ERROR   = 3,\r
-};\r
-\r
-#ifdef EFI_NETWORK_STACK_DEBUG\r
-\r
-//\r
-// The debug output expects the ASCII format string, Use %a to print ASCII\r
-// string, and %s to print UNICODE string. PrintArg must be enclosed in ().\r
-// For example: NET_DEBUG_TRACE ("Tcp", ("State transit to %a\n", Name));\r
-//\r
-#define NET_DEBUG_TRACE(Module, PrintArg) \\r
-  NetDebugOutput ( \\r
-    NETDEBUG_LEVEL_TRACE, \\r
-    Module, \\r
-    __FILE__, \\r
-    __LINE__, \\r
-    NetDebugASPrint PrintArg \\r
-    )\r
-\r
-#define NET_DEBUG_WARNING(Module, PrintArg) \\r
-  NetDebugOutput ( \\r
-    NETDEBUG_LEVEL_WARNING, \\r
-    Module, \\r
-    __FILE__, \\r
-    __LINE__, \\r
-    NetDebugASPrint PrintArg \\r
-    )\r
-\r
-#define NET_DEBUG_ERROR(Module, PrintArg) \\r
-  NetDebugOutput ( \\r
-    NETDEBUG_LEVEL_ERROR, \\r
-    Module, \\r
-    __FILE__, \\r
-    __LINE__, \\r
-    NetDebugASPrint PrintArg \\r
-    )\r
-\r
-#else\r
-#define NET_DEBUG_TRACE(Module, PrintString)\r
-#define NET_DEBUG_WARNING(Module, PrintString)\r
-#define NET_DEBUG_ERROR(Module, PrintString)\r
-#endif\r
-\r
-UINT8 *\r
-NetDebugASPrint (\r
-  UINT8                     *Format,\r
-  ...\r
-  );\r
-\r
-EFI_STATUS\r
-NetDebugOutput (\r
-  UINT32                    Level,\r
-  UINT8                     *Module,\r
-  UINT8                     *File,\r
-  UINT32                    Line,\r
-  UINT8                     *Message\r
-  );\r
-\r
-//\r
-// Network debug message is sent out as syslog.\r
-//\r
-enum {\r
-  NET_SYSLOG_FACILITY       = 16,             // Syslog local facility local use\r
-  NET_SYSLOG_PACKET_LEN     = 512,\r
-  NET_DEBUG_MSG_LEN         = 470,            // 512 - (ether+ip+udp head length)\r
-  NET_SYSLOG_TX_TIMEOUT     = 500 *1000 *10,  // 500ms\r
+//
+// The debug level definition. This value is also used as the
+// syslog's servity level. Don't change it.
+//
+enum {
+  NETDEBUG_LEVEL_TRACE   = 5,
+  NETDEBUG_LEVEL_WARNING = 4,
+  NETDEBUG_LEVEL_ERROR   = 3,
+};
+
+#ifdef EFI_NETWORK_STACK_DEBUG
+
+//
+// The debug output expects the ASCII format string, Use %a to print ASCII
+// string, and %s to print UNICODE string. PrintArg must be enclosed in ().
+// For example: NET_DEBUG_TRACE ("Tcp", ("State transit to %a\n", Name));
+//
+#define NET_DEBUG_TRACE(Module, PrintArg) \
+  NetDebugOutput ( \
+    NETDEBUG_LEVEL_TRACE, \
+    Module, \
+    __FILE__, \
+    __LINE__, \
+    NetDebugASPrint PrintArg \
+    )
+
+#define NET_DEBUG_WARNING(Module, PrintArg) \
+  NetDebugOutput ( \
+    NETDEBUG_LEVEL_WARNING, \
+    Module, \
+    __FILE__, \
+    __LINE__, \
+    NetDebugASPrint PrintArg \
+    )
+
+#define NET_DEBUG_ERROR(Module, PrintArg) \
+  NetDebugOutput ( \
+    NETDEBUG_LEVEL_ERROR, \
+    Module, \
+    __FILE__, \
+    __LINE__, \
+    NetDebugASPrint PrintArg \
+    )
+
+#else
+#define NET_DEBUG_TRACE(Module, PrintString)
+#define NET_DEBUG_WARNING(Module, PrintString)
+#define NET_DEBUG_ERROR(Module, PrintString)
+#endif
+
+UINT8 *
+NetDebugASPrint (
+  UINT8                     *Format,
+  ...
+  );
+
+EFI_STATUS
+NetDebugOutput (
+  UINT32                    Level,
+  UINT8                     *Module,
+  UINT8                     *File,
+  UINT32                    Line,
+  UINT8                     *Message
+  );
+
+//
+// Network debug message is sent out as syslog.
+//
+enum {
+  NET_SYSLOG_FACILITY       = 16,             // Syslog local facility local use
+  NET_SYSLOG_PACKET_LEN     = 512,
+  NET_DEBUG_MSG_LEN         = 470,            // 512 - (ether+ip+udp head length)
+  NET_SYSLOG_TX_TIMEOUT     = 500 *1000 *10,  // 500ms
 };
 #endif