brintos

brintos / linux-shallow public Read only

0
0
Text · 27.3 KiB · 1b3f89e Raw
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