110 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			110 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
# Copyright 2004-2007 Gentoo Foundation
 | 
						|
# Distributed under the terms of the GNU General Public License v2
 | 
						|
 | 
						|
vlan_depend() {
 | 
						|
	program /sbin/vconfig
 | 
						|
	after interface
 | 
						|
	before dhcp
 | 
						|
}
 | 
						|
 | 
						|
_config_vars="$_config_vars vlans"
 | 
						|
 | 
						|
_is_vlan() {
 | 
						|
	[ ! -d /proc/net/vlan ] && return 1
 | 
						|
	[ -e /proc/net/vlan/"${IFACE}" ] && return 0
 | 
						|
	grep -Eq "^${IFACE}[[:space:]]+" /proc/net/vlan/config
 | 
						|
}
 | 
						|
 | 
						|
_get_vlans() {
 | 
						|
	[ -e /proc/net/vlan/config ] || return 1
 | 
						|
	sed -n -e 's/^\(.*[0-9]\) \(.* \) .*'"${IFACE}"'$/\1/p' /proc/net/vlan/config
 | 
						|
}
 | 
						|
 | 
						|
_check_vlan() {
 | 
						|
	if [ ! -d /proc/net/vlan ] ; then
 | 
						|
		modprobe 8021q
 | 
						|
		if [ ! -d /proc/net/vlan ] ; then
 | 
						|
			eerror "VLAN (802.1q) support is not present in this kernel"
 | 
						|
			return 1
 | 
						|
		fi
 | 
						|
	fi
 | 
						|
}
 | 
						|
 | 
						|
vlan_pre_start() {
 | 
						|
	eval $(_get_array "vconfig_${IFVAR}")
 | 
						|
	[ $# = "0" ] && return 0
 | 
						|
 | 
						|
	_check_vlan || return 1
 | 
						|
	_exists || return 1
 | 
						|
 | 
						|
	local v= x= e=
 | 
						|
	for v in "$@" ; do
 | 
						|
		case "${v}" in
 | 
						|
			set_name_type" "*) x=${v} ;;
 | 
						|
			*) x="$(echo "${v}" | sed -e "s/ / ${IFACE} /g")"
 | 
						|
			   [ "${x}" = "${v}" ] && x="${x} ${IFACE}"
 | 
						|
			   ;;
 | 
						|
		esac
 | 
						|
 | 
						|
		set -x
 | 
						|
		e="$(vconfig ${x} 2>&1 1>/dev/null)"
 | 
						|
		set +x
 | 
						|
		[ -z "${e}" ] && continue
 | 
						|
		eerror "${e}"
 | 
						|
		return 1
 | 
						|
	done
 | 
						|
}
 | 
						|
 | 
						|
vlan_post_start() {
 | 
						|
	eval $(_get_array "vlans_${IFVAR}")
 | 
						|
	[ $# = "0" ] && return 0
 | 
						|
	
 | 
						|
	_check_vlan || return 1
 | 
						|
	_exists || return 1
 | 
						|
 | 
						|
	local vlan= e= s=
 | 
						|
	for vlan in "$@" ; do
 | 
						|
		einfo "Adding VLAN ${vlan} to ${IFACE}"
 | 
						|
		e="$(vconfig add "${IFACE}" "${vlan}" 2>&1 1>/dev/null)"
 | 
						|
		if [ -n "${e}" ] ; then
 | 
						|
			eend 1 "${e}"
 | 
						|
			continue
 | 
						|
		fi
 | 
						|
 | 
						|
		# We may not want to start the vlan ourselves
 | 
						|
		eval s=\$vlan_start_${IFVAR}
 | 
						|
		[ "${s:-yes}" != "yes" ] && continue
 | 
						|
 | 
						|
		# We need to work out the interface name of our new vlan id
 | 
						|
		local ifname="$( \
 | 
						|
			sed -n -e 's/^\([^[:space:]]*\) *| '"${vlan}"' *| .*'"${iface}"'$/\1/p' \
 | 
						|
			/proc/net/vlan/config )"
 | 
						|
		mark_service_started "net.${ifname}"
 | 
						|
		(
 | 
						|
			export SVCNAME="net.${ifname}"
 | 
						|
			start	
 | 
						|
		) || mark_service_stopped "net.${ifname}"
 | 
						|
	done
 | 
						|
	
 | 
						|
	return 0
 | 
						|
}
 | 
						|
 | 
						|
vlan_post_stop() {
 | 
						|
	local vlan=
 | 
						|
 | 
						|
	for vlan in $(_get_vlans) ; do
 | 
						|
		einfo "Removing VLAN ${vlan##*.} from ${IFACE}"
 | 
						|
		(
 | 
						|
			export SVCNAME="net.${vlan}"
 | 
						|
			stop
 | 
						|
		) && {
 | 
						|
			mark_service_stopped "net.${vlan}"
 | 
						|
			vconfig rem "${vlan}" >/dev/null
 | 
						|
		}
 | 
						|
	done
 | 
						|
 | 
						|
	return 0
 | 
						|
}
 | 
						|
 | 
						|
# vim: set ts=4 :
 |