Pipe data from onWakeupEvent to batterystats
The nflog prefix now also encodes long denoting the network handle which can be used to retrieve the Network object for the network the packet arrived on. This is required by batterystats to attribute the network transport this packet came over. Piping all the relevent details to battery stats for relevant packet wakeup diagnostics. Test: Builds, boots. Manually triggering a wifi wakeup emits the expected log from batterystats. Test: atest FrameworksNetTests Bug: 265742148 Change-Id: Ic08ac2a0d7739f406f2c8dcf75ef58484c823b9f
This commit is contained in:
@@ -31,7 +31,9 @@ import android.net.metrics.DnsEvent;
|
||||
import android.net.metrics.NetworkMetrics;
|
||||
import android.net.metrics.WakeupEvent;
|
||||
import android.net.metrics.WakeupStats;
|
||||
import android.os.BatteryStatsInternal;
|
||||
import android.os.RemoteException;
|
||||
import android.os.SystemClock;
|
||||
import android.text.format.DateUtils;
|
||||
import android.util.ArrayMap;
|
||||
import android.util.Log;
|
||||
@@ -44,6 +46,7 @@ import com.android.internal.util.FrameworkStatsLog;
|
||||
import com.android.internal.util.RingBuffer;
|
||||
import com.android.internal.util.TokenBucket;
|
||||
import com.android.net.module.util.BaseNetdEventListener;
|
||||
import com.android.server.LocalServices;
|
||||
import com.android.server.connectivity.metrics.nano.IpConnectivityLogClass.IpConnectivityEvent;
|
||||
|
||||
import java.io.PrintWriter;
|
||||
@@ -74,7 +77,7 @@ public class NetdEventListenerService extends BaseNetdEventListener {
|
||||
// TODO: dedup this String constant with the one used in
|
||||
// ConnectivityService#wakeupModifyInterface().
|
||||
@VisibleForTesting
|
||||
static final String WAKEUP_EVENT_IFACE_PREFIX = "iface:";
|
||||
static final String WAKEUP_EVENT_PREFIX_DELIM = ":";
|
||||
|
||||
// Array of aggregated DNS and connect events sent by netd, grouped by net id.
|
||||
@GuardedBy("this")
|
||||
@@ -278,17 +281,14 @@ public class NetdEventListenerService extends BaseNetdEventListener {
|
||||
@Override
|
||||
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) {
|
||||
timestampMs = timestampNs / NANOS_PER_MS;
|
||||
} else {
|
||||
timestampMs = System.currentTimeMillis();
|
||||
final String[] prefixParts = prefix.split(WAKEUP_EVENT_PREFIX_DELIM);
|
||||
if (prefixParts.length != 2) {
|
||||
throw new IllegalArgumentException("Prefix " + prefix
|
||||
+ " required in format <nethandle>:<interface>");
|
||||
}
|
||||
|
||||
WakeupEvent event = new WakeupEvent();
|
||||
event.iface = iface;
|
||||
event.timestampMs = timestampMs;
|
||||
final WakeupEvent event = new WakeupEvent();
|
||||
event.iface = prefixParts[1];
|
||||
event.uid = uid;
|
||||
event.ethertype = ethertype;
|
||||
event.dstHwAddr = MacAddress.fromBytes(dstHw);
|
||||
@@ -297,11 +297,25 @@ public class NetdEventListenerService extends BaseNetdEventListener {
|
||||
event.ipNextHeader = ipNextHeader;
|
||||
event.srcPort = srcPort;
|
||||
event.dstPort = dstPort;
|
||||
if (timestampNs > 0) {
|
||||
event.timestampMs = timestampNs / NANOS_PER_MS;
|
||||
} else {
|
||||
event.timestampMs = System.currentTimeMillis();
|
||||
}
|
||||
addWakeupEvent(event);
|
||||
|
||||
String dstMac = event.dstHwAddr.toString();
|
||||
final BatteryStatsInternal bsi = LocalServices.getService(BatteryStatsInternal.class);
|
||||
if (bsi != null) {
|
||||
final long netHandle = Long.parseLong(prefixParts[0]);
|
||||
final long elapsedMs = SystemClock.elapsedRealtime() + event.timestampMs
|
||||
- System.currentTimeMillis();
|
||||
bsi.noteCpuWakingNetworkPacket(Network.fromNetworkHandle(netHandle), elapsedMs,
|
||||
event.uid);
|
||||
}
|
||||
|
||||
final String dstMac = event.dstHwAddr.toString();
|
||||
FrameworkStatsLog.write(FrameworkStatsLog.PACKET_WAKEUP_OCCURRED,
|
||||
uid, iface, ethertype, dstMac, srcIp, dstIp, ipNextHeader, srcPort, dstPort);
|
||||
uid, event.iface, ethertype, dstMac, srcIp, dstIp, ipNextHeader, srcPort, dstPort);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
Reference in New Issue
Block a user