On Mon, Jan 19, 2015 at 11:49:53AM +0100, Martin Pieuchot wrote:
> Instead of rerolling rtrequest1(RTM_DELETE...) code in various places,
> simply use rtdeletemsg() which also notify userland that the route entry
> is going away.
> 
> Comments, ok?

I think this version of the diff is correct.  If rtrequest1(RTM_DELETE)
is called with NULL as the 4th parameter, it frees the route.
rtdeletemsg() passes a route pointer to rtrequest1() and does the
rtfree() itself.  So the number of frees have not changed.

OK bluhm@

> 
> Index: netinet/ip_icmp.c
> ===================================================================
> RCS file: /home/ncvs/src/sys/netinet/ip_icmp.c,v
> retrieving revision 1.129
> diff -u -p -r1.129 ip_icmp.c
> --- netinet/ip_icmp.c 22 Dec 2014 11:05:53 -0000      1.129
> +++ netinet/ip_icmp.c 19 Jan 2015 10:45:44 -0000
> @@ -1031,20 +1031,12 @@ icmp_mtudisc_timeout(struct rtentry *rt,
>           (RTF_DYNAMIC | RTF_HOST)) {
>               void *(*ctlfunc)(int, struct sockaddr *, u_int, void *);
>               struct sockaddr_in sa;
> -             struct rt_addrinfo info;
>               int s;
>  
> -             memset(&info, 0, sizeof(info));
> -             info.rti_info[RTAX_DST] = rt_key(rt);
> -             info.rti_info[RTAX_NETMASK] = rt_mask(rt);
> -             info.rti_info[RTAX_GATEWAY] = rt->rt_gateway;
> -             info.rti_flags = rt->rt_flags;   
> -
>               sa = *(struct sockaddr_in *)rt_key(rt);
>  
>               s = splsoftnet();
> -             rtrequest1(RTM_DELETE, &info, rt->rt_priority, NULL,
> -                 r->rtt_tableid);
> +             rtdeletemsg(rt, r->rtt_tableid);
>  
>               /* Notify TCP layer of increased Path MTU estimate */
>               ctlfunc = inetsw[ip_protox[IPPROTO_TCP]].pr_ctlinput;
> @@ -1083,18 +1075,10 @@ icmp_redirect_timeout(struct rtentry *rt
>  
>       if ((rt->rt_flags & (RTF_DYNAMIC | RTF_HOST)) ==
>           (RTF_DYNAMIC | RTF_HOST)) {
> -             struct rt_addrinfo info;
>               int s;
>  
> -             memset(&info, 0, sizeof(info));
> -             info.rti_info[RTAX_DST] = rt_key(rt);
> -             info.rti_info[RTAX_NETMASK] = rt_mask(rt);
> -             info.rti_info[RTAX_GATEWAY] = rt->rt_gateway;
> -             info.rti_flags = rt->rt_flags;   
> -
>               s = splsoftnet();
> -             rtrequest1(RTM_DELETE, &info, rt->rt_priority, NULL, 
> -                 r->rtt_tableid);
> +             rtdeletemsg(rt, r->rtt_tableid);
>               splx(s);
>       }
>  }
> Index: netinet6/icmp6.c
> ===================================================================
> RCS file: /home/ncvs/src/sys/netinet6/icmp6.c,v
> retrieving revision 1.152
> diff -u -p -r1.152 icmp6.c
> --- netinet6/icmp6.c  22 Dec 2014 11:05:53 -0000      1.152
> +++ netinet6/icmp6.c  19 Jan 2015 10:45:44 -0000
> @@ -1984,18 +1984,10 @@ icmp6_mtudisc_timeout(struct rtentry *rt
>               panic("icmp6_mtudisc_timeout: bad route to timeout");
>       if ((rt->rt_flags & (RTF_DYNAMIC | RTF_HOST)) ==
>           (RTF_DYNAMIC | RTF_HOST)) {
> -             struct rt_addrinfo info;
>               int s;
>  
> -             bzero(&info, sizeof(info));
> -             info.rti_flags = rt->rt_flags;
> -             info.rti_info[RTAX_DST] = rt_key(rt);
> -             info.rti_info[RTAX_GATEWAY] = rt->rt_gateway;
> -             info.rti_info[RTAX_NETMASK] = rt_mask(rt);
> -
>               s = splsoftnet();
> -             rtrequest1(RTM_DELETE, &info, rt->rt_priority, NULL,
> -                 r->rtt_tableid);
> +             rtdeletemsg(rt, r->rtt_tableid);
>               splx(s);
>       } else {
>               if (!(rt->rt_rmx.rmx_locks & RTV_MTU))
> @@ -2010,18 +2002,10 @@ icmp6_redirect_timeout(struct rtentry *r
>               panic("icmp6_redirect_timeout: bad route to timeout");
>       if ((rt->rt_flags & (RTF_GATEWAY | RTF_DYNAMIC | RTF_HOST)) ==
>           (RTF_GATEWAY | RTF_DYNAMIC | RTF_HOST)) {
> -             struct rt_addrinfo info;
>               int s;
>  
> -             bzero(&info, sizeof(info));
> -             info.rti_flags = rt->rt_flags;
> -             info.rti_info[RTAX_DST] = rt_key(rt);
> -             info.rti_info[RTAX_GATEWAY] = rt->rt_gateway;
> -             info.rti_info[RTAX_NETMASK] = rt_mask(rt);
> -
>               s = splsoftnet();
> -             rtrequest1(RTM_DELETE, &info, rt->rt_priority, NULL,
> -                 r->rtt_tableid);
> +             rtdeletemsg(rt, r->rtt_tableid);
>               splx(s);
>       }
>  }
> Index: netinet6/in6_ifattach.c
> ===================================================================
> RCS file: /home/ncvs/src/sys/netinet6/in6_ifattach.c,v
> retrieving revision 1.81
> diff -u -p -r1.81 in6_ifattach.c
> --- netinet6/in6_ifattach.c   10 Jan 2015 11:43:37 -0000      1.81
> +++ netinet6/in6_ifattach.c   19 Jan 2015 10:45:44 -0000
> @@ -666,15 +666,7 @@ in6_ifdetach(struct ifnet *ifp)
>       sin6.sin6_addr.s6_addr16[1] = htons(ifp->if_index);
>       rt = rtalloc(sin6tosa(&sin6), 0, ifp->if_rdomain);
>       if (rt && rt->rt_ifp == ifp) {
> -             struct rt_addrinfo info;
> -
> -             bzero(&info, sizeof(info));
> -             info.rti_flags = rt->rt_flags;
> -             info.rti_info[RTAX_DST] = rt_key(rt);
> -             info.rti_info[RTAX_GATEWAY] = rt->rt_gateway;
> -             info.rti_info[RTAX_NETMASK] = rt_mask(rt);
> -             rtrequest1(RTM_DELETE, &info, rt->rt_priority, NULL,
> -                 ifp->if_rdomain);
> +             rtdeletemsg(rt, ifp->if_rdomain);
>               rtfree(rt);
>       }
>  
> @@ -686,15 +678,7 @@ in6_ifdetach(struct ifnet *ifp)
>       sin6.sin6_addr.s6_addr16[1] = htons(ifp->if_index);
>       rt = rtalloc(sin6tosa(&sin6), 0, ifp->if_rdomain);
>       if (rt && rt->rt_ifp == ifp) {
> -             struct rt_addrinfo info;
> -
> -             bzero(&info, sizeof(info));
> -             info.rti_flags = rt->rt_flags;
> -             info.rti_info[RTAX_DST] = rt_key(rt);
> -             info.rti_info[RTAX_GATEWAY] = rt->rt_gateway;
> -             info.rti_info[RTAX_NETMASK] = rt_mask(rt);
> -             rtrequest1(RTM_DELETE, &info, rt->rt_priority, NULL,
> -                 ifp->if_rdomain);
> +             rtdeletemsg(rt, ifp->if_rdomain);
>               rtfree(rt);
>       }
>  

Reply via email to