diff --git a/services/core/java/com/android/server/connectivity/NetdEventListenerService.java b/services/core/java/com/android/server/connectivity/NetdEventListenerService.java index 3a4aaa76d6336..1f82961efd22f 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