From: Cong Wang <xiyou.wangcong@xxxxxxxxx> This patch adds basic vlan support in network module. The cmdline syntax for vlan is: vlan=<vlanname>[:<phydevice>] for an example: vlan=eth0.2:eth0 or vlan=eth0.2 This is just the basic syntax, vlan has other styles of naming, like "vlan2". We need to extend the syntax in the future, this patch is just a starter. ;-) TODO: Add doc for vlan= cmdline Any comments? Cc: Dave Young <dyoung@xxxxxxxxxx> Cc: Harald Hoyer <harald@xxxxxxxxxx> Signed-off-by: Cong Wang <xiyou.wangcong@xxxxxxxxx> --- modules.d/40network/ifup.sh | 18 +++++++++++++ modules.d/40network/module-setup.sh | 5 +++- modules.d/40network/net-genrules.sh | 5 ++++ modules.d/40network/parse-vlan.sh | 46 +++++++++++++++++++++++++++++++++++ 4 files changed, 73 insertions(+), 1 deletions(-) create mode 100644 modules.d/40network/parse-vlan.sh diff --git a/modules.d/40network/ifup.sh b/modules.d/40network/ifup.sh index 71b869d..aab0dfc 100755 --- a/modules.d/40network/ifup.sh +++ b/modules.d/40network/ifup.sh @@ -40,6 +40,17 @@ if [ -e /tmp/bridge.info ]; then fi fi +if [ -e /tmp/vlan.info ]; then + . /tmp/vlan.info + if [ "$netif" = "$phydevice" ]; then + if [ "$netif" = "$bondname" ] && [ -n "$DO_BOND_SETUP" ] ; then + : # We need to really setup bond (recursive call) + else + netif="$vlanname" + fi + fi +fi + # disable manual ifup while netroot is set for simplifying our logic # in netroot case we prefer netroot to bringup $netif automaticlly [ -n "$2" -a "$2" = "-m" ] && [ -z "$netroot" ] && manualup="$2" @@ -178,6 +189,13 @@ if [ "$netif" = "$bridgename" ] && [ ! -e /tmp/net.$bridgename.up ]; then brctl addif $bridgename $ethname fi +if [ "$netif" = "$vlanname" ] && [ ! -e /tmp/net.$vlanname.up ]; then + modprobe 8021q + ip link set "$phydevice" up + wait_for_if_up "$phydevice" + vconfig add "$phydevice" "${vlanname##*.}" +fi + # No ip lines default to dhcp ip=$(getarg ip) diff --git a/modules.d/40network/module-setup.sh b/modules.d/40network/module-setup.sh index d49b594..07cdc7f 100755 --- a/modules.d/40network/module-setup.sh +++ b/modules.d/40network/module-setup.sh @@ -68,12 +68,14 @@ installkernel() { instmods ipv6 # bonding instmods bonding + # vlan + instmods 8021q } install() { local _arch _i _dir dracut_install ip arping tr dhclient - dracut_install -o brctl ifenslave + dracut_install -o brctl ifenslave vconfig inst "$moddir/ifup.sh" "/sbin/ifup" inst "$moddir/netroot.sh" "/sbin/netroot" inst "$moddir/dhclient-script.sh" "/sbin/dhclient-script" @@ -82,6 +84,7 @@ install() { inst_hook pre-udev 50 "$moddir/ifname-genrules.sh" inst_hook pre-udev 60 "$moddir/net-genrules.sh" inst_hook cmdline 91 "$moddir/dhcp-root.sh" + inst_hook cmdline 95 "$moddir/parse-vlan.sh" inst_hook cmdline 96 "$moddir/parse-bond.sh" inst_hook cmdline 97 "$moddir/parse-bridge.sh" inst_hook cmdline 98 "$moddir/parse-ip-opts.sh" diff --git a/modules.d/40network/net-genrules.sh b/modules.d/40network/net-genrules.sh index 7176681..142634e 100755 --- a/modules.d/40network/net-genrules.sh +++ b/modules.d/40network/net-genrules.sh @@ -31,6 +31,11 @@ fix_bootif() { IFACES=${bondslaves%% *} fi + if [ -e /tmp/vlan.info ]; then + . /tmp/vlan.info + IFACES=$phydevice + fi + ifup='/sbin/ifup $env{INTERFACE}' [ -z "$netroot" ] && ifup="$ifup -m" diff --git a/modules.d/40network/parse-vlan.sh b/modules.d/40network/parse-vlan.sh new file mode 100644 index 0000000..efe7bfa --- /dev/null +++ b/modules.d/40network/parse-vlan.sh @@ -0,0 +1,46 @@ +#!/bin/sh +# +# Format: +# vlan=<vlanname>[:<phydevice>] +# + +# return if vlan already parsed +[ -n "$vlanname" ] && return + +# Check if vlan parameter is valid +if getarg vlan= >/dev/null ; then + if [ -z "$netroot" ] ; then + die "No netboot configured, vlan is invalid" + fi + command -v vconfig >/dev/null 2>&1 || die "No 'vconfig' installed" +fi + +parsevlan() { + local v=${1}: + set -- + while [ -n "$v" ]; do + set -- "$@" "${v%%:*}" + v=${v#*:} + done + + unset vlanname phydevice + case $# in + 1) vlanname=$1; phydevice="${1%.*}" ;; + 2) vlanname=$1; phydevice=$2 ;; + *) die "vlan= requires one or two parameters" ;; + esac +} + +unset vlanname phydevice + +if getarg vlan >/dev/null; then + # Read vlan= parameters if they exist + vlan="$(getarg vlan=)" + if [ ! "$vlan" = "vlan" ]; then + parsevlan "$(getarg vlan=)" + fi + + echo "vlanname=\"$vlanname\"" > /tmp/vlan.info + echo "phydevice=\"$phydevice\"" >> /tmp/vlan.info + return +fi -- 1.7.7.6 -- To unsubscribe from this list: send the line "unsubscribe initramfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html