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

Commit 1af850fd authored by Lorenzo Colitti's avatar Lorenzo Colitti Committed by android-build-merger
Browse files

Merge "Add tether offload traffic to interface stats as well." into oc-mr1-dev

am: 21bc3a39

Change-Id: I4e8e923d68dce1a4a68608dbd6c75a91165aa4ee
parents 8a04ed4c 21bc3a39
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -30,7 +30,10 @@ import android.net.NetworkStats;
 */
interface ITetheringStatsProvider {
    // Returns cumulative statistics for all tethering sessions since boot, on all upstreams.
    NetworkStats getTetherStats();
    // @code {how} is one of the NetworkStats.STATS_PER_* constants. If {@code how} is
    // {@code STATS_PER_IFACE}, the provider should not include any traffic that is already
    // counted by kernel interface counters.
    NetworkStats getTetherStats(int how);

    // Sets the interface quota for the specified upstream interface. This is defined as the number
    // of bytes, starting from zero and counting from now, after which data should stop being
+5 −0
Original line number Diff line number Diff line
@@ -82,6 +82,11 @@ public class NetworkStats implements Parcelable {
    /** {@link #roaming} value where roaming data is accounted. */
    public static final int ROAMING_YES = 1;

    /** Denotes a request for stats at the interface level. */
    public static final int STATS_PER_IFACE = 0;
    /** Denotes a request for stats at the interface and UID level. */
    public static final int STATS_PER_UID = 1;

    // TODO: move fields to "mVariable" notation

    /**
+1 −1
Original line number Diff line number Diff line
@@ -281,7 +281,7 @@ interface INetworkManagementService
    /**
     * Return summary of network statistics all tethering interfaces.
     */
    NetworkStats getNetworkStatsTethering();
    NetworkStats getNetworkStatsTethering(int how);

    /**
     * Set quota for an interface.
+10 −3
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@ import static android.net.NetworkPolicyManager.FIREWALL_RULE_DENY;
import static android.net.NetworkPolicyManager.FIREWALL_TYPE_BLACKLIST;
import static android.net.NetworkPolicyManager.FIREWALL_TYPE_WHITELIST;
import static android.net.NetworkStats.SET_DEFAULT;
import static android.net.NetworkStats.STATS_PER_UID;
import static android.net.NetworkStats.TAG_ALL;
import static android.net.NetworkStats.TAG_NONE;
import static android.net.NetworkStats.UID_ALL;
@@ -1863,7 +1864,13 @@ public class NetworkManagementService extends INetworkManagementService.Stub

    private class NetdTetheringStatsProvider extends ITetheringStatsProvider.Stub {
        @Override
        public NetworkStats getTetherStats() {
        public NetworkStats getTetherStats(int how) {
            // We only need to return per-UID stats. Per-device stats are already counted by
            // interface counters.
            if (how != STATS_PER_UID) {
                return new NetworkStats(SystemClock.elapsedRealtime(), 0);
            }

            final NativeDaemonEvent[] events;
            try {
                events = mConnector.executeForList("bandwidth", "gettetherstats");
@@ -1906,14 +1913,14 @@ public class NetworkManagementService extends INetworkManagementService.Stub
    }

    @Override
    public NetworkStats getNetworkStatsTethering() {
    public NetworkStats getNetworkStatsTethering(int how) {
        mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG);

        final NetworkStats stats = new NetworkStats(SystemClock.elapsedRealtime(), 1);
        synchronized (mTetheringStatsProviders) {
            for (ITetheringStatsProvider provider: mTetheringStatsProviders.keySet()) {
                try {
                    stats.combineAllValues(provider.getTetherStats());
                    stats.combineAllValues(provider.getTetherStats(how));
                } catch (RemoteException e) {
                    Log.e(TAG, "Problem reading tethering stats from " +
                            mTetheringStatsProviders.get(provider) + ": " + e);
+6 −2
Original line number Diff line number Diff line
@@ -17,7 +17,9 @@
package com.android.server.connectivity.tethering;

import static android.net.NetworkStats.SET_DEFAULT;
import static android.net.NetworkStats.STATS_PER_UID;
import static android.net.NetworkStats.TAG_NONE;
import static android.net.NetworkStats.UID_ALL;
import static android.net.TrafficStats.UID_TETHERING;
import static android.provider.Settings.Global.TETHER_OFFLOAD_DISABLED;

@@ -202,16 +204,18 @@ public class OffloadController {

    private class OffloadTetheringStatsProvider extends ITetheringStatsProvider.Stub {
        @Override
        public NetworkStats getTetherStats() {
        public NetworkStats getTetherStats(int how) {
            NetworkStats stats = new NetworkStats(SystemClock.elapsedRealtime(), 0);

            // We can't just post to mHandler because we are mostly (but not always) called by
            // NetworkStatsService#performPollLocked, which is (currently) on the same thread as us.
            mHandler.runWithScissors(() -> {
                // We have to report both per-interface and per-UID stats, because offloaded traffic
                // is not seen by kernel interface counters.
                NetworkStats.Entry entry = new NetworkStats.Entry();
                entry.set = SET_DEFAULT;
                entry.tag = TAG_NONE;
                entry.uid = UID_TETHERING;
                entry.uid = (how == STATS_PER_UID) ? UID_TETHERING : UID_ALL;

                updateStatsForCurrentUpstream();

Loading