Skip to content

Commit 0466959

Browse files
committed
update kcp & xhttp
1 parent 512d19c commit 0466959

9 files changed

Lines changed: 98 additions & 7 deletions

File tree

app/src/main/java/io/nekohasekai/sagernet/fmt/v2ray/StandardV2RayBean.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@ public abstract class StandardV2RayBean extends AbstractBean {
5858

5959
public String mKcpSeed;
6060
public String headerType;
61+
public Integer kcpMtu;
62+
public Integer kcpTti;
63+
public Integer kcpCwndMultiplier;
6164

6265
// --------------------------------------- ech
6366

@@ -140,11 +143,12 @@ public void initializeDefaultValues() {
140143

141144
if (JavaUtil.isNullOrBlank(mKcpSeed)) mKcpSeed = "";
142145
if (JavaUtil.isNullOrBlank(headerType)) headerType = "none";
146+
// kcpMtu、kcpTti 和 kcpCwndMultiplier 保持 null,不设置默认值
143147
}
144148

145149
@Override
146150
public void serialize(ByteBufferOutput output) {
147-
output.writeInt(8);
151+
output.writeInt(10);
148152
super.serialize(output);
149153
output.writeString(uuid);
150154
output.writeString(encryption);
@@ -190,6 +194,9 @@ public void serialize(ByteBufferOutput output) {
190194
case "kcp": {
191195
output.writeString(mKcpSeed);
192196
output.writeString(headerType);
197+
output.writeInt(kcpMtu == null ? 0 : kcpMtu);
198+
output.writeInt(kcpTti == null ? 0 : kcpTti);
199+
output.writeInt(kcpCwndMultiplier == null ? 0 : kcpCwndMultiplier);
193200
break;
194201
}
195202
}
@@ -282,6 +289,16 @@ public void deserialize(ByteBufferInput input) {
282289
if (version >= 6) {
283290
mKcpSeed = input.readString();
284291
headerType = input.readString();
292+
if (version >= 9) {
293+
int mtu = input.readInt();
294+
int tti = input.readInt();
295+
kcpMtu = mtu == 0 ? null : mtu;
296+
kcpTti = tti == 0 ? null : tti;
297+
if (version >= 10) {
298+
int cwnd = input.readInt();
299+
kcpCwndMultiplier = cwnd == 0 ? null : cwnd;
300+
}
301+
}
285302
}
286303
break;
287304
}

app/src/main/java/io/nekohasekai/sagernet/fmt/v2ray/V2RayFmt.kt

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import okhttp3.HttpUrl.Companion.toHttpUrl
1414
import org.json.JSONObject
1515

1616
private val supportedKcpHeaderType = arrayOf(
17-
"none", "srtp", "utp", "wechat-video", "dtls", "wireguard"
17+
"none", "srtp", "utp", "wechat-video", "dtls", "wireguard", "dns"
1818
)
1919

2020
data class VmessQRCode(
@@ -221,8 +221,19 @@ fun StandardV2RayBean.parseDuckSoft(url: HttpUrl) {
221221
mKcpSeed = it
222222
}
223223
url.queryParameter("headerType")?.let {
224-
if (it !in supportedKcpHeaderType) error("unsupported headerType")
225-
headerType = it
224+
if (it.isNotBlank()) {
225+
if (it !in supportedKcpHeaderType) error("unsupported headerType")
226+
headerType = it
227+
}
228+
}
229+
url.queryParameter("mtu")?.let {
230+
kcpMtu = it.toIntOrNull()
231+
}
232+
url.queryParameter("tti")?.let {
233+
kcpTti = it.toIntOrNull()
234+
}
235+
url.queryParameter("cwnd")?.let {
236+
kcpCwndMultiplier = it.toIntOrNull()
226237
}
227238
}
228239

@@ -532,6 +543,15 @@ fun StandardV2RayBean.toUriVMessVLESSTrojan(isTrojan: Boolean): String {
532543
if (mKcpSeed.isNotBlank()) {
533544
builder.addQueryParameter("seed", mKcpSeed)
534545
}
546+
if (kcpMtu != null && kcpMtu!! > 0) {
547+
builder.addQueryParameter("mtu", kcpMtu.toString())
548+
}
549+
if (kcpTti != null && kcpTti!! > 0) {
550+
builder.addQueryParameter("tti", kcpTti.toString())
551+
}
552+
if (kcpCwndMultiplier != null && kcpCwndMultiplier!! > 0) {
553+
builder.addQueryParameter("cwnd", kcpCwndMultiplier.toString())
554+
}
535555
}
536556

537557
"xhttp" -> {
@@ -637,13 +657,16 @@ fun buildSingBoxOutboundStreamSettings(bean: StandardV2RayBean): V2RayTransportO
637657
"kcp" -> {
638658
return V2RayTransportOptions_KCPOptions().apply {
639659
type = "kcp"
640-
mtu = 1350
641-
tti = 50
660+
mtu = if (bean.kcpMtu != null && bean.kcpMtu!! > 0) bean.kcpMtu!! else 1350
661+
tti = if (bean.kcpTti != null && bean.kcpTti!! > 0) bean.kcpTti!! else 50
642662
uplink_capacity = 12
643663
downlink_capacity = 100
644664
congestion = false
645665
read_buffer_size = 1
646666
write_buffer_size = 1
667+
if (bean.kcpCwndMultiplier != null && bean.kcpCwndMultiplier!! > 0) {
668+
cwnd_multiplier = bean.kcpCwndMultiplier!!
669+
}
647670
header_type = bean.headerType.takeIf { it.isNotBlank() } ?: "none"
648671
if (bean.mKcpSeed.isNotBlank()) {
649672
seed = bean.mKcpSeed

app/src/main/java/io/nekohasekai/sagernet/ui/profile/StandardV2RaySettingsActivity.kt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import androidx.preference.PreferenceFragmentCompat
77
import androidx.preference.SwitchPreference
88
import io.nekohasekai.sagernet.Key
99
import io.nekohasekai.sagernet.R
10+
import io.nekohasekai.sagernet.database.DataStore
1011
import io.nekohasekai.sagernet.database.preference.EditTextPreferenceModifiers
1112
import io.nekohasekai.sagernet.fmt.http.HttpBean
1213
import io.nekohasekai.sagernet.fmt.trojan.TrojanBean
@@ -66,6 +67,9 @@ abstract class StandardV2RaySettingsActivity : ProfileSettingsActivity<StandardV
6667
// KCP
6768
private val mKcpSeed = pbm.add(PreferenceBinding(Type.Text, "mKcpSeed"))
6869
private val headerType = pbm.add(PreferenceBinding(Type.Text, "headerType"))
70+
private val kcpMtu = pbm.add(PreferenceBinding(Type.TextToInt, "kcpMtu"))
71+
private val kcpTti = pbm.add(PreferenceBinding(Type.TextToInt, "kcpTti"))
72+
private val kcpCwndMultiplier = pbm.add(PreferenceBinding(Type.TextToInt, "kcpCwndMultiplier"))
6973

7074
override fun StandardV2RayBean.init() {
7175
if (this is TrojanBean) {
@@ -202,6 +206,9 @@ abstract class StandardV2RaySettingsActivity : ProfileSettingsActivity<StandardV
202206
path.preference.isVisible = false
203207
mKcpSeed.preference.isVisible = false
204208
headerType.preference.isVisible = false
209+
kcpMtu.preference.isVisible = false
210+
kcpTti.preference.isVisible = false
211+
kcpCwndMultiplier.preference.isVisible = false
205212
wsCategory.isVisible = false
206213
xhttpCategory.isVisible = false
207214

@@ -214,6 +221,9 @@ abstract class StandardV2RaySettingsActivity : ProfileSettingsActivity<StandardV
214221
"kcp" -> {
215222
mKcpSeed.preference.isVisible = true
216223
headerType.preference.isVisible = true
224+
kcpMtu.preference.isVisible = true
225+
kcpTti.preference.isVisible = true
226+
kcpCwndMultiplier.preference.isVisible = true
217227
}
218228

219229
"http" -> {

app/src/main/java/moe/matsuri/nb4a/SingBoxOptions.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4711,6 +4711,8 @@ public static class V2RayTransportOptions_KCPOptions extends V2RayTransportOptio
47114711

47124712
public Integer write_buffer_size;
47134713

4714+
public Integer cwnd_multiplier;
4715+
47144716
public String header_type;
47154717

47164718
public String seed;

app/src/main/res/values-zh-rCN/strings.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,9 @@
197197
<string name="http_host">HTTP 主机</string>
198198
<string name="http_path">HTTP 路径</string>
199199
<string name="kcp_header_type">伪装头类型</string>
200+
<string name="kcp_mtu">mKCP MTU</string>
201+
<string name="kcp_tti">mKCP TTI</string>
202+
<string name="kcp_cwnd_multiplier">拥塞窗口倍数</string>
200203
<string name="show_bottom_bar">像 SagerNet 一样显示底栏</string>
201204
<string name="utls_fingerprint">uTLS 指纹</string>
202205
<string name="grpc_service_name">gRPC 服务名称</string>

app/src/main/res/values/arrays.xml

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,21 @@
333333
<item>wechat-video</item>
334334
<item>dtls</item>
335335
<item>wireguard</item>
336+
<item>dns</item>
337+
</string-array>
338+
339+
<string-array name="kcp_cwnd_multiplier_entry">
340+
<item>20</item>
341+
<item>10</item>
342+
<item>5</item>
343+
<item>1</item>
344+
</string-array>
345+
346+
<string-array name="kcp_cwnd_multiplier_value">
347+
<item>20</item>
348+
<item>10</item>
349+
<item>5</item>
350+
<item>1</item>
336351
</string-array>
337352

338353
<string-array name="xhttp_mode_entry">

app/src/main/res/values/strings.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,9 @@
128128
<string name="http_path">HTTP Path</string>
129129
<string name="kcp_seed">mKCP Seed</string>
130130
<string name="kcp_header_type">Header Type</string>
131+
<string name="kcp_mtu">mKCP MTU</string>
132+
<string name="kcp_tti">mKCP TTI</string>
133+
<string name="kcp_cwnd_multiplier">CWND Multiplier</string>
131134
<string name="grpc_service_name">gRPC ServiceName</string>
132135
<string name="tls">Use TLS</string>
133136
<string name="sni">Server Name Indication</string>

app/src/main/res/xml/standard_v2ray_preferences.xml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,12 +83,30 @@
8383
app:key="headerType"
8484
app:title="@string/kcp_header_type"
8585
app:useSimpleSummaryProvider="true" />
86+
<moe.matsuri.nb4a.ui.SimpleMenuPreference
87+
app:defaultValue="20"
88+
app:entries="@array/kcp_cwnd_multiplier_entry"
89+
app:entryValues="@array/kcp_cwnd_multiplier_value"
90+
app:icon="@drawable/ic_baseline_speed_24"
91+
app:key="kcpCwndMultiplier"
92+
app:title="@string/kcp_cwnd_multiplier"
93+
app:useSimpleSummaryProvider="true" />
8694
<EditTextPreference
8795
app:dialogLayout="@layout/layout_password_dialog"
8896
app:icon="@drawable/ic_baseline_format_align_left_24"
8997
app:key="mKcpSeed"
9098
app:title="@string/kcp_seed"
9199
app:useSimpleSummaryProvider="true" />
100+
<EditTextPreference
101+
app:icon="@drawable/ic_baseline_tune_24"
102+
app:key="kcpMtu"
103+
app:title="@string/kcp_mtu"
104+
app:useSimpleSummaryProvider="true" />
105+
<EditTextPreference
106+
app:icon="@drawable/ic_baseline_speed_24"
107+
app:key="kcpTti"
108+
app:title="@string/kcp_tti"
109+
app:useSimpleSummaryProvider="true" />
92110
<moe.matsuri.nb4a.ui.SimpleMenuPreference
93111
app:entries="@array/transport_layer_encryption_value"
94112
app:entryValues="@array/transport_layer_encryption_value"
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
export COMMIT_SING_BOX="2280550cef22cb6a99ed5ff3776401fb43424d28"
1+
export COMMIT_SING_BOX="249c5fd9263cefbad98fcde315aeab1aafe57ea1"
22
export COMMIT_LIBNEKO="1c47a3af71990a7b2192e03292b4d246c308ef0b"

0 commit comments

Comments
 (0)