Three things to make comparison easier:
- hoist duplicate addr[] declaration
- defer failure into `bad' label
These seem sensible on their own.
- set/use getuptime() identically
This is purely for sync; nd6_resolve() uses getuptime() just once,
while arpresolve() has multiple `uptime' usages.
OK?
Index: nd6.c
===================================================================
RCS file: /cvs/src/sys/netinet6/nd6.c,v
retrieving revision 1.265
diff -u -p -r1.265 nd6.c
--- nd6.c 24 Jan 2023 20:06:16 -0000 1.265
+++ nd6.c 27 Feb 2023 08:19:57 -0000
@@ -1247,16 +1247,19 @@ nd6_resolve(struct ifnet *ifp, struct rt
struct sockaddr_dl *sdl;
struct rtentry *rt;
struct llinfo_nd6 *ln = NULL;
+ char addr[INET6_ADDRSTRLEN];
+ time_t uptime;
if (m->m_flags & M_MCAST) {
ETHER_MAP_IPV6_MULTICAST(&satosin6(dst)->sin6_addr, desten);
return (0);
}
+ uptime = getuptime();
rt = rt_getll(rt0);
if (ISSET(rt->rt_flags, RTF_REJECT) &&
- (rt->rt_expire == 0 || getuptime() < rt->rt_expire)) {
+ (rt->rt_expire == 0 || rt->rt_expire > uptime)) {
m_freem(m);
return (rt == rt0 ? EHOSTDOWN : EHOSTUNREACH);
}
@@ -1268,18 +1271,15 @@ nd6_resolve(struct ifnet *ifp, struct rt
* or an anycast address(i.e. not a multicast).
*/
if (!ISSET(rt->rt_flags, RTF_LLINFO)) {
- char addr[INET6_ADDRSTRLEN];
log(LOG_DEBUG, "%s: %s: route contains no ND information\n",
__func__, inet_ntop(AF_INET6,
&satosin6(rt_key(rt))->sin6_addr, addr, sizeof(addr)));
- m_freem(m);
- return (EINVAL);
+ goto bad;
}
if (rt->rt_gateway->sa_family != AF_LINK) {
printf("%s: something odd happens\n", __func__);
- m_freem(m);
- return (EINVAL);
+ goto bad;
}
ln = (struct llinfo_nd6 *)rt->rt_llinfo;
@@ -1314,13 +1314,11 @@ nd6_resolve(struct ifnet *ifp, struct rt
if (ln->ln_state > ND6_LLINFO_INCOMPLETE) {
sdl = satosdl(rt->rt_gateway);
if (sdl->sdl_alen != ETHER_ADDR_LEN) {
- char addr[INET6_ADDRSTRLEN];
log(LOG_DEBUG, "%s: %s: incorrect nd6 information\n",
__func__,
inet_ntop(AF_INET6, &satosin6(dst)->sin6_addr,
addr, sizeof(addr)));
- m_freem(m);
- return (EINVAL);
+ goto bad;
}
bcopy(LLADDR(sdl), desten, sdl->sdl_alen);
@@ -1347,6 +1345,10 @@ nd6_resolve(struct ifnet *ifp, struct rt
nd6_ns_output(ifp, NULL, &satosin6(dst)->sin6_addr, ln, 0);
}
return (EAGAIN);
+
+bad:
+ m_freem(m);
+ return (EINVAL);
}
int