summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'net.Linux/vlan.sh')
-rw-r--r--net.Linux/vlan.sh108
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 :