I guess you refer to (2), right?
I don't think the spirit of the management interface was to pass
fds... as it was written in tcp.
A plugin does not mean that you need to write JNI, as it can
communicate using a different unix domain socket to upstream anyway...

Something like:

open fd=45 for management
open fd=77 for plugin communication
fork openvpn
openvpn calls plugin to setup custom socket
plugin uses fd=77 to communicate with UI and returns a socket

==> minimal changes to openvpn to a custom solution that most probably
has no reuse.

On Thu, May 10, 2012 at 10:28 AM, Adriaan de Jong <dej...@fox-it.com> wrote:
> I still prefer using the management interface. It keeps the interface to the 
> Java stuff very clean (socket-based). Further you potentially allow other 
> systems, such as Apple or Windows Phone to do the same. It avoids messy JNI 
> stuff, and fits into the spirit of the management interface. It's the 
> simplest solution.
>
>> -----Original Message-----
>> From: Alon Bar-Lev [mailto:alon.bar...@gmail.com]
>> Sent: donderdag 10 mei 2012 9:17
>> To: Adriaan de Jong
>> Cc: Arne Schwabe; openvpn-devel@lists.sourceforge.net
>> Subject: Re: [Openvpn-devel] [PATCH] Openvpn for Android 4.0 Changeset
>>
>> Thank you,
>>
>> Yes, I understand.
>>
>> If I narrow this to "feature requests", basically we say that:
>> 1. we want direct tun management to the management interface.
>> 2. we want to have some logic when openvpn socket is opened.
>> 3. Pass pre opened tun.
>>
>> (1)  - direct tun management to the management interface
>>
>> Until now I thought it should go to the plugin interface as in any
>> privilege separation model, the user will not be able to do any change
>> in networking.
>>
>> But... I think it will be fairly simple to do so, with the new tun
>> interface[1] I am working of.
>>
>> It introduces a tun engine, with a standard interface, it will be easy
>> to support several tun engines at same time selecting one by
>> configuration.
>>
>> So we can have tun-engine-management.c to delegate all to the
>> management interface. It can be used if management interface is tcp as
>> well...
>>
>> For example the linux tune engine[2] is very simple.
>>
>> A management engine can be stacked overriding the tun_ifconfig,
>> tun_init*.
>>
>> BUT: I still think that currently it will be much simpler to do this
>> using iproute2 wrapper that uses the android API.
>>
>> For (2) - custom socket creation
>>
>> I still think that the plugin API is the right approach, you simply
>> implement openvpn-plugin-android, that opens the socket for the openvpn
>> process. It is not more complex than passing this via the management
>> interface, and can be used if management interface is not unix domain
>> socket...
>>
>> (3) pre opened tun
>>
>> This should be simple, as fd can be created and inherited by the
>> openvpn process.
>>
>> What do you think?
>>
>> Alon
>>
>>
>> [1] https://github.com/alonbl/openvpn/tree/tun
>> [2]
>> https://github.com/alonbl/openvpn/blob/0205f085e8b77c6a6d49c38f20f9e49f
>> 41154f61/src/openvpn/tun-engine-linux.c
>>
>> On Thu, May 10, 2012 at 10:00 AM, Adriaan de Jong <dej...@fox-it.com>
>> wrote:
>> > That would be another option. In the model we were using (which might
>> be different), the order is as follows:
>> >
>> > 1. openvpn is started
>> > 2. openvpn opens a socket to the remote host 2. openvpn establishes
>> > the control channel across this socket 3. openvpn passes socket and
>> > control channel data (IP, routing, DNS, etc) through the management
>> > interface to the android app 4. android app passes these to the
>> > VPNService and receives an opened tun 5. android app passes the tun
>> to
>> > openvpn 6. openvpn proceeds as usual
>> >
>> > To answer your follow up:
>> > There's no need for the extra complexity of a plugin here. The
>> management interface is a great tool, completely separating OpenVPN
>> from its management interface.
>> >
>> > Adriaan
>> >
>> >> -----Original Message-----
>> >> From: Alon Bar-Lev [mailto:alon.bar...@gmail.com]
>> >> Sent: donderdag 10 mei 2012 8:49
>> >> To: Adriaan de Jong
>> >> Cc: Arne Schwabe; openvpn-devel@lists.sourceforge.net
>> >> Subject: Re: [Openvpn-devel] [PATCH] Openvpn for Android 4.0
>> >> Changeset
>> >>
>> >> On Thu, May 10, 2012 at 9:35 AM, Adriaan de Jong <dej...@fox-it.com>
>> >> wrote:
>> >> >> -----Original Message-----
>> >> >> From: Alon Bar-Lev [mailto:alon.bar...@gmail.com]
>> >> >> Sent: donderdag 10 mei 2012 2:10
>> >> >> To: Arne Schwabe
>> >> >> Cc: openvpn-devel@lists.sourceforge.net
>> >> >> Subject: Re: [Openvpn-devel] [PATCH] Openvpn for Android 4.0
>> >> >> Changeset
>> >> >>
>> >> >> On Thu, May 10, 2012 at 3:01 AM, Arne Schwabe <a...@rfc2549.org>
>> >> wrote:
>> >> >> > Am 10.05.12 01:39, schrieb Alon Bar-Lev:
>> >> >> >> On Thu, May 10, 2012 at 2:24 AM, Arne Schwabe
>> >> >> >> <a...@rfc2549.org>
>> >> >> wrote:
>> >> >> >>>> I need a better description of the tun process... so far I
>> >> >> >>>> did not understand why you cannot use standard approach of
>> >> >> >>>> creating persistent tun with non root access and then use
>> the
>> >> >> >>>> iproute2 wrapper with suid or sudo to setup its
>> configuration.
>> >> >> >>>>
>> >> >> >>>> Alon.
>> >> >> >>> I have no root access on the telephone. But Android 4.0
>> >> >> >>> provides an API for VPNs
>> >> >> >>>
>> >> >>
>> >>
>> (http://developer.android.com/reference/android/net/VpnService.html).
>> >> >> >>> Looking at my method at the method that opens the tun device
>> >> >> >>> to passed over managment socket might also give an idea how
>> it
>> >> >> >>> is done
>> >> >> in Android:
>> >> >> >>> http://code.google.com/p/ics-
>> >> >> openvpn/source/browse/src/de/blinkt/ope
>> >> >> >>> nvpn/OpenVpnService.java#220
>> >> >> >>>
>> >> >> >>> Arne
>> >> >> >> I understand.
>> >> >> >>
>> >> >> >> But... let's discuss another approach...
>> >> >> >>
>> >> >> >> Implement android-ip program that uses the Android API, and
>> put
>> >> >> >> "iproute2 android-ip" in configuration.
>> >> >> >>
>> >> >> >> Now, the interface of the program is similar to what iproute
>> is
>> >> >> >> receiving, but instead of netlink it does android API.
>> >> >> >>
>> >> >> >> So actually you can receive requests from openvpn via this
>> >> >> >> interface without modifying openvpn...
>> >> >> >>
>> >> >> >> Maybe I am missing something, please bear with me.
>> >> >> >>
>> >> >> > The android API in this case is Java.  There is no C API that
>> >> >> > can be used. Opening the tun device requires passing the fd of
>> >> >> > the tun
>> >> >> device
>> >> >> > to openvpn. Also the for sockets that should not be routed over
>> >> the
>> >> >> > tun device the Java API provides a protect(int fd) API. That
>> >> >> > means
>> >> >> the
>> >> >> > socket from openvpn needs to passed to the Java GUI to call the
>> >> >> > protect method.
>> >> >> >
>> >> >> > I see 2 way to accomplish this:
>> >> >> >
>> >> >> > - Using the the java native interface to directly call into
>> java
>> >> >> > from c and vice versa. This worked but since openvpn was not
>> >> really
>> >> >> > usable as a library I got other problem (the google code
>> >> repository
>> >> >> > has earlier version of the code which uses this.)
>> >> >> > - Keep openvpn as seperate process and pass the fd over a unix
>> >> >> socket.
>> >> >> > (One of the more obscure Unix apis)
>> >> >> >
>> >> >> > The requirement that all information as ip addresses, dns and
>> >> >> > routes must be available means that the persist-tun device
>> >> >> > cannot be used if I also want to be to use pull.
>> >> >> >
>> >> >> > Calling an external programs could eliminate the "ROUTE" ,
>> >> >> > "DNS", "DOMAIN" , "IFCONFIG" management commands I have
>> >> >> > introduced. But the patched implements also two fd passing
>> >> >> > managment commands
>> >> >> > "PROTECT-
>> >> >> FD"
>> >> >> > (passes fd from openvpn to GUI) and "OPENTUN" (passes fd from
>> >> >> > GUI to openvpn).
>> >> >> >
>> >> >> > Arne
>> >> >> >
>> >> >>
>> >> >> Great, so we can first shrink the patch!
>> >> >>
>> >> >> So two features you implied...
>> >> >>
>> >> >> 1. pass pre-opened tun device
>> >> >>
>> >> >> are you sure there are no alternatives to this? how does the java
>> >> api
>> >> >> receives the handle anyway?
>> >> >>
>> >> >
>> >> > I agree with Arne's approach of letting the tun driver be passed
>> >> through the management interface. This is the way things work in
>> >> Android VPNService land. I still need to go through the code though.
>> >> >
>> >> >> 2. the "protect" API.
>> >> >>
>> >> >> Can you please explain more about the functionality of the
>> "protect"
>> >> >> API? why is this actually required? maybe there are alternatives.
>> >> >>
>> >> >
>> >> > About the protect API: The VPNService API routes all traffic
>> >> > through
>> >> the VPN by default. The socket used by OpenVPN needs to be
>> "protected"
>> >> from this, using a special function call. Therefore, Android Java
>> >> needs this call.
>> >>
>> >> Thanks!
>> >>
>> >> So why can't we simply open the socket at the UI as well? similar to
>> >> the tun?
>> >>
>> >> Alon.

Reply via email to