On Tue, Sep 01, 2015 at 03:03:07PM +0200, Martin Pieuchot wrote: > Now I still believe that such conversions should not be committed all at > once because they might have undesirable side effects. So here's a > first diff that I need for my rtalloc(9) rewrite. Are you ok with it?
Yes, and small diffs are much easier to review. OK bluhm@ > > Index: netinet/ip_output.c > =================================================================== > RCS file: /cvs/src/sys/netinet/ip_output.c,v > retrieving revision 1.287 > diff -u -p -r1.287 ip_output.c > --- netinet/ip_output.c 31 Aug 2015 07:17:12 -0000 1.287 > +++ netinet/ip_output.c 1 Sep 2015 12:57:06 -0000 > @@ -168,12 +168,13 @@ ip_output(struct mbuf *m0, struct mbuf * > dst = satosin(&ro->ro_dst); > > /* > - * If there is a cached route, check that it is to the same > - * destination and is still up. If not, free it and try again. > + * If there is a cached route, check that it is to the > + * same destination and is still valid. If not, free > + * it and try again. > */ > - if (ro->ro_rt && ((ro->ro_rt->rt_flags & RTF_UP) == 0 || > + if (!rtisvalid(ro->ro_rt) || > dst->sin_addr.s_addr != ip->ip_dst.s_addr || > - ro->ro_tableid != m->m_pkthdr.ph_rtableid)) { > + ro->ro_tableid != m->m_pkthdr.ph_rtableid) { > rtfree(ro->ro_rt); > ro->ro_rt = NULL; > } > @@ -195,7 +196,9 @@ ip_output(struct mbuf *m0, struct mbuf * > ro->ro_rt = rtalloc_mpath(&ro->ro_dst, > NULL, ro->ro_tableid); > > - if (ro->ro_rt == NULL) { > + if (!rtisvalid(ro->ro_rt)) { > + rtfree(ro->ro_rt); > + ro->ro_rt = NULL; > ipstat.ips_noroute++; > error = EHOSTUNREACH; > goto bad; > @@ -296,12 +299,13 @@ reroute: > dst = satosin(&ro->ro_dst); > > /* > - * If there is a cached route, check that it is to the same > - * destination and is still up. If not, free it and try again. > + * If there is a cached route, check that it is to the > + * same destination and is still valid. If not, free > + * it and try again. > */ > - if (ro->ro_rt && ((ro->ro_rt->rt_flags & RTF_UP) == 0 || > + if (!rtisvalid(ro->ro_rt) || > dst->sin_addr.s_addr != ip->ip_dst.s_addr || > - ro->ro_tableid != m->m_pkthdr.ph_rtableid)) { > + ro->ro_tableid != m->m_pkthdr.ph_rtableid) { > rtfree(ro->ro_rt); > ro->ro_rt = NULL; > } > @@ -323,7 +327,9 @@ reroute: > ro->ro_rt = rtalloc_mpath(&ro->ro_dst, > &ip->ip_src.s_addr, ro->ro_tableid); > > - if (ro->ro_rt == NULL) { > + if (!rtisvalid(ro->ro_rt)) { > + rtfree(ro->ro_rt); > + ro->ro_rt = NULL; > ipstat.ips_noroute++; > error = EHOSTUNREACH; > goto bad; > Index: netinet6/in6_src.c > =================================================================== > RCS file: /cvs/src/sys/netinet6/in6_src.c,v > retrieving revision 1.51 > diff -u -p -r1.51 in6_src.c > --- netinet6/in6_src.c 8 Jun 2015 22:19:28 -0000 1.51 > +++ netinet6/in6_src.c 1 Sep 2015 12:55:26 -0000 > @@ -247,13 +247,12 @@ in6_selectsrc(struct in6_addr **in6src, > * our src addr is taken from the i/f, else punt. > */ > if (ro) { > - if (ro->ro_rt && ((ro->ro_rt->rt_flags & RTF_UP) == 0 || > - !IN6_ARE_ADDR_EQUAL(&ro->ro_dst.sin6_addr, dst))) { > + if (!rtisvalid(ro->ro_rt) || > + !IN6_ARE_ADDR_EQUAL(&ro->ro_dst.sin6_addr, dst)) { > rtfree(ro->ro_rt); > ro->ro_rt = NULL; > } > - if (ro->ro_rt == (struct rtentry *)0 || > - ro->ro_rt->rt_ifp == (struct ifnet *)0) { > + if (ro->ro_rt == NULL) { > struct sockaddr_in6 *sa6; > > /* No route yet, so try to acquire one */ > @@ -419,10 +418,9 @@ selectroute(struct sockaddr_in6 *dstsock > * cached destination, in case of sharing the cache with IPv4. > */ > if (ro) { > - if (ro->ro_rt && > - (!(ro->ro_rt->rt_flags & RTF_UP) || > + if (!rtisvalid(ro->ro_rt) || > sin6tosa(&ro->ro_dst)->sa_family != AF_INET6 || > - !IN6_ARE_ADDR_EQUAL(&ro->ro_dst.sin6_addr, dst))) { > + !IN6_ARE_ADDR_EQUAL(&ro->ro_dst.sin6_addr, dst)) { > rtfree(ro->ro_rt); > ro->ro_rt = NULL; > }