On Mon, Aug 17, 2015 at 12:34:13PM +0200, Martin Pieuchot wrote: > 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?
We, mpi@ and bluhm@, both agree that checking error == 0 and rt != NULL after rtrequest1() is equivalent. We can figure out the best coding style later. OK bluhm@ > > 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); > }