diff options
Diffstat (limited to 'net.Linux/vlan.sh')
-rw-r--r-- | net.Linux/vlan.sh | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/net.Linux/vlan.sh b/net.Linux/vlan.sh new file mode 100644 index 00000000..fef4f2c5 --- /dev/null +++ b/net.Linux/vlan.sh @@ -0,0 +1,108 @@ +# 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 + grep -q "^${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/^\([^ \t]*\) *| '"${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 : |