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.

Acked-by: Simon Wunderlich <s...@simonwunderlich.de>
Signed-off-by: Andreas Pape <ap...@phoenixcontact.com>
---
 net/batman-adv/routing.c |   16 ++++++++++++++++
 1 files changed, 16 insertions(+), 0 deletions(-)

diff --git a/net/batman-adv/routing.c b/net/batman-adv/routing.c
index ae850f2..1ef0735 100644
--- a/net/batman-adv/routing.c
+++ b/net/batman-adv/routing.c
@@ -864,9 +864,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 */
@@ -906,6 +908,20 @@ 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 (orig_node &&
+                   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);
+                       batadv_orig_node_put(orig_node);
+                       return NET_RX_DROP;
+               }
+
                if (batadv_dat_snoop_incoming_arp_request(bat_priv, skb,
                                                          hdr_size))
                        goto rx_success;
--
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
___________________________________________________________________
Diese E-Mail enthält vertrauliche und/oder rechtlich geschützte Informationen. 
Wenn Sie nicht der richtige Adressat sind oder diese E-Mail irrtümlich erhalten 
haben, informieren Sie bitte sofort den Absender und vernichten Sie diese Mail. 
Das unerlaubte Kopieren, jegliche anderweitige Verwendung sowie die unbefugte 
Weitergabe dieser Mail ist nicht gestattet.
----------------------------------------------------------------------------------------------------
This e-mail may contain confidential and/or privileged information. If you are 
not the intended recipient (or have received this e-mail in error) please 
notify the sender immediately and destroy this e-mail. Any unauthorized 
copying, disclosure, distribution or other use of the material or parts thereof 
is strictly forbidden.
___________________________________________________________________

Reply via email to