Ultimately my goal is to use rt_ifa_{add,del}() instead of
nd6_prefix_{on,off}link() but right now I need to remove the
rt->ref_cnt--.

This diff does that and reduce the differences between these functions.

Note that nd6_prefix_onlink()'s error are always logged so I doubt we
need two messages.

Ok?

Index: netinet6/nd6.h
===================================================================
RCS file: /cvs/src/sys/netinet6/nd6.h,v
retrieving revision 1.44
diff -u -p -r1.44 nd6.h
--- netinet6/nd6.h      18 Jul 2015 15:05:32 -0000      1.44
+++ netinet6/nd6.h      17 Aug 2015 10:04:04 -0000
@@ -309,8 +309,6 @@ void prelist_remove(struct nd_prefix *);
 int prelist_update(struct nd_prefix *, struct nd_defrouter *, struct mbuf *);
 int nd6_prelist_add(struct nd_prefix *, struct nd_defrouter *,
        struct nd_prefix **);
-int nd6_prefix_onlink(struct nd_prefix *);
-int nd6_prefix_offlink(struct nd_prefix *);
 void pfxlist_onlink_check(void);
 struct nd_defrouter *defrouter_lookup(struct in6_addr *, struct ifnet *);
 
Index: netinet6/nd6_rtr.c
===================================================================
RCS file: /cvs/src/sys/netinet6/nd6_rtr.c,v
retrieving revision 1.113
diff -u -p -r1.113 nd6_rtr.c
--- netinet6/nd6_rtr.c  18 Jul 2015 15:51:17 -0000      1.113
+++ netinet6/nd6_rtr.c  17 Aug 2015 10:04:05 -0000
@@ -69,7 +69,8 @@ void pfxrtr_del(struct nd_pfxrouter *);
 struct nd_pfxrouter *find_pfxlist_reachable_router(struct nd_prefix *);
 void defrouter_delreq(struct nd_defrouter *);
 void purge_detached(struct ifnet *);
-
+int nd6_prefix_onlink(struct nd_prefix *);
+int nd6_prefix_offlink(struct nd_prefix *);
 void in6_init_address_ltimes(struct nd_prefix *, struct in6_addrlifetime *);
 
 int rt6_deleteroute(struct rtentry *, void *, unsigned int);
@@ -601,7 +602,7 @@ defrouter_addreq(struct nd_defrouter *ne
 {
        struct rt_addrinfo info;
        struct sockaddr_in6 def, mask, gate;
-       struct rtentry *newrt = NULL;
+       struct rtentry *rt = NULL;
        int s;
        int error;
 
@@ -622,11 +623,11 @@ defrouter_addreq(struct nd_defrouter *ne
        info.rti_info[RTAX_NETMASK] = sin6tosa(&mask);
 
        s = splsoftnet();
-       error = rtrequest1(RTM_ADD, &info, RTP_DEFAULT, &newrt,
+       error = rtrequest1(RTM_ADD, &info, RTP_DEFAULT, &rt,
            new->ifp->if_rdomain);
-       if (newrt) {
-               rt_sendmsg(newrt, RTM_ADD, new->ifp->if_rdomain);
-               newrt->rt_refcnt--;
+       if (rt) {
+               rt_sendmsg(rt, RTM_ADD, new->ifp->if_rdomain);
+               rtfree(rt);
        }
        if (error == 0)
                new->installed = 1;
@@ -1783,14 +1784,8 @@ nd6_prefix_onlink(struct nd_prefix *pr)
        char addr[INET6_ADDRSTRLEN];
 
        /* sanity check */
-       if ((pr->ndpr_stateflags & NDPRF_ONLINK) != 0) {
-               nd6log((LOG_ERR,
-                   "nd6_prefix_onlink: %s/%d is already on-link\n",
-                   inet_ntop(AF_INET6, &pr->ndpr_prefix.sin6_addr,
-                       addr, sizeof(addr)),
-                   pr->ndpr_plen));
+       if ((pr->ndpr_stateflags & NDPRF_ONLINK) != 0)
                return (EEXIST);
-       }
 
        /*
         * Add the interface route associated with the prefix.  Before
@@ -1861,26 +1856,11 @@ nd6_prefix_onlink(struct nd_prefix *pr)
        info.rti_info[RTAX_NETMASK] = sin6tosa(&mask6);
 
        error = rtrequest1(RTM_ADD, &info, RTP_CONNECTED, &rt, ifp->if_rdomain);
-       if (error == 0) {
-               if (rt != NULL) /* this should be non NULL, though */
-                       rt_sendmsg(rt, RTM_ADD, ifp->if_rdomain);
+       if (error == 0 && rt != NULL) {
                pr->ndpr_stateflags |= NDPRF_ONLINK;
-       } else {
-               char gw[INET6_ADDRSTRLEN], mask[INET6_ADDRSTRLEN];
-               nd6log((LOG_ERR, "nd6_prefix_onlink: failed to add route for a"
-                   " prefix (%s/%d) on %s, gw=%s, mask=%s, flags=%lx "
-                   "errno = %d\n",
-                   inet_ntop(AF_INET6, &pr->ndpr_prefix.sin6_addr,
-                       addr, sizeof(addr)),
-                   pr->ndpr_plen, ifp->if_xname,
-                   inet_ntop(AF_INET6, &satosin6(ifa->ifa_addr)->sin6_addr,
-                       gw, sizeof(gw)),
-                   inet_ntop(AF_INET6, &mask6.sin6_addr, mask, sizeof(mask)),
-                   rtflags, error));
+               rt_sendmsg(rt, RTM_ADD, ifp->if_rdomain);
+               rtfree(rt);
        }
-
-       if (rt != NULL)
-               rt->rt_refcnt--;
 
        return (error);
 }

Reply via email to