[dpdk-dev] [PATCH v2 1/4] net: new ipv6 header extension parsing function
Ananyev, Konstantin
konstantin.ananyev at intel.com
Mon Jun 24 20:54:21 CEST 2019
> -----Original Message-----
> From: Smoczynski, MarcinX
> Sent: Monday, June 24, 2019 2:40 PM
> To: Kovacevic, Marko <marko.kovacevic at intel.com>; orika at mellanox.com; Richardson, Bruce <bruce.richardson at intel.com>; De Lara
> Guarch, Pablo <pablo.de.lara.guarch at intel.com>; Nicolau, Radu <radu.nicolau at intel.com>; akhil.goyal at nxp.com; Kantecki, Tomasz
> <tomasz.kantecki at intel.com>; Ananyev, Konstantin <konstantin.ananyev at intel.com>; Iremonger, Bernard
> <bernard.iremonger at intel.com>; olivier.matz at 6wind.com
> Cc: dev at dpdk.org; Smoczynski, MarcinX <marcinx.smoczynski at intel.com>
> Subject: [PATCH v2 1/4] net: new ipv6 header extension parsing function
>
> Introduce new function for IPv6 header extension parsing able to
> determine extension length and next protocol number.
>
> This function is helpful when implementing IPv6 header traversing.
>
> Signed-off-by: Marcin Smoczynski <marcinx.smoczynski at intel.com>
> ---
> lib/librte_net/rte_ip.h | 49 +++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 49 insertions(+)
>
> diff --git a/lib/librte_net/rte_ip.h b/lib/librte_net/rte_ip.h
> index ae3b7e730..c2c67b85d 100644
> --- a/lib/librte_net/rte_ip.h
> +++ b/lib/librte_net/rte_ip.h
> @@ -428,6 +428,55 @@ 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
> + */
> +static inline int __rte_experimental
> +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
> --
Acked-by: Konstantin Ananyev <konstantin.ananyev at intel.com>
Tested-by: Konstantin Ananyev <konstantin.ananyev at intel.com>
> 2.17.1
More information about the dev
mailing list