[1/2] udev: Add hotplugging for VLAN devices

Message ID 1438775121-14063-1-git-send-email-michael.tremer@ipfire.org
State Accepted
Commit 36f7fe6a38c7923ac0e25a677484542f9388520a
Headers

Message

Michael Tremer Aug. 5, 2015, 9:45 p.m. UTC
  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     |  1 +
 config/udev/60-net.rules         |  4 ++
 config/udev/network-hotplug-vlan | 87 ++++++++++++++++++++++++++++++++++++++++
 lfs/udev                         |  2 +
 4 files changed, 94 insertions(+)
 create mode 100644 config/udev/network-hotplug-vlan
  

Comments

Michael Tremer Aug. 5, 2015, 9:48 p.m. UTC | #1
Hello guys,

could someone please review this patch?

This is a result from a bug report on the forum and supposed to resolve
a race-condition. Someone has already confirmed that this works, but I
want to have more feedback before merging this into the next tree.

http://forum.ipfire.org/viewtopic.php?f=6&t=14459

Best,
-Michael

On Wed, 2015-08-05 at 12:45 +0100, Michael Tremer wrote:
> 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     |  1 +
>  config/udev/60-net.rules         |  4 ++
>  config/udev/network-hotplug-vlan | 87 ++++++++++++++++++++++++++++++++++++++++
>  lfs/udev                         |  2 +
>  4 files changed, 94 insertions(+)
>  create mode 100644 config/udev/network-hotplug-vlan
> 
> diff --git a/config/rootfiles/common/udev b/config/rootfiles/common/udev
> index d01c461..4d51954 100644
> --- a/config/rootfiles/common/udev
> +++ b/config/rootfiles/common/udev
> @@ -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
> diff --git a/config/udev/60-net.rules b/config/udev/60-net.rules
> index 4f22a1e..dc39ff0 100644
> --- a/config/udev/60-net.rules
> +++ b/config/udev/60-net.rules
> @@ -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
> index 0000000..f7b6a9d
> --- /dev/null
> +++ b/config/udev/network-hotplug-vlan
> @@ -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
> diff --git a/lfs/udev b/lfs/udev
> index e58839c..7d5bdbc 100644
> --- 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
>