]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/commitdiff
udev: Add hotplugging for VLAN devices
authorMichael Tremer <michael.tremer@ipfire.org>
Sun, 2 Aug 2015 21:18:33 +0000 (22:18 +0100)
committerMichael Tremer <michael.tremer@ipfire.org>
Wed, 5 Aug 2015 11:43:08 +0000 (12:43 +0100)
The VLAN devices will now automatically be created after
a parent device has been added.

Mainly this will resolve a race-condition between udev
initialising the network adapters and sysvinit running
scripts that will do the initialisation of the VLAN.

Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
config/rootfiles/common/udev
config/udev/60-net.rules
config/udev/network-hotplug-vlan [new file with mode: 0644]
lfs/udev

index d01c4610158f05d6da4b1febd2f1ac5b1e6ee772..4d519544d96d5e3dde75d5cb73020fd7473ff22f 100644 (file)
@@ -29,6 +29,7 @@ lib/udev
 #lib/udev/init-net-rules.sh
 #lib/udev/mtd_probe
 #lib/udev/network-hotplug-rename
+#lib/udev/network-hotplug-vlan
 #lib/udev/rule_generator.functions
 #lib/udev/rules.d
 #lib/udev/rules.d/25-alsa.rules
index 4f22a1e306ee105561c389fb1ded8c042275d69f..dc39ff09b3c6440ef314cf0a8d11fb9460e3cc19 100644 (file)
@@ -1,3 +1,7 @@
 # Call a script that checks for the right name of the new device.
 # If it matches the configuration it will be renamed accordingly.
 ACTION=="add", SUBSYSTEM=="net", PROGRAM="/lib/udev/network-hotplug-rename", RESULT=="?*", NAME="$result"
+
+# Call a script that will create all virtual devices for a parent device
+# that has just come up.
+ACTION=="add", SUBSYSTEM=="net", PROGRAM="/lib/udev/network-hotplug-vlan"
diff --git a/config/udev/network-hotplug-vlan b/config/udev/network-hotplug-vlan
new file mode 100644 (file)
index 0000000..f7b6a9d
--- /dev/null
@@ -0,0 +1,87 @@
+#!/bin/bash
+############################################################################
+#                                                                          #
+# This file is part of the IPFire Firewall.                                #
+#                                                                          #
+# IPFire is free software; you can redistribute it and/or modify           #
+# it under the terms of the GNU General Public License as published by     #
+# the Free Software Foundation; either version 2 of the License, or        #
+# (at your option) any later version.                                      #
+#                                                                          #
+# IPFire is distributed in the hope that it will be useful,                #
+# but WITHOUT ANY WARRANTY; without even the implied warranty of           #
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the            #
+# GNU General Public License for more details.                             #
+#                                                                          #
+# You should have received a copy of the GNU General Public License        #
+# along with IPFire; if not, write to the Free Software                    #
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA #
+#                                                                          #
+# Copyright (C) 2015 IPFire Team <info@ipfire.org>                         #
+#                                                                          #
+############################################################################
+
+[ -n "${INTERFACE}" ] || exit 2
+
+CONFIG_FILE="/var/ipfire/ethernet/vlans"
+
+# Skip immediately if no configuration file has been found.
+[ -e "${CONFIG_FILE}" ] || exit 0
+
+eval $(/usr/local/bin/readhash ${CONFIG_FILE})
+
+for interface in green0 red0 blue0 orange0; do
+       case "${interface}" in
+               green*)
+                       PARENT_DEV=${GREEN_PARENT_DEV}
+                       VLAN_ID=${GREEN_VLAN_ID}
+                       MAC_ADDRESS=${GREEN_MAC_ADDRESS}
+                       ;;
+               red*)
+                       PARENT_DEV=${RED_PARENT_DEV}
+                       VLAN_ID=${RED_VLAN_ID}
+                       MAC_ADDRESS=${RED_MAC_ADDRESS}
+                       ;;
+               blue*)
+                       PARENT_DEV=${BLUE_PARENT_DEV}
+                       VLAN_ID=${BLUE_VLAN_ID}
+                       MAC_ADDRESS=${BLUE_MAC_ADDRESS}
+                       ;;
+               orange*)
+                       PARENT_DEV=${ORANGE_PARENT_DEV}
+                       VLAN_ID=${ORANGE_VLAN_ID}
+                       MAC_ADDRESS=${ORANGE_MAC_ADDRESS}
+                       ;;
+       esac
+
+       # If the parent device does not match the interface that
+       # has just come up, we will go on for the next one.
+       [ "${PARENT_DEV}" = "${INTERFACE}" ] || continue
+
+       # Check if the interface does already exists.
+       # If so, we skip creating it.
+       if [ -d "/sys/class/net/${interface}" ]; then
+               echo "Interface ${interface} already exists." >&2
+               continue
+       fi
+
+       if [ -z "${VLAN_ID}" ]; then
+               echo "${interface}: You did not set the VLAN ID." >&2
+               continue
+       fi
+
+       # Build command line.
+       command="ip link add link ${PARENT_DEV} name ${interface}"
+       if [ -n "${MAC_ADDRESS}" ]; then
+               command="${command} address ${MAC_ADDRESS}"
+       fi
+       command="${command} type vlan id ${VLAN_ID}"
+
+       echo "Creating VLAN interface ${interface}..."
+       ${command}
+
+       # Bring up the parent device.
+       ip link set ${PARENT_DEV} up
+done
+
+exit 0
index e58839c405e93a214b37774d3cb06cf83fe1a996..7d5bdbca19106b427367a7f1903aff517536f6d0 100644 (file)
--- a/lfs/udev
+++ b/lfs/udev
@@ -107,6 +107,8 @@ $(TARGET) : $(patsubst %,$(DIR_DL)/%,$(objects))
        # Install network rules.
        install -v -m 755 $(DIR_SRC)/config/udev/network-hotplug-rename \
                /lib/udev/network-hotplug-rename
+       install -v -m 755 $(DIR_SRC)/config/udev/network-hotplug-vlan \
+               /lib/udev/network-hotplug-vlan
        install -v -m 644 $(DIR_SRC)/config/udev/60-net.rules \
                /lib/udev/rules.d