[SRU][F:linux-bluefield][PATCH v1 1/1] UBUNTU: net: sched: allow flower to match vxlan options

Tony Duan yifeid at nvidia.com
Fri Mar 31 23:41:07 UTC 2023


Thanks, Cascardo, for the comments.
My mistake. I have sent v2.

-----Original Message-----
From: Thadeu Lima de Souza Cascardo <cascardo at canonical.com> 
Sent: Saturday, April 1, 2023 5:30 AM
To: Tony Duan <yifeid at nvidia.com>
Cc: kernel-team at lists.ubuntu.com; Bodong Wang <bodong at nvidia.com>; Vladimir Sokolovsky <vlad at nvidia.com>; dann.frazier at canonical.com
Subject: Re: [SRU][F:linux-bluefield][PATCH v1 1/1] UBUNTU: net: sched: allow flower to match vxlan options

External email: Use caution opening links or attachments


Subject: [SRU][F:linux-bluefield][PATCH v1 1/1] UBUNTU: net: sched: allow flower to match vxlan options

What is up with the UBUNTU: prefix here? This is not required and should not be added on commits coming from upstream.

Cascardo.

On Fri, Mar 31, 2023 at 05:41:58AM +0000, Tony Duan wrote:
> From: Xin Long <lucien.xin at gmail.com>
>
> BugLink: https://bugs.launchpad.net/bugs/2013422
>
> This patch is to allow matching gbp option in vxlan.
>
> The options can be described in the form GBP/GBP_MASK, where GBP is 
> represented as a 32bit hexadecimal value.
> Different from geneve, only one option can be set. And also, geneve 
> options and vxlan options can't be set at the same time.
>
>   # ip link add name vxlan0 type vxlan dstport 0 external
>   # tc qdisc add dev vxlan0 ingress
>   # tc filter add dev vxlan0 protocol ip parent ffff: \
>       flower \
>         enc_src_ip 10.0.99.192 \
>         enc_dst_ip 10.0.99.193 \
>         enc_key_id 11 \
>         vxlan_opts 01020304/ffffffff \
>         ip_proto udp \
>         action mirred egress redirect dev eth0
>
> v1->v2:
>   - add .strict_start_type for enc_opts_policy as Jakub noticed.
>   - use Duplicate instead of Wrong in err msg for extack as Jakub
>     suggested.
>
> Signed-off-by: Xin Long <lucien.xin at gmail.com>
> Signed-off-by: David S. Miller <davem at davemloft.net> (cherry picked 
> from commit d8f9dfae49ce4ffb772dc10dd6578dc815b34c12)
> Signed-off-by: Tony Duan <yifeid at nvidia.com>
> ---
>  include/uapi/linux/pkt_cls.h |  13 +++++
>  net/sched/cls_flower.c       | 109 +++++++++++++++++++++++++++++++++++
>  2 files changed, 122 insertions(+)
>
> diff --git a/include/uapi/linux/pkt_cls.h 
> b/include/uapi/linux/pkt_cls.h index b089c2dfb249..117b9922f409 100644
> --- a/include/uapi/linux/pkt_cls.h
> +++ b/include/uapi/linux/pkt_cls.h
> @@ -577,6 +577,10 @@ enum {
>                                        * TCA_FLOWER_KEY_ENC_OPT_GENEVE_
>                                        * attributes
>                                        */
> +     TCA_FLOWER_KEY_ENC_OPTS_VXLAN,  /* Nested
> +                                      * TCA_FLOWER_KEY_ENC_OPT_VXLAN_
> +                                      * attributes
> +                                      */
>       __TCA_FLOWER_KEY_ENC_OPTS_MAX,
>  };
>
> @@ -594,6 +598,15 @@ enum {
>  #define TCA_FLOWER_KEY_ENC_OPT_GENEVE_MAX \
>               (__TCA_FLOWER_KEY_ENC_OPT_GENEVE_MAX - 1)
>
> +enum {
> +     TCA_FLOWER_KEY_ENC_OPT_VXLAN_UNSPEC,
> +     TCA_FLOWER_KEY_ENC_OPT_VXLAN_GBP,               /* u32 */
> +     __TCA_FLOWER_KEY_ENC_OPT_VXLAN_MAX,
> +};
> +
> +#define TCA_FLOWER_KEY_ENC_OPT_VXLAN_MAX \
> +             (__TCA_FLOWER_KEY_ENC_OPT_VXLAN_MAX - 1)
> +
>  enum {
>       TCA_FLOWER_KEY_FLAGS_IS_FRAGMENT = (1 << 0),
>       TCA_FLOWER_KEY_FLAGS_FRAG_IS_FIRST = (1 << 1), diff --git 
> a/net/sched/cls_flower.c b/net/sched/cls_flower.c index 
> 0b428f5ca73b..27017350df58 100644
> --- a/net/sched/cls_flower.c
> +++ b/net/sched/cls_flower.c
> @@ -23,6 +23,7 @@
>  #include <net/ip.h>
>  #include <net/flow_dissector.h>
>  #include <net/geneve.h>
> +#include <net/vxlan.h>
>
>  #include <net/dst.h>
>  #include <net/dst_metadata.h>
> @@ -709,7 +710,10 @@ static const struct nla_policy 
> fl_policy[TCA_FLOWER_MAX + 1] = {
>
>  static const struct nla_policy
>  enc_opts_policy[TCA_FLOWER_KEY_ENC_OPTS_MAX + 1] = {
> +     [TCA_FLOWER_KEY_ENC_OPTS_UNSPEC]        = {
> +             .strict_start_type = TCA_FLOWER_KEY_ENC_OPTS_VXLAN },
>       [TCA_FLOWER_KEY_ENC_OPTS_GENEVE]        = { .type = NLA_NESTED },
> +     [TCA_FLOWER_KEY_ENC_OPTS_VXLAN]         = { .type = NLA_NESTED },
>  };
>
>  static const struct nla_policy
> @@ -720,6 +724,11 @@ geneve_opt_policy[TCA_FLOWER_KEY_ENC_OPT_GENEVE_MAX + 1] = {
>                                                      .len = 128 },  };
>
> +static const struct nla_policy
> +vxlan_opt_policy[TCA_FLOWER_KEY_ENC_OPT_VXLAN_MAX + 1] = {
> +     [TCA_FLOWER_KEY_ENC_OPT_VXLAN_GBP]         = { .type = NLA_U32 },
> +};
> +
>  static void fl_set_key_val(struct nlattr **tb,
>                          void *val, int val_type,
>                          void *mask, int mask_type, int len) @@ -957,6 
> +966,41 @@ static int fl_set_geneve_opt(const struct nlattr *nla, struct fl_flow_key *key,
>       return sizeof(struct geneve_opt) + data_len;  }
>
> +static int fl_set_vxlan_opt(const struct nlattr *nla, struct fl_flow_key *key,
> +                         int depth, int option_len,
> +                         struct netlink_ext_ack *extack) {
> +     struct nlattr *tb[TCA_FLOWER_KEY_ENC_OPT_VXLAN_MAX + 1];
> +     struct vxlan_metadata *md;
> +     int err;
> +
> +     md = (struct vxlan_metadata *)&key->enc_opts.data[key->enc_opts.len];
> +     memset(md, 0xff, sizeof(*md));
> +
> +     if (!depth)
> +             return sizeof(*md);
> +
> +     if (nla_type(nla) != TCA_FLOWER_KEY_ENC_OPTS_VXLAN) {
> +             NL_SET_ERR_MSG(extack, "Non-vxlan option type for mask");
> +             return -EINVAL;
> +     }
> +
> +     err = nla_parse_nested(tb, TCA_FLOWER_KEY_ENC_OPT_VXLAN_MAX, nla,
> +                            vxlan_opt_policy, extack);
> +     if (err < 0)
> +             return err;
> +
> +     if (!option_len && !tb[TCA_FLOWER_KEY_ENC_OPT_VXLAN_GBP]) {
> +             NL_SET_ERR_MSG(extack, "Missing tunnel key vxlan option gbp");
> +             return -EINVAL;
> +     }
> +
> +     if (tb[TCA_FLOWER_KEY_ENC_OPT_VXLAN_GBP])
> +             md->gbp = 
> + nla_get_u32(tb[TCA_FLOWER_KEY_ENC_OPT_VXLAN_GBP]);
> +
> +     return sizeof(*md);
> +}
> +
>  static int fl_set_enc_opt(struct nlattr **tb, struct fl_flow_key *key,
>                         struct fl_flow_key *mask,
>                         struct netlink_ext_ack *extack) @@ -987,6 
> +1031,11 @@ static int fl_set_enc_opt(struct nlattr **tb, struct fl_flow_key *key,
>                         nla_len(tb[TCA_FLOWER_KEY_ENC_OPTS]), key_depth) {
>               switch (nla_type(nla_opt_key)) {
>               case TCA_FLOWER_KEY_ENC_OPTS_GENEVE:
> +                     if (key->enc_opts.dst_opt_type &&
> +                         key->enc_opts.dst_opt_type != TUNNEL_GENEVE_OPT) {
> +                             NL_SET_ERR_MSG(extack, "Duplicate type for geneve options");
> +                             return -EINVAL;
> +                     }
>                       option_len = 0;
>                       key->enc_opts.dst_opt_type = TUNNEL_GENEVE_OPT;
>                       option_len = fl_set_geneve_opt(nla_opt_key, key, 
> @@ -1012,6 +1061,39 @@ static int fl_set_enc_opt(struct nlattr **tb, struct fl_flow_key *key,
>                               return -EINVAL;
>                       }
>
> +                     if (msk_depth)
> +                             nla_opt_msk = nla_next(nla_opt_msk, &msk_depth);
> +                     break;
> +             case TCA_FLOWER_KEY_ENC_OPTS_VXLAN:
> +                     if (key->enc_opts.dst_opt_type) {
> +                             NL_SET_ERR_MSG(extack, "Duplicate type for vxlan options");
> +                             return -EINVAL;
> +                     }
> +                     option_len = 0;
> +                     key->enc_opts.dst_opt_type = TUNNEL_VXLAN_OPT;
> +                     option_len = fl_set_vxlan_opt(nla_opt_key, key,
> +                                                   key_depth, option_len,
> +                                                   extack);
> +                     if (option_len < 0)
> +                             return option_len;
> +
> +                     key->enc_opts.len += option_len;
> +                     /* At the same time we need to parse through the mask
> +                      * in order to verify exact and mask attribute lengths.
> +                      */
> +                     mask->enc_opts.dst_opt_type = TUNNEL_VXLAN_OPT;
> +                     option_len = fl_set_vxlan_opt(nla_opt_msk, mask,
> +                                                   msk_depth, option_len,
> +                                                   extack);
> +                     if (option_len < 0)
> +                             return option_len;
> +
> +                     mask->enc_opts.len += option_len;
> +                     if (key->enc_opts.len != mask->enc_opts.len) {
> +                             NL_SET_ERR_MSG(extack, "Key and mask miss aligned");
> +                             return -EINVAL;
> +                     }
> +
>                       if (msk_depth)
>                               nla_opt_msk = nla_next(nla_opt_msk, &msk_depth);
>                       break;
> @@ -2222,6 +2304,28 @@ static int fl_dump_key_geneve_opt(struct sk_buff *skb,
>       return -EMSGSIZE;
>  }
>
> +static int fl_dump_key_vxlan_opt(struct sk_buff *skb,
> +                              struct flow_dissector_key_enc_opts 
> +*enc_opts) {
> +     struct vxlan_metadata *md;
> +     struct nlattr *nest;
> +
> +     nest = nla_nest_start_noflag(skb, TCA_FLOWER_KEY_ENC_OPTS_VXLAN);
> +     if (!nest)
> +             goto nla_put_failure;
> +
> +     md = (struct vxlan_metadata *)&enc_opts->data[0];
> +     if (nla_put_u32(skb, TCA_FLOWER_KEY_ENC_OPT_VXLAN_GBP, md->gbp))
> +             goto nla_put_failure;
> +
> +     nla_nest_end(skb, nest);
> +     return 0;
> +
> +nla_put_failure:
> +     nla_nest_cancel(skb, nest);
> +     return -EMSGSIZE;
> +}
> +
>  static int fl_dump_key_ct(struct sk_buff *skb,
>                         struct flow_dissector_key_ct *key,
>                         struct flow_dissector_key_ct *mask) @@ -2275,6 
> +2379,11 @@ static int fl_dump_key_options(struct sk_buff *skb, int enc_opt_type,
>               if (err)
>                       goto nla_put_failure;
>               break;
> +     case TUNNEL_VXLAN_OPT:
> +             err = fl_dump_key_vxlan_opt(skb, enc_opts);
> +             if (err)
> +                     goto nla_put_failure;
> +             break;
>       default:
>               goto nla_put_failure;
>       }
> --
> 2.25.1
>
>
> --
> kernel-team mailing list
> kernel-team at lists.ubuntu.com
> https://lists.ubuntu.com/mailman/listinfo/kernel-team



More information about the kernel-team mailing list