summaryrefslogtreecommitdiff
path: root/src/android/net
diff options
context:
space:
mode:
authorjohnson.yeh <johnson.yeh@mediatek.com>2019-12-19 20:25:02 +0800
committerHongguang Chen <hgchen@google.com>2020-01-06 17:08:08 +0000
commit0eef0004af0ddc38f0c23165b26cea81f465d10c (patch)
tree9e89e21ed1ac78f2afe9d5d62353a0364d2ec908 /src/android/net
parent7b60bfa137ad7ec9213ec4c2169cea4f303e2ce0 (diff)
Add rate-limiting to reduce CPU loading of IpClient
Bug: b/144826001 Test: Build Pass: OK Test: Power ON/OFF: OK Test: Verify CPU loading improvement: OK Change-Id: I412f3db7071672ebc3213dc128bbfc8f8bd2abcc
Diffstat (limited to 'src/android/net')
-rw-r--r--src/android/net/ip/ConnectivityPacketTracker.java18
1 files changed, 18 insertions, 0 deletions
diff --git a/src/android/net/ip/ConnectivityPacketTracker.java b/src/android/net/ip/ConnectivityPacketTracker.java
index dc793cd..bbaf61e 100644
--- a/src/android/net/ip/ConnectivityPacketTracker.java
+++ b/src/android/net/ip/ConnectivityPacketTracker.java
@@ -28,6 +28,7 @@ import android.net.util.InterfaceParams;
import android.net.util.NetworkStackUtils;
import android.net.util.PacketReader;
import android.os.Handler;
+import android.os.SystemClock;
import android.system.ErrnoException;
import android.system.Os;
import android.text.TextUtils;
@@ -35,6 +36,7 @@ import android.util.LocalLog;
import android.util.Log;
import com.android.internal.util.HexDump;
+import com.android.internal.util.TokenBucket;
import java.io.FileDescriptor;
import java.io.IOException;
@@ -63,10 +65,15 @@ public class ConnectivityPacketTracker {
private static final String MARK_STOP = "--- STOP ---";
private static final String MARK_NAMED_START = "--- START (%s) ---";
private static final String MARK_NAMED_STOP = "--- STOP (%s) ---";
+ // Use a TokenBucket to limit CPU usage of logging packets in steady state.
+ private static final int TOKEN_FILL_RATE = 50; // Maximum one packet every 20ms.
+ private static final int MAX_BURST_LENGTH = 100; // Maximum burst 100 packets.
private final String mTag;
private final LocalLog mLog;
private final PacketReader mPacketListener;
+ private final TokenBucket mTokenBucket = new TokenBucket(TOKEN_FILL_RATE, MAX_BURST_LENGTH);
+ private long mLastRateLimitLogTimeMs = 0;
private boolean mRunning;
private String mDisplayName;
@@ -115,6 +122,17 @@ public class ConnectivityPacketTracker {
@Override
protected void handlePacket(byte[] recvbuf, int length) {
+ if (!mTokenBucket.get()) {
+ // Rate limited. Log once every second so the user knows packets are missing.
+ final long now = SystemClock.elapsedRealtime();
+ if (now >= mLastRateLimitLogTimeMs + 1000) {
+ addLogEntry("Warning: too many packets, rate-limiting to one every " +
+ TOKEN_FILL_RATE + "ms");
+ mLastRateLimitLogTimeMs = now;
+ }
+ return;
+ }
+
final String summary = ConnectivityPacketSummary.summarize(
mInterface.macAddr, recvbuf, length);
if (summary == null) return;