[PATCH v2 0/5] selftests: net: fix false failures due to missing features and host interference

Aleksei Oladko posted 5 patches 1 week, 3 days ago
tools/testing/selftests/net/Makefile               | 14 +++++++++-----
tools/testing/selftests/net/fib_tests.sh           |  2 ++
.../testing/selftests/net/io_uring_zerocopy_tx.sh  |  9 +++++++++
.../testing/selftests/net/openvswitch/ovs-dpctl.py |  2 +-
tools/testing/selftests/net/pmtu_wrapper.sh        |  4 ++++
tools/testing/selftests/net/reuseport_bpf.sh       |  4 ++++
tools/testing/selftests/net/reuseport_bpf_cpu.sh   |  4 ++++
tools/testing/selftests/net/reuseport_bpf_numa.sh  |  4 ++++
tools/testing/selftests/net/reuseport_dualstack.sh |  4 ++++
9 files changed, 41 insertions(+), 6 deletions(-)
create mode 100755 tools/testing/selftests/net/pmtu_wrapper.sh
create mode 100755 tools/testing/selftests/net/reuseport_bpf.sh
create mode 100755 tools/testing/selftests/net/reuseport_bpf_cpu.sh
create mode 100755 tools/testing/selftests/net/reuseport_bpf_numa.sh
create mode 100755 tools/testing/selftests/net/reuseport_dualstack.sh
[PATCH v2 0/5] selftests: net: fix false failures due to missing features and host interference
Posted by Aleksei Oladko 1 week, 3 days ago
Hi,

This series addresses several issues in the networking kselftests
that cause false-positive failures depending on the host environment,
kernel configuration, or library versions.

The main focus of these changes is to isolate tests from the host
environment (using namespaces) and to ensure proper fallback or
skipping when dependencies are missing.

Summary of changes:
1. Adds a check for cls_basic module in fib_tests. Without this
   module, the test fails when attempting to add tc rules instead
   of skipping.
2. Fixes ovs-dpctl.py to return a non-zero exit code when pyroute2
   is too old. This allows pmtu.sh to correctly fall back to ovs-vsctl
   instead of assuming the configuration was successful.
3,4. Move reuseport and pmtu.sh tests info dedicated network namespaces.
   This prevents failures caused by port conflicts with host processes
   or interference from host firewall rules.
5. Ensures io_uring is enabled via sysctl before running io_uring_zerocopy
   test, preventing failures on systems where kernel.io_uring_disabled
   is set.

Signed-off-by: Aleksei Oladko <aleksey.oladko@virtuozzo.com>

Changes in v2:
- Fixed a typo by adding the missing backslash in Makefile
- Added a Fixes: tag to the appropriate commit as requested
- Link to v1: https://lore.kernel.org/linux-kselftest/20260120230558.328423-1-aleksey.oladko@virtuozzo.com
---
Aleksei Oladko (3):
  selftests: net: fib_tests: skip rp_filter test if cls_basic is
    unavailable
  selftests: net: make ovs-dpctl.py fail when pyroute2 is unsupported
  selftests: net: io_uring_zerocopy: enable io_uring for the test

Konstantin Khorenko (2):
  selftests: net: run reuseport tests in netns to avoid port conflicts
  selftests: net: run pmtu.sh in netns to avoid host firewall
    interference

 tools/testing/selftests/net/Makefile               | 14 +++++++++-----
 tools/testing/selftests/net/fib_tests.sh           |  2 ++
 .../testing/selftests/net/io_uring_zerocopy_tx.sh  |  9 +++++++++
 .../testing/selftests/net/openvswitch/ovs-dpctl.py |  2 +-
 tools/testing/selftests/net/pmtu_wrapper.sh        |  4 ++++
 tools/testing/selftests/net/reuseport_bpf.sh       |  4 ++++
 tools/testing/selftests/net/reuseport_bpf_cpu.sh   |  4 ++++
 tools/testing/selftests/net/reuseport_bpf_numa.sh  |  4 ++++
 tools/testing/selftests/net/reuseport_dualstack.sh |  4 ++++
 9 files changed, 41 insertions(+), 6 deletions(-)
 create mode 100755 tools/testing/selftests/net/pmtu_wrapper.sh
 create mode 100755 tools/testing/selftests/net/reuseport_bpf.sh
 create mode 100755 tools/testing/selftests/net/reuseport_bpf_cpu.sh
 create mode 100755 tools/testing/selftests/net/reuseport_bpf_numa.sh
 create mode 100755 tools/testing/selftests/net/reuseport_dualstack.sh

-- 
2.43.0
Re: [PATCH v2 0/5] selftests: net: fix false failures due to missing features and host interference
Posted by Jakub Kicinski 1 week, 3 days ago
On Tue, 27 Jan 2026 22:51:29 +0000 Aleksei Oladko wrote:
> This series addresses several issues in the networking kselftests
> that cause false-positive failures depending on the host environment,
> kernel configuration, or library versions.
> 
> The main focus of these changes is to isolate tests from the host
> environment (using namespaces) and to ensure proper fallback or
> skipping when dependencies are missing.
> 
> Summary of changes:
> 1. Adds a check for cls_basic module in fib_tests. Without this
>    module, the test fails when attempting to add tc rules instead
>    of skipping.
> 2. Fixes ovs-dpctl.py to return a non-zero exit code when pyroute2
>    is too old. This allows pmtu.sh to correctly fall back to ovs-vsctl
>    instead of assuming the configuration was successful.
> 3,4. Move reuseport and pmtu.sh tests info dedicated network namespaces.
>    This prevents failures caused by port conflicts with host processes
>    or interference from host firewall rules.
> 5. Ensures io_uring is enabled via sysctl before running io_uring_zerocopy
>    test, preventing failures on systems where kernel.io_uring_disabled
>    is set.

Something in this series breaks the pmtu test for us in the CI:

# 64.84 [+2.54] TEST: IPv6, bridged geneve6: PMTU exceptions - nexthop objects      [ OK ]
# 65.73 [+0.89]   ovs_bridge not supported
# 65.73 [+0.00] TEST: IPv4, OVS vxlan4: PMTU exceptions                             [SKIP]
# 67.20 [+1.47]   ovs_bridge not supported
# 67.20 [+0.00] TEST: IPv6, OVS vxlan4: PMTU exceptions                             [SKIP]
# 68.66 [+1.45]   ovs_bridge not supported
# 68.66 [+0.00] TEST: IPv4, OVS vxlan6: PMTU exceptions                             [SKIP]
# 70.11 [+1.45]   ovs_bridge not supported
# 70.11 [+0.00] TEST: IPv6, OVS vxlan6: PMTU exceptions                             [SKIP]
# 71.57 [+1.45]   ovs_bridge not supported
# 71.57 [+0.00] TEST: IPv4, OVS geneve4: PMTU exceptions                            [SKIP]
# 73.01 [+1.44]   ovs_bridge not supported
# 73.01 [+0.00] TEST: IPv6, OVS geneve4: PMTU exceptions                            [SKIP]
# 74.46 [+1.45]   ovs_bridge not supported
# 74.46 [+0.00] TEST: IPv4, OVS geneve6: PMTU exceptions                            [SKIP]
# 75.92 [+1.46]   ovs_bridge not supported
# 75.93 [+0.00] TEST: IPv6, OVS geneve6: PMTU exceptions                            [SKIP]

https://netdev-ctrl.bots.linux.dev/logs/vmksft/net/results/492641/137-pmtu-wrapper-sh/stdout

It was fine before:

https://netdev-ctrl.bots.linux.dev/logs/vmksft/net-dbg/results/492461/6-pmtu-sh/stdout

Since this is a bash test there are of course no logs to go by.. :/

I tried running 
 python tools/testing/selftests/net/openvswitch/ovs-dpctl.py add-dp br0
in a netns and that works just fine. 

No idea what's going on..
Re: [PATCH v2 0/5] selftests: net: fix false failures due to missing features and host interference
Posted by Aaron Conole 1 week, 2 days ago
Also CC'd Stefano, ovs-dev, Ilya, and Eelco

Jakub Kicinski <kuba@kernel.org> writes:

> On Tue, 27 Jan 2026 22:51:29 +0000 Aleksei Oladko wrote:
>> This series addresses several issues in the networking kselftests
>> that cause false-positive failures depending on the host environment,
>> kernel configuration, or library versions.
>> 
>> The main focus of these changes is to isolate tests from the host
>> environment (using namespaces) and to ensure proper fallback or
>> skipping when dependencies are missing.
>> 
>> Summary of changes:
>> 1. Adds a check for cls_basic module in fib_tests. Without this
>>    module, the test fails when attempting to add tc rules instead
>>    of skipping.
>> 2. Fixes ovs-dpctl.py to return a non-zero exit code when pyroute2
>>    is too old. This allows pmtu.sh to correctly fall back to ovs-vsctl
>>    instead of assuming the configuration was successful.
>> 3,4. Move reuseport and pmtu.sh tests info dedicated network namespaces.
>>    This prevents failures caused by port conflicts with host processes
>>    or interference from host firewall rules.
>> 5. Ensures io_uring is enabled via sysctl before running io_uring_zerocopy
>>    test, preventing failures on systems where kernel.io_uring_disabled
>>    is set.
>
> Something in this series breaks the pmtu test for us in the CI:
>
> # 64.84 [+2.54] TEST: IPv6, bridged geneve6: PMTU exceptions - nexthop objects      [ OK ]
> # 65.73 [+0.89]   ovs_bridge not supported
> # 65.73 [+0.00] TEST: IPv4, OVS vxlan4: PMTU exceptions                             [SKIP]
> # 67.20 [+1.47]   ovs_bridge not supported
> # 67.20 [+0.00] TEST: IPv6, OVS vxlan4: PMTU exceptions                             [SKIP]
> # 68.66 [+1.45]   ovs_bridge not supported
> # 68.66 [+0.00] TEST: IPv4, OVS vxlan6: PMTU exceptions                             [SKIP]
> # 70.11 [+1.45]   ovs_bridge not supported
> # 70.11 [+0.00] TEST: IPv6, OVS vxlan6: PMTU exceptions                             [SKIP]
> # 71.57 [+1.45]   ovs_bridge not supported
> # 71.57 [+0.00] TEST: IPv4, OVS geneve4: PMTU exceptions                            [SKIP]
> # 73.01 [+1.44]   ovs_bridge not supported
> # 73.01 [+0.00] TEST: IPv6, OVS geneve4: PMTU exceptions                            [SKIP]
> # 74.46 [+1.45]   ovs_bridge not supported
> # 74.46 [+0.00] TEST: IPv4, OVS geneve6: PMTU exceptions                            [SKIP]
> # 75.92 [+1.46]   ovs_bridge not supported
> # 75.93 [+0.00] TEST: IPv6, OVS geneve6: PMTU exceptions                            [SKIP]
>
> https://netdev-ctrl.bots.linux.dev/logs/vmksft/net/results/492641/137-pmtu-wrapper-sh/stdout
>
> It was fine before:
>
> https://netdev-ctrl.bots.linux.dev/logs/vmksft/net-dbg/results/492461/6-pmtu-sh/stdout
>
> Since this is a bash test there are of course no logs to go by.. :/

FYI- we can run the script with '-v' and it will include all of the
command output.  That could help understand what is going on if you can
duplicate the [SKIP] behavior in another environment.  I'll try to get
my vmtest environment back up for it.

> I tried running 
>  python tools/testing/selftests/net/openvswitch/ovs-dpctl.py add-dp br0
> in a netns and that works just fine. 

Yes, I tested just changing the ovs-dpctl.py side (no other changes to
pmtu.sh), and then tried with older pyroute2, no pyroute2, and no
ovs-vswitchd userspace to fall back on, and didn't see anything odd on
my end.  I am still nervous that maybe the test is/was passing even in
cases where it shouldn't be.

> No idea what's going on..

+1, the setup_ovs_bridge seems to be returning some kind of error.

NOTE that I was concerned maybe the test would be passing whether or not
the ovs-dpctl was returning '0' (from change 2/5), but I see the
following when I fake out the version check:

========== 8< ===========

[core@centos9 net]$ sudo ./pmtu.sh -v pmtu_ipv4_ovs_vxlan4_exception

##########################################################################

    COMMAND: python3 ./openvswitch/ovs-dpctl.py add-dp ovs_br0
    Need to upgrade the python pyroute2 package to >= 0.6.

    COMMAND: ip link set ovs_br0 up
    Cannot find device "ovs_br0"

    COMMAND: ip netns exec ns_c-VCOwRt ip link add veth_C-A type veth peer name veth_A-C
    COMMAND: ip netns exec ns_c-VCOwRt ip link set veth_A-C netns 1
    COMMAND: ip link set veth_A-C up
    COMMAND: ip netns exec ns_c-VCOwRt ip link set veth_C-A up
    COMMAND: ip netns exec ns_c-VCOwRt ip addr add 192.168.2.10/24 dev veth_C-A
    COMMAND: ip netns exec ns_c-VCOwRt ip addr add fd00:2::c/64 dev veth_C-A
    COMMAND: python3 ./openvswitch/ovs-dpctl.py add-if ovs_br0 veth_A-C
    Need to upgrade the python pyroute2 package to >= 0.6.

    COMMAND: ip netns exec ns_a-kmNqnY ip link set veth_A-R1 netns 1
    COMMAND: ip addr add 10.0.1.1/24 dev veth_A-R1
    COMMAND: ip addr add fc00:1::1/64 dev veth_A-R1
    COMMAND: ip link set veth_A-R1 up
    COMMAND: ip route add 10.0.3.1 via 10.0.1.2
    COMMAND: ip route add fc00:3::1 via fc00:1::2
    COMMAND: python3 ./openvswitch/ovs-dpctl.py add-if ovs_br0 vxlan_a -t vxlan
    Need to upgrade the python pyroute2 package to >= 0.6.

    COMMAND: python3 ./openvswitch/ovs-dpctl.py add-flow ovs_br0 recirc_id(0),in_port(),eth(),eth_type(0x0800),ipv4() set(tunnel(tun_id=1,dst=10.0.3.1,ttl=64,tp_dst=4789,flags(df|csum))),
    Need to upgrade the python pyroute2 package to >= 0.6.

    COMMAND: python3 ./openvswitch/ovs-dpctl.py add-flow ovs_br0 recirc_id(0),in_port(),eth(),eth_type(0x86dd),ipv6() set(tunnel(tun_id=1,dst=10.0.3.1,ttl=64,tp_dst=4789,flags(df|csum))),
    Need to upgrade the python pyroute2 package to >= 0.6.

    COMMAND: python3 ./openvswitch/ovs-dpctl.py add-flow ovs_br0 recirc_id(0),tunnel(tun_id=1,src=10.0.3.1,dst=10.0.1.1),in_port(),eth(),eth_type(0x0800),ipv4() 
    Need to upgrade the python pyroute2 package to >= 0.6.

    COMMAND: python3 ./openvswitch/ovs-dpctl.py add-flow ovs_br0 recirc_id(0),tunnel(tun_id=1,src=10.0.3.1,dst=10.0.1.1),in_port(),eth(),eth_type(0x86dd),ipv6() 
    Need to upgrade the python pyroute2 package to >= 0.6.

    COMMAND: python3 ./openvswitch/ovs-dpctl.py add-flow ovs_br0 recirc_id(0),tunnel(tun_id=1,src=10.0.3.1,dst=10.0.1.1),in_port(),eth(),eth_type(0x0806),arp() 
    Need to upgrade the python pyroute2 package to >= 0.6.

    COMMAND: python3 ./openvswitch/ovs-dpctl.py add-flow ovs_br0 recirc_id(0),in_port(),eth(),eth_type(0x0806),arp(sip=192.168.2.10,tip=192.168.2.2) set(tunnel(tun_id=1,dst=10.0.3.1,ttl=64,tp_dst=4789,flags(df|csum))),
    Need to upgrade the python pyroute2 package to >= 0.6.

    COMMAND: ip netns exec ns_b-gO9WCK ip link add vxlan_b type vxlan id 1 local 10.0.3.1 remote 10.0.1.1 ttl 64 dstport 4789
    COMMAND: ip netns exec ns_b-gO9WCK ip addr add 192.168.2.2/24 dev vxlan_b
    COMMAND: ip netns exec ns_b-gO9WCK ip addr add fd00:2::b/64 dev vxlan_b
    COMMAND: ip link set vxlan_a up
    Cannot find device "vxlan_a"

    COMMAND: ip netns exec ns_b-gO9WCK ip link set vxlan_b up
Cannot find device "ovs_br0"
    COMMAND: ip netns exec ns_c-VCOwRt ping -q -M want -i 0.1 -c 20 -s 4500 192.168.2.2
    PING 192.168.2.2 (192.168.2.2) 4500(4528) bytes of data.

--- 192.168.2.2 ping statistics ---
20 packets transmitted, 0 received, +20 errors, 100% packet loss, time 12790ms
pipe 4

TEST: IPv4, OVS vxlan4: PMTU exceptions                             [FAIL]