Skip to content

Commit 55f954b

Browse files
committed
#2057: Option to disable GREASE random transport parameter.
1 parent 1c463ab commit 55f954b

File tree

2 files changed

+46
-1
lines changed

2 files changed

+46
-1
lines changed

quinn-proto/src/config/transport.rs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ pub struct TransportConfig {
4343
pub(crate) congestion_controller_factory: Arc<dyn congestion::ControllerFactory + Send + Sync>,
4444

4545
pub(crate) enable_segmentation_offload: bool,
46+
47+
pub(crate) send_grease_transport_parameter: bool,
4648
}
4749

4850
impl TransportConfig {
@@ -314,6 +316,14 @@ impl TransportConfig {
314316
self.enable_segmentation_offload = enabled;
315317
self
316318
}
319+
320+
/// Specifies whether the GREASE transport parameter is sent during transport parameter negotiation.
321+
///
322+
/// Defaults to `true`.
323+
pub fn send_grease_random_transport_parameter(&mut self, enabled: bool) -> &mut Self {
324+
self.send_grease_transport_parameter = enabled;
325+
self
326+
}
317327
}
318328

319329
impl Default for TransportConfig {
@@ -354,6 +364,8 @@ impl Default for TransportConfig {
354364
congestion_controller_factory: Arc::new(congestion::CubicConfig::default()),
355365

356366
enable_segmentation_offload: true,
367+
368+
send_grease_transport_parameter: true,
357369
}
358370
}
359371
}
@@ -385,6 +397,7 @@ impl fmt::Debug for TransportConfig {
385397
deterministic_packet_numbers: _,
386398
congestion_controller_factory: _,
387399
enable_segmentation_offload,
400+
send_grease_transport_parameter,
388401
} = self;
389402
fmt.debug_struct("TransportConfig")
390403
.field("max_concurrent_bidi_streams", max_concurrent_bidi_streams)
@@ -412,6 +425,10 @@ impl fmt::Debug for TransportConfig {
412425
.field("datagram_send_buffer_size", datagram_send_buffer_size)
413426
.field("congestion_controller_factory", &"[ opaque ]")
414427
.field("enable_segmentation_offload", enable_segmentation_offload)
428+
.field(
429+
"send_grease_transport_parameter",
430+
send_grease_transport_parameter,
431+
)
415432
.finish()
416433
}
417434
}

quinn-proto/src/transport_parameters.rs

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,11 @@ impl TransportParameters {
167167
min_ack_delay: Some(
168168
VarInt::from_u64(u64::try_from(TIMER_GRANULARITY.as_micros()).unwrap()).unwrap(),
169169
),
170-
grease_transport_parameter: Some(ReservedTransportParameter::random(rng)),
170+
grease_transport_parameter: if config.send_grease_transport_parameter {
171+
Some(ReservedTransportParameter::random(rng))
172+
} else {
173+
None
174+
},
171175
..Self::default()
172176
}
173177
}
@@ -636,6 +640,30 @@ mod test {
636640
assert_eq!(read_params, TransportParameters::default());
637641
}
638642

643+
#[test]
644+
fn grease_transport_parameter_not_serialized_when_disabled() {
645+
let mut params = TransportParameters::default();
646+
params.grease_transport_parameter = None;
647+
648+
let mut buf = Vec::new();
649+
params.write(&mut buf);
650+
assert!(buf.is_empty());
651+
}
652+
653+
#[test]
654+
fn grease_transport_parameter_is_serialized_when_enabled() {
655+
let mut params = TransportParameters::default();
656+
params.grease_transport_parameter = Some(ReservedTransportParameter {
657+
id: VarInt::from_u32(27),
658+
payload: [0xAB, 0xFF, 0x1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
659+
payload_len: 3,
660+
});
661+
662+
let mut buf = Vec::new();
663+
params.write(&mut buf);
664+
assert_eq!(buf, [27, 3, 0xAB, 0xFF, 0x1])
665+
}
666+
639667
#[test]
640668
fn read_semantic_validation() {
641669
#[allow(clippy::type_complexity)]

0 commit comments

Comments
 (0)