From ccf238f852fd0463e68d33b91f0dd55000c325e3 Mon Sep 17 00:00:00 2001 From: Roy Marples Date: Wed, 26 Mar 2008 14:18:01 +0000 Subject: Merge net.OS into net --- net/vlan.sh | 118 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 net/vlan.sh (limited to 'net/vlan.sh') diff --git a/net/vlan.sh b/net/vlan.sh new file mode 100644 index 0000000..7d77aae --- /dev/null +++ b/net/vlan.sh @@ -0,0 +1,118 @@ +# Copyright 2007-2008 Roy Marples +# All rights reserved. Released under the 2-clause BSD license. + +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() +{ + local vc="$(_get_array "vconfig_${IFVAR}")" + [ -z "${vc}" ] && return 0 + + _check_vlan || return 1 + _exists || return 1 + + local v= x= e= + local IFS="$__IFS" + for v in ${vc}; do + unset IFS + case "${v}" in + set_name_type" "*) x=${v};; + *) + set -- ${v} + x="$1 ${IFACE}" + shift + x="${x} $@" + ;; + esac + + e="$(vconfig ${x} 2>&1 1>/dev/null)" + [ -z "${e}" ] && continue + eerror "${e}" + return 1 + done +} + +vlan_post_start() +{ + local vlans= + eval vlans=\$vlans_${IFACE} + [ -z "${vlans}" ] && return 0 + + _check_vlan || return 1 + _exists || return 1 + + local vlan= e= s= + for vlan in ${vlans}; 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} + yesno ${s:-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 RC_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 RC_SVCNAME="net.${vlan}" + stop + ) && { + mark_service_stopped "net.${vlan}" + vconfig rem "${vlan}" >/dev/null + } + done + + return 0 +} -- cgit v1.2.3