From 0e2d9407659ddcb2e07e843afab386e28daeaea3 Mon Sep 17 00:00:00 2001 From: d00f <8052722+DrDoof@users.noreply.github.com> Date: Tue, 13 Oct 2026 03:25:53 +0200 Subject: [PATCH] lldp: advertise system capabilities and the management address Neighbours could not tell a bridge from a host and had no address to reach us on. Add the System Capabilities TLV (bridge, enabled) and a Management Address TLV with the IPv4 address, left out while the address is still 0.0.0.0. Size the payload buffer for the frame it can now hold: 64 bytes did not cover a 23 character hostname next to the longer model names. --- rtl837x_lldp.c | 26 +++++++++++++++++++++++++- rtl837x_lldp.h | 12 ++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/rtl837x_lldp.c b/rtl837x_lldp.c index 3eb644ea..590e15b2 100644 --- a/rtl837x_lldp.c +++ b/rtl837x_lldp.c @@ -42,7 +42,7 @@ struct lldp_pkt { struct rtl_tag rtl_tag; uint16_t ether_type; - uint8_t payload[64]; + uint8_t payload[LLDP_MAX_PAYLOAD]; }; #define LLDP_O ((__xdata struct lldp_pkt *)&uip_buf[RTL_FRAME_DESC_SIZE]) @@ -90,6 +90,30 @@ void lldp_send(void) __banked __reentrant p += lldp_sysname(p); p += lldp_sysdesc(p); + //System Capabilities: supported, enabled + *p++ = LLDP_TYPE(LLDP_CAPABILITIES_TLV_TYPE); + *p++ = LLDP_CAPABILITIES_TLV_LENGTH; + *p++ = LLDP_CAPABILITY_BRIDGE >> 8; + *p++ = LLDP_CAPABILITY_BRIDGE & 0xff; + *p++ = LLDP_CAPABILITY_BRIDGE >> 8; + *p++ = LLDP_CAPABILITY_BRIDGE & 0xff; + + //Management Address: IPv4 + if (uip_hostaddr[0] | uip_hostaddr[1]) { + *p++ = LLDP_TYPE(LLDP_MGMT_ADDR_TLV_TYPE); + *p++ = LLDP_MGMT_ADDR_TLV_LENGTH; + *p++ = LLDP_MGMT_ADDR_STR_LENGTH; + *p++ = LLDP_MGMT_ADDR_SUBTYPE_IPV4; + memcpy(p, (__xdata uint8_t *)uip_hostaddr, sizeof(uip_ipaddr_t)); + p += sizeof(uip_ipaddr_t); + *p++ = LLDP_MGMT_IF_NUMBERING_UNKNOWN; + *p++ = 0; //interface number + *p++ = 0; + *p++ = 0; + *p++ = 0; + *p++ = 0; //OID length + } + // End of LLDPDU TLV *p++ = 0x00; //padding *p++ = 0x00; //padding diff --git a/rtl837x_lldp.h b/rtl837x_lldp.h index 4a48e121..8adc4a6f 100644 --- a/rtl837x_lldp.h +++ b/rtl837x_lldp.h @@ -27,6 +27,18 @@ #define LLDP_SYSNAME_TLV_TYPE 5 #define LLDP_SYSDESC_TLV_TYPE 6 +#define LLDP_CAPABILITIES_TLV_TYPE 7 +#define LLDP_CAPABILITIES_TLV_LENGTH 4 +#define LLDP_CAPABILITY_BRIDGE 0x0004 + +#define LLDP_MGMT_ADDR_TLV_TYPE 8 +#define LLDP_MGMT_ADDR_TLV_LENGTH 12 +#define LLDP_MGMT_ADDR_STR_LENGTH 5 +#define LLDP_MGMT_ADDR_SUBTYPE_IPV4 1 +#define LLDP_MGMT_IF_NUMBERING_UNKNOWN 1 + +#define LLDP_MAX_PAYLOAD 128 + void lldp_init(void) __banked; void lldp_tick(void) __banked; void lldp_send(void) __banked;