summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorIssam Hamdi2025-03-28 09:39:44 +0000
committerHauke Mehrtens2025-08-23 22:01:18 +0000
commit8c42e63a69f61ee9c295c05f00f6c1fba7b85a47 (patch)
tree85134b3b1e1fc0c30a11a7f1787feb57d45c2211
parent6e04dccb7ad3191e9a48597a1b354bf548ead1d8 (diff)
downloadopenwrt-8c42e63a69f61ee9c295c05f00f6c1fba7b85a47.tar.gz
realtek: rtl93xx: fix incorrect destination port selection
When testing LLDP and STP, we observed that locally generated multicast packets (e.g. LLDP, STP) were not restricted to the designated output port(s). For example, when transmitting on `lan1`, the same packet was also forwarded to other ports such as `lan2`. Steps to reproduce: 1. Configure lldpd to use `lan1` in UCI and restart the service 2. Connect devices to `lan1` and `lan2` 3. Observe that the device on `lan2` still receives LLDP packets The issue was caused by an incorrect `FWD_TYPE` setting in the TX CPU TAG, which failed to enforce the selected egress port(s). Fix this by updating the TX CPU TAG to set `FWD_TYPE` correctly, ensuring that locally generated packets are transmitted only on the intended port(s). Signed-off-by: Issam Hamdi <ih@simonwunderlich.de> Link: https://github.com/openwrt/openwrt/pull/19802 Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
-rw-r--r--target/linux/realtek/files-6.12/drivers/net/ethernet/rtl838x_eth.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/target/linux/realtek/files-6.12/drivers/net/ethernet/rtl838x_eth.c b/target/linux/realtek/files-6.12/drivers/net/ethernet/rtl838x_eth.c
index ddfdabacb6..10e4c2d035 100644
--- a/target/linux/realtek/files-6.12/drivers/net/ethernet/rtl838x_eth.c
+++ b/target/linux/realtek/files-6.12/drivers/net/ethernet/rtl838x_eth.c
@@ -156,7 +156,8 @@ static void rtl839x_create_tx_header(struct p_hdr *h, unsigned int dest_port, in
static void rtl930x_create_tx_header(struct p_hdr *h, unsigned int dest_port, int prio)
{
h->cpu_tag[0] = 0x8000; /* CPU tag marker */
- h->cpu_tag[1] = h->cpu_tag[2] = 0;
+ h->cpu_tag[1] = 0x0200; /* Set FWD_TYPE to LOGICAL (2) */
+ h->cpu_tag[2] = 0;
h->cpu_tag[3] = 0;
h->cpu_tag[4] = 0;
h->cpu_tag[5] = 0;
@@ -171,7 +172,8 @@ static void rtl930x_create_tx_header(struct p_hdr *h, unsigned int dest_port, in
static void rtl931x_create_tx_header(struct p_hdr *h, unsigned int dest_port, int prio)
{
h->cpu_tag[0] = 0x8000; /* CPU tag marker */
- h->cpu_tag[1] = h->cpu_tag[2] = 0;
+ h->cpu_tag[1] = 0x0200; /* Set FWD_TYPE to LOGICAL (2) */
+ h->cpu_tag[2] = 0;
h->cpu_tag[3] = 0;
h->cpu_tag[4] = h->cpu_tag[5] = h->cpu_tag[6] = h->cpu_tag[7] = 0;
if (dest_port >= 32) {