Skip to content

Commit 6b6c640

Browse files
committed
fix: configuration overridden by private reset()
1 parent f2a6021 commit 6b6c640

File tree

1 file changed

+6
-1
lines changed

1 file changed

+6
-1
lines changed

src/socket/tcp.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -874,6 +874,7 @@ impl<'a> Socket<'a> {
874874
fn reset(&mut self) {
875875
let rx_cap_log2 =
876876
mem::size_of::<usize>() * 8 - self.rx_buffer.capacity().leading_zeros() as usize;
877+
let new_rx_win_shift = rx_cap_log2.saturating_sub(16) as u8;
877878

878879
self.state = State::Closed;
879880
self.timer = Timer::new();
@@ -891,7 +892,10 @@ impl<'a> Socket<'a> {
891892
self.remote_last_win = 0;
892893
self.remote_win_len = 0;
893894
self.remote_win_scale = None;
894-
self.remote_win_shift = rx_cap_log2.saturating_sub(16) as u8;
895+
// keep user-specified window scaling across connect()/listen()
896+
if self.remote_win_shift < new_rx_win_shift {
897+
self.remote_win_shift = new_rx_win_shift;
898+
}
895899
self.remote_mss = DEFAULT_MSS;
896900
self.remote_last_ts = None;
897901
self.ack_delay_timer = AckDelayTimer::Idle;
@@ -2339,6 +2343,7 @@ impl<'a> Socket<'a> {
23392343
} else if self.timer.should_close(cx.now()) {
23402344
// If we have spent enough time in the TIME-WAIT state, close the socket.
23412345
tcp_trace!("TIME-WAIT timer expired");
2346+
self.remote_win_shift = 0;
23422347
self.reset();
23432348
return Ok(());
23442349
} else {

0 commit comments

Comments
 (0)