From ecd41268742a449b927ef71a9fc90e88a19fbeac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adolfo=20Ochagav=C3=ADa?= Date: Mon, 3 Apr 2023 10:28:53 +0200 Subject: [PATCH] Use PLPMTUD in bench, perf and examples Sponsored by Stormshield --- bench/src/lib.rs | 2 ++ perf/src/bin/perf_client.rs | 2 ++ perf/src/bin/perf_server.rs | 2 ++ quinn/benches/bench.rs | 23 ++++++++++++++++++----- quinn/examples/client.rs | 5 ++++- quinn/examples/common/mod.rs | 25 ++++++++++++++++++++----- quinn/examples/insecure_connection.rs | 3 ++- quinn/examples/server.rs | 7 ++++--- 8 files changed, 54 insertions(+), 15 deletions(-) diff --git a/bench/src/lib.rs b/bench/src/lib.rs index 5de9a106a0..0e5b5030e2 100644 --- a/bench/src/lib.rs +++ b/bench/src/lib.rs @@ -142,6 +142,8 @@ pub fn transport_config(opt: &Opt) -> quinn::TransportConfig { // High stream windows are chosen because the amount of concurrent streams // is configurable as a parameter. let mut config = quinn::TransportConfig::default(); + #[cfg(any(windows, os = "linux"))] + config.mtu_discovery_config(Some(quinn::MtuDiscoveryConfig::default())); config.max_concurrent_uni_streams(opt.max_streams.try_into().unwrap()); config.initial_max_udp_payload_size(opt.initial_mtu); config diff --git a/perf/src/bin/perf_client.rs b/perf/src/bin/perf_client.rs index 6331b33e42..42ccd25a36 100644 --- a/perf/src/bin/perf_client.rs +++ b/perf/src/bin/perf_client.rs @@ -129,6 +129,8 @@ async fn run(opt: Opt) -> Result<()> { } let mut transport = quinn::TransportConfig::default(); + #[cfg(any(windows, os = "linux"))] + transport.mtu_discovery_config(Some(quinn::MtuDiscoveryConfig::default())); transport.initial_max_udp_payload_size(opt.initial_max_udp_payload_size); let mut cfg = if opt.no_protection { diff --git a/perf/src/bin/perf_server.rs b/perf/src/bin/perf_server.rs index c3dea41a60..b70442b390 100644 --- a/perf/src/bin/perf_server.rs +++ b/perf/src/bin/perf_server.rs @@ -88,6 +88,8 @@ async fn run(opt: Opt) -> Result<()> { } let mut transport = quinn::TransportConfig::default(); + #[cfg(any(windows, os = "linux"))] + transport.mtu_discovery_config(Some(quinn::MtuDiscoveryConfig::default())); transport.initial_max_udp_payload_size(opt.initial_max_udp_payload_size); let mut server_config = if opt.no_protection { diff --git a/quinn/benches/bench.rs b/quinn/benches/bench.rs index 527cdae4ee..460dfe40e8 100644 --- a/quinn/benches/bench.rs +++ b/quinn/benches/bench.rs @@ -74,7 +74,6 @@ struct Context { } impl Context { - #[allow(clippy::field_reassign_with_default)] // https://github.com/rust-lang/rust-clippy/issues/6527 fn new() -> Self { let cert = rcgen::generate_simple_self_signed(vec!["localhost".into()]).unwrap(); let key = rustls::PrivateKey(cert.serialize_private_key_der()); @@ -82,15 +81,21 @@ impl Context { let mut server_config = quinn::ServerConfig::with_single_cert(vec![cert.clone()], key).unwrap(); - Arc::get_mut(&mut server_config.transport) - .unwrap() - .max_concurrent_uni_streams(1024_u16.into()); + let transport_config = Arc::get_mut(&mut server_config.transport).unwrap(); + transport_config.max_concurrent_uni_streams(1024_u16.into()); + enable_plpmtud_if_supported(transport_config); let mut roots = rustls::RootCertStore::empty(); roots.add(&cert).unwrap(); + + let mut client_config = quinn::ClientConfig::with_root_certificates(roots); + let mut transport_config = quinn::TransportConfig::default(); + enable_plpmtud_if_supported(&mut transport_config); + client_config.transport_config(Arc::new(transport_config)); + Self { server_config, - client_config: quinn::ClientConfig::with_root_certificates(roots), + client_config, } } @@ -153,6 +158,14 @@ impl Context { } } +#[cfg(any(windows, os = "linux"))] +fn enable_plpmtud_if_supported(transport_config: &mut quinn::TransportConfig) { + transport_config.mtu_discovery_config(Some(quinn::MtuDiscoveryConfig::default())); +} + +#[cfg(not(any(windows, os = "linux")))] +fn enable_plpmtud_if_supported(_transport_config: &mut quinn::TransportConfig) {} + fn rt() -> Runtime { Builder::new_current_thread().enable_all().build().unwrap() } diff --git a/quinn/examples/client.rs b/quinn/examples/client.rs index 16f90b7b2c..a64108a32e 100644 --- a/quinn/examples/client.rs +++ b/quinn/examples/client.rs @@ -95,8 +95,11 @@ async fn run(options: Opt) -> Result<()> { client_crypto.key_log = Arc::new(rustls::KeyLogFile::new()); } + let mut client_config = quinn::ClientConfig::new(Arc::new(client_crypto)); + common::enable_plpmtud_if_supported(&mut client_config); + let mut endpoint = quinn::Endpoint::client("[::]:0".parse().unwrap())?; - endpoint.set_default_client_config(quinn::ClientConfig::new(Arc::new(client_crypto))); + endpoint.set_default_client_config(client_config); let request = format!("GET {}\r\n", url.path()); let start = Instant::now(); diff --git a/quinn/examples/common/mod.rs b/quinn/examples/common/mod.rs index a3890281ed..c354742f47 100644 --- a/quinn/examples/common/mod.rs +++ b/quinn/examples/common/mod.rs @@ -45,11 +45,25 @@ fn configure_client(server_certs: &[&[u8]]) -> Result Result<(ServerConfig, Vec), Box> { let cert = rcgen::generate_simple_self_signed(vec!["localhost".into()]).unwrap(); let cert_der = cert.serialize_der().unwrap(); @@ -58,9 +72,10 @@ fn configure_server() -> Result<(ServerConfig, Vec), Box> { let cert_chain = vec![rustls::Certificate(cert_der.clone())]; let mut server_config = ServerConfig::with_single_cert(cert_chain, priv_key)?; - Arc::get_mut(&mut server_config.transport) - .unwrap() - .max_concurrent_uni_streams(0_u8.into()); + let transport_config = Arc::get_mut(&mut server_config.transport).unwrap(); + transport_config.max_concurrent_uni_streams(0_u8.into()); + #[cfg(any(windows, os = "linux"))] + transport_config.mtu_discovery_config(Some(quinn::MtuDiscoveryConfig::default())); Ok((server_config, cert_der)) } diff --git a/quinn/examples/insecure_connection.rs b/quinn/examples/insecure_connection.rs index 9d2149332c..e386eb2f56 100644 --- a/quinn/examples/insecure_connection.rs +++ b/quinn/examples/insecure_connection.rs @@ -31,7 +31,8 @@ async fn run_server(addr: SocketAddr) { } async fn run_client(server_addr: SocketAddr) -> Result<(), Box> { - let client_cfg = configure_client(); + let mut client_cfg = configure_client(); + common::enable_plpmtud_if_supported(&mut client_cfg); let mut endpoint = Endpoint::client("127.0.0.1:0".parse().unwrap())?; endpoint.set_default_client_config(client_cfg); diff --git a/quinn/examples/server.rs b/quinn/examples/server.rs index 3ffc9d463e..fc1ff75f20 100644 --- a/quinn/examples/server.rs +++ b/quinn/examples/server.rs @@ -131,9 +131,10 @@ async fn run(options: Opt) -> Result<()> { } let mut server_config = quinn::ServerConfig::with_crypto(Arc::new(server_crypto)); - Arc::get_mut(&mut server_config.transport) - .unwrap() - .max_concurrent_uni_streams(0_u8.into()); + let transport_config = Arc::get_mut(&mut server_config.transport).unwrap(); + transport_config.max_concurrent_uni_streams(0_u8.into()); + #[cfg(any(windows, os = "linux"))] + transport_config.mtu_discovery_config(Some(quinn::MtuDiscoveryConfig::default())); if options.stateless_retry { server_config.use_retry(true); }