diff options
author | Gert Doering <gert@greenie.muc.de> | 2015-04-26 20:03:58 +0200 |
---|---|---|
committer | Gert Doering <gert@greenie.muc.de> | 2015-06-02 19:00:28 +0200 |
commit | 60fd44e501f2002459a49c6c9bc64370ea26ca87 (patch) | |
tree | c4b054b5db7b3647c10907063b7f444632acc57c | |
parent | 001384e2952b54089e889edbda3196283b21641d (diff) | |
download | openvpn-60fd44e501f2002459a49c6c9bc64370ea26ca87.tar.gz openvpn-60fd44e501f2002459a49c6c9bc64370ea26ca87.tar.xz openvpn-60fd44e501f2002459a49c6c9bc64370ea26ca87.zip |
Fix FreeBSD ifconfig for topology subnet tunnels.
For "topology subnet", we only pretend to have a subnet and keep
using the tun if in point-to-point mode - but for that to fully
work, the "remote" address needs to be different from the "local"
address. So just arbitrarily construct one from the on-link
subnet - base+1, if "that is not us", base+2, otherwise.
Fix trac #481
See also: https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=194745
Signed-off-by: Gert Doering <gert@greenie.muc.de>
Tested-By: Anton Sayetsky <vsasjason@gmail.com>
Lazy-ACK-by: Gert Doering <gert@greenie.muc.de>
Message-Id: <1430071438-31675-1-git-send-email-gert@greenie.muc.de>
URL: http://article.gmane.org/gmane.network.openvpn.devel/9606
-rw-r--r-- | src/openvpn/tun.c | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/src/openvpn/tun.c b/src/openvpn/tun.c index e479d4d..59e7436 100644 --- a/src/openvpn/tun.c +++ b/src/openvpn/tun.c @@ -631,6 +631,28 @@ void delete_route_connected_v6_net(struct tuntap * tt, } #endif +#if defined(TARGET_FREEBSD)||defined(TARGET_DRAGONFLY) +/* we can't use true subnet mode on tun on all platforms, as that + * conflicts with IPv6 (wants to use ND then, which we don't do), + * but the OSes want "a remote address that is different from ours" + * - so we construct one, normally the first in the subnet, but if + * this is the same as ours, use the second one. + * The actual address does not matter at all, as the tun interface + * is still point to point and no layer 2 resolution is done... + */ + +char * +create_arbitrary_remote( struct tuntap *tt, struct gc_arena * gc ) +{ + in_addr_t remote; + + remote = (tt->local & tt->remote_netmask) +1; + + if ( remote == tt->local ) remote ++; + + return print_in_addr_t (remote, 0, &gc); +} +#endif /* execute the ifconfig command through the shell */ void @@ -1155,7 +1177,7 @@ do_ifconfig (struct tuntap *tt, IFCONFIG_PATH, actual, ifconfig_local, - ifconfig_local, + create_arbitrary_remote( tt, &gc ), tun_mtu, ifconfig_remote_netmask ); |