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

Configure Feed

Select the types of activity you want to include in your feed.

Merge branch 'bridge-redirect-to-backup-port-when-port-is-administratively-down'

Ido Schimmel says:

====================
bridge: Redirect to backup port when port is administratively down

Patch #1 amends the bridge to redirect to the backup port when the
primary port is administratively down and not only when it does not have
a carrier. See the commit message for more details.

Patch #2 extends the bridge backup port selftest to cover this case.
====================

Link: https://patch.msgid.link/20250812080213.325298-1-idosch@nvidia.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

+29 -5
+2 -1
net/bridge/br_forward.c
··· 148 148 goto out; 149 149 150 150 /* redirect to backup link if the destination port is down */ 151 - if (rcu_access_pointer(to->backup_port) && !netif_carrier_ok(to->dev)) { 151 + if (rcu_access_pointer(to->backup_port) && 152 + (!netif_carrier_ok(to->dev) || !netif_running(to->dev))) { 152 153 struct net_bridge_port *backup_port; 153 154 154 155 backup_port = rcu_dereference(to->backup_port);
+27 -4
tools/testing/selftests/net/test_bridge_backup_port.sh
··· 315 315 tc_check_packets $sw1 "dev vx0 egress" 101 1 316 316 log_test $? 0 "No forwarding out of vx0" 317 317 318 + # Check that packets are forwarded out of vx0 when swp1 is 319 + # administratively down and out of swp1 when it is administratively up 320 + # again. 321 + run_cmd "ip -n $sw1 link set dev swp1 down" 322 + busywait $BUSYWAIT_TIMEOUT bridge_link_check $sw1 swp1 disabled 323 + log_test $? 0 "swp1 administratively down" 324 + 325 + 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" 326 + tc_check_packets $sw1 "dev swp1 egress" 101 3 327 + log_test $? 0 "No forwarding out of swp1" 328 + tc_check_packets $sw1 "dev vx0 egress" 101 2 329 + log_test $? 0 "Forwarding out of vx0" 330 + 331 + run_cmd "ip -n $sw1 link set dev swp1 up" 332 + busywait $BUSYWAIT_TIMEOUT bridge_link_check $sw1 swp1 forwarding 333 + log_test $? 0 "swp1 administratively up" 334 + 335 + 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" 336 + tc_check_packets $sw1 "dev swp1 egress" 101 4 337 + log_test $? 0 "Forwarding out of swp1" 338 + tc_check_packets $sw1 "dev vx0 egress" 101 2 339 + log_test $? 0 "No forwarding out of vx0" 340 + 318 341 # Remove vx0 as the backup port of swp1 and check that packets are no 319 342 # longer forwarded out of vx0 when swp1 does not have a carrier. 320 343 run_cmd "bridge -n $sw1 link set dev swp1 nobackup_port" ··· 345 322 log_test $? 1 "vx0 not configured as backup port of swp1" 346 323 347 324 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" 348 - tc_check_packets $sw1 "dev swp1 egress" 101 4 325 + tc_check_packets $sw1 "dev swp1 egress" 101 5 349 326 log_test $? 0 "Forwarding out of swp1" 350 - tc_check_packets $sw1 "dev vx0 egress" 101 1 327 + tc_check_packets $sw1 "dev vx0 egress" 101 2 351 328 log_test $? 0 "No forwarding out of vx0" 352 329 353 330 run_cmd "ip -n $sw1 link set dev swp1 carrier off" ··· 355 332 log_test $? 0 "swp1 carrier off" 356 333 357 334 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" 358 - tc_check_packets $sw1 "dev swp1 egress" 101 4 335 + tc_check_packets $sw1 "dev swp1 egress" 101 5 359 336 log_test $? 0 "No forwarding out of swp1" 360 - tc_check_packets $sw1 "dev vx0 egress" 101 1 337 + tc_check_packets $sw1 "dev vx0 egress" 101 2 361 338 log_test $? 0 "No forwarding out of vx0" 362 339 } 363 340