Skip to content

Commit 1549b25

Browse files
feat: Replace HashMap with EnumMap (#2434)
* feat: Replace `HashMap` with `EnumMap` In several places. * Fix * Undo * Fix * Update neqo-transport/src/tparams.rs Co-authored-by: Martin Thomson <[email protected]> Signed-off-by: Lars Eggert <[email protected]> * Suggestions from @martinthomson --------- Signed-off-by: Lars Eggert <[email protected]> Co-authored-by: Martin Thomson <[email protected]>
1 parent db807a9 commit 1549b25

17 files changed

+448
-379
lines changed

Diff for: neqo-transport/src/connection/mod.rs

+37-42
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,15 @@ use crate::{
5555
stats::{Stats, StatsCell},
5656
stream_id::StreamType,
5757
streams::{SendOrder, Streams},
58-
tparams::{self, TransportParameters, TransportParametersHandler},
58+
tparams::{
59+
self,
60+
TransportParameterId::{
61+
self, AckDelayExponent, ActiveConnectionIdLimit, DisableMigration, GreaseQuicBit,
62+
InitialSourceConnectionId, MaxAckDelay, MaxDatagramFrameSize, MinAckDelay,
63+
OriginalDestinationConnectionId, RetrySourceConnectionId, StatelessResetToken,
64+
},
65+
TransportParameters, TransportParametersHandler,
66+
},
5967
tracking::{AckTracker, PacketNumberSpace, RecvdPackets},
6068
version::{Version, WireVersion},
6169
AppError, CloseReason, Error, Res, StreamId,
@@ -373,10 +381,8 @@ impl Connection {
373381
let mut cid_manager =
374382
ConnectionIdManager::new(cid_generator, local_initial_source_cid.clone());
375383
let mut tps = conn_params.create_transport_parameter(role, &mut cid_manager)?;
376-
tps.local.set_bytes(
377-
tparams::INITIAL_SOURCE_CONNECTION_ID,
378-
local_initial_source_cid.to_vec(),
379-
);
384+
tps.local
385+
.set_bytes(InitialSourceConnectionId, local_initial_source_cid.to_vec());
380386

381387
let tphandler = Rc::new(RefCell::new(tps));
382388
let crypto = Crypto::new(
@@ -498,7 +504,7 @@ impl Connection {
498504
#[cfg(test)]
499505
pub fn set_local_tparam(
500506
&self,
501-
tp: tparams::TransportParameterId,
507+
tp: TransportParameterId,
502508
value: tparams::TransportParameter,
503509
) -> Res<()> {
504510
if *self.state() == State::Init {
@@ -525,8 +531,8 @@ impl Connection {
525531
qtrace!("[{self}] Retry CIDs: odcid={odcid} remote={remote_cid} retry={retry_cid}");
526532
// We advertise "our" choices in transport parameters.
527533
let local_tps = &mut self.tps.borrow_mut().local;
528-
local_tps.set_bytes(tparams::ORIGINAL_DESTINATION_CONNECTION_ID, odcid.to_vec());
529-
local_tps.set_bytes(tparams::RETRY_SOURCE_CONNECTION_ID, retry_cid.to_vec());
534+
local_tps.set_bytes(OriginalDestinationConnectionId, odcid.to_vec());
535+
local_tps.set_bytes(RetrySourceConnectionId, retry_cid.to_vec());
530536

531537
// ...and save their choices for later validation.
532538
self.remote_initial_source_cid = Some(remote_cid);
@@ -536,7 +542,7 @@ impl Connection {
536542
self.tps
537543
.borrow()
538544
.local
539-
.get_bytes(tparams::RETRY_SOURCE_CONNECTION_ID)
545+
.get_bytes(RetrySourceConnectionId)
540546
.is_some()
541547
}
542548

@@ -1407,10 +1413,10 @@ impl Connection {
14071413
// This has to happen prior to processing the packet so that
14081414
// the TLS handshake has all it needs.
14091415
if !self.retry_sent() {
1410-
self.tps.borrow_mut().local.set_bytes(
1411-
tparams::ORIGINAL_DESTINATION_CONNECTION_ID,
1412-
packet.dcid().to_vec(),
1413-
);
1416+
self.tps
1417+
.borrow_mut()
1418+
.local
1419+
.set_bytes(OriginalDestinationConnectionId, packet.dcid().to_vec());
14141420
}
14151421
}
14161422
(PacketType::VersionNegotiation, State::WaitInitial, Role::Client) => {
@@ -1890,12 +1896,7 @@ impl Connection {
18901896
if !matches!(self.state(), State::Confirmed) {
18911897
return Err(Error::InvalidMigration);
18921898
}
1893-
if self
1894-
.tps
1895-
.borrow()
1896-
.remote()
1897-
.get_empty(tparams::DISABLE_MIGRATION)
1898-
{
1899+
if self.tps.borrow().remote().get_empty(DisableMigration) {
18991900
return Err(Error::InvalidMigration);
19001901
}
19011902

@@ -2113,9 +2114,9 @@ impl Connection {
21132114
fn can_grease_quic_bit(&self) -> bool {
21142115
let tph = self.tps.borrow();
21152116
if let Some(r) = &tph.remote {
2116-
r.get_empty(tparams::GREASE_QUIC_BIT)
2117+
r.get_empty(GreaseQuicBit)
21172118
} else if let Some(r) = &tph.remote_0rtt {
2118-
r.get_empty(tparams::GREASE_QUIC_BIT)
2119+
r.get_empty(GreaseQuicBit)
21192120
} else {
21202121
false
21212122
}
@@ -2621,18 +2622,14 @@ impl Connection {
26212622
.tps
26222623
.borrow()
26232624
.remote()
2624-
.get_integer(tparams::IDLE_TIMEOUT);
2625+
.get_integer(TransportParameterId::IdleTimeout);
26252626
if peer_timeout > 0 {
26262627
self.idle_timeout
26272628
.set_peer_timeout(Duration::from_millis(peer_timeout));
26282629
}
26292630

2630-
self.quic_datagrams.set_remote_datagram_size(
2631-
self.tps
2632-
.borrow()
2633-
.remote()
2634-
.get_integer(tparams::MAX_DATAGRAM_FRAME_SIZE),
2635-
);
2631+
self.quic_datagrams
2632+
.set_remote_datagram_size(self.tps.borrow().remote().get_integer(MaxDatagramFrameSize));
26362633
}
26372634

26382635
#[must_use]
@@ -2661,18 +2658,16 @@ impl Connection {
26612658
return Err(Error::TransportParameterError);
26622659
}
26632660

2664-
let reset_token = remote
2665-
.get_bytes(tparams::STATELESS_RESET_TOKEN)
2666-
.map_or_else(
2667-
|| Ok(ConnectionIdEntry::random_srt()),
2668-
|token| <[u8; 16]>::try_from(token).map_err(|_| Error::TransportParameterError),
2669-
)?;
2661+
let reset_token = remote.get_bytes(StatelessResetToken).map_or_else(
2662+
|| Ok(ConnectionIdEntry::random_srt()),
2663+
|token| <[u8; 16]>::try_from(token).map_err(|_| Error::TransportParameterError),
2664+
)?;
26702665
let path = self.paths.primary().ok_or(Error::NoAvailablePath)?;
26712666
path.borrow_mut().set_reset_token(reset_token);
26722667

2673-
let max_ad = Duration::from_millis(remote.get_integer(tparams::MAX_ACK_DELAY));
2674-
let min_ad = if remote.has_value(tparams::MIN_ACK_DELAY) {
2675-
let min_ad = Duration::from_micros(remote.get_integer(tparams::MIN_ACK_DELAY));
2668+
let max_ad = Duration::from_millis(remote.get_integer(MaxAckDelay));
2669+
let min_ad = if remote.has_value(MinAckDelay) {
2670+
let min_ad = Duration::from_micros(remote.get_integer(MinAckDelay));
26762671
if min_ad > max_ad {
26772672
return Err(Error::TransportParameterError);
26782673
}
@@ -2683,7 +2678,7 @@ impl Connection {
26832678
path.borrow_mut()
26842679
.set_ack_delay(max_ad, min_ad, self.conn_params.get_ack_ratio());
26852680

2686-
let max_active_cids = remote.get_integer(tparams::ACTIVE_CONNECTION_ID_LIMIT);
2681+
let max_active_cids = remote.get_integer(ActiveConnectionIdLimit);
26872682
self.cid_manager.set_limit(max_active_cids);
26882683
}
26892684
self.set_initial_limits();
@@ -2695,7 +2690,7 @@ impl Connection {
26952690
let tph = self.tps.borrow();
26962691
let remote_tps = tph.remote.as_ref().ok_or(Error::TransportParameterError)?;
26972692

2698-
let tp = remote_tps.get_bytes(tparams::INITIAL_SOURCE_CONNECTION_ID);
2693+
let tp = remote_tps.get_bytes(InitialSourceConnectionId);
26992694
if self
27002695
.remote_initial_source_cid
27012696
.as_ref()
@@ -2711,7 +2706,7 @@ impl Connection {
27112706
}
27122707

27132708
if self.role == Role::Client {
2714-
let tp = remote_tps.get_bytes(tparams::ORIGINAL_DESTINATION_CONNECTION_ID);
2709+
let tp = remote_tps.get_bytes(OriginalDestinationConnectionId);
27152710
if self
27162711
.original_destination_cid
27172712
.as_ref()
@@ -2726,7 +2721,7 @@ impl Connection {
27262721
return Err(Error::ProtocolViolation);
27272722
}
27282723

2729-
let tp = remote_tps.get_bytes(tparams::RETRY_SOURCE_CONNECTION_ID);
2724+
let tp = remote_tps.get_bytes(RetrySourceConnectionId);
27302725
let expected = if let AddressValidationInfo::Retry {
27312726
retry_source_cid, ..
27322727
} = &self.address_validation
@@ -3120,7 +3115,7 @@ impl Connection {
31203115
self.tps.borrow().remote.as_ref().map_or_else(
31213116
|| Ok(Duration::default()),
31223117
|r| {
3123-
let exponent = u32::try_from(r.get_integer(tparams::ACK_DELAY_EXPONENT))?;
3118+
let exponent = u32::try_from(r.get_integer(AckDelayExponent))?;
31243119
// ACK_DELAY_EXPONENT > 20 is invalid per RFC9000. We already checked that in
31253120
// TransportParameter::decode.
31263121
let corrected = if v.leading_zeros() >= exponent {

Diff for: neqo-transport/src/connection/params.rs

+27-25
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,16 @@ use crate::{
1212
recv_stream::RECV_BUFFER_SIZE,
1313
rtt::GRANULARITY,
1414
stream_id::StreamType,
15-
tparams::{self, PreferredAddress, TransportParameter, TransportParametersHandler},
15+
tparams::{
16+
PreferredAddress, TransportParameter,
17+
TransportParameterId::{
18+
self, ActiveConnectionIdLimit, DisableMigration, GreaseQuicBit, InitialMaxData,
19+
InitialMaxStreamDataBidiLocal, InitialMaxStreamDataBidiRemote, InitialMaxStreamDataUni,
20+
InitialMaxStreamsBidi, InitialMaxStreamsUni, MaxAckDelay, MaxDatagramFrameSize,
21+
MinAckDelay,
22+
},
23+
TransportParametersHandler,
24+
},
1625
tracking::DEFAULT_ACK_DELAY,
1726
version::{Version, VersionConfig},
1827
CongestionControlAlgorithm, Res,
@@ -408,52 +417,45 @@ impl ConnectionParameters {
408417
let mut tps = TransportParametersHandler::new(role, self.versions.clone());
409418
// default parameters
410419
tps.local.set_integer(
411-
tparams::ACTIVE_CONNECTION_ID_LIMIT,
420+
ActiveConnectionIdLimit,
412421
u64::try_from(LOCAL_ACTIVE_CID_LIMIT)?,
413422
);
414423
if self.disable_migration {
415-
tps.local.set_empty(tparams::DISABLE_MIGRATION);
424+
tps.local.set_empty(DisableMigration);
416425
}
417426
if self.grease {
418-
tps.local.set_empty(tparams::GREASE_QUIC_BIT);
427+
tps.local.set_empty(GreaseQuicBit);
419428
}
420-
tps.local.set_integer(
421-
tparams::MAX_ACK_DELAY,
422-
u64::try_from(DEFAULT_ACK_DELAY.as_millis())?,
423-
);
424-
tps.local.set_integer(
425-
tparams::MIN_ACK_DELAY,
426-
u64::try_from(GRANULARITY.as_micros())?,
427-
);
429+
tps.local
430+
.set_integer(MaxAckDelay, u64::try_from(DEFAULT_ACK_DELAY.as_millis())?);
431+
tps.local
432+
.set_integer(MinAckDelay, u64::try_from(GRANULARITY.as_micros())?);
428433

429434
// set configurable parameters
430-
tps.local
431-
.set_integer(tparams::INITIAL_MAX_DATA, self.max_data);
435+
tps.local.set_integer(InitialMaxData, self.max_data);
432436
tps.local.set_integer(
433-
tparams::INITIAL_MAX_STREAM_DATA_BIDI_LOCAL,
437+
InitialMaxStreamDataBidiLocal,
434438
self.max_stream_data_bidi_local,
435439
);
436440
tps.local.set_integer(
437-
tparams::INITIAL_MAX_STREAM_DATA_BIDI_REMOTE,
441+
InitialMaxStreamDataBidiRemote,
438442
self.max_stream_data_bidi_remote,
439443
);
440-
tps.local.set_integer(
441-
tparams::INITIAL_MAX_STREAM_DATA_UNI,
442-
self.max_stream_data_uni,
443-
);
444444
tps.local
445-
.set_integer(tparams::INITIAL_MAX_STREAMS_BIDI, self.max_streams_bidi);
445+
.set_integer(InitialMaxStreamDataUni, self.max_stream_data_uni);
446+
tps.local
447+
.set_integer(InitialMaxStreamsBidi, self.max_streams_bidi);
446448
tps.local
447-
.set_integer(tparams::INITIAL_MAX_STREAMS_UNI, self.max_streams_uni);
449+
.set_integer(InitialMaxStreamsUni, self.max_streams_uni);
448450
tps.local.set_integer(
449-
tparams::IDLE_TIMEOUT,
451+
TransportParameterId::IdleTimeout,
450452
u64::try_from(self.idle_timeout.as_millis()).unwrap_or(0),
451453
);
452454
if let PreferredAddressConfig::Address(preferred) = &self.preferred_address {
453455
if role == Role::Server {
454456
let (cid, srt) = cid_manager.preferred_address_cid()?;
455457
tps.local.set(
456-
tparams::PREFERRED_ADDRESS,
458+
TransportParameterId::PreferredAddress,
457459
TransportParameter::PreferredAddress {
458460
v4: preferred.ipv4(),
459461
v6: preferred.ipv6(),
@@ -464,7 +466,7 @@ impl ConnectionParameters {
464466
}
465467
}
466468
tps.local
467-
.set_integer(tparams::MAX_DATAGRAM_FRAME_SIZE, self.datagram_size);
469+
.set_integer(MaxDatagramFrameSize, self.datagram_size);
468470
Ok(tps)
469471
}
470472
}

Diff for: neqo-transport/src/connection/tests/close.rs

+2-5
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use super::{
1313
connect, connect_force_idle, default_client, default_server, send_something,
1414
};
1515
use crate::{
16-
tparams::{self, TransportParameter},
16+
tparams::{TransportParameter, TransportParameterId::StatelessResetToken},
1717
AppError, CloseReason, Error, ERROR_APPLICATION_CLOSE,
1818
};
1919

@@ -213,10 +213,7 @@ fn stateless_reset_client() {
213213
let mut client = default_client();
214214
let mut server = default_server();
215215
server
216-
.set_local_tparam(
217-
tparams::STATELESS_RESET_TOKEN,
218-
TransportParameter::Bytes(vec![77; 16]),
219-
)
216+
.set_local_tparam(StatelessResetToken, TransportParameter::Bytes(vec![77; 16]))
220217
.unwrap();
221218
connect_force_idle(&mut client, &mut server);
222219

Diff for: neqo-transport/src/connection/tests/handshake.rs

+6-4
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ use crate::{
3535
events::ConnectionEvent,
3636
server::ValidateAddress,
3737
stats::FrameStats,
38-
tparams::{self, TransportParameter, MIN_ACK_DELAY},
38+
tparams::{TransportParameter, TransportParameterId::*},
3939
tracking::DEFAULT_ACK_DELAY,
4040
CloseReason, ConnectionParameters, Error, Pmtud, StreamType, Version,
4141
};
@@ -840,7 +840,9 @@ fn anti_amplification() {
840840
// With a gigantic transport parameter, the server is unable to complete
841841
// the handshake within the amplification limit.
842842
let very_big = TransportParameter::Bytes(vec![0; Pmtud::default_plpmtu(DEFAULT_ADDR.ip()) * 3]);
843-
server.set_local_tparam(0xce16, very_big).unwrap();
843+
server
844+
.set_local_tparam(TestTransportParameter, very_big)
845+
.unwrap();
844846

845847
let c_init = client.process_output(now).dgram();
846848
now += DEFAULT_RTT / 2;
@@ -1089,7 +1091,7 @@ fn bad_min_ack_delay() {
10891091
let mut server = default_server();
10901092
let max_ad = u64::try_from(DEFAULT_ACK_DELAY.as_micros()).unwrap();
10911093
server
1092-
.set_local_tparam(MIN_ACK_DELAY, TransportParameter::Integer(max_ad + 1))
1094+
.set_local_tparam(MinAckDelay, TransportParameter::Integer(max_ad + 1))
10931095
.unwrap();
10941096
let mut client = default_client();
10951097

@@ -1371,7 +1373,7 @@ fn grease_quic_bit_transport_parameter() {
13711373
.remote
13721374
.as_ref()
13731375
.unwrap()
1374-
.get_empty(tparams::GREASE_QUIC_BIT)
1376+
.get_empty(GreaseQuicBit)
13751377
}
13761378

13771379
for client_grease in [true, false] {

Diff for: neqo-transport/src/connection/tests/idle.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ use crate::{
1919
packet::PacketBuilder,
2020
stats::FrameStats,
2121
stream_id::{StreamId, StreamType},
22-
tparams::{self, TransportParameter},
22+
tparams::{TransportParameter, TransportParameterId},
2323
tracking::PacketNumberSpace,
2424
};
2525

@@ -97,7 +97,7 @@ fn asymmetric_idle_timeout() {
9797
.tps
9898
.borrow_mut()
9999
.local
100-
.set_integer(tparams::IDLE_TIMEOUT, LOWER_TIMEOUT_MS);
100+
.set_integer(TransportParameterId::IdleTimeout, LOWER_TIMEOUT_MS);
101101
server.idle_timeout = IdleTimeout::new(LOWER_TIMEOUT);
102102

103103
// Now connect and force idleness manually.
@@ -135,7 +135,7 @@ fn tiny_idle_timeout() {
135135
// Overwrite the default at the server.
136136
server
137137
.set_local_tparam(
138-
tparams::IDLE_TIMEOUT,
138+
TransportParameterId::IdleTimeout,
139139
TransportParameter::Integer(LOWER_TIMEOUT_MS),
140140
)
141141
.unwrap();

0 commit comments

Comments
 (0)