diff options
author | Chia-chi Yeh <chiachi@android.com> | 2011-09-08 16:43:50 -0700 |
---|---|---|
committer | Chia-chi Yeh <chiachi@android.com> | 2011-09-13 03:02:30 -0700 |
commit | d17b6d526648c372be761097e55c19767d5dba7d (patch) | |
tree | ac019478843cd5bd5a2ef6406c3518b744edf963 /voip | |
parent | dad9c673961ff8aede8af7d95e35fe8b9c088ac6 (diff) | |
download | frameworks_base-d17b6d526648c372be761097e55c19767d5dba7d.zip frameworks_base-d17b6d526648c372be761097e55c19767d5dba7d.tar.gz frameworks_base-d17b6d526648c372be761097e55c19767d5dba7d.tar.bz2 |
SIP: fix keep-alive measurement and increase the timeout.
Bug: 5226511
Change-Id: I1283790581496b1ff4e583a8d9379cdc39f78c20
Diffstat (limited to 'voip')
-rw-r--r-- | voip/java/com/android/server/sip/SipService.java | 62 | ||||
-rw-r--r-- | voip/java/com/android/server/sip/SipSessionGroup.java | 4 |
2 files changed, 34 insertions, 32 deletions
diff --git a/voip/java/com/android/server/sip/SipService.java b/voip/java/com/android/server/sip/SipService.java index c553947..f417ddd 100644 --- a/voip/java/com/android/server/sip/SipService.java +++ b/voip/java/com/android/server/sip/SipService.java @@ -442,6 +442,7 @@ public final class SipService extends ISipService.Stub { if (wasConnected) { mLocalIp = null; + stopPortMappingMeasurement(); for (SipSessionGroupExt group : mSipGroups.values()) { group.onConnectivityChanged(false); } @@ -457,7 +458,6 @@ public final class SipService extends ISipService.Stub { if (isWifi && (mWifiLock != null)) stopWifiScanner(); } else { mMyWakeLock.reset(); // in case there's a leak - stopPortMappingMeasurement(); if (isWifi && (mWifiLock != null)) startWifiScanner(); } } catch (SipException e) { @@ -784,52 +784,50 @@ public final class SipService extends ISipService.Stub { private static final int PASS_THRESHOLD = 10; private static final int MAX_RETRY_COUNT = 5; private static final int NAT_MEASUREMENT_RETRY_INTERVAL = 120; // in seconds + private SipProfile mLocalProfile; private SipSessionGroupExt mGroup; private SipSessionGroup.SipSessionImpl mSession; private int mMinInterval; private int mMaxInterval; private int mInterval; - private int mPassCount = 0; + private int mPassCount; public IntervalMeasurementProcess(SipProfile localProfile, int minInterval, int maxInterval) { mMaxInterval = maxInterval; mMinInterval = minInterval; - mInterval = (maxInterval + minInterval) / 2; - - // Don't start measurement if the interval is too small - if (mInterval < DEFAULT_KEEPALIVE_INTERVAL) { - Log.w(TAG, "interval is too small; measurement aborted; " - + "maxInterval=" + mMaxInterval); - return; - } else if (checkTermination()) { - Log.w(TAG, "interval is too small; measurement aborted; " - + "interval=[" + mMinInterval + "," + mMaxInterval - + "]"); - return; - } - - try { - mGroup = new SipSessionGroupExt(localProfile, null, null); - // TODO: remove this line once SipWakeupTimer can better handle - // variety of timeout values - mGroup.setWakeupTimer(new SipWakeupTimer(mContext, mExecutor)); - } catch (Exception e) { - Log.w(TAG, "start interval measurement error: " + e); - } + mLocalProfile = localProfile; } public void start() { synchronized (SipService.this) { - Log.d(TAG, "start measurement w interval=" + mInterval); - if (mSession == null) { - mSession = (SipSessionGroup.SipSessionImpl) - mGroup.createSession(null); + if (mSession != null) { + return; } + + mInterval = (mMaxInterval + mMinInterval) / 2; + mPassCount = 0; + + // Don't start measurement if the interval is too small + if (mInterval < DEFAULT_KEEPALIVE_INTERVAL || checkTermination()) { + Log.w(TAG, "measurement aborted; interval=[" + + mMinInterval + "," + mMaxInterval + "]"); + return; + } + try { + Log.d(TAG, "start measurement w interval=" + mInterval); + + mGroup = new SipSessionGroupExt(mLocalProfile, null, null); + // TODO: remove this line once SipWakeupTimer can better handle + // variety of timeout values + mGroup.setWakeupTimer(new SipWakeupTimer(mContext, mExecutor)); + + mSession = (SipSessionGroup.SipSessionImpl) + mGroup.createSession(null); mSession.startKeepAliveProcess(mInterval, this); - } catch (SipException e) { - Log.e(TAG, "start()", e); + } catch (Throwable t) { + onError(SipErrorCode.CLIENT_ERROR, t.toString()); } } } @@ -840,6 +838,10 @@ public final class SipService extends ISipService.Stub { mSession.stopKeepAliveProcess(); mSession = null; } + if (mGroup != null) { + mGroup.close(); + mGroup = null; + } mTimer.cancel(this); } } diff --git a/voip/java/com/android/server/sip/SipSessionGroup.java b/voip/java/com/android/server/sip/SipSessionGroup.java index eb5cce7..06cdaf2 100644 --- a/voip/java/com/android/server/sip/SipSessionGroup.java +++ b/voip/java/com/android/server/sip/SipSessionGroup.java @@ -100,7 +100,7 @@ class SipSessionGroup implements SipListener { private static final int EXPIRY_TIME = 3600; // in seconds private static final int CANCEL_CALL_TIMER = 3; // in seconds private static final int END_CALL_TIMER = 3; // in seconds - private static final int KEEPALIVE_TIMEOUT = 3; // in seconds + private static final int KEEPALIVE_TIMEOUT = 5; // in seconds private static final int INCALL_KEEPALIVE_INTERVAL = 10; // in seconds private static final long WAKE_LOCK_HOLDING_TIME = 500; // in milliseconds @@ -1555,7 +1555,7 @@ class SipSessionGroup implements SipListener { try { sendKeepAlive(); } catch (Throwable t) { - Log.w(TAG, "keepalive error: " + ": " + Log.w(TAG, "keepalive error: " + mLocalProfile.getUriString(), getRootCause(t)); // It's possible that the keepalive process is being stopped // during session.sendKeepAlive() so need to check mRunning |