When the caller of arplookup() asked for a proxy'd ARP entry, make
sure the entry returned by rtalloc(9) is indeed "published".
This is currently always true for ARP entries added with arp(8) but
it is not the case if you add your own entry with the 33rd bit set
but without setting RTF_ANNOUNCE.
It is also not the case with ART.
Since the 33rd bit trick is an implementation detail of the current
routing table, which I'm doing differently with ART, let's check for
the correct flag.
ok?
Index: netinet/if_ether.c
===================================================================
RCS file: /cvs/src/sys/netinet/if_ether.c,v
retrieving revision 1.202
diff -u -p -r1.202 if_ether.c
--- netinet/if_ether.c 7 Mar 2016 11:00:36 -0000 1.202
+++ netinet/if_ether.c 21 Mar 2016 13:22:33 -0000
@@ -696,6 +696,12 @@ arplookup(u_int32_t addr, int create, in
rtfree(rt);
return (NULL);
}
+
+ if (proxy && !ISSET(rt->rt_flags, RTF_ANNOUNCE)) {
+ rtfree(rt);
+ return (NULL);
+ }
+
return (rt);
}