xref: /linux/tools/testing/selftests/net/test_bridge_neigh_suppress.sh (revision b2128290c29902315e632ea59e0504d6bc9e9b42)
1#!/bin/bash
2# SPDX-License-Identifier: GPL-2.0
3#
4# This test is for checking bridge neighbor suppression functionality. The
5# topology consists of two bridges (VTEPs) connected using VXLAN. A single
6# host is connected to each bridge over multiple VLANs. The test checks that
7# ARP/NS messages from the first host are suppressed on the VXLAN port when
8# should.
9#
10# +-----------------------+              +------------------------+
11# | h1                    |              | h2                     |
12# |                       |              |                        |
13# | + eth0.10             |              | + eth0.10              |
14# | | 192.0.2.1/28        |              | | 192.0.2.2/28         |
15# | | 2001:db8:1::1/64    |              | | 2001:db8:1::2/64     |
16# | |                     |              | |                      |
17# | |  + eth0.20          |              | |  + eth0.20           |
18# | \  | 192.0.2.17/28    |              | \  | 192.0.2.18/28     |
19# |  \ | 2001:db8:2::1/64 |              |  \ | 2001:db8:2::2/64  |
20# |   \|                  |              |   \|                   |
21# |    + eth0             |              |    + eth0              |
22# +----|------------------+              +----|-------------------+
23#      |                                      |
24#      |                                      |
25# +----|-------------------------------+ +----|-------------------------------+
26# |    + swp1                   + vx0  | |    + swp1                   + vx0  |
27# |    |                        |      | |    |                        |      |
28# |    |           br0          |      | |    |                        |      |
29# |    +------------+-----------+      | |    +------------+-----------+      |
30# |                 |                  | |                 |                  |
31# |                 |                  | |                 |                  |
32# |             +---+---+              | |             +---+---+              |
33# |             |       |              | |             |       |              |
34# |             |       |              | |             |       |              |
35# |             +       +              | |             +       +              |
36# |          br0.10  br0.20            | |          br0.10  br0.20            |
37# |                                    | |                                    |
38# |                 192.0.2.33         | |                 192.0.2.34         |
39# |                 + lo               | |                 + lo               |
40# |                                    | |                                    |
41# |                                    | |                                    |
42# |                   192.0.2.49/28    | |    192.0.2.50/28                   |
43# |                           veth0 +-------+ veth0                           |
44# |                                    | |                                    |
45# | sw1                                | | sw2                                |
46# +------------------------------------+ +------------------------------------+
47
48source lib.sh
49ret=0
50
51# All tests in this script. Can be overridden with -t option.
52TESTS="
53	neigh_suppress_arp
54	neigh_suppress_uc_arp
55	neigh_suppress_ns
56	neigh_suppress_uc_ns
57	neigh_vlan_suppress_arp
58	neigh_vlan_suppress_ns
59	neigh_suppress_arp_probe
60	neigh_suppress_dad_ns
61	neigh_forward_grat_arp
62	neigh_forward_grat_na
63	neigh_vlan_forward_grat_arp
64	neigh_vlan_forward_grat_na
65"
66VERBOSE=0
67PAUSE_ON_FAIL=no
68PAUSE=no
69
70################################################################################
71# Utilities
72
73log_test()
74{
75	local rc=$1
76	local expected=$2
77	local msg="$3"
78
79	if [ ${rc} -eq ${expected} ]; then
80		printf "TEST: %-60s  [ OK ]\n" "${msg}"
81		nsuccess=$((nsuccess+1))
82	else
83		# shellcheck disable=SC2154
84		ret=$(ksft_exit_status_merge "$ret" "$ksft_fail")
85		nfail=$((nfail+1))
86		printf "TEST: %-60s  [FAIL]\n" "${msg}"
87		if [ "$VERBOSE" = "1" ]; then
88			echo "    rc=$rc, expected $expected"
89		fi
90
91		if [ "${PAUSE_ON_FAIL}" = "yes" ]; then
92		echo
93			echo "hit enter to continue, 'q' to quit"
94			read a
95			[ "$a" = "q" ] && exit 1
96		fi
97	fi
98
99	if [ "${PAUSE}" = "yes" ]; then
100		echo
101		echo "hit enter to continue, 'q' to quit"
102		read a
103		[ "$a" = "q" ] && exit 1
104	fi
105
106	[ "$VERBOSE" = "1" ] && echo
107	return 0
108}
109
110run_cmd()
111{
112	local cmd="$1"
113	local out
114	local stderr="2>/dev/null"
115
116	if [ "$VERBOSE" = "1" ]; then
117		printf "COMMAND: $cmd\n"
118		stderr=
119	fi
120
121	out=$(eval $cmd $stderr)
122	rc=$?
123	if [ "$VERBOSE" = "1" -a -n "$out" ]; then
124		echo "    $out"
125	fi
126
127	return $rc
128}
129
130tc_check_packets()
131{
132	local ns=$1; shift
133	local id=$1; shift
134	local handle=$1; shift
135	local count=$1; shift
136	local pkts
137
138	sleep 0.1
139	pkts=$(tc -n $ns -j -s filter show $id \
140		| jq ".[] | select(.options.handle == $handle) | \
141		.options.actions[0].stats.packets")
142	[[ $pkts == $count ]]
143}
144
145neigh_forward_grat_check()
146{
147	if ! bridge link help 2>&1 | grep -q "neigh_forward_grat"; then
148		echo "SKIP: iproute2 bridge too old, missing gratuitous ARP/unsolicited NA forwarding control support"
149		# shellcheck disable=SC2154
150		return "$ksft_skip"
151	fi
152}
153
154################################################################################
155# Setup
156
157setup_topo_ns()
158{
159	local ns=$1; shift
160
161	ip netns exec $ns sysctl -qw net.ipv6.conf.all.keep_addr_on_down=1
162	ip netns exec $ns sysctl -qw net.ipv6.conf.default.ignore_routes_with_linkdown=1
163	ip netns exec $ns sysctl -qw net.ipv6.conf.all.accept_dad=0
164	ip netns exec $ns sysctl -qw net.ipv6.conf.default.accept_dad=0
165}
166
167setup_topo()
168{
169	local ns
170
171	setup_ns h1 h2 sw1 sw2
172	for ns in $h1 $h2 $sw1 $sw2; do
173		setup_topo_ns $ns
174	done
175
176	ip -n $h1 link add name eth0 type veth peer name swp1 netns $sw1
177	ip -n $sw1 link add name veth0 type veth peer name veth0 netns $sw2
178	ip -n $h2 link add name eth0 type veth peer name swp1 netns $sw2
179}
180
181setup_host_common()
182{
183	local ns=$1; shift
184	local v4addr1=$1; shift
185	local v4addr2=$1; shift
186	local v6addr1=$1; shift
187	local v6addr2=$1; shift
188
189	ip -n $ns link set dev eth0 up
190	ip -n $ns link add link eth0 name eth0.10 up type vlan id 10
191	ip -n $ns link add link eth0 name eth0.20 up type vlan id 20
192
193	ip -n $ns address add $v4addr1 dev eth0.10
194	ip -n $ns address add $v4addr2 dev eth0.20
195	ip -n $ns address add $v6addr1 dev eth0.10
196	ip -n $ns address add $v6addr2 dev eth0.20
197}
198
199setup_h1()
200{
201	local ns=$h1
202	local v4addr1=192.0.2.1/28
203	local v4addr2=192.0.2.17/28
204	local v6addr1=2001:db8:1::1/64
205	local v6addr2=2001:db8:2::1/64
206
207	setup_host_common $ns $v4addr1 $v4addr2 $v6addr1 $v6addr2
208}
209
210setup_h2()
211{
212	local ns=$h2
213	local v4addr1=192.0.2.2/28
214	local v4addr2=192.0.2.18/28
215	local v6addr1=2001:db8:1::2/64
216	local v6addr2=2001:db8:2::2/64
217
218	setup_host_common $ns $v4addr1 $v4addr2 $v6addr1 $v6addr2
219}
220
221setup_sw_common()
222{
223	local ns=$1; shift
224	local local_addr=$1; shift
225	local remote_addr=$1; shift
226	local veth_addr=$1; shift
227	local gw_addr=$1; shift
228
229	ip -n $ns address add $local_addr/32 dev lo
230
231	ip -n $ns link set dev veth0 up
232	ip -n $ns address add $veth_addr/28 dev veth0
233	ip -n $ns route add default via $gw_addr
234
235	ip -n $ns link add name br0 up type bridge vlan_filtering 1 \
236		vlan_default_pvid 0 mcast_snooping 0
237
238	ip -n $ns link add link br0 name br0.10 up type vlan id 10
239	bridge -n $ns vlan add vid 10 dev br0 self
240
241	ip -n $ns link add link br0 name br0.20 up type vlan id 20
242	bridge -n $ns vlan add vid 20 dev br0 self
243
244	ip -n $ns link set dev swp1 up master br0
245	bridge -n $ns vlan add vid 10 dev swp1
246	bridge -n $ns vlan add vid 20 dev swp1
247
248	ip -n $ns link add name vx0 up master br0 type vxlan \
249		local $local_addr dstport 4789 nolearning external
250	bridge -n $ns fdb add 00:00:00:00:00:00 dev vx0 self static \
251		dst $remote_addr src_vni 10010
252	bridge -n $ns fdb add 00:00:00:00:00:00 dev vx0 self static \
253		dst $remote_addr src_vni 10020
254	bridge -n $ns link set dev vx0 vlan_tunnel on learning off
255
256	bridge -n $ns vlan add vid 10 dev vx0
257	bridge -n $ns vlan add vid 10 dev vx0 tunnel_info id 10010
258
259	bridge -n $ns vlan add vid 20 dev vx0
260	bridge -n $ns vlan add vid 20 dev vx0 tunnel_info id 10020
261}
262
263setup_sw1()
264{
265	local ns=$sw1
266	local local_addr=192.0.2.33
267	local remote_addr=192.0.2.34
268	local veth_addr=192.0.2.49
269	local gw_addr=192.0.2.50
270
271	setup_sw_common $ns $local_addr $remote_addr $veth_addr $gw_addr
272}
273
274setup_sw2()
275{
276	local ns=$sw2
277	local local_addr=192.0.2.34
278	local remote_addr=192.0.2.33
279	local veth_addr=192.0.2.50
280	local gw_addr=192.0.2.49
281
282	setup_sw_common $ns $local_addr $remote_addr $veth_addr $gw_addr
283}
284
285setup()
286{
287	set -e
288
289	setup_topo
290	setup_h1
291	setup_h2
292	setup_sw1
293	setup_sw2
294
295	sleep 5
296
297	set +e
298}
299
300cleanup()
301{
302	cleanup_ns $h1 $h2 $sw1 $sw2
303}
304
305################################################################################
306# Tests
307
308neigh_suppress_arp_common()
309{
310	local vid=$1; shift
311	local sip=$1; shift
312	local tip=$1; shift
313	local h2_mac
314
315	echo
316	echo "Per-port ARP suppression - VLAN $vid"
317	echo "----------------------------------"
318
319	run_cmd "tc -n $sw1 qdisc replace dev vx0 clsact"
320	run_cmd "tc -n $sw1 filter replace dev vx0 egress pref 1 handle 101 proto 0x0806 flower indev swp1 arp_tip $tip arp_sip $sip arp_op request action pass"
321
322	# Initial state - check that ARP requests are not suppressed and that
323	# ARP replies are received.
324	run_cmd "ip netns exec $h1 arping -q -b -c 1 -w 5 -s $sip -I eth0.$vid $tip"
325	log_test $? 0 "arping"
326	tc_check_packets $sw1 "dev vx0 egress" 101 1
327	log_test $? 0 "ARP suppression"
328
329	# Enable neighbor suppression and check that nothing changes compared
330	# to the initial state.
331	run_cmd "bridge -n $sw1 link set dev vx0 neigh_suppress on"
332	run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_suppress on\""
333	log_test $? 0 "\"neigh_suppress\" is on"
334
335	run_cmd "ip netns exec $h1 arping -q -b -c 1 -w 5 -s $sip -I eth0.$vid $tip"
336	log_test $? 0 "arping"
337	tc_check_packets $sw1 "dev vx0 egress" 101 2
338	log_test $? 0 "ARP suppression"
339
340	# Install an FDB entry for the remote host and check that nothing
341	# changes compared to the initial state.
342	h2_mac=$(ip -n $h2 -j -p link show eth0.$vid | jq -r '.[]["address"]')
343	run_cmd "bridge -n $sw1 fdb replace $h2_mac dev vx0 master static vlan $vid"
344	log_test $? 0 "FDB entry installation"
345
346	run_cmd "ip netns exec $h1 arping -q -b -c 1 -w 5 -s $sip -I eth0.$vid $tip"
347	log_test $? 0 "arping"
348	tc_check_packets $sw1 "dev vx0 egress" 101 3
349	log_test $? 0 "ARP suppression"
350
351	# Install a neighbor on the matching SVI interface and check that ARP
352	# requests are suppressed.
353	run_cmd "ip -n $sw1 neigh replace $tip lladdr $h2_mac nud permanent dev br0.$vid"
354	log_test $? 0 "Neighbor entry installation"
355
356	run_cmd "ip netns exec $h1 arping -q -b -c 1 -w 5 -s $sip -I eth0.$vid $tip"
357	log_test $? 0 "arping"
358	tc_check_packets $sw1 "dev vx0 egress" 101 3
359	log_test $? 0 "ARP suppression"
360
361	# Take the second host down and check that ARP requests are suppressed
362	# and that ARP replies are received.
363	run_cmd "ip -n $h2 link set dev eth0.$vid down"
364	log_test $? 0 "H2 down"
365
366	run_cmd "ip netns exec $h1 arping -q -b -c 1 -w 5 -s $sip -I eth0.$vid $tip"
367	log_test $? 0 "arping"
368	tc_check_packets $sw1 "dev vx0 egress" 101 3
369	log_test $? 0 "ARP suppression"
370
371	run_cmd "ip -n $h2 link set dev eth0.$vid up"
372	log_test $? 0 "H2 up"
373
374	# Disable neighbor suppression and check that ARP requests are no
375	# longer suppressed.
376	run_cmd "bridge -n $sw1 link set dev vx0 neigh_suppress off"
377	run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_suppress off\""
378	log_test $? 0 "\"neigh_suppress\" is off"
379
380	run_cmd "ip netns exec $h1 arping -q -b -c 1 -w 5 -s $sip -I eth0.$vid $tip"
381	log_test $? 0 "arping"
382	tc_check_packets $sw1 "dev vx0 egress" 101 4
383	log_test $? 0 "ARP suppression"
384
385	# Take the second host down and check that ARP requests are not
386	# suppressed and that ARP replies are not received.
387	run_cmd "ip -n $h2 link set dev eth0.$vid down"
388	log_test $? 0 "H2 down"
389
390	run_cmd "ip netns exec $h1 arping -q -b -c 1 -w 5 -s $sip -I eth0.$vid $tip"
391	log_test $? 1 "arping"
392	tc_check_packets $sw1 "dev vx0 egress" 101 5
393	log_test $? 0 "ARP suppression"
394}
395
396neigh_suppress_arp()
397{
398	local vid=10
399	local sip=192.0.2.1
400	local tip=192.0.2.2
401
402	neigh_suppress_arp_common $vid $sip $tip
403
404	vid=20
405	sip=192.0.2.17
406	tip=192.0.2.18
407	neigh_suppress_arp_common $vid $sip $tip
408}
409
410neigh_suppress_uc_arp_common()
411{
412	local vid=$1; shift
413	local sip=$1; shift
414	local tip=$1; shift
415	local tmac
416
417	echo
418	echo "Unicast ARP, per-port ARP suppression - VLAN $vid"
419	echo "-----------------------------------------------"
420
421	run_cmd "bridge -n $sw1 link set dev vx0 neigh_suppress on"
422	run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_suppress on\""
423	log_test $? 0 "\"neigh_suppress\" is on"
424
425	tmac=$(ip -n $h2 -j -p link show eth0.$vid | jq -r '.[]["address"]')
426	run_cmd "bridge -n $sw1 fdb replace $tmac dev vx0 master static vlan $vid"
427	run_cmd "ip -n $sw1 neigh replace $tip lladdr $tmac nud permanent dev br0.$vid"
428
429	run_cmd "tc -n $h1 qdisc replace dev eth0.$vid clsact"
430	run_cmd "tc -n $h1 filter replace dev eth0.$vid ingress pref 1 handle 101 proto arp flower arp_sip $tip arp_op reply action pass"
431
432	run_cmd "tc -n $h2 qdisc replace dev eth0.$vid clsact"
433	run_cmd "tc -n $h2 filter replace dev eth0.$vid egress pref 1 handle 101 proto arp flower arp_tip $sip arp_op reply action pass"
434
435	run_cmd "ip netns exec $h1 mausezahn eth0.$vid -c 1 -a own -b $tmac -t arp 'request sip=$sip, tip=$tip, tmac=$tmac' -q"
436	tc_check_packets $h1 "dev eth0.$vid ingress" 101 1
437	log_test $? 0 "Unicast ARP, suppression on, h1 filter"
438	tc_check_packets $h2 "dev eth0.$vid egress" 101 1
439	log_test $? 0 "Unicast ARP, suppression on, h2 filter"
440}
441
442neigh_suppress_uc_arp()
443{
444	local vid=10
445	local sip=192.0.2.1
446	local tip=192.0.2.2
447
448	neigh_suppress_uc_arp_common $vid $sip $tip
449
450	vid=20
451	sip=192.0.2.17
452	tip=192.0.2.18
453	neigh_suppress_uc_arp_common $vid $sip $tip
454}
455
456neigh_suppress_ns_common()
457{
458	local vid=$1; shift
459	local saddr=$1; shift
460	local daddr=$1; shift
461	local maddr=$1; shift
462	local h2_mac
463
464	echo
465	echo "Per-port NS suppression - VLAN $vid"
466	echo "---------------------------------"
467
468	run_cmd "tc -n $sw1 qdisc replace dev vx0 clsact"
469	run_cmd "tc -n $sw1 filter replace dev vx0 egress pref 1 handle 101 proto ipv6 flower indev swp1 ip_proto icmpv6 dst_ip $maddr src_ip $saddr type 135 code 0 action pass"
470
471	# Initial state - check that NS messages are not suppressed and that ND
472	# messages are received.
473	run_cmd "ip netns exec $h1 ndisc6 -q -r 1 -s $saddr -w 5000 $daddr eth0.$vid"
474	log_test $? 0 "ndisc6"
475	tc_check_packets $sw1 "dev vx0 egress" 101 1
476	log_test $? 0 "NS suppression"
477
478	# Enable neighbor suppression and check that nothing changes compared
479	# to the initial state.
480	run_cmd "bridge -n $sw1 link set dev vx0 neigh_suppress on"
481	run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_suppress on\""
482	log_test $? 0 "\"neigh_suppress\" is on"
483
484	run_cmd "ip netns exec $h1 ndisc6 -q -r 1 -s $saddr -w 5000 $daddr eth0.$vid"
485	log_test $? 0 "ndisc6"
486	tc_check_packets $sw1 "dev vx0 egress" 101 2
487	log_test $? 0 "NS suppression"
488
489	# Install an FDB entry for the remote host and check that nothing
490	# changes compared to the initial state.
491	h2_mac=$(ip -n $h2 -j -p link show eth0.$vid | jq -r '.[]["address"]')
492	run_cmd "bridge -n $sw1 fdb replace $h2_mac dev vx0 master static vlan $vid"
493	log_test $? 0 "FDB entry installation"
494
495	run_cmd "ip netns exec $h1 ndisc6 -q -r 1 -s $saddr -w 5000 $daddr eth0.$vid"
496	log_test $? 0 "ndisc6"
497	tc_check_packets $sw1 "dev vx0 egress" 101 3
498	log_test $? 0 "NS suppression"
499
500	# Install a neighbor on the matching SVI interface and check that NS
501	# messages are suppressed.
502	run_cmd "ip -n $sw1 neigh replace $daddr lladdr $h2_mac nud permanent dev br0.$vid"
503	log_test $? 0 "Neighbor entry installation"
504
505	run_cmd "ip netns exec $h1 ndisc6 -q -r 1 -s $saddr -w 5000 $daddr eth0.$vid"
506	log_test $? 0 "ndisc6"
507	tc_check_packets $sw1 "dev vx0 egress" 101 3
508	log_test $? 0 "NS suppression"
509
510	# Take the second host down and check that NS messages are suppressed
511	# and that ND messages are received.
512	run_cmd "ip -n $h2 link set dev eth0.$vid down"
513	log_test $? 0 "H2 down"
514
515	run_cmd "ip netns exec $h1 ndisc6 -q -r 1 -s $saddr -w 5000 $daddr eth0.$vid"
516	log_test $? 0 "ndisc6"
517	tc_check_packets $sw1 "dev vx0 egress" 101 3
518	log_test $? 0 "NS suppression"
519
520	run_cmd "ip -n $h2 link set dev eth0.$vid up"
521	log_test $? 0 "H2 up"
522
523	# Disable neighbor suppression and check that NS messages are no longer
524	# suppressed.
525	run_cmd "bridge -n $sw1 link set dev vx0 neigh_suppress off"
526	run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_suppress off\""
527	log_test $? 0 "\"neigh_suppress\" is off"
528
529	run_cmd "ip netns exec $h1 ndisc6 -q -r 1 -s $saddr -w 5000 $daddr eth0.$vid"
530	log_test $? 0 "ndisc6"
531	tc_check_packets $sw1 "dev vx0 egress" 101 4
532	log_test $? 0 "NS suppression"
533
534	# Take the second host down and check that NS messages are not
535	# suppressed and that ND messages are not received.
536	run_cmd "ip -n $h2 link set dev eth0.$vid down"
537	log_test $? 0 "H2 down"
538
539	run_cmd "ip netns exec $h1 ndisc6 -q -r 1 -s $saddr -w 5000 $daddr eth0.$vid"
540	log_test $? 2 "ndisc6"
541	tc_check_packets $sw1 "dev vx0 egress" 101 5
542	log_test $? 0 "NS suppression"
543}
544
545neigh_suppress_ns()
546{
547	local vid=10
548	local saddr=2001:db8:1::1
549	local daddr=2001:db8:1::2
550	local maddr=ff02::1:ff00:2
551
552	neigh_suppress_ns_common $vid $saddr $daddr $maddr
553
554	vid=20
555	saddr=2001:db8:2::1
556	daddr=2001:db8:2::2
557	maddr=ff02::1:ff00:2
558
559	neigh_suppress_ns_common $vid $saddr $daddr $maddr
560}
561
562icmpv6_header_get()
563{
564	local csum=$1; shift
565	local tip=$1; shift
566	local type
567	local p
568
569	# Type 135 (Neighbor Solicitation), hex format
570	type="87"
571	p=$(:
572		)"$type:"$(                     : ICMPv6.type
573		)"00:"$(                        : ICMPv6.code
574		)"$csum:"$(                     : ICMPv6.checksum
575		)"00:00:00:00:"$(               : Reserved
576	        )"$tip:"$(	                : Target Address
577		)
578	echo $p
579}
580
581icmpv6_na_header_get()
582{
583	local csum=$1; shift
584	local tip=$1; shift
585
586	# Type 136 (Neighbor Advertisement), hex format, Override flag set,
587	# Solicited flag clear (unsolicited NA).
588	# ICMPv6.type : ICMPv6.code : ICMPv6.checksum : Flags : Target Address
589	echo "88:00:$csum:20:00:00:00:$tip:"
590}
591
592neigh_suppress_uc_ns_common()
593{
594	local vid=$1; shift
595	local sip=$1; shift
596	local dip=$1; shift
597	local full_dip=$1; shift
598	local csum=$1; shift
599	local tmac
600
601	echo
602	echo "Unicast NS, per-port NS suppression - VLAN $vid"
603	echo "---------------------------------------------"
604
605	run_cmd "bridge -n $sw1 link set dev vx0 neigh_suppress on"
606	run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_suppress on\""
607	log_test $? 0 "\"neigh_suppress\" is on"
608
609	tmac=$(ip -n $h2 -j -p link show eth0.$vid | jq -r '.[]["address"]')
610	run_cmd "bridge -n $sw1 fdb replace $tmac dev vx0 master static vlan $vid"
611	run_cmd "ip -n $sw1 -6 neigh replace $dip lladdr $tmac nud permanent dev br0.$vid"
612
613	run_cmd "tc -n $h1 qdisc replace dev eth0.$vid clsact"
614	run_cmd "tc -n $h1 filter replace dev eth0.$vid ingress pref 1 handle 101 proto ipv6 flower ip_proto icmpv6 src_ip $dip type 136 code 0 action pass"
615
616	run_cmd "tc -n $h2 qdisc replace dev eth0.$vid clsact"
617	run_cmd "tc -n $h2 filter replace dev eth0.$vid egress pref 1 handle 101 proto ipv6 flower ip_proto icmpv6 dst_ip $sip type 136 code 0 action pass"
618
619	run_cmd "ip netns exec $h1 mausezahn -6 eth0.$vid -c 1 -a own -b $tmac -A $sip -B $dip -t ip hop=255,next=58,payload=$(icmpv6_header_get $csum $full_dip) -q"
620	tc_check_packets $h1 "dev eth0.$vid ingress" 101 1
621	log_test $? 0 "Unicast NS, suppression on, h1 filter"
622	tc_check_packets $h2 "dev eth0.$vid egress" 101 1
623	log_test $? 0 "Unicast NS, suppression on, h2 filter"
624}
625
626neigh_suppress_uc_ns()
627{
628	local vid=10
629	local saddr=2001:db8:1::1
630	local daddr=2001:db8:1::2
631	local full_daddr=20:01:0d:b8:00:01:00:00:00:00:00:00:00:00:00:02
632	local csum="ef:79"
633
634	neigh_suppress_uc_ns_common $vid $saddr $daddr $full_daddr $csum
635
636	vid=20
637	saddr=2001:db8:2::1
638	daddr=2001:db8:2::2
639	full_daddr=20:01:0d:b8:00:02:00:00:00:00:00:00:00:00:00:02
640	csum="ef:76"
641
642	neigh_suppress_uc_ns_common $vid $saddr $daddr $full_daddr $csum
643}
644
645neigh_vlan_suppress_arp()
646{
647	local vid1=10
648	local vid2=20
649	local sip1=192.0.2.1
650	local sip2=192.0.2.17
651	local tip1=192.0.2.2
652	local tip2=192.0.2.18
653	local h2_mac1
654	local h2_mac2
655
656	echo
657	echo "Per-{Port, VLAN} ARP suppression"
658	echo "--------------------------------"
659
660	run_cmd "tc -n $sw1 qdisc replace dev vx0 clsact"
661	run_cmd "tc -n $sw1 filter replace dev vx0 egress pref 1 handle 101 proto 0x0806 flower indev swp1 arp_tip $tip1 arp_sip $sip1 arp_op request action pass"
662	run_cmd "tc -n $sw1 filter replace dev vx0 egress pref 1 handle 102 proto 0x0806 flower indev swp1 arp_tip $tip2 arp_sip $sip2 arp_op request action pass"
663
664	h2_mac1=$(ip -n $h2 -j -p link show eth0.$vid1 | jq -r '.[]["address"]')
665	h2_mac2=$(ip -n $h2 -j -p link show eth0.$vid2 | jq -r '.[]["address"]')
666	run_cmd "bridge -n $sw1 fdb replace $h2_mac1 dev vx0 master static vlan $vid1"
667	run_cmd "bridge -n $sw1 fdb replace $h2_mac2 dev vx0 master static vlan $vid2"
668	run_cmd "ip -n $sw1 neigh replace $tip1 lladdr $h2_mac1 nud permanent dev br0.$vid1"
669	run_cmd "ip -n $sw1 neigh replace $tip2 lladdr $h2_mac2 nud permanent dev br0.$vid2"
670
671	# Enable per-{Port, VLAN} neighbor suppression and check that ARP
672	# requests are not suppressed and that ARP replies are received.
673	run_cmd "bridge -n $sw1 link set dev vx0 neigh_vlan_suppress on"
674	run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_vlan_suppress on\""
675	log_test $? 0 "\"neigh_vlan_suppress\" is on"
676
677	run_cmd "ip netns exec $h1 arping -q -b -c 1 -w 5 -s $sip1 -I eth0.$vid1 $tip1"
678	log_test $? 0 "arping (VLAN $vid1)"
679	run_cmd "ip netns exec $h1 arping -q -b -c 1 -w 5 -s $sip2 -I eth0.$vid2 $tip2"
680	log_test $? 0 "arping (VLAN $vid2)"
681
682	tc_check_packets $sw1 "dev vx0 egress" 101 1
683	log_test $? 0 "ARP suppression (VLAN $vid1)"
684	tc_check_packets $sw1 "dev vx0 egress" 102 1
685	log_test $? 0 "ARP suppression (VLAN $vid2)"
686
687	# Enable neighbor suppression on VLAN 10 and check that only on this
688	# VLAN ARP requests are suppressed.
689	run_cmd "bridge -n $sw1 vlan set vid $vid1 dev vx0 neigh_suppress on"
690	run_cmd "bridge -n $sw1 -d vlan show dev vx0 vid $vid1 | grep \"neigh_suppress on\""
691	log_test $? 0 "\"neigh_suppress\" is on (VLAN $vid1)"
692	run_cmd "bridge -n $sw1 -d vlan show dev vx0 vid $vid2 | grep \"neigh_suppress off\""
693	log_test $? 0 "\"neigh_suppress\" is off (VLAN $vid2)"
694
695	run_cmd "ip netns exec $h1 arping -q -b -c 1 -w 5 -s $sip1 -I eth0.$vid1 $tip1"
696	log_test $? 0 "arping (VLAN $vid1)"
697	run_cmd "ip netns exec $h1 arping -q -b -c 1 -w 5 -s $sip2 -I eth0.$vid2 $tip2"
698	log_test $? 0 "arping (VLAN $vid2)"
699
700	tc_check_packets $sw1 "dev vx0 egress" 101 1
701	log_test $? 0 "ARP suppression (VLAN $vid1)"
702	tc_check_packets $sw1 "dev vx0 egress" 102 2
703	log_test $? 0 "ARP suppression (VLAN $vid2)"
704
705	# Enable neighbor suppression on the port and check that it has no
706	# effect compared to previous state.
707	run_cmd "bridge -n $sw1 link set dev vx0 neigh_suppress on"
708	run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_suppress on\""
709	log_test $? 0 "\"neigh_suppress\" is on"
710
711	run_cmd "ip netns exec $h1 arping -q -b -c 1 -w 5 -s $sip1 -I eth0.$vid1 $tip1"
712	log_test $? 0 "arping (VLAN $vid1)"
713	run_cmd "ip netns exec $h1 arping -q -b -c 1 -w 5 -s $sip2 -I eth0.$vid2 $tip2"
714	log_test $? 0 "arping (VLAN $vid2)"
715
716	tc_check_packets $sw1 "dev vx0 egress" 101 1
717	log_test $? 0 "ARP suppression (VLAN $vid1)"
718	tc_check_packets $sw1 "dev vx0 egress" 102 3
719	log_test $? 0 "ARP suppression (VLAN $vid2)"
720
721	# Disable neighbor suppression on the port and check that it has no
722	# effect compared to previous state.
723	run_cmd "bridge -n $sw1 link set dev vx0 neigh_suppress off"
724	run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_suppress off\""
725	log_test $? 0 "\"neigh_suppress\" is off"
726
727	run_cmd "ip netns exec $h1 arping -q -b -c 1 -w 5 -s $sip1 -I eth0.$vid1 $tip1"
728	log_test $? 0 "arping (VLAN $vid1)"
729	run_cmd "ip netns exec $h1 arping -q -b -c 1 -w 5 -s $sip2 -I eth0.$vid2 $tip2"
730	log_test $? 0 "arping (VLAN $vid2)"
731
732	tc_check_packets $sw1 "dev vx0 egress" 101 1
733	log_test $? 0 "ARP suppression (VLAN $vid1)"
734	tc_check_packets $sw1 "dev vx0 egress" 102 4
735	log_test $? 0 "ARP suppression (VLAN $vid2)"
736
737	# Disable neighbor suppression on VLAN 10 and check that ARP requests
738	# are no longer suppressed on this VLAN.
739	run_cmd "bridge -n $sw1 vlan set vid $vid1 dev vx0 neigh_suppress off"
740	run_cmd "bridge -n $sw1 -d vlan show dev vx0 vid $vid1 | grep \"neigh_suppress off\""
741	log_test $? 0 "\"neigh_suppress\" is off (VLAN $vid1)"
742
743	run_cmd "ip netns exec $h1 arping -q -b -c 1 -w 5 -s $sip1 -I eth0.$vid1 $tip1"
744	log_test $? 0 "arping (VLAN $vid1)"
745	run_cmd "ip netns exec $h1 arping -q -b -c 1 -w 5 -s $sip2 -I eth0.$vid2 $tip2"
746	log_test $? 0 "arping (VLAN $vid2)"
747
748	tc_check_packets $sw1 "dev vx0 egress" 101 2
749	log_test $? 0 "ARP suppression (VLAN $vid1)"
750	tc_check_packets $sw1 "dev vx0 egress" 102 5
751	log_test $? 0 "ARP suppression (VLAN $vid2)"
752
753	# Disable per-{Port, VLAN} neighbor suppression, enable neighbor
754	# suppression on the port and check that on both VLANs ARP requests are
755	# suppressed.
756	run_cmd "bridge -n $sw1 link set dev vx0 neigh_vlan_suppress off"
757	run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_vlan_suppress off\""
758	log_test $? 0 "\"neigh_vlan_suppress\" is off"
759
760	run_cmd "bridge -n $sw1 link set dev vx0 neigh_suppress on"
761	run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_suppress on\""
762	log_test $? 0 "\"neigh_suppress\" is on"
763
764	run_cmd "ip netns exec $h1 arping -q -b -c 1 -w 5 -s $sip1 -I eth0.$vid1 $tip1"
765	log_test $? 0 "arping (VLAN $vid1)"
766	run_cmd "ip netns exec $h1 arping -q -b -c 1 -w 5 -s $sip2 -I eth0.$vid2 $tip2"
767	log_test $? 0 "arping (VLAN $vid2)"
768
769	tc_check_packets $sw1 "dev vx0 egress" 101 2
770	log_test $? 0 "ARP suppression (VLAN $vid1)"
771	tc_check_packets $sw1 "dev vx0 egress" 102 5
772	log_test $? 0 "ARP suppression (VLAN $vid2)"
773}
774
775neigh_vlan_suppress_ns()
776{
777	local vid1=10
778	local vid2=20
779	local saddr1=2001:db8:1::1
780	local saddr2=2001:db8:2::1
781	local daddr1=2001:db8:1::2
782	local daddr2=2001:db8:2::2
783	local maddr=ff02::1:ff00:2
784	local h2_mac1
785	local h2_mac2
786
787	echo
788	echo "Per-{Port, VLAN} NS suppression"
789	echo "-------------------------------"
790
791	run_cmd "tc -n $sw1 qdisc replace dev vx0 clsact"
792	run_cmd "tc -n $sw1 filter replace dev vx0 egress pref 1 handle 101 proto ipv6 flower indev swp1 ip_proto icmpv6 dst_ip $maddr src_ip $saddr1 type 135 code 0 action pass"
793	run_cmd "tc -n $sw1 filter replace dev vx0 egress pref 1 handle 102 proto ipv6 flower indev swp1 ip_proto icmpv6 dst_ip $maddr src_ip $saddr2 type 135 code 0 action pass"
794
795	h2_mac1=$(ip -n $h2 -j -p link show eth0.$vid1 | jq -r '.[]["address"]')
796	h2_mac2=$(ip -n $h2 -j -p link show eth0.$vid2 | jq -r '.[]["address"]')
797	run_cmd "bridge -n $sw1 fdb replace $h2_mac1 dev vx0 master static vlan $vid1"
798	run_cmd "bridge -n $sw1 fdb replace $h2_mac2 dev vx0 master static vlan $vid2"
799	run_cmd "ip -n $sw1 neigh replace $daddr1 lladdr $h2_mac1 nud permanent dev br0.$vid1"
800	run_cmd "ip -n $sw1 neigh replace $daddr2 lladdr $h2_mac2 nud permanent dev br0.$vid2"
801
802	# Enable per-{Port, VLAN} neighbor suppression and check that NS
803	# messages are not suppressed and that ND messages are received.
804	run_cmd "bridge -n $sw1 link set dev vx0 neigh_vlan_suppress on"
805	run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_vlan_suppress on\""
806	log_test $? 0 "\"neigh_vlan_suppress\" is on"
807
808	run_cmd "ip netns exec $h1 ndisc6 -q -r 1 -s $saddr1 -w 5000 $daddr1 eth0.$vid1"
809	log_test $? 0 "ndisc6 (VLAN $vid1)"
810	run_cmd "ip netns exec $h1 ndisc6 -q -r 1 -s $saddr2 -w 5000 $daddr2 eth0.$vid2"
811	log_test $? 0 "ndisc6 (VLAN $vid2)"
812
813	tc_check_packets $sw1 "dev vx0 egress" 101 1
814	log_test $? 0 "NS suppression (VLAN $vid1)"
815	tc_check_packets $sw1 "dev vx0 egress" 102 1
816	log_test $? 0 "NS suppression (VLAN $vid2)"
817
818	# Enable neighbor suppression on VLAN 10 and check that only on this
819	# VLAN NS messages are suppressed.
820	run_cmd "bridge -n $sw1 vlan set vid $vid1 dev vx0 neigh_suppress on"
821	run_cmd "bridge -n $sw1 -d vlan show dev vx0 vid $vid1 | grep \"neigh_suppress on\""
822	log_test $? 0 "\"neigh_suppress\" is on (VLAN $vid1)"
823	run_cmd "bridge -n $sw1 -d vlan show dev vx0 vid $vid2 | grep \"neigh_suppress off\""
824	log_test $? 0 "\"neigh_suppress\" is off (VLAN $vid2)"
825
826	run_cmd "ip netns exec $h1 ndisc6 -q -r 1 -s $saddr1 -w 5000 $daddr1 eth0.$vid1"
827	log_test $? 0 "ndisc6 (VLAN $vid1)"
828	run_cmd "ip netns exec $h1 ndisc6 -q -r 1 -s $saddr2 -w 5000 $daddr2 eth0.$vid2"
829	log_test $? 0 "ndisc6 (VLAN $vid2)"
830
831	tc_check_packets $sw1 "dev vx0 egress" 101 1
832	log_test $? 0 "NS suppression (VLAN $vid1)"
833	tc_check_packets $sw1 "dev vx0 egress" 102 2
834	log_test $? 0 "NS suppression (VLAN $vid2)"
835
836	# Enable neighbor suppression on the port and check that it has no
837	# effect compared to previous state.
838	run_cmd "bridge -n $sw1 link set dev vx0 neigh_suppress on"
839	run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_suppress on\""
840	log_test $? 0 "\"neigh_suppress\" is on"
841
842	run_cmd "ip netns exec $h1 ndisc6 -q -r 1 -s $saddr1 -w 5000 $daddr1 eth0.$vid1"
843	log_test $? 0 "ndisc6 (VLAN $vid1)"
844	run_cmd "ip netns exec $h1 ndisc6 -q -r 1 -s $saddr2 -w 5000 $daddr2 eth0.$vid2"
845	log_test $? 0 "ndisc6 (VLAN $vid2)"
846
847	tc_check_packets $sw1 "dev vx0 egress" 101 1
848	log_test $? 0 "NS suppression (VLAN $vid1)"
849	tc_check_packets $sw1 "dev vx0 egress" 102 3
850	log_test $? 0 "NS suppression (VLAN $vid2)"
851
852	# Disable neighbor suppression on the port and check that it has no
853	# effect compared to previous state.
854	run_cmd "bridge -n $sw1 link set dev vx0 neigh_suppress off"
855	run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_suppress off\""
856	log_test $? 0 "\"neigh_suppress\" is off"
857
858	run_cmd "ip netns exec $h1 ndisc6 -q -r 1 -s $saddr1 -w 5000 $daddr1 eth0.$vid1"
859	log_test $? 0 "ndisc6 (VLAN $vid1)"
860	run_cmd "ip netns exec $h1 ndisc6 -q -r 1 -s $saddr2 -w 5000 $daddr2 eth0.$vid2"
861	log_test $? 0 "ndisc6 (VLAN $vid2)"
862
863	tc_check_packets $sw1 "dev vx0 egress" 101 1
864	log_test $? 0 "NS suppression (VLAN $vid1)"
865	tc_check_packets $sw1 "dev vx0 egress" 102 4
866	log_test $? 0 "NS suppression (VLAN $vid2)"
867
868	# Disable neighbor suppression on VLAN 10 and check that NS messages
869	# are no longer suppressed on this VLAN.
870	run_cmd "bridge -n $sw1 vlan set vid $vid1 dev vx0 neigh_suppress off"
871	run_cmd "bridge -n $sw1 -d vlan show dev vx0 vid $vid1 | grep \"neigh_suppress off\""
872	log_test $? 0 "\"neigh_suppress\" is off (VLAN $vid1)"
873
874	run_cmd "ip netns exec $h1 ndisc6 -q -r 1 -s $saddr1 -w 5000 $daddr1 eth0.$vid1"
875	log_test $? 0 "ndisc6 (VLAN $vid1)"
876	run_cmd "ip netns exec $h1 ndisc6 -q -r 1 -s $saddr2 -w 5000 $daddr2 eth0.$vid2"
877	log_test $? 0 "ndisc6 (VLAN $vid2)"
878
879	tc_check_packets $sw1 "dev vx0 egress" 101 2
880	log_test $? 0 "NS suppression (VLAN $vid1)"
881	tc_check_packets $sw1 "dev vx0 egress" 102 5
882	log_test $? 0 "NS suppression (VLAN $vid2)"
883
884	# Disable per-{Port, VLAN} neighbor suppression, enable neighbor
885	# suppression on the port and check that on both VLANs NS messages are
886	# suppressed.
887	run_cmd "bridge -n $sw1 link set dev vx0 neigh_vlan_suppress off"
888	run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_vlan_suppress off\""
889	log_test $? 0 "\"neigh_vlan_suppress\" is off"
890
891	run_cmd "bridge -n $sw1 link set dev vx0 neigh_suppress on"
892	run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_suppress on\""
893	log_test $? 0 "\"neigh_suppress\" is on"
894
895	run_cmd "ip netns exec $h1 ndisc6 -q -r 1 -s $saddr1 -w 5000 $daddr1 eth0.$vid1"
896	log_test $? 0 "ndisc6 (VLAN $vid1)"
897	run_cmd "ip netns exec $h1 ndisc6 -q -r 1 -s $saddr2 -w 5000 $daddr2 eth0.$vid2"
898	log_test $? 0 "ndisc6 (VLAN $vid2)"
899
900	tc_check_packets $sw1 "dev vx0 egress" 101 2
901	log_test $? 0 "NS suppression (VLAN $vid1)"
902	tc_check_packets $sw1 "dev vx0 egress" 102 5
903	log_test $? 0 "NS suppression (VLAN $vid2)"
904}
905
906neigh_suppress_arp_probe()
907{
908	local vid=10
909	local tip=192.0.2.2
910	local h2_mac
911
912	echo
913	echo "Per-port ARP probe suppression"
914	echo "------------------------------"
915
916	run_cmd "tc -n $sw1 qdisc replace dev vx0 clsact"
917	run_cmd "tc -n $sw1 filter replace dev vx0 egress pref 1 handle 101 proto 0x0806 flower indev swp1 arp_tip $tip arp_sip 0.0.0.0 arp_op request action pass"
918
919	# Initial state - check that ARP probes are not suppressed.
920	run_cmd "ip netns exec $h1 arping -D -q -c 1 -w 5 -I eth0.$vid $tip"
921	tc_check_packets "$sw1" "dev vx0 egress" 101 1
922	log_test $? 0 "ARP probe suppression"
923
924	# Enable neighbor suppression and check that nothing changes.
925	run_cmd "bridge -n $sw1 link set dev vx0 neigh_suppress on"
926	run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_suppress on\""
927	log_test $? 0 "\"neigh_suppress\" is on"
928
929	run_cmd "ip netns exec $h1 arping -D -q -c 1 -w 5 -I eth0.$vid $tip"
930	tc_check_packets "$sw1" "dev vx0 egress" 101 2
931	log_test $? 0 "ARP probe suppression"
932
933	# Install FDB and a neighbor and check that ARP probes are suppressed.
934	h2_mac=$(ip -n "$h2" -j -p link show eth0."$vid" | jq -r '.[]["address"]')
935	run_cmd "bridge -n $sw1 fdb replace $h2_mac dev vx0 master static vlan $vid"
936	run_cmd "ip -n $sw1 neigh replace $tip lladdr $h2_mac nud permanent dev br0.$vid"
937	log_test $? 0 "FDB and neighbor entry installation"
938
939	run_cmd "ip netns exec $h1 arping -D -q -c 1 -w 5 -I eth0.$vid $tip"
940	log_test $? 1 "arping"
941	tc_check_packets "$sw1" "dev vx0 egress" 101 2
942	log_test $? 0 "ARP probe suppression"
943
944	# Remove the neighbor entry and check that ARP probes are not suppressed.
945	run_cmd "ip -n $sw1 neigh del $tip dev br0.$vid"
946	log_test $? 0 "neighbor removal"
947
948	run_cmd "ip netns exec $h1 arping -D -q -c 1 -w 5 -I eth0.$vid $tip"
949	tc_check_packets "$sw1" "dev vx0 egress" 101 3
950	log_test $? 0 "ARP probe suppression"
951
952	# Disable neighbor suppression.
953	run_cmd "bridge -n $sw1 link set dev vx0 neigh_suppress off"
954	run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_suppress off\""
955	log_test $? 0 "\"neigh_suppress\" is off"
956
957	run_cmd "ip netns exec $h1 arping -D -q -c 1 -w 5 -I eth0.$vid $tip"
958	tc_check_packets "$sw1" "dev vx0 egress" 101 4
959	log_test $? 0 "ARP probe suppression"
960}
961
962neigh_suppress_dad_ns()
963{
964	local vid=10
965	local tip=2001:db8:1::99
966	local mcast=ff02::1:ff00:99
967	local dmac=33:33:ff:00:00:99
968	local full_tip=20:01:0d:b8:00:01:00:00:00:00:00:00:00:00:00:99
969	local csum="4b:bc"
970	local smac
971	local tmac
972
973	echo
974	echo "Per-port DAD NS suppression"
975	echo "---------------------------"
976
977	smac=$(ip -n "$h1" -j -p link show eth0."$vid" | jq -r '.[]["address"]')
978
979	run_cmd "tc -n $sw1 qdisc replace dev vx0 clsact"
980	run_cmd "tc -n $sw1 filter replace dev vx0 egress pref 1 handle 101 proto ipv6 flower indev swp1 ip_proto icmpv6 dst_ip $mcast src_ip :: type 135 code 0 action pass"
981
982	# Initial state - check that DAD NS are not suppressed.
983	run_cmd "ip netns exec $h1 mausezahn -6 eth0.$vid -c 1 -a $smac -b $dmac -A :: -B $mcast -t ip hop=255,next=58,payload=$(icmpv6_header_get "$csum" "$full_tip") -q"
984	tc_check_packets "$sw1" "dev vx0 egress" 101 1
985	log_test $? 0 "DAD NS suppression"
986
987	# Enable neighbor suppression and check that nothing changes.
988	run_cmd "bridge -n $sw1 link set dev vx0 neigh_suppress on"
989	run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_suppress on\""
990	log_test $? 0 "\"neigh_suppress\" is on"
991
992	run_cmd "ip netns exec $h1 mausezahn -6 eth0.$vid -c 1 -a $smac -b $dmac -A :: -B $mcast -t ip hop=255,next=58,payload=$(icmpv6_header_get "$csum" "$full_tip") -q"
993	tc_check_packets "$sw1" "dev vx0 egress" 101 2
994	log_test $? 0 "DAD NS suppression"
995
996	# Install FDB and a neighbor and check that DAD NS are suppressed
997	# and that a proxy NA is sent back to h1.
998	tmac=$(ip -n "$h2" -j -p link show eth0."$vid" | jq -r '.[]["address"]')
999	run_cmd "bridge -n $sw1 fdb replace $tmac dev vx0 master static vlan $vid"
1000	run_cmd "ip -n $sw1 -6 neigh replace $tip lladdr $tmac nud permanent dev br0.$vid"
1001	log_test $? 0 "FDB and neighbor entry installation"
1002
1003	run_cmd "tc -n $h1 qdisc replace dev eth0.$vid clsact"
1004	run_cmd "tc -n $h1 filter replace dev eth0.$vid ingress pref 1 handle 101 proto ipv6 flower ip_proto icmpv6 dst_ip ff02::1 src_ip $tip type 136 code 0 action pass"
1005
1006	run_cmd "ip netns exec $h1 mausezahn -6 eth0.$vid -c 1 -a $smac -b $dmac -A :: -B $mcast -t ip hop=255,next=58,payload=$(icmpv6_header_get "$csum" "$full_tip") -q"
1007	tc_check_packets "$sw1" "dev vx0 egress" 101 2
1008	log_test $? 0 "DAD NS suppression"
1009	tc_check_packets "$h1" "dev eth0.$vid ingress" 101 1
1010	log_test $? 0 "DAD NS proxy NA reply"
1011
1012	# Remove the neighbor entry and check that DAD NS are not suppressed.
1013	run_cmd "ip -n $sw1 -6 neigh del $tip dev br0.$vid"
1014	log_test $? 0 "neighbor removal"
1015
1016	run_cmd "ip netns exec $h1 mausezahn -6 eth0.$vid -c 1 -a $smac -b $dmac -A :: -B $mcast -t ip hop=255,next=58,payload=$(icmpv6_header_get "$csum" "$full_tip") -q"
1017	tc_check_packets "$sw1" "dev vx0 egress" 101 3
1018	log_test $? 0 "DAD NS suppression"
1019
1020	# Disable neighbor suppression.
1021	run_cmd "bridge -n $sw1 link set dev vx0 neigh_suppress off"
1022	run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_suppress off\""
1023	log_test $? 0 "\"neigh_suppress\" is off"
1024
1025	run_cmd "ip netns exec $h1 mausezahn -6 eth0.$vid -c 1 -a $smac -b $dmac -A :: -B $mcast -t ip hop=255,next=58,payload=$(icmpv6_header_get "$csum" "$full_tip") -q"
1026	tc_check_packets "$sw1" "dev vx0 egress" 101 4
1027	log_test $? 0 "DAD NS suppression"
1028}
1029
1030neigh_forward_grat_arp()
1031{
1032	local vid=10
1033	local sip=192.0.2.1
1034	local tip=$sip
1035	local h2_ip=192.0.2.2
1036	local h2_mac
1037
1038	neigh_forward_grat_check || return $?
1039
1040	echo
1041	echo "Gratuitous ARP forwarding"
1042	echo "-------------------------"
1043
1044	run_cmd "tc -n $sw1 qdisc replace dev vx0 clsact"
1045	run_cmd "tc -n $sw1 filter replace dev vx0 egress pref 1 handle 101 proto 0x0806 flower indev swp1 arp_tip $tip arp_sip $sip arp_op request action pass"
1046	run_cmd "tc -n $sw1 filter replace dev vx0 egress pref 1 handle 102 proto 0x0806 flower indev swp1 arp_tip $h2_ip arp_sip $sip arp_op request action pass"
1047
1048	h2_mac=$(ip -n "$h2" -j -p link show eth0."$vid" | jq -r '.[]["address"]')
1049	run_cmd "bridge -n $sw1 fdb replace $h2_mac dev vx0 master static vlan $vid"
1050	run_cmd "ip -n $sw1 neigh replace $tip lladdr $h2_mac nud permanent dev br0.$vid"
1051	run_cmd "ip -n $sw1 neigh replace $h2_ip lladdr $h2_mac nud permanent dev br0.$vid"
1052
1053	# Enable neighbor suppression. Gratuitous ARP should be suppressed by
1054	# default (neigh_forward_grat defaults to off).
1055	run_cmd "ip -n $sw1 link set dev vx0 type bridge_slave neigh_suppress on"
1056	run_cmd "ip -n $sw1 -d link show dev vx0 | grep \"neigh_suppress on\""
1057	log_test $? 0 "\"neigh_suppress\" is on"
1058
1059	# Send gratuitous ARP (sip == tip) and check it's suppressed.
1060	run_cmd "ip netns exec $h1 arping -U -c 1 -w 5 -I eth0.$vid $tip"
1061	tc_check_packets "$sw1" "dev vx0 egress" 101 0
1062	log_test $? 0 "Gratuitous ARP suppression"
1063
1064	# Explicitly enable neigh_forward_grat and verify gratuitous ARP is
1065	# now forwarded.
1066	run_cmd "ip -n $sw1 link set dev vx0 type bridge_slave neigh_forward_grat on"
1067	run_cmd "ip -n $sw1 -d link show dev vx0 | grep \"neigh_forward_grat on\""
1068	log_test $? 0 "\"neigh_forward_grat\" is on"
1069
1070	run_cmd "ip netns exec $h1 arping -U -c 1 -w 5 -I eth0.$vid $tip"
1071	tc_check_packets "$sw1" "dev vx0 egress" 101 1
1072	log_test $? 0 "Gratuitous ARP forwarding"
1073
1074	# Verify that regular (non-gratuitous) ARP requests are still
1075	# suppressed when neigh_forward_grat is enabled.
1076	run_cmd "ip netns exec $h1 arping -c 1 -w 5 -I eth0.$vid $h2_ip"
1077	tc_check_packets "$sw1" "dev vx0 egress" 102 0
1078	log_test $? 0 "Regular ARP suppression with \"neigh_forward_grat\" on"
1079
1080	# Disable neigh_forward_grat and verify suppression resumes.
1081	run_cmd "ip -n $sw1 link set dev vx0 type bridge_slave neigh_forward_grat off"
1082	run_cmd "ip -n $sw1 -d link show dev vx0 | grep \"neigh_forward_grat off\""
1083	log_test $? 0 "\"neigh_forward_grat\" is off"
1084
1085	run_cmd "ip netns exec $h1 arping -U -c 1 -w 5 -I eth0.$vid $tip"
1086	tc_check_packets "$sw1" "dev vx0 egress" 101 1
1087	log_test $? 0 "Gratuitous ARP suppression"
1088}
1089
1090# neigh_forward_grat_arp() uses 'ip link' interface, and neigh_forward_grat_na()
1091# uses 'bridge link' interface to exercise both paths.
1092neigh_forward_grat_na()
1093{
1094	local vid=10
1095	local saddr=2001:db8:1::1
1096	local daddr=ff02::1
1097	local h2_addr=2001:db8:1::2
1098	local h2_maddr=ff02::1:ff00:2
1099	local full_addr=20:01:0d:b8:00:01:00:00:00:00:00:00:00:00:00:01
1100	local h2_full_addr=20:01:0d:b8:00:01:00:00:00:00:00:00:00:00:00:02
1101	local csum="fd:32"
1102	local csum_ns="1f:2f"
1103	local dmac=33:33:00:00:00:01
1104	local h2_dmac=33:33:ff:00:00:02
1105	local h2_mac
1106	local smac
1107
1108	neigh_forward_grat_check || return $?
1109
1110	echo
1111	echo "Unsolicited NA forwarding"
1112	echo "-------------------------"
1113
1114	smac=$(ip -n "$h1" -j -p link show eth0."$vid" | jq -r '.[]["address"]')
1115
1116	run_cmd "tc -n $sw1 qdisc replace dev vx0 clsact"
1117	run_cmd "tc -n $sw1 filter replace dev vx0 egress pref 1 handle 101 proto ipv6 flower indev swp1 ip_proto icmpv6 dst_ip $daddr src_ip $saddr type 136 code 0 action pass"
1118	run_cmd "tc -n $sw1 filter replace dev vx0 egress pref 1 handle 102 proto ipv6 flower indev swp1 ip_proto icmpv6 dst_ip $h2_maddr src_ip $saddr type 135 code 0 action pass"
1119
1120	h2_mac=$(ip -n "$h2" -j -p link show eth0."$vid" | jq -r '.[]["address"]')
1121	run_cmd "bridge -n $sw1 fdb replace $h2_mac dev vx0 master static vlan $vid"
1122	run_cmd "ip -n $sw1 neigh replace $saddr lladdr $h2_mac nud permanent dev br0.$vid"
1123	run_cmd "ip -n $sw1 neigh replace $h2_addr lladdr $h2_mac nud permanent dev br0.$vid"
1124
1125	# Enable neighbor suppression. Unsolicited NA should be suppressed by
1126	# default (neigh_forward_grat defaults to off).
1127	run_cmd "bridge -n $sw1 link set dev vx0 neigh_suppress on"
1128	run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_suppress on\""
1129	log_test $? 0 "\"neigh_suppress\" is on"
1130
1131	# Send unsolicited NA and check it's suppressed.
1132	run_cmd "ip netns exec $h1 mausezahn -6 eth0.$vid -c 1 -a $smac -b $dmac -A $saddr -B $daddr -t ip hop=255,next=58,payload=$(icmpv6_na_header_get "$csum" "$full_addr") -q"
1133	tc_check_packets "$sw1" "dev vx0 egress" 101 0
1134	log_test $? 0 "Unsolicited NA suppression"
1135
1136	# Explicitly enable neigh_forward_grat and verify unsolicited NA is
1137	# now forwarded.
1138	run_cmd "bridge -n $sw1 link set dev vx0 neigh_forward_grat on"
1139	run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_forward_grat on\""
1140	log_test $? 0 "\"neigh_forward_grat\" is on"
1141
1142	run_cmd "ip netns exec $h1 mausezahn -6 eth0.$vid -c 1 -a $smac -b $dmac -A $saddr -B $daddr -t ip hop=255,next=58,payload=$(icmpv6_na_header_get "$csum" "$full_addr") -q"
1143	tc_check_packets "$sw1" "dev vx0 egress" 101 1
1144	log_test $? 0 "Unsolicited NA forwarding"
1145
1146	# Verify that solicited NS messages are still suppressed when
1147	# neigh_forward_grat is enabled.
1148	run_cmd "ip netns exec $h1 mausezahn -6 eth0.$vid -c 1 -a $smac -b $h2_dmac -A $saddr -B $h2_maddr -t ip hop=255,next=58,payload=$(icmpv6_header_get "$csum_ns" "$h2_full_addr") -q"
1149	tc_check_packets "$sw1" "dev vx0 egress" 102 0
1150	log_test $? 0 "Solicited NS suppression with \"neigh_forward_grat\" on"
1151
1152	# Disable neigh_forward_grat and verify suppression resumes.
1153	run_cmd "bridge -n $sw1 link set dev vx0 neigh_forward_grat off"
1154	run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_forward_grat off\""
1155	log_test $? 0 "\"neigh_forward_grat\" is off"
1156
1157	run_cmd "ip netns exec $h1 mausezahn -6 eth0.$vid -c 1 -a $smac -b $dmac -A $saddr -B $daddr -t ip hop=255,next=58,payload=$(icmpv6_na_header_get "$csum" "$full_addr") -q"
1158	tc_check_packets "$sw1" "dev vx0 egress" 101 1
1159	log_test $? 0 "Unsolicited NA suppression"
1160}
1161
1162neigh_vlan_forward_grat_arp()
1163{
1164	local vid1=10
1165	local vid2=20
1166	local sip1=192.0.2.1
1167	local sip2=192.0.2.17
1168	local h2_ip1=192.0.2.2
1169	local h2_mac1
1170	local h2_mac2
1171
1172	neigh_forward_grat_check || return $?
1173
1174	echo
1175	echo "Per-VLAN gratuitous ARP forwarding"
1176	echo "----------------------------------"
1177
1178	run_cmd "tc -n $sw1 qdisc replace dev vx0 clsact"
1179	run_cmd "tc -n $sw1 filter replace dev vx0 egress pref 1 handle 101 proto 0x0806 flower indev swp1 arp_tip $sip1 arp_sip $sip1 arp_op request action pass"
1180	run_cmd "tc -n $sw1 filter replace dev vx0 egress pref 1 handle 102 proto 0x0806 flower indev swp1 arp_tip $sip2 arp_sip $sip2 arp_op request action pass"
1181	run_cmd "tc -n $sw1 filter replace dev vx0 egress pref 1 handle 103 proto 0x0806 flower indev swp1 arp_tip $h2_ip1 arp_sip $sip1 arp_op request action pass"
1182
1183	h2_mac1=$(ip -n "$h2" -j -p link show eth0."$vid1" | jq -r '.[]["address"]')
1184	h2_mac2=$(ip -n "$h2" -j -p link show eth0."$vid2" | jq -r '.[]["address"]')
1185	run_cmd "bridge -n $sw1 fdb replace $h2_mac1 dev vx0 master static vlan $vid1"
1186	run_cmd "bridge -n $sw1 fdb replace $h2_mac2 dev vx0 master static vlan $vid2"
1187	run_cmd "ip -n $sw1 neigh replace $sip1 lladdr $h2_mac1 nud permanent dev br0.$vid1"
1188	run_cmd "ip -n $sw1 neigh replace $sip2 lladdr $h2_mac2 nud permanent dev br0.$vid2"
1189	run_cmd "ip -n $sw1 neigh replace $h2_ip1 lladdr $h2_mac1 nud permanent dev br0.$vid1"
1190
1191	# Enable per-{Port, VLAN} neighbor suppression.
1192	run_cmd "bridge -n $sw1 link set dev vx0 neigh_vlan_suppress on"
1193	run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_vlan_suppress on\""
1194	log_test $? 0 "\"neigh_vlan_suppress\" is on"
1195
1196	# Enable neighbor suppression on VLAN 10. Gratuitous ARP should be
1197	# suppressed by default on VLAN 10 (neigh_forward_grat defaults to off)
1198	# but not on VLAN 20.
1199	run_cmd "bridge -n $sw1 vlan set vid $vid1 dev vx0 neigh_suppress on"
1200	run_cmd "bridge -n $sw1 -d vlan show dev vx0 vid $vid1 | grep \"neigh_suppress on\""
1201	log_test $? 0 "\"neigh_suppress\" is on (VLAN $vid1)"
1202
1203	run_cmd "ip netns exec $h1 arping -U -c 1 -w 5 -I eth0.$vid1 $sip1"
1204	tc_check_packets "$sw1" "dev vx0 egress" 101 0
1205	log_test $? 0 "Gratuitous ARP suppression (VLAN $vid1)"
1206
1207	run_cmd "ip netns exec $h1 arping -U -c 1 -w 5 -I eth0.$vid2 $sip2"
1208	tc_check_packets "$sw1" "dev vx0 egress" 102 1
1209	log_test $? 0 "Gratuitous ARP forwarding (VLAN $vid2)"
1210
1211	# Enable neigh_forward_grat on VLAN 10 and verify gratuitous ARP is
1212	# now forwarded.
1213	run_cmd "bridge -n $sw1 vlan set vid $vid1 dev vx0 neigh_forward_grat on"
1214	run_cmd "bridge -n $sw1 -d vlan show dev vx0 vid $vid1 | grep \"neigh_forward_grat on\""
1215	log_test $? 0 "\"neigh_forward_grat\" is on (VLAN $vid1)"
1216
1217	run_cmd "ip netns exec $h1 arping -U -c 1 -w 5 -I eth0.$vid1 $sip1"
1218	tc_check_packets "$sw1" "dev vx0 egress" 101 1
1219	log_test $? 0 "Gratuitous ARP forwarding (VLAN $vid1)"
1220
1221	# Verify that regular (non-gratuitous) ARP requests on VLAN $vid1 are
1222	# still suppressed when neigh_forward_grat is enabled.
1223	run_cmd "ip netns exec $h1 arping -c 1 -w 5 -I eth0.$vid1 $h2_ip1"
1224	tc_check_packets "$sw1" "dev vx0 egress" 103 0
1225	log_test $? 0 "Regular ARP suppression with \"neigh_forward_grat\" on (VLAN $vid1)"
1226
1227	# Enable neighbor suppression on VLAN 20 (neigh_forward_grat defaults to
1228	# off), and verify gratuitous ARP is suppressed on VLAN 20.
1229	run_cmd "bridge -n $sw1 vlan set vid $vid2 dev vx0 neigh_suppress on"
1230	run_cmd "bridge -n $sw1 -d vlan show dev vx0 vid $vid2 | grep \"neigh_suppress on\""
1231	log_test $? 0 "\"neigh_suppress\" is on (VLAN $vid2)"
1232
1233	# VLAN 10 should still forward (neigh_forward_grat is on).
1234	run_cmd "ip netns exec $h1 arping -U -c 1 -w 5 -I eth0.$vid1 $sip1"
1235	tc_check_packets "$sw1" "dev vx0 egress" 101 2
1236	log_test $? 0 "Gratuitous ARP forwarding (VLAN $vid1)"
1237
1238	# VLAN 20 should suppress (neigh_forward_grat defaults to off).
1239	run_cmd "ip netns exec $h1 arping -U -c 1 -w 5 -I eth0.$vid2 $sip2"
1240	tc_check_packets "$sw1" "dev vx0 egress" 102 1
1241	log_test $? 0 "Gratuitous ARP suppression (VLAN $vid2)"
1242}
1243
1244neigh_vlan_forward_grat_na()
1245{
1246	local vid1=10
1247	local vid2=20
1248	local saddr1=2001:db8:1::1
1249	local daddr=ff02::1
1250	local h2_addr1=2001:db8:1::2
1251	local h2_maddr1=ff02::1:ff00:2
1252	local full_addr1=20:01:0d:b8:00:01:00:00:00:00:00:00:00:00:00:01
1253	local h2_full_addr1=20:01:0d:b8:00:01:00:00:00:00:00:00:00:00:00:02
1254	local csum1="fd:32"
1255	local csum_ns1="1f:2f"
1256	local saddr2=2001:db8:2::1
1257	local full_addr2=20:01:0d:b8:00:02:00:00:00:00:00:00:00:00:00:01
1258	local csum2="fd:30"
1259	local dmac=33:33:00:00:00:01
1260	local h2_dmac1=33:33:ff:00:00:02
1261	local h2_mac1
1262	local h2_mac2
1263	local smac
1264
1265	neigh_forward_grat_check || return $?
1266
1267	echo
1268	echo "Per-VLAN unsolicited NA forwarding"
1269	echo "----------------------------------"
1270
1271	smac=$(ip -n "$h1" -j -p link show eth0."$vid1" | jq -r '.[]["address"]')
1272
1273	run_cmd "tc -n $sw1 qdisc replace dev vx0 clsact"
1274	run_cmd "tc -n $sw1 filter replace dev vx0 egress pref 1 handle 101 proto ipv6 flower indev swp1 ip_proto icmpv6 dst_ip $daddr src_ip $saddr1 type 136 code 0 action pass"
1275	run_cmd "tc -n $sw1 filter replace dev vx0 egress pref 1 handle 102 proto ipv6 flower indev swp1 ip_proto icmpv6 dst_ip $daddr src_ip $saddr2 type 136 code 0 action pass"
1276	run_cmd "tc -n $sw1 filter replace dev vx0 egress pref 1 handle 103 proto ipv6 flower indev swp1 ip_proto icmpv6 dst_ip $h2_maddr1 src_ip $saddr1 type 135 code 0 action pass"
1277
1278	h2_mac1=$(ip -n "$h2" -j -p link show eth0."$vid1" | jq -r '.[]["address"]')
1279	h2_mac2=$(ip -n "$h2" -j -p link show eth0."$vid2" | jq -r '.[]["address"]')
1280	run_cmd "bridge -n $sw1 fdb replace $h2_mac1 dev vx0 master static vlan $vid1"
1281	run_cmd "bridge -n $sw1 fdb replace $h2_mac2 dev vx0 master static vlan $vid2"
1282	run_cmd "ip -n $sw1 neigh replace $saddr1 lladdr $h2_mac1 nud permanent dev br0.$vid1"
1283	run_cmd "ip -n $sw1 neigh replace $saddr2 lladdr $h2_mac2 nud permanent dev br0.$vid2"
1284	run_cmd "ip -n $sw1 neigh replace $h2_addr1 lladdr $h2_mac1 nud permanent dev br0.$vid1"
1285
1286	# Enable per-{Port, VLAN} neighbor suppression.
1287	run_cmd "bridge -n $sw1 link set dev vx0 neigh_vlan_suppress on"
1288	run_cmd "bridge -n $sw1 -d link show dev vx0 | grep \"neigh_vlan_suppress on\""
1289	log_test $? 0 "\"neigh_vlan_suppress\" is on"
1290
1291	# Enable neighbor suppression on VLAN 10. Unsolicited NA should be
1292	# suppressed by default on VLAN 10 (neigh_forward_grat defaults to off)
1293	# but not on VLAN 20.
1294	run_cmd "bridge -n $sw1 vlan set vid $vid1 dev vx0 neigh_suppress on"
1295	run_cmd "bridge -n $sw1 -d vlan show dev vx0 vid $vid1 | grep \"neigh_suppress on\""
1296	log_test $? 0 "\"neigh_suppress\" is on (VLAN $vid1)"
1297
1298	run_cmd "ip netns exec $h1 mausezahn -6 eth0.$vid1 -c 1 -a $smac -b $dmac -A $saddr1 -B $daddr -t ip hop=255,next=58,payload=$(icmpv6_na_header_get "$csum1" "$full_addr1") -q"
1299	tc_check_packets "$sw1" "dev vx0 egress" 101 0
1300	log_test $? 0 "Unsolicited NA suppression (VLAN $vid1)"
1301
1302	run_cmd "ip netns exec $h1 mausezahn -6 eth0.$vid2 -c 1 -a $smac -b $dmac -A $saddr2 -B $daddr -t ip hop=255,next=58,payload=$(icmpv6_na_header_get "$csum2" "$full_addr2") -q"
1303	tc_check_packets "$sw1" "dev vx0 egress" 102 1
1304	log_test $? 0 "Unsolicited NA forwarding (VLAN $vid2)"
1305
1306	# Enable neigh_forward_grat on VLAN 10 and verify unsolicited NA is
1307	# now forwarded.
1308	run_cmd "bridge -n $sw1 vlan set vid $vid1 dev vx0 neigh_forward_grat on"
1309	run_cmd "bridge -n $sw1 -d vlan show dev vx0 vid $vid1 | grep \"neigh_forward_grat on\""
1310	log_test $? 0 "\"neigh_forward_grat\" is on (VLAN $vid1)"
1311
1312	run_cmd "ip netns exec $h1 mausezahn -6 eth0.$vid1 -c 1 -a $smac -b $dmac -A $saddr1 -B $daddr -t ip hop=255,next=58,payload=$(icmpv6_na_header_get "$csum1" "$full_addr1") -q"
1313	tc_check_packets "$sw1" "dev vx0 egress" 101 1
1314	log_test $? 0 "Unsolicited NA forwarding (VLAN $vid1)"
1315
1316	# Verify that solicited NS messages on VLAN $vid1 are still suppressed
1317	# when neigh_forward_grat is enabled.
1318	run_cmd "ip netns exec $h1 mausezahn -6 eth0.$vid1 -c 1 -a $smac -b $h2_dmac1 -A $saddr1 -B $h2_maddr1 -t ip hop=255,next=58,payload=$(icmpv6_header_get "$csum_ns1" "$h2_full_addr1") -q"
1319	tc_check_packets "$sw1" "dev vx0 egress" 103 0
1320	log_test $? 0 "Solicited NS suppression with \"neigh_forward_grat\" on (VLAN $vid1)"
1321
1322	# Enable neighbor suppression on VLAN 20 (neigh_forward_grat defaults to
1323	# off), and verify unsolicited NA is suppressed on VLAN 20.
1324	run_cmd "bridge -n $sw1 vlan set vid $vid2 dev vx0 neigh_suppress on"
1325	run_cmd "bridge -n $sw1 -d vlan show dev vx0 vid $vid2 | grep \"neigh_suppress on\""
1326	log_test $? 0 "\"neigh_suppress\" is on (VLAN $vid2)"
1327
1328	# VLAN 10 should still forward (neigh_forward_grat is on).
1329	run_cmd "ip netns exec $h1 mausezahn -6 eth0.$vid1 -c 1 -a $smac -b $dmac -A $saddr1 -B $daddr -t ip hop=255,next=58,payload=$(icmpv6_na_header_get "$csum1" "$full_addr1") -q"
1330	tc_check_packets "$sw1" "dev vx0 egress" 101 2
1331	log_test $? 0 "Unsolicited NA forwarding (VLAN $vid1)"
1332
1333	# VLAN 20 should suppress (neigh_forward_grat defaults to off).
1334	run_cmd "ip netns exec $h1 mausezahn -6 eth0.$vid2 -c 1 -a $smac -b $dmac -A $saddr2 -B $daddr -t ip hop=255,next=58,payload=$(icmpv6_na_header_get "$csum2" "$full_addr2") -q"
1335	tc_check_packets "$sw1" "dev vx0 egress" 102 1
1336	log_test $? 0 "Unsolicited NA suppression (VLAN $vid2)"
1337}
1338
1339################################################################################
1340# Usage
1341
1342usage()
1343{
1344	cat <<EOF
1345usage: ${0##*/} OPTS
1346
1347        -t <test>   Test(s) to run (default: all)
1348                    (options: $TESTS)
1349        -p          Pause on fail
1350        -P          Pause after each test before cleanup
1351        -v          Verbose mode (show commands and output)
1352EOF
1353}
1354
1355################################################################################
1356# Main
1357
1358trap cleanup EXIT
1359
1360while getopts ":t:pPvh" opt; do
1361	case $opt in
1362		t) TESTS=$OPTARG;;
1363		p) PAUSE_ON_FAIL=yes;;
1364		P) PAUSE=yes;;
1365		v) VERBOSE=$(($VERBOSE + 1));;
1366		h) usage; exit 0;;
1367		*) usage; exit 1;;
1368	esac
1369done
1370
1371# Make sure we don't pause twice.
1372[ "${PAUSE}" = "yes" ] && PAUSE_ON_FAIL=no
1373
1374if [ "$(id -u)" -ne 0 ];then
1375	echo "SKIP: Need root privileges"
1376	exit $ksft_skip;
1377fi
1378
1379if [ ! -x "$(command -v ip)" ]; then
1380	echo "SKIP: Could not run test without ip tool"
1381	exit $ksft_skip
1382fi
1383
1384if [ ! -x "$(command -v bridge)" ]; then
1385	echo "SKIP: Could not run test without bridge tool"
1386	exit $ksft_skip
1387fi
1388
1389if [ ! -x "$(command -v tc)" ]; then
1390	echo "SKIP: Could not run test without tc tool"
1391	exit $ksft_skip
1392fi
1393
1394if [ ! -x "$(command -v arping)" ]; then
1395	echo "SKIP: Could not run test without arping tool"
1396	exit $ksft_skip
1397fi
1398
1399if [ ! -x "$(command -v ndisc6)" ]; then
1400	echo "SKIP: Could not run test without ndisc6 tool"
1401	exit $ksft_skip
1402fi
1403
1404if [ ! -x "$(command -v jq)" ]; then
1405	echo "SKIP: Could not run test without jq tool"
1406	exit $ksft_skip
1407fi
1408
1409if [ ! -x "$(command -v mausezahn)" ]; then
1410	echo "SKIP: Could not run test without mausezahn tool"
1411	exit $ksft_skip
1412fi
1413
1414bridge link help 2>&1 | grep -q "neigh_vlan_suppress"
1415if [ $? -ne 0 ]; then
1416   echo "SKIP: iproute2 bridge too old, missing per-VLAN neighbor suppression support"
1417   exit $ksft_skip
1418fi
1419
1420# Start clean.
1421cleanup
1422
1423for t in $TESTS
1424do
1425	setup
1426	$t
1427	ret=$(ksft_exit_status_merge "$ret" $?)
1428	cleanup
1429done
1430
1431if [ "$TESTS" != "none" ]; then
1432	printf "\nTests passed: %3d\n" ${nsuccess}
1433	printf "Tests failed: %3d\n"   ${nfail}
1434fi
1435
1436exit $ret
1437