From ac0b20dbcec63e6b2d6ad2e8a36c97f6d07075a6 Mon Sep 17 00:00:00 2001 From: Daniel Golle Date: Sun, 4 Oct 2026 17:06:11 +0100 Subject: [PATCH] base-files: configure the preinit interface on hotplug preinit_ip runs once when preinit starts and configures the preinit interface only if its driver has already registered it. Drivers that probe while preinit is running leave failsafe without a network. Run procd's preinit hotplug daemon on net add events, as the rule in hotplug-preinit.json.d does, and have it start /sbin/preinit-netdev. The script runs the new preinit_netdev boot hook, which targets use to rename the new netdev, and then calls preinit_ip_event, which configures the preinit interface unless it already carries the preinit address. Signed-off-by: Daniel Golle --- package/base-files/Makefile | 1 + .../hotplug-preinit.json.d/10-preinit-net.json | 11 +++++++++++ .../files/lib/preinit/10_indicate_preinit | 17 +++++++++++++++++ package/base-files/files/sbin/preinit-netdev | 15 +++++++++++++++ 4 files changed, 44 insertions(+) create mode 100644 package/base-files/files/etc/hotplug-preinit.json.d/10-preinit-net.json create mode 100755 package/base-files/files/sbin/preinit-netdev diff --git a/package/base-files/Makefile b/package/base-files/Makefile index 17b6e4006d5..26951dd95b7 100644 --- a/package/base-files/Makefile +++ b/package/base-files/Makefile @@ -194,6 +194,7 @@ define Package/base-files/install $(SED) "s#%PATH%#$(TARGET_INIT_PATH)#g" \ $(1)/sbin/hotplug-call \ + $(1)/sbin/preinit-netdev \ $(1)/etc/preinit \ $(1)/etc/profile diff --git a/package/base-files/files/etc/hotplug-preinit.json.d/10-preinit-net.json b/package/base-files/files/etc/hotplug-preinit.json.d/10-preinit-net.json new file mode 100644 index 00000000000..606e19153a8 --- /dev/null +++ b/package/base-files/files/etc/hotplug-preinit.json.d/10-preinit-net.json @@ -0,0 +1,11 @@ +[ + [ "if", + [ "and", + [ "eq", "ACTION", "add" ], + [ "eq", "SUBSYSTEM", "net" ] + ], + [ + [ "exec", "/sbin/preinit-netdev" ] + ] + ] +] diff --git a/package/base-files/files/lib/preinit/10_indicate_preinit b/package/base-files/files/lib/preinit/10_indicate_preinit index 12f8fc2e210..d0499daa564 100644 --- a/package/base-files/files/lib/preinit/10_indicate_preinit +++ b/package/base-files/files/lib/preinit/10_indicate_preinit @@ -184,6 +184,23 @@ preinit_ip() { preinit_net_echo "Doing OpenWrt Preinit\n" } +preinit_ip_event() { + [ "$pi_preinit_no_failsafe" = "y" ] && return + + if [ -z "$pi_ifname" ]; then + type set_preinit_iface > /dev/null 2>&1 && set_preinit_iface + pi_ifname=$ifname + fi + + [ -n "$pi_ifname" ] || return + + ip -4 -o address show dev "$pi_ifname" 2> /dev/null | \ + grep -q "inet $pi_ip/" && return + + preinit_ip_config "$pi_ifname" + preinit_net_echo "Doing OpenWrt Preinit\n" +} + preinit_ip_deconfig() { [ -n "$pi_ifname" ] && grep -q "$pi_ifname" /proc/net/dev && { local netdev vid diff --git a/package/base-files/files/sbin/preinit-netdev b/package/base-files/files/sbin/preinit-netdev new file mode 100755 index 00000000000..2e13cab6247 --- /dev/null +++ b/package/base-files/files/sbin/preinit-netdev @@ -0,0 +1,15 @@ +#!/bin/sh +# Copyright (C) 2026 OpenWrt.org + +export PATH="%PATH%" + +. /lib/functions.sh +. /lib/functions/preinit.sh +. /lib/functions/system.sh + +for pi_source_file in /lib/preinit/*; do + . $pi_source_file +done + +boot_run_hook preinit_netdev +preinit_ip_event