From: Gert Doering Date: Sat, 30 Oct 2010 19:03:16 +0000 (+0200) Subject: Make "topology subnet" work on Solaris (ifconfig + route metric changes by Kazuyoshi... X-Git-Tag: v2.2-beta4~6^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f0eac1a59790;p=thirdparty%2Fopenvpn.git Make "topology subnet" work on Solaris (ifconfig + route metric changes by Kazuyoshi Aizawa, adding of local "connected subnet" route by me) Tested on OpenSolaris/i386, no impact for other TARGETs. Signed-off-by: Gert Doering Acked-by: Kazuyoshi Aizawa Signed-off-by: David Sommerseth --- diff --git a/route.c b/route.c index 24d4bd8f7..612bcbef3 100644 --- a/route.c +++ b/route.c @@ -923,16 +923,14 @@ add_route (struct route *r, const struct tuntap *tt, unsigned int flags, const s argv_printf (&argv, "%s add", ROUTE_PATH); -#if 0 - if (r->metric_defined) - argv_printf_cat (&argv, "-rtt %d", r->metric); -#endif - argv_printf_cat (&argv, "%s -netmask %s %s", network, netmask, gateway); + if (r->metric_defined) + argv_printf_cat (&argv, "%d", r->metric); + argv_msg (D_ROUTE, &argv); status = openvpn_execve_check (&argv, es, 0, "ERROR: Solaris route add command failed"); diff --git a/tun.c b/tun.c index facf97937..a984369fc 100644 --- a/tun.c +++ b/tun.c @@ -702,6 +702,19 @@ do_ifconfig (struct tuntap *tt, ); } else + if (tt->topology == TOP_SUBNET) + { + argv_printf (&argv, + "%s %s %s %s netmask %s mtu %d up", + IFCONFIG_PATH, + actual, + ifconfig_local, + ifconfig_local, + ifconfig_remote_netmask, + tun_mtu + ); + } + else argv_printf (&argv, " %s %s %s netmask %s broadcast + up", IFCONFIG_PATH, @@ -714,6 +727,20 @@ do_ifconfig (struct tuntap *tt, if (!openvpn_execve_check (&argv, es, 0, "Solaris ifconfig phase-2 failed")) solaris_error_close (tt, es, actual); + if (!tun && tt->topology == TOP_SUBNET) + { + /* Add a network route for the local tun interface */ + struct route r; + CLEAR (r); + r.defined = true; + r.network = tt->local & tt->remote_netmask; + r.netmask = tt->remote_netmask; + r.gateway = tt->local; + r.metric_defined = true; + r.metric = 0; + add_route (&r, tt, 0, es); + } + tt->did_ifconfig = true; #elif defined(TARGET_OPENBSD)