kcptun-rust 1.1.0

A Rust implementation of kcptun, a fast and reliable tunnel based on KCP protocol
Documentation
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,
}

// Default values for client
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 {
    /// Apply mode configuration
    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;
            }
            _ => {}
        }
    }

    /// Load configuration from JSON file
    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 {
    /// Apply mode configuration
    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;
            }
            _ => {}
        }
    }

    /// Load configuration from JSON file
    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)
    }
}