summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArne Schwabe <arne@rfc2549.org>2014-03-31 10:43:58 +0200
committerArne Schwabe <arne@rfc2549.org>2014-03-31 10:43:58 +0200
commitdf5fc099afc83399094d8b25b4de2003a5c75a32 (patch)
tree288852f587720e85e2eb20b86e19c786a23d38a2
parent093096ec9070579963a93aae19f32cea7f6415a3 (diff)
Don't assume that a configured net30 topology means that the configured interface is a /30 topology (closes issue #241)
-rw-r--r--main/src/main/java/de/blinkt/openvpn/core/OpenVpnService.java52
1 files changed, 31 insertions, 21 deletions
diff --git a/main/src/main/java/de/blinkt/openvpn/core/OpenVpnService.java b/main/src/main/java/de/blinkt/openvpn/core/OpenVpnService.java
index ff6ccd15..b1f9dbd4 100644
--- a/main/src/main/java/de/blinkt/openvpn/core/OpenVpnService.java
+++ b/main/src/main/java/de/blinkt/openvpn/core/OpenVpnService.java
@@ -11,23 +11,17 @@ import android.content.IntentFilter;
import android.content.SharedPreferences;
import android.net.ConnectivityManager;
import android.net.VpnService;
-import android.os.*;
+import android.os.Binder;
+import android.os.Build;
import android.os.Handler.Callback;
+import android.os.IBinder;
+import android.os.Message;
+import android.os.ParcelFileDescriptor;
import android.preference.PreferenceManager;
import android.text.TextUtils;
-import de.blinkt.openvpn.BuildConfig;
-import de.blinkt.openvpn.activities.DisconnectVPN;
-import de.blinkt.openvpn.activities.LogWindow;
-import de.blinkt.openvpn.R;
-import de.blinkt.openvpn.VpnProfile;
-import de.blinkt.openvpn.core.VpnStatus.ByteCountListener;
-import de.blinkt.openvpn.core.VpnStatus.ConnectionStatus;
-import de.blinkt.openvpn.core.VpnStatus.StateListener;
-
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
-import java.net.Inet4Address;
import java.net.Inet6Address;
import java.net.InetAddress;
import java.net.UnknownHostException;
@@ -36,8 +30,19 @@ import java.util.HashMap;
import java.util.Locale;
import java.util.Vector;
-import static de.blinkt.openvpn.core.NetworkSpace.*;
-import static de.blinkt.openvpn.core.VpnStatus.ConnectionStatus.*;
+import de.blinkt.openvpn.BuildConfig;
+import de.blinkt.openvpn.R;
+import de.blinkt.openvpn.VpnProfile;
+import de.blinkt.openvpn.activities.DisconnectVPN;
+import de.blinkt.openvpn.activities.LogWindow;
+import de.blinkt.openvpn.core.VpnStatus.ByteCountListener;
+import de.blinkt.openvpn.core.VpnStatus.ConnectionStatus;
+import de.blinkt.openvpn.core.VpnStatus.StateListener;
+
+import static de.blinkt.openvpn.core.NetworkSpace.ipAddress;
+import static de.blinkt.openvpn.core.VpnStatus.ConnectionStatus.LEVEL_CONNECTED;
+import static de.blinkt.openvpn.core.VpnStatus.ConnectionStatus.LEVEL_CONNECTING_NO_SERVER_REPLY_YET;
+import static de.blinkt.openvpn.core.VpnStatus.ConnectionStatus.LEVEL_WAITING_FOR_USER_INPUT;
public class OpenVpnService extends VpnService implements StateListener, Callback, ByteCountListener {
public static final String START_SERVICE = "de.blinkt.openvpn.START_SERVICE";
@@ -321,6 +326,7 @@ public class OpenVpnService extends VpnService implements StateListener, Callbac
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
+ //ignore
}
@@ -329,6 +335,7 @@ public class OpenVpnService extends VpnService implements StateListener, Callbac
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
+ //ignore
}
}
// An old running VPN should now be exited
@@ -429,7 +436,7 @@ public class OpenVpnService extends VpnService implements StateListener, Callbac
if (mLocalIP != null)
cfg += mLocalIP.toString();
if (mLocalIPv6 != null)
- cfg += mLocalIPv6.toString();
+ cfg += mLocalIPv6;
cfg += "routes: " + TextUtils.join("|", mRoutes.getNetworks(true)) + TextUtils.join("|", mRoutesv6.getNetworks(true));
cfg += "excl. routes:" + TextUtils.join("|", mRoutes.getNetworks(false)) + TextUtils.join("|", mRoutesv6.getNetworks(false));
@@ -538,9 +545,8 @@ public class OpenVpnService extends VpnService implements StateListener, Callbac
builder.setConfigureIntent(getLogPendingIntent());
try {
- ParcelFileDescriptor tun = builder.establish();
//Debug.stopMethodTracing();
- return tun;
+ return builder.establish();
} catch (Exception e) {
VpnStatus.logError(R.string.tun_open_error);
VpnStatus.logError(getString(R.string.error) + e.getLocalizedMessage());
@@ -637,12 +643,16 @@ public class OpenVpnService extends VpnService implements StateListener, Callbac
// get the netmask as IP
long netMaskAsInt = CIDRIP.getInt(netmask);
+ int masklen;
+ if ("net30".equals(mode))
+ masklen = 30;
+ else
+ masklen = 31;
+
+ int mask = ~( 1 << (32 - (mLocalIP.len +1)));
// Netmask is Ip address +/-1, assume net30/p2p with small net
- if (Math.abs(netMaskAsInt - mLocalIP.getInt()) == 1) {
- if ("net30".equals(mode))
- mLocalIP.len = 30;
- else
- mLocalIP.len = 31;
+ if ((netMaskAsInt & mask) == (mLocalIP.getInt() & mask )) {
+ mLocalIP.len = masklen;
} else {
if (!"p2p".equals(mode))
VpnStatus.logWarning(R.string.ip_not_cidr, local, netmask, mode);