Merge changes from topic "ifaceStatsDetail" into pi-dev
* changes: Remove the unused file parsing function Use eBPF map data for per iface stats
This commit is contained in:
committed by
Android (Google) Code Review
commit
4b561abcaa
@@ -56,8 +56,6 @@ public class NetworkStatsFactory {
|
|||||||
private static final boolean USE_NATIVE_PARSING = true;
|
private static final boolean USE_NATIVE_PARSING = true;
|
||||||
private static final boolean SANITY_CHECK_NATIVE = false;
|
private static final boolean SANITY_CHECK_NATIVE = false;
|
||||||
|
|
||||||
/** Path to {@code /proc/net/dev}. */
|
|
||||||
private final File mStatsIfaceDev;
|
|
||||||
/** Path to {@code /proc/net/xt_qtaguid/iface_stat_all}. */
|
/** Path to {@code /proc/net/xt_qtaguid/iface_stat_all}. */
|
||||||
private final File mStatsXtIfaceAll;
|
private final File mStatsXtIfaceAll;
|
||||||
/** Path to {@code /proc/net/xt_qtaguid/iface_stat_fmt}. */
|
/** Path to {@code /proc/net/xt_qtaguid/iface_stat_fmt}. */
|
||||||
@@ -133,47 +131,16 @@ public class NetworkStatsFactory {
|
|||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
public NetworkStatsFactory(File procRoot, boolean useBpfStats) {
|
public NetworkStatsFactory(File procRoot, boolean useBpfStats) {
|
||||||
mStatsIfaceDev = new File(procRoot, "net/dev");
|
|
||||||
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");
|
||||||
mUseBpfStats = useBpfStats;
|
mUseBpfStats = useBpfStats;
|
||||||
}
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
public NetworkStats readBpfNetworkStatsDev() throws IOException {
|
||||||
public NetworkStats readNetworkStatsIfaceDev() throws IOException {
|
|
||||||
final StrictMode.ThreadPolicy savedPolicy = StrictMode.allowThreadDiskReads();
|
|
||||||
|
|
||||||
final NetworkStats stats = new NetworkStats(SystemClock.elapsedRealtime(), 6);
|
final NetworkStats stats = new NetworkStats(SystemClock.elapsedRealtime(), 6);
|
||||||
final NetworkStats.Entry entry = new NetworkStats.Entry();
|
if (nativeReadNetworkStatsDev(stats) != 0) {
|
||||||
|
throw new IOException("Failed to parse bpf iface stats");
|
||||||
BufferedReader reader = null;
|
|
||||||
try {
|
|
||||||
reader = new BufferedReader(new FileReader(mStatsIfaceDev));
|
|
||||||
|
|
||||||
// skip first two header lines
|
|
||||||
reader.readLine();
|
|
||||||
reader.readLine();
|
|
||||||
|
|
||||||
// parse remaining lines
|
|
||||||
String line;
|
|
||||||
while ((line = reader.readLine()) != null) {
|
|
||||||
String[] values = line.trim().split("\\:?\\s+");
|
|
||||||
entry.iface = values[0];
|
|
||||||
entry.uid = UID_ALL;
|
|
||||||
entry.set = SET_ALL;
|
|
||||||
entry.tag = TAG_NONE;
|
|
||||||
entry.rxBytes = Long.parseLong(values[1]);
|
|
||||||
entry.rxPackets = Long.parseLong(values[2]);
|
|
||||||
entry.txBytes = Long.parseLong(values[9]);
|
|
||||||
entry.txPackets = Long.parseLong(values[10]);
|
|
||||||
stats.addValues(entry);
|
|
||||||
}
|
|
||||||
} catch (NullPointerException|NumberFormatException e) {
|
|
||||||
throw new ProtocolException("problem parsing stats", e);
|
|
||||||
} finally {
|
|
||||||
IoUtils.closeQuietly(reader);
|
|
||||||
StrictMode.setThreadPolicy(savedPolicy);
|
|
||||||
}
|
}
|
||||||
return stats;
|
return stats;
|
||||||
}
|
}
|
||||||
@@ -188,9 +155,9 @@ public class NetworkStatsFactory {
|
|||||||
*/
|
*/
|
||||||
public NetworkStats readNetworkStatsSummaryDev() throws IOException {
|
public NetworkStats readNetworkStatsSummaryDev() throws IOException {
|
||||||
|
|
||||||
// Return the stats get from /proc/net/dev if switched to bpf module.
|
// Return xt_bpf stats if switched to bpf module.
|
||||||
if (mUseBpfStats)
|
if (mUseBpfStats)
|
||||||
return readNetworkStatsIfaceDev();
|
return readBpfNetworkStatsDev();
|
||||||
|
|
||||||
final StrictMode.ThreadPolicy savedPolicy = StrictMode.allowThreadDiskReads();
|
final StrictMode.ThreadPolicy savedPolicy = StrictMode.allowThreadDiskReads();
|
||||||
|
|
||||||
@@ -244,9 +211,9 @@ public class NetworkStatsFactory {
|
|||||||
*/
|
*/
|
||||||
public NetworkStats readNetworkStatsSummaryXt() throws IOException {
|
public NetworkStats readNetworkStatsSummaryXt() throws IOException {
|
||||||
|
|
||||||
// Return the stats get from /proc/net/dev if qtaguid module is replaced.
|
// Return xt_bpf stats if qtaguid module is replaced.
|
||||||
if (mUseBpfStats)
|
if (mUseBpfStats)
|
||||||
return readNetworkStatsIfaceDev();
|
return readBpfNetworkStatsDev();
|
||||||
|
|
||||||
final StrictMode.ThreadPolicy savedPolicy = StrictMode.allowThreadDiskReads();
|
final StrictMode.ThreadPolicy savedPolicy = StrictMode.allowThreadDiskReads();
|
||||||
|
|
||||||
@@ -408,4 +375,7 @@ public class NetworkStatsFactory {
|
|||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
public static native int nativeReadNetworkStatsDetail(NetworkStats stats, String path,
|
public static native int nativeReadNetworkStatsDetail(NetworkStats stats, String path,
|
||||||
int limitUid, String[] limitIfaces, int limitTag, boolean useBpfStats);
|
int limitUid, String[] limitIfaces, int limitTag, boolean useBpfStats);
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
public static native int nativeReadNetworkStatsDev(NetworkStats stats);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -205,37 +205,8 @@ static int legacyReadNetworkStatsDetail(std::vector<stats_line>* lines,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int readNetworkStatsDetail(JNIEnv* env, jclass clazz, jobject stats, jstring path,
|
static int statsLinesToNetworkStats(JNIEnv* env, jclass clazz, jobject stats,
|
||||||
jint limitUid, jobjectArray limitIfacesObj, jint limitTag,
|
std::vector<stats_line>& lines) {
|
||||||
jboolean useBpfStats) {
|
|
||||||
ScopedUtfChars path8(env, path);
|
|
||||||
if (path8.c_str() == NULL) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
std::vector<std::string> limitIfaces;
|
|
||||||
if (limitIfacesObj != NULL && env->GetArrayLength(limitIfacesObj) > 0) {
|
|
||||||
int num = env->GetArrayLength(limitIfacesObj);
|
|
||||||
for (int i = 0; i < num; i++) {
|
|
||||||
jstring string = (jstring)env->GetObjectArrayElement(limitIfacesObj, i);
|
|
||||||
ScopedUtfChars string8(env, string);
|
|
||||||
if (string8.c_str() != NULL) {
|
|
||||||
limitIfaces.push_back(std::string(string8.c_str()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
std::vector<stats_line> lines;
|
|
||||||
|
|
||||||
|
|
||||||
if (useBpfStats) {
|
|
||||||
if (parseBpfNetworkStatsDetail(&lines, limitIfaces, limitTag, limitUid) < 0)
|
|
||||||
return -1;
|
|
||||||
} else {
|
|
||||||
if (legacyReadNetworkStatsDetail(&lines, limitIfaces, limitTag,
|
|
||||||
limitUid, path8.c_str()) < 0)
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int size = lines.size();
|
int size = lines.size();
|
||||||
|
|
||||||
bool grow = size > env->GetIntField(stats, gNetworkStatsClassInfo.capacity);
|
bool grow = size > env->GetIntField(stats, gNetworkStatsClassInfo.capacity);
|
||||||
@@ -308,14 +279,58 @@ static int readNetworkStatsDetail(JNIEnv* env, jclass clazz, jobject stats, jstr
|
|||||||
env->SetObjectField(stats, gNetworkStatsClassInfo.txPackets, txPackets.getJavaArray());
|
env->SetObjectField(stats, gNetworkStatsClassInfo.txPackets, txPackets.getJavaArray());
|
||||||
env->SetObjectField(stats, gNetworkStatsClassInfo.operations, operations.getJavaArray());
|
env->SetObjectField(stats, gNetworkStatsClassInfo.operations, operations.getJavaArray());
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int readNetworkStatsDetail(JNIEnv* env, jclass clazz, jobject stats, jstring path,
|
||||||
|
jint limitUid, jobjectArray limitIfacesObj, jint limitTag,
|
||||||
|
jboolean useBpfStats) {
|
||||||
|
ScopedUtfChars path8(env, path);
|
||||||
|
if (path8.c_str() == NULL) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<std::string> limitIfaces;
|
||||||
|
if (limitIfacesObj != NULL && env->GetArrayLength(limitIfacesObj) > 0) {
|
||||||
|
int num = env->GetArrayLength(limitIfacesObj);
|
||||||
|
for (int i = 0; i < num; i++) {
|
||||||
|
jstring string = (jstring)env->GetObjectArrayElement(limitIfacesObj, i);
|
||||||
|
ScopedUtfChars string8(env, string);
|
||||||
|
if (string8.c_str() != NULL) {
|
||||||
|
limitIfaces.push_back(std::string(string8.c_str()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
std::vector<stats_line> lines;
|
||||||
|
|
||||||
|
|
||||||
|
if (useBpfStats) {
|
||||||
|
if (parseBpfNetworkStatsDetail(&lines, limitIfaces, limitTag, limitUid) < 0)
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
if (legacyReadNetworkStatsDetail(&lines, limitIfaces, limitTag,
|
||||||
|
limitUid, path8.c_str()) < 0)
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return statsLinesToNetworkStats(env, clazz, stats, lines);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int readNetworkStatsDev(JNIEnv* env, jclass clazz, jobject stats) {
|
||||||
|
std::vector<stats_line> lines;
|
||||||
|
|
||||||
|
if (parseBpfNetworkStatsDev(&lines) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
return statsLinesToNetworkStats(env, clazz, stats, lines);
|
||||||
|
}
|
||||||
|
|
||||||
static const JNINativeMethod gMethods[] = {
|
static const JNINativeMethod gMethods[] = {
|
||||||
{ "nativeReadNetworkStatsDetail",
|
{ "nativeReadNetworkStatsDetail",
|
||||||
"(Landroid/net/NetworkStats;Ljava/lang/String;I[Ljava/lang/String;IZ)I",
|
"(Landroid/net/NetworkStats;Ljava/lang/String;I[Ljava/lang/String;IZ)I",
|
||||||
(void*) readNetworkStatsDetail }
|
(void*) readNetworkStatsDetail },
|
||||||
|
{ "nativeReadNetworkStatsDev", "(Landroid/net/NetworkStats;)I",
|
||||||
|
(void*) readNetworkStatsDev },
|
||||||
};
|
};
|
||||||
|
|
||||||
int register_com_android_internal_net_NetworkStatsFactory(JNIEnv* env) {
|
int register_com_android_internal_net_NetworkStatsFactory(JNIEnv* env) {
|
||||||
|
|||||||
Reference in New Issue
Block a user