# 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 :