aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobin H. Johnson <robbat2@gentoo.org>2011-02-21 09:41:48 +0000
committerRobin H. Johnson <robbat2@gentoo.org>2011-02-21 09:41:48 +0000
commit683a21b0a0e52ad756366a9527f509761214e971 (patch)
tree38035e1094a773b1aec692f94e77eec890d8461c
parentb512d0db98b73bfe2bbeac84c19db039dc256c4f (diff)
net/vlan: update to use modern iproute2 interface
This replaces the vlan setup code that previously used the old vconfig binary with a new implementation using the iproute2 interface. vconfig does not handle many of the newer setups. No automatic migration path is provided, as altering the configuration is non-trivial. Signed-off-by: Robin H. Johnson <robbat2@gentoo.org> Written-by: Guillaume Castagnino <casta@xwing.info> X-Gentoo-Bug: 346365
-rw-r--r--doc/net.example.Linux.in21
-rw-r--r--net/vlan.sh58
2 files changed, 44 insertions, 35 deletions
diff --git a/doc/net.example.Linux.in b/doc/net.example.Linux.in
index 2d1a7dc5..d3b97c5e 100644
--- a/doc/net.example.Linux.in
+++ b/doc/net.example.Linux.in
@@ -527,7 +527,8 @@
#-----------------------------------------------------------------------------
# VLAN (802.1q support)
-# For VLAN support, emerge net-misc/vconfig
+# For VLAN support, emerge sys-apps/iproute2
+# The old vconfig based VLAN support is no longer available.
# Specify the VLAN numbers for the interface like so
# Please ensure your VLAN IDs are NOT zero-padded
@@ -537,10 +538,17 @@
# need it up.
#config_eth0="null"
-# You can also configure the VLAN - see for vconfig man page for more details
-#vconfig_eth0="set_name_type VLAN_PLUS_VID_NO_PAD"
-#vconfig_vlan1="set_flag 1
-#set_egress_map 2 6"
+# You can also configure the VLAN - see for ip man page for more details
+# To change the vlan interface name. If not set, the standard "iface.vlanid"
+# will be used
+#vlan1_name="vlan1"
+#vlan2_name="eth0.2"
+# Set the vlan flags
+#vlan1_flags="reorder_hdr off gvrp on loose_binding on"
+# Configure in/egress maps
+#vlan1_ingress="2:6 3:5"
+#vlan1_egress="1:2"
+
#config_vlan1="172.16.3.1/23"
#config_vlan2="172.16.2.1/23"
@@ -553,8 +561,7 @@
# This means you do not need to create init scripts in /etc/init.d for each
# vlan, you must need to create one for the physical interface.
# If you wish to control the configuration of each vlan through a separate
-# script, or wish to rename the vlan interface to something that vconfig
-# cannot then you need to do this.
+# script then you need to do this.
#vlan_start_eth0="no"
# If you do the above then you may want to depend on eth0 like so
diff --git a/net/vlan.sh b/net/vlan.sh
index 5cd49570..1d50d4fd 100644
--- a/net/vlan.sh
+++ b/net/vlan.sh
@@ -1,9 +1,18 @@
# Copyright (c) 2007-2008 Roy Marples <roy@marples.name>
# All rights reserved. Released under the 2-clause BSD license.
+_ip()
+{
+ if [ -x /bin/ip ]; then
+ echo /bin/ip
+ else
+ echo /sbin/ip
+ fi
+}
+
vlan_depend()
{
- program /sbin/vconfig
+ program $(_ip)
after interface
before dhcp
}
@@ -36,31 +45,12 @@ _check_vlan()
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}"
+ local vconfig
+ eval vconfig=\$vconfig_${IFVAR}
+ if [ -n "${vconfig}" ]; then
+ eerror "You must convert your vconfig_ VLAN entries to vlan${N} entries."
return 1
- done
+ fi
}
vlan_post_start()
@@ -72,10 +62,22 @@ vlan_post_start()
_check_vlan || return 1
_exists || return 1
- local vlan= e= s=
+ local vlan= e= s= vname= vflags= vingress= vegress=
for vlan in ${vlans}; do
einfo "Adding VLAN ${vlan} to ${IFACE}"
- e="$(vconfig add "${IFACE}" "${vlan}" 2>&1 1>/dev/null)"
+ # We need to gather all interface configuration options
+ # 1) naming. Default to the standard "${IFACE}.${vlan}" but it can be anything
+ eval vname=\$vlan${vlan}_name
+ [ -z "${vname}" ] && vname="${IFACE}.${vlan}"
+ # 2) flags
+ eval vflags=\$vlan${vlan}_flags
+ # 3) ingress/egress map
+ eval vingress=\$vlan${vlan}_ingress
+ [ -z "${vingress}" ] || vingress="ingress-qos-map ${vingress}"
+ eval vegress=\$vlan${vlan}_egress
+ [ -z "${vegress}" ] || vegress="egress-qos-map ${vegress}"
+
+ e="$(ip link add link "${IFACE}" name "${vname}" type vlan id "${vlan}" ${vflags} ${vingress} ${vegress} 2>&1 1>/dev/null)"
if [ -n "${e}" ]; then
eend 1 "${e}"
continue
@@ -110,7 +112,7 @@ vlan_post_stop()
stop
) && {
mark_service_stopped "net.${vlan}"
- vconfig rem "${vlan}" >/dev/null
+ ip link delete "${vlan}" type vlan >/dev/null
}
done