Merge "SIP: fix keep-alive measurement and increase the timeout."

This commit is contained in:
Chia-chi Yeh
2011-09-13 10:35:04 -07:00
committed by Android (Google) Code Review
2 changed files with 34 additions and 32 deletions

View File

@@ -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) {
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);
}
try {
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);
}
}

View File

@@ -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