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

Commit 5f95c2d8 authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "[FUI17] Migrate NetworkStatsService to use NetworkStateSnapshot" am:...

Merge "[FUI17] Migrate NetworkStatsService to use NetworkStateSnapshot" am: 60faefff am: 0e300026

Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1556553

MUST ONLY BE SUBMITTED BY AUTOMERGER

Change-Id: I5a804c1011080df3b09b01930817b5d0c46cef4a
parents e268e877 0e300026
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -19,7 +19,7 @@ package android.net;
import android.net.DataUsageRequest;
import android.net.INetworkStatsSession;
import android.net.Network;
import android.net.NetworkState;
import android.net.NetworkStateSnapshot;
import android.net.NetworkStats;
import android.net.NetworkStatsHistory;
import android.net.NetworkTemplate;
@@ -68,7 +68,7 @@ interface INetworkStatsService {
    /** Force update of ifaces. */
    void forceUpdateIfaces(
         in Network[] defaultNetworks,
         in NetworkState[] networkStates,
         in NetworkStateSnapshot[] snapshots,
         in String activeIface,
         in UnderlyingNetworkInfo[] underlyingNetworkInfos);
    /** Force update of statistics. */
+28 −16
Original line number Diff line number Diff line
@@ -18,7 +18,6 @@ package android.net;

import static android.net.ConnectivityManager.TYPE_WIFI;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Context;
import android.net.wifi.WifiInfo;
@@ -180,29 +179,42 @@ public class NetworkIdentity implements Comparable<NetworkIdentity> {
    }

    /**
     * Build a {@link NetworkIdentity} from the given {@link NetworkState} and {@code subType},
     * assuming that any mobile networks are using the current IMSI. The subType if applicable,
     * should be set as one of the TelephonyManager.NETWORK_TYPE_* constants, or
     * {@link android.telephony.TelephonyManager#NETWORK_TYPE_UNKNOWN} if not.
     * Build a {@link NetworkIdentity} from the given {@link NetworkState} and
     * {@code subType}, assuming that any mobile networks are using the current IMSI.
     * The subType if applicable, should be set as one of the TelephonyManager.NETWORK_TYPE_*
     * constants, or {@link android.telephony.TelephonyManager#NETWORK_TYPE_UNKNOWN} if not.
     */
    public static NetworkIdentity buildNetworkIdentity(Context context, NetworkState state,
            boolean defaultNetwork, @NetworkType int subType) {
        final int legacyType = state.legacyNetworkType;
    // TODO: Delete this function after NetworkPolicyManagerService finishes the migration.
    public static NetworkIdentity buildNetworkIdentity(Context context,
            NetworkState state, boolean defaultNetwork, @NetworkType int subType) {
        final NetworkStateSnapshot snapshot = new NetworkStateSnapshot(state.linkProperties,
                state.networkCapabilities, state.network, state.subscriberId,
                state.legacyNetworkType);
        return buildNetworkIdentity(context, snapshot, defaultNetwork, subType);
    }

        String subscriberId = null;
    /**
     * Build a {@link NetworkIdentity} from the given {@link NetworkStateSnapshot} and
     * {@code subType}, assuming that any mobile networks are using the current IMSI.
     * The subType if applicable, should be set as one of the TelephonyManager.NETWORK_TYPE_*
     * constants, or {@link android.telephony.TelephonyManager#NETWORK_TYPE_UNKNOWN} if not.
     */
    public static NetworkIdentity buildNetworkIdentity(Context context,
            NetworkStateSnapshot snapshot, boolean defaultNetwork, @NetworkType int subType) {
        final int legacyType = snapshot.legacyType;

        final String subscriberId = snapshot.subscriberId;
        String networkId = null;
        boolean roaming = !state.networkCapabilities.hasCapability(
        boolean roaming = !snapshot.networkCapabilities.hasCapability(
                NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING);
        boolean metered = !state.networkCapabilities.hasCapability(
        boolean metered = !snapshot.networkCapabilities.hasCapability(
                NetworkCapabilities.NET_CAPABILITY_NOT_METERED);

        subscriberId = state.subscriberId;

        final int oemManaged = getOemBitfield(state.networkCapabilities);
        final int oemManaged = getOemBitfield(snapshot.networkCapabilities);

        if (legacyType == TYPE_WIFI) {
            if (state.networkCapabilities.getSsid() != null) {
                networkId = state.networkCapabilities.getSsid();
            if (snapshot.networkCapabilities.getSsid() != null) {
                networkId = snapshot.networkCapabilities.getSsid();
                if (networkId == null) {
                    // TODO: Figure out if this code path never runs. If so, remove them.
                    final WifiManager wifi = (WifiManager) context.getSystemService(
+11 −2
Original line number Diff line number Diff line
@@ -120,6 +120,7 @@ import android.net.NetworkSpecifier;
import android.net.NetworkStack;
import android.net.NetworkStackClient;
import android.net.NetworkState;
import android.net.NetworkStateSnapshot;
import android.net.NetworkTestResultParcelable;
import android.net.NetworkUtils;
import android.net.NetworkWatchlistManager;
@@ -7948,8 +7949,16 @@ public class ConnectivityService extends IConnectivityManager.Stub

        final UnderlyingNetworkInfo[] underlyingNetworkInfos = getAllVpnInfo();
        try {
            mStatsService.forceUpdateIfaces(getDefaultNetworks(), getAllNetworkState(), activeIface,
                    underlyingNetworkInfos);
            final ArrayList<NetworkStateSnapshot> snapshots = new ArrayList<>();
            // TODO: Directly use NetworkStateSnapshot when feasible.
            for (final NetworkState state : getAllNetworkState()) {
                final NetworkStateSnapshot snapshot = new NetworkStateSnapshot(state.linkProperties,
                        state.networkCapabilities, state.network, state.subscriberId,
                        state.legacyNetworkType);
                snapshots.add(snapshot);
            }
            mStatsService.forceUpdateIfaces(getDefaultNetworks(), snapshots.toArray(
                    new NetworkStateSnapshot[0]), activeIface, underlyingNetworkInfos);
        } catch (Exception ignored) {
        }
    }
+20 −21
Original line number Diff line number Diff line
@@ -97,7 +97,7 @@ import android.net.Network;
import android.net.NetworkCapabilities;
import android.net.NetworkIdentity;
import android.net.NetworkStack;
import android.net.NetworkState;
import android.net.NetworkStateSnapshot;
import android.net.NetworkStats;
import android.net.NetworkStats.NonMonotonicObserver;
import android.net.NetworkStatsHistory;
@@ -296,7 +296,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
    /** Last states of all networks sent from ConnectivityService. */
    @GuardedBy("mStatsLock")
    @Nullable
    private NetworkState[] mLastNetworkStates = null;
    private NetworkStateSnapshot[] mLastNetworkStateSnapshots = null;

    private final DropBoxNonMonotonicObserver mNonMonotonicObserver =
            new DropBoxNonMonotonicObserver();
@@ -378,8 +378,8 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
                }
                case MSG_UPDATE_IFACES: {
                    // If no cached states, ignore.
                    if (mLastNetworkStates == null) break;
                    updateIfaces(mDefaultNetworks, mLastNetworkStates, mActiveIface);
                    if (mLastNetworkStateSnapshots == null) break;
                    updateIfaces(mDefaultNetworks, mLastNetworkStateSnapshots, mActiveIface);
                    break;
                }
                case MSG_PERFORM_POLL_REGISTER_ALERT: {
@@ -967,10 +967,9 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
        }
    }

    @Override
    public void forceUpdateIfaces(
            Network[] defaultNetworks,
            NetworkState[] networkStates,
            NetworkStateSnapshot[] networkStates,
            String activeIface,
            UnderlyingNetworkInfo[] underlyingNetworkInfos) {
        checkNetworkStackPermission(mContext);
@@ -1248,13 +1247,13 @@ public class NetworkStatsService extends INetworkStatsService.Stub {

    private void updateIfaces(
            Network[] defaultNetworks,
            NetworkState[] networkStates,
            NetworkStateSnapshot[] snapshots,
            String activeIface) {
        synchronized (mStatsLock) {
            mWakeLock.acquire();
            try {
                mActiveIface = activeIface;
                updateIfacesLocked(defaultNetworks, networkStates);
                updateIfacesLocked(defaultNetworks, snapshots);
            } finally {
                mWakeLock.release();
            }
@@ -1262,13 +1261,13 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
    }

    /**
     * Inspect all current {@link NetworkState} to derive mapping from {@code iface} to {@link
     * NetworkStatsHistory}. When multiple networks are active on a single {@code iface},
     * Inspect all current {@link NetworkStateSnapshot}s to derive mapping from {@code iface} to
     * {@link NetworkStatsHistory}. When multiple networks are active on a single {@code iface},
     * they are combined under a single {@link NetworkIdentitySet}.
     */
    @GuardedBy("mStatsLock")
    private void updateIfacesLocked(@Nullable Network[] defaultNetworks,
            @NonNull NetworkState[] states) {
            @NonNull NetworkStateSnapshot[] snapshots) {
        if (!mSystemReady) return;
        if (LOGV) Slog.v(TAG, "updateIfacesLocked()");

@@ -1288,21 +1287,21 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
            mDefaultNetworks = defaultNetworks;
        }

        mLastNetworkStates = states;
        mLastNetworkStateSnapshots = snapshots;

        final boolean combineSubtypeEnabled = mSettings.getCombineSubtypeEnabled();
        final ArraySet<String> mobileIfaces = new ArraySet<>();
        for (NetworkState state : states) {
            final boolean isMobile = isNetworkTypeMobile(state.legacyNetworkType);
            final boolean isDefault = ArrayUtils.contains(mDefaultNetworks, state.network);
        for (NetworkStateSnapshot snapshot : snapshots) {
            final boolean isMobile = isNetworkTypeMobile(snapshot.legacyType);
            final boolean isDefault = ArrayUtils.contains(mDefaultNetworks, snapshot.network);
            final int subType = combineSubtypeEnabled ? SUBTYPE_COMBINED
                    : getSubTypeForState(state);
            final NetworkIdentity ident = NetworkIdentity.buildNetworkIdentity(mContext, state,
                    : getSubTypeForStateSnapshot(snapshot);
            final NetworkIdentity ident = NetworkIdentity.buildNetworkIdentity(mContext, snapshot,
                    isDefault, subType);

            // Traffic occurring on the base interface is always counted for
            // both total usage and UID details.
            final String baseIface = state.linkProperties.getInterfaceName();
            final String baseIface = snapshot.linkProperties.getInterfaceName();
            if (baseIface != null) {
                findOrCreateNetworkIdentitySet(mActiveIfaces, baseIface).add(ident);
                findOrCreateNetworkIdentitySet(mActiveUidIfaces, baseIface).add(ident);
@@ -1312,7 +1311,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
                // If IMS is metered, then the IMS network usage has already included VT usage.
                // VT is considered always metered in framework's layer. If VT is not metered
                // per carrier's policy, modem will report 0 usage for VT calls.
                if (state.networkCapabilities.hasCapability(
                if (snapshot.networkCapabilities.hasCapability(
                        NetworkCapabilities.NET_CAPABILITY_IMS) && !ident.getMetered()) {

                    // Copy the identify from IMS one but mark it as metered.
@@ -1358,7 +1357,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
            // (or non eBPF offloaded) TX they would appear on both, however egress interface
            // accounting is explicitly bypassed for traffic from the clat uid.
            //
            final List<LinkProperties> stackedLinks = state.linkProperties.getStackedLinks();
            final List<LinkProperties> stackedLinks = snapshot.linkProperties.getStackedLinks();
            for (LinkProperties stackedLink : stackedLinks) {
                final String stackedIface = stackedLink.getInterfaceName();
                if (stackedIface != null) {
@@ -1381,7 +1380,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
     * {@link PhoneStateListener}. Otherwise, return 0 given that other networks with different
     * transport types do not actually fill this value.
     */
    private int getSubTypeForState(@NonNull NetworkState state) {
    private int getSubTypeForStateSnapshot(@NonNull NetworkStateSnapshot state) {
        if (!state.networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
            return 0;
        }
+2 −1
Original line number Diff line number Diff line
@@ -2043,7 +2043,8 @@ public class NetworkPolicyManagerServiceTest {
        final NetworkCapabilities networkCapabilities = new NetworkCapabilities();
        networkCapabilities.addTransportType(TRANSPORT_WIFI);
        networkCapabilities.setSSID(TEST_SSID);
        return new NetworkState(TYPE_WIFI, prop, networkCapabilities, null, null);
        return new NetworkState(TYPE_WIFI, prop, networkCapabilities, new Network(TEST_NET_ID),
                null);
    }

    private void expectHasInternetPermission(int uid, boolean hasIt) throws Exception {
Loading