Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ipv4: Make neigh lookup keys for loopback/point-to-point devices be INADDR_ANY

Map all lookup neigh keys to INADDR_ANY for loopback/point-to-point devices
to avoid making an entry for every remote ip the device needs to talk to.

This used the be the old behavior but became broken in a263b3093641f
(ipv4: Make neigh lookups directly in output packet path) and later removed
in 0bb4087cbec0 (ipv4: Fix neigh lookup keying over loopback/point-to-point
devices) because it was broken.

Signed-off-by: Jim Westfall <jwestfall@surrealistic.net>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Jim Westfall and committed by
David S. Miller
cd9ff4de 096b9854

+9 -1
+3
include/net/arp.h
··· 20 20 21 21 static inline struct neighbour *__ipv4_neigh_lookup_noref(struct net_device *dev, u32 key) 22 22 { 23 + if (dev->flags & (IFF_LOOPBACK | IFF_POINTOPOINT)) 24 + key = INADDR_ANY; 25 + 23 26 return ___neigh_lookup_noref(&arp_tbl, neigh_key_eq32, arp_hashfn, &key, dev); 24 27 } 25 28
+6 -1
net/ipv4/arp.c
··· 223 223 224 224 static int arp_constructor(struct neighbour *neigh) 225 225 { 226 - __be32 addr = *(__be32 *)neigh->primary_key; 226 + __be32 addr; 227 227 struct net_device *dev = neigh->dev; 228 228 struct in_device *in_dev; 229 229 struct neigh_parms *parms; 230 + u32 inaddr_any = INADDR_ANY; 230 231 232 + if (dev->flags & (IFF_LOOPBACK | IFF_POINTOPOINT)) 233 + memcpy(neigh->primary_key, &inaddr_any, arp_tbl.key_len); 234 + 235 + addr = *(__be32 *)neigh->primary_key; 231 236 rcu_read_lock(); 232 237 in_dev = __in_dev_get_rcu(dev); 233 238 if (!in_dev) {