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
This commit is contained in:
Robin H. Johnson 2011-02-21 09:41:48 +00:00
parent b512d0db98
commit 683a21b0a0
2 changed files with 44 additions and 35 deletions

View File

@ -527,7 +527,8 @@
#----------------------------------------------------------------------------- #-----------------------------------------------------------------------------
# VLAN (802.1q support) # 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 # Specify the VLAN numbers for the interface like so
# Please ensure your VLAN IDs are NOT zero-padded # Please ensure your VLAN IDs are NOT zero-padded
@ -537,10 +538,17 @@
# need it up. # need it up.
#config_eth0="null" #config_eth0="null"
# You can also configure the VLAN - see for vconfig man page for more details # You can also configure the VLAN - see for ip man page for more details
#vconfig_eth0="set_name_type VLAN_PLUS_VID_NO_PAD" # To change the vlan interface name. If not set, the standard "iface.vlanid"
#vconfig_vlan1="set_flag 1 # will be used
#set_egress_map 2 6" #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_vlan1="172.16.3.1/23"
#config_vlan2="172.16.2.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 # 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. # vlan, you must need to create one for the physical interface.
# If you wish to control the configuration of each vlan through a separate # 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 # script then you need to do this.
# cannot then you need to do this.
#vlan_start_eth0="no" #vlan_start_eth0="no"
# If you do the above then you may want to depend on eth0 like so # If you do the above then you may want to depend on eth0 like so

View File

@ -1,9 +1,18 @@
# Copyright (c) 2007-2008 Roy Marples <roy@marples.name> # Copyright (c) 2007-2008 Roy Marples <roy@marples.name>
# All rights reserved. Released under the 2-clause BSD license. # 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() vlan_depend()
{ {
program /sbin/vconfig program $(_ip)
after interface after interface
before dhcp before dhcp
} }
@ -36,31 +45,12 @@ _check_vlan()
vlan_pre_start() vlan_pre_start()
{ {
local vc="$(_get_array "vconfig_${IFVAR}")" local vconfig
[ -z "${vc}" ] && return 0 eval vconfig=\$vconfig_${IFVAR}
if [ -n "${vconfig}" ]; then
_check_vlan || return 1 eerror "You must convert your vconfig_ VLAN entries to vlan${N} entries."
_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 return 1
done fi
} }
vlan_post_start() vlan_post_start()
@ -72,10 +62,22 @@ vlan_post_start()
_check_vlan || return 1 _check_vlan || return 1
_exists || return 1 _exists || return 1
local vlan= e= s= local vlan= e= s= vname= vflags= vingress= vegress=
for vlan in ${vlans}; do for vlan in ${vlans}; do
einfo "Adding VLAN ${vlan} to ${IFACE}" 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 if [ -n "${e}" ]; then
eend 1 "${e}" eend 1 "${e}"
continue continue
@ -110,7 +112,7 @@ vlan_post_stop()
stop stop
) && { ) && {
mark_service_stopped "net.${vlan}" mark_service_stopped "net.${vlan}"
vconfig rem "${vlan}" >/dev/null ip link delete "${vlan}" type vlan >/dev/null
} }
done done