mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	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>
			
			
This commit is contained in:
		
							parent
							
								
									fbc697796e
								
							
						
					
					
						commit
						08cc83cc7f
					
				
					 3 changed files with 17 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue