summaryrefslogtreecommitdiffstats
path: root/packages
diff options
context:
space:
mode:
authorHung-ying Tyan <tyanh@google.com>2009-08-11 18:12:07 -0700
committerAndroid Git Automerger <android-git-automerger@android.com>2009-08-11 18:12:07 -0700
commitcff53466bb60bb346ab45be91c3fa578ce91f9d4 (patch)
tree6c92f90a58f79726d1feecd84ffcc4eaa36980db /packages
parent2ac8c279881a6a12f979f54954cab69c98ba9d98 (diff)
parentc22e0c8012828474e8aa2e29b441ef02728b0842 (diff)
downloadframeworks_base-cff53466bb60bb346ab45be91c3fa578ce91f9d4.zip
frameworks_base-cff53466bb60bb346ab45be91c3fa578ce91f9d4.tar.gz
frameworks_base-cff53466bb60bb346ab45be91c3fa578ce91f9d4.tar.bz2
am c22e0c80: Merge change 20719 into donut
Merge commit 'c22e0c8012828474e8aa2e29b441ef02728b0842' * commit 'c22e0c8012828474e8aa2e29b441ef02728b0842': Fix order of setting/saving state in VpnService.
Diffstat (limited to 'packages')
-rw-r--r--packages/VpnServices/src/com/android/server/vpn/VpnService.java87
1 files changed, 42 insertions, 45 deletions
diff --git a/packages/VpnServices/src/com/android/server/vpn/VpnService.java b/packages/VpnServices/src/com/android/server/vpn/VpnService.java
index f410c7b..5524ee5 100644
--- a/packages/VpnServices/src/com/android/server/vpn/VpnService.java
+++ b/packages/VpnServices/src/com/android/server/vpn/VpnService.java
@@ -133,11 +133,7 @@ abstract class VpnService<E extends VpnProfile> implements Serializable {
if (VpnState.CONNECTED.equals(mState)) {
Log.i("VpnService", " recovered: " + mProfile.getName());
- new Thread(new Runnable() {
- public void run() {
- enterConnectivityLoop();
- }
- }).start();
+ startConnectivityMonitor();
}
}
@@ -213,16 +209,18 @@ abstract class VpnService<E extends VpnProfile> implements Serializable {
SystemProperties.get(VPN_STATUS))) {
onConnected();
return;
- } else if (mDaemonHelper.anySocketError()) {
- return;
+ } else {
+ int err = mDaemonHelper.getSocketError();
+ if (err != 0) {
+ onError(err);
+ return;
+ }
}
sleep(500); // 0.5 second
}
- synchronized (VpnService.this) {
- if (mState == VpnState.CONNECTING) {
- onError(new IOException("Connecting timed out"));
- }
+ if (mState == VpnState.CONNECTING) {
+ onError(new IOException("Connecting timed out"));
}
}
@@ -235,13 +233,15 @@ abstract class VpnService<E extends VpnProfile> implements Serializable {
mStartTime = System.currentTimeMillis();
- // set DNS after saving the states in case the process gets killed
- // before states are saved
+ // Correct order to make sure VpnService doesn't break when killed:
+ // (1) set state to CONNECTED
+ // (2) save states
+ // (3) set DNS
+ setState(VpnState.CONNECTED);
saveSelf();
setVpnDns();
- setState(VpnState.CONNECTED);
- enterConnectivityLoop();
+ startConnectivityMonitor();
}
private void saveSelf() throws IOException {
@@ -340,23 +340,28 @@ abstract class VpnService<E extends VpnProfile> implements Serializable {
}
}
- private void enterConnectivityLoop() {
- Log.i(TAG, "VPN connectivity monitor running");
- try {
- for (;;) {
- synchronized (VpnService.this) {
- if (mState != VpnState.CONNECTED || !checkConnectivity()) {
- break;
+ private void startConnectivityMonitor() {
+ new Thread(new Runnable() {
+ public void run() {
+ Log.i(TAG, "VPN connectivity monitor running");
+ try {
+ for (;;) {
+ synchronized (VpnService.this) {
+ if ((mState != VpnState.CONNECTED)
+ || !checkConnectivity()) {
+ break;
+ }
+ mNotification.update();
+ checkDns();
+ VpnService.this.wait(1000); // 1 second
+ }
}
- mNotification.update();
- checkDns();
- VpnService.this.wait(1000); // 1 second
+ } catch (InterruptedException e) {
+ onError(e);
}
+ Log.i(TAG, "VPN connectivity monitor stopped");
}
- } catch (InterruptedException e) {
- onError(e);
- }
- Log.i(TAG, "VPN connectivity monitor stopped");
+ }).start();
}
private void saveLocalIpAndInterface(String serverIp) throws IOException {
@@ -432,11 +437,7 @@ abstract class VpnService<E extends VpnProfile> implements Serializable {
}
synchronized void stopAll() {
- if (mDaemonList.isEmpty()) {
- onFinalCleanUp();
- } else {
- for (DaemonProxy s : mDaemonList) s.stop();
- }
+ for (DaemonProxy s : mDaemonList) s.stop();
}
synchronized void closeSockets() {
@@ -461,30 +462,26 @@ abstract class VpnService<E extends VpnProfile> implements Serializable {
}
}
- synchronized boolean anySocketError() {
+ synchronized int getSocketError() {
for (DaemonProxy s : mDaemonList) {
switch (getResultFromSocket(s)) {
case 0:
- continue;
+ return 0;
case AUTH_ERROR_CODE:
- onError(VpnManager.VPN_ERROR_AUTH);
- return true;
+ return VpnManager.VPN_ERROR_AUTH;
case CHALLENGE_ERROR_CODE:
- onError(VpnManager.VPN_ERROR_CHALLENGE);
- return true;
+ return VpnManager.VPN_ERROR_CHALLENGE;
case REMOTE_HUNG_UP_ERROR_CODE:
- onError(VpnManager.VPN_ERROR_REMOTE_HUNG_UP);
- return true;
+ return VpnManager.VPN_ERROR_REMOTE_HUNG_UP;
default:
- onError(VpnManager.VPN_ERROR_CONNECTION_FAILED);
- return true;
+ return VpnManager.VPN_ERROR_CONNECTION_FAILED;
}
}
- return false;
+ return 0;
}
}