]> git.ipfire.org Git - thirdparty/openvpn.git/commitdiff
Emulate persist-tun on Android
authorArne Schwabe <arne@rfc2549.org>
Fri, 26 Apr 2013 19:59:32 +0000 (21:59 +0200)
committerGert Doering <gert@greenie.muc.de>
Wed, 1 May 2013 10:27:54 +0000 (12:27 +0200)
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>
src/openvpn/init.c

index e7c16e0b2a3ba3562a591119ea33e1373e7953cb..98f548933958a223dc1de7ee537e5c9cfd1b2951 100644 (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;
 }