Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftests: net: Fix bridge backup port test flakiness

The test toggles the carrier of a bridge port in order to test the
bridge backup port feature.

Due to the linkwatch delayed work the carrier change is not always
reflected fast enough to the bridge driver and packets are not forwarded
as the test expects, resulting in failures [1].

Fix by busy waiting on the bridge port state until it changes to the
desired state following the carrier change.

[1]
# Backup port
# -----------
[...]
# TEST: swp1 carrier off [ OK ]
# TEST: No forwarding out of swp1 [FAIL]
[ 641.995910] br0: port 1(swp1) entered disabled state
# TEST: No forwarding out of vx0 [ OK ]

Fixes: b408453053fb ("selftests: net: Add bridge backup port and backup nexthop ID test")
Signed-off-by: Ido Schimmel <idosch@nvidia.com>
Reviewed-by: Petr Machata <petrm@nvidia.com>
Acked-by: Paolo Abeni <pabeni@redhat.com>
Acked-by: Nikolay Aleksandrov <razor@blackwall.org>
Link: https://lore.kernel.org/r/20240208123110.1063930-1-idosch@nvidia.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

authored by

Ido Schimmel and committed by
Jakub Kicinski
38ee0cb2 02d9009f

+23
+23
tools/testing/selftests/net/test_bridge_backup_port.sh
··· 124 124 [[ $pkts == $count ]] 125 125 } 126 126 127 + bridge_link_check() 128 + { 129 + local ns=$1; shift 130 + local dev=$1; shift 131 + local state=$1; shift 132 + 133 + bridge -n $ns -d -j link show dev $dev | \ 134 + jq -e ".[][\"state\"] == \"$state\"" &> /dev/null 135 + } 136 + 127 137 ################################################################################ 128 138 # Setup 129 139 ··· 269 259 log_test $? 0 "No forwarding out of vx0" 270 260 271 261 run_cmd "ip -n $sw1 link set dev swp1 carrier off" 262 + busywait $BUSYWAIT_TIMEOUT bridge_link_check $sw1 swp1 disabled 272 263 log_test $? 0 "swp1 carrier off" 273 264 274 265 run_cmd "ip netns exec $sw1 mausezahn br0.10 -a $smac -b $dmac -A 198.51.100.1 -B 198.51.100.2 -t ip -p 100 -q -c 1" ··· 279 268 log_test $? 0 "No forwarding out of vx0" 280 269 281 270 run_cmd "ip -n $sw1 link set dev swp1 carrier on" 271 + busywait $BUSYWAIT_TIMEOUT bridge_link_check $sw1 swp1 forwarding 282 272 log_test $? 0 "swp1 carrier on" 283 273 284 274 # Configure vx0 as the backup port of swp1 and check that packets are ··· 296 284 log_test $? 0 "No forwarding out of vx0" 297 285 298 286 run_cmd "ip -n $sw1 link set dev swp1 carrier off" 287 + busywait $BUSYWAIT_TIMEOUT bridge_link_check $sw1 swp1 disabled 299 288 log_test $? 0 "swp1 carrier off" 300 289 301 290 run_cmd "ip netns exec $sw1 mausezahn br0.10 -a $smac -b $dmac -A 198.51.100.1 -B 198.51.100.2 -t ip -p 100 -q -c 1" ··· 306 293 log_test $? 0 "Forwarding out of vx0" 307 294 308 295 run_cmd "ip -n $sw1 link set dev swp1 carrier on" 296 + busywait $BUSYWAIT_TIMEOUT bridge_link_check $sw1 swp1 forwarding 309 297 log_test $? 0 "swp1 carrier on" 310 298 311 299 run_cmd "ip netns exec $sw1 mausezahn br0.10 -a $smac -b $dmac -A 198.51.100.1 -B 198.51.100.2 -t ip -p 100 -q -c 1" ··· 328 314 log_test $? 0 "No forwarding out of vx0" 329 315 330 316 run_cmd "ip -n $sw1 link set dev swp1 carrier off" 317 + busywait $BUSYWAIT_TIMEOUT bridge_link_check $sw1 swp1 disabled 331 318 log_test $? 0 "swp1 carrier off" 332 319 333 320 run_cmd "ip netns exec $sw1 mausezahn br0.10 -a $smac -b $dmac -A 198.51.100.1 -B 198.51.100.2 -t ip -p 100 -q -c 1" ··· 384 369 log_test $? 0 "No forwarding out of vx0" 385 370 386 371 run_cmd "ip -n $sw1 link set dev swp1 carrier off" 372 + busywait $BUSYWAIT_TIMEOUT bridge_link_check $sw1 swp1 disabled 387 373 log_test $? 0 "swp1 carrier off" 388 374 389 375 run_cmd "ip netns exec $sw1 mausezahn br0.10 -a $smac -b $dmac -A 198.51.100.1 -B 198.51.100.2 -t ip -p 100 -q -c 1" ··· 398 382 log_test $? 0 "Forwarding using VXLAN FDB entry" 399 383 400 384 run_cmd "ip -n $sw1 link set dev swp1 carrier on" 385 + busywait $BUSYWAIT_TIMEOUT bridge_link_check $sw1 swp1 forwarding 401 386 log_test $? 0 "swp1 carrier on" 402 387 403 388 # Configure nexthop ID 10 as the backup nexthop ID of swp1 and check ··· 415 398 log_test $? 0 "No forwarding out of vx0" 416 399 417 400 run_cmd "ip -n $sw1 link set dev swp1 carrier off" 401 + busywait $BUSYWAIT_TIMEOUT bridge_link_check $sw1 swp1 disabled 418 402 log_test $? 0 "swp1 carrier off" 419 403 420 404 run_cmd "ip netns exec $sw1 mausezahn br0.10 -a $smac -b $dmac -A 198.51.100.1 -B 198.51.100.2 -t ip -p 100 -q -c 1" ··· 429 411 log_test $? 0 "No forwarding using VXLAN FDB entry" 430 412 431 413 run_cmd "ip -n $sw1 link set dev swp1 carrier on" 414 + busywait $BUSYWAIT_TIMEOUT bridge_link_check $sw1 swp1 forwarding 432 415 log_test $? 0 "swp1 carrier on" 433 416 434 417 run_cmd "ip netns exec $sw1 mausezahn br0.10 -a $smac -b $dmac -A 198.51.100.1 -B 198.51.100.2 -t ip -p 100 -q -c 1" ··· 460 441 log_test $? 0 "No forwarding using VXLAN FDB entry" 461 442 462 443 run_cmd "ip -n $sw1 link set dev swp1 carrier off" 444 + busywait $BUSYWAIT_TIMEOUT bridge_link_check $sw1 swp1 disabled 463 445 log_test $? 0 "swp1 carrier off" 464 446 465 447 run_cmd "ip netns exec $sw1 mausezahn br0.10 -a $smac -b $dmac -A 198.51.100.1 -B 198.51.100.2 -t ip -p 100 -q -c 1" ··· 517 497 log_test $? 0 "Valid nexthop as backup nexthop" 518 498 519 499 run_cmd "ip -n $sw1 link set dev swp1 carrier off" 500 + busywait $BUSYWAIT_TIMEOUT bridge_link_check $sw1 swp1 disabled 520 501 log_test $? 0 "swp1 carrier off" 521 502 522 503 run_cmd "ip netns exec $sw1 mausezahn br0.10 -a $smac -b $dmac -A 198.51.100.1 -B 198.51.100.2 -t ip -p 100 -q -c 1" ··· 625 604 run_cmd "bridge -n $sw2 link set dev swp1 backup_nhid 10" 626 605 627 606 run_cmd "ip -n $sw1 link set dev swp1 carrier off" 607 + busywait $BUSYWAIT_TIMEOUT bridge_link_check $sw1 swp1 disabled 628 608 run_cmd "ip -n $sw2 link set dev swp1 carrier off" 609 + busywait $BUSYWAIT_TIMEOUT bridge_link_check $sw2 swp1 disabled 629 610 630 611 run_cmd "ip netns exec $sw1 ping -i 0.1 -c 10 -w $PING_TIMEOUT 192.0.2.66" 631 612 log_test $? 0 "Ping with backup nexthop ID"