diff options
| author | 2016-06-07 19:55:41 +0900 | |
|---|---|---|
| committer | 2017-01-19 12:38:22 +0900 | |
| commit | 2b465d889c433b018f62f42910f78d8957e9bdbd (patch) | |
| tree | 716739074af00cfc733c4d0ac5edb9dca768acd6 | |
| parent | b1ccd81fba2deb4f0befa97610b3ec044eae8e26 (diff) | |
VPN reconnection fails after manually disabling VPN
When disabling VPN manually, there was no trigger for ipsec-tools to
send “delete message” to VPN server. Therefore, connection information
is left in VPN server and next connection fails.
Fix this issue as below:
- Add “delete message” sending via flush in ipsec-tools when racoon
daemon stops
- Keep daemon alive when VPN.java exit() to let it finish sending to
VPN server
- Move close(socket) and stop(daemon) in VPN.java execute()
and monitorDaemons() to run() to gather cleaning block.
(cherry picked from commit 047454c759b46bbadb87ee3b64bf3e29afda48d6)
Change-Id: Ibfbd389b17de5b5a5d23cba59c8d1e05fbe12c15
Bug: 28279646
Bug: 33467086
| -rw-r--r-- | services/core/java/com/android/server/connectivity/Vpn.java | 60 |
1 files changed, 26 insertions, 34 deletions
diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java index ede3bda5bea2..610a2ab5b53b 100644 --- a/services/core/java/com/android/server/connectivity/Vpn.java +++ b/services/core/java/com/android/server/connectivity/Vpn.java @@ -1544,9 +1544,6 @@ public class Vpn { public void exit() { // We assume that everything is reset after stopping the daemons. interrupt(); - for (LocalSocket socket : mSockets) { - IoUtils.closeQuietly(socket); - } agentDisconnect(); try { mContext.unregisterReceiver(mBroadcastReceiver); @@ -1559,8 +1556,26 @@ public class Vpn { Log.v(TAG, "Waiting"); synchronized (TAG) { Log.v(TAG, "Executing"); - execute(); - monitorDaemons(); + try { + execute(); + monitorDaemons(); + interrupted(); // Clear interrupt flag if execute called exit. + } catch (InterruptedException e) { + } finally { + for (LocalSocket socket : mSockets) { + IoUtils.closeQuietly(socket); + } + // This sleep is necessary for racoon to successfully complete sending delete + // message to server. + try { + Thread.sleep(50); + } catch (InterruptedException e) { + } + for (String daemon : mDaemons) { + SystemService.stop(daemon); + } + } + agentDisconnect(); } } @@ -1759,18 +1774,6 @@ public class Vpn { Log.i(TAG, "Aborting", e); updateState(DetailedState.FAILED, e.getMessage()); exit(); - } finally { - // Kill the daemons if they fail to stop. - if (!initFinished) { - for (String daemon : mDaemons) { - SystemService.stop(daemon); - } - } - - // Do not leave an unstable state. - if (!initFinished || mNetworkInfo.getDetailedState() == DetailedState.CONNECTING) { - agentDisconnect(); - } } } @@ -1778,28 +1781,17 @@ public class Vpn { * Monitor the daemons we started, moving to disconnected state if the * underlying services fail. */ - private void monitorDaemons() { + private void monitorDaemons() throws InterruptedException{ if (!mNetworkInfo.isConnected()) { return; } - - try { - while (true) { - Thread.sleep(2000); - for (int i = 0; i < mDaemons.length; i++) { - if (mArguments[i] != null && SystemService.isStopped(mDaemons[i])) { - return; - } + while (true) { + Thread.sleep(2000); + for (int i = 0; i < mDaemons.length; i++) { + if (mArguments[i] != null && SystemService.isStopped(mDaemons[i])) { + return; } } - } catch (InterruptedException e) { - Log.d(TAG, "interrupted during monitorDaemons(); stopping services"); - } finally { - for (String daemon : mDaemons) { - SystemService.stop(daemon); - } - - agentDisconnect(); } } } |