#!/usr/bin/openrc-run

. /opt/etc/functions.openrc

description="Creating vlans"

# Note: extra commands are mostly for debug purposes.
extra_commands="create destroy reload"

depend()
{
	echo "  ${SVCNAME}::depend(): rc_need=\"${rc_need}\""
	provide ${SVCNAME}
}

# Descriptions for vlans are similar to ones for bridges and bonds:
#
# nameXXX(eth1[,eth2[,...]])[=IPv4/Bits][;MTUbytes]
#
# Differencies:
#   - 'name' should be 'vlan', 'XXX' should be valid VLAN ID;
#   - no actions performed if interface list is empty.
#	- mtu field is currently ignored.
#
# Example of valid list (pay attention: no spaces in single desc!):
# HOST_LINKS=" \
#	vlan5(eth1,eth2,eth3) \
#	vlan20(eth8)=10.0.1.2/24 \
#	vlan50(eth6,eth7) \
#	vlan50(eth9) \
#	"

vlan_create()
{
	local _id _vlan _name=$2 _ipmask=$3 _mtu=$4 _eth _rv=0
	shift; shift; shift; shift
	for _eth in $@; do
		_id=$(echo ${_name} | sed -e 's/^vlan//')
		_vlan=${_eth}.${_id}
		ip link set down dev ${_eth} || _rv=1
		ip link show ${_vlan} > /dev/null 2>&1 && ip link del ${_vlan}
		ip link add link ${_eth} name ${_vlan} type vlan id ${_id} || _rv=1
		[ "${_ipmask}" = "ignore" ] || ip addr add ${_ipmask} dev ${_vlan} || _rv=1
		ip link set up dev ${_eth} || _rv=1
		ip link set up dev ${_vlan} || _rv=1
	done
	return ${_rv}
}

vlan_destroy()
{
	local _id _vlan _name=$2 _ipmask=$3 _mtu=$4 _eth _rv=0
	shift; shift; shift; shift
	for _eth in $@; do
		_id=$(echo ${_name} | sed -e 's/^vlan//')
		_vlan=${_eth}.${_id}
		if ip link show dev ${_vlan} > /dev/null 2>&1; then
			ip link set down dev ${_vlan}
			ip link del ${_vlan}
		fi
	done
	return 0
}

create()
{
	local _ltype
	for_all_links vlan_create unused_arg ${HOST_LINKS}
}

destroy()
{
	for_all_links vlan_destroy unused_arg ${HOST_LINKS}
}

reload()
{
	destroy
	create
}

start()
{
	local _rv
	ebegin "Starting \"${SVCNAME}\""
	eindent
	create
	_rv=$?
	eoutdent
	eend ${_rv}
	return ${_rv}
}

stop()
{
	ebegin "Stopping service \"${SVCNAME}\""
	destroy
	eend 0
	return 0
}
