> -----Original Message-----
> From: Smoczynski, MarcinX
> Sent: Monday, June 24, 2019 2:40 PM
> To: Kovacevic, Marko <[email protected]>; [email protected]; 
> Richardson, Bruce <[email protected]>; De Lara
> Guarch, Pablo <[email protected]>; Nicolau, Radu 
> <[email protected]>; [email protected]; Kantecki, Tomasz
> <[email protected]>; Ananyev, Konstantin 
> <[email protected]>; Iremonger, Bernard
> <[email protected]>; [email protected]
> Cc: [email protected]; Smoczynski, MarcinX <[email protected]>
> 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 <[email protected]>
> ---
>  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 <[email protected]>
Tested-by: Konstantin Ananyev <[email protected]>

> 2.17.1

Reply via email to