From af0df587246d6492ed40ebc1e43784fff9ee7dd4 Mon Sep 17 00:00:00 2001 From: xiaofei0800 Date: Thu, 30 Nov 2023 15:06:34 +0800 Subject: [PATCH] Add initial rtt config. --- apps/src/bin/tquic_client.rs | 9 +++++++-- apps/src/bin/tquic_server.rs | 9 +++++++-- include/tquic.h | 7 +++++++ interop/run_endpoint.sh | 8 ++++++-- src/ffi.rs | 8 ++++++++ src/lib.rs | 22 ++++++++++++++++++---- 6 files changed, 53 insertions(+), 10 deletions(-) diff --git a/apps/src/bin/tquic_client.rs b/apps/src/bin/tquic_client.rs index 4d047845..86ac820d 100644 --- a/apps/src/bin/tquic_client.rs +++ b/apps/src/bin/tquic_client.rs @@ -166,13 +166,17 @@ pub struct ClientOpt { pub send_udp_payload_size: usize, /// Handshake timeout in microseconds. - #[clap(long, default_value = "5000", value_name = "TIME")] + #[clap(long, default_value = "10000", value_name = "TIME")] pub handshake_timeout: u64, /// Connection idle timeout in microseconds. - #[clap(long, default_value = "5000", value_name = "TIME")] + #[clap(long, default_value = "30000", value_name = "TIME")] pub idle_timeout: u64, + /// Initial RTT in milliseconds. + #[clap(long, default_value = "333", value_name = "TIME")] + pub initial_rtt: u64, + /// Save TLS key log into the given file. #[clap(short, long, value_name = "FILE")] pub keylog_file: Option, @@ -375,6 +379,7 @@ impl Worker { config.enable_stateless_reset(!option.disable_stateless_reset); config.set_max_handshake_timeout(option.handshake_timeout); config.set_max_idle_timeout(option.idle_timeout); + config.set_initial_rtt(option.initial_rtt); config.set_max_concurrent_conns(option.max_concurrent_conns); config.set_initial_max_streams_bidi(option.max_concurrent_requests); config.set_send_batch_size(option.send_batch_size); diff --git a/apps/src/bin/tquic_server.rs b/apps/src/bin/tquic_server.rs index df71567c..baeb3730 100644 --- a/apps/src/bin/tquic_server.rs +++ b/apps/src/bin/tquic_server.rs @@ -111,13 +111,17 @@ pub struct ServerOpt { pub send_udp_payload_size: usize, /// Handshake timeout in microseconds. - #[clap(long, default_value = "5000", value_name = "TIME")] + #[clap(long, default_value = "10000", value_name = "TIME")] pub handshake_timeout: u64, /// Connection idle timeout in microseconds. - #[clap(long, default_value = "5000", value_name = "TIME")] + #[clap(long, default_value = "30000", value_name = "TIME")] pub idle_timeout: u64, + /// Initial RTT in milliseconds. + #[clap(long, default_value = "333", value_name = "TIME")] + pub initial_rtt: u64, + /// Save TLS key log into the given file. #[clap(long, value_name = "FILE")] pub keylog_file: Option, @@ -158,6 +162,7 @@ impl Server { config.enable_stateless_reset(!option.disable_stateless_reset); config.set_max_handshake_timeout(option.handshake_timeout); config.set_max_idle_timeout(option.idle_timeout); + config.set_initial_rtt(option.initial_rtt); config.set_send_batch_size(option.send_batch_size); config.set_multipath(option.enable_multipath); config.set_multipath_algor(option.multipath_algor); diff --git a/include/tquic.h b/include/tquic.h index 8e87f171..bdb0552d 100644 --- a/include/tquic.h +++ b/include/tquic.h @@ -351,6 +351,13 @@ void quic_config_set_max_ack_delay(struct quic_config_t *config, uint64_t v); void quic_config_set_congestion_control_algorithm(struct quic_config_t *config, enum quic_congestion_control_algorithm v); +/** + * Set the initial RTT in milliseconds. The default value is 333ms. + * The configuration should be changed with caution. Setting a value less than the default + * will cause retransmission of handshake packets to be more aggressive. + */ +void quic_config_set_initial_rtt(struct quic_config_t *config, uint64_t v); + /** * Set the `active_connection_id_limit` transport parameter. */ diff --git a/interop/run_endpoint.sh b/interop/run_endpoint.sh index 58869d50..90550320 100644 --- a/interop/run_endpoint.sh +++ b/interop/run_endpoint.sh @@ -48,7 +48,7 @@ if [ "$ROLE" == "client" ]; then REQS=($REQUESTS) - CLIENT_ARGS="--dump-path ${DOWNLOAD_DIR} --keylog-file $SSLKEYLOGFILE --log-level TRACE --max-concurrent-requests ${#REQS[@]}" + CLIENT_ARGS="--dump-path ${DOWNLOAD_DIR} --keylog-file $SSLKEYLOGFILE --log-level TRACE --idle-timeout 30000 --handshake-timeout 30000 --max-concurrent-requests ${#REQS[@]}" CLIENT_ALPN="--alpn hq-interop" case $TESTCASE in resumption) @@ -67,6 +67,7 @@ if [ "$ROLE" == "client" ]; then case $TESTCASE in multiconnect|resumption) + CLIENT_ARGS="$CLIENT_ARGS --initial-rtt 100" for REQ in $REQUESTS do $TQUIC_DIR/$TQUIC_CLIENT $CLIENT_ARGS $REQ >> $LOG_DIR/$ROLE.log 2>&1 @@ -81,11 +82,14 @@ if [ "$ROLE" == "client" ]; then ;; esac elif [ "$ROLE" == "server" ]; then - SERVER_ARGS="-c /certs/cert.pem -k /certs/priv.key --listen [::]:443 --root $ROOT_DIR --log-level TRACE --keylog-file $SSLKEYLOGFILE" + SERVER_ARGS="-c /certs/cert.pem -k /certs/priv.key --listen [::]:443 --root $ROOT_DIR --keylog-file $SSLKEYLOGFILE --log-level TRACE --idle-timeout 30000 --handshake-timeout 30000" case $TESTCASE in retry) SERVER_ARGS="$SERVER_ARGS --enable-retry" ;; + multiconnect) + SERVER_ARGS="$SERVER_ARGS --initial-rtt 100" + ;; *) ;; esac diff --git a/src/ffi.rs b/src/ffi.rs index 3806ae1f..db3d8649 100644 --- a/src/ffi.rs +++ b/src/ffi.rs @@ -193,6 +193,14 @@ pub extern "C" fn quic_config_set_congestion_control_algorithm( config.set_congestion_control_algorithm(v); } +/// Set the initial RTT in milliseconds. The default value is 333ms. +/// The configuration should be changed with caution. Setting a value less than the default +/// will cause retransmission of handshake packets to be more aggressive. +#[no_mangle] +pub extern "C" fn quic_config_set_initial_rtt(config: &mut Config, v: u64) { + config.set_initial_rtt(v); +} + /// Set the `active_connection_id_limit` transport parameter. #[no_mangle] pub extern "C" fn quic_config_set_active_connection_id_limit(config: &mut Config, v: u64) { diff --git a/src/lib.rs b/src/lib.rs index 27068090..f4af132a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -486,11 +486,12 @@ impl Config { self.recovery.congestion_control_algorithm = cca; } - /// Set the initial RTT. The default value is 333ms. - /// The function is for unit testing only. - #[cfg(test)] + /// Set the initial RTT in milliseconds. The default value is 333ms. + /// + /// The configuration should be changed with caution. Setting a value less than the default + /// will cause retransmission of handshake packets to be more aggressive. pub fn set_initial_rtt(&mut self, millisecs: u64) { - self.recovery.initial_rtt = Duration::from_millis(millisecs); + self.recovery.initial_rtt = cmp::max(Duration::from_millis(millisecs), TIMER_GRANULARITY); } /// Set the `active_connection_id_limit` transport parameter. @@ -825,6 +826,19 @@ mod tests { }; assert_eq!(format!("{}", cid), "a8a8a8a8"); } + + #[test] + fn initial_rtt() -> Result<()> { + let mut config = Config::new()?; + + config.set_initial_rtt(0); + assert_eq!(config.recovery.initial_rtt, TIMER_GRANULARITY); + + config.set_initial_rtt(100); + assert_eq!(config.recovery.initial_rtt, Duration::from_millis(100)); + + Ok(()) + } } pub use crate::congestion_control::CongestionControlAlgorithm;