xref: /freebsd/tests/sys/net/if_bridge_test.sh (revision b944c8ff17971b1c8f61d5612eac146f5d589e87)
1#
2# SPDX-License-Identifier: BSD-2-Clause
3#
4# Copyright (c) 2020 The FreeBSD Foundation
5#
6# This software was developed by Kristof Provost under sponsorship
7# from the FreeBSD Foundation.
8#
9# Redistribution and use in source and binary forms, with or without
10# modification, are permitted provided that the following conditions
11# are met:
12# 1. Redistributions of source code must retain the above copyright
13#    notice, this list of conditions and the following disclaimer.
14# 2. Redistributions in binary form must reproduce the above copyright
15#    notice, this list of conditions and the following disclaimer in the
16#    documentation and/or other materials provided with the distribution.
17#
18# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
19# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
22# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
23# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
24# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
27# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
28# SUCH DAMAGE.
29
30. $(atf_get_srcdir)/../common/vnet.subr
31
32atf_test_case "bridge_transmit_ipv4_unicast" "cleanup"
33bridge_transmit_ipv4_unicast_head()
34{
35	atf_set descr 'bridge_transmit_ipv4_unicast bridging test'
36	atf_set require.user root
37}
38
39bridge_transmit_ipv4_unicast_body()
40{
41	vnet_init
42	vnet_init_bridge
43
44	epair_alcatraz=$(vnet_mkepair)
45	epair_singsing=$(vnet_mkepair)
46
47	vnet_mkjail alcatraz ${epair_alcatraz}b
48	vnet_mkjail singsing ${epair_singsing}b
49
50	jexec alcatraz ifconfig ${epair_alcatraz}b 192.0.2.1/24 up
51	jexec singsing ifconfig ${epair_singsing}b 192.0.2.2/24 up
52
53	bridge=$(vnet_mkbridge)
54
55	ifconfig ${bridge} up
56	ifconfig ${epair_alcatraz}a up
57	ifconfig ${epair_singsing}a up
58	ifconfig ${bridge} addm ${epair_alcatraz}a
59	ifconfig ${bridge} addm ${epair_singsing}a
60
61	atf_check -s exit:0 -o ignore jexec alcatraz ping -c 3 -t 1 192.0.2.2
62	atf_check -s exit:0 -o ignore jexec singsing ping -c 3 -t 1 192.0.2.1
63}
64
65bridge_transmit_ipv4_unicast_cleanup()
66{
67	vnet_cleanup
68}
69
70atf_test_case "stp" "cleanup"
71stp_head()
72{
73	atf_set descr 'Spanning tree test'
74	atf_set require.user root
75}
76
77stp_body()
78{
79	vnet_init
80	vnet_init_bridge
81
82	epair_one=$(vnet_mkepair)
83	epair_two=$(vnet_mkepair)
84	bridge_a=$(vnet_mkbridge)
85	bridge_b=$(vnet_mkbridge)
86
87	vnet_mkjail a ${bridge_a} ${epair_one}a ${epair_two}a
88	vnet_mkjail b ${bridge_b} ${epair_one}b ${epair_two}b
89
90	jexec a ifconfig ${epair_one}a up
91	jexec a ifconfig ${epair_two}a up
92	jexec a ifconfig ${bridge_a} addm ${epair_one}a
93	jexec a ifconfig ${bridge_a} addm ${epair_two}a
94
95	jexec b ifconfig ${epair_one}b up
96	jexec b ifconfig ${epair_two}b up
97	jexec b ifconfig ${bridge_b} addm ${epair_one}b
98	jexec b ifconfig ${bridge_b} addm ${epair_two}b
99
100	jexec a ifconfig ${bridge_a} 192.0.2.1/24
101
102	# Enable spanning tree
103	jexec a ifconfig ${bridge_a} stp ${epair_one}a
104	jexec a ifconfig ${bridge_a} stp ${epair_two}a
105	jexec b ifconfig ${bridge_b} stp ${epair_one}b
106	jexec b ifconfig ${bridge_b} stp ${epair_two}b
107
108	jexec b ifconfig ${bridge_b} up
109	jexec a ifconfig ${bridge_a} up
110
111	# Give STP time to do its thing
112	sleep 5
113
114	a_discard=$(jexec a ifconfig ${bridge_a} | grep discarding)
115	b_discard=$(jexec b ifconfig ${bridge_b} | grep discarding)
116
117	if [ -z "${a_discard}" ] && [ -z "${b_discard}" ]
118	then
119		atf_fail "STP failed to detect bridging loop"
120	fi
121
122	# We must also have at least some forwarding interfaces
123	a_forwarding=$(jexec a ifconfig ${bridge_a} | grep forwarding)
124	b_forwarding=$(jexec b ifconfig ${bridge_b} | grep forwarding)
125
126	if [ -z "${a_forwarding}" ] && [ -z "${b_forwarding}" ]
127	then
128		atf_fail "STP failed to detect bridging loop"
129	fi
130}
131
132stp_cleanup()
133{
134	vnet_cleanup
135}
136
137atf_test_case "stp_vlan" "cleanup"
138stp_vlan_head()
139{
140	atf_set descr 'Spanning tree on VLAN test'
141	atf_set require.user root
142}
143
144stp_vlan_body()
145{
146	vnet_init
147	vnet_init_bridge
148
149	epair_one=$(vnet_mkepair)
150	epair_two=$(vnet_mkepair)
151	bridge_a=$(vnet_mkbridge)
152	bridge_b=$(vnet_mkbridge)
153
154	vnet_mkjail a ${bridge_a} ${epair_one}a ${epair_two}a
155	vnet_mkjail b ${bridge_b} ${epair_one}b ${epair_two}b
156
157	jexec a ifconfig ${epair_one}a up
158	jexec a ifconfig ${epair_two}a up
159	vlan_a_one=$(jexec a ifconfig vlan create vlandev ${epair_one}a vlan 42)
160	vlan_a_two=$(jexec a ifconfig vlan create vlandev ${epair_two}a vlan 42)
161	jexec a ifconfig ${vlan_a_one} up
162	jexec a ifconfig ${vlan_a_two} up
163	jexec a ifconfig ${bridge_a} addm ${vlan_a_one}
164	jexec a ifconfig ${bridge_a} addm ${vlan_a_two}
165
166	jexec b ifconfig ${epair_one}b up
167	jexec b ifconfig ${epair_two}b up
168	vlan_b_one=$(jexec b ifconfig vlan create vlandev ${epair_one}b vlan 42)
169	vlan_b_two=$(jexec b ifconfig vlan create vlandev ${epair_two}b vlan 42)
170	jexec b ifconfig ${vlan_b_one} up
171	jexec b ifconfig ${vlan_b_two} up
172	jexec b ifconfig ${bridge_b} addm ${vlan_b_one}
173	jexec b ifconfig ${bridge_b} addm ${vlan_b_two}
174
175	jexec a ifconfig ${bridge_a} 192.0.2.1/24
176
177	# Enable spanning tree
178	jexec a ifconfig ${bridge_a} stp ${vlan_a_one}
179	jexec a ifconfig ${bridge_a} stp ${vlan_a_two}
180	jexec b ifconfig ${bridge_b} stp ${vlan_b_one}
181	jexec b ifconfig ${bridge_b} stp ${vlan_b_two}
182
183	jexec b ifconfig ${bridge_b} up
184	jexec a ifconfig ${bridge_a} up
185
186	# Give STP time to do its thing
187	sleep 5
188
189	a_discard=$(jexec a ifconfig ${bridge_a} | grep discarding)
190	b_discard=$(jexec b ifconfig ${bridge_b} | grep discarding)
191
192	if [ -z "${a_discard}" ] && [ -z "${b_discard}" ]
193	then
194		atf_fail "STP failed to detect bridging loop"
195	fi
196
197	# We must also have at least some forwarding interfaces
198	a_forwarding=$(jexec a ifconfig ${bridge_a} | grep forwarding)
199	b_forwarding=$(jexec b ifconfig ${bridge_b} | grep forwarding)
200
201	if [ -z "${a_forwarding}" ] && [ -z "${b_forwarding}" ]
202	then
203		atf_fail "STP failed to detect bridging loop"
204	fi
205}
206
207stp_vlan_cleanup()
208{
209	vnet_cleanup
210}
211
212atf_test_case "static" "cleanup"
213static_head()
214{
215	atf_set descr 'Bridge static address test'
216	atf_set require.user root
217}
218
219static_body()
220{
221	vnet_init
222	vnet_init_bridge
223
224	epair=$(vnet_mkepair)
225	bridge=$(vnet_mkbridge)
226
227	vnet_mkjail one ${bridge} ${epair}a
228
229	ifconfig ${epair}b up
230
231	jexec one ifconfig ${bridge} up
232	jexec one ifconfig ${epair}a up
233	jexec one ifconfig ${bridge} addm ${epair}a
234
235	# Wrong interface
236	atf_check -s exit:1 -o ignore -e ignore \
237	    jexec one ifconfig ${bridge} static ${epair}b 00:01:02:03:04:05
238
239	# Bad address format
240	atf_check -s exit:1 -o ignore -e ignore \
241	    jexec one ifconfig ${bridge} static ${epair}a 00:01:02:03:04
242
243	# Correct add
244	atf_check -s exit:0 -o ignore \
245	    jexec one ifconfig ${bridge} static ${epair}a 00:01:02:03:04:05
246
247	# List addresses
248	atf_check -s exit:0 \
249	    -o match:"00:01:02:03:04:05 Vlan0 ${epair}a 0 flags=1<STATIC>" \
250	    jexec one ifconfig ${bridge} addr
251
252	# Delete with bad address format
253	atf_check -s exit:1 -o ignore -e ignore \
254	    jexec one ifconfig ${bridge} deladdr 00:01:02:03:04
255
256	# Delete with unlisted address
257	atf_check -s exit:1 -o ignore -e ignore \
258	    jexec one ifconfig ${bridge} deladdr 00:01:02:03:04:06
259
260	# Correct delete
261	atf_check -s exit:0 -o ignore \
262	    jexec one ifconfig ${bridge} deladdr 00:01:02:03:04:05
263}
264
265static_cleanup()
266{
267	vnet_cleanup
268}
269
270atf_test_case "vstatic" "cleanup"
271vstatic_head()
272{
273	atf_set descr 'Bridge VLAN static address test'
274	atf_set require.user root
275}
276
277vstatic_body()
278{
279	vnet_init
280	vnet_init_bridge
281
282	epair=$(vnet_mkepair)
283	bridge=$(vnet_mkbridge)
284
285	vnet_mkjail one ${bridge} ${epair}a
286
287	ifconfig ${epair}b up
288
289	jexec one ifconfig ${bridge} up
290	jexec one ifconfig ${epair}a up
291	jexec one ifconfig ${bridge} addm ${epair}a
292
293	# Wrong interface
294	atf_check -s exit:1 -o ignore -e ignore jexec one \
295	    ifconfig ${bridge} static ${epair}b 00:01:02:03:04:05 vlan 10
296
297	# Bad address format
298	atf_check -s exit:1 -o ignore -e ignore jexec one \
299	    ifconfig ${bridge} static ${epair}a 00:01:02:03:04 vlan 10
300
301	# Invalid VLAN ID
302	atf_check -s exit:1 -o ignore -e ignore jexec one \
303	    ifconfig ${bridge} static ${epair}a 00:01:02:03:04:05 vlan 5000
304
305	# Correct add
306	atf_check -s exit:0 -o ignore jexec one \
307	    ifconfig ${bridge} static ${epair}a 00:01:02:03:04:05 vlan 10
308
309	# List addresses
310	atf_check -s exit:0 \
311	    -o match:"00:01:02:03:04:05 Vlan10 ${epair}a 0 flags=1<STATIC>" \
312	    jexec one ifconfig ${bridge} addr
313
314	# Delete with bad address format
315	atf_check -s exit:1 -o ignore -e ignore jexec one \
316	    ifconfig ${bridge} deladdr 00:01:02:03:04 vlan 10
317
318	# Delete with unlisted address
319	atf_check -s exit:1 -o ignore -e ignore jexec one \
320	    ifconfig ${bridge} deladdr 00:01:02:03:04:06 vlan 10
321
322	# Delete with wrong vlan id
323	atf_check -s exit:1 -o ignore -e ignore jexec one \
324	    ifconfig ${bridge} deladdr 00:01:02:03:04:05 vlan 20
325
326	# Correct delete
327	atf_check -s exit:0 -o ignore jexec one \
328	    ifconfig ${bridge} deladdr 00:01:02:03:04:05 vlan 10
329}
330
331vstatic_cleanup()
332{
333	vnet_cleanup
334}
335
336atf_test_case "span" "cleanup"
337span_head()
338{
339	atf_set descr 'Bridge span test'
340	atf_set require.user root
341	atf_set require.progs python3 scapy
342}
343
344span_body()
345{
346	vnet_init
347	vnet_init_bridge
348
349	epair=$(vnet_mkepair)
350	epair_span=$(vnet_mkepair)
351	bridge=$(vnet_mkbridge)
352
353	vnet_mkjail one ${bridge} ${epair}a ${epair_span}a
354
355	ifconfig ${epair}b up
356	ifconfig ${epair_span}b up
357
358	jexec one ifconfig ${bridge} up
359	jexec one ifconfig ${epair}a up
360	jexec one ifconfig ${epair_span}a up
361	jexec one ifconfig ${bridge} addm ${epair}a
362
363	jexec one ifconfig ${bridge} span ${epair_span}a
364	jexec one ifconfig ${bridge} 192.0.2.1/24
365
366	# Send some traffic through the span
367	jexec one ping -c 1 -t 1 192.0.2.2
368
369	# Check that we see the traffic on the span interface
370	atf_check -s exit:0 \
371		$(atf_get_srcdir)/../netpfil/common/pft_ping.py \
372		--sendif ${epair}b \
373		--to 192.0.2.2 \
374		--recvif ${epair_span}b
375
376	jexec one ifconfig ${bridge} -span ${epair_span}a
377
378	# And no more traffic after we remove the span
379	atf_check -s exit:1 \
380		$(atf_get_srcdir)/../netpfil/common/pft_ping.py \
381		--sendif ${epair}b \
382		--to 192.0.2.2 \
383		--recvif ${epair_span}b
384}
385
386span_cleanup()
387{
388	vnet_cleanup
389}
390
391atf_test_case "delete_with_members" "cleanup"
392delete_with_members_head()
393{
394	atf_set descr 'Delete a bridge which still has member interfaces'
395	atf_set require.user root
396}
397
398delete_with_members_body()
399{
400	vnet_init
401	vnet_init_bridge
402
403	bridge=$(vnet_mkbridge)
404	epair=$(vnet_mkepair)
405
406	ifconfig ${bridge} 192.0.2.1/24 up
407	ifconfig ${epair}a up
408	ifconfig ${bridge} addm ${epair}a
409
410	ifconfig ${bridge} destroy
411}
412
413delete_with_members_cleanup()
414{
415	vnet_cleanup
416}
417
418atf_test_case "mac_conflict" "cleanup"
419mac_conflict_head()
420{
421	atf_set descr 'Ensure that bridges in different jails get different mac addresses'
422	atf_set require.user root
423}
424
425mac_conflict_body()
426{
427	vnet_init
428	vnet_init_bridge
429
430	epair=$(vnet_mkepair)
431
432	# Ensure the bridge module is loaded so jails can use it.
433	tmpbridge=$(vnet_mkbridge)
434
435	vnet_mkjail bridge_mac_conflict_one ${epair}a
436	vnet_mkjail bridge_mac_conflict_two ${epair}b
437
438	jexec bridge_mac_conflict_one ifconfig bridge create
439	jexec bridge_mac_conflict_one ifconfig bridge0 192.0.2.1/24 up \
440	    addm ${epair}a
441	jexec bridge_mac_conflict_one ifconfig ${epair}a up
442
443	jexec bridge_mac_conflict_two ifconfig bridge create
444	jexec bridge_mac_conflict_two ifconfig bridge0 192.0.2.2/24 up \
445	    addm ${epair}b
446	jexec bridge_mac_conflict_two ifconfig ${epair}b up
447
448	atf_check -s exit:0 -o ignore \
449	    jexec bridge_mac_conflict_one ping -c 3 192.0.2.2
450}
451
452mac_conflict_cleanup()
453{
454	vnet_cleanup
455}
456
457atf_test_case "inherit_mac" "cleanup"
458inherit_mac_head()
459{
460	atf_set descr 'Bridge inherit_mac test, #216510'
461	atf_set require.user root
462}
463
464inherit_mac_body()
465{
466	vnet_init
467	vnet_init_bridge
468
469	bridge=$(vnet_mkbridge)
470	epair=$(vnet_mkepair)
471	vnet_mkjail one ${bridge} ${epair}a
472
473	jexec one sysctl net.link.bridge.inherit_mac=1
474
475	# Attempt to provoke the panic described in #216510
476	jexec one ifconfig ${bridge} 192.0.0.1/24 up
477	jexec one ifconfig ${bridge} addm ${epair}a
478}
479
480inherit_mac_cleanup()
481{
482	vnet_cleanup
483}
484
485atf_test_case "stp_validation" "cleanup"
486stp_validation_head()
487{
488	atf_set descr 'Check STP validation'
489	atf_set require.user root
490	atf_set require.progs python3 scapy
491}
492
493stp_validation_body()
494{
495	vnet_init
496	vnet_init_bridge
497
498	epair_one=$(vnet_mkepair)
499	epair_two=$(vnet_mkepair)
500	bridge=$(vnet_mkbridge)
501
502	ifconfig ${bridge} up
503	ifconfig ${bridge} addm ${epair_one}a addm ${epair_two}a
504	ifconfig ${bridge} stp ${epair_one}a stp ${epair_two}a
505
506	ifconfig ${epair_one}a up
507	ifconfig ${epair_one}b up
508	ifconfig ${epair_two}a up
509	ifconfig ${epair_two}b up
510
511	# Wait until the interfaces are no longer discarding
512	while ifconfig ${bridge} | grep 'state discarding' >/dev/null
513	do
514		sleep 1
515	done
516
517	# Now inject invalid STP BPDUs on epair_one and see if they're repeated
518	# on epair_two
519	atf_check -s exit:0 \
520	    $(atf_get_srcdir)/stp.py \
521	    --sendif ${epair_one}b \
522	    --recvif ${epair_two}b
523}
524
525stp_validation_cleanup()
526{
527	vnet_cleanup
528}
529
530atf_test_case "gif" "cleanup"
531gif_head()
532{
533	atf_set descr 'gif as a bridge member'
534	atf_set require.user root
535}
536
537gif_body()
538{
539	vnet_init
540	vnet_init_bridge
541
542	epair=$(vnet_mkepair)
543
544	vnet_mkjail one ${epair}a
545	vnet_mkjail two ${epair}b
546
547	jexec one sysctl net.link.gif.max_nesting=2
548	jexec two sysctl net.link.gif.max_nesting=2
549
550	jexec one ifconfig ${epair}a 192.0.2.1/24 up
551	jexec two ifconfig ${epair}b 192.0.2.2/24 up
552
553	# Tunnel
554	gif_one=$(jexec one ifconfig gif create)
555	gif_two=$(jexec two ifconfig gif create)
556
557	jexec one ifconfig ${gif_one} tunnel 192.0.2.1 192.0.2.2
558	jexec one ifconfig ${gif_one} up
559	jexec two ifconfig ${gif_two} tunnel 192.0.2.2 192.0.2.1
560	jexec two ifconfig ${gif_two} up
561
562	bridge_one=$(jexec one ifconfig bridge create)
563	bridge_two=$(jexec two ifconfig bridge create)
564	jexec one ifconfig ${bridge_one} 198.51.100.1/24 up
565	jexec one ifconfig ${bridge_one} addm ${gif_one}
566	jexec two ifconfig ${bridge_two} 198.51.100.2/24 up
567	jexec two ifconfig ${bridge_two} addm ${gif_two}
568
569	# Sanity check
570	atf_check -s exit:0 -o ignore \
571		jexec one ping -c 1 192.0.2.2
572
573	# Test tunnel
574	atf_check -s exit:0 -o ignore \
575		jexec one ping -c 1 198.51.100.2
576	atf_check -s exit:0 -o ignore \
577		jexec one ping -c 1 -s 1200 198.51.100.2
578	atf_check -s exit:0 -o ignore \
579		jexec one ping -c 1 -s 2000 198.51.100.2
580
581	# Higher MTU on the tunnel than on the underlying interface
582	jexec one ifconfig ${epair}a mtu 1000
583	jexec two ifconfig ${epair}b mtu 1000
584
585	atf_check -s exit:0 -o ignore \
586		jexec one ping -c 1 -s 1200 198.51.100.2
587	atf_check -s exit:0 -o ignore \
588		jexec one ping -c 1 -s 2000 198.51.100.2
589
590	# Assigning IP addresses on the gif tunneling interfaces
591	jexec one sysctl net.link.bridge.member_ifaddrs=1
592	atf_check -s exit:0 -o ignore \
593		jexec one ifconfig ${gif_one} 192.168.0.224/24 192.168.169.254
594	atf_check -s exit:0 -o ignore \
595		jexec one ifconfig ${gif_one} inet6 no_dad 2001:db8::1/64
596	jexec one ifconfig ${bridge_one} deletem ${gif_one}
597	atf_check -s exit:0 -o ignore \
598		jexec one ifconfig ${bridge_one} addm ${gif_one}
599
600	jexec two sysctl net.link.bridge.member_ifaddrs=0
601	atf_check -s exit:0 -o ignore \
602		jexec two ifconfig ${gif_two} 192.168.169.254/24 192.168.0.224
603	atf_check -s exit:0 -o ignore \
604		jexec two ifconfig ${gif_two} inet6 no_dad 2001:db8::2/64
605	jexec two ifconfig ${bridge_two} deletem ${gif_two}
606	atf_check -s exit:0 -o ignore \
607		jexec two ifconfig ${bridge_two} addm ${gif_two}
608}
609
610gif_cleanup()
611{
612	vnet_cleanup
613}
614
615atf_test_case "mtu" "cleanup"
616mtu_head()
617{
618	atf_set descr 'Bridge MTU changes'
619	atf_set require.user root
620}
621
622get_mtu()
623{
624	intf=$1
625
626	ifconfig ${intf} | awk '$5 == "mtu" { print $6 }'
627}
628
629check_mtu()
630{
631	intf=$1
632	expected=$2
633
634	mtu=$(get_mtu $intf)
635	if [ "$mtu" -ne "$expected" ];
636	then
637		atf_fail "Expected MTU of $expected on $intf but found $mtu"
638	fi
639}
640
641mtu_body()
642{
643	vnet_init
644	vnet_init_bridge
645
646	epair=$(vnet_mkepair)
647	gif=$(ifconfig gif create)
648	echo ${gif} >> created_interfaces.lst
649	bridge=$(vnet_mkbridge)
650
651	atf_check -s exit:0 \
652		ifconfig ${bridge} addm ${epair}a
653
654	ifconfig ${gif} mtu 1500
655	atf_check -s exit:0 \
656		ifconfig ${bridge} addm ${gif}
657
658	# Changing MTU changes it for all member interfaces
659	atf_check -s exit:0 \
660		ifconfig ${bridge} mtu 2000
661
662	check_mtu ${bridge} 2000
663	check_mtu ${gif} 2000
664	check_mtu ${epair}a 2000
665
666	# Rejected MTUs mean none of the MTUs change
667	atf_check -s exit:1 -e ignore \
668		ifconfig ${bridge} mtu 9000
669
670	check_mtu ${bridge} 2000
671	check_mtu ${gif} 2000
672	check_mtu ${epair}a 2000
673
674	# We're not allowed to change the MTU of a member interface
675	atf_check -s exit:1 -e ignore \
676		ifconfig ${epair}a mtu 1900
677	check_mtu ${epair}a 2000
678
679	# Test adding an interface with a different MTU
680	new_epair=$(vnet_mkepair)
681	check_mtu ${new_epair}a 1500
682	atf_check -s exit:0 -e ignore \
683		ifconfig ${bridge} addm ${new_epair}a
684
685	check_mtu ${bridge} 2000
686	check_mtu ${gif} 2000
687	check_mtu ${epair}a 2000
688	check_mtu ${new_epair}a 2000
689}
690
691mtu_cleanup()
692{
693	vnet_cleanup
694}
695
696atf_test_case "vlan" "cleanup"
697vlan_head()
698{
699	atf_set descr 'Ensure the bridge takes vlan ID into account, PR#270559'
700	atf_set require.user root
701}
702
703vlan_body()
704{
705	vnet_init
706	vnet_init_bridge
707
708	vid=1
709
710	epaira=$(vnet_mkepair)
711	epairb=$(vnet_mkepair)
712
713	br=$(vnet_mkbridge)
714
715	vnet_mkjail one ${epaira}b
716	vnet_mkjail two ${epairb}b
717
718	ifconfig ${br} up
719	ifconfig ${epaira}a up
720	ifconfig ${epairb}a up
721	ifconfig ${br} addm ${epaira}a addm ${epairb}a
722
723	jexec one ifconfig ${epaira}b up
724	jexec one ifconfig ${epaira}b.${vid} create
725
726	jexec two ifconfig ${epairb}b up
727	jexec two ifconfig ${epairb}b.${vid} create
728
729	# Create a MAC address conflict between an untagged and tagged interface
730	jexec two ifconfig ${epairb}b.${vid} ether 02:05:6e:06:28:1a
731	jexec one ifconfig ${epaira}b ether 02:05:6e:06:28:1a
732	jexec one ifconfig ${epaira}b.${vid} ether 02:05:6e:06:28:1b
733
734	# Add ip address, will also populate $br's fowarding table, by ARP announcement
735	jexec one ifconfig ${epaira}b.${vid} 192.0.2.1/24 up
736	jexec two ifconfig ${epairb}b.${vid} 192.0.2.2/24 up
737
738	sleep 0.5
739
740	ifconfig ${br}
741	jexec one ifconfig
742	jexec two ifconfig
743	ifconfig ${br} addr
744
745	atf_check -s exit:0 -o ignore \
746	    jexec one ping -c 1 -t 1 192.0.2.2
747
748	# This will trigger a mac flap (by ARP announcement)
749	jexec one ifconfig ${epaira}b 192.0.2.1/24 up
750
751	sleep 0.5
752
753	ifconfig ${br} addr
754
755	atf_check -s exit:0 -o ignore \
756	    jexec one ping -c 1 -t 1 192.0.2.2
757}
758
759vlan_cleanup()
760{
761	vnet_cleanup
762}
763
764atf_test_case "many_bridge_members" "cleanup"
765many_bridge_members_head()
766{
767	atf_set descr 'many_bridge_members ifconfig test'
768	atf_set require.user root
769}
770
771many_bridge_members_body()
772{
773	vnet_init
774	vnet_init_bridge
775
776	bridge=$(vnet_mkbridge)
777	ifcount=256
778	for _ in $(seq 1 $ifcount); do
779		epair=$(vnet_mkepair)
780		ifconfig "${bridge}" addm "${epair}"a
781	done
782
783	atf_check -s exit:0 -o inline:"$ifcount\n" \
784	  sh -c "ifconfig ${bridge} | grep member: | wc -l | xargs"
785}
786
787many_bridge_members_cleanup()
788{
789	vnet_cleanup
790}
791
792atf_test_case "member_ifaddrs_enabled" "cleanup"
793member_ifaddrs_enabled_head()
794{
795	atf_set descr 'bridge with member_ifaddrs=1'
796	atf_set require.user root
797}
798
799member_ifaddrs_enabled_body()
800{
801	vnet_init
802	vnet_init_bridge
803
804	ep=$(vnet_mkepair)
805	ifconfig ${ep}a inet 192.0.2.1/24 up
806
807	vnet_mkjail one ${ep}b
808	jexec one sysctl net.link.bridge.member_ifaddrs=1
809	jexec one ifconfig ${ep}b inet 192.0.2.2/24 up
810	jexec one ifconfig bridge0 create addm ${ep}b
811
812	atf_check -s exit:0 -o ignore ping -c3 -t1 192.0.2.2
813}
814
815member_ifaddrs_enabled_cleanup()
816{
817	vnet_cleanup
818}
819
820atf_test_case "member_ifaddrs_disabled" "cleanup"
821member_ifaddrs_disabled_head()
822{
823	atf_set descr 'bridge with member_ifaddrs=0'
824	atf_set require.user root
825}
826
827member_ifaddrs_disabled_body()
828{
829	vnet_init
830	vnet_init_bridge
831
832	vnet_mkjail one
833	jexec one sysctl net.link.bridge.member_ifaddrs=0
834
835	bridge=$(jexec one ifconfig bridge create)
836
837	# adding an interface with an IPv4 address
838	ep=$(jexec one ifconfig epair create)
839	jexec one ifconfig ${ep} 192.0.2.1/32
840	atf_check -s exit:1 -e ignore jexec one ifconfig ${bridge} addm ${ep}
841
842	# adding an interface with an IPv6 address
843	ep=$(jexec one ifconfig epair create)
844	jexec one ifconfig ${ep} inet6 2001:db8::1/128
845	atf_check -s exit:1 -e ignore jexec one ifconfig ${bridge} addm ${ep}
846
847	# adding an interface with an IPv6 link-local address
848	ep=$(jexec one ifconfig epair create)
849	jexec one ifconfig ${ep} inet6 -ifdisabled auto_linklocal up
850	atf_check -s exit:1 -e ignore jexec one ifconfig ${bridge} addm ${ep}
851
852	# adding an IPv4 address to a member
853	ep=$(jexec one ifconfig epair create)
854	jexec one ifconfig ${bridge} addm ${ep}
855	atf_check -s exit:1 -e ignore jexec one ifconfig ${ep} inet 192.0.2.2/32
856
857	# adding an IPv6 address to a member
858	ep=$(jexec one ifconfig epair create)
859	jexec one ifconfig ${bridge} addm ${ep}
860	atf_check -s exit:1 -e ignore jexec one ifconfig ${ep} inet6 2001:db8::1/128
861}
862
863member_ifaddrs_disabled_cleanup()
864{
865	vnet_cleanup
866}
867
868#
869# Test kern/287150: when member_ifaddrs=0, and a physical interface which is in
870# a bridge also has a vlan(4) on it, tagged packets are not correctly passed to
871# vlan(4).
872atf_test_case "member_ifaddrs_vlan" "cleanup"
873member_ifaddrs_vlan_head()
874{
875	atf_set descr 'kern/287150: vlan and bridge on the same interface'
876	atf_set require.user root
877}
878
879member_ifaddrs_vlan_body()
880{
881	vnet_init
882	vnet_init_bridge
883
884	epone=$(vnet_mkepair)
885	eptwo=$(vnet_mkepair)
886
887	# The first jail has an epair with an IP address on vlan 20.
888	vnet_mkjail one ${epone}a
889	atf_check -s exit:0 jexec one ifconfig ${epone}a up
890	atf_check -s exit:0 jexec one \
891	    ifconfig ${epone}a.20 create inet 192.0.2.1/24 up
892
893	# The second jail has an epair with an IP address on vlan 20,
894	# which is also in a bridge.
895	vnet_mkjail two ${epone}b
896
897	jexec two ifconfig
898	atf_check -s exit:0 -o save:bridge jexec two ifconfig bridge create
899	bridge=$(cat bridge)
900	atf_check -s exit:0 jexec two ifconfig ${bridge} addm ${epone}b up
901
902	atf_check -s exit:0 -o ignore jexec two \
903	    sysctl net.link.bridge.member_ifaddrs=0
904	atf_check -s exit:0 jexec two ifconfig ${epone}b up
905	atf_check -s exit:0 jexec two \
906	    ifconfig ${epone}b.20 create inet 192.0.2.2/24 up
907
908	# Make sure the two jails can communicate over the vlan.
909	atf_check -s exit:0 -o ignore jexec one ping -c 3 -t 1 192.0.2.2
910	atf_check -s exit:0 -o ignore jexec two ping -c 3 -t 1 192.0.2.1
911}
912
913member_ifaddrs_vlan_cleanup()
914{
915	vnet_cleanup
916}
917
918atf_test_case "vlan_pvid" "cleanup"
919vlan_pvid_head()
920{
921	atf_set descr 'bridge with two ports with pvid and vlanfilter set'
922	atf_set require.user root
923}
924
925vlan_pvid_body()
926{
927	vnet_init
928	vnet_init_bridge
929
930	epone=$(vnet_mkepair)
931	eptwo=$(vnet_mkepair)
932
933	vnet_mkjail one ${epone}b
934	vnet_mkjail two ${eptwo}b
935
936	jexec one ifconfig ${epone}b 192.0.2.1/24 up
937	jexec two ifconfig ${eptwo}b 192.0.2.2/24 up
938
939	bridge=$(vnet_mkbridge)
940
941	ifconfig ${bridge} vlanfilter up
942	ifconfig ${epone}a up
943	ifconfig ${eptwo}a up
944	ifconfig ${bridge} addm ${epone}a untagged 20
945	ifconfig ${bridge} addm ${eptwo}a untagged 20
946
947	# With VLAN filtering enabled, traffic should be passed.
948	atf_check -s exit:0 -o ignore jexec one ping -c 3 -t 1 192.0.2.2
949	atf_check -s exit:0 -o ignore jexec two ping -c 3 -t 1 192.0.2.1
950
951	# Removed the untagged VLAN on one port; traffic should not be passed.
952	ifconfig ${bridge} -ifuntagged ${epone}a
953	atf_check -s exit:2 -o ignore jexec one ping -c 3 -t 1 192.0.2.2
954	atf_check -s exit:2 -o ignore jexec two ping -c 3 -t 1 192.0.2.1
955}
956
957vlan_pvid_cleanup()
958{
959	vnet_cleanup
960}
961
962atf_test_case "vlan_pvid_filtered" "cleanup"
963vlan_pvid_filtered_head()
964{
965	atf_set descr 'bridge with two ports with different pvids'
966	atf_set require.user root
967}
968
969vlan_pvid_filtered_body()
970{
971	vnet_init
972	vnet_init_bridge
973
974	epone=$(vnet_mkepair)
975	eptwo=$(vnet_mkepair)
976
977	vnet_mkjail one ${epone}b
978	vnet_mkjail two ${eptwo}b
979
980	atf_check -s exit:0 jexec one ifconfig ${epone}b 192.0.2.1/24 up
981	atf_check -s exit:0 jexec two ifconfig ${eptwo}b 192.0.2.2/24 up
982
983	bridge=$(vnet_mkbridge)
984
985	atf_check -s exit:0 ifconfig ${bridge} vlanfilter up
986	atf_check -s exit:0 ifconfig ${epone}a up
987	atf_check -s exit:0 ifconfig ${eptwo}a up
988	atf_check -s exit:0 ifconfig ${bridge} addm ${epone}a untagged 20
989	atf_check -s exit:0 ifconfig ${bridge} addm ${eptwo}a untagged 30
990
991	atf_check -s exit:2 -o ignore jexec one ping -c 3 -t 1 192.0.2.2
992	atf_check -s exit:2 -o ignore jexec two ping -c 3 -t 1 192.0.2.1
993}
994
995vlan_pvid_filtered_cleanup()
996{
997	vnet_cleanup
998}
999
1000atf_test_case "vlan_pvid_tagged" "cleanup"
1001vlan_pvid_tagged_head()
1002{
1003	atf_set descr 'bridge pvid with tagged frames for pvid'
1004	atf_set require.user root
1005}
1006
1007vlan_pvid_tagged_body()
1008{
1009	vnet_init
1010	vnet_init_bridge
1011
1012	epone=$(vnet_mkepair)
1013	eptwo=$(vnet_mkepair)
1014
1015	vnet_mkjail one ${epone}b
1016	vnet_mkjail two ${eptwo}b
1017
1018	# Create two tagged interfaces on the appropriate VLANs
1019	atf_check -s exit:0 jexec one ifconfig ${epone}b up
1020	atf_check -s exit:0 jexec one ifconfig ${epone}b.20 \
1021	    create 192.0.2.1/24 up
1022	atf_check -s exit:0 jexec two ifconfig ${eptwo}b up
1023	atf_check -s exit:0 jexec two ifconfig ${eptwo}b.20 \
1024	    create 192.0.2.2/24 up
1025
1026	bridge=$(vnet_mkbridge)
1027
1028	atf_check -s exit:0 ifconfig ${bridge} vlanfilter up
1029	atf_check -s exit:0 ifconfig ${epone}a up
1030	atf_check -s exit:0 ifconfig ${eptwo}a up
1031	atf_check -s exit:0 ifconfig ${bridge} addm ${epone}a untagged 20
1032	atf_check -s exit:0 ifconfig ${bridge} addm ${eptwo}a untagged 20
1033
1034	# Tagged frames should not be passed.
1035	atf_check -s exit:2 -o ignore jexec one ping -c 3 -t 1 192.0.2.2
1036	atf_check -s exit:2 -o ignore jexec two ping -c 3 -t 1 192.0.2.1
1037}
1038
1039vlan_pvid_tagged_cleanup()
1040{
1041	vnet_cleanup
1042}
1043
1044atf_test_case "vlan_pvid_1q" "cleanup"
1045vlan_pvid_1q_head()
1046{
1047	atf_set descr '802.1q tag addition and removal'
1048	atf_set require.user root
1049}
1050
1051vlan_pvid_1q_body()
1052{
1053	vnet_init
1054	vnet_init_bridge
1055
1056	epone=$(vnet_mkepair)
1057	eptwo=$(vnet_mkepair)
1058
1059	vnet_mkjail one ${epone}b
1060	vnet_mkjail two ${eptwo}b
1061
1062	# Set up one jail with an access port, and the other with a trunk port.
1063	# This forces the bridge to add and remove .1q tags to bridge the
1064	# traffic.
1065
1066	atf_check -s exit:0 jexec one ifconfig ${epone}b 192.0.2.1/24 up
1067	atf_check -s exit:0 jexec two ifconfig ${eptwo}b up
1068	atf_check -s exit:0 jexec two ifconfig ${eptwo}b.20 create 192.0.2.2/24 up
1069
1070	bridge=$(vnet_mkbridge)
1071
1072	atf_check -s exit:0 ifconfig ${bridge} vlanfilter up
1073	atf_check -s exit:0 ifconfig ${bridge} addm ${epone}a untagged 20
1074	atf_check -s exit:0 ifconfig ${bridge} addm ${eptwo}a tagged 20
1075
1076	atf_check -s exit:0 ifconfig ${epone}a up
1077	atf_check -s exit:0 ifconfig ${eptwo}a up
1078
1079	atf_check -s exit:0 -o ignore jexec one ping -c 3 -t 1 192.0.2.2
1080	atf_check -s exit:0 -o ignore jexec two ping -c 3 -t 1 192.0.2.1
1081}
1082
1083vlan_pvid_1q_cleanup()
1084{
1085       vnet_cleanup
1086}
1087
1088#
1089# Test vlan filtering.
1090#
1091atf_test_case "vlan_filtering" "cleanup"
1092vlan_filtering_head()
1093{
1094	atf_set descr 'tagged traffic with filtering'
1095	atf_set require.user root
1096}
1097
1098vlan_filtering_body()
1099{
1100	vnet_init
1101	vnet_init_bridge
1102
1103	epone=$(vnet_mkepair)
1104	eptwo=$(vnet_mkepair)
1105
1106	vnet_mkjail one ${epone}b
1107	vnet_mkjail two ${eptwo}b
1108
1109	atf_check -s exit:0 jexec one ifconfig ${epone}b up
1110	atf_check -s exit:0 jexec one ifconfig ${epone}b.20 \
1111	    create 192.0.2.1/24 up
1112	atf_check -s exit:0 jexec two ifconfig ${eptwo}b up
1113	atf_check -s exit:0 jexec two ifconfig ${eptwo}b.20 \
1114	    create 192.0.2.2/24 up
1115
1116	bridge=$(vnet_mkbridge)
1117
1118	atf_check -s exit:0 ifconfig ${bridge} vlanfilter up
1119	atf_check -s exit:0 ifconfig ${epone}a up
1120	atf_check -s exit:0 ifconfig ${eptwo}a up
1121	atf_check -s exit:0 ifconfig ${bridge} addm ${epone}a
1122	atf_check -s exit:0 ifconfig ${bridge} addm ${eptwo}a
1123
1124	# Right now there are no VLANs on the access list, so everything
1125	# should be blocked.
1126	atf_check -s exit:2 -o ignore jexec one ping -c 3 -t 1 192.0.2.2
1127	atf_check -s exit:2 -o ignore jexec two ping -c 3 -t 1 192.0.2.1
1128
1129	# Set the untagged vlan on both ports to 20 and make sure traffic is
1130	# still blocked.  We intentionally do not pass tagged traffic for the
1131	# untagged vlan.
1132	atf_check -s exit:0 ifconfig ${bridge} ifuntagged ${epone}a 20
1133	atf_check -s exit:0 ifconfig ${bridge} ifuntagged ${eptwo}a 20
1134
1135	atf_check -s exit:2 -o ignore jexec one ping -c 3 -t 1 192.0.2.2
1136	atf_check -s exit:2 -o ignore jexec two ping -c 3 -t 1 192.0.2.1
1137
1138	atf_check -s exit:0 ifconfig ${bridge} -ifuntagged ${epone}a
1139	atf_check -s exit:0 ifconfig ${bridge} -ifuntagged ${eptwo}a
1140
1141	# Add VLANs 10-30 to the access list; now access should be allowed.
1142	atf_check -s exit:0 ifconfig ${bridge} +iftagged ${epone}a 10-30
1143	atf_check -s exit:0 ifconfig ${bridge} +iftagged ${eptwo}a 10-30
1144	atf_check -s exit:0 -o ignore jexec one ping -c 3 -t 1 192.0.2.2
1145	atf_check -s exit:0 -o ignore jexec two ping -c 3 -t 1 192.0.2.1
1146
1147	# Remove vlan 20 from the access list, now access should be blocked
1148	# again.
1149	atf_check -s exit:0 ifconfig ${bridge} -iftagged ${epone}a 20
1150	atf_check -s exit:0 ifconfig ${bridge} -iftagged ${eptwo}a 20
1151	atf_check -s exit:2 -o ignore jexec one ping -c 3 -t 1 192.0.2.2
1152	atf_check -s exit:2 -o ignore jexec two ping -c 3 -t 1 192.0.2.1
1153}
1154
1155vlan_filtering_cleanup()
1156{
1157	vnet_cleanup
1158}
1159
1160#
1161# Test the ifconfig 'iftagged' option.
1162#
1163atf_test_case "vlan_ifconfig_iftagged" "cleanup"
1164vlan_ifconfig_iftagged_head()
1165{
1166	atf_set descr 'test the ifconfig iftagged option'
1167	atf_set require.user root
1168}
1169
1170vlan_ifconfig_iftagged_body()
1171{
1172	vnet_init
1173	vnet_init_bridge
1174
1175	ep=$(vnet_mkepair)
1176	bridge=$(vnet_mkbridge)
1177	atf_check -s exit:0 ifconfig ${bridge} vlanfilter up
1178
1179	atf_check -s exit:0 ifconfig ${bridge} addm ${ep}a
1180	atf_check -s exit:0 ifconfig ${ep}a up
1181
1182	# To start with, no vlans should be configured.
1183	atf_check -s exit:0 -o not-match:"tagged" ifconfig ${bridge}
1184
1185	# Add vlans 100-149.
1186	atf_check -s exit:0 ifconfig ${bridge} iftagged ${ep}a 100-149
1187	atf_check -s exit:0 -o match:"tagged 100-149" ifconfig ${bridge}
1188
1189	# Replace the vlan list with 139-199.
1190	atf_check -s exit:0 ifconfig ${bridge} iftagged ${ep}a 139-199
1191	atf_check -s exit:0 -o match:"tagged 139-199" ifconfig ${bridge}
1192
1193	# Add vlans 100-170.
1194	atf_check -s exit:0 ifconfig ${bridge} +iftagged ${ep}a 100-170
1195	atf_check -s exit:0 -o match:"tagged 100-199" ifconfig ${bridge}
1196
1197	# Remove vlans 104, 105, and 150-159
1198	atf_check -s exit:0 ifconfig ${bridge} -iftagged ${ep}a 104,105,150-159
1199	atf_check -s exit:0 -o match:"tagged 100-103,106-149,160-199" \
1200	    ifconfig ${bridge}
1201
1202	# Remove the entire vlan list.
1203	atf_check -s exit:0 ifconfig ${bridge} iftagged ${ep}a none
1204	atf_check -s exit:0 -o not-match:"tagged" ifconfig ${bridge}
1205
1206	# Test some invalid vlans sets.
1207	for bad_vlan in -1 0 4096 4097 foo 0-10 4000-5000 foo-40 40-foo; do
1208		atf_check -s exit:1 -e ignore \
1209		    ifconfig ${bridge} iftagged "$bad_vlan"
1210	done
1211}
1212
1213vlan_ifconfig_iftagged_cleanup()
1214{
1215	vnet_cleanup
1216}
1217
1218#
1219# Test a vlan(4) "SVI" interface on top of a bridge.
1220#
1221atf_test_case "vlan_svi" "cleanup"
1222vlan_svi_head()
1223{
1224	atf_set descr 'vlan bridge with an SVI'
1225	atf_set require.user root
1226}
1227
1228vlan_svi_body()
1229{
1230	vnet_init
1231	vnet_init_bridge
1232
1233	epone=$(vnet_mkepair)
1234
1235	vnet_mkjail one ${epone}b
1236
1237	atf_check -s exit:0 jexec one ifconfig ${epone}b up
1238	atf_check -s exit:0 jexec one ifconfig ${epone}b.20 \
1239	    create 192.0.2.1/24 up
1240
1241	bridge=$(vnet_mkbridge)
1242
1243	atf_check -s exit:0 ifconfig ${bridge} vlanfilter up
1244	atf_check -s exit:0 ifconfig ${epone}a up
1245	atf_check -s exit:0 ifconfig ${bridge} addm ${epone}a tagged 20
1246
1247	svi=$(vnet_mkvlan)
1248	atf_check -s exit:0 ifconfig ${svi} vlan 20 vlandev ${bridge}
1249	atf_check -s exit:0 ifconfig ${svi} inet 192.0.2.2/24 up
1250
1251	atf_check -s exit:0 -o ignore ping -c 3 -t 1 192.0.2.1
1252}
1253
1254vlan_svi_cleanup()
1255{
1256	vnet_cleanup
1257}
1258
1259#
1260# Test QinQ (802.1ad).
1261#
1262atf_test_case "vlan_qinq" "cleanup"
1263vlan_qinq_head()
1264{
1265	atf_set descr 'vlan filtering with QinQ traffic'
1266	atf_set require.user root
1267}
1268
1269vlan_qinq_body()
1270{
1271	vnet_init
1272	vnet_init_bridge
1273
1274	epone=$(vnet_mkepair)
1275	eptwo=$(vnet_mkepair)
1276
1277	vnet_mkjail one ${epone}b
1278	vnet_mkjail two ${eptwo}b
1279
1280	# Create a QinQ trunk between the two jails.  The outer (provider) tag
1281	# is 5, and the inner tag is 10.
1282
1283	atf_check -s exit:0 jexec one ifconfig ${epone}b up
1284	atf_check -s exit:0 jexec one \
1285	    ifconfig ${epone}b.5 create vlanproto 802.1ad up
1286	atf_check -s exit:0 jexec one \
1287	    ifconfig ${epone}b.5.10 create inet 192.0.2.1/24 up
1288
1289	atf_check -s exit:0 jexec two ifconfig ${eptwo}b up
1290	atf_check -s exit:0 jexec two ifconfig \
1291	    ${eptwo}b.5 create vlanproto 802.1ad up
1292	atf_check -s exit:0 jexec two ifconfig \
1293	    ${eptwo}b.5.10 create inet 192.0.2.2/24 up
1294
1295	bridge=$(vnet_mkbridge)
1296
1297	atf_check -s exit:0 ifconfig ${bridge} vlanfilter defqinq up
1298	atf_check -s exit:0 ifconfig ${epone}a up
1299	atf_check -s exit:0 ifconfig ${eptwo}a up
1300	atf_check -s exit:0 ifconfig ${bridge} addm ${epone}a
1301	atf_check -s exit:0 ifconfig ${bridge} addm ${eptwo}a
1302
1303	# Right now there are no VLANs on the access list, so everything
1304	# should be blocked.
1305	atf_check -s exit:2 -o ignore jexec one ping -c 3 -t 1 192.0.2.2
1306	atf_check -s exit:2 -o ignore jexec two ping -c 3 -t 1 192.0.2.1
1307
1308	# Add the provider tag to the access list; now traffic should be passed.
1309	atf_check -s exit:0 ifconfig ${bridge} +iftagged ${epone}a 5
1310	atf_check -s exit:0 ifconfig ${bridge} +iftagged ${eptwo}a 5
1311	atf_check -s exit:0 -o ignore jexec one ping -c 3 -t 1 192.0.2.2
1312	atf_check -s exit:0 -o ignore jexec two ping -c 3 -t 1 192.0.2.1
1313
1314	# Remove the qinq flag from one of the interfaces; traffic should
1315	# be blocked again.
1316	atf_check -s exit:0 ifconfig ${bridge} -qinq ${epone}a
1317	atf_check -s exit:2 -o ignore jexec one ping -c 3 -t 1 192.0.2.2
1318	atf_check -s exit:2 -o ignore jexec two ping -c 3 -t 1 192.0.2.1
1319}
1320
1321vlan_qinq_cleanup()
1322{
1323	vnet_cleanup
1324}
1325
1326# Adding a bridge SVI to a bridge should not be allowed.
1327atf_test_case "bridge_svi_in_bridge" "cleanup"
1328bridge_svi_in_bridge_head()
1329{
1330	atf_set descr 'adding a bridge SVI to a bridge is not allowed (1)'
1331	atf_set require.user root
1332}
1333
1334bridge_svi_in_bridge_body()
1335{
1336	vnet_init
1337	vnet_init_bridge
1338
1339	bridge=$(vnet_mkbridge)
1340	atf_check -s exit:0 ifconfig ${bridge}.1 create
1341	atf_check -s exit:1 -e ignore ifconfig ${bridge} addm ${bridge}.1
1342}
1343
1344bridge_svi_in_bridge_cleanup()
1345{
1346	vnet_cleanup
1347}
1348
1349atf_test_case "vlan_untagged" "cleanup"
1350vlan_untagged_head()
1351{
1352	atf_set descr 'bridge with two ports with untagged set'
1353	atf_set require.user root
1354}
1355
1356vlan_untagged_body()
1357{
1358	vnet_init
1359	vnet_init_bridge
1360
1361	epone=$(vnet_mkepair)
1362	eptwo=$(vnet_mkepair)
1363
1364	vnet_mkjail one ${epone}b
1365	vnet_mkjail two ${eptwo}b
1366
1367	jexec one ifconfig ${epone}b 192.0.2.1/24 up
1368	jexec two ifconfig ${eptwo}b 192.0.2.2/24 up
1369
1370	bridge=$(vnet_mkbridge)
1371
1372	ifconfig ${bridge} up
1373	ifconfig ${epone}a up
1374	ifconfig ${eptwo}a up
1375	ifconfig ${bridge} addm ${epone}a untagged 20
1376	ifconfig ${bridge} addm ${eptwo}a untagged 30
1377
1378	# With two ports on different VLANs, traffic should not be passed.
1379	atf_check -s exit:2 -o ignore jexec one ping -c 3 -t 1 192.0.2.2
1380	atf_check -s exit:2 -o ignore jexec two ping -c 3 -t 1 192.0.2.1
1381
1382	# Move the second port to VLAN 20; now traffic should be passed.
1383	atf_check -s exit:0 ifconfig ${bridge} ifuntagged ${eptwo}a 20
1384	atf_check -s exit:0 -o ignore jexec one ping -c 3 -t 1 192.0.2.2
1385	atf_check -s exit:0 -o ignore jexec two ping -c 3 -t 1 192.0.2.1
1386
1387	# Remove the first's port untagged config, now traffic should
1388	# not pass again.
1389	atf_check -s exit:0 ifconfig ${bridge} -ifuntagged ${epone}a
1390	atf_check -s exit:2 -o ignore jexec one ping -c 3 -t 1 192.0.2.2
1391	atf_check -s exit:2 -o ignore jexec two ping -c 3 -t 1 192.0.2.1
1392}
1393
1394vlan_untagged_cleanup()
1395{
1396	vnet_cleanup
1397}
1398
1399atf_test_case "vlan_defuntagged" "cleanup"
1400vlan_defuntagged_head()
1401{
1402	atf_set descr 'defuntagged (defpvid) bridge option'
1403	atf_set require.user root
1404}
1405
1406vlan_defuntagged_body()
1407{
1408	vnet_init
1409	vnet_init_bridge
1410
1411	bridge=$(vnet_mkbridge)
1412
1413	# Invalid VLAN IDs
1414	atf_check -s exit:1 -ematch:"invalid vlan id: 0" \
1415		ifconfig ${bridge} defuntagged 0
1416	atf_check -s exit:1 -ematch:"invalid vlan id: 4095" \
1417		ifconfig ${bridge} defuntagged 4095
1418	atf_check -s exit:1 -ematch:"invalid vlan id: 5000" \
1419		ifconfig ${bridge} defuntagged 5000
1420
1421	# Check the bridge option is set and cleared correctly
1422	atf_check -s exit:0 -onot-match:"defuntagged=" \
1423		ifconfig ${bridge}
1424
1425	atf_check -s exit:0 ifconfig ${bridge} defuntagged 10
1426	atf_check -s exit:0 -omatch:"defuntagged=10$" \
1427		ifconfig ${bridge}
1428
1429	atf_check -s exit:0 ifconfig ${bridge} -defuntagged
1430	atf_check -s exit:0 -onot-match:"defuntagged=" \
1431		ifconfig ${bridge}
1432
1433	# Check the untagged option is correctly set on a member
1434	atf_check -s exit:0 ifconfig ${bridge} defuntagged 10
1435
1436	epair=$(vnet_mkepair)
1437	atf_check -s exit:0 ifconfig ${bridge} addm ${epair}a
1438
1439	tag=$(ifconfig ${bridge} | sed -Ene \
1440		"/member: ${epair}a/ { N;s/.*untagged ([0-9]+).*/\\1/p;q; }")
1441	if [ "$tag" != "10" ]; then
1442		atf_fail "wrong untagged vlan: ${tag}"
1443	fi
1444}
1445
1446vlan_defuntagged_cleanup()
1447{
1448	vnet_cleanup
1449}
1450
1451atf_init_test_cases()
1452{
1453	atf_add_test_case "bridge_transmit_ipv4_unicast"
1454	atf_add_test_case "stp"
1455	atf_add_test_case "stp_vlan"
1456	atf_add_test_case "static"
1457	atf_add_test_case "vstatic"
1458	atf_add_test_case "span"
1459	atf_add_test_case "inherit_mac"
1460	atf_add_test_case "delete_with_members"
1461	atf_add_test_case "mac_conflict"
1462	atf_add_test_case "stp_validation"
1463	atf_add_test_case "gif"
1464	atf_add_test_case "mtu"
1465	atf_add_test_case "vlan"
1466	atf_add_test_case "many_bridge_members"
1467	atf_add_test_case "member_ifaddrs_enabled"
1468	atf_add_test_case "member_ifaddrs_disabled"
1469	atf_add_test_case "member_ifaddrs_vlan"
1470	atf_add_test_case "vlan_pvid"
1471	atf_add_test_case "vlan_pvid_1q"
1472	atf_add_test_case "vlan_pvid_filtered"
1473	atf_add_test_case "vlan_pvid_tagged"
1474	atf_add_test_case "vlan_filtering"
1475	atf_add_test_case "vlan_ifconfig_iftagged"
1476	atf_add_test_case "vlan_svi"
1477	atf_add_test_case "vlan_qinq"
1478	atf_add_test_case "vlan_untagged"
1479	atf_add_test_case "vlan_defuntagged"
1480	atf_add_test_case "bridge_svi_in_bridge"
1481}
1482