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