diff mbox series

[meta-ti,master/wrynose,2/2] initramfs: Add netsetup module for DHCP network configuration

Message ID 20260602104810.1068959-3-m-shah@ti.com
State Changes Requested
Delegated to: Ryan Eatmon
Headers show
Series Fix NFS boot on K3 platforms with bsp-next kernel | expand

Commit Message

Moteen Shah June 2, 2026, 10:48 a.m. UTC
Add 83-netsetup, an initramfs-framework module that configures the
network interface via DHCP before the NFS root mount. Needed when the
Ethernet driver is a loadable module and the deferred probe chain
requires time to settle after udev loads the modules. Also add dhcpcd
to packagegroup-ti-core-initramfs to support DHCP configuration.

Signed-off-by: Moteen Shah <m-shah@ti.com>
---
 .../initramfs-framework/83-netsetup           | 54 +++++++++++++++++++
 .../initramfs-framework_%.bbappend            | 15 ++++++
 .../packagegroup-ti-core-initramfs.bb         |  2 +
 3 files changed, 71 insertions(+)
 create mode 100644 meta-ti-bsp/recipes-core/initramfs-scripts/initramfs-framework/83-netsetup
 create mode 100644 meta-ti-bsp/recipes-core/initramfs-scripts/initramfs-framework_%.bbappend

Comments

Denys Dmytriyenko June 2, 2026, 1:47 p.m. UTC | #1
On Tue, Jun 02, 2026 at 04:18:10PM +0530, Moteen Shah via lists.yoctoproject.org wrote:
> Add 83-netsetup, an initramfs-framework module that configures the
> network interface via DHCP before the NFS root mount. Needed when the
> Ethernet driver is a loadable module and the deferred probe chain
> requires time to settle after udev loads the modules. Also add dhcpcd
> to packagegroup-ti-core-initramfs to support DHCP configuration.
> 
> Signed-off-by: Moteen Shah <m-shah@ti.com>
> ---
>  .../initramfs-framework/83-netsetup           | 54 +++++++++++++++++++
>  .../initramfs-framework_%.bbappend            | 15 ++++++
>  .../packagegroup-ti-core-initramfs.bb         |  2 +
>  3 files changed, 71 insertions(+)
>  create mode 100644 meta-ti-bsp/recipes-core/initramfs-scripts/initramfs-framework/83-netsetup
>  create mode 100644 meta-ti-bsp/recipes-core/initramfs-scripts/initramfs-framework_%.bbappend
> 
> diff --git a/meta-ti-bsp/recipes-core/initramfs-scripts/initramfs-framework/83-netsetup b/meta-ti-bsp/recipes-core/initramfs-scripts/initramfs-framework/83-netsetup
> new file mode 100644
> index 00000000..b71bc3b3
> --- /dev/null
> +++ b/meta-ti-bsp/recipes-core/initramfs-scripts/initramfs-framework/83-netsetup
> @@ -0,0 +1,54 @@
> +#!/bin/sh
> +# Configure network via DHCP before NFS root mount. Polls for an Ethernet
> +# interface with sleep 1 per iteration to allow the Ethernet driver deferred
> +# probe chain to settle after udev loads the modules.
> +
> +netsetup_enabled() {
> +    [ "${bootparam_root}" = "/dev/nfs" ] || return 1
> +    return 0
> +}
> +
> +netsetup_run() {
> +    local iface timeout devtype
> +
> +    # Extract interface from ip= kernel param (format: client:server:gw:mask:host:device:autoconf)
> +    iface=""
> +    case "${bootparam_ip}" in
> +        dhcp|on|any|"")
> +            ;;
> +        *)
> +            iface=$(echo "${bootparam_ip}" | cut -d: -f6)
> +            ;;
> +    esac
> +
> +    udevadm trigger --action=add --subsystem-match=net
> +    udevadm settle --timeout=10
> +
> +    # Poll up to 60 seconds for an Ethernet interface (ARPHRD_ETHER = type 1).
> +    msg "netsetup: waiting for ethernet interface..."
> +    timeout=60
> +    while [ "${timeout}" -gt 0 ]; do
> +        if [ -n "${iface}" ] && [ -d "/sys/class/net/${iface}" ]; then
> +            break
> +        fi
> +        for dev in /sys/class/net/*; do
> +            [ -f "${dev}/type" ] || continue
> +            devtype=$(cat "${dev}/type")
> +            [ "${devtype}" = "1" ] || continue
> +            iface=$(basename "${dev}")
> +            break
> +        done
> +        [ -n "${iface}" ] && [ -d "/sys/class/net/${iface}" ] && break
> +        sleep 1
> +        timeout=$((timeout - 1))
> +    done
> +
> +    if [ -z "${iface}" ] || [ ! -d "/sys/class/net/${iface}" ]; then
> +        msg "netsetup: no ethernet interface found after 60s, skipping DHCP"
> +        return
> +    fi
> +
> +    msg "netsetup: configuring ${iface} via DHCP"
> +
> +    dhcpcd --waitip "${iface}"
> +}
> diff --git a/meta-ti-bsp/recipes-core/initramfs-scripts/initramfs-framework_%.bbappend b/meta-ti-bsp/recipes-core/initramfs-scripts/initramfs-framework_%.bbappend
> new file mode 100644
> index 00000000..c8955689
> --- /dev/null
> +++ b/meta-ti-bsp/recipes-core/initramfs-scripts/initramfs-framework_%.bbappend
> @@ -0,0 +1,15 @@
> +FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
> +
> +SUMMARY:initramfs-module-netsetup = "initramfs support for DHCP network setup before NFS root mount"

This should probably be a standalone initramfs-module* recipe, instead of a 
bbappend.


> +SRC_URI:append = " file://83-netsetup"
> +
> +PACKAGES =+ "initramfs-module-netsetup"
> +
> +RDEPENDS:initramfs-module-netsetup = "${PN}-base"
> +
> +FILES:initramfs-module-netsetup = "/init.d/83-netsetup"
> +
> +do_install:append() {
> +    install -m 0755 ${UNPACKDIR}/83-netsetup ${D}/init.d/83-netsetup
> +}
> diff --git a/meta-ti-bsp/recipes-ti/initramfs/packagegroup-ti-core-initramfs.bb b/meta-ti-bsp/recipes-ti/initramfs/packagegroup-ti-core-initramfs.bb
> index a9eff847..ede0639d 100644
> --- a/meta-ti-bsp/recipes-ti/initramfs/packagegroup-ti-core-initramfs.bb
> +++ b/meta-ti-bsp/recipes-ti/initramfs/packagegroup-ti-core-initramfs.bb
> @@ -18,6 +18,8 @@ RDEPENDS:${PN} += "\
>      netbase \
>      base-files \
>      base-passwd \
> +    dhcpcd \
> +    initramfs-module-netsetup \
>      initramfs-framework-base \
>      initramfs-module-udev \
>      initramfs-module-nfsrootfs \
> -- 
> 2.34.1
Ryan Eatmon June 2, 2026, 2:59 p.m. UTC | #2
On 6/2/2026 8:47 AM, Denys Dmytriyenko wrote:
> On Tue, Jun 02, 2026 at 04:18:10PM +0530, Moteen Shah via lists.yoctoproject.org wrote:
>> Add 83-netsetup, an initramfs-framework module that configures the
>> network interface via DHCP before the NFS root mount. Needed when the
>> Ethernet driver is a loadable module and the deferred probe chain
>> requires time to settle after udev loads the modules. Also add dhcpcd
>> to packagegroup-ti-core-initramfs to support DHCP configuration.
>>
>> Signed-off-by: Moteen Shah <m-shah@ti.com>
>> ---
>>   .../initramfs-framework/83-netsetup           | 54 +++++++++++++++++++
>>   .../initramfs-framework_%.bbappend            | 15 ++++++
>>   .../packagegroup-ti-core-initramfs.bb         |  2 +
>>   3 files changed, 71 insertions(+)
>>   create mode 100644 meta-ti-bsp/recipes-core/initramfs-scripts/initramfs-framework/83-netsetup
>>   create mode 100644 meta-ti-bsp/recipes-core/initramfs-scripts/initramfs-framework_%.bbappend
>>
>> diff --git a/meta-ti-bsp/recipes-core/initramfs-scripts/initramfs-framework/83-netsetup b/meta-ti-bsp/recipes-core/initramfs-scripts/initramfs-framework/83-netsetup
>> new file mode 100644
>> index 00000000..b71bc3b3
>> --- /dev/null
>> +++ b/meta-ti-bsp/recipes-core/initramfs-scripts/initramfs-framework/83-netsetup
>> @@ -0,0 +1,54 @@
>> +#!/bin/sh
>> +# Configure network via DHCP before NFS root mount. Polls for an Ethernet
>> +# interface with sleep 1 per iteration to allow the Ethernet driver deferred
>> +# probe chain to settle after udev loads the modules.
>> +
>> +netsetup_enabled() {
>> +    [ "${bootparam_root}" = "/dev/nfs" ] || return 1
>> +    return 0
>> +}
>> +
>> +netsetup_run() {
>> +    local iface timeout devtype
>> +
>> +    # Extract interface from ip= kernel param (format: client:server:gw:mask:host:device:autoconf)
>> +    iface=""
>> +    case "${bootparam_ip}" in
>> +        dhcp|on|any|"")
>> +            ;;
>> +        *)
>> +            iface=$(echo "${bootparam_ip}" | cut -d: -f6)
>> +            ;;
>> +    esac
>> +
>> +    udevadm trigger --action=add --subsystem-match=net
>> +    udevadm settle --timeout=10
>> +
>> +    # Poll up to 60 seconds for an Ethernet interface (ARPHRD_ETHER = type 1).
>> +    msg "netsetup: waiting for ethernet interface..."
>> +    timeout=60
>> +    while [ "${timeout}" -gt 0 ]; do
>> +        if [ -n "${iface}" ] && [ -d "/sys/class/net/${iface}" ]; then
>> +            break
>> +        fi
>> +        for dev in /sys/class/net/*; do
>> +            [ -f "${dev}/type" ] || continue
>> +            devtype=$(cat "${dev}/type")
>> +            [ "${devtype}" = "1" ] || continue
>> +            iface=$(basename "${dev}")
>> +            break
>> +        done
>> +        [ -n "${iface}" ] && [ -d "/sys/class/net/${iface}" ] && break
>> +        sleep 1
>> +        timeout=$((timeout - 1))
>> +    done
>> +
>> +    if [ -z "${iface}" ] || [ ! -d "/sys/class/net/${iface}" ]; then
>> +        msg "netsetup: no ethernet interface found after 60s, skipping DHCP"
>> +        return
>> +    fi
>> +
>> +    msg "netsetup: configuring ${iface} via DHCP"
>> +
>> +    dhcpcd --waitip "${iface}"
>> +}
>> diff --git a/meta-ti-bsp/recipes-core/initramfs-scripts/initramfs-framework_%.bbappend b/meta-ti-bsp/recipes-core/initramfs-scripts/initramfs-framework_%.bbappend
>> new file mode 100644
>> index 00000000..c8955689
>> --- /dev/null
>> +++ b/meta-ti-bsp/recipes-core/initramfs-scripts/initramfs-framework_%.bbappend
>> @@ -0,0 +1,15 @@
>> +FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
>> +
>> +SUMMARY:initramfs-module-netsetup = "initramfs support for DHCP network setup before NFS root mount"
> 
> This should probably be a standalone initramfs-module* recipe, instead of a
> bbappend.

Agreed.  It's a little confusing to add a subpackage like that.  We 
should create a new recipe and depend on that name to pull in this one 
file.  The name you chose was fine, just move it out of the bbappend.


> 
>> +SRC_URI:append = " file://83-netsetup"
>> +
>> +PACKAGES =+ "initramfs-module-netsetup"
>> +
>> +RDEPENDS:initramfs-module-netsetup = "${PN}-base"
>> +
>> +FILES:initramfs-module-netsetup = "/init.d/83-netsetup"
>> +
>> +do_install:append() {
>> +    install -m 0755 ${UNPACKDIR}/83-netsetup ${D}/init.d/83-netsetup
>> +}
>> diff --git a/meta-ti-bsp/recipes-ti/initramfs/packagegroup-ti-core-initramfs.bb b/meta-ti-bsp/recipes-ti/initramfs/packagegroup-ti-core-initramfs.bb
>> index a9eff847..ede0639d 100644
>> --- a/meta-ti-bsp/recipes-ti/initramfs/packagegroup-ti-core-initramfs.bb
>> +++ b/meta-ti-bsp/recipes-ti/initramfs/packagegroup-ti-core-initramfs.bb
>> @@ -18,6 +18,8 @@ RDEPENDS:${PN} += "\
>>       netbase \
>>       base-files \
>>       base-passwd \
>> +    dhcpcd \
>> +    initramfs-module-netsetup \
>>       initramfs-framework-base \
>>       initramfs-module-udev \
>>       initramfs-module-nfsrootfs \
>> -- 
>> 2.34.1
Denys Dmytriyenko June 2, 2026, 5:34 p.m. UTC | #3
On Tue, Jun 02, 2026 at 09:59:15AM -0500, Ryan Eatmon wrote:
> 
> 
> On 6/2/2026 8:47 AM, Denys Dmytriyenko wrote:
> >On Tue, Jun 02, 2026 at 04:18:10PM +0530, Moteen Shah via lists.yoctoproject.org wrote:
> >>Add 83-netsetup, an initramfs-framework module that configures the
> >>network interface via DHCP before the NFS root mount. Needed when the
> >>Ethernet driver is a loadable module and the deferred probe chain
> >>requires time to settle after udev loads the modules. Also add dhcpcd
> >>to packagegroup-ti-core-initramfs to support DHCP configuration.
> >>
> >>Signed-off-by: Moteen Shah <m-shah@ti.com>
> >>---
> >>  .../initramfs-framework/83-netsetup           | 54 +++++++++++++++++++
> >>  .../initramfs-framework_%.bbappend            | 15 ++++++
> >>  .../packagegroup-ti-core-initramfs.bb         |  2 +
> >>  3 files changed, 71 insertions(+)
> >>  create mode 100644 meta-ti-bsp/recipes-core/initramfs-scripts/initramfs-framework/83-netsetup
> >>  create mode 100644 meta-ti-bsp/recipes-core/initramfs-scripts/initramfs-framework_%.bbappend
> >>
> >>diff --git a/meta-ti-bsp/recipes-core/initramfs-scripts/initramfs-framework/83-netsetup b/meta-ti-bsp/recipes-core/initramfs-scripts/initramfs-framework/83-netsetup
> >>new file mode 100644
> >>index 00000000..b71bc3b3
> >>--- /dev/null
> >>+++ b/meta-ti-bsp/recipes-core/initramfs-scripts/initramfs-framework/83-netsetup
> >>@@ -0,0 +1,54 @@
> >>+#!/bin/sh
> >>+# Configure network via DHCP before NFS root mount. Polls for an Ethernet
> >>+# interface with sleep 1 per iteration to allow the Ethernet driver deferred
> >>+# probe chain to settle after udev loads the modules.
> >>+
> >>+netsetup_enabled() {
> >>+    [ "${bootparam_root}" = "/dev/nfs" ] || return 1
> >>+    return 0
> >>+}
> >>+
> >>+netsetup_run() {
> >>+    local iface timeout devtype
> >>+
> >>+    # Extract interface from ip= kernel param (format: client:server:gw:mask:host:device:autoconf)
> >>+    iface=""
> >>+    case "${bootparam_ip}" in
> >>+        dhcp|on|any|"")
> >>+            ;;
> >>+        *)
> >>+            iface=$(echo "${bootparam_ip}" | cut -d: -f6)
> >>+            ;;
> >>+    esac
> >>+
> >>+    udevadm trigger --action=add --subsystem-match=net
> >>+    udevadm settle --timeout=10
> >>+
> >>+    # Poll up to 60 seconds for an Ethernet interface (ARPHRD_ETHER = type 1).
> >>+    msg "netsetup: waiting for ethernet interface..."
> >>+    timeout=60
> >>+    while [ "${timeout}" -gt 0 ]; do
> >>+        if [ -n "${iface}" ] && [ -d "/sys/class/net/${iface}" ]; then
> >>+            break
> >>+        fi
> >>+        for dev in /sys/class/net/*; do
> >>+            [ -f "${dev}/type" ] || continue
> >>+            devtype=$(cat "${dev}/type")
> >>+            [ "${devtype}" = "1" ] || continue
> >>+            iface=$(basename "${dev}")
> >>+            break
> >>+        done
> >>+        [ -n "${iface}" ] && [ -d "/sys/class/net/${iface}" ] && break
> >>+        sleep 1
> >>+        timeout=$((timeout - 1))
> >>+    done
> >>+
> >>+    if [ -z "${iface}" ] || [ ! -d "/sys/class/net/${iface}" ]; then
> >>+        msg "netsetup: no ethernet interface found after 60s, skipping DHCP"
> >>+        return
> >>+    fi
> >>+
> >>+    msg "netsetup: configuring ${iface} via DHCP"
> >>+
> >>+    dhcpcd --waitip "${iface}"
> >>+}
> >>diff --git a/meta-ti-bsp/recipes-core/initramfs-scripts/initramfs-framework_%.bbappend b/meta-ti-bsp/recipes-core/initramfs-scripts/initramfs-framework_%.bbappend
> >>new file mode 100644
> >>index 00000000..c8955689
> >>--- /dev/null
> >>+++ b/meta-ti-bsp/recipes-core/initramfs-scripts/initramfs-framework_%.bbappend
> >>@@ -0,0 +1,15 @@
> >>+FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
> >>+
> >>+SUMMARY:initramfs-module-netsetup = "initramfs support for DHCP network setup before NFS root mount"
> >
> >This should probably be a standalone initramfs-module* recipe, instead of a
> >bbappend.
> 
> Agreed.  It's a little confusing to add a subpackage like that.  We
> should create a new recipe and depend on that name to pull in this
> one file.  The name you chose was fine, just move it out of the
> bbappend.

There are numerous examples of existing initramfs-module-* recipes that 
extend initramfs-framework functionality, e.g.:
https://git.openembedded.org/openembedded-core/tree/meta/recipes-core/initrdscripts/initramfs-module-install-efi_1.0.bb
https://git.openembedded.org/openembedded-core/tree/meta/recipes-core/initrdscripts/initramfs-module-install_1.0.bb
https://git.openembedded.org/openembedded-core/tree/meta/recipes-core/initrdscripts/initramfs-module-setup-live_1.0.bb

And don't forget about our own such recipe for LUKS with fTPM:
https://git.yoctoproject.org/meta-ti/tree/meta-ti-bsp/dynamic-layers/tpm-layer/recipes-ti/initramfs/initramfs-module-luks-ftpm_1.0.bb


> >>+SRC_URI:append = " file://83-netsetup"
> >>+
> >>+PACKAGES =+ "initramfs-module-netsetup"
> >>+
> >>+RDEPENDS:initramfs-module-netsetup = "${PN}-base"
> >>+
> >>+FILES:initramfs-module-netsetup = "/init.d/83-netsetup"
> >>+
> >>+do_install:append() {
> >>+    install -m 0755 ${UNPACKDIR}/83-netsetup ${D}/init.d/83-netsetup
> >>+}
> >>diff --git a/meta-ti-bsp/recipes-ti/initramfs/packagegroup-ti-core-initramfs.bb b/meta-ti-bsp/recipes-ti/initramfs/packagegroup-ti-core-initramfs.bb
> >>index a9eff847..ede0639d 100644
> >>--- a/meta-ti-bsp/recipes-ti/initramfs/packagegroup-ti-core-initramfs.bb
> >>+++ b/meta-ti-bsp/recipes-ti/initramfs/packagegroup-ti-core-initramfs.bb
> >>@@ -18,6 +18,8 @@ RDEPENDS:${PN} += "\
> >>      netbase \
> >>      base-files \
> >>      base-passwd \
> >>+    dhcpcd \
> >>+    initramfs-module-netsetup \
> >>      initramfs-framework-base \
> >>      initramfs-module-udev \
> >>      initramfs-module-nfsrootfs \
> >>-- 
> >>2.34.1
diff mbox series

Patch

diff --git a/meta-ti-bsp/recipes-core/initramfs-scripts/initramfs-framework/83-netsetup b/meta-ti-bsp/recipes-core/initramfs-scripts/initramfs-framework/83-netsetup
new file mode 100644
index 00000000..b71bc3b3
--- /dev/null
+++ b/meta-ti-bsp/recipes-core/initramfs-scripts/initramfs-framework/83-netsetup
@@ -0,0 +1,54 @@ 
+#!/bin/sh
+# Configure network via DHCP before NFS root mount. Polls for an Ethernet
+# interface with sleep 1 per iteration to allow the Ethernet driver deferred
+# probe chain to settle after udev loads the modules.
+
+netsetup_enabled() {
+    [ "${bootparam_root}" = "/dev/nfs" ] || return 1
+    return 0
+}
+
+netsetup_run() {
+    local iface timeout devtype
+
+    # Extract interface from ip= kernel param (format: client:server:gw:mask:host:device:autoconf)
+    iface=""
+    case "${bootparam_ip}" in
+        dhcp|on|any|"")
+            ;;
+        *)
+            iface=$(echo "${bootparam_ip}" | cut -d: -f6)
+            ;;
+    esac
+
+    udevadm trigger --action=add --subsystem-match=net
+    udevadm settle --timeout=10
+
+    # Poll up to 60 seconds for an Ethernet interface (ARPHRD_ETHER = type 1).
+    msg "netsetup: waiting for ethernet interface..."
+    timeout=60
+    while [ "${timeout}" -gt 0 ]; do
+        if [ -n "${iface}" ] && [ -d "/sys/class/net/${iface}" ]; then
+            break
+        fi
+        for dev in /sys/class/net/*; do
+            [ -f "${dev}/type" ] || continue
+            devtype=$(cat "${dev}/type")
+            [ "${devtype}" = "1" ] || continue
+            iface=$(basename "${dev}")
+            break
+        done
+        [ -n "${iface}" ] && [ -d "/sys/class/net/${iface}" ] && break
+        sleep 1
+        timeout=$((timeout - 1))
+    done
+
+    if [ -z "${iface}" ] || [ ! -d "/sys/class/net/${iface}" ]; then
+        msg "netsetup: no ethernet interface found after 60s, skipping DHCP"
+        return
+    fi
+
+    msg "netsetup: configuring ${iface} via DHCP"
+
+    dhcpcd --waitip "${iface}"
+}
diff --git a/meta-ti-bsp/recipes-core/initramfs-scripts/initramfs-framework_%.bbappend b/meta-ti-bsp/recipes-core/initramfs-scripts/initramfs-framework_%.bbappend
new file mode 100644
index 00000000..c8955689
--- /dev/null
+++ b/meta-ti-bsp/recipes-core/initramfs-scripts/initramfs-framework_%.bbappend
@@ -0,0 +1,15 @@ 
+FILESEXTRAPATHS:prepend := "${THISDIR}/${PN}:"
+
+SUMMARY:initramfs-module-netsetup = "initramfs support for DHCP network setup before NFS root mount"
+
+SRC_URI:append = " file://83-netsetup"
+
+PACKAGES =+ "initramfs-module-netsetup"
+
+RDEPENDS:initramfs-module-netsetup = "${PN}-base"
+
+FILES:initramfs-module-netsetup = "/init.d/83-netsetup"
+
+do_install:append() {
+    install -m 0755 ${UNPACKDIR}/83-netsetup ${D}/init.d/83-netsetup
+}
diff --git a/meta-ti-bsp/recipes-ti/initramfs/packagegroup-ti-core-initramfs.bb b/meta-ti-bsp/recipes-ti/initramfs/packagegroup-ti-core-initramfs.bb
index a9eff847..ede0639d 100644
--- a/meta-ti-bsp/recipes-ti/initramfs/packagegroup-ti-core-initramfs.bb
+++ b/meta-ti-bsp/recipes-ti/initramfs/packagegroup-ti-core-initramfs.bb
@@ -18,6 +18,8 @@  RDEPENDS:${PN} += "\
     netbase \
     base-files \
     base-passwd \
+    dhcpcd \
+    initramfs-module-netsetup \
     initramfs-framework-base \
     initramfs-module-udev \
     initramfs-module-nfsrootfs \