From d83cfa28c292c3dc0c3c969c4dcb666139ee1963 Mon Sep 17 00:00:00 2001 From: Tamim Hossain <132823494+codewithtamim@users.noreply.github.com> Date: Tue, 12 Aug 2025 15:33:04 +0600 Subject: [PATCH] Added MTU In Settings (#4828) Added MTU In Settings. Closes #4824 --- V2rayNG/app/src/main/java/com/v2ray/ang/AppConfig.kt | 1 + .../main/java/com/v2ray/ang/handler/SettingsManager.kt | 7 +++++++ .../main/java/com/v2ray/ang/service/TProxyService.kt | 3 +-- .../java/com/v2ray/ang/service/Tun2SocksService.kt | 3 +-- .../main/java/com/v2ray/ang/service/V2RayVpnService.kt | 3 +-- .../src/main/java/com/v2ray/ang/ui/SettingsActivity.kt | 10 ++++++++++ V2rayNG/app/src/main/res/values/strings.xml | 1 + V2rayNG/app/src/main/res/xml/pref_settings.xml | 6 ++++++ 8 files changed, 28 insertions(+), 6 deletions(-) diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/AppConfig.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/AppConfig.kt index 3b573114..8f54e3db 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/AppConfig.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/AppConfig.kt @@ -27,6 +27,7 @@ object AppConfig { const val PREF_VPN_DNS = "pref_vpn_dns" const val PREF_VPN_BYPASS_LAN = "pref_vpn_bypass_lan" const val PREF_VPN_INTERFACE_ADDRESS_CONFIG_INDEX = "pref_vpn_interface_address_config_index" + const val PREF_VPN_MTU = "pref_vpn_mtu" const val PREF_ROUTING_DOMAIN_STRATEGY = "pref_routing_domain_strategy" const val PREF_ROUTING_RULESET = "pref_routing_ruleset" const val PREF_MUX_ENABLED = "pref_mux_enabled" diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/handler/SettingsManager.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/handler/SettingsManager.kt index b2e23f7f..348a9502 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/handler/SettingsManager.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/handler/SettingsManager.kt @@ -370,4 +370,11 @@ object SettingsManager { val selectedIndex = MmkvManager.decodeSettingsString(AppConfig.PREF_VPN_INTERFACE_ADDRESS_CONFIG_INDEX, "0")?.toInt() return VpnInterfaceAddressConfig.getConfigByIndex(selectedIndex ?: 0) } + + /** + * Get the VPN MTU from settings, defaulting to AppConfig.VPN_MTU. + */ + fun getVpnMtu(): Int { + return Utils.parseInt(MmkvManager.decodeSettingsString(AppConfig.PREF_VPN_MTU), AppConfig.VPN_MTU) + } } diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/service/TProxyService.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/service/TProxyService.kt index 2e764357..c23ac328 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/service/TProxyService.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/service/TProxyService.kt @@ -4,7 +4,6 @@ import android.content.Context import android.os.ParcelFileDescriptor import android.util.Log import com.v2ray.ang.AppConfig -import com.v2ray.ang.AppConfig.VPN_MTU import com.v2ray.ang.handler.MmkvManager import com.v2ray.ang.handler.SettingsManager import java.io.File @@ -60,7 +59,7 @@ class TProxyService( val vpnConfig = SettingsManager.getCurrentVpnInterfaceAddressConfig() return buildString { appendLine("tunnel:") - appendLine(" mtu: $VPN_MTU") + appendLine(" mtu: ${SettingsManager.getVpnMtu()}") appendLine(" ipv4: ${vpnConfig.ipv4Client}") if (MmkvManager.decodeSettingsBool(AppConfig.PREF_PREFER_IPV6) == true) { diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/service/Tun2SocksService.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/service/Tun2SocksService.kt index 37a26fd2..eb33f5b7 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/service/Tun2SocksService.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/service/Tun2SocksService.kt @@ -6,7 +6,6 @@ import android.net.LocalSocketAddress import android.os.ParcelFileDescriptor import android.util.Log import com.v2ray.ang.AppConfig -import com.v2ray.ang.AppConfig.VPN_MTU import com.v2ray.ang.handler.MmkvManager import com.v2ray.ang.handler.SettingsManager import com.v2ray.ang.util.Utils @@ -42,7 +41,7 @@ class Tun2SocksService( "--netif-ipaddr", vpnConfig.ipv4Router, "--netif-netmask", "255.255.255.252", "--socks-server-addr", "${AppConfig.LOOPBACK}:${socksPort}", - "--tunmtu", VPN_MTU.toString(), + "--tunmtu", SettingsManager.getVpnMtu().toString(), "--sock-path", "sock_path", "--enable-udprelay", "--loglevel", "notice" diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/service/V2RayVpnService.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/service/V2RayVpnService.kt index db4cf04b..ee71e79b 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/service/V2RayVpnService.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/service/V2RayVpnService.kt @@ -17,7 +17,6 @@ import android.util.Log import androidx.annotation.RequiresApi import com.v2ray.ang.AppConfig import com.v2ray.ang.AppConfig.LOOPBACK -import com.v2ray.ang.AppConfig.VPN_MTU import com.v2ray.ang.BuildConfig import com.v2ray.ang.handler.MmkvManager import com.v2ray.ang.handler.NotificationManager @@ -185,7 +184,7 @@ class V2RayVpnService : VpnService(), ServiceControl { val bypassLan = SettingsManager.routingRulesetsBypassLan() // Configure IPv4 settings - builder.setMtu(VPN_MTU) + builder.setMtu(SettingsManager.getVpnMtu()) builder.addAddress(vpnConfig.ipv4Client, 30) // Configure routing rules diff --git a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/SettingsActivity.kt b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/SettingsActivity.kt index f465c729..1a577db2 100644 --- a/V2rayNG/app/src/main/java/com/v2ray/ang/ui/SettingsActivity.kt +++ b/V2rayNG/app/src/main/java/com/v2ray/ang/ui/SettingsActivity.kt @@ -45,6 +45,7 @@ class SettingsActivity : BaseActivity() { private val vpnDns by lazy { findPreference(AppConfig.PREF_VPN_DNS) } private val vpnBypassLan by lazy { findPreference(AppConfig.PREF_VPN_BYPASS_LAN) } private val vpnInterfaceAddress by lazy { findPreference(AppConfig.PREF_VPN_INTERFACE_ADDRESS_CONFIG_INDEX) } + private val vpnMtu by lazy { findPreference(AppConfig.PREF_VPN_MTU) } private val mux by lazy { findPreference(AppConfig.PREF_MUX_ENABLED) } private val muxConcurrency by lazy { findPreference(AppConfig.PREF_MUX_CONCURRENCY) } @@ -93,6 +94,12 @@ class SettingsActivity : BaseActivity() { true } + vpnMtu?.setOnPreferenceChangeListener { _, any -> + val nval = any as String + vpnMtu?.summary = if (TextUtils.isEmpty(nval)) AppConfig.VPN_MTU.toString() else nval + true + } + mux?.setOnPreferenceChangeListener { _, newValue -> updateMux(newValue as Boolean) true @@ -196,6 +203,7 @@ class SettingsActivity : BaseActivity() { appendHttpProxy?.isChecked = MmkvManager.decodeSettingsBool(AppConfig.PREF_APPEND_HTTP_PROXY, false) localDnsPort?.summary = MmkvManager.decodeSettingsString(AppConfig.PREF_LOCAL_DNS_PORT, AppConfig.PORT_LOCAL_DNS) vpnDns?.summary = MmkvManager.decodeSettingsString(AppConfig.PREF_VPN_DNS, AppConfig.DNS_VPN) + vpnMtu?.summary = MmkvManager.decodeSettingsString(AppConfig.PREF_VPN_MTU, AppConfig.VPN_MTU.toString()) updateMux(MmkvManager.decodeSettingsBool(AppConfig.PREF_MUX_ENABLED, false)) mux?.isChecked = MmkvManager.decodeSettingsBool(AppConfig.PREF_MUX_ENABLED, false) @@ -229,6 +237,7 @@ class SettingsActivity : BaseActivity() { listOf( localDnsPort, vpnDns, + vpnMtu, muxConcurrency, muxXudpConcurrency, fragmentLength, @@ -298,6 +307,7 @@ class SettingsActivity : BaseActivity() { vpnDns?.isEnabled = vpn vpnBypassLan?.isEnabled = vpn vpnInterfaceAddress?.isEnabled = vpn + vpnMtu?.isEnabled = vpn if (vpn) { updateLocalDns( MmkvManager.decodeSettingsBool( diff --git a/V2rayNG/app/src/main/res/values/strings.xml b/V2rayNG/app/src/main/res/values/strings.xml index df373590..f2371271 100644 --- a/V2rayNG/app/src/main/res/values/strings.xml +++ b/V2rayNG/app/src/main/res/values/strings.xml @@ -185,6 +185,7 @@ Does VPN bypass LAN VPN Interface Address + VPN MTU Domestic DNS (Optional) DNS diff --git a/V2rayNG/app/src/main/res/xml/pref_settings.xml b/V2rayNG/app/src/main/res/xml/pref_settings.xml index 99f35aee..2ad26792 100644 --- a/V2rayNG/app/src/main/res/xml/pref_settings.xml +++ b/V2rayNG/app/src/main/res/xml/pref_settings.xml @@ -72,6 +72,12 @@ android:summary="%s" android:title="@string/title_pref_vpn_interface_address" /> + +