diff options
Diffstat (limited to 'net/batman-adv/distributed-arp-table.c')
| -rw-r--r-- | net/batman-adv/distributed-arp-table.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/net/batman-adv/distributed-arp-table.c b/net/batman-adv/distributed-arp-table.c index 8e15d966d9b0..239992021b1d 100644 --- a/net/batman-adv/distributed-arp-table.c +++ b/net/batman-adv/distributed-arp-table.c | |||
| @@ -837,6 +837,19 @@ bool batadv_dat_snoop_outgoing_arp_request(struct batadv_priv *bat_priv, | |||
| 837 | 837 | ||
| 838 | dat_entry = batadv_dat_entry_hash_find(bat_priv, ip_dst); | 838 | dat_entry = batadv_dat_entry_hash_find(bat_priv, ip_dst); |
| 839 | if (dat_entry) { | 839 | if (dat_entry) { |
| 840 | /* If the ARP request is destined for a local client the local | ||
| 841 | * client will answer itself. DAT would only generate a | ||
| 842 | * duplicate packet. | ||
| 843 | * | ||
| 844 | * Moreover, if the soft-interface is enslaved into a bridge, an | ||
| 845 | * additional DAT answer may trigger kernel warnings about | ||
| 846 | * a packet coming from the wrong port. | ||
| 847 | */ | ||
| 848 | if (batadv_is_my_client(bat_priv, dat_entry->mac_addr)) { | ||
| 849 | ret = true; | ||
| 850 | goto out; | ||
| 851 | } | ||
| 852 | |||
| 840 | skb_new = arp_create(ARPOP_REPLY, ETH_P_ARP, ip_src, | 853 | skb_new = arp_create(ARPOP_REPLY, ETH_P_ARP, ip_src, |
| 841 | bat_priv->soft_iface, ip_dst, hw_src, | 854 | bat_priv->soft_iface, ip_dst, hw_src, |
| 842 | dat_entry->mac_addr, hw_src); | 855 | dat_entry->mac_addr, hw_src); |
