bridge: allow setting hash_max + multicast_router if interface is down
Network managers like netifd (used in OpenWRT for instance) try to configure interface options after creation but before setting the interface up. Unfortunately the sysfs / bridge currently only allows to configure the hash_max and multicast_router options when the bridge interface is up. But since br_multicast_init() doesn't start any timers and only sets default values and initializes timers it should be save to reconfigure the default values after that, before things actually get active after the bridge is set up. Signed-off-by: Linus Lüssing <linus.luessing@c0d3.blue> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
485fca664d
commit
6ae4ae8e51
@ -1772,11 +1772,9 @@ void br_multicast_stop(struct net_bridge *br)
|
|||||||
|
|
||||||
int br_multicast_set_router(struct net_bridge *br, unsigned long val)
|
int br_multicast_set_router(struct net_bridge *br, unsigned long val)
|
||||||
{
|
{
|
||||||
int err = -ENOENT;
|
int err = -EINVAL;
|
||||||
|
|
||||||
spin_lock_bh(&br->multicast_lock);
|
spin_lock_bh(&br->multicast_lock);
|
||||||
if (!netif_running(br->dev))
|
|
||||||
goto unlock;
|
|
||||||
|
|
||||||
switch (val) {
|
switch (val) {
|
||||||
case 0:
|
case 0:
|
||||||
@ -1787,13 +1785,8 @@ int br_multicast_set_router(struct net_bridge *br, unsigned long val)
|
|||||||
br->multicast_router = val;
|
br->multicast_router = val;
|
||||||
err = 0;
|
err = 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
|
||||||
err = -EINVAL;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
unlock:
|
|
||||||
spin_unlock_bh(&br->multicast_lock);
|
spin_unlock_bh(&br->multicast_lock);
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
@ -1802,11 +1795,9 @@ int br_multicast_set_router(struct net_bridge *br, unsigned long val)
|
|||||||
int br_multicast_set_port_router(struct net_bridge_port *p, unsigned long val)
|
int br_multicast_set_port_router(struct net_bridge_port *p, unsigned long val)
|
||||||
{
|
{
|
||||||
struct net_bridge *br = p->br;
|
struct net_bridge *br = p->br;
|
||||||
int err = -ENOENT;
|
int err = -EINVAL;
|
||||||
|
|
||||||
spin_lock(&br->multicast_lock);
|
spin_lock(&br->multicast_lock);
|
||||||
if (!netif_running(br->dev) || p->state == BR_STATE_DISABLED)
|
|
||||||
goto unlock;
|
|
||||||
|
|
||||||
switch (val) {
|
switch (val) {
|
||||||
case 0:
|
case 0:
|
||||||
@ -1828,13 +1819,8 @@ int br_multicast_set_port_router(struct net_bridge_port *p, unsigned long val)
|
|||||||
|
|
||||||
br_multicast_add_router(br, p);
|
br_multicast_add_router(br, p);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
|
||||||
err = -EINVAL;
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
unlock:
|
|
||||||
spin_unlock(&br->multicast_lock);
|
spin_unlock(&br->multicast_lock);
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
@ -1939,15 +1925,11 @@ int br_multicast_set_querier(struct net_bridge *br, unsigned long val)
|
|||||||
|
|
||||||
int br_multicast_set_hash_max(struct net_bridge *br, unsigned long val)
|
int br_multicast_set_hash_max(struct net_bridge *br, unsigned long val)
|
||||||
{
|
{
|
||||||
int err = -ENOENT;
|
int err = -EINVAL;
|
||||||
u32 old;
|
u32 old;
|
||||||
struct net_bridge_mdb_htable *mdb;
|
struct net_bridge_mdb_htable *mdb;
|
||||||
|
|
||||||
spin_lock_bh(&br->multicast_lock);
|
spin_lock_bh(&br->multicast_lock);
|
||||||
if (!netif_running(br->dev))
|
|
||||||
goto unlock;
|
|
||||||
|
|
||||||
err = -EINVAL;
|
|
||||||
if (!is_power_of_2(val))
|
if (!is_power_of_2(val))
|
||||||
goto unlock;
|
goto unlock;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user