Skip to content

Commit 33b3d3d

Browse files
Ravi Gunasekarangregkh
authored andcommitted
net: hsr: Disable promiscuous mode in offload mode
[ Upstream commit e748d0f ] 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> Stable-dep-of: 8884c69 ("hsr: use rtnl lock when iterating over ports") Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent 1139321 commit 33b3d3d

File tree

3 files changed

+17
-4
lines changed

3 files changed

+17
-4
lines changed

net/hsr/hsr_device.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -529,6 +529,11 @@ int hsr_dev_finalize(struct net_device *hsr_dev, struct net_device *slave[2],
529529
if (res)
530530
goto err_add_master;
531531

532+
/* HSR forwarding offload supported in lower device? */
533+
if ((slave[0]->features & NETIF_F_HW_HSR_FWD) &&
534+
(slave[1]->features & NETIF_F_HW_HSR_FWD))
535+
hsr->fwd_offloaded = true;
536+
532537
res = register_netdevice(hsr_dev);
533538
if (res)
534539
goto err_unregister;

net/hsr/hsr_main.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,7 @@ struct hsr_priv {
202202
u8 net_id; /* for PRP, it occupies most significant 3 bits
203203
* of lan_id
204204
*/
205+
bool fwd_offloaded; /* Forwarding offloaded to HW */
205206
unsigned char sup_multicast_addr[ETH_ALEN] __aligned(sizeof(u16));
206207
/* Align to u16 boundary to avoid unaligned access
207208
* in ether_addr_equal

net/hsr/hsr_slave.c

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -137,9 +137,14 @@ static int hsr_portdev_setup(struct hsr_priv *hsr, struct net_device *dev,
137137
struct hsr_port *master;
138138
int res;
139139

140-
res = dev_set_promiscuity(dev, 1);
141-
if (res)
142-
return res;
140+
/* Don't use promiscuous mode for offload since L2 frame forward
141+
* happens at the offloaded hardware.
142+
*/
143+
if (!port->hsr->fwd_offloaded) {
144+
res = dev_set_promiscuity(dev, 1);
145+
if (res)
146+
return res;
147+
}
143148

144149
master = hsr_port_get_hsr(hsr, HSR_PT_MASTER);
145150
hsr_dev = master->dev;
@@ -158,7 +163,9 @@ static int hsr_portdev_setup(struct hsr_priv *hsr, struct net_device *dev,
158163
fail_rx_handler:
159164
netdev_upper_dev_unlink(dev, hsr_dev);
160165
fail_upper_dev_link:
161-
dev_set_promiscuity(dev, -1);
166+
if (!port->hsr->fwd_offloaded)
167+
dev_set_promiscuity(dev, -1);
168+
162169
return res;
163170
}
164171

0 commit comments

Comments
 (0)