summaryrefslogtreecommitdiffstats
path: root/sys/netinet/ip_output.c
diff options
context:
space:
mode:
authormpi <mpi@openbsd.org>2015-09-02 08:28:06 +0000
committermpi <mpi@openbsd.org>2015-09-02 08:28:06 +0000
commit23ca4a216ce426d29fd2cc145b2d69db62541c34 (patch)
tree5841d5824049f0fb4d31262fe8f8cf4b7c714c7e /sys/netinet/ip_output.c
parentAdd missing copyright. (diff)
downloadwireguard-openbsd-23ca4a216ce426d29fd2cc145b2d69db62541c34.tar.xz
wireguard-openbsd-23ca4a216ce426d29fd2cc145b2d69db62541c34.zip
Revert the two uses of rtisvalid(9) for the moment, it breaks dhclient(8)
configured networks on RAMDISK kernels. The problem is that the default route installed by dhclient(8) does not have the RTF_UP flag in this environement and rtisvalid(9) doesn't allow you to use a RTF_DOWN route.
Diffstat (limited to 'sys/netinet/ip_output.c')
-rw-r--r--sys/netinet/ip_output.c28
1 files changed, 11 insertions, 17 deletions
diff --git a/sys/netinet/ip_output.c b/sys/netinet/ip_output.c
index 68615e46ec8..986933deca4 100644
--- a/sys/netinet/ip_output.c
+++ b/sys/netinet/ip_output.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ip_output.c,v 1.288 2015/09/01 14:33:15 mpi Exp $ */
+/* $OpenBSD: ip_output.c,v 1.289 2015/09/02 08:28:06 mpi Exp $ */
/* $NetBSD: ip_output.c,v 1.28 1996/02/13 23:43:07 christos Exp $ */
/*
@@ -168,13 +168,12 @@ ip_output(struct mbuf *m0, struct mbuf *opt, struct route *ro, int flags,
dst = satosin(&ro->ro_dst);
/*
- * 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 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 (!rtisvalid(ro->ro_rt) ||
+ if (ro->ro_rt && ((ro->ro_rt->rt_flags & RTF_UP) == 0 ||
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;
}
@@ -196,9 +195,7 @@ ip_output(struct mbuf *m0, struct mbuf *opt, struct route *ro, int flags,
ro->ro_rt = rtalloc_mpath(&ro->ro_dst,
NULL, ro->ro_tableid);
- if (!rtisvalid(ro->ro_rt)) {
- rtfree(ro->ro_rt);
- ro->ro_rt = NULL;
+ if (ro->ro_rt == NULL) {
ipstat.ips_noroute++;
error = EHOSTUNREACH;
goto bad;
@@ -299,13 +296,12 @@ reroute:
dst = satosin(&ro->ro_dst);
/*
- * 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 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 (!rtisvalid(ro->ro_rt) ||
+ if (ro->ro_rt && ((ro->ro_rt->rt_flags & RTF_UP) == 0 ||
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;
}
@@ -327,9 +323,7 @@ reroute:
ro->ro_rt = rtalloc_mpath(&ro->ro_dst,
&ip->ip_src.s_addr, ro->ro_tableid);
- if (!rtisvalid(ro->ro_rt)) {
- rtfree(ro->ro_rt);
- ro->ro_rt = NULL;
+ if (ro->ro_rt == NULL) {
ipstat.ips_noroute++;
error = EHOSTUNREACH;
goto bad;