|
|
@@ -972,13 +972,12 @@ static void br_multicast_enable(struct bridge_mcast_own_query *query)
|
|
|
mod_timer(&query->timer, jiffies);
|
|
|
}
|
|
|
|
|
|
-void br_multicast_enable_port(struct net_bridge_port *port)
|
|
|
+static void __br_multicast_enable_port(struct net_bridge_port *port)
|
|
|
{
|
|
|
struct net_bridge *br = port->br;
|
|
|
|
|
|
- spin_lock(&br->multicast_lock);
|
|
|
if (br->multicast_disabled || !netif_running(br->dev))
|
|
|
- goto out;
|
|
|
+ return;
|
|
|
|
|
|
br_multicast_enable(&port->ip4_own_query);
|
|
|
#if IS_ENABLED(CONFIG_IPV6)
|
|
|
@@ -987,8 +986,14 @@ void br_multicast_enable_port(struct net_bridge_port *port)
|
|
|
if (port->multicast_router == MDB_RTR_TYPE_PERM &&
|
|
|
hlist_unhashed(&port->rlist))
|
|
|
br_multicast_add_router(br, port);
|
|
|
+}
|
|
|
|
|
|
-out:
|
|
|
+void br_multicast_enable_port(struct net_bridge_port *port)
|
|
|
+{
|
|
|
+ struct net_bridge *br = port->br;
|
|
|
+
|
|
|
+ spin_lock(&br->multicast_lock);
|
|
|
+ __br_multicast_enable_port(port);
|
|
|
spin_unlock(&br->multicast_lock);
|
|
|
}
|
|
|
|
|
|
@@ -1994,8 +1999,9 @@ static void br_multicast_start_querier(struct net_bridge *br,
|
|
|
|
|
|
int br_multicast_toggle(struct net_bridge *br, unsigned long val)
|
|
|
{
|
|
|
- int err = 0;
|
|
|
struct net_bridge_mdb_htable *mdb;
|
|
|
+ struct net_bridge_port *port;
|
|
|
+ int err = 0;
|
|
|
|
|
|
spin_lock_bh(&br->multicast_lock);
|
|
|
if (br->multicast_disabled == !val)
|
|
|
@@ -2023,10 +2029,9 @@ rollback:
|
|
|
goto rollback;
|
|
|
}
|
|
|
|
|
|
- br_multicast_start_querier(br, &br->ip4_own_query);
|
|
|
-#if IS_ENABLED(CONFIG_IPV6)
|
|
|
- br_multicast_start_querier(br, &br->ip6_own_query);
|
|
|
-#endif
|
|
|
+ br_multicast_open(br);
|
|
|
+ list_for_each_entry(port, &br->port_list, list)
|
|
|
+ __br_multicast_enable_port(port);
|
|
|
|
|
|
unlock:
|
|
|
spin_unlock_bh(&br->multicast_lock);
|