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

Reply via email to