mirror of
https://github.com/n0-computer/noq.git
synced 2026-09-18 17:26:19 +00:00
Fix incomplete stream state reset on 0-RTT rejection
This commit is contained in:
committed by
Dirkjan Ochtman
parent
47bc2886c2
commit
be801edd10
@@ -2893,12 +2893,20 @@ impl Connection {
|
||||
debug!(self.log, "0-RTT rejected");
|
||||
self.accepted_0rtt = false;
|
||||
// Reset all outgoing streams
|
||||
for (id, stream) in &mut self.streams.streams {
|
||||
if id.initiator() != self.side {
|
||||
continue;
|
||||
}
|
||||
*stream.send_mut().unwrap() = stream::Send::new();
|
||||
for i in 0..self.streams.next_bi {
|
||||
self.streams
|
||||
.streams
|
||||
.remove(&StreamId::new(self.side, Directionality::Bi, i))
|
||||
.unwrap();
|
||||
}
|
||||
self.streams.next_bi = 0;
|
||||
for i in 0..self.streams.next_uni {
|
||||
self.streams
|
||||
.streams
|
||||
.remove(&StreamId::new(self.side, Directionality::Uni, i))
|
||||
.unwrap();
|
||||
}
|
||||
self.streams.next_uni = 0;
|
||||
// Discard already-queued frames
|
||||
self.space_mut(SpaceId::Data).pending = Retransmits::default();
|
||||
// Discard 0-RTT packets
|
||||
|
||||
@@ -687,8 +687,12 @@ fn zero_rtt_rejection() {
|
||||
.unwrap();
|
||||
pair.drive();
|
||||
pair.server.assert_accept();
|
||||
assert_matches!(pair.server.poll(), Some((_, Event::Connected)));
|
||||
assert_matches!(pair.server.poll(), None);
|
||||
pair.client.close(pair.time, client_conn, 0, [][..].into());
|
||||
pair.drive();
|
||||
assert_matches!(pair.server.poll(), Some((_, Event::ConnectionLost { .. })));
|
||||
assert_matches!(pair.server.poll(), None);
|
||||
|
||||
// Changing protocols invalidates 0-RTT
|
||||
Arc::get_mut(&mut config)
|
||||
@@ -706,8 +710,12 @@ fn zero_rtt_rejection() {
|
||||
pair.drive();
|
||||
assert!(!pair.client.connection(client_conn).accepted_0rtt());
|
||||
let server_conn = pair.server.assert_accept();
|
||||
assert_matches!(
|
||||
pair.server.read_unordered(server_conn, s),
|
||||
assert_matches!(pair.server.poll(), Some((_, Event::Connected)));
|
||||
assert_matches!(pair.server.poll(), None);
|
||||
let s2 = pair.client.open(client_conn, Directionality::Uni).unwrap();
|
||||
assert_eq!(s, s2);
|
||||
assert_eq!(
|
||||
pair.server.read_unordered(server_conn, s2),
|
||||
Err(ReadError::Blocked)
|
||||
);
|
||||
assert_eq!(pair.client.connection(client_conn).lost_packets(), 0);
|
||||
|
||||
Reference in New Issue
Block a user