diff options
Diffstat (limited to 'net/bridge/br_multicast.c')
-rw-r--r-- | net/bridge/br_multicast.c | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c index c5fea9393946..2136e45f5277 100644 --- a/net/bridge/br_multicast.c +++ b/net/bridge/br_multicast.c | |||
@@ -972,13 +972,12 @@ static void br_multicast_enable(struct bridge_mcast_own_query *query) | |||
972 | mod_timer(&query->timer, jiffies); | 972 | mod_timer(&query->timer, jiffies); |
973 | } | 973 | } |
974 | 974 | ||
975 | void br_multicast_enable_port(struct net_bridge_port *port) | 975 | static void __br_multicast_enable_port(struct net_bridge_port *port) |
976 | { | 976 | { |
977 | struct net_bridge *br = port->br; | 977 | struct net_bridge *br = port->br; |
978 | 978 | ||
979 | spin_lock(&br->multicast_lock); | ||
980 | if (br->multicast_disabled || !netif_running(br->dev)) | 979 | if (br->multicast_disabled || !netif_running(br->dev)) |
981 | goto out; | 980 | return; |
982 | 981 | ||
983 | br_multicast_enable(&port->ip4_own_query); | 982 | br_multicast_enable(&port->ip4_own_query); |
984 | #if IS_ENABLED(CONFIG_IPV6) | 983 | #if IS_ENABLED(CONFIG_IPV6) |
@@ -987,8 +986,14 @@ void br_multicast_enable_port(struct net_bridge_port *port) | |||
987 | if (port->multicast_router == MDB_RTR_TYPE_PERM && | 986 | if (port->multicast_router == MDB_RTR_TYPE_PERM && |
988 | hlist_unhashed(&port->rlist)) | 987 | hlist_unhashed(&port->rlist)) |
989 | br_multicast_add_router(br, port); | 988 | br_multicast_add_router(br, port); |
989 | } | ||
990 | 990 | ||
991 | out: | 991 | void br_multicast_enable_port(struct net_bridge_port *port) |
992 | { | ||
993 | struct net_bridge *br = port->br; | ||
994 | |||
995 | spin_lock(&br->multicast_lock); | ||
996 | __br_multicast_enable_port(port); | ||
992 | spin_unlock(&br->multicast_lock); | 997 | spin_unlock(&br->multicast_lock); |
993 | } | 998 | } |
994 | 999 | ||
@@ -1994,8 +1999,9 @@ static void br_multicast_start_querier(struct net_bridge *br, | |||
1994 | 1999 | ||
1995 | int br_multicast_toggle(struct net_bridge *br, unsigned long val) | 2000 | int br_multicast_toggle(struct net_bridge *br, unsigned long val) |
1996 | { | 2001 | { |
1997 | int err = 0; | ||
1998 | struct net_bridge_mdb_htable *mdb; | 2002 | struct net_bridge_mdb_htable *mdb; |
2003 | struct net_bridge_port *port; | ||
2004 | int err = 0; | ||
1999 | 2005 | ||
2000 | spin_lock_bh(&br->multicast_lock); | 2006 | spin_lock_bh(&br->multicast_lock); |
2001 | if (br->multicast_disabled == !val) | 2007 | if (br->multicast_disabled == !val) |
@@ -2023,10 +2029,9 @@ rollback: | |||
2023 | goto rollback; | 2029 | goto rollback; |
2024 | } | 2030 | } |
2025 | 2031 | ||
2026 | br_multicast_start_querier(br, &br->ip4_own_query); | 2032 | br_multicast_open(br); |
2027 | #if IS_ENABLED(CONFIG_IPV6) | 2033 | list_for_each_entry(port, &br->port_list, list) |
2028 | br_multicast_start_querier(br, &br->ip6_own_query); | 2034 | __br_multicast_enable_port(port); |
2029 | #endif | ||
2030 | 2035 | ||
2031 | unlock: | 2036 | unlock: |
2032 | spin_unlock_bh(&br->multicast_lock); | 2037 | spin_unlock_bh(&br->multicast_lock); |