B.A.T.M.A.N Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Simon Wunderlich <sw@simonwunderlich.de>
To: davem@davemloft.net
Cc: netdev@vger.kernel.org, b.a.t.m.a.n@lists.open-mesh.org
Subject: [B.A.T.M.A.N.] [PATCH 09/19] batman-adv: prevent duplication of ARP replies when DAT is used
Date: Thu,  6 Apr 2017 16:07:31 +0200	[thread overview]
Message-ID: <20170406140741.30745-10-sw@simonwunderlich.de> (raw)
In-Reply-To: <20170406140741.30745-1-sw@simonwunderlich.de>

From: Andreas Pape <APape@phoenixcontact.com>

If none of the backbone gateways in a bla setup has already knowledge of
the mac address searched for in an incoming ARP request from the backbone
an address resolution via the DHT of DAT is started. The gateway can send
several ARP requests to different DHT nodes and therefore can get several
replies. This patch assures that not all of the possible ARP replies are
returned to the backbone by checking the local DAT cache of the gateway.
If there is an entry in the local cache the gateway has already learned
the requested address and there is no need to forward the additional reply
to the backbone.
Furthermore it is checked if this gateway has claimed the source of the ARP
reply and only forwards it to the backbone if it has claimed the source or
if there is no claim at all.

Signed-off-by: Andreas Pape <apape@phoenixcontact.com>
Acked-by: Simon Wunderlich <sw@simonwunderlich.de>
[sven@narfation.org: fix conflicts with current version]
Signed-off-by: Sven Eckelmann <sven@narfation.org>
Signed-off-by: Simon Wunderlich <sw@simonwunderlich.de>
---
 net/batman-adv/distributed-arp-table.c | 32 ++++++++++++++++++++++++++++++++
 1 file changed, 32 insertions(+)

diff --git a/net/batman-adv/distributed-arp-table.c b/net/batman-adv/distributed-arp-table.c
index 28cfa53837e1..77ede40ff529 100644
--- a/net/batman-adv/distributed-arp-table.c
+++ b/net/batman-adv/distributed-arp-table.c
@@ -1203,6 +1203,7 @@ void batadv_dat_snoop_outgoing_arp_reply(struct batadv_priv *bat_priv,
 bool batadv_dat_snoop_incoming_arp_reply(struct batadv_priv *bat_priv,
 					 struct sk_buff *skb, int hdr_size)
 {
+	struct batadv_dat_entry *dat_entry = NULL;
 	u16 type;
 	__be32 ip_src, ip_dst;
 	u8 *hw_src, *hw_dst;
@@ -1225,12 +1226,41 @@ bool batadv_dat_snoop_incoming_arp_reply(struct batadv_priv *bat_priv,
 	hw_dst = batadv_arp_hw_dst(skb, hdr_size);
 	ip_dst = batadv_arp_ip_dst(skb, hdr_size);
 
+	/* If ip_dst is already in cache and has the right mac address,
+	 * drop this frame if this ARP reply is destined for us because it's
+	 * most probably an ARP reply generated by another node of the DHT.
+	 * We have most probably received already a reply earlier. Delivering
+	 * this frame would lead to doubled receive of an ARP reply.
+	 */
+	dat_entry = batadv_dat_entry_hash_find(bat_priv, ip_src, vid);
+	if (dat_entry && batadv_compare_eth(hw_src, dat_entry->mac_addr)) {
+		batadv_dbg(BATADV_DBG_DAT, bat_priv, "Doubled ARP reply removed: ARP MSG = [src: %pM-%pI4 dst: %pM-%pI4]; dat_entry: %pM-%pI4\n",
+			   hw_src, &ip_src, hw_dst, &ip_dst,
+			   dat_entry->mac_addr,	&dat_entry->ip);
+		dropped = true;
+		goto out;
+	}
+
 	/* Update our internal cache with both the IP addresses the node got
 	 * within the ARP reply
 	 */
 	batadv_dat_entry_add(bat_priv, ip_src, hw_src, vid);
 	batadv_dat_entry_add(bat_priv, ip_dst, hw_dst, vid);
 
+	/* If BLA is enabled, only forward ARP replies if we have claimed the
+	 * source of the ARP reply or if no one else of the same backbone has
+	 * already claimed that client. This prevents that different gateways
+	 * to the same backbone all forward the ARP reply leading to multiple
+	 * replies in the backbone.
+	 */
+	if (!batadv_bla_check_claim(bat_priv, hw_src, vid)) {
+		batadv_dbg(BATADV_DBG_DAT, bat_priv,
+			   "Device %pM claimed by another backbone gw. Drop ARP reply.\n",
+			   hw_src);
+		dropped = true;
+		goto out;
+	}
+
 	/* if this REPLY is directed to a client of mine, let's deliver the
 	 * packet to the interface
 	 */
@@ -1243,6 +1273,8 @@ bool batadv_dat_snoop_incoming_arp_reply(struct batadv_priv *bat_priv,
 out:
 	if (dropped)
 		kfree_skb(skb);
+	if (dat_entry)
+		batadv_dat_entry_put(dat_entry);
 	/* if dropped == false -> deliver to the interface */
 	return dropped;
 }
-- 
2.11.0


  parent reply	other threads:[~2017-04-06 14:07 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-04-06 14:07 [B.A.T.M.A.N.] [PATCH 00/19] pull request for net-next: batman-adv 2017-04-06 Simon Wunderlich
2017-04-06 14:07 ` [B.A.T.M.A.N.] [PATCH 01/19] batman-adv: Start new development cycle Simon Wunderlich
2017-04-06 14:07 ` [B.A.T.M.A.N.] [PATCH 02/19] batman-adv: Reduce preprocessor checks in multicast.c Simon Wunderlich
2017-04-06 14:07 ` [B.A.T.M.A.N.] [PATCH 03/19] batman-adv: Fix unbalanced braces around else statement Simon Wunderlich
2017-04-06 14:07 ` [B.A.T.M.A.N.] [PATCH 04/19] batman-adv: Fix possible side-effects in _batadv_dbg Simon Wunderlich
2017-04-06 14:07 ` [B.A.T.M.A.N.] [PATCH 05/19] batman-adv: Convert BATADV_PRINT_VID macro to function Simon Wunderlich
2017-04-06 14:07 ` [B.A.T.M.A.N.] [PATCH 06/19] batman-adv: Use __func__ to add function names to messages Simon Wunderlich
2017-04-06 14:07 ` [B.A.T.M.A.N.] [PATCH 07/19] batman-adv: Omit unnecessary memset of netdev private data Simon Wunderlich
2017-04-06 14:07 ` [B.A.T.M.A.N.] [PATCH 08/19] batman-adv: prevent multiple ARP replies sent by gateways if dat enabled Simon Wunderlich
2017-04-06 14:07 ` Simon Wunderlich [this message]
2017-04-06 14:07 ` [B.A.T.M.A.N.] [PATCH 10/19] batman-adv: drop unicast packets from other backbone gw Simon Wunderlich
2017-04-06 14:07 ` [B.A.T.M.A.N.] [PATCH 11/19] batman-adv: changed debug messages for easier bla debugging Simon Wunderlich
2017-04-06 14:07 ` [B.A.T.M.A.N.] [PATCH 12/19] batman-adv: handle race condition for claims between gateways Simon Wunderlich
2017-04-06 14:07 ` [B.A.T.M.A.N.] [PATCH 13/19] batman-adv: privatize forw_packet skb assignment Simon Wunderlich
2017-04-06 14:07 ` [B.A.T.M.A.N.] [PATCH 14/19] batman-adv: restructure rebroadcast counter into forw_packet API Simon Wunderlich
2017-04-06 14:07 ` [B.A.T.M.A.N.] [PATCH 15/19] batman-adv: Use ethtool helper to get link status Simon Wunderlich
2017-04-06 14:07 ` [B.A.T.M.A.N.] [PATCH 16/19] batman-adv: Remove ethtool msglevel functions Simon Wunderlich
2017-04-06 14:07 ` [B.A.T.M.A.N.] [PATCH 17/19] batman-adv: Remove ethtool .get_settings stub Simon Wunderlich
2017-04-06 14:07 ` [B.A.T.M.A.N.] [PATCH 18/19] batman-adv: Group ethtool related code together Simon Wunderlich
2017-04-06 14:07 ` [B.A.T.M.A.N.] [PATCH 19/19] batman-adv: Use net_device_stats from struct net_device Simon Wunderlich
2017-04-06 21:55 ` [B.A.T.M.A.N.] [PATCH 00/19] pull request for net-next: batman-adv 2017-04-06 David Miller

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170406140741.30745-10-sw@simonwunderlich.de \
    --to=sw@simonwunderlich.de \
    --cc=b.a.t.m.a.n@lists.open-mesh.org \
    --cc=davem@davemloft.net \
    --cc=netdev@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox