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

Commit affd2a63 authored by Suprabh Shukla's avatar Suprabh Shukla
Browse files

Guard against missing mac addresses in onWakeupEvent

The native code may not send any data for the NFULA_HWADDR on
some networks which can result in an exception. Logging an exception if
this happens over WiFi, as this is not expected.

Test: atest FrameworksNetTests
Test: Manually inspect logs and output of `dumpsys connmetrics`

Bug: 276498460
Change-Id: Iba20ec1f47b682cfff6127eeade0fdbf912945a6
parent e86d8d8b
Loading
Loading
Loading
Loading
+14 −12
Original line number Diff line number Diff line
@@ -80,6 +80,7 @@ public class WakeupStats {
                break;
        }

        if (ev.dstHwAddr != null) {
            switch (ev.dstHwAddr.getAddressType()) {
                case MacAddress.TYPE_UNICAST:
                    l2UnicastCount++;
@@ -93,6 +94,7 @@ public class WakeupStats {
                default:
                    break;
            }
        }

        increment(ethertypes, ev.ethertype);
        if (ev.ipNextHeader >= 0) {
+18 −5
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@ import android.util.SparseArray;

import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.BitUtils;
import com.android.internal.util.FrameworkStatsLog;
import com.android.internal.util.RingBuffer;
@@ -278,6 +279,11 @@ public class NetdEventListenerService extends BaseNetdEventListener {
        }
    }

    private boolean hasWifiTransport(Network network) {
        final NetworkCapabilities nc = mCm.getNetworkCapabilities(network);
        return nc.hasTransport(NetworkCapabilities.TRANSPORT_WIFI);
    }

    @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) {
@@ -286,12 +292,21 @@ public class NetdEventListenerService extends BaseNetdEventListener {
            throw new IllegalArgumentException("Prefix " + prefix
                    + " required in format <nethandle>:<interface>");
        }
        final long netHandle = Long.parseLong(prefixParts[0]);
        final Network network = Network.fromNetworkHandle(netHandle);

        final WakeupEvent event = new WakeupEvent();
        event.iface = prefixParts[1];
        event.uid = uid;
        event.ethertype = ethertype;
        if (ArrayUtils.isEmpty(dstHw)) {
            if (hasWifiTransport(network)) {
                Log.e(TAG, "Empty mac address on WiFi transport, network: " + network);
            }
            event.dstHwAddr = null;
        } else {
            event.dstHwAddr = MacAddress.fromBytes(dstHw);
        }
        event.srcIp = srcIp;
        event.dstIp = dstIp;
        event.ipNextHeader = ipNextHeader;
@@ -306,14 +321,12 @@ public class NetdEventListenerService extends BaseNetdEventListener {

        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);
            bsi.noteCpuWakingNetworkPacket(network, elapsedMs, event.uid);
        }

        final String dstMac = event.dstHwAddr.toString();
        final String dstMac = String.valueOf(event.dstHwAddr);
        FrameworkStatsLog.write(FrameworkStatsLog.PACKET_WAKEUP_OCCURRED,
                uid, event.iface, ethertype, dstMac, srcIp, dstIp, ipNextHeader, srcPort, dstPort);
    }