diff options
| author | 2016-11-10 16:02:58 +0000 | |
|---|---|---|
| committer | 2016-11-10 16:02:58 +0000 | |
| commit | bccf93311cdf5e8cfcd00bdfbf4ccab44ba7b6ab (patch) | |
| tree | 35af832d5cab0dbc456f9411ca7da1b650b35147 | |
| parent | 836e74052e16f4c24c3e7e9eab0dbcaee462986f (diff) | |
| parent | 7872f3986932b169c553f21dc79d74108c3c4eb5 (diff) | |
Merge "Wifi Tx/Rx rate computation"
| -rw-r--r-- | wifi/java/android/net/wifi/WifiInfo.java | 47 |
1 files changed, 36 insertions, 11 deletions
diff --git a/wifi/java/android/net/wifi/WifiInfo.java b/wifi/java/android/net/wifi/WifiInfo.java index 8d5efba8620e..e48f7bdb27ee 100644 --- a/wifi/java/android/net/wifi/WifiInfo.java +++ b/wifi/java/android/net/wifi/WifiInfo.java @@ -22,6 +22,7 @@ import android.net.NetworkInfo.DetailedState; import android.net.NetworkUtils; import android.text.TextUtils; +import java.lang.Math; import java.net.InetAddress; import java.net.Inet4Address; import java.net.UnknownHostException; @@ -136,6 +137,15 @@ public class WifiInfo implements Parcelable { */ public double rxSuccessRate; + private static final long RESET_TIME_STAMP = Long.MIN_VALUE; + private static final long FILTER_TIME_CONSTANT = 3000; + /** + * This factor is used to adjust the rate output under the new algorithm + * such that the result is comparable to the previous algorithm. + */ + private static final long OUTPUT_SCALE_FACTOR = 5000; + private long mLastPacketCountUpdateTimeStamp; + /** * @hide */ @@ -157,10 +167,9 @@ public class WifiInfo implements Parcelable { public int score; /** - * TODO: get actual timestamp and calculate true rates * @hide */ - public void updatePacketRates(WifiLinkLayerStats stats) { + public void updatePacketRates(WifiLinkLayerStats stats, long timeStamp) { if (stats != null) { long txgood = stats.txmpdu_be + stats.txmpdu_bk + stats.txmpdu_vi + stats.txmpdu_vo; long txretries = stats.retries_be + stats.retries_bk @@ -169,18 +178,28 @@ public class WifiInfo implements Parcelable { long txbad = stats.lostmpdu_be + stats.lostmpdu_bk + stats.lostmpdu_vi + stats.lostmpdu_vo; - if (txBad <= txbad + if (mLastPacketCountUpdateTimeStamp != RESET_TIME_STAMP + && mLastPacketCountUpdateTimeStamp < timeStamp + && txBad <= txbad && txSuccess <= txgood && rxSuccess <= rxgood && txRetries <= txretries) { - txBadRate = (txBadRate * 0.5) - + ((double) (txbad - txBad) * 0.5); - txSuccessRate = (txSuccessRate * 0.5) - + ((double) (txgood - txSuccess) * 0.5); - rxSuccessRate = (rxSuccessRate * 0.5) - + ((double) (rxgood - rxSuccess) * 0.5); - txRetriesRate = (txRetriesRate * 0.5) - + ((double) (txretries - txRetries) * 0.5); + long timeDelta = timeStamp - mLastPacketCountUpdateTimeStamp; + double lastSampleWeight = Math.exp(-1.0 * timeDelta / FILTER_TIME_CONSTANT); + double currentSampleWeight = 1.0 - lastSampleWeight; + + txBadRate = txBadRate * lastSampleWeight + + (txbad - txBad) * OUTPUT_SCALE_FACTOR / timeDelta + * currentSampleWeight; + txSuccessRate = txSuccessRate * lastSampleWeight + + (txgood - txSuccess) * OUTPUT_SCALE_FACTOR / timeDelta + * currentSampleWeight; + rxSuccessRate = rxSuccessRate * lastSampleWeight + + (rxgood - rxSuccess) * OUTPUT_SCALE_FACTOR / timeDelta + * currentSampleWeight; + txRetriesRate = txRetriesRate * lastSampleWeight + + (txretries - txRetries) * OUTPUT_SCALE_FACTOR / timeDelta + * currentSampleWeight; } else { txBadRate = 0; txSuccessRate = 0; @@ -191,6 +210,7 @@ public class WifiInfo implements Parcelable { txSuccess = txgood; rxSuccess = rxgood; txRetries = txretries; + mLastPacketCountUpdateTimeStamp = timeStamp; } else { txBad = 0; txSuccess = 0; @@ -200,6 +220,7 @@ public class WifiInfo implements Parcelable { txSuccessRate = 0; rxSuccessRate = 0; txRetriesRate = 0; + mLastPacketCountUpdateTimeStamp = RESET_TIME_STAMP; } } @@ -243,6 +264,7 @@ public class WifiInfo implements Parcelable { mRssi = INVALID_RSSI; mLinkSpeed = -1; mFrequency = -1; + mLastPacketCountUpdateTimeStamp = RESET_TIME_STAMP; } /** @hide */ @@ -268,6 +290,7 @@ public class WifiInfo implements Parcelable { badRssiCount = 0; linkStuckCount = 0; score = 0; + mLastPacketCountUpdateTimeStamp = RESET_TIME_STAMP; } /** @@ -295,6 +318,8 @@ public class WifiInfo implements Parcelable { txRetriesRate = source.txRetriesRate; txSuccessRate = source.txSuccessRate; rxSuccessRate = source.rxSuccessRate; + mLastPacketCountUpdateTimeStamp = + source.mLastPacketCountUpdateTimeStamp; score = source.score; badRssiCount = source.badRssiCount; lowRssiCount = source.lowRssiCount; |