OSDN Git Service

net: dsa: add support for BRIDGE_MROUTER attribute
authorVivien Didelot <vivien.didelot@gmail.com>
Tue, 9 Jul 2019 03:31:13 +0000 (23:31 -0400)
committerDavid S. Miller <davem@davemloft.net>
Tue, 9 Jul 2019 21:49:34 +0000 (14:49 -0700)
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>
net/dsa/dsa_priv.h
net/dsa/port.c
net/dsa/slave.c

index b2be53a..12f8c7e 100644 (file)
@@ -150,6 +150,8 @@ int dsa_port_pre_bridge_flags(const struct dsa_port *dp, unsigned long flags,
                              struct switchdev_trans *trans);
 int dsa_port_bridge_flags(const struct dsa_port *dp, unsigned long flags,
                          struct switchdev_trans *trans);
+int dsa_port_mrouter(struct dsa_port *dp, bool mrouter,
+                    struct switchdev_trans *trans);
 int dsa_port_vlan_add(struct dsa_port *dp,
                      const struct switchdev_obj_port_vlan *vlan,
                      struct switchdev_trans *trans);
index d2b65e8..f071acf 100644 (file)
@@ -261,6 +261,18 @@ int dsa_port_bridge_flags(const struct dsa_port *dp, unsigned long flags,
        return err;
 }
 
+int dsa_port_mrouter(struct dsa_port *dp, bool mrouter,
+                    struct switchdev_trans *trans)
+{
+       struct dsa_switch *ds = dp->ds;
+       int port = dp->index;
+
+       if (switchdev_trans_ph_prepare(trans))
+               return ds->ops->port_egress_floods ? 0 : -EOPNOTSUPP;
+
+       return ds->ops->port_egress_floods(ds, port, true, mrouter);
+}
+
 int dsa_port_fdb_add(struct dsa_port *dp, const unsigned char *addr,
                     u16 vid)
 {
index 9bcb598..614c38e 100644 (file)
@@ -301,6 +301,9 @@ static int dsa_slave_port_attr_set(struct net_device *dev,
        case SWITCHDEV_ATTR_ID_PORT_BRIDGE_FLAGS:
                ret = dsa_port_bridge_flags(dp, attr->u.brport_flags, trans);
                break;
+       case SWITCHDEV_ATTR_ID_BRIDGE_MROUTER:
+               ret = dsa_port_mrouter(dp->cpu_dp, attr->u.mrouter, trans);
+               break;
        default:
                ret = -EOPNOTSUPP;
                break;