Merge branch 'selftests-preparations-for-out-of-order-operations-patches-in-mlxsw'

Petr Machata says:

====================
selftests: Preparations for out-of-order-operations patches in mlxsw

The mlxsw driver currently makes the assumption that the user applies
configuration in a bottom-up manner. Thus netdevices need to be added to
the bridge before IP addresses are configured on that bridge or SVI added
on top of it. Enslaving a netdevice to another netdevice that already has
uppers is in fact forbidden by mlxsw for this reason. Despite this safety,
it is rather easy to get into situations where the offloaded configuration
is just plain wrong.

Over the course of the following several patchsets, mlxsw code is going to
be adjusted to diminish the space of wrongly offloaded configurations.
Ideally the offload state will reflect the actual state, regardless of the
sequence of operation used to construct that state.

Several selftests build configurations that will not be offloadable in the
future on some systems. The reason is that what will get offloaded is the
actual configuration, not the configuration steps.

For example, when a port is added to a bridge that has an IP address, that
bridge will get a RIF, which it would not have with the current code. But
on Nvidia Spectrum-1 machines, MAC addresses of all RIFs need to have the
same prefix, which the bridge will violate. The RIF thus couldn't be
created, and the enslavement is therefore canceled, because it would lead
to an unoffloadable configuration. This breaks some selftests.

In this patchset, adjust selftests to avoid the configurations that mlxsw
would be incapable of offloading, while maintaining relevance with regards
to the feature that is being tested. There are generally two cases of
fixes:

- Disabling IPv6 autogen on bridges that do not participate in routing,
  either because of the abovementioned requirement to keep the same MAC
  prefix on all in-HW router interfaces, or, on 802.1ad bridges, because
  in-HW router interfaces are not supported at all.

- Setting the bridge MAC address to what it will become after the first
  member port is attached, so that the in-HW router interface is created
  with a supported MAC address.

The patchset is then split thus:

- Patches #1-#7 adjust generic selftests
- Patches #8-#16 adjust mlxsw-specific selftests
====================

Link: https://lore.kernel.org/r/cover.1687265905.git.petrm@nvidia.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
Jakub Kicinski 2023-06-21 14:02:57 -07:00
commit f31b6c649e
19 changed files with 88 additions and 25 deletions

View file

@ -35,7 +35,9 @@ netdev_pre_up_test()
{
RET=0
ip link add name br1 up type bridge vlan_filtering 0 mcast_snooping 0
ip link add name br1 type bridge vlan_filtering 0 mcast_snooping 0
ip link set dev br1 addrgenmode none
ip link set dev br1 up
ip link add name vx1 up type vxlan id 1000 \
local 192.0.2.17 remote 192.0.2.18 \
dstport 4789 nolearning noudpcsum tos inherit ttl 100
@ -46,7 +48,9 @@ netdev_pre_up_test()
ip link set dev $swp1 master br1
check_err $?
ip link add name br2 up type bridge vlan_filtering 0 mcast_snooping 0
ip link add name br2 type bridge vlan_filtering 0 mcast_snooping 0
ip link set dev br2 addrgenmode none
ip link set dev br2 up
ip link add name vx2 up type vxlan id 2000 \
local 192.0.2.17 remote 192.0.2.18 \
dstport 4789 nolearning noudpcsum tos inherit ttl 100
@ -81,7 +85,9 @@ vxlan_vlan_add_test()
{
RET=0
ip link add name br1 up type bridge vlan_filtering 1 mcast_snooping 0
ip link add name br1 type bridge vlan_filtering 1 mcast_snooping 0
ip link set dev br1 addrgenmode none
ip link set dev br1 up
# Unsupported configuration: mlxsw demands VXLAN with "noudpcsum".
ip link add name vx1 up type vxlan id 1000 \
@ -117,7 +123,9 @@ vxlan_bridge_create_test()
dstport 4789 tos inherit ttl 100
# Test with VLAN-aware bridge.
ip link add name br1 up type bridge vlan_filtering 1 mcast_snooping 0
ip link add name br1 type bridge vlan_filtering 1 mcast_snooping 0
ip link set dev br1 addrgenmode none
ip link set dev br1 up
ip link set dev vx1 master br1
@ -142,8 +150,12 @@ bridge_create_test()
{
RET=0
ip link add name br1 up type bridge vlan_filtering 1
ip link add name br2 up type bridge vlan_filtering 1
ip link add name br1 type bridge vlan_filtering 1
ip link set dev br1 addrgenmode none
ip link set dev br1 up
ip link add name br2 type bridge vlan_filtering 1
ip link set dev br2 addrgenmode none
ip link set dev br2 up
ip link set dev $swp1 master br1
check_err $?

View file

@ -165,6 +165,7 @@ mirror_gre_setup_prepare()
simple_if_init $h3
ip link add name br1 type bridge vlan_filtering 1
ip link set dev br1 addrgenmode none
ip link set dev br1 up
ip link set dev $swp1 master br1

View file

@ -83,7 +83,8 @@ h2_destroy()
switch_create()
{
ip link add name br0 type bridge mcast_snooping 0
ip link add name br0 address $(mac_get $swp1) \
type bridge mcast_snooping 0
ip link set dev br0 up
ip link set dev $swp1 master br0

View file

@ -48,6 +48,7 @@ create_vlan_upper_on_top_of_bridge()
ip link add dev br0 type bridge vlan_filtering 1 \
vlan_protocol $bridge_proto vlan_default_pvid 0 mcast_snooping 0
ip link set dev br0 addrgenmode none
ip link set dev br0 up
ip link set dev $swp1 master br0
@ -88,6 +89,7 @@ create_8021ad_vlan_upper_on_top_bridge_port()
ip link add dev br0 type bridge vlan_filtering 1 \
vlan_default_pvid 0 mcast_snooping 0
ip link set dev br0 addrgenmode none
ip link set dev $swp1 master br0
ip link set dev br0 up
@ -155,6 +157,7 @@ create_vlan_upper_on_top_front_panel_enslaved_to_8021ad_bridge()
ip link add dev br0 type bridge vlan_filtering 1 \
vlan_protocol 802.1ad vlan_default_pvid 0 mcast_snooping 0
ip link set dev br0 addrgenmode none
ip link set dev br0 up
ip link set dev $swp1 master br0
@ -177,6 +180,7 @@ create_vlan_upper_on_top_lag_enslaved_to_8021ad_bridge()
ip link add dev br0 type bridge vlan_filtering 1 \
vlan_protocol 802.1ad vlan_default_pvid 0 mcast_snooping 0
ip link set dev br0 addrgenmode none
ip link set dev br0 up
ip link add name bond1 type bond mode 802.3ad
@ -203,6 +207,7 @@ enslave_front_panel_with_vlan_upper_to_8021ad_bridge()
ip link add dev br0 type bridge vlan_filtering 1 \
vlan_protocol 802.1ad vlan_default_pvid 0 mcast_snooping 0
ip link set dev br0 addrgenmode none
ip link set dev br0 up
ip link add name $swp1.100 link $swp1 type vlan id 100
@ -225,6 +230,7 @@ enslave_lag_with_vlan_upper_to_8021ad_bridge()
ip link add dev br0 type bridge vlan_filtering 1 \
vlan_protocol 802.1ad vlan_default_pvid 0 mcast_snooping 0
ip link set dev br0 addrgenmode none
ip link set dev br0 up
ip link add name bond1 type bond mode 802.3ad
@ -252,6 +258,7 @@ add_ip_address_to_8021ad_bridge()
ip link add dev br0 type bridge vlan_filtering 1 \
vlan_protocol 802.1ad vlan_default_pvid 0 mcast_snooping 0
ip link set dev br0 addrgenmode none
ip link set dev br0 up
ip link set dev $swp1 master br0
@ -273,6 +280,7 @@ switch_bridge_protocol_from_8021q_to_8021ad()
ip link add dev br0 type bridge vlan_filtering 1 \
vlan_protocol 802.1ad vlan_default_pvid 0 mcast_snooping 0
ip link set dev br0 addrgenmode none
ip link set dev br0 up
ip link set dev $swp1 master br0

View file

@ -65,6 +65,7 @@ h2_destroy()
switch_create()
{
ip link add name br1 type bridge vlan_filtering 1
ip link set dev br1 addrgenmode none
ip link set dev br1 up
ip link set dev $swp1 master br1
ip link set dev $swp1 up

View file

@ -138,11 +138,15 @@ switch_create()
vlan_create $swp3 111
vlan_create $swp3 222
ip link add name br111 up type bridge vlan_filtering 0
ip link add name br111 type bridge vlan_filtering 0
ip link set dev br111 addrgenmode none
ip link set dev br111 up
ip link set dev $swp1.111 master br111
ip link set dev $swp3.111 master br111
ip link add name br222 up type bridge vlan_filtering 0
ip link add name br222 type bridge vlan_filtering 0
ip link set dev br222 addrgenmode none
ip link set dev br222 up
ip link set dev $swp2.222 master br222
ip link set dev $swp3.222 master br222

View file

@ -135,11 +135,13 @@ switch_create()
prio bands 8 priomap 7 7 7 7 7 7 7 7
ip link add name br1 type bridge vlan_filtering 0
ip link set dev br1 addrgenmode none
ip link set dev br1 up
ip link set dev $swp1 master br1
ip link set dev $swp3 master br1
ip link add name br111 type bridge vlan_filtering 0
ip link set dev br111 addrgenmode none
ip link set dev br111 up
ip link set dev $swp2.111 master br111
ip link set dev $swp3.111 master br111

View file

@ -34,6 +34,7 @@ create_vxlan_on_top_of_8021ad_bridge()
ip link add dev br0 type bridge vlan_filtering 1 vlan_protocol 802.1ad \
vlan_default_pvid 0 mcast_snooping 0
ip link set dev br0 addrgenmode none
ip link set dev br0 up
ip link add name vx100 type vxlan id 1000 local 192.0.2.17 dstport \

View file

@ -444,8 +444,12 @@ offload_indication_setup_create()
{
# Create a simple setup with two bridges, each with a VxLAN device
# and one local port
ip link add name br0 up type bridge mcast_snooping 0
ip link add name br1 up type bridge mcast_snooping 0
ip link add name br0 type bridge mcast_snooping 0
ip link set dev br0 addrgenmode none
ip link set dev br0 up
ip link add name br1 type bridge mcast_snooping 0
ip link set dev br1 addrgenmode none
ip link set dev br1 up
ip link set dev $swp1 master br0
ip link set dev $swp2 master br1
@ -646,8 +650,12 @@ offload_indication_decap_route_test()
RET=0
ip link add name br0 up type bridge mcast_snooping 0
ip link add name br1 up type bridge mcast_snooping 0
ip link add name br0 type bridge mcast_snooping 0
ip link set dev br0 addrgenmode none
ip link set dev br0 up
ip link add name br1 type bridge mcast_snooping 0
ip link set dev br1 addrgenmode none
ip link set dev br1 up
ip link set dev $swp1 master br0
ip link set dev $swp2 master br1
ip link set dev vxlan0 master br0
@ -780,7 +788,9 @@ __offload_indication_join_vxlan_first()
offload_indication_join_vxlan_first()
{
ip link add dev br0 up type bridge mcast_snooping 0
ip link add dev br0 type bridge mcast_snooping 0
ip link set dev br0 addrgenmode none
ip link set dev br0 up
ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
@ -815,7 +825,9 @@ __offload_indication_join_vxlan_last()
offload_indication_join_vxlan_last()
{
ip link add dev br0 up type bridge mcast_snooping 0
ip link add dev br0 type bridge mcast_snooping 0
ip link set dev br0 addrgenmode none
ip link set dev br0 up
ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
@ -842,6 +854,7 @@ sanitization_vlan_aware_test()
RET=0
ip link add dev br0 type bridge mcast_snooping 0 vlan_filtering 1
ip link set dev br0 addrgenmode none
ip link add name vxlan10 up master br0 type vxlan id 10 nolearning \
$UDPCSUM_FLAFS ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
@ -915,8 +928,10 @@ offload_indication_vlan_aware_setup_create()
{
# Create a simple setup with two VxLAN devices and a single VLAN-aware
# bridge
ip link add name br0 up type bridge mcast_snooping 0 vlan_filtering 1 \
ip link add name br0 type bridge mcast_snooping 0 vlan_filtering 1 \
vlan_default_pvid 0
ip link set dev br0 addrgenmode none
ip link set dev br0 up
ip link set dev $swp1 master br0
@ -1060,8 +1075,10 @@ offload_indication_vlan_aware_decap_route_test()
offload_indication_vlan_aware_join_vxlan_first()
{
ip link add dev br0 up type bridge mcast_snooping 0 \
ip link add dev br0 type bridge mcast_snooping 0 \
vlan_filtering 1 vlan_default_pvid 1
ip link set dev br0 addrgenmode none
ip link set dev br0 up
ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
@ -1073,8 +1090,10 @@ offload_indication_vlan_aware_join_vxlan_first()
offload_indication_vlan_aware_join_vxlan_last()
{
ip link add dev br0 up type bridge mcast_snooping 0 \
ip link add dev br0 type bridge mcast_snooping 0 \
vlan_filtering 1 vlan_default_pvid 1
ip link set dev br0 addrgenmode none
ip link set dev br0 up
ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789
@ -1091,8 +1110,10 @@ offload_indication_vlan_aware_l3vni_test()
RET=0
sysctl_set net.ipv6.conf.default.disable_ipv6 1
ip link add dev br0 up type bridge mcast_snooping 0 \
ip link add dev br0 type bridge mcast_snooping 0 \
vlan_filtering 1 vlan_default_pvid 0
ip link set dev br0 addrgenmode none
ip link set dev br0 up
ip link add name vxlan0 up type vxlan id 10 nolearning $UDPCSUM_FLAFS \
ttl 20 tos inherit local $LOCAL_IP_1 dstport 4789

View file

@ -132,6 +132,7 @@ switch_create()
#### BR1 ####
ip link add name br1 type bridge vlan_filtering 1 \
vlan_protocol 802.1ad vlan_default_pvid 0 mcast_snooping 0
ip link set dev br1 addrgenmode none
# Make sure the bridge uses the MAC address of the local port and not
# that of the VxLAN's device.
ip link set dev br1 address $(mac_get $swp1)

View file

@ -98,6 +98,7 @@ switch_create()
# Bridge between H1 and H2.
ip link add name br1 type bridge vlan_filtering 1
ip link set dev br1 addrgenmode none
ip link set dev br1 up
ip link set dev $swp1 master br1

View file

@ -65,7 +65,8 @@ setup_prepare()
vrf_prepare
mirror_gre_topo_create
ip link add name br2 type bridge vlan_filtering 0
ip link add name br2 address $(mac_get $swp3) \
type bridge vlan_filtering 0
ip link set dev br2 up
ip link set dev $swp3 master br2

View file

@ -35,7 +35,8 @@ setup_prepare()
vrf_prepare
mirror_gre_topo_create
ip link add name br2 type bridge vlan_filtering 0
ip link add name br2 address $(mac_get $swp3) \
type bridge vlan_filtering 0
ip link set dev br2 up
vlan_create $swp3 555

View file

@ -140,7 +140,8 @@ switch_create()
ip link set dev $swp3 up
ip link set dev $swp4 up
ip link add name br1 type bridge vlan_filtering 1
ip link add name br1 address $(mac_get $swp3) \
type bridge vlan_filtering 1
team_create lag loadbalance $swp3 $swp4
ip link set dev lag master br1

View file

@ -60,6 +60,7 @@ mirror_topo_switch_create()
ip link set dev $swp3 up
ip link add name br1 type bridge vlan_filtering 1
ip link set dev br1 addrgenmode none
ip link set dev br1 up
ip link set dev $swp1 master br1

View file

@ -60,7 +60,9 @@ h2_destroy()
switch_create()
{
ip link add name br1 up type bridge vlan_filtering 1
ip link add name br1 type bridge vlan_filtering 1
ip link set dev br1 addrgenmode none
ip link set dev br1 up
ip link set dev $swp1 master br1
ip link set dev $swp1 up
ip link set dev $swp2 master br1

View file

@ -137,6 +137,7 @@ switch_create()
{
ip link add name br1 type bridge vlan_filtering 1 vlan_protocol 802.1ad \
vlan_default_pvid 0 mcast_snooping 0
ip link set dev br1 addrgenmode none
# Make sure the bridge uses the MAC address of the local port and not
# that of the VxLAN's device.
ip link set dev br1 address $(mac_get $swp1)

View file

@ -38,7 +38,8 @@ h2_destroy()
router_create()
{
ip link add name br1 type bridge vlan_filtering 1
ip link add name br1 address $(mac_get $swp1) \
type bridge vlan_filtering 1
ip link set dev br1 up
ip link set dev $swp1 master br1

View file

@ -54,7 +54,9 @@ h2_destroy()
switch_create()
{
ip link add name br1 up type bridge vlan_filtering 1
ip link add name br1 type bridge vlan_filtering 1
ip link set dev br1 addrgenmode none
ip link set dev br1 up
ip link set dev $swp1 master br1
ip link set dev $swp1 up
ip link set dev $swp2 master br1