/*
- * Copyright (C) 2012-2013 Tobias Brunner
+ * Copyright (C) 2012-2014 Tobias Brunner
* Copyright (C) 2012 Giuliano Grassi
* Copyright (C) 2012 Ralf Sager
* Hochschule fuer Technik Rapperswil
return FALSE;
}
-METHOD(vpnservice_builder_t, establish, int,
- private_vpnservice_builder_t *this)
+/**
+ * Establish or reestablish the TUN device
+ */
+static int establish_internal(private_vpnservice_builder_t *this, char *method)
{
JNIEnv *env;
jmethodID method_id;
DBG2(DBG_LIB, "builder: building TUN device");
method_id = (*env)->GetMethodID(env, android_charonvpnservice_builder_class,
- "establish", "()I");
+ method, "()I");
if (!method_id)
{
goto failed;
return -1;
}
+METHOD(vpnservice_builder_t, establish, int,
+ private_vpnservice_builder_t *this)
+{
+ return establish_internal(this, "establish");
+}
+
+METHOD(vpnservice_builder_t, establish_no_dns, int,
+ private_vpnservice_builder_t *this)
+{
+ return establish_internal(this, "establishNoDns");
+}
+
METHOD(vpnservice_builder_t, destroy, void,
private_vpnservice_builder_t *this)
{
.add_dns = _add_dns,
.set_mtu = _set_mtu,
.establish = _establish,
+ .establish_no_dns = _establish_no_dns,
.destroy = _destroy,
},
);
import java.security.cert.CertificateEncodingException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
+import java.util.List;
import org.strongswan.android.data.VpnProfile;
import org.strongswan.android.data.VpnProfileDataSource;
{
private final String mName;
private VpnService.Builder mBuilder;
+ private BuilderCache mCache;
+ private BuilderCache mEstablishedCache;
public BuilderAdapter(String name)
{
mName = name;
mBuilder = createBuilder(name);
+ mCache = new BuilderCache();
}
private VpnService.Builder createBuilder(String name)
try
{
mBuilder.addAddress(address, prefixLength);
+ mCache.addAddress(address, prefixLength);
}
catch (IllegalArgumentException ex)
{
try
{
mBuilder.addRoute(address, prefixLength);
+ mCache.addRoute(address, prefixLength);
}
catch (IllegalArgumentException ex)
{
try
{
mBuilder.setMtu(mtu);
+ mCache.setMtu(mtu);
}
catch (IllegalArgumentException ex)
{
/* now that the TUN device is created we don't need the current
* builder anymore, but we might need another when reestablishing */
mBuilder = createBuilder(mName);
+ mEstablishedCache = mCache;
+ mCache = new BuilderCache();
return fd.detachFd();
}
+
+ public synchronized int establishNoDns()
+ {
+ ParcelFileDescriptor fd;
+
+ if (mEstablishedCache == null)
+ {
+ return -1;
+ }
+ try
+ {
+ Builder builder = createBuilder(mName);
+ mEstablishedCache.applyData(builder);
+ fd = builder.establish();
+ }
+ catch (Exception ex)
+ {
+ ex.printStackTrace();
+ return -1;
+ }
+ if (fd == null)
+ {
+ return -1;
+ }
+ return fd.detachFd();
+ }
+ }
+
+ /**
+ * Cache non DNS related information so we can recreate the builder without
+ * that information when reestablishing IKE_SAs
+ */
+ public class BuilderCache
+ {
+ private final List<PrefixedAddress> mAddresses = new ArrayList<PrefixedAddress>();
+ private final List<PrefixedAddress> mRoutes = new ArrayList<PrefixedAddress>();
+ private int mMtu;
+
+ public void addAddress(String address, int prefixLength)
+ {
+ mAddresses.add(new PrefixedAddress(address, prefixLength));
+ }
+
+ public void addRoute(String address, int prefixLength)
+ {
+ mRoutes.add(new PrefixedAddress(address, prefixLength));
+ }
+
+ public void setMtu(int mtu)
+ {
+ mMtu = mtu;
+ }
+
+ public void applyData(VpnService.Builder builder)
+ {
+ for (PrefixedAddress address : mAddresses)
+ {
+ builder.addAddress(address.mAddress, address.mPrefix);
+ }
+ for (PrefixedAddress route : mRoutes)
+ {
+ builder.addRoute(route.mAddress, route.mPrefix);
+ }
+ builder.setMtu(mMtu);
+ }
+
+ private class PrefixedAddress
+ {
+ public String mAddress;
+ public int mPrefix;
+
+ public PrefixedAddress(String address, int prefix)
+ {
+ this.mAddress = address;
+ this.mPrefix = prefix;
+ }
+ }
}
/*