From 683a21b0a0e52ad756366a9527f509761214e971 Mon Sep 17 00:00:00 2001 From: "Robin H. Johnson" Date: Mon, 21 Feb 2011 09:41:48 +0000 Subject: [PATCH] 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 Written-by: Guillaume Castagnino X-Gentoo-Bug: 346365 --- doc/net.example.Linux.in | 21 ++++++++++----- net/vlan.sh | 58 +++++++++++++++++++++------------------- 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 # 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