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
150fn 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 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 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 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 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}