mirror of
https://github.com/2dust/v2rayN.git
synced 2026-07-26 09:52:05 +03:00
customizable packet fragmentation settings (#9597)
* first changes * fix: use ItemsSource for fragment packets ComboBox so value saves correctly * feat: add customizable packet fragmentation for Xray-core - Add fragment settings in Core tab: Packets (dropdown), Length (range), Interval (range), MaxSplit (0-10000) - Support both 'from-to' (e.g., 50-100) and single value (e.g., 50) formats for Length, Interval, and MaxSplit - Validation with shortened error message: 'Invalid range format. Use from-to (e.g., 50-100).' - UI in PopupBox (materialDesign) visible only when EnableFragment is checked - Only Xray-core supported (Mihomo/sing-box fragment code removed) - Localization updated for 8 languages * fix: address 2dust review feedback - Move FragmentPacketsOptions to Global class - Remove default values from Fragment4RayItem model (set in ConfigHandler) - Fix Avalonia bindings: move ItemsSource and SelectedItem to code-behind - Update ViewModel to use Global.FragmentPacketsOptions - Remove defaults from model properties * Adjust ui --------- Co-authored-by: 2dust <31833384+2dust@users.noreply.github.com>
This commit is contained in:
3
.gitignore
vendored
3
.gitignore
vendored
@@ -84,6 +84,9 @@ StyleCopReport.xml
|
||||
*.rsp
|
||||
# but not Directory.Build.rsp, as it configures directory-level build defaults
|
||||
!Directory.Build.rsp
|
||||
bin/
|
||||
obj/
|
||||
build/
|
||||
*.sbr
|
||||
*.tlb
|
||||
*.tli
|
||||
|
||||
@@ -576,6 +576,58 @@ public class Utils
|
||||
}
|
||||
}
|
||||
|
||||
public static bool TryParseRange(string? input, int min, int max, out int from, out int to)
|
||||
{
|
||||
from = to = 0;
|
||||
if (string.IsNullOrWhiteSpace(input))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
var parts = input.Split('-');
|
||||
if (parts.Length == 1)
|
||||
{
|
||||
if (!int.TryParse(parts[0], out from))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
to = from;
|
||||
return from >= min && to <= max;
|
||||
}
|
||||
if (parts.Length != 2
|
||||
|| !int.TryParse(parts[0], out from)
|
||||
|| !int.TryParse(parts[1], out to))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return from >= min && to <= max && from <= to;
|
||||
}
|
||||
|
||||
public static bool TryParseMaxSplit(string? input, int min, int max, out int from, out int to)
|
||||
{
|
||||
from = to = 0;
|
||||
if (string.IsNullOrWhiteSpace(input))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
var parts = input.Split('-');
|
||||
if (parts.Length == 1)
|
||||
{
|
||||
if (!int.TryParse(parts[0], out from))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
to = from;
|
||||
return from >= min && to <= max;
|
||||
}
|
||||
if (parts.Length != 2
|
||||
|| !int.TryParse(parts[0], out from)
|
||||
|| !int.TryParse(parts[1], out to))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return from >= min && to <= max && from <= to;
|
||||
}
|
||||
|
||||
public static bool IsPrivateNetwork(string ip)
|
||||
{
|
||||
if (IPAddress.TryParse(ip, out var address))
|
||||
|
||||
@@ -406,6 +406,16 @@ public class Global
|
||||
""
|
||||
];
|
||||
|
||||
public static readonly List<string> FragmentPacketsOptions =
|
||||
[
|
||||
"tlshello",
|
||||
"1-1",
|
||||
"1-2",
|
||||
"1-3",
|
||||
"1-4",
|
||||
"1-5"
|
||||
];
|
||||
|
||||
public static readonly List<string> UserAgent =
|
||||
[
|
||||
"chrome",
|
||||
|
||||
@@ -169,7 +169,8 @@ public static class ConfigHandler
|
||||
{
|
||||
Packets = "tlshello",
|
||||
Length = "50-100",
|
||||
Interval = "10-20"
|
||||
Interval = "10-20",
|
||||
MaxSplit = "0"
|
||||
};
|
||||
config.GlobalHotkeys ??= [];
|
||||
|
||||
|
||||
@@ -249,6 +249,7 @@ public class Fragment4RayItem
|
||||
public string? Packets { get; set; }
|
||||
public string? Length { get; set; }
|
||||
public string? Interval { get; set; }
|
||||
public string? MaxSplit { get; set; }
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
|
||||
@@ -512,6 +512,7 @@ public class MaskSettings4Ray
|
||||
|
||||
public string? length { get; set; }
|
||||
public string? delay { get; set; }
|
||||
public int? maxSplit { get; set; }
|
||||
|
||||
// noise
|
||||
public int? reset { get; set; }
|
||||
|
||||
117
v2rayN/ServiceLib/Resx/ResUI.Designer.cs
generated
117
v2rayN/ServiceLib/Resx/ResUI.Designer.cs
generated
@@ -231,6 +231,15 @@ namespace ServiceLib.Resx {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Fragment parameter format error. Please check Length (e.g. 50-100), Interval (1-100 range), and MaxSplit (0-10000). 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string FillFragmentParameterError {
|
||||
get {
|
||||
return ResourceManager.GetString("FillFragmentParameterError", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Please enter the local listening port. 的本地化字符串。
|
||||
/// </summary>
|
||||
@@ -4086,6 +4095,114 @@ namespace ServiceLib.Resx {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Fragment Length 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string TbSettingsFragmentLength {
|
||||
get {
|
||||
return ResourceManager.GetString("TbSettingsFragmentLength", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Fragment size range in bytes (e.g., 50-100). First value must be <= second. Empty = default. 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string TbSettingsFragmentLengthTip {
|
||||
get {
|
||||
return ResourceManager.GetString("TbSettingsFragmentLengthTip", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Fragment Interval 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string TbSettingsFragmentInterval {
|
||||
get {
|
||||
return ResourceManager.GetString("TbSettingsFragmentInterval", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Delay between fragments in ms (e.g., 10-20). Range 1-100. First value must be <= second. Empty = default. 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string TbSettingsFragmentIntervalTip {
|
||||
get {
|
||||
return ResourceManager.GetString("TbSettingsFragmentIntervalTip", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Max Split 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string TbSettingsFragmentMaxSplit {
|
||||
get {
|
||||
return ResourceManager.GetString("TbSettingsFragmentMaxSplit", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Maximum number of splits (0 = unlimited, 0-10000). Only effective for Xray-core. Empty = default. 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string TbSettingsFragmentMaxSplitTip {
|
||||
get {
|
||||
return ResourceManager.GetString("TbSettingsFragmentMaxSplitTip", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Fragment Packets 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string TbSettingsFragmentPackets {
|
||||
get {
|
||||
return ResourceManager.GetString("TbSettingsFragmentPackets", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Packets to fragment: tlshello (TLS ClientHello) or 1-1 to 1-5 (first N TCP packets) 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string TbSettingsFragmentPacketsTip {
|
||||
get {
|
||||
return ResourceManager.GetString("TbSettingsFragmentPacketsTip", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Sing-box Fragment Strategy 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string TbSettingsFragmentSingboxStrategy {
|
||||
get {
|
||||
return ResourceManager.GetString("TbSettingsFragmentSingboxStrategy", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 TLS Fragment: standard TLS record splitting. TCP Bypass: fragment TCP packets. Double: both modes combined. sing-box only. 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string TbSettingsFragmentSingboxStrategyTip {
|
||||
get {
|
||||
return ResourceManager.GetString("TbSettingsFragmentSingboxStrategyTip", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Fallback Delay 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string TbSettingsFragmentFallbackDelay {
|
||||
get {
|
||||
return ResourceManager.GetString("TbSettingsFragmentFallbackDelay", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Fallback delay for TLS fragment. Only effective for sing-box. Empty = default. 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string TbSettingsFragmentFallbackDelayTip {
|
||||
get {
|
||||
return ResourceManager.GetString("TbSettingsFragmentFallbackDelayTip", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Enable hardware acceleration (requires restart) 的本地化字符串。
|
||||
/// </summary>
|
||||
|
||||
@@ -1104,6 +1104,39 @@
|
||||
<data name="TbSettingsEnableFragment" xml:space="preserve">
|
||||
<value>فعال کردن فرگمنت</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentPackets" xml:space="preserve">
|
||||
<value>پکتهای فرگمنت</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentPacketsTip" xml:space="preserve">
|
||||
<value>پکتهای قابل فرگمنت: tlshello (TLS ClientHello) یا 1-1 تا 1-5 (N اول پکت TCP)</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentLength" xml:space="preserve">
|
||||
<value>طول فرگمنت</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentLengthTip" xml:space="preserve">
|
||||
<value>محدوده اندازه فرگمنت بایت (مثلا 50-100). اول ≤ دوم. خالی = پیشفرض.</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentInterval" xml:space="preserve">
|
||||
<value>فاصله فرگمنت</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentIntervalTip" xml:space="preserve">
|
||||
<value>تأخیر بین فرگمنتها میلیثانیه (مثلا 10-20). بازه 1-100. اول ≤ دوم. خالی = پیشفرض.</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentMaxSplit" xml:space="preserve">
|
||||
<value>حداکثر تقسیم</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentMaxSplitTip" xml:space="preserve">
|
||||
<value>مکسیمم تعداد تقسیم (0 = نامحدود، 0-10000). فقط Xray-core. خالی = پیشفرض.</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentFallbackDelay" xml:space="preserve">
|
||||
<value>تأخیر فولبک</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentFallbackDelayTip" xml:space="preserve">
|
||||
<value>تأخیر فولبک فرگمنت TLS. فقط sing-box. خالی = پیشفرض.</value>
|
||||
</data>
|
||||
<data name="FillFragmentParameterError" xml:space="preserve">
|
||||
<value>فرمت محدوده نامعتبر. از 'from-to' استفاده کنید (مثلا 50-100).</value>
|
||||
</data>
|
||||
<data name="TbSettingsEnableCacheFile4Sbox" xml:space="preserve">
|
||||
<value>فعال کردن کش فایل مجموعه قوانین برای sing-box</value>
|
||||
</data>
|
||||
|
||||
@@ -1101,6 +1101,39 @@
|
||||
<data name="TbSettingsEnableFragment" xml:space="preserve">
|
||||
<value>Activer le fragmentation (Fragment)</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentPackets" xml:space="preserve">
|
||||
<value>Paquets fragmentés</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentPacketsTip" xml:space="preserve">
|
||||
<value>Paquets à fragmenter : tlshello (TLS ClientHello) ou 1-1 à 1-5 (premiers N paquets TCP)</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentLength" xml:space="preserve">
|
||||
<value>Longueur fragment</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentLengthTip" xml:space="preserve">
|
||||
<value>Plage de taille fragment (ex: 50-100). Première valeur ≤ seconde. Vide = défaut.</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentInterval" xml:space="preserve">
|
||||
<value>Intervalle fragment</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentIntervalTip" xml:space="preserve">
|
||||
<value>Délai entre fragments en ms (ex: 10-20). Plage 1-100. Première valeur ≤ seconde. Vide = défaut.</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentMaxSplit" xml:space="preserve">
|
||||
<value>Max Split</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentMaxSplitTip" xml:space="preserve">
|
||||
<value>Nb max de splits (0 = illimité, 0-10000). Xray-core seulement. Vide = défaut.</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentFallbackDelay" xml:space="preserve">
|
||||
<value>Délai fallback</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentFallbackDelayTip" xml:space="preserve">
|
||||
<value>Délai fallback pour fragment TLS. sing-box seulement. Vide = défaut.</value>
|
||||
</data>
|
||||
<data name="FillFragmentParameterError" xml:space="preserve">
|
||||
<value>Format de plage invalide. Utilisez 'from-to' (ex: 50-100).</value>
|
||||
</data>
|
||||
<data name="TbSettingsEnableCacheFile4Sbox" xml:space="preserve">
|
||||
<value>Activer le fichier de cache de sing-box (fichiers règles)</value>
|
||||
</data>
|
||||
|
||||
@@ -1104,6 +1104,39 @@
|
||||
<data name="TbSettingsEnableFragment" xml:space="preserve">
|
||||
<value>Fragment engedélyezése</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentPackets" xml:space="preserve">
|
||||
<value>Fragmentált csomagok</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentPacketsTip" xml:space="preserve">
|
||||
<value>Fragmentálandó csomagok: tlshello (TLS ClientHello) vagy 1-1 – 1-5 (az első N TCP csomag)</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentLength" xml:space="preserve">
|
||||
<value>Fragment hossz</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentLengthTip" xml:space="preserve">
|
||||
<value>Fragment méret tartománya bájtokban (pl. 50-100). Az első érték ≤ második. Üres = alapértelmezett.</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentInterval" xml:space="preserve">
|
||||
<value>Fragment intervallum</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentIntervalTip" xml:space="preserve">
|
||||
<value>Késleltetés a fragmented csomagok között ms-ben (pl. 10-20). Tartomány 1-100. Az első érték ≤ második. Üres = alapértelmezett.</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentMaxSplit" xml:space="preserve">
|
||||
<value>Max darabolás</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentMaxSplitTip" xml:space="preserve">
|
||||
<value>Maximális darabolások száma (0 = korlátlan, 0-10000). Csak Xray-core. Üres = alapértelmezett.</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentFallbackDelay" xml:space="preserve">
|
||||
<value>Fallback késleltetés</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentFallbackDelayTip" xml:space="preserve">
|
||||
<value>TLS fragment fallback késleltetés. Csak sing-box. Üres = alapértelmezett.</value>
|
||||
</data>
|
||||
<data name="FillFragmentParameterError" xml:space="preserve">
|
||||
<value>Érvénytelen tartomány formátum. Használja 'from-to' (pl. 50-100).</value>
|
||||
</data>
|
||||
<data name="TbSettingsEnableCacheFile4Sbox" xml:space="preserve">
|
||||
<value>Gyorsítótár fájl engedélyezése sing-boxhoz (szabálykészlet fájlok)</value>
|
||||
</data>
|
||||
|
||||
@@ -1104,6 +1104,39 @@
|
||||
<data name="TbSettingsEnableFragment" xml:space="preserve">
|
||||
<value>Aktifkan fragment</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentPackets" xml:space="preserve">
|
||||
<value>Paket Fragment</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentPacketsTip" xml:space="preserve">
|
||||
<value>Paket untuk difragmentasikan: tlshello (TLS ClientHello) atau 1-1 s.d. 1-5 (N paket TCP pertama)</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentLength" xml:space="preserve">
|
||||
<value>Panjang Fragment</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentLengthTip" xml:space="preserve">
|
||||
<value>Rentang ukuran fragment (byte), cth: 50-100. Nilai pertama harus ≤ kedua. Kosong = default.</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentInterval" xml:space="preserve">
|
||||
<value>Interval Fragment</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentIntervalTip" xml:space="preserve">
|
||||
<value>Jeda antar fragment (ms), cth: 10-20. Rentang 1-100. Nilai pertama harus ≤ kedua. Kosong = default.</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentMaxSplit" xml:space="preserve">
|
||||
<value>Maks Split</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentMaxSplitTip" xml:space="preserve">
|
||||
<value>Maks jumlah split (0 = unlimited, 0-10000). Hanya Xray-core. Kosong = default.</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentFallbackDelay" xml:space="preserve">
|
||||
<value>Fallback Delay</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentFallbackDelayTip" xml:space="preserve">
|
||||
<value>Delay fallback untuk TLS fragment. Hanya sing-box. Kosong = default.</value>
|
||||
</data>
|
||||
<data name="FillFragmentParameterError" xml:space="preserve">
|
||||
<value>Format range tidak valid. Gunakan 'from-to' (cth: 50-100).</value>
|
||||
</data>
|
||||
<data name="TbSettingsEnableCacheFile4Sbox" xml:space="preserve">
|
||||
<value>Aktifkan file cache untuk sing-box (file ruleset)</value>
|
||||
</data>
|
||||
|
||||
@@ -1104,6 +1104,39 @@
|
||||
<data name="TbSettingsEnableFragment" xml:space="preserve">
|
||||
<value>Enable fragment</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentPackets" xml:space="preserve">
|
||||
<value>Fragment Packets</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentPacketsTip" xml:space="preserve">
|
||||
<value>Packets to fragment: tlshello (TLS ClientHello) or 1-1 to 1-5 (first N TCP packets)</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentLength" xml:space="preserve">
|
||||
<value>Fragment Length</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentLengthTip" xml:space="preserve">
|
||||
<value>Fragment size range in bytes (e.g., 50-100). First value must be <= second. Empty = default.</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentInterval" xml:space="preserve">
|
||||
<value>Fragment Interval</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentIntervalTip" xml:space="preserve">
|
||||
<value>Delay between fragments in ms (e.g., 10-20). Range 1-100. First value must be <= second. Empty = default.</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentMaxSplit" xml:space="preserve">
|
||||
<value>Max Split</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentMaxSplitTip" xml:space="preserve">
|
||||
<value>Maximum number of fragments per packet (0-10000, 0 = unlimited). Xray only. Empty = default.</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentFallbackDelay" xml:space="preserve">
|
||||
<value>Fallback Delay</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentFallbackDelayTip" xml:space="preserve">
|
||||
<value>Fallback delay when ACK detection unavailable (e.g., 500ms). sing-box only. Empty = default.</value>
|
||||
</data>
|
||||
<data name="FillFragmentParameterError" xml:space="preserve">
|
||||
<value>Invalid range format. Use 'from-to' (e.g., 50-100).</value>
|
||||
</data>
|
||||
<data name="TbSettingsEnableCacheFile4Sbox" xml:space="preserve">
|
||||
<value>Enable cache file for sing-box (ruleset files)</value>
|
||||
</data>
|
||||
|
||||
@@ -1104,6 +1104,39 @@
|
||||
<data name="TbSettingsEnableFragment" xml:space="preserve">
|
||||
<value>Включить фрагментацию (Fragment)</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentPackets" xml:space="preserve">
|
||||
<value>Пакеты для фрагментации</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentPacketsTip" xml:space="preserve">
|
||||
<value>Пакеты для фрагментации: tlshello (TLS ClientHello) или 1-1 — 1-5 (первые N TCP-пакетов)</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentLength" xml:space="preserve">
|
||||
<value>Длина фрагмента</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentLengthTip" xml:space="preserve">
|
||||
<value>Диапазон размера фрагмента в байтах (например, 50-100). Первое значение не больше второго. Пусто = по умолчанию.</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentInterval" xml:space="preserve">
|
||||
<value>Интервал фрагментации</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentIntervalTip" xml:space="preserve">
|
||||
<value>Задержка между фрагментами в мс (например, 10-20). Диапазон 1-100. Первое значение не больше второго. Пусто = по умолчанию.</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentMaxSplit" xml:space="preserve">
|
||||
<value>Макс. разделение</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentMaxSplitTip" xml:space="preserve">
|
||||
<value>Максимальное число разделений (0 = без лимита, 0-10000). Только для Xray-core. Пусто = по умолчанию.</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentFallbackDelay" xml:space="preserve">
|
||||
<value>Резервная задержка</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentFallbackDelayTip" xml:space="preserve">
|
||||
<value>Резервная задержка для TLS-фрагмента. Только для sing-box. Пусто = по умолчанию.</value>
|
||||
</data>
|
||||
<data name="FillFragmentParameterError" xml:space="preserve">
|
||||
<value>Неверный формат диапазона. Используйте 'from-to' (например, 50-100).</value>
|
||||
</data>
|
||||
<data name="TbSettingsEnableCacheFile4Sbox" xml:space="preserve">
|
||||
<value>Включить файл кэша для sing-box (файлы наборов правил)</value>
|
||||
</data>
|
||||
|
||||
@@ -1101,6 +1101,39 @@
|
||||
<data name="TbSettingsEnableFragment" xml:space="preserve">
|
||||
<value>启用分片 (Fragment)</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentPackets" xml:space="preserve">
|
||||
<value>分片包类型</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentPacketsTip" xml:space="preserve">
|
||||
<value>要分片的包类型: tlshello (TLS ClientHello) 或 1-1 到 1-5 (前 N 个 TCP 包)</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentLength" xml:space="preserve">
|
||||
<value>分片长度</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentLengthTip" xml:space="preserve">
|
||||
<value>分片大小范围(字节), 如 50-100. 第一个值必须 <= 第二个值. 留空使用默认值.</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentInterval" xml:space="preserve">
|
||||
<value>分片间隔</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentIntervalTip" xml:space="preserve">
|
||||
<value>分片间延迟(毫秒), 如 10-20. 范围 1-100. 第一个值必须 <= 第二个值. 留空使用默认值.</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentMaxSplit" xml:space="preserve">
|
||||
<value>最大分片数</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentMaxSplitTip" xml:space="preserve">
|
||||
<value>每个包最大分片数 (0-10000, 0=无限制). 仅 Xray. 留空使用默认值.</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentFallbackDelay" xml:space="preserve">
|
||||
<value>回退延迟</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentFallbackDelayTip" xml:space="preserve">
|
||||
<value>ACK 检测不可用时的回退延迟 (如 500ms). 仅 sing-box. 留空使用默认值.</value>
|
||||
</data>
|
||||
<data name="FillFragmentParameterError" xml:space="preserve">
|
||||
<value>无效的范围格式。请使用 'from-to' (如 50-100)。</value>
|
||||
</data>
|
||||
<data name="TbSettingsEnableCacheFile4Sbox" xml:space="preserve">
|
||||
<value>启用 sing-box (规则集文件) 的缓存文件</value>
|
||||
</data>
|
||||
|
||||
@@ -1101,6 +1101,39 @@
|
||||
<data name="TbSettingsEnableFragment" xml:space="preserve">
|
||||
<value>啟用分片(Fragment)</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentPackets" xml:space="preserve">
|
||||
<value>分片封包類型</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentPacketsTip" xml:space="preserve">
|
||||
<value>要分片的封包類型:tlshello (TLS ClientHello) 或 1-1 到 1-5 (前 N 個 TCP 封包)</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentLength" xml:space="preserve">
|
||||
<value>分片長度</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentLengthTip" xml:space="preserve">
|
||||
<value>分片大小範圍(位元組),如 50-100。第一個值必須 <= 第二個值。留空使用預設值。</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentInterval" xml:space="preserve">
|
||||
<value>分片間隔</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentIntervalTip" xml:space="preserve">
|
||||
<value>分片間延遲(毫秒),如 10-20。範圍 1-100。第一個值必須 <= 第二個值。留空使用預設值。</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentMaxSplit" xml:space="preserve">
|
||||
<value>最大分片數</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentMaxSplitTip" xml:space="preserve">
|
||||
<value>每個封包最大分片數 (0-10000, 0=無限制)。僅 Xray。留空使用預設值。</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentFallbackDelay" xml:space="preserve">
|
||||
<value>回退延遲</value>
|
||||
</data>
|
||||
<data name="TbSettingsFragmentFallbackDelayTip" xml:space="preserve">
|
||||
<value>ACK 偵測不可用時的回退延遲 (如 500ms)。僅 sing-box。留空使用預設值。</value>
|
||||
</data>
|
||||
<data name="FillFragmentParameterError" xml:space="preserve">
|
||||
<value>無效的範圍格式。請使用 'from-to' (如 50-100)。</value>
|
||||
</data>
|
||||
<data name="TbSettingsEnableCacheFile4Sbox" xml:space="preserve">
|
||||
<value>啟用 sing-box(規則集檔案)的快取檔案</value>
|
||||
</data>
|
||||
|
||||
@@ -896,9 +896,17 @@ public partial class CoreConfigV2rayService
|
||||
|
||||
private (Mask4Ray tcpFragment, Mask4Ray udpNoise) BuildFragmentsMasks()
|
||||
{
|
||||
var configPackets = _config.Fragment4RayItem?.Packets ?? "tlshello";
|
||||
var configLength = _config.Fragment4RayItem?.Length ?? "50-100";
|
||||
var configDelay = _config.Fragment4RayItem?.Interval ?? "10-20";
|
||||
var configPackets = _config.Fragment4RayItem?.Packets.NullIfEmpty() ?? "tlshello";
|
||||
var configLength = _config.Fragment4RayItem?.Length.NullIfEmpty() ?? "50-100";
|
||||
var configDelay = _config.Fragment4RayItem?.Interval.NullIfEmpty() ?? "10-20";
|
||||
var configMaxSplit = _config.Fragment4RayItem?.MaxSplit.NullIfEmpty() ?? "0";
|
||||
|
||||
var maxSplit = 0;
|
||||
var parts = configMaxSplit.Split('-');
|
||||
if (parts.Length > 0 && int.TryParse(parts[0], out var ms))
|
||||
{
|
||||
maxSplit = ms;
|
||||
}
|
||||
|
||||
var fragmentMask = new Mask4Ray
|
||||
{
|
||||
@@ -908,6 +916,7 @@ public partial class CoreConfigV2rayService
|
||||
packets = configPackets,
|
||||
length = configLength,
|
||||
delay = configDelay,
|
||||
maxSplit = maxSplit,
|
||||
}
|
||||
};
|
||||
var noiseMask = new Mask4Ray
|
||||
|
||||
@@ -26,6 +26,10 @@ public class OptionSettingViewModel : MyReactiveObject
|
||||
[Reactive] public int? HyDownMbps { get; set; }
|
||||
[Reactive] public bool EnableFragment { get; set; }
|
||||
[Reactive] public bool EnableFinalFragment { get; set; }
|
||||
[Reactive] public string FragmentPackets { get; set; }
|
||||
[Reactive] public string FragmentLength { get; set; }
|
||||
[Reactive] public string FragmentInterval { get; set; }
|
||||
[Reactive] public string FragmentMaxSplit { get; set; }
|
||||
|
||||
#endregion Core
|
||||
|
||||
@@ -163,6 +167,10 @@ public class OptionSettingViewModel : MyReactiveObject
|
||||
HyDownMbps = _config.HysteriaItem.DownMbps;
|
||||
EnableFragment = _config.CoreBasicItem.EnableFragment;
|
||||
EnableFinalFragment = _config.CoreBasicItem.EnableFinalFragment;
|
||||
FragmentPackets = _config.Fragment4RayItem?.Packets;
|
||||
FragmentLength = _config.Fragment4RayItem?.Length;
|
||||
FragmentInterval = _config.Fragment4RayItem?.Interval;
|
||||
FragmentMaxSplit = _config.Fragment4RayItem?.MaxSplit;
|
||||
|
||||
#endregion Core
|
||||
|
||||
@@ -343,8 +351,31 @@ public class OptionSettingViewModel : MyReactiveObject
|
||||
_config.CoreBasicItem.EnableCacheFile4Sbox = EnableCacheFile4Sbox;
|
||||
_config.HysteriaItem.UpMbps = HyUpMbps ?? 0;
|
||||
_config.HysteriaItem.DownMbps = HyDownMbps ?? 0;
|
||||
if (EnableFragment)
|
||||
{
|
||||
if (!Utils.TryParseRange(FragmentLength, 0, int.MaxValue, out _, out _))
|
||||
{
|
||||
NoticeManager.Instance.Enqueue(ResUI.FillFragmentParameterError);
|
||||
return;
|
||||
}
|
||||
if (!Utils.TryParseRange(FragmentInterval, 1, 100, out _, out _))
|
||||
{
|
||||
NoticeManager.Instance.Enqueue(ResUI.FillFragmentParameterError);
|
||||
return;
|
||||
}
|
||||
if (FragmentMaxSplit.IsNotEmpty()
|
||||
&& !Utils.TryParseMaxSplit(FragmentMaxSplit, 0, 10000, out _, out _))
|
||||
{
|
||||
NoticeManager.Instance.Enqueue(ResUI.FillFragmentParameterError);
|
||||
return;
|
||||
}
|
||||
}
|
||||
_config.CoreBasicItem.EnableFragment = EnableFragment;
|
||||
_config.CoreBasicItem.EnableFinalFragment = EnableFinalFragment;
|
||||
_config.Fragment4RayItem.Packets = FragmentPackets;
|
||||
_config.Fragment4RayItem.Length = FragmentLength;
|
||||
_config.Fragment4RayItem.Interval = FragmentInterval;
|
||||
_config.Fragment4RayItem.MaxSplit = FragmentMaxSplit;
|
||||
|
||||
_config.GuiItem.AutoRun = AutoRun;
|
||||
_config.GuiItem.EnableStatistics = EnableStatistics;
|
||||
|
||||
@@ -300,6 +300,115 @@
|
||||
Margin="{StaticResource Margin4}"
|
||||
HorizontalAlignment="Left" />
|
||||
|
||||
<Button
|
||||
Grid.Row="20"
|
||||
Grid.Column="2"
|
||||
Margin="{StaticResource MarginLr8}"
|
||||
HorizontalAlignment="Left"
|
||||
Classes="IconButton">
|
||||
<Button.Content>
|
||||
<PathIcon Data="{StaticResource SemiIconMore}">
|
||||
<PathIcon.RenderTransform>
|
||||
<RotateTransform Angle="90" />
|
||||
</PathIcon.RenderTransform>
|
||||
</PathIcon>
|
||||
</Button.Content>
|
||||
<Button.Flyout>
|
||||
<Flyout>
|
||||
<StackPanel Margin="{StaticResource Margin8}">
|
||||
<Grid ColumnDefinitions="Auto,Auto,400" RowDefinitions="Auto,Auto,Auto,Auto,Auto">
|
||||
<TextBlock
|
||||
Grid.Row="0"
|
||||
Grid.Column="0"
|
||||
Margin="{StaticResource Margin4}"
|
||||
VerticalAlignment="Center"
|
||||
Text="{x:Static resx:ResUI.TbSettingsFragmentPackets}" />
|
||||
<ComboBox
|
||||
x:Name="cmbFragmentPackets"
|
||||
Grid.Row="0"
|
||||
Grid.Column="1"
|
||||
Width="120"
|
||||
Margin="{StaticResource Margin4}"
|
||||
HorizontalAlignment="Left" />
|
||||
<TextBlock
|
||||
Grid.Row="0"
|
||||
Grid.Column="2"
|
||||
Margin="{StaticResource Margin4}"
|
||||
VerticalAlignment="Center"
|
||||
Text="{x:Static resx:ResUI.TbSettingsFragmentPacketsTip}"
|
||||
TextWrapping="Wrap" />
|
||||
|
||||
<TextBlock
|
||||
Grid.Row="1"
|
||||
Grid.Column="0"
|
||||
Margin="{StaticResource Margin4}"
|
||||
VerticalAlignment="Center"
|
||||
Text="{x:Static resx:ResUI.TbSettingsFragmentLength}" />
|
||||
<TextBox
|
||||
x:Name="txtFragmentLength"
|
||||
Grid.Row="1"
|
||||
Grid.Column="1"
|
||||
Width="120"
|
||||
Margin="{StaticResource Margin4}"
|
||||
HorizontalAlignment="Left"
|
||||
Watermark="50-100" />
|
||||
<TextBlock
|
||||
Grid.Row="1"
|
||||
Grid.Column="2"
|
||||
Margin="{StaticResource Margin4}"
|
||||
VerticalAlignment="Center"
|
||||
Text="{x:Static resx:ResUI.TbSettingsFragmentLengthTip}"
|
||||
TextWrapping="Wrap" />
|
||||
|
||||
<TextBlock
|
||||
Grid.Row="2"
|
||||
Grid.Column="0"
|
||||
Margin="{StaticResource Margin4}"
|
||||
VerticalAlignment="Center"
|
||||
Text="{x:Static resx:ResUI.TbSettingsFragmentInterval}" />
|
||||
<TextBox
|
||||
x:Name="txtFragmentInterval"
|
||||
Grid.Row="2"
|
||||
Grid.Column="1"
|
||||
Width="120"
|
||||
Margin="{StaticResource Margin4}"
|
||||
HorizontalAlignment="Left"
|
||||
Watermark="10-20" />
|
||||
<TextBlock
|
||||
Grid.Row="2"
|
||||
Grid.Column="2"
|
||||
Margin="{StaticResource Margin4}"
|
||||
VerticalAlignment="Center"
|
||||
Text="{x:Static resx:ResUI.TbSettingsFragmentIntervalTip}"
|
||||
TextWrapping="Wrap" />
|
||||
|
||||
<TextBlock
|
||||
Grid.Row="3"
|
||||
Grid.Column="0"
|
||||
Margin="{StaticResource Margin4}"
|
||||
VerticalAlignment="Center"
|
||||
Text="{x:Static resx:ResUI.TbSettingsFragmentMaxSplit}" />
|
||||
<TextBox
|
||||
x:Name="txtFragmentMaxSplit"
|
||||
Grid.Row="3"
|
||||
Grid.Column="1"
|
||||
Width="120"
|
||||
Margin="{StaticResource Margin4}"
|
||||
HorizontalAlignment="Left"
|
||||
Watermark="0" />
|
||||
<TextBlock
|
||||
Grid.Row="3"
|
||||
Grid.Column="2"
|
||||
Margin="{StaticResource Margin4}"
|
||||
VerticalAlignment="Center"
|
||||
Text="{x:Static resx:ResUI.TbSettingsFragmentMaxSplitTip}"
|
||||
TextWrapping="Wrap" />
|
||||
</Grid>
|
||||
</StackPanel>
|
||||
</Flyout>
|
||||
</Button.Flyout>
|
||||
</Button>
|
||||
|
||||
<TextBlock
|
||||
Grid.Row="21"
|
||||
Grid.Column="0"
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
using Avalonia.Media;
|
||||
using v2rayN.Desktop.Base;
|
||||
using v2rayN.Desktop.Common;
|
||||
|
||||
@@ -36,6 +35,7 @@ public partial class OptionSettingWindow : WindowBase<OptionSettingViewModel>
|
||||
cmbMtu.ItemsSource = Global.TunMtus;
|
||||
cmbStack.ItemsSource = Global.TunStacks;
|
||||
cmbIcmpRoutingPolicy.ItemsSource = Global.TunIcmpRoutingPolicies;
|
||||
cmbFragmentPackets.ItemsSource = Global.FragmentPacketsOptions;
|
||||
|
||||
cmbCoreType1.ItemsSource = Global.CoreTypes;
|
||||
cmbCoreType2.ItemsSource = Global.CoreTypes;
|
||||
@@ -84,6 +84,10 @@ public partial class OptionSettingWindow : WindowBase<OptionSettingViewModel>
|
||||
this.Bind(ViewModel, vm => vm.HyDownMbps, v => v.txtDownMbps.Text).DisposeWith(disposables);
|
||||
this.Bind(ViewModel, vm => vm.EnableFragment, v => v.togenableFragment.IsChecked).DisposeWith(disposables);
|
||||
this.Bind(ViewModel, vm => vm.EnableFinalFragment, v => v.togenableFinalFragment.IsChecked).DisposeWith(disposables);
|
||||
this.Bind(ViewModel, vm => vm.FragmentPackets, v => v.cmbFragmentPackets.SelectedItem).DisposeWith(disposables);
|
||||
this.Bind(ViewModel, vm => vm.FragmentLength, v => v.txtFragmentLength.Text).DisposeWith(disposables);
|
||||
this.Bind(ViewModel, vm => vm.FragmentInterval, v => v.txtFragmentInterval.Text).DisposeWith(disposables);
|
||||
this.Bind(ViewModel, vm => vm.FragmentMaxSplit, v => v.txtFragmentMaxSplit.Text).DisposeWith(disposables);
|
||||
|
||||
this.Bind(ViewModel, vm => vm.AutoRun, v => v.togAutoRun.IsChecked).DisposeWith(disposables);
|
||||
this.Bind(ViewModel, vm => vm.EnableStatistics, v => v.togEnableStatistics.IsChecked).DisposeWith(disposables);
|
||||
|
||||
@@ -17,6 +17,13 @@
|
||||
Style="{StaticResource WindowGlobal}"
|
||||
WindowStartupLocation="CenterScreen"
|
||||
mc:Ignorable="d">
|
||||
<Window.Resources>
|
||||
<ResourceDictionary>
|
||||
<ResourceDictionary.MergedDictionaries>
|
||||
<ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Popupbox.xaml" />
|
||||
</ResourceDictionary.MergedDictionaries>
|
||||
</ResourceDictionary>
|
||||
</Window.Resources>
|
||||
<DockPanel Margin="{StaticResource Margin8}">
|
||||
<StackPanel
|
||||
Margin="{StaticResource Margin4}"
|
||||
@@ -366,6 +373,100 @@
|
||||
Margin="{StaticResource Margin8}"
|
||||
HorizontalAlignment="Left" />
|
||||
|
||||
<materialDesign:PopupBox
|
||||
Grid.Row="20"
|
||||
Grid.Column="2"
|
||||
HorizontalAlignment="Left"
|
||||
StaysOpen="True"
|
||||
Style="{StaticResource MaterialDesignToolForegroundPopupBox}">
|
||||
<StackPanel Margin="{StaticResource Margin8}">
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="Auto" />
|
||||
<RowDefinition Height="Auto" />
|
||||
</Grid.RowDefinitions>
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="Auto" />
|
||||
<ColumnDefinition Width="Auto" />
|
||||
<ColumnDefinition Width="400" />
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<TextBlock
|
||||
Grid.Row="0"
|
||||
Grid.Column="0"
|
||||
Margin="{StaticResource Margin8}"
|
||||
VerticalAlignment="Center"
|
||||
Style="{StaticResource ToolbarTextBlock}"
|
||||
Text="{x:Static resx:ResUI.TbSettingsFragmentPackets}"
|
||||
TextWrapping="Wrap" />
|
||||
<ComboBox
|
||||
x:Name="cmbFragmentPackets"
|
||||
Grid.Row="0"
|
||||
Grid.Column="1"
|
||||
Width="200"
|
||||
Margin="{StaticResource Margin8}"
|
||||
VerticalAlignment="Center" />
|
||||
|
||||
<TextBlock
|
||||
Grid.Row="1"
|
||||
Grid.Column="0"
|
||||
Margin="{StaticResource Margin8}"
|
||||
VerticalAlignment="Center"
|
||||
Style="{StaticResource ToolbarTextBlock}"
|
||||
Text="{x:Static resx:ResUI.TbSettingsFragmentLength}"
|
||||
TextWrapping="Wrap" />
|
||||
<TextBox
|
||||
x:Name="txtFragmentLength"
|
||||
Grid.Row="1"
|
||||
Grid.Column="1"
|
||||
Width="200"
|
||||
Margin="{StaticResource Margin8}"
|
||||
VerticalAlignment="Center"
|
||||
materialDesign:HintAssist.Hint="50-100"
|
||||
Style="{StaticResource DefTextBox}" />
|
||||
|
||||
<TextBlock
|
||||
Grid.Row="2"
|
||||
Grid.Column="0"
|
||||
Margin="{StaticResource Margin8}"
|
||||
VerticalAlignment="Center"
|
||||
Style="{StaticResource ToolbarTextBlock}"
|
||||
Text="{x:Static resx:ResUI.TbSettingsFragmentInterval}"
|
||||
TextWrapping="Wrap" />
|
||||
<TextBox
|
||||
x:Name="txtFragmentInterval"
|
||||
Grid.Row="2"
|
||||
Grid.Column="1"
|
||||
Width="200"
|
||||
Margin="{StaticResource Margin8}"
|
||||
VerticalAlignment="Center"
|
||||
materialDesign:HintAssist.Hint="10-20"
|
||||
Style="{StaticResource DefTextBox}" />
|
||||
|
||||
<TextBlock
|
||||
Grid.Row="3"
|
||||
Grid.Column="0"
|
||||
Margin="{StaticResource Margin8}"
|
||||
VerticalAlignment="Center"
|
||||
Style="{StaticResource ToolbarTextBlock}"
|
||||
Text="{x:Static resx:ResUI.TbSettingsFragmentMaxSplit}"
|
||||
TextWrapping="Wrap" />
|
||||
<TextBox
|
||||
x:Name="txtFragmentMaxSplit"
|
||||
Grid.Row="3"
|
||||
Grid.Column="1"
|
||||
Width="200"
|
||||
Margin="{StaticResource Margin8}"
|
||||
VerticalAlignment="Center"
|
||||
materialDesign:HintAssist.Hint="0"
|
||||
Style="{StaticResource DefTextBox}" />
|
||||
</Grid>
|
||||
</StackPanel>
|
||||
</materialDesign:PopupBox>
|
||||
|
||||
<TextBlock
|
||||
Grid.Row="21"
|
||||
Grid.Column="0"
|
||||
|
||||
@@ -32,6 +32,7 @@ public partial class OptionSettingWindow
|
||||
cmbMtu.ItemsSource = Global.TunMtus;
|
||||
cmbStack.ItemsSource = Global.TunStacks;
|
||||
cmbIcmpRoutingPolicy.ItemsSource = Global.TunIcmpRoutingPolicies;
|
||||
cmbFragmentPackets.ItemsSource = Global.FragmentPacketsOptions;
|
||||
|
||||
cmbCoreType1.ItemsSource = Global.CoreTypes;
|
||||
cmbCoreType2.ItemsSource = Global.CoreTypes;
|
||||
@@ -80,6 +81,10 @@ public partial class OptionSettingWindow
|
||||
this.Bind(ViewModel, vm => vm.HyDownMbps, v => v.txtDownMbps.Text).DisposeWith(disposables);
|
||||
this.Bind(ViewModel, vm => vm.EnableFragment, v => v.togenableFragment.IsChecked).DisposeWith(disposables);
|
||||
this.Bind(ViewModel, vm => vm.EnableFinalFragment, v => v.togenableFinalFragment.IsChecked).DisposeWith(disposables);
|
||||
this.Bind(ViewModel, vm => vm.FragmentPackets, v => v.cmbFragmentPackets.Text).DisposeWith(disposables);
|
||||
this.Bind(ViewModel, vm => vm.FragmentLength, v => v.txtFragmentLength.Text).DisposeWith(disposables);
|
||||
this.Bind(ViewModel, vm => vm.FragmentInterval, v => v.txtFragmentInterval.Text).DisposeWith(disposables);
|
||||
this.Bind(ViewModel, vm => vm.FragmentMaxSplit, v => v.txtFragmentMaxSplit.Text).DisposeWith(disposables);
|
||||
|
||||
//this.Bind(ViewModel, vm => vm.Kcpmtu, v => v.txtKcpmtu.Text).DisposeWith(disposables);
|
||||
//this.Bind(ViewModel, vm => vm.Kcptti, v => v.txtKcptti.Text).DisposeWith(disposables);
|
||||
|
||||
Reference in New Issue
Block a user