Skip to content

Commit 6714353

Browse files
feat(settings): hev TUN engine option + tuning controls
- TunEngineSection offers hev for both cores (sing-box gains a third option, xray a second), and reveals the hev tuning block (UDP mode, connect/rw timeouts, tcp/udp buffers) only when hev is selected. - i18n keys for the new controls across all 8 locales. - regenerated frontend bindings/schemas/defaults for the new enum + settings.
1 parent a418a48 commit 6714353

12 files changed

Lines changed: 143 additions & 10 deletions

File tree

frontend/src/features/settings/sections/TunEngineSection.tsx

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Card, SectionLabel, Select } from "../../../components";
1+
import { Card, Field, SectionLabel, Select } from "../../../components";
22
import type { CoreEngine, TunEngine } from "../../../generated/bindings";
33
import { CORE_ENGINE_OPTS, TUN_BY_CORE } from "../../../generated/defaults";
44
import { useT } from "../../../i18n";
@@ -11,6 +11,7 @@ import type { AdvancedSettings } from "../../../lib/bridge";
1111
const ENGINE_LABEL: Record<TunEngine, string> = {
1212
"singbox-tun": "sing-box TUN",
1313
tun2socks: "tun2socks",
14+
hev: "hev",
1415
};
1516

1617
export function TunEngineSection({
@@ -27,6 +28,10 @@ export function TunEngineSection({
2728
const setTunFor = (core: CoreEngine, value: TunEngine) =>
2829
set("tunByCore", { ...(settings.tunByCore ?? {}), [core]: value });
2930

31+
// hev is the only engine that reads the tuning knobs below, so only surface them
32+
// when at least one core uses it.
33+
const usesHev = CORE_ENGINE_OPTS.some((core) => tunFor(core) === "hev");
34+
3035
return (
3136
<>
3237
<SectionLabel>{t("settings.tunEngine")}</SectionLabel>
@@ -58,6 +63,48 @@ export function TunEngineSection({
5863
</div>
5964
);
6065
})}
66+
67+
{usesHev && (
68+
<div
69+
style={{ marginTop: 12, borderTop: "1px solid var(--outline-faint)", paddingTop: 12 }}
70+
>
71+
<div style={{ fontSize: 11.5, color: "var(--on-surface-faint)", marginBottom: 10 }}>
72+
{t("settings.tunHevTuning")}
73+
</div>
74+
<div style={{ padding: "0 4px" }}>
75+
<Field
76+
label={t("settings.tunConnectTimeout")}
77+
value={settings.tunConnectTimeoutMs}
78+
type="number"
79+
onChange={(value) => set("tunConnectTimeoutMs", Number(value))}
80+
/>
81+
<Field
82+
label={t("settings.tunTcpRwTimeout")}
83+
value={settings.tunTcpRwTimeoutMs}
84+
type="number"
85+
onChange={(value) => set("tunTcpRwTimeoutMs", Number(value))}
86+
/>
87+
<Field
88+
label={t("settings.tunUdpRwTimeout")}
89+
value={settings.tunUdpRwTimeoutMs}
90+
type="number"
91+
onChange={(value) => set("tunUdpRwTimeoutMs", Number(value))}
92+
/>
93+
<Field
94+
label={t("settings.tunTcpBuffer")}
95+
value={settings.tunTcpBufferSize}
96+
type="number"
97+
onChange={(value) => set("tunTcpBufferSize", Number(value))}
98+
/>
99+
<Field
100+
label={t("settings.tunUdpRecvBuffer")}
101+
value={settings.tunUdpRecvBufferSize}
102+
type="number"
103+
onChange={(value) => set("tunUdpRecvBufferSize", Number(value))}
104+
/>
105+
</div>
106+
</div>
107+
)}
61108
</Card>
62109
</>
63110
);

frontend/src/generated/bindings.ts

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,16 @@ export type AdvancedSettings_Deserialize = {
9393
tunByCore?: Partial<{ [key in CoreEngine]: TunEngine }>,
9494
/** MTU of the TUN interface (sing-box native tun; external engines too). */
9595
tunMtu?: number,
96+
/** Connect timeout (ms) for external TUN engines (hev `misc.connect-timeout`). */
97+
tunConnectTimeoutMs?: number,
98+
/** TCP read/write timeout (ms) (hev `misc.tcp-read-write-timeout`). */
99+
tunTcpRwTimeoutMs?: number,
100+
/** UDP read/write timeout (ms) (hev `misc.udp-read-write-timeout`). */
101+
tunUdpRwTimeoutMs?: number,
102+
/** Per-session TCP buffer size in bytes (hev `misc.tcp-buffer-size`). */
103+
tunTcpBufferSize?: number,
104+
/** UDP receive buffer (SO_RCVBUF) size in bytes (hev `misc.udp-recv-buffer-size`). */
105+
tunUdpRecvBufferSize?: number,
96106
};
97107

98108
/**
@@ -146,6 +156,16 @@ export type AdvancedSettings_Serialize = {
146156
tunByCore: Partial<{ [key in CoreEngine]: TunEngine }>,
147157
/** MTU of the TUN interface (sing-box native tun; external engines too). */
148158
tunMtu: number,
159+
/** Connect timeout (ms) for external TUN engines (hev `misc.connect-timeout`). */
160+
tunConnectTimeoutMs: number,
161+
/** TCP read/write timeout (ms) (hev `misc.tcp-read-write-timeout`). */
162+
tunTcpRwTimeoutMs: number,
163+
/** UDP read/write timeout (ms) (hev `misc.udp-read-write-timeout`). */
164+
tunUdpRwTimeoutMs: number,
165+
/** Per-session TCP buffer size in bytes (hev `misc.tcp-buffer-size`). */
166+
tunTcpBufferSize: number,
167+
/** UDP receive buffer (SO_RCVBUF) size in bytes (hev `misc.udp-recv-buffer-size`). */
168+
tunUdpRecvBufferSize: number,
149169
};
150170

151171
export type Anytls = {
@@ -874,11 +894,12 @@ export type Tuic = {
874894

875895
/**
876896
* Which engine bridges the TUN device to the proxy core. `SingboxTun` means
877-
* "use sing-box's own native TUN stack" (sing-box core only); `Tun2socks` is an
878-
* external userspace tun→socks process in front of a socks-only core. Further
879-
* engines plug in as new variants. Wire values: `"singbox-tun"`, `"tun2socks"`.
897+
* "use sing-box's own native TUN stack" (sing-box core only); `Tun2socks` and
898+
* `Hev` are external userspace tun→socks processes in front of a socks-only core.
899+
* Further engines plug in as new variants. Wire values: `"singbox-tun"`,
900+
* `"tun2socks"`, `"hev"`.
880901
*/
881-
export type TunEngine = "singbox-tun" | "tun2socks";
902+
export type TunEngine = "singbox-tun" | "tun2socks" | "hev";
882903

883904
export type Vless = {
884905
meta: Meta,

frontend/src/generated/defaults.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -537,7 +537,12 @@ export const DEFAULT_ADVANCED_SETTINGS = {
537537
"speedConcurrency": 1,
538538
"strictRoute": false,
539539
"tunByCore": {},
540-
"tunMtu": 9000
540+
"tunConnectTimeoutMs": 10000,
541+
"tunMtu": 9000,
542+
"tunTcpBufferSize": 65536,
543+
"tunTcpRwTimeoutMs": 300000,
544+
"tunUdpRecvBufferSize": 524288,
545+
"tunUdpRwTimeoutMs": 60000
541546
} as AdvancedSettings_Serialize;
542547

543548
/* Backend constants (port-test windows, local ports, probe URLs, log rotation). */
@@ -550,7 +555,7 @@ export const DEFAULT_SPEED_TEST_URL = "http://speed.cloudflare.com/__down?bytes=
550555
/* Editor dropdown option lists (wire values, in declaration order). */
551556
export const PROTOCOL_OPTS: Protocol[] = ["vless","vmess","trojan","shadowsocks","socks","http","wireguard","hysteria2","tuic","anytls","naive","shadowtls","custom"];
552557
export const CORE_ENGINE_OPTS: CoreEngine[] = ["xray","sing-box"];
553-
export const TUN_ENGINE_OPTS: string[] = ["singbox-tun","tun2socks"];
558+
export const TUN_ENGINE_OPTS: string[] = ["singbox-tun","tun2socks","hev"];
554559
export const NETWORK_OPTS: Transport["kind"][] = ["tcp","ws","grpc","httpupgrade","xhttp","h2","kcp","quic"];
555560
export const SECURITY_OPTS: Security[] = ["none","tls","reality"];
556561
export const HEADER_TYPE_OPTS: HeaderType[] = ["none","http","srtp","utp","wechat-video","dtls","wireguard","dns"];
@@ -568,13 +573,15 @@ export const TUN_BY_CORE = {
568573
"default": "singbox-tun",
569574
"valid": [
570575
"singbox-tun",
571-
"tun2socks"
576+
"tun2socks",
577+
"hev"
572578
]
573579
},
574580
"xray": {
575581
"default": "tun2socks",
576582
"valid": [
577-
"tun2socks"
583+
"tun2socks",
584+
"hev"
578585
]
579586
}
580587
} as Record<CoreEngine, { default: TunEngine; valid: TunEngine[] }>;

frontend/src/generated/schemas.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { z } from "zod";
22
// This file has been generated by Specta. Do not edit this file manually.
3-
export const TunEngineSchema = z.union([z.literal("singbox-tun"), z.literal("tun2socks")]);
3+
export const TunEngineSchema = z.union([z.literal("hev"), z.literal("singbox-tun"), z.literal("tun2socks")]);
44
export type TunEngine = z.infer<typeof TunEngineSchema>;
55

66

@@ -86,6 +86,11 @@ export const AdvancedSettings_SerializeSchema = z.object({
8686
allowNonLocalhost: z.boolean(),
8787
tunByCore: z.record(CoreEngineSchema, TunEngineSchema),
8888
tunMtu: z.number(),
89+
tunConnectTimeoutMs: z.number(),
90+
tunTcpRwTimeoutMs: z.number(),
91+
tunUdpRwTimeoutMs: z.number(),
92+
tunTcpBufferSize: z.number(),
93+
tunUdpRecvBufferSize: z.number(),
8994
});
9095
export type AdvancedSettings_Serialize = z.infer<typeof AdvancedSettings_SerializeSchema>;
9196

@@ -136,6 +141,11 @@ export const AdvancedSettings_DeserializeSchema = z.object({
136141
allowNonLocalhost: z.boolean().optional(),
137142
tunByCore: z.record(CoreEngineSchema, TunEngineSchema).optional(),
138143
tunMtu: z.number().optional(),
144+
tunConnectTimeoutMs: z.number().optional(),
145+
tunTcpRwTimeoutMs: z.number().optional(),
146+
tunUdpRwTimeoutMs: z.number().optional(),
147+
tunTcpBufferSize: z.number().optional(),
148+
tunUdpRecvBufferSize: z.number().optional(),
139149
});
140150
export type AdvancedSettings_Deserialize = z.infer<typeof AdvancedSettings_DeserializeSchema>;
141151

frontend/src/i18n/ar.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -465,6 +465,12 @@ const ar = {
465465
"settings.fragmentLength": "طول التجزئة",
466466
"settings.fragmentDelay": "تأخير التجزئة",
467467
"settings.tunMtu": "TUN MTU",
468+
"settings.tunHevTuning": "ضبط hev",
469+
"settings.tunConnectTimeout": "مهلة الاتصال (مللي ثانية)",
470+
"settings.tunTcpRwTimeout": "مهلة قراءة/كتابة TCP (مللي ثانية)",
471+
"settings.tunUdpRwTimeout": "مهلة قراءة/كتابة UDP (مللي ثانية)",
472+
"settings.tunTcpBuffer": "حجم مخزن TCP (بايت)",
473+
"settings.tunUdpRecvBuffer": "مخزن استقبال UDP (بايت)",
468474
"settings.tunEngine": "محرك TUN",
469475
"settings.tunEngineHint":
470476
"المحرك الذي يربط جهاز TUN بكل نواة. يمكن لـ sing-box استخدام TUN الأصلي الخاص به؛ بينما يحتاج xray إلى محرك خارجي.",

frontend/src/i18n/en.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,12 @@ const en = {
400400
"settings.fragmentLength": "Fragment length",
401401
"settings.fragmentDelay": "Fragment delay",
402402
"settings.tunMtu": "TUN MTU",
403+
"settings.tunHevTuning": "hev tuning",
404+
"settings.tunConnectTimeout": "Connect timeout (ms)",
405+
"settings.tunTcpRwTimeout": "TCP read/write timeout (ms)",
406+
"settings.tunUdpRwTimeout": "UDP read/write timeout (ms)",
407+
"settings.tunTcpBuffer": "TCP buffer size (bytes)",
408+
"settings.tunUdpRecvBuffer": "UDP receive buffer (bytes)",
403409
"settings.tunEngine": "TUN engine",
404410
"settings.tunEngineHint":
405411
"Which engine bridges the TUN device to each core. sing-box can use its own native TUN; xray needs an external one.",

frontend/src/i18n/es.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,12 @@ const es = {
395395
"settings.fragmentLength": "Longitud de los fragmentos",
396396
"settings.fragmentDelay": "Retardo de fragmentación",
397397
"settings.tunMtu": "MTU de TUN",
398+
"settings.tunHevTuning": "Ajustes de hev",
399+
"settings.tunConnectTimeout": "Tiempo de conexión (ms)",
400+
"settings.tunTcpRwTimeout": "Tiempo lectura/escritura TCP (ms)",
401+
"settings.tunUdpRwTimeout": "Tiempo lectura/escritura UDP (ms)",
402+
"settings.tunTcpBuffer": "Tamaño del búfer TCP (bytes)",
403+
"settings.tunUdpRecvBuffer": "Búfer de recepción UDP (bytes)",
398404
"settings.tunEngine": "Motor TUN",
399405
"settings.tunEngineHint":
400406
"Qué motor conecta el dispositivo TUN con cada núcleo. sing-box puede usar su propio TUN nativo; xray necesita uno externo.",

frontend/src/i18n/hi.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,12 @@ const hi = {
386386
"settings.fragmentLength": "फ्रैगमेंट लंबाई",
387387
"settings.fragmentDelay": "फ्रैगमेंट विलंब",
388388
"settings.tunMtu": "TUN MTU",
389+
"settings.tunHevTuning": "hev ट्यूनिंग",
390+
"settings.tunConnectTimeout": "कनेक्ट टाइमआउट (ms)",
391+
"settings.tunTcpRwTimeout": "TCP रीड/राइट टाइमआउट (ms)",
392+
"settings.tunUdpRwTimeout": "UDP रीड/राइट टाइमआउट (ms)",
393+
"settings.tunTcpBuffer": "TCP बफ़र आकार (बाइट)",
394+
"settings.tunUdpRecvBuffer": "UDP रिसीव बफ़र (बाइट)",
389395
"settings.tunEngine": "TUN इंजन",
390396
"settings.tunEngineHint":
391397
"कौन सा इंजन TUN डिवाइस को प्रत्येक कोर से जोड़ता है। sing-box अपना नेटिव TUN उपयोग कर सकता है; xray को बाहरी इंजन चाहिए।",

frontend/src/i18n/pt.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,12 @@ const pt = {
394394
"settings.fragmentLength": "Comprimento do fragmento",
395395
"settings.fragmentDelay": "Atraso de fragmentação",
396396
"settings.tunMtu": "MTU do TUN",
397+
"settings.tunHevTuning": "Ajustes do hev",
398+
"settings.tunConnectTimeout": "Tempo de conexão (ms)",
399+
"settings.tunTcpRwTimeout": "Tempo de leitura/escrita TCP (ms)",
400+
"settings.tunUdpRwTimeout": "Tempo de leitura/escrita UDP (ms)",
401+
"settings.tunTcpBuffer": "Tamanho do buffer TCP (bytes)",
402+
"settings.tunUdpRecvBuffer": "Buffer de recepção UDP (bytes)",
397403
"settings.tunEngine": "Motor TUN",
398404
"settings.tunEngineHint":
399405
"Qual motor conecta o dispositivo TUN a cada núcleo. O sing-box pode usar o próprio TUN nativo; o xray precisa de um externo.",

frontend/src/i18n/ru.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -415,6 +415,12 @@ const ru = {
415415
"settings.fragmentLength": "Длина фрагмента",
416416
"settings.fragmentDelay": "Задержка фрагментации",
417417
"settings.tunMtu": "TUN MTU",
418+
"settings.tunHevTuning": "Настройки hev",
419+
"settings.tunConnectTimeout": "Таймаут подключения (мс)",
420+
"settings.tunTcpRwTimeout": "Таймаут чтения/записи TCP (мс)",
421+
"settings.tunUdpRwTimeout": "Таймаут чтения/записи UDP (мс)",
422+
"settings.tunTcpBuffer": "Размер буфера TCP (байты)",
423+
"settings.tunUdpRecvBuffer": "Буфер приёма UDP (байты)",
418424
"settings.tunEngine": "Движок TUN",
419425
"settings.tunEngineHint":
420426
"Какой движок связывает TUN-устройство с каждым ядром. sing-box умеет собственный нативный TUN; xray требует внешний.",

0 commit comments

Comments
 (0)