[PATCH 2/2] ipv4: Make neigh lookup keys for loopback/point-to-point devices be INADDR_ANY

Subsystems: networking [general], networking [ipv4/ipv6], the rest

STALE3158d

2 messages, 2 authors, 2018-01-14 · open the first message on its own page

[PATCH 2/2] ipv4: Make neigh lookup keys for loopback/point-to-point devices be INADDR_ANY

From: Jim Westfall <hidden>
Date: 2018-01-14 00:01:40

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 <redacted>
---
 include/net/arp.h | 3 +++
 net/ipv4/arp.c    | 7 ++++++-
 2 files changed, 9 insertions(+), 1 deletion(-)
diff --git a/include/net/arp.h b/include/net/arp.h
index dc8cd47f883b..9bb399597b4b 100644
--- a/include/net/arp.h
+++ b/include/net/arp.h
@@ -20,6 +20,9 @@ static inline u32 arp_hashfn(const void *pkey, const struct net_device *dev, u32
 
 static inline struct neighbour *__ipv4_neigh_lookup_noref(struct net_device *dev, u32 key)
 {
+	if(dev->flags & (IFF_LOOPBACK | IFF_POINTOPOINT))
+		key = INADDR_ANY;
+
 	return ___neigh_lookup_noref(&arp_tbl, neigh_key_eq32, arp_hashfn, &key, dev);
 }
 
diff --git a/net/ipv4/arp.c b/net/ipv4/arp.c
index a8d7c5a9fb05..77fe6d53ac15 100644
--- a/net/ipv4/arp.c
+++ b/net/ipv4/arp.c
@@ -223,11 +223,16 @@ static bool arp_key_eq(const struct neighbour *neigh, const void *pkey)
 
 static int arp_constructor(struct neighbour *neigh)
 {
-	__be32 addr = *(__be32 *)neigh->primary_key;
+	__be32 addr;
 	struct net_device *dev = neigh->dev;
 	struct in_device *in_dev;
 	struct neigh_parms *parms;
+	u32 inaddr_any = INADDR_ANY;
 
+	if(dev->flags & (IFF_LOOPBACK | IFF_POINTOPOINT))
+		memcpy(neigh->primary_key, &inaddr_any, arp_tbl.key_len);
+
+	addr = *(__be32 *)neigh->primary_key;
 	rcu_read_lock();
 	in_dev = __in_dev_get_rcu(dev);
 	if (!in_dev) {

Re: [PATCH 2/2] ipv4: Make neigh lookup keys for loopback/point-to-point devices be INADDR_ANY

From: David Miller <davem@davemloft.net>
Date: 2018-01-14 17:05:50

From: Jim Westfall <redacted>
Date: Sat, 13 Jan 2018 16:01:39 -0800
 
+	if(dev->flags & (IFF_LOOPBACK | IFF_POINTOPOINT))
There must be a space between 'if' and the opennening parenthesis.

Please do not just repost this patch to fix this problem, you must
repost the entire patch series anew when making changes to any part of
a patch series.

Thank you.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help