123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- From 6ae4ae8e512bd229f806c22f8a2cd751e4f987c2 Mon Sep 17 00:00:00 2001
- From: =?UTF-8?q?Linus=20L=C3=BCssing?= <linus.luessing@c0d3.blue>
- Date: Sat, 23 May 2015 03:12:34 +0200
- Subject: [PATCH] bridge: allow setting hash_max + multicast_router if
- interface is down
- MIME-Version: 1.0
- Content-Type: text/plain; charset=UTF-8
- Content-Transfer-Encoding: 8bit
- 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 | 24 +++---------------------
- 1 file changed, 3 insertions(+), 21 deletions(-)
- --- a/net/bridge/br_multicast.c
- +++ b/net/bridge/br_multicast.c
- @@ -1948,11 +1948,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:
- @@ -1963,13 +1961,8 @@ int br_multicast_set_router(struct net_b
- br->multicast_router = val;
- err = 0;
- break;
- -
- - default:
- - err = -EINVAL;
- - break;
- }
-
- -unlock:
- spin_unlock_bh(&br->multicast_lock);
-
- return err;
- @@ -1978,11 +1971,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:
- @@ -2004,13 +1995,8 @@ int br_multicast_set_port_router(struct
-
- br_multicast_add_router(br, p);
- break;
- -
- - default:
- - err = -EINVAL;
- - break;
- }
-
- -unlock:
- spin_unlock(&br->multicast_lock);
-
- return err;
- @@ -2115,15 +2101,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;
-
|