diff --git a/core/java/android/net/VpnService.java b/core/java/android/net/VpnService.java index 0967fa8bd2514..3fd415fc9f6a1 100644 --- a/core/java/android/net/VpnService.java +++ b/core/java/android/net/VpnService.java @@ -577,7 +577,7 @@ public class VpnService extends Service { * @return this {@link Builder} object to facilitate chaining method calls. */ public Builder setBlocking(boolean blocking) { - // TODO + mConfig.blocking = blocking; return this; } diff --git a/core/java/com/android/internal/net/VpnConfig.java b/core/java/com/android/internal/net/VpnConfig.java index 73d373891c70b..c552a41cd447a 100644 --- a/core/java/com/android/internal/net/VpnConfig.java +++ b/core/java/com/android/internal/net/VpnConfig.java @@ -73,6 +73,7 @@ public class VpnConfig implements Parcelable { public PendingIntent configureIntent; public long startTime = -1; public boolean legacy; + public boolean blocking; public void addLegacyRoutes(String routesStr) { if (routesStr.trim().equals("")) { @@ -120,6 +121,7 @@ public class VpnConfig implements Parcelable { out.writeParcelable(configureIntent, flags); out.writeLong(startTime); out.writeInt(legacy ? 1 : 0); + out.writeInt(blocking ? 1 : 0); } public static final Parcelable.Creator CREATOR = @@ -138,6 +140,7 @@ public class VpnConfig implements Parcelable { config.configureIntent = in.readParcelable(null); config.startTime = in.readLong(); config.legacy = in.readInt() != 0; + config.blocking = in.readInt() != 0; return config; } diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java index 7b68d55b011a3..4b5a2cb0eb1a7 100644 --- a/services/core/java/com/android/server/connectivity/Vpn.java +++ b/services/core/java/com/android/server/connectivity/Vpn.java @@ -77,6 +77,7 @@ import com.android.internal.net.VpnProfile; import com.android.server.net.BaseNetworkObserver; import java.io.File; +import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.InetAddress; @@ -470,6 +471,13 @@ public class Vpn { if (oldInterface != null && !oldInterface.equals(interfaze)) { jniReset(oldInterface); } + + try { + IoUtils.setBlocking(tun.getFileDescriptor(), config.blocking); + } catch (IOException e) { + throw new IllegalStateException( + "Cannot set tunnel's fd as blocking=" + config.blocking, e); + } } catch (RuntimeException e) { IoUtils.closeQuietly(tun); agentDisconnect();