]> git.ipfire.org Git - people/stevee/ipfire-2.x.git/commitdiff
network: Add support for bonds
authorMichael Tremer <michael.tremer@ipfire.org>
Tue, 29 Jul 2025 14:42:16 +0000 (14:42 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Mon, 4 Aug 2025 15:43:45 +0000 (15:43 +0000)
This is a bare-minimum implementation to realise this. It changes the
bridge script because the two of them have quite a bit in common, so we
should avoid further code duplication.

Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
config/udev/network-hotplug-bridges
config/udev/network-hotplug-rename

index 39faeb5a9e98912a8e9748e38113fb4afee7e3a3..4fa1154c2a2996cb6255e68dc067f63bd7437f4c 100644 (file)
@@ -71,57 +71,86 @@ ZONE=$(detect_zone)
 
 # Cannot proceed if we could not find a zone
 if [ -z "${ZONE}" ]; then
-       logger "Could not find a bridged zone for ${INTERFACE}"
+       logger "Could not find a master zone for ${INTERFACE}"
        exit 0
 fi
 
 # Determine the mode of this zone
 MODE="$(get_value "${ZONE}_MODE")"
 
-# The name of the virtual bridge
-BRIDGE="$(get_value "${ZONE}_DEV")"
+# Exit if there is no MODE
+if [ -z "${MODE}" ]; then
+       exit 0
+fi
+
+# The name of the virtual master interface
+MASTER="$(get_value "${ZONE}_DEV")"
+
+# Fetch the MTU
 MTU="$(get_value "${ZONE}_MTU")"
-STP="$(get_value "${ZONE}_STP")"
-STP_PRIORITY="$(get_value "${ZONE}_STP_PRIORITY")"
+
+# Set default MTU if nothing is set
+if [ -z "${MTU}" ]; then
+       MTU=1500
+fi
+
+# Fetch the MAC address of the master interface
+ADDRESS="$(get_value "${ZONE}_MACADDR")"
+
+# If no address has been configured, generate a random one
+if [ -z "${ADDRESS}" ]; then
+       ADDRESS="$(random_mac_address)"
+fi
 
 case "${MODE}" in
-       bridge)
-               # Set default MTU if nothing is set
-               if [ -z "${MTU}" ]; then
-                       MTU=1500
+       # Bond
+       bond)
+               BOND_MODE="$(get_value "${ZONE}_BOND_MODE")"
+               if [ -z "${BOND_MODE}" ]; then
+                       BOND_MODE="802.3ad"
+               fi
+
+               # Check for some valid BOND_MODE
+               case "${BOND_MODE}" in
+                       balance-rr|active-backup|balance-xor|broadcast|802.3ad|balance-tlb|balance-alb)
+                               ;;
+                       *)
+                               logger "Invalid bond mode ${BOND_MODE} for ${MASTER}. Falling back to 802.3ad"
+                               BOND_MODE="802.3ad"
+                               ;;
+               esac
+
+               # Create the master interface if it does not exist
+               if [ ! -d "/sys/class/net/${MASTER}" ]; then
+                       if ! ip link add "${MASTER}" address "${ADDRESS}" mtu "${MTU}" \
+                                       type bond mode "${BOND_MODE}"; then
+                               logger "Failed to create bonding interface ${MASTER}"
+                               exit 1
+                       fi
                fi
+               ;;
+
+       # Bridge
+       bridge)
+               # Fetch spanning tree settings
+               STP="$(get_value "${ZONE}_STP")"
+               STP_PRIORITY="$(get_value "${ZONE}_STP_PRIORITY")"
 
                # We need to check if $STP_PRIORITY has a valid value if not set it
                if [ -z "${STP_PRIORITY}" ]; then
                        STP_PRIORITY=16384
                fi
 
-               ADDRESS="$(get_value "${ZONE}_MACADDR")"
-               [ -n "${ADDRESS}" ] || ADDRESS="$(random_mac_address)"
-
                # We need to create the bridge if it doesn't exist, yet
-               if [ ! -d "/sys/class/net/${BRIDGE}" ]; then
-                       ip link add "${BRIDGE}" address "${ADDRESS}" mtu "${MTU}" type bridge \
+               if [ ! -d "/sys/class/net/${MASTER}" ]; then
+                       ip link add "${MASTER}" address "${ADDRESS}" mtu "${MTU}" type bridge \
                                $([ "${STP}" = "on" ] && echo "stp_state 1  priority ${STP_PRIORITY}" )
-                       #ip link set "${BRIDGE}" up
                fi
 
                # Try setting wireless interfaces into master mode
                if [ -d "/sys/class/net/${INTERFACE}/phy80211" ]; then
                        iw dev "${INTERFACE}" set type __ap
                fi
-
-               # Attempt to set the MTU
-               ip link set dev "${INTERFACE}" mtu "${MTU}"
-
-               # Attach the physical device
-               logger "Attach ${INTERFACE} to ${BRIDGE}"
-               ip link set dev "${INTERFACE}" master "${BRIDGE}"
-               ip link set dev "${INTERFACE}" up
-               ;;
-
-       "")
-               exit 0
                ;;
 
        *)
@@ -129,3 +158,17 @@ case "${MODE}" in
                exit 1
                ;;
 esac
+
+# Attempt to set the MTU
+ip link set dev "${INTERFACE}" mtu "${MTU}"
+
+# Ensure the physical interface is down
+ip link set dev "${INTERFACE}" down
+
+# Attach the physical device
+logger "Attach ${INTERFACE} to ${MASTER}"
+ip link set dev "${INTERFACE}" master "${MASTER}"
+ip link set dev "${INTERFACE}" up
+
+# Done!
+exit 0
index 7c81bdb7814cacfc658b0859fcbe46532bc192e4..f27eecae6e3d842f80156329feccf19cfa0cdbdf 100644 (file)
@@ -78,7 +78,7 @@ for zone in ${ZONES}; do
        # If a matching interface has been found we will
        # print the name to which udev will rename it.
        case "${!mode}" in
-               bridge)
+               bond|bridge)
                        counter=0
                        for slave in ${!slaves}; do
                                if [ "${slave,,}" = "${ADDRESS,,}" ]; then