Loading packages/ConnectivityT/service/src/com/android/server/net/NetworkStatsService.java +117 −15 Original line number Original line Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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); Loading Loading @@ -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(); } } /** /** Loading Loading @@ -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; } } } } } Loading Loading @@ -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. */ */ Loading @@ -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)); } } } } } Loading Loading @@ -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); } } services/core/jni/com_android_server_net_NetworkStatsService.cpp +0 −5 Original line number Original line Diff line number Diff line Loading @@ -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) { Loading Loading
packages/ConnectivityT/service/src/com/android/server/net/NetworkStatsService.java +117 −15 Original line number Original line Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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); Loading Loading @@ -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(); } } /** /** Loading Loading @@ -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; } } } } } Loading Loading @@ -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. */ */ Loading @@ -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)); } } } } } Loading Loading @@ -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); } }
services/core/jni/com_android_server_net_NetworkStatsService.cpp +0 −5 Original line number Original line Diff line number Diff line Loading @@ -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) { Loading