diff options
author | 2017-10-12 21:33:40 +0900 | |
---|---|---|
committer | 2017-11-12 18:51:28 +0900 | |
commit | d921bce5a6cca1774537be7178d020110cfc0d45 (patch) | |
tree | 8ba2d2ee95bd2841ae67762ac739f1c6541127c1 | |
parent | 8d742759cc025ce4c03baef9d9d0822bd0e5bbf6 (diff) |
Add L2~L4 information to packet wakeup logs and metrics
Example of $ adb shell dumpsys connmetrics list:
...
WakeupStats(wlan0, 21851s, total: 85, root: 0, system: 4, apps: 63, non-apps: 0, no uid: 18, l2 unicast/multicast/broadcast: 85/0/0, ethertype 0x800: 23, ethertype 0x86dd: 62, ipNxtHdr 6: 74, ipNxtHdr 17: 1, ipproto 58: 10)
...
WakeupEvent(06:55:54.094, wlan0, -1, eth=0x800, dstHw=10:e:7e:26:3f:c1, ipNxtHdr=6, srcIp=216.58.200.110, dstIp=100.112.108.29, srcPort=443, dstPort=46878)
WakeupEvent(06:57:14.379, wlan0, -1, eth=0x86dd, dstHw=10:e:7e:26:3f:c1, ipNxtHdr=58, srcIp=ff02::1, dstIp=fe80::fa00:4:fd00:1)
WakeupEvent(06:57:52.786, wlan0, 1000, eth=0x800, dstHw=10:e:7e:26:3f:c1, ipNxtHdr=6, srcIp=172.217.27.67, dstIp=100.112.108.29, srcPort=80, dstPort=49360)
WakeupEvent(06:58:02.919, wlan0, 10004, eth=0x86dd, dstHw=10:e:7e:26:3f:c1, ipNxtHdr=6, srcIp=2401:fa00:4:fd00:a585:13d1:6a23:4fb4, dstIp=2404:6800:4006:809::200a, srcPort=443, dstPort=46197)
WakeupEvent(06:58:05.586, wlan0, 10004, eth=0x86dd, dstHw=10:e:7e:26:3f:c1, ipNxtHdr=6, srcIp=2401:fa00:4:fd00:a585:13d1:6a23:4fb4, dstIp=2404:6800:4006:803::200a, srcPort=443, dstPort=46096)
Bug: 66869042
Test: runtest frameworks-net
+ manual testing by monitoring $ dumpsys connmetrics list
Change-Id: I03215c0c9fb7feda3e6ceb1b916f61f4ffb15344
8 files changed, 295 insertions, 92 deletions
diff --git a/core/java/android/net/metrics/WakeupEvent.java b/core/java/android/net/metrics/WakeupEvent.java index cbf3fc8c81da..8f1a5c42e6ac 100644 --- a/core/java/android/net/metrics/WakeupEvent.java +++ b/core/java/android/net/metrics/WakeupEvent.java @@ -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(); } } diff --git a/core/java/android/net/metrics/WakeupStats.java b/core/java/android/net/metrics/WakeupStats.java index 97e83f969c38..1ba97771b595 100644 --- a/core/java/android/net/metrics/WakeupStats.java +++ b/core/java/android/net/metrics/WakeupStats.java @@ -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); } } diff --git a/proto/src/ipconnectivity.proto b/proto/src/ipconnectivity.proto index 82a341567f18..7979302ae24a 100644 --- a/proto/src/ipconnectivity.proto +++ b/proto/src/ipconnectivity.proto @@ -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. diff --git a/services/core/java/com/android/server/connectivity/IpConnectivityEventBuilder.java b/services/core/java/com/android/server/connectivity/IpConnectivityEventBuilder.java index a011692be37c..2dfee11815a4 100644 --- a/services/core/java/com/android/server/connectivity/IpConnectivityEventBuilder.java +++ b/services/core/java/com/android/server/connectivity/IpConnectivityEventBuilder.java @@ -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; diff --git a/services/core/java/com/android/server/connectivity/NetdEventListenerService.java b/services/core/java/com/android/server/connectivity/NetdEventListenerService.java index 61b11e18e3cd..2489001c8b5b 100644 --- a/services/core/java/com/android/server/connectivity/NetdEventListenerService.java +++ b/services/core/java/com/android/server/connectivity/NetdEventListenerService.java @@ -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. @@ -164,8 +163,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); @@ -179,8 +176,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); @@ -190,11 +185,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) { @@ -203,15 +195,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) { @@ -291,10 +290,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 { diff --git a/tests/net/java/com/android/server/connectivity/IpConnectivityEventBuilderTest.java b/tests/net/java/com/android/server/connectivity/IpConnectivityEventBuilderTest.java index a65bb2436287..05cf85671f4a 100644 --- a/tests/net/java/com/android/server/connectivity/IpConnectivityEventBuilderTest.java +++ b/tests/net/java/com/android/server/connectivity/IpConnectivityEventBuilderTest.java @@ -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", diff --git a/tests/net/java/com/android/server/connectivity/IpConnectivityMetricsTest.java b/tests/net/java/com/android/server/connectivity/IpConnectivityMetricsTest.java index b48ff8da2ba4..10d6deba61df 100644 --- a/tests/net/java/com/android/server/connectivity/IpConnectivityMetricsTest.java +++ b/tests/net/java/com/android/server/connectivity/IpConnectivityMetricsTest.java @@ -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) { diff --git a/tests/net/java/com/android/server/connectivity/NetdEventListenerServiceTest.java b/tests/net/java/com/android/server/connectivity/NetdEventListenerServiceTest.java index 83194d9e6fa9..67805c944943 100644 --- a/tests/net/java/com/android/server/connectivity/NetdEventListenerServiceTest.java +++ b/tests/net/java/com/android/server/connectivity/NetdEventListenerServiceTest.java @@ -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"); } |