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);
> }