X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=lib%2Flibrte_net%2Frte_ip.h;h=212ff2c4fd34783a4946a587cd5f0c7627a3242d;hb=4a91344b5e06081f8e2254266bb469489f6633d8;hp=8382d0fac7a03ad71566593123636467693bf7bf;hpb=d98b0fc1af6c3c752304f3910da1d97a57ddd53b;p=dpdk.git diff --git a/lib/librte_net/rte_ip.h b/lib/librte_net/rte_ip.h index 8382d0fac7..212ff2c4fd 100644 --- a/lib/librte_net/rte_ip.h +++ b/lib/librte_net/rte_ip.h @@ -103,6 +103,21 @@ struct rte_ipv4_hdr { #define RTE_IPV4_MIN_IHL (0x5) #define RTE_IPV4_VHL_DEF ((IPVERSION << 4) | RTE_IPV4_MIN_IHL) +/** + * Get the length of an IPv4 header. + * + * @param ipv4_hdr + * Pointer to the IPv4 header. + * @return + * The length of the IPv4 header (with options if present) in bytes. + */ +static inline uint8_t +rte_ipv4_hdr_len(const struct rte_ipv4_hdr *ipv4_hdr) +{ + return (uint8_t)((ipv4_hdr->version_ihl & RTE_IPV4_HDR_IHL_MASK) * + RTE_IPV4_IHL_MULTIPLIER); +} + /** * @internal Calculate a sum of all words in the buffer. * Helper routine for the rte_raw_cksum(). @@ -272,7 +287,7 @@ static inline uint16_t rte_ipv4_cksum(const struct rte_ipv4_hdr *ipv4_hdr) { uint16_t cksum; - cksum = rte_raw_cksum(ipv4_hdr, (ipv4_hdr->version_ihl & 0xf) * 4); + cksum = rte_raw_cksum(ipv4_hdr, rte_ipv4_hdr_len(ipv4_hdr)); return (uint16_t)~cksum; } @@ -306,7 +321,6 @@ rte_ipv4_phdr_cksum(const struct rte_ipv4_hdr *ipv4_hdr, uint64_t ol_flags) } psd_hdr; uint32_t l3_len; - uint8_t ip_hdr_len; psd_hdr.src_addr = ipv4_hdr->src_addr; psd_hdr.dst_addr = ipv4_hdr->dst_addr; @@ -316,8 +330,8 @@ rte_ipv4_phdr_cksum(const struct rte_ipv4_hdr *ipv4_hdr, uint64_t ol_flags) psd_hdr.len = 0; } else { l3_len = rte_be_to_cpu_16(ipv4_hdr->total_length); - ip_hdr_len = (ipv4_hdr->version_ihl & 0xf) * 4; - psd_hdr.len = rte_cpu_to_be_16((uint16_t)(l3_len - ip_hdr_len)); + psd_hdr.len = rte_cpu_to_be_16((uint16_t)(l3_len - + rte_ipv4_hdr_len(ipv4_hdr))); } return rte_raw_cksum(&psd_hdr, sizeof(psd_hdr)); } @@ -342,7 +356,7 @@ rte_ipv4_udptcp_cksum(const struct rte_ipv4_hdr *ipv4_hdr, const void *l4_hdr) uint32_t l3_len, l4_len; uint8_t ip_hdr_len; - ip_hdr_len = (ipv4_hdr->version_ihl & 0xf) * 4; + ip_hdr_len = rte_ipv4_hdr_len(ipv4_hdr); l3_len = rte_be_to_cpu_16(ipv4_hdr->total_length); if (l3_len < ip_hdr_len) return 0; @@ -464,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