Merge "Enhancement on ICS data stall polling logic" into ics-mr1
This commit is contained in:
@ -3642,11 +3642,20 @@ public final class Settings {
|
|||||||
"pdp_watchdog_max_pdp_reset_fail_count";
|
"pdp_watchdog_max_pdp_reset_fail_count";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The number of milliseconds to delay when checking for data stalls
|
* The number of milliseconds to delay when checking for data stalls during
|
||||||
|
* non-aggressive detection. (screen is turned off.)
|
||||||
* @hide
|
* @hide
|
||||||
*/
|
*/
|
||||||
public static final String DATA_STALL_ALARM_DELAY_IN_MS =
|
public static final String DATA_STALL_ALARM_NON_AGGRESSIVE_DELAY_IN_MS =
|
||||||
"data_stall_alarm_delay_in_ms";
|
"data_stall_alarm_non_aggressive_delay_in_ms";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The number of milliseconds to delay when checking for data stalls during
|
||||||
|
* aggressive detection. (screen on or suspected data stall)
|
||||||
|
* @hide
|
||||||
|
*/
|
||||||
|
public static final String DATA_STALL_ALARM_AGGRESSIVE_DELAY_IN_MS =
|
||||||
|
"data_stall_alarm_aggressive_delay_in_ms";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The interval in milliseconds at which to check gprs registration
|
* The interval in milliseconds at which to check gprs registration
|
||||||
|
@ -212,8 +212,10 @@ public abstract class DataConnectionTracker extends Handler {
|
|||||||
// represents an invalid IP address
|
// represents an invalid IP address
|
||||||
protected static final String NULL_IP = "0.0.0.0";
|
protected static final String NULL_IP = "0.0.0.0";
|
||||||
|
|
||||||
// Default for the data stall alarm
|
// Default for the data stall alarm while non-aggressive stall detection
|
||||||
protected static final int DATA_STALL_ALARM_DELAY_IN_MS_DEFAULT = 1000 * 60 * 6;
|
protected static final int DATA_STALL_ALARM_NON_AGGRESSIVE_DELAY_IN_MS_DEFAULT = 1000 * 60 * 6;
|
||||||
|
// Default for the data stall alarm for aggressive stall detection
|
||||||
|
protected static final int DATA_STALL_ALARM_AGGRESSIVE_DELAY_IN_MS_DEFAULT = 1000 * 60;
|
||||||
// If attempt is less than this value we're doing first level recovery
|
// If attempt is less than this value we're doing first level recovery
|
||||||
protected static final int DATA_STALL_NO_RECV_POLL_LIMIT = 1;
|
protected static final int DATA_STALL_NO_RECV_POLL_LIMIT = 1;
|
||||||
// Tag for tracking stale alarms
|
// Tag for tracking stale alarms
|
||||||
@ -323,10 +325,12 @@ public abstract class DataConnectionTracker extends Handler {
|
|||||||
mIsScreenOn = true;
|
mIsScreenOn = true;
|
||||||
stopNetStatPoll();
|
stopNetStatPoll();
|
||||||
startNetStatPoll();
|
startNetStatPoll();
|
||||||
|
restartDataStallAlarm();
|
||||||
} else if (action.equals(Intent.ACTION_SCREEN_OFF)) {
|
} else if (action.equals(Intent.ACTION_SCREEN_OFF)) {
|
||||||
mIsScreenOn = false;
|
mIsScreenOn = false;
|
||||||
stopNetStatPoll();
|
stopNetStatPoll();
|
||||||
startNetStatPoll();
|
startNetStatPoll();
|
||||||
|
restartDataStallAlarm();
|
||||||
} else if (action.startsWith(getActionIntentReconnectAlarm())) {
|
} else if (action.startsWith(getActionIntentReconnectAlarm())) {
|
||||||
log("Reconnect alarm. Previous state was " + mState);
|
log("Reconnect alarm. Previous state was " + mState);
|
||||||
onActionIntentReconnectAlarm(intent);
|
onActionIntentReconnectAlarm(intent);
|
||||||
@ -622,6 +626,7 @@ public abstract class DataConnectionTracker extends Handler {
|
|||||||
protected abstract String getActionIntentDataStallAlarm();
|
protected abstract String getActionIntentDataStallAlarm();
|
||||||
protected abstract void startNetStatPoll();
|
protected abstract void startNetStatPoll();
|
||||||
protected abstract void stopNetStatPoll();
|
protected abstract void stopNetStatPoll();
|
||||||
|
protected abstract void restartDataStallAlarm();
|
||||||
protected abstract void restartRadio();
|
protected abstract void restartRadio();
|
||||||
protected abstract void log(String s);
|
protected abstract void log(String s);
|
||||||
protected abstract void loge(String s);
|
protected abstract void loge(String s);
|
||||||
|
@ -158,6 +158,9 @@ public final class CdmaDataConnectionTracker extends DataConnectionTracker {
|
|||||||
return INTENT_DATA_STALL_ALARM;
|
return INTENT_DATA_STALL_ALARM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void restartDataStallAlarm() {}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void setState(State s) {
|
protected void setState(State s) {
|
||||||
if (DBG) log ("setState: " + s);
|
if (DBG) log ("setState: " + s);
|
||||||
|
@ -97,13 +97,21 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
|
|||||||
private ContentResolver mResolver;
|
private ContentResolver mResolver;
|
||||||
|
|
||||||
// Recovery action taken in case of data stall
|
// Recovery action taken in case of data stall
|
||||||
class RecoveryAction {
|
private static class RecoveryAction {
|
||||||
public static final int GET_DATA_CALL_LIST = 0;
|
public static final int GET_DATA_CALL_LIST = 0;
|
||||||
public static final int CLEANUP = 1;
|
public static final int CLEANUP = 1;
|
||||||
public static final int REREGISTER = 2;
|
public static final int REREGISTER = 2;
|
||||||
public static final int RADIO_RESTART = 3;
|
public static final int RADIO_RESTART = 3;
|
||||||
public static final int RADIO_RESTART_WITH_PROP = 4;
|
public static final int RADIO_RESTART_WITH_PROP = 4;
|
||||||
|
|
||||||
|
private static boolean isAggressiveRecovery(int value) {
|
||||||
|
return ((value == RecoveryAction.CLEANUP) ||
|
||||||
|
(value == RecoveryAction.REREGISTER) ||
|
||||||
|
(value == RecoveryAction.RADIO_RESTART) ||
|
||||||
|
(value == RecoveryAction.RADIO_RESTART_WITH_PROP));
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public int getRecoveryAction() {
|
public int getRecoveryAction() {
|
||||||
int action = Settings.System.getInt(mPhone.getContext().getContentResolver(),
|
int action = Settings.System.getInt(mPhone.getContext().getContentResolver(),
|
||||||
"radio.data.stall.recovery.action", RecoveryAction.GET_DATA_CALL_LIST);
|
"radio.data.stall.recovery.action", RecoveryAction.GET_DATA_CALL_LIST);
|
||||||
@ -131,6 +139,9 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
|
|||||||
static final String APN_ID = "apn_id";
|
static final String APN_ID = "apn_id";
|
||||||
private boolean canSetPreferApn = false;
|
private boolean canSetPreferApn = false;
|
||||||
|
|
||||||
|
private static final boolean DATA_STALL_SUSPECTED = true;
|
||||||
|
private static final boolean DATA_STALL_NOT_SUSPECTED = false;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onActionIntentReconnectAlarm(Intent intent) {
|
protected void onActionIntentReconnectAlarm(Intent intent) {
|
||||||
if (DBG) log("GPRS reconnect alarm. Previous state was " + mState);
|
if (DBG) log("GPRS reconnect alarm. Previous state was " + mState);
|
||||||
@ -586,7 +597,7 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
|
|||||||
if (getOverallState() == State.CONNECTED) {
|
if (getOverallState() == State.CONNECTED) {
|
||||||
if (DBG) log("onDataConnectionAttached: start polling notify attached");
|
if (DBG) log("onDataConnectionAttached: start polling notify attached");
|
||||||
startNetStatPoll();
|
startNetStatPoll();
|
||||||
startDataStallAlarm();
|
startDataStallAlarm(DATA_STALL_NOT_SUSPECTED);
|
||||||
notifyDataConnection(Phone.REASON_DATA_ATTACHED);
|
notifyDataConnection(Phone.REASON_DATA_ATTACHED);
|
||||||
} else {
|
} else {
|
||||||
// update APN availability so that APN can be enabled.
|
// update APN availability so that APN can be enabled.
|
||||||
@ -1271,7 +1282,7 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
|
|||||||
// setState(State.CONNECTED);
|
// setState(State.CONNECTED);
|
||||||
mPhone.notifyDataConnection(apnContext.getReason(), apnContext.getApnType());
|
mPhone.notifyDataConnection(apnContext.getReason(), apnContext.getApnType());
|
||||||
startNetStatPoll();
|
startNetStatPoll();
|
||||||
startDataStallAlarm();
|
startDataStallAlarm(DATA_STALL_NOT_SUSPECTED);
|
||||||
// reset reconnect timer
|
// reset reconnect timer
|
||||||
apnContext.getDataConnection().resetRetryCount();
|
apnContext.getDataConnection().resetRetryCount();
|
||||||
}
|
}
|
||||||
@ -1437,10 +1448,12 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
|
|||||||
Settings.Secure.PDP_WATCHDOG_TRIGGER_PACKET_COUNT,
|
Settings.Secure.PDP_WATCHDOG_TRIGGER_PACKET_COUNT,
|
||||||
NUMBER_SENT_PACKETS_OF_HANG);
|
NUMBER_SENT_PACKETS_OF_HANG);
|
||||||
|
|
||||||
|
boolean suspectedStall = DATA_STALL_NOT_SUSPECTED;
|
||||||
if (mSentSinceLastRecv >= hangWatchdogTrigger) {
|
if (mSentSinceLastRecv >= hangWatchdogTrigger) {
|
||||||
if (DBG) {
|
if (DBG) {
|
||||||
log("onDataStallAlarm: tag=" + tag + " do recovery action=" + getRecoveryAction());
|
log("onDataStallAlarm: tag=" + tag + " do recovery action=" + getRecoveryAction());
|
||||||
}
|
}
|
||||||
|
suspectedStall = DATA_STALL_SUSPECTED;
|
||||||
sendMessage(obtainMessage(EVENT_DO_RECOVERY));
|
sendMessage(obtainMessage(EVENT_DO_RECOVERY));
|
||||||
} else {
|
} else {
|
||||||
if (VDBG) {
|
if (VDBG) {
|
||||||
@ -1448,7 +1461,7 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
|
|||||||
" pkts since last received, < watchdogTrigger=" + hangWatchdogTrigger);
|
" pkts since last received, < watchdogTrigger=" + hangWatchdogTrigger);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
startDataStallAlarm();
|
startDataStallAlarm(suspectedStall);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1614,12 +1627,24 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void startDataStallAlarm() {
|
private void startDataStallAlarm(boolean suspectedStall) {
|
||||||
int delayInMs = Settings.Secure.getInt(mResolver,
|
int nextAction = getRecoveryAction();
|
||||||
Settings.Secure.DATA_STALL_ALARM_DELAY_IN_MS,
|
int delayInMs;
|
||||||
DATA_STALL_ALARM_DELAY_IN_MS_DEFAULT);
|
|
||||||
|
// If screen is on or data stall is currently suspected, set the alarm
|
||||||
|
// with an aggresive timeout.
|
||||||
|
if (mIsScreenOn || suspectedStall || RecoveryAction.isAggressiveRecovery(nextAction)) {
|
||||||
|
delayInMs = Settings.Secure.getInt(mResolver,
|
||||||
|
Settings.Secure.DATA_STALL_ALARM_AGGRESSIVE_DELAY_IN_MS,
|
||||||
|
DATA_STALL_ALARM_AGGRESSIVE_DELAY_IN_MS_DEFAULT);
|
||||||
|
} else {
|
||||||
|
delayInMs = Settings.Secure.getInt(mResolver,
|
||||||
|
Settings.Secure.DATA_STALL_ALARM_NON_AGGRESSIVE_DELAY_IN_MS,
|
||||||
|
DATA_STALL_ALARM_NON_AGGRESSIVE_DELAY_IN_MS_DEFAULT);
|
||||||
|
}
|
||||||
|
|
||||||
mDataStallAlarmTag += 1;
|
mDataStallAlarmTag += 1;
|
||||||
if (DBG) {
|
if (VDBG) {
|
||||||
log("startDataStallAlarm: tag=" + mDataStallAlarmTag +
|
log("startDataStallAlarm: tag=" + mDataStallAlarmTag +
|
||||||
" delay=" + (delayInMs / 1000) + "s");
|
" delay=" + (delayInMs / 1000) + "s");
|
||||||
}
|
}
|
||||||
@ -1638,7 +1663,7 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
|
|||||||
AlarmManager am =
|
AlarmManager am =
|
||||||
(AlarmManager) mPhone.getContext().getSystemService(Context.ALARM_SERVICE);
|
(AlarmManager) mPhone.getContext().getSystemService(Context.ALARM_SERVICE);
|
||||||
|
|
||||||
if (DBG) {
|
if (VDBG) {
|
||||||
log("stopDataStallAlarm: current tag=" + mDataStallAlarmTag +
|
log("stopDataStallAlarm: current tag=" + mDataStallAlarmTag +
|
||||||
" mDataStallAlarmIntent=" + mDataStallAlarmIntent);
|
" mDataStallAlarmIntent=" + mDataStallAlarmIntent);
|
||||||
}
|
}
|
||||||
@ -1649,6 +1674,20 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void restartDataStallAlarm() {
|
||||||
|
// To be called on screen status change.
|
||||||
|
// Do not cancel the alarm if it is set with aggressive timeout.
|
||||||
|
int nextAction = getRecoveryAction();
|
||||||
|
|
||||||
|
if (RecoveryAction.isAggressiveRecovery(nextAction)) {
|
||||||
|
if (DBG) log("data stall recovery action is pending. not resetting the alarm.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
stopDataStallAlarm();
|
||||||
|
startDataStallAlarm(DATA_STALL_NOT_SUSPECTED);
|
||||||
|
}
|
||||||
|
|
||||||
private void notifyNoData(GsmDataConnection.FailCause lastFailCauseCode,
|
private void notifyNoData(GsmDataConnection.FailCause lastFailCauseCode,
|
||||||
ApnContext apnContext) {
|
ApnContext apnContext) {
|
||||||
if (DBG) log( "notifyNoData: type=" + apnContext.getApnType());
|
if (DBG) log( "notifyNoData: type=" + apnContext.getApnType());
|
||||||
@ -2044,7 +2083,7 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
|
|||||||
if (isConnected()) {
|
if (isConnected()) {
|
||||||
if (!mPhone.getServiceStateTracker().isConcurrentVoiceAndDataAllowed()) {
|
if (!mPhone.getServiceStateTracker().isConcurrentVoiceAndDataAllowed()) {
|
||||||
startNetStatPoll();
|
startNetStatPoll();
|
||||||
startDataStallAlarm();
|
startDataStallAlarm(DATA_STALL_NOT_SUSPECTED);
|
||||||
notifyDataConnection(Phone.REASON_VOICE_CALL_ENDED);
|
notifyDataConnection(Phone.REASON_VOICE_CALL_ENDED);
|
||||||
} else {
|
} else {
|
||||||
// clean slate after call end.
|
// clean slate after call end.
|
||||||
@ -2386,7 +2425,7 @@ public final class GsmDataConnectionTracker extends DataConnectionTracker {
|
|||||||
mIsPsRestricted = false;
|
mIsPsRestricted = false;
|
||||||
if (isConnected()) {
|
if (isConnected()) {
|
||||||
startNetStatPoll();
|
startNetStatPoll();
|
||||||
startDataStallAlarm();
|
startDataStallAlarm(DATA_STALL_NOT_SUSPECTED);
|
||||||
} else {
|
} else {
|
||||||
// TODO: Should all PDN states be checked to fail?
|
// TODO: Should all PDN states be checked to fail?
|
||||||
if (mState == State.FAILED) {
|
if (mState == State.FAILED) {
|
||||||
|
Reference in New Issue
Block a user