Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 11 Mar 2005 15:07:21 -0800
From:      Nick Sayer <nsayer@kfu.com>
To:        freebsd-hackers@freebsd.org
Subject:   Re: 6to4, stf and shoebox NAT routers
Message-ID:  <423224A9.9010109@kfu.com>
In-Reply-To: <4232198F.5030705@kfu.com>
References:  <4232198F.5030705@kfu.com>

next in thread | previous in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format.
--------------030102080108030906020300
Content-Type: text/plain; charset=us-ascii; format=flowed
Content-Transfer-Encoding: 7bit

Turns out there is also a check in stf_output that I need to neuter for 
this configuration. Attached is a revised patch.


--------------030102080108030906020300
Content-Type: text/plain;
 name="stf_rfc1918_patch.txt"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="stf_rfc1918_patch.txt"

--- net/if_stf.c.orig	Thu Jul 15 01:26:06 2004
+++ net/if_stf.c	Fri Mar 11 15:05:52 2005
@@ -89,6 +89,7 @@
 #include <sys/module.h>
 #include <sys/protosw.h>
 #include <sys/queue.h>
+#include <sys/sysctl.h>
 #include <machine/cpu.h>
 
 #include <sys/malloc.h>
@@ -183,6 +184,13 @@
 struct if_clone stf_cloner = IFC_CLONE_INITIALIZER(STFNAME, NULL, 0,
     NULL, stf_clone_match, stf_clone_create, stf_clone_destroy);
 
+SYSCTL_DECL(_net_link);
+SYSCTL_NODE(_net_link, IFT_STF, stf, CTLFLAG_RW, 0, "6to4 Interface");
+
+static int no_rfc1918check = 0;
+SYSCTL_INT(_net_link_stf, OID_AUTO, permit_rfc1918, CTLFLAG_RW,
+    &no_rfc1918check, 0, "permit RFC-1918 addresses");
+
 static int
 stf_clone_match(struct if_clone *ifc, const char *name)
 {
@@ -455,11 +463,13 @@
 	 * we shouldn't generate output.  Without this check, we'll end up
 	 * using wrong IPv4 source.
 	 */
-	ia6 = stf_getsrcifa6(ifp);
-	if (ia6 == NULL) {
-		m_freem(m);
-		ifp->if_oerrors++;
-		return ENETDOWN;
+        if (!no_rfc1918check) {
+		ia6 = stf_getsrcifa6(ifp);
+		if (ia6 == NULL) {
+			m_freem(m);
+			ifp->if_oerrors++;
+			return ENETDOWN;
+		}
 	}
 
 	if (m->m_len < sizeof(*ip6)) {
@@ -567,6 +577,9 @@
 isrfc1918addr(in)
 	struct in_addr *in;
 {
+	if (no_rfc1918check)
+		return 0;
+
 	/*
 	 * returns 1 if private address range:
 	 * 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16

--------------030102080108030906020300--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?423224A9.9010109>