This is an automated email from the ASF dual-hosted git repository.

michallenc pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git


The following commit(s) were added to refs/heads/master by this push:
     new 49cb4729302 Documentation/netutils: add comprehensive guide for netinit
49cb4729302 is described below

commit 49cb4729302ee68b0b95ec07e966a8f72bb7ee94
Author: Swatantra Yadav <[email protected]>
AuthorDate: Sat Oct 10 22:47:30 2026 +0530

    Documentation/netutils: add comprehensive guide for netinit
    
    Provide a complete documentation guide for the netinit (network 
initialization)
    subsystem in Documentation/applications/netutils/netinit/index.rst, 
replacing
    the previous 4-line placeholder stub.
    
    Includes:
    - Architectural overview and execution modes (synchronous sequential, 
asynchronous background pthread, and split local-only configuration via 
CONFIG_NETINIT_NETLOCAL)
    - Autonomous MII PHY link monitoring daemon (CONFIG_NETINIT_MONITOR) with 
carrier detection, MII ioctl polling, and signal-driven reconnection
    - Primary network device selection hierarchy (wlan0, eth0, wpan0, bnep0, 
sl0, tun0, lo, can0)
    - Software MAC address provisioning strategies (CONFIG_NETINIT_NOMAC via 
UID-derived IEEE LAA, device calibration file, and fixed software MAC)
    - IPv4 static configuration, dynamic DHCP client (RFC 2131), and runtime IP 
configuration file (fsutils/ipcfg via CONFIG_IPCFG_PATH, ASCII and binary 
formats)
    - IPv6 static addressing and ICMPv6 Stateless Address Autoconfiguration 
(SLAAC, RFC 4862), with effective /112 Kconfig netmask default
    - DNS nameserver registration and automated NTP client daemon startup 
(ntpclient)
    - Wi-Fi association via WAPI (wpa_driver_wext_associate) with WPA2-PSK and 
infrastructure/ad-hoc modes
    - Complete Kconfig options reference table
    - Public C API reference (netinit_bringup, netinit_associate)
    - Practical configuration and usage scenarios (Ethernet with DHCP, static 
IP industrial node with silicon UID MAC, and Wi-Fi IoT auto-association)
    - Troubleshooting and diagnostics guide (CONFIG_NETINIT_DEBUG, boot 
freezes, link monitor PHY interrupts, and Wi-Fi association)
    
    Addresses #11081
    
    Assisted-by: Google Gemini
    Signed-off-by: Swatantra Yadav <[email protected]>
---
 .../applications/netutils/netinit/index.rst        | 654 ++++++++++++++++++++-
 1 file changed, 653 insertions(+), 1 deletion(-)

diff --git a/Documentation/applications/netutils/netinit/index.rst 
b/Documentation/applications/netutils/netinit/index.rst
index f07a5d7dac7..1153f9d6e04 100644
--- a/Documentation/applications/netutils/netinit/index.rst
+++ b/Documentation/applications/netutils/netinit/index.rst
@@ -1,3 +1,655 @@
 ==================================
-``netinit`` Network initialization
+``netinit`` Network Initialization
 ==================================
+
+The ``netinit`` utility is the standard network interface bring-up and 
configuration
+subsystem in Apache NuttX (``apps/netutils/netinit``). It serves as the 
primary bridge
+between lower-half network hardware drivers (Ethernet MAC/PHY, IEEE 802.11 
Wi-Fi, 6LoWPAN,
+SLIP, TUN, Loopback, SocketCAN) and upper-half network application layers 
(NuttX socket
+layer, ``netlib``, and NuttShell).
+
+``netinit`` coordinates the full boot-up sequence of network interfaces:
+
+- **MAC Address Assignment**: Configures fixed software MACs, board unique ID 
(UID)
+  locally administered addresses (LAA), or device calibration file MACs.
+- **Link Layer Configuration**: Identifies and initializes the primary 
interface
+  (e.g., ``eth0``, ``wlan0``, ``wpan0``).
+- **IP Addressing**: Assigns static IPv4 addresses or coordinates dynamic 
configuration
+  via the DHCP client (:rfc:`2131`), static IPv6 addresses or ICMPv6 Stateless 
Address
+  Autoconfiguration (SLAAC, :rfc:`4862`), or runtime configuration via 
``ipcfg`` files.
+- **Wi-Fi Association**: Integrates with Wireless Application Programming 
Interface
+  (WAPI) to automatically associate Wi-Fi interfaces with an Access Point 
(WPA/WPA2-PSK).
+- **DNS Registration**: Registers default nameserver addresses with the 
resolver.
+- **Auxiliary Network Services**: Optionally auto-launches background daemons 
such
+  as the NTP client (``ntpclient``).
+- **Autonomous Link Monitoring**: Runs an optional background event-driven 
monitor that
+  detects PHY carrier changes, manages graceful link up/down transitions, and 
retries
+  bring-up after disconnection.
+
+Architecture and Operational Modes
+==================================
+
+``netinit`` supports three primary architectural execution models to 
accommodate different
+embedded memory, real-time, and hardware constraints.
+
+.. code-block:: text
+
+   +-------------------------------------------------------------------------+
+   |                       System Boot (nsh_init / nxinit)                  |
+   +-------------------------------------------------------------------------+
+                                        |
+                                        v
+                            netinit_bringup()
+                                        |
+                 +----------------------+----------------------+
+                 |                                             |
+                 v (CONFIG_NETINIT_THREAD=n)                   v 
(CONFIG_NETINIT_THREAD=y)
+        Sequential Foreground                         Spawn "netinit" Thread
+                 |                                    (Priority 80 / Detached)
+                 +----------------------+----------------------+
+                                        |
+                                        v
+   +-------------------------------------------------------------------------+
+   |                    Phase 1: Local Device Initialization                 |
+   |  - Select Primary Device (wlan0 / eth0 / wpan0 / bnep0 / sl0 / tun0)    |
+   |  - Provision MAC Address (UIDMAC / Device Info / Fixed Software MAC)    |
+   |  - Provision Local IP/Mask (Static Kconfig / fsutils ipcfg)             |
+   +-------------------------------------------------------------------------+
+                                        |
+                                        +-----> (If CONFIG_NETINIT_NETLOCAL=y: 
Exit)
+                                        |
+                                        v
+   +-------------------------------------------------------------------------+
+   |                    Phase 2: Network Interface Bring-Up                  |
+   |  - Bring Interface UP (netlib_ifup)                                     |
+   |  - Associate Wi-Fi AP via WAPI (wpa_driver_wext_associate)              |
+   |  - Acquire Dynamic IP via DHCPC or ICMPv6 SLAAC                         |
+   |  - Register Default DNS Nameserver                                      |
+   |  - Start NTP Client Daemon (ntpc_start)                                 |
+   +-------------------------------------------------------------------------+
+                                        |
+                 +----------------------+----------------------+
+                 |                                             |
+                 v (CONFIG_NETINIT_MONITOR=n)                  v 
(CONFIG_NETINIT_MONITOR=y)
+            Exit Thread /                               Persistent MII Monitor
+          Release Resources                              (SIOCMIINOTIFY Event 
Loop)
+
+Sequential Initialization Mode
+------------------------------
+
+When ``CONFIG_NETINIT_THREAD`` is disabled (default), ``netinit_bringup()`` 
executes
+synchronously on the calling task's thread (for example, during NSH startup in 
``nsh_init()``
+or system startup in ``nxinit``).
+
+- **Advantages**: Consumes zero additional thread stacks or task management 
overhead;
+  ideal for microcontrollers with very limited RAM (e.g., <= 64 KB).
+- **Caveats**: If the physical Ethernet cable is unplugged, or if the PHY 
auto-negotiation
+  or DHCP acquisition requires several seconds, system boot will block until 
timeouts
+  expire.
+
+Threaded Asynchronous Mode
+--------------------------
+
+When ``CONFIG_NETINIT_THREAD=y`` is selected, ``netinit_bringup()`` spawns a 
dedicated
+background POSIX thread (named ``"netinit"``) with configurable stack size
+(``CONFIG_NETINIT_THREAD_STACKSIZE``) and priority 
(``CONFIG_NETINIT_THREAD_PRIORITY``,
+typically set to low priority, such as 80 or 100).
+
+- **Advantages**: System boot proceeds immediately. Applications, the 
NuttShell console,
+  and local real-time tasks start instantly without blocking on network 
auto-negotiation.
+- **Lifecycle**: The thread configures the network interface, performs DHCP or 
Wi-Fi
+  association, and once the network is operational, terminates cleanly to 
reclaim its
+  allocated resources (unless the Link State Monitor is enabled).
+
+Local vs. Network Bringup Split
+-------------------------------
+
+When ``CONFIG_NETINIT_NETLOCAL=y`` is enabled, ``netinit`` performs only local 
interface
+provisioning:
+
+1. Software MAC address assignment (if hardware requires it).
+2. Local IP address and subnet assignment on the network device.
+
+It explicitly suppresses:
+
+- Bringing the interface state UP via ``netlib_ifup()``.
+- Wi-Fi Access Point association via WAPI.
+- Dynamic IP negotiation via the DHCP client.
+- Starting the background NTP client daemon.
+
+This split mode is particularly useful in multi-stage boot environments where 
wireless
+scanning, captive portal redirection, or user credential entry must occur 
before bringing
+the network interface online.
+
+Link State Monitor Daemon
+-------------------------
+
+When ``CONFIG_NETINIT_MONITOR=y`` is selected (requiring 
``CONFIG_NETINIT_THREAD=y``,
+``CONFIG_ARCH_PHY_INTERRUPT=y``, ``CONFIG_NETDEV_PHY_IOCTL=y``, and 
``CONFIG_NET_UDP=y``),
+the ``netinit`` thread persists permanently as an event-driven daemon:
+
+1. **Signal Attachment**: Registers a signal handler for 
``CONFIG_NETINIT_SIGNO``
+   (default real-time signal 32) using ``sigaction()``.
+2. **PHY Event Registration**: Issues an ``ioctl(sd, SIOCMIINOTIFY, ...)`` 
command to the
+   network driver, requesting asynchronous signal delivery upon MII PHY link 
status
+   changes.
+3. **Carrier Detection**: Reads PHY status registers (``SIOCGMIIPHY`` and 
``SIOCGMIIREG``
+   at register ``MII_MSR``) to evaluate ``MII_MSR_LINKSTATUS``.
+4. **Transition to Up**: When the link transitions from down to up, 
``netinit`` marks
+   the device operational (``IFF_UP``), re-executes ICMPv6 auto-configuration 
if enabled,
+   and sleeps until the next interrupt.
+5. **Transition to Down**: When cable disconnection is detected, ``netinit`` 
clears
+   the ``IFF_UP`` flag and periodically attempts reconnection every
+   ``CONFIG_NETINIT_RETRYMSEC`` milliseconds (default 2000 ms).
+
+Device Selection Hierarchy
+==========================
+
+``netinit`` identifies the primary network interface name (``NET_DEVNAME``) at 
compile
+time based on enabled link-layer drivers, adhering to the following selection 
precedence:
+
+.. list-table::
+   :widths: 25 20 55
+   :header-rows: 1
+
+   * - Interface Name
+     - Configuration Guard
+     - Description
+   * - ``wlan0``
+     - ``CONFIG_DRIVERS_IEEE80211``
+     - IEEE 802.11 wireless network adapter (Wi-Fi).
+   * - ``eth0``
+     - ``CONFIG_NET_ETHERNET``
+     - Standard 10/100/1000 Mbps Ethernet MAC/PHY.
+   * - ``wpan0``
+     - ``CONFIG_NET_6LOWPAN`` or ``CONFIG_NET_IEEE802154``
+     - Low-power wireless personal area network (6LoWPAN / Zigbee).
+   * - ``bnep0``
+     - ``CONFIG_NET_BLUETOOTH``
+     - Bluetooth Network Encapsulation Protocol interface.
+   * - ``sl0``
+     - ``CONFIG_NET_SLIP``
+     - Serial Line Internet Protocol (SLIP) point-to-point interface.
+   * - ``tun0``
+     - ``CONFIG_NET_TUN``
+     - Virtual TUN/TAP network tunnel adapter.
+   * - ``lo``
+     - ``CONFIG_NET_LOOPBACK``
+     - Local loopback interface (``127.0.0.1``).
+   * - ``can0``
+     - ``CONFIG_NET_CAN``
+     - SocketCAN controller interface.
+
+MAC Address Assignment Strategies
+=================================
+
+Embedded network controllers often lack factory-programmed MAC addresses in 
non-volatile
+hardware registers. When ``CONFIG_NETINIT_NOMAC=y`` is set, ``netinit`` 
provisions a
+valid MAC address before bringing the interface up using one of three 
strategies:
+
+Board Unique ID (``CONFIG_NETINIT_UIDMAC``)
+-------------------------------------------
+
+Queries the microcontroller's factory-flashed unique silicon ID (e.g., STM32 
96-bit UID,
+ESP32 eFuse MAC) by invoking:
+
+.. code-block:: c
+
+   boardctl(BOARDIOC_UNIQUEID, (uintptr_t)&uid);
+
+The first byte is adjusted to set the IEEE Locally Administered Address (LAA) 
bit and
+clear the multicast bit:
+
+.. code-block:: c
+
+   uid[0] = (uid[0] & 0xf0) | 0x02; /* Locally Administered MAC */
+   netlib_setmacaddr(NET_DEVNAME, uid);
+
+This allows boards booted from the same firmware binary to dynamically generate
+a unique, UID-derived MAC address on the local network without hardcoding. 
Note that
+because 64-bit or 96-bit MCU hardware UIDs are truncated to 48 bits (6 bytes 
for Ethernet)
+or 64 bits (for 6LoWPAN), collision avoidance depends on the uniqueness of the 
lower UID
+bytes exposed by the hardware platform.
+
+Device Info File (``CONFIG_NETINIT_MACADDR``)
+---------------------------------------------
+
+Loads a calibrated, production-programmed MAC address from persistent 
non-volatile
+storage (e.g., ``/etc/device.info`` or EEPROM) via:
+
+.. code-block:: c
+
+   boardctl(BOARDIOC_MACADDR, (uintptr_t)&req);
+
+Fixed Software MAC (``CONFIG_NETINIT_SWMAC``)
+---------------------------------------------
+
+Assigns a static MAC address defined directly in Kconfig:
+
+- ``CONFIG_NETINIT_MACADDR_1``: Lower 4 bytes (e.g., ``0xdeadbeef``).
+- ``CONFIG_NETINIT_MACADDR_2``: Upper 2 bytes (e.g., ``0x00e0`` for Ethernet).
+
+IP Address Configuration
+========================
+
+IPv4 Addressing
+---------------
+
+Dynamic DHCP Client (``CONFIG_NETINIT_DHCPC``)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+When ``CONFIG_NETINIT_DHCPC=y`` is selected (requires 
``CONFIG_NETUTILS_DHCPC=y``),
+``netinit`` initializes the device address to ``0.0.0.0``, brings the link up, 
and
+calls:
+
+.. code-block:: c
+
+   netlib_obtain_ipv4addr(NET_DEVNAME);
+
+The DHCP client broadcasts a ``DHCPDISCOVER`` packet, negotiates lease terms 
with the local
+DHCP server, and automatically applies the assigned IP address, network mask, 
default
+gateway router, and DNS nameservers.
+
+Static IPv4 Configuration
+^^^^^^^^^^^^^^^^^^^^^^^^^
+
+When DHCP is disabled, static addresses are supplied via Kconfig in 32-bit 
host byte order:
+
+- ``CONFIG_NETINIT_IPADDR``: Target host IP (e.g., ``0x0a000002`` for 
``10.0.0.2``).
+- ``CONFIG_NETINIT_DRIPADDR``: Default router IP (e.g., ``0x0a000001`` for 
``10.0.0.1``).
+- ``CONFIG_NETINIT_NETMASK``: Subnet mask (e.g., ``0xffffff00`` for 
``255.255.255.0``).
+
+Runtime File-Based Configuration (``CONFIG_FSUTILS_IPCFG``)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+If ``CONFIG_FSUTILS_IPCFG=y`` is enabled, ``netinit`` attempts to read network 
settings
+at runtime from a persistent IP configuration file using ``ipcfg_read()``.
+
+**Storage Path (CONFIG_IPCFG_PATH)**
+  The location of the configuration file is defined by ``CONFIG_IPCFG_PATH`` 
(defaulting
+  to ``/etc/sysconfig/network-scripts``). In standard filesystem mode, 
``netinit`` resolves
+  the per-interface configuration file as 
``<CONFIG_IPCFG_PATH>/ipcfg-<netdev>``
+  (for example, ``/etc/sysconfig/network-scripts/ipcfg-eth0``).
+
+  Alternatively, on deeply embedded single-interface targets lacking a mounted 
file system,
+  ``CONFIG_IPCFG_CHARDEV=y`` allows ``CONFIG_IPCFG_PATH`` to specify the 
direct path to a
+  character driver (such as an EEPROM or FLASH memory node, e.g., 
``/dev/eeprom``).
+
+**File Formats (ASCII vs. Binary)**
+  The configuration format is determined by ``CONFIG_IPCFG_BINARY``:
+
+  - **ASCII Format (Default, ``CONFIG_IPCFG_BINARY=n``)**:
+    Stored as a human-readable text file composed of standard 
``<variable>=<value>`` pairs
+    (e.g., ``DEVICE=eth0``, ``BOOTPROTO=static``, ``IPADDR=192.168.1.50``,
+    ``NETMASK=255.255.255.0``, ``ROUTER=192.168.1.1``, ``DNS=8.8.8.8``).
+
+  - **Binary Format (``CONFIG_IPCFG_BINARY=y``)**:
+    Stored as a compact, fixed-size binary structure (``struct ipcfg_s``). 
This eliminates
+    string parsing overhead and is specifically tailored for constrained 
non-volatile media
+    such as EEPROM or raw flash blocks.
+
+**Operational Precedence**
+  If the configuration file specifies ``IPv4PROTO_DHCP`` (or 
``BOOTPROTO=dhcp``), dynamic
+  DHCP client negotiation is performed. If static parameters are defined, the 
file's
+  static IP, gateway, and netmask override the compile-time Kconfig defaults. 
If the backing
+  filesystem mounts asynchronously after task boot, 
``CONFIG_NETINIT_RETRY_MOUNTPATH``
+  specifies the number of retry iterations ``netinit`` performs before falling 
back.
+
+IPv6 Addressing
+---------------
+
+Stateless Address Autoconfiguration (SLAAC)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+When ``CONFIG_NET_ICMPv6_AUTOCONF=y`` is set, ``netinit`` invokes:
+
+.. code-block:: c
+
+   netlib_icmpv6_autoconfiguration(NET_DEVNAME);
+
+The interface transmits an ICMPv6 Router Solicitation and processes Router 
Advertisement
+prefixes to construct its global IPv6 address per :rfc:`4862`.
+
+Static IPv6 Configuration
+^^^^^^^^^^^^^^^^^^^^^^^^^
+
+If SLAAC is not used, static IPv6 addresses are defined as eight 16-bit hex 
values in host
+order:
+
+- Host IP: ``CONFIG_NETINIT_IPv6ADDR_1`` through ``CONFIG_NETINIT_IPv6ADDR_8`` 
(defaults
+  to ``fc00::2``).
+- Gateway: ``CONFIG_NETINIT_DRIPv6ADDR_1`` through 
``CONFIG_NETINIT_DRIPv6ADDR_8``
+  (defaults to ``fc00::1``).
+- Netmask: ``CONFIG_NETINIT_IPv6NETMASK_1`` through 
``CONFIG_NETINIT_IPv6NETMASK_8``.
+  In ``Kconfig``, words 1 through 7 default to ``0xffff`` while word 8 
defaults to
+  ``0x0000``, producing an effective default netmask of
+  ``ffff:ffff:ffff:ffff:ffff:ffff:ffff:0`` (``/112``). If a standard prefix 
such as
+  ``/64`` (``ffff:ffff:ffff:ffff::``) is required, the individual netmask 
words should
+  be set explicitly in your board configuration.
+
+DNS Nameserver Configuration
+----------------------------
+
+When ``CONFIG_NETINIT_DNS=y`` is enabled (depends on 
``CONFIG_NETDB_DNSCLIENT=y``),
+``netinit`` configures the default nameserver:
+
+- Defaults to the default gateway address (``CONFIG_NETINIT_DRIPADDR``) or
+  ``CONFIG_NETINIT_DNSIPADDR``.
+- The address is committed using ``netlib_set_ipv4dnsaddr()``.
+
+Wi-Fi Association (WAPI Integration)
+====================================
+
+For IEEE 802.11 Wi-Fi adapters (``CONFIG_DRIVERS_IEEE80211=y`` and 
``CONFIG_WIRELESS_WAPI=y``),
+``netinit`` automatically coordinates wireless association with an Access 
Point via
+``netinit_associate("wlan0")``.
+
+Parameters configured via Kconfig or runtime WAPI files:
+
+- **Station Mode**: Infrastructure (``CONFIG_NETINIT_WAPI_STAMODE_INFRA``), 
Ad-hoc,
+  Repeater, Monitor, or Mesh.
+- **Authentication**: WPA2-Personal (``CONFIG_NETINIT_WAPI_AUTHWPA_WPA2``), 
WPA-Personal,
+  or Disabled/Open.
+- **Cipher**: CCMP/AES (``CONFIG_NETINIT_WAPI_CIPHERMODE_CCMP``), TKIP, or WEP.
+- **Algorithm**: ``WPA_ALG_CCMP`` (``CONFIG_NETINIT_WAPI_ALG_CCMP``).
+- **Credentials**: ``CONFIG_NETINIT_WAPI_SSID`` and 
``CONFIG_NETINIT_WAPI_PASSPHRASE``.
+
+NTP Client Synchronization
+==========================
+
+If ``CONFIG_NETUTILS_NTPCLIENT=y`` is selected, ``netinit`` automatically 
starts the
+Network Time Protocol daemon as soon as interface bring-up succeeds:
+
+.. code-block:: c
+
+   ntpc_start();
+
+This ensures that system clocks on embedded targets without hardware 
battery-backed Real-Time
+Clocks (RTC) synchronize immediately upon network establishment.
+
+Configuration Reference
+=======================
+
+The following table summarizes key configuration options in 
``apps/netutils/netinit/Kconfig``:
+
+.. list-table::
+   :widths: 35 15 15 35
+   :header-rows: 1
+
+   * - Symbol
+     - Type
+     - Default
+     - Description
+   * - ``CONFIG_NETUTILS_NETINIT``
+     - boolean
+     - ``n``
+     - Master enable switch for the network initialization subsystem.
+   * - ``CONFIG_NETINIT_NETLOCAL``
+     - boolean
+     - ``n``
+     - Restricts initialization to local MAC and IP setup; does not bring link 
UP.
+   * - ``CONFIG_NETINIT_THREAD``
+     - boolean
+     - ``n``
+     - Executes network bring-up asynchronously in a dedicated background 
pthread.
+   * - ``CONFIG_NETINIT_THREAD_PRIORITY``
+     - integer
+     - ``80``
+     - Priority of the asynchronous initialization thread.
+   * - ``CONFIG_NETINIT_THREAD_STACKSIZE``
+     - integer
+     - ``DEFAULT_TASK_STACKSIZE``
+     - Stack size in bytes for the ``netinit`` thread.
+   * - ``CONFIG_NETINIT_MONITOR``
+     - boolean
+     - ``n``
+     - Enables autonomous MII PHY carrier link status monitoring daemon.
+   * - ``CONFIG_NETINIT_SIGNO``
+     - integer
+     - ``32``
+     - Real-time signal number used for asynchronous PHY event notifications.
+   * - ``CONFIG_NETINIT_RETRYMSEC``
+     - integer
+     - ``2000``
+     - Retry period in milliseconds when attempting to reconnect a dropped 
link.
+   * - ``CONFIG_NETINIT_RETRY_MOUNTPATH``
+     - integer
+     - ``0``
+     - Number of retries waiting for filesystem mount before reading ``ipcfg``.
+   * - ``CONFIG_IPCFG_PATH``
+     - string
+     - ``"/etc/sysconfig/network-scripts"``
+     - Directory path or character device node for IP configuration storage 
(via ``fsutils/ipcfg``).
+   * - ``CONFIG_IPCFG_BINARY``
+     - boolean
+     - ``n``
+     - Selects compact binary format over human-readable ASCII text for 
``ipcfg``.
+   * - ``CONFIG_NETINIT_DEBUG``
+     - boolean
+     - ``n``
+     - Enables verbose unit-level debug traces without enabling global 
``DEBUG_NET``.
+   * - ``CONFIG_NETINIT_DHCPC``
+     - boolean
+     - ``n``
+     - Uses DHCP client (``netutils/dhcpc``) to dynamically acquire an IPv4 
address.
+   * - ``CONFIG_NETINIT_IPADDR``
+     - hex
+     - ``0x0a000002``
+     - Static host IPv4 address in host order (e.g., ``10.0.0.2``).
+   * - ``CONFIG_NETINIT_DRIPADDR``
+     - hex
+     - ``0x0a000001``
+     - Static default router (gateway) IPv4 address (e.g., ``10.0.0.1``).
+   * - ``CONFIG_NETINIT_NETMASK``
+     - hex
+     - ``0xffffff00``
+     - Static IPv4 subnet mask (e.g., ``255.255.255.0``).
+   * - ``CONFIG_NETINIT_DNS``
+     - boolean
+     - ``n``
+     - Enables default DNS nameserver address registration.
+   * - ``CONFIG_NETINIT_DNSIPADDR``
+     - hex
+     - ``0xa0000001``
+     - DNS nameserver IPv4 address in host order.
+   * - ``CONFIG_NETINIT_NOMAC``
+     - boolean
+     - ``n``
+     - Enables software MAC assignment for hardware lacking factory MAC 
storage.
+   * - ``CONFIG_NETINIT_UIDMAC``
+     - boolean
+     - ``n``
+     - Generates an IEEE LAA MAC address derived from the board's unique 
silicon ID.
+   * - ``CONFIG_NETINIT_SWMAC``
+     - boolean
+     - ``n``
+     - Assigns a fixed software MAC address configured in Kconfig.
+   * - ``CONFIG_NETINIT_MACADDR``
+     - boolean
+     - ``n``
+     - Queries MAC address from device calibration file via 
``BOARDIOC_MACADDR``.
+   * - ``CONFIG_NETINIT_WAPI_SSID``
+     - string
+     - ``""``
+     - Wi-Fi Access Point Service Set Identifier (SSID) for auto-association.
+   * - ``CONFIG_NETINIT_WAPI_PASSPHRASE``
+     - string
+     - ``""``
+     - Wi-Fi WPA/WPA2 pre-shared key (passphrase).
+
+Application Programming Interface (C API)
+=========================================
+
+Header File
+-----------
+
+Applications and board initialization files access ``netinit`` routines by 
including:
+
+.. code-block:: c
+
+   #include "netutils/netinit.h"
+
+Functions
+---------
+
+.. c:function:: int netinit_bringup(void)
+
+   Initializes and configures the primary network interface according to the 
selected
+   NuttX configuration.
+
+   If ``CONFIG_NETINIT_THREAD`` is disabled, execution is synchronous: MAC 
addresses are
+   assigned, IP addresses configured, the interface brought up, and any 
dynamic services
+   (DHCP, WAPI, NTP) started before the function returns.
+
+   If ``CONFIG_NETINIT_THREAD=y`` is enabled, this function initializes thread 
attributes,
+   creates the detached background pthread named ``"netinit"``, and returns 
``OK``
+   immediately.
+
+   :return: ``OK`` (0) on success; a negated ``errno`` value on failure (e.g., 
if thread
+            creation fails).
+
+.. c:function:: int netinit_associate(FAR const char *ifname)
+
+   Associates an IEEE 802.11 wireless network interface with a Wi-Fi Access 
Point using
+   WAPI and WEXT driver ioctls.
+
+   Loads configuration via ``wapi_load_config()`` if available, or falls back 
to
+   ``CONFIG_NETINIT_WAPI_*`` compile-time parameters.
+
+   :param ifname: Name of the wireless interface (e.g., ``"wlan0"``).
+   :return: ``OK`` (0) on successful association; a negated ``errno`` on 
failure.
+
+Usage Examples
+==============
+
+Scenario 1: Standard Ethernet Bring-Up with DHCP
+------------------------------------------------
+
+To configure a standard board (such as an STM32, SAMv7, or ESP32 Ethernet 
design) to
+acquire an IP address via DHCP in the background without blocking console 
startup, enable
+the following in your board's ``defconfig``:
+
+.. code-block:: kconfig
+
+   CONFIG_NET=y
+   CONFIG_NET_ETHERNET=y
+   CONFIG_NETUTILS_NETLIB=y
+   CONFIG_NETUTILS_NETINIT=y
+   CONFIG_NETUTILS_DHCPC=y
+   CONFIG_NETINIT_DHCPC=y
+   CONFIG_NETINIT_THREAD=y
+   CONFIG_NETINIT_THREAD_PRIORITY=80
+   CONFIG_NETINIT_THREAD_STACKSIZE=2048
+
+In your board initialization or custom application:
+
+.. code-block:: c
+
+   #include <nuttx/config.h>
+   #include <stdio.h>
+   #include "netutils/netinit.h"
+
+   int main(int argc, char *argv[])
+   {
+     int ret;
+
+     printf("Bringing up network interface...\n");
+     ret = netinit_bringup();
+     if (ret < 0)
+       {
+         fprintf(stderr, "ERROR: netinit_bringup failed: %d\n", ret);
+         return ret;
+       }
+
+     printf("Network bringup initiated in background thread.\n");
+     return 0;
+   }
+
+Scenario 2: Industrial Device with Board Unique ID MAC & Static IP
+------------------------------------------------------------------
+
+For an industrial microcontroller lacking an onboard EEPROM MAC, derive the 
MAC address
+from silicon UID and assign static IP parameters:
+
+.. code-block:: kconfig
+
+   CONFIG_NET=y
+   CONFIG_NET_ETHERNET=y
+   CONFIG_BOARDCTL_UNIQUEID=y
+   CONFIG_BOARDCTL_UNIQUEID_SIZE=12
+   CONFIG_NETUTILS_NETINIT=y
+   CONFIG_NETINIT_NOMAC=y
+   CONFIG_NETINIT_UIDMAC=y
+   CONFIG_NETINIT_IPADDR=0xc0a80132      # 192.168.1.50
+   CONFIG_NETINIT_DRIPADDR=0xc0a80101    # 192.168.1.1
+   CONFIG_NETINIT_NETMASK=0xffffff00     # 255.255.255.0
+   CONFIG_NETINIT_DNS=y
+   CONFIG_NETINIT_DNSIPADDR=0x08080808   # 8.8.8.8
+
+Scenario 3: Wi-Fi IoT Device with WPA2-PSK Auto-Association
+-----------------------------------------------------------
+
+For an embedded Wi-Fi station connecting automatically to a local router on 
boot:
+
+.. code-block:: kconfig
+
+   CONFIG_NET=y
+   CONFIG_DRIVERS_IEEE80211=y
+   CONFIG_WIRELESS_WAPI=y
+   CONFIG_NETUTILS_NETINIT=y
+   CONFIG_NETINIT_THREAD=y
+   CONFIG_NETINIT_DHCPC=y
+   CONFIG_NETINIT_WAPI_STAMODE_INFRA=y
+   CONFIG_NETINIT_WAPI_AUTHWPA_WPA2=y
+   CONFIG_NETINIT_WAPI_CIPHERMODE_CCMP=y
+   CONFIG_NETINIT_WAPI_ALG_CCMP=y
+   CONFIG_NETINIT_WAPI_SSID="MyHomeNetwork"
+   CONFIG_NETINIT_WAPI_PASSPHRASE="SecretPassword123"
+
+Troubleshooting and Diagnostics
+===============================
+
+Enabling Dedicated Debugging
+----------------------------
+
+Global network debugging (``CONFIG_DEBUG_NET`` with ``CONFIG_DEBUG_INFO``) 
generates high
+volumes of packet-level log output that can flood serial consoles and distort 
timing.
+
+To isolate debug output specifically to ``netinit`` without global log spam, 
enable:
+
+.. code-block:: kconfig
+
+   CONFIG_DEBUG_FEATURES=y
+   CONFIG_NETINIT_DEBUG=y
+
+This forces verbose ``ninfo()`` and ``nerr()`` diagnostics strictly within 
``netinit.c``.
+
+Common Issues
+-------------
+
+1. **System Freezes During Boot**:
+
+   - *Cause*: ``CONFIG_NETINIT_THREAD`` is disabled, and Ethernet cable is 
unplugged or
+     DHCP server is unreachable.
+   - *Solution*: Enable ``CONFIG_NETINIT_THREAD=y`` so network negotiation 
occurs
+     concurrently without blocking system startup.
+
+2. **Duplicate MAC Address Conflicts**:
+
+   - *Cause*: Multiple devices deployed with default fixed software MAC 
(``CONFIG_NETINIT_SWMAC``).
+   - *Solution*: Switch to ``CONFIG_NETINIT_UIDMAC=y`` so each device 
generates a UID-derived
+     IEEE LAA address from MCU silicon unique ID registers rather than sharing 
a static MAC.
+
+3. **Link State Monitor Never Detects Reconnection**:
+
+   - *Cause*: ``CONFIG_ARCH_PHY_INTERRUPT`` is missing, or board Ethernet 
driver does not
+     implement MII ioctls (``SIOCMIINOTIFY``, ``SIOCGMIIPHY``, 
``SIOCGMIIREG``).
+   - *Solution*: Verify board PHY interrupt wiring and verify driver support 
in the board's
+     Ethernet architecture layer.
+
+4. **Wi-Fi Fails to Associate**:
+
+   - *Cause*: Mismatched cipher/algorithm settings (e.g., Access Point 
requires WPA3 or
+     TKIP while client is configured strictly for WPA2-CCMP), or incorrect 
SSID/passphrase.
+   - *Solution*: Verify AP security policy and confirm SSID and passphrase via 
NSH ``wapi``
+     command line utilities.

Reply via email to