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