From fa4fdb1e1b950ea97902bc0b0522c0aaa4cf2300 Mon Sep 17 00:00:00 2001 From: emanuele-f Date: Tue, 6 Jul 2021 18:27:26 +0200 Subject: [PATCH] Delay closed connections free with root This prevents creating a new connection on packets retransmissions --- app/src/main/jni/vpnproxy-jni/capture_proxy.c | 4 +++ app/src/main/jni/vpnproxy-jni/capture_root.c | 30 +++++++++---------- app/src/main/jni/vpnproxy-jni/vpnproxy.c | 2 +- app/src/main/jni/vpnproxy-jni/vpnproxy.h | 1 + 4 files changed, 21 insertions(+), 16 deletions(-) diff --git a/app/src/main/jni/vpnproxy-jni/capture_proxy.c b/app/src/main/jni/vpnproxy-jni/capture_proxy.c index 36c28053..42d3fc88 100644 --- a/app/src/main/jni/vpnproxy-jni/capture_proxy.c +++ b/app/src/main/jni/vpnproxy-jni/capture_proxy.c @@ -240,6 +240,7 @@ static void destroy_connection(zdtun_t *tun, const zdtun_conn_t *conn_info) { notify_connection(&proxy->conns_updates, tuple, data); data->status = zdtun_conn_get_status(conn_info); + data->to_purge = true; } else conn_free_data(data); } @@ -284,6 +285,9 @@ static void on_packet(zdtun_t *tun, const zdtun_pkt_t *pkt, uint8_t from_tun, co } account_packet(proxy, pkt, from_tun, tuple, data, pkt_ms); + + if(data->status >= CONN_STATUS_CLOSED) + data->to_purge = true; } /* ******************************************************* */ diff --git a/app/src/main/jni/vpnproxy-jni/capture_root.c b/app/src/main/jni/vpnproxy-jni/capture_root.c index 01f424b3..ff5b848d 100644 --- a/app/src/main/jni/vpnproxy-jni/capture_root.c +++ b/app/src/main/jni/vpnproxy-jni/capture_root.c @@ -27,6 +27,7 @@ // Keep in sync with zdtun.c #define ICMP_TIMEOUT_SEC 5 #define UDP_TIMEOUT_SEC 30 +#define TCP_CLOSED_TIMEOUT_SEC 15 #define TCP_TIMEOUT_SEC 60 /* ******************************************************* */ @@ -333,12 +334,6 @@ static void handle_packet(vpnproxy_data_t *proxy, pcap_conn_t **connections, pca account_packet(proxy, &pkt, from_tun, &conn->tuple, conn->data, pkt_ms); update_connection_status(conn, &pkt, !from_tun); - - if(conn->data->status >= CONN_STATUS_CLOSED) { - // Will free the data in sendConnectionsDump - HASH_DELETE(hh, *connections, conn); - free(conn); - } } /* ******************************************************* */ @@ -352,7 +347,7 @@ static void purge_expired_connections(vpnproxy_data_t *proxy, pcap_conn_t **conn switch(conn->tuple.ipproto) { case IPPROTO_TCP: - timeout = TCP_TIMEOUT_SEC * 1000; + timeout = (conn->data->status >= CONN_STATUS_CLOSED) ? (TCP_CLOSED_TIMEOUT_SEC * 1000) : (TCP_TIMEOUT_SEC * 1000); break; case IPPROTO_UDP: timeout = UDP_TIMEOUT_SEC * 1000; @@ -362,17 +357,22 @@ static void purge_expired_connections(vpnproxy_data_t *proxy, pcap_conn_t **conn break; } - if(purge_all - || (conn->data->status >= CONN_STATUS_CLOSED) - || (last_pkt_ms >= (conn->data->last_seen + timeout))) { - log_d("IDLE (type=%d)", conn->tuple.ipproto); + if(purge_all || (last_pkt_ms >= (conn->data->last_seen + timeout))) { + //log_d("IDLE (type=%d)", conn->tuple.ipproto); - // Will free the data in sendConnectionsDump - conn->data->update_type |= CONN_UPDATE_STATS; - notify_connection(&proxy->conns_updates, &conn->tuple, conn->data); + // The connection data will be purged + conn->data->to_purge = true; - if(conn->data->status < CONN_STATUS_CLOSED) + if(conn->data->status < CONN_STATUS_CLOSED) { conn->data->status = CONN_STATUS_CLOSED; + conn->data->update_type |= CONN_UPDATE_STATS; + } + + if(conn->data->update_type != 0) { + // Will free the data in sendConnectionsDump + notify_connection(&proxy->conns_updates, &conn->tuple, conn->data); + } else + conn_free_data(conn->data); switch (conn->tuple.ipproto) { case IPPROTO_TCP: diff --git a/app/src/main/jni/vpnproxy-jni/vpnproxy.c b/app/src/main/jni/vpnproxy-jni/vpnproxy.c index 90a8d91d..f439a1ad 100644 --- a/app/src/main/jni/vpnproxy-jni/vpnproxy.c +++ b/app/src/main/jni/vpnproxy-jni/vpnproxy.c @@ -106,7 +106,7 @@ static void conns_clear(conn_array_t *arr, bool free_all) { for(int i=0; i < arr->cur_items; i++) { vpn_conn_t *slot = &arr->items[i]; - if(slot->data && ((slot->data->status >= CONN_STATUS_CLOSED) || free_all)) + if(slot->data && (slot->data->to_purge || free_all)) conn_free_data(slot->data); } diff --git a/app/src/main/jni/vpnproxy-jni/vpnproxy.h b/app/src/main/jni/vpnproxy-jni/vpnproxy.h index 263ce09d..8107c01d 100644 --- a/app/src/main/jni/vpnproxy-jni/vpnproxy.h +++ b/app/src/main/jni/vpnproxy-jni/vpnproxy.h @@ -79,6 +79,7 @@ typedef struct conn_data { uint8_t pending_dns_queries; }; bool pending_notification; + bool to_purge; bool request_done; char *request_data; char *url;