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