12b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor/* 22b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor * Copyright (C) 2010 The Android Open Source Project 32b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor * 42b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor * Licensed under the Apache License, Version 2.0 (the "License"); 52b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor * you may not use this file except in compliance with the License. 62b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor * You may obtain a copy of the License at 72b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor * 82b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor * http://www.apache.org/licenses/LICENSE-2.0 92b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor * 102b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor * Unless required by applicable law or agreed to in writing, software 112b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor * distributed under the License is distributed on an "AS IS" BASIS, 122b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor * See the License for the specific language governing permissions and 142b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor * limitations under the License. 152b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor */ 162b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor 17d3d9c4ed9baa97f70858e639a01345a3cd78f42dChenbo Feng#define LOG_TAG "NetworkStatsNative" 182b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor 192b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor#include <dirent.h> 202b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor#include <errno.h> 212b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor#include <fcntl.h> 22853940331ff2be48ed3e63f459845e5e43d0a131Mark Salyzyn#include <inttypes.h> 232b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor#include <sys/stat.h> 242b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor#include <sys/types.h> 252b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor 26ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe#include "core_jni_helpers.h" 272b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor#include <jni.h> 282279b2534272282a5b5152723235da397e49195cSteven Moreland#include <nativehelper/ScopedUtfChars.h> 292b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor#include <utils/misc.h> 302b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor#include <utils/Log.h> 312b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor 32aedd6a3bdcb0b63c0bd6c6f01b720cddfedd51b8Chenbo Feng#include "android-base/unique_fd.h" 33aedd6a3bdcb0b63c0bd6c6f01b720cddfedd51b8Chenbo Feng#include "bpf/BpfNetworkStats.h" 34aedd6a3bdcb0b63c0bd6c6f01b720cddfedd51b8Chenbo Feng#include "bpf/BpfUtils.h" 35aedd6a3bdcb0b63c0bd6c6f01b720cddfedd51b8Chenbo Feng 36aedd6a3bdcb0b63c0bd6c6f01b720cddfedd51b8Chenbo Fengusing android::bpf::Stats; 37aedd6a3bdcb0b63c0bd6c6f01b720cddfedd51b8Chenbo Fengusing android::bpf::hasBpfSupport; 38aedd6a3bdcb0b63c0bd6c6f01b720cddfedd51b8Chenbo Fengusing android::bpf::bpfGetUidStats; 39aedd6a3bdcb0b63c0bd6c6f01b720cddfedd51b8Chenbo Fengusing android::bpf::bpfGetIfaceStats; 40aedd6a3bdcb0b63c0bd6c6f01b720cddfedd51b8Chenbo Feng 412b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnornamespace android { 422b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor 434b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkeystatic const char* QTAGUID_IFACE_STATS = "/proc/net/xt_qtaguid/iface_stat_fmt"; 4492be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkeystatic const char* QTAGUID_UID_STATS = "/proc/net/xt_qtaguid/stats"; 45c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma 46234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey// NOTE: keep these in sync with TrafficStats.java 474b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkeystatic const uint64_t UNKNOWN = -1; 484b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey 494b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkeyenum StatsType { 50234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey RX_BYTES = 0, 51234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey RX_PACKETS = 1, 52234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey TX_BYTES = 2, 534b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey TX_PACKETS = 3, 544b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey TCP_RX_PACKETS = 4, 554b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey TCP_TX_PACKETS = 5 56234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey}; 57234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey 584b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkeystatic uint64_t getStatsType(struct Stats* stats, StatsType type) { 594b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey switch (type) { 604b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey case RX_BYTES: 614b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey return stats->rxBytes; 624b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey case RX_PACKETS: 634b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey return stats->rxPackets; 644b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey case TX_BYTES: 654b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey return stats->txBytes; 664b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey case TX_PACKETS: 674b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey return stats->txPackets; 684b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey case TCP_RX_PACKETS: 694b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey return stats->tcpRxPackets; 704b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey case TCP_TX_PACKETS: 714b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey return stats->tcpTxPackets; 724b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey default: 734b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey return UNKNOWN; 744b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey } 754b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey} 764b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey 774b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkeystatic int parseIfaceStats(const char* iface, struct Stats* stats) { 784b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey FILE *fp = fopen(QTAGUID_IFACE_STATS, "r"); 794b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey if (fp == NULL) { 804b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey return -1; 8164ba5eaa40614877c679b3fbaaa3c2efd17d50d2Kazuhiro Ondo } 8264ba5eaa40614877c679b3fbaaa3c2efd17d50d2Kazuhiro Ondo 838669a1669487d5974c77ffda833c6111f316861cJeff Sharkey char buffer[384]; 84234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey char cur_iface[32]; 854b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey bool foundTcp = false; 864b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey uint64_t rxBytes, rxPackets, txBytes, txPackets, tcpRxPackets, tcpTxPackets; 874b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey 884b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey while (fgets(buffer, sizeof(buffer), fp) != NULL) { 89853940331ff2be48ed3e63f459845e5e43d0a131Mark Salyzyn int matched = sscanf(buffer, "%31s %" SCNu64 " %" SCNu64 " %" SCNu64 90853940331ff2be48ed3e63f459845e5e43d0a131Mark Salyzyn " %" SCNu64 " " "%*u %" SCNu64 " %*u %*u %*u %*u " 91853940331ff2be48ed3e63f459845e5e43d0a131Mark Salyzyn "%*u %" SCNu64 " %*u %*u %*u %*u", cur_iface, &rxBytes, 924b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey &rxPackets, &txBytes, &txPackets, &tcpRxPackets, &tcpTxPackets); 934b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey if (matched >= 5) { 944b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey if (matched == 7) { 954b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey foundTcp = true; 964b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey } 974b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey if (!iface || !strcmp(iface, cur_iface)) { 984b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey stats->rxBytes += rxBytes; 994b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey stats->rxPackets += rxPackets; 1004b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey stats->txBytes += txBytes; 1014b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey stats->txPackets += txPackets; 1024b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey if (matched == 7) { 1034b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey stats->tcpRxPackets += tcpRxPackets; 1044b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey stats->tcpTxPackets += tcpTxPackets; 1054b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey } 106234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey } 1072b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor } 1082b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor } 1092b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor 1104b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey if (!foundTcp) { 1114b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey stats->tcpRxPackets = UNKNOWN; 1124b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey stats->tcpTxPackets = UNKNOWN; 113f17b971a75577a3a0e5ab574618e0756d167f5d4Elliott Hughes } 114227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff 1154b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey if (fclose(fp) != 0) { 1164b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey return -1; 117234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey } 1184b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey return 0; 1192b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor} 1202b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor 12192be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkeystatic int parseUidStats(const uint32_t uid, struct Stats* stats) { 12292be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey FILE *fp = fopen(QTAGUID_UID_STATS, "r"); 12392be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey if (fp == NULL) { 12492be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey return -1; 12592be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey } 12692be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey 1278669a1669487d5974c77ffda833c6111f316861cJeff Sharkey char buffer[384]; 12892be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey char iface[32]; 12992be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey uint32_t idx, cur_uid, set; 13092be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey uint64_t tag, rxBytes, rxPackets, txBytes, txPackets; 13192be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey 1328669a1669487d5974c77ffda833c6111f316861cJeff Sharkey while (fgets(buffer, sizeof(buffer), fp) != NULL) { 133853940331ff2be48ed3e63f459845e5e43d0a131Mark Salyzyn if (sscanf(buffer, 134853940331ff2be48ed3e63f459845e5e43d0a131Mark Salyzyn "%" SCNu32 " %31s 0x%" SCNx64 " %u %u %" SCNu64 " %" SCNu64 135853940331ff2be48ed3e63f459845e5e43d0a131Mark Salyzyn " %" SCNu64 " %" SCNu64 "", 136853940331ff2be48ed3e63f459845e5e43d0a131Mark Salyzyn &idx, iface, &tag, &cur_uid, &set, &rxBytes, &rxPackets, 137853940331ff2be48ed3e63f459845e5e43d0a131Mark Salyzyn &txBytes, &txPackets) == 9) { 13892be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey if (uid == cur_uid && tag == 0L) { 13992be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey stats->rxBytes += rxBytes; 14092be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey stats->rxPackets += rxPackets; 14192be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey stats->txBytes += txBytes; 14292be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey stats->txPackets += txPackets; 14392be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey } 14492be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey } 14592be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey } 14692be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey 14792be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey if (fclose(fp) != 0) { 14892be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey return -1; 14992be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey } 15092be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey return 0; 15192be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey} 15292be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey 153aedd6a3bdcb0b63c0bd6c6f01b720cddfedd51b8Chenbo Fengstatic jlong getTotalStat(JNIEnv* env, jclass clazz, jint type, jboolean useBpfStats) { 1544b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey struct Stats stats; 1554b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey memset(&stats, 0, sizeof(Stats)); 156aedd6a3bdcb0b63c0bd6c6f01b720cddfedd51b8Chenbo Feng 157aedd6a3bdcb0b63c0bd6c6f01b720cddfedd51b8Chenbo Feng if (useBpfStats) { 158aedd6a3bdcb0b63c0bd6c6f01b720cddfedd51b8Chenbo Feng if (bpfGetIfaceStats(NULL, &stats) == 0) { 159aedd6a3bdcb0b63c0bd6c6f01b720cddfedd51b8Chenbo Feng return getStatsType(&stats, (StatsType) type); 160aedd6a3bdcb0b63c0bd6c6f01b720cddfedd51b8Chenbo Feng } else { 161aedd6a3bdcb0b63c0bd6c6f01b720cddfedd51b8Chenbo Feng return UNKNOWN; 162aedd6a3bdcb0b63c0bd6c6f01b720cddfedd51b8Chenbo Feng } 163aedd6a3bdcb0b63c0bd6c6f01b720cddfedd51b8Chenbo Feng } 164aedd6a3bdcb0b63c0bd6c6f01b720cddfedd51b8Chenbo Feng 1654b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey if (parseIfaceStats(NULL, &stats) == 0) { 1664b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey return getStatsType(&stats, (StatsType) type); 1674b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey } else { 1684b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey return UNKNOWN; 1694b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey } 1702b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor} 1712b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor 172aedd6a3bdcb0b63c0bd6c6f01b720cddfedd51b8Chenbo Fengstatic jlong getIfaceStat(JNIEnv* env, jclass clazz, jstring iface, jint type, 173aedd6a3bdcb0b63c0bd6c6f01b720cddfedd51b8Chenbo Feng jboolean useBpfStats) { 1744b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey ScopedUtfChars iface8(env, iface); 1754b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey if (iface8.c_str() == NULL) { 1764b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey return UNKNOWN; 1774b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey } 1784b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey 1794b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey struct Stats stats; 1804b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey memset(&stats, 0, sizeof(Stats)); 181aedd6a3bdcb0b63c0bd6c6f01b720cddfedd51b8Chenbo Feng 182aedd6a3bdcb0b63c0bd6c6f01b720cddfedd51b8Chenbo Feng if (useBpfStats) { 183aedd6a3bdcb0b63c0bd6c6f01b720cddfedd51b8Chenbo Feng if (bpfGetIfaceStats(iface8.c_str(), &stats) == 0) { 184aedd6a3bdcb0b63c0bd6c6f01b720cddfedd51b8Chenbo Feng return getStatsType(&stats, (StatsType) type); 185aedd6a3bdcb0b63c0bd6c6f01b720cddfedd51b8Chenbo Feng } else { 186aedd6a3bdcb0b63c0bd6c6f01b720cddfedd51b8Chenbo Feng return UNKNOWN; 187aedd6a3bdcb0b63c0bd6c6f01b720cddfedd51b8Chenbo Feng } 188aedd6a3bdcb0b63c0bd6c6f01b720cddfedd51b8Chenbo Feng } 189aedd6a3bdcb0b63c0bd6c6f01b720cddfedd51b8Chenbo Feng 19062f16bfc5e90f0320ab68b66b5b5b125cada1867JP Abgrall if (parseIfaceStats(iface8.c_str(), &stats) == 0) { 1914b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey return getStatsType(&stats, (StatsType) type); 192234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey } else { 1934b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey return UNKNOWN; 194234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey } 1952b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor} 1962b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor 197aedd6a3bdcb0b63c0bd6c6f01b720cddfedd51b8Chenbo Fengstatic jlong getUidStat(JNIEnv* env, jclass clazz, jint uid, jint type, jboolean useBpfStats) { 19892be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey struct Stats stats; 19992be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey memset(&stats, 0, sizeof(Stats)); 200aedd6a3bdcb0b63c0bd6c6f01b720cddfedd51b8Chenbo Feng 201aedd6a3bdcb0b63c0bd6c6f01b720cddfedd51b8Chenbo Feng if (useBpfStats) { 202aedd6a3bdcb0b63c0bd6c6f01b720cddfedd51b8Chenbo Feng if (bpfGetUidStats(uid, &stats) == 0) { 203aedd6a3bdcb0b63c0bd6c6f01b720cddfedd51b8Chenbo Feng return getStatsType(&stats, (StatsType) type); 204aedd6a3bdcb0b63c0bd6c6f01b720cddfedd51b8Chenbo Feng } else { 205aedd6a3bdcb0b63c0bd6c6f01b720cddfedd51b8Chenbo Feng return UNKNOWN; 206aedd6a3bdcb0b63c0bd6c6f01b720cddfedd51b8Chenbo Feng } 207aedd6a3bdcb0b63c0bd6c6f01b720cddfedd51b8Chenbo Feng } 208aedd6a3bdcb0b63c0bd6c6f01b720cddfedd51b8Chenbo Feng 20992be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey if (parseUidStats(uid, &stats) == 0) { 21092be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey return getStatsType(&stats, (StatsType) type); 21192be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey } else { 21292be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey return UNKNOWN; 213c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma } 2142b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor} 2152b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor 21676f6a86de25e1bf74717e047e55fd44b089673f3Daniel Micaystatic const JNINativeMethod gMethods[] = { 217aedd6a3bdcb0b63c0bd6c6f01b720cddfedd51b8Chenbo Feng {"nativeGetTotalStat", "(IZ)J", (void*) getTotalStat}, 218aedd6a3bdcb0b63c0bd6c6f01b720cddfedd51b8Chenbo Feng {"nativeGetIfaceStat", "(Ljava/lang/String;IZ)J", (void*) getIfaceStat}, 219aedd6a3bdcb0b63c0bd6c6f01b720cddfedd51b8Chenbo Feng {"nativeGetUidStat", "(IIZ)J", (void*) getUidStat}, 2202b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor}; 2212b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor 222d3d9c4ed9baa97f70858e639a01345a3cd78f42dChenbo Fengint register_android_server_net_NetworkStatsService(JNIEnv* env) { 223d3d9c4ed9baa97f70858e639a01345a3cd78f42dChenbo Feng jclass netStatsService = env->FindClass("com/android/server/net/NetworkStatsService"); 224d3d9c4ed9baa97f70858e639a01345a3cd78f42dChenbo Feng jfieldID rxBytesId = env->GetStaticFieldID(netStatsService, "TYPE_RX_BYTES", "I"); 225d3d9c4ed9baa97f70858e639a01345a3cd78f42dChenbo Feng jfieldID rxPacketsId = env->GetStaticFieldID(netStatsService, "TYPE_RX_PACKETS", "I"); 226d3d9c4ed9baa97f70858e639a01345a3cd78f42dChenbo Feng jfieldID txBytesId = env->GetStaticFieldID(netStatsService, "TYPE_TX_BYTES", "I"); 227d3d9c4ed9baa97f70858e639a01345a3cd78f42dChenbo Feng jfieldID txPacketsId = env->GetStaticFieldID(netStatsService, "TYPE_TX_PACKETS", "I"); 228d3d9c4ed9baa97f70858e639a01345a3cd78f42dChenbo Feng jfieldID tcpRxPacketsId = env->GetStaticFieldID(netStatsService, "TYPE_TCP_RX_PACKETS", "I"); 229d3d9c4ed9baa97f70858e639a01345a3cd78f42dChenbo Feng jfieldID tcpTxPacketsId = env->GetStaticFieldID(netStatsService, "TYPE_TCP_TX_PACKETS", "I"); 230d3d9c4ed9baa97f70858e639a01345a3cd78f42dChenbo Feng 231d3d9c4ed9baa97f70858e639a01345a3cd78f42dChenbo Feng env->SetStaticIntField(netStatsService, rxBytesId, RX_BYTES); 232d3d9c4ed9baa97f70858e639a01345a3cd78f42dChenbo Feng env->SetStaticIntField(netStatsService, rxPacketsId, RX_PACKETS); 233d3d9c4ed9baa97f70858e639a01345a3cd78f42dChenbo Feng env->SetStaticIntField(netStatsService, txBytesId, TX_BYTES); 234d3d9c4ed9baa97f70858e639a01345a3cd78f42dChenbo Feng env->SetStaticIntField(netStatsService, txPacketsId, TX_PACKETS); 235d3d9c4ed9baa97f70858e639a01345a3cd78f42dChenbo Feng env->SetStaticIntField(netStatsService, tcpRxPacketsId, TCP_RX_PACKETS); 236d3d9c4ed9baa97f70858e639a01345a3cd78f42dChenbo Feng env->SetStaticIntField(netStatsService, tcpTxPacketsId, TCP_TX_PACKETS); 237d3d9c4ed9baa97f70858e639a01345a3cd78f42dChenbo Feng 238d3d9c4ed9baa97f70858e639a01345a3cd78f42dChenbo Feng return jniRegisterNativeMethods(env, "com/android/server/net/NetworkStatsService", gMethods, 239d3d9c4ed9baa97f70858e639a01345a3cd78f42dChenbo Feng NELEM(gMethods)); 2402b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor} 2412b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor 2422b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor} 243