Skip to main content

kcptun_rust/
config.rs

1use serde::{Deserialize, Serialize};
2use std::path::Path;
3
4#[derive(Debug, Clone, Serialize, Deserialize)]
5pub struct ClientConfig {
6    #[serde(default = "default_localaddr")]
7    pub localaddr: String,
8    #[serde(default = "default_remoteaddr")]
9    pub remoteaddr: String,
10    #[serde(default = "default_key")]
11    pub key: String,
12    #[serde(default = "default_crypt")]
13    pub crypt: String,
14    #[serde(default = "default_mode")]
15    pub mode: String,
16    #[serde(default = "default_conn")]
17    pub conn: u32,
18    #[serde(default)]
19    pub autoexpire: u32,
20    #[serde(default = "default_scavengettl")]
21    pub scavengettl: u32,
22    #[serde(default = "default_mtu")]
23    pub mtu: u32,
24    #[serde(default)]
25    pub ratelimit: u32,
26    #[serde(default = "default_sndwnd")]
27    pub sndwnd: u32,
28    #[serde(default = "default_rcvwnd")]
29    pub rcvwnd: u32,
30    #[serde(default = "default_datashard")]
31    pub datashard: u32,
32    #[serde(default = "default_parityshard")]
33    pub parityshard: u32,
34    #[serde(default)]
35    pub dscp: u32,
36    #[serde(default)]
37    pub nocomp: bool,
38    #[serde(default)]
39    pub acknodelay: bool,
40    #[serde(default)]
41    pub nodelay: u32,
42    #[serde(default = "default_interval")]
43    pub interval: u32,
44    #[serde(default)]
45    pub resend: u32,
46    #[serde(default)]
47    pub nc: u32,
48    #[serde(default = "default_sockbuf")]
49    pub sockbuf: u32,
50    #[serde(default = "default_smuxver")]
51    pub smuxver: u32,
52    #[serde(default = "default_smuxbuf")]
53    pub smuxbuf: u32,
54    #[serde(default = "default_framesize")]
55    pub framesize: u32,
56    #[serde(default = "default_streambuf")]
57    pub streambuf: u32,
58    #[serde(default = "default_keepalive")]
59    pub keepalive: u32,
60    #[serde(default)]
61    pub log: String,
62    #[serde(default)]
63    pub snmplog: String,
64    #[serde(default = "default_snmpperiod")]
65    pub snmpperiod: u32,
66    #[serde(default)]
67    pub quiet: bool,
68    #[serde(default)]
69    pub tcp: bool,
70    #[serde(default)]
71    pub pprof: bool,
72    #[serde(default)]
73    pub qpp: bool,
74    #[serde(default = "default_qppcount")]
75    pub qpp_count: u32,
76    #[serde(default)]
77    pub closewait: u32,
78}
79
80#[derive(Debug, Clone, Serialize, Deserialize)]
81pub struct ServerConfig {
82    #[serde(default = "default_listen")]
83    pub listen: String,
84    #[serde(default = "default_target")]
85    pub target: String,
86    #[serde(default = "default_key")]
87    pub key: String,
88    #[serde(default = "default_crypt")]
89    pub crypt: String,
90    #[serde(default = "default_mode")]
91    pub mode: String,
92    #[serde(default = "default_mtu")]
93    pub mtu: u32,
94    #[serde(default)]
95    pub ratelimit: u32,
96    #[serde(default = "default_sndwnd_server")]
97    pub sndwnd: u32,
98    #[serde(default = "default_rcvwnd_server")]
99    pub rcvwnd: u32,
100    #[serde(default = "default_datashard")]
101    pub datashard: u32,
102    #[serde(default = "default_parityshard")]
103    pub parityshard: u32,
104    #[serde(default)]
105    pub dscp: u32,
106    #[serde(default)]
107    pub nocomp: bool,
108    #[serde(default)]
109    pub acknodelay: bool,
110    #[serde(default)]
111    pub nodelay: u32,
112    #[serde(default = "default_interval")]
113    pub interval: u32,
114    #[serde(default)]
115    pub resend: u32,
116    #[serde(default)]
117    pub nc: u32,
118    #[serde(default = "default_sockbuf")]
119    pub sockbuf: u32,
120    #[serde(default = "default_smuxver")]
121    pub smuxver: u32,
122    #[serde(default = "default_smuxbuf")]
123    pub smuxbuf: u32,
124    #[serde(default = "default_framesize")]
125    pub framesize: u32,
126    #[serde(default = "default_streambuf")]
127    pub streambuf: u32,
128    #[serde(default = "default_keepalive")]
129    pub keepalive: u32,
130    #[serde(default)]
131    pub log: String,
132    #[serde(default)]
133    pub snmplog: String,
134    #[serde(default = "default_snmpperiod")]
135    pub snmpperiod: u32,
136    #[serde(default)]
137    pub pprof: bool,
138    #[serde(default)]
139    pub quiet: bool,
140    #[serde(default)]
141    pub tcp: bool,
142    #[serde(default)]
143    pub qpp: bool,
144    #[serde(default = "default_qppcount")]
145    pub qpp_count: u32,
146    #[serde(default = "default_closewait_server")]
147    pub closewait: u32,
148}
149
150// Default values for client
151fn default_localaddr() -> String { ":12948".to_string() }
152fn default_remoteaddr() -> String { "vps:29900".to_string() }
153fn default_key() -> String { "it's a secrect".to_string() }
154fn default_crypt() -> String { "aes".to_string() }
155fn default_mode() -> String { "fast".to_string() }
156fn default_conn() -> u32 { 1 }
157fn default_scavengettl() -> u32 { 600 }
158fn default_mtu() -> u32 { 1350 }
159fn default_sndwnd() -> u32 { 128 }
160fn default_rcvwnd() -> u32 { 512 }
161fn default_sndwnd_server() -> u32 { 1024 }
162fn default_rcvwnd_server() -> u32 { 1024 }
163fn default_datashard() -> u32 { 10 }
164fn default_parityshard() -> u32 { 3 }
165fn default_interval() -> u32 { 50 }
166fn default_sockbuf() -> u32 { 4194304 }
167fn default_smuxver() -> u32 { 2 }
168fn default_smuxbuf() -> u32 { 4194304 }
169fn default_framesize() -> u32 { 8192 }
170fn default_streambuf() -> u32 { 2097152 }
171fn default_keepalive() -> u32 { 10 }
172fn default_snmpperiod() -> u32 { 60 }
173fn default_qppcount() -> u32 { 61 }
174fn default_listen() -> String { ":29900".to_string() }
175fn default_target() -> String { "127.0.0.1:12948".to_string() }
176fn default_closewait_server() -> u32 { 30 }
177
178impl ClientConfig {
179    /// Apply mode configuration
180    pub fn apply_mode(&mut self) {
181        match self.mode.as_str() {
182            "normal" => {
183                self.nodelay = 0;
184                self.interval = 40;
185                self.resend = 2;
186                self.nc = 1;
187            }
188            "fast" => {
189                self.nodelay = 0;
190                self.interval = 30;
191                self.resend = 2;
192                self.nc = 1;
193            }
194            "fast2" => {
195                self.nodelay = 1;
196                self.interval = 20;
197                self.resend = 2;
198                self.nc = 1;
199            }
200            "fast3" => {
201                self.nodelay = 1;
202                self.interval = 10;
203                self.resend = 2;
204                self.nc = 1;
205            }
206            _ => {}
207        }
208    }
209
210    /// Load configuration from JSON file
211    pub fn from_json<P: AsRef<Path>>(path: P) -> anyhow::Result<Self> {
212        let content = std::fs::read_to_string(path)?;
213        let mut config: ClientConfig = serde_json::from_str(&content)?;
214        config.apply_mode();
215        Ok(config)
216    }
217}
218
219impl ServerConfig {
220    /// Apply mode configuration
221    pub fn apply_mode(&mut self) {
222        match self.mode.as_str() {
223            "normal" => {
224                self.nodelay = 0;
225                self.interval = 40;
226                self.resend = 2;
227                self.nc = 1;
228            }
229            "fast" => {
230                self.nodelay = 0;
231                self.interval = 30;
232                self.resend = 2;
233                self.nc = 1;
234            }
235            "fast2" => {
236                self.nodelay = 1;
237                self.interval = 20;
238                self.resend = 2;
239                self.nc = 1;
240            }
241            "fast3" => {
242                self.nodelay = 1;
243                self.interval = 10;
244                self.resend = 2;
245                self.nc = 1;
246            }
247            _ => {}
248        }
249    }
250
251    /// Load configuration from JSON file
252    pub fn from_json<P: AsRef<Path>>(path: P) -> anyhow::Result<Self> {
253        let content = std::fs::read_to_string(path)?;
254        let mut config: ServerConfig = serde_json::from_str(&content)?;
255        config.apply_mode();
256        Ok(config)
257    }
258}