mbox series

[net-next,0/7] selftests: net: Switch pmtu.sh to use the internal ovs script.

Message ID 20240617180218.1154326-1-aconole@redhat.com
Headers show
Series selftests: net: Switch pmtu.sh to use the internal ovs script. | expand

Message

Aaron Conole June 17, 2024, 6:02 p.m. UTC
Currently, if a user wants to run pmtu.sh and cover all the provided test
cases, they need to install the Open vSwitch userspace utilities.  This
dependency is difficult for users as well as CI environments, because the
userspace build and setup may require lots of support and devel packages
to be installed, system setup to be correct, and things like permissions
and selinux policies to be properly configured.

The kernel selftest suite includes an ovs-dpctl.py utility which can
interact with the openvswitch module directly.  This lets developers and
CI environments run without needing too many extra dependencies - just
the pyroute2 python package.

This series enhances the ovs-dpctl utility to provide support for set()
and tunnel() flow specifiers, better ipv6 handling support, and the
ability to add tunnel vports, and LWT interfaces.  Finally, it modifies
the pmtu.sh script to call the ovs-dpctl.py utility rather than the
typical OVS userspace utilities.

Aaron Conole (7):
  selftests: openvswitch: Support explicit tunnel port creation.
  selftests: openvswitch: Refactor actions parsing.
  selftests: openvswitch: Add set() and set_masked() support.
  selftests: openvswitch: Add support for tunnel() key.
  selftests: openvswitch: Support implicit ipv6 arguments.
  selftests: net: Use the provided dpctl rather than the vswitchd for
    tests.
  selftests: net: add config for openvswitch

 tools/testing/selftests/net/config            |   5 +
 .../selftests/net/openvswitch/ovs-dpctl.py    | 372 +++++++++++++++---
 tools/testing/selftests/net/pmtu.sh           | 145 +++++--
 3 files changed, 453 insertions(+), 69 deletions(-)

Comments

Aaron Conole June 18, 2024, 4:04 p.m. UTC | #1
Aaron Conole <aconole@redhat.com> writes:

> The current iteration of IPv6 support requires explicit fields to be set
> in addition to not properly support the actual IPv6 addresses properly.
> With this change, make it so that the ipv6() bare option is usable to
> create wildcarded flows to match broad swaths of ipv6 traffic.
>
> Reviewed-by: Simon Horman <horms@kernel.org>
> Tested-by: Simon Horman <horms@kernel.org>
> Signed-off-by: Aaron Conole <aconole@redhat.com>
> ---
>  .../selftests/net/openvswitch/ovs-dpctl.py    | 42 ++++++++++++-------
>  1 file changed, 27 insertions(+), 15 deletions(-)
>
> diff --git a/tools/testing/selftests/net/openvswitch/ovs-dpctl.py b/tools/testing/selftests/net/openvswitch/ovs-dpctl.py
> index 2f16df2fb16b..2062e7e6e99e 100644
> --- a/tools/testing/selftests/net/openvswitch/ovs-dpctl.py
> +++ b/tools/testing/selftests/net/openvswitch/ovs-dpctl.py
> @@ -200,6 +200,18 @@ def convert_ipv4(data):
>  
>      return int(ipaddress.IPv4Address(ip)), int(ipaddress.IPv4Address(mask))
>  
> +def convert_ipv6(data):
> +    ip, _, mask = data.partition('/')
> +
> +    if not ip:
> +        ip = mask = 0
> +    elif not mask:
> +        mask = 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff'
> +    elif mask.isdigit():
> +        mask = ipaddress.IPv6Network("::/" + mask).hostmask
> +
> +    return ipaddress.IPv6Address(ip).packed, ipaddress.IPv6Address(mask).packed
> +
>  def convert_int(size):
>      def convert_int_sized(data):
>          value, _, mask = data.partition('/')
> @@ -941,21 +953,21 @@ class ovskey(nla):
>                  "src",
>                  "src",
>                  lambda x: str(ipaddress.IPv6Address(x)),
> -                lambda x: int.from_bytes(x, "big"),
> -                lambda x: ipaddress.IPv6Address(x),
> +                lambda x: ipaddress.IPv6Address(x).packed if x else 0,
> +                convert_ipv6,
>              ),
>              (
>                  "dst",
>                  "dst",
>                  lambda x: str(ipaddress.IPv6Address(x)),
> -                lambda x: int.from_bytes(x, "big"),
> -                lambda x: ipaddress.IPv6Address(x),
> +                lambda x: ipaddress.IPv6Address(x).packed if x else 0,
> +                convert_ipv6,
>              ),
> -            ("label", "label", "%d", int),
> -            ("proto", "proto", "%d", int),
> -            ("tclass", "tclass", "%d", int),
> -            ("hlimit", "hlimit", "%d", int),
> -            ("frag", "frag", "%d", int),
> +            ("label", "label", "%d", lambda x: int(x) if x else 0),
> +            ("proto", "proto", "%d", lambda x: int(x) if x else 0),
> +            ("tclass", "tclass", "%d", lambda x: int(x) if x else 0),
> +            ("hlimit", "hlimit", "%d", lambda x: int(x) if x else 0),
> +            ("frag", "frag", "%d", lambda x: int(x) if x else 0),
>          )
>  
>          def __init__(
> @@ -1152,8 +1164,8 @@ class ovskey(nla):
>              (
>                  "target",
>                  "target",
> -                lambda x: str(ipaddress.IPv6Address(x)),
> -                lambda x: int.from_bytes(x, "big"),
> +                lambda x: ipaddress.IPv6Address(x).packed,

This (and the following str() calls) shouldn't have been changed.  I'll
send a v2.  Sorry about the noise.  It isn't visible in this test, but
when doing some additional ipv6 test development for a future series, I
caught it.

> +                convert_ipv6,
>              ),
>              ("sll", "sll", macstr, lambda x: int.from_bytes(x, "big")),
>              ("tll", "tll", macstr, lambda x: int.from_bytes(x, "big")),
> @@ -1237,14 +1249,14 @@ class ovskey(nla):
>              (
>                  "src",
>                  "src",
> -                lambda x: str(ipaddress.IPv6Address(x)),
> -                lambda x: int.from_bytes(x, "big", convertmac),
> +                lambda x: ipaddress.IPv6Address(x).packed,
> +                convert_ipv6,
>              ),
>              (
>                  "dst",
>                  "dst",
> -                lambda x: str(ipaddress.IPv6Address(x)),
> -                lambda x: int.from_bytes(x, "big"),
> +                lambda x: ipaddress.IPv6Address(x).packed,
> +                convert_ipv6,
>              ),
>              ("tp_src", "tp_src", "%d", int),
>              ("tp_dst", "tp_dst", "%d", int),