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

kasjer pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-core.git

commit 25af0b01d262e1df1933136c4239ba6f291ae29a
Author: Jerzy Kasenberg <[email protected]>
AuthorDate: Tue Oct 13 12:57:08 2026 +0200

    tinyusb/net_lwip: Start DHCP server on USB interface
    
    Host connected over USB needs an address on the device subnet. Start
    DHCP server from net/ip/dhcp_server on USB network interface. Server
    is bound to USB interface, so on boards that also have Ethernet it
    never answers DHCP requests on the LAN. TinyUSB's dhserver can not be
    used for that reason (it binds to all interfaces).
    
    Enabled by USBD_NET_DHCP_SERVER (default 1), pool and lease time are
    configured with USBD_NET_DHCP_POOL_START/SIZE and
    USBD_NET_DHCP_LEASE_TIME.
    
    Assisted-by: Claude:claude-opus-5-5
    Signed-off-by: Jerzy Kasenberg <[email protected]>
---
 hw/usb/tinyusb/net_lwip/pkg.yml        |  3 +++
 hw/usb/tinyusb/net_lwip/src/net_lwip.c | 22 ++++++++++++++++++++++
 hw/usb/tinyusb/net_lwip/syscfg.yml     | 20 ++++++++++++++++++++
 3 files changed, 45 insertions(+)

diff --git a/hw/usb/tinyusb/net_lwip/pkg.yml b/hw/usb/tinyusb/net_lwip/pkg.yml
index db8d956d2..c1e440c82 100644
--- a/hw/usb/tinyusb/net_lwip/pkg.yml
+++ b/hw/usb/tinyusb/net_lwip/pkg.yml
@@ -42,5 +42,8 @@ pkg.deps:
     - "@apache-mynewt-core/hw/usb/tinyusb"
     - "@apache-mynewt-core/hw/usb/tinyusb/std_descriptors"
 
+pkg.deps.USBD_NET_DHCP_SERVER:
+    - "@apache-mynewt-core/net/ip/dhcp_server"
+
 pkg.init:
     usb_net_lwip_init: 'MYNEWT_VAL(USBD_NET_SYSINIT_STAGE)'
diff --git a/hw/usb/tinyusb/net_lwip/src/net_lwip.c 
b/hw/usb/tinyusb/net_lwip/src/net_lwip.c
index 80f68153a..98f1e0e62 100644
--- a/hw/usb/tinyusb/net_lwip/src/net_lwip.c
+++ b/hw/usb/tinyusb/net_lwip/src/net_lwip.c
@@ -50,6 +50,9 @@
 #include <device/usbd_pvt.h>
 
 #include <net_lwip/net_lwip.h>
+#if MYNEWT_VAL(USBD_NET_DHCP_SERVER)
+#include <dhcp_server/dhcp_server.h>
+#endif
 
 #define USB_NET_TXQ_LEN     MYNEWT_VAL(USBD_NET_TX_QUEUE_LEN)
 /* ECM opens data endpoints only when host selects data alternate setting */
@@ -94,6 +97,18 @@ static const uint8_t usb_net_cfg_mac[ETHARP_HWADDR_LEN] = {
 
 static void usb_net_service(void *arg);
 
+#if MYNEWT_VAL(USBD_NET_DHCP_SERVER)
+#if MYNEWT_VAL(USBD_NET_DHCP_POOL_SIZE) > MYNEWT_VAL(DHCP_SERVER_MAX_LEASES)
+#error "USBD_NET_DHCP_POOL_SIZE exceeds DHCP_SERVER_MAX_LEASES"
+#endif
+
+static const struct dhcp_server_cfg usb_net_dhcps_cfg = {
+    .pool_start = MYNEWT_VAL(USBD_NET_DHCP_POOL_START),
+    .pool_size = MYNEWT_VAL(USBD_NET_DHCP_POOL_SIZE),
+    .lease_time = MYNEWT_VAL(USBD_NET_DHCP_LEASE_TIME),
+};
+#endif
+
 struct netif *
 usb_net_lwip_netif(void)
 {
@@ -425,7 +440,14 @@ usb_net_lwip_init(void)
         if (netif_default == NULL) {
             netif_set_default(nif);
         }
+#if MYNEWT_VAL(USBD_NET_DHCP_SERVER)
+        rc = dhcp_server_start(nif, &usb_net_dhcps_cfg);
+#endif
     }
     UNLOCK_TCPIP_CORE();
     SYSINIT_PANIC_ASSERT(nif != NULL);
+#if MYNEWT_VAL(USBD_NET_DHCP_SERVER)
+    /* Check USBD_NET_DHCP_POOL_* against interface address */
+    SYSINIT_PANIC_ASSERT(rc == 0);
+#endif
 }
diff --git a/hw/usb/tinyusb/net_lwip/syscfg.yml 
b/hw/usb/tinyusb/net_lwip/syscfg.yml
index 5f99767d4..99ba4ddeb 100644
--- a/hw/usb/tinyusb/net_lwip/syscfg.yml
+++ b/hw/usb/tinyusb/net_lwip/syscfg.yml
@@ -37,6 +37,26 @@ syscfg.defs:
         description: >
             Number of outgoing frames lwIP can queue for USB transmission.
         value: 8
+    USBD_NET_DHCP_SERVER:
+        description: >
+            Run DHCP server on USB network interface so the host gets its
+            address automatically.  Server answers only on USB interface
+            and does not offer router or DNS server.
+        value: 1
+    USBD_NET_DHCP_POOL_START:
+        description: >
+            Host part of first address leased by DHCP server, e.g. 2 gives
+            192.168.7.2 with default address and mask.
+        value: 2
+    USBD_NET_DHCP_POOL_SIZE:
+        description: >
+            Number of addresses DHCP server can lease, at most
+            DHCP_SERVER_MAX_LEASES.
+        value: 4
+        range: 1..64
+    USBD_NET_DHCP_LEASE_TIME:
+        description: DHCP lease time in seconds.
+        value: 86400
     USBD_NET_SYSINIT_STAGE:
         description: >
             Sysinit stage of USB network interface.  Must be after lwIP

Reply via email to