devtools: fix building kernel component tags
[dpdk.git] / lib / librte_net / rte_ip.h
index a1431ee..f82454b 100644 (file)
@@ -16,7 +16,9 @@
  */
 
 #include <stdint.h>
+#include <sys/types.h>
 #include <netinet/in.h>
+#include <netinet/ip.h>
 
 #include <rte_byteorder.h>
 #include <rte_mbuf.h>
@@ -42,52 +44,64 @@ struct rte_ipv4_hdr {
 } __attribute__((__packed__));
 
 /** Create IPv4 address */
-#define IPv4(a,b,c,d) ((uint32_t)(((a) & 0xff) << 24) | \
+#define RTE_IPV4(a, b, c, d) ((uint32_t)(((a) & 0xff) << 24) | \
                                           (((b) & 0xff) << 16) | \
                                           (((c) & 0xff) << 8)  | \
                                           ((d) & 0xff))
 
 /** Maximal IPv4 packet length (including a header) */
-#define IPV4_MAX_PKT_LEN        65535
+#define RTE_IPV4_MAX_PKT_LEN        65535
 
 /** Internet header length mask for version_ihl field */
-#define IPV4_HDR_IHL_MASK      (0x0f)
+#define RTE_IPV4_HDR_IHL_MASK  (0x0f)
 /**
  * Internet header length field multiplier (IHL field specifies overall header
  * length in number of 4-byte words)
  */
-#define IPV4_IHL_MULTIPLIER    (4)
+#define RTE_IPV4_IHL_MULTIPLIER        (4)
+
+/* Type of Service fields */
+#define RTE_IPV4_HDR_DSCP_MASK (0xfc)
+#define RTE_IPV4_HDR_ECN_MASK  (0x03)
+#define RTE_IPV4_HDR_ECN_CE    RTE_IPV4_HDR_ECN_MASK
 
 /* Fragment Offset * Flags. */
-#define        IPV4_HDR_DF_SHIFT       14
-#define        IPV4_HDR_MF_SHIFT       13
-#define        IPV4_HDR_FO_SHIFT       3
+#define        RTE_IPV4_HDR_DF_SHIFT   14
+#define        RTE_IPV4_HDR_MF_SHIFT   13
+#define        RTE_IPV4_HDR_FO_SHIFT   3
 
-#define        IPV4_HDR_DF_FLAG        (1 << IPV4_HDR_DF_SHIFT)
-#define        IPV4_HDR_MF_FLAG        (1 << IPV4_HDR_MF_SHIFT)
+#define        RTE_IPV4_HDR_DF_FLAG    (1 << RTE_IPV4_HDR_DF_SHIFT)
+#define        RTE_IPV4_HDR_MF_FLAG    (1 << RTE_IPV4_HDR_MF_SHIFT)
 
-#define        IPV4_HDR_OFFSET_MASK    ((1 << IPV4_HDR_MF_SHIFT) - 1)
+#define        RTE_IPV4_HDR_OFFSET_MASK        ((1 << RTE_IPV4_HDR_MF_SHIFT) - 1)
 
-#define        IPV4_HDR_OFFSET_UNITS   8
+#define        RTE_IPV4_HDR_OFFSET_UNITS       8
 
 /*
  * IPv4 address types
  */
-#define IPV4_ANY              ((uint32_t)0x00000000) /**< 0.0.0.0 */
-#define IPV4_LOOPBACK         ((uint32_t)0x7f000001) /**< 127.0.0.1 */
-#define IPV4_BROADCAST        ((uint32_t)0xe0000000) /**< 224.0.0.0 */
-#define IPV4_ALLHOSTS_GROUP   ((uint32_t)0xe0000001) /**< 224.0.0.1 */
-#define IPV4_ALLRTRS_GROUP    ((uint32_t)0xe0000002) /**< 224.0.0.2 */
-#define IPV4_MAX_LOCAL_GROUP  ((uint32_t)0xe00000ff) /**< 224.0.0.255 */
+#define RTE_IPV4_ANY              ((uint32_t)0x00000000) /**< 0.0.0.0 */
+#define RTE_IPV4_LOOPBACK         ((uint32_t)0x7f000001) /**< 127.0.0.1 */
+#define RTE_IPV4_BROADCAST        ((uint32_t)0xe0000000) /**< 224.0.0.0 */
+#define RTE_IPV4_ALLHOSTS_GROUP   ((uint32_t)0xe0000001) /**< 224.0.0.1 */
+#define RTE_IPV4_ALLRTRS_GROUP    ((uint32_t)0xe0000002) /**< 224.0.0.2 */
+#define RTE_IPV4_MAX_LOCAL_GROUP  ((uint32_t)0xe00000ff) /**< 224.0.0.255 */
 
 /*
  * IPv4 Multicast-related macros
  */
-#define IPV4_MIN_MCAST  IPv4(224, 0, 0, 0)          /**< Minimal IPv4-multicast address */
-#define IPV4_MAX_MCAST  IPv4(239, 255, 255, 255)    /**< Maximum IPv4 multicast address */
+#define RTE_IPV4_MIN_MCAST \
+       RTE_IPV4(224, 0, 0, 0)          /**< Minimal IPv4-multicast address */
+#define RTE_IPV4_MAX_MCAST \
+       RTE_IPV4(239, 255, 255, 255)    /**< Maximum IPv4 multicast address */
+
+#define RTE_IS_IPV4_MCAST(x) \
+       ((x) >= RTE_IPV4_MIN_MCAST && (x) <= RTE_IPV4_MAX_MCAST)
+       /**< check if IPv4 address is multicast */
 
-#define IS_IPV4_MCAST(x) \
-       ((x) >= IPV4_MIN_MCAST && (x) <= IPV4_MAX_MCAST) /**< check if IPv4 address is multicast */
+/* IPv4 default fields values */
+#define RTE_IPV4_MIN_IHL    (0x5)
+#define RTE_IPV4_VHL_DEF    (IPVERSION | RTE_IPV4_MIN_IHL)
 
 /**
  * @internal Calculate a sum of all words in the buffer.
@@ -349,10 +363,13 @@ struct rte_ipv6_hdr {
 } __attribute__((__packed__));
 
 /* IPv6 vtc_flow: IPv / TC / flow_label */
-#define IPV6_HDR_FL_SHIFT 0
-#define IPV6_HDR_TC_SHIFT 20
-#define IPV6_HDR_FL_MASK ((1u << IPV6_HDR_TC_SHIFT) - 1)
-#define IPV6_HDR_TC_MASK (0xf << IPV6_HDR_TC_SHIFT)
+#define RTE_IPV6_HDR_FL_SHIFT 0
+#define RTE_IPV6_HDR_TC_SHIFT 20
+#define RTE_IPV6_HDR_FL_MASK   ((1u << RTE_IPV6_HDR_TC_SHIFT) - 1)
+#define RTE_IPV6_HDR_TC_MASK   (0xff << RTE_IPV6_HDR_TC_SHIFT)
+#define RTE_IPV6_HDR_DSCP_MASK (0xfc << RTE_IPV6_HDR_TC_SHIFT)
+#define RTE_IPV6_HDR_ECN_MASK  (0x03 << RTE_IPV6_HDR_TC_SHIFT)
+#define RTE_IPV6_HDR_ECN_CE    RTE_IPV6_HDR_ECN_MASK
 
 /**
  * Process the pseudo-header checksum of an IPv6 header.
@@ -425,6 +442,56 @@ rte_ipv6_udptcp_cksum(const struct rte_ipv6_hdr *ipv6_hdr, const void *l4_hdr)
        return (uint16_t)cksum;
 }
 
+/* IPv6 fragmentation header size */
+#define RTE_IPV6_FRAG_HDR_SIZE 8
+
+/**
+ * Parse next IPv6 header extension
+ *
+ * This function checks if proto number is an IPv6 extensions and parses its
+ * data if so, providing information on next header and extension length.
+ *
+ * @param p
+ *   Pointer to an extension raw data.
+ * @param proto
+ *   Protocol number extracted from the "next header" field from
+ *   the IPv6 header or the previous extension.
+ * @param ext_len
+ *   Extension data length.
+ * @return
+ *   next protocol number if proto is an IPv6 extension, -EINVAL otherwise
+ */
+__rte_experimental
+static inline int
+rte_ipv6_get_next_ext(uint8_t *p, int proto, size_t *ext_len)
+{
+       int next_proto;
+
+       switch (proto) {
+       case IPPROTO_AH:
+               next_proto = *p++;
+               *ext_len = (*p + 2) * sizeof(uint32_t);
+               break;
+
+       case IPPROTO_HOPOPTS:
+       case IPPROTO_ROUTING:
+       case IPPROTO_DSTOPTS:
+               next_proto = *p++;
+               *ext_len = (*p + 1) * sizeof(uint64_t);
+               break;
+
+       case IPPROTO_FRAGMENT:
+               next_proto = *p;
+               *ext_len = RTE_IPV6_FRAG_HDR_SIZE;
+               break;
+
+       default:
+               return -EINVAL;
+       }
+
+       return next_proto;
+}
+
 #ifdef __cplusplus
 }
 #endif