VPN: tear down VPN when the dependent interface is down.
Change-Id: I1eaf8e39ee7aed1f4ecbd4c36c2a81a68ad2f9d1
diff --git a/services/java/com/android/server/connectivity/Vpn.java b/services/java/com/android/server/connectivity/Vpn.java
index 9fb9349..05e95a7 100644
--- a/services/java/com/android/server/connectivity/Vpn.java
+++ b/services/java/com/android/server/connectivity/Vpn.java
@@ -222,18 +222,24 @@
}
// INetworkManagementEventObserver.Stub
- public void interfaceStatusChanged(String interfaze, boolean up) {
- }
-
- // INetworkManagementEventObserver.Stub
- public void interfaceLinkStateChanged(String interfaze, boolean up) {
- }
-
- // INetworkManagementEventObserver.Stub
public void interfaceAdded(String interfaze) {
}
// INetworkManagementEventObserver.Stub
+ public synchronized void interfaceStatusChanged(String interfaze, boolean up) {
+ if (!up && mLegacyVpnRunner != null) {
+ mLegacyVpnRunner.check(interfaze);
+ }
+ }
+
+ // INetworkManagementEventObserver.Stub
+ public synchronized void interfaceLinkStateChanged(String interfaze, boolean up) {
+ if (!up && mLegacyVpnRunner != null) {
+ mLegacyVpnRunner.check(interfaze);
+ }
+ }
+
+ // INetworkManagementEventObserver.Stub
public synchronized void interfaceRemoved(String interfaze) {
if (interfaze.equals(mInterface) && jniCheck(interfaze) == 0) {
mCallback.restore();
@@ -329,6 +335,7 @@
private final VpnConfig mConfig;
private final String[] mDaemons;
private final String[][] mArguments;
+ private final String mOuterInterface;
private final LegacyVpnInfo mInfo;
private long mTimer = -1;
@@ -340,11 +347,21 @@
mArguments = new String[][] {racoon, mtpd};
mInfo = new LegacyVpnInfo();
+ // This is the interface which VPN is running on.
+ mOuterInterface = mConfig.interfaze;
+
// Legacy VPN is not a real package, so we use it to carry the key.
mInfo.key = mConfig.packagz;
mConfig.packagz = VpnConfig.LEGACY_VPN;
}
+ public void check(String interfaze) {
+ if (interfaze.equals(mOuterInterface)) {
+ Log.i(TAG, "Legacy VPN is going down with " + interfaze);
+ exit();
+ }
+ }
+
public void exit() {
// We assume that everything is reset after the daemons die.
interrupt();