diff --git a/Cargo.lock b/Cargo.lock index e3ceba8..939f6e8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2008,6 +2008,7 @@ dependencies = [ "prost-reflect-build", "prost-types", "quinn", + "quinn-proto", "rand 0.8.5", "rcgen", "regex", diff --git a/easytier/Cargo.toml b/easytier/Cargo.toml index 69d60ea..876b4aa 100644 --- a/easytier/Cargo.toml +++ b/easytier/Cargo.toml @@ -65,6 +65,8 @@ pin-project-lite = "0.2.13" tachyonix = "0.3.0" quinn = { version = "0.11.8", optional = true, features = ["ring"] } +quinn-proto = { version = "0.11.5", optional = true } + rustls = { version = "0.23.0", features = [ "ring", ], default-features = false, optional = true } @@ -291,7 +293,7 @@ full = [ "socks5", ] wireguard = ["dep:boringtun", "dep:ring"] -quic = ["dep:quinn", "dep:rustls", "dep:rcgen"] +quic = ["dep:quinn", "dep:rustls", "dep:rcgen", "dep:quinn-proto"] mimalloc = ["dep:mimalloc"] aes-gcm = ["dep:aes-gcm"] tun = ["dep:tun"] diff --git a/easytier/src/tunnel/quic.rs b/easytier/src/tunnel/quic.rs index 728e85f..513bc73 100644 --- a/easytier/src/tunnel/quic.rs +++ b/easytier/src/tunnel/quic.rs @@ -9,6 +9,7 @@ use crate::tunnel::{ TunnelInfo, }; use anyhow::Context; + use quinn::{ crypto::rustls::QuicClientConfig, ClientConfig, Connection, Endpoint, ServerConfig, TransportConfig, @@ -19,17 +20,21 @@ use super::{ insecure_tls::{get_insecure_tls_cert, get_insecure_tls_client_config}, IpVersion, Tunnel, TunnelConnector, TunnelError, TunnelListener, }; +use quinn_proto::congestion::BbrConfig; + pub fn configure_client() -> ClientConfig { - let mut tspt_cfg = TransportConfig::default(); - tspt_cfg.keep_alive_interval(Some(Duration::from_secs(5))); + let client_crypto = QuicClientConfig::try_from(get_insecure_tls_client_config()).unwrap(); + let mut client_config = ClientConfig::new(Arc::new(client_crypto)); - let mut cfg = ClientConfig::new(Arc::new( - QuicClientConfig::try_from(get_insecure_tls_client_config()).unwrap(), - )); - cfg.transport_config(Arc::new(tspt_cfg)); + // // Create a new TransportConfig and set BBR + let mut transport_config = TransportConfig::default(); + transport_config.congestion_controller_factory(Arc::new(BbrConfig::default())); + transport_config.keep_alive_interval(Some(Duration::from_secs(5))); + // Replace the default TransportConfig with the transport_config() method + client_config.transport_config(Arc::new(transport_config)); - cfg + client_config } /// Constructs a QUIC endpoint configured to listen for incoming connections on a certain address @@ -54,6 +59,8 @@ pub fn configure_server() -> Result<(ServerConfig, Vec), Box> { let transport_config = Arc::get_mut(&mut server_config.transport).unwrap(); transport_config.max_concurrent_uni_streams(10_u8.into()); transport_config.max_concurrent_bidi_streams(10_u8.into()); + // Setting BBR congestion control + transport_config.congestion_controller_factory(Arc::new(BbrConfig::default())); Ok((server_config, certs[0].to_vec())) }