On Mon, Oct 12, 2015 at 01:49:54PM +0200, Martin Pieuchot wrote:
> Turns out that our stack does a very bad job at tracking which routes
> should be used or not based on the RTF_UP flag.  So I'm not going to
> change that.
> 
> Nonetheless I'd like to use rtisvalid(9) for the existing route validity
> checks.  This will allow me to move the guts of rt_checkgate() inside
> rtalloc(9).
> 
> If rtalloc(9) returns a !RTF_UP route, we'll still try to use it, like
> it is now.  This is good enough to le me make progress on unlocking the
> routing table.
> 
> Ok?

OK bluhm@

> 
> Index: netinet/ip_output.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet/ip_output.c,v
> retrieving revision 1.300
> diff -u -p -r1.300 ip_output.c
> --- netinet/ip_output.c       7 Oct 2015 14:52:45 -0000       1.300
> +++ netinet/ip_output.c       12 Oct 2015 11:42:52 -0000
> @@ -170,9 +170,9 @@ reroute:
>        * 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 (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;
>       }
> Index: netinet6/in6_src.c
> ===================================================================
> RCS file: /cvs/src/sys/netinet6/in6_src.c,v
> retrieving revision 1.62
> diff -u -p -r1.62 in6_src.c
> --- netinet6/in6_src.c        18 Sep 2015 14:26:22 -0000      1.62
> +++ netinet6/in6_src.c        12 Oct 2015 11:41:41 -0000
> @@ -252,13 +252,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 */
> @@ -368,10 +367,9 @@ in6_selectroute(struct sockaddr_in6 *dst
>        * 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;
>               }

Reply via email to