am c8c398e1: am fb28414b: am d0868c89: Implement VpnService.setBlocking().

* commit 'c8c398e192a565811e7e1e4a0e3d54aa0fe7c852':
  Implement VpnService.setBlocking().
diff --git a/core/java/android/net/VpnService.java b/core/java/android/net/VpnService.java
index 0967fa8..3fd415f 100644
--- a/core/java/android/net/VpnService.java
+++ b/core/java/android/net/VpnService.java
@@ -577,7 +577,7 @@
          * @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 73d3738..c552a41 100644
--- a/core/java/com/android/internal/net/VpnConfig.java
+++ b/core/java/com/android/internal/net/VpnConfig.java
@@ -73,6 +73,7 @@
     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 @@
         out.writeParcelable(configureIntent, flags);
         out.writeLong(startTime);
         out.writeInt(legacy ? 1 : 0);
+        out.writeInt(blocking ? 1 : 0);
     }
 
     public static final Parcelable.Creator<VpnConfig> CREATOR =
@@ -138,6 +140,7 @@
             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 7b68d55..4b5a2cb 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.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 @@
             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();