git: aa9f669d09a7 - main - geneve: Add tests for geneve

From: Pouria Mousavizadeh Tehrani <pouria_at_FreeBSD.org>
Date: Mon, 13 Apr 2026 14:16:59 UTC
The branch main has been updated by pouria:

URL: https://cgit.FreeBSD.org/src/commit/?id=aa9f669d09a7a193d470477398815f45a42c0270

commit aa9f669d09a7a193d470477398815f45a42c0270
Author:     Pouria Mousavizadeh Tehrani <pouria@FreeBSD.org>
AuthorDate: 2026-04-11 18:45:08 +0000
Commit:     Pouria Mousavizadeh Tehrani <pouria@FreeBSD.org>
CommitDate: 2026-04-13 14:15:04 +0000

    geneve: Add tests for geneve
    
    Add tests for each combinations of geneve modes, address families
    and multicast.
    
    Differential Revision: https://reviews.freebsd.org/D55183
---
 tests/ci/tools/ci.conf     |    1 +
 tests/sys/net/Makefile     |    1 +
 tests/sys/net/if_geneve.sh | 1000 ++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 1002 insertions(+)

diff --git a/tests/ci/tools/ci.conf b/tests/ci/tools/ci.conf
index 2302fc479a47..5ddb3476eb26 100644
--- a/tests/ci/tools/ci.conf
+++ b/tests/ci/tools/ci.conf
@@ -74,6 +74,7 @@ kld_list="\${kld_list} fusefs"		# sys/fs/fusefs
 kld_list="\${kld_list} if_bridge"	# sys/net/if_bridge_test
 kld_list="\${kld_list} if_enc"		# sys/netpfil/pf
 kld_list="\${kld_list} if_epair"	# sys/net/if_epair_test
+kld_list="\${kld_list} if_geneve"	# sys/net/if_geneve
 kld_list="\${kld_list} if_ovpn"		# sys/net/if_ovpn
 kld_list="\${kld_list} if_stf"		# sys/net/if_stf
 kld_list="\${kld_list} ipdivert"	# sys/netinet (loads ipdivert)
diff --git a/tests/sys/net/Makefile b/tests/sys/net/Makefile
index e390c6e8059d..6dcc23b49b67 100644
--- a/tests/sys/net/Makefile
+++ b/tests/sys/net/Makefile
@@ -15,6 +15,7 @@ ATF_TESTS_SH+=	if_stf
 ATF_TESTS_SH+=	if_tun_test
 ATF_TESTS_SH+=	if_vlan
 ATF_TESTS_SH+=	if_wg
+ATF_TESTS_SH+=	if_geneve
 
 TESTS_SUBDIRS+=	bpf
 TESTS_SUBDIRS+=	if_ovpn
diff --git a/tests/sys/net/if_geneve.sh b/tests/sys/net/if_geneve.sh
new file mode 100644
index 000000000000..7eb2649b44a9
--- /dev/null
+++ b/tests/sys/net/if_geneve.sh
@@ -0,0 +1,1000 @@
+#
+# SPDX-License-Identifier: BSD-2-Clause
+#
+# Copyright (c) 2025-2026 Pouria Mousavizadeh Tehrani <pouria@FreeBSD.org>
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+
+. $(atf_get_srcdir)/../common/vnet.subr
+
+atf_test_case "ether_ipv4" "cleanup"
+ether_ipv4_head()
+{
+	atf_set descr 'Create a geneve(4) l2 tunnel over an ipv4 underlay using epair and pass traffic between jails'
+	atf_set require.user root
+}
+
+ether_ipv4_body()
+{
+	local epair geneve1 geneve2 vni1 endpoint1 endpoint2
+        local v4tunnel1 v4tunnel2 v6tunnel1 v6tunnel2
+
+	endpoint1=192.168.2.1
+	endpoint2=192.168.2.2
+	v4tunnel1=169.254.0.1
+	v4tunnel2=169.254.0.2
+	v6tunnel1=2001:db8::1
+	v6tunnel2=2001:db8::2
+	vni1=1
+
+	if ! kldstat -q -m if_geneve; then
+		atf_skip "This test requires if_geneve"
+	fi
+
+	vnet_init
+	epair=$(vnet_mkepair)
+	vnet_mkjail genevetest1 ${epair}a
+	vnet_mkjail genevetest2 ${epair}b
+
+	ifconfig -j genevetest1 ${epair}a inet ${endpoint1}/24 up
+	ifconfig -j genevetest2 ${epair}b inet ${endpoint2}/24 up
+
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest1 geneve1 create genevemode l2 debug \
+	    geneveid $vni1 geneveremote ${endpoint2} genevelocal ${endpoint1} up
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest2 geneve1 create genevemode l2 debug \
+	    geneveid $vni1 geneveremote ${endpoint1} genevelocal ${endpoint2} up
+
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest1 geneve1 inet ${v4tunnel1}/24
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest1 geneve1 inet6 ${v6tunnel1}
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest2 geneve1 inet ${v4tunnel2}/24
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest2 geneve1 inet6 ${v6tunnel2}
+
+	atf_check -s exit:0 -o ignore jexec genevetest1 ping -nc 1 -t 1 $v4tunnel2
+	atf_check -s exit:0 -o ignore jexec genevetest2 ping -nc 1 -t 1 $v4tunnel1
+	atf_check -s exit:0 -o ignore jexec genevetest1 ping -nc 1 -t 1 $v6tunnel2
+	atf_check -s exit:0 -o ignore jexec genevetest2 ping -nc 1 -t 1 $v6tunnel1
+}
+
+ether_ipv4_cleanup()
+{
+	vnet_cleanup
+}
+
+atf_test_case "ether_ipv6" "cleanup"
+ether_ipv6_head()
+{
+	atf_set descr 'Create a geneve(4) l2 tunnel over an ipv6 underlay using epair and pass traffic between jails'
+	atf_set require.user root
+}
+
+ether_ipv6_body()
+{
+	local epair geneve1 geneve2 vni1 endpoint1 endpoint2
+        local v4tunnel1 v4tunnel2 v6tunnel1 v6tunnel2
+
+	endpoint1=3fff::1
+	endpoint2=3fff::2
+	v4tunnel1=169.254.0.1
+	v4tunnel2=169.254.0.2
+	v6tunnel1=2001:db8::1
+	v6tunnel2=2001:db8::2
+	vni1=1
+
+	if ! kldstat -q -m if_geneve; then
+		atf_skip "This test requires if_geneve"
+	fi
+
+	vnet_init
+	epair=$(vnet_mkepair)
+	vnet_mkjail genevetest1 ${epair}a
+	vnet_mkjail genevetest2 ${epair}b
+
+	ifconfig -j genevetest1 ${epair}a inet6 ${endpoint1} up
+	ifconfig -j genevetest2 ${epair}b inet6 ${endpoint2} up
+
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest1 geneve1 create genevemode l2 debug \
+	    geneveid $vni1 geneveremote ${endpoint2} genevelocal ${endpoint1} up
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest2 geneve1 create genevemode l2 debug \
+	    geneveid $vni1 geneveremote ${endpoint1} genevelocal ${endpoint2} up
+
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest1 geneve1 inet ${v4tunnel1}/24
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest1 geneve1 inet6 ${v6tunnel1}
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest2 geneve1 inet ${v4tunnel2}/24
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest2 geneve1 inet6 ${v6tunnel2}
+
+	atf_check -s exit:0 -o ignore jexec genevetest1 ping -nc 1 -t 1 $v4tunnel2
+	atf_check -s exit:0 -o ignore jexec genevetest2 ping -nc 1 -t 1 $v4tunnel1
+	atf_check -s exit:0 -o ignore jexec genevetest1 ping -nc 1 -t 1 $v6tunnel2
+	atf_check -s exit:0 -o ignore jexec genevetest2 ping -nc 1 -t 1 $v6tunnel1
+}
+
+ether_ipv6_cleanup()
+{
+	vnet_cleanup
+}
+
+atf_test_case "inherit_ipv4" "cleanup"
+inherit_ipv4_head()
+{
+	atf_set descr 'Create a geneve(4) l3 tunnel over an ipv4 underlay using epair and pass traffic between jails'
+	atf_set require.user root
+}
+
+inherit_ipv4_body()
+{
+	local epair geneve1 geneve2 vni1 endpoint1 endpoint2
+        local v4tunnel1 v4tunnel2 v6tunnel1 v6tunnel2
+
+	endpoint1=192.168.2.1
+	endpoint2=192.168.2.2
+	v4tunnel1=169.254.0.1
+	v4tunnel2=169.254.0.2
+	v6tunnel1=2001:db8::1
+	v6tunnel2=2001:db8::2
+	vni1=2
+
+	if ! kldstat -q -m if_geneve; then
+		atf_skip "This test requires if_geneve"
+	fi
+
+	vnet_init
+	epair=$(vnet_mkepair)
+	vnet_mkjail genevetest1 ${epair}a
+	vnet_mkjail genevetest2 ${epair}b
+
+	ifconfig -j genevetest1 ${epair}a inet ${endpoint1}/24 up
+	ifconfig -j genevetest2 ${epair}b inet ${endpoint2}/24 up
+
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest1 geneve1 create genevemode l3 debug \
+	    geneveid $vni1 geneveremote ${endpoint2} genevelocal ${endpoint1} up
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest2 geneve1 create genevemode l3 debug \
+	    geneveid $vni1 geneveremote ${endpoint1} genevelocal ${endpoint2} up
+
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest1 geneve1 inet ${v4tunnel1}/24
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest1 geneve1 inet6 ${v6tunnel1}
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest2 geneve1 inet ${v4tunnel2}/24
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest2 geneve1 inet6 ${v6tunnel2}
+
+	atf_check -s exit:0 -o ignore jexec genevetest1 ping -nc 1 -t 1 $v4tunnel2
+	atf_check -s exit:0 -o ignore jexec genevetest2 ping -nc 1 -t 1 $v4tunnel1
+	atf_check -s exit:0 -o ignore jexec genevetest1 ping -nc 1 -t 1 $v6tunnel2
+	atf_check -s exit:0 -o ignore jexec genevetest2 ping -nc 1 -t 1 $v6tunnel1
+}
+
+inherit_ipv4_cleanup()
+{
+	vnet_cleanup
+}
+
+atf_test_case "inherit_ipv6" "cleanup"
+inherit_ipv6_head()
+{
+	atf_set descr 'Create a geneve(4) l3 tunnel over an ipv6 underlay using epair and pass traffic between jails'
+	atf_set require.user root
+}
+
+inherit_ipv6_body()
+{
+	local epair geneve1 geneve2 vni1 endpoint1 endpoint2
+        local v4tunnel1 v4tunnel2 v6tunnel1 v6tunnel2
+
+	endpoint1=3fff::1
+	endpoint2=3fff::2
+	v4tunnel1=169.254.0.1
+	v4tunnel2=169.254.0.2
+	v6tunnel1=2001:db8::1
+	v6tunnel2=2001:db8::2
+	vni1=1
+
+	if ! kldstat -q -m if_geneve; then
+		atf_skip "This test requires if_geneve"
+	fi
+
+	vnet_init
+	epair=$(vnet_mkepair)
+	vnet_mkjail genevetest1 ${epair}a
+	vnet_mkjail genevetest2 ${epair}b
+
+	ifconfig -j genevetest1 ${epair}a inet6 ${endpoint1} up
+	ifconfig -j genevetest2 ${epair}b inet6 ${endpoint2} up
+
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest1 geneve1 create genevemode l3 debug \
+	    geneveid $vni1 geneveremote ${endpoint2} genevelocal ${endpoint1} up
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest2 geneve1 create genevemode l3 debug \
+	    geneveid $vni1 geneveremote ${endpoint1} genevelocal ${endpoint2} up
+
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest1 geneve1 inet ${v4tunnel1}/24
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest1 geneve1 inet6 ${v6tunnel1}
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest2 geneve1 inet ${v4tunnel2}/24
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest2 geneve1 inet6 ${v6tunnel2}
+
+	atf_check -s exit:0 -o ignore jexec genevetest1 ping -nc 1 -t 1 $v4tunnel2
+	atf_check -s exit:0 -o ignore jexec genevetest2 ping -nc 1 -t 1 $v4tunnel1
+	atf_check -s exit:0 -o ignore jexec genevetest1 ping -nc 1 -t 1 $v6tunnel2
+	atf_check -s exit:0 -o ignore jexec genevetest2 ping -nc 1 -t 1 $v6tunnel1
+}
+
+inherit_ipv6_cleanup()
+{
+	vnet_cleanup
+}
+
+atf_test_case "ether_ipv6_blind_options" "cleanup"
+ether_ipv6_blind_options_head()
+{
+	atf_set descr 'Create a geneve(4) l2 ipv6 tunnel and test geneve options'
+	atf_set require.user root
+}
+
+ether_ipv6_blind_options_body()
+{
+	local epair geneve1 geneve2 vni1 endpoint1 endpoint2
+        local v6tunnel1 v6tunnel2
+
+	endpoint1=3fff::1
+	endpoint2=3fff::2
+	v6tunnel1=2001:db8::1
+	v6tunnel2=2001:db8::2
+	vni1=1
+
+	if ! kldstat -q -m if_geneve; then
+		atf_skip "This test requires if_geneve"
+	fi
+
+	vnet_init
+	epair=$(vnet_mkepair)
+	vnet_mkjail genevetest1 ${epair}a
+	vnet_mkjail genevetest2 ${epair}b
+
+	ifconfig -j genevetest1 ${epair}a inet6 ${endpoint1} up
+	ifconfig -j genevetest2 ${epair}b inet6 ${endpoint2} up
+
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest1 geneve1 create genevemode l2 debug \
+	    geneveid $vni1 geneveremote ${endpoint2} genevelocal ${endpoint1} up
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest2 geneve1 create genevemode l2 debug \
+	    geneveid $vni1 geneveremote ${endpoint1} genevelocal ${endpoint2} up
+
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest1 geneve1 inet6 ${v6tunnel1}
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest2 geneve1 inet6 ${v6tunnel2}
+
+	atf_check -s exit:0 -o ignore jexec genevetest1 ping -nc 1 -t 1 $v6tunnel2
+
+	atf_check -s exit:0 -o ignore ifconfig -j genevetest1 geneve1 genevemaxaddr 1000
+	atf_check -s exit:0 -o match:"max: 1000" ifconfig -j genevetest1 -v geneve1
+	atf_check -s exit:0 -o ignore ifconfig -j genevetest1 geneve1 genevetimeout 1000
+	atf_check -s exit:0 -o match:"timeout: 1000" ifconfig -j genevetest1 -v geneve1
+	atf_check -s exit:0 -o ignore ifconfig -j genevetest1 geneve1 -genevelearn
+	atf_check -s exit:0 -o match:"mode: nolearning" ifconfig -j genevetest1 -v geneve1
+	atf_check -s exit:0 -o ignore ifconfig -j genevetest1 geneve1 genevelearn
+	atf_check -s exit:0 -o match:" learning" ifconfig -j genevetest1 -v geneve1
+	atf_check -s exit:0 -o match:"count: 1" ifconfig -j genevetest1 -v geneve1
+	atf_check -s exit:0 -o ignore ifconfig -j genevetest1 geneve1 geneveflush
+	atf_check -s exit:0 -o match:"count: 0" ifconfig -j genevetest1 -v geneve1
+	atf_check -s exit:0 -o ignore ifconfig -j genevetest1 geneve1 geneveflushall
+	atf_check -s exit:0 -o ignore ifconfig -j genevetest1 geneve1 genevettl inherit
+	atf_check -s exit:0 -o match:"ttl: inherit" ifconfig -j genevetest1 -v geneve1
+	atf_check -s exit:0 -o ignore ifconfig -j genevetest1 geneve1 genevettl 1
+	atf_check -s exit:0 -o match:"ttl: 1" ifconfig -j genevetest1 -v geneve1
+	atf_check -s exit:0 -o ignore ifconfig -j genevetest1 geneve1 down genevedf set up
+	atf_check -s exit:0 -o match:"df: set" ifconfig -j genevetest1 -v geneve1
+	atf_check -s exit:0 -o ignore ifconfig -j genevetest1 geneve1 down genevedf inherit up
+	atf_check -s exit:0 -o match:"df: inherit" ifconfig -j genevetest1 -v geneve1
+	atf_check -s exit:0 -o ignore ifconfig -j genevetest1 geneve1 down genevedf unset up
+	atf_check -s exit:0 -o match:"df: unset" ifconfig -j genevetest1 -v geneve1
+	atf_check -s exit:0 -o ignore ifconfig -j genevetest1 geneve1 genevedscpinherit
+	atf_check -s exit:0 -o match:"dscp: inherit" ifconfig -j genevetest1 -v geneve1
+	atf_check -s exit:0 -o ignore ifconfig -j genevetest1 geneve1 -genevedscpinherit
+	atf_check -s exit:0 -o ignore ifconfig -j genevetest1 geneve1 geneveexternal
+	atf_check -s exit:0 -o match:" external" ifconfig -j genevetest1 -v geneve1
+	atf_check -s exit:0 -o ignore ifconfig -j genevetest1 geneve1 -geneveexternal
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest1 geneve1 down geneveportrange 11000 62000 up
+	atf_check -s exit:0 -o match:"portrange: 11000-62000" ifconfig -j genevetest1 -v geneve1
+
+	atf_check -s exit:0 -o ignore jexec genevetest2 ping -nc 1 -t 1 $v6tunnel1
+}
+
+ether_ipv6_blind_options_cleanup()
+{
+	vnet_cleanup
+}
+
+atf_test_case "ether_ipv6_external" "cleanup"
+ether_ipv6_external_head()
+{
+	atf_set descr 'Create a geneve(4) l2 ipv6 tunnel and test geneve collect metadata'
+	atf_set require.user root
+}
+
+ether_ipv6_external_body()
+{
+	local epair geneve1 geneve2 vni1 endpoint1 endpoint2
+        local v6tunnel1 v6tunnel2
+
+	endpoint1=3fff::1
+	endpoint2=3fff::2
+	v6tunnel1=2001:db8::1
+	v6tunnel2=2001:db8::2
+	vni1=1
+
+	if ! kldstat -q -m if_geneve; then
+		atf_skip "This test requires if_geneve"
+	fi
+
+	vnet_init
+	epair=$(vnet_mkepair)
+	vnet_mkjail genevetest1 ${epair}a
+	vnet_mkjail genevetest2 ${epair}b
+
+	ifconfig -j genevetest1 ${epair}a inet6 ${endpoint1} up
+	ifconfig -j genevetest2 ${epair}b inet6 ${endpoint2} up
+
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest1 geneve1 create genevemode l2 debug \
+	    geneveid $vni1 geneveremote ${endpoint2} genevelocal ${endpoint1} up
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest2 geneve1 create genevemode l2 debug \
+	    geneveid $vni1 geneveremote ${endpoint1} genevelocal ${endpoint2} up
+
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest1 geneve1 inet6 ${v6tunnel1}
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest2 geneve1 inet6 ${v6tunnel2}
+
+	atf_check -s exit:0 -o ignore jexec genevetest1 ping -nc 1 -t 1 $v6tunnel2
+
+	atf_check -s exit:0 -o ignore ifconfig -j genevetest1 geneve1 geneveexternal
+	atf_check -s exit:16 -e ignore ifconfig -j genevetest1 geneve1 down geneveid 10 up
+	atf_check -s exit:0 -o ignore ifconfig -j genevetest1 geneve1 -geneveexternal
+	atf_check -s exit:0 -o ignore ifconfig -j genevetest1 geneve1 down geneveid 10 up
+
+}
+
+ether_ipv6_external_cleanup()
+{
+	vnet_cleanup
+}
+
+atf_test_case "ether_ipv4_multicast" "cleanup"
+ether_ipv4_multicast_head()
+{
+	atf_set descr 'Create a geneve(4) l2 ipv4 multicast tunnel using epair and pass traffic between jails'
+	atf_set require.user root
+}
+
+ether_ipv4_multicast_body()
+{
+	local epair geneve1 geneve2 vni1 endpoint1 endpoint2 mc_group
+        local v4tunnel1 v4tunnel2 v6tunnel1 v6tunnel2
+
+	endpoint1=192.168.2.1
+	endpoint2=192.168.2.2
+	mc_group=239.0.0.1
+	v4tunnel1=169.254.0.1
+	v4tunnel2=169.254.0.2
+	v6tunnel1=2001:db8::1
+	v6tunnel2=2001:db8::2
+	vni1=1
+
+	if ! kldstat -q -m if_geneve; then
+		atf_skip "This test requires if_geneve"
+	fi
+	if ! kldstat -q -m ip_mroute; then
+		atf_skip "This test requires ip_mroute"
+	fi
+
+	vnet_init
+	epair=$(vnet_mkepair)
+	vnet_mkjail genevetest1 ${epair}a
+	vnet_mkjail genevetest2 ${epair}b
+
+	ifconfig -j genevetest1 ${epair}a inet ${endpoint1}/24 up
+	ifconfig -j genevetest2 ${epair}b inet ${endpoint2}/24 up
+
+	# manually add the multicast routes to epairs
+	route -j genevetest1 add -net 239.0.0.0/8 -interface ${epair}a
+	route -j genevetest2 add -net 239.0.0.0/8 -interface ${epair}b
+
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest1 geneve1 create genevemode l2 debug \
+	    geneveid $vni1 genevelocal ${endpoint1} \
+	    genevegroup ${mc_group} genevedev ${epair}a up
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest2 geneve1 create genevemode l2 debug \
+	    geneveid $vni1 genevelocal ${endpoint2} \
+	    genevegroup ${mc_group} genevedev ${epair}b up
+
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest1 geneve1 inet ${v4tunnel1}/24
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest1 geneve1 inet6 ${v6tunnel1}
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest2 geneve1 inet ${v4tunnel2}/24
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest2 geneve1 inet6 ${v6tunnel2}
+
+	atf_check -s exit:0 -o match:"group 239.0.0.1" jexec genevetest1 ifmcstat -i ${epair}a -f inet
+	atf_check -s exit:0 -o match:"group 239.0.0.1" jexec genevetest2 ifmcstat -i ${epair}b -f inet
+
+	atf_check -s exit:0 -o ignore jexec genevetest1 ping -nc 1 -t 1 $v4tunnel2
+	atf_check -s exit:0 -o ignore jexec genevetest1 ping -nc 1 -t 1 $v6tunnel2
+	atf_check -s exit:0 -o ignore jexec genevetest2 ping -nc 1 -t 1 $v4tunnel1
+	atf_check -s exit:0 -o ignore jexec genevetest2 ping -nc 1 -t 1 $v6tunnel1
+
+}
+
+ether_ipv4_multicast_cleanup()
+{
+	vnet_cleanup
+}
+
+atf_test_case "ether_ipv6_multicast" "cleanup"
+ether_ipv6_multicast_head()
+{
+	atf_set descr 'Create a geneve(4) l2 ipv6 multicast tunnel using epair and pass traffic between jails'
+	atf_set require.user root
+}
+
+ether_ipv6_multicast_body()
+{
+	local epair geneve1 geneve2 vni1 endpoint1 endpoint2 mc_group
+        local v4tunnel1 v4tunnel2 v6tunnel1 v6tunnel2
+
+	endpoint1=3fff::1
+	endpoint2=3fff::2
+	mc_group=ff08::db8:0:1
+	v4tunnel1=169.254.0.1
+	v4tunnel2=169.254.0.2
+	v6tunnel1=2001:db8::1
+	v6tunnel2=2001:db8::2
+	vni1=1
+
+	if ! kldstat -q -m if_geneve; then
+		atf_skip "This test requires if_geneve"
+	fi
+	if ! kldstat -q -m ip6_mroute; then
+		atf_skip "This test requires ip6_mroute"
+	fi
+
+	vnet_init
+	epair=$(vnet_mkepair)
+	vnet_mkjail genevetest1 ${epair}a
+	vnet_mkjail genevetest2 ${epair}b
+
+	ifconfig -j genevetest1 ${epair}a inet6 ${endpoint1} up
+	ifconfig -j genevetest2 ${epair}b inet6 ${endpoint2} up
+
+	# manually add the multicast routes to epairs
+	route -j genevetest1 -n6 add -net ff08::db8:0:1/96 -interface ${epair}a
+	route -j genevetest2 -n6 add -net ff08::db8:0:1/96 -interface ${epair}b
+
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest1 geneve1 create genevemode l2 debug \
+	    geneveid $vni1 genevelocal ${endpoint1} \
+	    genevegroup ${mc_group} genevedev ${epair}a up
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest2 geneve1 create genevemode l2 debug \
+	    geneveid $vni1 genevelocal ${endpoint2} \
+	    genevegroup ${mc_group} genevedev ${epair}b up
+
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest1 geneve1 inet ${v4tunnel1}/24
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest1 geneve1 inet6 ${v6tunnel1}
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest2 geneve1 inet ${v4tunnel2}/24
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest2 geneve1 inet6 ${v6tunnel2}
+
+	atf_check -s exit:0 -o ignore jexec genevetest1 ping -nc 1 -t 1 $v4tunnel2
+	atf_check -s exit:0 -o ignore jexec genevetest1 ping -nc 1 -t 1 $v6tunnel2
+	atf_check -s exit:0 -o ignore jexec genevetest2 ping -nc 1 -t 1 $v4tunnel1
+	atf_check -s exit:0 -o ignore jexec genevetest2 ping -nc 1 -t 1 $v6tunnel1
+
+}
+
+ether_ipv6_multicast_cleanup()
+{
+	vnet_cleanup
+}
+
+atf_test_case "ether_ipv4_multicast_without_dev" "cleanup"
+ether_ipv4_multicast_without_dev_head()
+{
+	atf_set descr 'Create a geneve(4) l2 ipv4 multicast tunnel without specifying genevedev using epair and pass traffic between jails'
+	atf_set require.user root
+}
+
+ether_ipv4_multicast_without_dev_body()
+{
+	local epair geneve1 geneve2 vni1 endpoint1 endpoint2 mc_group
+        local v4tunnel1 v4tunnel2 v6tunnel1 v6tunnel2
+
+	endpoint1=192.168.2.1
+	endpoint2=192.168.2.2
+	mc_group=239.0.0.1
+	v4tunnel1=169.254.0.1
+	v4tunnel2=169.254.0.2
+	v6tunnel1=2001:db8::1
+	v6tunnel2=2001:db8::2
+	vni1=1
+
+	if ! kldstat -q -m if_geneve; then
+		atf_skip "This test requires if_geneve"
+	fi
+	if ! kldstat -q -m ip_mroute; then
+		atf_skip "This test requires ip_mroute"
+	fi
+
+	vnet_init
+	epair=$(vnet_mkepair)
+	vnet_mkjail genevetest1 ${epair}a
+	vnet_mkjail genevetest2 ${epair}b
+
+	ifconfig -j genevetest1 ${epair}a inet ${endpoint1}/24 up
+	ifconfig -j genevetest2 ${epair}b inet ${endpoint2}/24 up
+
+	# manually add the multicast routes to epairs
+	route -j genevetest1 add -net 239.0.0.0/8 -interface ${epair}a
+	route -j genevetest2 add -net 239.0.0.0/8 -interface ${epair}b
+
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest1 geneve1 create genevemode l2 debug \
+	    geneveid $vni1 genevelocal ${endpoint1} genevegroup ${mc_group} up
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest2 geneve1 create genevemode l2 debug \
+	    geneveid $vni1 genevelocal ${endpoint2} genevegroup ${mc_group} up
+
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest1 geneve1 inet ${v4tunnel1}/24
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest1 geneve1 inet6 ${v6tunnel1}
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest2 geneve1 inet ${v4tunnel2}/24
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest2 geneve1 inet6 ${v6tunnel2}
+
+	atf_check -s exit:0 -o match:"group 239.0.0.1" jexec genevetest1 ifmcstat -i ${epair}a -f inet
+	atf_check -s exit:0 -o match:"group 239.0.0.1" jexec genevetest2 ifmcstat -i ${epair}b -f inet
+
+	atf_check -s exit:0 -o ignore jexec genevetest1 ping -nc 1 -t 1 $v4tunnel2
+	atf_check -s exit:0 -o ignore jexec genevetest1 ping -nc 1 -t 1 $v6tunnel2
+	atf_check -s exit:0 -o ignore jexec genevetest2 ping -nc 1 -t 1 $v4tunnel1
+	atf_check -s exit:0 -o ignore jexec genevetest2 ping -nc 1 -t 1 $v6tunnel1
+
+}
+
+ether_ipv4_multicast_without_dev_cleanup()
+{
+	vnet_cleanup
+}
+
+
+atf_test_case "ether_ipv6_multicast_without_dev" "cleanup"
+ether_ipv6_multicast_without_dev_head()
+{
+	atf_set descr 'Create a geneve(4) l2 ipv6 multicast tunnel without specifying genevedev using epair and pass traffic between jails'
+	atf_set require.user root
+}
+
+ether_ipv6_multicast_without_dev_body()
+{
+	local epair geneve1 geneve2 vni1 endpoint1 endpoint2 mc_group
+        local v4tunnel1 v4tunnel2 v6tunnel1 v6tunnel2
+
+	endpoint1=3fff::1
+	endpoint2=3fff::2
+	mc_group=ff08::db8:0:1
+	v4tunnel1=169.254.0.1
+	v4tunnel2=169.254.0.2
+	v6tunnel1=2001:db8::1
+	v6tunnel2=2001:db8::2
+	vni1=1
+
+	if ! kldstat -q -m if_geneve; then
+		atf_skip "This test requires if_geneve"
+	fi
+	if ! kldstat -q -m ip6_mroute; then
+		atf_skip "This test requires ip6_mroute"
+	fi
+
+	vnet_init
+	epair=$(vnet_mkepair)
+	vnet_mkjail genevetest1 ${epair}a
+	vnet_mkjail genevetest2 ${epair}b
+
+	ifconfig -j genevetest1 ${epair}a inet6 ${endpoint1} up
+	ifconfig -j genevetest2 ${epair}b inet6 ${endpoint2} up
+
+	# manually add the multicast routes to epairs
+	route -j genevetest1 -n6 add -net ff08::db8:0:1/96 -interface ${epair}a
+	route -j genevetest2 -n6 add -net ff08::db8:0:1/96 -interface ${epair}b
+
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest1 geneve1 create genevemode l2 debug \
+	    geneveid $vni1 genevelocal ${endpoint1} genevegroup ${mc_group} up
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest2 geneve1 create genevemode l2 debug \
+	    geneveid $vni1 genevelocal ${endpoint2} genevegroup ${mc_group} up
+
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest1 geneve1 inet ${v4tunnel1}/24
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest1 geneve1 inet6 ${v6tunnel1}
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest2 geneve1 inet ${v4tunnel2}/24
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest2 geneve1 inet6 ${v6tunnel2}
+
+	atf_check -s exit:0 -o ignore jexec genevetest1 ping -nc 1 -t 1 $v4tunnel2
+	atf_check -s exit:0 -o ignore jexec genevetest1 ping -nc 1 -t 1 $v6tunnel2
+	atf_check -s exit:0 -o ignore jexec genevetest2 ping -nc 1 -t 1 $v4tunnel1
+	atf_check -s exit:0 -o ignore jexec genevetest2 ping -nc 1 -t 1 $v6tunnel1
+
+}
+
+ether_ipv6_multicast_without_dev_cleanup()
+{
+	vnet_cleanup
+}
+
+atf_test_case "inherit_ipv4_multicast" "cleanup"
+inherit_ipv4_multicast_head()
+{
+	atf_set descr 'Create a geneve(4) l3 ipv4 multicast tunnel using epair and pass traffic between jails'
+	atf_set require.user root
+}
+
+inherit_ipv4_multicast_body()
+{
+	local epair geneve1 geneve2 vni1 endpoint1 endpoint2 mc_group
+        local v4tunnel1 v4tunnel2 v6tunnel1 v6tunnel2
+
+	endpoint1=192.168.2.1
+	endpoint2=192.168.2.2
+	mc_group=239.0.0.1
+	v4tunnel1=169.254.0.1
+	v4tunnel2=169.254.0.2
+	v6tunnel1=2001:db8::1
+	v6tunnel2=2001:db8::2
+	vni1=1
+
+	if ! kldstat -q -m if_geneve; then
+		atf_skip "This test requires if_geneve"
+	fi
+	if ! kldstat -q -m ip_mroute; then
+		atf_skip "This test requires ip_mroute"
+	fi
+
+	vnet_init
+	epair=$(vnet_mkepair)
+	vnet_mkjail genevetest1 ${epair}a
+	vnet_mkjail genevetest2 ${epair}b
+
+	ifconfig -j genevetest1 ${epair}a inet ${endpoint1}/24 up
+	ifconfig -j genevetest2 ${epair}b inet ${endpoint2}/24 up
+
+	# manually add the multicast routes to epairs
+	route -j genevetest1 add -net 239.0.0.0/8 -interface ${epair}a
+	route -j genevetest2 add -net 239.0.0.0/8 -interface ${epair}b
+
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest1 geneve1 create genevemode l3 debug \
+	    geneveid $vni1 genevelocal ${endpoint1} \
+	    genevegroup ${mc_group} genevedev ${epair}a up
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest2 geneve1 create genevemode l3 debug \
+	    geneveid $vni1 genevelocal ${endpoint2} \
+	    genevegroup ${mc_group} genevedev ${epair}b up
+
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest1 geneve1 inet ${v4tunnel1}/30
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest1 geneve1 inet6 ${v6tunnel1}
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest2 geneve1 inet ${v4tunnel2}/30
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest2 geneve1 inet6 ${v6tunnel2}
+
+	atf_check -s exit:0 -o ignore sysctl -j genevetest1 net.inet.icmp.bmcastecho=1
+	atf_check -s exit:0 -o ignore sysctl -j genevetest2 net.inet.icmp.bmcastecho=1
+
+	atf_check -s exit:0 -o match:"group 239.0.0.1" jexec genevetest1 ifmcstat -i ${epair}a -f inet
+	atf_check -s exit:0 -o match:"group 239.0.0.1" jexec genevetest2 ifmcstat -i ${epair}b -f inet
+
+	atf_check -s exit:0 -o ignore jexec genevetest1 ping -nc 1 -t 1 $v4tunnel2
+	atf_check -s exit:0 -o ignore jexec genevetest2 ping -nc 1 -t 1 $v4tunnel1
+	atf_check -s exit:0 -o ignore jexec genevetest1 ping -nc 1 -t 1 $v6tunnel2
+	atf_check -s exit:0 -o ignore jexec genevetest2 ping -nc 1 -t 1 $v6tunnel1
+
+}
+
+inherit_ipv4_multicast_cleanup()
+{
+	vnet_cleanup
+}
+
+atf_test_case "inherit_ipv6_multicast" "cleanup"
+inherit_ipv6_multicast_head()
+{
+	atf_set descr 'Create a geneve(4) l3 ipv6 multicast tunnel using epair and pass traffic between jails'
+	atf_set require.user root
+}
+
+inherit_ipv6_multicast_body()
+{
+	local epair geneve1 geneve2 vni1 endpoint1 endpoint2 mc_group
+        local v4tunnel1 v4tunnel2 v6tunnel1 v6tunnel2
+
+	endpoint1=3fff::1
+	endpoint2=3fff::2
+	mc_group=ff08::db8:0:1
+	v4tunnel1=169.254.0.1
+	v4tunnel2=169.254.0.2
+	v6tunnel1=2001:db8::1
+	v6tunnel2=2001:db8::2
+	vni1=1
+
+	if ! kldstat -q -m if_geneve; then
+		atf_skip "This test requires if_geneve"
+	fi
+	if ! kldstat -q -m ip6_mroute; then
+		atf_skip "This test requires ip6_mroute"
+	fi
+
+	vnet_init
+	epair=$(vnet_mkepair)
+	vnet_mkjail genevetest1 ${epair}a
+	vnet_mkjail genevetest2 ${epair}b
+
+	ifconfig -j genevetest1 ${epair}a inet6 ${endpoint1} up
+	ifconfig -j genevetest2 ${epair}b inet6 ${endpoint2} up
+
+	# manually add the multicast routes to epairs
+	route -j genevetest1 -n6 add -net ff08::db8:0:1/96 -interface ${epair}a
+	route -j genevetest2 -n6 add -net ff08::db8:0:1/96 -interface ${epair}b
+
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest1 geneve1 create genevemode l3 debug \
+	    geneveid $vni1 genevelocal ${endpoint1} \
+	    genevegroup ${mc_group} genevedev ${epair}a up
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest2 geneve1 create genevemode l3 debug \
+	    geneveid $vni1 genevelocal ${endpoint2} \
+	    genevegroup ${mc_group} genevedev ${epair}b up
+
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest1 geneve1 inet ${v4tunnel1}/30
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest1 geneve1 inet6 ${v6tunnel1}
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest2 geneve1 inet ${v4tunnel2}/30
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest2 geneve1 inet6 ${v6tunnel2}
+
+	atf_check -s exit:0 -o ignore sysctl -j genevetest1 net.inet.icmp.bmcastecho=1
+	atf_check -s exit:0 -o ignore sysctl -j genevetest2 net.inet.icmp.bmcastecho=1
+
+	atf_check -s exit:0 -o ignore jexec genevetest1 ping -nc 1 -t 1 $v6tunnel2
+	atf_check -s exit:0 -o ignore jexec genevetest2 ping -nc 1 -t 1 $v6tunnel1
+	atf_check -s exit:0 -o ignore jexec genevetest1 ping -nc 1 -t 1 $v4tunnel2
+	atf_check -s exit:0 -o ignore jexec genevetest2 ping -nc 1 -t 1 $v4tunnel1
+
+}
+
+inherit_ipv6_multicast_cleanup()
+{
+	vnet_cleanup
+}
+
+atf_test_case "inherit_ipv4_multicast_without_dev" "cleanup"
+inherit_ipv4_multicast_without_dev_head()
+{
+	atf_set descr 'Create a geneve(4) l3 ipv4 multicast tunnel without specifying genevedev using epair and pass traffic between jails'
+	atf_set require.user root
+}
+
+inherit_ipv4_multicast_without_dev_body()
+{
+	local epair geneve1 geneve2 vni1 endpoint1 endpoint2 mc_group
+        local v4tunnel1 v4tunnel2 v6tunnel1 v6tunnel2
+
+	endpoint1=192.168.2.1
+	endpoint2=192.168.2.2
+	mc_group=239.0.0.1
+	v4tunnel1=169.254.0.1
+	v4tunnel2=169.254.0.2
+	v6tunnel1=2001:db8::1
+	v6tunnel2=2001:db8::2
+	vni1=1
+
+	if ! kldstat -q -m if_geneve; then
+		atf_skip "This test requires if_geneve"
+	fi
+	if ! kldstat -q -m ip_mroute; then
+		atf_skip "This test requires ip_mroute"
+	fi
+
+	vnet_init
+	epair=$(vnet_mkepair)
+	vnet_mkjail genevetest1 ${epair}a
+	vnet_mkjail genevetest2 ${epair}b
+
+	ifconfig -j genevetest1 ${epair}a inet ${endpoint1}/24 up
+	ifconfig -j genevetest2 ${epair}b inet ${endpoint2}/24 up
+
+	# manually add the multicast routes to epairs
+	route -j genevetest1 add -net 239.0.0.0/8 -interface ${epair}a
+	route -j genevetest2 add -net 239.0.0.0/8 -interface ${epair}b
+
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest1 geneve1 create genevemode l3 debug \
+	    geneveid $vni1 genevelocal ${endpoint1} genevegroup ${mc_group} up
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest2 geneve1 create genevemode l3 debug \
+	    geneveid $vni1 genevelocal ${endpoint2} genevegroup ${mc_group} up
+
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest1 geneve1 inet ${v4tunnel1}/30
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest1 geneve1 inet6 ${v6tunnel1}
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest2 geneve1 inet ${v4tunnel2}/30
+	atf_check -s exit:0 -o ignore \
+	    ifconfig -j genevetest2 geneve1 inet6 ${v6tunnel2}
+
+	atf_check -s exit:0 -o ignore sysctl -j genevetest1 net.inet.icmp.bmcastecho=1
+	atf_check -s exit:0 -o ignore sysctl -j genevetest2 net.inet.icmp.bmcastecho=1
+
+	atf_check -s exit:0 -o match:"group 239.0.0.1" jexec genevetest1 ifmcstat -i ${epair}a -f inet
+	atf_check -s exit:0 -o match:"group 239.0.0.1" jexec genevetest2 ifmcstat -i ${epair}b -f inet
+
+	atf_check -s exit:0 -o ignore jexec genevetest1 ping -nc 1 -t 1 $v4tunnel2
+	atf_check -s exit:0 -o ignore jexec genevetest2 ping -nc 1 -t 1 $v4tunnel1
+	atf_check -s exit:0 -o ignore jexec genevetest1 ping -nc 1 -t 1 $v6tunnel2
+	atf_check -s exit:0 -o ignore jexec genevetest2 ping -nc 1 -t 1 $v6tunnel1
+
+}
+
+inherit_ipv4_multicast_without_dev_cleanup()
+{
+	vnet_cleanup
+}
+
+
+atf_test_case "inherit_ipv6_multicast_without_dev" "cleanup"
+inherit_ipv6_multicast_without_dev_head()
+{
+	atf_set descr 'Create a geneve(4) l3 ipv6 multicast tunnel without specifying genevedev using epair and pass traffic between jails'
+	atf_set require.user root
+}
+
+inherit_ipv6_multicast_without_dev_body()
+{
+	local epair geneve1 geneve2 vni1 endpoint1 endpoint2 mc_group
+        local v4tunnel1 v4tunnel2 v6tunnel1 v6tunnel2
+
+	endpoint1=3fff::1
+	endpoint2=3fff::2
+	mc_group=ff08::db8:0:1
+	v4tunnel1=169.254.0.1
+	v4tunnel2=169.254.0.2
+	v6tunnel1=2001:db8::1
+	v6tunnel2=2001:db8::2
+	vni1=1
+
+	if ! kldstat -q -m if_geneve; then
+		atf_skip "This test requires if_geneve"
+	fi
*** 65 LINES SKIPPED ***