Merge "Replace qtaguid_deleteTagData with java implementation"
This commit is contained in:
@@ -51,6 +51,7 @@ import static android.net.netstats.NetworkStatsDataMigrationUtils.PREFIX_UID;
|
|||||||
import static android.net.netstats.NetworkStatsDataMigrationUtils.PREFIX_UID_TAG;
|
import static android.net.netstats.NetworkStatsDataMigrationUtils.PREFIX_UID_TAG;
|
||||||
import static android.net.netstats.NetworkStatsDataMigrationUtils.PREFIX_XT;
|
import static android.net.netstats.NetworkStatsDataMigrationUtils.PREFIX_XT;
|
||||||
import static android.os.Trace.TRACE_TAG_NETWORK;
|
import static android.os.Trace.TRACE_TAG_NETWORK;
|
||||||
|
import static android.system.OsConstants.ENOENT;
|
||||||
import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
|
import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;
|
||||||
import static android.text.format.DateUtils.DAY_IN_MILLIS;
|
import static android.text.format.DateUtils.DAY_IN_MILLIS;
|
||||||
import static android.text.format.DateUtils.HOUR_IN_MILLIS;
|
import static android.text.format.DateUtils.HOUR_IN_MILLIS;
|
||||||
@@ -120,7 +121,6 @@ import android.provider.Settings.Global;
|
|||||||
import android.service.NetworkInterfaceProto;
|
import android.service.NetworkInterfaceProto;
|
||||||
import android.service.NetworkStatsServiceDumpProto;
|
import android.service.NetworkStatsServiceDumpProto;
|
||||||
import android.system.ErrnoException;
|
import android.system.ErrnoException;
|
||||||
import android.system.Os;
|
|
||||||
import android.telephony.PhoneStateListener;
|
import android.telephony.PhoneStateListener;
|
||||||
import android.telephony.SubscriptionPlan;
|
import android.telephony.SubscriptionPlan;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
@@ -214,6 +214,14 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
|||||||
// This is current path but may be changed soon.
|
// This is current path but may be changed soon.
|
||||||
private static final String UID_COUNTERSET_MAP_PATH =
|
private static final String UID_COUNTERSET_MAP_PATH =
|
||||||
"/sys/fs/bpf/map_netd_uid_counterset_map";
|
"/sys/fs/bpf/map_netd_uid_counterset_map";
|
||||||
|
private static final String COOKIE_TAG_MAP_PATH =
|
||||||
|
"/sys/fs/bpf/map_netd_cookie_tag_map";
|
||||||
|
private static final String APP_UID_STATS_MAP_PATH =
|
||||||
|
"/sys/fs/bpf/map_netd_app_uid_stats_map";
|
||||||
|
private static final String STATS_MAP_A_PATH =
|
||||||
|
"/sys/fs/bpf/map_netd_stats_map_A";
|
||||||
|
private static final String STATS_MAP_B_PATH =
|
||||||
|
"/sys/fs/bpf/map_netd_stats_map_B";
|
||||||
|
|
||||||
private final Context mContext;
|
private final Context mContext;
|
||||||
private final NetworkStatsFactory mStatsFactory;
|
private final NetworkStatsFactory mStatsFactory;
|
||||||
@@ -341,6 +349,10 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
|||||||
*/
|
*/
|
||||||
private SparseIntArray mActiveUidCounterSet = new SparseIntArray();
|
private SparseIntArray mActiveUidCounterSet = new SparseIntArray();
|
||||||
private final IBpfMap<U32, U8> mUidCounterSetMap;
|
private final IBpfMap<U32, U8> mUidCounterSetMap;
|
||||||
|
private final IBpfMap<CookieTagMapKey, CookieTagMapValue> mCookieTagMap;
|
||||||
|
private final IBpfMap<StatsMapKey, StatsMapValue> mStatsMapA;
|
||||||
|
private final IBpfMap<StatsMapKey, StatsMapValue> mStatsMapB;
|
||||||
|
private final IBpfMap<UidStatsMapKey, StatsMapValue> mAppUidStatsMap;
|
||||||
|
|
||||||
/** Data layer operation counters for splicing into other structures. */
|
/** Data layer operation counters for splicing into other structures. */
|
||||||
private NetworkStats mUidOperations = new NetworkStats(0L, 10);
|
private NetworkStats mUidOperations = new NetworkStats(0L, 10);
|
||||||
@@ -474,6 +486,10 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
|||||||
mInterfaceMapUpdater = mDeps.makeBpfInterfaceMapUpdater(mContext, mHandler);
|
mInterfaceMapUpdater = mDeps.makeBpfInterfaceMapUpdater(mContext, mHandler);
|
||||||
mInterfaceMapUpdater.start();
|
mInterfaceMapUpdater.start();
|
||||||
mUidCounterSetMap = mDeps.getUidCounterSetMap();
|
mUidCounterSetMap = mDeps.getUidCounterSetMap();
|
||||||
|
mCookieTagMap = mDeps.getCookieTagMap();
|
||||||
|
mStatsMapA = mDeps.getStatsMapA();
|
||||||
|
mStatsMapB = mDeps.getStatsMapB();
|
||||||
|
mAppUidStatsMap = mDeps.getAppUidStatsMap();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -547,8 +563,48 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public TagStatsDeleter getTagStatsDeleter() {
|
/** Gets the cookie tag map */
|
||||||
return NetworkStatsService::nativeDeleteTagData;
|
public IBpfMap<CookieTagMapKey, CookieTagMapValue> getCookieTagMap() {
|
||||||
|
try {
|
||||||
|
return new BpfMap<CookieTagMapKey, CookieTagMapValue>(COOKIE_TAG_MAP_PATH,
|
||||||
|
BpfMap.BPF_F_RDWR, CookieTagMapKey.class, CookieTagMapValue.class);
|
||||||
|
} catch (ErrnoException e) {
|
||||||
|
Log.wtf(TAG, "Cannot create cookie tag map: " + e);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Gets stats map A */
|
||||||
|
public IBpfMap<StatsMapKey, StatsMapValue> getStatsMapA() {
|
||||||
|
try {
|
||||||
|
return new BpfMap<StatsMapKey, StatsMapValue>(STATS_MAP_A_PATH,
|
||||||
|
BpfMap.BPF_F_RDWR, StatsMapKey.class, StatsMapValue.class);
|
||||||
|
} catch (ErrnoException e) {
|
||||||
|
Log.wtf(TAG, "Cannot create stats map A: " + e);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Gets stats map B */
|
||||||
|
public IBpfMap<StatsMapKey, StatsMapValue> getStatsMapB() {
|
||||||
|
try {
|
||||||
|
return new BpfMap<StatsMapKey, StatsMapValue>(STATS_MAP_B_PATH,
|
||||||
|
BpfMap.BPF_F_RDWR, StatsMapKey.class, StatsMapValue.class);
|
||||||
|
} catch (ErrnoException e) {
|
||||||
|
Log.wtf(TAG, "Cannot create stats map B: " + e);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Gets the uid stats map */
|
||||||
|
public IBpfMap<UidStatsMapKey, StatsMapValue> getAppUidStatsMap() {
|
||||||
|
try {
|
||||||
|
return new BpfMap<UidStatsMapKey, StatsMapValue>(APP_UID_STATS_MAP_PATH,
|
||||||
|
BpfMap.BPF_F_RDWR, UidStatsMapKey.class, StatsMapValue.class);
|
||||||
|
} catch (ErrnoException e) {
|
||||||
|
Log.wtf(TAG, "Cannot create app uid stats map: " + e);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1790,6 +1846,63 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
|||||||
currentTime);
|
currentTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// deleteKernelTagData can ignore ENOENT; otherwise we should log an error
|
||||||
|
private void logErrorIfNotErrNoent(final ErrnoException e, final String msg) {
|
||||||
|
if (e.errno != ENOENT) Log.e(TAG, msg, e);
|
||||||
|
}
|
||||||
|
|
||||||
|
private <K extends StatsMapKey, V extends StatsMapValue> void deleteStatsMapTagData(
|
||||||
|
IBpfMap<K, V> statsMap, int uid) {
|
||||||
|
try {
|
||||||
|
statsMap.forEach((key, value) -> {
|
||||||
|
if (key.uid == uid) {
|
||||||
|
try {
|
||||||
|
statsMap.deleteEntry(key);
|
||||||
|
} catch (ErrnoException e) {
|
||||||
|
logErrorIfNotErrNoent(e, "Failed to delete data(uid = " + key.uid + ")");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} catch (ErrnoException e) {
|
||||||
|
Log.e(TAG, "FAILED to delete tag data from stats map", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Deletes uid tag data from CookieTagMap, StatsMapA, StatsMapB, and UidStatsMap
|
||||||
|
* @param uid
|
||||||
|
*/
|
||||||
|
private void deleteKernelTagData(int uid) {
|
||||||
|
try {
|
||||||
|
mCookieTagMap.forEach((key, value) -> {
|
||||||
|
if (value.uid == uid) {
|
||||||
|
try {
|
||||||
|
mCookieTagMap.deleteEntry(key);
|
||||||
|
} catch (ErrnoException e) {
|
||||||
|
logErrorIfNotErrNoent(e, "Failed to delete data(cookie = " + key + ")");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} catch (ErrnoException e) {
|
||||||
|
Log.e(TAG, "Failed to delete tag data from cookie tag map", e);
|
||||||
|
}
|
||||||
|
|
||||||
|
deleteStatsMapTagData(mStatsMapA, uid);
|
||||||
|
deleteStatsMapTagData(mStatsMapB, uid);
|
||||||
|
|
||||||
|
try {
|
||||||
|
mUidCounterSetMap.deleteEntry(new U32(uid));
|
||||||
|
} catch (ErrnoException e) {
|
||||||
|
logErrorIfNotErrNoent(e, "Failed to delete tag data from uid counter set map");
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
mAppUidStatsMap.deleteEntry(new UidStatsMapKey(uid));
|
||||||
|
} catch (ErrnoException e) {
|
||||||
|
logErrorIfNotErrNoent(e, "Failed to delete tag data from app uid stats map");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Clean up {@link #mUidRecorder} after UID is removed.
|
* Clean up {@link #mUidRecorder} after UID is removed.
|
||||||
*/
|
*/
|
||||||
@@ -1805,10 +1918,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
|||||||
|
|
||||||
// Clear kernel stats associated with UID
|
// Clear kernel stats associated with UID
|
||||||
for (int uid : uids) {
|
for (int uid : uids) {
|
||||||
final int ret = mDeps.getTagStatsDeleter().deleteTagData(uid);
|
deleteKernelTagData(uid);
|
||||||
if (ret < 0) {
|
|
||||||
Log.w(TAG, "problem clearing counters for uid " + uid + ": " + Os.strerror(-ret));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2387,12 +2497,4 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
|
|||||||
private static native long nativeGetTotalStat(int type);
|
private static native long nativeGetTotalStat(int type);
|
||||||
private static native long nativeGetIfaceStat(String iface, int type);
|
private static native long nativeGetIfaceStat(String iface, int type);
|
||||||
private static native long nativeGetUidStat(int uid, int type);
|
private static native long nativeGetUidStat(int uid, int type);
|
||||||
|
|
||||||
// TODO: use BpfNetMaps to delete tag data and remove this.
|
|
||||||
@VisibleForTesting
|
|
||||||
interface TagStatsDeleter {
|
|
||||||
int deleteTagData(int uid);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static native int nativeDeleteTagData(int uid);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -102,15 +102,10 @@ static jlong getUidStat(JNIEnv* env, jclass clazz, jint uid, jint type) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int deleteTagData(JNIEnv* /* env */, jclass /* clazz */, jint uid) {
|
|
||||||
return qtaguid_deleteTagData(0, uid);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const JNINativeMethod gMethods[] = {
|
static const JNINativeMethod gMethods[] = {
|
||||||
{"nativeGetTotalStat", "(I)J", (void*)getTotalStat},
|
{"nativeGetTotalStat", "(I)J", (void*)getTotalStat},
|
||||||
{"nativeGetIfaceStat", "(Ljava/lang/String;I)J", (void*)getIfaceStat},
|
{"nativeGetIfaceStat", "(Ljava/lang/String;I)J", (void*)getIfaceStat},
|
||||||
{"nativeGetUidStat", "(II)J", (void*)getUidStat},
|
{"nativeGetUidStat", "(II)J", (void*)getUidStat},
|
||||||
{"nativeDeleteTagData", "(I)I", (void*)deleteTagData},
|
|
||||||
};
|
};
|
||||||
|
|
||||||
int register_android_server_net_NetworkStatsService(JNIEnv* env) {
|
int register_android_server_net_NetworkStatsService(JNIEnv* env) {
|
||||||
|
|||||||
Reference in New Issue
Block a user