package android.net.metrics;
import android.net.MacAddress;
import android.os.Process;
import android.os.SystemClock;
import android.util.SparseIntArray;
import java.util.StringJoiner;
public class WakeupStats {
private static final int NO_UID = -1;
public final long creationTimeMs = SystemClock.elapsedRealtime();
public final String iface;
public long totalWakeups = 0;
public long rootWakeups = 0;
public long systemWakeups = 0;
public long nonApplicationWakeups = 0;
public long applicationWakeups = 0;
public long noUidWakeups = 0;
public long durationSec = 0;
public long l2UnicastCount = 0;
public long l2MulticastCount = 0;
public long l2BroadcastCount = 0;
public final SparseIntArray ethertypes = new SparseIntArray();
public final SparseIntArray ipNextHeaders = new SparseIntArray();
public WakeupStats(String iface) {
this.iface = iface;
}
public void updateDuration() {
durationSec = (SystemClock.elapsedRealtime() - creationTimeMs) / 1000;
}
public void countEvent(WakeupEvent ev) {
totalWakeups++;
switch (ev.uid) {
case Process.ROOT_UID:
rootWakeups++;
break;
case Process.SYSTEM_UID:
systemWakeups++;
break;
case NO_UID:
noUidWakeups++;
break;
default:
if (ev.uid >= Process.FIRST_APPLICATION_UID) {
applicationWakeups++;
} else {
nonApplicationWakeups++;
}
break;
}
switch (ev.dstHwAddr.getAddressType()) {
case MacAddress.TYPE_UNICAST:
l2UnicastCount++;
break;
case MacAddress.TYPE_MULTICAST:
l2MulticastCount++;
break;
case MacAddress.TYPE_BROADCAST:
l2BroadcastCount++;
break;
default:
break;
}
increment(ethertypes, ev.ethertype);
if (ev.ipNextHeader >= 0) {
increment(ipNextHeaders, ev.ipNextHeader);
}
}
@Override
public String toString() {
updateDuration();
StringJoiner j = new StringJoiner(", ", "WakeupStats(", ")");
j.add(iface);
j.add("" + durationSec + "s");
j.add("total: " + totalWakeups);
j.add("root: " + rootWakeups);
j.add("system: " + systemWakeups);
j.add("apps: " + applicationWakeups);
j.add("non-apps: " + nonApplicationWakeups);
j.add("no uid: " + noUidWakeups);
j.add(String.format("l2 unicast/multicast/broadcast: %d/%d/%d",
l2UnicastCount, l2MulticastCount, l2BroadcastCount));
for (int i = 0; i < ethertypes.size(); i++) {
int eth = ethertypes.keyAt(i);
int count = ethertypes.valueAt(i);
j.add(String.format("ethertype 0x%x: %d", eth, count));
}
for (int i = 0; i < ipNextHeaders.size(); i++) {
int proto = ipNextHeaders.keyAt(i);
int count = ipNextHeaders.valueAt(i);
j.add(String.format("ipNxtHdr %d: %d", proto, count));
}
return j.toString();
}
private static void increment(SparseIntArray counters, int key) {
int newcount = counters.get(key, 0) + 1;
counters.put(key, newcount);
}
}