diff --git a/sys/net/route.h b/sys/net/route.h index 48fbe4261390..bcf2b6922bb4 100644 --- a/sys/net/route.h +++ b/sys/net/route.h @@ -1,4 +1,4 @@ -/* $NetBSD: route.h,v 1.62 2008/01/11 01:38:45 dyoung Exp $ */ +/* $NetBSD: route.h,v 1.63 2008/01/12 02:58:58 dyoung Exp $ */ /* * Copyright (c) 1980, 1986, 1993 @@ -423,21 +423,6 @@ rtcache_validate(const struct route *ro) } -static inline void -rtcache_check1(struct route *ro, int clone) -{ - /* XXX The rt_ifp check should be asserted. */ - if (rtcache_validate(ro) == NULL) - rtcache_update(ro, clone); - KASSERT(ro->_ro_rt == NULL || ro->_ro_rt->rt_ifp != NULL); -} - -static inline void -rtcache_check(struct route *ro) -{ - return rtcache_check1(ro, 1); -} - static inline void RTFREE(struct rtentry *rt) { diff --git a/sys/netatalk/ddp_usrreq.c b/sys/netatalk/ddp_usrreq.c index d0f3e0740017..d9e1e13d2b69 100644 --- a/sys/netatalk/ddp_usrreq.c +++ b/sys/netatalk/ddp_usrreq.c @@ -1,4 +1,4 @@ -/* $NetBSD: ddp_usrreq.c,v 1.27 2008/01/10 08:04:18 dyoung Exp $ */ +/* $NetBSD: ddp_usrreq.c,v 1.28 2008/01/12 02:58:58 dyoung Exp $ */ /* * Copyright (c) 1990,1991 Regents of The University of Michigan. @@ -27,7 +27,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: ddp_usrreq.c,v 1.27 2008/01/10 08:04:18 dyoung Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ddp_usrreq.c,v 1.28 2008/01/12 02:58:58 dyoung Exp $"); #include "opt_mbuftrace.h" @@ -366,8 +366,8 @@ at_pcbconnect(ddp, addr, l) * If we've changed our address, we may have an old "good looking" * route here. Attempt to detect it. */ - rtcache_check(ro); - if ((rt = rtcache_getrt(ro)) != NULL) { + if ((rt = rtcache_validate(ro)) != NULL || + (rt = rtcache_update(ro, 1)) != NULL) { if (hintnet) { net = hintnet; } else { diff --git a/sys/netinet/ip_output.c b/sys/netinet/ip_output.c index 5110877974fe..30c510ba462c 100644 --- a/sys/netinet/ip_output.c +++ b/sys/netinet/ip_output.c @@ -1,4 +1,4 @@ -/* $NetBSD: ip_output.c,v 1.189 2007/12/29 15:13:55 degroote Exp $ */ +/* $NetBSD: ip_output.c,v 1.190 2008/01/12 02:58:58 dyoung Exp $ */ /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. @@ -98,7 +98,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: ip_output.c,v 1.189 2007/12/29 15:13:55 degroote Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ip_output.c,v 1.190 2008/01/12 02:58:58 dyoung Exp $"); #include "opt_pfil_hooks.h" #include "opt_inet.h" @@ -307,9 +307,9 @@ ip_output(struct mbuf *m0, ...) else if (dst->sin_family != AF_INET || !in_hosteq(dst->sin_addr, ip->ip_dst)) rtcache_free(ro); - else - rtcache_check(ro); - if ((rt = rtcache_getrt(ro)) == NULL) { + + if ((rt = rtcache_validate(ro)) == NULL && + (rt = rtcache_update(ro, 1)) == NULL) { dst = &u.dst4; rtcache_setdst(ro, &u.dst); } @@ -334,8 +334,8 @@ ip_output(struct mbuf *m0, ...) IFP_TO_IA(ifp, ia); } else { if (rt == NULL) - rtcache_init(ro); - if ((rt = rtcache_getrt(ro)) == NULL) { + rt = rtcache_init(ro); + if (rt == NULL) { ipstat.ips_noroute++; error = EHOSTUNREACH; goto bad; @@ -1723,8 +1723,7 @@ ip_setmoptions(int optname, struct ip_moptions **imop, struct mbuf *m) sockaddr_in_init(&u.dst4, &mreq->imr_multiaddr, 0); rtcache_setdst(&ro, &u.dst); - rtcache_init(&ro); - ifp = (rt = rtcache_getrt(&ro)) != NULL ? rt->rt_ifp + ifp = (rt = rtcache_init(&ro)) != NULL ? rt->rt_ifp : NULL; rtcache_free(&ro); } else { diff --git a/sys/netinet6/in6_pcb.c b/sys/netinet6/in6_pcb.c index 50d9270ab753..afd0a99c297b 100644 --- a/sys/netinet6/in6_pcb.c +++ b/sys/netinet6/in6_pcb.c @@ -1,4 +1,4 @@ -/* $NetBSD: in6_pcb.c,v 1.92 2008/01/10 08:06:11 dyoung Exp $ */ +/* $NetBSD: in6_pcb.c,v 1.93 2008/01/12 02:58:58 dyoung Exp $ */ /* $KAME: in6_pcb.c,v 1.84 2001/02/08 18:02:08 itojun Exp $ */ /* @@ -62,7 +62,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: in6_pcb.c,v 1.92 2008/01/10 08:06:11 dyoung Exp $"); +__KERNEL_RCSID(0, "$NetBSD: in6_pcb.c,v 1.93 2008/01/12 02:58:58 dyoung Exp $"); #include "opt_inet.h" #include "opt_ipsec.h" @@ -928,18 +928,15 @@ in6_pcbrtentry(struct in6pcb *in6p) KASSERT(IN6_IS_ADDR_V4MAPPED(&in6p->in6p_faddr)); if (cdst.sa4->sin_addr.s_addr != in6p->in6p_faddr.s6_addr32[3]) rtcache_free(ro); - else - rtcache_check(ro); } #endif else { if (!IN6_ARE_ADDR_EQUAL(&cdst.sa6->sin6_addr, &in6p->in6p_faddr)) rtcache_free(ro); - else - rtcache_check(ro); } - rt = rtcache_getrt(ro); + if ((rt = rtcache_validate(ro)) == NULL) + rt = rtcache_update(ro, 1); #ifdef INET if (rt == NULL && IN6_IS_ADDR_V4MAPPED(&in6p->in6p_faddr)) { union { diff --git a/sys/netinet6/ip6_forward.c b/sys/netinet6/ip6_forward.c index 0f7dc10c2c51..54ed3f7732ef 100644 --- a/sys/netinet6/ip6_forward.c +++ b/sys/netinet6/ip6_forward.c @@ -1,4 +1,4 @@ -/* $NetBSD: ip6_forward.c,v 1.60 2008/01/10 08:06:12 dyoung Exp $ */ +/* $NetBSD: ip6_forward.c,v 1.61 2008/01/12 02:58:58 dyoung Exp $ */ /* $KAME: ip6_forward.c,v 1.109 2002/09/11 08:10:17 sakane Exp $ */ /* @@ -31,7 +31,7 @@ */ #include -__KERNEL_RCSID(0, "$NetBSD: ip6_forward.c,v 1.60 2008/01/10 08:06:12 dyoung Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ip6_forward.c,v 1.61 2008/01/12 02:58:58 dyoung Exp $"); #include "opt_ipsec.h" #include "opt_pfil_hooks.h" @@ -360,25 +360,7 @@ ip6_forward(struct mbuf *m, int srcrt) } #endif /* FAST_IPSEC */ - if (!srcrt) { - /* - * rtcache_getdst(ip6_forward_rt)->sin6_addr is equal to - * ip6->ip6_dst - */ - rtcache_check(&ip6_forward_rt); - if (rtcache_getrt(&ip6_forward_rt) == NULL) { - if (rtcache_init(&ip6_forward_rt) == NULL) { - ip6stat.ip6s_noroute++; - /* XXX in6_ifstat_inc(rt->rt_ifp, ifs6_in_noroute) */ - if (mcopy) { - icmp6_error(mcopy, ICMP6_DST_UNREACH, - ICMP6_DST_UNREACH_NOROUTE, 0); - } - m_freem(m); - return; - } - } - } else { + if (srcrt) { union { struct sockaddr dst; struct sockaddr_in6 dst6; @@ -395,6 +377,20 @@ ip6_forward(struct mbuf *m, int srcrt) m_freem(m); return; } + } else if (rtcache_validate(&ip6_forward_rt) == NULL && + rtcache_update(&ip6_forward_rt, 1) == NULL) { + /* + * rtcache_getdst(ip6_forward_rt)->sin6_addr was equal to + * ip6->ip6_dst + */ + ip6stat.ip6s_noroute++; + /* XXX in6_ifstat_inc(rt->rt_ifp, ifs6_in_noroute) */ + if (mcopy) { + icmp6_error(mcopy, ICMP6_DST_UNREACH, + ICMP6_DST_UNREACH_NOROUTE, 0); + } + m_freem(m); + return; } dst = satocsin6(rtcache_getdst(&ip6_forward_rt)); rt = rtcache_getrt(&ip6_forward_rt);