Loading Android.mk +1 −0 Original line number Diff line number Diff line Loading @@ -238,6 +238,7 @@ LOCAL_SRC_FILES += \ core/java/android/net/INetworkScoreService.aidl \ core/java/android/net/INetworkStatsService.aidl \ core/java/android/net/INetworkStatsSession.aidl \ core/java/android/net/ITetheringStatsProvider.aidl \ core/java/android/net/nsd/INsdManager.aidl \ core/java/android/nfc/IAppCallback.aidl \ core/java/android/nfc/INfcAdapter.aidl \ Loading core/java/android/net/ITetheringStatsProvider.aidl 0 → 100644 +33 −0 Original line number Diff line number Diff line /* * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.net; import android.net.NetworkStats; /** * Interface that allows NetworkManagementService to query for tethering statistics. * * TODO: this does not really need to be an interface since Tethering runs in the same process * as NetworkManagementService. Consider refactoring Tethering to use direct access to * NetworkManagementService instead of using INetworkManagementService, and then deleting this * interface. * * @hide */ interface ITetheringStatsProvider { NetworkStats getTetherStats(); } core/java/android/os/INetworkManagementService.aidl +13 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ package android.os; import android.net.InterfaceConfiguration; import android.net.INetd; import android.net.INetworkManagementEventObserver; import android.net.ITetheringStatsProvider; import android.net.Network; import android.net.NetworkStats; import android.net.RouteInfo; Loading Loading @@ -206,6 +207,18 @@ interface INetworkManagementService */ void disableNat(String internalInterface, String externalInterface); /** * Registers a {@code ITetheringStatsProvider} to provide tethering statistics. * All registered providers will be called in order, and their results will be added together. * Netd is always registered as a tethering stats provider. */ void registerTetheringStatsProvider(ITetheringStatsProvider provider, String name); /** * Unregisters a previously-registered {@code ITetheringStatsProvider}. */ void unregisterTetheringStatsProvider(ITetheringStatsProvider provider); /** ** PPPD **/ Loading services/core/java/com/android/server/NetworkManagementService.java +55 −10 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.server; import static android.Manifest.permission.CONNECTIVITY_INTERNAL; import static android.Manifest.permission.DUMP; import static android.Manifest.permission.NETWORK_STACK; import static android.Manifest.permission.SHUTDOWN; import static android.net.NetworkPolicyManager.FIREWALL_CHAIN_DOZABLE; import static android.net.NetworkPolicyManager.FIREWALL_CHAIN_NAME_DOZABLE; Loading Loading @@ -55,6 +56,7 @@ import android.content.Context; import android.net.ConnectivityManager; import android.net.INetd; import android.net.INetworkManagementEventObserver; import android.net.ITetheringStatsProvider; import android.net.InterfaceConfiguration; import android.net.IpPrefix; import android.net.LinkAddress; Loading Loading @@ -225,6 +227,10 @@ public class NetworkManagementService extends INetworkManagementService.Stub private final NetworkStatsFactory mStatsFactory = new NetworkStatsFactory(); @GuardedBy("mTetheringStatsProviders") private final HashMap<ITetheringStatsProvider, String> mTetheringStatsProviders = Maps.newHashMap(); /** * If both locks need to be held, then they should be obtained in the order: * first {@link #mQuotaLock} and then {@link #mRulesLock}. Loading Loading @@ -331,6 +337,10 @@ public class NetworkManagementService extends INetworkManagementService.Stub Watchdog.getInstance().addMonitor(this); LocalServices.addService(NetworkManagementInternal.class, new LocalService()); synchronized (mTetheringStatsProviders) { mTetheringStatsProviders.put(new NetdTetheringStatsProvider(), "netd"); } } @VisibleForTesting Loading Loading @@ -520,6 +530,23 @@ public class NetworkManagementService extends INetworkManagementService.Stub } } @Override public void registerTetheringStatsProvider(ITetheringStatsProvider provider, String name) { mContext.enforceCallingOrSelfPermission(NETWORK_STACK, TAG); Preconditions.checkNotNull(provider); synchronized(mTetheringStatsProviders) { mTetheringStatsProviders.put(provider, name); } } @Override public void unregisterTetheringStatsProvider(ITetheringStatsProvider provider) { mContext.enforceCallingOrSelfPermission(NETWORK_STACK, TAG); synchronized(mTetheringStatsProviders) { mTetheringStatsProviders.remove(provider); } } // Sync the state of the given chain with the native daemon. private void syncFirewallChainLocked(int chain, String name) { SparseIntArray rules; Loading Loading @@ -1789,14 +1816,16 @@ public class NetworkManagementService extends INetworkManagementService.Stub } } private class NetdTetheringStatsProvider extends ITetheringStatsProvider.Stub { @Override public NetworkStats getNetworkStatsTethering() { mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); final NetworkStats stats = new NetworkStats(SystemClock.elapsedRealtime(), 1); public NetworkStats getTetherStats() { final NativeDaemonEvent[] events; try { final NativeDaemonEvent[] events = mConnector.executeForList( "bandwidth", "gettetherstats"); events = mConnector.executeForList("bandwidth", "gettetherstats"); } catch (NativeDaemonConnectorException e) { throw e.rethrowAsParcelableException(); } final NetworkStats stats = new NetworkStats(SystemClock.elapsedRealtime(), 1); for (NativeDaemonEvent event : events) { if (event.getCode() != TetheringStatsListResult) continue; Loading @@ -1822,8 +1851,24 @@ public class NetworkManagementService extends INetworkManagementService.Stub throw new IllegalStateException("problem parsing tethering stats: " + event); } } } catch (NativeDaemonConnectorException e) { throw e.rethrowAsParcelableException(); return stats; } } @Override public NetworkStats getNetworkStatsTethering() { 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()); } catch (RemoteException e) { Log.e(TAG, "Problem reading tethering stats from " + mTetheringStatsProviders.get(provider) + ": " + e); } } } return stats; } Loading services/core/java/com/android/server/connectivity/Tethering.java +6 −1 Original line number Diff line number Diff line Loading @@ -214,7 +214,7 @@ public class Tethering extends BaseNetworkObserver { final Handler smHandler = mTetherMasterSM.getHandler(); mOffloadController = new OffloadController(smHandler, deps.getOffloadHardwareInterface(smHandler, mLog), mContext.getContentResolver(), mContext.getContentResolver(), mNMService, mLog); mUpstreamNetworkMonitor = new UpstreamNetworkMonitor( mContext, mTetherMasterSM, mLog, TetherMasterSM.EVENT_UPSTREAM_CALLBACK); Loading Loading @@ -1759,6 +1759,11 @@ public class Tethering extends BaseNetworkObserver { pw.decreaseIndent(); } pw.println("Hardware offload:"); pw.increaseIndent(); mOffloadController.dump(pw); pw.decreaseIndent(); pw.println("Log:"); pw.increaseIndent(); if (argsContain(args, SHORT_ARG)) { Loading Loading
Android.mk +1 −0 Original line number Diff line number Diff line Loading @@ -238,6 +238,7 @@ LOCAL_SRC_FILES += \ core/java/android/net/INetworkScoreService.aidl \ core/java/android/net/INetworkStatsService.aidl \ core/java/android/net/INetworkStatsSession.aidl \ core/java/android/net/ITetheringStatsProvider.aidl \ core/java/android/net/nsd/INsdManager.aidl \ core/java/android/nfc/IAppCallback.aidl \ core/java/android/nfc/INfcAdapter.aidl \ Loading
core/java/android/net/ITetheringStatsProvider.aidl 0 → 100644 +33 −0 Original line number Diff line number Diff line /* * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.net; import android.net.NetworkStats; /** * Interface that allows NetworkManagementService to query for tethering statistics. * * TODO: this does not really need to be an interface since Tethering runs in the same process * as NetworkManagementService. Consider refactoring Tethering to use direct access to * NetworkManagementService instead of using INetworkManagementService, and then deleting this * interface. * * @hide */ interface ITetheringStatsProvider { NetworkStats getTetherStats(); }
core/java/android/os/INetworkManagementService.aidl +13 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ package android.os; import android.net.InterfaceConfiguration; import android.net.INetd; import android.net.INetworkManagementEventObserver; import android.net.ITetheringStatsProvider; import android.net.Network; import android.net.NetworkStats; import android.net.RouteInfo; Loading Loading @@ -206,6 +207,18 @@ interface INetworkManagementService */ void disableNat(String internalInterface, String externalInterface); /** * Registers a {@code ITetheringStatsProvider} to provide tethering statistics. * All registered providers will be called in order, and their results will be added together. * Netd is always registered as a tethering stats provider. */ void registerTetheringStatsProvider(ITetheringStatsProvider provider, String name); /** * Unregisters a previously-registered {@code ITetheringStatsProvider}. */ void unregisterTetheringStatsProvider(ITetheringStatsProvider provider); /** ** PPPD **/ Loading
services/core/java/com/android/server/NetworkManagementService.java +55 −10 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.server; import static android.Manifest.permission.CONNECTIVITY_INTERNAL; import static android.Manifest.permission.DUMP; import static android.Manifest.permission.NETWORK_STACK; import static android.Manifest.permission.SHUTDOWN; import static android.net.NetworkPolicyManager.FIREWALL_CHAIN_DOZABLE; import static android.net.NetworkPolicyManager.FIREWALL_CHAIN_NAME_DOZABLE; Loading Loading @@ -55,6 +56,7 @@ import android.content.Context; import android.net.ConnectivityManager; import android.net.INetd; import android.net.INetworkManagementEventObserver; import android.net.ITetheringStatsProvider; import android.net.InterfaceConfiguration; import android.net.IpPrefix; import android.net.LinkAddress; Loading Loading @@ -225,6 +227,10 @@ public class NetworkManagementService extends INetworkManagementService.Stub private final NetworkStatsFactory mStatsFactory = new NetworkStatsFactory(); @GuardedBy("mTetheringStatsProviders") private final HashMap<ITetheringStatsProvider, String> mTetheringStatsProviders = Maps.newHashMap(); /** * If both locks need to be held, then they should be obtained in the order: * first {@link #mQuotaLock} and then {@link #mRulesLock}. Loading Loading @@ -331,6 +337,10 @@ public class NetworkManagementService extends INetworkManagementService.Stub Watchdog.getInstance().addMonitor(this); LocalServices.addService(NetworkManagementInternal.class, new LocalService()); synchronized (mTetheringStatsProviders) { mTetheringStatsProviders.put(new NetdTetheringStatsProvider(), "netd"); } } @VisibleForTesting Loading Loading @@ -520,6 +530,23 @@ public class NetworkManagementService extends INetworkManagementService.Stub } } @Override public void registerTetheringStatsProvider(ITetheringStatsProvider provider, String name) { mContext.enforceCallingOrSelfPermission(NETWORK_STACK, TAG); Preconditions.checkNotNull(provider); synchronized(mTetheringStatsProviders) { mTetheringStatsProviders.put(provider, name); } } @Override public void unregisterTetheringStatsProvider(ITetheringStatsProvider provider) { mContext.enforceCallingOrSelfPermission(NETWORK_STACK, TAG); synchronized(mTetheringStatsProviders) { mTetheringStatsProviders.remove(provider); } } // Sync the state of the given chain with the native daemon. private void syncFirewallChainLocked(int chain, String name) { SparseIntArray rules; Loading Loading @@ -1789,14 +1816,16 @@ public class NetworkManagementService extends INetworkManagementService.Stub } } private class NetdTetheringStatsProvider extends ITetheringStatsProvider.Stub { @Override public NetworkStats getNetworkStatsTethering() { mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); final NetworkStats stats = new NetworkStats(SystemClock.elapsedRealtime(), 1); public NetworkStats getTetherStats() { final NativeDaemonEvent[] events; try { final NativeDaemonEvent[] events = mConnector.executeForList( "bandwidth", "gettetherstats"); events = mConnector.executeForList("bandwidth", "gettetherstats"); } catch (NativeDaemonConnectorException e) { throw e.rethrowAsParcelableException(); } final NetworkStats stats = new NetworkStats(SystemClock.elapsedRealtime(), 1); for (NativeDaemonEvent event : events) { if (event.getCode() != TetheringStatsListResult) continue; Loading @@ -1822,8 +1851,24 @@ public class NetworkManagementService extends INetworkManagementService.Stub throw new IllegalStateException("problem parsing tethering stats: " + event); } } } catch (NativeDaemonConnectorException e) { throw e.rethrowAsParcelableException(); return stats; } } @Override public NetworkStats getNetworkStatsTethering() { 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()); } catch (RemoteException e) { Log.e(TAG, "Problem reading tethering stats from " + mTetheringStatsProviders.get(provider) + ": " + e); } } } return stats; } Loading
services/core/java/com/android/server/connectivity/Tethering.java +6 −1 Original line number Diff line number Diff line Loading @@ -214,7 +214,7 @@ public class Tethering extends BaseNetworkObserver { final Handler smHandler = mTetherMasterSM.getHandler(); mOffloadController = new OffloadController(smHandler, deps.getOffloadHardwareInterface(smHandler, mLog), mContext.getContentResolver(), mContext.getContentResolver(), mNMService, mLog); mUpstreamNetworkMonitor = new UpstreamNetworkMonitor( mContext, mTetherMasterSM, mLog, TetherMasterSM.EVENT_UPSTREAM_CALLBACK); Loading Loading @@ -1759,6 +1759,11 @@ public class Tethering extends BaseNetworkObserver { pw.decreaseIndent(); } pw.println("Hardware offload:"); pw.increaseIndent(); mOffloadController.dump(pw); pw.decreaseIndent(); pw.println("Log:"); pw.increaseIndent(); if (argsContain(args, SHORT_ARG)) { Loading