Commit dcdca2c4 authored by stephen hemminger's avatar stephen hemminger Committed by David S. Miller
Browse files

bridge: multicast router list manipulation



I prefer that the hlist be only accessed through the hlist macro
objects. Explicit twiddling of links (especially with RCU) exposes
the code to future bugs.

Compile tested only.

Signed-off-by: default avatarStephen Hemminger <shemminger@vyatta.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 7180f775
Loading
Loading
Loading
Loading
+15 −15
Original line number Original line Diff line number Diff line
@@ -1042,21 +1042,21 @@ static int br_ip6_multicast_mld2_report(struct net_bridge *br,
static void br_multicast_add_router(struct net_bridge *br,
static void br_multicast_add_router(struct net_bridge *br,
				    struct net_bridge_port *port)
				    struct net_bridge_port *port)
{
{
	struct hlist_node *p;
	struct net_bridge_port *p;
	struct hlist_node **h;
	struct hlist_node *n, *last = NULL;


	for (h = &br->router_list.first;
	hlist_for_each_entry(p, n, &br->router_list, rlist) {
	     (p = *h) &&
		if ((unsigned long) port >= (unsigned long) p) {
	     (unsigned long)container_of(p, struct net_bridge_port, rlist) >
			hlist_add_before_rcu(n, &port->rlist);
	     (unsigned long)port;
			return;
	     h = &p->next)
		}
		;
		last = n;

	}
	port->rlist.pprev = h;

	port->rlist.next = p;
	if (last)
	rcu_assign_pointer(*h, &port->rlist);
		hlist_add_after_rcu(last, &port->rlist);
	if (p)
	else
		p->pprev = &port->rlist.next;
		hlist_add_head_rcu(&port->rlist, &br->router_list);
}
}


static void br_multicast_mark_router(struct net_bridge *br,
static void br_multicast_mark_router(struct net_bridge *br,