examples/packet_ordering: enhance getopt_long usage
[dpdk.git] / lib / librte_net / rte_ip.h
index 5463276..b59c4d6 100644 (file)
@@ -384,7 +384,7 @@ rte_ipv4_udptcp_cksum(const struct rte_ipv4_hdr *ipv4_hdr, const void *l4_hdr)
  */
 struct rte_ipv6_hdr {
        rte_be32_t vtc_flow;    /**< IP version, traffic class & flow label. */
-       rte_be16_t payload_len; /**< IP packet length - includes header size */
+       rte_be16_t payload_len; /**< IP payload size, including ext. headers */
        uint8_t  proto;         /**< Protocol, next header. */
        uint8_t  hop_limits;    /**< Hop limits. */
        uint8_t  src_addr[16];  /**< IP address of source host. */
@@ -478,8 +478,30 @@ 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
+/** IPv6 fragment extension header. */
+#define        RTE_IPV6_EHDR_MF_SHIFT  0
+#define        RTE_IPV6_EHDR_MF_MASK   1
+#define        RTE_IPV6_EHDR_FO_SHIFT  3
+#define        RTE_IPV6_EHDR_FO_MASK   (~((1 << RTE_IPV6_EHDR_FO_SHIFT) - 1))
+#define        RTE_IPV6_EHDR_FO_ALIGN  (1 << RTE_IPV6_EHDR_FO_SHIFT)
+
+#define RTE_IPV6_FRAG_USED_MASK        (RTE_IPV6_EHDR_MF_MASK | RTE_IPV6_EHDR_FO_MASK)
+
+#define RTE_IPV6_GET_MF(x)     ((x) & RTE_IPV6_EHDR_MF_MASK)
+#define RTE_IPV6_GET_FO(x)     ((x) >> RTE_IPV6_EHDR_FO_SHIFT)
+
+#define RTE_IPV6_SET_FRAG_DATA(fo, mf) \
+       (((fo) & RTE_IPV6_EHDR_FO_MASK) | ((mf) & RTE_IPV6_EHDR_MF_MASK))
+
+struct rte_ipv6_fragment_ext {
+       uint8_t next_header;    /**< Next header type */
+       uint8_t reserved;       /**< Reserved */
+       rte_be16_t frag_data;   /**< All fragmentation data */
+       rte_be32_t id;          /**< Packet ID */
+} __rte_packed;
+
+/* IPv6 fragment extension header size */
+#define RTE_IPV6_FRAG_HDR_SIZE sizeof(struct rte_ipv6_fragment_ext)
 
 /**
  * Parse next IPv6 header extension