Skip to content

Commit 7ff6960

Browse files
committed
Propagate reset token updates to the endpoint synchronously
1 parent a89424c commit 7ff6960

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
@@ -86,18 +86,6 @@ impl Endpoint {
8686
) -> Option<ConnectionEvent> {
8787
use EndpointEventInner::*;
8888
match event.0 {
89-
ResetToken(remote, token) => {
90-
let old = self.connections.lock().unwrap()[ch]
91-
.reset_token
92-
.replace((remote, token));
93-
let mut index = self.index.write().unwrap();
94-
if let Some(old) = old {
95-
index.connection_reset_tokens.remove(old.0, old.1);
96-
}
97-
if index.connection_reset_tokens.insert(remote, token, ch) {
98-
warn!("duplicate reset token");
99-
}
100-
}
10189
Drained => {
10290
let conn = self.connections.lock().unwrap().remove(ch.0);
10391
self.index.write().unwrap().remove(&conn);
@@ -106,6 +94,24 @@ impl Endpoint {
10694
None
10795
}
10896

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