aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog1
-rw-r--r--route.c3
-rw-r--r--route.h2
-rw-r--r--tun.c40
4 files changed, 36 insertions, 10 deletions
diff --git a/ChangeLog b/ChangeLog
index f12b945..1fe18e7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -16,6 +16,7 @@ $Id$
(David Stipp).
* Fixed typo in manage.c where inline function declaration
was declared without the "static" keyword (David Stipp).
+* Patch to support --topology subnet on Mac OS X (Mathias Sundman).
2005.11.12 -- Version 2.1-beta7
diff --git a/route.c b/route.c
index 1db0b36..06e1fac 100644
--- a/route.c
+++ b/route.c
@@ -45,7 +45,6 @@
#include "memdbg.h"
-static void add_route (struct route *r, const struct tuntap *tt, unsigned int flags, const struct env_set *es);
static void delete_route (const struct route *r, const struct tuntap *tt, unsigned int flags, const struct env_set *es);
static bool get_default_gateway (in_addr_t *ret);
static void get_bypass_addresses (struct route_bypass *rb, const unsigned int flags);
@@ -741,7 +740,7 @@ setenv_routes (struct env_set *es, const struct route_list *rl)
setenv_route (es, &rl->routes[i], i + 1);
}
-static void
+void
add_route (struct route *r, const struct tuntap *tt, unsigned int flags, const struct env_set *es)
{
struct gc_arena gc;
diff --git a/route.h b/route.h
index 21f5465..c2da533 100644
--- a/route.h
+++ b/route.h
@@ -118,6 +118,8 @@ struct route_option_list *new_route_option_list (struct gc_arena *a);
struct route_list *new_route_list (struct gc_arena *a);
+void add_route (struct route *r, const struct tuntap *tt, unsigned int flags, const struct env_set *es);
+
void add_route_to_option_list (struct route_option_list *l,
const char *network,
const char *netmask,
diff --git a/tun.c b/tun.c
index 0420817..eafa8d6 100644
--- a/tun.c
+++ b/tun.c
@@ -44,6 +44,7 @@
#include "misc.h"
#include "socket.h"
#include "manage.h"
+#include "route.h"
#include "memdbg.h"
@@ -746,18 +747,41 @@ do_ifconfig (struct tuntap *tt,
tun_mtu
);
else
- openvpn_snprintf (command_line, sizeof (command_line),
- IFCONFIG_PATH " %s %s netmask %s mtu %d up",
- actual,
- ifconfig_local,
- ifconfig_remote_netmask,
- tun_mtu
- );
-
+ {
+ if (tt->topology == TOP_SUBNET)
+ openvpn_snprintf (command_line, sizeof (command_line),
+ IFCONFIG_PATH " %s %s %s netmask %s mtu %d up",
+ actual,
+ ifconfig_local,
+ ifconfig_local,
+ ifconfig_remote_netmask,
+ tun_mtu
+ );
+ else
+ openvpn_snprintf (command_line, sizeof (command_line),
+ IFCONFIG_PATH " %s %s netmask %s mtu %d up",
+ actual,
+ ifconfig_local,
+ ifconfig_remote_netmask,
+ tun_mtu
+ );
+ }
msg (M_INFO, "%s", command_line);
system_check (command_line, es, S_FATAL, "Mac OS X ifconfig failed");
tt->did_ifconfig = true;
+ /* Add a network route for the local tun interface */
+ if (!tun && tt->topology == TOP_SUBNET)
+ {
+ struct route r;
+ CLEAR (r);
+ r.defined = true;
+ r.network = tt->local & tt->remote_netmask;
+ r.netmask = tt->remote_netmask;
+ r.gateway = tt->local;
+ add_route (&r, tt, 0, es);
+ }
+
#elif defined(TARGET_FREEBSD)
/* example: ifconfig tun2 10.2.0.2 10.2.0.1 mtu 1450 netmask 255.255.255.255 up */