]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Include/Library/NetLib.h
Make use of UefiRuntimeLib for refinement.
[mirror_edk2.git] / MdeModulePkg / Include / Library / NetLib.h
index 1a0507b9e6f939a6d4b18c3b590e464f568309b7..2eab4a33295c8355c7b275ae36ce3e2f85c2f552 100644 (file)
@@ -29,6 +29,8 @@ typedef UINT16          TCP_PORTNO;
 #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
@@ -40,7 +42,7 @@ typedef UINT16          TCP_PORTNO;
 #define  IP4_ADDR_CLASSE       5\r
 \r
 #define  IP4_MASK_NUM          33\r
-\r
+#define  IP6_PREFIX_NUM        129\r
 \r
 #define  IP6_HOP_BY_HOP        0\r
 #define  IP6_DESTINATION       60\r
@@ -49,6 +51,8 @@ typedef UINT16          TCP_PORTNO;
 #define  IP6_ESP               50\r
 #define  IP6_NO_NEXT_HEADER    59\r
 \r
+#define  IP_VERSION_4          4\r
+#define  IP_VERSION_6          6\r
 \r
 #pragma pack(1)\r
 \r
@@ -166,7 +170,11 @@ typedef struct {
 #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
@@ -187,6 +195,113 @@ typedef struct {
 \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
@@ -250,7 +365,7 @@ NetGetIpClass (
 **/\r
 BOOLEAN\r
 EFIAPI\r
-Ip4IsUnicast (\r
+NetIp4IsUnicast (\r
   IN IP4_ADDR               Ip,\r
   IN IP4_ADDR               NetMask\r
   );\r
@@ -270,10 +385,57 @@ Ip4IsUnicast (
 \r
 **/ \r
 BOOLEAN\r
-Ip6IsValidUnicast (\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
@@ -741,7 +903,7 @@ EFIAPI
 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
@@ -838,7 +1000,7 @@ NetLibGetMacString (
   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
@@ -860,6 +1022,36 @@ NetLibCreateIPv4DPathNode (
   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
@@ -961,6 +1153,10 @@ typedef struct {
   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
@@ -973,22 +1169,22 @@ typedef struct {
 //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
@@ -1014,6 +1210,14 @@ typedef struct {
   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
@@ -1544,4 +1748,24 @@ NetPseudoHeadChecksum (
   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