Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net: hsr: Disable promiscuous mode in offload mode

When port-to-port forwarding for interfaces in HSR node is enabled,
disable promiscuous mode since L2 frame forward happens at the
offloaded hardware.

Signed-off-by: Ravi Gunasekaran <r-gunasekaran@ti.com>
Reviewed-by: Simon Horman <simon.horman@corigine.com>
Link: https://lore.kernel.org/r/20230614114710.31400-1-r-gunasekaran@ti.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

authored by

Ravi Gunasekaran and committed by
Jakub Kicinski
e748d0fd ff9b63c8

+17 -4
+5
net/hsr/hsr_device.c
··· 531 531 if (res) 532 532 goto err_add_master; 533 533 534 + /* HSR forwarding offload supported in lower device? */ 535 + if ((slave[0]->features & NETIF_F_HW_HSR_FWD) && 536 + (slave[1]->features & NETIF_F_HW_HSR_FWD)) 537 + hsr->fwd_offloaded = true; 538 + 534 539 res = register_netdevice(hsr_dev); 535 540 if (res) 536 541 goto err_unregister;
+1
net/hsr/hsr_main.h
··· 208 208 u8 net_id; /* for PRP, it occupies most significant 3 bits 209 209 * of lan_id 210 210 */ 211 + bool fwd_offloaded; /* Forwarding offloaded to HW */ 211 212 unsigned char sup_multicast_addr[ETH_ALEN] __aligned(sizeof(u16)); 212 213 /* Align to u16 boundary to avoid unaligned access 213 214 * in ether_addr_equal
+11 -4
net/hsr/hsr_slave.c
··· 131 131 struct hsr_port *master; 132 132 int res; 133 133 134 - res = dev_set_promiscuity(dev, 1); 135 - if (res) 136 - return res; 134 + /* Don't use promiscuous mode for offload since L2 frame forward 135 + * happens at the offloaded hardware. 136 + */ 137 + if (!port->hsr->fwd_offloaded) { 138 + res = dev_set_promiscuity(dev, 1); 139 + if (res) 140 + return res; 141 + } 137 142 138 143 master = hsr_port_get_hsr(hsr, HSR_PT_MASTER); 139 144 hsr_dev = master->dev; ··· 157 152 fail_rx_handler: 158 153 netdev_upper_dev_unlink(dev, hsr_dev); 159 154 fail_upper_dev_link: 160 - dev_set_promiscuity(dev, -1); 155 + if (!port->hsr->fwd_offloaded) 156 + dev_set_promiscuity(dev, -1); 157 + 161 158 return res; 162 159 } 163 160