From f47497bf1944ca41c4edf3e1eea20994032c8d92 Mon Sep 17 00:00:00 2001 From: Will Hawkins Date: Mon, 14 Oct 2024 19:14:28 -0400 Subject: [PATCH] support en/decoding the accurate ECN transport param Properly encode/decode the accurate ECN transport param (I-D.seemann-quic-accurate-ack-ecn, https://datatracker.ietf.org/doc/html/draft-seemann-quic-accurate-ack-ecn-01). --- quiche/src/lib.rs | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/quiche/src/lib.rs b/quiche/src/lib.rs index bf9c27824e..466c79a72b 100644 --- a/quiche/src/lib.rs +++ b/quiche/src/lib.rs @@ -8023,6 +8023,8 @@ pub struct TransportParams { pub retry_source_connection_id: Option>, /// DATAGRAM frame extension parameter, if any. pub max_datagram_frame_size: Option, + /// Whether accurate ECN support is enabled. + pub accurate_ecn_enabled: bool, // pub preferred_address: ..., } @@ -8046,6 +8048,7 @@ impl Default for TransportParams { initial_source_connection_id: None, retry_source_connection_id: None, max_datagram_frame_size: None, + accurate_ecn_enabled: false, } } } @@ -8196,6 +8199,10 @@ impl TransportParams { tp.max_datagram_frame_size = Some(val.get_varint()?); }, + 0x2051a5fa8648af => { + tp.accurate_ecn_enabled = true; + }, + // Ignore unknown parameters. _ => (), } @@ -8358,6 +8365,10 @@ impl TransportParams { b.put_varint(max_datagram_frame_size)?; } + if tp.accurate_ecn_enabled { + TransportParams::encode_param(&mut b, 0x2051a5fa8648af, 0)?; + } + let out_len = b.off(); Ok(&mut out[..out_len]) @@ -8952,12 +8963,13 @@ mod tests { initial_source_connection_id: Some(b"woot woot".to_vec().into()), retry_source_connection_id: Some(b"retry".to_vec().into()), max_datagram_frame_size: Some(32), + accurate_ecn_enabled: true, }; let mut raw_params = [42; 256]; let raw_params = TransportParams::encode(&tp, true, &mut raw_params).unwrap(); - assert_eq!(raw_params.len(), 94); + assert_eq!(raw_params.len(), 103); let new_tp = TransportParams::decode(raw_params, false).unwrap(); @@ -8982,12 +8994,13 @@ mod tests { initial_source_connection_id: Some(b"woot woot".to_vec().into()), retry_source_connection_id: None, max_datagram_frame_size: Some(32), + accurate_ecn_enabled: true, }; let mut raw_params = [42; 256]; let raw_params = TransportParams::encode(&tp, false, &mut raw_params).unwrap(); - assert_eq!(raw_params.len(), 69); + assert_eq!(raw_params.len(), 78); let new_tp = TransportParams::decode(raw_params, true).unwrap();