xref: /netbsd-src/tests/net/if_vlan/t_vlan.sh (revision 63162a40fee67dd0ed5c6f644601c06065ed1d7a)
1#	$NetBSD: t_vlan.sh,v 1.25 2023/11/02 09:50:50 yamaguchi Exp $
2#
3# Copyright (c) 2016 Internet Initiative Japan Inc.
4# All rights reserved.
5#
6# Redistribution and use in source and binary forms, with or without
7# modification, are permitted provided that the following conditions
8# are met:
9# 1. Redistributions of source code must retain the above copyright
10#    notice, this list of conditions and the following disclaimer.
11# 2. Redistributions in binary form must reproduce the above copyright
12#    notice, this list of conditions and the following disclaimer in the
13#    documentation and/or other materials provided with the distribution.
14#
15# THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
16# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
17# TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
18# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
19# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25# POSSIBILITY OF SUCH DAMAGE.
26#
27
28BUS=bus
29SOCK_LOCAL=unix://commsock1
30SOCK_REMOTE=unix://commsock2
31IP_LOCAL0=10.0.0.1
32IP_LOCAL1=10.0.1.1
33IP_REMOTE0=10.0.0.2
34IP_REMOTE1=10.0.1.2
35IP_MCADDR0=224.0.0.10
36IP6_LOCAL0=fc00::1
37IP6_LOCAL1=fc00:1::1
38IP6_REMOTE0=fc00::2
39IP6_REMOTE1=fc00:1::2
40IP6_MCADDR0=ff11::10
41ETH_IP_MCADDR0=01:00:5e:00:00:0a
42ETH_IP6_MCADDR0=33:33:00:00:00:10
43
44DEBUG=${DEBUG:-false}
45
46vlan_create_destroy_body_common()
47{
48	local atf_ifconfig="atf_check -s exit:0 rump.ifconfig"
49
50	export RUMP_SERVER=${SOCK_LOCAL}
51
52	$atf_ifconfig vlan0 create
53	$atf_ifconfig vlan0 destroy
54
55	$atf_ifconfig vlan0 create
56	$atf_ifconfig vlan0 up
57	$atf_ifconfig vlan0 down
58	$atf_ifconfig vlan0 destroy
59
60	$atf_ifconfig shmif0 create
61	$atf_ifconfig vlan0 create
62	$atf_ifconfig vlan0 vlan 1 vlanif shmif0
63	$atf_ifconfig vlan0 up
64	$atf_ifconfig vlan0 destroy
65
66	# more than one vlan interface with a same parent interface
67	$atf_ifconfig shmif1 create
68	$atf_ifconfig vlan0 create
69	$atf_ifconfig vlan0 vlan 10 vlanif shmif0
70	$atf_ifconfig vlan1 create
71	$atf_ifconfig vlan1 vlan 11 vlanif shmif0
72
73	# more than one interface with another parent interface
74	$atf_ifconfig vlan2 create
75	$atf_ifconfig vlan2 vlan 12 vlanif shmif1
76	$atf_ifconfig vlan3 create
77	$atf_ifconfig vlan3 vlan 13 vlanif shmif1
78	$atf_ifconfig shmif0 destroy
79	atf_check -s exit:0 -o not-match:'shmif0' rump.ifconfig vlan0
80	atf_check -s exit:0 -o not-match:'shmif0' rump.ifconfig vlan1
81	atf_check -s exit:0 -o match:'shmif1' rump.ifconfig vlan2
82	atf_check -s exit:0 -o match:'shmif1' rump.ifconfig vlan3
83	$atf_ifconfig vlan0 destroy
84	$atf_ifconfig vlan1 destroy
85	$atf_ifconfig vlan2 destroy
86	$atf_ifconfig vlan3 destroy
87
88}
89
90atf_test_case vlan_create_destroy cleanup
91vlan_create_destroy_head()
92{
93
94	atf_set "descr" "tests of creation and deletion of vlan interface"
95	atf_set "require.progs" "rump_server"
96}
97
98vlan_create_destroy_body()
99{
100	rump_server_start $SOCK_LOCAL vlan
101
102	vlan_create_destroy_body_common
103}
104
105
106vlan_create_destroy_cleanup()
107{
108
109	$DEBUG && dump
110	cleanup
111}
112
113atf_test_case vlan_create_destroy6 cleanup
114vlan_create_destroy6_head()
115{
116
117	atf_set "descr" "tests of creation and deletion of vlan interface with IPv6"
118	atf_set "require.progs" "rump_server"
119}
120
121vlan_create_destroy6_body()
122{
123
124	rump_server_start $SOCK_LOCAL vlan netinet6
125
126	vlan_create_destroy_body_common
127}
128
129vlan_create_destroy6_cleanup()
130{
131
132	$DEBUG && dump
133	cleanup
134}
135
136vlan_basic_body_common()
137{
138	local atf_ifconfig="atf_check -s exit:0 rump.ifconfig"
139	local outfile=./out
140	local af=inet
141	local prefix=24
142	local local0=$IP_LOCAL0
143	local remote0=$IP_REMOTE0
144	local ping_cmd="rump.ping -n -w 1 -c 1"
145
146	if [ x"$1" = x"inet6" ]; then
147		af="inet6"
148		prefix=64
149		local0=$IP6_LOCAL0
150		remote0=$IP6_REMOTE0
151		ping_cmd="rump.ping6 -n -c 1"
152	fi
153
154	rump_server_add_iface $SOCK_LOCAL shmif0 $BUS
155	rump_server_add_iface $SOCK_REMOTE shmif0 $BUS
156
157	export RUMP_SERVER=$SOCK_LOCAL
158	$atf_ifconfig shmif0 up
159	export RUMP_SERVER=$SOCK_REMOTE
160	$atf_ifconfig shmif0 up
161
162	export RUMP_SERVER=$SOCK_LOCAL
163	$atf_ifconfig vlan0 create
164	$atf_ifconfig vlan0 vlan 10 vlanif shmif0
165	$atf_ifconfig vlan0 $af $local0/$prefix
166	$atf_ifconfig vlan0 up
167	$atf_ifconfig -w 10
168
169	export RUMP_SERVER=$SOCK_REMOTE
170	$atf_ifconfig vlan0 create
171	$atf_ifconfig vlan0 vlan 10 vlanif shmif0
172	$atf_ifconfig vlan0 $af $remote0/$prefix
173	$atf_ifconfig vlan0 up
174	$atf_ifconfig -w 10
175
176	extract_new_packets $BUS > $outfile
177
178	export RUMP_SERVER=$SOCK_LOCAL
179	atf_check -s exit:0 -o ignore $ping_cmd $remote0
180
181	extract_new_packets $BUS > $outfile
182	atf_check -s exit:0 -o match:'vlan 10' cat $outfile
183
184	$atf_ifconfig vlan0 -vlanif
185	$atf_ifconfig vlan0 vlan 20 vlanif shmif0
186	$atf_ifconfig vlan0 $af $local0/$prefix
187	$atf_ifconfig vlan0 up
188	$atf_ifconfig -w 10
189
190	extract_new_packets $BUS > $outfile
191	atf_check -s not-exit:0 -o ignore $ping_cmd $remote0
192
193	extract_new_packets $BUS > $outfile
194	atf_check -s exit:0 -o match:'vlan 20' cat $outfile
195
196	export RUMP_SERVER=$SOCK_LOCAL
197	$atf_ifconfig vlan0 -vlanif
198	$atf_ifconfig vlan0 vlan 10 vlanif shmif0
199	$atf_ifconfig vlan0 $af $local0/$prefix
200	$atf_ifconfig vlan0 up
201	$atf_ifconfig -w 10
202
203	atf_check -s exit:0 -o ignore rump.ifconfig -z vlan0
204	atf_check -s exit:0 -o ignore $ping_cmd $remote0
205	rump.ifconfig -v vlan0 > $outfile
206
207	atf_check -s exit:0 -o not-match:' 0 packets' cat $outfile
208	atf_check -s exit:0 -o not-match:' 0 bytes' cat $outfile
209}
210
211atf_test_case vlan_basic cleanup
212vlan_basic_head()
213{
214
215	atf_set "descr" "tests of communications over vlan interfaces"
216	atf_set "require.progs" "rump_server"
217}
218
219vlan_basic_body()
220{
221	rump_server_start $SOCK_LOCAL vlan
222	rump_server_start $SOCK_REMOTE vlan
223
224	vlan_basic_body_common inet
225
226}
227
228vlan_basic_cleanup()
229{
230
231	$DEBUG && dump
232	cleanup
233}
234
235atf_test_case vlan_basic6 cleanup
236vlan_basic6_head()
237{
238
239	atf_set "descr" "tests of communications over vlan interfaces using IPv6"
240	atf_set "require.progs" "rump_server"
241}
242
243vlan_basic6_body()
244{
245	rump_server_start $SOCK_LOCAL vlan netinet6
246	rump_server_start $SOCK_REMOTE vlan netinet6
247
248	vlan_basic_body_common inet6
249}
250
251vlan_basic6_cleanup()
252{
253
254	$DEBUG && dump
255	cleanup
256}
257
258vlan_auto_follow_mtu_body_common()
259{
260	local atf_ifconfig="atf_check -s exit:0 rump.ifconfig"
261	local outfile=./out
262	local af=inet
263	local prefix=24
264	local local0=$IP_LOCAL0
265	local remote0=$IP_REMOTE0
266	local ping_cmd="rump.ping -D -n -w 1 -c 1"
267	local mtu=1500
268	local vlan_mtu=`expr $mtu - 4`
269	# ipv4 header=20bytes, icmp header=8bytes
270	local padding=`expr $vlan_mtu - 20 - 8`
271	local over_padding=`expr $vlan_mtu - 20 - 8 + 1`
272	local nonfrag_msg="$local0 > $remote0: ICMP echo request"
273	# unused for ipv4
274	local frag_msg=""
275
276	if [ x"$1" = x"inet6" ]; then
277		af="inet6"
278		prefix=64
279		local0=$IP6_LOCAL0
280		remote0=$IP6_REMOTE0
281		# ipv6 header=40bytes, icmpv6 header=8bytes
282		padding=`expr $vlan_mtu - 40 - 8`
283		over_padding=`expr $vlan_mtu - 40 - 8 + 1`
284		ping_cmd="rump.ping6 -mm -n -c 1 -i 1"
285		nonfrag_msg="$local0 > $remote0: ICMP6, echo request"
286		frag_msg="$local0 > $remote0: frag .* ICMP6, echo request"
287	fi
288
289	rump_server_add_iface $SOCK_LOCAL shmif0 $BUS
290	rump_server_add_iface $SOCK_REMOTE shmif0 $BUS
291
292	export RUMP_SERVER=$SOCK_LOCAL
293	$atf_ifconfig shmif0 up
294	export RUMP_SERVER=$SOCK_REMOTE
295	$atf_ifconfig shmif0 up
296
297	export RUMP_SERVER=$SOCK_LOCAL
298	$atf_ifconfig vlan0 create
299
300	# since upper bound of shmif's mtu is 1500,
301	# so we lower vlan's mtu instead of raising shmif's.
302	# to do this, we change the interface's parameter
303	# such as ND_IFINFO(ifp)->maxmtu that is changed by SIOCSIFMTU.
304
305	# $atf_config shmif0 mtu 1600
306	$atf_ifconfig vlan0 vlan 10 vlanif shmif0
307	$atf_ifconfig vlan0 mtu 1400
308	$atf_ifconfig vlan0 -vlanif shmif0
309
310	$atf_ifconfig vlan0 vlan 10 vlanif shmif0
311	$atf_ifconfig vlan0 $af $local0/$prefix
312	$atf_ifconfig vlan0 up
313	$atf_ifconfig -w 10
314
315	export RUMP_SERVER=$SOCK_REMOTE
316	$atf_ifconfig vlan0 create
317	$atf_ifconfig vlan0 vlan 10 vlanif shmif0
318	$atf_ifconfig vlan0 $af $remote0/$prefix
319	$atf_ifconfig vlan0 up
320	$atf_ifconfig -w 10
321
322	extract_new_packets $BUS > $outfile
323	export RUMP_SERVER=$SOCK_LOCAL
324
325	atf_check -s exit:0 -o ignore $ping_cmd -s $padding $remote0
326	extract_new_packets $BUS > $outfile
327	atf_check -s exit:0 -o match:"$nonfrag_msg" cat $outfile
328
329	if [ x"$1" = x"inet6" ]; then
330		atf_check -s exit:0 -o ignore $ping_cmd -s $over_padding $remote0
331		extract_new_packets $BUS > $outfile
332		atf_check -s exit:0 -o match:"$frag_msg" cat $outfile
333	else
334		atf_check -s not-exit:0 -o ignore -e match:"Message too long" \
335				$ping_cmd -s $over_padding $remote0
336	fi
337}
338
339atf_test_case vlan_auto_follow_mtu cleanup
340vlan_auto_follow_mtu_head()
341{
342
343	atf_set "descr" "tests of setting vlan mtu using IPv4"
344	atf_set "require.progs" "rump_server"
345}
346
347vlan_auto_follow_mtu_body()
348{
349	rump_server_start $SOCK_LOCAL vlan
350	rump_server_start $SOCK_REMOTE vlan
351
352	vlan_auto_follow_mtu_body_common inet
353}
354
355vlan_auto_follow_mtu_cleanup()
356{
357
358	$DEBUG && dump
359	cleanup
360}
361
362atf_test_case vlan_auto_follow_mtu6 cleanup
363vlan_auto_follow_mtu6_head()
364{
365
366	atf_set "descr" "tests of setting vlan mtu using IPv6"
367	atf_set "require.progs" "rump_server"
368}
369
370vlan_auto_follow_mtu6_body()
371{
372	rump_server_start $SOCK_LOCAL vlan netinet6
373	rump_server_start $SOCK_REMOTE vlan netinet6
374
375	vlan_auto_follow_mtu_body_common inet6
376}
377
378vlan_auto_follow_mtu6_cleanup()
379{
380
381	$DEBUG && dump
382	cleanup
383}
384
385vlanid_config_and_ping()
386{
387	local atf_ifconfig="atf_check -s exit:0 rump.ifconfig"
388	local vlanid=$1
389	shift
390
391	export RUMP_SERVER=$SOCK_LOCAL
392	$atf_ifconfig vlan0 vlan $vlanid vlanif shmif0
393	$atf_ifconfig vlan0 $IP_LOCAL0/24
394	$atf_ifconfig vlan0 up
395
396	export RUMP_SERVER=$SOCK_REMOTE
397	$atf_ifconfig vlan0 vlan $vlanid vlanif shmif0
398	$atf_ifconfig vlan0 $IP_REMOTE0/24
399	$atf_ifconfig vlan0 up
400
401	export RUMP_SERVER=$SOCK_LOCAL
402	atf_check -s exit:0 -o ignore rump.ping -n -w 1 -c 1 $IP_REMOTE0
403	$atf_ifconfig vlan0 -vlanif
404
405	export RUMP_SERVER=$SOCK_REMOTE
406	$atf_ifconfig vlan0 -vlanif
407}
408
409vlanid_config_and_ping6()
410{
411	local atf_ifconfig="atf_check -s exit:0 rump.ifconfig"
412	local vlanid=$1
413	shift
414
415	export RUMP_SERVER=$SOCK_LOCAL
416	$atf_ifconfig vlan0 vlan $vlanid vlanif shmif0
417	$atf_ifconfig vlan0 inet6 $IP6_LOCAL0/64
418	$atf_ifconfig vlan0 up
419
420	export RUMP_SERVER=$SOCK_REMOTE
421	$atf_ifconfig vlan0 vlan $vlanid vlanif shmif0
422	$atf_ifconfig vlan0 inet6 $IP6_REMOTE0/64
423	$atf_ifconfig vlan0 up
424
425	export RUMP_SERVER=$SOCK_LOCAL
426	atf_check -s exit:0 -o ignore rump.ping6 -n -c 1 $IP6_REMOTE0
427	$atf_ifconfig vlan0 -vlanif
428
429	export RUMP_SERVER=$SOCK_REMOTE
430	$atf_ifconfig vlan0 -vlanif
431}
432
433vlan_vlanid_body_common()
434{
435	local atf_ifconfig="atf_check -s exit:0 rump.ifconfig"
436	local af=inet
437	local prefix=24
438	local sysctl_param="net.inet.ip.dad_count=0"
439	local ping_cmd="rump.ping -n -w 1 -c 1"
440	local config_and_ping=vlanid_config_and_ping
441	local local0=$IP_LOCAL0
442	local local1=$IP_LOCAL1
443	local remote0=$IP_REMOTE0
444	local remote1=$IP_REMOTE1
445
446	if [ x"$1" = x"inet6" ]; then
447		af=inet6
448		prefix=64
449		sysctl_param="net.inet6.ip6.dad_count=0"
450		ping_cmd="rump.ping6 -n -c 1"
451		config_and_ping=vlanid_config_and_ping6
452		local0=$IP6_LOCAL0
453		local1=$IP6_LOCAL1
454		remote0=$IP6_REMOTE0
455		remote1=$IP6_REMOTE1
456	fi
457
458	rump_server_add_iface $SOCK_LOCAL shmif0 $BUS
459	rump_server_add_iface $SOCK_REMOTE shmif0 $BUS
460
461	export RUMP_SERVER=$SOCK_LOCAL
462	atf_check -s exit:0 -o ignore rump.sysctl -w $sysctl_param
463	$atf_ifconfig shmif0 up
464	$atf_ifconfig vlan0 create
465
466	export RUMP_SERVER=$SOCK_REMOTE
467	atf_check -s exit:0 -o ignore rump.sysctl -w $sysctl_param
468	$atf_ifconfig shmif0 up
469	$atf_ifconfig vlan0 create
470
471	export RUMP_SERVER=$SOCK_LOCAL
472	atf_check -s not-exit:0 -e match:"^usage: rump.ifconfig" \
473	    rump.ifconfig vlan0 vlan -1 vlanif shmif0
474
475	# $config_and_ping 0 # reserved vlan id
476	$config_and_ping 1
477	$config_and_ping 4094
478	# $config_and_ping 4095 #reserved vlan id
479
480	if [ "${RANDOM:-0}" != "${RANDOM:-0}" ]
481	then
482		for TAG in $(( ${RANDOM:-0} % 4092 + 2 )) \
483			   $(( ${RANDOM:-0} % 4092 + 2 )) \
484			   $(( ${RANDOM:-0} % 4092 + 2 ))
485		do
486			$config_and_ping "${TAG}"
487		done
488	fi
489
490	export RUMP_SERVER=$SOCK_LOCAL
491	for TAG in 0 4095 4096 $((4096*4 + 1)) 65536 65537 $((65536 + 4095))
492	do
493		atf_check -s not-exit:0 -e not-empty \
494		    rump.ifconfig vlan0 vlan "${TAG}" vlanif shmif0
495	done
496
497	$atf_ifconfig vlan0 vlan 1 vlanif shmif0
498	atf_check -s not-exit:0 -e match:"SIOCSETVLAN: Device busy" \
499	    rump.ifconfig vlan0 vlan 2 vlanif shmif0
500
501	atf_check -s not-exit:0 -e match:"SIOCSETVLAN: Device busy" \
502	    rump.ifconfig vlan0 vlan 1 vlanif shmif1
503
504	$atf_ifconfig vlan0 -vlanif
505	atf_check -s not-exit:0 -e match:"Invalid argument" \
506	    rump.ifconfig vlan0 $af $local0/$prefix
507
508	export RUMP_SERVER=$SOCK_LOCAL
509	$atf_ifconfig vlan0 vlan 10 vlanif shmif0
510	$atf_ifconfig vlan0 $af $local0/$prefix
511	$atf_ifconfig vlan0 up
512	$atf_ifconfig vlan1 create
513	$atf_ifconfig vlan1 vlan 11 vlanif shmif0
514	$atf_ifconfig vlan1 $af $local1/$prefix
515	$atf_ifconfig vlan1 up
516
517	export RUMP_SERVER=$SOCK_REMOTE
518	$atf_ifconfig vlan0 -vlanif
519	$atf_ifconfig vlan0 vlan 10 vlanif shmif0
520	$atf_ifconfig vlan0 $af $remote0/$prefix
521	$atf_ifconfig vlan0 up
522	$atf_ifconfig vlan1 create
523	$atf_ifconfig vlan1 vlan 11 vlanif shmif0
524	$atf_ifconfig vlan1 $af $remote1/$prefix
525	$atf_ifconfig vlan1 up
526
527	export RUMP_SERVER=$SOCK_LOCAL
528	atf_check -s exit:0 -o ignore $ping_cmd $remote0
529	atf_check -s exit:0 -o ignore $ping_cmd $remote1
530}
531
532atf_test_case vlan_vlanid cleanup
533vlan_vlanid_head()
534{
535
536	atf_set "descr" "tests of configuration for vlan id"
537	atf_set "require.progs" "rump_server"
538}
539
540vlan_vlanid_body()
541{
542	rump_server_start $SOCK_LOCAL vlan
543	rump_server_start $SOCK_REMOTE vlan
544
545	vlan_vlanid_body_common inet
546}
547
548vlan_vlanid_cleanup()
549{
550
551	$DEBUG && dump
552	cleanup
553}
554
555atf_test_case vlan_vlanid6 cleanup
556vlan_vlanid6_head()
557{
558
559	atf_set "descr" "tests of configuration for vlan id using IPv6"
560	atf_set "require.progs" "rump_server"
561}
562
563
564vlan_vlanid6_body()
565{
566	rump_server_start $SOCK_LOCAL vlan netinet6
567	rump_server_start $SOCK_REMOTE vlan netinet6
568
569	vlan_vlanid_body_common inet6
570}
571
572vlan_vlanid6_cleanup()
573{
574
575	$DEBUG && dump
576	cleanup
577}
578
579vlan_configs_body_common()
580{
581	local atf_ifconfig="atf_check -s exit:0 rump.ifconfig"
582
583	export RUMP_SERVER=${SOCK_LOCAL}
584
585	$atf_ifconfig shmif0 create
586	$atf_ifconfig shmif1 create
587	# unset U/L bit to detect a bug fixed by if_vlan.c:r1.132
588	$atf_ifconfig shmif0 link b0:a0:75:00:01:00 active
589	$atf_ifconfig shmif1 link b0:a0:75:00:01:01 active
590	$atf_ifconfig vlan0 create
591
592	atf_check -s exit:0 -o match:'status: +down' \
593	    rump.ifconfig vlan0
594	$atf_ifconfig vlan0 vlan 10 vlanif shmif0
595	$atf_ifconfig vlan0 -vlanif
596	atf_check -s exit:0 -o match:'status: +down' \
597	    rump.ifconfig vlan0
598
599	$atf_ifconfig vlan0 vlan 10 vlanif shmif0
600	$atf_ifconfig vlan0 -vlanif shmif0
601
602	$atf_ifconfig vlan0 vlan 10 vlanif shmif0
603	atf_check -s exit:0 rump.ifconfig vlan0 -vlanif shmif1
604	atf_check -s exit:0 rump.ifconfig vlan0 -vlanif shmif2
605
606	$atf_ifconfig vlan0 -vlanif
607
608	$atf_ifconfig vlan0 vlan 10 vlanif shmif0
609	atf_check -s exit:0 -e match:'Invalid argument' \
610	    rump.ifconfig vlan0 mtu 1497
611	$atf_ifconfig vlan0 mtu 1496
612	$atf_ifconfig vlan0 mtu 42
613	atf_check -s exit:0 -e match:'Invalid argument' \
614	    rump.ifconfig vlan0 mtu 41
615	$atf_ifconfig vlan0 -vlanif
616
617	$atf_ifconfig vlan1 create
618	$atf_ifconfig vlan0 vlan 10 vlanif shmif0
619	atf_check -s not-exit:0 -e match:'File exists' \
620	    rump.ifconfig vlan1 vlan 10 vlanif shmif0
621	$atf_ifconfig vlan1 vlan 10 vlanif shmif1
622
623	$atf_ifconfig vlan1 -vlanif shmif1
624	$atf_ifconfig vlan1 vlan 10 vlanif shmif1
625
626	$atf_ifconfig vlan0 -vlanif shmif0
627	$atf_ifconfig vlan0 vlan 10 vlanif shmif0
628}
629
630atf_test_case vlan_configs cleanup
631vlan_configs_head()
632{
633	atf_set "descr" "tests of configuration except vlan id"
634	atf_set "require.progs" "rump_server"
635}
636
637vlan_configs_body()
638{
639
640	rump_server_start $SOCK_LOCAL vlan
641
642	vlan_configs_body_common
643
644}
645
646vlan_configs_cleanup()
647{
648
649	$DEBUG && dump
650	cleanup
651}
652
653atf_test_case vlan_configs6 cleanup
654vlan_configs6_head()
655{
656	atf_set "descr" "tests of configuration except vlan id using IPv6"
657	atf_set "require.progs" "rump_server"
658}
659
660vlan_configs6_body()
661{
662	rump_server_start $SOCK_LOCAL vlan netinet6
663
664	vlan_configs_body_common
665}
666
667vlan_configs6_cleanup()
668{
669	$DEBUG && dump
670	cleanup
671}
672
673vlan_bridge_body_common()
674{
675	local atf_ifconfig="atf_check -s exit:0 rump.ifconfig"
676	local atf_brconfig="atf_check -s exit:0 $HIJACKING /sbin/brconfig"
677
678	rump_server_add_iface $SOCK_LOCAL shmif0 $BUS
679
680	export RUMP_SERVER=$SOCK_LOCAL
681	$atf_ifconfig shmif0 up
682
683	$atf_ifconfig vlan0 create
684	$DEBUG && rump.ifconfig vlan0
685
686	$atf_ifconfig bridge0 create
687	$atf_ifconfig bridge0 up
688
689	#
690	# Add vlan to bridge member
691	#
692	$atf_ifconfig bridge0 mtu 1496
693
694	# vlan0 can not add to bridge member
695	# because it is not an ethernet device
696	atf_check -s not-exit:0 -e match:'Invalid argument' \
697	    $HIJACKING /sbin/brconfig bridge0 add vlan0
698
699	$atf_ifconfig vlan0 vlan 10 vlanif shmif0
700	$atf_ifconfig vlan0 up
701	atf_check -s exit:0 -o match:'mtu 1496' rump.ifconfig vlan0
702
703	# vlan0 becomes an ethernet device
704	# after attaching the parent interface
705	$atf_brconfig bridge0 add vlan0
706	$DEBUG && $HIJACKING /sbin/brconfig bridge0
707
708	$atf_brconfig bridge0 delete vlan0
709
710	$atf_brconfig bridge0 add vlan0
711	$atf_ifconfig vlan0 -vlanif
712	atf_check -s exit:0 -o not-match:'vlan0' \
713	    $HIJACKING /sbin/brconfig bridge0
714	atf_check -s not-exit:0 -e match:'No such' \
715	    $HIJACKING /sbin/brconfig bridge0 delete vlan0
716
717	#
718	# decrease MTU on adding to bridge member
719	#
720	$atf_ifconfig bridge0 mtu 1495
721	$atf_ifconfig vlan0 vlan 10 vlanif shmif0
722	$atf_ifconfig vlan0 up
723	atf_check -s exit:0 -o match:'mtu 1496' rump.ifconfig vlan0
724
725	$atf_brconfig bridge0 add vlan0
726	$DEBUG && $HIJACKING /sbin/brconfig bridge0
727	atf_check -s exit:0 -o match:'mtu 1495' rump.ifconfig vlan0
728	$atf_brconfig bridge0 delete vlan0
729
730	#
731	# increase MTU on adding to bridge member
732	#
733	$atf_ifconfig bridge0 mtu 1496
734	$atf_ifconfig vlan0 mtu 1495
735	$atf_brconfig bridge0 add vlan0
736
737	$DEBUG && $HIJACKING /sbin/brconfig bridge0
738	atf_check -s exit:0 -o match:'mtu 1496' rump.ifconfig vlan0
739	$atf_brconfig bridge0 delete vlan0
740
741	$atf_ifconfig bridge0 mtu 1497
742	atf_check -s not-exit:0 -o ignore -e ignore \
743	    $HIJACKING /sbin/brconfig bridge0 add vlan0
744
745	#
746	# Destroy a vlan interface that is bridge member
747	#
748	$atf_ifconfig bridge0 mtu 1496
749	$atf_brconfig bridge0 add vlan0
750	$atf_ifconfig vlan0 destroy
751
752	rump_server_destroy_ifaces
753}
754
755atf_test_case vlan_bridge cleanup
756vlan_bridge_head()
757{
758
759	atf_set "descr" "tests of vlan interfaces with bridges (IPv4)"
760	atf_set "require.progs" "rump_server"
761}
762
763vlan_bridge_body()
764{
765
766	rump_server_start $SOCK_LOCAL vlan bridge
767	vlan_bridge_body_common
768}
769
770vlan_bridge_cleanup()
771{
772
773	$DEBUG && dump
774	cleanup
775}
776
777atf_test_case vlan_bridge6 cleanup
778vlan_bridge6_head()
779{
780
781	atf_set "descr" "tests of vlan interfaces with bridges (IPv6)"
782	atf_set "require.progs" "rump_server"
783}
784
785vlan_bridge6_body()
786{
787
788	rump_server_start $SOCK_LOCAL vlan netinet6 bridge
789	vlan_bridge_body_common
790}
791
792vlan_bridge6_cleanup()
793{
794
795	$DEBUG && dump
796	cleanup
797}
798
799vlan_multicast_body_common()
800{
801	local atf_ifconfig="atf_check -s exit:0 rump.ifconfig"
802	local af="inet"
803	local local0=$IP_LOCAL0
804	local local1=$IP_LOCAL1
805	local mcaddr=$IP_MCADDR0
806	local eth_mcaddr=$ETH_IP_MCADDR0
807	local prefix=24
808	local siocXmulti="$(atf_get_srcdir)/siocXmulti"
809	local atf_siocXmulti="atf_check -s exit:0 $HIJACKING $siocXmulti"
810
811	if [ x"$1" =  x"inet6" ]; then
812		af="inet6"
813		prefix=64
814		local0=$IP6_LOCAL0
815		local1=$IP6_LOCAL1
816		mcaddr=$IP6_MCADDR0
817		eth_mcaddr=$ETH_IP6_MCADDR0
818	fi
819
820	export RUMP_SERVER=$SOCK_LOCAL
821
822	$atf_ifconfig shmif0 create
823	$atf_ifconfig shmif0 linkstr net0 up
824	$atf_ifconfig vlan0 create
825	$atf_ifconfig vlan0 vlan 10 vlanif shmif0
826	$atf_ifconfig vlan0 $af $local0/$prefix up
827	$atf_ifconfig vlan1 create
828	$atf_ifconfig vlan1 vlan 11 vlanif shmif0
829	$atf_ifconfig vlan1 $af $local1/$prefix up
830	$atf_ifconfig -w 10
831
832	# check the initial state
833	atf_check -s exit:0 -o not-match:"$eth_mcaddr" $HIJACKING ifmcstat
834
835	# add a multicast address
836	$atf_siocXmulti add vlan0 $mcaddr
837	atf_check -s exit:0 -o match:"$eth_mcaddr" $HIJACKING ifmcstat
838
839	# delete the address
840	$atf_siocXmulti del vlan0 $mcaddr
841	atf_check -s exit:0 -o not-match:"$eth_mcaddr" $HIJACKING ifmcstat
842
843	# delete a non-existing address
844	atf_check -s not-exit:0 -e match:"Invalid argument" \
845	    $HIJACKING $siocXmulti del vlan0 $mcaddr
846
847	# add an address to different interfaces
848	$atf_siocXmulti add vlan0 $mcaddr
849	$atf_siocXmulti add vlan1 $mcaddr
850	atf_check -s exit:0 -o match:"${eth_mcaddr} refcount 2" $HIJACKING ifmcstat
851	$atf_siocXmulti del vlan0 $mcaddr
852
853	# delete the address with invalid interface
854	atf_check -s not-exit:0 -e match:"Invalid argument" \
855	    $HIJACKING $siocXmulti del vlan0 $mcaddr
856
857	$atf_siocXmulti del vlan1 $mcaddr
858
859	# add and delete a same address more than once
860	$atf_siocXmulti add vlan0 $mcaddr
861	$atf_siocXmulti add vlan0 $mcaddr
862	$atf_siocXmulti add vlan0 $mcaddr
863	atf_check -s exit:0 -o match:"${eth_mcaddr} refcount 3" $HIJACKING ifmcstat
864	$atf_siocXmulti del vlan0 $mcaddr
865	$atf_siocXmulti del vlan0 $mcaddr
866	$atf_siocXmulti del vlan0 $mcaddr
867	atf_check -s exit:0 -o not-match:"$eth_mcaddr" $HIJACKING ifmcstat
868
869	# delete all address added to parent device when remove
870	# the config of parent interface
871	$atf_siocXmulti add vlan0 $mcaddr
872	$atf_siocXmulti add vlan0 $mcaddr
873	$atf_siocXmulti add vlan0 $mcaddr
874	$atf_ifconfig vlan0 -vlanif shmif0
875	atf_check -s exit:0 -o not-match:"$eth_mcaddr" $HIJACKING ifmcstat
876}
877
878atf_test_case vlan_multicast cleanup
879vlan_multicast_head()
880{
881	atf_set "descr" "tests of multicast address adding and deleting"
882	atf_set "require.progs" "rump_server"
883}
884
885vlan_multicast_body()
886{
887	rump_server_start $SOCK_LOCAL vlan
888
889	vlan_multicast_body_common inet
890}
891
892vlan_multicast_cleanup()
893{
894	$DEBUG && dump
895	cleanup
896}
897
898atf_test_case vlan_multicast6 cleanup
899vlan_multicast6_head()
900{
901	atf_set "descr" "tests of multicast address adding and deleting with IPv6"
902	atf_set "require.progs" "rump_server"
903}
904
905vlan_multicast6_body()
906{
907	rump_server_start $SOCK_LOCAL vlan netinet6
908
909	vlan_multicast_body_common inet6
910}
911
912vlan_multicast6_cleanup()
913{
914	$DEBUG && dump
915	cleanup
916}
917
918atf_test_case vlan_promisc cleanup
919vlan_promisc_head()
920{
921
922	atf_set "descr" "tests of IFF_PROMISC of vlan"
923	atf_set "require.progs" "rump_server"
924}
925
926vlan_promisc_body()
927{
928	local atf_ifconfig="atf_check -s exit:0 rump.ifconfig"
929	local atf_brconfig="atf_check -s exit:0 $HIJACKING /sbin/brconfig"
930	local atf_arp="atf_check -s exit:0 rump.arp"
931	local bpfopen="$HIJACKING $(atf_get_srcdir)/bpfopen"
932	bpfopen="$bpfopen -dv -b /rump/dev/bpf"
933	local pidfile="./bpfopen.pid"
934	local macaddr=""
935
936	rump_server_bpf_start $SOCK_LOCAL vlan bridge
937	rump_server_start $SOCK_REMOTE vlan
938
939	rump_server_add_iface $SOCK_LOCAL shmif0 $BUS
940	rump_server_add_iface $SOCK_LOCAL shmif1
941	rump_server_add_iface $SOCK_LOCAL vlan0
942	rump_server_add_iface $SOCK_LOCAL vlan1
943	rump_server_add_iface $SOCK_LOCAL bridge0
944
945	rump_server_add_iface $SOCK_REMOTE shmif0 $BUS
946	rump_server_add_iface $SOCK_REMOTE vlan0
947
948	macaddr=$(get_macaddr $SOCK_LOCAL shmif1)
949
950	export RUMP_SERVER=$SOCK_REMOTE
951	$atf_ifconfig vlan0 vlan 1 vlanif shmif0
952	$atf_ifconfig shmif0 up
953	$atf_ifconfig vlan0 inet $IP_REMOTE0/24
954	$atf_ifconfig vlan0 up
955	$atf_ifconfig -w 10
956	$atf_arp -s $IP_LOCAL0 $macaddr
957
958	export RUMP_SERVER=$SOCK_LOCAL
959	$atf_ifconfig bridge0 mtu 1496
960	#
961	# When vlan IF is PROMISC, the parent is also PROMISC
962	#
963	$atf_ifconfig vlan0 vlan 1 vlanif shmif0
964	$atf_ifconfig shmif0 up
965	$atf_ifconfig vlan0 up
966
967	atf_check -s exit:0 -o not-match:'PROMISC' rump.ifconfig vlan0
968	atf_check -s exit:0 -o not-match:'PROMISC' rump.ifconfig shmif0
969
970	$atf_brconfig bridge0 add vlan0
971	$atf_ifconfig bridge0 up
972	atf_check -s exit:0 -o match:'PROMISC' rump.ifconfig vlan0
973	atf_check -s exit:0 -o match:'PROMISC' rump.ifconfig shmif0
974
975	$atf_ifconfig bridge0 down
976	$atf_brconfig bridge0 delete vlan0
977	atf_check -s exit:0 -o not-match:'PROMISC' rump.ifconfig vlan0
978	atf_check -s exit:0 -o not-match:'PROMISC' rump.ifconfig shmif0
979	$atf_ifconfig vlan0 -vlanif
980
981	#
982	# drop unicast packets that is not for the host
983	#
984	$atf_ifconfig vlan0 vlan 1 vlanif shmif0
985	$atf_ifconfig -w 10
986
987	atf_check -s exit:0 -e match:'bpf opened' $bpfopen -p $pidfile shmif0
988
989	atf_check -s exit:0 -o not-match:'PROMISC' rump.ifconfig vlan0
990	atf_check -s exit:0 -o match:'PROMISC' rump.ifconfig shmif0
991	atf_check -s exit:0 -o ignore rump.ifconfig -z vlan0
992	atf_check -s exit:0 -o not-match:'input:.*errors' \
993	    rump.ifconfig -v vlan0
994
995	export RUMP_SERVER=$SOCK_REMOTE
996	atf_check -s not-exit:0 -o ignore -e ignore \
997	    rump.ping -c 3 -i 0.2 $IP_LOCAL0
998
999	export RUMP_SERVER=$SOCK_LOCAL
1000	atf_check -s exit:0 -o match:'input:.*errors' \
1001	    rump.ifconfig -v vlan0
1002
1003	atf_check -s exit:0 kill -TERM $(cat $pidfile)
1004	sleep 2
1005
1006	atf_check -s exit:0 -o not-match:'PROMISC' rump.ifconfig vlan0
1007	atf_check -s exit:0 -o not-match:'PROMISC' rump.ifconfig shmif0
1008	$atf_ifconfig vlan0 -vlanif
1009
1010	#
1011	# clear IFF_PROMISC after bpf_detach called from ether_ifdetach
1012	#
1013	$atf_ifconfig vlan0 vlan 1 vlanif shmif0
1014	$atf_ifconfig vlan0 up
1015
1016	atf_check -s exit:0 -e match:'bpf opened' $bpfopen -p $pidfile vlan0
1017
1018	atf_check -s exit:0 -o match:'PROMISC' rump.ifconfig vlan0
1019	atf_check -s exit:0 -o match:'PROMISC' rump.ifconfig shmif0
1020
1021	$atf_ifconfig vlan0 -vlanif
1022
1023	atf_check -s exit:0 -o not-match:'PROMISC' rump.ifconfig vlan0
1024	atf_check -s exit:0 -o not-match:'PROMISC' rump.ifconfig shmif0
1025
1026	atf_check -s exit:0 kill -TERM $(cat $pidfile)
1027	sleep 2
1028	atf_check -s exit:0 -o not-match:'PROMISC' rump.ifconfig vlan0
1029}
1030
1031vlan_promisc_cleanup()
1032{
1033
1034	$DEBUG && dump
1035	cleanup
1036}
1037
1038vlan_l2tp_body_common()
1039{
1040	local atf_ifconfig="atf_check -s exit:0 rump.ifconfig"
1041
1042	local af=$1
1043	local ping_cmd="rump.ping -c 1"
1044	local pfx=24
1045	local local0=$IP_LOCAL0
1046	local local1=$IP_LOCAL1
1047	local remote0=$IP_REMOTE0
1048	local remote1=$IP_REMOTE1
1049	local sysctl_param="net.inet.ip.dad_count=0"
1050	local vid0=10
1051	local vid1=11
1052
1053	local l2tp_laddr=10.222.222.1
1054	local l2tp_lsession=1001
1055	local l2tp_raddr=10.222.222.2
1056	local l2tp_rsession=1002
1057
1058	if [ x"$af" = x"inet6" ]; then
1059		ping_cmd="rump.ping6 -c 1"
1060		rumplib="netinet6"
1061		pfx=64
1062		local0=$IP6_LOCAL0
1063		local1=$IP6_LOCAL1
1064		remote0=$IP6_REMOTE0
1065		remote1=$IP6_REMOTE1
1066		sysctl_param="net.inet6.ip6.dad_count=0"
1067	fi
1068
1069	rump_server_add_iface $SOCK_LOCAL shmif0 $BUS
1070	rump_server_add_iface $SOCK_LOCAL l2tp0
1071	rump_server_add_iface $SOCK_LOCAL vlan0
1072	rump_server_add_iface $SOCK_LOCAL vlan1
1073
1074	rump_server_add_iface $SOCK_REMOTE shmif0 $BUS
1075	rump_server_add_iface $SOCK_REMOTE l2tp0
1076	rump_server_add_iface $SOCK_REMOTE vlan0
1077	rump_server_add_iface $SOCK_REMOTE vlan1
1078
1079	export RUMP_SERVER=$SOCK_LOCAL
1080	atf_check -s exit:0 -o ignore rump.sysctl -w $sysctl_param
1081	$atf_ifconfig shmif0 $l2tp_laddr/24
1082	$atf_ifconfig l2tp0 tunnel  $l2tp_laddr $l2tp_raddr
1083	$atf_ifconfig l2tp0 session $l2tp_lsession $l2tp_rsession
1084	$atf_ifconfig l2tp0 up
1085
1086	export RUMP_SERVER=$SOCK_REMOTE
1087	atf_check -s exit:0 -o ignore rump.sysctl -w $sysctl_param
1088	$atf_ifconfig shmif0 $l2tp_raddr/24
1089	$atf_ifconfig l2tp0 tunnel  $l2tp_raddr $l2tp_laddr
1090	$atf_ifconfig l2tp0 session $l2tp_rsession $l2tp_lsession
1091	$atf_ifconfig l2tp0 up
1092
1093	# configure vlans on l2tp(4)
1094	export RUMP_SERVER=$SOCK_LOCAL
1095	$atf_ifconfig vlan0 vlan $vid0 vlanif l2tp0
1096	$atf_ifconfig vlan0 $af $local0/$pfx
1097	$atf_ifconfig vlan1 vlan $vid1 vlanif l2tp0
1098	$atf_ifconfig vlan1 $af $local1/$pfx
1099	export RUMP_SERVER=$SOCK_REMOTE
1100	$atf_ifconfig vlan0 vlan $vid0 vlanif l2tp0
1101	$atf_ifconfig vlan0 $af $remote0/$pfx
1102	$atf_ifconfig vlan1 vlan $vid1 vlanif l2tp0
1103	$atf_ifconfig vlan1 $af $remote1/$pfx
1104
1105	# test for VLAN frame transfer
1106	export RUMP_SERVER=$SOCK_LOCAL
1107	atf_check -s exit:0 -o ignore $ping_cmd $remote0
1108	atf_check -s exit:0 -o ignore $ping_cmd $remote1
1109
1110	# unconfig vlans
1111	export RUMP_SERVER=$SOCK_LOCAL
1112	$atf_ifconfig vlan0 -vlanif
1113	export RUMP_SERVER=$SOCK_REMOTE
1114	$atf_ifconfig vlan0 -vlanif
1115
1116	# remove l2tp0 that has vlan1
1117	export RUMP_SERVER=$SOCK_LOCAL
1118	$atf_ifconfig l2tp0 destroy
1119	export RUMP_SERVER=$SOCK_REMOTE
1120	$atf_ifconfig l2tp0 destroy
1121}
1122
1123atf_test_case vlan_l2tp cleanup
1124vlan_l2tp_head()
1125{
1126
1127	atf_set "descr" "tests of vlan(IPv4) over l2tp(IPv4)"
1128	atf_set "require.progs" "rump_server"
1129}
1130
1131vlan_l2tp_body()
1132{
1133
1134	rump_server_start $SOCK_LOCAL  vlan l2tp
1135	rump_server_start $SOCK_REMOTE vlan l2tp
1136
1137	vlan_l2tp_body_common "inet"
1138}
1139
1140vlan_l2tp_cleanup()
1141{
1142
1143	$DEBUG && dump
1144	cleanup
1145}
1146
1147atf_test_case vlan_l2tp6 cleanup
1148vlan_l2tp6_head()
1149{
1150
1151	atf_set "descr" "tests of vlan(IPv6) over l2tp(IPv4)"
1152	atf_set "require.progs" "rump_server"
1153}
1154
1155vlan_l2tp6_body()
1156{
1157
1158	rump_server_start $SOCK_LOCAL  vlan l2tp netinet6
1159	rump_server_start $SOCK_REMOTE vlan l2tp netinet6
1160
1161	vlan_l2tp_body_common "inet6"
1162}
1163
1164vlan_l2tp6_cleanup()
1165{
1166
1167	$DEBUG && dump
1168	cleanup
1169}
1170
1171atf_init_test_cases()
1172{
1173
1174	atf_add_test_case vlan_create_destroy
1175	atf_add_test_case vlan_basic
1176	atf_add_test_case vlan_auto_follow_mtu
1177	atf_add_test_case vlan_vlanid
1178	atf_add_test_case vlan_configs
1179	atf_add_test_case vlan_bridge
1180	atf_add_test_case vlan_multicast
1181	atf_add_test_case vlan_promisc
1182	atf_add_test_case vlan_l2tp
1183
1184	atf_add_test_case vlan_create_destroy6
1185	atf_add_test_case vlan_basic6
1186	atf_add_test_case vlan_auto_follow_mtu6
1187	atf_add_test_case vlan_vlanid6
1188	atf_add_test_case vlan_configs6
1189	atf_add_test_case vlan_bridge6
1190	atf_add_test_case vlan_multicast6
1191	atf_add_test_case vlan_l2tp6
1192}
1193