Message ID | 1456492734-29785-1-git-send-email-apape@phoenixcontact.com |
---|---|
State | Superseded, archived |
Delegated to: | Marek Lindner |
Headers | show |
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
diff --git a/net/batman-adv/routing.c b/net/batman-adv/routing.c index 4dd646a..606fd22 100644 --- a/net/batman-adv/routing.c +++ b/net/batman-adv/routing.c @@ -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;
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