aboutsummaryrefslogtreecommitdiffstats
path: root/net/bridge/br_multicast.c
diff options
context:
space:
mode:
authorAmerigo Wang <amwang@redhat.com>2012-12-14 17:09:51 -0500
committerDavid S. Miller <davem@davemloft.net>2012-12-15 20:14:39 -0500
commitccb1c31a7a8744cd153a7d92b726a56b56ad61d3 (patch)
tree1c62ac2565c657155474b3e8335a13ebcc35560e /net/bridge/br_multicast.c
parent9dd9ff99532d7a7f8222fd1f0d410d91c0f15ac5 (diff)
bridge: add flags to distinguish permanent mdb entires
This patch adds a flag to each mdb entry, so that we can distinguish permanent entries with temporary entries. Cc: Herbert Xu <herbert@gondor.apana.org.au> Cc: Stephen Hemminger <shemminger@vyatta.com> Cc: "David S. Miller" <davem@davemloft.net> Signed-off-by: Cong Wang <amwang@redhat.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/bridge/br_multicast.c')
-rw-r--r--net/bridge/br_multicast.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c
index 2561af9d18a2..dce9defae3c6 100644
--- a/net/bridge/br_multicast.c
+++ b/net/bridge/br_multicast.c
@@ -279,7 +279,7 @@ static void br_multicast_port_group_expired(unsigned long data)
279 279
280 spin_lock(&br->multicast_lock); 280 spin_lock(&br->multicast_lock);
281 if (!netif_running(br->dev) || timer_pending(&pg->timer) || 281 if (!netif_running(br->dev) || timer_pending(&pg->timer) ||
282 hlist_unhashed(&pg->mglist)) 282 hlist_unhashed(&pg->mglist) || pg->state & MDB_PERMANENT)
283 goto out; 283 goto out;
284 284
285 br_multicast_del_pg(br, pg); 285 br_multicast_del_pg(br, pg);
@@ -622,7 +622,8 @@ out:
622struct net_bridge_port_group *br_multicast_new_port_group( 622struct net_bridge_port_group *br_multicast_new_port_group(
623 struct net_bridge_port *port, 623 struct net_bridge_port *port,
624 struct br_ip *group, 624 struct br_ip *group,
625 struct net_bridge_port_group __rcu *next) 625 struct net_bridge_port_group __rcu *next,
626 unsigned char state)
626{ 627{
627 struct net_bridge_port_group *p; 628 struct net_bridge_port_group *p;
628 629
@@ -632,6 +633,7 @@ struct net_bridge_port_group *br_multicast_new_port_group(
632 633
633 p->addr = *group; 634 p->addr = *group;
634 p->port = port; 635 p->port = port;
636 p->state = state;
635 rcu_assign_pointer(p->next, next); 637 rcu_assign_pointer(p->next, next);
636 hlist_add_head(&p->mglist, &port->mglist); 638 hlist_add_head(&p->mglist, &port->mglist);
637 setup_timer(&p->timer, br_multicast_port_group_expired, 639 setup_timer(&p->timer, br_multicast_port_group_expired,
@@ -674,7 +676,7 @@ static int br_multicast_add_group(struct net_bridge *br,
674 break; 676 break;
675 } 677 }
676 678
677 p = br_multicast_new_port_group(port, group, *pp); 679 p = br_multicast_new_port_group(port, group, *pp, MDB_TEMPORARY);
678 if (unlikely(!p)) 680 if (unlikely(!p))
679 goto err; 681 goto err;
680 rcu_assign_pointer(*pp, p); 682 rcu_assign_pointer(*pp, p);