Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package agama-installer for openSUSE:Factory 
checked in at 2026-08-11 17:09:27
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/agama-installer (Old)
 and      /work/SRC/openSUSE:Factory/.agama-installer.new.17972 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "agama-installer"

Tue Aug 11 17:09:27 2026 rev:39 rq:1370328 version:23.0.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/agama-installer/agama-installer.changes  
2026-07-21 22:56:01.768734033 +0200
+++ 
/work/SRC/openSUSE:Factory/.agama-installer.new.17972/agama-installer.changes   
    2026-08-11 17:09:36.922928888 +0200
@@ -1,0 +2,11 @@
+Thu Jul 23 19:40:00 UTC 2026 - Knut Anderssen <[email protected]>
+
+- Fix multiple IP/route assignments in multi-bond setups with
+  HCN/HVN inside the initrd (bsc#1272445, related to jsc#PED-14533).
+- Announce the HCN network configuration with an "ip=hcn" marker in
+  /etc/cmdline.d, preventing NetworkManager and the other Agama
+  dracut modules from configuring the bond ports on their own, which
+  could break HCN bonds. It requires NetworkManager with "ip=hcn"
+  support (bsc#1272445, related to jsc#PED-14533 and jsc#PED-14534).
+
+-------------------------------------------------------------------

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ config-cdroot.tar.xz ++++++

++++++ config.sh ++++++
--- /var/tmp/diff_new_pack.wpW4o5/_old  2026-08-11 17:09:40.787092670 +0200
+++ /var/tmp/diff_new_pack.wpW4o5/_new  2026-08-11 17:09:40.807093518 +0200
@@ -145,11 +145,11 @@
 echo "root=live:LABEL=$label" >/etc/cmdline.d/10-liveroot.conf
 echo "root_disk=live:LABEL=$label" >>/etc/cmdline.d/10-liveroot.conf
 echo 'install_items+=" /etc/cmdline.d/10-liveroot.conf "' 
>/etc/dracut.conf.d/10-liveroot-file.conf
-echo 'add_dracutmodules+=" dracut-menu agama-cmdline agama-dud 
live-self-update initrd-nmtui chrony"' 
>>/etc/dracut.conf.d/10-liveroot-file.conf
+echo 'add_dracutmodules+=" dracut-menu agama-cmdline agama-dud 
live-self-update initrd-nmtui chrony "' 
>>/etc/dracut.conf.d/10-liveroot-file.conf
 
 if [ "${arch}" = "ppc64le" ]; then
   # Added support for configuring HCN in dracut (jsc#PED-14533) only in 
ppc64le.
-  echo 'add_dracutmodules+=" hcn"' >>/etc/dracut.conf.d/10-liveroot-file.conf
+  echo 'add_dracutmodules+=" hcn "' >>/etc/dracut.conf.d/10-liveroot-file.conf
 fi
 
 

++++++ live-root.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/usr/bin/kernel-cmdline-conf.sh 
new/usr/bin/kernel-cmdline-conf.sh
--- old/usr/bin/kernel-cmdline-conf.sh  2026-07-20 13:59:40.000000000 +0200
+++ new/usr/bin/kernel-cmdline-conf.sh  2026-08-01 09:52:37.000000000 +0200
@@ -32,6 +32,11 @@
     rd.peerdns=* | rd.neednet=* | vlan=* | bond=* | team=* | bridge=* | 
ifname=*)
       _found=1
       ;;
+    # remove the HCN (Hybrid Cloud Network) options, they are only meaningful
+    # for the installation media, see the 99hcn dracut module
+    rd.hcn | rd.hcn=* | rd.hcn.*)
+      _found=1
+      ;;
     esac
 
     if [ -z "$_found" ]; then
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/usr/lib/dracut/modules.d/99agama-dud/agama-dud-parser.sh 
new/usr/lib/dracut/modules.d/99agama-dud/agama-dud-parser.sh
--- old/usr/lib/dracut/modules.d/99agama-dud/agama-dud-parser.sh        
2026-07-20 13:59:40.000000000 +0200
+++ new/usr/lib/dracut/modules.d/99agama-dud/agama-dud-parser.sh        
2026-08-01 09:52:37.000000000 +0200
@@ -18,7 +18,8 @@
     if grep -q -s -E -e "https?://" -e "ftps?://" -e "smbs?://" -e "scp://" 
/tmp/agamadud.info; then
       echo "rd.neednet=1" > /etc/cmdline.d/agama-generated.conf
       # use DHCP if there is no network configuration provided by user
-      if ! getarg "ip=" >/dev/null && ! getarg "rd.hcn.ip=" >/dev/null; then
+      # (the HCN module writes "ip=hcn" when it configures the network itself)
+      if ! getarg "ip=" >/dev/null; then
         echo "ip=dhcp" >> /etc/cmdline.d/agama-generated.conf
       fi
     fi
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/usr/lib/dracut/modules.d/99hcn/ARCHITECTURE.md 
new/usr/lib/dracut/modules.d/99hcn/ARCHITECTURE.md
--- old/usr/lib/dracut/modules.d/99hcn/ARCHITECTURE.md  2026-07-20 
13:59:40.000000000 +0200
+++ new/usr/lib/dracut/modules.d/99hcn/ARCHITECTURE.md  2026-08-01 
09:52:37.000000000 +0200
@@ -21,11 +21,12 @@
 **Core Responsibilities:**
 
 1. Parse HCN-specific kernel parameters (`rd.hcn.ip`, `rd.hcn.route`)
-2. Discover HCN device pairs via `/proc/device-tree` properties
-3. Transform HCN parameters into bond-targeted standard dracut parameters
-4. Generate NetworkManager connection profiles via `nm-initrd-generator`
-5. Adapt profiles for `hcnmgr` daemon compatibility
-6. Persist profiles across initramfs and into the installed system
+2. Reserve the network configuration for HCN by writing an `ip=hcn` marker to 
`/etc/cmdline.d/`
+3. Discover HCN device pairs via `/proc/device-tree` properties
+4. Transform HCN parameters into bond-targeted standard dracut parameters
+5. Generate NetworkManager connection profiles via `nm-initrd-generator`
+6. Adapt profiles for `hcnmgr` daemon compatibility
+7. Persist profiles across initramfs and into the installed system
 
 ## Key Architecture Principles
 
@@ -43,7 +44,9 @@
 
 4. **No Cmdline Pollution**: Transformed parameters are passed directly to 
`nm-initrd-generator` as command-line arguments, never written to 
`/etc/cmdline.d/`, preventing other dracut modules from reading them and 
regenerating incompatible profiles.
 
-5. **Timing-Aware Orchestration**: Two-phase execution (cmdline hook + systemd 
service) handles the fact that HCN devices may not be available when kernel 
command line parsing runs.
+5. **Early Claim of the Network**: The `hcn-cmdline.sh` hook writes a single 
`ip=hcn` marker to `/etc/cmdline.d/20-hcn.conf` while the command line is being 
parsed. It announces that HCN takes care of the network so that neither 
NetworkManager nor the other Agama modules configure the bond ports on their 
own. This requires NetworkManager with `ip=hcn` support (jsc#PED-14534). The 
marker is **internal**: it is written by the module, never by the user, and it 
does not enable HCN by itself (`hcn-init-initrd.service` only reacts to 
`rd.hcn*`).
+
+6. **Timing-Aware Orchestration**: Two-phase execution (cmdline hook + systemd 
service) handles the fact that HCN devices may not be available when kernel 
command line parsing runs. The hook only reserves the network, the actual 
configuration happens in the service once udev has discovered the devices.
 
 ## Boot-Time Integration & Component Diagram
 
@@ -71,11 +74,18 @@
                                                 v
 
+-------------------------------------------------------------------------------------------------+
 |  1. EARLY CMDLINE & LOGGING PHASE (`dracut-cmdline.service`)                 
                   |
+|     - Runs the HCN cmdline hook: 
`/lib/dracut/hooks/cmdline/20-hcn-cmdline.sh`                  |
+|       * If HCN is requested (rd.hcn=1, rd.hcn.ip or rd.hcn.route) AND the 
device tree           |
+|         contains `ibm,hcn-id` devices: writes `ip=hcn` to 
`/etc/cmdline.d/20-hcn.conf`.            |
+|       * Otherwise: no-op, the boot continues as a standard one.              
                   |
+|     - Runs the other Agama cmdline hooks (priority 99: agama-dud, 
live-self-update,             |
+|       initrd-nmtui). They add `ip=dhcp` only when no `ip=` is set, so the 
marker above          |
+|       keeps them away from the HCN bond ports.                               
                   |
 |     - Runs early cmdline hook: `/lib/dracut/hooks/cmdline/99-nm-config.sh`   
                   |
-|     - Standard NetworkManager connection generation proceeds normally.       
                   |
 |                                                                              
                   |
 |     SLES 16.1 (NM < 1.54):                                                   
                   |
-|     - `nm-config.sh` executes `nm_generate_connections` normally.            
                   |
+|     - `nm-config.sh` executes `nm_generate_connections` normally. With 
`ip=hcn` it              |
+|       generates nothing, not even the `rd.neednet=1` default connection.     
                   |
 |                                                                              
                   |
 |     Tumbleweed (NM >= 1.54):                                                 
                   |
 |     - No generation in cmdline hook (delegated to systemd service).          
                   |
@@ -85,7 +95,9 @@
 
+-------------------------------------------------------------------------------------------------+
 |  1.5 NETWORK GENERATION SERVICE PHASE (Tumbleweed Only)                      
                   |
 |     Runs `NetworkManager-config-initrd.service` (Before 
`systemd-udevd.service`):               |
-|     - RUNS standard `nm-initrd-generator` normally.                          
                   |
+|     - RUNS standard `nm-initrd-generator` normally, reading the dracut 
command line             |
+|       (`getcmdline`, see the dracut drop-in) and therefore seeing the 
`ip=hcn` marker.          |
+|     - With `ip=hcn` it generates nothing and leaves the network to the HCN 
module.              |
 
+-------------------------------------------------------------------------------------------------+
                                                 |
                                                 v
@@ -129,15 +141,18 @@
    The kernel mounts the initramfs. Systemd starts as PID 1 
(`/usr/lib/systemd/systemd`).
 
 2. **Early Cmdline & Discovery Phase (`dracut-cmdline.service`)**:
-   - `dracut-cmdline` processes all command line hooks, including 
`/lib/dracut/hooks/cmdline/99-nm-config.sh`.
+   - `dracut-cmdline` processes all command line hooks in priority order.
+   - `20-hcn-cmdline.sh` (this module) writes `ip=hcn` to 
`/etc/cmdline.d/20-hcn.conf` when HCN is requested and HCN devices exist in 
`/proc/device-tree`. Nothing else is written: the transformation of `rd.hcn.*` 
still happens much later, in `hcn-init-initrd.service`.
+   - The priority 99 hooks of the other Agama modules (`99agama-dud`, 
`99live-self-update`, `99initrd-nmtui`) run afterwards and skip their `ip=dhcp` 
fallback because an `ip=` is already present.
    - Standard NetworkManager connection generation proceeds normally:
      - **SLES 16.1 (NetworkManager < 1.54):** `99-nm-config.sh` calls 
`nm_generate_connections` to generate standard connection profiles.
      - **Tumbleweed (NetworkManager >= 1.54):** `99-nm-config.sh` does not 
call `nm_generate_connections` (which is delegated to a systemd service).
 
 2.5. **Network Generation Service Phase (Tumbleweed with NetworkManager >= 
1.54 Only)**:
 
-- **`NetworkManager-config-initrd.service`** runs (ordered 
`Before=systemd-udevd.service` and `systemd-udev-trigger.service`).
-- It runs standard `nm-initrd-generator` normally to generate connection 
profiles based on kernel arguments.
+- **`NetworkManager-config-initrd.service`** runs (ordered 
`After=dracut-cmdline.service` and `Before=systemd-udevd.service` / 
`systemd-udev-trigger.service`).
+- It runs standard `nm-initrd-generator` normally to generate connection 
profiles based on kernel arguments. The dracut drop-in 
(`NetworkManager-config-initrd-dracut.conf`, from the `35network-manager` 
module) makes it use `getcmdline` instead of `cat /proc/cmdline`, so the 
`ip=hcn` marker written above is taken into account.
+- On an HCN boot the generator therefore produces no profiles at all, in 
particular not the default DHCP connection it would otherwise fabricate for 
`rd.neednet=1`. That default would activate the bond ports individually and 
break the bond (bsc#1272445).
 
 1. **Udev Device Discovery**:
    - `systemd-udevd.service` starts and triggers hardware udev events via 
`systemd-udev-trigger.service`.
@@ -273,6 +288,9 @@
    - Transformed parameters are **never written to `/etc/cmdline.d/`**
    - Passed directly to `nm-initrd-generator` as command-line arguments only
    - Other modules have no transformed parameters to misinterpret
+   - The only thing written to `/etc/cmdline.d/` is the `ip=hcn` marker, which 
makes both
+     NetworkManager and the other Agama modules keep their hands off the 
network instead of
+     falling back to DHCP on the bond ports
 
 2. **Layer 2 - Isolated Generation:**
    - Uses custom output directory: `-c /run/hcn/system-connections`
@@ -366,6 +384,7 @@
 - `/etc` persists across dracut module execution (unlike `/run` which modules 
may clear)
 - Other dracut modules don't know about `/run/hcn/system-connections/` 
(isolated generation)
 - No transformed parameters in `/etc/cmdline.d/` prevents other modules from 
regenerating
+- The `ip=hcn` marker in `/etc/cmdline.d/` prevents them from generating 
anything of their own
 
 ### Stage 2: Installed System Persistence (Agama Module)
 
@@ -434,6 +453,12 @@
    - When no MAC address is specified, first discovered HCN ID is used
    - May be unexpected on multi-bond systems
 
+5. **NetworkManager with `ip=hcn` Support Required:**
+   - The module relies on `nm-initrd-generator` understanding `ip=hcn` 
(jsc#PED-14534)
+   - Older versions treat `hcn` as an unknown method and generate their own 
wired DHCP
+     connection, which activates the bond ports individually and breaks the 
bond
+   - There is no fallback: the marker is written whenever HCN devices are 
present
+
 ### Maintenance Considerations
 
 - **Dracut API Stability:** Module relies on dracut hook conventions (cmdline 
phase, systemd service ordering)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/usr/lib/dracut/modules.d/99hcn/hcn-cmdline.sh 
new/usr/lib/dracut/modules.d/99hcn/hcn-cmdline.sh
--- old/usr/lib/dracut/modules.d/99hcn/hcn-cmdline.sh   1970-01-01 
01:00:00.000000000 +0100
+++ new/usr/lib/dracut/modules.d/99hcn/hcn-cmdline.sh   2026-08-01 
09:52:37.000000000 +0200
@@ -0,0 +1,81 @@
+#!/bin/sh
+
+# HCN (Hybrid Cloud Network) dracut module - kernel command line hook
+#
+# Announces that HCN takes care of the network configuration by writing an
+# "ip=hcn" marker to /etc/cmdline.d. The configuration itself is done much
+# later by parse-hcn, which has to wait for udev to discover the devices.
+#
+# The marker is internal, users still request HCN with rd.hcn.ip/rd.hcn.route.
+# Writing it by hand does not enable HCN, it only keeps the others away.
+#
+# The marker keeps everybody else away from the HCN bond ports:
+#
+#   * nm-initrd-generator skips the argument and, more importantly, does not
+#     fabricate its default DHCP connection when rd.neednet=1 is set but the
+#     command line produced no connection (PED-14534). That default would bring
+#     the bond ports up independently, breaking the bond.
+#   * The other Agama modules (99agama-dud, 99live-self-update, 99initrd-nmtui)
+#     only add "ip=dhcp" when the user did not configure the network, so an
+#     "ip=" of any kind is enough for them to keep their hands off. This hook
+#     therefore has to run before them, see the priority in module-setup.sh.
+#
+# Two requirements are worth keeping in mind:
+#
+#   * NetworkManager needs "ip=hcn" support (PED-14534). Older versions treat 
it
+#     as an unknown method and generate their default wired DHCP connection.
+#   * The early generation has to read the dracut command line and not just
+#     /proc/cmdline. That is the case in a dracut initrd, where the
+#     35network-manager module installs a drop-in for
+#     NetworkManager-config-initrd.service replacing "cat /proc/cmdline" with
+#     the "getcmdline" dracut function.
+
+command -v getargbool >/dev/null || . /lib/dracut-lib.sh
+
+# Device tree location and generated configuration file. Only overridden by the
+# test suite.
+HCN_DEVICE_TREE="${HCN_DEVICE_TREE:-/proc/device-tree}"
+HCN_CMDLINE_FILE="${HCN_CMDLINE_FILE:-/etc/cmdline.d/20-hcn.conf}"
+
+# Whether the HCN configuration was requested through the kernel command line.
+# Mirrors the conditions of hcn-init-initrd.service.
+hcn_requested() {
+  # rd.hcn=0 disables HCN even when other HCN options are present
+  getargbool 1 rd.hcn || return 1
+
+  getargbool 0 rd.hcn && return 0
+  getarg rd.hcn.ip= >/dev/null && return 0
+  getarg rd.hcn.route= >/dev/null && return 0
+
+  return 1
+}
+
+# Whether the device tree contains any HCN device. Unlike parse-hcn, this does
+# not wait for the devices to show up in sysfs, it only checks whether there is
+# something to be configured at all.
+hcn_devices_present() {
+  local dev
+
+  for dev in "$HCN_DEVICE_TREE"/pci*/ethernet* \
+    "$HCN_DEVICE_TREE"/vdevice/vnic* "$HCN_DEVICE_TREE"/vdevice/l-lan*; do
+    [ -e "$dev/ibm,hcn-id" ] && return 0
+  done
+
+  return 1
+}
+
+hcn_write_cmdline() {
+  hcn_requested || return 0
+
+  # Without HCN devices parse-hcn does not configure anything, so do not claim
+  # the network configuration and let the other modules set it up as usual.
+  if ! hcn_devices_present; then
+    info "hcn-cmdline: HCN requested but no HCN device found in the device 
tree"
+    return 0
+  fi
+
+  info "hcn-cmdline: HCN takes care of the network configuration, writing 
'ip=hcn'"
+  echo "ip=hcn" > "$HCN_CMDLINE_FILE"
+}
+
+hcn_write_cmdline
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/usr/lib/dracut/modules.d/99hcn/module-setup.sh 
new/usr/lib/dracut/modules.d/99hcn/module-setup.sh
--- old/usr/lib/dracut/modules.d/99hcn/module-setup.sh  2026-07-20 
13:59:40.000000000 +0200
+++ new/usr/lib/dracut/modules.d/99hcn/module-setup.sh  2026-08-01 
09:52:37.000000000 +0200
@@ -19,6 +19,9 @@
     inst_multiple hexdump ofpathname pseries_platform awk mkdir mv sed sleep tr
 
     inst_script "$moddir/parse-hcn.sh" /usr/bin/parse-hcn
+    # Runs before the cmdline hooks of the other Agama modules, which use the
+    # priority 99 and add "ip=dhcp" when the network is not configured yet
+    inst_hook cmdline 20 "$moddir/hcn-cmdline.sh"
     inst_simple "$moddir/hcn-init-initrd.service" 
"${systemdsystemunitdir}/hcn-init-initrd.service"
     $SYSTEMCTL -q --root "$initdir" enable hcn-init-initrd.service
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/usr/lib/dracut/modules.d/99hcn/parse-hcn.sh 
new/usr/lib/dracut/modules.d/99hcn/parse-hcn.sh
--- old/usr/lib/dracut/modules.d/99hcn/parse-hcn.sh     2026-07-20 
13:59:40.000000000 +0200
+++ new/usr/lib/dracut/modules.d/99hcn/parse-hcn.sh     2026-08-01 
09:52:37.000000000 +0200
@@ -14,6 +14,11 @@
 # 6. Fix up generated connections to use correct bond masters and naming
 # 7. Copy connections to /etc/NetworkManager/system-connections for persistence
 #
+# This script runs from hcn-init-initrd.service, once udev has discovered the
+# devices. Much earlier, hcn-cmdline.sh has already told NetworkManager and the
+# other dracut modules to leave the network alone by writing an "ip=hcn" marker
+# to /etc/cmdline.d, so nothing configures the bond ports behind our back.
+#
 # Usage:
 #   rd.hcn=1              - Create bond connections only (no IP configuration)
 #   rd.hcn.ip=<config>    - Create bonds with HCN-specific IP configuration
@@ -326,10 +331,20 @@
 # Extract unique bond names from discovered mappings
 BOND_NAMES=$(echo "$MAPPINGS" | awk '{for(i=1;i<=NF;i+=4) if (!seen[$i]++) 
print $i}')
 
+# First discovered bond. Only unqualified *static* configs (a fixed address
+# with no interface field) fall back to this bond, because a fixed address can
+# belong to a single bond. Method-only configs (dhcp, auto6, ...) carry no
+# per-host address and instead fan out to every discovered bond (see below).
+# NOTE: BOND_NAMES is newline-separated, so it must be left unquoted here for
+# awk to see a single record and return just the first token.
+# shellcheck disable=SC2086
+FIRST_BOND=$(echo $BOND_NAMES | awk '{print $1}')
+
 for BONDNAME in $BOND_NAMES; do
   SLAVES="" SLAVE_NAMES="" SLAVE_MACS="" PRIMARY=""
+  OTHER_SLAVE_NAMES="" OTHER_SLAVE_MACS=""
 
-  # Extract slaves for this bond from MAPPINGS
+  # Extract slaves for this bond and other bonds from MAPPINGS
   set -- $MAPPINGS
   while [ $# -ge 4 ]; do
     if [ "$1" = "$BONDNAME" ]; then
@@ -337,6 +352,9 @@
       [ "$3" != "none" ] && SLAVE_MACS="$SLAVE_MACS $3"
       [ "$4" = "primary" ] && PRIMARY="$2"
       SLAVES="${SLAVES:+$SLAVES,}$2"
+    else
+      OTHER_SLAVE_NAMES="$OTHER_SLAVE_NAMES $2"
+      [ "$3" != "none" ] && OTHER_SLAVE_MACS="$OTHER_SLAVE_MACS $3"
     fi
     shift 4
   done
@@ -349,32 +367,56 @@
 
   # Process rd.hcn.ip= - replace slave names/MACs with bond name
   for HCN_IP in $(getargs rd.hcn.ip); do
+    # Lowercased copy for case-insensitive MAC matching: MACs in MAPPINGS are
+    # lowercase, but may be supplied in uppercase on the kernel command line.
+    HCN_IP_LC=$(echo "$HCN_IP" | tr 'A-Z' 'a-z')
     matched=0
     for slave in $SLAVE_NAMES $SLAVE_MACS; do
       slave_dash=$(str_replace "$slave" ":" "-")
+      # MACs (which contain ':') are compared case-insensitively; interface
+      # names are compared as-is to preserve their case.
+      hcn_cmp=$HCN_IP
+      case "$slave" in *:*) hcn_cmp=$HCN_IP_LC ;; esac
       # Check if HCN_IP contains the slave (as a whole word/field)
-      if strstr ":$HCN_IP:" ":$slave:" || strstr ":$HCN_IP:" ":$slave_dash:"; 
then
+      if strstr ":$hcn_cmp:" ":$slave:" || strstr ":$hcn_cmp:" 
":$slave_dash:"; then
         matched=1
         # Replace slave with bond name (handle boundaries)
-        current_hcn_ip=$(echo "$HCN_IP" | sed -E "s#^($slave|$slave_dash)([: 
]|$)#$BONDNAME\2#; s#([: ])($slave|$slave_dash)([: ]|$)#\1$BONDNAME\3#g")
+        current_hcn_ip=$(echo "$hcn_cmp" | sed -E "s#^($slave|$slave_dash)([: 
]|$)#$BONDNAME\2#; s#([: ])($slave|$slave_dash)([: ]|$)#\1$BONDNAME\3#g")
         NEW_ARGS="$NEW_ARGS ip=$current_hcn_ip"
         break
       fi
     done
 
-    # No slave matched and no bond name present - apply to first bond
+    # Check if this IP is targeted at another bond's slave
+    matched_other=0
+    for slave in $OTHER_SLAVE_NAMES $OTHER_SLAVE_MACS; do
+      slave_dash=$(str_replace "$slave" ":" "-")
+      hcn_cmp=$HCN_IP
+      case "$slave" in *:*) hcn_cmp=$HCN_IP_LC ;; esac
+      if strstr ":$hcn_cmp:" ":$slave:" || strstr ":$hcn_cmp:" 
":$slave_dash:"; then
+        matched_other=1
+        break
+      fi
+    done
+
+    # No slave matched and no bond name present - apply the unqualified config.
+    # Method-only configs (dhcp, auto6, ...) fan out to every bond; unqualified
+    # static addresses fall back to the first bond only (see the *) branch).
     has_bond_ip=0
     case "$HCN_IP" in
     *:bond[0-9]*) has_bond_ip=1 ;;
     esac
-    if [ $matched -eq 0 ] && [ $has_bond_ip -eq 0 ]; then
+    if [ $matched -eq 0 ] && [ $matched_other -eq 0 ] && [ $has_bond_ip -eq 0 
]; then
       case "$HCN_IP" in
       dhcp | on | any | single-dhcp | dhcp6 | auto6 | ibft | either6 | link6)
+        # Method-only config (no fixed address): each bond obtains its own
+        # configuration independently, so apply it to every discovered bond.
         info "parse-hcn: applying $HCN_IP to $BONDNAME"
         NEW_ARGS="$NEW_ARGS ip=$BONDNAME:$HCN_IP"
         ;;
       *:dhcp | *:on | *:any | *:dhcp6 | *:auto6 | *:link6)
         # Format: 
rd.hcn.ip=<interface>:{dhcp|on|any|dhcp6|auto6|link6}[:[<mtu>]]
+        # Method-only config with optional MTU: also applies to every bond.
         # Extract optional MTU field (after the method, could be followed by 
more colons)
         temp_ip=${HCN_IP}
         # Count colons to determine if there are extra fields
@@ -391,7 +433,10 @@
         fi
         ;;
       *)
-        # Static IP configuration - count colons to determine format
+        # Static IP configuration: a fixed address can belong to only one bond,
+        # so an unqualified static config falls back to the first bond only.
+        [ "$BONDNAME" = "$FIRST_BOND" ] || continue
+        # Count colons to determine format
         # Standard format: 
rd.hcn.ip=<client-IP>:[<peer>]:<gateway-IP>:<netmask>:<client_hostname>:<interface>:{none|off|dhcp|on|any|dhcp6|auto6|ibft}[:[<dns1>][:<dns2>]]
         # Minimum fields: client-IP:gateway:netmask:hostname:interface:method 
(5 colons)
         # Extended: adds :dns1 and/or :dns2 (up to 7 colons)
@@ -448,23 +493,39 @@
 
   # Process rd.hcn.route= - replace slave names/MACs with bond name
   for HCN_ROUTE in $(getargs rd.hcn.route); do
+    # Lowercased copy for case-insensitive MAC matching (see rd.hcn.ip above).
+    HCN_ROUTE_LC=$(echo "$HCN_ROUTE" | tr 'A-Z' 'a-z')
     matched=0
     for slave in $SLAVE_NAMES $SLAVE_MACS; do
       slave_dash=$(str_replace "$slave" ":" "-")
-      if strstr ":$HCN_ROUTE:" ":$slave:" || strstr ":$HCN_ROUTE:" 
":$slave_dash:"; then
+      hcn_cmp=$HCN_ROUTE
+      case "$slave" in *:*) hcn_cmp=$HCN_ROUTE_LC ;; esac
+      if strstr ":$hcn_cmp:" ":$slave:" || strstr ":$hcn_cmp:" 
":$slave_dash:"; then
         matched=1
-        current_hcn_route=$(echo "$HCN_ROUTE" | sed -E 
"s#^($slave|$slave_dash)([: ]|$)#$BONDNAME\2#; s#([: ])($slave|$slave_dash)([: 
]|$)#\1$BONDNAME\3#g")
+        current_hcn_route=$(echo "$hcn_cmp" | sed -E 
"s#^($slave|$slave_dash)([: ]|$)#$BONDNAME\2#; s#([: ])($slave|$slave_dash)([: 
]|$)#\1$BONDNAME\3#g")
         NEW_ARGS="$NEW_ARGS rd.route=$current_hcn_route"
         break
       fi
     done
 
+    # Check if this route is targeted at another bond's slave
+    matched_other=0
+    for slave in $OTHER_SLAVE_NAMES $OTHER_SLAVE_MACS; do
+      slave_dash=$(str_replace "$slave" ":" "-")
+      hcn_cmp=$HCN_ROUTE
+      case "$slave" in *:*) hcn_cmp=$HCN_ROUTE_LC ;; esac
+      if strstr ":$hcn_cmp:" ":$slave:" || strstr ":$hcn_cmp:" 
":$slave_dash:"; then
+        matched_other=1
+        break
+      fi
+    done
+
     # No slave matched and no bond name present - apply to first bond
     has_bond_route=0
     case "$HCN_ROUTE" in
     *:bond[0-9]*) has_bond_route=1 ;;
     esac
-    if [ $matched -eq 0 ] && [ $has_bond_route -eq 0 ]; then
+    if [ $matched -eq 0 ] && [ $matched_other -eq 0 ] && [ $has_bond_route -eq 
0 ] && [ "$BONDNAME" = "$FIRST_BOND" ]; then
       temp_route=${HCN_ROUTE}
       colons=0
       while [ "${temp_route#*:}" != "$temp_route" ]; do
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/usr/lib/dracut/modules.d/99live-self-update/live-self-update-parser.sh 
new/usr/lib/dracut/modules.d/99live-self-update/live-self-update-parser.sh
--- old/usr/lib/dracut/modules.d/99live-self-update/live-self-update-parser.sh  
2026-07-20 13:59:40.000000000 +0200
+++ new/usr/lib/dracut/modules.d/99live-self-update/live-self-update-parser.sh  
2026-08-01 09:52:37.000000000 +0200
@@ -21,7 +21,8 @@
     echo "<5>Enabling network configuration"
     echo "rd.neednet=1" > "$FILE"
     # use DHCP if there is no network configuration provided by user
-    if ! getarg "ip=" >/dev/null && ! getarg "rd.hcn.ip=" >/dev/null; then
+    # (the HCN module writes "ip=hcn" when it configures the network itself)
+    if ! getarg "ip=" >/dev/null; then
       echo "Using default DHCP network configuration"
       echo "ip=dhcp" >> "$FILE"
     fi

Reply via email to