On 11/13/20 11:04 AM, Eelco Chaudron wrote:
> Add support for the dec_ttl action. Instead of programming the datapath with
> a flow that matches the packet TTL and an IP set, use a single dec_ttl action.
> 
> The old behavior is kept if the new action is not supported by the datapath.
> 
>   # ovs-ofctl dump-flows br0
>    cookie=0x0, duration=12.538s, table=0, n_packets=4, n_bytes=392, ip 
> actions=dec_ttl,NORMAL
>    cookie=0x0, duration=12.536s, table=0, n_packets=4, n_bytes=168, 
> actions=NORMAL
> 
>   # ping -c1 -t 20 192.168.0.2
>   PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data.
>   IP (tos 0x0, ttl 19, id 45336, offset 0, flags [DF], proto ICMP (1), length 
> 84)
>       192.168.0.1 > 192.168.0.2: ICMP echo request, id 8865, seq 1, length 64
> 
> Linux netlink datapath support depends on upstream Linux commit:
>   744676e77720 ("openvswitch: add TTL decrement action")
> 
> 
> Note that in the Linux kernel tree the OVS_ACTION_ATTR_ADD_MPLS has been
> defined, and to make sure the IDs are in sync, it had to be added to the
> OVS source tree. This required some additional case statements, which
> should be revisited once the OVS implementation is added.
> 
> 
> Co-developed-by: Matteo Croce <mcr...@linux.microsoft.com>
> Co-developed-by: Bindiya Kurle <bindiyaku...@gmail.com>
> Signed-off-by: Eelco Chaudron <echau...@redhat.com>
> 
> ---
> v2: - Used definition instead of numeric value in format_dec_ttl_action()
>     - Changed format from "dec_ttl(ttl<=1(<actions>)) to
>       "dec_ttl(le_1(<actions>))" to be more in line with the check_pkt_len 
> action.
>     - Fixed parsing of "dec_ttl()" action for adding a dp flow.
>     - Cleaned up format_dec_ttl_action()
> 
>  datapath/linux/compat/include/linux/openvswitch.h |    8 ++
>  lib/dpif-netdev.c                                 |    4 +
>  lib/dpif.c                                        |    4 +
>  lib/odp-execute.c                                 |  102 
> ++++++++++++++++++++-
>  lib/odp-execute.h                                 |    2 
>  lib/odp-util.c                                    |   42 +++++++++
>  lib/packets.h                                     |   13 ++-
>  ofproto/ofproto-dpif-ipfix.c                      |    2 
>  ofproto/ofproto-dpif-sflow.c                      |    2 
>  ofproto/ofproto-dpif-xlate.c                      |   54 +++++++++--
>  ofproto/ofproto-dpif.c                            |   37 ++++++++
>  ofproto/ofproto-dpif.h                            |    6 +
>  12 files changed, 253 insertions(+), 23 deletions(-)
> 

<snip>

> +static void
> +format_dec_ttl_action(struct ds *ds,const struct nlattr *attr,
> +                      const struct hmap *portno_names)
> +{
> +    const struct nlattr *nla_acts = nl_attr_get(attr);
> +    int len = nl_attr_get_size(attr);
> +
> +    ds_put_cstr(ds,"dec_ttl(le_1(");
> +
> +    if (len > 4 && nla_acts->nla_type == OVS_DEC_TTL_ATTR_ACTION) {
> +        /* Linux kernel add an additional envelope we should strip. */
> +        len -= nl_attr_len_pad(nla_acts, len);
> +        nla_acts = nl_attr_next(nla_acts);

CC: Pravin

I looked at the kernel and I agree that there is a clear bug in kernel's
implementaion of this action.  It receives messages on format:
  OVS_ACTION_ATTR_DEC_TTL(<list of actions>),
but reports back in format:
  OVS_ACTION_ATTR_DEC_TTL(OVS_DEC_TTL_ATTR_ACTION(<list of actions>)).

Since 'OVS_DEC_TTL_ATTR_ACTION' exists, it's clear that original design
was to have it, i.e. the correct format should be the form that
kernel reports back to userspace.  I'd guess that there was a plan to
add more features to OVS_ACTION_ATTR_DEC_TTL in the future, e.g. set
actions execution threshold to something different than 1, so it make
some sense.

Anyway, the bug is in the kernel part of parsing the netlink message and
it should be fixed.  What I'm suggesting is to send a bugfix to kernel
to accept only format with nested OVS_DEC_TTL_ATTR_ACTION.  Since this
feature was never implemented in userspace OVS, this change will not
break anything.  On the OVS side we should always format netlink messages
in a correct way.  We have a code that checks feature existence in kernel
and it should fail if kernel is broken (as it is right now).  In this case
OVS will continue to use old implementation with setting the ttl field.

Since the patch for a kernel is a bug fix, it should be likely backported
to stable versions, and distributions will pick it up too.

Thoughts?

Best regards, Ilya Maximets.
_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to