From 769bb3176c5017b9e3ba554ec1144e3e4ea7056e Mon Sep 17 00:00:00 2001 From: Mikhail Date: Fri, 15 May 2026 14:57:37 +0300 Subject: [PATCH] Prioritize Android VPN TCP handshakes --- clients/android/app/build.gradle | 4 ++-- .../src/main/java/su/cin/rapvpn/RapVpnService.java | 11 ++++++++++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/clients/android/app/build.gradle b/clients/android/app/build.gradle index d67395e..8c40e6f 100644 --- a/clients/android/app/build.gradle +++ b/clients/android/app/build.gradle @@ -30,8 +30,8 @@ android { applicationId "su.cin.rapvpn" minSdk 26 targetSdk 35 - versionCode 199 - versionName "0.2.199" + versionCode 200 + versionName "0.2.200" buildConfigField "String", "DEFAULT_BACKEND_URL", "\"${normalizeGradleString(defaultBackendUrl)}\"" buildConfigField "String", "DEFAULT_CLUSTER_ID", "\"${normalizeGradleString(defaultClusterId)}\"" buildConfigField "String", "DEFAULT_ORGANIZATION_ID", "\"${normalizeGradleString(defaultOrganizationId)}\"" diff --git a/clients/android/app/src/main/java/su/cin/rapvpn/RapVpnService.java b/clients/android/app/src/main/java/su/cin/rapvpn/RapVpnService.java index 49b16a1..1ccd83d 100644 --- a/clients/android/app/src/main/java/su/cin/rapvpn/RapVpnService.java +++ b/clients/android/app/src/main/java/su/cin/rapvpn/RapVpnService.java @@ -2267,7 +2267,14 @@ public class RapVpnService extends VpnService { } private boolean isTCPPriorityPacket(byte[] packet, int length) { - return false; + TCPFlow flow = tcpFlow(packet, length); + if (flow == null) { + return false; + } + boolean syn = (flow.flags & 0x02) != 0; + boolean fin = (flow.flags & 0x01) != 0; + boolean rst = (flow.flags & 0x04) != 0; + return syn || fin || rst; } private boolean clampIPv4TCPMSS(byte[] packet, int length, int maxMss) { @@ -3532,6 +3539,8 @@ public class RapVpnService extends VpnService { || "source_drop".equals(state) || "normalize_drop".equals(state) || "length_drop".equals(state) + || "tcp_syn_ack".equals(state) + || "tcp_mss_clamp".equals(state) || ("downlink".equals(prefix) && !"batch".equals(state) && !"restart".equals(state) && !"running".equals(state)) || ("downlink_writer".equals(prefix) && !"write".equals(state) && !"writer_idle".equals(state)); if (!important && now - lastRuntimeDetailAt < RUNTIME_DETAIL_INTERVAL_MS) {