Loading src/java/com/android/internal/telephony/dataconnection/LinkBandwidthEstimator.java +29 −9 Original line number Diff line number Diff line Loading @@ -89,14 +89,16 @@ public class LinkBandwidthEstimator extends Handler { static final int MSG_NR_STATE_CHANGED = 7; @VisibleForTesting static final int MSG_ACTIVE_PHONE_CHANGED = 8; @VisibleForTesting static final int MSG_DATA_REG_STATE_OR_RAT_CHANGED = 9; // TODO: move the following parameters to xml file private static final int TRAFFIC_STATS_POLL_INTERVAL_MS = 1_000; private static final int MODEM_POLL_MIN_INTERVAL_MS = 5_000; private static final int TRAFFIC_MODEM_POLL_BYTE_RATIO = 8; private static final int TRAFFIC_POLL_BYTE_THRESHOLD_MAX = 20_000; private static final int BYTE_DELTA_ACC_THRESHOLD_MAX_KB = 4_000; private static final int MODEM_POLL_TIME_DELTA_MAX_MS = 15_000; private static final int BYTE_DELTA_ACC_THRESHOLD_MAX_KB = 8_000; private static final int MODEM_POLL_TIME_DELTA_MAX_MS = 10_000; private static final int FILTER_UPDATE_MAX_INTERVAL_MS = 5_100; // BW samples with Tx or Rx time below the following value is ignored. private static final int TX_RX_TIME_MIN_MS = 200; Loading Loading @@ -183,8 +185,9 @@ public class LinkBandwidthEstimator extends Handler { private String mBandwidthUpdatePlmn = UNKNOWN_PLMN; private BandwidthState mTxState = new BandwidthState(LINK_TX); private BandwidthState mRxState = new BandwidthState(LINK_RX); private RegistrantList mBandwidthChangedRegistrants = new RegistrantList(); private long mLastPlmnOrRatChangeTimeMs; private long mLastDrsOrRatChangeTimeMs; private static void initAvgBwPerRatTable() { for (String config : AVG_BW_PER_RAT) { Loading Loading @@ -266,11 +269,12 @@ public class LinkBandwidthEstimator extends Handler { mPlaceholderNetwork = new NetworkBandwidth(UNKNOWN_PLMN); initAvgBwPerRatTable(); registerNrStateFrequencyChange(); mPhone.getServiceStateTracker().registerForDataRegStateOrRatChanged(AccessNetworkConstants .TRANSPORT_TYPE_WWAN, this, MSG_DATA_REG_STATE_OR_RAT_CHANGED, null); } @Override public void handleMessage(Message msg) { AsyncResult ar; switch (msg.what) { case MSG_SCREEN_STATE_CHANGED: handleScreenStateChanged((boolean) msg.obj); Loading @@ -295,6 +299,9 @@ public class LinkBandwidthEstimator extends Handler { case MSG_ACTIVE_PHONE_CHANGED: handleActivePhoneChanged((int) msg.obj); break; case MSG_DATA_REG_STATE_OR_RAT_CHANGED: handleDrsOrRatChanged((AsyncResult) msg.obj); break; default: Rlog.e(TAG, "invalid message " + msg.what); break; Loading Loading @@ -380,6 +387,12 @@ public class LinkBandwidthEstimator extends Handler { handleTrafficStatsPollConditionChanged(); } private void handleDrsOrRatChanged(AsyncResult ar) { Pair<Integer, Integer> drsRatPair = (Pair<Integer, Integer>) ar.result; logd("DrsOrRatChanged dataRegState " + drsRatPair.first + " rilRat " + drsRatPair.second); mLastDrsOrRatChangeTimeMs = mTelephonyFacade.getElapsedSinceBootMillis(); } private void handleTrafficStatsPollConditionChanged() { removeMessages(MSG_TRAFFIC_STATS_POLL); if (mScreenOn && mIsOnDefaultRoute && mIsOnActiveData) { Loading Loading @@ -446,8 +459,7 @@ public class LinkBandwidthEstimator extends Handler { long timeSinceLastFilterUpdateMs = currTimeMs - mFilterUpdateTimeMs; // Update filter if (timeSinceLastFilterUpdateMs >= FILTER_UPDATE_MAX_INTERVAL_MS) { boolean updatedBandwidth = updateDataRatCellIdentityBandwidth(); if (!updatedBandwidth) { if (!updateDataRatCellIdentityBandwidth()) { updateTxRxBandwidthFilterSendToDataConnection(); } } Loading Loading @@ -479,7 +491,7 @@ public class LinkBandwidthEstimator extends Handler { private void updateBandwidthTxRxSamples(ModemActivityInfo modemActivityInfo) { if (mLastModemActivityInfo == null || modemActivityInfo == null || mNetworkCapabilities == null) { || mNetworkCapabilities == null || hasRecentDataRegStatePlmnOrRatChange()) { return; } Loading Loading @@ -524,6 +536,14 @@ public class LinkBandwidthEstimator extends Handler { .toString()); } private boolean hasRecentDataRegStatePlmnOrRatChange() { if (mLastModemActivityInfo == null) { return false; } return (mLastDrsOrRatChangeTimeMs > mLastModemActivityInfo.getTimestampMillis() || mLastPlmnOrRatChangeTimeMs > mLastModemActivityInfo.getTimestampMillis()); } private long getModemTxTimeMs(ModemActivityInfo modemActivity) { long txTimeMs = 0; for (int lvl = 0; lvl < ModemActivityInfo.getNumTxPowerLevels(); lvl++) { Loading Loading @@ -795,8 +815,7 @@ public class LinkBandwidthEstimator extends Handler { mSignalStrengthDbm = signalStrength.getDbm(); mSignalLevel = signalStrength.getLevel(); updateByteCountThr(); boolean updatedBandwidth = updateDataRatCellIdentityBandwidth(); if (updatedBandwidth) { if (updateDataRatCellIdentityBandwidth()) { return; } Loading Loading @@ -933,6 +952,7 @@ public class LinkBandwidthEstimator extends Handler { if (updatedPlmnOrRat) { resetBandwidthFilter(); updateTxRxBandwidthFilterSendToDataConnection(); mLastPlmnOrRatChangeTimeMs = mTelephonyFacade.getElapsedSinceBootMillis(); } return updatedPlmnOrRat; } Loading tests/telephonytests/src/com/android/internal/telephony/dataconnection/LinkBandwidthEstimatorTest.java +14 −10 Original line number Diff line number Diff line Loading @@ -585,7 +585,7 @@ public class LinkBandwidthEstimatorTest extends TelephonyTest { } @Test public void testUseHighTxRxByteEdgeThenUnknownNetwork() throws Exception { public void testEdgeThenLteShouldIgnoreTransitionStats() throws Exception { mLBE.obtainMessage(MSG_SCREEN_STATE_CHANGED, true).sendToTarget(); processAllMessages(); mNri = new NetworkRegistrationInfo.Builder() Loading @@ -594,7 +594,7 @@ public class LinkBandwidthEstimatorTest extends TelephonyTest { when(mServiceState.getNetworkRegistrationInfo(anyInt(), anyInt())).thenReturn(mNri); mLBE.obtainMessage(MSG_SIGNAL_STRENGTH_CHANGED, mSignalStrength).sendToTarget(); processAllMessages(); for (int i = 0; i < BW_STATS_COUNT_THRESHOLD + 5; i++) { for (int i = 0; i < BW_STATS_COUNT_THRESHOLD * 2; i++) { addTxBytes(12_000L); addRxBytes(24_000L); addElapsedTime(5_100); Loading @@ -608,24 +608,28 @@ public class LinkBandwidthEstimatorTest extends TelephonyTest { LinkBandwidthEstimator.NetworkBandwidth network = mLBE.lookupNetwork("310260", 366, "EDGE"); assertEquals(0, network.getCount(LINK_TX, 1)); assertEquals(BW_STATS_COUNT_THRESHOLD + 4, network.getCount(LINK_RX, 1)); assertEquals(24_000L * 8 / 1024 * (BW_STATS_COUNT_THRESHOLD + 4), assertEquals(BW_STATS_COUNT_THRESHOLD * 2 - 1, network.getCount(LINK_RX, 1)); assertEquals(24_000L * 8 / 1024 * (BW_STATS_COUNT_THRESHOLD * 2 - 1), network.getValue(LINK_RX, 1)); mNri = new NetworkRegistrationInfo.Builder() .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_UNKNOWN) .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_LTE) .build(); when(mServiceState.getNetworkRegistrationInfo(anyInt(), anyInt())).thenReturn(mNri); mLBE.obtainMessage(MSG_SIGNAL_STRENGTH_CHANGED, mSignalStrength).sendToTarget(); processAllMessages(); for (int i = 0; i < 5; i++) { for (int i = BW_STATS_COUNT_THRESHOLD * 2; i < BW_STATS_COUNT_THRESHOLD * 4; i++) { addTxBytes(1_200_000L); addRxBytes(2_400_000L); addElapsedTime(5_100); moveTimeForward(5_100); processAllMessages(); mLBE.obtainMessage(MSG_MODEM_ACTIVITY_RETURNED, new ModemActivityInfo( i * 5_100L, 0, 0, TX_TIME_2_MS, i * RX_TIME_2_MS * 10)).sendToTarget(); processAllMessages(); } network = mLBE.lookupNetwork("310260", 366, "UNKNOWN"); network = mLBE.lookupNetwork("310260", 366, "LTE"); assertEquals(0, network.getCount(LINK_RX, 1)); assertEquals(BW_STATS_COUNT_THRESHOLD * 2 - 2, network.getCount(LINK_RX, 1)); assertEquals(0, network.getCount(LINK_TX, 1)); } Loading Loading
src/java/com/android/internal/telephony/dataconnection/LinkBandwidthEstimator.java +29 −9 Original line number Diff line number Diff line Loading @@ -89,14 +89,16 @@ public class LinkBandwidthEstimator extends Handler { static final int MSG_NR_STATE_CHANGED = 7; @VisibleForTesting static final int MSG_ACTIVE_PHONE_CHANGED = 8; @VisibleForTesting static final int MSG_DATA_REG_STATE_OR_RAT_CHANGED = 9; // TODO: move the following parameters to xml file private static final int TRAFFIC_STATS_POLL_INTERVAL_MS = 1_000; private static final int MODEM_POLL_MIN_INTERVAL_MS = 5_000; private static final int TRAFFIC_MODEM_POLL_BYTE_RATIO = 8; private static final int TRAFFIC_POLL_BYTE_THRESHOLD_MAX = 20_000; private static final int BYTE_DELTA_ACC_THRESHOLD_MAX_KB = 4_000; private static final int MODEM_POLL_TIME_DELTA_MAX_MS = 15_000; private static final int BYTE_DELTA_ACC_THRESHOLD_MAX_KB = 8_000; private static final int MODEM_POLL_TIME_DELTA_MAX_MS = 10_000; private static final int FILTER_UPDATE_MAX_INTERVAL_MS = 5_100; // BW samples with Tx or Rx time below the following value is ignored. private static final int TX_RX_TIME_MIN_MS = 200; Loading Loading @@ -183,8 +185,9 @@ public class LinkBandwidthEstimator extends Handler { private String mBandwidthUpdatePlmn = UNKNOWN_PLMN; private BandwidthState mTxState = new BandwidthState(LINK_TX); private BandwidthState mRxState = new BandwidthState(LINK_RX); private RegistrantList mBandwidthChangedRegistrants = new RegistrantList(); private long mLastPlmnOrRatChangeTimeMs; private long mLastDrsOrRatChangeTimeMs; private static void initAvgBwPerRatTable() { for (String config : AVG_BW_PER_RAT) { Loading Loading @@ -266,11 +269,12 @@ public class LinkBandwidthEstimator extends Handler { mPlaceholderNetwork = new NetworkBandwidth(UNKNOWN_PLMN); initAvgBwPerRatTable(); registerNrStateFrequencyChange(); mPhone.getServiceStateTracker().registerForDataRegStateOrRatChanged(AccessNetworkConstants .TRANSPORT_TYPE_WWAN, this, MSG_DATA_REG_STATE_OR_RAT_CHANGED, null); } @Override public void handleMessage(Message msg) { AsyncResult ar; switch (msg.what) { case MSG_SCREEN_STATE_CHANGED: handleScreenStateChanged((boolean) msg.obj); Loading @@ -295,6 +299,9 @@ public class LinkBandwidthEstimator extends Handler { case MSG_ACTIVE_PHONE_CHANGED: handleActivePhoneChanged((int) msg.obj); break; case MSG_DATA_REG_STATE_OR_RAT_CHANGED: handleDrsOrRatChanged((AsyncResult) msg.obj); break; default: Rlog.e(TAG, "invalid message " + msg.what); break; Loading Loading @@ -380,6 +387,12 @@ public class LinkBandwidthEstimator extends Handler { handleTrafficStatsPollConditionChanged(); } private void handleDrsOrRatChanged(AsyncResult ar) { Pair<Integer, Integer> drsRatPair = (Pair<Integer, Integer>) ar.result; logd("DrsOrRatChanged dataRegState " + drsRatPair.first + " rilRat " + drsRatPair.second); mLastDrsOrRatChangeTimeMs = mTelephonyFacade.getElapsedSinceBootMillis(); } private void handleTrafficStatsPollConditionChanged() { removeMessages(MSG_TRAFFIC_STATS_POLL); if (mScreenOn && mIsOnDefaultRoute && mIsOnActiveData) { Loading Loading @@ -446,8 +459,7 @@ public class LinkBandwidthEstimator extends Handler { long timeSinceLastFilterUpdateMs = currTimeMs - mFilterUpdateTimeMs; // Update filter if (timeSinceLastFilterUpdateMs >= FILTER_UPDATE_MAX_INTERVAL_MS) { boolean updatedBandwidth = updateDataRatCellIdentityBandwidth(); if (!updatedBandwidth) { if (!updateDataRatCellIdentityBandwidth()) { updateTxRxBandwidthFilterSendToDataConnection(); } } Loading Loading @@ -479,7 +491,7 @@ public class LinkBandwidthEstimator extends Handler { private void updateBandwidthTxRxSamples(ModemActivityInfo modemActivityInfo) { if (mLastModemActivityInfo == null || modemActivityInfo == null || mNetworkCapabilities == null) { || mNetworkCapabilities == null || hasRecentDataRegStatePlmnOrRatChange()) { return; } Loading Loading @@ -524,6 +536,14 @@ public class LinkBandwidthEstimator extends Handler { .toString()); } private boolean hasRecentDataRegStatePlmnOrRatChange() { if (mLastModemActivityInfo == null) { return false; } return (mLastDrsOrRatChangeTimeMs > mLastModemActivityInfo.getTimestampMillis() || mLastPlmnOrRatChangeTimeMs > mLastModemActivityInfo.getTimestampMillis()); } private long getModemTxTimeMs(ModemActivityInfo modemActivity) { long txTimeMs = 0; for (int lvl = 0; lvl < ModemActivityInfo.getNumTxPowerLevels(); lvl++) { Loading Loading @@ -795,8 +815,7 @@ public class LinkBandwidthEstimator extends Handler { mSignalStrengthDbm = signalStrength.getDbm(); mSignalLevel = signalStrength.getLevel(); updateByteCountThr(); boolean updatedBandwidth = updateDataRatCellIdentityBandwidth(); if (updatedBandwidth) { if (updateDataRatCellIdentityBandwidth()) { return; } Loading Loading @@ -933,6 +952,7 @@ public class LinkBandwidthEstimator extends Handler { if (updatedPlmnOrRat) { resetBandwidthFilter(); updateTxRxBandwidthFilterSendToDataConnection(); mLastPlmnOrRatChangeTimeMs = mTelephonyFacade.getElapsedSinceBootMillis(); } return updatedPlmnOrRat; } Loading
tests/telephonytests/src/com/android/internal/telephony/dataconnection/LinkBandwidthEstimatorTest.java +14 −10 Original line number Diff line number Diff line Loading @@ -585,7 +585,7 @@ public class LinkBandwidthEstimatorTest extends TelephonyTest { } @Test public void testUseHighTxRxByteEdgeThenUnknownNetwork() throws Exception { public void testEdgeThenLteShouldIgnoreTransitionStats() throws Exception { mLBE.obtainMessage(MSG_SCREEN_STATE_CHANGED, true).sendToTarget(); processAllMessages(); mNri = new NetworkRegistrationInfo.Builder() Loading @@ -594,7 +594,7 @@ public class LinkBandwidthEstimatorTest extends TelephonyTest { when(mServiceState.getNetworkRegistrationInfo(anyInt(), anyInt())).thenReturn(mNri); mLBE.obtainMessage(MSG_SIGNAL_STRENGTH_CHANGED, mSignalStrength).sendToTarget(); processAllMessages(); for (int i = 0; i < BW_STATS_COUNT_THRESHOLD + 5; i++) { for (int i = 0; i < BW_STATS_COUNT_THRESHOLD * 2; i++) { addTxBytes(12_000L); addRxBytes(24_000L); addElapsedTime(5_100); Loading @@ -608,24 +608,28 @@ public class LinkBandwidthEstimatorTest extends TelephonyTest { LinkBandwidthEstimator.NetworkBandwidth network = mLBE.lookupNetwork("310260", 366, "EDGE"); assertEquals(0, network.getCount(LINK_TX, 1)); assertEquals(BW_STATS_COUNT_THRESHOLD + 4, network.getCount(LINK_RX, 1)); assertEquals(24_000L * 8 / 1024 * (BW_STATS_COUNT_THRESHOLD + 4), assertEquals(BW_STATS_COUNT_THRESHOLD * 2 - 1, network.getCount(LINK_RX, 1)); assertEquals(24_000L * 8 / 1024 * (BW_STATS_COUNT_THRESHOLD * 2 - 1), network.getValue(LINK_RX, 1)); mNri = new NetworkRegistrationInfo.Builder() .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_UNKNOWN) .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_LTE) .build(); when(mServiceState.getNetworkRegistrationInfo(anyInt(), anyInt())).thenReturn(mNri); mLBE.obtainMessage(MSG_SIGNAL_STRENGTH_CHANGED, mSignalStrength).sendToTarget(); processAllMessages(); for (int i = 0; i < 5; i++) { for (int i = BW_STATS_COUNT_THRESHOLD * 2; i < BW_STATS_COUNT_THRESHOLD * 4; i++) { addTxBytes(1_200_000L); addRxBytes(2_400_000L); addElapsedTime(5_100); moveTimeForward(5_100); processAllMessages(); mLBE.obtainMessage(MSG_MODEM_ACTIVITY_RETURNED, new ModemActivityInfo( i * 5_100L, 0, 0, TX_TIME_2_MS, i * RX_TIME_2_MS * 10)).sendToTarget(); processAllMessages(); } network = mLBE.lookupNetwork("310260", 366, "UNKNOWN"); network = mLBE.lookupNetwork("310260", 366, "LTE"); assertEquals(0, network.getCount(LINK_RX, 1)); assertEquals(BW_STATS_COUNT_THRESHOLD * 2 - 2, network.getCount(LINK_RX, 1)); assertEquals(0, network.getCount(LINK_TX, 1)); } Loading