Emulate persist-tun on Android

On Android changing the configuration of tun is not possible. So instead
of reconfiguring the tun device, open a new tun device and close the old
one if needed.

Acked-by: Gert Doering <gert@greenie.muc.de>
Message-Id: <1367006372-14815-1-git-send-email-arne@rfc2549.org>
URL: http://article.gmane.org/gmane.network.openvpn.devel/7558

Signed-off-by: Gert Doering <gert@greenie.muc.de>
This commit is contained in:
Arne Schwabe 2013-04-26 21:59:32 +02:00 committed by Gert Doering
parent a55b3cdb23
commit bd14d55d87

View file

@ -1402,8 +1402,19 @@ do_open_tun (struct context *c)
c->c2.ipv4_tun = (!c->options.tun_ipv6
&& is_dev_type (c->options.dev, c->options.dev_type, "tun"));
#ifndef TARGET_ANDROID
if (!c->c1.tuntap)
{
#endif
#ifdef TARGET_ANDROID
/* If we emulate persist-tun on android we still have to open a new tun and
then close the old */
int oldtunfd=-1;
if (c->c1.tuntap)
oldtunfd = c->c1.tuntap->fd;
#endif
/* initialize (but do not open) tun/tap object */
do_init_tun (c);
@ -1439,7 +1450,10 @@ do_open_tun (struct context *c)
/* open the tun device */
open_tun (c->options.dev, c->options.dev_type, c->options.dev_node,
c->c1.tuntap);
#ifdef TARGET_ANDROID
if (oldtunfd>=0)
close(oldtunfd);
#endif
/* set the hardware address */
if (c->options.lladdr)
set_lladdr(c->c1.tuntap->actual_name, c->options.lladdr, c->c2.es);
@ -1481,6 +1495,7 @@ do_open_tun (struct context *c)
ret = true;
static_context = c;
#ifndef TARGET_ANDROID
}
else
{
@ -1503,6 +1518,7 @@ do_open_tun (struct context *c)
"up",
c->c2.es);
}
#endif
gc_free (&gc);
return ret;
}