From patchwork Tue Jul 29 14:42:16 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michael Tremer X-Patchwork-Id: 8965 Return-Path: Received: from mail01.ipfire.org (mail01.haj.ipfire.org [172.28.1.202]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519) (Client CN "mail01.haj.ipfire.org", Issuer "R11" (verified OK)) by web04.haj.ipfire.org (Postfix) with ESMTPS id 4bryk56dCsz3xPV for ; Tue, 29 Jul 2025 14:42:37 +0000 (UTC) Received: from mail02.haj.ipfire.org (mail02.haj.ipfire.org [172.28.1.201]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) client-signature ECDSA (secp384r1)) (Client CN "mail02.haj.ipfire.org", Issuer "E6" (verified OK)) by mail01.ipfire.org (Postfix) with ESMTPS id 4bryk30hJcz75Z for ; Tue, 29 Jul 2025 14:42:35 +0000 (UTC) Received: from mail02.haj.ipfire.org (localhost [127.0.0.1]) by mail02.haj.ipfire.org (Postfix) with ESMTP id 4bryk1463lz34Nk for ; Tue, 29 Jul 2025 14:42:33 +0000 (UTC) X-Original-To: development@lists.ipfire.org Received: from mail01.ipfire.org (mail01.haj.ipfire.org [172.28.1.202]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1) client-signature RSA-PSS (4096 bits)) (Client CN "mail01.haj.ipfire.org", Issuer "R11" (verified OK)) by mail02.haj.ipfire.org (Postfix) with ESMTPS id 4bryjy4Pbnz34Jr for ; Tue, 29 Jul 2025 14:42:30 +0000 (UTC) Received: from michael.haj.ipfire.org (michael.haj.ipfire.org [172.28.1.242]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) client-signature ECDSA (secp384r1)) (Client CN "michael.haj.ipfire.org", Issuer "E5" (verified OK)) by mail01.ipfire.org (Postfix) with ESMTPS id 4bryjx5w8zzmh; Tue, 29 Jul 2025 14:42:29 +0000 (UTC) Received: by michael.haj.ipfire.org (Postfix, from userid 0) id 4bryjx56xLzTghm; Tue, 29 Jul 2025 14:42:29 +0000 (UTC) From: Michael Tremer To: development@lists.ipfire.org Cc: Michael Tremer Subject: [PATCH 2/6] network: Add support for bonds Date: Tue, 29 Jul 2025 14:42:16 +0000 Message-ID: <20250729144220.1332214-2-michael.tremer@ipfire.org> X-Mailer: git-send-email 2.47.2 In-Reply-To: <20250729144220.1332214-1-michael.tremer@ipfire.org> References: <20250729144220.1332214-1-michael.tremer@ipfire.org> Precedence: list List-Id: List-Subscribe: , List-Unsubscribe: , List-Post: List-Help: Sender: Mail-Followup-To: MIME-Version: 1.0 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 --- config/udev/network-hotplug-bridges | 97 +++++++++++++++++++++-------- config/udev/network-hotplug-rename | 2 +- 2 files changed, 71 insertions(+), 28 deletions(-) diff --git a/config/udev/network-hotplug-bridges b/config/udev/network-hotplug-bridges index 39faeb5a9..4fa1154c2 100644 --- a/config/udev/network-hotplug-bridges +++ b/config/udev/network-hotplug-bridges @@ -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 diff --git a/config/udev/network-hotplug-rename b/config/udev/network-hotplug-rename index 7c81bdb78..f27eecae6 100644 --- a/config/udev/network-hotplug-rename +++ b/config/udev/network-hotplug-rename @@ -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