On Thu, Oct 03, 2019 at 02:58:00PM -0700, Tom Herbert wrote:
> From: Tom Herbert <t...@quantonium.net>
> 
> Create a generic TLV parser. This will be used with various
> extension headers that carry options including Destination,
> Hop-by-Hop, Segment Routing TLVs, and other cases of simple
> stateless parsing.
> 
> Signed-off-by: Tom Herbert <t...@herbertland.com>
> ---
>  include/net/ipeh.h        |  25 ++++++++
>  net/ipv6/exthdrs.c        | 159 
> +++++++++++-----------------------------------
>  net/ipv6/exthdrs_common.c | 114 +++++++++++++++++++++++++++++++++
>  3 files changed, 177 insertions(+), 121 deletions(-)
> 
> diff --git a/include/net/ipeh.h b/include/net/ipeh.h
> index 3b24831..c1aa7b6 100644
> --- a/include/net/ipeh.h
> +++ b/include/net/ipeh.h
> @@ -31,4 +31,29 @@ struct ipv6_txoptions *ipeh_renew_options(struct sock *sk,
>  struct ipv6_txoptions *ipeh_fixup_options(struct ipv6_txoptions *opt_space,
>                                         struct ipv6_txoptions *opt);
>  
> +/* Generic extension header TLV parser */
> +
> +enum ipeh_parse_errors {
> +     IPEH_PARSE_ERR_PAD1,            /* Excessive PAD1 */
> +     IPEH_PARSE_ERR_PADN,            /* Excessive PADN */
> +     IPEH_PARSE_ERR_PADNZ,           /* Non-zero padding data */
> +     IPEH_PARSE_ERR_EH_TOOBIG,       /* Length of EH exceeds limit */
> +     IPEH_PARSE_ERR_OPT_TOOBIG,      /* Option size exceeds limit */
> +     IPEH_PARSE_ERR_OPT_TOOMANY,     /* Option count exceeds limit */
> +     IPEH_PARSE_ERR_OPT_UNK_DISALW,  /* Unknown option disallowed */
> +     IPEH_PARSE_ERR_OPT_UNK,         /* Unknown option */
> +};
> +
> +/* The generic TLV parser assumes that the type value of PAD1 is 0, and PADN
> + * is 1. This is true for Destination, Hop-by-Hop and current definition
> + * of Segment Routing TLVs.
> + */
> +#define IPEH_TLV_PAD1        0
> +#define IPEH_TLV_PADN        1
> +
> +bool ipeh_parse_tlv(const struct tlvtype_proc *procs, struct sk_buff *skb,
> +                 int max_count, int off, int len,
> +                 bool (*parse_error)(struct sk_buff *skb,
> +                                     int off, enum ipeh_parse_errors error));
> +
>  #endif /* _NET_IPEH_H */

Hi Tom,

Unless I misread things, which is entirely possible, it seems
as well as moving code around this patch changes behaviour under
some error conditions via the parse_error callback and
the ipv6_parse_error() implementation of it below.

I think such a change is worth of at lest calling out in the changelog
and perhaps braking out into a separate patch.

...

Reply via email to