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

net: dsa: add support for BRIDGE_MROUTER attribute

This patch adds support for enabling or disabling the flooding of
unknown multicast traffic on the CPU ports, depending on the value
of the switchdev SWITCHDEV_ATTR_ID_BRIDGE_MROUTER attribute.

The current behavior is kept unchanged but a user can now prevent
the CPU conduit to be flooded with a lot of unregistered traffic that
the network stack needs to filter in software with e.g.:

echo 0 > /sys/class/net/br0/multicast_router

Signed-off-by: Vivien Didelot <vivien.didelot@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Vivien Didelot and committed by
David S. Miller
08cc83cc fbc69779

+17
+2
net/dsa/dsa_priv.h
··· 150 150 struct switchdev_trans *trans); 151 151 int dsa_port_bridge_flags(const struct dsa_port *dp, unsigned long flags, 152 152 struct switchdev_trans *trans); 153 + int dsa_port_mrouter(struct dsa_port *dp, bool mrouter, 154 + struct switchdev_trans *trans); 153 155 int dsa_port_vlan_add(struct dsa_port *dp, 154 156 const struct switchdev_obj_port_vlan *vlan, 155 157 struct switchdev_trans *trans);
+12
net/dsa/port.c
··· 261 261 return err; 262 262 } 263 263 264 + int dsa_port_mrouter(struct dsa_port *dp, bool mrouter, 265 + struct switchdev_trans *trans) 266 + { 267 + struct dsa_switch *ds = dp->ds; 268 + int port = dp->index; 269 + 270 + if (switchdev_trans_ph_prepare(trans)) 271 + return ds->ops->port_egress_floods ? 0 : -EOPNOTSUPP; 272 + 273 + return ds->ops->port_egress_floods(ds, port, true, mrouter); 274 + } 275 + 264 276 int dsa_port_fdb_add(struct dsa_port *dp, const unsigned char *addr, 265 277 u16 vid) 266 278 {
+3
net/dsa/slave.c
··· 301 301 case SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS: 302 302 ret = dsa_port_bridge_flags(dp, attr->u.brport_flags, trans); 303 303 break; 304 + case SWITCHDEV_ATTR_ID_BRIDGE_MROUTER: 305 + ret = dsa_port_mrouter(dp->cpu_dp, attr->u.mrouter, trans); 306 + break; 304 307 default: 305 308 ret = -EOPNOTSUPP; 306 309 break;