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

Commit df456e13 authored by Hugo Benichi's avatar Hugo Benichi
Browse files

Connectivity metrics: add transports pretty printing

This patch also
  - partially reverts commit f927f0c5
    that exposed a getTransports method on NetworkCapabilities.
  - moves enumerateBits to BitUtils (as unpackBits), and adds the
    reverse packBit method.

Bug: 34901696
Test: manually looked at $ adb shell dumpsys connmetrics list
Change-Id: Id04f9080e7f75608deeb49306aec34941e71794c
parent 193743ad
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package android.net;

import android.os.Parcel;
import android.os.Parcelable;
import com.android.internal.util.BitUtils;

/**
 * Represents a core networking event defined in package android.net.metrics.
@@ -78,13 +79,15 @@ public final class ConnectivityMetricsEvent implements Parcelable {
    public String toString() {
        StringBuilder buffer = new StringBuilder("ConnectivityMetricsEvent(");
        buffer.append(String.format("%tT.%tL", timestamp, timestamp));
        // TODO: add transports
        if (netId != 0) {
            buffer.append(", ").append(netId);
        }
        if (ifname != null) {
            buffer.append(", ").append(ifname);
        }
        for (int t : BitUtils.unpackBits(transports)) {
            buffer.append(", ").append(NetworkCapabilities.transportNameOf(t));
        }
        buffer.append("): ").append(data.toString());
        return buffer.toString();
    }
+30 −39
Original line number Diff line number Diff line
@@ -18,7 +18,8 @@ package android.net;

import android.os.Parcel;
import android.os.Parcelable;
import android.util.Log;

import com.android.internal.util.BitUtils;

import java.util.Objects;

@@ -279,7 +280,7 @@ public final class NetworkCapabilities implements Parcelable {
     * @hide
     */
    public int[] getCapabilities() {
        return enumerateBits(mNetworkCapabilities);
        return BitUtils.unpackBits(mNetworkCapabilities);
    }

    /**
@@ -295,19 +296,6 @@ public final class NetworkCapabilities implements Parcelable {
        return ((mNetworkCapabilities & (1 << capability)) != 0);
    }

    private int[] enumerateBits(long val) {
        int size = Long.bitCount(val);
        int[] result = new int[size];
        int index = 0;
        int resource = 0;
        while (val > 0) {
            if ((val & 1) == 1) result[index++] = resource;
            val = val >> 1;
            resource++;
        }
        return result;
    }

    private void combineNetCapabilities(NetworkCapabilities nc) {
        this.mNetworkCapabilities |= nc.mNetworkCapabilities;
    }
@@ -418,6 +406,15 @@ public final class NetworkCapabilities implements Parcelable {
    /** @hide */
    public static final int MAX_TRANSPORT = TRANSPORT_WIFI_AWARE;

    private static final String[] TRANSPORT_NAMES = {
        "CELLULAR",
        "WIFI",
        "BLUETOOTH",
        "ETHERNET",
        "VPN",
        "WIFI_AWARE"
    };

    /**
     * Adds the given transport type to this {@code NetworkCapability} instance.
     * Multiple transports may be applied sequentially.  Note that when searching
@@ -464,18 +461,7 @@ public final class NetworkCapabilities implements Parcelable {
     * @hide
     */
    public int[] getTransportTypes() {
        return enumerateBits(mTransportTypes);
    }

    /**
     * Gets all the transports set on this {@code NetworkCapability} instance.
     *
     * @return a bit field composed of up bits at indexes defined by
     * {@code NetworkCapabilities.TRANSPORT_*} values for this instance.
     * @hide
     */
    public long getTransports() {
        return mTransportTypes;
        return BitUtils.unpackBits(mTransportTypes);
    }

    /**
@@ -882,18 +868,23 @@ public final class NetworkCapabilities implements Parcelable {
     * @hide
     */
    public static String transportNamesOf(int[] types) {
        String transports = "";
        for (int i = 0; i < types.length;) {
            switch (types[i]) {
                case TRANSPORT_CELLULAR:    transports += "CELLULAR"; break;
                case TRANSPORT_WIFI:        transports += "WIFI"; break;
                case TRANSPORT_BLUETOOTH:   transports += "BLUETOOTH"; break;
                case TRANSPORT_ETHERNET:    transports += "ETHERNET"; break;
                case TRANSPORT_VPN:         transports += "VPN"; break;
                case TRANSPORT_WIFI_AWARE:  transports += "WIFI_AWARE"; break;
        if (types == null || types.length == 0) {
            return "";
        }
        StringBuilder transports = new StringBuilder();
        for (int t : types) {
            transports.append("|").append(transportNameOf(t));
        }
            if (++i < types.length) transports += "|";
        return transports.substring(1);
    }

    /**
     * @hide
     */
    public static String transportNameOf(int transport) {
        if (transport < 0 || TRANSPORT_NAMES.length <= transport) {
            return "UNKNOWN";
        }
        return transports;
        return TRANSPORT_NAMES[transport];
    }
}
+3 −2
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import android.os.RemoteException;
import android.os.ServiceManager;
import android.util.Log;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.BitUtils;

/**
 * Class for logging IpConnectvity events with IpConnectivityMetrics
@@ -117,10 +118,10 @@ public class IpConnectivityLog {
     * @param data is a Parcelable instance representing the event.
     * @return true if the event was successfully logged.
     */
    public boolean log(int netid, long transports, Parcelable data) {
    public boolean log(int netid, int[] transports, Parcelable data) {
        ConnectivityMetricsEvent ev = makeEv(data);
        ev.netId = netid;
        ev.transports = transports;
        ev.transports = BitUtils.packBits(transports);
        return log(ev);
    }

+21 −0
Original line number Diff line number Diff line
@@ -55,4 +55,25 @@ public class BitUtils {
                && maskedEquals(a.getMostSignificantBits(), b.getMostSignificantBits(),
                    mask.getMostSignificantBits());
    }

    public static int[] unpackBits(long val) {
        int size = Long.bitCount(val);
        int[] result = new int[size];
        int index = 0;
        int bitPos = 0;
        while (val > 0) {
            if ((val & 1) == 1) result[index++] = bitPos;
            val = val >> 1;
            bitPos++;
        }
        return result;
    }

    public static long packBits(int[] bits) {
        long packed = 0;
        for (int b : bits) {
            packed |= (1 << b);
        }
        return packed;
    }
}
+0 −1
Original line number Diff line number Diff line
@@ -52,7 +52,6 @@ public class NetdEventListenerService extends INetdEventListener.Stub {
    private static final boolean DBG = false;
    private static final boolean VDBG = false;

    // TODO: read this constant from system property
    private static final int MAX_LOOKUPS_PER_DNS_EVENT = 100;

    // Rate limit connect latency logging to 1 measurement per 15 seconds (5760 / day) with maximum
Loading