Skip to content

Commit cdb64c2

Browse files
committed
fix: configuration overrided by private reset()
1 parent a203314 commit cdb64c2

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
@@ -856,6 +856,7 @@ impl<'a> Socket<'a> {
856856
fn reset(&mut self) {
857857
let rx_cap_log2 =
858858
mem::size_of::<usize>() * 8 - self.rx_buffer.capacity().leading_zeros() as usize;
859+
let new_rx_win_shift = rx_cap_log2.saturating_sub(16) as u8;
859860

860861
self.state = State::Closed;
861862
self.timer = Timer::new();
@@ -873,7 +874,10 @@ impl<'a> Socket<'a> {
873874
self.remote_last_win = 0;
874875
self.remote_win_len = 0;
875876
self.remote_win_scale = None;
876-
self.remote_win_shift = rx_cap_log2.saturating_sub(16) as u8;
877+
// keep user-specified window scaling across connect()/listen()
878+
if self.remote_win_shift < new_rx_win_shift {
879+
self.remote_win_shift = new_rx_win_shift;
880+
}
877881
self.remote_mss = DEFAULT_MSS;
878882
self.remote_last_ts = None;
879883
self.ack_delay_timer = AckDelayTimer::Idle;
@@ -2308,6 +2312,7 @@ impl<'a> Socket<'a> {
23082312
} else if self.timer.should_close(cx.now()) {
23092313
// If we have spent enough time in the TIME-WAIT state, close the socket.
23102314
tcp_trace!("TIME-WAIT timer expired");
2315+
self.remote_win_shift = 0;
23112316
self.reset();
23122317
return Ok(());
23132318
} else {

0 commit comments

Comments
 (0)