Merge "Add L2~L4 information to packet wakeup logs and metrics"
am: 6ee20ca7d3
Change-Id: I8fea75c477d4b5fbbded7dee2dff8644c6f97241
This commit is contained in:
@@ -16,6 +16,10 @@
|
||||
|
||||
package android.net.metrics;
|
||||
|
||||
import android.net.MacAddress;
|
||||
|
||||
import java.util.StringJoiner;
|
||||
|
||||
/**
|
||||
* An event logged when NFLOG notifies userspace of a wakeup packet for
|
||||
* watched interfaces.
|
||||
@@ -23,12 +27,35 @@ package android.net.metrics;
|
||||
*/
|
||||
public class WakeupEvent {
|
||||
public String iface;
|
||||
public long timestampMs;
|
||||
public int uid;
|
||||
public int ethertype;
|
||||
public byte[] dstHwAddr;
|
||||
public String srcIp;
|
||||
public String dstIp;
|
||||
public int ipNextHeader;
|
||||
public int srcPort;
|
||||
public int dstPort;
|
||||
public long timestampMs;
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return String.format("WakeupEvent(%tT.%tL, %s, uid: %d)",
|
||||
timestampMs, timestampMs, iface, uid);
|
||||
StringJoiner j = new StringJoiner(", ", "WakeupEvent(", ")");
|
||||
j.add(String.format("%tT.%tL", timestampMs, timestampMs));
|
||||
j.add(iface);
|
||||
j.add("uid: " + Integer.toString(uid));
|
||||
j.add("eth=0x" + Integer.toHexString(ethertype));
|
||||
j.add("dstHw=" + MacAddress.stringAddrFromByteAddr(dstHwAddr));
|
||||
if (ipNextHeader > 0) {
|
||||
j.add("ipNxtHdr=" + ipNextHeader);
|
||||
j.add("srcIp=" + srcIp);
|
||||
j.add("dstIp=" + dstIp);
|
||||
if (srcPort > -1) {
|
||||
j.add("srcPort=" + srcPort);
|
||||
}
|
||||
if (dstPort > -1) {
|
||||
j.add("dstPort=" + dstPort);
|
||||
}
|
||||
}
|
||||
return j.toString();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,8 +16,12 @@
|
||||
|
||||
package android.net.metrics;
|
||||
|
||||
import android.net.MacAddress;
|
||||
import android.os.Process;
|
||||
import android.os.SystemClock;
|
||||
import android.util.SparseIntArray;
|
||||
|
||||
import java.util.StringJoiner;
|
||||
|
||||
/**
|
||||
* An event logged per interface and that aggregates WakeupEvents for that interface.
|
||||
@@ -38,6 +42,13 @@ public class WakeupStats {
|
||||
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;
|
||||
}
|
||||
@@ -68,20 +79,56 @@ public class WakeupStats {
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
switch (MacAddress.macAddressType(ev.dstHwAddr)) {
|
||||
case UNICAST:
|
||||
l2UnicastCount++;
|
||||
break;
|
||||
case MULTICAST:
|
||||
l2MulticastCount++;
|
||||
break;
|
||||
case BROADCAST:
|
||||
l2BroadcastCount++;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
increment(ethertypes, ev.ethertype);
|
||||
if (ev.ipNextHeader >= 0) {
|
||||
increment(ipNextHeaders, ev.ipNextHeader);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
updateDuration();
|
||||
return new StringBuilder()
|
||||
.append("WakeupStats(").append(iface)
|
||||
.append(", total: ").append(totalWakeups)
|
||||
.append(", root: ").append(rootWakeups)
|
||||
.append(", system: ").append(systemWakeups)
|
||||
.append(", apps: ").append(applicationWakeups)
|
||||
.append(", non-apps: ").append(nonApplicationWakeups)
|
||||
.append(", no uid: ").append(noUidWakeups)
|
||||
.append(", ").append(durationSec).append("s)")
|
||||
.toString();
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -489,7 +489,7 @@ message NetworkStats {
|
||||
|
||||
// Represents statistics from NFLOG wakeup events due to ingress packets.
|
||||
// Since oc-mr1.
|
||||
// Next tag: 8.
|
||||
// Next tag: 13.
|
||||
message WakeupStats {
|
||||
// The time duration in seconds covered by these stats, for deriving
|
||||
// exact wakeup rates.
|
||||
@@ -517,6 +517,24 @@ message WakeupStats {
|
||||
|
||||
// The total number of wakeup packets with no associated socket or uid.
|
||||
optional int64 no_uid_wakeups = 7;
|
||||
|
||||
// Counts of all different ethertype values from wakeup packets received.
|
||||
repeated Pair ethertype_counts = 8;
|
||||
|
||||
// Counts of all different IP next header values from wakeup packets received.
|
||||
repeated Pair ip_next_header_counts = 9;
|
||||
|
||||
// The total number of wakeup packets whose destination hardware address was
|
||||
// a unicast address.
|
||||
optional int64 l2_unicast_count = 10;
|
||||
|
||||
// The total number of wakeup packets whose destination hardware address was
|
||||
// a multicast address.
|
||||
optional int64 l2_multicast_count = 11;
|
||||
|
||||
// The total number of wakeup packets whose destination hardware address was
|
||||
// a broadcast address.
|
||||
optional int64 l2_broadcast_count = 12;
|
||||
}
|
||||
|
||||
// Represents one of the IP connectivity event defined in this file.
|
||||
|
||||
@@ -128,6 +128,11 @@ final public class IpConnectivityEventBuilder {
|
||||
wakeupStats.nonApplicationWakeups = in.nonApplicationWakeups;
|
||||
wakeupStats.applicationWakeups = in.applicationWakeups;
|
||||
wakeupStats.noUidWakeups = in.noUidWakeups;
|
||||
wakeupStats.l2UnicastCount = in.l2UnicastCount;
|
||||
wakeupStats.l2MulticastCount = in.l2MulticastCount;
|
||||
wakeupStats.l2BroadcastCount = in.l2BroadcastCount;
|
||||
wakeupStats.ethertypeCounts = toPairArray(in.ethertypes);
|
||||
wakeupStats.ipNextHeaderCounts = toPairArray(in.ipNextHeaders);
|
||||
final IpConnectivityEvent out = buildEvent(0, 0, in.iface);
|
||||
out.setWakeupStats(wakeupStats);
|
||||
return out;
|
||||
|
||||
@@ -58,7 +58,6 @@ public class NetdEventListenerService extends INetdEventListener.Stub {
|
||||
|
||||
private static final String TAG = NetdEventListenerService.class.getSimpleName();
|
||||
private static final boolean DBG = false;
|
||||
private static final boolean VDBG = false;
|
||||
|
||||
// Rate limit connect latency logging to 1 measurement per 15 seconds (5760 / day) with maximum
|
||||
// bursts of 5000 measurements.
|
||||
@@ -198,8 +197,6 @@ public class NetdEventListenerService extends INetdEventListener.Stub {
|
||||
public synchronized void onDnsEvent(int netId, int eventType, int returnCode, int latencyMs,
|
||||
String hostname, String[] ipAddresses, int ipAddressesCount, int uid)
|
||||
throws RemoteException {
|
||||
maybeVerboseLog("onDnsEvent(%d, %d, %d, %dms)", netId, eventType, returnCode, latencyMs);
|
||||
|
||||
long timestamp = System.currentTimeMillis();
|
||||
getMetricsForNetwork(timestamp, netId).addDnsResult(eventType, returnCode, latencyMs);
|
||||
|
||||
@@ -215,8 +212,6 @@ public class NetdEventListenerService extends INetdEventListener.Stub {
|
||||
// This method must not block or perform long-running operations.
|
||||
public synchronized void onConnectEvent(int netId, int error, int latencyMs, String ipAddr,
|
||||
int port, int uid) throws RemoteException {
|
||||
maybeVerboseLog("onConnectEvent(%d, %d, %dms)", netId, error, latencyMs);
|
||||
|
||||
long timestamp = System.currentTimeMillis();
|
||||
getMetricsForNetwork(timestamp, netId).addConnectResult(error, latencyMs, ipAddr);
|
||||
|
||||
@@ -232,11 +227,8 @@ public class NetdEventListenerService extends INetdEventListener.Stub {
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized void onWakeupEvent(String prefix, int uid, int gid, long timestampNs) {
|
||||
maybeVerboseLog("onWakeupEvent(%s, %d, %d, %sns)", prefix, uid, gid, timestampNs);
|
||||
|
||||
// TODO: add ip protocol and port
|
||||
|
||||
public synchronized void onWakeupEvent(String prefix, int uid, int ethertype, int ipNextHeader,
|
||||
byte[] dstHw, String srcIp, String dstIp, int srcPort, int dstPort, long timestampNs) {
|
||||
String iface = prefix.replaceFirst(WAKEUP_EVENT_IFACE_PREFIX, "");
|
||||
final long timestampMs;
|
||||
if (timestampNs > 0) {
|
||||
@@ -245,15 +237,22 @@ public class NetdEventListenerService extends INetdEventListener.Stub {
|
||||
timestampMs = System.currentTimeMillis();
|
||||
}
|
||||
|
||||
addWakeupEvent(iface, timestampMs, uid);
|
||||
}
|
||||
|
||||
@GuardedBy("this")
|
||||
private void addWakeupEvent(String iface, long timestampMs, int uid) {
|
||||
WakeupEvent event = new WakeupEvent();
|
||||
event.iface = iface;
|
||||
event.timestampMs = timestampMs;
|
||||
event.uid = uid;
|
||||
event.ethertype = ethertype;
|
||||
event.dstHwAddr = dstHw;
|
||||
event.srcIp = srcIp;
|
||||
event.dstIp = dstIp;
|
||||
event.ipNextHeader = ipNextHeader;
|
||||
event.srcPort = srcPort;
|
||||
event.dstPort = dstPort;
|
||||
addWakeupEvent(event);
|
||||
}
|
||||
|
||||
private void addWakeupEvent(WakeupEvent event) {
|
||||
String iface = event.iface;
|
||||
mWakeupEvents.append(event);
|
||||
WakeupStats stats = mWakeupStats.get(iface);
|
||||
if (stats == null) {
|
||||
@@ -333,10 +332,6 @@ public class NetdEventListenerService extends INetdEventListener.Stub {
|
||||
if (DBG) Log.d(TAG, String.format(s, args));
|
||||
}
|
||||
|
||||
private static void maybeVerboseLog(String s, Object... args) {
|
||||
if (VDBG) Log.d(TAG, String.format(s, args));
|
||||
}
|
||||
|
||||
/** Helper class for buffering summaries of NetworkMetrics at regular time intervals */
|
||||
static class NetworkMetricsSnapshot {
|
||||
|
||||
|
||||
@@ -508,6 +508,13 @@ public class IpConnectivityEventBuilderTest {
|
||||
stats.rootWakeups = 2;
|
||||
stats.systemWakeups = 3;
|
||||
stats.noUidWakeups = 3;
|
||||
stats.l2UnicastCount = 5;
|
||||
stats.l2MulticastCount = 1;
|
||||
stats.l2BroadcastCount = 2;
|
||||
stats.ethertypes.put(0x800, 3);
|
||||
stats.ethertypes.put(0x86dd, 3);
|
||||
stats.ipNextHeaders.put(6, 5);
|
||||
|
||||
|
||||
IpConnectivityEvent got = IpConnectivityEventBuilder.toProto(stats);
|
||||
String want = String.join("\n",
|
||||
@@ -521,6 +528,21 @@ public class IpConnectivityEventBuilderTest {
|
||||
" wakeup_stats <",
|
||||
" application_wakeups: 5",
|
||||
" duration_sec: 0",
|
||||
" ethertype_counts <",
|
||||
" key: 2048",
|
||||
" value: 3",
|
||||
" >",
|
||||
" ethertype_counts <",
|
||||
" key: 34525",
|
||||
" value: 3",
|
||||
" >",
|
||||
" ip_next_header_counts <",
|
||||
" key: 6",
|
||||
" value: 5",
|
||||
" >",
|
||||
" l2_broadcast_count: 2",
|
||||
" l2_multicast_count: 1",
|
||||
" l2_unicast_count: 5",
|
||||
" no_uid_wakeups: 3",
|
||||
" non_application_wakeups: 1",
|
||||
" root_wakeups: 2",
|
||||
|
||||
@@ -78,6 +78,9 @@ public class IpConnectivityMetricsTest {
|
||||
private static final String EXAMPLE_IPV4 = "192.0.2.1";
|
||||
private static final String EXAMPLE_IPV6 = "2001:db8:1200::2:1";
|
||||
|
||||
private static final byte[] MAC_ADDR =
|
||||
{(byte)0x84, (byte)0xc9, (byte)0xb2, (byte)0x6a, (byte)0xed, (byte)0x4b};
|
||||
|
||||
@Mock Context mCtx;
|
||||
@Mock IIpConnectivityMetrics mMockService;
|
||||
@Mock ConnectivityManager mCm;
|
||||
@@ -351,13 +354,21 @@ public class IpConnectivityMetricsTest {
|
||||
dnsEvent(101, EVENT_GETHOSTBYNAME, 0, 34);
|
||||
|
||||
// iface, uid
|
||||
wakeupEvent("wlan0", 1000);
|
||||
wakeupEvent("rmnet0", 10123);
|
||||
wakeupEvent("wlan0", 1000);
|
||||
wakeupEvent("rmnet0", 10008);
|
||||
wakeupEvent("wlan0", -1);
|
||||
wakeupEvent("wlan0", 10008);
|
||||
wakeupEvent("rmnet0", 1000);
|
||||
final byte[] mac = {0x48, 0x7c, 0x2b, 0x6a, 0x3e, 0x4b};
|
||||
final String srcIp = "192.168.2.1";
|
||||
final String dstIp = "192.168.2.23";
|
||||
final int sport = 2356;
|
||||
final int dport = 13489;
|
||||
final long now = 1001L;
|
||||
final int v4 = 0x800;
|
||||
final int tcp = 6;
|
||||
final int udp = 17;
|
||||
wakeupEvent("wlan0", 1000, v4, tcp, mac, srcIp, dstIp, sport, dport, 1001L);
|
||||
wakeupEvent("wlan0", 10123, v4, tcp, mac, srcIp, dstIp, sport, dport, 1001L);
|
||||
wakeupEvent("wlan0", 1000, v4, udp, mac, srcIp, dstIp, sport, dport, 1001L);
|
||||
wakeupEvent("wlan0", 10008, v4, udp, mac, srcIp, dstIp, sport, dport, 1001L);
|
||||
wakeupEvent("wlan0", -1, v4, udp, mac, srcIp, dstIp, sport, dport, 1001L);
|
||||
wakeupEvent("wlan0", 10008, v4, tcp, mac, srcIp, dstIp, sport, dport, 1001L);
|
||||
|
||||
long timeMs = mService.mDefaultNetworkMetrics.creationTimeMs;
|
||||
final long cell = BitUtils.packBits(new int[]{NetworkCapabilities.TRANSPORT_CELLULAR});
|
||||
@@ -560,34 +571,33 @@ public class IpConnectivityMetricsTest {
|
||||
">",
|
||||
"events <",
|
||||
" if_name: \"\"",
|
||||
" link_layer: 2",
|
||||
" network_id: 0",
|
||||
" time_ms: 0",
|
||||
" transports: 0",
|
||||
" wakeup_stats <",
|
||||
" application_wakeups: 2",
|
||||
" duration_sec: 0",
|
||||
" no_uid_wakeups: 0",
|
||||
" non_application_wakeups: 0",
|
||||
" root_wakeups: 0",
|
||||
" system_wakeups: 1",
|
||||
" total_wakeups: 3",
|
||||
" >",
|
||||
">",
|
||||
"events <",
|
||||
" if_name: \"\"",
|
||||
" link_layer: 4",
|
||||
" network_id: 0",
|
||||
" time_ms: 0",
|
||||
" transports: 0",
|
||||
" wakeup_stats <",
|
||||
" application_wakeups: 1",
|
||||
" application_wakeups: 3",
|
||||
" duration_sec: 0",
|
||||
" ethertype_counts <",
|
||||
" key: 2048",
|
||||
" value: 6",
|
||||
" >",
|
||||
" ip_next_header_counts <",
|
||||
" key: 6",
|
||||
" value: 3",
|
||||
" >",
|
||||
" ip_next_header_counts <",
|
||||
" key: 17",
|
||||
" value: 3",
|
||||
" >",
|
||||
" l2_broadcast_count: 0",
|
||||
" l2_multicast_count: 0",
|
||||
" l2_unicast_count: 6",
|
||||
" no_uid_wakeups: 1",
|
||||
" non_application_wakeups: 0",
|
||||
" root_wakeups: 0",
|
||||
" system_wakeups: 2",
|
||||
" total_wakeups: 4",
|
||||
" total_wakeups: 6",
|
||||
" >",
|
||||
">",
|
||||
"version: 2\n");
|
||||
@@ -610,9 +620,10 @@ public class IpConnectivityMetricsTest {
|
||||
mNetdListener.onDnsEvent(netId, type, result, latency, "", null, 0, 0);
|
||||
}
|
||||
|
||||
void wakeupEvent(String iface, int uid) throws Exception {
|
||||
void wakeupEvent(String iface, int uid, int ether, int ip, byte[] mac, String srcIp,
|
||||
String dstIp, int sport, int dport, long now) throws Exception {
|
||||
String prefix = NetdEventListenerService.WAKEUP_EVENT_IFACE_PREFIX + iface;
|
||||
mNetdListener.onWakeupEvent(prefix, uid, uid, 0);
|
||||
mNetdListener.onWakeupEvent(prefix, uid, ether, ip, mac, srcIp, dstIp, sport, dport, now);
|
||||
}
|
||||
|
||||
NetworkAgentInfo makeNai(int netId, int score, boolean ipv4, boolean ipv6, long transports) {
|
||||
|
||||
@@ -61,7 +61,10 @@ public class NetdEventListenerServiceTest {
|
||||
private static final String EXAMPLE_IPV4 = "192.0.2.1";
|
||||
private static final String EXAMPLE_IPV6 = "2001:db8:1200::2:1";
|
||||
|
||||
NetdEventListenerService mNetdEventListenerService;
|
||||
private static final byte[] MAC_ADDR =
|
||||
{(byte)0x84, (byte)0xc9, (byte)0xb2, (byte)0x6a, (byte)0xed, (byte)0x4b};
|
||||
|
||||
NetdEventListenerService mService;
|
||||
ConnectivityManager mCm;
|
||||
|
||||
@Before
|
||||
@@ -75,28 +78,49 @@ public class NetdEventListenerServiceTest {
|
||||
when(mCm.getNetworkCapabilities(new Network(100))).thenReturn(ncWifi);
|
||||
when(mCm.getNetworkCapabilities(new Network(101))).thenReturn(ncCell);
|
||||
|
||||
mNetdEventListenerService = new NetdEventListenerService(mCm);
|
||||
mService = new NetdEventListenerService(mCm);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testWakeupEventLogging() throws Exception {
|
||||
final int BUFFER_LENGTH = NetdEventListenerService.WAKEUP_EVENT_BUFFER_LENGTH;
|
||||
final long now = System.currentTimeMillis();
|
||||
final String iface = "wlan0";
|
||||
final byte[] mac = MAC_ADDR;
|
||||
final String srcIp = "192.168.2.1";
|
||||
final String dstIp = "192.168.2.23";
|
||||
final String srcIp6 = "2001:db8:4:fd00:a585:13d1:6a23:4fb4";
|
||||
final String dstIp6 = "2001:db8:4006:807::200a";
|
||||
final int sport = 2356;
|
||||
final int dport = 13489;
|
||||
|
||||
final int v4 = 0x800;
|
||||
final int v6 = 0x86dd;
|
||||
final int tcp = 6;
|
||||
final int udp = 17;
|
||||
final int icmp6 = 58;
|
||||
|
||||
// Baseline without any event
|
||||
String[] baseline = listNetdEvent();
|
||||
|
||||
long now = System.currentTimeMillis();
|
||||
String prefix = "iface:wlan0";
|
||||
int[] uids = { 10001, 10002, 10004, 1000, 10052, 10023, 10002, 10123, 10004 };
|
||||
for (int uid : uids) {
|
||||
mNetdEventListenerService.onWakeupEvent(prefix, uid, uid, now);
|
||||
}
|
||||
int[] uids = {10001, 10002, 10004, 1000, 10052, 10023, 10002, 10123, 10004};
|
||||
wakeupEvent(iface, uids[0], v4, tcp, mac, srcIp, dstIp, sport, dport, now);
|
||||
wakeupEvent(iface, uids[1], v6, udp, mac, srcIp6, dstIp6, sport, dport, now);
|
||||
wakeupEvent(iface, uids[2], v6, udp, mac, srcIp6, dstIp6, sport, dport, now);
|
||||
wakeupEvent(iface, uids[3], v4, icmp6, mac, srcIp, dstIp, sport, dport, now);
|
||||
wakeupEvent(iface, uids[4], v6, tcp, mac, srcIp6, dstIp6, sport, dport, now);
|
||||
wakeupEvent(iface, uids[5], v4, tcp, mac, srcIp, dstIp, sport, dport, now);
|
||||
wakeupEvent(iface, uids[6], v6, udp, mac, srcIp6, dstIp6, sport, dport, now);
|
||||
wakeupEvent(iface, uids[7], v6, tcp, mac, srcIp6, dstIp6, sport, dport, now);
|
||||
wakeupEvent(iface, uids[8], v6, udp, mac, srcIp6, dstIp6, sport, dport, now);
|
||||
|
||||
String[] events2 = remove(listNetdEvent(), baseline);
|
||||
int expectedLength2 = uids.length + 1; // +1 for the WakeupStats line
|
||||
assertEquals(expectedLength2, events2.length);
|
||||
assertContains(events2[0], "WakeupStats");
|
||||
assertContains(events2[0], "wlan0");
|
||||
assertContains(events2[0], "0x800");
|
||||
assertContains(events2[0], "0x86dd");
|
||||
for (int i = 0; i < uids.length; i++) {
|
||||
String got = events2[i+1];
|
||||
assertContains(got, "WakeupEvent");
|
||||
@@ -107,7 +131,7 @@ public class NetdEventListenerServiceTest {
|
||||
int uid = 20000;
|
||||
for (int i = 0; i < BUFFER_LENGTH * 2; i++) {
|
||||
long ts = now + 10;
|
||||
mNetdEventListenerService.onWakeupEvent(prefix, uid, uid, ts);
|
||||
wakeupEvent(iface, uid, 0x800, 6, mac, srcIp, dstIp, 23, 24, ts);
|
||||
}
|
||||
|
||||
String[] events3 = remove(listNetdEvent(), baseline);
|
||||
@@ -123,7 +147,7 @@ public class NetdEventListenerServiceTest {
|
||||
}
|
||||
|
||||
uid = 45678;
|
||||
mNetdEventListenerService.onWakeupEvent(prefix, uid, uid, now);
|
||||
wakeupEvent(iface, uid, 0x800, 6, mac, srcIp, dstIp, 23, 24, now);
|
||||
|
||||
String[] events4 = remove(listNetdEvent(), baseline);
|
||||
String lastEvent = events4[events4.length - 1];
|
||||
@@ -134,21 +158,36 @@ public class NetdEventListenerServiceTest {
|
||||
|
||||
@Test
|
||||
public void testWakeupStatsLogging() throws Exception {
|
||||
wakeupEvent("wlan0", 1000);
|
||||
wakeupEvent("rmnet0", 10123);
|
||||
wakeupEvent("wlan0", 1000);
|
||||
wakeupEvent("rmnet0", 10008);
|
||||
wakeupEvent("wlan0", -1);
|
||||
wakeupEvent("wlan0", 10008);
|
||||
wakeupEvent("rmnet0", 1000);
|
||||
wakeupEvent("wlan0", 10004);
|
||||
wakeupEvent("wlan0", 1000);
|
||||
wakeupEvent("wlan0", 0);
|
||||
wakeupEvent("wlan0", -1);
|
||||
wakeupEvent("rmnet0", 10052);
|
||||
wakeupEvent("wlan0", 0);
|
||||
wakeupEvent("rmnet0", 1000);
|
||||
wakeupEvent("wlan0", 1010);
|
||||
final byte[] mac = MAC_ADDR;
|
||||
final String srcIp = "192.168.2.1";
|
||||
final String dstIp = "192.168.2.23";
|
||||
final String srcIp6 = "2401:fa00:4:fd00:a585:13d1:6a23:4fb4";
|
||||
final String dstIp6 = "2404:6800:4006:807::200a";
|
||||
final int sport = 2356;
|
||||
final int dport = 13489;
|
||||
final long now = 1001L;
|
||||
|
||||
final int v4 = 0x800;
|
||||
final int v6 = 0x86dd;
|
||||
final int tcp = 6;
|
||||
final int udp = 17;
|
||||
final int icmp6 = 58;
|
||||
|
||||
wakeupEvent("wlan0", 1000, v4, tcp, mac, srcIp, dstIp, sport, dport, now);
|
||||
wakeupEvent("rmnet0", 10123, v4, tcp, mac, srcIp, dstIp, sport, dport, now);
|
||||
wakeupEvent("wlan0", 1000, v4, udp, mac, srcIp, dstIp, sport, dport, now);
|
||||
wakeupEvent("rmnet0", 10008, v4, tcp, mac, srcIp, dstIp, sport, dport, now);
|
||||
wakeupEvent("wlan0", -1, v6, icmp6, mac, srcIp6, dstIp6, sport, dport, now);
|
||||
wakeupEvent("wlan0", 10008, v4, tcp, mac, srcIp, dstIp, sport, dport, now);
|
||||
wakeupEvent("rmnet0", 1000, v4, tcp, mac, srcIp, dstIp, sport, dport, now);
|
||||
wakeupEvent("wlan0", 10004, v4, udp, mac, srcIp, dstIp, sport, dport, now);
|
||||
wakeupEvent("wlan0", 1000, v6, tcp, mac, srcIp6, dstIp6, sport, dport, now);
|
||||
wakeupEvent("wlan0", 0, v6, udp, mac, srcIp6, dstIp6, sport, dport, now);
|
||||
wakeupEvent("wlan0", -1, v6, icmp6, mac, srcIp6, dstIp6, sport, dport, now);
|
||||
wakeupEvent("rmnet0", 10052, v4, tcp, mac, srcIp, dstIp, sport, dport, now);
|
||||
wakeupEvent("wlan0", 0, v6, udp, mac, srcIp6, dstIp6, sport, dport, now);
|
||||
wakeupEvent("rmnet0", 1000, v6, tcp, mac, srcIp6, dstIp6, sport, dport, now);
|
||||
wakeupEvent("wlan0", 1010, v4, udp, mac, srcIp, dstIp, sport, dport, now);
|
||||
|
||||
String got = flushStatistics();
|
||||
String want = String.join("\n",
|
||||
@@ -162,6 +201,21 @@ public class NetdEventListenerServiceTest {
|
||||
" wakeup_stats <",
|
||||
" application_wakeups: 3",
|
||||
" duration_sec: 0",
|
||||
" ethertype_counts <",
|
||||
" key: 2048",
|
||||
" value: 4",
|
||||
" >",
|
||||
" ethertype_counts <",
|
||||
" key: 34525",
|
||||
" value: 1",
|
||||
" >",
|
||||
" ip_next_header_counts <",
|
||||
" key: 6",
|
||||
" value: 5",
|
||||
" >",
|
||||
" l2_broadcast_count: 0",
|
||||
" l2_multicast_count: 0",
|
||||
" l2_unicast_count: 5",
|
||||
" no_uid_wakeups: 0",
|
||||
" non_application_wakeups: 0",
|
||||
" root_wakeups: 0",
|
||||
@@ -178,6 +232,29 @@ public class NetdEventListenerServiceTest {
|
||||
" wakeup_stats <",
|
||||
" application_wakeups: 2",
|
||||
" duration_sec: 0",
|
||||
" ethertype_counts <",
|
||||
" key: 2048",
|
||||
" value: 5",
|
||||
" >",
|
||||
" ethertype_counts <",
|
||||
" key: 34525",
|
||||
" value: 5",
|
||||
" >",
|
||||
" ip_next_header_counts <",
|
||||
" key: 6",
|
||||
" value: 3",
|
||||
" >",
|
||||
" ip_next_header_counts <",
|
||||
" key: 17",
|
||||
" value: 5",
|
||||
" >",
|
||||
" ip_next_header_counts <",
|
||||
" key: 58",
|
||||
" value: 2",
|
||||
" >",
|
||||
" l2_broadcast_count: 0",
|
||||
" l2_multicast_count: 0",
|
||||
" l2_unicast_count: 10",
|
||||
" no_uid_wakeups: 2",
|
||||
" non_application_wakeups: 1",
|
||||
" root_wakeups: 2",
|
||||
@@ -401,7 +478,7 @@ public class NetdEventListenerServiceTest {
|
||||
Thread connectEventAction(int netId, int error, int latencyMs, String ipAddr) {
|
||||
return new Thread(() -> {
|
||||
try {
|
||||
mNetdEventListenerService.onConnectEvent(netId, error, latencyMs, ipAddr, 80, 1);
|
||||
mService.onConnectEvent(netId, error, latencyMs, ipAddr, 80, 1);
|
||||
} catch (Exception e) {
|
||||
fail(e.toString());
|
||||
}
|
||||
@@ -409,12 +486,13 @@ public class NetdEventListenerServiceTest {
|
||||
}
|
||||
|
||||
void dnsEvent(int netId, int type, int result, int latency) throws Exception {
|
||||
mNetdEventListenerService.onDnsEvent(netId, type, result, latency, "", null, 0, 0);
|
||||
mService.onDnsEvent(netId, type, result, latency, "", null, 0, 0);
|
||||
}
|
||||
|
||||
void wakeupEvent(String iface, int uid) throws Exception {
|
||||
void wakeupEvent(String iface, int uid, int ether, int ip, byte[] mac, String srcIp,
|
||||
String dstIp, int sport, int dport, long now) throws Exception {
|
||||
String prefix = NetdEventListenerService.WAKEUP_EVENT_IFACE_PREFIX + iface;
|
||||
mNetdEventListenerService.onWakeupEvent(prefix, uid, uid, 0);
|
||||
mService.onWakeupEvent(prefix, uid, ether, ip, mac, srcIp, dstIp, sport, dport, now);
|
||||
}
|
||||
|
||||
void asyncDump(long durationMs) throws Exception {
|
||||
@@ -422,7 +500,7 @@ public class NetdEventListenerServiceTest {
|
||||
final PrintWriter pw = new PrintWriter(new FileOutputStream("/dev/null"));
|
||||
new Thread(() -> {
|
||||
while (System.currentTimeMillis() < stop) {
|
||||
mNetdEventListenerService.list(pw);
|
||||
mService.list(pw);
|
||||
}
|
||||
}).start();
|
||||
}
|
||||
@@ -431,7 +509,7 @@ public class NetdEventListenerServiceTest {
|
||||
String flushStatistics() throws Exception {
|
||||
IpConnectivityMetrics metricsService =
|
||||
new IpConnectivityMetrics(mock(Context.class), (ctx) -> 2000);
|
||||
metricsService.mNetdListener = mNetdEventListenerService;
|
||||
metricsService.mNetdListener = mService;
|
||||
|
||||
StringWriter buffer = new StringWriter();
|
||||
PrintWriter writer = new PrintWriter(buffer);
|
||||
@@ -453,7 +531,7 @@ public class NetdEventListenerServiceTest {
|
||||
String[] listNetdEvent() throws Exception {
|
||||
StringWriter buffer = new StringWriter();
|
||||
PrintWriter writer = new PrintWriter(buffer);
|
||||
mNetdEventListenerService.list(writer);
|
||||
mService.list(writer);
|
||||
return buffer.toString().split("\\n");
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user