Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 607a5491 authored by Suprabh Shukla's avatar Suprabh Shukla
Browse files

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
parent 64c81721
Loading
Loading
Loading
Loading
+26 −12
Original line number Diff line number Diff line
@@ -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