From beec4d26d258c9bc995536623a3f793c29fe07ed Mon Sep 17 00:00:00 2001 From: Marek Lindner Date: Sun, 26 Jun 2011 15:26:18 +0200 Subject: [PATCH] --- yaml --- r: 256121 b: refs/heads/master c: 6a020ab452d38b3878903de931c162429072a7d7 h: refs/heads/master i: 256119: 9d3d6a3abc16e9a3014eff2966b0e0889dda8c06 v: v3 --- [refs] | 2 +- trunk/net/batman-adv/send.c | 17 +++++++++++++---- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/[refs] b/[refs] index 60abff45df0f..99449dfc1634 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: ff66c975d5e412817f8122012760e852b4571b5e +refs/heads/master: 6a020ab452d38b3878903de931c162429072a7d7 diff --git a/trunk/net/batman-adv/send.c b/trunk/net/batman-adv/send.c index 2f62b2e4a47b..4b8e11bc14fa 100644 --- a/trunk/net/batman-adv/send.c +++ b/trunk/net/batman-adv/send.c @@ -163,6 +163,7 @@ static void send_packet(struct forw_packet *forw_packet) struct hard_iface *hard_iface; struct net_device *soft_iface; struct bat_priv *bat_priv; + struct hard_iface *primary_if = NULL; struct batman_packet *batman_packet = (struct batman_packet *)(forw_packet->skb->data); int directlink = (batman_packet->flags & DIRECTLINK ? 1 : 0); @@ -170,19 +171,23 @@ static void send_packet(struct forw_packet *forw_packet) if (!forw_packet->if_incoming) { pr_err("Error - can't forward packet: incoming iface not " "specified\n"); - return; + goto out; } soft_iface = forw_packet->if_incoming->soft_iface; bat_priv = netdev_priv(soft_iface); if (forw_packet->if_incoming->if_status != IF_ACTIVE) - return; + goto out; + + primary_if = primary_if_get_selected(bat_priv); + if (!primary_if) + goto out; /* multihomed peer assumed */ /* non-primary OGMs are only broadcasted on their interface */ if ((directlink && (batman_packet->ttl == 1)) || - (forw_packet->own && (forw_packet->if_incoming->if_num > 0))) { + (forw_packet->own && (forw_packet->if_incoming != primary_if))) { /* FIXME: what about aggregated packets ? */ bat_dbg(DBG_BATMAN, bat_priv, @@ -199,7 +204,7 @@ static void send_packet(struct forw_packet *forw_packet) broadcast_addr); forw_packet->skb = NULL; - return; + goto out; } /* broadcast on every interface */ @@ -211,6 +216,10 @@ static void send_packet(struct forw_packet *forw_packet) send_packet_to_if(forw_packet, hard_iface); } rcu_read_unlock(); + +out: + if (primary_if) + hardif_free_ref(primary_if); } static void realloc_packet_buffer(struct hard_iface *hard_iface,