Loading core/java/android/net/ITetheringStatsProvider.aidl +4 −1 Original line number Diff line number Diff line Loading @@ -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 Loading core/java/android/net/NetworkStats.java +5 −0 Original line number Diff line number Diff line Loading @@ -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 /** Loading core/java/android/os/INetworkManagementService.aidl +1 −1 Original line number Diff line number Diff line Loading @@ -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. Loading services/core/java/com/android/server/NetworkManagementService.java +10 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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"); Loading Loading @@ -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); Loading services/core/java/com/android/server/connectivity/tethering/OffloadController.java +6 −2 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 Loading
core/java/android/net/ITetheringStatsProvider.aidl +4 −1 Original line number Diff line number Diff line Loading @@ -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 Loading
core/java/android/net/NetworkStats.java +5 −0 Original line number Diff line number Diff line Loading @@ -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 /** Loading
core/java/android/os/INetworkManagementService.aidl +1 −1 Original line number Diff line number Diff line Loading @@ -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. Loading
services/core/java/com/android/server/NetworkManagementService.java +10 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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"); Loading Loading @@ -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); Loading
services/core/java/com/android/server/connectivity/tethering/OffloadController.java +6 −2 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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