summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorru <ru@FreeBSD.org>2001-03-19 09:16:16 +0000
committerru <ru@FreeBSD.org>2001-03-19 09:16:16 +0000
commit38387221cd67a6d9b58b81feee97e876a9832d42 (patch)
tree96d2016274b574dd4e5a5aed21f96a33799eb0f9
parentdabce43c5b93b638113eb1b7059ca91b32eb3607 (diff)
downloadFreeBSD-src-38387221cd67a6d9b58b81feee97e876a9832d42.zip
FreeBSD-src-38387221cd67a6d9b58b81feee97e876a9832d42.tar.gz
Invalidate cached forwarding route (ipforward_rt) whenever a new route
is added to the routing table, otherwise we may end up using the wrong route when forwarding. PR: kern/10778 Reviewed by: silence on -net
-rw-r--r--sys/netinet/in_rmx.c12
-rw-r--r--sys/netinet/ip_input.c2
-rw-r--r--sys/netinet/ip_var.h1
3 files changed, 14 insertions, 1 deletions
diff --git a/sys/netinet/in_rmx.c b/sys/netinet/in_rmx.c
index 51a5846..16ea5be 100644
--- a/sys/netinet/in_rmx.c
+++ b/sys/netinet/in_rmx.c
@@ -54,6 +54,7 @@
#include <net/route.h>
#include <netinet/in.h>
#include <netinet/in_var.h>
+#include <netinet/ip_var.h>
extern int in_inithead __P((void **head, int off));
@@ -137,6 +138,17 @@ in_addroute(void *v_arg, void *n_arg, struct radix_node_head *head,
RTFREE(rt2);
}
}
+
+ /*
+ * If the new route created successfully, and we are forwarding,
+ * and there is a cached route, free it. Otherwise, we may end
+ * up using the wrong route.
+ */
+ if (ret != NULL && ipforwarding && ipforward_rt.ro_rt) {
+ RTFREE(ipforward_rt.ro_rt);
+ ipforward_rt.ro_rt = 0;
+ }
+
return ret;
}
diff --git a/sys/netinet/ip_input.c b/sys/netinet/ip_input.c
index 7ee78dd..0963a0a 100644
--- a/sys/netinet/ip_input.c
+++ b/sys/netinet/ip_input.c
@@ -257,7 +257,7 @@ ip_init()
}
static struct sockaddr_in ipaddr = { sizeof(ipaddr), AF_INET };
-static struct route ipforward_rt;
+struct route ipforward_rt;
/*
* Ip input routine. Checksum and byte swap header. If fragmented
diff --git a/sys/netinet/ip_var.h b/sys/netinet/ip_var.h
index e821f0a..bc8b797 100644
--- a/sys/netinet/ip_var.h
+++ b/sys/netinet/ip_var.h
@@ -141,6 +141,7 @@ extern struct ipstat ipstat;
extern u_short ip_id; /* ip packet ctr, for ids */
extern int ip_defttl; /* default IP ttl */
extern int ipforwarding; /* ip forwarding */
+extern struct route ipforward_rt; /* ip forwarding cached route */
extern u_char ip_protox[];
extern struct socket *ip_rsvpd; /* reservation protocol daemon */
extern struct socket *ip_mrouter; /* multicast routing daemon */
OpenPOWER on IntegriCloud