The following commit has been merged in the next branch: commit dbfbc90ee906e1eb93b2b8258b08c74f59234abd Author: Chris Lang clang@gateworks.com Date: Mon Oct 25 22:22:46 2010 +0000
batman-adv: fix interface alternating and bonding reggression
55d1666b521cbed95924c8d4775fe272c103f08c incidentally disabled bonding of packets first entering the mesh along with also disabling interface alternating regardless of where the packet came from. This re-enables these options.
Signed-off-by: Chris Lang clang@gateworks.com
diff --git a/routing.c b/routing.c index 7c9a053..f05259d 100644 --- a/routing.c +++ b/routing.c @@ -1001,10 +1001,10 @@ int recv_icmp_packet(struct sk_buff *skb, struct batman_if *recv_if)
/* find a suitable router for this originator, and use * bonding if possible. */ -struct neigh_node *find_router(struct orig_node *orig_node, +struct neigh_node *find_router(struct bat_priv *bat_priv, + struct orig_node *orig_node, struct batman_if *recv_if) { - struct bat_priv *bat_priv; struct orig_node *primary_orig_node; struct orig_node *router_orig; struct neigh_node *router, *first_candidate, *best_router; @@ -1020,13 +1020,9 @@ struct neigh_node *find_router(struct orig_node *orig_node, /* without bonding, the first node should * always choose the default router. */
- if (!recv_if) - return orig_node->router; - - bat_priv = netdev_priv(recv_if->soft_iface); bonding_enabled = atomic_read(&bat_priv->bonding_enabled);
- if (!bonding_enabled) + if ((!recv_if) && (!bonding_enabled)) return orig_node->router;
router_orig = orig_node->router->orig_node; @@ -1155,7 +1151,7 @@ static int route_unicast_packet(struct sk_buff *skb, orig_node = ((struct orig_node *) hash_find(bat_priv->orig_hash, unicast_packet->dest));
- router = find_router(orig_node, recv_if); + router = find_router(bat_priv, orig_node, recv_if);
if (!router) { spin_unlock_irqrestore(&bat_priv->orig_hash_lock, flags); diff --git a/routing.h b/routing.h index 06ea99d..92674c8 100644 --- a/routing.h +++ b/routing.h @@ -38,8 +38,8 @@ int recv_ucast_frag_packet(struct sk_buff *skb, struct batman_if *recv_if); int recv_bcast_packet(struct sk_buff *skb, struct batman_if *recv_if); int recv_vis_packet(struct sk_buff *skb, struct batman_if *recv_if); int recv_bat_packet(struct sk_buff *skb, struct batman_if *recv_if); -struct neigh_node *find_router(struct orig_node *orig_node, - struct batman_if *recv_if); +struct neigh_node *find_router(struct bat_priv *bat_priv, + struct orig_node *orig_node, struct batman_if *recv_if); void update_bonding_candidates(struct bat_priv *bat_priv, struct orig_node *orig_node);
diff --git a/unicast.c b/unicast.c index 0dac50d..0459413 100644 --- a/unicast.c +++ b/unicast.c @@ -224,7 +224,7 @@ int unicast_send_skb(struct sk_buff *skb, struct bat_priv *bat_priv) if (!orig_node) orig_node = transtable_search(bat_priv, ethhdr->h_dest);
- router = find_router(orig_node, NULL); + router = find_router(bat_priv, orig_node, NULL);
if (!router) goto unlock;