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;