Skip to content

Commit 64a58ae

Browse files
Murali Karicherigregkh
authored andcommitted
net: hsr: Add support for MC filtering at the slave device
[ Upstream commit 36b20fc ] When MC (multicast) list is updated by the networking layer due to a user command and as well as when allmulti flag is set, it needs to be passed to the enslaved Ethernet devices. This patch allows this to happen by implementing ndo_change_rx_flags() and ndo_set_rx_mode() API calls that in turns pass it to the slave devices using existing API calls. Signed-off-by: Murali Karicheri <m-karicheri2@ti.com> Signed-off-by: Ravi Gunasekaran <r-gunasekaran@ti.com> Reviewed-by: Wojciech Drewek <wojciech.drewek@intel.com> Reviewed-by: Simon Horman <horms@kernel.org> Signed-off-by: David S. Miller <davem@davemloft.net> Stable-dep-of: 8884c69 ("hsr: use rtnl lock when iterating over ports") Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent 94b0507 commit 64a58ae

File tree

1 file changed

+66
-1
lines changed

1 file changed

+66
-1
lines changed

net/hsr/hsr_device.c

Lines changed: 66 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,24 @@ static int hsr_dev_open(struct net_device *dev)
170170

171171
static int hsr_dev_close(struct net_device *dev)
172172
{
173-
/* Nothing to do here. */
173+
struct hsr_port *port;
174+
struct hsr_priv *hsr;
175+
176+
hsr = netdev_priv(dev);
177+
hsr_for_each_port(hsr, port) {
178+
if (port->type == HSR_PT_MASTER)
179+
continue;
180+
switch (port->type) {
181+
case HSR_PT_SLAVE_A:
182+
case HSR_PT_SLAVE_B:
183+
dev_uc_unsync(port->dev, dev);
184+
dev_mc_unsync(port->dev, dev);
185+
break;
186+
default:
187+
break;
188+
}
189+
}
190+
174191
return 0;
175192
}
176193

@@ -401,12 +418,60 @@ void hsr_del_ports(struct hsr_priv *hsr)
401418
hsr_del_port(port);
402419
}
403420

421+
static void hsr_set_rx_mode(struct net_device *dev)
422+
{
423+
struct hsr_port *port;
424+
struct hsr_priv *hsr;
425+
426+
hsr = netdev_priv(dev);
427+
428+
hsr_for_each_port(hsr, port) {
429+
if (port->type == HSR_PT_MASTER)
430+
continue;
431+
switch (port->type) {
432+
case HSR_PT_SLAVE_A:
433+
case HSR_PT_SLAVE_B:
434+
dev_mc_sync_multiple(port->dev, dev);
435+
dev_uc_sync_multiple(port->dev, dev);
436+
break;
437+
default:
438+
break;
439+
}
440+
}
441+
}
442+
443+
static void hsr_change_rx_flags(struct net_device *dev, int change)
444+
{
445+
struct hsr_port *port;
446+
struct hsr_priv *hsr;
447+
448+
hsr = netdev_priv(dev);
449+
450+
hsr_for_each_port(hsr, port) {
451+
if (port->type == HSR_PT_MASTER)
452+
continue;
453+
switch (port->type) {
454+
case HSR_PT_SLAVE_A:
455+
case HSR_PT_SLAVE_B:
456+
if (change & IFF_ALLMULTI)
457+
dev_set_allmulti(port->dev,
458+
dev->flags &
459+
IFF_ALLMULTI ? 1 : -1);
460+
break;
461+
default:
462+
break;
463+
}
464+
}
465+
}
466+
404467
static const struct net_device_ops hsr_device_ops = {
405468
.ndo_change_mtu = hsr_dev_change_mtu,
406469
.ndo_open = hsr_dev_open,
407470
.ndo_stop = hsr_dev_close,
408471
.ndo_start_xmit = hsr_dev_xmit,
472+
.ndo_change_rx_flags = hsr_change_rx_flags,
409473
.ndo_fix_features = hsr_fix_features,
474+
.ndo_set_rx_mode = hsr_set_rx_mode,
410475
};
411476

412477
static struct device_type hsr_type = {

0 commit comments

Comments
 (0)