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
