On 23 Jun 2023, at 10:44, Eelco Chaudron wrote:

> On 19 Jun 2023, at 13:56, Roi Dayan wrote:
>
>> From: Gavin Li <[email protected]>
>>
>> Add TC offload support for vxlan encap with gbp option
>>
>> Signed-off-by: Gavin Li <[email protected]>
>> Reviewed-by: Gavi Teitz <[email protected]>
>> Reviewed-by: Roi Dayan <[email protected]>
>> Reviewed-by: Simon Horman <[email protected]>
>
> Thanks for following up! The changes look good to me, one small nit, but not 
> worth sending a new rev (maybe it can be fixed during commit).

Missed one more style issue, see below…

> Acked-by: Eelco Chaudron <[email protected]>
>
>> ---
>>  acinclude.m4                         |  7 ++++
>>  include/linux/tc_act/tc_tunnel_key.h | 17 +++++++-
>>  lib/netdev-offload-tc.c              | 31 ++++++++++++++-
>>  lib/odp-util.c                       | 41 ++++++++++++++------
>>  lib/odp-util.h                       |  3 ++
>>  lib/tc.c                             | 58 ++++++++++++++++++++++++++++
>>  lib/tc.h                             |  1 +
>>  7 files changed, 143 insertions(+), 15 deletions(-)
>>
>> diff --git a/acinclude.m4 b/acinclude.m4
>> index ac1eab790041..690a13c25967 100644
>> --- a/acinclude.m4
>> +++ b/acinclude.m4
>> @@ -191,6 +191,13 @@ AC_DEFUN([OVS_CHECK_LINUX_TC], [
>>      [AC_DEFINE([HAVE_TCA_TUNNEL_KEY_ENC_TTL], [1],
>>                 [Define to 1 if TCA_TUNNEL_KEY_ENC_TTL is available.])])
>>
>> +  AC_COMPILE_IFELSE([
>> +    AC_LANG_PROGRAM([#include <linux/tc_act/tc_tunnel_key.h>], [
>> +        int x = TCA_TUNNEL_KEY_ENC_OPTS_VXLAN;
>> +    ])],
>> +    [AC_DEFINE([HAVE_TCA_TUNNEL_KEY_ENC_OPTS_VXLAN], [1],
>> +               [Define to 1 if TCA_TUNNEL_KEY_ENC_OPTS_VXLAN is 
>> available.])])
>> +
>>    AC_COMPILE_IFELSE([
>>      AC_LANG_PROGRAM([#include <linux/tc_act/tc_pedit.h>], [
>>          int x = TCA_PEDIT_KEY_EX_HDR_TYPE_UDP;
>> diff --git a/include/linux/tc_act/tc_tunnel_key.h 
>> b/include/linux/tc_act/tc_tunnel_key.h
>> index f13acf17dd75..17291b90bf3c 100644
>> --- a/include/linux/tc_act/tc_tunnel_key.h
>> +++ b/include/linux/tc_act/tc_tunnel_key.h
>> @@ -1,7 +1,7 @@
>>  #ifndef __LINUX_TC_ACT_TC_TUNNEL_KEY_WRAPPER_H
>>  #define __LINUX_TC_ACT_TC_TUNNEL_KEY_WRAPPER_H 1
>>
>> -#if defined(__KERNEL__) || defined(HAVE_TCA_TUNNEL_KEY_ENC_TTL)
>> +#if defined(__KERNEL__) || defined(HAVE_TCA_TUNNEL_KEY_ENC_OPTS_VXLAN)
>>  #include_next <linux/tc_act/tc_tunnel_key.h>
>>  #else
>>
>> @@ -53,6 +53,10 @@ enum {
>>                                       * TCA_TUNNEL_KEY_ENC_OPTS_GENEVE
>>                                       * attributes
>>                                       */
>> +    TCA_TUNNEL_KEY_ENC_OPTS_VXLAN,  /* Nested
>> +                                     * TCA_TUNNEL_KEY_ENC_OPTS_VXLAN
>> +                                     * attributes
>> +                                     */
>>      __TCA_TUNNEL_KEY_ENC_OPTS_MAX,
>>  };
>>
>> @@ -70,6 +74,15 @@ enum {
>>  #define TCA_TUNNEL_KEY_ENC_OPT_GENEVE_MAX \
>>      (__TCA_TUNNEL_KEY_ENC_OPT_GENEVE_MAX - 1)
>>
>> -#endif /* __KERNEL__ || HAVE_TCA_TUNNEL_KEY_ENC_TTL */
>> +enum {
>> +    TCA_TUNNEL_KEY_ENC_OPT_VXLAN_UNSPEC,
>> +    TCA_TUNNEL_KEY_ENC_OPT_VXLAN_GBP,       /* u32 */
>> +    __TCA_TUNNEL_KEY_ENC_OPT_VXLAN_MAX,
>> +};
>> +
>> +#define TCA_TUNNEL_KEY_ENC_OPT_VXLAN_MAX \
>> +    (__TCA_TUNNEL_KEY_ENC_OPT_VXLAN_MAX - 1)
>> +
>> +#endif /* __KERNEL__ || HAVE_TCA_TUNNEL_KEY_ENC_OPTS_VXLAN */
>>
>>  #endif /* __LINUX_TC_ACT_TC_TUNNEL_KEY_WRAPPER_H */
>> diff --git a/lib/netdev-offload-tc.c b/lib/netdev-offload-tc.c
>> index 1c97681bc92b..a32ed8021c4b 100644
>> --- a/lib/netdev-offload-tc.c
>> +++ b/lib/netdev-offload-tc.c
>> @@ -668,6 +668,24 @@ static void parse_tc_flower_geneve_opts(struct 
>> tc_action *action,
>>      nl_msg_end_nested(buf, geneve_off);
>>  }
>>
>> +static void
>> +parse_tc_flower_vxlan_tun_opts(struct tc_action *action,
>> +                                  struct ofpbuf *buf)

Indentation is off here.

>> +{
>> +    size_t gbp_off;
>> +    uint32_t gbp_raw;
>> +
>> +    if (!action->encap.gbp.id_present) {
>> +        return;
>> +    }
>> +
>> +    gbp_off = nl_msg_start_nested(buf, OVS_TUNNEL_KEY_ATTR_VXLAN_OPTS);
>> +    gbp_raw = odp_encode_gbp_raw(action->encap.gbp.flags,
>> +                                 action->encap.gbp.id);
>> +    nl_msg_put_u32(buf, OVS_VXLAN_EXT_GBP, gbp_raw);
>> +    nl_msg_end_nested(buf, gbp_off);
>> +}
>> +
>>  static void
>>  flower_tun_opt_to_match(struct match *match, struct tc_flower *flower)
>>  {
>> @@ -863,7 +881,7 @@ parse_tc_flower_to_actions__(struct tc_flower *flower, 
>> struct ofpbuf *buf,
>>              if (!action->encap.no_csum) {
>>                  nl_msg_put_flag(buf, OVS_TUNNEL_KEY_ATTR_CSUM);
>>              }
>> -
>> +            parse_tc_flower_vxlan_tun_opts(action, buf);
>>              parse_tc_flower_geneve_opts(action, buf);
>>              nl_msg_end_nested(buf, tunnel_offset);
>>              nl_msg_end_nested(buf, set_offset);
>> @@ -1552,6 +1570,7 @@ parse_put_flow_set_action(struct tc_flower *flower, 
>> struct tc_action *action,
>>
>>      action->type = TC_ACT_ENCAP;
>>      action->encap.id_present = false;
>> +    action->encap.gbp.id_present = false;
>>      action->encap.no_csum = 1;
>>      flower->action_count++;
>>      NL_ATTR_FOR_EACH_UNSAFE(tun_attr, tun_left, tunnel, tunnel_len) {
>> @@ -1613,6 +1632,16 @@ parse_put_flow_set_action(struct tc_flower *flower, 
>> struct tc_action *action,
>>              action->encap.data.present.len = nl_attr_get_size(tun_attr);
>>          }
>>          break;
>> +        case OVS_TUNNEL_KEY_ATTR_VXLAN_OPTS: {
>> +            if (odp_vxlan_tun_opts_from_attr(tun_attr,
>> +                                             &action->encap.gbp.id,
>> +                                             &action->encap.gbp.flags,
>> +                                             
>> &action->encap.gbp.id_present)) {
>> +                VLOG_ERR_RL(&rl, "error parsing VXLAN options");
>> +                return EINVAL;
>> +            }
>> +        }
>> +        break;
>>          default:
>>              VLOG_DBG_RL(&rl, "unsupported tunnel key attribute %d",
>>                          nl_attr_type(tun_attr));
>> diff --git a/lib/odp-util.c b/lib/odp-util.c
>> index d2414eb559ba..db6fce138476 100644
>> --- a/lib/odp-util.c
>> +++ b/lib/odp-util.c
>> @@ -3149,22 +3149,13 @@ odp_tun_key_from_attr__(const struct nlattr *attr, 
>> bool is_mask,
>>              tun->flags |= FLOW_TNL_F_OAM;
>>              break;
>>          case OVS_TUNNEL_KEY_ATTR_VXLAN_OPTS: {
>> -            static const struct nl_policy vxlan_opts_policy[] = {
>> -                [OVS_VXLAN_EXT_GBP] = { .type = NL_A_U32 },
>> -            };
>> -            struct nlattr *ext[ARRAY_SIZE(vxlan_opts_policy)];
>> -
>> -            if (!nl_parse_nested(a, vxlan_opts_policy, ext, 
>> ARRAY_SIZE(ext))) {
>> +            if (odp_vxlan_tun_opts_from_attr(a, &tun->gbp_id,
>> +                                             &tun->gbp_flags,
>> +                                             NULL)) {
>>                  odp_parse_error(&rl, errorp, "error parsing VXLAN options");
>>                  return ODP_FIT_ERROR;
>>              }
>>
>> -            if (ext[OVS_VXLAN_EXT_GBP]) {
>> -                uint32_t gbp = nl_attr_get_u32(ext[OVS_VXLAN_EXT_GBP]);
>> -
>> -                odp_decode_gbp_raw(gbp, &tun->gbp_id, &tun->gbp_flags);
>> -            }
>> -
>
> nit: remove the newline before the break below.
>
>>              break;
>>          }
>>          case OVS_TUNNEL_KEY_ATTR_GENEVE_OPTS:
>> @@ -8844,3 +8835,29 @@ commit_odp_actions(const struct flow *flow, struct 
>> flow *base,
>>
>>      return slow1 ? slow1 : slow2;
>>  }
>> +
>> +int
>> +odp_vxlan_tun_opts_from_attr(const struct nlattr *tun_attr, ovs_be16 *id,
>> +                             uint8_t *flags, bool *id_present)
>> +{
>> +    static const struct nl_policy vxlan_opts_policy[] = {
>> +        [OVS_VXLAN_EXT_GBP] = { .type = NL_A_U32 },
>> +    };
>> +    struct nlattr *ext[ARRAY_SIZE(vxlan_opts_policy)];
>> +
>> +    if (!nl_parse_nested(tun_attr, vxlan_opts_policy, ext, 
>> ARRAY_SIZE(ext))) {
>> +        return EINVAL;
>> +    }
>> +
>> +    if (ext[OVS_VXLAN_EXT_GBP]) {
>> +        uint32_t gbp_raw = nl_attr_get_u32(ext[OVS_VXLAN_EXT_GBP]);
>> +
>> +        odp_decode_gbp_raw(gbp_raw, id, flags);
>> +    }
>> +
>> +    if (id_present) {
>> +        *id_present = !!ext[OVS_VXLAN_EXT_GBP];
>> +    }
>> +
>> +    return 0;
>> +}
>> diff --git a/lib/odp-util.h b/lib/odp-util.h
>> index 163efe7a87b5..8c7baa680ddb 100644
>> --- a/lib/odp-util.h
>> +++ b/lib/odp-util.h
>> @@ -292,6 +292,9 @@ enum slow_path_reason commit_odp_actions(const struct 
>> flow *,
>>                                           bool pending_decap,
>>                                           struct ofpbuf *encap_data);
>>  
>> +int odp_vxlan_tun_opts_from_attr(const struct nlattr *tun_attr, ovs_be16 
>> *id,
>> +                                 uint8_t *flags, bool *id_present);
>> +
>>  /* ofproto-dpif interface.
>>   *
>>   * The following types and functions are logically part of ofproto-dpif.
>> diff --git a/lib/tc.c b/lib/tc.c
>> index 7434b0150f74..2da43e557c3d 100644
>> --- a/lib/tc.c
>> +++ b/lib/tc.c
>> @@ -1290,6 +1290,35 @@ nl_parse_act_geneve_opts(const struct nlattr 
>> *in_nlattr,
>>      return 0;
>>  }
>>
>> +static int
>> +nl_parse_act_vxlan_opts(struct nlattr *in_nlattr, struct tc_action *action)
>> +{
>> +    const struct ofpbuf *msg;
>> +    struct nlattr *nla;
>> +    struct ofpbuf buf;
>> +    size_t left;
>> +
>> +    nl_attr_get_nested(in_nlattr, &buf);
>> +    msg = &buf;
>> +
>> +    NL_ATTR_FOR_EACH (nla, left, ofpbuf_at(msg, 0, 0), msg->size) {
>> +        uint16_t type = nl_attr_type(nla);
>> +        int32_t gbp_raw;
>> +
>> +        switch (type) {
>> +        case TCA_FLOWER_KEY_ENC_OPT_VXLAN_GBP:
>> +            gbp_raw = nl_attr_get_u32(nla);
>> +            odp_decode_gbp_raw(gbp_raw, &action->encap.gbp.id,
>> +                               &action->encap.gbp.flags);
>> +            action->encap.gbp.id_present = true;
>> +
>> +            break;
>> +        }
>> +    }
>> +
>> +    return 0;
>> +}
>> +
>>  static int
>>  nl_parse_act_tunnel_opts(struct nlattr *options, struct tc_action *action)
>>  {
>> @@ -1315,6 +1344,13 @@ nl_parse_act_tunnel_opts(struct nlattr *options, 
>> struct tc_action *action)
>>                  return err;
>>              }
>>
>> +            break;
>> +        case TCA_TUNNEL_KEY_ENC_OPTS_VXLAN:
>> +            err = nl_parse_act_vxlan_opts(nla, action);
>> +            if (err) {
>> +                return err;
>> +            }
>> +
>
> nit: same here, but if changes, the case above needs fixing too.
>
>>              break;
>>          }
>>      }
>> @@ -2640,6 +2676,27 @@ nl_msg_put_act_tunnel_geneve_option(struct ofpbuf 
>> *request,
>>      nl_msg_end_nested(request, outer);
>>  }
>>
>> +static void
>> +nl_msg_put_act_tunnel_vxlan_opts(struct ofpbuf *request,
>> +                                 struct tc_action_encap *encap)
>> +{
>> +    size_t outer, inner;
>> +    uint32_t gbp_raw;
>> +
>> +    if (!encap->gbp.id_present) {
>> +        return;
>> +    }
>> +
>> +    gbp_raw = odp_encode_gbp_raw(encap->gbp.flags,
>> +                                 encap->gbp.id);
>> +    outer = nl_msg_start_nested_with_flag(request, TCA_TUNNEL_KEY_ENC_OPTS);
>> +    inner = nl_msg_start_nested_with_flag(request,
>> +                                          TCA_TUNNEL_KEY_ENC_OPTS_VXLAN);
>> +    nl_msg_put_u32(request, TCA_TUNNEL_KEY_ENC_OPT_VXLAN_GBP, gbp_raw);
>> +    nl_msg_end_nested(request, inner);
>> +    nl_msg_end_nested(request, outer);
>> +}
>> +
>>  static void
>>  nl_msg_put_act_tunnel_key_set(struct ofpbuf *request,
>>                                struct tc_action_encap *encap,
>> @@ -2680,6 +2737,7 @@ nl_msg_put_act_tunnel_key_set(struct ofpbuf *request,
>>              nl_msg_put_be16(request, TCA_TUNNEL_KEY_ENC_DST_PORT,
>>                              encap->tp_dst);
>>          }
>> +        nl_msg_put_act_tunnel_vxlan_opts(request, encap);
>>          nl_msg_put_act_tunnel_geneve_option(request, &encap->data);
>>          nl_msg_put_u8(request, TCA_TUNNEL_KEY_NO_CSUM, encap->no_csum);
>>      }
>> diff --git a/lib/tc.h b/lib/tc.h
>> index 1d648282a004..06707ffa4678 100644
>> --- a/lib/tc.h
>> +++ b/lib/tc.h
>> @@ -227,6 +227,7 @@ struct tc_action_encap {
>>          struct in6_addr ipv6_dst;
>>      } ipv6;
>>      struct tun_metadata data;
>> +    struct tc_tunnel_gbp gbp;
>>  };
>>
>>  struct tc_action {
>> -- 
>> 2.38.0

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to