use serde::{Deserialize, Serialize};
use std::path::Path;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ClientConfig {
#[serde(default = "default_localaddr")]
pub localaddr: String,
#[serde(default = "default_remoteaddr")]
pub remoteaddr: String,
#[serde(default = "default_key")]
pub key: String,
#[serde(default = "default_crypt")]
pub crypt: String,
#[serde(default = "default_mode")]
pub mode: String,
#[serde(default = "default_conn")]
pub conn: u32,
#[serde(default)]
pub autoexpire: u32,
#[serde(default = "default_scavengettl")]
pub scavengettl: u32,
#[serde(default = "default_mtu")]
pub mtu: u32,
#[serde(default)]
pub ratelimit: u32,
#[serde(default = "default_sndwnd")]
pub sndwnd: u32,
#[serde(default = "default_rcvwnd")]
pub rcvwnd: u32,
#[serde(default = "default_datashard")]
pub datashard: u32,
#[serde(default = "default_parityshard")]
pub parityshard: u32,
#[serde(default)]
pub dscp: u32,
#[serde(default)]
pub nocomp: bool,
#[serde(default)]
pub acknodelay: bool,
#[serde(default)]
pub nodelay: u32,
#[serde(default = "default_interval")]
pub interval: u32,
#[serde(default)]
pub resend: u32,
#[serde(default)]
pub nc: u32,
#[serde(default = "default_sockbuf")]
pub sockbuf: u32,
#[serde(default = "default_smuxver")]
pub smuxver: u32,
#[serde(default = "default_smuxbuf")]
pub smuxbuf: u32,
#[serde(default = "default_framesize")]
pub framesize: u32,
#[serde(default = "default_streambuf")]
pub streambuf: u32,
#[serde(default = "default_keepalive")]
pub keepalive: u32,
#[serde(default)]
pub log: String,
#[serde(default)]
pub snmplog: String,
#[serde(default = "default_snmpperiod")]
pub snmpperiod: u32,
#[serde(default)]
pub quiet: bool,
#[serde(default)]
pub tcp: bool,
#[serde(default)]
pub pprof: bool,
#[serde(default)]
pub qpp: bool,
#[serde(default = "default_qppcount")]
pub qpp_count: u32,
#[serde(default)]
pub closewait: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ServerConfig {
#[serde(default = "default_listen")]
pub listen: String,
#[serde(default = "default_target")]
pub target: String,
#[serde(default = "default_key")]
pub key: String,
#[serde(default = "default_crypt")]
pub crypt: String,
#[serde(default = "default_mode")]
pub mode: String,
#[serde(default = "default_mtu")]
pub mtu: u32,
#[serde(default)]
pub ratelimit: u32,
#[serde(default = "default_sndwnd_server")]
pub sndwnd: u32,
#[serde(default = "default_rcvwnd_server")]
pub rcvwnd: u32,
#[serde(default = "default_datashard")]
pub datashard: u32,
#[serde(default = "default_parityshard")]
pub parityshard: u32,
#[serde(default)]
pub dscp: u32,
#[serde(default)]
pub nocomp: bool,
#[serde(default)]
pub acknodelay: bool,
#[serde(default)]
pub nodelay: u32,
#[serde(default = "default_interval")]
pub interval: u32,
#[serde(default)]
pub resend: u32,
#[serde(default)]
pub nc: u32,
#[serde(default = "default_sockbuf")]
pub sockbuf: u32,
#[serde(default = "default_smuxver")]
pub smuxver: u32,
#[serde(default = "default_smuxbuf")]
pub smuxbuf: u32,
#[serde(default = "default_framesize")]
pub framesize: u32,
#[serde(default = "default_streambuf")]
pub streambuf: u32,
#[serde(default = "default_keepalive")]
pub keepalive: u32,
#[serde(default)]
pub log: String,
#[serde(default)]
pub snmplog: String,
#[serde(default = "default_snmpperiod")]
pub snmpperiod: u32,
#[serde(default)]
pub pprof: bool,
#[serde(default)]
pub quiet: bool,
#[serde(default)]
pub tcp: bool,
#[serde(default)]
pub qpp: bool,
#[serde(default = "default_qppcount")]
pub qpp_count: u32,
#[serde(default = "default_closewait_server")]
pub closewait: u32,
}
fn default_localaddr() -> String { ":12948".to_string() }
fn default_remoteaddr() -> String { "vps:29900".to_string() }
fn default_key() -> String { "it's a secrect".to_string() }
fn default_crypt() -> String { "aes".to_string() }
fn default_mode() -> String { "fast".to_string() }
fn default_conn() -> u32 { 1 }
fn default_scavengettl() -> u32 { 600 }
fn default_mtu() -> u32 { 1350 }
fn default_sndwnd() -> u32 { 128 }
fn default_rcvwnd() -> u32 { 512 }
fn default_sndwnd_server() -> u32 { 1024 }
fn default_rcvwnd_server() -> u32 { 1024 }
fn default_datashard() -> u32 { 10 }
fn default_parityshard() -> u32 { 3 }
fn default_interval() -> u32 { 50 }
fn default_sockbuf() -> u32 { 4194304 }
fn default_smuxver() -> u32 { 2 }
fn default_smuxbuf() -> u32 { 4194304 }
fn default_framesize() -> u32 { 8192 }
fn default_streambuf() -> u32 { 2097152 }
fn default_keepalive() -> u32 { 10 }
fn default_snmpperiod() -> u32 { 60 }
fn default_qppcount() -> u32 { 61 }
fn default_listen() -> String { ":29900".to_string() }
fn default_target() -> String { "127.0.0.1:12948".to_string() }
fn default_closewait_server() -> u32 { 30 }
impl ClientConfig {
pub fn apply_mode(&mut self) {
match self.mode.as_str() {
"normal" => {
self.nodelay = 0;
self.interval = 40;
self.resend = 2;
self.nc = 1;
}
"fast" => {
self.nodelay = 0;
self.interval = 30;
self.resend = 2;
self.nc = 1;
}
"fast2" => {
self.nodelay = 1;
self.interval = 20;
self.resend = 2;
self.nc = 1;
}
"fast3" => {
self.nodelay = 1;
self.interval = 10;
self.resend = 2;
self.nc = 1;
}
_ => {}
}
}
pub fn from_json<P: AsRef<Path>>(path: P) -> anyhow::Result<Self> {
let content = std::fs::read_to_string(path)?;
let mut config: ClientConfig = serde_json::from_str(&content)?;
config.apply_mode();
Ok(config)
}
}
impl ServerConfig {
pub fn apply_mode(&mut self) {
match self.mode.as_str() {
"normal" => {
self.nodelay = 0;
self.interval = 40;
self.resend = 2;
self.nc = 1;
}
"fast" => {
self.nodelay = 0;
self.interval = 30;
self.resend = 2;
self.nc = 1;
}
"fast2" => {
self.nodelay = 1;
self.interval = 20;
self.resend = 2;
self.nc = 1;
}
"fast3" => {
self.nodelay = 1;
self.interval = 10;
self.resend = 2;
self.nc = 1;
}
_ => {}
}
}
pub fn from_json<P: AsRef<Path>>(path: P) -> anyhow::Result<Self> {
let content = std::fs::read_to_string(path)?;
let mut config: ServerConfig = serde_json::from_str(&content)?;
config.apply_mode();
Ok(config)
}
}