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
> > > [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?
>
> 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;
}