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
>     [email protected]:/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?

Could you also tell me what are your nfs mounts? 

Index: netinet/ip_output.c
===================================================================
RCS file: /cvs/src/sys/netinet/ip_output.c,v
retrieving revision 1.291
diff -u -p -r1.291 ip_output.c
--- netinet/ip_output.c 3 Sep 2015 14:59:23 -0000       1.291
+++ netinet/ip_output.c 11 Sep 2015 16:25:11 -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;

Reply via email to