diff --git a/app/src/main/java/com/emanuelef/remote_capture/ConnectionsRegister.java b/app/src/main/java/com/emanuelef/remote_capture/ConnectionsRegister.java index 6d9fa185..4943efec 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/ConnectionsRegister.java +++ b/app/src/main/java/com/emanuelef/remote_capture/ConnectionsRegister.java @@ -72,13 +72,15 @@ public class ConnectionsRegister { conns = Arrays.copyOfRange(conns, conns.length - mSize, conns.length); } - int in_items = Math.min((mSize - mNumItems), conns.length); - int out_items = conns.length - in_items; + int out_items = conns.length - Math.min((mSize - mNumItems), conns.length); int insert_pos = mNumItems; ConnectionDescriptor []removedItems = null; + //Log.d(TAG, "newConnections[" + mNumItems + "/" + mSize +"]: insert " + conns.length + + // " items at " + mTail + " (removed: " + out_items + " at " + firstPos() + ")"); + if(out_items > 0) { - int pos = mTail; + int pos = firstPos(); removedItems = new ConnectionDescriptor[out_items]; // update the apps stats @@ -128,16 +130,16 @@ public class ConnectionsRegister { } } - public synchronized void connectionsUpdates(ConnectionUpdate[] conns) { + public synchronized void connectionsUpdates(ConnectionUpdate[] updates) { int first_pos = firstPos(); int first_id = mItemsRing[first_pos].incr_id; int last_id = mItemsRing[lastPos()].incr_id; - int []changed_pos = new int[conns.length]; + int []changed_pos = new int[updates.length]; int k = 0; Log.d(TAG, "connectionsUpdates: items=" + mNumItems + ", first_id=" + first_id + ", last_id=" + last_id); - for(ConnectionUpdate update: conns) { + for(ConnectionUpdate update: updates) { int id = update.incr_id; // ignore updates for untracked items @@ -159,10 +161,10 @@ public class ConnectionsRegister { } for(ConnectionsListener listener: mListeners) { - if(k != conns.length) { + if(k != updates.length) { // some untracked items where skipped, shrink the array changed_pos = Arrays.copyOf(changed_pos, k); - k = conns.length; + k = updates.length; } listener.connectionsUpdated(changed_pos); diff --git a/app/src/main/java/com/emanuelef/remote_capture/adapters/ConnectionsAdapter.java b/app/src/main/java/com/emanuelef/remote_capture/adapters/ConnectionsAdapter.java index d21b3b2a..8fd15eea 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/adapters/ConnectionsAdapter.java +++ b/app/src/main/java/com/emanuelef/remote_capture/adapters/ConnectionsAdapter.java @@ -43,6 +43,7 @@ import com.emanuelef.remote_capture.Utils; import com.emanuelef.remote_capture.model.Whitelist; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.Objects; @@ -58,7 +59,12 @@ public class ConnectionsAdapter extends RecyclerView.Adapter mIdToFilteredPos; + private ArrayList mFilteredConn; private String mFilter; public final Whitelist mWhitelist; @@ -175,8 +181,10 @@ public class ConnectionsAdapter extends RecyclerView.Adapter(); for(int i=0; i= mUnfilteredItemsCount) || (reg == null)) + if((pos < 0) || (pos >= mUnfilteredItemsCount) || (reg == null)) { + Log.w(TAG, "getItem: bad position: " + pos); return null; + } return reg.getConn(pos); } diff --git a/app/src/main/java/com/emanuelef/remote_capture/fragments/ConnectionsFragment.java b/app/src/main/java/com/emanuelef/remote_capture/fragments/ConnectionsFragment.java index 4da58b42..f7ad8e4b 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/fragments/ConnectionsFragment.java +++ b/app/src/main/java/com/emanuelef/remote_capture/fragments/ConnectionsFragment.java @@ -455,7 +455,7 @@ public class ConnectionsFragment extends Fragment implements ConnectionsListener @Override public void connectionsAdded(int start, ConnectionDescriptor []conns) { mHandler.post(() -> { - Log.d(TAG, "Added " + conns.length + " connections at " + start); + Log.d(TAG, "Add " + conns.length + " connections at " + start); mAdapter.connectionsAdded(start, conns); diff --git a/app/src/main/java/com/emanuelef/remote_capture/model/ConnectionDescriptor.java b/app/src/main/java/com/emanuelef/remote_capture/model/ConnectionDescriptor.java index 55157c54..e49c7883 100644 --- a/app/src/main/java/com/emanuelef/remote_capture/model/ConnectionDescriptor.java +++ b/app/src/main/java/com/emanuelef/remote_capture/model/ConnectionDescriptor.java @@ -21,6 +21,8 @@ package com.emanuelef.remote_capture.model; import android.content.Context; +import androidx.annotation.NonNull; + import com.emanuelef.remote_capture.AppsResolver; import com.emanuelef.remote_capture.R; @@ -128,4 +130,10 @@ public class ConnectionDescriptor implements Serializable { app.getPackageName().equals(filter))) ); } + + @Override + public @NonNull String toString() { + return "[proto=" + ipproto + "/" + l7proto + "]: " + src_ip + ":" + src_port + " -> " + + dst_ip + ":" + dst_port + " [" + uid + "] " + info; + } } diff --git a/app/src/main/jni/vpnproxy-jni/vpnproxy.c b/app/src/main/jni/vpnproxy-jni/vpnproxy.c index 07d97b81..8733a258 100644 --- a/app/src/main/jni/vpnproxy-jni/vpnproxy.c +++ b/app/src/main/jni/vpnproxy-jni/vpnproxy.c @@ -17,6 +17,7 @@ * Copyright 2020-21 - Emanuele Faranda */ +#include #include "vpnproxy.h" #include "pcap_utils.h" #include "common/utils.h" @@ -38,8 +39,8 @@ static ndpi_protocol_bitmask_struct_t masterProtos; static int dumper_socket; static bool send_header; static int netd_resolve_waiting; -static time_t last_connections_dump; -static time_t next_connections_dump; +static u_int64_t last_connections_dump; +static u_int64_t next_connections_dump; static vpnproxy_data_t *global_proxy = NULL; /* ******************************************************* */ @@ -728,7 +729,7 @@ static void sendConnectionsDump(vpnproxy_data_t *proxy) { if((proxy->new_conns.cur_items == 0) && (proxy->conns_updates.cur_items == 0)) return; - log_d("sendConnectionsDump [after %d ms]: new=%d, updates=%d", + log_d("sendConnectionsDump [after %" PRIu64 " ms]: new=%d, updates=%d", proxy->now_ms - last_connections_dump, proxy->new_conns.cur_items, proxy->conns_updates.cur_items);