Skip to content

Commit d11097c

Browse files
committed
Encode And Parse Version Information Transport Parameter
Does not (yet!) incorporate parsed Version Information Transport Parameter into version negotiotiation.
1 parent 90b98f6 commit d11097c

File tree

2 files changed

+33
-2
lines changed

2 files changed

+33
-2
lines changed

quiche/src/lib.rs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8909,6 +8909,8 @@ pub struct TransportParams {
89098909
pub retry_source_connection_id: Option<ConnectionId<'static>>,
89108910
/// DATAGRAM frame extension parameter, if any.
89118911
pub max_datagram_frame_size: Option<u64>,
8912+
/// Information for version negotiation, if any.
8913+
pub version_information: Option<(u32, Option<Vec<u32>>)>,
89128914
/// Unknown peer transport parameters and values, if any.
89138915
pub unknown_params: Option<UnknownTransportParameters>,
89148916
// pub preferred_address: ...,
@@ -8934,6 +8936,7 @@ impl Default for TransportParams {
89348936
initial_source_connection_id: None,
89358937
retry_source_connection_id: None,
89368938
max_datagram_frame_size: None,
8939+
version_information: None,
89378940
unknown_params: Default::default(),
89388941
}
89398942
}
@@ -9094,6 +9097,18 @@ impl TransportParams {
90949097
tp.max_datagram_frame_size = Some(val.get_varint()?);
90959098
},
90969099

9100+
0x0011 => {
9101+
let chosen_version = val.get_u32()?;
9102+
9103+
let mut available_versions: Option<Vec<u32>> = None;
9104+
while val.off() < val.len() {
9105+
let version = val.get_u32()?;
9106+
available_versions.get_or_insert_default().push(version);
9107+
}
9108+
tp.version_information =
9109+
Some((chosen_version, available_versions));
9110+
},
9111+
90979112
// Track unknown transport parameters specially.
90989113
unknown_tp_id => {
90999114
if let Some(unknown_params) = &mut tp.unknown_params {
@@ -9279,6 +9294,20 @@ impl TransportParams {
92799294
b.put_varint(max_datagram_frame_size)?;
92809295
}
92819296

9297+
if let Some((left, right)) = &tp.version_information {
9298+
TransportParams::encode_param(
9299+
&mut b,
9300+
0x0011,
9301+
4 + 4 * right.as_ref().map(|r| r.len()).unwrap_or_default(),
9302+
)?;
9303+
b.put_u32(*left)?;
9304+
if let Some(available_versions) = &right {
9305+
for available_version in available_versions {
9306+
b.put_u32(*available_version)?;
9307+
}
9308+
}
9309+
}
9310+
92829311
let out_len = b.off();
92839312

92849313
Ok(&mut out[..out_len])

quiche/src/tests.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,12 +51,13 @@ fn transport_params() {
5151
initial_source_connection_id: Some(b"woot woot".to_vec().into()),
5252
retry_source_connection_id: Some(b"retry".to_vec().into()),
5353
max_datagram_frame_size: Some(32),
54+
version_information: Some((72, Some(vec![81, 5, 9]))),
5455
unknown_params: Default::default(),
5556
};
5657

5758
let mut raw_params = [42; 256];
5859
let raw_params = TransportParams::encode(&tp, true, &mut raw_params).unwrap();
59-
assert_eq!(raw_params.len(), 94);
60+
assert_eq!(raw_params.len(), 112);
6061

6162
let new_tp = TransportParams::decode(raw_params, false, None).unwrap();
6263

@@ -81,13 +82,14 @@ fn transport_params() {
8182
initial_source_connection_id: Some(b"woot woot".to_vec().into()),
8283
retry_source_connection_id: None,
8384
max_datagram_frame_size: Some(32),
85+
version_information: Some((72, None)),
8486
unknown_params: Default::default(),
8587
};
8688

8789
let mut raw_params = [42; 256];
8890
let raw_params =
8991
TransportParams::encode(&tp, false, &mut raw_params).unwrap();
90-
assert_eq!(raw_params.len(), 69);
92+
assert_eq!(raw_params.len(), 75);
9193

9294
let new_tp = TransportParams::decode(raw_params, true, None).unwrap();
9395

0 commit comments

Comments
 (0)