diff options
author | Amerigo Wang <amwang@redhat.com> | 2012-12-14 17:09:51 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-12-15 20:14:39 -0500 |
commit | ccb1c31a7a8744cd153a7d92b726a56b56ad61d3 (patch) | |
tree | 1c62ac2565c657155474b3e8335a13ebcc35560e /net/bridge/br_multicast.c | |
parent | 9dd9ff99532d7a7f8222fd1f0d410d91c0f15ac5 (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.c | 8 |
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: | |||
622 | struct net_bridge_port_group *br_multicast_new_port_group( | 622 | struct 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); |