xref: /freebsd/tests/sys/net/if_geneve.sh (revision 30b7621d46cc06053c0cb40bb691fbcecbfdab7f)
1#
2# SPDX-License-Identifier: BSD-2-Clause
3#
4# Copyright (c) 2025-2026 Pouria Mousavizadeh Tehrani <pouria@FreeBSD.org>
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 AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25# SUCH DAMAGE.
26
27. $(atf_get_srcdir)/../common/vnet.subr
28
29atf_test_case "ether_ipv4" "cleanup"
30ether_ipv4_head()
31{
32	atf_set descr 'Create a geneve(4) l2 tunnel over an ipv4 underlay using epair and pass traffic between jails'
33	atf_set require.user root
34	atf_set require.kmods if_geneve
35}
36
37ether_ipv4_body()
38{
39	local epair geneve1 geneve2 vni1 endpoint1 endpoint2
40        local v4tunnel1 v4tunnel2 v6tunnel1 v6tunnel2
41
42	endpoint1=192.168.2.1
43	endpoint2=192.168.2.2
44	v4tunnel1=169.254.0.1
45	v4tunnel2=169.254.0.2
46	v6tunnel1=2001:db8::1
47	v6tunnel2=2001:db8::2
48	vni1=1
49
50	vnet_init
51	epair=$(vnet_mkepair)
52	vnet_mkjail genevetest1 ${epair}a
53	vnet_mkjail genevetest2 ${epair}b
54
55	ifconfig -j genevetest1 ${epair}a inet ${endpoint1}/24 up
56	ifconfig -j genevetest2 ${epair}b inet ${endpoint2}/24 up
57
58	atf_check -s exit:0 -o ignore \
59	    ifconfig -j genevetest1 geneve1 create genevemode l2 debug \
60	    geneveid $vni1 geneveremote ${endpoint2} genevelocal ${endpoint1} up
61	atf_check -s exit:0 -o ignore \
62	    ifconfig -j genevetest2 geneve1 create genevemode l2 debug \
63	    geneveid $vni1 geneveremote ${endpoint1} genevelocal ${endpoint2} up
64
65	atf_check -s exit:0 -o ignore \
66	    ifconfig -j genevetest1 geneve1 inet ${v4tunnel1}/24
67	atf_check -s exit:0 -o ignore \
68	    ifconfig -j genevetest1 geneve1 inet6 ${v6tunnel1}
69	atf_check -s exit:0 -o ignore \
70	    ifconfig -j genevetest2 geneve1 inet ${v4tunnel2}/24
71	atf_check -s exit:0 -o ignore \
72	    ifconfig -j genevetest2 geneve1 inet6 ${v6tunnel2}
73
74	atf_check -s exit:0 -o ignore jexec genevetest1 ping -nc 1 -t 1 $v4tunnel2
75	atf_check -s exit:0 -o ignore jexec genevetest2 ping -nc 1 -t 1 $v4tunnel1
76	atf_check -s exit:0 -o ignore jexec genevetest1 ping -nc 1 -t 1 $v6tunnel2
77	atf_check -s exit:0 -o ignore jexec genevetest2 ping -nc 1 -t 1 $v6tunnel1
78}
79
80ether_ipv4_cleanup()
81{
82	vnet_cleanup
83}
84
85atf_test_case "ether_ipv6" "cleanup"
86ether_ipv6_head()
87{
88	atf_set descr 'Create a geneve(4) l2 tunnel over an ipv6 underlay using epair and pass traffic between jails'
89	atf_set require.user root
90	atf_set require.kmods if_geneve
91}
92
93ether_ipv6_body()
94{
95	local epair geneve1 geneve2 vni1 endpoint1 endpoint2
96        local v4tunnel1 v4tunnel2 v6tunnel1 v6tunnel2
97
98	endpoint1=3fff::1
99	endpoint2=3fff::2
100	v4tunnel1=169.254.0.1
101	v4tunnel2=169.254.0.2
102	v6tunnel1=2001:db8::1
103	v6tunnel2=2001:db8::2
104	vni1=1
105
106	vnet_init
107	epair=$(vnet_mkepair)
108	vnet_mkjail genevetest1 ${epair}a
109	vnet_mkjail genevetest2 ${epair}b
110
111	ifconfig -j genevetest1 ${epair}a inet6 ${endpoint1} up
112	ifconfig -j genevetest2 ${epair}b inet6 ${endpoint2} up
113
114	atf_check -s exit:0 -o ignore \
115	    ifconfig -j genevetest1 geneve1 create genevemode l2 debug \
116	    geneveid $vni1 geneveremote ${endpoint2} genevelocal ${endpoint1} up
117	atf_check -s exit:0 -o ignore \
118	    ifconfig -j genevetest2 geneve1 create genevemode l2 debug \
119	    geneveid $vni1 geneveremote ${endpoint1} genevelocal ${endpoint2} up
120
121	atf_check -s exit:0 -o ignore \
122	    ifconfig -j genevetest1 geneve1 inet ${v4tunnel1}/24
123	atf_check -s exit:0 -o ignore \
124	    ifconfig -j genevetest1 geneve1 inet6 ${v6tunnel1}
125	atf_check -s exit:0 -o ignore \
126	    ifconfig -j genevetest2 geneve1 inet ${v4tunnel2}/24
127	atf_check -s exit:0 -o ignore \
128	    ifconfig -j genevetest2 geneve1 inet6 ${v6tunnel2}
129
130	atf_check -s exit:0 -o ignore jexec genevetest1 ping -nc 1 -t 1 $v4tunnel2
131	atf_check -s exit:0 -o ignore jexec genevetest2 ping -nc 1 -t 1 $v4tunnel1
132	atf_check -s exit:0 -o ignore jexec genevetest1 ping -nc 1 -t 1 $v6tunnel2
133	atf_check -s exit:0 -o ignore jexec genevetest2 ping -nc 1 -t 1 $v6tunnel1
134}
135
136ether_ipv6_cleanup()
137{
138	vnet_cleanup
139}
140
141atf_test_case "inherit_ipv4" "cleanup"
142inherit_ipv4_head()
143{
144	atf_set descr 'Create a geneve(4) l3 tunnel over an ipv4 underlay using epair and pass traffic between jails'
145	atf_set require.user root
146	atf_set require.kmods if_geneve
147}
148
149inherit_ipv4_body()
150{
151	local epair geneve1 geneve2 vni1 endpoint1 endpoint2
152        local v4tunnel1 v4tunnel2 v6tunnel1 v6tunnel2
153
154	endpoint1=192.168.2.1
155	endpoint2=192.168.2.2
156	v4tunnel1=169.254.0.1
157	v4tunnel2=169.254.0.2
158	v6tunnel1=2001:db8::1
159	v6tunnel2=2001:db8::2
160	vni1=2
161
162	vnet_init
163	epair=$(vnet_mkepair)
164	vnet_mkjail genevetest1 ${epair}a
165	vnet_mkjail genevetest2 ${epair}b
166
167	ifconfig -j genevetest1 ${epair}a inet ${endpoint1}/24 up
168	ifconfig -j genevetest2 ${epair}b inet ${endpoint2}/24 up
169
170	atf_check -s exit:0 -o ignore \
171	    ifconfig -j genevetest1 geneve1 create genevemode l3 debug \
172	    geneveid $vni1 geneveremote ${endpoint2} genevelocal ${endpoint1} up
173	atf_check -s exit:0 -o ignore \
174	    ifconfig -j genevetest2 geneve1 create genevemode l3 debug \
175	    geneveid $vni1 geneveremote ${endpoint1} genevelocal ${endpoint2} up
176
177	atf_check -s exit:0 -o ignore \
178	    ifconfig -j genevetest1 geneve1 inet ${v4tunnel1}/24
179	atf_check -s exit:0 -o ignore \
180	    ifconfig -j genevetest1 geneve1 inet6 ${v6tunnel1}
181	atf_check -s exit:0 -o ignore \
182	    ifconfig -j genevetest2 geneve1 inet ${v4tunnel2}/24
183	atf_check -s exit:0 -o ignore \
184	    ifconfig -j genevetest2 geneve1 inet6 ${v6tunnel2}
185
186	atf_check -s exit:0 -o ignore jexec genevetest1 ping -nc 1 -t 1 $v4tunnel2
187	atf_check -s exit:0 -o ignore jexec genevetest2 ping -nc 1 -t 1 $v4tunnel1
188	atf_check -s exit:0 -o ignore jexec genevetest1 ping -nc 1 -t 1 $v6tunnel2
189	atf_check -s exit:0 -o ignore jexec genevetest2 ping -nc 1 -t 1 $v6tunnel1
190}
191
192inherit_ipv4_cleanup()
193{
194	vnet_cleanup
195}
196
197atf_test_case "inherit_ipv6" "cleanup"
198inherit_ipv6_head()
199{
200	atf_set descr 'Create a geneve(4) l3 tunnel over an ipv6 underlay using epair and pass traffic between jails'
201	atf_set require.user root
202	atf_set require.kmods if_geneve
203}
204
205inherit_ipv6_body()
206{
207	local epair geneve1 geneve2 vni1 endpoint1 endpoint2
208        local v4tunnel1 v4tunnel2 v6tunnel1 v6tunnel2
209
210	endpoint1=3fff::1
211	endpoint2=3fff::2
212	v4tunnel1=169.254.0.1
213	v4tunnel2=169.254.0.2
214	v6tunnel1=2001:db8::1
215	v6tunnel2=2001:db8::2
216	vni1=1
217
218	vnet_init
219	epair=$(vnet_mkepair)
220	vnet_mkjail genevetest1 ${epair}a
221	vnet_mkjail genevetest2 ${epair}b
222
223	ifconfig -j genevetest1 ${epair}a inet6 ${endpoint1} up
224	ifconfig -j genevetest2 ${epair}b inet6 ${endpoint2} up
225
226	atf_check -s exit:0 -o ignore \
227	    ifconfig -j genevetest1 geneve1 create genevemode l3 debug \
228	    geneveid $vni1 geneveremote ${endpoint2} genevelocal ${endpoint1} up
229	atf_check -s exit:0 -o ignore \
230	    ifconfig -j genevetest2 geneve1 create genevemode l3 debug \
231	    geneveid $vni1 geneveremote ${endpoint1} genevelocal ${endpoint2} up
232
233	atf_check -s exit:0 -o ignore \
234	    ifconfig -j genevetest1 geneve1 inet ${v4tunnel1}/24
235	atf_check -s exit:0 -o ignore \
236	    ifconfig -j genevetest1 geneve1 inet6 ${v6tunnel1}
237	atf_check -s exit:0 -o ignore \
238	    ifconfig -j genevetest2 geneve1 inet ${v4tunnel2}/24
239	atf_check -s exit:0 -o ignore \
240	    ifconfig -j genevetest2 geneve1 inet6 ${v6tunnel2}
241
242	atf_check -s exit:0 -o ignore jexec genevetest1 ping -nc 1 -t 1 $v4tunnel2
243	atf_check -s exit:0 -o ignore jexec genevetest2 ping -nc 1 -t 1 $v4tunnel1
244	atf_check -s exit:0 -o ignore jexec genevetest1 ping -nc 1 -t 1 $v6tunnel2
245	atf_check -s exit:0 -o ignore jexec genevetest2 ping -nc 1 -t 1 $v6tunnel1
246}
247
248inherit_ipv6_cleanup()
249{
250	vnet_cleanup
251}
252
253atf_test_case "ether_ipv6_blind_options" "cleanup"
254ether_ipv6_blind_options_head()
255{
256	atf_set descr 'Create a geneve(4) l2 ipv6 tunnel and test geneve options'
257	atf_set require.user root
258	atf_set require.kmods if_geneve
259}
260
261ether_ipv6_blind_options_body()
262{
263	local epair geneve1 geneve2 vni1 endpoint1 endpoint2
264        local v6tunnel1 v6tunnel2
265
266	endpoint1=3fff::1
267	endpoint2=3fff::2
268	v6tunnel1=2001:db8::1
269	v6tunnel2=2001:db8::2
270	vni1=1
271
272	vnet_init
273	epair=$(vnet_mkepair)
274	vnet_mkjail genevetest1 ${epair}a
275	vnet_mkjail genevetest2 ${epair}b
276
277	ifconfig -j genevetest1 ${epair}a inet6 ${endpoint1} up
278	ifconfig -j genevetest2 ${epair}b inet6 ${endpoint2} up
279
280	atf_check -s exit:0 -o ignore \
281	    ifconfig -j genevetest1 geneve1 create genevemode l2 debug \
282	    geneveid $vni1 geneveremote ${endpoint2} genevelocal ${endpoint1} up
283	atf_check -s exit:0 -o ignore \
284	    ifconfig -j genevetest2 geneve1 create genevemode l2 debug \
285	    geneveid $vni1 geneveremote ${endpoint1} genevelocal ${endpoint2} up
286
287	atf_check -s exit:0 -o ignore \
288	    ifconfig -j genevetest1 geneve1 inet6 ${v6tunnel1}
289	atf_check -s exit:0 -o ignore \
290	    ifconfig -j genevetest2 geneve1 inet6 ${v6tunnel2}
291
292	atf_check -s exit:0 -o ignore jexec genevetest1 ping -nc 1 -t 1 $v6tunnel2
293
294	atf_check -s exit:0 -o ignore ifconfig -j genevetest1 geneve1 genevemaxaddr 1000
295	atf_check -s exit:0 -o match:"max: 1000" ifconfig -j genevetest1 -v geneve1
296	atf_check -s exit:0 -o ignore ifconfig -j genevetest1 geneve1 genevetimeout 1000
297	atf_check -s exit:0 -o match:"timeout: 1000" ifconfig -j genevetest1 -v geneve1
298	atf_check -s exit:0 -o ignore ifconfig -j genevetest1 geneve1 -genevelearn
299	atf_check -s exit:0 -o match:"mode: nolearning" ifconfig -j genevetest1 -v geneve1
300	atf_check -s exit:0 -o ignore ifconfig -j genevetest1 geneve1 genevelearn
301	atf_check -s exit:0 -o match:" learning" ifconfig -j genevetest1 -v geneve1
302	atf_check -s exit:0 -o match:"count: 1" ifconfig -j genevetest1 -v geneve1
303	atf_check -s exit:0 -o ignore ifconfig -j genevetest1 geneve1 geneveflush
304	atf_check -s exit:0 -o match:"count: 0" ifconfig -j genevetest1 -v geneve1
305	atf_check -s exit:0 -o ignore ifconfig -j genevetest1 geneve1 geneveflushall
306	atf_check -s exit:0 -o ignore ifconfig -j genevetest1 geneve1 genevettl inherit
307	atf_check -s exit:0 -o match:"ttl: inherit" ifconfig -j genevetest1 -v geneve1
308	atf_check -s exit:0 -o ignore ifconfig -j genevetest1 geneve1 genevettl 1
309	atf_check -s exit:0 -o match:"ttl: 1" ifconfig -j genevetest1 -v geneve1
310	atf_check -s exit:0 -o ignore ifconfig -j genevetest1 geneve1 down genevedf set up
311	atf_check -s exit:0 -o match:"df: set" ifconfig -j genevetest1 -v geneve1
312	atf_check -s exit:0 -o ignore ifconfig -j genevetest1 geneve1 down genevedf inherit up
313	atf_check -s exit:0 -o match:"df: inherit" ifconfig -j genevetest1 -v geneve1
314	atf_check -s exit:0 -o ignore ifconfig -j genevetest1 geneve1 down genevedf unset up
315	atf_check -s exit:0 -o match:"df: unset" ifconfig -j genevetest1 -v geneve1
316	atf_check -s exit:0 -o ignore ifconfig -j genevetest1 geneve1 genevedscpinherit
317	atf_check -s exit:0 -o match:"dscp: inherit" ifconfig -j genevetest1 -v geneve1
318	atf_check -s exit:0 -o ignore ifconfig -j genevetest1 geneve1 -genevedscpinherit
319	atf_check -s exit:0 -o ignore ifconfig -j genevetest1 geneve1 geneveexternal
320	atf_check -s exit:0 -o match:" external" ifconfig -j genevetest1 -v geneve1
321	atf_check -s exit:0 -o ignore ifconfig -j genevetest1 geneve1 -geneveexternal
322	atf_check -s exit:0 -o ignore \
323	    ifconfig -j genevetest1 geneve1 down geneveportrange 11000 62000 up
324	atf_check -s exit:0 -o match:"portrange: 11000-62000" ifconfig -j genevetest1 -v geneve1
325
326	atf_check -s exit:0 -o ignore jexec genevetest2 ping -nc 1 -t 1 $v6tunnel1
327}
328
329ether_ipv6_blind_options_cleanup()
330{
331	vnet_cleanup
332}
333
334atf_test_case "ether_ipv6_external" "cleanup"
335ether_ipv6_external_head()
336{
337	atf_set descr 'Create a geneve(4) l2 ipv6 tunnel and test geneve collect metadata'
338	atf_set require.user root
339	atf_set require.kmods if_geneve
340}
341
342ether_ipv6_external_body()
343{
344	local epair geneve1 geneve2 vni1 endpoint1 endpoint2
345        local v6tunnel1 v6tunnel2
346
347	endpoint1=3fff::1
348	endpoint2=3fff::2
349	v6tunnel1=2001:db8::1
350	v6tunnel2=2001:db8::2
351	vni1=1
352
353	vnet_init
354	epair=$(vnet_mkepair)
355	vnet_mkjail genevetest1 ${epair}a
356	vnet_mkjail genevetest2 ${epair}b
357
358	ifconfig -j genevetest1 ${epair}a inet6 ${endpoint1} up
359	ifconfig -j genevetest2 ${epair}b inet6 ${endpoint2} up
360
361	atf_check -s exit:0 -o ignore \
362	    ifconfig -j genevetest1 geneve1 create genevemode l2 debug \
363	    geneveid $vni1 geneveremote ${endpoint2} genevelocal ${endpoint1} up
364	atf_check -s exit:0 -o ignore \
365	    ifconfig -j genevetest2 geneve1 create genevemode l2 debug \
366	    geneveid $vni1 geneveremote ${endpoint1} genevelocal ${endpoint2} up
367
368	atf_check -s exit:0 -o ignore \
369	    ifconfig -j genevetest1 geneve1 inet6 ${v6tunnel1}
370	atf_check -s exit:0 -o ignore \
371	    ifconfig -j genevetest2 geneve1 inet6 ${v6tunnel2}
372
373	atf_check -s exit:0 -o ignore jexec genevetest1 ping -nc 1 -t 1 $v6tunnel2
374
375	atf_check -s exit:0 -o ignore ifconfig -j genevetest1 geneve1 geneveexternal
376	atf_check -s exit:16 -e ignore ifconfig -j genevetest1 geneve1 down geneveid 10 up
377	atf_check -s exit:0 -o ignore ifconfig -j genevetest1 geneve1 -geneveexternal
378	atf_check -s exit:0 -o ignore ifconfig -j genevetest1 geneve1 down geneveid 10 up
379
380}
381
382ether_ipv6_external_cleanup()
383{
384	vnet_cleanup
385}
386
387atf_test_case "ether_ipv4_multicast" "cleanup"
388ether_ipv4_multicast_head()
389{
390	atf_set descr 'Create a geneve(4) l2 ipv4 multicast tunnel using epair and pass traffic between jails'
391	atf_set require.user root
392	atf_set require.kmods if_geneve ip_mroute
393}
394
395ether_ipv4_multicast_body()
396{
397	local epair geneve1 geneve2 vni1 endpoint1 endpoint2 mc_group
398        local v4tunnel1 v4tunnel2 v6tunnel1 v6tunnel2
399
400	endpoint1=192.168.2.1
401	endpoint2=192.168.2.2
402	mc_group=239.0.0.1
403	v4tunnel1=169.254.0.1
404	v4tunnel2=169.254.0.2
405	v6tunnel1=2001:db8::1
406	v6tunnel2=2001:db8::2
407	vni1=1
408
409	vnet_init
410	epair=$(vnet_mkepair)
411	vnet_mkjail genevetest1 ${epair}a
412	vnet_mkjail genevetest2 ${epair}b
413
414	ifconfig -j genevetest1 ${epair}a inet ${endpoint1}/24 up
415	ifconfig -j genevetest2 ${epair}b inet ${endpoint2}/24 up
416
417	# manually add the multicast routes to epairs
418	route -j genevetest1 add -net 239.0.0.0/8 -interface ${epair}a
419	route -j genevetest2 add -net 239.0.0.0/8 -interface ${epair}b
420
421	atf_check -s exit:0 -o ignore \
422	    ifconfig -j genevetest1 geneve1 create genevemode l2 debug \
423	    geneveid $vni1 genevelocal ${endpoint1} \
424	    genevegroup ${mc_group} genevedev ${epair}a up
425	atf_check -s exit:0 -o ignore \
426	    ifconfig -j genevetest2 geneve1 create genevemode l2 debug \
427	    geneveid $vni1 genevelocal ${endpoint2} \
428	    genevegroup ${mc_group} genevedev ${epair}b up
429
430	atf_check -s exit:0 -o ignore \
431	    ifconfig -j genevetest1 geneve1 inet ${v4tunnel1}/24
432	atf_check -s exit:0 -o ignore \
433	    ifconfig -j genevetest1 geneve1 inet6 ${v6tunnel1}
434	atf_check -s exit:0 -o ignore \
435	    ifconfig -j genevetest2 geneve1 inet ${v4tunnel2}/24
436	atf_check -s exit:0 -o ignore \
437	    ifconfig -j genevetest2 geneve1 inet6 ${v6tunnel2}
438
439	atf_check -s exit:0 -o match:"group 239.0.0.1" jexec genevetest1 ifmcstat -i ${epair}a -f inet
440	atf_check -s exit:0 -o match:"group 239.0.0.1" jexec genevetest2 ifmcstat -i ${epair}b -f inet
441
442	atf_check -s exit:0 -o ignore jexec genevetest1 ping -nc 1 -t 1 $v4tunnel2
443	atf_check -s exit:0 -o ignore jexec genevetest1 ping -nc 1 -t 1 $v6tunnel2
444	atf_check -s exit:0 -o ignore jexec genevetest2 ping -nc 1 -t 1 $v4tunnel1
445	atf_check -s exit:0 -o ignore jexec genevetest2 ping -nc 1 -t 1 $v6tunnel1
446}
447
448ether_ipv4_multicast_cleanup()
449{
450	vnet_cleanup
451}
452
453atf_test_case "ether_ipv6_multicast" "cleanup"
454ether_ipv6_multicast_head()
455{
456	atf_set descr 'Create a geneve(4) l2 ipv6 multicast tunnel using epair and pass traffic between jails'
457	atf_set require.user root
458	atf_set require.kmods if_geneve ip6_mroute
459}
460
461ether_ipv6_multicast_body()
462{
463	local epair geneve1 geneve2 vni1 endpoint1 endpoint2 mc_group
464        local v4tunnel1 v4tunnel2 v6tunnel1 v6tunnel2
465
466	endpoint1=3fff::1
467	endpoint2=3fff::2
468	mc_group=ff08::db8:0:1
469	v4tunnel1=169.254.0.1
470	v4tunnel2=169.254.0.2
471	v6tunnel1=2001:db8::1
472	v6tunnel2=2001:db8::2
473	vni1=1
474
475	vnet_init
476	epair=$(vnet_mkepair)
477	vnet_mkjail genevetest1 ${epair}a
478	vnet_mkjail genevetest2 ${epair}b
479
480	ifconfig -j genevetest1 ${epair}a inet6 ${endpoint1} up
481	ifconfig -j genevetest2 ${epair}b inet6 ${endpoint2} up
482
483	# manually add the multicast routes to epairs
484	route -j genevetest1 -n6 add -net ff08::db8:0:1/96 -interface ${epair}a
485	route -j genevetest2 -n6 add -net ff08::db8:0:1/96 -interface ${epair}b
486
487	atf_check -s exit:0 -o ignore \
488	    ifconfig -j genevetest1 geneve1 create genevemode l2 debug \
489	    geneveid $vni1 genevelocal ${endpoint1} \
490	    genevegroup ${mc_group} genevedev ${epair}a up
491	atf_check -s exit:0 -o ignore \
492	    ifconfig -j genevetest2 geneve1 create genevemode l2 debug \
493	    geneveid $vni1 genevelocal ${endpoint2} \
494	    genevegroup ${mc_group} genevedev ${epair}b up
495
496	atf_check -s exit:0 -o ignore \
497	    ifconfig -j genevetest1 geneve1 inet ${v4tunnel1}/24
498	atf_check -s exit:0 -o ignore \
499	    ifconfig -j genevetest1 geneve1 inet6 ${v6tunnel1}
500	atf_check -s exit:0 -o ignore \
501	    ifconfig -j genevetest2 geneve1 inet ${v4tunnel2}/24
502	atf_check -s exit:0 -o ignore \
503	    ifconfig -j genevetest2 geneve1 inet6 ${v6tunnel2}
504
505	atf_check -s exit:0 -o ignore jexec genevetest1 ping -nc 1 -t 1 $v4tunnel2
506	atf_check -s exit:0 -o ignore jexec genevetest1 ping -nc 1 -t 1 $v6tunnel2
507	atf_check -s exit:0 -o ignore jexec genevetest2 ping -nc 1 -t 1 $v4tunnel1
508	atf_check -s exit:0 -o ignore jexec genevetest2 ping -nc 1 -t 1 $v6tunnel1
509}
510
511ether_ipv6_multicast_cleanup()
512{
513	vnet_cleanup
514}
515
516atf_test_case "ether_ipv4_multicast_without_dev" "cleanup"
517ether_ipv4_multicast_without_dev_head()
518{
519	atf_set descr 'Create a geneve(4) l2 ipv4 multicast tunnel without specifying genevedev using epair and pass traffic between jails'
520	atf_set require.user root
521	atf_set require.kmods if_geneve ip_mroute
522}
523
524ether_ipv4_multicast_without_dev_body()
525{
526	local epair geneve1 geneve2 vni1 endpoint1 endpoint2 mc_group
527        local v4tunnel1 v4tunnel2 v6tunnel1 v6tunnel2
528
529	endpoint1=192.168.2.1
530	endpoint2=192.168.2.2
531	mc_group=239.0.0.1
532	v4tunnel1=169.254.0.1
533	v4tunnel2=169.254.0.2
534	v6tunnel1=2001:db8::1
535	v6tunnel2=2001:db8::2
536	vni1=1
537
538	vnet_init
539	epair=$(vnet_mkepair)
540	vnet_mkjail genevetest1 ${epair}a
541	vnet_mkjail genevetest2 ${epair}b
542
543	ifconfig -j genevetest1 ${epair}a inet ${endpoint1}/24 up
544	ifconfig -j genevetest2 ${epair}b inet ${endpoint2}/24 up
545
546	# manually add the multicast routes to epairs
547	route -j genevetest1 add -net 239.0.0.0/8 -interface ${epair}a
548	route -j genevetest2 add -net 239.0.0.0/8 -interface ${epair}b
549
550	atf_check -s exit:0 -o ignore \
551	    ifconfig -j genevetest1 geneve1 create genevemode l2 debug \
552	    geneveid $vni1 genevelocal ${endpoint1} genevegroup ${mc_group} up
553	atf_check -s exit:0 -o ignore \
554	    ifconfig -j genevetest2 geneve1 create genevemode l2 debug \
555	    geneveid $vni1 genevelocal ${endpoint2} genevegroup ${mc_group} up
556
557	atf_check -s exit:0 -o ignore \
558	    ifconfig -j genevetest1 geneve1 inet ${v4tunnel1}/24
559	atf_check -s exit:0 -o ignore \
560	    ifconfig -j genevetest1 geneve1 inet6 ${v6tunnel1}
561	atf_check -s exit:0 -o ignore \
562	    ifconfig -j genevetest2 geneve1 inet ${v4tunnel2}/24
563	atf_check -s exit:0 -o ignore \
564	    ifconfig -j genevetest2 geneve1 inet6 ${v6tunnel2}
565
566	atf_check -s exit:0 -o match:"group 239.0.0.1" jexec genevetest1 ifmcstat -i ${epair}a -f inet
567	atf_check -s exit:0 -o match:"group 239.0.0.1" jexec genevetest2 ifmcstat -i ${epair}b -f inet
568
569	atf_check -s exit:0 -o ignore jexec genevetest1 ping -nc 1 -t 1 $v4tunnel2
570	atf_check -s exit:0 -o ignore jexec genevetest1 ping -nc 1 -t 1 $v6tunnel2
571	atf_check -s exit:0 -o ignore jexec genevetest2 ping -nc 1 -t 1 $v4tunnel1
572	atf_check -s exit:0 -o ignore jexec genevetest2 ping -nc 1 -t 1 $v6tunnel1
573
574}
575
576ether_ipv4_multicast_without_dev_cleanup()
577{
578	vnet_cleanup
579}
580
581
582atf_test_case "ether_ipv6_multicast_without_dev" "cleanup"
583ether_ipv6_multicast_without_dev_head()
584{
585	atf_set descr 'Create a geneve(4) l2 ipv6 multicast tunnel without specifying genevedev using epair and pass traffic between jails'
586	atf_set require.user root
587	atf_set require.kmods if_geneve ip6_mroute
588}
589
590ether_ipv6_multicast_without_dev_body()
591{
592	local epair geneve1 geneve2 vni1 endpoint1 endpoint2 mc_group
593        local v4tunnel1 v4tunnel2 v6tunnel1 v6tunnel2
594
595	endpoint1=3fff::1
596	endpoint2=3fff::2
597	mc_group=ff08::db8:0:1
598	v4tunnel1=169.254.0.1
599	v4tunnel2=169.254.0.2
600	v6tunnel1=2001:db8::1
601	v6tunnel2=2001:db8::2
602	vni1=1
603
604	vnet_init
605	epair=$(vnet_mkepair)
606	vnet_mkjail genevetest1 ${epair}a
607	vnet_mkjail genevetest2 ${epair}b
608
609	ifconfig -j genevetest1 ${epair}a inet6 ${endpoint1} up
610	ifconfig -j genevetest2 ${epair}b inet6 ${endpoint2} up
611
612	# manually add the multicast routes to epairs
613	route -j genevetest1 -n6 add -net ff08::db8:0:1/96 -interface ${epair}a
614	route -j genevetest2 -n6 add -net ff08::db8:0:1/96 -interface ${epair}b
615
616	atf_check -s exit:0 -o ignore \
617	    ifconfig -j genevetest1 geneve1 create genevemode l2 debug \
618	    geneveid $vni1 genevelocal ${endpoint1} genevegroup ${mc_group} up
619	atf_check -s exit:0 -o ignore \
620	    ifconfig -j genevetest2 geneve1 create genevemode l2 debug \
621	    geneveid $vni1 genevelocal ${endpoint2} genevegroup ${mc_group} up
622
623	atf_check -s exit:0 -o ignore \
624	    ifconfig -j genevetest1 geneve1 inet ${v4tunnel1}/24
625	atf_check -s exit:0 -o ignore \
626	    ifconfig -j genevetest1 geneve1 inet6 ${v6tunnel1}
627	atf_check -s exit:0 -o ignore \
628	    ifconfig -j genevetest2 geneve1 inet ${v4tunnel2}/24
629	atf_check -s exit:0 -o ignore \
630	    ifconfig -j genevetest2 geneve1 inet6 ${v6tunnel2}
631
632	atf_check -s exit:0 -o ignore jexec genevetest1 ping -nc 1 -t 1 $v4tunnel2
633	atf_check -s exit:0 -o ignore jexec genevetest1 ping -nc 1 -t 1 $v6tunnel2
634	atf_check -s exit:0 -o ignore jexec genevetest2 ping -nc 1 -t 1 $v4tunnel1
635	atf_check -s exit:0 -o ignore jexec genevetest2 ping -nc 1 -t 1 $v6tunnel1
636
637}
638
639ether_ipv6_multicast_without_dev_cleanup()
640{
641	vnet_cleanup
642}
643
644atf_test_case "inherit_ipv4_multicast" "cleanup"
645inherit_ipv4_multicast_head()
646{
647	atf_set descr 'Create a geneve(4) l3 ipv4 multicast tunnel using epair and pass traffic between jails'
648	atf_set require.user root
649	atf_set require.kmods if_geneve ip_mroute
650}
651
652inherit_ipv4_multicast_body()
653{
654	local epair geneve1 geneve2 vni1 endpoint1 endpoint2 mc_group
655        local v4tunnel1 v4tunnel2 v6tunnel1 v6tunnel2
656
657	endpoint1=192.168.2.1
658	endpoint2=192.168.2.2
659	mc_group=239.0.0.1
660	v4tunnel1=169.254.0.1
661	v4tunnel2=169.254.0.2
662	v6tunnel1=2001:db8::1
663	v6tunnel2=2001:db8::2
664	vni1=1
665
666	vnet_init
667	epair=$(vnet_mkepair)
668	vnet_mkjail genevetest1 ${epair}a
669	vnet_mkjail genevetest2 ${epair}b
670
671	ifconfig -j genevetest1 ${epair}a inet ${endpoint1}/24 up
672	ifconfig -j genevetest2 ${epair}b inet ${endpoint2}/24 up
673
674	# manually add the multicast routes to epairs
675	route -j genevetest1 add -net 239.0.0.0/8 -interface ${epair}a
676	route -j genevetest2 add -net 239.0.0.0/8 -interface ${epair}b
677
678	atf_check -s exit:0 -o ignore \
679	    ifconfig -j genevetest1 geneve1 create genevemode l3 debug \
680	    geneveid $vni1 genevelocal ${endpoint1} \
681	    genevegroup ${mc_group} genevedev ${epair}a up
682	atf_check -s exit:0 -o ignore \
683	    ifconfig -j genevetest2 geneve1 create genevemode l3 debug \
684	    geneveid $vni1 genevelocal ${endpoint2} \
685	    genevegroup ${mc_group} genevedev ${epair}b up
686
687	atf_check -s exit:0 -o ignore \
688	    ifconfig -j genevetest1 geneve1 inet ${v4tunnel1}/30
689	atf_check -s exit:0 -o ignore \
690	    ifconfig -j genevetest1 geneve1 inet6 ${v6tunnel1}
691	atf_check -s exit:0 -o ignore \
692	    ifconfig -j genevetest2 geneve1 inet ${v4tunnel2}/30
693	atf_check -s exit:0 -o ignore \
694	    ifconfig -j genevetest2 geneve1 inet6 ${v6tunnel2}
695
696	atf_check -s exit:0 -o ignore sysctl -j genevetest1 net.inet.icmp.bmcastecho=1
697	atf_check -s exit:0 -o ignore sysctl -j genevetest2 net.inet.icmp.bmcastecho=1
698
699	atf_check -s exit:0 -o match:"group 239.0.0.1" jexec genevetest1 ifmcstat -i ${epair}a -f inet
700	atf_check -s exit:0 -o match:"group 239.0.0.1" jexec genevetest2 ifmcstat -i ${epair}b -f inet
701
702	atf_check -s exit:0 -o ignore jexec genevetest1 ping -nc 1 -t 1 $v4tunnel2
703	atf_check -s exit:0 -o ignore jexec genevetest2 ping -nc 1 -t 1 $v4tunnel1
704	atf_check -s exit:0 -o ignore jexec genevetest1 ping -nc 1 -t 1 $v6tunnel2
705	atf_check -s exit:0 -o ignore jexec genevetest2 ping -nc 1 -t 1 $v6tunnel1
706}
707
708inherit_ipv4_multicast_cleanup()
709{
710	vnet_cleanup
711}
712
713atf_test_case "inherit_ipv6_multicast" "cleanup"
714inherit_ipv6_multicast_head()
715{
716	atf_set descr 'Create a geneve(4) l3 ipv6 multicast tunnel using epair and pass traffic between jails'
717	atf_set require.user root
718	atf_set require.kmods if_geneve ip6_mroute
719}
720
721inherit_ipv6_multicast_body()
722{
723	local epair geneve1 geneve2 vni1 endpoint1 endpoint2 mc_group
724        local v4tunnel1 v4tunnel2 v6tunnel1 v6tunnel2
725
726	endpoint1=3fff::1
727	endpoint2=3fff::2
728	mc_group=ff08::db8:0:1
729	v4tunnel1=169.254.0.1
730	v4tunnel2=169.254.0.2
731	v6tunnel1=2001:db8::1
732	v6tunnel2=2001:db8::2
733	vni1=1
734
735	vnet_init
736	epair=$(vnet_mkepair)
737	vnet_mkjail genevetest1 ${epair}a
738	vnet_mkjail genevetest2 ${epair}b
739
740	ifconfig -j genevetest1 ${epair}a inet6 ${endpoint1} up
741	ifconfig -j genevetest2 ${epair}b inet6 ${endpoint2} up
742
743	# manually add the multicast routes to epairs
744	route -j genevetest1 -n6 add -net ff08::db8:0:1/96 -interface ${epair}a
745	route -j genevetest2 -n6 add -net ff08::db8:0:1/96 -interface ${epair}b
746
747	atf_check -s exit:0 -o ignore \
748	    ifconfig -j genevetest1 geneve1 create genevemode l3 debug \
749	    geneveid $vni1 genevelocal ${endpoint1} \
750	    genevegroup ${mc_group} genevedev ${epair}a up
751	atf_check -s exit:0 -o ignore \
752	    ifconfig -j genevetest2 geneve1 create genevemode l3 debug \
753	    geneveid $vni1 genevelocal ${endpoint2} \
754	    genevegroup ${mc_group} genevedev ${epair}b up
755
756	atf_check -s exit:0 -o ignore \
757	    ifconfig -j genevetest1 geneve1 inet ${v4tunnel1}/30
758	atf_check -s exit:0 -o ignore \
759	    ifconfig -j genevetest1 geneve1 inet6 ${v6tunnel1}
760	atf_check -s exit:0 -o ignore \
761	    ifconfig -j genevetest2 geneve1 inet ${v4tunnel2}/30
762	atf_check -s exit:0 -o ignore \
763	    ifconfig -j genevetest2 geneve1 inet6 ${v6tunnel2}
764
765	atf_check -s exit:0 -o ignore sysctl -j genevetest1 net.inet.icmp.bmcastecho=1
766	atf_check -s exit:0 -o ignore sysctl -j genevetest2 net.inet.icmp.bmcastecho=1
767
768	atf_check -s exit:0 -o ignore jexec genevetest1 ping -nc 1 -t 1 $v6tunnel2
769	atf_check -s exit:0 -o ignore jexec genevetest2 ping -nc 1 -t 1 $v6tunnel1
770	atf_check -s exit:0 -o ignore jexec genevetest1 ping -nc 1 -t 1 $v4tunnel2
771	atf_check -s exit:0 -o ignore jexec genevetest2 ping -nc 1 -t 1 $v4tunnel1
772}
773
774inherit_ipv6_multicast_cleanup()
775{
776	vnet_cleanup
777}
778
779atf_test_case "inherit_ipv4_multicast_without_dev" "cleanup"
780inherit_ipv4_multicast_without_dev_head()
781{
782	atf_set descr 'Create a geneve(4) l3 ipv4 multicast tunnel without specifying genevedev using epair and pass traffic between jails'
783	atf_set require.user root
784	atf_set require.kmods if_geneve ip_mroute
785}
786
787inherit_ipv4_multicast_without_dev_body()
788{
789	local epair geneve1 geneve2 vni1 endpoint1 endpoint2 mc_group
790        local v4tunnel1 v4tunnel2 v6tunnel1 v6tunnel2
791
792	endpoint1=192.168.2.1
793	endpoint2=192.168.2.2
794	mc_group=239.0.0.1
795	v4tunnel1=169.254.0.1
796	v4tunnel2=169.254.0.2
797	v6tunnel1=2001:db8::1
798	v6tunnel2=2001:db8::2
799	vni1=1
800
801	vnet_init
802	epair=$(vnet_mkepair)
803	vnet_mkjail genevetest1 ${epair}a
804	vnet_mkjail genevetest2 ${epair}b
805
806	ifconfig -j genevetest1 ${epair}a inet ${endpoint1}/24 up
807	ifconfig -j genevetest2 ${epair}b inet ${endpoint2}/24 up
808
809	# manually add the multicast routes to epairs
810	route -j genevetest1 add -net 239.0.0.0/8 -interface ${epair}a
811	route -j genevetest2 add -net 239.0.0.0/8 -interface ${epair}b
812
813	atf_check -s exit:0 -o ignore \
814	    ifconfig -j genevetest1 geneve1 create genevemode l3 debug \
815	    geneveid $vni1 genevelocal ${endpoint1} genevegroup ${mc_group} up
816	atf_check -s exit:0 -o ignore \
817	    ifconfig -j genevetest2 geneve1 create genevemode l3 debug \
818	    geneveid $vni1 genevelocal ${endpoint2} genevegroup ${mc_group} up
819
820	atf_check -s exit:0 -o ignore \
821	    ifconfig -j genevetest1 geneve1 inet ${v4tunnel1}/30
822	atf_check -s exit:0 -o ignore \
823	    ifconfig -j genevetest1 geneve1 inet6 ${v6tunnel1}
824	atf_check -s exit:0 -o ignore \
825	    ifconfig -j genevetest2 geneve1 inet ${v4tunnel2}/30
826	atf_check -s exit:0 -o ignore \
827	    ifconfig -j genevetest2 geneve1 inet6 ${v6tunnel2}
828
829	atf_check -s exit:0 -o ignore sysctl -j genevetest1 net.inet.icmp.bmcastecho=1
830	atf_check -s exit:0 -o ignore sysctl -j genevetest2 net.inet.icmp.bmcastecho=1
831
832	atf_check -s exit:0 -o match:"group 239.0.0.1" jexec genevetest1 ifmcstat -i ${epair}a -f inet
833	atf_check -s exit:0 -o match:"group 239.0.0.1" jexec genevetest2 ifmcstat -i ${epair}b -f inet
834
835	atf_check -s exit:0 -o ignore jexec genevetest1 ping -nc 1 -t 1 $v4tunnel2
836	atf_check -s exit:0 -o ignore jexec genevetest2 ping -nc 1 -t 1 $v4tunnel1
837	atf_check -s exit:0 -o ignore jexec genevetest1 ping -nc 1 -t 1 $v6tunnel2
838	atf_check -s exit:0 -o ignore jexec genevetest2 ping -nc 1 -t 1 $v6tunnel1
839
840}
841
842inherit_ipv4_multicast_without_dev_cleanup()
843{
844	vnet_cleanup
845}
846
847
848atf_test_case "inherit_ipv6_multicast_without_dev" "cleanup"
849inherit_ipv6_multicast_without_dev_head()
850{
851	atf_set descr 'Create a geneve(4) l3 ipv6 multicast tunnel without specifying genevedev using epair and pass traffic between jails'
852	atf_set require.user root
853	atf_set require.kmods if_geneve ip6_mroute
854}
855
856inherit_ipv6_multicast_without_dev_body()
857{
858	local epair geneve1 geneve2 vni1 endpoint1 endpoint2 mc_group
859        local v4tunnel1 v4tunnel2 v6tunnel1 v6tunnel2
860
861	endpoint1=3fff::1
862	endpoint2=3fff::2
863	mc_group=ff08::db8:0:1
864	v4tunnel1=169.254.0.1
865	v4tunnel2=169.254.0.2
866	v6tunnel1=2001:db8::1
867	v6tunnel2=2001:db8::2
868	vni1=1
869
870	vnet_init
871	epair=$(vnet_mkepair)
872	vnet_mkjail genevetest1 ${epair}a
873	vnet_mkjail genevetest2 ${epair}b
874
875	ifconfig -j genevetest1 ${epair}a inet6 ${endpoint1} up
876	ifconfig -j genevetest2 ${epair}b inet6 ${endpoint2} up
877
878	# manually add the multicast routes to epairs
879	route -j genevetest1 -n6 add -net ff08::db8:0:1/96 -interface ${epair}a
880	route -j genevetest2 -n6 add -net ff08::db8:0:1/96 -interface ${epair}b
881
882	atf_check -s exit:0 -o ignore \
883	    ifconfig -j genevetest1 geneve1 create genevemode l3 debug \
884	    geneveid $vni1 genevelocal ${endpoint1} genevegroup ${mc_group} up
885	atf_check -s exit:0 -o ignore \
886	    ifconfig -j genevetest2 geneve1 create genevemode l3 debug \
887	    geneveid $vni1 genevelocal ${endpoint2} genevegroup ${mc_group} up
888
889	atf_check -s exit:0 -o ignore \
890	    ifconfig -j genevetest1 geneve1 inet ${v4tunnel1}/30
891	atf_check -s exit:0 -o ignore \
892	    ifconfig -j genevetest1 geneve1 inet6 ${v6tunnel1}
893	atf_check -s exit:0 -o ignore \
894	    ifconfig -j genevetest2 geneve1 inet ${v4tunnel2}/30
895	atf_check -s exit:0 -o ignore \
896	    ifconfig -j genevetest2 geneve1 inet6 ${v6tunnel2}
897
898	atf_check -s exit:0 -o ignore sysctl -j genevetest1 net.inet.icmp.bmcastecho=1
899	atf_check -s exit:0 -o ignore sysctl -j genevetest2 net.inet.icmp.bmcastecho=1
900
901	atf_check -s exit:0 -o ignore jexec genevetest1 ping -nc 1 -t 1 $v6tunnel2
902	atf_check -s exit:0 -o ignore jexec genevetest2 ping -nc 1 -t 1 $v6tunnel1
903	atf_check -s exit:0 -o ignore jexec genevetest1 ping -nc 1 -t 1 $v4tunnel2
904	atf_check -s exit:0 -o ignore jexec genevetest2 ping -nc 1 -t 1 $v4tunnel1
905}
906
907inherit_ipv6_multicast_without_dev_cleanup()
908{
909	vnet_cleanup
910}
911
912
913atf_init_test_cases()
914{
915	atf_add_test_case "ether_ipv4"
916	atf_add_test_case "ether_ipv4_multicast"
917	atf_add_test_case "ether_ipv4_multicast_without_dev"
918	atf_add_test_case "ether_ipv6"
919	atf_add_test_case "ether_ipv6_blind_options"
920	atf_add_test_case "ether_ipv6_external"
921	atf_add_test_case "ether_ipv6_multicast"
922	atf_add_test_case "ether_ipv6_multicast_without_dev"
923	atf_add_test_case "inherit_ipv4"
924	atf_add_test_case "inherit_ipv4_multicast"
925	atf_add_test_case "inherit_ipv4_multicast_without_dev"
926	atf_add_test_case "inherit_ipv6"
927	atf_add_test_case "inherit_ipv6_multicast"
928	atf_add_test_case "inherit_ipv6_multicast_without_dev"
929}
930