Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/tests/sys/common/vnet.subr
39483 views
# VNET/jail utility functions
##

list_interface()
{
	echo $1 >> created_interfaces.lst
}

unlist_interface()
{
	sed -i "" /^$1\$/d created_interfaces.lst
}

_vnet_check_req()
{
	type=$1

	if kldstat -q -n if_${type}.ko; then
		return
	fi

	if ! kldload -n -q if_${type}; then
		atf_skip "if_${type}.ko is required to run this test."
		return
	fi
}

vnet_init()
{
	if [ "`sysctl -i -n kern.features.vimage`" != 1 ]; then
		atf_skip "This test requires VIMAGE"
	fi

	# Check if we can create if_epair or if_bridge interfaces.
	# We may be running in a jail already, unable to load modules.
	# If so, skip this test because it very likely (but not certainly)
	# wants at least one of those
	_vnet_check_req epair
	_vnet_check_req bridge
}

vnet_mkepair()
{
	ifname=$(ifconfig epair create)
	# When transmit checksum offloading is enabled, if_epair does not
	# compute checksums, it just marks packets that this computation still
	# needs to be done. However, some test cases verify the checksum.
	# Therefore disable this for IPv4 and IPv6.
	ifconfig ${ifname} -txcsum -txcsum6
	list_interface $ifname
	list_interface ${ifname%a}b
	echo ${ifname%a}
}

vnet_init_bridge()
{
	if ! kldstat -q -m if_bridge; then
		atf_skip "This test requires if_bridge"
	fi
}

vnet_mkbridge()
{
	ifname=$(ifconfig bridge create)
	list_interface $ifname
	echo ${ifname}
}

vnet_mkvlan()
{
	ifname=$(ifconfig vlan create)
	list_interface $ifname
	echo ${ifname}
}

vnet_mkloopback()
{
	ifname=$(ifconfig lo create)
	list_interface $ifname
	echo ${ifname}
}

vnet_mkjail()
{
	jailname=$1
	shift

	vnet_interfaces=
	for ifname in $@
	do
		vnet_interfaces="${vnet_interfaces} vnet.interface=${ifname}"
		unlist_interface $ifname
	done
	jail -c name=${jailname} persist vnet ${vnet_interfaces}

	echo $jailname $@ >> created_jails.lst
}

vnet_ifmove()
{
	ifname=$1
	jailname=$2

	ifconfig ${ifname} vnet ${jailname}
	unlist_interface $ifname
	sed -i "" "/^${jailname}/s/\$/ ${ifname}/" created_jails.lst
}

vnet_ifrename_jail()
{
	jailname=$1
	ifname=$2
	ifnewname=$3

	ifconfig -j ${jailname} $ifname name $ifnewname
	sed -i "" "/^${jailname}/s/${ifname}/${ifnewname}/" created_jails.lst
}

vnet_cleanup()
{
	if [ -f created_jails.lst ]; then
		while read jailname ifnames; do
			for ifname in ${ifnames}; do
				ifconfig -j ${jailname} ${ifname} destroy
			done
			jail -r ${jailname}
		done < created_jails.lst
		rm created_jails.lst
	fi

	if [ -f created_interfaces.lst ]; then
		while read ifname; do
			ifconfig ${ifname} destroy
		done < created_interfaces.lst
		rm created_interfaces.lst
	fi
}