Skip to content

Commit 336e58b

Browse files
Replace shared map with larger bitset
This simplifies the receiver dedup implementation by replacing it with an inline bitset, which we shift over on new arrivals. The end result is that we have an effective tracker for ~896 packets fitting into about the same amount of space as the previous combination of shared map and entry data (+6 bytes if we assume 500k entries). The new implementation is also easier to tweak, since we directly expose the window size. It's likely that this slows down inserts a little (we need to shift over 112 bytes) but shuffling a 112-byte array should be sufficiently fast that I don't think it's worth worrying about it.
1 parent 82dd0b5 commit 336e58b

File tree

10 files changed

+179
-442
lines changed

10 files changed

+179
-442
lines changed

dc/s2n-quic-dc/Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ tracing-subscriber = { version = "0.3", features = ["env-filter"], optional = tr
4444
zerocopy = { version = "0.7", features = ["derive"] }
4545
zeroize = "1"
4646
parking_lot = "0.12"
47+
bitvec = { version = "1.0.1", default-features = false }
4748

4849
[dev-dependencies]
4950
bolero = "0.12"

dc/s2n-quic-dc/src/path/secret/map.rs

+3-5
Original file line numberDiff line numberDiff line change
@@ -188,8 +188,6 @@ impl Map {
188188
let mut stateless_reset = [0; control::TAG_LEN];
189189
aws_lc_rs::rand::fill(&mut stateless_reset).unwrap();
190190

191-
let receiver_shared = receiver::Shared::new();
192-
193191
let mut ids = Vec::with_capacity(peers.len());
194192
for (idx, (ciphersuite, version, peer)) in peers.into_iter().enumerate() {
195193
secret[..8].copy_from_slice(&(idx as u64).to_be_bytes()[..]);
@@ -206,7 +204,7 @@ impl Map {
206204
peer,
207205
secret,
208206
sender,
209-
receiver_shared.clone().new_receiver(),
207+
receiver::State::new(),
210208
dc::testing::TEST_APPLICATION_PARAMS,
211209
dc::testing::TEST_REHANDSHAKE_PERIOD,
212210
);
@@ -226,7 +224,7 @@ impl Map {
226224
#[doc(hidden)]
227225
#[cfg(any(test, feature = "testing"))]
228226
pub fn test_insert(&self, peer: SocketAddr) {
229-
let receiver = self.store.receiver().clone().new_receiver();
227+
let receiver = super::receiver::State::new();
230228
let entry = Entry::fake(peer, Some(receiver));
231229
self.store.test_insert(entry);
232230
}
@@ -259,7 +257,7 @@ impl Map {
259257
peer_addr,
260258
secret,
261259
sender,
262-
map.store.receiver().clone().new_receiver(),
260+
super::receiver::State::new(),
263261
dc::testing::TEST_APPLICATION_PARAMS,
264262
dc::testing::TEST_REHANDSHAKE_PERIOD,
265263
);

dc/s2n-quic-dc/src/path/secret/map/entry.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ impl Entry {
106106

107107
#[cfg(any(test, feature = "testing"))]
108108
pub fn fake(peer: SocketAddr, receiver: Option<receiver::State>) -> Arc<Entry> {
109-
let receiver = receiver.unwrap_or_else(receiver::State::without_shared);
109+
let receiver = receiver.unwrap_or_else(receiver::State::new);
110110

111111
let mut secret = [0; 32];
112112
aws_lc_rs::rand::fill(&mut secret).unwrap();

dc/s2n-quic-dc/src/path/secret/map/entry/tests.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ fn entry_size() {
1515
if should_check {
1616
assert_eq!(
1717
Entry::fake((std::net::Ipv4Addr::LOCALHOST, 0).into(), None).size(),
18-
239
18+
295
1919
);
2020
}
2121
}

dc/s2n-quic-dc/src/path/secret/map/handshake.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
use super::{Entry, Map};
55
use crate::{
66
packet::secret_control as control,
7-
path::secret::{schedule, sender},
7+
path::secret::{receiver, schedule, sender},
88
};
99
use s2n_quic_core::{
1010
dc::{self, ApplicationParams, DatagramInfo},
@@ -123,7 +123,7 @@ impl dc::Path for HandshakingPath {
123123
.into_inner(),
124124
);
125125

126-
let receiver = self.map.store.receiver().clone().new_receiver();
126+
let receiver = receiver::State::new();
127127

128128
let entry = Entry::new(
129129
self.peer,

dc/s2n-quic-dc/src/path/secret/map/state.rs

-7
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,6 @@ where
7878
// FIXME: This will get replaced with sending on a handshake socket associated with the map.
7979
pub(super) control_socket: Arc<std::net::UdpSocket>,
8080

81-
pub(super) receiver_shared: Arc<receiver::Shared>,
82-
8381
cleaner: Cleaner,
8482

8583
init_time: Timestamp,
@@ -136,7 +134,6 @@ where
136134
requested_handshakes: Default::default(),
137135
cleaner: Cleaner::new(),
138136
signer,
139-
receiver_shared: receiver::Shared::new(),
140137
control_socket,
141138
init_time,
142139
clock,
@@ -556,10 +553,6 @@ where
556553
&self.signer
557554
}
558555

559-
fn receiver(&self) -> &Arc<receiver::Shared> {
560-
&self.receiver_shared
561-
}
562-
563556
fn send_control_packet(&self, dst: &SocketAddr, buffer: &mut [u8]) {
564557
match self.control_socket.send_to(buffer, dst) {
565558
Ok(_) => {

dc/s2n-quic-dc/src/path/secret/map/state/tests.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ impl Model {
136136
ip,
137137
secret,
138138
sender::State::new(stateless_reset),
139-
state.receiver().clone().new_receiver(),
139+
receiver::State::new(),
140140
dc::testing::TEST_APPLICATION_PARAMS,
141141
dc::testing::TEST_REHANDSHAKE_PERIOD,
142142
)));

dc/s2n-quic-dc/src/path/secret/map/store.rs

-2
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,6 @@ pub trait Store: 'static + Send + Sync {
4343

4444
fn signer(&self) -> &stateless_reset::Signer;
4545

46-
fn receiver(&self) -> &Arc<receiver::Shared>;
47-
4846
fn send_control_packet(&self, dst: &SocketAddr, buffer: &mut [u8]);
4947

5048
fn rehandshake_period(&self) -> Duration;

0 commit comments

Comments
 (0)