From 3baa5fd28f992bf565209bfe5fc77388fd172116 Mon Sep 17 00:00:00 2001 From: Dario Nieuwenhuis Date: Fri, 11 Jun 2021 22:33:13 +0200 Subject: [PATCH] tcp: use nonzero initial sequence number. --- src/socket/tcp.rs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/socket/tcp.rs b/src/socket/tcp.rs index d9b1b6c..2008b09 100644 --- a/src/socket/tcp.rs +++ b/src/socket/tcp.rs @@ -54,6 +54,11 @@ impl fmt::Display for State { } } +/// Initial sequence number. This used to be 0, but some servers don't behave correctly +/// with that, so we use a non-zero starting sequence number. TODO: randomize instead. +/// https://github.com/smoltcp-rs/smoltcp/issues/489 +const INITIAL_SEQ_NO: TcpSeqNumber = TcpSeqNumber(42); + // Conservative initial RTT estimate. const RTTE_INITIAL_RTT: u32 = 300; const RTTE_INITIAL_DEV: u32 = 100; @@ -390,7 +395,7 @@ impl<'a> TcpSocket<'a> { listen_address: IpAddress::default(), local_endpoint: IpEndpoint::default(), remote_endpoint: IpEndpoint::default(), - local_seq_no: TcpSeqNumber::default(), + local_seq_no: INITIAL_SEQ_NO, remote_seq_no: TcpSeqNumber::default(), remote_last_seq: TcpSeqNumber::default(), remote_last_ack: None, @@ -591,7 +596,7 @@ impl<'a> TcpSocket<'a> { self.listen_address = IpAddress::default(); self.local_endpoint = IpEndpoint::default(); self.remote_endpoint = IpEndpoint::default(); - self.local_seq_no = TcpSeqNumber::default(); + self.local_seq_no = INITIAL_SEQ_NO; self.remote_seq_no = TcpSeqNumber::default(); self.remote_last_seq = TcpSeqNumber::default(); self.remote_last_ack = None; @@ -2842,10 +2847,12 @@ mod test { (1048576, 5), ] { let mut s = socket_with_buffer_sizes(64, *buffer_size); + s.local_seq_no = LOCAL_SEQ; assert_eq!(s.remote_win_shift, *shift_amt); s.connect(REMOTE_END, LOCAL_END).unwrap(); recv!(s, [TcpRepr { control: TcpControl::Syn, + seq_number: LOCAL_SEQ, ack_number: None, max_seg_size: Some(BASE_MSS), window_scale: Some(*shift_amt),