@@ -27,6 +27,7 @@ object AppConfig {
|
|||||||
const val PREF_VPN_DNS = "pref_vpn_dns"
|
const val PREF_VPN_DNS = "pref_vpn_dns"
|
||||||
const val PREF_VPN_BYPASS_LAN = "pref_vpn_bypass_lan"
|
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_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_DOMAIN_STRATEGY = "pref_routing_domain_strategy"
|
||||||
const val PREF_ROUTING_RULESET = "pref_routing_ruleset"
|
const val PREF_ROUTING_RULESET = "pref_routing_ruleset"
|
||||||
const val PREF_MUX_ENABLED = "pref_mux_enabled"
|
const val PREF_MUX_ENABLED = "pref_mux_enabled"
|
||||||
|
|||||||
@@ -370,4 +370,11 @@ object SettingsManager {
|
|||||||
val selectedIndex = MmkvManager.decodeSettingsString(AppConfig.PREF_VPN_INTERFACE_ADDRESS_CONFIG_INDEX, "0")?.toInt()
|
val selectedIndex = MmkvManager.decodeSettingsString(AppConfig.PREF_VPN_INTERFACE_ADDRESS_CONFIG_INDEX, "0")?.toInt()
|
||||||
return VpnInterfaceAddressConfig.getConfigByIndex(selectedIndex ?: 0)
|
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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import android.content.Context
|
|||||||
import android.os.ParcelFileDescriptor
|
import android.os.ParcelFileDescriptor
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import com.v2ray.ang.AppConfig
|
import com.v2ray.ang.AppConfig
|
||||||
import com.v2ray.ang.AppConfig.VPN_MTU
|
|
||||||
import com.v2ray.ang.handler.MmkvManager
|
import com.v2ray.ang.handler.MmkvManager
|
||||||
import com.v2ray.ang.handler.SettingsManager
|
import com.v2ray.ang.handler.SettingsManager
|
||||||
import java.io.File
|
import java.io.File
|
||||||
@@ -60,7 +59,7 @@ class TProxyService(
|
|||||||
val vpnConfig = SettingsManager.getCurrentVpnInterfaceAddressConfig()
|
val vpnConfig = SettingsManager.getCurrentVpnInterfaceAddressConfig()
|
||||||
return buildString {
|
return buildString {
|
||||||
appendLine("tunnel:")
|
appendLine("tunnel:")
|
||||||
appendLine(" mtu: $VPN_MTU")
|
appendLine(" mtu: ${SettingsManager.getVpnMtu()}")
|
||||||
appendLine(" ipv4: ${vpnConfig.ipv4Client}")
|
appendLine(" ipv4: ${vpnConfig.ipv4Client}")
|
||||||
|
|
||||||
if (MmkvManager.decodeSettingsBool(AppConfig.PREF_PREFER_IPV6) == true) {
|
if (MmkvManager.decodeSettingsBool(AppConfig.PREF_PREFER_IPV6) == true) {
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ import android.net.LocalSocketAddress
|
|||||||
import android.os.ParcelFileDescriptor
|
import android.os.ParcelFileDescriptor
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
import com.v2ray.ang.AppConfig
|
import com.v2ray.ang.AppConfig
|
||||||
import com.v2ray.ang.AppConfig.VPN_MTU
|
|
||||||
import com.v2ray.ang.handler.MmkvManager
|
import com.v2ray.ang.handler.MmkvManager
|
||||||
import com.v2ray.ang.handler.SettingsManager
|
import com.v2ray.ang.handler.SettingsManager
|
||||||
import com.v2ray.ang.util.Utils
|
import com.v2ray.ang.util.Utils
|
||||||
@@ -42,7 +41,7 @@ class Tun2SocksService(
|
|||||||
"--netif-ipaddr", vpnConfig.ipv4Router,
|
"--netif-ipaddr", vpnConfig.ipv4Router,
|
||||||
"--netif-netmask", "255.255.255.252",
|
"--netif-netmask", "255.255.255.252",
|
||||||
"--socks-server-addr", "${AppConfig.LOOPBACK}:${socksPort}",
|
"--socks-server-addr", "${AppConfig.LOOPBACK}:${socksPort}",
|
||||||
"--tunmtu", VPN_MTU.toString(),
|
"--tunmtu", SettingsManager.getVpnMtu().toString(),
|
||||||
"--sock-path", "sock_path",
|
"--sock-path", "sock_path",
|
||||||
"--enable-udprelay",
|
"--enable-udprelay",
|
||||||
"--loglevel", "notice"
|
"--loglevel", "notice"
|
||||||
|
|||||||
@@ -17,7 +17,6 @@ import android.util.Log
|
|||||||
import androidx.annotation.RequiresApi
|
import androidx.annotation.RequiresApi
|
||||||
import com.v2ray.ang.AppConfig
|
import com.v2ray.ang.AppConfig
|
||||||
import com.v2ray.ang.AppConfig.LOOPBACK
|
import com.v2ray.ang.AppConfig.LOOPBACK
|
||||||
import com.v2ray.ang.AppConfig.VPN_MTU
|
|
||||||
import com.v2ray.ang.BuildConfig
|
import com.v2ray.ang.BuildConfig
|
||||||
import com.v2ray.ang.handler.MmkvManager
|
import com.v2ray.ang.handler.MmkvManager
|
||||||
import com.v2ray.ang.handler.NotificationManager
|
import com.v2ray.ang.handler.NotificationManager
|
||||||
@@ -185,7 +184,7 @@ class V2RayVpnService : VpnService(), ServiceControl {
|
|||||||
val bypassLan = SettingsManager.routingRulesetsBypassLan()
|
val bypassLan = SettingsManager.routingRulesetsBypassLan()
|
||||||
|
|
||||||
// Configure IPv4 settings
|
// Configure IPv4 settings
|
||||||
builder.setMtu(VPN_MTU)
|
builder.setMtu(SettingsManager.getVpnMtu())
|
||||||
builder.addAddress(vpnConfig.ipv4Client, 30)
|
builder.addAddress(vpnConfig.ipv4Client, 30)
|
||||||
|
|
||||||
// Configure routing rules
|
// Configure routing rules
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ class SettingsActivity : BaseActivity() {
|
|||||||
private val vpnDns by lazy { findPreference<EditTextPreference>(AppConfig.PREF_VPN_DNS) }
|
private val vpnDns by lazy { findPreference<EditTextPreference>(AppConfig.PREF_VPN_DNS) }
|
||||||
private val vpnBypassLan by lazy { findPreference<ListPreference>(AppConfig.PREF_VPN_BYPASS_LAN) }
|
private val vpnBypassLan by lazy { findPreference<ListPreference>(AppConfig.PREF_VPN_BYPASS_LAN) }
|
||||||
private val vpnInterfaceAddress by lazy { findPreference<ListPreference>(AppConfig.PREF_VPN_INTERFACE_ADDRESS_CONFIG_INDEX) }
|
private val vpnInterfaceAddress by lazy { findPreference<ListPreference>(AppConfig.PREF_VPN_INTERFACE_ADDRESS_CONFIG_INDEX) }
|
||||||
|
private val vpnMtu by lazy { findPreference<EditTextPreference>(AppConfig.PREF_VPN_MTU) }
|
||||||
|
|
||||||
private val mux by lazy { findPreference<CheckBoxPreference>(AppConfig.PREF_MUX_ENABLED) }
|
private val mux by lazy { findPreference<CheckBoxPreference>(AppConfig.PREF_MUX_ENABLED) }
|
||||||
private val muxConcurrency by lazy { findPreference<EditTextPreference>(AppConfig.PREF_MUX_CONCURRENCY) }
|
private val muxConcurrency by lazy { findPreference<EditTextPreference>(AppConfig.PREF_MUX_CONCURRENCY) }
|
||||||
@@ -93,6 +94,12 @@ class SettingsActivity : BaseActivity() {
|
|||||||
true
|
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 ->
|
mux?.setOnPreferenceChangeListener { _, newValue ->
|
||||||
updateMux(newValue as Boolean)
|
updateMux(newValue as Boolean)
|
||||||
true
|
true
|
||||||
@@ -196,6 +203,7 @@ class SettingsActivity : BaseActivity() {
|
|||||||
appendHttpProxy?.isChecked = MmkvManager.decodeSettingsBool(AppConfig.PREF_APPEND_HTTP_PROXY, false)
|
appendHttpProxy?.isChecked = MmkvManager.decodeSettingsBool(AppConfig.PREF_APPEND_HTTP_PROXY, false)
|
||||||
localDnsPort?.summary = MmkvManager.decodeSettingsString(AppConfig.PREF_LOCAL_DNS_PORT, AppConfig.PORT_LOCAL_DNS)
|
localDnsPort?.summary = MmkvManager.decodeSettingsString(AppConfig.PREF_LOCAL_DNS_PORT, AppConfig.PORT_LOCAL_DNS)
|
||||||
vpnDns?.summary = MmkvManager.decodeSettingsString(AppConfig.PREF_VPN_DNS, AppConfig.DNS_VPN)
|
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))
|
updateMux(MmkvManager.decodeSettingsBool(AppConfig.PREF_MUX_ENABLED, false))
|
||||||
mux?.isChecked = MmkvManager.decodeSettingsBool(AppConfig.PREF_MUX_ENABLED, false)
|
mux?.isChecked = MmkvManager.decodeSettingsBool(AppConfig.PREF_MUX_ENABLED, false)
|
||||||
@@ -229,6 +237,7 @@ class SettingsActivity : BaseActivity() {
|
|||||||
listOf(
|
listOf(
|
||||||
localDnsPort,
|
localDnsPort,
|
||||||
vpnDns,
|
vpnDns,
|
||||||
|
vpnMtu,
|
||||||
muxConcurrency,
|
muxConcurrency,
|
||||||
muxXudpConcurrency,
|
muxXudpConcurrency,
|
||||||
fragmentLength,
|
fragmentLength,
|
||||||
@@ -298,6 +307,7 @@ class SettingsActivity : BaseActivity() {
|
|||||||
vpnDns?.isEnabled = vpn
|
vpnDns?.isEnabled = vpn
|
||||||
vpnBypassLan?.isEnabled = vpn
|
vpnBypassLan?.isEnabled = vpn
|
||||||
vpnInterfaceAddress?.isEnabled = vpn
|
vpnInterfaceAddress?.isEnabled = vpn
|
||||||
|
vpnMtu?.isEnabled = vpn
|
||||||
if (vpn) {
|
if (vpn) {
|
||||||
updateLocalDns(
|
updateLocalDns(
|
||||||
MmkvManager.decodeSettingsBool(
|
MmkvManager.decodeSettingsBool(
|
||||||
|
|||||||
@@ -185,6 +185,7 @@
|
|||||||
<string name="title_pref_vpn_bypass_lan">Does VPN bypass LAN</string>
|
<string name="title_pref_vpn_bypass_lan">Does VPN bypass LAN</string>
|
||||||
|
|
||||||
<string name="title_pref_vpn_interface_address">VPN Interface Address</string>
|
<string name="title_pref_vpn_interface_address">VPN Interface Address</string>
|
||||||
|
<string name="title_pref_vpn_mtu">VPN MTU</string>
|
||||||
|
|
||||||
<string name="title_pref_domestic_dns">Domestic DNS (Optional)</string>
|
<string name="title_pref_domestic_dns">Domestic DNS (Optional)</string>
|
||||||
<string name="summary_pref_domestic_dns">DNS</string>
|
<string name="summary_pref_domestic_dns">DNS</string>
|
||||||
|
|||||||
@@ -72,6 +72,12 @@
|
|||||||
android:summary="%s"
|
android:summary="%s"
|
||||||
android:title="@string/title_pref_vpn_interface_address" />
|
android:title="@string/title_pref_vpn_interface_address" />
|
||||||
|
|
||||||
|
<EditTextPreference
|
||||||
|
android:inputType="number"
|
||||||
|
android:key="pref_vpn_mtu"
|
||||||
|
android:summary="1500"
|
||||||
|
android:title="@string/title_pref_vpn_mtu" />
|
||||||
|
|
||||||
<CheckBoxPreference
|
<CheckBoxPreference
|
||||||
android:key="pref_use_hev_tunnel"
|
android:key="pref_use_hev_tunnel"
|
||||||
android:summary="@string/summary_pref_use_hev_tunnel"
|
android:summary="@string/summary_pref_use_hev_tunnel"
|
||||||
|
|||||||
Reference in New Issue
Block a user