On 10/14/24 14:09, Eelco Chaudron wrote:
> This patch adds "Don't Fragment" (DF) flag support to the encap action,
> if supported by the kernel. If the kernel does not support this,
> it falls back to the previous behavior of ignoring the DF request.
>
> Acked-by: Roi Dayan <[email protected]>
> Signed-off-by: Eelco Chaudron <[email protected]>
> ---
> acinclude.m4 | 6 +++---
> include/linux/tc_act/tc_tunnel_key.h | 3 ++-
> lib/netdev-offload-tc.c | 16 +++++++++++-----
> lib/tc.c | 6 ++++++
> lib/tc.h | 1 +
> 5 files changed, 23 insertions(+), 9 deletions(-)
>
> diff --git a/acinclude.m4 b/acinclude.m4
> index f4cb4a146..8658bcfcb 100644
> --- a/acinclude.m4
> +++ b/acinclude.m4
> @@ -193,10 +193,10 @@ AC_DEFUN([OVS_CHECK_LINUX_TC], [
>
> AC_COMPILE_IFELSE([
> AC_LANG_PROGRAM([#include <linux/tc_act/tc_tunnel_key.h>], [
> - int x = TCA_TUNNEL_KEY_ENC_OPTS_VXLAN;
> + int x = TCA_TUNNEL_KEY_NO_FRAG;
> ])],
> - [AC_DEFINE([HAVE_TCA_TUNNEL_KEY_ENC_OPTS_VXLAN], [1],
> - [Define to 1 if TCA_TUNNEL_KEY_ENC_OPTS_VXLAN is
> available.])])
> + [AC_DEFINE([HAVE_TCA_TUNNEL_KEY_NO_FRAG], [1],
> + [Define to 1 if TCA_TUNNEL_KEY_NO_FRAG is available.])])
>
> AC_COMPILE_IFELSE([
> AC_LANG_PROGRAM([#include <linux/tc_act/tc_pedit.h>], [
> diff --git a/include/linux/tc_act/tc_tunnel_key.h
> b/include/linux/tc_act/tc_tunnel_key.h
> index 17291b90b..edb64262e 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_OPTS_VXLAN)
> +#if defined(__KERNEL__) || defined(HAVE_TCA_TUNNEL_KEY_NO_FRAG)
> #include_next <linux/tc_act/tc_tunnel_key.h>
> #else
>
> @@ -42,6 +42,7 @@ enum {
> */
> TCA_TUNNEL_KEY_ENC_TOS, /* u8 */
> TCA_TUNNEL_KEY_ENC_TTL, /* u8 */
> + TCA_TUNNEL_KEY_NO_FRAG, /* flag */
> __TCA_TUNNEL_KEY_MAX,
> };
>
> diff --git a/lib/netdev-offload-tc.c b/lib/netdev-offload-tc.c
> index c6aa51c68..dd2afc64f 100644
> --- a/lib/netdev-offload-tc.c
> +++ b/lib/netdev-offload-tc.c
> @@ -919,6 +919,9 @@ 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);
> }
> + if (action->encap.dont_fragment) {
> + nl_msg_put_flag(buf, OVS_TUNNEL_KEY_ATTR_DONT_FRAGMENT);
> + }
> ret = parse_tc_flower_vxlan_tun_opts(action, buf);
> if (ret) {
> return ret;
> @@ -1641,11 +1644,14 @@ parse_put_flow_set_action(struct tc_flower *flower,
> struct tc_action *action,
> }
> break;
> case OVS_TUNNEL_KEY_ATTR_DONT_FRAGMENT: {
> - /* XXX: This is wrong! We're ignoring the DF flag configuration
> - * requested by the user. However, TC for now has no way to pass
> - * that flag and it is set by default, meaning tunnel offloading
> - * will not work if 'options:df_default=false' is not set.
> - * Keeping incorrect behavior for now. */
> + if (enc_flags_support) {
> + action->encap.dont_fragment = true;
> + } else {
> + /* For kernels not supporting the DF flag, we ignoring the
> + * configuration requested by the user. This to keep the old,
Nit: double spaces between sentences.
> + * incorrect behaviour, and allow tunnels to be offloaded by
> + * TC with these kernels. */
Nit: double space at the end is not needed.
> + }
> }
> break;
> case OVS_TUNNEL_KEY_ATTR_CSUM: {
> diff --git a/lib/tc.c b/lib/tc.c
> index 6c853b8e6..175e770d4 100644
> --- a/lib/tc.c
> +++ b/lib/tc.c
> @@ -1229,6 +1229,7 @@ static const struct nl_policy tunnel_key_policy[] = {
> [TCA_TUNNEL_KEY_ENC_TTL] = { .type = NL_A_U8, .optional = true, },
> [TCA_TUNNEL_KEY_ENC_OPTS] = { .type = NL_A_NESTED, .optional = true, },
> [TCA_TUNNEL_KEY_NO_CSUM] = { .type = NL_A_U8, .optional = true, },
> + [TCA_TUNNEL_KEY_NO_FRAG] = { .type = NL_A_FLAG, .optional = true, },
> };
>
> static int
> @@ -1394,6 +1395,7 @@ nl_parse_act_tunnel_key(struct nlattr *options, struct
> tc_flower *flower)
> struct nlattr *ttl = tun_attrs[TCA_TUNNEL_KEY_ENC_TTL];
> struct nlattr *tun_opt = tun_attrs[TCA_TUNNEL_KEY_ENC_OPTS];
> struct nlattr *no_csum = tun_attrs[TCA_TUNNEL_KEY_NO_CSUM];
> + struct nlattr *no_frag = tun_attrs[TCA_TUNNEL_KEY_NO_FRAG];
>
> action = &flower->actions[flower->action_count++];
> action->type = TC_ACT_ENCAP;
> @@ -1411,6 +1413,7 @@ nl_parse_act_tunnel_key(struct nlattr *options, struct
> tc_flower *flower)
> action->encap.tos = tos ? nl_attr_get_u8(tos) : 0;
> action->encap.ttl = ttl ? nl_attr_get_u8(ttl) : 0;
> action->encap.no_csum = no_csum ? nl_attr_get_u8(no_csum) : 0;
> + action->encap.dont_fragment = no_frag ? true : false;
>
> err = nl_parse_act_tunnel_opts(tun_opt, action);
> if (err) {
> @@ -2747,6 +2750,9 @@ nl_msg_put_act_tunnel_key_set(struct ofpbuf *request,
> nl_msg_put_be16(request, TCA_TUNNEL_KEY_ENC_DST_PORT,
> encap->tp_dst);
> }
> + if (encap->dont_fragment) {
> + nl_msg_put_flag(request, TCA_TUNNEL_KEY_NO_FRAG);
> + }
> 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 c0a1d5d0e..8b9a1655a 100644
> --- a/lib/tc.h
> +++ b/lib/tc.h
> @@ -229,6 +229,7 @@ struct tc_action_encap {
> uint8_t tos;
> uint8_t ttl;
> uint8_t no_csum;
> + bool dont_fragment;
> struct {
> ovs_be32 ipv4_src;
> ovs_be32 ipv4_dst;
_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev