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

Commit 682686bd authored by Lorenzo Colitti's avatar Lorenzo Colitti
Browse files

Stop using IIpConnectivityMetrics in ConnectivityService.

Currently, ConnectivityService calls the IpConnectivityMetrics
service class directly to log default network events. This is
incompatible with ConnectivityService being in a mainline module.
Replace direct access to IIpConnectivityMetrics with public
methods in IpConnectivityLog, which is @SystemApi class.

The new methods are not yet @SystemApi, but they can be made so
if desired. Alternatively, these metrics could be deleted.

Also remove the IpConectivityMetrics service from the
service-connectivity JAR, and go back to starting it from
SystemServer.java, which is what was happening a few hours ago
before aosp/1542626 was merged.

Test: builds, boots
Test: atest FrameworksNetTests
Test: "dumpsys connmetrics" shows events, including default network events
Change-Id: I9d6147d93590363a2f8f83f39f05c03d001b4851
parent 29823649
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -19,6 +19,9 @@ package android.net;
import android.os.Parcelable;
import android.net.ConnectivityMetricsEvent;
import android.net.INetdEventCallback;
import android.net.LinkProperties;
import android.net.Network;
import android.net.NetworkCapabilities;

/** {@hide} */
interface IIpConnectivityMetrics {
@@ -29,6 +32,11 @@ interface IIpConnectivityMetrics {
     */
    int logEvent(in ConnectivityMetricsEvent event);

    void logDefaultNetworkValidity(boolean valid);
    void logDefaultNetworkEvent(in Network defaultNetwork, int score, boolean validated,
            in LinkProperties lp, in NetworkCapabilities nc, in Network previousDefaultNetwork,
            int previousScore, in LinkProperties previousLp, in NetworkCapabilities previousNc);

    /**
     * Callback can be registered by DevicePolicyManager or NetworkWatchlistService only.
     * @return status {@code true} if registering/unregistering of the callback was successful,
+56 −3
Original line number Diff line number Diff line
@@ -17,10 +17,13 @@
package android.net.metrics;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SystemApi;
import android.net.ConnectivityMetricsEvent;
import android.net.IIpConnectivityMetrics;
import android.net.LinkProperties;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.os.Parcelable;
import android.os.RemoteException;
import android.os.ServiceManager;
@@ -66,6 +69,9 @@ public class IpConnectivityLog {
        final IIpConnectivityMetrics service =
                IIpConnectivityMetrics.Stub.asInterface(ServiceManager.getService(SERVICE_NAME));
        if (service == null) {
            if (DBG) {
                Log.d(TAG, SERVICE_NAME + " service was not ready");
            }
            return false;
        }
        // Two threads racing here will write the same pointer because getService
@@ -83,9 +89,6 @@ public class IpConnectivityLog {
     */
    public boolean log(@NonNull ConnectivityMetricsEvent ev) {
        if (!checkLoggerService()) {
            if (DBG) {
                Log.d(TAG, SERVICE_NAME + " service was not ready");
            }
            return false;
        }
        if (ev.timestamp == 0) {
@@ -161,6 +164,56 @@ public class IpConnectivityLog {
        return log(makeEv(data));
    }

    /**
     * Logs the validation status of the default network.
     * @param valid whether the current default network was validated (i.e., whether it had
     *              {@link NetworkCapabilities.NET_CAPABILITY_VALIDATED}
     * @return true if the event was successfully logged.
     * @hide
     */
    public boolean logDefaultNetworkValidity(boolean valid) {
        if (!checkLoggerService()) {
            return false;
        }
        try {
            mService.logDefaultNetworkValidity(valid);
        } catch (RemoteException ignored) {
            // Only called within the system server.
        }
        return true;
    }

    /**
     * Logs a change in the default network.
     *
     * @param defaultNetwork the current default network
     * @param score the current score of {@code defaultNetwork}
     * @param lp the {@link LinkProperties} of {@code defaultNetwork}
     * @param nc the {@link NetworkCapabilities} of the {@code defaultNetwork}
     * @param validated whether {@code defaultNetwork} network is validated
     * @param previousDefaultNetwork the previous default network
     * @param previousScore the score of {@code previousDefaultNetwork}
     * @param previousLp the {@link LinkProperties} of {@code previousDefaultNetwork}
     * @param previousNc the {@link NetworkCapabilities} of {@code previousDefaultNetwork}
     * @return true if the event was successfully logged.
     * @hide
     */
    public boolean logDefaultNetworkEvent(@Nullable Network defaultNetwork, int score,
            boolean validated, @Nullable LinkProperties lp, @Nullable NetworkCapabilities nc,
            @Nullable Network previousDefaultNetwork, int previousScore,
            @Nullable LinkProperties previousLp, @Nullable NetworkCapabilities previousNc) {
        if (!checkLoggerService()) {
            return false;
        }
        try {
            mService.logDefaultNetworkEvent(defaultNetwork, score, validated, lp, nc,
                    previousDefaultNetwork, previousScore, previousLp, previousNc);
        } catch (RemoteException ignored) {
            // Only called within the system server.
        }
        return true;
    }

    private static ConnectivityMetricsEvent makeEv(Event data) {
        ConnectivityMetricsEvent ev = new ConnectivityMetricsEvent();
        ev.data = data;
+0 −4
Original line number Diff line number Diff line
@@ -189,15 +189,11 @@ filegroup {
        "java/com/android/server/connectivity/AutodestructReference.java",
        "java/com/android/server/connectivity/ConnectivityConstants.java",
        "java/com/android/server/connectivity/DataConnectionStats.java",
        "java/com/android/server/connectivity/DefaultNetworkMetrics.java",
        "java/com/android/server/connectivity/DnsManager.java",
        "java/com/android/server/connectivity/IpConnectivityEventBuilder.java",
        "java/com/android/server/connectivity/IpConnectivityMetrics.java",
        "java/com/android/server/connectivity/KeepaliveTracker.java",
        "java/com/android/server/connectivity/LingerMonitor.java",
        "java/com/android/server/connectivity/MockableSystemProperties.java",
        "java/com/android/server/connectivity/Nat464Xlat.java",
        "java/com/android/server/connectivity/NetdEventListenerService.java",
        "java/com/android/server/connectivity/NetworkAgentInfo.java",
        "java/com/android/server/connectivity/NetworkDiagnostics.java",
        "java/com/android/server/connectivity/NetworkNotificationManager.java",
+25 −16
Original line number Diff line number Diff line
@@ -87,7 +87,6 @@ import android.net.ICaptivePortal;
import android.net.IConnectivityDiagnosticsCallback;
import android.net.IConnectivityManager;
import android.net.IDnsResolver;
import android.net.IIpConnectivityMetrics;
import android.net.INetd;
import android.net.INetworkManagementEventObserver;
import android.net.INetworkMonitor;
@@ -154,7 +153,6 @@ import android.os.PersistableBundle;
import android.os.PowerManager;
import android.os.Process;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.ServiceSpecificException;
import android.os.SystemClock;
import android.os.SystemProperties;
@@ -927,14 +925,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
                    "no IpConnectivityMetrics service");
        }

        /**
         * @see IpConnectivityMetrics
         */
        public IIpConnectivityMetrics getIpConnectivityMetrics() {
            return IIpConnectivityMetrics.Stub.asInterface(
                    ServiceManager.getService(IpConnectivityLog.SERVICE_NAME));
        }

        public IBatteryStats getBatteryStatsService() {
            return BatteryStatsService.getService();
        }
@@ -2983,9 +2973,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
            }
            if (valid != nai.lastValidated) {
                if (wasDefault) {
                    mDeps.getMetricsLogger()
                            .defaultNetworkMetrics().logDefaultNetworkValidity(
                            SystemClock.elapsedRealtime(), valid);
                    mMetricsLog.logDefaultNetworkValidity(valid);
                }
                final int oldScore = nai.getCurrentScore();
                nai.lastValidated = valid;
@@ -3413,7 +3401,9 @@ public class ConnectivityService extends IConnectivityManager.Stub
            // if there is a fallback. Taken together, the two form a X -> 0, 0 -> Y sequence
            // whose timestamps tell how long it takes to recover a default network.
            long now = SystemClock.elapsedRealtime();
            mDeps.getMetricsLogger().defaultNetworkMetrics().logDefaultNetworkEvent(now, null, nai);
            mMetricsLog.logDefaultNetworkEvent(null, 0, false,
                    null /* lp */, null /* nc */, nai.network, nai.getCurrentScore(),
                    nai.linkProperties, nai.networkCapabilities);
        }
        notifyIfacesChangedForNetworkStats();
        // TODO - we shouldn't send CALLBACK_LOST to requests that can be satisfied
@@ -7167,9 +7157,28 @@ public class ConnectivityService extends IConnectivityManager.Stub
            updateDataActivityTracking(newDefaultNetwork, oldDefaultNetwork);
            // Notify system services of the new default.
            makeDefault(newDefaultNetwork);

            // Log 0 -> X and Y -> X default network transitions, where X is the new default.
            mDeps.getMetricsLogger().defaultNetworkMetrics().logDefaultNetworkEvent(
                    now, newDefaultNetwork, oldDefaultNetwork);
            final Network network = (newDefaultNetwork != null) ? newDefaultNetwork.network : null;
            final int score = (newDefaultNetwork != null) ? newDefaultNetwork.getCurrentScore() : 0;
            final boolean validated = newDefaultNetwork != null && newDefaultNetwork.lastValidated;
            final LinkProperties lp = (newDefaultNetwork != null)
                    ? newDefaultNetwork.linkProperties : null;
            final NetworkCapabilities nc = (newDefaultNetwork != null)
                    ? newDefaultNetwork.networkCapabilities : null;

            final Network prevNetwork = (oldDefaultNetwork != null)
                    ? oldDefaultNetwork.network : null;
            final int prevScore = (oldDefaultNetwork != null)
                    ? oldDefaultNetwork.getCurrentScore() : 0;
            final LinkProperties prevLp = (oldDefaultNetwork != null)
                    ? oldDefaultNetwork.linkProperties : null;
            final NetworkCapabilities prevNc = (oldDefaultNetwork != null)
                    ? oldDefaultNetwork.networkCapabilities : null;

            mMetricsLog.logDefaultNetworkEvent(network, score, validated, lp, nc,
                    prevNetwork, prevScore, prevLp, prevNc);

            // Have a new default network, release the transition wakelock in
            scheduleReleaseNetworkTransitionWakelock();
        }
+29 −18
Original line number Diff line number Diff line
@@ -17,6 +17,8 @@
package com.android.server.connectivity;

import android.net.LinkProperties;
import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.metrics.DefaultNetworkEvent;
import android.os.SystemClock;

@@ -61,7 +63,7 @@ public class DefaultNetworkMetrics {
    private int mLastTransports;

    public DefaultNetworkMetrics() {
        newDefaultNetwork(creationTimeMs, null);
        newDefaultNetwork(creationTimeMs, null, 0, false, null, null);
    }

    public synchronized void listEvents(PrintWriter pw) {
@@ -117,13 +119,21 @@ public class DefaultNetworkMetrics {
        mCurrentDefaultNetwork.validatedMs += timeMs - mLastValidationTimeMs;
    }

    public synchronized void logDefaultNetworkEvent(
            long timeMs, NetworkAgentInfo newNai, NetworkAgentInfo oldNai) {
        logCurrentDefaultNetwork(timeMs, oldNai);
        newDefaultNetwork(timeMs, newNai);
    /**
     * Logs a default network event.
     * @see {IpConnectivityLog#logDefaultNetworkEvent}.
     */
    public synchronized void logDefaultNetworkEvent(long timeMs, Network defaultNetwork, int score,
            boolean validated, LinkProperties lp, NetworkCapabilities nc,
            Network previousDefaultNetwork, int previousScore, LinkProperties previousLp,
            NetworkCapabilities previousNc) {
        logCurrentDefaultNetwork(timeMs, previousDefaultNetwork, previousScore, previousLp,
                previousNc);
        newDefaultNetwork(timeMs, defaultNetwork, score, validated, lp, nc);
    }

    private void logCurrentDefaultNetwork(long timeMs, NetworkAgentInfo oldNai) {
    private void logCurrentDefaultNetwork(long timeMs, Network network, int score,
            LinkProperties lp, NetworkCapabilities nc) {
        if (mIsCurrentlyValid) {
            updateValidationTime(timeMs);
        }
@@ -131,10 +141,10 @@ public class DefaultNetworkMetrics {
        ev.updateDuration(timeMs);
        ev.previousTransports = mLastTransports;
        // oldNai is null if the system had no default network before the transition.
        if (oldNai != null) {
        if (network != null) {
            // The system acquired a new default network.
            fillLinkInfo(ev, oldNai);
            ev.finalScore = oldNai.getCurrentScore();
            fillLinkInfo(ev, network, lp, nc);
            ev.finalScore = score;
        }
        // Only change transport of the previous default network if the event currently logged
        // corresponds to an existing default network, and not to the absence of a default network.
@@ -147,14 +157,15 @@ public class DefaultNetworkMetrics {
        mEventsLog.append(ev);
    }

    private void newDefaultNetwork(long timeMs, NetworkAgentInfo newNai) {
    private void newDefaultNetwork(long timeMs, Network network, int score, boolean validated,
            LinkProperties lp, NetworkCapabilities nc) {
        DefaultNetworkEvent ev = new DefaultNetworkEvent(timeMs);
        ev.durationMs = timeMs;
        // newNai is null if the system has no default network after the transition.
        if (newNai != null) {
            fillLinkInfo(ev, newNai);
            ev.initialScore = newNai.getCurrentScore();
            if (newNai.lastValidated) {
        if (network != null) {
            fillLinkInfo(ev, network, lp, nc);
            ev.initialScore = score;
            if (validated) {
                mIsCurrentlyValid = true;
                mLastValidationTimeMs = timeMs;
            }
@@ -164,10 +175,10 @@ public class DefaultNetworkMetrics {
        mCurrentDefaultNetwork = ev;
    }

    private static void fillLinkInfo(DefaultNetworkEvent ev, NetworkAgentInfo nai) {
        LinkProperties lp = nai.linkProperties;
        ev.netId = nai.network().getNetId();
        ev.transports |= BitUtils.packBits(nai.networkCapabilities.getTransportTypes());
    private static void fillLinkInfo(DefaultNetworkEvent ev, Network network, LinkProperties lp,
            NetworkCapabilities nc) {
        ev.netId = network.getNetId();
        ev.transports |= BitUtils.packBits(nc.getTransportTypes());
        ev.ipv4 |= lp.hasIpv4Address() && lp.hasIpv4DefaultRoute();
        ev.ipv6 |= lp.hasGlobalIpv6Address() && lp.hasIpv6DefaultRoute();
    }
Loading