On Tue, Dec 13, 2016 at 10:02:21AM +0100, Martin Pieuchot wrote:
> Hence the fix below that use a higher priority for cloned routes.
> ok?

OK bluhm@

> 
> Index: net/route.c
> ===================================================================
> RCS file: /cvs/src/sys/net/route.c,v
> retrieving revision 1.342
> diff -u -p -r1.342 route.c
> --- net/route.c       4 Dec 2016 09:46:39 -0000       1.342
> +++ net/route.c       13 Dec 2016 08:46:33 -0000
> @@ -252,8 +252,15 @@ rt_match(struct sockaddr *dst, uint32_t 
>                       info.rti_info[RTAX_DST] = dst;
>  
>                       KERNEL_LOCK();
> -                     error = rtrequest(RTM_RESOLVE, &info, RTP_DEFAULT,
> -                         &rt, tableid);
> +                     /*
> +                      * The priority of cloned route should be different
> +                      * to avoid conflict with /32 cloning routes.
> +                      *
> +                      * It should also be higher to let the ARP layer find
> +                      * cloned routes instead of the cloning one.
> +                      */
> +                     error = rtrequest(RTM_RESOLVE, &info,
> +                         rt->rt_priority - 1, &rt, tableid);
>                       if (error) {
>                               rt_missmsg(RTM_MISS, &info, 0, RTP_NONE, 0,
>                                   error, tableid);
> @@ -1046,15 +1053,14 @@ rtrequest(int req, struct rt_addrinfo *i
>               ifa->ifa_refcnt++;
>               rt->rt_ifa = ifa;
>               rt->rt_ifidx = ifp->if_index;
> -             if (rt->rt_flags & RTF_CLONED) {
> -                     /*
> -                      * Copy both metrics and a back pointer to the cloned
> -                      * route's parent.
> -                      */
> -                     rt->rt_rmx = (*ret_nrt)->rt_rmx; /* copy metrics */
> -                     rt->rt_priority = (*ret_nrt)->rt_priority;
> -                     rt->rt_parent = *ret_nrt;        /* Back ptr. to 
> parent. */
> -                     rtref(rt->rt_parent);
> +             /*
> +              * Copy metrics and a back pointer from the cloned
> +              * route's parent.
> +              */
> +             if (ISSET(rt->rt_flags, RTF_CLONED)) {
> +                     rtref(*ret_nrt);
> +                     rt->rt_parent = *ret_nrt;
> +                     rt->rt_rmx = (*ret_nrt)->rt_rmx;
>               }
>  
>               /*

Reply via email to