Merge "Replace INetd#trafficSwapActiveStatsMap with ConnectivityManager API"
This commit is contained in:
@@ -26,10 +26,10 @@ import static com.android.server.NetworkManagementSocketTagger.kernelToTag;
|
|||||||
|
|
||||||
import android.annotation.NonNull;
|
import android.annotation.NonNull;
|
||||||
import android.annotation.Nullable;
|
import android.annotation.Nullable;
|
||||||
import android.net.INetd;
|
import android.content.Context;
|
||||||
|
import android.net.ConnectivityManager;
|
||||||
import android.net.NetworkStats;
|
import android.net.NetworkStats;
|
||||||
import android.net.UnderlyingNetworkInfo;
|
import android.net.UnderlyingNetworkInfo;
|
||||||
import android.os.RemoteException;
|
|
||||||
import android.os.StrictMode;
|
import android.os.StrictMode;
|
||||||
import android.os.SystemClock;
|
import android.os.SystemClock;
|
||||||
|
|
||||||
@@ -70,7 +70,7 @@ public class NetworkStatsFactory {
|
|||||||
|
|
||||||
private final boolean mUseBpfStats;
|
private final boolean mUseBpfStats;
|
||||||
|
|
||||||
private final INetd mNetd;
|
private final Context mContext;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Guards persistent data access in this class
|
* Guards persistent data access in this class
|
||||||
@@ -158,12 +158,12 @@ public class NetworkStatsFactory {
|
|||||||
NetworkStats.apply464xlatAdjustments(baseTraffic, stackedTraffic, mStackedIfaces);
|
NetworkStats.apply464xlatAdjustments(baseTraffic, stackedTraffic, mStackedIfaces);
|
||||||
}
|
}
|
||||||
|
|
||||||
public NetworkStatsFactory(@NonNull INetd netd) {
|
public NetworkStatsFactory(@NonNull Context ctx) {
|
||||||
this(new File("/proc/"), true, netd);
|
this(ctx, new File("/proc/"), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
public NetworkStatsFactory(File procRoot, boolean useBpfStats, @NonNull INetd netd) {
|
public NetworkStatsFactory(@NonNull Context ctx, File procRoot, boolean useBpfStats) {
|
||||||
mStatsXtIfaceAll = new File(procRoot, "net/xt_qtaguid/iface_stat_all");
|
mStatsXtIfaceAll = new File(procRoot, "net/xt_qtaguid/iface_stat_all");
|
||||||
mStatsXtIfaceFmt = new File(procRoot, "net/xt_qtaguid/iface_stat_fmt");
|
mStatsXtIfaceFmt = new File(procRoot, "net/xt_qtaguid/iface_stat_fmt");
|
||||||
mStatsXtUid = new File(procRoot, "net/xt_qtaguid/stats");
|
mStatsXtUid = new File(procRoot, "net/xt_qtaguid/stats");
|
||||||
@@ -172,7 +172,7 @@ public class NetworkStatsFactory {
|
|||||||
mPersistSnapshot = new NetworkStats(SystemClock.elapsedRealtime(), -1);
|
mPersistSnapshot = new NetworkStats(SystemClock.elapsedRealtime(), -1);
|
||||||
mTunAnd464xlatAdjustedStats = new NetworkStats(SystemClock.elapsedRealtime(), -1);
|
mTunAnd464xlatAdjustedStats = new NetworkStats(SystemClock.elapsedRealtime(), -1);
|
||||||
}
|
}
|
||||||
mNetd = netd;
|
mContext = ctx;
|
||||||
}
|
}
|
||||||
|
|
||||||
public NetworkStats readBpfNetworkStatsDev() throws IOException {
|
public NetworkStats readBpfNetworkStatsDev() throws IOException {
|
||||||
@@ -295,11 +295,12 @@ public class NetworkStatsFactory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@GuardedBy("mPersistentDataLock")
|
@GuardedBy("mPersistentDataLock")
|
||||||
private void requestSwapActiveStatsMapLocked() throws RemoteException {
|
private void requestSwapActiveStatsMapLocked() {
|
||||||
// Ask netd to do a active map stats swap. When the binder call successfully returns,
|
// Do a active map stats swap. When the binder call successfully returns,
|
||||||
// the system server should be able to safely read and clean the inactive map
|
// the system server should be able to safely read and clean the inactive map
|
||||||
// without race problem.
|
// without race problem.
|
||||||
mNetd.trafficSwapActiveStatsMap();
|
final ConnectivityManager cm = mContext.getSystemService(ConnectivityManager.class);
|
||||||
|
cm.swapActiveStatsMap();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -327,7 +328,7 @@ public class NetworkStatsFactory {
|
|||||||
if (mUseBpfStats) {
|
if (mUseBpfStats) {
|
||||||
try {
|
try {
|
||||||
requestSwapActiveStatsMapLocked();
|
requestSwapActiveStatsMapLocked();
|
||||||
} catch (RemoteException e) {
|
} catch (RuntimeException e) {
|
||||||
throw new IOException(e);
|
throw new IOException(e);
|
||||||
}
|
}
|
||||||
// Stats are always read from the inactive map, so they must be read after the
|
// Stats are always read from the inactive map, so they must be read after the
|
||||||
|
|||||||
@@ -422,7 +422,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
|||||||
final NetworkStatsService service = new NetworkStatsService(context,
|
final NetworkStatsService service = new NetworkStatsService(context,
|
||||||
INetd.Stub.asInterface((IBinder) context.getSystemService(Context.NETD_SERVICE)),
|
INetd.Stub.asInterface((IBinder) context.getSystemService(Context.NETD_SERVICE)),
|
||||||
alarmManager, wakeLock, getDefaultClock(),
|
alarmManager, wakeLock, getDefaultClock(),
|
||||||
new DefaultNetworkStatsSettings(), new NetworkStatsFactory(netd),
|
new DefaultNetworkStatsSettings(), new NetworkStatsFactory(context),
|
||||||
new NetworkStatsObservers(), getDefaultSystemDir(), getDefaultBaseDir(),
|
new NetworkStatsObservers(), getDefaultSystemDir(), getDefaultBaseDir(),
|
||||||
new Dependencies());
|
new Dependencies());
|
||||||
|
|
||||||
@@ -1000,8 +1000,17 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// TODO: switch to data layer stats once kernel exports
|
// TODO: switch to data layer stats once kernel exports
|
||||||
// for now, read network layer stats and flatten across all ifaces
|
// for now, read network layer stats and flatten across all ifaces.
|
||||||
final NetworkStats networkLayer = readNetworkStatsUidDetail(uid, INTERFACES_ALL, TAG_ALL);
|
// This function is used to query NeworkStats for calle's uid. The only caller method
|
||||||
|
// TrafficStats#getDataLayerSnapshotForUid alrady claim no special permission to query
|
||||||
|
// its own NetworkStats.
|
||||||
|
final long ident = Binder.clearCallingIdentity();
|
||||||
|
final NetworkStats networkLayer;
|
||||||
|
try {
|
||||||
|
networkLayer = readNetworkStatsUidDetail(uid, INTERFACES_ALL, TAG_ALL);
|
||||||
|
} finally {
|
||||||
|
Binder.restoreCallingIdentity(ident);
|
||||||
|
}
|
||||||
|
|
||||||
// splice in operation counts
|
// splice in operation counts
|
||||||
networkLayer.spliceOperationsFrom(mUidOperations);
|
networkLayer.spliceOperationsFrom(mUidOperations);
|
||||||
|
|||||||
Reference in New Issue
Block a user