[v2,4/7] batman-adv: drop unicast packets from other backbone gw
Commit Message
Additional dropping of unicast packets received from another backbone gw of
the same backbone network before being forwarded to the same backbone again
is necessary. It was observed in a test setup that in rare cases these
frames lead to looping unicast traffic backbone->mesh->backbone.
Signed-off-by: Andreas Pape <apape@phoenixcontact.com>
---
net/batman-adv/routing.c | 15 +++++++++++++++
1 files changed, 15 insertions(+), 0 deletions(-)
--
1.7.0.4
..................................................................
PHOENIX CONTACT ELECTRONICS GmbH
Sitz der Gesellschaft / registered office of the company: 31812 Bad Pyrmont
USt-Id-Nr.: DE811742156
Amtsgericht Hannover HRB 100528 / district court Hannover HRB 100528
Geschäftsführer / Executive Board: Roland Bent, Dr. Martin Heubeck
Comments
On Friday 26 February 2016 14:18:54 Andreas Pape wrote:
> @@ -896,6 +898,19 @@ int batadv_recv_unicast_packet(struct sk_buff *skb,
> }
> }
>
> + /* If this is a unicast packet from another backgone gw,
> + * drop it.
> + */
> + orig_addr = ethhdr->h_source;
> + orig_node = batadv_orig_hash_find(bat_priv, orig_addr);
> + if (batadv_bla_is_backbone_gw(skb, orig_node, hdr_size)) {
> + batadv_dbg(BATADV_DBG_BLA, bat_priv,
> + "Dropped unicast pkt received from another backbone gw %pM.\n",
> + orig_addr);
> +
> + return NET_RX_DROP;
> + }
> +
The orig_node was previously assigned via batadv_orig_hash_find. But this
batadv_orig_hash_find already increased the reference pointer for orig_node.
So we would now have an imbalance at the end of the function.
Kind regards,
Sven
On Friday 26 February 2016 14:18:54 Andreas Pape wrote:
> Additional dropping of unicast packets received from another backbone gw of
> the same backbone network before being forwarded to the same backbone again
> is necessary. It was observed in a test setup that in rare cases these
> frames lead to looping unicast traffic backbone->mesh->backbone.
Yup, this is what we discussed!
Acked-by: Simon Wunderlich <sw@simonwunderlich.de>
Thanks!
Simon
@@ -854,9 +854,11 @@ int batadv_recv_unicast_packet(struct sk_buff *skb,
int check, hdr_size = sizeof(*unicast_packet);
enum batadv_subtype subtype;
bool is4addr;
+ struct ethhdr *ethhdr;
unicast_packet = (struct batadv_unicast_packet *)skb->data;
unicast_4addr_packet = (struct batadv_unicast_4addr_packet *)skb->data;
+ ethhdr = eth_hdr(skb);
is4addr = unicast_packet->packet_type == BATADV_UNICAST_4ADDR;
/* the caller function should have already pulled 2 bytes */
@@ -896,6 +898,19 @@ int batadv_recv_unicast_packet(struct sk_buff *skb,
}
}
+ /* If this is a unicast packet from another backgone gw,
+ * drop it.
+ */
+ orig_addr = ethhdr->h_source;
+ orig_node = batadv_orig_hash_find(bat_priv, orig_addr);
+ if (batadv_bla_is_backbone_gw(skb, orig_node, hdr_size)) {
+ batadv_dbg(BATADV_DBG_BLA, bat_priv,
+ "Dropped unicast pkt received from another backbone gw %pM.\n",
+ orig_addr);
+
+ return NET_RX_DROP;
+ }
+
if (batadv_dat_snoop_incoming_arp_request(bat_priv, skb,
hdr_size))
goto rx_success;