Skip to content

Commit da64232

Browse files
committed
lib: support idle timeout reconfiguration
1 parent b17904e commit da64232

File tree

3 files changed

+75
-0
lines changed

3 files changed

+75
-0
lines changed

quiche/include/quiche.h

+4
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,10 @@ void quiche_conn_set_qlog_fd(quiche_conn *conn, int fd, const char *log_title,
333333
// Configures the given session for resumption.
334334
int quiche_conn_set_session(quiche_conn *conn, const uint8_t *buf, size_t buf_len);
335335

336+
// Sets the `max_idle_timeout` transport parameter, in milliseconds, default is
337+
// no timeout.
338+
int quiche_conn_set_max_idle_timeout(quiche_conn *conn, uint64_t v);
339+
336340
typedef struct {
337341
// The remote address the packet was received from.
338342
struct sockaddr *from;

quiche/src/ffi.rs

+11
Original file line numberDiff line numberDiff line change
@@ -725,6 +725,17 @@ pub extern fn quiche_conn_set_session(
725725
}
726726
}
727727

728+
#[no_mangle]
729+
pub extern fn quiche_conn_set_max_idle_timeout(
730+
conn: &mut Connection, v: u64,
731+
) -> c_int {
732+
match conn.set_max_idle_timeout(v) {
733+
Ok(()) => 0,
734+
735+
Err(e) => e.to_c() as c_int,
736+
}
737+
}
738+
728739
#[repr(C)]
729740
pub struct RecvInfo<'a> {
730741
from: &'a sockaddr,

quiche/src/lib.rs

+60
Original file line numberDiff line numberDiff line change
@@ -2198,6 +2198,24 @@ impl Connection {
21982198
Ok(())
21992199
}
22002200

2201+
/// Sets the `max_idle_timeout` transport parameter, in milliseconds.
2202+
///
2203+
/// This must only be called immediately after creating a connection, that
2204+
/// is, before any packet is sent or received. Otherwise Error::Done is
2205+
/// returned.
2206+
///
2207+
/// The default value is infinite, that is, no timeout is used unless
2208+
/// already configured when creating the connection.
2209+
pub fn set_max_idle_timeout(&mut self, v: u64) -> Result<()> {
2210+
if self.is_established() || self.is_in_early_data() {
2211+
return Err(Error::Done);
2212+
}
2213+
2214+
self.local_transport_params.max_idle_timeout = v;
2215+
2216+
self.encode_transport_params()
2217+
}
2218+
22012219
/// Processes QUIC packets received from the peer.
22022220
///
22032221
/// On success the number of bytes processed from the input buffer is
@@ -9228,6 +9246,48 @@ mod tests {
92289246
);
92299247
}
92309248

9249+
#[test]
9250+
fn change_idle_timeout() {
9251+
let mut config = Config::new(0x1).unwrap();
9252+
config
9253+
.set_application_protos(&[b"proto1", b"proto2"])
9254+
.unwrap();
9255+
config.set_max_idle_timeout(999999);
9256+
config.verify_peer(false);
9257+
9258+
let mut pipe = testing::Pipe::with_client_config(&mut config).unwrap();
9259+
assert_eq!(pipe.client.local_transport_params.max_idle_timeout, 999999);
9260+
assert_eq!(pipe.client.peer_transport_params.max_idle_timeout, 0);
9261+
assert_eq!(pipe.server.local_transport_params.max_idle_timeout, 0);
9262+
assert_eq!(pipe.server.peer_transport_params.max_idle_timeout, 0);
9263+
9264+
pipe.client.set_max_idle_timeout(456).unwrap();
9265+
pipe.server.set_max_idle_timeout(234).unwrap();
9266+
assert_eq!(pipe.client.local_transport_params.max_idle_timeout, 456000);
9267+
assert_eq!(pipe.client.peer_transport_params.max_idle_timeout, 0);
9268+
assert_eq!(pipe.server.local_transport_params.max_idle_timeout, 234000);
9269+
assert_eq!(pipe.server.peer_transport_params.max_idle_timeout, 0);
9270+
9271+
assert_eq!(pipe.handshake(), Ok(()));
9272+
9273+
// Attempting to change after handshake is a no-op
9274+
assert_eq!(pipe.client.set_max_idle_timeout(789), Err(Error::Done));
9275+
assert_eq!(pipe.server.set_max_idle_timeout(345), Err(Error::Done));
9276+
assert_eq!(pipe.client.local_transport_params.max_idle_timeout, 456000);
9277+
assert_eq!(pipe.client.peer_transport_params.max_idle_timeout, 234000);
9278+
assert_eq!(pipe.server.local_transport_params.max_idle_timeout, 234000);
9279+
assert_eq!(pipe.server.peer_transport_params.max_idle_timeout, 456000);
9280+
9281+
assert_eq!(
9282+
pipe.client.idle_timeout(),
9283+
Some(time::Duration::from_millis(234000))
9284+
);
9285+
assert_eq!(
9286+
pipe.server.idle_timeout(),
9287+
Some(time::Duration::from_millis(234000))
9288+
);
9289+
}
9290+
92319291
#[test]
92329292
fn handshake() {
92339293
let mut pipe = testing::Pipe::new().unwrap();

0 commit comments

Comments
 (0)