#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];
// 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)
#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)
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 (
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