bridge: simplify multicast_add_router

By coding slightly differently, there are only two cases
to deal with: add at head and add after previous entry.

Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
stephen hemminger 2010-04-27 15:01:04 +00:00 committed by David S. Miller
parent dcd79aebe7
commit 7e80c12448
1 changed files with 11 additions and 8 deletions

View File

@ -1039,22 +1039,25 @@ static int br_ip6_multicast_mld2_report(struct net_bridge *br,
}
#endif
/*
* Add port to rotuer_list
* list is maintained ordered by pointer value
* and locked by br->multicast_lock and RCU
*/
static void br_multicast_add_router(struct net_bridge *br,
struct net_bridge_port *port)
{
struct net_bridge_port *p;
struct hlist_node *n, *last = NULL;
struct hlist_node *n, *slot = NULL;
hlist_for_each_entry(p, n, &br->router_list, rlist) {
if ((unsigned long) port >= (unsigned long) p) {
hlist_add_before_rcu(n, &port->rlist);
return;
}
last = n;
if ((unsigned long) port >= (unsigned long) p)
break;
slot = n;
}
if (last)
hlist_add_after_rcu(last, &port->rlist);
if (slot)
hlist_add_after_rcu(slot, &port->rlist);
else
hlist_add_head_rcu(&port->rlist, &br->router_list);
}