On 11/09/15(Fri) 18:56, Mark Patruck wrote:
> On Fri, Sep 11, 2015 at 06:27:36PM +0200, Martin Pieuchot wrote:
> > On 11/09/15(Fri) 18:07, Mark Patruck wrote:
> > > dmesg below is currently running, but it also didn't work with a 2 week
> > > old snapshot from the local mirror. (system was freshly installed)
> > > 
> > > Note: the machine hasn't been used over the last two months, so i've
> > > double checked battery, memory, psu.
> > > 
> > > OpenBSD 5.8-current (GENERIC.MP) #0: Mon Sep  7 15:54:34 CEST 2015
> > >     bu...@aquila.paccotec.de:/usr/src/sys/arch/amd64/compile/GENERIC.MP
> > 
> > Since you build your kernel yourself, I can't tell when you did your
> > checkout and I'll bet you hit the window when rtisvalid(9) was in.
> > 
> > Could you try a -current checkout with this diff an tell me if you can
> > reproduce the problem?
> 
>       Thanks Martin. I'll report back asap.

Tree is moving fast, here's an updated diff.

> > Could you also tell me what are your nfs mounts? 
> 
>       $ cat /etc/exports
>       /share/d0 -alldirs -mapall=umedia:media -ro mso
>       /share/d1 -alldirs -mapall=umedia:media -ro mso
> 
>       $ mount | grep NFS
>       /dev/sd1a on /share/d0 type ffs (NFS exported, local, nodev, noexec, 
> nosuid, softdep)
>       /dev/sd2a on /share/d1 type ffs (NFS exported, local, nodev, noexec, 
> nosuid, softdep)
> 

Interesting, the previous report I had with similar symptoms was about a
machine using nested NFS mounts from two different servers.

Please let me know what happen with the diff below,  thanks!

Index: netinet/ip_output.c
===================================================================
RCS file: /cvs/src/sys/netinet/ip_output.c,v
retrieving revision 1.293
diff -u -p -r1.293 ip_output.c
--- netinet/ip_output.c 11 Sep 2015 19:17:47 -0000      1.293
+++ netinet/ip_output.c 12 Sep 2015 07:57:24 -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;
        }
@@ -194,7 +194,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.61
diff -u -p -r1.61 in6_src.c
--- netinet6/in6_src.c  11 Sep 2015 20:16:03 -0000      1.61
+++ netinet6/in6_src.c  12 Sep 2015 08:00:29 -0000
@@ -251,13 +251,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 */
@@ -367,10 +366,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