From 607a549116fa25da3852a0b7bfafaf2dbe7b1bda Mon Sep 17 00:00:00 2001 From: Suprabh Shukla Date: Mon, 23 Jan 2023 02:41:20 -0800 Subject: 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 --- .../connectivity/NetdEventListenerService.java | 38 +++++++++++++++------- 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/services/core/java/com/android/server/connectivity/NetdEventListenerService.java b/services/core/java/com/android/server/connectivity/NetdEventListenerService.java index 3a4aaa76d633..1f82961efd22 100644 --- a/services/core/java/com/android/server/connectivity/NetdEventListenerService.java +++ b/services/core/java/com/android/server/connectivity/NetdEventListenerService.java @@ -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 :"); } - 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 -- cgit v1.2.3-59-g8ed1b