bridge: allow setting hash_max + multicast_router if interface is down
authorLinus Lüssing <linus.luessing@c0d3.blue>
Sat, 23 May 2015 01:12:34 +0000 (03:12 +0200)
committerDavid S. Miller <davem@davemloft.net>
Mon, 25 May 2015 21:28:01 +0000 (17:28 -0400)
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>
net/bridge/br_multicast.c

index d7e103e3538a6d165a76c96ccb07659a1d5abfb9..7c78b8df1d815c775f2d64814ca4bb6679b24b47 100644 (file)
@@ -1772,11 +1772,9 @@ out:
 
 int br_multicast_set_router(struct net_bridge *br, unsigned long val)
 {
-       int err = -ENOENT;
+       int err = -EINVAL;
 
        spin_lock_bh(&br->multicast_lock);
-       if (!netif_running(br->dev))
-               goto unlock;
 
        switch (val) {
        case 0:
@@ -1787,13 +1785,8 @@ int br_multicast_set_router(struct net_bridge *br, unsigned long val)
                br->multicast_router = val;
                err = 0;
                break;
-
-       default:
-               err = -EINVAL;
-               break;
        }
 
-unlock:
        spin_unlock_bh(&br->multicast_lock);
 
        return err;
@@ -1802,11 +1795,9 @@ unlock:
 int br_multicast_set_port_router(struct net_bridge_port *p, unsigned long val)
 {
        struct net_bridge *br = p->br;
-       int err = -ENOENT;
+       int err = -EINVAL;
 
        spin_lock(&br->multicast_lock);
-       if (!netif_running(br->dev) || p->state == BR_STATE_DISABLED)
-               goto unlock;
 
        switch (val) {
        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);
                break;
-
-       default:
-               err = -EINVAL;
-               break;
        }
 
-unlock:
        spin_unlock(&br->multicast_lock);
 
        return err;
@@ -1939,15 +1925,11 @@ unlock:
 
 int br_multicast_set_hash_max(struct net_bridge *br, unsigned long val)
 {
-       int err = -ENOENT;
+       int err = -EINVAL;
        u32 old;
        struct net_bridge_mdb_htable *mdb;
 
        spin_lock_bh(&br->multicast_lock);
-       if (!netif_running(br->dev))
-               goto unlock;
-
-       err = -EINVAL;
        if (!is_power_of_2(val))
                goto unlock;