aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/include/net/arp.h
diff options
context:
space:
mode:
authorIdo Schimmel <idosch@nvidia.com>2022-02-19 17:45:19 +0200
committerDavid S. Miller <davem@davemloft.net>2022-02-21 11:44:30 +0000
commit0c51e12e218f20b7d976158fdc18019627326f7a (patch)
tree287262c369f4a6c50f04947182b48dc5d2232769 /include/net/arp.h
parentnet: core: Use csum_replace_by_diff() and csum_sub() instead of opencoding (diff)
downloadwireguard-linux-0c51e12e218f20b7d976158fdc18019627326f7a.tar.xz
wireguard-linux-0c51e12e218f20b7d976158fdc18019627326f7a.zip
ipv4: Invalidate neighbour for broadcast address upon address addition
In case user space sends a packet destined to a broadcast address when a matching broadcast route is not configured, the kernel will create a unicast neighbour entry that will never be resolved [1]. When the broadcast route is configured, the unicast neighbour entry will not be invalidated and continue to linger, resulting in packets being dropped. Solve this by invalidating unresolved neighbour entries for broadcast addresses after routes for these addresses are internally configured by the kernel. This allows the kernel to create a broadcast neighbour entry following the next route lookup. Another possible solution that is more generic but also more complex is to have the ARP code register a listener to the FIB notification chain and invalidate matching neighbour entries upon the addition of broadcast routes. It is also possible to wave off the issue as a user space problem, but it seems a bit excessive to expect user space to be that intimately familiar with the inner workings of the FIB/neighbour kernel code. [1] https://lore.kernel.org/netdev/55a04a8f-56f3-f73c-2aea-2195923f09d1@huawei.com/ Reported-by: Wang Hai <wanghai38@huawei.com> Signed-off-by: Ido Schimmel <idosch@nvidia.com> Tested-by: Wang Hai <wanghai38@huawei.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'include/net/arp.h')
-rw-r--r--include/net/arp.h1
1 files changed, 1 insertions, 0 deletions
diff --git a/include/net/arp.h b/include/net/arp.h
index 031374ac2f22..d7ef4ec71dfe 100644
--- a/include/net/arp.h
+++ b/include/net/arp.h
@@ -65,6 +65,7 @@ void arp_send(int type, int ptype, __be32 dest_ip,
const unsigned char *src_hw, const unsigned char *th);
int arp_mc_map(__be32 addr, u8 *haddr, struct net_device *dev, int dir);
void arp_ifdown(struct net_device *dev);
+int arp_invalidate(struct net_device *dev, __be32 ip, bool force);
struct sk_buff *arp_create(int type, int ptype, __be32 dest_ip,
struct net_device *dev, __be32 src_ip,