Skip to content

Commit 77e0866

Browse files
committed
Propagate reset token updates to the endpoint synchronously
1 parent 473f5da commit 77e0866

File tree

3 files changed

+26
-27
lines changed

3 files changed

+26
-27
lines changed

quinn-proto/src/connection/mod.rs

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2304,8 +2304,7 @@ impl Connection {
23042304
}
23052305
}
23062306
if let Some(token) = params.stateless_reset_token {
2307-
self.endpoint_events
2308-
.push_back(EndpointEventInner::ResetToken(self.path.remote, token));
2307+
endpoint.set_reset_token(self.handle, self.path.remote, token);
23092308
}
23102309
self.handle_peer_params(params)?;
23112310
self.issue_first_cids(now, endpoint);
@@ -2652,7 +2651,7 @@ impl Connection {
26522651
.pending
26532652
.retire_cids
26542653
.extend(retired);
2655-
self.set_reset_token(reset_token);
2654+
self.set_reset_token(reset_token, endpoint);
26562655
}
26572656
Err(InsertError::ExceedsLimit) => {
26582657
return Err(TransportError::CONNECTION_ID_LIMIT_ERROR(""));
@@ -2673,7 +2672,7 @@ impl Connection {
26732672
if self.side.is_server() && self.rem_cids.active_seq() == 0 {
26742673
// We're a server still using the initial remote CID for the client, so
26752674
// let's switch immediately to enable clientside stateless resets.
2676-
self.update_rem_cid();
2675+
self.update_rem_cid(endpoint);
26772676
}
26782677
}
26792678
Frame::NewToken { token } => {
@@ -2741,7 +2740,7 @@ impl Connection {
27412740
);
27422741
self.migrate(now, remote);
27432742
// Break linkability, if possible
2744-
self.update_rem_cid();
2743+
self.update_rem_cid(endpoint);
27452744
self.spin = false;
27462745
}
27472746

@@ -2792,7 +2791,7 @@ impl Connection {
27922791
}
27932792

27942793
/// Switch to a previously unused remote connection ID, if possible
2795-
fn update_rem_cid(&mut self) {
2794+
fn update_rem_cid(&mut self, endpoint: &Endpoint) {
27962795
let (reset_token, retired) = match self.rem_cids.next() {
27972796
Some(x) => x,
27982797
None => return,
@@ -2803,15 +2802,11 @@ impl Connection {
28032802
.pending
28042803
.retire_cids
28052804
.extend(retired);
2806-
self.set_reset_token(reset_token);
2805+
self.set_reset_token(reset_token, endpoint);
28072806
}
28082807

2809-
fn set_reset_token(&mut self, reset_token: ResetToken) {
2810-
self.endpoint_events
2811-
.push_back(EndpointEventInner::ResetToken(
2812-
self.path.remote,
2813-
reset_token,
2814-
));
2808+
fn set_reset_token(&mut self, reset_token: ResetToken, endpoint: &Endpoint) {
2809+
endpoint.set_reset_token(self.handle, self.path.remote, reset_token);
28152810
self.peer_params.stateless_reset_token = Some(reset_token);
28162811
}
28172812

quinn-proto/src/endpoint.rs

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -85,18 +85,6 @@ impl Endpoint {
8585
) -> Option<ConnectionEvent> {
8686
use EndpointEventInner::*;
8787
match event.0 {
88-
ResetToken(remote, token) => {
89-
let old = self.connections.lock().unwrap()[ch]
90-
.reset_token
91-
.replace((remote, token));
92-
let mut index = self.index.write().unwrap();
93-
if let Some(old) = old {
94-
index.connection_reset_tokens.remove(old.0, old.1);
95-
}
96-
if index.connection_reset_tokens.insert(remote, token, ch) {
97-
warn!("duplicate reset token");
98-
}
99-
}
10088
Drained => {
10189
let conn = self.connections.lock().unwrap().remove(ch.0);
10290
self.index.write().unwrap().remove(&conn);
@@ -105,6 +93,24 @@ impl Endpoint {
10593
None
10694
}
10795

96+
pub(crate) fn set_reset_token(
97+
&self,
98+
ch: ConnectionHandle,
99+
remote: SocketAddr,
100+
token: ResetToken,
101+
) {
102+
let old = self.connections.lock().unwrap()[ch]
103+
.reset_token
104+
.replace((remote, token));
105+
let mut index = self.index.write().unwrap();
106+
if let Some(old) = old {
107+
index.connection_reset_tokens.remove(old.0, old.1);
108+
}
109+
if index.connection_reset_tokens.insert(remote, token, ch) {
110+
warn!("duplicate reset token");
111+
}
112+
}
113+
108114
pub(crate) fn retire_cid(&self, ch: ConnectionHandle, seq: u64) {
109115
let cid = self.connections.lock().unwrap()[ch].loc_cids.remove(&seq);
110116
if let Some(cid) = cid {

quinn-proto/src/shared.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,6 @@ impl EndpointEvent {
4545
pub(crate) enum EndpointEventInner {
4646
/// The connection has been drained
4747
Drained,
48-
/// The reset token and/or address eligible for generating resets has been updated
49-
ResetToken(SocketAddr, ResetToken),
5048
}
5149

5250
/// Protocol-level identifier for a connection.

0 commit comments

Comments
 (0)