summaryrefslogtreecommitdiff
path: root/src/de/blinkt/openvpn/OpenVPN.java
diff options
context:
space:
mode:
authorArne Schwabe <arne@rfc2549.org>2012-04-16 19:21:14 +0200
committerArne Schwabe <arne@rfc2549.org>2012-04-16 19:21:14 +0200
commit3e4d8f433239c40311037616b1b8833a06651ae0 (patch)
tree98ab7fce0d011d34677b0beb762d389cb5c39199 /src/de/blinkt/openvpn/OpenVPN.java
Initial import
Diffstat (limited to 'src/de/blinkt/openvpn/OpenVPN.java')
-rw-r--r--src/de/blinkt/openvpn/OpenVPN.java78
1 files changed, 78 insertions, 0 deletions
diff --git a/src/de/blinkt/openvpn/OpenVPN.java b/src/de/blinkt/openvpn/OpenVPN.java
new file mode 100644
index 00000000..7385726b
--- /dev/null
+++ b/src/de/blinkt/openvpn/OpenVPN.java
@@ -0,0 +1,78 @@
+package de.blinkt.openvpn;
+
+import java.util.LinkedList;
+
+import android.os.ParcelFileDescriptor;
+import android.util.Log;
+
+public class OpenVPN {
+ private static OpenVpnService mOpenVpnService;
+ private static String localip;
+ private static final int MAXLOGENTRIES = 500;
+ public static native int startOpenVPNThread();
+ public static native int startOpenVPNThreadArgs(String argv[]);
+ private static final String TAG = "OpenVpn";
+
+
+ public static LinkedList<String> logbuffer = new LinkedList<String>();
+ private static int counter=0;
+
+
+ static {
+ System.loadLibrary("crypto");
+ System.loadLibrary("ssl");
+ System.loadLibrary("lzo");
+ System.loadLibrary("openvpn");
+ }
+
+ static void addRoute(String dest,String mask, String gw) {
+ Log.i("openvpn" ,"Got Routing information " + dest + " " + mask + " " + gw );
+ }
+
+ synchronized static void logMessage(int level,String prefix, String message)
+ {
+ logbuffer.addFirst(prefix + " " + message);
+ if(logbuffer.size()>MAXLOGENTRIES)
+ logbuffer.removeLast();
+
+ // The garbage collector does not collect the String from native
+ // but kills me for logging 100 messages with too many references :(
+ // Force GC how and then to kill loose ends
+ if(counter++ % 50==0)
+ System.gc();
+ }
+
+
+ static void addInterfaceInfo(int mtu, String local, String remote)
+ {
+ Log.i("openvpn","Got interface info M" + mtu + " L: " + local + "R: " + remote);
+ localip=local;
+ }
+
+ public static void setCallback(OpenVpnService openVpnService) {
+ mOpenVpnService = openVpnService;
+ }
+
+ public static boolean protectSocket (int sockfd)
+ {
+ boolean p = mOpenVpnService.protect(sockfd);
+ if(p)
+ Log.d("openvpn","Protected socket "+ sockfd);
+ else
+ Log.e("openvpn","Error protecting socket "+ sockfd);
+ return p;
+ }
+
+ public static int openTunDevice() {
+ Log.d(TAG,"Opening tun device");
+ ParcelFileDescriptor pfd = mOpenVpnService.openTun(localip);
+ return pfd.detachFd();
+ }
+ //! Dummy method being called to force loading of JNI Libraries
+ public static void foo() { }
+
+ synchronized public static String[] getlogbuffer() {
+ return (String[]) logbuffer.toArray(new String[logbuffer.size()]);
+
+ }
+}