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

Commit 1193a9c9 authored by Hugo Benichi's avatar Hugo Benichi
Browse files

Remove Parcelable interface from DefaultNetworkEvent

This patch takes advantage of the direct DefaultNetworkMetrics interface
between ConnectivityService and IpConnectivityMetrics and removes the
Parcelable interface from DefaultNetworkEvent.

IpConnectivityMetrics, IpConnectivityEventBuilder and associated tests
are updated as necessary.

Bug: 34901696
Test: runtest frameworks-net
Change-Id: I59b6e04fc126051320d08a422cfbd4d27042123e
parent 64901e59
Loading
Loading
Loading
Loading
+19 −60
Original line number Original line Diff line number Diff line
@@ -16,56 +16,26 @@


package android.net.metrics;
package android.net.metrics;


import static android.net.ConnectivityManager.NETID_UNSET;

import android.net.NetworkCapabilities;
import android.net.NetworkCapabilities;
import android.os.Parcel;
import android.os.Parcelable;


/**
/**
 * An event recorded by ConnectivityService when there is a change in the default network.
 * An event recorded by ConnectivityService when there is a change in the default network.
 * {@hide}
 * {@hide}
 */
 */
public final class DefaultNetworkEvent implements Parcelable {
public class DefaultNetworkEvent {

    // The ID of the network that has become the new default or NETID_UNSET if none.
    // The ID of the network that has become the new default or NETID_UNSET if none.
    public final int netId;
    public int netId = NETID_UNSET;
    // The list of transport types of the new default network, for example TRANSPORT_WIFI, as
    // The list of transport types of the new default network, for example TRANSPORT_WIFI, as
    // defined in NetworkCapabilities.java.
    // defined in NetworkCapabilities.java.
    public final int[] transportTypes;
    public int[] transportTypes = new int[0];
    // The ID of the network that was the default before or NETID_UNSET if none.
    // The ID of the network that was the default before or NETID_UNSET if none.
    public final int prevNetId;
    public int prevNetId = NETID_UNSET;
    // Whether the previous network had IPv4/IPv6 connectivity.
    // Whether the previous network had IPv4/IPv6 connectivity.
    public final boolean prevIPv4;
    public boolean prevIPv4;
    public final boolean prevIPv6;
    public boolean prevIPv6;

    public DefaultNetworkEvent(int netId, int[] transportTypes,
                int prevNetId, boolean prevIPv4, boolean prevIPv6) {
        this.netId = netId;
        this.transportTypes = transportTypes;
        this.prevNetId = prevNetId;
        this.prevIPv4 = prevIPv4;
        this.prevIPv6 = prevIPv6;
    }

    private DefaultNetworkEvent(Parcel in) {
        this.netId = in.readInt();
        this.transportTypes = in.createIntArray();
        this.prevNetId = in.readInt();
        this.prevIPv4 = (in.readByte() > 0);
        this.prevIPv6 = (in.readByte() > 0);
    }

    @Override
    public void writeToParcel(Parcel out, int flags) {
        out.writeInt(netId);
        out.writeIntArray(transportTypes);
        out.writeInt(prevNetId);
        out.writeByte(prevIPv4 ? (byte) 1 : (byte) 0);
        out.writeByte(prevIPv6 ? (byte) 1 : (byte) 0);
    }

    @Override
    public int describeContents() {
        return 0;
    }


    @Override
    @Override
    public String toString() {
    public String toString() {
@@ -82,7 +52,7 @@ public final class DefaultNetworkEvent implements Parcelable {


    private String ipSupport() {
    private String ipSupport() {
        if (prevIPv4 && prevIPv6) {
        if (prevIPv4 && prevIPv6) {
            return "DUAL";
            return "IPv4v6";
        }
        }
        if (prevIPv6) {
        if (prevIPv6) {
            return "IPv6";
            return "IPv6";
@@ -92,15 +62,4 @@ public final class DefaultNetworkEvent implements Parcelable {
        }
        }
        return "NONE";
        return "NONE";
    }
    }

    public static final Parcelable.Creator<DefaultNetworkEvent> CREATOR
        = new Parcelable.Creator<DefaultNetworkEvent>() {
        public DefaultNetworkEvent createFromParcel(Parcel in) {
            return new DefaultNetworkEvent(in);
        }

        public DefaultNetworkEvent[] newArray(int size) {
            return new DefaultNetworkEvent[size];
        }
    };
}
}
+40 −15
Original line number Original line Diff line number Diff line
@@ -16,38 +16,63 @@


package com.android.server.connectivity;
package com.android.server.connectivity;


import static android.net.ConnectivityManager.NETID_UNSET;

import android.net.LinkProperties;
import android.net.LinkProperties;
import android.net.metrics.DefaultNetworkEvent;
import android.net.metrics.DefaultNetworkEvent;
import android.net.metrics.IpConnectivityLog;
import android.net.metrics.IpConnectivityLog;


import com.android.internal.annotations.GuardedBy;
import com.android.server.connectivity.metrics.nano.IpConnectivityLogClass.IpConnectivityEvent;

import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

/**
/**
 * Tracks events related to the default network for the purpose of default network metrics.
 * Tracks events related to the default network for the purpose of default network metrics.
 * {@hide}
 * {@hide}
 */
 */
public class DefaultNetworkMetrics {
public class DefaultNetworkMetrics {


    private final IpConnectivityLog mMetricsLog = new IpConnectivityLog();
    private static final int ROLLING_LOG_SIZE = 64;

    // Event buffer used for metrics upload. The buffer is cleared when events are collected.
    @GuardedBy("this")
    private final List<DefaultNetworkEvent> mEvents = new ArrayList<>();

    public synchronized void listEvents(PrintWriter pw) {
        long localTimeMs = System.currentTimeMillis();
        for (DefaultNetworkEvent ev : mEvents) {
            pw.println(ev);
        }
    }

    public synchronized void listEventsAsProto(PrintWriter pw) {
        for (DefaultNetworkEvent ev : mEvents) {
            pw.print(IpConnectivityEventBuilder.toProto(ev));
        }
    }


    public void logDefaultNetworkEvent(NetworkAgentInfo newNai, NetworkAgentInfo prevNai) {
    public synchronized void flushEvents(List<IpConnectivityEvent> out) {
        int newNetid = NETID_UNSET;
        for (DefaultNetworkEvent ev : mEvents) {
        int prevNetid = NETID_UNSET;
            out.add(IpConnectivityEventBuilder.toProto(ev));
        int[] transports = new int[0];
        }
        boolean hadIPv4 = false;
        mEvents.clear();
        boolean hadIPv6 = false;
    }


    public synchronized void logDefaultNetworkEvent(
            NetworkAgentInfo newNai, NetworkAgentInfo prevNai) {
        DefaultNetworkEvent ev = new DefaultNetworkEvent();
        if (newNai != null) {
        if (newNai != null) {
            newNetid = newNai.network.netId;
            ev.netId = newNai.network().netId;
            transports = newNai.networkCapabilities.getTransportTypes();
            ev.transportTypes = newNai.networkCapabilities.getTransportTypes();
        }
        }
        if (prevNai != null) {
        if (prevNai != null) {
            prevNetid = prevNai.network.netId;
            ev.prevNetId = prevNai.network().netId;
            final LinkProperties lp = prevNai.linkProperties;
            final LinkProperties lp = prevNai.linkProperties;
            hadIPv4 = lp.hasIPv4Address() && lp.hasIPv4DefaultRoute();
            ev.prevIPv4 = lp.hasIPv4Address() && lp.hasIPv4DefaultRoute();
            hadIPv6 = lp.hasGlobalIPv6Address() && lp.hasIPv6DefaultRoute();
            ev.prevIPv6 = lp.hasGlobalIPv6Address() && lp.hasIPv6DefaultRoute();
        }
        }


        mMetricsLog.log(new DefaultNetworkEvent(newNetid, transports, prevNetid, hadIPv4, hadIPv6));
        mEvents.add(ev);
    }
    }
}
}
+12 −15
Original line number Original line Diff line number Diff line
@@ -132,6 +132,18 @@ final public class IpConnectivityEventBuilder {
        return out;
        return out;
    }
    }


    public static IpConnectivityEvent toProto(DefaultNetworkEvent in) {
        IpConnectivityLogClass.DefaultNetworkEvent ev =
                new IpConnectivityLogClass.DefaultNetworkEvent();
        ev.networkId = netIdOf(in.netId);
        ev.previousNetworkId = netIdOf(in.prevNetId);
        ev.transportTypes = in.transportTypes;
        ev.previousNetworkIpSupport = ipSupportOf(in);
        final IpConnectivityEvent out = buildEvent(in.netId, 0, null);
        out.setDefaultNetworkEvent(ev);
        return out;
    }

    private static IpConnectivityEvent buildEvent(int netId, long transports, String ifname) {
    private static IpConnectivityEvent buildEvent(int netId, long transports, String ifname) {
        final IpConnectivityEvent ev = new IpConnectivityEvent();
        final IpConnectivityEvent ev = new IpConnectivityEvent();
        ev.networkId = netId;
        ev.networkId = netId;
@@ -164,11 +176,6 @@ final public class IpConnectivityEventBuilder {
            return true;
            return true;
        }
        }


        if (in instanceof DefaultNetworkEvent) {
            setDefaultNetworkEvent(out, (DefaultNetworkEvent) in);
            return true;
        }

        if (in instanceof NetworkEvent) {
        if (in instanceof NetworkEvent) {
            setNetworkEvent(out, (NetworkEvent) in);
            setNetworkEvent(out, (NetworkEvent) in);
            return true;
            return true;
@@ -225,16 +232,6 @@ final public class IpConnectivityEventBuilder {
        out.setIpReachabilityEvent(ipReachabilityEvent);
        out.setIpReachabilityEvent(ipReachabilityEvent);
    }
    }


    private static void setDefaultNetworkEvent(IpConnectivityEvent out, DefaultNetworkEvent in) {
        IpConnectivityLogClass.DefaultNetworkEvent defaultNetworkEvent =
                new IpConnectivityLogClass.DefaultNetworkEvent();
        defaultNetworkEvent.networkId = netIdOf(in.netId);
        defaultNetworkEvent.previousNetworkId = netIdOf(in.prevNetId);
        defaultNetworkEvent.transportTypes = in.transportTypes;
        defaultNetworkEvent.previousNetworkIpSupport = ipSupportOf(in);
        out.setDefaultNetworkEvent(defaultNetworkEvent);
    }

    private static void setNetworkEvent(IpConnectivityEvent out, NetworkEvent in) {
    private static void setNetworkEvent(IpConnectivityEvent out, NetworkEvent in) {
        IpConnectivityLogClass.NetworkEvent networkEvent =
        IpConnectivityLogClass.NetworkEvent networkEvent =
                new IpConnectivityLogClass.NetworkEvent();
                new IpConnectivityLogClass.NetworkEvent();
+5 −0
Original line number Original line Diff line number Diff line
@@ -196,6 +196,8 @@ final public class IpConnectivityMetrics extends SystemService {


        final List<IpConnectivityEvent> protoEvents = IpConnectivityEventBuilder.toProto(events);
        final List<IpConnectivityEvent> protoEvents = IpConnectivityEventBuilder.toProto(events);


        mDefaultNetworkMetrics.flushEvents(protoEvents);

        if (mNetdListener != null) {
        if (mNetdListener != null) {
            mNetdListener.flushStatistics(protoEvents);
            mNetdListener.flushStatistics(protoEvents);
        }
        }
@@ -236,6 +238,7 @@ final public class IpConnectivityMetrics extends SystemService {
            if (mNetdListener != null) {
            if (mNetdListener != null) {
                mNetdListener.listAsProtos(pw);
                mNetdListener.listAsProtos(pw);
            }
            }
            mDefaultNetworkMetrics.listEventsAsProto(pw);
            return;
            return;
        }
        }


@@ -245,6 +248,7 @@ final public class IpConnectivityMetrics extends SystemService {
        if (mNetdListener != null) {
        if (mNetdListener != null) {
            mNetdListener.list(pw);
            mNetdListener.list(pw);
        }
        }
        mDefaultNetworkMetrics.listEvents(pw);
    }
    }


    /**
    /**
@@ -262,6 +266,7 @@ final public class IpConnectivityMetrics extends SystemService {
        if (mNetdListener != null) {
        if (mNetdListener != null) {
            mNetdListener.list(pw);
            mNetdListener.list(pw);
        }
        }
        mDefaultNetworkMetrics.listEvents(pw);
    }
    }


    private void cmdStats(FileDescriptor fd, PrintWriter pw, String[] args) {
    private void cmdStats(FileDescriptor fd, PrintWriter pw, String[] args) {
+10 −11
Original line number Original line Diff line number Diff line
@@ -198,21 +198,20 @@ public class IpConnectivityEventBuilderTest {


    @Test
    @Test
    public void testDefaultNetworkEventSerialization() {
    public void testDefaultNetworkEventSerialization() {
        ConnectivityMetricsEvent ev = describeIpEvent(
        DefaultNetworkEvent ev = new DefaultNetworkEvent();
                aType(DefaultNetworkEvent.class),
        ev.netId = 102;
                anInt(102),
        ev.prevNetId = 101;
                anIntArray(1, 2, 3),
        ev.transportTypes = new int[]{1, 2, 3};
                anInt(101),
        ev.prevIPv4 = true;
                aBool(true),
        ev.prevIPv6 = true;
                aBool(false));


        String want = String.join("\n",
        String want = String.join("\n",
                "dropped_events: 0",
                "dropped_events: 0",
                "events <",
                "events <",
                "  if_name: \"\"",
                "  if_name: \"\"",
                "  link_layer: 0",
                "  link_layer: 0",
                "  network_id: 0",
                "  network_id: 102",
                "  time_ms: 1",
                "  time_ms: 0",
                "  transports: 0",
                "  transports: 0",
                "  default_network_event <",
                "  default_network_event <",
                "    default_network_duration_ms: 0",
                "    default_network_duration_ms: 0",
@@ -226,7 +225,7 @@ public class IpConnectivityEventBuilderTest {
                "    previous_network_id <",
                "    previous_network_id <",
                "      network_id: 101",
                "      network_id: 101",
                "    >",
                "    >",
                "    previous_network_ip_support: 1",
                "    previous_network_ip_support: 3",
                "    transport_types: 1",
                "    transport_types: 1",
                "    transport_types: 2",
                "    transport_types: 2",
                "    transport_types: 3",
                "    transport_types: 3",
@@ -234,7 +233,7 @@ public class IpConnectivityEventBuilderTest {
                ">",
                ">",
                "version: 2\n");
                "version: 2\n");


        verifySerialization(want, ev);
        verifySerialization(want, IpConnectivityEventBuilder.toProto(ev));
    }
    }


    @Test
    @Test
Loading