From f018c82cc3f8fa4d0ff9ca20d9ffc10830bee3c9 Mon Sep 17 00:00:00 2001 From: emanuele-f Date: Mon, 25 Oct 2021 17:46:48 +0200 Subject: [PATCH] If enabled, show allocs summary in the Stats --- .../activities/StatsActivity.java | 7 +++ .../remote_capture/model/VPNStats.java | 5 +- app/src/main/jni/common/utils.c | 14 +++++ app/src/main/jni/common/utils.h | 1 + app/src/main/jni/vpnproxy-jni/vpnproxy.c | 60 +++++++++++-------- app/src/main/res/layout/activity_stats.xml | 13 +++- 6 files changed, 73 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/com/emanuelef/remote_capture/activities/StatsActivity.java b/app/src/main/java/com/emanuelef/remote_capture/activities/StatsActivity.java index a0aedc78..db58cbb7 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/activities/StatsActivity.java +++ b/app/src/main/java/com/emanuelef/remote_capture/activities/StatsActivity.java @@ -58,6 +58,7 @@ public class StatsActivity extends BaseActivity { private TextView mDnsQueries; private TableLayout mTable; private TextView mBlacklistsStatus; + private TextView mAllocStats; @Override protected void onCreate(Bundle savedInstanceState) { @@ -80,6 +81,7 @@ public class StatsActivity extends BaseActivity { mDnsQueries = findViewById(R.id.dns_queries); mDnsServer = findViewById(R.id.dns_server); mBlacklistsStatus = findViewById(R.id.blacklists_status); + mAllocStats = findViewById(R.id.alloc_stats); if(CaptureService.isCapturingAsRoot()) { findViewById(R.id.dns_server_row).setVisibility(View.GONE); @@ -139,6 +141,11 @@ public class StatsActivity extends BaseActivity { if(stats.num_dropped_conns > 0) mDroppedConns.setTextColor(Color.RED); + + if(stats.alloc_summary != null) { + mAllocStats.setVisibility(View.VISIBLE); + mAllocStats.setText(stats.alloc_summary); + } } @Override diff --git a/app/src/main/java/com/emanuelef/remote_capture/model/VPNStats.java b/app/src/main/java/com/emanuelef/remote_capture/model/VPNStats.java index 71063fd7..aa3cffa2 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/model/VPNStats.java +++ b/app/src/main/java/com/emanuelef/remote_capture/model/VPNStats.java @@ -22,6 +22,7 @@ package com.emanuelef.remote_capture.model; import java.io.Serializable; public class VPNStats implements Serializable { + public String alloc_summary; public long bytes_sent; public long bytes_rcvd; public int pkts_sent; @@ -35,9 +36,11 @@ public class VPNStats implements Serializable { public int num_dns_queries; /* Invoked by native code */ - public void setData(long _bytes_sent, long _bytes_rcvd, int _pkts_sent, int _pkts_rcvd, + public void setData(String _alloc_summary, + long _bytes_sent, long _bytes_rcvd, int _pkts_sent, int _pkts_rcvd, int _pkts_dropped, int _num_dropped_conns, int _num_open_sockets, int _max_fd, int _active_conns, int _tot_conns, int _num_dns_queries) { + alloc_summary = _alloc_summary; bytes_sent = _bytes_sent; bytes_rcvd = _bytes_rcvd; pkts_sent = _pkts_sent; diff --git a/app/src/main/jni/common/utils.c b/app/src/main/jni/common/utils.c index f17ff276..12d9fae0 100644 --- a/app/src/main/jni/common/utils.c +++ b/app/src/main/jni/common/utils.c @@ -166,4 +166,18 @@ jmethodID jniGetMethodID(JNIEnv *env, jclass cls, const char *name, const char * } return method; +} + +/* ******************************************************* */ + +char* humanSize(char *buf, int bufsize, double bytes) { + static char *suffix[] = {"B", "KB", "MB", "GB", "TB"}; + int num_suffix = sizeof(suffix) / sizeof(suffix[0]); + int i; + + for(i = 0; (bytes >= 1024) && (i < num_suffix); i++) + bytes /= 1024; + + snprintf(buf, bufsize, "%.02f %s", bytes, suffix[i]); + return buf; } \ No newline at end of file diff --git a/app/src/main/jni/common/utils.h b/app/src/main/jni/common/utils.h index 809f4055..aeb05213 100644 --- a/app/src/main/jni/common/utils.h +++ b/app/src/main/jni/common/utils.h @@ -46,5 +46,6 @@ char loglvl2char(int lvl); jclass jniFindClass(JNIEnv *env, const char *name); jmethodID jniGetMethodID(JNIEnv *env, jclass cls, const char *name, const char *signature); int jniCheckException(JNIEnv *env); +char* humanSize(char *buf, int bufsize, double bytes); #endif // __LOG_UTILS_H__ diff --git a/app/src/main/jni/vpnproxy-jni/vpnproxy.c b/app/src/main/jni/vpnproxy-jni/vpnproxy.c index b99acd88..74a7adc5 100644 --- a/app/src/main/jni/vpnproxy-jni/vpnproxy.c +++ b/app/src/main/jni/vpnproxy-jni/vpnproxy.c @@ -844,10 +844,40 @@ cleanup: /* ******************************************************* */ +#ifdef PCAPDROID_TRACK_ALLOCS + +static char allocs_buf[1024]; + +static char* get_allocs_summary() { + char b1[16], b2[16], b3[16], b4[16]; + + snprintf(allocs_buf, sizeof(allocs_buf), + "*** Allocs Summary ***\n" + " PCAPdroid: %s\n" + " nDPI: %s\n" + " Blacklist (domains): %s\n" + " UTHash: %s\n", + humanSize(b1, 32, memtrack.scopes[MEMTRACK_PCAPDROID]), + humanSize(b2, 32, memtrack.scopes[MEMTRACK_NDPI]), + humanSize(b3, 32, memtrack.scopes[MEMTRACK_BLACKLIST]), + humanSize(b4, 32, memtrack.scopes[MEMTRACK_UTHASH])); + return allocs_buf; +} + +#endif + +/* ******************************************************* */ + static void sendStatsDump(const vpnproxy_data_t *proxy) { JNIEnv *env = proxy->env; const capture_stats_t *capstats = &proxy->capture_stats; const zdtun_statistics_t *stats = &proxy->stats; + jstring allocs_summary = +#ifdef PCAPDROID_TRACK_ALLOCS + (*proxy->env)->NewStringUTF(proxy->env, get_allocs_summary()); +#else + NULL; +#endif int active_conns = (int)(stats->num_icmp_conn + stats->num_tcp_conn + stats->num_udp_conn); int tot_conns = (int)(stats->num_icmp_opened + stats->num_tcp_opened + stats->num_udp_opened); @@ -860,16 +890,19 @@ static void sendStatsDump(const vpnproxy_data_t *proxy) { } (*env)->CallVoidMethod(env, stats_obj, mids.statsSetData, + allocs_summary, capstats->sent_bytes, capstats->rcvd_bytes, capstats->sent_pkts, capstats->rcvd_pkts, min(proxy->num_dropped_pkts, INT_MAX), proxy->num_dropped_connections, - stats->num_open_sockets, stats->all_max_fd, active_conns, tot_conns, proxy->num_dns_requests); + stats->num_open_sockets, stats->all_max_fd, active_conns, tot_conns, + proxy->num_dns_requests); if(!jniCheckException(env)) { (*env)->CallVoidMethod(env, proxy->vpn_service, mids.sendStatsDump, stats_obj); jniCheckException(env); } + (*env)->DeleteLocalRef(env, allocs_summary); (*env)->DeleteLocalRef(env, stats_obj); } @@ -958,24 +991,6 @@ static void reload_blacklists(vpnproxy_data_t *proxy) { /* ******************************************************* */ -#ifdef PCAPDROID_TRACK_ALLOCS - -static void print_allocs_summary() { - log_w("*** Allocs Summary ***\n" - " PCAPdroid: %zu B\n" - " nDPI: %zu B\n" - " Blacklist (domains): %zu B\n" - " UTHash: %zu B\n", - memtrack.scopes[MEMTRACK_PCAPDROID], - memtrack.scopes[MEMTRACK_NDPI], - memtrack.scopes[MEMTRACK_BLACKLIST], - memtrack.scopes[MEMTRACK_UTHASH]); -} - -#endif - -/* ******************************************************* */ - void run_housekeeping(vpnproxy_data_t *proxy) { if(proxy->capture_stats.new_stats && ((proxy->now_ms - proxy->capture_stats.last_update_ms) >= CAPTURE_STATS_UPDATE_FREQUENCY_MS) || @@ -994,9 +1009,6 @@ void run_housekeeping(vpnproxy_data_t *proxy) { last_connections_dump = proxy->now_ms; next_connections_dump = proxy->now_ms + CONNECTION_DUMP_UPDATE_FREQUENCY_MS; netd_resolve_waiting = 0; -#ifdef PCAPDROID_TRACK_ALLOCS - print_allocs_summary(); -#endif } else if ((proxy->pcap_dump.buffer_idx > 0) && (proxy->now_ms - proxy->pcap_dump.last_dump_ms) >= MAX_JAVA_DUMP_DELAY_MS) { javaPcapDump(proxy); @@ -1153,7 +1165,7 @@ static int run_tun(JNIEnv *env, jclass vpn, int tunfd, jint sdk) { mids.connUpdateSetStats = jniGetMethodID(env, cls.conn_update, "setStats", "(JJJIIII)V"); mids.connUpdateSetInfo = jniGetMethodID(env, cls.conn_update, "setInfo", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"); mids.statsInit = jniGetMethodID(env, cls.stats, "", "()V"); - mids.statsSetData = jniGetMethodID(env, cls.stats, "setData", "(JJIIIIIIIII)V"); + mids.statsSetData = jniGetMethodID(env, cls.stats, "setData", "(Ljava/lang/String;JJIIIIIIIII)V"); vpnproxy_data_t proxy = { .tunfd = tunfd, @@ -1286,7 +1298,7 @@ static int run_tun(JNIEnv *env, jclass vpn, int tunfd, jint sdk) { global_proxy = NULL; #ifdef PCAPDROID_TRACK_ALLOCS - print_allocs_summary(); + log_i(get_allocs_summary()); #endif return(rv); diff --git a/app/src/main/res/layout/activity_stats.xml b/app/src/main/res/layout/activity_stats.xml index 649c90cd..39f3cf1d 100644 --- a/app/src/main/res/layout/activity_stats.xml +++ b/app/src/main/res/layout/activity_stats.xml @@ -242,13 +242,13 @@ android:layout_height="fill_parent"> + android:layout_height="wrap_content" + android:layout_marginTop="20dp"> @@ -260,6 +260,15 @@ android:layout_height="fill_parent"> android:layout_below="@+id/blacklists_status_lbl" tools:text="Up-to-date: 4/4 ― Domain rules: 12k ― IP rules: 800\nLast update: 3h ago" /> + + \ No newline at end of file