#ifndef _NET_LIB_H_\r
#define _NET_LIB_H_\r
\r
+#include <Protocol/Ip6.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
+#define NET_ETHER_ADDR_LEN 6\r
+#define NET_IFTYPE_ETHERNET 0x01\r
+\r
+#define EFI_IP_PROTO_UDP 0x11\r
+#define EFI_IP_PROTO_TCP 0x06\r
+#define EFI_IP_PROTO_ICMP 0x01\r
+#define IP4_PROTO_IGMP 0x02\r
+#define IP6_ICMP 58\r
+\r
+//\r
+// The address classification\r
+//\r
+#define IP4_ADDR_CLASSA 1\r
+#define IP4_ADDR_CLASSB 2\r
+#define IP4_ADDR_CLASSC 3\r
+#define IP4_ADDR_CLASSD 4\r
+#define IP4_ADDR_CLASSE 5\r
+\r
+#define IP4_MASK_NUM 33\r
+#define IP6_PREFIX_NUM 129\r
\r
- //\r
- // The address classification\r
- //\r
- IP4_ADDR_CLASSA = 1,\r
- IP4_ADDR_CLASSB,\r
- IP4_ADDR_CLASSC,\r
- IP4_ADDR_CLASSD,\r
- IP4_ADDR_CLASSE,\r
+#define IP6_HOP_BY_HOP 0\r
+#define IP6_DESTINATION 60\r
+#define IP6_FRAGMENT 44\r
+#define IP6_AH 51\r
+#define IP6_ESP 50\r
+#define IP6_NO_NEXT_HEADER 59\r
\r
- IP4_MASK_NUM = 33\r
-} IP4_CLASS_TYPE;\r
+#define IP_VERSION_4 4\r
+#define IP_VERSION_6 6\r
\r
#pragma pack(1)\r
\r
UINT16 Seq;\r
} IP4_ICMP_QUERY_HEAD;\r
\r
+typedef struct {\r
+ UINT8 Type;\r
+ UINT8 Code;\r
+ UINT16 Checksum;\r
+} IP6_ICMP_HEAD;\r
+\r
+typedef struct {\r
+ IP6_ICMP_HEAD Head;\r
+ UINT32 Fourth;\r
+ EFI_IP6_HEADER IpHead;\r
+} IP6_ICMP_ERROR_HEAD;\r
+\r
+typedef struct {\r
+ IP6_ICMP_HEAD Head;\r
+ UINT32 Fourth;\r
+} IP6_ICMP_INFORMATION_HEAD;\r
\r
//\r
// UDP header definition\r
UINT16 DstPort;\r
UINT16 Length;\r
UINT16 Checksum;\r
-} EFI_UDP4_HEADER;\r
-\r
+} EFI_UDP_HEADER;\r
\r
//\r
// TCP header definition\r
#define NTOHS(x) (UINT16)((((UINT16) (x) & 0xff) << 8) | \\r
(((UINT16) (x) & 0xff00) >> 8))\r
\r
-#define HTONS(x) NTOHS(x)\r
+#define HTONS(x) NTOHS(x)\r
+#define NTOHLL(x) SwapBytes64 (x)\r
+#define HTONLL(x) NTOHLL(x)\r
+#define NTOHLLL(x) Ip6Swap128 (x)\r
+#define HTONLLL(x) NTOHLLL(x)\r
\r
//\r
// Test the IP's attribute, All the IPs are in host byte order.\r
#define EFI_NTOHL(EfiIp) (NTOHL (EFI_IP4 ((EfiIp))))\r
#define EFI_IP4_EQUAL(Ip1, Ip2) (CompareMem ((Ip1), (Ip2), sizeof (EFI_IPv4_ADDRESS)) == 0)\r
\r
+#define EFI_IP6_EQUAL(Ip1, Ip2) (CompareMem ((Ip1), (Ip2), sizeof (EFI_IPv6_ADDRESS)) == 0)\r
+\r
+#define IP6_COPY_ADDRESS(Dest, Src) (CopyMem ((Dest), (Src), sizeof (EFI_IPv6_ADDRESS)))\r
+#define IP6_COPY_LINK_ADDRESS(Mac1, Mac2) (CopyMem ((Mac1), (Mac2), sizeof (EFI_MAC_ADDRESS)))\r
+\r
+//\r
+// The debug level definition. This value is also used as the \r
+// syslog's servity level. Don't change it. \r
+//\r
+#define NETDEBUG_LEVEL_TRACE 5\r
+#define NETDEBUG_LEVEL_WARNING 4\r
+#define NETDEBUG_LEVEL_ERROR 3\r
+\r
+//\r
+// Network debug message is sent out as syslog packet. \r
+//\r
+#define NET_SYSLOG_FACILITY 16 // Syslog local facility local use\r
+#define NET_SYSLOG_PACKET_LEN 512 \r
+#define NET_SYSLOG_TX_TIMEOUT 500 *1000 *10 // 500ms\r
+#define NET_DEBUG_MSG_LEN 470 // 512 - (ether+ip4+udp4 head length)\r
+\r
+//\r
+// The debug output expects the ASCII format string, Use %a to print ASCII \r
+// string, and %s to print UNICODE string. PrintArg must be enclosed in (). \r
+// For example: NET_DEBUG_TRACE ("Tcp", ("State transit to %a\n", Name));\r
+//\r
+#define NET_DEBUG_TRACE(Module, PrintArg) \\r
+ NetDebugOutput ( \\r
+ NETDEBUG_LEVEL_TRACE, \\r
+ Module, \\r
+ __FILE__, \\r
+ __LINE__, \\r
+ NetDebugASPrint PrintArg \\r
+ )\r
+\r
+#define NET_DEBUG_WARNING(Module, PrintArg) \\r
+ NetDebugOutput ( \\r
+ NETDEBUG_LEVEL_WARNING, \\r
+ Module, \\r
+ __FILE__, \\r
+ __LINE__, \\r
+ NetDebugASPrint PrintArg \\r
+ )\r
+\r
+#define NET_DEBUG_ERROR(Module, PrintArg) \\r
+ NetDebugOutput ( \\r
+ NETDEBUG_LEVEL_ERROR, \\r
+ Module, \\r
+ __FILE__, \\r
+ __LINE__, \\r
+ NetDebugASPrint PrintArg \\r
+ )\r
+\r
+/**\r
+ Allocate a buffer, then format the message to it. This is a \r
+ help function for the NET_DEBUG_XXX macros. The PrintArg of \r
+ these macros treats the variable length print parameters as a \r
+ single parameter, and pass it to the NetDebugASPrint. For\r
+ example, NET_DEBUG_TRACE ("Tcp", ("State transit to %a\n", Name))\r
+ if extracted to: \r
+ \r
+ NetDebugOutput (\r
+ NETDEBUG_LEVEL_TRACE, \r
+ "Tcp", \r
+ __FILE__,\r
+ __LINE__,\r
+ NetDebugASPrint ("State transit to %a\n", Name) \r
+ ) \r
+ \r
+ @param Format The ASCII format string.\r
+ @param ... The variable length parameter whose format is determined \r
+ by the Format string.\r
+\r
+ @return The buffer containing the formatted message,\r
+ or NULL if failed to allocate memory.\r
+\r
+**/\r
+CHAR8 *\r
+NetDebugASPrint (\r
+ IN CHAR8 *Format,\r
+ ...\r
+ );\r
+\r
+/**\r
+ Builds an UDP4 syslog packet and send it using SNP.\r
+\r
+ This function will locate a instance of SNP then send the message through it.\r
+ Because it isn't open the SNP BY_DRIVER, apply caution when using it.\r
+\r
+ @param Level The servity level of the message.\r
+ @param Module The Moudle that generates the log.\r
+ @param File The file that contains the log.\r
+ @param Line The exact line that contains the log.\r
+ @param Message The user message to log.\r
+\r
+ @retval EFI_INVALID_PARAMETER Any input parameter is invalid.\r
+ @retval EFI_OUT_OF_RESOURCES Failed to allocate memory for the packet\r
+ @retval EFI_SUCCESS The log is discard because that it is more verbose \r
+ than the mNetDebugLevelMax. Or, it has been sent out.\r
+**/ \r
+EFI_STATUS\r
+NetDebugOutput (\r
+ IN UINT32 Level, \r
+ IN UINT8 *Module,\r
+ IN UINT8 *File,\r
+ IN UINT32 Line,\r
+ IN UINT8 *Message\r
+ );\r
+\r
+\r
/**\r
Return the length of the mask. \r
\r
**/\r
BOOLEAN\r
EFIAPI\r
-Ip4IsUnicast (\r
+NetIp4IsUnicast (\r
IN IP4_ADDR Ip,\r
IN IP4_ADDR NetMask\r
);\r
\r
+/**\r
+ Check whether the incoming IPv6 address is a valid unicast address.\r
+\r
+ If the address is a multicast address has binary 0xFF at the start, it is not\r
+ a valid unicast address. If the address is unspecified ::, it is not a valid\r
+ unicast address to be assigned to any node. If the address is loopback address\r
+ ::1, it is also not a valid unicast address to be assigned to any physical\r
+ interface. \r
+\r
+ @param[in] Ip6 The IPv6 address to check against.\r
+\r
+ @return TRUE if Ip6 is a valid unicast address on the network, otherwise FALSE.\r
+\r
+**/ \r
+BOOLEAN\r
+NetIp6IsValidUnicast (\r
+ IN EFI_IPv6_ADDRESS *Ip6\r
+ );\r
+\r
+\r
+/**\r
+ Check whether the incoming Ipv6 address is the unspecified address or not.\r
+\r
+ @param[in] Ip6 - Ip6 address, in network order.\r
+\r
+ @retval TRUE - Yes, unspecified\r
+ @retval FALSE - No\r
+ \r
+**/\r
+BOOLEAN\r
+NetIp6IsUnspecifiedAddr (\r
+ IN EFI_IPv6_ADDRESS *Ip6\r
+ );\r
+\r
+/**\r
+ Check whether the incoming Ipv6 address is a link-local address.\r
+\r
+ @param[in] Ip6 - Ip6 address, in network order.\r
+\r
+ @retval TRUE - Yes, link-local address\r
+ @retval FALSE - No\r
+ \r
+**/\r
+BOOLEAN\r
+NetIp6IsLinkLocalAddr (\r
+ IN EFI_IPv6_ADDRESS *Ip6\r
+ );\r
+\r
+/**\r
+ Check whether the Ipv6 address1 and address2 are on the connected network.\r
+\r
+ @param[in] Ip1 - Ip6 address1, in network order.\r
+ @param[in] Ip2 - Ip6 address2, in network order.\r
+ @param[in] PrefixLength - The prefix length of the checking net.\r
+\r
+ @retval TRUE - Yes, connected.\r
+ @retval FALSE - No.\r
+ \r
+**/\r
+BOOLEAN\r
+NetIp6IsNetEqual (\r
+ EFI_IPv6_ADDRESS *Ip1,\r
+ EFI_IPv6_ADDRESS *Ip2,\r
+ UINT8 PrefixLength\r
+ );\r
+\r
+/**\r
+ Switches the endianess of an IPv6 address\r
+\r
+ This function swaps the bytes in a 128-bit IPv6 address to switch the value\r
+ from little endian to big endian or vice versa. The byte swapped value is\r
+ returned.\r
+\r
+ @param Ip6 Points to an IPv6 address\r
+\r
+ @return The byte swapped IPv6 address.\r
+\r
+**/\r
+EFI_IPv6_ADDRESS *\r
+Ip6Swap128 (\r
+ EFI_IPv6_ADDRESS *Ip6\r
+ );\r
+\r
extern IP4_ADDR gIp4AllMasks[IP4_MASK_NUM];\r
\r
\r
NetMapIterate (\r
IN NET_MAP *Map,\r
IN NET_MAP_CALLBACK CallBack,\r
- IN VOID *Arg\r
+ IN VOID *Arg OPTIONAL\r
);\r
\r
\r
Get other info from parameters to make up the whole IPv4 device path node.\r
\r
@param[in, out] Node Pointer to the IPv4 device path node.\r
- @param[in] Controller The handle where the NIC IP4 config protocol resides.\r
+ @param[in] Controller The controller handle.\r
@param[in] LocalIp The local IPv4 address.\r
@param[in] LocalPort The local port.\r
@param[in] RemoteIp The remote IPv4 address.\r
IN BOOLEAN UseDefaultAddress\r
);\r
\r
+/**\r
+ Create an IPv6 device path node.\r
+ \r
+ The header type of IPv6 device path node is MESSAGING_DEVICE_PATH.\r
+ The header subtype of IPv6 device path node is MSG_IPv6_DP.\r
+ The length of the IPv6 device path node in bytes is 43.\r
+ Get other info from parameters to make up the whole IPv6 device path node.\r
+\r
+ @param[in, out] Node Pointer to the IPv6 device path node.\r
+ @param[in] Controller The controller handle.\r
+ @param[in] LocalIp The local IPv6 address.\r
+ @param[in] LocalPort The local port.\r
+ @param[in] RemoteIp The remote IPv6 address.\r
+ @param[in] RemotePort The remote port.\r
+ @param[in] Protocol The protocol type in the IP header.\r
+\r
+**/\r
+VOID\r
+EFIAPI\r
+NetLibCreateIPv6DPathNode (\r
+ IN OUT IPv6_DEVICE_PATH *Node,\r
+ IN EFI_HANDLE Controller,\r
+ IN EFI_IPv6_ADDRESS *LocalIp,\r
+ IN UINT16 LocalPort,\r
+ IN EFI_IPv6_ADDRESS *RemoteIp,\r
+ IN UINT16 RemotePort,\r
+ IN UINT16 Protocol\r
+ );\r
+\r
+\r
/**\r
Find the UNDI/SNP handle from controller and protocol GUID.\r
\r
IN EFI_HANDLE ImageHandle\r
);\r
\r
-typedef enum {\r
- //\r
- //Various signatures\r
- //\r
- NET_BUF_SIGNATURE = SIGNATURE_32 ('n', 'b', 'u', 'f'),\r
- NET_VECTOR_SIGNATURE = SIGNATURE_32 ('n', 'v', 'e', 'c'),\r
- NET_QUE_SIGNATURE = SIGNATURE_32 ('n', 'b', 'q', 'u'),\r
\r
+//\r
+//Various signatures\r
+//\r
+#define NET_BUF_SIGNATURE SIGNATURE_32 ('n', 'b', 'u', 'f')\r
+#define NET_VECTOR_SIGNATURE SIGNATURE_32 ('n', 'v', 'e', 'c')\r
+#define NET_QUE_SIGNATURE SIGNATURE_32 ('n', 'b', 'q', 'u')\r
\r
- 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_PROTO_DATA 64 // Opaque buffer for protocols\r
+#define NET_BUF_HEAD 1 // Trim or allocate space from head\r
+#define NET_BUF_TAIL 0 // Trim or allocate space from tail\r
+#define NET_VECTOR_OWN_FIRST 0x01 // We allocated the 1st block in the vector\r
\r
#define NET_CHECK_SIGNATURE(PData, SIGNATURE) \\r
ASSERT (((PData) != NULL) && ((PData)->Signature == (SIGNATURE)))\r
UINT32 Size; // The size of the data\r
} NET_BLOCK_OP;\r
\r
+typedef union {\r
+ IP4_HEAD *Ip4;\r
+ EFI_IP6_HEADER *Ip6;\r
+} NET_IP_HEAD;\r
\r
//\r
//NET_BUF is the buffer manage structure used by the\r
//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
+ 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
+ NET_IP_HEAD Ip; // Network layer header, for fast access\r
+ TCP_HEAD *Tcp; // Transport layer header, for fast access\r
+ EFI_UDP_HEADER *Udp; // User Datagram Protocol header\r
+ UINT8 ProtoData [NET_PROTO_DATA]; //Protocol specific data\r
\r
- NET_VECTOR *Vector; // The vector containing the packet\r
+ 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
+ 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 a thin extension of\r
//NET_BUF functions.\r
UINT8 Protocol;\r
UINT16 Len;\r
} NET_PSEUDO_HDR;\r
+\r
+typedef struct {\r
+ EFI_IPv6_ADDRESS SrcIp;\r
+ EFI_IPv6_ADDRESS DstIp;\r
+ UINT32 Len;\r
+ UINT32 Reserved:24;\r
+ UINT32 NextHeader:8;\r
+} NET_IP6_PSEUDO_HDR;\r
#pragma pack()\r
\r
//\r
IN UINT16 Len\r
);\r
\r
+/**\r
+ Compute the checksum for TCP6/UDP6 pseudo header. \r
+ \r
+ Src and Dst are in network byte order, and Len is in host byte order.\r
+\r
+ @param[in] Src The source address of the packet.\r
+ @param[in] Dst The destination address of the packet.\r
+ @param[in] NextHeader The protocol type of the packet.\r
+ @param[in] Len The length of the packet.\r
+\r
+ @return The computed checksum.\r
+\r
+**/\r
+UINT16\r
+NetIp6PseudoHeadChecksum (\r
+ IN EFI_IPv6_ADDRESS *Src,\r
+ IN EFI_IPv6_ADDRESS *Dst,\r
+ IN UINT8 NextHeader,\r
+ IN UINT32 Len\r
+ );\r
#endif\r