776 lines · bash
1#!/bin/bash2# SPDX-License-Identifier: GPL-2.03#4# This test is for checking bridge backup port and backup nexthop ID5# functionality. The topology consists of two bridge (VTEPs) connected using6# VXLAN. The test checks that when the switch port (swp1) is down, traffic is7# redirected to the VXLAN port (vx0). When a backup nexthop ID is configured,8# the test checks that traffic is redirected with the correct nexthop9# information.10#11# +------------------------------------+ +------------------------------------+12# | + swp1 + vx0 | | + swp1 + vx0 |13# | | | | | | | |14# | | br0 | | | | | |15# | +------------+-----------+ | | +------------+-----------+ |16# | | | | | |17# | | | | | |18# | + | | + |19# | br0 | | br0 |20# | + | | + |21# | | | | | |22# | | | | | |23# | + | | + |24# | br0.10 | | br0.10 |25# | 192.0.2.65/28 | | 192.0.2.66/28 |26# | | | |27# | | | |28# | 192.0.2.33 | | 192.0.2.34 |29# | + lo | | + lo |30# | | | |31# | | | |32# | 192.0.2.49/28 | | 192.0.2.50/28 |33# | veth0 +-------+ veth0 |34# | | | |35# | sw1 | | sw2 |36# +------------------------------------+ +------------------------------------+37 38source lib.sh39ret=040 41# All tests in this script. Can be overridden with -t option.42TESTS="43 backup_port44 backup_nhid45 backup_nhid_invalid46 backup_nhid_ping47 backup_nhid_torture48"49VERBOSE=050PAUSE_ON_FAIL=no51PAUSE=no52PING_TIMEOUT=553 54################################################################################55# Utilities56 57log_test()58{59 local rc=$160 local expected=$261 local msg="$3"62 63 if [ ${rc} -eq ${expected} ]; then64 printf "TEST: %-60s [ OK ]\n" "${msg}"65 nsuccess=$((nsuccess+1))66 else67 ret=168 nfail=$((nfail+1))69 printf "TEST: %-60s [FAIL]\n" "${msg}"70 if [ "$VERBOSE" = "1" ]; then71 echo " rc=$rc, expected $expected"72 fi73 74 if [ "${PAUSE_ON_FAIL}" = "yes" ]; then75 echo76 echo "hit enter to continue, 'q' to quit"77 read a78 [ "$a" = "q" ] && exit 179 fi80 fi81 82 if [ "${PAUSE}" = "yes" ]; then83 echo84 echo "hit enter to continue, 'q' to quit"85 read a86 [ "$a" = "q" ] && exit 187 fi88 89 [ "$VERBOSE" = "1" ] && echo90}91 92run_cmd()93{94 local cmd="$1"95 local out96 local stderr="2>/dev/null"97 98 if [ "$VERBOSE" = "1" ]; then99 printf "COMMAND: $cmd\n"100 stderr=101 fi102 103 out=$(eval $cmd $stderr)104 rc=$?105 if [ "$VERBOSE" = "1" -a -n "$out" ]; then106 echo " $out"107 fi108 109 return $rc110}111 112tc_check_packets()113{114 local ns=$1; shift115 local id=$1; shift116 local handle=$1; shift117 local count=$1; shift118 local pkts119 120 sleep 0.1121 pkts=$(tc -n $ns -j -s filter show $id \122 | jq ".[] | select(.options.handle == $handle) | \123 .options.actions[0].stats.packets")124 [[ $pkts == $count ]]125}126 127bridge_link_check()128{129 local ns=$1; shift130 local dev=$1; shift131 local state=$1; shift132 133 bridge -n $ns -d -j link show dev $dev | \134 jq -e ".[][\"state\"] == \"$state\"" &> /dev/null135}136 137################################################################################138# Setup139 140setup_topo_ns()141{142 local ns=$1; shift143 144 ip netns exec $ns sysctl -qw net.ipv6.conf.all.keep_addr_on_down=1145 ip netns exec $ns sysctl -qw net.ipv6.conf.default.ignore_routes_with_linkdown=1146 ip netns exec $ns sysctl -qw net.ipv6.conf.all.accept_dad=0147 ip netns exec $ns sysctl -qw net.ipv6.conf.default.accept_dad=0148}149 150setup_topo()151{152 local ns153 154 setup_ns sw1 sw2155 for ns in $sw1 $sw2; do156 setup_topo_ns $ns157 done158 159 ip link add name veth0 type veth peer name veth1160 ip link set dev veth0 netns $sw1 name veth0161 ip link set dev veth1 netns $sw2 name veth0162}163 164setup_sw_common()165{166 local ns=$1; shift167 local local_addr=$1; shift168 local remote_addr=$1; shift169 local veth_addr=$1; shift170 local gw_addr=$1; shift171 local br_addr=$1; shift172 173 ip -n $ns address add $local_addr/32 dev lo174 175 ip -n $ns link set dev veth0 up176 ip -n $ns address add $veth_addr/28 dev veth0177 ip -n $ns route add default via $gw_addr178 179 ip -n $ns link add name br0 up type bridge vlan_filtering 1 \180 vlan_default_pvid 0 mcast_snooping 0181 182 ip -n $ns link add link br0 name br0.10 up type vlan id 10183 bridge -n $ns vlan add vid 10 dev br0 self184 ip -n $ns address add $br_addr/28 dev br0.10185 186 ip -n $ns link add name swp1 up type dummy187 ip -n $ns link set dev swp1 master br0188 bridge -n $ns vlan add vid 10 dev swp1 untagged189 190 ip -n $ns link add name vx0 up master br0 type vxlan \191 local $local_addr dstport 4789 nolearning external192 bridge -n $ns link set dev vx0 vlan_tunnel on learning off193 194 bridge -n $ns vlan add vid 10 dev vx0195 bridge -n $ns vlan add vid 10 dev vx0 tunnel_info id 10010196}197 198setup_sw1()199{200 local ns=$sw1201 local local_addr=192.0.2.33202 local remote_addr=192.0.2.34203 local veth_addr=192.0.2.49204 local gw_addr=192.0.2.50205 local br_addr=192.0.2.65206 207 setup_sw_common $ns $local_addr $remote_addr $veth_addr $gw_addr \208 $br_addr209}210 211setup_sw2()212{213 local ns=$sw2214 local local_addr=192.0.2.34215 local remote_addr=192.0.2.33216 local veth_addr=192.0.2.50217 local gw_addr=192.0.2.49218 local br_addr=192.0.2.66219 220 setup_sw_common $ns $local_addr $remote_addr $veth_addr $gw_addr \221 $br_addr222}223 224setup()225{226 set -e227 228 setup_topo229 setup_sw1230 setup_sw2231 232 sleep 5233 234 set +e235}236 237cleanup()238{239 cleanup_ns $sw1 $sw2240}241 242################################################################################243# Tests244 245backup_port()246{247 local dmac=00:11:22:33:44:55248 local smac=00:aa:bb:cc:dd:ee249 250 echo251 echo "Backup port"252 echo "-----------"253 254 run_cmd "tc -n $sw1 qdisc replace dev swp1 clsact"255 run_cmd "tc -n $sw1 filter replace dev swp1 egress pref 1 handle 101 proto ip flower src_mac $smac dst_mac $dmac action pass"256 257 run_cmd "tc -n $sw1 qdisc replace dev vx0 clsact"258 run_cmd "tc -n $sw1 filter replace dev vx0 egress pref 1 handle 101 proto ip flower src_mac $smac dst_mac $dmac action pass"259 260 run_cmd "bridge -n $sw1 fdb replace $dmac dev swp1 master static vlan 10"261 262 # Initial state - check that packets are forwarded out of swp1 when it263 # has a carrier and not forwarded out of any port when it does not have264 # a carrier.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"266 tc_check_packets $sw1 "dev swp1 egress" 101 1267 log_test $? 0 "Forwarding out of swp1"268 tc_check_packets $sw1 "dev vx0 egress" 101 0269 log_test $? 0 "No forwarding out of vx0"270 271 run_cmd "ip -n $sw1 link set dev swp1 carrier off"272 busywait $BUSYWAIT_TIMEOUT bridge_link_check $sw1 swp1 disabled273 log_test $? 0 "swp1 carrier off"274 275 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"276 tc_check_packets $sw1 "dev swp1 egress" 101 1277 log_test $? 0 "No forwarding out of swp1"278 tc_check_packets $sw1 "dev vx0 egress" 101 0279 log_test $? 0 "No forwarding out of vx0"280 281 run_cmd "ip -n $sw1 link set dev swp1 carrier on"282 busywait $BUSYWAIT_TIMEOUT bridge_link_check $sw1 swp1 forwarding283 log_test $? 0 "swp1 carrier on"284 285 # Configure vx0 as the backup port of swp1 and check that packets are286 # forwarded out of swp1 when it has a carrier and out of vx0 when swp1287 # does not have a carrier.288 run_cmd "bridge -n $sw1 link set dev swp1 backup_port vx0"289 run_cmd "bridge -n $sw1 -d link show dev swp1 | grep \"backup_port vx0\""290 log_test $? 0 "vx0 configured as backup port of swp1"291 292 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"293 tc_check_packets $sw1 "dev swp1 egress" 101 2294 log_test $? 0 "Forwarding out of swp1"295 tc_check_packets $sw1 "dev vx0 egress" 101 0296 log_test $? 0 "No forwarding out of vx0"297 298 run_cmd "ip -n $sw1 link set dev swp1 carrier off"299 busywait $BUSYWAIT_TIMEOUT bridge_link_check $sw1 swp1 disabled300 log_test $? 0 "swp1 carrier off"301 302 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"303 tc_check_packets $sw1 "dev swp1 egress" 101 2304 log_test $? 0 "No forwarding out of swp1"305 tc_check_packets $sw1 "dev vx0 egress" 101 1306 log_test $? 0 "Forwarding out of vx0"307 308 run_cmd "ip -n $sw1 link set dev swp1 carrier on"309 busywait $BUSYWAIT_TIMEOUT bridge_link_check $sw1 swp1 forwarding310 log_test $? 0 "swp1 carrier on"311 312 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"313 tc_check_packets $sw1 "dev swp1 egress" 101 3314 log_test $? 0 "Forwarding out of swp1"315 tc_check_packets $sw1 "dev vx0 egress" 101 1316 log_test $? 0 "No forwarding out of vx0"317 318 # Remove vx0 as the backup port of swp1 and check that packets are no319 # longer forwarded out of vx0 when swp1 does not have a carrier.320 run_cmd "bridge -n $sw1 link set dev swp1 nobackup_port"321 run_cmd "bridge -n $sw1 -d link show dev swp1 | grep \"backup_port vx0\""322 log_test $? 1 "vx0 not configured as backup port of swp1"323 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"325 tc_check_packets $sw1 "dev swp1 egress" 101 4326 log_test $? 0 "Forwarding out of swp1"327 tc_check_packets $sw1 "dev vx0 egress" 101 1328 log_test $? 0 "No forwarding out of vx0"329 330 run_cmd "ip -n $sw1 link set dev swp1 carrier off"331 busywait $BUSYWAIT_TIMEOUT bridge_link_check $sw1 swp1 disabled332 log_test $? 0 "swp1 carrier off"333 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"335 tc_check_packets $sw1 "dev swp1 egress" 101 4336 log_test $? 0 "No forwarding out of swp1"337 tc_check_packets $sw1 "dev vx0 egress" 101 1338 log_test $? 0 "No forwarding out of vx0"339}340 341backup_nhid()342{343 local dmac=00:11:22:33:44:55344 local smac=00:aa:bb:cc:dd:ee345 346 echo347 echo "Backup nexthop ID"348 echo "-----------------"349 350 run_cmd "tc -n $sw1 qdisc replace dev swp1 clsact"351 run_cmd "tc -n $sw1 filter replace dev swp1 egress pref 1 handle 101 proto ip flower src_mac $smac dst_mac $dmac action pass"352 353 run_cmd "tc -n $sw1 qdisc replace dev vx0 clsact"354 run_cmd "tc -n $sw1 filter replace dev vx0 egress pref 1 handle 101 proto ip flower src_mac $smac dst_mac $dmac action pass"355 356 run_cmd "ip -n $sw1 nexthop replace id 1 via 192.0.2.34 fdb"357 run_cmd "ip -n $sw1 nexthop replace id 2 via 192.0.2.34 fdb"358 run_cmd "ip -n $sw1 nexthop replace id 10 group 1/2 fdb"359 360 run_cmd "bridge -n $sw1 fdb replace $dmac dev swp1 master static vlan 10"361 run_cmd "bridge -n $sw1 fdb replace $dmac dev vx0 self static dst 192.0.2.36 src_vni 10010"362 363 run_cmd "ip -n $sw2 address replace 192.0.2.36/32 dev lo"364 365 # The first filter matches on packets forwarded using the backup366 # nexthop ID and the second filter matches on packets forwarded using a367 # regular VXLAN FDB entry.368 run_cmd "tc -n $sw2 qdisc replace dev vx0 clsact"369 run_cmd "tc -n $sw2 filter replace dev vx0 ingress pref 1 handle 101 proto ip flower src_mac $smac dst_mac $dmac enc_key_id 10010 enc_dst_ip 192.0.2.34 action pass"370 run_cmd "tc -n $sw2 filter replace dev vx0 ingress pref 1 handle 102 proto ip flower src_mac $smac dst_mac $dmac enc_key_id 10010 enc_dst_ip 192.0.2.36 action pass"371 372 # Configure vx0 as the backup port of swp1 and check that packets are373 # forwarded out of swp1 when it has a carrier and out of vx0 when swp1374 # does not have a carrier. When packets are forwarded out of vx0, check375 # that they are forwarded by the VXLAN FDB entry.376 run_cmd "bridge -n $sw1 link set dev swp1 backup_port vx0"377 run_cmd "bridge -n $sw1 -d link show dev swp1 | grep \"backup_port vx0\""378 log_test $? 0 "vx0 configured as backup port of swp1"379 380 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"381 tc_check_packets $sw1 "dev swp1 egress" 101 1382 log_test $? 0 "Forwarding out of swp1"383 tc_check_packets $sw1 "dev vx0 egress" 101 0384 log_test $? 0 "No forwarding out of vx0"385 386 run_cmd "ip -n $sw1 link set dev swp1 carrier off"387 busywait $BUSYWAIT_TIMEOUT bridge_link_check $sw1 swp1 disabled388 log_test $? 0 "swp1 carrier off"389 390 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"391 tc_check_packets $sw1 "dev swp1 egress" 101 1392 log_test $? 0 "No forwarding out of swp1"393 tc_check_packets $sw1 "dev vx0 egress" 101 1394 log_test $? 0 "Forwarding out of vx0"395 tc_check_packets $sw2 "dev vx0 ingress" 101 0396 log_test $? 0 "No forwarding using backup nexthop ID"397 tc_check_packets $sw2 "dev vx0 ingress" 102 1398 log_test $? 0 "Forwarding using VXLAN FDB entry"399 400 run_cmd "ip -n $sw1 link set dev swp1 carrier on"401 busywait $BUSYWAIT_TIMEOUT bridge_link_check $sw1 swp1 forwarding402 log_test $? 0 "swp1 carrier on"403 404 # Configure nexthop ID 10 as the backup nexthop ID of swp1 and check405 # that when packets are forwarded out of vx0, they are forwarded using406 # the backup nexthop ID.407 run_cmd "bridge -n $sw1 link set dev swp1 backup_nhid 10"408 run_cmd "bridge -n $sw1 -d link show dev swp1 | grep \"backup_nhid 10\""409 log_test $? 0 "nexthop ID 10 configured as backup nexthop ID of swp1"410 411 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"412 tc_check_packets $sw1 "dev swp1 egress" 101 2413 log_test $? 0 "Forwarding out of swp1"414 tc_check_packets $sw1 "dev vx0 egress" 101 1415 log_test $? 0 "No forwarding out of vx0"416 417 run_cmd "ip -n $sw1 link set dev swp1 carrier off"418 busywait $BUSYWAIT_TIMEOUT bridge_link_check $sw1 swp1 disabled419 log_test $? 0 "swp1 carrier off"420 421 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"422 tc_check_packets $sw1 "dev swp1 egress" 101 2423 log_test $? 0 "No forwarding out of swp1"424 tc_check_packets $sw1 "dev vx0 egress" 101 2425 log_test $? 0 "Forwarding out of vx0"426 tc_check_packets $sw2 "dev vx0 ingress" 101 1427 log_test $? 0 "Forwarding using backup nexthop ID"428 tc_check_packets $sw2 "dev vx0 ingress" 102 1429 log_test $? 0 "No forwarding using VXLAN FDB entry"430 431 run_cmd "ip -n $sw1 link set dev swp1 carrier on"432 busywait $BUSYWAIT_TIMEOUT bridge_link_check $sw1 swp1 forwarding433 log_test $? 0 "swp1 carrier on"434 435 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"436 tc_check_packets $sw1 "dev swp1 egress" 101 3437 log_test $? 0 "Forwarding out of swp1"438 tc_check_packets $sw1 "dev vx0 egress" 101 2439 log_test $? 0 "No forwarding out of vx0"440 tc_check_packets $sw2 "dev vx0 ingress" 101 1441 log_test $? 0 "No forwarding using backup nexthop ID"442 tc_check_packets $sw2 "dev vx0 ingress" 102 1443 log_test $? 0 "No forwarding using VXLAN FDB entry"444 445 # Reset the backup nexthop ID to 0 and check that packets are no longer446 # forwarded using the backup nexthop ID when swp1 does not have a447 # carrier and are instead forwarded by the VXLAN FDB.448 run_cmd "bridge -n $sw1 link set dev swp1 backup_nhid 0"449 run_cmd "bridge -n $sw1 -d link show dev swp1 | grep \"backup_nhid\""450 log_test $? 1 "No backup nexthop ID configured for swp1"451 452 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"453 tc_check_packets $sw1 "dev swp1 egress" 101 4454 log_test $? 0 "Forwarding out of swp1"455 tc_check_packets $sw1 "dev vx0 egress" 101 2456 log_test $? 0 "No forwarding out of vx0"457 tc_check_packets $sw2 "dev vx0 ingress" 101 1458 log_test $? 0 "No forwarding using backup nexthop ID"459 tc_check_packets $sw2 "dev vx0 ingress" 102 1460 log_test $? 0 "No forwarding using VXLAN FDB entry"461 462 run_cmd "ip -n $sw1 link set dev swp1 carrier off"463 busywait $BUSYWAIT_TIMEOUT bridge_link_check $sw1 swp1 disabled464 log_test $? 0 "swp1 carrier off"465 466 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"467 tc_check_packets $sw1 "dev swp1 egress" 101 4468 log_test $? 0 "No forwarding out of swp1"469 tc_check_packets $sw1 "dev vx0 egress" 101 3470 log_test $? 0 "Forwarding out of vx0"471 tc_check_packets $sw2 "dev vx0 ingress" 101 1472 log_test $? 0 "No forwarding using backup nexthop ID"473 tc_check_packets $sw2 "dev vx0 ingress" 102 2474 log_test $? 0 "Forwarding using VXLAN FDB entry"475}476 477backup_nhid_invalid()478{479 local dmac=00:11:22:33:44:55480 local smac=00:aa:bb:cc:dd:ee481 local tx_drop482 483 echo484 echo "Backup nexthop ID - invalid IDs"485 echo "-------------------------------"486 487 # Check that when traffic is redirected with an invalid nexthop ID, it488 # is forwarded out of the VXLAN port, but dropped by the VXLAN driver489 # and does not crash the host.490 491 run_cmd "tc -n $sw1 qdisc replace dev swp1 clsact"492 run_cmd "tc -n $sw1 filter replace dev swp1 egress pref 1 handle 101 proto ip flower src_mac $smac dst_mac $dmac action pass"493 494 run_cmd "tc -n $sw1 qdisc replace dev vx0 clsact"495 run_cmd "tc -n $sw1 filter replace dev vx0 egress pref 1 handle 101 proto ip flower src_mac $smac dst_mac $dmac action pass"496 # Drop all other Tx traffic to avoid changes to Tx drop counter.497 run_cmd "tc -n $sw1 filter replace dev vx0 egress pref 2 handle 102 proto all matchall action drop"498 499 tx_drop=$(ip -n $sw1 -s -j link show dev vx0 | jq '.[]["stats64"]["tx"]["dropped"]')500 501 run_cmd "ip -n $sw1 nexthop replace id 1 via 192.0.2.34 fdb"502 run_cmd "ip -n $sw1 nexthop replace id 2 via 192.0.2.34 fdb"503 run_cmd "ip -n $sw1 nexthop replace id 10 group 1/2 fdb"504 505 run_cmd "bridge -n $sw1 fdb replace $dmac dev swp1 master static vlan 10"506 507 run_cmd "tc -n $sw2 qdisc replace dev vx0 clsact"508 run_cmd "tc -n $sw2 filter replace dev vx0 ingress pref 1 handle 101 proto ip flower src_mac $smac dst_mac $dmac enc_key_id 10010 enc_dst_ip 192.0.2.34 action pass"509 510 # First, check that redirection works.511 run_cmd "bridge -n $sw1 link set dev swp1 backup_port vx0"512 run_cmd "bridge -n $sw1 -d link show dev swp1 | grep \"backup_port vx0\""513 log_test $? 0 "vx0 configured as backup port of swp1"514 515 run_cmd "bridge -n $sw1 link set dev swp1 backup_nhid 10"516 run_cmd "bridge -n $sw1 -d link show dev swp1 | grep \"backup_nhid 10\""517 log_test $? 0 "Valid nexthop as backup nexthop"518 519 run_cmd "ip -n $sw1 link set dev swp1 carrier off"520 busywait $BUSYWAIT_TIMEOUT bridge_link_check $sw1 swp1 disabled521 log_test $? 0 "swp1 carrier off"522 523 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"524 tc_check_packets $sw1 "dev swp1 egress" 101 0525 log_test $? 0 "No forwarding out of swp1"526 tc_check_packets $sw1 "dev vx0 egress" 101 1527 log_test $? 0 "Forwarding out of vx0"528 tc_check_packets $sw2 "dev vx0 ingress" 101 1529 log_test $? 0 "Forwarding using backup nexthop ID"530 run_cmd "ip -n $sw1 -s -j link show dev vx0 | jq -e '.[][\"stats64\"][\"tx\"][\"dropped\"] == $tx_drop'"531 log_test $? 0 "No Tx drop increase"532 533 # Use a non-existent nexthop ID.534 run_cmd "bridge -n $sw1 link set dev swp1 backup_nhid 20"535 run_cmd "bridge -n $sw1 -d link show dev swp1 | grep \"backup_nhid 20\""536 log_test $? 0 "Non-existent nexthop as backup nexthop"537 538 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"539 tc_check_packets $sw1 "dev swp1 egress" 101 0540 log_test $? 0 "No forwarding out of swp1"541 tc_check_packets $sw1 "dev vx0 egress" 101 2542 log_test $? 0 "Forwarding out of vx0"543 tc_check_packets $sw2 "dev vx0 ingress" 101 1544 log_test $? 0 "No forwarding using backup nexthop ID"545 run_cmd "ip -n $sw1 -s -j link show dev vx0 | jq -e '.[][\"stats64\"][\"tx\"][\"dropped\"] == $((tx_drop + 1))'"546 log_test $? 0 "Tx drop increased"547 548 # Use a blckhole nexthop.549 run_cmd "ip -n $sw1 nexthop replace id 30 blackhole"550 run_cmd "bridge -n $sw1 link set dev swp1 backup_nhid 30"551 run_cmd "bridge -n $sw1 -d link show dev swp1 | grep \"backup_nhid 30\""552 log_test $? 0 "Blackhole nexthop as backup nexthop"553 554 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"555 tc_check_packets $sw1 "dev swp1 egress" 101 0556 log_test $? 0 "No forwarding out of swp1"557 tc_check_packets $sw1 "dev vx0 egress" 101 3558 log_test $? 0 "Forwarding out of vx0"559 tc_check_packets $sw2 "dev vx0 ingress" 101 1560 log_test $? 0 "No forwarding using backup nexthop ID"561 run_cmd "ip -n $sw1 -s -j link show dev vx0 | jq -e '.[][\"stats64\"][\"tx\"][\"dropped\"] == $((tx_drop + 2))'"562 log_test $? 0 "Tx drop increased"563 564 # Non-group FDB nexthop.565 run_cmd "bridge -n $sw1 link set dev swp1 backup_nhid 1"566 run_cmd "bridge -n $sw1 -d link show dev swp1 | grep \"backup_nhid 1\""567 log_test $? 0 "Non-group FDB nexthop as backup nexthop"568 569 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"570 tc_check_packets $sw1 "dev swp1 egress" 101 0571 log_test $? 0 "No forwarding out of swp1"572 tc_check_packets $sw1 "dev vx0 egress" 101 4573 log_test $? 0 "Forwarding out of vx0"574 tc_check_packets $sw2 "dev vx0 ingress" 101 1575 log_test $? 0 "No forwarding using backup nexthop ID"576 run_cmd "ip -n $sw1 -s -j link show dev vx0 | jq -e '.[][\"stats64\"][\"tx\"][\"dropped\"] == $((tx_drop + 3))'"577 log_test $? 0 "Tx drop increased"578 579 # IPv6 address family nexthop.580 run_cmd "ip -n $sw1 nexthop replace id 100 via 2001:db8:100::1 fdb"581 run_cmd "ip -n $sw1 nexthop replace id 200 via 2001:db8:100::1 fdb"582 run_cmd "ip -n $sw1 nexthop replace id 300 group 100/200 fdb"583 run_cmd "bridge -n $sw1 link set dev swp1 backup_nhid 300"584 run_cmd "bridge -n $sw1 -d link show dev swp1 | grep \"backup_nhid 300\""585 log_test $? 0 "IPv6 address family nexthop as backup nexthop"586 587 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"588 tc_check_packets $sw1 "dev swp1 egress" 101 0589 log_test $? 0 "No forwarding out of swp1"590 tc_check_packets $sw1 "dev vx0 egress" 101 5591 log_test $? 0 "Forwarding out of vx0"592 tc_check_packets $sw2 "dev vx0 ingress" 101 1593 log_test $? 0 "No forwarding using backup nexthop ID"594 run_cmd "ip -n $sw1 -s -j link show dev vx0 | jq -e '.[][\"stats64\"][\"tx\"][\"dropped\"] == $((tx_drop + 4))'"595 log_test $? 0 "Tx drop increased"596}597 598backup_nhid_ping()599{600 local sw1_mac601 local sw2_mac602 603 echo604 echo "Backup nexthop ID - ping"605 echo "------------------------"606 607 # Test bidirectional traffic when traffic is redirected in both VTEPs.608 sw1_mac=$(ip -n $sw1 -j -p link show br0.10 | jq -r '.[]["address"]')609 sw2_mac=$(ip -n $sw2 -j -p link show br0.10 | jq -r '.[]["address"]')610 611 run_cmd "bridge -n $sw1 fdb replace $sw2_mac dev swp1 master static vlan 10"612 run_cmd "bridge -n $sw2 fdb replace $sw1_mac dev swp1 master static vlan 10"613 614 run_cmd "ip -n $sw1 neigh replace 192.0.2.66 lladdr $sw2_mac nud perm dev br0.10"615 run_cmd "ip -n $sw2 neigh replace 192.0.2.65 lladdr $sw1_mac nud perm dev br0.10"616 617 run_cmd "ip -n $sw1 nexthop replace id 1 via 192.0.2.34 fdb"618 run_cmd "ip -n $sw2 nexthop replace id 1 via 192.0.2.33 fdb"619 run_cmd "ip -n $sw1 nexthop replace id 10 group 1 fdb"620 run_cmd "ip -n $sw2 nexthop replace id 10 group 1 fdb"621 622 run_cmd "bridge -n $sw1 link set dev swp1 backup_port vx0"623 run_cmd "bridge -n $sw2 link set dev swp1 backup_port vx0"624 run_cmd "bridge -n $sw1 link set dev swp1 backup_nhid 10"625 run_cmd "bridge -n $sw2 link set dev swp1 backup_nhid 10"626 627 run_cmd "ip -n $sw1 link set dev swp1 carrier off"628 busywait $BUSYWAIT_TIMEOUT bridge_link_check $sw1 swp1 disabled629 run_cmd "ip -n $sw2 link set dev swp1 carrier off"630 busywait $BUSYWAIT_TIMEOUT bridge_link_check $sw2 swp1 disabled631 632 run_cmd "ip netns exec $sw1 ping -i 0.1 -c 10 -w $PING_TIMEOUT 192.0.2.66"633 log_test $? 0 "Ping with backup nexthop ID"634 635 # Reset the backup nexthop ID to 0 and check that ping fails.636 run_cmd "bridge -n $sw1 link set dev swp1 backup_nhid 0"637 run_cmd "bridge -n $sw2 link set dev swp1 backup_nhid 0"638 639 run_cmd "ip netns exec $sw1 ping -i 0.1 -c 10 -w $PING_TIMEOUT 192.0.2.66"640 log_test $? 1 "Ping after disabling backup nexthop ID"641}642 643backup_nhid_add_del_loop()644{645 while true; do646 ip -n $sw1 nexthop del id 10647 ip -n $sw1 nexthop replace id 10 group 1/2 fdb648 done >/dev/null 2>&1649}650 651backup_nhid_torture()652{653 local dmac=00:11:22:33:44:55654 local smac=00:aa:bb:cc:dd:ee655 local pid1656 local pid2657 local pid3658 659 echo660 echo "Backup nexthop ID - torture test"661 echo "--------------------------------"662 663 # Continuously send traffic through the backup nexthop while adding and664 # deleting the group. The test is considered successful if nothing665 # crashed.666 667 run_cmd "ip -n $sw1 nexthop replace id 1 via 192.0.2.34 fdb"668 run_cmd "ip -n $sw1 nexthop replace id 2 via 192.0.2.34 fdb"669 run_cmd "ip -n $sw1 nexthop replace id 10 group 1/2 fdb"670 671 run_cmd "bridge -n $sw1 fdb replace $dmac dev swp1 master static vlan 10"672 673 run_cmd "bridge -n $sw1 link set dev swp1 backup_port vx0"674 run_cmd "bridge -n $sw1 link set dev swp1 backup_nhid 10"675 run_cmd "ip -n $sw1 link set dev swp1 carrier off"676 677 backup_nhid_add_del_loop &678 pid1=$!679 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 0 &680 pid2=$!681 682 sleep 30683 kill -9 $pid1 $pid2684 wait $pid1 $pid2 2>/dev/null685 686 log_test 0 0 "Torture test"687}688 689################################################################################690# Usage691 692usage()693{694 cat <<EOF695usage: ${0##*/} OPTS696 697 -t <test> Test(s) to run (default: all)698 (options: $TESTS)699 -p Pause on fail700 -P Pause after each test before cleanup701 -v Verbose mode (show commands and output)702 -w Timeout for ping703EOF704}705 706################################################################################707# Main708 709trap cleanup EXIT710 711while getopts ":t:pPvhw:" opt; do712 case $opt in713 t) TESTS=$OPTARG;;714 p) PAUSE_ON_FAIL=yes;;715 P) PAUSE=yes;;716 v) VERBOSE=$(($VERBOSE + 1));;717 w) PING_TIMEOUT=$OPTARG;;718 h) usage; exit 0;;719 *) usage; exit 1;;720 esac721done722 723# Make sure we don't pause twice.724[ "${PAUSE}" = "yes" ] && PAUSE_ON_FAIL=no725 726if [ "$(id -u)" -ne 0 ];then727 echo "SKIP: Need root privileges"728 exit $ksft_skip;729fi730 731if [ ! -x "$(command -v ip)" ]; then732 echo "SKIP: Could not run test without ip tool"733 exit $ksft_skip734fi735 736if [ ! -x "$(command -v bridge)" ]; then737 echo "SKIP: Could not run test without bridge tool"738 exit $ksft_skip739fi740 741if [ ! -x "$(command -v tc)" ]; then742 echo "SKIP: Could not run test without tc tool"743 exit $ksft_skip744fi745 746if [ ! -x "$(command -v mausezahn)" ]; then747 echo "SKIP: Could not run test without mausezahn tool"748 exit $ksft_skip749fi750 751if [ ! -x "$(command -v jq)" ]; then752 echo "SKIP: Could not run test without jq tool"753 exit $ksft_skip754fi755 756bridge link help 2>&1 | grep -q "backup_nhid"757if [ $? -ne 0 ]; then758 echo "SKIP: iproute2 bridge too old, missing backup nexthop ID support"759 exit $ksft_skip760fi761 762# Start clean.763cleanup764 765for t in $TESTS766do767 setup; $t; cleanup;768done769 770if [ "$TESTS" != "none" ]; then771 printf "\nTests passed: %3d\n" ${nsuccess}772 printf "Tests failed: %3d\n" ${nfail}773fi774 775exit $ret776