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

Reply via email to