summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorhathach <[email protected]>2025-11-18 10:18:27 +0700
committerhathach <[email protected]>2025-11-18 10:18:27 +0700
commit6c140930591fd49725a1ec1434dfb841560bc6ae (patch)
tree8433576ea573a2f6f5d88ff309716f3ad5538f05 /lib
parent619ef71fdb5da5dbfabe76189ead4ab97837ec12 (diff)
parent66c84528f67c0eedc23d25221500d820e702d93f (diff)
Merge branch 'master' into fork/HiFiPhile/xfer_close
Diffstat (limited to 'lib')
-rw-r--r--lib/networking/dhserver.c70
-rw-r--r--lib/networking/rndis_reports.c7
-rw-r--r--lib/rt-thread/SConscript2
-rw-r--r--lib/rt-thread/tusb_config.h6
4 files changed, 76 insertions, 9 deletions
diff --git a/lib/networking/dhserver.c b/lib/networking/dhserver.c
index 2f14f7a09..87a63c5de 100644
--- a/lib/networking/dhserver.c
+++ b/lib/networking/dhserver.c
@@ -145,7 +145,7 @@ static __inline void free_entry(dhcp_entry_t *entry)
memset(entry->mac, 0, 6);
}
-uint8_t *find_dhcp_option(uint8_t *attrs, int size, uint8_t attr)
+static uint8_t *find_dhcp_option(uint8_t *attrs, int size, uint8_t attr)
{
int i = 0;
while ((i + 1) < size)
@@ -159,7 +159,7 @@ uint8_t *find_dhcp_option(uint8_t *attrs, int size, uint8_t attr)
return NULL;
}
-int fill_options(void *dest,
+static int fill_options(void *dest,
uint8_t msg_type,
const char *domain,
ip4_addr_t dns,
@@ -227,12 +227,69 @@ int fill_options(void *dest,
return ptr - (uint8_t *)dest;
}
+
+/*
+ * RFC 2131 Section 4.1 compliant destination address selection
+ */
+static ip_addr_t get_dhcp_destination(struct netif *netif, const DHCP_TYPE *dhcp,
+ const ip4_addr_t *yiaddr, bool is_nak)
+{
+ ip4_addr_t giaddr = get_ip(dhcp->dp_giaddr);
+ ip4_addr_t ciaddr = get_ip(dhcp->dp_ciaddr);
+ bool giaddr_zero = ip4_addr_isany_val(giaddr);
+ bool ciaddr_zero = ip4_addr_isany_val(ciaddr);
+ bool broadcast_flag = (dhcp->dp_flags & htons(0x8000)) != 0;
+ ip_addr_t dest_addr;
+
+ if (!giaddr_zero) {
+ // If giaddr is not zero, send to giaddr (relay agent)
+ ip_addr_set_ip4_u32(&dest_addr, giaddr.addr);
+ return dest_addr;
+ }
+
+ if (is_nak) {
+ // RFC 2131: "In all cases, when 'giaddr' is zero,
+ // the server broadcasts any DHCPNAK messages to 0xffffffff"
+ goto dest_broadcast;
+ }
+
+ if (!ciaddr_zero) {
+ // RFC 2131: "If the 'giaddr' field is zero and the 'ciaddr' field is nonzero,
+ // then the server unicasts DHCPOFFER and DHCPACK messages to the address in 'ciaddr'"
+ ip_addr_set_ip4_u32(&dest_addr, ciaddr.addr);
+ return dest_addr;
+ }
+
+ if (broadcast_flag) {
+ // RFC 2131: "If 'giaddr' is zero and 'ciaddr' is zero, and the broadcast bit is set,
+ // then the server broadcasts DHCPOFFER and DHCPACK messages to 0xffffffff"
+ goto dest_broadcast;
+ }
+
+ // RFC 2131: "If the broadcast bit is not set and 'giaddr' is zero and 'ciaddr' is zero,
+ // then the server unicasts DHCPOFFER and DHCPACK messages to the client's hardware
+ // address and 'yiaddr' address"
+ if (yiaddr && !ip4_addr_isany(yiaddr)) {
+ ip_addr_set_ip4_u32(&dest_addr, yiaddr->addr);
+ // TODO: This requires ARP table manipulation to associate yiaddr with client MAC
+ // For now, fall back to broadcast as this is complex to implement correctly
+ goto dest_broadcast;
+ }
+
+dest_broadcast:
+ ip_addr_set_ip4_u32(&dest_addr,
+ ip4_addr_get_u32(netif_ip4_addr(netif)) | ~ip4_addr_get_u32(netif_ip4_netmask(netif)));
+ return dest_addr;
+
+}
+
static void udp_recv_proc(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr, u16_t port)
{
uint8_t *ptr;
dhcp_entry_t *entry;
struct pbuf *pp;
struct netif *netif = netif_get_by_index(p->if_idx);
+ ip_addr_t dest_addr;
(void)arg;
(void)addr;
@@ -254,7 +311,6 @@ static void udp_recv_proc(void *arg, struct udp_pcb *upcb, struct pbuf *p, const
entry = entry_by_mac(dhcp_data.dp_chaddr);
if (entry == NULL) entry = vacant_address();
if (entry == NULL) break;
-
dhcp_data.dp_op = 2; /* reply */
dhcp_data.dp_secs = 0;
dhcp_data.dp_flags = 0;
@@ -275,7 +331,9 @@ static void udp_recv_proc(void *arg, struct udp_pcb *upcb, struct pbuf *p, const
pp = pbuf_alloc(PBUF_TRANSPORT, sizeof(dhcp_data), PBUF_POOL);
if (pp == NULL) break;
memcpy(pp->payload, &dhcp_data, sizeof(dhcp_data));
- udp_sendto(upcb, pp, IP_ADDR_BROADCAST, port);
+ // RFC 2131 compliant destination selection for DHCP OFFER
+ dest_addr = get_dhcp_destination(netif, &dhcp_data, &entry->addr, false);
+ udp_sendto(upcb, pp, &dest_addr, port);
pbuf_free(pp);
break;
@@ -319,7 +377,9 @@ static void udp_recv_proc(void *arg, struct udp_pcb *upcb, struct pbuf *p, const
if (pp == NULL) break;
memcpy(entry->mac, dhcp_data.dp_chaddr, 6);
memcpy(pp->payload, &dhcp_data, sizeof(dhcp_data));
- udp_sendto(upcb, pp, IP_ADDR_BROADCAST, port);
+ // RFC 2131 compliant destination selection for DHCP ACK
+ dest_addr = get_dhcp_destination(netif, &dhcp_data, &entry->addr, false);
+ udp_sendto(upcb, pp, &dest_addr, port);
pbuf_free(pp);
break;
diff --git a/lib/networking/rndis_reports.c b/lib/networking/rndis_reports.c
index 451d5405b..e2849fb10 100644
--- a/lib/networking/rndis_reports.c
+++ b/lib/networking/rndis_reports.c
@@ -29,7 +29,10 @@
#include <stdalign.h>
#include <string.h>
-#include "class/net/net_device.h"
+#include "tusb.h"
+
+#if CFG_TUD_ECM_RNDIS
+
#include "rndis_protocol.h"
#include "netif/ethernet.h"
@@ -299,3 +302,5 @@ void rndis_class_set_handler(uint8_t *data, int size)
break;
}
}
+
+#endif
diff --git a/lib/rt-thread/SConscript b/lib/rt-thread/SConscript
index 34399fd45..99517a090 100644
--- a/lib/rt-thread/SConscript
+++ b/lib/rt-thread/SConscript
@@ -34,6 +34,8 @@ if GetDepend(["PKG_TINYUSB_DEVICE_ENABLE"]):
src += ["../../src/class/cdc/cdc_device.c"]
if GetDepend(["PKG_TINYUSB_DEVICE_MSC"]):
src += ["../../src/class/msc/msc_device.c", "port/msc_device_port.c"]
+ if GetDepend(["PKG_TINYUSB_DEVICE_MTP"]):
+ src += ["../../src/class/mtp/mtp_device.c"]
if GetDepend(["PKG_TINYUSB_DEVICE_HID"]):
src += ["../../src/class/hid/hid_device.c"]
diff --git a/lib/rt-thread/tusb_config.h b/lib/rt-thread/tusb_config.h
index 11dc21983..6f794dc41 100644
--- a/lib/rt-thread/tusb_config.h
+++ b/lib/rt-thread/tusb_config.h
@@ -24,8 +24,8 @@
* This file is part of the TinyUSB stack.
*/
-#ifndef _TUSB_CONFIG_H_
-#define _TUSB_CONFIG_H_
+#ifndef TUSB_CONFIG_H_
+#define TUSB_CONFIG_H_
#ifdef __RTTHREAD__
#include <rtconfig.h>
@@ -215,4 +215,4 @@ extern "C" {
#endif
#endif /*__RTTHREAD__*/
-#endif /* _TUSB_CONFIG_H_ */
+#endif /* TUSB_CONFIG_H_ */