kernel_samsung_a53x/tools/testing/selftests/net/forwarding
Amit Cohen 988bb5ed8f selftests: forwarding: devlink_lib: Wait for udev events after reloading
[ Upstream commit f67a90a0c8f5b3d0acc18f10650d90fec44775f9 ]

Lately, an additional locking was added by commit c0a40097f0bc
("drivers: core: synchronize really_probe() and dev_uevent()"). The
locking protects dev_uevent() calling. This function is used to send
messages from the kernel to user space. Uevent messages notify user space
about changes in device states, such as when a device is added, removed,
or changed. These messages are used by udev (or other similar user-space
tools) to apply device-specific rules.

After reloading devlink instance, udev events should be processed. This
locking causes a short delay of udev events handling.

One example for useful udev rule is renaming ports. 'forwading.config'
can be configured to use names after udev rules are applied. Some tests run
devlink_reload() and immediately use the updated names. This worked before
the above mentioned commit was pushed, but now the delay of uevent messages
causes that devlink_reload() returns before udev events are handled and
tests fail.

Adjust devlink_reload() to not assume that udev events are already
processed when devlink reload is done, instead, wait for udev events to
ensure they are processed before returning from the function.

Without this patch:
TESTS='rif_mac_profile' ./resource_scale.sh
TEST: 'rif_mac_profile' 4                                           [ OK ]
sysctl: cannot stat /proc/sys/net/ipv6/conf/swp1/disable_ipv6: No such file or directory
sysctl: cannot stat /proc/sys/net/ipv6/conf/swp1/disable_ipv6: No such file or directory
sysctl: cannot stat /proc/sys/net/ipv6/conf/swp2/disable_ipv6: No such file or directory
sysctl: cannot stat /proc/sys/net/ipv6/conf/swp2/disable_ipv6: No such file or directory
Cannot find device "swp1"
Cannot find device "swp2"
TEST: setup_wait_dev (: Interface swp1 does not come up.) [FAIL]

With this patch:
$ TESTS='rif_mac_profile' ./resource_scale.sh
TEST: 'rif_mac_profile' 4                                           [ OK ]
TEST: 'rif_mac_profile' overflow 5                                  [ OK ]

This is relevant not only for this test.

Fixes: bc7cbb1e9f4c ("selftests: forwarding: Add devlink_lib.sh")
Signed-off-by: Amit Cohen <amcohen@nvidia.com>
Reviewed-by: Ido Schimmel <idosch@nvidia.com>
Signed-off-by: Petr Machata <petrm@nvidia.com>
Link: https://patch.msgid.link/89367666e04b38a8993027f1526801ca327ab96a.1720709333.git.petrm@nvidia.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2024-11-23 23:20:08 +01:00
..
bridge_igmp.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
bridge_port_isolation.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
bridge_sticky_fdb.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
bridge_vlan_aware.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
bridge_vlan_unaware.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
config Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
devlink_lib.sh selftests: forwarding: devlink_lib: Wait for udev events after reloading 2024-11-23 23:20:08 +01:00
ethtool.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
ethtool_extended_state.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
ethtool_lib.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
fib_offload_lib.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
forwarding.config.sample Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
gre_inner_v4_multipath.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
gre_inner_v6_multipath.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
gre_multipath.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
ip6_forward_instats_vrf.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
ip6gre_inner_v4_multipath.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
ip6gre_inner_v6_multipath.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
ipip_flat_gre.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
ipip_flat_gre_key.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
ipip_flat_gre_keys.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
ipip_hier_gre.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
ipip_hier_gre_key.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
ipip_hier_gre_keys.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
ipip_lib.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
lib.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
loopback.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
Makefile Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
mirror_gre.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
mirror_gre_bound.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
mirror_gre_bridge_1d.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
mirror_gre_bridge_1d_vlan.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
mirror_gre_bridge_1q.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
mirror_gre_bridge_1q_lag.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
mirror_gre_changes.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
mirror_gre_flower.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
mirror_gre_lag_lacp.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
mirror_gre_lib.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
mirror_gre_neigh.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
mirror_gre_nh.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
mirror_gre_topo_lib.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
mirror_gre_vlan.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
mirror_gre_vlan_bridge_1q.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
mirror_lib.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
mirror_topo_lib.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
mirror_vlan.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
pedit_dsfield.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
pedit_l4port.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
README Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
router.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
router_bridge.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
router_bridge_vlan.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
router_broadcast.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
router_mpath_nh.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
router_multicast.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
router_multipath.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
router_vid_1.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
sch_ets.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
sch_ets_core.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
sch_ets_tests.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
sch_red.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
sch_tbf_core.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
sch_tbf_ets.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
sch_tbf_etsprio.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
sch_tbf_prio.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
sch_tbf_root.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
settings Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
skbedit_priority.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
tc_actions.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
tc_chains.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
tc_common.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
tc_flower.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
tc_flower_router.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
tc_police.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
tc_shblocks.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
tc_vlan_modify.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
vxlan_asymmetric.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
vxlan_bridge_1d.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
vxlan_bridge_1d_port_8472.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
vxlan_bridge_1q.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
vxlan_bridge_1q_port_8472.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00
vxlan_symmetric.sh Import A536BXXU9EXDC 2024-06-15 16:02:09 -03:00

Motivation
==========

One of the nice things about network namespaces is that they allow one
to easily create and test complex environments.

Unfortunately, these namespaces can not be used with actual switching
ASICs, as their ports can not be migrated to other network namespaces
(NETIF_F_NETNS_LOCAL) and most of them probably do not support the
L1-separation provided by namespaces.

However, a similar kind of flexibility can be achieved by using VRFs and
by looping the switch ports together. For example:

                             br0
                              +
               vrf-h1         |           vrf-h2
                 +        +---+----+        +
                 |        |        |        |
    192.0.2.1/24 +        +        +        + 192.0.2.2/24
               swp1     swp2     swp3     swp4
                 +        +        +        +
                 |        |        |        |
                 +--------+        +--------+

The VRFs act as lightweight namespaces representing hosts connected to
the switch.

This approach for testing switch ASICs has several advantages over the
traditional method that requires multiple physical machines, to name a
few:

1. Only the device under test (DUT) is being tested without noise from
other system.

2. Ability to easily provision complex topologies. Testing bridging
between 4-ports LAGs or 8-way ECMP requires many physical links that are
not always available. With the VRF-based approach one merely needs to
loopback more ports.

These tests are written with switch ASICs in mind, but they can be run
on any Linux box using veth pairs to emulate physical loopbacks.

Guidelines for Writing Tests
============================

o Where possible, reuse an existing topology for different tests instead
  of recreating the same topology.
o Tests that use anything but the most trivial topologies should include
  an ASCII art showing the topology.
o Where possible, IPv6 and IPv4 addresses shall conform to RFC 3849 and
  RFC 5737, respectively.
o Where possible, tests shall be written so that they can be reused by
  multiple topologies and added to lib.sh.
o Checks shall be added to lib.sh for any external dependencies.
o Code shall be checked using ShellCheck [1] prior to submission.

1. https://www.shellcheck.net/