Skip to main content

smoltcp/socket/
tcp.rs

1// Heads up! Before working on this file you should read, at least, RFC 793 and
2// the parts of RFC 1122 that discuss TCP, as well as RFC 7323 for some of the TCP options.
3// Consult RFC 7414 when implementing a new feature.
4
5use core::fmt::Display;
6#[cfg(feature = "async")]
7use core::task::Waker;
8use core::{fmt, mem};
9
10#[cfg(feature = "async")]
11use crate::socket::WakerRegistration;
12use crate::socket::{Context, PollAt};
13use crate::storage::{Assembler, RingBuffer};
14use crate::time::{Duration, Instant};
15use crate::wire::{
16    IpAddress, IpEndpoint, IpListenEndpoint, IpProtocol, IpRepr, TCP_HEADER_LEN, TcpControl,
17    TcpRepr, TcpSeqNumber, TcpTimestampGenerator, TcpTimestampRepr,
18};
19
20mod congestion;
21
22macro_rules! tcp_trace {
23    ($($arg:expr),*) => (net_log!(trace, $($arg),*));
24}
25
26/// Error returned by [`Socket::listen`]
27#[derive(Debug, PartialEq, Eq, Clone, Copy)]
28#[cfg_attr(feature = "defmt", derive(defmt::Format))]
29pub enum ListenError {
30    InvalidState,
31    Unaddressable,
32}
33
34impl Display for ListenError {
35    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
36        match *self {
37            ListenError::InvalidState => write!(f, "invalid state"),
38            ListenError::Unaddressable => write!(f, "unaddressable destination"),
39        }
40    }
41}
42
43#[cfg(feature = "std")]
44impl std::error::Error for ListenError {}
45
46/// Error returned by [`Socket::connect`]
47#[derive(Debug, PartialEq, Eq, Clone, Copy)]
48#[cfg_attr(feature = "defmt", derive(defmt::Format))]
49pub enum ConnectError {
50    InvalidState,
51    Unaddressable,
52}
53
54impl Display for ConnectError {
55    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
56        match *self {
57            ConnectError::InvalidState => write!(f, "invalid state"),
58            ConnectError::Unaddressable => write!(f, "unaddressable destination"),
59        }
60    }
61}
62
63#[cfg(feature = "std")]
64impl std::error::Error for ConnectError {}
65
66/// Error returned by [`Socket::send`]
67#[derive(Debug, PartialEq, Eq, Clone, Copy)]
68#[cfg_attr(feature = "defmt", derive(defmt::Format))]
69pub enum SendError {
70    InvalidState,
71}
72
73impl Display for SendError {
74    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
75        match *self {
76            SendError::InvalidState => write!(f, "invalid state"),
77        }
78    }
79}
80
81#[cfg(feature = "std")]
82impl std::error::Error for SendError {}
83
84/// Error returned by [`Socket::recv`]
85#[derive(Debug, PartialEq, Eq, Clone, Copy)]
86#[cfg_attr(feature = "defmt", derive(defmt::Format))]
87pub enum RecvError {
88    InvalidState,
89    Finished,
90}
91
92impl Display for RecvError {
93    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
94        match *self {
95            RecvError::InvalidState => write!(f, "invalid state"),
96            RecvError::Finished => write!(f, "operation finished"),
97        }
98    }
99}
100
101#[cfg(feature = "std")]
102impl std::error::Error for RecvError {}
103
104/// A TCP socket ring buffer.
105pub type SocketBuffer<'a> = RingBuffer<'a, u8>;
106
107/// The state of a TCP socket, according to [RFC 793].
108///
109/// [RFC 793]: https://tools.ietf.org/html/rfc793
110#[derive(Debug, PartialEq, Eq, Clone, Copy)]
111#[cfg_attr(feature = "defmt", derive(defmt::Format))]
112pub enum State {
113    Closed,
114    Listen,
115    SynSent,
116    SynReceived,
117    Established,
118    FinWait1,
119    FinWait2,
120    CloseWait,
121    Closing,
122    LastAck,
123    TimeWait,
124}
125
126impl fmt::Display for State {
127    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
128        match *self {
129            State::Closed => write!(f, "CLOSED"),
130            State::Listen => write!(f, "LISTEN"),
131            State::SynSent => write!(f, "SYN-SENT"),
132            State::SynReceived => write!(f, "SYN-RECEIVED"),
133            State::Established => write!(f, "ESTABLISHED"),
134            State::FinWait1 => write!(f, "FIN-WAIT-1"),
135            State::FinWait2 => write!(f, "FIN-WAIT-2"),
136            State::CloseWait => write!(f, "CLOSE-WAIT"),
137            State::Closing => write!(f, "CLOSING"),
138            State::LastAck => write!(f, "LAST-ACK"),
139            State::TimeWait => write!(f, "TIME-WAIT"),
140        }
141    }
142}
143
144/// RFC 6298: (2.1) Until a round-trip time (RTT) measurement has been made for a
145/// segment sent between the sender and receiver, the sender SHOULD
146/// set RTO <- 1 second,
147const RTTE_INITIAL_RTO: u32 = 1000;
148
149// Minimum "safety margin" for the RTO that kicks in when the
150// variance gets very low.
151const RTTE_MIN_MARGIN: u32 = 5;
152
153/// K, according to RFC 6298
154const RTTE_K: u32 = 4;
155
156// RFC 6298 (2.4): Whenever RTO is computed, if it is less than 1 second, then the
157// RTO SHOULD be rounded up to 1 second.
158const RTTE_MIN_RTO: u32 = 1000;
159
160// RFC 6298 (2.5) A maximum value MAY be placed on RTO provided it is at least 60
161// seconds
162const RTTE_MAX_RTO: u32 = 60_000;
163
164#[derive(Debug, Clone, Copy)]
165#[cfg_attr(feature = "defmt", derive(defmt::Format))]
166struct RttEstimator {
167    /// true if we have made at least one rtt measurement.
168    have_measurement: bool,
169    // Using u32 instead of Duration to save space (Duration is i64)
170    /// Smoothed RTT
171    srtt: u32,
172    /// RTT variance.
173    rttvar: u32,
174    /// Retransmission Time-Out
175    rto: u32,
176    timestamp: Option<(Instant, TcpSeqNumber)>,
177    max_seq_sent: Option<TcpSeqNumber>,
178    rto_count: u8,
179}
180
181impl Default for RttEstimator {
182    fn default() -> Self {
183        Self {
184            have_measurement: false,
185            srtt: 0,   // ignored, will be overwritten on first measurement.
186            rttvar: 0, // ignored, will be overwritten on first measurement.
187            rto: RTTE_INITIAL_RTO,
188            timestamp: None,
189            max_seq_sent: None,
190            rto_count: 0,
191        }
192    }
193}
194
195impl RttEstimator {
196    fn retransmission_timeout(&self) -> Duration {
197        Duration::from_millis(self.rto as _)
198    }
199
200    fn sample(&mut self, new_rtt: u32) {
201        if self.have_measurement {
202            // RFC 6298 (2.3) When a subsequent RTT measurement R' is made, a host MUST set (...)
203            let diff = (self.srtt as i32 - new_rtt as i32).unsigned_abs();
204            self.rttvar = (self.rttvar * 3 + diff).div_ceil(4);
205            self.srtt = (self.srtt * 7 + new_rtt).div_ceil(8);
206        } else {
207            // RFC 6298 (2.2) When the first RTT measurement R is made, the host MUST set (...)
208            self.have_measurement = true;
209            self.srtt = new_rtt;
210            self.rttvar = new_rtt / 2;
211        }
212
213        // RFC 6298 (2.2), (2.3)
214        let margin = RTTE_MIN_MARGIN.max(self.rttvar * RTTE_K);
215        self.rto = (self.srtt + margin).clamp(RTTE_MIN_RTO, RTTE_MAX_RTO);
216
217        self.rto_count = 0;
218
219        tcp_trace!(
220            "rtte: sample={:?} srtt={:?} rttvar={:?} rto={:?}",
221            new_rtt,
222            self.srtt,
223            self.rttvar,
224            self.rto
225        );
226    }
227
228    fn on_send(&mut self, timestamp: Instant, seq: TcpSeqNumber) {
229        if self
230            .max_seq_sent
231            .map(|max_seq_sent| seq > max_seq_sent)
232            .unwrap_or(true)
233        {
234            self.max_seq_sent = Some(seq);
235            if self.timestamp.is_none() {
236                self.timestamp = Some((timestamp, seq));
237                tcp_trace!("rtte: sampling at seq={:?}", seq);
238            }
239        }
240    }
241
242    fn on_ack(&mut self, timestamp: Instant, seq: TcpSeqNumber) {
243        if let Some((sent_timestamp, sent_seq)) = self.timestamp
244            && seq >= sent_seq
245        {
246            self.sample((timestamp - sent_timestamp).total_millis() as u32);
247            self.timestamp = None;
248        }
249    }
250
251    fn on_retransmit(&mut self) {
252        if self.timestamp.is_some() {
253            tcp_trace!("rtte: abort sampling due to retransmit");
254        }
255        self.timestamp = None;
256
257        // RFC 6298 (5.5) The host MUST set RTO <- RTO * 2 ("back off the timer").  The
258        // maximum value discussed in (2.5) above may be used to provide
259        // an upper bound to this doubling operation.
260        self.rto = (self.rto * 2).min(RTTE_MAX_RTO);
261        tcp_trace!("rtte: doubling rto to {:?}", self.rto);
262
263        // RFC 6298: a TCP implementation MAY clear SRTT and RTTVAR after
264        // backing off the timer multiple times as it is likely that the current
265        // SRTT and RTTVAR are bogus in this situation.  Once SRTT and RTTVAR
266        // are cleared, they should be initialized with the next RTT sample
267        // taken per (2.2) rather than using (2.3).
268        self.rto_count += 1;
269        if self.rto_count >= 3 {
270            self.rto_count = 0;
271            self.have_measurement = false;
272            tcp_trace!("rtte: too many retransmissions, clearing srtt, rttvar.");
273        }
274    }
275}
276
277#[derive(Debug, Clone, Copy, PartialEq)]
278#[cfg_attr(feature = "defmt", derive(defmt::Format))]
279enum Timer {
280    Idle {
281        keep_alive_at: Option<Instant>,
282    },
283    Retransmit {
284        expires_at: Instant,
285    },
286    FastRetransmit,
287    ZeroWindowProbe {
288        expires_at: Instant,
289        delay: Duration,
290    },
291    Close {
292        expires_at: Instant,
293    },
294}
295
296const ACK_DELAY_DEFAULT: Duration = Duration::from_millis(10);
297const CLOSE_DELAY: Duration = Duration::from_millis(10_000);
298
299impl Timer {
300    fn new() -> Timer {
301        Timer::Idle {
302            keep_alive_at: None,
303        }
304    }
305
306    fn should_keep_alive(&self, timestamp: Instant) -> bool {
307        match *self {
308            Timer::Idle {
309                keep_alive_at: Some(keep_alive_at),
310            } if timestamp >= keep_alive_at => true,
311            _ => false,
312        }
313    }
314
315    fn should_retransmit(&self, timestamp: Instant) -> bool {
316        match *self {
317            Timer::Retransmit { expires_at } if timestamp >= expires_at => true,
318            Timer::FastRetransmit => true,
319            _ => false,
320        }
321    }
322
323    fn should_close(&self, timestamp: Instant) -> bool {
324        match *self {
325            Timer::Close { expires_at } if timestamp >= expires_at => true,
326            _ => false,
327        }
328    }
329
330    fn should_zero_window_probe(&self, timestamp: Instant) -> bool {
331        match *self {
332            Timer::ZeroWindowProbe { expires_at, .. } if timestamp >= expires_at => true,
333            _ => false,
334        }
335    }
336
337    fn poll_at(&self) -> PollAt {
338        match *self {
339            Timer::Idle {
340                keep_alive_at: Some(keep_alive_at),
341            } => PollAt::Time(keep_alive_at),
342            Timer::Idle {
343                keep_alive_at: None,
344            } => PollAt::Ingress,
345            Timer::ZeroWindowProbe { expires_at, .. } => PollAt::Time(expires_at),
346            Timer::Retransmit { expires_at, .. } => PollAt::Time(expires_at),
347            Timer::FastRetransmit => PollAt::Now,
348            Timer::Close { expires_at } => PollAt::Time(expires_at),
349        }
350    }
351
352    fn set_for_idle(&mut self, timestamp: Instant, interval: Option<Duration>) {
353        *self = Timer::Idle {
354            keep_alive_at: interval.map(|interval| timestamp + interval),
355        }
356    }
357
358    fn set_keep_alive(&mut self) {
359        if let Timer::Idle { keep_alive_at } = self
360            && keep_alive_at.is_none()
361        {
362            *keep_alive_at = Some(Instant::from_millis(0))
363        }
364    }
365
366    fn rewind_keep_alive(&mut self, timestamp: Instant, interval: Option<Duration>) {
367        if let Timer::Idle { keep_alive_at } = self {
368            *keep_alive_at = interval.map(|interval| timestamp + interval)
369        }
370    }
371
372    fn set_for_retransmit(&mut self, timestamp: Instant, delay: Duration) {
373        match *self {
374            Timer::Idle { .. }
375            | Timer::FastRetransmit
376            | Timer::Retransmit { .. }
377            | Timer::ZeroWindowProbe { .. } => {
378                *self = Timer::Retransmit {
379                    expires_at: timestamp + delay,
380                }
381            }
382            Timer::Close { .. } => (),
383        }
384    }
385
386    fn set_for_fast_retransmit(&mut self) {
387        *self = Timer::FastRetransmit
388    }
389
390    fn set_for_close(&mut self, timestamp: Instant) {
391        *self = Timer::Close {
392            expires_at: timestamp + CLOSE_DELAY,
393        }
394    }
395
396    fn set_for_zero_window_probe(&mut self, timestamp: Instant, delay: Duration) {
397        *self = Timer::ZeroWindowProbe {
398            expires_at: timestamp + delay,
399            delay,
400        }
401    }
402
403    fn rewind_zero_window_probe(&mut self, timestamp: Instant) {
404        if let Timer::ZeroWindowProbe { mut delay, .. } = *self {
405            delay = (delay * 2).min(Duration::from_millis(RTTE_MAX_RTO as _));
406            *self = Timer::ZeroWindowProbe {
407                expires_at: timestamp + delay,
408                delay,
409            }
410        }
411    }
412
413    fn is_idle(&self) -> bool {
414        matches!(self, Timer::Idle { .. })
415    }
416
417    fn is_zero_window_probe(&self) -> bool {
418        matches!(self, Timer::ZeroWindowProbe { .. })
419    }
420
421    fn is_retransmit(&self) -> bool {
422        matches!(self, Timer::Retransmit { .. } | Timer::FastRetransmit)
423    }
424}
425
426#[derive(Debug, PartialEq, Eq, Clone, Copy)]
427enum AckDelayTimer {
428    Idle,
429    Waiting(Instant),
430    Immediate,
431}
432
433#[derive(Debug, Copy, Clone, Eq, PartialEq)]
434#[cfg_attr(feature = "defmt", derive(defmt::Format))]
435struct Tuple {
436    local: IpEndpoint,
437    remote: IpEndpoint,
438}
439
440impl Display for Tuple {
441    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
442        write!(f, "{}:{}", self.local, self.remote)
443    }
444}
445
446/// A congestion control algorithm.
447#[derive(Debug, Copy, Clone, Eq, PartialEq)]
448#[cfg_attr(feature = "defmt", derive(defmt::Format))]
449pub enum CongestionControl {
450    None,
451
452    #[cfg(feature = "socket-tcp-reno")]
453    Reno,
454
455    #[cfg(feature = "socket-tcp-cubic")]
456    Cubic,
457}
458
459/// A Transmission Control Protocol socket.
460///
461/// A TCP socket may passively listen for connections or actively connect to another endpoint.
462/// Note that, for listening sockets, there is no "backlog"; to be able to simultaneously
463/// accept several connections, as many sockets must be allocated, or any new connection
464/// attempts will be reset.
465#[derive(Debug)]
466pub struct Socket<'a> {
467    state: State,
468    timer: Timer,
469    rtte: RttEstimator,
470    assembler: Assembler,
471    rx_buffer: SocketBuffer<'a>,
472    rx_fin_received: bool,
473    tx_buffer: SocketBuffer<'a>,
474    /// Interval after which, if no inbound packets are received, the connection is aborted.
475    timeout: Option<Duration>,
476    /// Interval at which keep-alive packets will be sent.
477    keep_alive: Option<Duration>,
478    /// The time-to-live (IPv4) or hop limit (IPv6) value used in outgoing packets.
479    hop_limit: Option<u8>,
480    /// Address passed to listen(). Listen address is set when listen() is called and
481    /// used every time the socket is reset back to the LISTEN state.
482    listen_endpoint: IpListenEndpoint,
483    /// Current 4-tuple (local and remote endpoints).
484    tuple: Option<Tuple>,
485    /// The sequence number corresponding to the beginning of the transmit buffer.
486    /// I.e. an ACK(local_seq_no+n) packet removes n bytes from the transmit buffer.
487    local_seq_no: TcpSeqNumber,
488    /// The sequence number corresponding to the beginning of the receive buffer.
489    /// I.e. userspace reading n bytes adds n to remote_seq_no.
490    remote_seq_no: TcpSeqNumber,
491    /// The last sequence number sent.
492    /// I.e. in an idle socket, local_seq_no+tx_buffer.len().
493    remote_last_seq: TcpSeqNumber,
494    /// The last acknowledgement number sent.
495    /// I.e. in an idle socket, remote_seq_no+rx_buffer.len().
496    remote_last_ack: Option<TcpSeqNumber>,
497    /// The last window length sent.
498    remote_last_win: u16,
499    /// The sending window scaling factor advertised to remotes which support RFC 1323.
500    /// It is zero if the window <= 64KiB and/or the remote does not support it.
501    remote_win_shift: u8,
502    /// The remote window size, relative to local_seq_no
503    /// I.e. we're allowed to send octets until local_seq_no+remote_win_len
504    remote_win_len: usize,
505    /// The receive window scaling factor for remotes which support RFC 1323, None if unsupported.
506    remote_win_scale: Option<u8>,
507    /// Whether or not the remote supports selective ACK as described in RFC 2018.
508    remote_has_sack: bool,
509    /// The maximum number of data octets that the remote side may receive.
510    remote_mss: usize,
511    /// The timestamp of the last packet received.
512    remote_last_ts: Option<Instant>,
513    /// The sequence number of the last packet received, used for sACK
514    local_rx_last_seq: Option<TcpSeqNumber>,
515    /// The ACK number of the last packet received.
516    local_rx_last_ack: Option<TcpSeqNumber>,
517    /// The number of packets received directly after
518    /// each other which have the same ACK number.
519    local_rx_dup_acks: u8,
520
521    /// Duration for Delayed ACK. If None no ACKs will be delayed.
522    ack_delay: Option<Duration>,
523    /// Delayed ack timer. If set, packets containing exclusively
524    /// ACK or window updates (ie, no data) won't be sent until expiry.
525    ack_delay_timer: AckDelayTimer,
526
527    /// Used for rate-limiting: No more challenge ACKs will be sent until this instant.
528    challenge_ack_timer: Instant,
529
530    /// Nagle's Algorithm enabled.
531    nagle: bool,
532
533    /// The congestion control algorithm.
534    congestion_controller: congestion::AnyController,
535
536    /// tsval generator - if some, tcp timestamp is enabled
537    tsval_generator: Option<TcpTimestampGenerator>,
538
539    /// 0 if not seen or timestamp not enabled
540    last_remote_tsval: u32,
541
542    #[cfg(feature = "async")]
543    rx_waker: WakerRegistration,
544    #[cfg(feature = "async")]
545    tx_waker: WakerRegistration,
546
547    /// If this is set, we will not send a SYN|ACK until this is unset.
548    #[cfg(feature = "socket-tcp-pause-synack")]
549    synack_paused: bool,
550}
551
552const DEFAULT_MSS: usize = 536;
553
554impl<'a> Socket<'a> {
555    #[allow(unused_comparisons)] // small usize platforms always pass rx_capacity check
556    /// Create a socket using the given buffers.
557    pub fn new<T>(rx_buffer: T, tx_buffer: T) -> Socket<'a>
558    where
559        T: Into<SocketBuffer<'a>>,
560    {
561        let (rx_buffer, tx_buffer) = (rx_buffer.into(), tx_buffer.into());
562        let rx_capacity = rx_buffer.capacity();
563
564        // From RFC 1323:
565        // [...] the above constraints imply that 2 * the max window size must be less
566        // than 2**31 [...] Thus, the shift count must be limited to 14 (which allows
567        // windows of 2**30 = 1 Gbyte).
568        #[cfg(not(target_pointer_width = "16"))] // Prevent overflow
569        if rx_capacity > (1 << 30) {
570            panic!("receiving buffer too large, cannot exceed 1 GiB")
571        }
572        let rx_cap_log2 = mem::size_of::<usize>() * 8 - rx_capacity.leading_zeros() as usize;
573
574        Socket {
575            state: State::Closed,
576            timer: Timer::new(),
577            rtte: RttEstimator::default(),
578            assembler: Assembler::new(),
579            tx_buffer,
580            rx_buffer,
581            rx_fin_received: false,
582            timeout: None,
583            keep_alive: None,
584            hop_limit: None,
585            listen_endpoint: IpListenEndpoint::default(),
586            tuple: None,
587            local_seq_no: TcpSeqNumber::default(),
588            remote_seq_no: TcpSeqNumber::default(),
589            remote_last_seq: TcpSeqNumber::default(),
590            remote_last_ack: None,
591            remote_last_win: 0,
592            remote_win_len: 0,
593            remote_win_shift: rx_cap_log2.saturating_sub(16) as u8,
594            remote_win_scale: None,
595            remote_has_sack: false,
596            remote_mss: DEFAULT_MSS,
597            remote_last_ts: None,
598            local_rx_last_ack: None,
599            local_rx_last_seq: None,
600            local_rx_dup_acks: 0,
601            ack_delay: Some(ACK_DELAY_DEFAULT),
602            ack_delay_timer: AckDelayTimer::Idle,
603            challenge_ack_timer: Instant::from_secs(0),
604            nagle: true,
605            tsval_generator: None,
606            last_remote_tsval: 0,
607            congestion_controller: congestion::AnyController::new(),
608
609            #[cfg(feature = "async")]
610            rx_waker: WakerRegistration::new(),
611            #[cfg(feature = "async")]
612            tx_waker: WakerRegistration::new(),
613
614            #[cfg(feature = "socket-tcp-pause-synack")]
615            synack_paused: false,
616        }
617    }
618
619    /// Enable or disable TCP Timestamp.
620    pub fn set_tsval_generator(&mut self, generator: Option<TcpTimestampGenerator>) {
621        self.tsval_generator = generator;
622    }
623
624    /// Return whether TCP Timestamp is enabled.
625    pub fn timestamp_enabled(&self) -> bool {
626        self.tsval_generator.is_some()
627    }
628
629    /// Set an algorithm for congestion control.
630    ///
631    /// `CongestionControl::None` indicates that no congestion control is applied.
632    /// Options `CongestionControl::Cubic` and `CongestionControl::Reno` are also available.
633    /// To use Reno and Cubic, please enable the `socket-tcp-reno` and `socket-tcp-cubic` features
634    /// in the `smoltcp` crate, respectively.
635    ///
636    /// `CongestionControl::Reno` is a classic congestion control algorithm valued for its simplicity.
637    /// Despite having a lower algorithmic complexity than `Cubic`,
638    /// it is less efficient in terms of bandwidth usage.
639    ///
640    /// `CongestionControl::Cubic` represents a modern congestion control algorithm designed to
641    /// be more efficient and fair compared to `CongestionControl::Reno`.
642    /// It is the default choice for Linux, Windows, and macOS.
643    /// `CongestionControl::Cubic` relies on double precision (`f64`) floating point operations, which may cause issues in some contexts:
644    /// * Small embedded processors (such as Cortex-M0, Cortex-M1, and Cortex-M3) do not have an FPU, and floating point operations consume significant amounts of CPU time and Flash space.
645    /// * Interrupt handlers should almost always avoid floating-point operations.
646    /// * Kernel-mode code on desktop processors usually avoids FPU operations to reduce the penalty of saving and restoring FPU registers.
647    ///
648    /// In all these cases, `CongestionControl::Reno` is a better choice of congestion control algorithm.
649    pub fn set_congestion_control(&mut self, congestion_control: CongestionControl) {
650        use congestion::*;
651
652        self.congestion_controller = match congestion_control {
653            CongestionControl::None => AnyController::None(no_control::NoControl),
654
655            #[cfg(feature = "socket-tcp-reno")]
656            CongestionControl::Reno => AnyController::Reno(reno::Reno::new()),
657
658            #[cfg(feature = "socket-tcp-cubic")]
659            CongestionControl::Cubic => AnyController::Cubic(cubic::Cubic::new()),
660        }
661    }
662
663    /// Return the current congestion control algorithm.
664    pub fn congestion_control(&self) -> CongestionControl {
665        use congestion::*;
666
667        match self.congestion_controller {
668            AnyController::None(_) => CongestionControl::None,
669
670            #[cfg(feature = "socket-tcp-reno")]
671            AnyController::Reno(_) => CongestionControl::Reno,
672
673            #[cfg(feature = "socket-tcp-cubic")]
674            AnyController::Cubic(_) => CongestionControl::Cubic,
675        }
676    }
677
678    /// Register a waker for receive operations.
679    ///
680    /// The waker is woken on state changes that might affect the return value
681    /// of `recv` method calls, such as receiving data, or the socket closing.
682    ///
683    /// Notes:
684    ///
685    /// - Only one waker can be registered at a time. If another waker was previously registered,
686    ///   it is overwritten and will no longer be woken.
687    /// - The Waker is woken only once. Once woken, you must register it again to receive more wakes.
688    /// - "Spurious wakes" are allowed: a wake doesn't guarantee the result of `recv` has
689    ///   necessarily changed.
690    #[cfg(feature = "async")]
691    pub fn register_recv_waker(&mut self, waker: &Waker) {
692        self.rx_waker.register(waker)
693    }
694
695    /// Register a waker for send operations.
696    ///
697    /// The waker is woken on state changes that might affect the return value
698    /// of `send` method calls, such as space becoming available in the transmit
699    /// buffer, or the socket closing.
700    ///
701    /// Notes:
702    ///
703    /// - Only one waker can be registered at a time. If another waker was previously registered,
704    ///   it is overwritten and will no longer be woken.
705    /// - The Waker is woken only once. Once woken, you must register it again to receive more wakes.
706    /// - "Spurious wakes" are allowed: a wake doesn't guarantee the result of `send` has
707    ///   necessarily changed.
708    #[cfg(feature = "async")]
709    pub fn register_send_waker(&mut self, waker: &Waker) {
710        self.tx_waker.register(waker)
711    }
712
713    /// Return the timeout duration.
714    ///
715    /// See also the [set_timeout](#method.set_timeout) method.
716    pub fn timeout(&self) -> Option<Duration> {
717        self.timeout
718    }
719
720    /// Return the ACK delay duration.
721    ///
722    /// See also the [set_ack_delay](#method.set_ack_delay) method.
723    pub fn ack_delay(&self) -> Option<Duration> {
724        self.ack_delay
725    }
726
727    /// Return whether Nagle's Algorithm is enabled.
728    ///
729    /// See also the [set_nagle_enabled](#method.set_nagle_enabled) method.
730    pub fn nagle_enabled(&self) -> bool {
731        self.nagle
732    }
733
734    /// Pause sending of SYN|ACK packets.
735    ///
736    /// When this flag is set, the socket will get stuck in `SynReceived` state without sending
737    /// any SYN|ACK packets back, until this flag is unset. This is useful for certain niche TCP
738    /// proxy usecases.
739    #[cfg(feature = "socket-tcp-pause-synack")]
740    pub fn pause_synack(&mut self, pause: bool) {
741        self.synack_paused = pause;
742    }
743
744    /// Return the current window field value, including scaling according to RFC 1323.
745    ///
746    /// Used in internal calculations as well as packet generation.
747    #[inline]
748    fn scaled_window(&self) -> u16 {
749        u16::try_from(self.rx_buffer.window() >> self.remote_win_shift).unwrap_or(u16::MAX)
750    }
751
752    /// Return the last window field value, including scaling according to RFC 1323.
753    ///
754    /// Used in internal calculations as well as packet generation.
755    ///
756    /// Unlike `remote_last_win`, we take into account new packets received (but not acknowledged)
757    /// since the last window update and adjust the window length accordingly. This ensures a fair
758    /// comparison between the last window length and the new window length we're going to
759    /// advertise.
760    #[inline]
761    fn last_scaled_window(&self) -> Option<u16> {
762        let last_ack = self.remote_last_ack?;
763        let next_ack = self.remote_seq_no + self.rx_buffer.len();
764
765        let last_win = (self.remote_last_win as usize) << self.remote_win_shift;
766        let last_win_adjusted = last_ack + last_win - next_ack;
767
768        Some(u16::try_from(last_win_adjusted >> self.remote_win_shift).unwrap_or(u16::MAX))
769    }
770
771    /// Set the timeout duration.
772    ///
773    /// A socket with a timeout duration set will abort the connection if either of the following
774    /// occurs:
775    ///
776    ///   * After a [connect](#method.connect) call, the remote endpoint does not respond within
777    ///     the specified duration;
778    ///   * After establishing a connection, there is data in the transmit buffer and the remote
779    ///     endpoint exceeds the specified duration between any two packets it sends;
780    ///   * After enabling [keep-alive](#method.set_keep_alive), the remote endpoint exceeds
781    ///     the specified duration between any two packets it sends.
782    pub fn set_timeout(&mut self, duration: Option<Duration>) {
783        self.timeout = duration
784    }
785
786    /// Set the ACK delay duration.
787    ///
788    /// By default, the ACK delay is set to 10ms.
789    pub fn set_ack_delay(&mut self, duration: Option<Duration>) {
790        self.ack_delay = duration
791    }
792
793    /// Enable or disable Nagle's Algorithm.
794    ///
795    /// Also known as "tinygram prevention". By default, it is enabled.
796    /// Disabling it is equivalent to Linux's TCP_NODELAY flag.
797    ///
798    /// When enabled, Nagle's Algorithm prevents sending segments smaller than MSS if
799    /// there is data in flight (sent but not acknowledged). In other words, it ensures
800    /// at most only one segment smaller than MSS is in flight at a time.
801    ///
802    /// It ensures better network utilization by preventing sending many very small packets,
803    /// at the cost of increased latency in some situations, particularly when the remote peer
804    /// has ACK delay enabled.
805    pub fn set_nagle_enabled(&mut self, enabled: bool) {
806        self.nagle = enabled
807    }
808
809    /// Return the keep-alive interval.
810    ///
811    /// See also the [set_keep_alive](#method.set_keep_alive) method.
812    pub fn keep_alive(&self) -> Option<Duration> {
813        self.keep_alive
814    }
815
816    /// Set the keep-alive interval.
817    ///
818    /// An idle socket with a keep-alive interval set will transmit a "keep-alive ACK" packet
819    /// every time it receives no communication during that interval. As a result, three things
820    /// may happen:
821    ///
822    ///   * The remote endpoint is fine and answers with an ACK packet.
823    ///   * The remote endpoint has rebooted and answers with an RST packet.
824    ///   * The remote endpoint has crashed and does not answer.
825    ///
826    /// The keep-alive functionality together with the timeout functionality allows to react
827    /// to these error conditions.
828    pub fn set_keep_alive(&mut self, interval: Option<Duration>) {
829        self.keep_alive = interval;
830        if self.keep_alive.is_some() {
831            // If the connection is idle and we've just set the option, it would not take effect
832            // until the next packet, unless we wind up the timer explicitly.
833            self.timer.set_keep_alive();
834        }
835    }
836
837    /// Return the time-to-live (IPv4) or hop limit (IPv6) value used in outgoing packets.
838    ///
839    /// See also the [set_hop_limit](#method.set_hop_limit) method
840    pub fn hop_limit(&self) -> Option<u8> {
841        self.hop_limit
842    }
843
844    /// Set the time-to-live (IPv4) or hop limit (IPv6) value used in outgoing packets.
845    ///
846    /// A socket without an explicitly set hop limit value uses the default [IANA recommended]
847    /// value (64).
848    ///
849    /// # Panics
850    ///
851    /// This function panics if a hop limit value of 0 is given. See [RFC 1122 § 3.2.1.7].
852    ///
853    /// [IANA recommended]: https://www.iana.org/assignments/ip-parameters/ip-parameters.xhtml
854    /// [RFC 1122 § 3.2.1.7]: https://tools.ietf.org/html/rfc1122#section-3.2.1.7
855    pub fn set_hop_limit(&mut self, hop_limit: Option<u8>) {
856        // A host MUST NOT send a datagram with a hop limit value of 0
857        if let Some(0) = hop_limit {
858            panic!("the time-to-live value of a packet must not be zero")
859        }
860
861        self.hop_limit = hop_limit
862    }
863
864    /// Return the listen endpoint
865    #[inline]
866    pub fn listen_endpoint(&self) -> IpListenEndpoint {
867        self.listen_endpoint
868    }
869
870    /// Return the local endpoint, or None if not connected.
871    #[inline]
872    pub fn local_endpoint(&self) -> Option<IpEndpoint> {
873        Some(self.tuple?.local)
874    }
875
876    /// Return the remote endpoint, or None if not connected.
877    #[inline]
878    pub fn remote_endpoint(&self) -> Option<IpEndpoint> {
879        Some(self.tuple?.remote)
880    }
881
882    /// Return the connection state, in terms of the TCP state machine.
883    #[inline]
884    pub fn state(&self) -> State {
885        self.state
886    }
887
888    fn reset(&mut self) {
889        let rx_cap_log2 =
890            mem::size_of::<usize>() * 8 - self.rx_buffer.capacity().leading_zeros() as usize;
891
892        self.state = State::Closed;
893        self.timer = Timer::new();
894        self.rtte = RttEstimator::default();
895        self.assembler = Assembler::new();
896        self.tx_buffer.clear();
897        self.rx_buffer.clear();
898        self.rx_fin_received = false;
899        self.listen_endpoint = IpListenEndpoint::default();
900        self.tuple = None;
901        self.local_seq_no = TcpSeqNumber::default();
902        self.remote_seq_no = TcpSeqNumber::default();
903        self.remote_last_seq = TcpSeqNumber::default();
904        self.remote_last_ack = None;
905        self.remote_last_win = 0;
906        self.remote_win_len = 0;
907        self.remote_win_scale = None;
908        self.remote_win_shift = rx_cap_log2.saturating_sub(16) as u8;
909        self.remote_mss = DEFAULT_MSS;
910        self.remote_last_ts = None;
911        self.ack_delay_timer = AckDelayTimer::Idle;
912        self.challenge_ack_timer = Instant::from_secs(0);
913
914        #[cfg(feature = "async")]
915        {
916            self.rx_waker.wake();
917            self.tx_waker.wake();
918        }
919    }
920
921    /// Start listening on the given endpoint.
922    ///
923    /// This function returns `Err(Error::InvalidState)` if the socket was already open
924    /// (see [is_open](#method.is_open)), and `Err(Error::Unaddressable)`
925    /// if the port in the given endpoint is zero.
926    pub fn listen<T>(&mut self, local_endpoint: T) -> Result<(), ListenError>
927    where
928        T: Into<IpListenEndpoint>,
929    {
930        let local_endpoint = local_endpoint.into();
931        if local_endpoint.port == 0 {
932            return Err(ListenError::Unaddressable);
933        }
934
935        if self.is_open() {
936            // If we were already listening to same endpoint there is nothing to do; exit early.
937            //
938            // In the past listening on an socket that was already listening was an error,
939            // however this makes writing an acceptor loop with multiple sockets impossible.
940            // Without this early exit, if you tried to listen on a socket that's already listening you'll
941            // immediately get an error. The only way around this is to abort the socket first
942            // before listening again, but this means that incoming connections can actually
943            // get aborted between the abort() and the next listen().
944            if matches!(self.state, State::Listen) && self.listen_endpoint == local_endpoint {
945                return Ok(());
946            } else {
947                return Err(ListenError::InvalidState);
948            }
949        }
950
951        self.reset();
952        self.listen_endpoint = local_endpoint;
953        self.tuple = None;
954        self.set_state(State::Listen);
955        Ok(())
956    }
957
958    /// Connect to a given endpoint.
959    ///
960    /// The local port must be provided explicitly. Assuming `fn get_ephemeral_port() -> u16`
961    /// allocates a port between 49152 and 65535, a connection may be established as follows:
962    ///
963    /// ```no_run
964    /// # #[cfg(all(
965    /// #     feature = "medium-ethernet",
966    /// #     feature = "proto-ipv4",
967    /// # ))]
968    /// # {
969    /// # use smoltcp::socket::tcp::{Socket, SocketBuffer};
970    /// # use smoltcp::iface::Interface;
971    /// # use smoltcp::wire::IpAddress;
972    /// #
973    /// # fn get_ephemeral_port() -> u16 {
974    /// #     49152
975    /// # }
976    /// #
977    /// # let mut socket = Socket::new(
978    /// #     SocketBuffer::new(vec![0; 1200]),
979    /// #     SocketBuffer::new(vec![0; 1200])
980    /// # );
981    /// #
982    /// # let mut iface: Interface = todo!();
983    /// #
984    /// socket.connect(
985    ///     iface.context(),
986    ///     (IpAddress::v4(10, 0, 0, 1), 80),
987    ///     get_ephemeral_port()
988    /// ).unwrap();
989    /// # }
990    /// ```
991    ///
992    /// The local address may optionally be provided.
993    ///
994    /// This function returns an error if the socket was open; see [is_open](#method.is_open).
995    /// It also returns an error if the local or remote port is zero, or if the remote address
996    /// is unspecified.
997    pub fn connect<T, U>(
998        &mut self,
999        cx: &mut Context,
1000        remote_endpoint: T,
1001        local_endpoint: U,
1002    ) -> Result<(), ConnectError>
1003    where
1004        T: Into<IpEndpoint>,
1005        U: Into<IpListenEndpoint>,
1006    {
1007        let remote_endpoint: IpEndpoint = remote_endpoint.into();
1008        let local_endpoint: IpListenEndpoint = local_endpoint.into();
1009
1010        if self.is_open() {
1011            return Err(ConnectError::InvalidState);
1012        }
1013        if remote_endpoint.port == 0 || remote_endpoint.addr.is_unspecified() {
1014            return Err(ConnectError::Unaddressable);
1015        }
1016        if local_endpoint.port == 0 {
1017            return Err(ConnectError::Unaddressable);
1018        }
1019
1020        // If local address is not provided, choose it automatically.
1021        let local_endpoint = IpEndpoint {
1022            addr: match local_endpoint.addr {
1023                Some(addr) => {
1024                    if addr.is_unspecified() {
1025                        return Err(ConnectError::Unaddressable);
1026                    }
1027                    addr
1028                }
1029                None => cx
1030                    .get_source_address(&remote_endpoint.addr)
1031                    .ok_or(ConnectError::Unaddressable)?,
1032            },
1033            port: local_endpoint.port,
1034        };
1035
1036        if local_endpoint.addr.version() != remote_endpoint.addr.version() {
1037            return Err(ConnectError::Unaddressable);
1038        }
1039
1040        self.reset();
1041        self.tuple = Some(Tuple {
1042            local: local_endpoint,
1043            remote: remote_endpoint,
1044        });
1045        self.set_state(State::SynSent);
1046
1047        let seq = Self::random_seq_no(cx);
1048        self.local_seq_no = seq;
1049        self.remote_last_seq = seq;
1050        Ok(())
1051    }
1052
1053    #[cfg(test)]
1054    fn random_seq_no(_cx: &mut Context) -> TcpSeqNumber {
1055        TcpSeqNumber(10000)
1056    }
1057
1058    #[cfg(not(test))]
1059    fn random_seq_no(cx: &mut Context) -> TcpSeqNumber {
1060        TcpSeqNumber(cx.rand().rand_u32() as i32)
1061    }
1062
1063    /// Close the transmit half of the full-duplex connection.
1064    ///
1065    /// Note that there is no corresponding function for the receive half of the full-duplex
1066    /// connection; only the remote end can close it. If you no longer wish to receive any
1067    /// data and would like to reuse the socket right away, use [abort](#method.abort).
1068    pub fn close(&mut self) {
1069        match self.state {
1070            // In the LISTEN state there is no established connection.
1071            State::Listen => self.set_state(State::Closed),
1072            // In the SYN-SENT state the remote endpoint is not yet synchronized and, upon
1073            // receiving an RST, will abort the connection.
1074            State::SynSent => self.set_state(State::Closed),
1075            // In the SYN-RECEIVED, ESTABLISHED and CLOSE-WAIT states the transmit half
1076            // of the connection is open, and needs to be explicitly closed with a FIN.
1077            State::SynReceived | State::Established => self.set_state(State::FinWait1),
1078            State::CloseWait => self.set_state(State::LastAck),
1079            // In the FIN-WAIT-1, FIN-WAIT-2, CLOSING, LAST-ACK, TIME-WAIT and CLOSED states,
1080            // the transmit half of the connection is already closed, and no further
1081            // action is needed.
1082            State::FinWait1
1083            | State::FinWait2
1084            | State::Closing
1085            | State::TimeWait
1086            | State::LastAck
1087            | State::Closed => (),
1088        }
1089    }
1090
1091    /// Aborts the connection, if any.
1092    ///
1093    /// This function instantly closes the socket. One reset packet will be sent to the remote
1094    /// endpoint.
1095    ///
1096    /// In terms of the TCP state machine, the socket may be in any state and is moved to
1097    /// the `CLOSED` state.
1098    pub fn abort(&mut self) {
1099        self.set_state(State::Closed);
1100    }
1101
1102    /// Return whether the socket is passively listening for incoming connections.
1103    ///
1104    /// In terms of the TCP state machine, the socket must be in the `LISTEN` state.
1105    #[inline]
1106    pub fn is_listening(&self) -> bool {
1107        match self.state {
1108            State::Listen => true,
1109            _ => false,
1110        }
1111    }
1112
1113    /// Return whether the socket is open.
1114    ///
1115    /// This function returns true if the socket will process incoming or dispatch outgoing
1116    /// packets. Note that this does not mean that it is possible to send or receive data through
1117    /// the socket; for that, use [can_send](#method.can_send) or [can_recv](#method.can_recv).
1118    ///
1119    /// In terms of the TCP state machine, the socket must not be in the `CLOSED`
1120    /// or `TIME-WAIT` states.
1121    #[inline]
1122    pub fn is_open(&self) -> bool {
1123        match self.state {
1124            State::Closed => false,
1125            State::TimeWait => false,
1126            _ => true,
1127        }
1128    }
1129
1130    /// Return whether a connection is active.
1131    ///
1132    /// This function returns true if the socket is actively exchanging packets with
1133    /// a remote endpoint. Note that this does not mean that it is possible to send or receive
1134    /// data through the socket; for that, use [can_send](#method.can_send) or
1135    /// [can_recv](#method.can_recv).
1136    ///
1137    /// If a connection is established, [abort](#method.close) will send a reset to
1138    /// the remote endpoint.
1139    ///
1140    /// In terms of the TCP state machine, the socket must not be in the `CLOSED`, `TIME-WAIT`,
1141    /// or `LISTEN` state.
1142    #[inline]
1143    pub fn is_active(&self) -> bool {
1144        match self.state {
1145            State::Closed => false,
1146            State::TimeWait => false,
1147            State::Listen => false,
1148            _ => true,
1149        }
1150    }
1151
1152    /// Return whether the transmit half of the full-duplex connection is open.
1153    ///
1154    /// This function returns true if it's possible to send data and have it arrive
1155    /// to the remote endpoint. However, it does not make any guarantees about the state
1156    /// of the transmit buffer, and even if it returns true, [send](#method.send) may
1157    /// not be able to enqueue any octets.
1158    ///
1159    /// In terms of the TCP state machine, the socket must be in the `ESTABLISHED` or
1160    /// `CLOSE-WAIT` state.
1161    #[inline]
1162    pub fn may_send(&self) -> bool {
1163        match self.state {
1164            State::Established => true,
1165            // In CLOSE-WAIT, the remote endpoint has closed our receive half of the connection
1166            // but we still can transmit indefinitely.
1167            State::CloseWait => true,
1168            _ => false,
1169        }
1170    }
1171
1172    /// Return whether the receive half of the full-duplex connection is open.
1173    ///
1174    /// This function returns true if it's possible to receive data from the remote endpoint.
1175    /// It will return true while there is data in the receive buffer, and if there isn't,
1176    /// as long as the remote endpoint has not closed the connection.
1177    ///
1178    /// In terms of the TCP state machine, the socket must be in the `ESTABLISHED`,
1179    /// `FIN-WAIT-1`, or `FIN-WAIT-2` state, or have data in the receive buffer instead.
1180    #[inline]
1181    pub fn may_recv(&self) -> bool {
1182        match self.state {
1183            State::Established => true,
1184            // In FIN-WAIT-1/2, we have closed our transmit half of the connection but
1185            // we still can receive indefinitely.
1186            State::FinWait1 | State::FinWait2 => true,
1187            // If we have something in the receive buffer, we can receive that.
1188            _ if self.can_recv() => true,
1189            _ => false,
1190        }
1191    }
1192
1193    /// Check whether the transmit half of the full-duplex connection is open
1194    /// (see [may_send](#method.may_send)), and the transmit buffer is not full.
1195    #[inline]
1196    pub fn can_send(&self) -> bool {
1197        if !self.may_send() {
1198            return false;
1199        }
1200
1201        !self.tx_buffer.is_full()
1202    }
1203
1204    /// Return the maximum number of bytes inside the recv buffer.
1205    #[inline]
1206    pub fn recv_capacity(&self) -> usize {
1207        self.rx_buffer.capacity()
1208    }
1209
1210    /// Return the maximum number of bytes inside the transmit buffer.
1211    #[inline]
1212    pub fn send_capacity(&self) -> usize {
1213        self.tx_buffer.capacity()
1214    }
1215
1216    /// Check whether the receive buffer is not empty.
1217    #[inline]
1218    pub fn can_recv(&self) -> bool {
1219        !self.rx_buffer.is_empty()
1220    }
1221
1222    fn send_impl<'b, F, R>(&'b mut self, f: F) -> Result<R, SendError>
1223    where
1224        F: FnOnce(&'b mut SocketBuffer<'a>) -> (usize, R),
1225    {
1226        if !self.may_send() {
1227            return Err(SendError::InvalidState);
1228        }
1229
1230        let old_length = self.tx_buffer.len();
1231        let (size, result) = f(&mut self.tx_buffer);
1232        if size > 0 {
1233            // The connection might have been idle for a long time, and so remote_last_ts
1234            // would be far in the past. Unless we clear it here, we'll abort the connection
1235            // down over in dispatch() by erroneously detecting it as timed out.
1236            if old_length == 0 {
1237                self.remote_last_ts = None
1238            }
1239
1240            // if remote win is zero and we go from having no data to some data pending to
1241            // send, start the zero window probe timer.
1242            if self.remote_win_len == 0 && self.timer.is_idle() {
1243                let delay = self.rtte.retransmission_timeout();
1244                tcp_trace!("starting zero-window-probe timer for t+{}", delay);
1245
1246                // We don't have access to the current time here, so use Instant::ZERO instead.
1247                // this will cause the first ZWP to be sent immediately, but that's okay.
1248                self.timer.set_for_zero_window_probe(Instant::ZERO, delay);
1249            }
1250
1251            #[cfg(any(test, feature = "verbose"))]
1252            tcp_trace!(
1253                "tx buffer: enqueueing {} octets (now {})",
1254                size,
1255                old_length + size
1256            );
1257        }
1258        Ok(result)
1259    }
1260
1261    /// Call `f` with the largest contiguous slice of octets in the transmit buffer,
1262    /// and enqueue the amount of elements returned by `f`.
1263    ///
1264    /// This function returns `Err(Error::Illegal)` if the transmit half of
1265    /// the connection is not open; see [may_send](#method.may_send).
1266    pub fn send<'b, F, R>(&'b mut self, f: F) -> Result<R, SendError>
1267    where
1268        F: FnOnce(&'b mut [u8]) -> (usize, R),
1269    {
1270        self.send_impl(|tx_buffer| tx_buffer.enqueue_many_with(f))
1271    }
1272
1273    /// Enqueue a sequence of octets to be sent, and fill it from a slice.
1274    ///
1275    /// This function returns the amount of octets actually enqueued, which is limited
1276    /// by the amount of free space in the transmit buffer; down to zero.
1277    ///
1278    /// See also [send](#method.send).
1279    pub fn send_slice(&mut self, data: &[u8]) -> Result<usize, SendError> {
1280        self.send_impl(|tx_buffer| {
1281            let size = tx_buffer.enqueue_slice(data);
1282            (size, size)
1283        })
1284    }
1285
1286    fn recv_error_check(&mut self) -> Result<(), RecvError> {
1287        // We may have received some data inside the initial SYN, but until the connection
1288        // is fully open we must not dequeue any data, as it may be overwritten by e.g.
1289        // another (stale) SYN. (We do not support TCP Fast Open.)
1290        if !self.may_recv() {
1291            if self.rx_fin_received {
1292                return Err(RecvError::Finished);
1293            }
1294            return Err(RecvError::InvalidState);
1295        }
1296
1297        Ok(())
1298    }
1299
1300    fn recv_impl<'b, F, R>(&'b mut self, f: F) -> Result<R, RecvError>
1301    where
1302        F: FnOnce(&'b mut SocketBuffer<'a>) -> (usize, R),
1303    {
1304        self.recv_error_check()?;
1305
1306        let _old_length = self.rx_buffer.len();
1307        let (size, result) = f(&mut self.rx_buffer);
1308        self.remote_seq_no += size;
1309        if size > 0 {
1310            #[cfg(any(test, feature = "verbose"))]
1311            tcp_trace!(
1312                "rx buffer: dequeueing {} octets (now {})",
1313                size,
1314                _old_length - size
1315            );
1316        }
1317        Ok(result)
1318    }
1319
1320    /// Call `f` with the largest contiguous slice of octets in the receive buffer,
1321    /// and dequeue the amount of elements returned by `f`.
1322    ///
1323    /// This function errors if the receive half of the connection is not open.
1324    ///
1325    /// If the receive half has been gracefully closed (with a FIN packet), `Err(Error::Finished)`
1326    /// is returned. In this case, the previously received data is guaranteed to be complete.
1327    ///
1328    /// In all other cases, `Err(Error::Illegal)` is returned and previously received data (if any)
1329    /// may be incomplete (truncated).
1330    pub fn recv<'b, F, R>(&'b mut self, f: F) -> Result<R, RecvError>
1331    where
1332        F: FnOnce(&'b mut [u8]) -> (usize, R),
1333    {
1334        self.recv_impl(|rx_buffer| rx_buffer.dequeue_many_with(f))
1335    }
1336
1337    /// Dequeue a sequence of received octets, and fill a slice from it.
1338    ///
1339    /// This function returns the amount of octets actually dequeued, which is limited
1340    /// by the amount of occupied space in the receive buffer; down to zero.
1341    ///
1342    /// See also [recv](#method.recv).
1343    pub fn recv_slice(&mut self, data: &mut [u8]) -> Result<usize, RecvError> {
1344        self.recv_impl(|rx_buffer| {
1345            let size = rx_buffer.dequeue_slice(data);
1346            (size, size)
1347        })
1348    }
1349
1350    /// Peek at a sequence of received octets without removing them from
1351    /// the receive buffer, and return a pointer to it.
1352    ///
1353    /// This function otherwise behaves identically to [recv](#method.recv).
1354    pub fn peek(&mut self, size: usize) -> Result<&[u8], RecvError> {
1355        self.recv_error_check()?;
1356
1357        let buffer = self.rx_buffer.get_allocated(0, size);
1358        if !buffer.is_empty() {
1359            #[cfg(any(test, feature = "verbose"))]
1360            tcp_trace!("rx buffer: peeking at {} octets", buffer.len());
1361        }
1362        Ok(buffer)
1363    }
1364
1365    /// Peek at a sequence of received octets without removing them from
1366    /// the receive buffer, and fill a slice from it.
1367    ///
1368    /// This function otherwise behaves identically to [recv_slice](#method.recv_slice).
1369    pub fn peek_slice(&mut self, data: &mut [u8]) -> Result<usize, RecvError> {
1370        Ok(self.rx_buffer.read_allocated(0, data))
1371    }
1372
1373    /// Return the amount of octets queued in the transmit buffer.
1374    ///
1375    /// Note that the Berkeley sockets interface does not have an equivalent of this API.
1376    pub fn send_queue(&self) -> usize {
1377        self.tx_buffer.len()
1378    }
1379
1380    /// Return the amount of octets queued in the receive buffer. This value can be larger than
1381    /// the slice read by the next `recv` or `peek` call because it includes all queued octets,
1382    /// and not only the octets that may be returned as a contiguous slice.
1383    ///
1384    /// Note that the Berkeley sockets interface does not have an equivalent of this API.
1385    pub fn recv_queue(&self) -> usize {
1386        self.rx_buffer.len()
1387    }
1388
1389    fn set_state(&mut self, state: State) {
1390        if self.state != state {
1391            tcp_trace!("state={}=>{}", self.state, state);
1392        }
1393
1394        self.state = state;
1395
1396        #[cfg(feature = "async")]
1397        {
1398            // Wake all tasks waiting. Even if we haven't received/sent data, this
1399            // is needed because return values of functions may change depending on the state.
1400            // For example, a pending read has to fail with an error if the socket is closed.
1401            self.rx_waker.wake();
1402            self.tx_waker.wake();
1403        }
1404    }
1405
1406    pub(crate) fn reply(ip_repr: &IpRepr, repr: &TcpRepr) -> (IpRepr, TcpRepr<'static>) {
1407        let reply_repr = TcpRepr {
1408            src_port: repr.dst_port,
1409            dst_port: repr.src_port,
1410            control: TcpControl::None,
1411            seq_number: TcpSeqNumber(0),
1412            ack_number: None,
1413            window_len: 0,
1414            window_scale: None,
1415            max_seg_size: None,
1416            sack_permitted: false,
1417            sack_ranges: [None, None, None],
1418            timestamp: None,
1419            payload: &[],
1420        };
1421        let ip_reply_repr = IpRepr::new(
1422            ip_repr.dst_addr(),
1423            ip_repr.src_addr(),
1424            IpProtocol::Tcp,
1425            reply_repr.buffer_len(),
1426            64,
1427        );
1428        (ip_reply_repr, reply_repr)
1429    }
1430
1431    pub(crate) fn rst_reply(ip_repr: &IpRepr, repr: &TcpRepr) -> (IpRepr, TcpRepr<'static>) {
1432        debug_assert!(repr.control != TcpControl::Rst);
1433
1434        let (ip_reply_repr, mut reply_repr) = Self::reply(ip_repr, repr);
1435
1436        // See https://www.snellman.net/blog/archive/2016-02-01-tcp-rst/ for explanation
1437        // of why we sometimes send an RST and sometimes an RST|ACK
1438        reply_repr.control = TcpControl::Rst;
1439        reply_repr.seq_number = repr.ack_number.unwrap_or_default();
1440        if repr.control == TcpControl::Syn && repr.ack_number.is_none() {
1441            reply_repr.ack_number = Some(repr.seq_number + repr.segment_len());
1442        }
1443
1444        (ip_reply_repr, reply_repr)
1445    }
1446
1447    fn ack_reply(&mut self, ip_repr: &IpRepr, repr: &TcpRepr) -> (IpRepr, TcpRepr<'static>) {
1448        let (mut ip_reply_repr, mut reply_repr) = Self::reply(ip_repr, repr);
1449        reply_repr.timestamp = repr
1450            .timestamp
1451            .and_then(|tcp_ts| tcp_ts.generate_reply(self.tsval_generator));
1452
1453        // From RFC 793:
1454        // [...] an empty acknowledgment segment containing the current send-sequence number
1455        // and an acknowledgment indicating the next sequence number expected
1456        // to be received.
1457        reply_repr.seq_number = self.remote_last_seq;
1458        reply_repr.ack_number = Some(self.remote_seq_no + self.rx_buffer.len());
1459        self.remote_last_ack = reply_repr.ack_number;
1460
1461        // From RFC 1323:
1462        // The window field [...] of every outgoing segment, with the exception of SYN
1463        // segments, is right-shifted by [advertised scale value] bits[...]
1464        reply_repr.window_len = self.scaled_window();
1465        self.remote_last_win = reply_repr.window_len;
1466
1467        // If the remote supports selective acknowledgement, add the option to the outgoing
1468        // segment.
1469        if self.remote_has_sack {
1470            net_debug!("sending sACK option with current assembler ranges");
1471
1472            // RFC 2018: The first SACK block (i.e., the one immediately following the kind and
1473            // length fields in the option) MUST specify the contiguous block of data containing
1474            // the segment which triggered this ACK, unless that segment advanced the
1475            // Acknowledgment Number field in the header.
1476            reply_repr.sack_ranges[0] = None;
1477
1478            let ack = reply_repr.ack_number.unwrap_or(TcpSeqNumber(0));
1479
1480            if let Some(last_seg_seq) = self.local_rx_last_seq {
1481                reply_repr.sack_ranges[0] = self
1482                    .assembler
1483                    .iter_data()
1484                    .map(|(left, right)| (ack + left, ack + right))
1485                    .find(|&(left, right)| left <= last_seg_seq && right >= last_seg_seq)
1486                    .map(|(left, right)| (left.0 as u32, right.0 as u32));
1487            }
1488
1489            if reply_repr.sack_ranges[0].is_none() {
1490                // The matching segment was removed from the assembler, meaning the acknowledgement
1491                // number has advanced, or there was no previous sACK.
1492                //
1493                // While the RFC says we SHOULD keep a list of reported sACK ranges, and iterate
1494                // through those, that is currently infeasible. Instead, we offer the range with
1495                // the lowest sequence number (if one exists) to hint at what segments would
1496                // most quickly advance the acknowledgement number.
1497                reply_repr.sack_ranges[0] = self
1498                    .assembler
1499                    .iter_data()
1500                    .map(|(left, right)| (ack + left, ack + right))
1501                    .next()
1502                    .map(|(left, right)| (left.0 as u32, right.0 as u32));
1503            }
1504        }
1505
1506        // Since the sACK option may have changed the length of the payload, update that.
1507        ip_reply_repr.set_payload_len(reply_repr.buffer_len());
1508        (ip_reply_repr, reply_repr)
1509    }
1510
1511    fn challenge_ack_reply(
1512        &mut self,
1513        cx: &mut Context,
1514        ip_repr: &IpRepr,
1515        repr: &TcpRepr,
1516    ) -> Option<(IpRepr, TcpRepr<'static>)> {
1517        if cx.now() < self.challenge_ack_timer {
1518            return None;
1519        }
1520
1521        // Rate-limit to 1 per second max.
1522        self.challenge_ack_timer = cx.now() + Duration::from_secs(1);
1523
1524        Some(self.ack_reply(ip_repr, repr))
1525    }
1526
1527    pub(crate) fn accepts(&self, _cx: &mut Context, ip_repr: &IpRepr, repr: &TcpRepr) -> bool {
1528        if self.state == State::Closed {
1529            return false;
1530        }
1531
1532        // If we're still listening for SYNs and the packet has an ACK or a RST,
1533        // it cannot be destined to this socket, but another one may well listen
1534        // on the same local endpoint.
1535        if self.state == State::Listen
1536            && (repr.ack_number.is_some() || repr.control == TcpControl::Rst)
1537        {
1538            return false;
1539        }
1540
1541        if let Some(tuple) = &self.tuple {
1542            // Reject packets not matching the 4-tuple
1543            ip_repr.dst_addr() == tuple.local.addr
1544                && repr.dst_port == tuple.local.port
1545                && ip_repr.src_addr() == tuple.remote.addr
1546                && repr.src_port == tuple.remote.port
1547        } else {
1548            // We're listening, reject packets not matching the listen endpoint.
1549            let addr_ok = match self.listen_endpoint.addr {
1550                Some(addr) => ip_repr.dst_addr() == addr,
1551                None => true,
1552            };
1553            addr_ok && repr.dst_port != 0 && repr.dst_port == self.listen_endpoint.port
1554        }
1555    }
1556
1557    pub(crate) fn process(
1558        &mut self,
1559        cx: &mut Context,
1560        ip_repr: &IpRepr,
1561        repr: &TcpRepr,
1562    ) -> Option<(IpRepr, TcpRepr<'static>)> {
1563        debug_assert!(self.accepts(cx, ip_repr, repr));
1564
1565        // Consider how much the sequence number space differs from the transmit buffer space.
1566        let (sent_syn, sent_fin) = match self.state {
1567            // In SYN-SENT or SYN-RECEIVED, we've just sent a SYN.
1568            State::SynSent | State::SynReceived => (true, false),
1569            // In FIN-WAIT-1, LAST-ACK, or CLOSING, we've just sent a FIN.
1570            State::FinWait1 | State::LastAck | State::Closing => (false, true),
1571            // In all other states we've already got acknowledgements for
1572            // all of the control flags we sent.
1573            _ => (false, false),
1574        };
1575        let control_len = (sent_syn as usize) + (sent_fin as usize);
1576
1577        // Reject unacceptable acknowledgements.
1578        match (self.state, repr.control, repr.ack_number) {
1579            // An RST received in response to initial SYN is acceptable if it acknowledges
1580            // the initial SYN.
1581            (State::SynSent, TcpControl::Rst, None) => {
1582                net_debug!("unacceptable RST (expecting RST|ACK) in response to initial SYN");
1583                return None;
1584            }
1585            (State::SynSent, TcpControl::Rst, Some(ack_number)) => {
1586                if ack_number != self.local_seq_no + 1 {
1587                    net_debug!("unacceptable RST|ACK in response to initial SYN");
1588                    return None;
1589                }
1590            }
1591            // Any other RST need only have a valid sequence number.
1592            (_, TcpControl::Rst, _) => (),
1593            // The initial SYN cannot contain an acknowledgement.
1594            (State::Listen, _, None) => (),
1595            // This case is handled in `accepts()`.
1596            (State::Listen, _, Some(_)) => unreachable!(),
1597            // SYN|ACK in the SYN-SENT state must have the exact ACK number.
1598            (State::SynSent, TcpControl::Syn, Some(ack_number)) => {
1599                if ack_number != self.local_seq_no + 1 {
1600                    net_debug!("unacceptable SYN|ACK in response to initial SYN");
1601                    return Some(Self::rst_reply(ip_repr, repr));
1602                }
1603            }
1604            // TCP simultaneous open.
1605            // This is required by RFC 9293, which states "A TCP implementation MUST support
1606            // simultaneous open attempts (MUST-10)."
1607            (State::SynSent, TcpControl::Syn, None) => (),
1608            // ACKs in the SYN-SENT state are invalid.
1609            (State::SynSent, TcpControl::None, Some(ack_number)) => {
1610                // If the sequence number matches, ignore it instead of RSTing.
1611                // I'm not sure why, I think it may be a workaround for broken TCP
1612                // servers, or a defense against reordering. Either way, if Linux
1613                // does it, we do too.
1614                if ack_number == self.local_seq_no + 1 {
1615                    net_debug!(
1616                        "expecting a SYN|ACK, received an ACK with the right ack_number, ignoring."
1617                    );
1618                    return None;
1619                }
1620
1621                net_debug!(
1622                    "expecting a SYN|ACK, received an ACK with the wrong ack_number, sending RST."
1623                );
1624                return Some(Self::rst_reply(ip_repr, repr));
1625            }
1626            // Anything else in the SYN-SENT state is invalid.
1627            (State::SynSent, _, _) => {
1628                net_debug!("expecting a SYN|ACK");
1629                return None;
1630            }
1631            // Every packet after the initial SYN must be an acknowledgement.
1632            (_, _, None) => {
1633                net_debug!("expecting an ACK");
1634                return None;
1635            }
1636            // ACK in the SYN-RECEIVED state must have the exact ACK number, or we RST it.
1637            (State::SynReceived, _, Some(ack_number)) => {
1638                if ack_number != self.local_seq_no + 1 {
1639                    net_debug!("unacceptable ACK in response to SYN|ACK");
1640                    return Some(Self::rst_reply(ip_repr, repr));
1641                }
1642            }
1643            // Every acknowledgement must be for transmitted but unacknowledged data.
1644            (_, _, Some(ack_number)) => {
1645                let unacknowledged = self.tx_buffer.len() + control_len;
1646
1647                // Acceptable ACK range (both inclusive)
1648                let mut ack_min = self.local_seq_no;
1649                let ack_max = self.local_seq_no + unacknowledged;
1650
1651                // If we have sent a SYN, it MUST be acknowledged.
1652                if sent_syn {
1653                    ack_min += 1;
1654                }
1655
1656                if ack_number < ack_min {
1657                    net_debug!(
1658                        "duplicate ACK ({} not in {}...{})",
1659                        ack_number,
1660                        ack_min,
1661                        ack_max
1662                    );
1663                    return None;
1664                }
1665
1666                if ack_number > ack_max {
1667                    net_debug!(
1668                        "unacceptable ACK ({} not in {}...{})",
1669                        ack_number,
1670                        ack_min,
1671                        ack_max
1672                    );
1673                    return self.challenge_ack_reply(cx, ip_repr, repr);
1674                }
1675            }
1676        }
1677
1678        let window_start = self.remote_seq_no + self.rx_buffer.len();
1679        let window_end = if let Some(last_ack) = self.remote_last_ack {
1680            last_ack + ((self.remote_last_win as usize) << self.remote_win_shift)
1681        } else {
1682            window_start
1683        };
1684        let segment_start = repr.seq_number;
1685        let segment_end = repr.seq_number + repr.payload.len();
1686
1687        let (payload, payload_offset) = match self.state {
1688            // In LISTEN and SYN-SENT states, we have not yet synchronized with the remote end.
1689            State::Listen | State::SynSent => (&[][..], 0),
1690            _ => {
1691                // https://www.rfc-editor.org/rfc/rfc9293.html#name-segment-acceptability-tests
1692                let segment_in_window = match (
1693                    segment_start == segment_end,
1694                    window_start == window_end,
1695                ) {
1696                    (true, _) if segment_end == window_start - 1 => {
1697                        net_debug!(
1698                            "received a keep-alive or window probe packet, will send an ACK"
1699                        );
1700                        false
1701                    }
1702                    (true, true) => {
1703                        if window_start == segment_start {
1704                            true
1705                        } else {
1706                            net_debug!(
1707                                "zero-length segment not inside zero-length window, will send an ACK."
1708                            );
1709                            false
1710                        }
1711                    }
1712                    (true, false) => {
1713                        if window_start <= segment_start && segment_start < window_end {
1714                            true
1715                        } else {
1716                            net_debug!("zero-length segment not inside window, will send an ACK.");
1717                            false
1718                        }
1719                    }
1720                    (false, true) => {
1721                        net_debug!(
1722                            "non-zero-length segment with zero receive window, will only send an ACK"
1723                        );
1724                        false
1725                    }
1726                    (false, false) => {
1727                        if (window_start <= segment_start && segment_start < window_end)
1728                            || (window_start < segment_end && segment_end <= window_end)
1729                        {
1730                            true
1731                        } else {
1732                            net_debug!(
1733                                "segment not in receive window ({}..{} not intersecting {}..{}), will send challenge ACK",
1734                                segment_start,
1735                                segment_end,
1736                                window_start,
1737                                window_end
1738                            );
1739                            false
1740                        }
1741                    }
1742                };
1743
1744                if segment_in_window {
1745                    let overlap_start = window_start.max(segment_start);
1746                    let overlap_end = window_end.min(segment_end);
1747
1748                    // the checks done above imply this.
1749                    debug_assert!(overlap_start <= overlap_end);
1750
1751                    self.local_rx_last_seq = Some(repr.seq_number);
1752
1753                    (
1754                        &repr.payload[overlap_start - segment_start..overlap_end - segment_start],
1755                        overlap_start - window_start,
1756                    )
1757                } else {
1758                    // If we're in the TIME-WAIT state, restart the TIME-WAIT timeout, since
1759                    // the remote end may not have realized we've closed the connection.
1760                    if self.state == State::TimeWait {
1761                        self.timer.set_for_close(cx.now());
1762                    }
1763
1764                    return self.challenge_ack_reply(cx, ip_repr, repr);
1765                }
1766            }
1767        };
1768
1769        // Compute the amount of acknowledged octets, removing the SYN and FIN bits
1770        // from the sequence space.
1771        let mut ack_len = 0;
1772        let mut ack_of_fin = false;
1773        let mut ack_all = false;
1774        if repr.control != TcpControl::Rst
1775            && let Some(ack_number) = repr.ack_number
1776        {
1777            // Sequence number corresponding to the first byte in `tx_buffer`.
1778            // This normally equals `local_seq_no`, but is 1 higher if we have sent a SYN,
1779            // as the SYN occupies 1 sequence number "before" the data.
1780            let tx_buffer_start_seq = self.local_seq_no + (sent_syn as usize);
1781
1782            if ack_number >= tx_buffer_start_seq {
1783                ack_len = ack_number - tx_buffer_start_seq;
1784
1785                // We could've sent data before the FIN, so only remove FIN from the sequence
1786                // space if all of that data is acknowledged.
1787                if sent_fin && self.tx_buffer.len() + 1 == ack_len {
1788                    ack_len -= 1;
1789                    tcp_trace!("received ACK of FIN");
1790                    ack_of_fin = true;
1791                }
1792
1793                ack_all = self.remote_last_seq <= ack_number;
1794            }
1795
1796            self.rtte.on_ack(cx.now(), ack_number);
1797            self.congestion_controller
1798                .inner_mut()
1799                .on_ack(cx.now(), ack_len, &self.rtte);
1800        }
1801
1802        // Disregard control flags we don't care about or shouldn't act on yet.
1803        let mut control = repr.control;
1804        control = control.quash_psh();
1805
1806        // If a FIN is received at the end of the current segment, but
1807        // we have a hole in the assembler before the current segment, disregard this FIN.
1808        if control == TcpControl::Fin && window_start < segment_start {
1809            tcp_trace!(
1810                "ignoring FIN because we don't have full data yet. window_start={} segment_start={}",
1811                window_start,
1812                segment_start
1813            );
1814            control = TcpControl::None;
1815        }
1816
1817        // Validate and update the state.
1818        match (self.state, control) {
1819            // RSTs are not accepted in the LISTEN state.
1820            (State::Listen, TcpControl::Rst) => return None,
1821
1822            // RSTs in SYN-RECEIVED flip the socket back to the LISTEN state.
1823            // Here we need to additionally check `listen_endpoint`, because we want to make sure
1824            // that SYN-RECEIVED was actually converted from the LISTEN state (another possible
1825            // reason is TCP simultaneous open).
1826            (State::SynReceived, TcpControl::Rst) if self.listen_endpoint.port != 0 => {
1827                tcp_trace!("received RST");
1828                self.tuple = None;
1829                self.set_state(State::Listen);
1830                return None;
1831            }
1832
1833            // RSTs in any other state close the socket.
1834            (_, TcpControl::Rst) => {
1835                tcp_trace!("received RST");
1836                self.set_state(State::Closed);
1837                self.tuple = None;
1838                return None;
1839            }
1840
1841            // SYN packets in the LISTEN state change it to SYN-RECEIVED.
1842            (State::Listen, TcpControl::Syn) => {
1843                tcp_trace!("received SYN");
1844                if let Some(max_seg_size) = repr.max_seg_size {
1845                    if max_seg_size == 0 {
1846                        tcp_trace!("received SYNACK with zero MSS, ignoring");
1847                        return None;
1848                    }
1849                    self.congestion_controller
1850                        .inner_mut()
1851                        .set_mss(max_seg_size as usize);
1852                    self.remote_mss = max_seg_size as usize
1853                }
1854
1855                self.tuple = Some(Tuple {
1856                    local: IpEndpoint::new(ip_repr.dst_addr(), repr.dst_port),
1857                    remote: IpEndpoint::new(ip_repr.src_addr(), repr.src_port),
1858                });
1859                self.local_seq_no = Self::random_seq_no(cx);
1860                self.remote_seq_no = repr.seq_number + 1;
1861                self.remote_last_seq = self.local_seq_no;
1862                self.remote_has_sack = repr.sack_permitted;
1863                self.remote_win_scale = repr.window_scale;
1864                // Remote doesn't support window scaling, don't do it.
1865                if self.remote_win_scale.is_none() {
1866                    self.remote_win_shift = 0;
1867                }
1868                // Remote doesn't support timestamping, don't do it.
1869                if repr.timestamp.is_none() {
1870                    self.tsval_generator = None;
1871                }
1872                self.set_state(State::SynReceived);
1873                self.timer.set_for_idle(cx.now(), self.keep_alive);
1874            }
1875
1876            // ACK packets in the SYN-RECEIVED state change it to ESTABLISHED.
1877            (State::SynReceived, TcpControl::None) => {
1878                self.set_state(State::Established);
1879            }
1880
1881            // FIN packets in the SYN-RECEIVED state change it to CLOSE-WAIT.
1882            // It's not obvious from RFC 793 that this is permitted, but
1883            // 7th and 8th steps in the "SEGMENT ARRIVES" event describe this behavior.
1884            (State::SynReceived, TcpControl::Fin) => {
1885                self.remote_seq_no += 1;
1886                self.rx_fin_received = true;
1887                self.set_state(State::CloseWait);
1888            }
1889
1890            // SYN|ACK packets in the SYN-SENT state change it to ESTABLISHED.
1891            // SYN packets in the SYN-SENT state change it to SYN-RECEIVED.
1892            (State::SynSent, TcpControl::Syn) => {
1893                if repr.ack_number.is_some() {
1894                    tcp_trace!("received SYN|ACK");
1895                } else {
1896                    tcp_trace!("received SYN");
1897                }
1898                if let Some(max_seg_size) = repr.max_seg_size {
1899                    if max_seg_size == 0 {
1900                        tcp_trace!("received SYNACK with zero MSS, ignoring");
1901                        return None;
1902                    }
1903                    self.remote_mss = max_seg_size as usize;
1904                    self.congestion_controller
1905                        .inner_mut()
1906                        .set_mss(self.remote_mss);
1907                }
1908
1909                self.remote_seq_no = repr.seq_number + 1;
1910                self.remote_last_seq = self.local_seq_no + 1;
1911                self.remote_last_ack = Some(repr.seq_number);
1912                self.remote_has_sack = repr.sack_permitted;
1913                self.remote_win_scale = repr.window_scale;
1914                // Remote doesn't support window scaling, don't do it.
1915                if self.remote_win_scale.is_none() {
1916                    self.remote_win_shift = 0;
1917                }
1918                // Remote doesn't support timestamping, don't do it.
1919                if repr.timestamp.is_none() {
1920                    self.tsval_generator = None;
1921                }
1922
1923                if repr.ack_number.is_some() {
1924                    self.set_state(State::Established);
1925                } else {
1926                    self.set_state(State::SynReceived);
1927                }
1928            }
1929
1930            (State::Established, TcpControl::None) => {}
1931
1932            // FIN packets in ESTABLISHED state indicate the remote side has closed.
1933            (State::Established, TcpControl::Fin) => {
1934                self.remote_seq_no += 1;
1935                self.rx_fin_received = true;
1936                self.set_state(State::CloseWait);
1937            }
1938
1939            // ACK packets in FIN-WAIT-1 state change it to FIN-WAIT-2, if we've already
1940            // sent everything in the transmit buffer. If not, they reset the retransmit timer.
1941            (State::FinWait1, TcpControl::None) => {
1942                if ack_of_fin {
1943                    self.set_state(State::FinWait2);
1944                }
1945            }
1946
1947            // FIN packets in FIN-WAIT-1 state change it to CLOSING, or to TIME-WAIT
1948            // if they also acknowledge our FIN.
1949            (State::FinWait1, TcpControl::Fin) => {
1950                self.remote_seq_no += 1;
1951                self.rx_fin_received = true;
1952                if ack_of_fin {
1953                    self.set_state(State::TimeWait);
1954                    self.timer.set_for_close(cx.now());
1955                } else {
1956                    self.set_state(State::Closing);
1957                }
1958            }
1959
1960            (State::FinWait2, TcpControl::None) => {}
1961
1962            // FIN packets in FIN-WAIT-2 state change it to TIME-WAIT.
1963            (State::FinWait2, TcpControl::Fin) => {
1964                self.remote_seq_no += 1;
1965                self.rx_fin_received = true;
1966                self.set_state(State::TimeWait);
1967                self.timer.set_for_close(cx.now());
1968            }
1969
1970            // ACK packets in CLOSING state change it to TIME-WAIT.
1971            (State::Closing, TcpControl::None) => {
1972                if ack_of_fin {
1973                    self.set_state(State::TimeWait);
1974                    self.timer.set_for_close(cx.now());
1975                }
1976            }
1977
1978            (State::CloseWait, TcpControl::None) => {}
1979
1980            // ACK packets in LAST-ACK state change it to CLOSED.
1981            (State::LastAck, TcpControl::None) => {
1982                if ack_of_fin {
1983                    // Clear the remote endpoint, or we'll send an RST there.
1984                    self.set_state(State::Closed);
1985                    self.tuple = None;
1986                } else if ack_len == 0 {
1987                    // Duplicate ACK; our FIN has not been acknowledged.
1988                    // Per RFC 9293 (3.10.7.4), send a challenge ACK.
1989                    return self.challenge_ack_reply(cx, ip_repr, repr);
1990                }
1991                // Partial ACK: fall through to advance SND.UNA normally.
1992            }
1993
1994            _ => {
1995                net_debug!("unexpected packet {}", repr);
1996                return None;
1997            }
1998        }
1999
2000        // Update remote state.
2001        self.remote_last_ts = Some(cx.now());
2002
2003        // RFC 1323: The window field (SEG.WND) in the header of every incoming segment, with the
2004        // exception of SYN segments, is left-shifted by Snd.Wind.Scale bits before updating SND.WND.
2005        let scale = match repr.control {
2006            TcpControl::Syn => 0,
2007            _ => self.remote_win_scale.unwrap_or(0),
2008        };
2009        let new_remote_win_len = (repr.window_len as usize) << (scale as usize);
2010        let is_window_update = new_remote_win_len != self.remote_win_len;
2011        self.remote_win_len = new_remote_win_len;
2012
2013        self.congestion_controller
2014            .inner_mut()
2015            .set_remote_window(new_remote_win_len);
2016
2017        if ack_len > 0 {
2018            // Dequeue acknowledged octets.
2019            debug_assert!(self.tx_buffer.len() >= ack_len);
2020            tcp_trace!(
2021                "tx buffer: dequeueing {} octets (now {})",
2022                ack_len,
2023                self.tx_buffer.len() - ack_len
2024            );
2025            self.tx_buffer.dequeue_allocated(ack_len);
2026
2027            // There's new room available in tx_buffer, wake the waiting task if any.
2028            #[cfg(feature = "async")]
2029            self.tx_waker.wake();
2030        }
2031
2032        if let Some(ack_number) = repr.ack_number {
2033            // TODO: When flow control is implemented,
2034            // refractor the following block within that implementation
2035
2036            // Detect and react to duplicate ACKs by:
2037            // 1. Check if duplicate ACK and change self.local_rx_dup_acks accordingly
2038            // 2. If exactly 3 duplicate ACKs received, set for fast retransmit
2039            // 3. Update the last received ACK (self.local_rx_last_ack)
2040            match self.local_rx_last_ack {
2041                // Duplicate ACK if payload empty and ACK doesn't move send window ->
2042                // Increment duplicate ACK count and set for retransmit if we just received
2043                // the third duplicate ACK
2044                Some(last_rx_ack)
2045                    if repr.payload.is_empty()
2046                        && last_rx_ack == ack_number
2047                        && ack_number < self.remote_last_seq
2048                        && !is_window_update =>
2049                {
2050                    // Increment duplicate ACK count
2051                    self.local_rx_dup_acks = self.local_rx_dup_acks.saturating_add(1);
2052
2053                    // Inform congestion controller of duplicate ACK
2054                    self.congestion_controller
2055                        .inner_mut()
2056                        .on_duplicate_ack(cx.now());
2057
2058                    net_debug!(
2059                        "received duplicate ACK for seq {} (duplicate nr {}{})",
2060                        ack_number,
2061                        self.local_rx_dup_acks,
2062                        if self.local_rx_dup_acks == u8::MAX {
2063                            "+"
2064                        } else {
2065                            ""
2066                        }
2067                    );
2068
2069                    if self.local_rx_dup_acks == 3 {
2070                        self.timer.set_for_fast_retransmit();
2071                        net_debug!("started fast retransmit");
2072                    }
2073                }
2074                // No duplicate ACK -> Reset state and update last received ACK
2075                _ => {
2076                    if self.local_rx_dup_acks > 0 {
2077                        self.local_rx_dup_acks = 0;
2078                        net_debug!("reset duplicate ACK count");
2079                    }
2080                    self.local_rx_last_ack = Some(ack_number);
2081                }
2082            };
2083            // We've processed everything in the incoming segment, so advance the local
2084            // sequence number past it.
2085            self.local_seq_no = ack_number;
2086            // During retransmission, if an earlier segment got lost but later was
2087            // successfully received, self.local_seq_no can move past self.remote_last_seq.
2088            // Do not attempt to retransmit the latter segments; not only this is pointless
2089            // in theory but also impossible in practice, since they have been already
2090            // deallocated from the buffer.
2091            if self.remote_last_seq < self.local_seq_no {
2092                self.remote_last_seq = self.local_seq_no
2093            }
2094        }
2095
2096        // update last remote tsval
2097        if let Some(timestamp) = repr.timestamp {
2098            self.last_remote_tsval = timestamp.tsval;
2099        }
2100
2101        // update timers.
2102        match self.timer {
2103            Timer::Retransmit { .. } | Timer::FastRetransmit => {
2104                if ack_all {
2105                    // RFC 6298: (5.2) ACK of all outstanding data turn off the retransmit timer.
2106                    self.timer.set_for_idle(cx.now(), self.keep_alive);
2107                } else if ack_len > 0 {
2108                    // (5.3) ACK of new data in ESTABLISHED state restart the retransmit timer.
2109                    let rto = self.rtte.retransmission_timeout();
2110                    self.timer.set_for_retransmit(cx.now(), rto);
2111                }
2112            }
2113            Timer::Idle { .. } => {
2114                // any packet on idle refresh the keepalive timer.
2115                self.timer.set_for_idle(cx.now(), self.keep_alive);
2116            }
2117            _ => {}
2118        }
2119
2120        // start/stop the Zero Window Probe timer.
2121        if self.remote_win_len == 0
2122            && !self.tx_buffer.is_empty()
2123            && (self.timer.is_idle() || ack_len > 0)
2124        {
2125            let delay = self.rtte.retransmission_timeout();
2126            tcp_trace!("starting zero-window-probe timer for t+{}", delay);
2127            self.timer.set_for_zero_window_probe(cx.now(), delay);
2128        }
2129        if self.remote_win_len != 0 && self.timer.is_zero_window_probe() {
2130            tcp_trace!("stopping zero-window-probe timer");
2131            self.timer.set_for_idle(cx.now(), self.keep_alive);
2132        }
2133
2134        let payload_len = payload.len();
2135        if payload_len == 0 {
2136            return None;
2137        }
2138
2139        let assembler_was_empty = self.assembler.is_empty();
2140
2141        // Try adding payload octets to the assembler.
2142        let Ok(contig_len) = self
2143            .assembler
2144            .add_then_remove_front(payload_offset, payload_len)
2145        else {
2146            net_debug!(
2147                "assembler: too many holes to add {} octets at offset {}",
2148                payload_len,
2149                payload_offset
2150            );
2151            return None;
2152        };
2153
2154        // Place payload octets into the buffer.
2155        tcp_trace!(
2156            "rx buffer: receiving {} octets at offset {}",
2157            payload_len,
2158            payload_offset
2159        );
2160        let len_written = self.rx_buffer.write_unallocated(payload_offset, payload);
2161        debug_assert!(len_written == payload_len);
2162
2163        if contig_len != 0 {
2164            // Enqueue the contiguous data octets in front of the buffer.
2165            tcp_trace!(
2166                "rx buffer: enqueueing {} octets (now {})",
2167                contig_len,
2168                self.rx_buffer.len() + contig_len
2169            );
2170            self.rx_buffer.enqueue_unallocated(contig_len);
2171
2172            // There's new data in rx_buffer, notify waiting task if any.
2173            #[cfg(feature = "async")]
2174            self.rx_waker.wake();
2175        }
2176
2177        if !self.assembler.is_empty() {
2178            // Print the ranges recorded in the assembler.
2179            tcp_trace!("assembler: {}", self.assembler);
2180        }
2181
2182        // Handle delayed acks
2183        if let Some(ack_delay) = self.ack_delay
2184            && self.ack_to_transmit()
2185        {
2186            self.ack_delay_timer = match self.ack_delay_timer {
2187                AckDelayTimer::Idle => {
2188                    tcp_trace!("starting delayed ack timer");
2189                    AckDelayTimer::Waiting(cx.now() + ack_delay)
2190                }
2191                AckDelayTimer::Waiting(_) if self.immediate_ack_to_transmit() => {
2192                    tcp_trace!("delayed ack timer already started, forcing expiry");
2193                    AckDelayTimer::Immediate
2194                }
2195                timer @ AckDelayTimer::Waiting(_) => {
2196                    tcp_trace!("waiting until delayed ack timer expires");
2197                    timer
2198                }
2199                AckDelayTimer::Immediate => {
2200                    tcp_trace!("delayed ack timer already force-expired");
2201                    AckDelayTimer::Immediate
2202                }
2203            };
2204        }
2205
2206        // Per RFC 5681, we should send an immediate ACK when either:
2207        //  1) an out-of-order segment is received, or
2208        //  2) a segment arrives that fills in all or part of a gap in sequence space.
2209        if !self.assembler.is_empty() || !assembler_was_empty {
2210            // Note that we change the transmitter state here.
2211            // This is fine because smoltcp assumes that it can always transmit zero or one
2212            // packets for every packet it receives.
2213            tcp_trace!("ACKing incoming segment");
2214            Some(self.ack_reply(ip_repr, repr))
2215        } else {
2216            None
2217        }
2218    }
2219
2220    fn timed_out(&self, timestamp: Instant) -> bool {
2221        match (self.remote_last_ts, self.timeout) {
2222            (Some(remote_last_ts), Some(timeout)) => timestamp >= remote_last_ts + timeout,
2223            (_, _) => false,
2224        }
2225    }
2226
2227    fn seq_to_transmit(&self, cx: &mut Context) -> bool {
2228        let ip_header_len = match self.tuple.unwrap().local.addr {
2229            #[cfg(feature = "proto-ipv4")]
2230            IpAddress::Ipv4(_) => crate::wire::IPV4_HEADER_LEN,
2231            #[cfg(feature = "proto-ipv6")]
2232            IpAddress::Ipv6(_) => crate::wire::IPV6_HEADER_LEN,
2233        };
2234
2235        // Max segment size we're able to send due to MTU limitations.
2236        let local_mss = cx.ip_mtu() - ip_header_len - TCP_HEADER_LEN;
2237
2238        // The effective max segment size, taking into account our and remote's limits.
2239        let effective_mss = local_mss.min(self.remote_mss);
2240
2241        // Have we sent data that hasn't been ACKed yet?
2242        let data_in_flight = self.remote_last_seq != self.local_seq_no;
2243
2244        // If we want to send a SYN and we haven't done so, do it!
2245        if matches!(self.state, State::SynSent | State::SynReceived) && !data_in_flight {
2246            return true;
2247        }
2248
2249        // max sequence number we can send.
2250        let max_send_seq =
2251            self.local_seq_no + core::cmp::min(self.remote_win_len, self.tx_buffer.len());
2252
2253        // Max amount of octets we can send.
2254        let max_send = if max_send_seq >= self.remote_last_seq {
2255            max_send_seq - self.remote_last_seq
2256        } else {
2257            0
2258        };
2259
2260        // Compare max_send with the congestion window.
2261        let max_send = max_send.min(self.congestion_controller.inner().window());
2262
2263        // Can we send at least 1 octet?
2264        let mut can_send = max_send != 0;
2265        // Can we send at least 1 full segment?
2266        let can_send_full = max_send >= effective_mss;
2267
2268        // Do we have to send a FIN?
2269        let want_fin = match self.state {
2270            State::FinWait1 => true,
2271            State::Closing => true,
2272            State::LastAck => true,
2273            _ => false,
2274        };
2275
2276        // If we're applying the Nagle algorithm we don't want to send more
2277        // until one of:
2278        // * There's no data in flight
2279        // * We can send a full packet
2280        // * We have all the data we'll ever send (we're closing send)
2281        if self.nagle && data_in_flight && !can_send_full && !want_fin {
2282            can_send = false;
2283        }
2284
2285        // Can we actually send the FIN? We can send it if:
2286        // 1. We have unsent data that fits in the remote window.
2287        // 2. We have no unsent data.
2288        // This condition matches only if #2, because #1 is already covered by can_data and we're ORing them.
2289        let can_fin = want_fin && self.remote_last_seq == self.local_seq_no + self.tx_buffer.len();
2290
2291        can_send || can_fin
2292    }
2293
2294    fn delayed_ack_expired(&self, timestamp: Instant) -> bool {
2295        match self.ack_delay_timer {
2296            AckDelayTimer::Idle => true,
2297            AckDelayTimer::Waiting(t) => t <= timestamp,
2298            AckDelayTimer::Immediate => true,
2299        }
2300    }
2301
2302    fn ack_to_transmit(&self) -> bool {
2303        if let Some(remote_last_ack) = self.remote_last_ack {
2304            remote_last_ack < self.remote_seq_no + self.rx_buffer.len()
2305        } else {
2306            false
2307        }
2308    }
2309
2310    /// Return whether to send ACK immediately due to the amount of unacknowledged data.
2311    ///
2312    /// RFC 9293 states "An ACK SHOULD be generated for at least every second full-sized segment or
2313    /// 2*RMSS bytes of new data (where RMSS is the MSS specified by the TCP endpoint receiving the
2314    /// segments to be acknowledged, or the default value if not specified) (SHLD-19)."
2315    ///
2316    /// Note that the RFC above only says "at least 2*RMSS bytes", which is not a hard requirement.
2317    /// In practice, we follow the Linux kernel's empirical value of sending an ACK for every RMSS
2318    /// byte of new data. For details, see
2319    /// <https://elixir.bootlin.com/linux/v6.11.4/source/net/ipv4/tcp_input.c#L5747>.
2320    fn immediate_ack_to_transmit(&self) -> bool {
2321        if let Some(remote_last_ack) = self.remote_last_ack {
2322            remote_last_ack + self.remote_mss < self.remote_seq_no + self.rx_buffer.len()
2323        } else {
2324            false
2325        }
2326    }
2327
2328    /// Return whether we should send ACK immediately due to significant window updates.
2329    ///
2330    /// ACKs with significant window updates should be sent immediately to let the sender know that
2331    /// more data can be sent. According to the Linux kernel implementation, "significant" means
2332    /// doubling the receive window. The Linux kernel implementation can be found at
2333    /// <https://elixir.bootlin.com/linux/v6.9.9/source/net/ipv4/tcp.c#L1472>.
2334    fn window_to_update(&self) -> bool {
2335        match self.state {
2336            State::SynSent
2337            | State::SynReceived
2338            | State::Established
2339            | State::FinWait1
2340            | State::FinWait2 => {
2341                let new_win = self.scaled_window();
2342                if let Some(last_win) = self.last_scaled_window() {
2343                    new_win > 0 && new_win / 2 >= last_win
2344                } else {
2345                    false
2346                }
2347            }
2348            _ => false,
2349        }
2350    }
2351
2352    pub(crate) fn dispatch<F, E>(&mut self, cx: &mut Context, emit: F) -> Result<(), E>
2353    where
2354        F: FnOnce(&mut Context, (IpRepr, TcpRepr)) -> Result<(), E>,
2355    {
2356        if self.tuple.is_none() {
2357            return Ok(());
2358        }
2359
2360        // NOTE(unwrap): we check tuple is not None above.
2361        let tuple = self.tuple.unwrap();
2362
2363        // Check if the interface still has our source IP address.
2364        // If not (e.g. the interface's IP changed), reset the socket.
2365        // We use reset() instead of set_state(Closed) to avoid sending
2366        // an RST packet with the now-invalid source IP.
2367        if !cx.has_ip_addr(tuple.local.addr) {
2368            net_debug!("source IP address no longer available, closing socket");
2369            self.reset();
2370            return Ok(());
2371        }
2372
2373        if self.remote_last_ts.is_none() {
2374            // We get here in exactly two cases:
2375            //  1) This socket just transitioned into SYN-SENT.
2376            //  2) This socket had an empty transmit buffer and some data was added there.
2377            // Both are similar in that the socket has been quiet for an indefinite
2378            // period of time, it isn't anymore, and the local endpoint is talking.
2379            // So, we start counting the timeout not from the last received packet
2380            // but from the first transmitted one.
2381            self.remote_last_ts = Some(cx.now());
2382        }
2383
2384        self.congestion_controller
2385            .inner_mut()
2386            .pre_transmit(cx.now());
2387
2388        // Check if any state needs to be changed because of a timer.
2389        if self.timed_out(cx.now()) {
2390            // If a timeout expires, we should abort the connection.
2391            net_debug!("timeout exceeded");
2392            self.set_state(State::Closed);
2393        } else if !self.seq_to_transmit(cx) && self.timer.should_retransmit(cx.now()) {
2394            // If a retransmit timer expired, we should resend data starting at the last ACK.
2395            net_debug!("retransmitting");
2396
2397            // Rewind "last sequence number sent", as if we never
2398            // had sent them. This will cause all data in the queue
2399            // to be sent again.
2400            self.remote_last_seq = self.local_seq_no;
2401
2402            // Clear the `should_retransmit` state. If we can't retransmit right
2403            // now for whatever reason (like zero window), this avoids an
2404            // infinite polling loop where `poll_at` returns `Now` but `dispatch`
2405            // can't actually do anything.
2406            self.timer.set_for_idle(cx.now(), self.keep_alive);
2407
2408            // Inform RTTE, so that it can avoid bogus measurements.
2409            self.rtte.on_retransmit();
2410
2411            // Inform the congestion controller that we're retransmitting.
2412            self.congestion_controller
2413                .inner_mut()
2414                .on_retransmit(cx.now());
2415        }
2416
2417        #[cfg(feature = "socket-tcp-pause-synack")]
2418        if matches!(self.state, State::SynReceived) && self.synack_paused {
2419            return Ok(());
2420        }
2421
2422        // Decide whether we're sending a packet.
2423        if self.seq_to_transmit(cx) {
2424            // If we have data to transmit and it fits into partner's window, do it.
2425            tcp_trace!("outgoing segment will send data or flags");
2426        } else if self.ack_to_transmit() && self.delayed_ack_expired(cx.now()) {
2427            // If we have data to acknowledge, do it.
2428            tcp_trace!("outgoing segment will acknowledge");
2429        } else if self.window_to_update() {
2430            // If we have window length increase to advertise, do it.
2431            tcp_trace!("outgoing segment will update window");
2432        } else if self.state == State::Closed {
2433            // If we need to abort the connection, do it.
2434            tcp_trace!("outgoing segment will abort connection");
2435        } else if self.timer.should_keep_alive(cx.now()) {
2436            // If we need to transmit a keep-alive packet, do it.
2437            tcp_trace!("keep-alive timer expired");
2438        } else if self.timer.should_zero_window_probe(cx.now()) {
2439            tcp_trace!("sending zero-window probe");
2440        } else if self.timer.should_close(cx.now()) {
2441            // If we have spent enough time in the TIME-WAIT state, close the socket.
2442            tcp_trace!("TIME-WAIT timer expired");
2443            self.reset();
2444            return Ok(());
2445        } else {
2446            return Ok(());
2447        }
2448
2449        // Construct the lowered IP representation.
2450        // We might need this to calculate the MSS, so do it early.
2451        let mut ip_repr = IpRepr::new(
2452            tuple.local.addr,
2453            tuple.remote.addr,
2454            IpProtocol::Tcp,
2455            0,
2456            self.hop_limit.unwrap_or(64),
2457        );
2458
2459        // Construct the basic TCP representation, an empty ACK packet.
2460        // We'll adjust this to be more specific as needed.
2461        let mut repr = TcpRepr {
2462            src_port: tuple.local.port,
2463            dst_port: tuple.remote.port,
2464            control: TcpControl::None,
2465            seq_number: self.remote_last_seq,
2466            ack_number: Some(self.remote_seq_no + self.rx_buffer.len()),
2467            window_len: self.scaled_window(),
2468            window_scale: None,
2469            max_seg_size: None,
2470            sack_permitted: false,
2471            sack_ranges: [None, None, None],
2472            timestamp: TcpTimestampRepr::generate_reply_with_tsval(
2473                self.tsval_generator,
2474                self.last_remote_tsval,
2475            ),
2476            payload: &[],
2477        };
2478
2479        let mut is_zero_window_probe = false;
2480
2481        match self.state {
2482            // We transmit an RST in the CLOSED state. If we ended up in the CLOSED state
2483            // with a specified endpoint, it means that the socket was aborted.
2484            State::Closed => {
2485                repr.control = TcpControl::Rst;
2486            }
2487
2488            // We never transmit anything in the LISTEN state.
2489            State::Listen => return Ok(()),
2490
2491            // We transmit a SYN in the SYN-SENT state.
2492            // We transmit a SYN|ACK in the SYN-RECEIVED state.
2493            State::SynSent | State::SynReceived => {
2494                repr.control = TcpControl::Syn;
2495                repr.seq_number = self.local_seq_no;
2496                // window len must NOT be scaled in SYNs.
2497                repr.window_len = u16::try_from(self.rx_buffer.window()).unwrap_or(u16::MAX);
2498                if self.state == State::SynSent {
2499                    repr.ack_number = None;
2500                    repr.window_scale = Some(self.remote_win_shift);
2501                    repr.sack_permitted = true;
2502                } else {
2503                    repr.sack_permitted = self.remote_has_sack;
2504                    repr.window_scale = self.remote_win_scale.map(|_| self.remote_win_shift);
2505                }
2506            }
2507
2508            // We transmit data in all states where we may have data in the buffer,
2509            // or the transmit half of the connection is still open.
2510            State::Established
2511            | State::FinWait1
2512            | State::Closing
2513            | State::CloseWait
2514            | State::LastAck => {
2515                // Extract as much data as the remote side can receive in this packet
2516                // from the transmit buffer.
2517
2518                // Right edge of window, ie the max sequence number we're allowed to send.
2519                let win_right_edge = self.local_seq_no + self.remote_win_len;
2520
2521                // Max amount of octets we're allowed to send according to the remote window.
2522                let mut win_limit = if win_right_edge >= self.remote_last_seq {
2523                    win_right_edge - self.remote_last_seq
2524                } else {
2525                    // This can happen if we've sent some data and later the remote side
2526                    // has shrunk its window so that data is no longer inside the window.
2527                    // This should be very rare and is strongly discouraged by the RFCs,
2528                    // but it does happen in practice.
2529                    // http://www.tcpipguide.com/free/t_TCPWindowManagementIssues.htm
2530                    0
2531                };
2532
2533                // To send a zero-window-probe, force the window limit to at least 1 byte.
2534                if win_limit == 0 && self.timer.should_zero_window_probe(cx.now()) {
2535                    win_limit = 1;
2536                    is_zero_window_probe = true;
2537                }
2538
2539                // Maximum size we're allowed to send. This can be limited by 3 factors:
2540                // 1. remote window
2541                // 2. MSS the remote is willing to accept, probably determined by their MTU
2542                // 3. MSS we can send, determined by our MTU.
2543                let size = win_limit
2544                    .min(self.remote_mss)
2545                    .min(cx.ip_mtu() - ip_repr.header_len() - TCP_HEADER_LEN);
2546
2547                let offset = self.remote_last_seq - self.local_seq_no;
2548                repr.payload = self.tx_buffer.get_allocated(offset, size);
2549
2550                // If we've sent everything we had in the buffer, follow it with the PSH or FIN
2551                // flags, depending on whether the transmit half of the connection is open.
2552                if offset + repr.payload.len() == self.tx_buffer.len() {
2553                    match self.state {
2554                        State::FinWait1 | State::LastAck | State::Closing => {
2555                            repr.control = TcpControl::Fin
2556                        }
2557                        State::Established | State::CloseWait if !repr.payload.is_empty() => {
2558                            repr.control = TcpControl::Psh
2559                        }
2560                        _ => (),
2561                    }
2562                }
2563            }
2564
2565            // In FIN-WAIT-2 and TIME-WAIT states we may only transmit ACKs for incoming data or FIN
2566            State::FinWait2 | State::TimeWait => {}
2567        }
2568
2569        // There might be more than one reason to send a packet. E.g. the keep-alive timer
2570        // has expired, and we also have data in transmit buffer. Since any packet that occupies
2571        // sequence space will elicit an ACK, we only need to send an explicit packet if we
2572        // couldn't fill the sequence space with anything.
2573        let is_keep_alive;
2574        if self.timer.should_keep_alive(cx.now()) && repr.is_empty() {
2575            repr.seq_number = repr.seq_number - 1;
2576            repr.payload = b"\x00"; // RFC 1122 says we should do this
2577            is_keep_alive = true;
2578        } else {
2579            is_keep_alive = false;
2580        }
2581
2582        // Trace a summary of what will be sent.
2583        if is_keep_alive {
2584            tcp_trace!("sending a keep-alive");
2585        } else if !repr.payload.is_empty() {
2586            tcp_trace!(
2587                "tx buffer: sending {} octets at offset {}",
2588                repr.payload.len(),
2589                self.remote_last_seq - self.local_seq_no
2590            );
2591        }
2592        if repr.control != TcpControl::None || repr.payload.is_empty() {
2593            let flags = match (repr.control, repr.ack_number) {
2594                (TcpControl::Syn, None) => "SYN",
2595                (TcpControl::Syn, Some(_)) => "SYN|ACK",
2596                (TcpControl::Fin, Some(_)) => "FIN|ACK",
2597                (TcpControl::Rst, Some(_)) => "RST|ACK",
2598                (TcpControl::Psh, Some(_)) => "PSH|ACK",
2599                (TcpControl::None, Some(_)) => "ACK",
2600                _ => "<unreachable>",
2601            };
2602            tcp_trace!("sending {}", flags);
2603        }
2604
2605        if repr.control == TcpControl::Syn {
2606            // Fill the MSS option. See RFC 6691 for an explanation of this calculation.
2607            let max_segment_size = cx.ip_mtu() - ip_repr.header_len() - TCP_HEADER_LEN;
2608            repr.max_seg_size = Some(max_segment_size as u16);
2609        }
2610
2611        // Actually send the packet. If this succeeds, it means the packet is in
2612        // the device buffer, and its transmission is imminent. If not, we might have
2613        // a number of problems, e.g. we need neighbor discovery.
2614        //
2615        // Bailing out if the packet isn't placed in the device buffer allows us
2616        // to not waste time waiting for the retransmit timer on packets that we know
2617        // for sure will not be successfully transmitted.
2618        ip_repr.set_payload_len(repr.buffer_len());
2619        emit(cx, (ip_repr, repr))?;
2620
2621        // We've sent something, whether useful data or a keep-alive packet, so rewind
2622        // the keep-alive timer.
2623        self.timer.rewind_keep_alive(cx.now(), self.keep_alive);
2624
2625        // Reset delayed-ack timer
2626        match self.ack_delay_timer {
2627            AckDelayTimer::Idle => {}
2628            AckDelayTimer::Waiting(_) => {
2629                tcp_trace!("stop delayed ack timer")
2630            }
2631            AckDelayTimer::Immediate => {
2632                tcp_trace!("stop delayed ack timer (was force-expired)")
2633            }
2634        }
2635        self.ack_delay_timer = AckDelayTimer::Idle;
2636
2637        // Leave the rest of the state intact if sending a zero-window probe.
2638        if is_zero_window_probe {
2639            self.timer.rewind_zero_window_probe(cx.now());
2640            return Ok(());
2641        }
2642
2643        // Leave the rest of the state intact if sending a keep-alive packet, since those
2644        // carry a fake segment.
2645        if is_keep_alive {
2646            return Ok(());
2647        }
2648
2649        // We've sent a packet successfully, so we can update the internal state now.
2650        self.remote_last_seq = repr.seq_number + repr.segment_len();
2651        self.remote_last_ack = repr.ack_number;
2652        self.remote_last_win = repr.window_len;
2653
2654        if repr.segment_len() > 0 {
2655            self.rtte
2656                .on_send(cx.now(), repr.seq_number + repr.segment_len());
2657            self.congestion_controller
2658                .inner_mut()
2659                .post_transmit(cx.now(), repr.segment_len());
2660        }
2661
2662        if repr.segment_len() > 0 && !self.timer.is_retransmit() {
2663            // RFC 6298 (5.1) Every time a packet containing data is sent (including a
2664            // retransmission), if the timer is not running, start it running
2665            // so that it will expire after RTO seconds.
2666            let rto = self.rtte.retransmission_timeout();
2667            self.timer.set_for_retransmit(cx.now(), rto);
2668        }
2669
2670        if self.state == State::Closed {
2671            // When aborting a connection, forget about it after sending a single RST packet.
2672            self.tuple = None;
2673            #[cfg(feature = "async")]
2674            {
2675                // Wake tx now so that async users can wait for the RST to be sent
2676                self.tx_waker.wake();
2677            }
2678        }
2679
2680        Ok(())
2681    }
2682
2683    #[allow(clippy::if_same_then_else)]
2684    pub(crate) fn poll_at(&self, cx: &mut Context) -> PollAt {
2685        // The logic here mirrors the beginning of dispatch() closely.
2686        if self.tuple.is_none() {
2687            // No one to talk to, nothing to transmit.
2688            PollAt::Ingress
2689        } else if self.remote_last_ts.is_none() {
2690            // Socket stopped being quiet recently, we need to acquire a timestamp.
2691            PollAt::Now
2692        } else if self.state == State::Closed {
2693            // Socket was aborted, we have an RST packet to transmit.
2694            PollAt::Now
2695        } else if self.seq_to_transmit(cx) {
2696            // We have a data or flag packet to transmit.
2697            PollAt::Now
2698        } else if self.window_to_update() {
2699            // The receive window has been raised significantly.
2700            PollAt::Now
2701        } else {
2702            let want_ack = self.ack_to_transmit();
2703
2704            let delayed_ack_poll_at = match (want_ack, self.ack_delay_timer) {
2705                (false, _) => PollAt::Ingress,
2706                (true, AckDelayTimer::Idle) => PollAt::Now,
2707                (true, AckDelayTimer::Waiting(t)) => PollAt::Time(t),
2708                (true, AckDelayTimer::Immediate) => PollAt::Now,
2709            };
2710
2711            let timeout_poll_at = match (self.remote_last_ts, self.timeout) {
2712                // If we're transmitting or retransmitting data, we need to poll at the moment
2713                // when the timeout would expire.
2714                (Some(remote_last_ts), Some(timeout)) => PollAt::Time(remote_last_ts + timeout),
2715                // Otherwise we have no timeout.
2716                (_, _) => PollAt::Ingress,
2717            };
2718
2719            // We wait for the earliest of our timers to fire.
2720            *[self.timer.poll_at(), timeout_poll_at, delayed_ack_poll_at]
2721                .iter()
2722                .min()
2723                .unwrap_or(&PollAt::Ingress)
2724        }
2725    }
2726}
2727
2728impl<'a> fmt::Write for Socket<'a> {
2729    fn write_str(&mut self, slice: &str) -> fmt::Result {
2730        let slice = slice.as_bytes();
2731        if self.send_slice(slice) == Ok(slice.len()) {
2732            Ok(())
2733        } else {
2734            Err(fmt::Error)
2735        }
2736    }
2737}
2738
2739// TODO: TCP should work for all features. For now, we only test with the IP feature. We could do
2740// it for other features as well with rstest, however, this means we have to modify a lot of the
2741// tests in here, which I didn't had the time for at the moment.
2742#[cfg(all(test, feature = "medium-ip"))]
2743mod test {
2744    use super::*;
2745    use crate::config::IFACE_MAX_ADDR_COUNT;
2746    use crate::wire::{IpCidr, IpRepr};
2747    use std::ops::{Deref, DerefMut};
2748    use std::vec::Vec;
2749
2750    // =========================================================================================//
2751    // Constants
2752    // =========================================================================================//
2753
2754    const LOCAL_PORT: u16 = 80;
2755    const REMOTE_PORT: u16 = 49500;
2756    const LISTEN_END: IpListenEndpoint = IpListenEndpoint {
2757        addr: None,
2758        port: LOCAL_PORT,
2759    };
2760    const TUPLE: Tuple = Tuple {
2761        local: LOCAL_END,
2762        remote: REMOTE_END,
2763    };
2764    const LOCAL_SEQ: TcpSeqNumber = TcpSeqNumber(10000);
2765    const REMOTE_SEQ: TcpSeqNumber = TcpSeqNumber(-10001);
2766
2767    cfg_if::cfg_if! {
2768        if #[cfg(feature = "proto-ipv4")] {
2769            use crate::wire::Ipv4Address as IpvXAddress;
2770            use crate::wire::Ipv4Repr as IpvXRepr;
2771            use IpRepr::Ipv4 as IpReprIpvX;
2772
2773            const LOCAL_ADDR: IpvXAddress = IpvXAddress::new(192, 168, 1, 1);
2774            const REMOTE_ADDR: IpvXAddress = IpvXAddress::new(192, 168, 1, 2);
2775            const OTHER_ADDR: IpvXAddress = IpvXAddress::new(192, 168, 1, 3);
2776
2777            const BASE_MSS: u16 = 1460;
2778
2779            const LOCAL_END: IpEndpoint = IpEndpoint {
2780                addr: IpAddress::Ipv4(LOCAL_ADDR),
2781                port: LOCAL_PORT,
2782            };
2783            const REMOTE_END: IpEndpoint = IpEndpoint {
2784                addr: IpAddress::Ipv4(REMOTE_ADDR),
2785                port: REMOTE_PORT,
2786            };
2787        } else {
2788            use crate::wire::Ipv6Address as IpvXAddress;
2789            use crate::wire::Ipv6Repr as IpvXRepr;
2790            use IpRepr::Ipv6 as IpReprIpvX;
2791
2792            const LOCAL_ADDR: IpvXAddress = IpvXAddress::new(0xfe80, 0, 0, 0, 0, 0, 0, 1);
2793            const REMOTE_ADDR: IpvXAddress = IpvXAddress::new(0xfe80, 0, 0, 0, 0, 0, 0, 2);
2794            const OTHER_ADDR: IpvXAddress = IpvXAddress::new(0xfe80, 0, 0, 0, 0, 0, 0, 3);
2795
2796            const BASE_MSS: u16 = 1440;
2797
2798            const LOCAL_END: IpEndpoint = IpEndpoint {
2799                addr: IpAddress::Ipv6(LOCAL_ADDR),
2800                port: LOCAL_PORT,
2801            };
2802            const REMOTE_END: IpEndpoint = IpEndpoint {
2803                addr: IpAddress::Ipv6(REMOTE_ADDR),
2804                port: REMOTE_PORT,
2805            };
2806        }
2807    }
2808
2809    const SEND_IP_TEMPL: IpRepr = IpReprIpvX(IpvXRepr {
2810        src_addr: LOCAL_ADDR,
2811        dst_addr: REMOTE_ADDR,
2812        next_header: IpProtocol::Tcp,
2813        payload_len: 20,
2814        hop_limit: 64,
2815    });
2816    const SEND_TEMPL: TcpRepr<'static> = TcpRepr {
2817        src_port: REMOTE_PORT,
2818        dst_port: LOCAL_PORT,
2819        control: TcpControl::None,
2820        seq_number: TcpSeqNumber(0),
2821        ack_number: Some(TcpSeqNumber(0)),
2822        window_len: 256,
2823        window_scale: None,
2824        max_seg_size: None,
2825        sack_permitted: false,
2826        sack_ranges: [None, None, None],
2827        timestamp: None,
2828        payload: &[],
2829    };
2830    const _RECV_IP_TEMPL: IpRepr = IpReprIpvX(IpvXRepr {
2831        src_addr: LOCAL_ADDR,
2832        dst_addr: REMOTE_ADDR,
2833        next_header: IpProtocol::Tcp,
2834        payload_len: 20,
2835        hop_limit: 64,
2836    });
2837    const RECV_TEMPL: TcpRepr<'static> = TcpRepr {
2838        src_port: LOCAL_PORT,
2839        dst_port: REMOTE_PORT,
2840        control: TcpControl::None,
2841        seq_number: TcpSeqNumber(0),
2842        ack_number: Some(TcpSeqNumber(0)),
2843        window_len: 64,
2844        window_scale: None,
2845        max_seg_size: None,
2846        sack_permitted: false,
2847        sack_ranges: [None, None, None],
2848        timestamp: None,
2849        payload: &[],
2850    };
2851
2852    // =========================================================================================//
2853    // Helper functions
2854    // =========================================================================================//
2855
2856    struct TestSocket {
2857        socket: Socket<'static>,
2858        cx: Context,
2859    }
2860
2861    impl Deref for TestSocket {
2862        type Target = Socket<'static>;
2863        fn deref(&self) -> &Self::Target {
2864            &self.socket
2865        }
2866    }
2867
2868    impl DerefMut for TestSocket {
2869        fn deref_mut(&mut self) -> &mut Self::Target {
2870            &mut self.socket
2871        }
2872    }
2873
2874    #[track_caller]
2875    fn send(
2876        socket: &mut TestSocket,
2877        timestamp: Instant,
2878        repr: &TcpRepr,
2879    ) -> Option<TcpRepr<'static>> {
2880        socket.cx.set_now(timestamp);
2881
2882        let ip_repr = IpReprIpvX(IpvXRepr {
2883            src_addr: REMOTE_ADDR,
2884            dst_addr: LOCAL_ADDR,
2885            next_header: IpProtocol::Tcp,
2886            payload_len: repr.buffer_len(),
2887            hop_limit: 64,
2888        });
2889        net_trace!("send: {}", repr);
2890
2891        assert!(socket.socket.accepts(&mut socket.cx, &ip_repr, repr));
2892
2893        match socket.socket.process(&mut socket.cx, &ip_repr, repr) {
2894            Some((_ip_repr, repr)) => {
2895                net_trace!("recv: {}", repr);
2896                Some(repr)
2897            }
2898            None => None,
2899        }
2900    }
2901
2902    #[track_caller]
2903    fn recv<F>(socket: &mut TestSocket, timestamp: Instant, mut f: F)
2904    where
2905        F: FnMut(Result<TcpRepr, ()>),
2906    {
2907        socket.cx.set_now(timestamp);
2908
2909        let mut sent = 0;
2910        let result = socket
2911            .socket
2912            .dispatch(&mut socket.cx, |_, (ip_repr, tcp_repr)| {
2913                assert_eq!(ip_repr.next_header(), IpProtocol::Tcp);
2914                assert_eq!(ip_repr.src_addr(), LOCAL_ADDR.into());
2915                assert_eq!(ip_repr.dst_addr(), REMOTE_ADDR.into());
2916                assert_eq!(ip_repr.payload_len(), tcp_repr.buffer_len());
2917
2918                net_trace!("recv: {}", tcp_repr);
2919                sent += 1;
2920                Ok(f(Ok(tcp_repr)))
2921            });
2922        match result {
2923            Ok(()) => assert_eq!(sent, 1, "Exactly one packet should be sent"),
2924            Err(e) => f(Err(e)),
2925        }
2926    }
2927
2928    #[track_caller]
2929    fn recv_nothing(socket: &mut TestSocket, timestamp: Instant) {
2930        socket.cx.set_now(timestamp);
2931
2932        let mut fail = false;
2933        let result: Result<(), ()> = socket.socket.dispatch(&mut socket.cx, |_, _| {
2934            fail = true;
2935            Ok(())
2936        });
2937        if fail {
2938            panic!("Should not send a packet")
2939        }
2940
2941        assert_eq!(result, Ok(()))
2942    }
2943
2944    #[collapse_debuginfo(yes)]
2945    macro_rules! send {
2946        ($socket:ident, $repr:expr) =>
2947            (send!($socket, time 0, $repr));
2948        ($socket:ident, $repr:expr, $result:expr) =>
2949            (send!($socket, time 0, $repr, $result));
2950        ($socket:ident, time $time:expr, $repr:expr) =>
2951            (send!($socket, time $time, $repr, None));
2952        ($socket:ident, time $time:expr, $repr:expr, $result:expr) =>
2953            (assert_eq!(send(&mut $socket, Instant::from_millis($time), &$repr), $result));
2954    }
2955
2956    #[collapse_debuginfo(yes)]
2957    macro_rules! recv {
2958        ($socket:ident, [$( $repr:expr ),*]) => ({
2959            $( recv!($socket, Ok($repr)); )*
2960            recv_nothing!($socket)
2961        });
2962        ($socket:ident, time $time:expr, [$( $repr:expr ),*]) => ({
2963            $( recv!($socket, time $time, Ok($repr)); )*
2964            recv_nothing!($socket, time $time)
2965        });
2966        ($socket:ident, $result:expr) =>
2967            (recv!($socket, time 0, $result));
2968        ($socket:ident, time $time:expr, $result:expr) =>
2969            (recv(&mut $socket, Instant::from_millis($time), |result| {
2970                // Most of the time we don't care about the PSH flag.
2971                let result = result.map(|mut repr| {
2972                    repr.control = repr.control.quash_psh();
2973                    repr
2974                });
2975                assert_eq!(result, $result)
2976            }));
2977        ($socket:ident, time $time:expr, $result:expr, exact) =>
2978            (recv(&mut $socket, Instant::from_millis($time), |repr| assert_eq!(repr, $result)));
2979    }
2980
2981    #[collapse_debuginfo(yes)]
2982    macro_rules! recv_nothing {
2983        ($socket:ident) => (recv_nothing!($socket, time 0));
2984        ($socket:ident, time $time:expr) => (recv_nothing(&mut $socket, Instant::from_millis($time)));
2985    }
2986
2987    #[collapse_debuginfo(yes)]
2988    macro_rules! sanity {
2989        ($socket1:expr, $socket2:expr) => {{
2990            let (s1, s2) = ($socket1, $socket2);
2991            assert_eq!(s1.state, s2.state, "state");
2992            assert_eq!(s1.tuple, s2.tuple, "tuple");
2993            assert_eq!(s1.local_seq_no, s2.local_seq_no, "local_seq_no");
2994            assert_eq!(s1.remote_seq_no, s2.remote_seq_no, "remote_seq_no");
2995            assert_eq!(s1.remote_last_seq, s2.remote_last_seq, "remote_last_seq");
2996            assert_eq!(s1.remote_last_ack, s2.remote_last_ack, "remote_last_ack");
2997            assert_eq!(s1.remote_last_win, s2.remote_last_win, "remote_last_win");
2998            assert_eq!(s1.remote_win_len, s2.remote_win_len, "remote_win_len");
2999            assert_eq!(s1.timer, s2.timer, "timer");
3000        }};
3001    }
3002
3003    fn socket() -> TestSocket {
3004        socket_with_buffer_sizes(64, 64)
3005    }
3006
3007    fn socket_with_buffer_sizes(tx_len: usize, rx_len: usize) -> TestSocket {
3008        let (iface, _, _) = crate::tests::setup(crate::phy::Medium::Ip);
3009
3010        let rx_buffer = SocketBuffer::new(vec![0; rx_len]);
3011        let tx_buffer = SocketBuffer::new(vec![0; tx_len]);
3012        let mut socket = Socket::new(rx_buffer, tx_buffer);
3013        socket.set_ack_delay(None);
3014        TestSocket {
3015            socket,
3016            cx: iface.inner,
3017        }
3018    }
3019
3020    fn socket_syn_received_with_buffer_sizes(tx_len: usize, rx_len: usize) -> TestSocket {
3021        let mut s = socket_with_buffer_sizes(tx_len, rx_len);
3022        s.state = State::SynReceived;
3023        s.tuple = Some(TUPLE);
3024        s.local_seq_no = LOCAL_SEQ;
3025        s.remote_seq_no = REMOTE_SEQ + 1;
3026        s.remote_last_seq = LOCAL_SEQ;
3027        s.remote_win_len = 256;
3028        s
3029    }
3030
3031    fn socket_syn_received() -> TestSocket {
3032        socket_syn_received_with_buffer_sizes(64, 64)
3033    }
3034
3035    fn socket_syn_sent_with_buffer_sizes(tx_len: usize, rx_len: usize) -> TestSocket {
3036        let mut s = socket_with_buffer_sizes(tx_len, rx_len);
3037        s.state = State::SynSent;
3038        s.tuple = Some(TUPLE);
3039        s.local_seq_no = LOCAL_SEQ;
3040        s.remote_last_seq = LOCAL_SEQ;
3041        s
3042    }
3043
3044    fn socket_syn_sent() -> TestSocket {
3045        socket_syn_sent_with_buffer_sizes(64, 64)
3046    }
3047
3048    fn socket_established_with_buffer_sizes(tx_len: usize, rx_len: usize) -> TestSocket {
3049        let mut s = socket_syn_received_with_buffer_sizes(tx_len, rx_len);
3050        s.state = State::Established;
3051        s.local_seq_no = LOCAL_SEQ + 1;
3052        s.remote_last_seq = LOCAL_SEQ + 1;
3053        s.remote_last_ack = Some(REMOTE_SEQ + 1);
3054        s.remote_last_win = s.scaled_window();
3055        s
3056    }
3057
3058    fn socket_established() -> TestSocket {
3059        socket_established_with_buffer_sizes(64, 64)
3060    }
3061
3062    fn socket_fin_wait_1() -> TestSocket {
3063        let mut s = socket_established();
3064        s.state = State::FinWait1;
3065        s
3066    }
3067
3068    fn socket_fin_wait_2() -> TestSocket {
3069        let mut s = socket_fin_wait_1();
3070        s.state = State::FinWait2;
3071        s.local_seq_no = LOCAL_SEQ + 1 + 1;
3072        s.remote_last_seq = LOCAL_SEQ + 1 + 1;
3073        s
3074    }
3075
3076    fn socket_closing() -> TestSocket {
3077        let mut s = socket_fin_wait_1();
3078        s.state = State::Closing;
3079        s.remote_last_seq = LOCAL_SEQ + 1 + 1;
3080        s.remote_seq_no = REMOTE_SEQ + 1 + 1;
3081        s.timer = Timer::Retransmit {
3082            expires_at: Instant::from_millis_const(1000),
3083        };
3084        s
3085    }
3086
3087    fn socket_time_wait(from_closing: bool) -> TestSocket {
3088        let mut s = socket_fin_wait_2();
3089        s.state = State::TimeWait;
3090        s.remote_seq_no = REMOTE_SEQ + 1 + 1;
3091        if from_closing {
3092            s.remote_last_ack = Some(REMOTE_SEQ + 1 + 1);
3093        }
3094        s.timer = Timer::Close {
3095            expires_at: Instant::from_secs(1) + CLOSE_DELAY,
3096        };
3097        s
3098    }
3099
3100    fn socket_close_wait() -> TestSocket {
3101        let mut s = socket_established();
3102        s.state = State::CloseWait;
3103        s.remote_seq_no = REMOTE_SEQ + 1 + 1;
3104        s.remote_last_ack = Some(REMOTE_SEQ + 1 + 1);
3105        s
3106    }
3107
3108    fn socket_last_ack() -> TestSocket {
3109        let mut s = socket_close_wait();
3110        s.state = State::LastAck;
3111        s
3112    }
3113
3114    fn socket_recved() -> TestSocket {
3115        let mut s = socket_established();
3116        send!(
3117            s,
3118            TcpRepr {
3119                seq_number: REMOTE_SEQ + 1,
3120                ack_number: Some(LOCAL_SEQ + 1),
3121                payload: &b"abcdef"[..],
3122                ..SEND_TEMPL
3123            }
3124        );
3125        recv!(
3126            s,
3127            [TcpRepr {
3128                seq_number: LOCAL_SEQ + 1,
3129                ack_number: Some(REMOTE_SEQ + 1 + 6),
3130                window_len: 58,
3131                ..RECV_TEMPL
3132            }]
3133        );
3134        s
3135    }
3136
3137    // =========================================================================================//
3138    // Tests for the CLOSED state.
3139    // =========================================================================================//
3140    #[test]
3141    fn test_closed_reject() {
3142        let mut s = socket();
3143        assert_eq!(s.state, State::Closed);
3144
3145        let tcp_repr = TcpRepr {
3146            control: TcpControl::Syn,
3147            ..SEND_TEMPL
3148        };
3149        assert!(!s.socket.accepts(&mut s.cx, &SEND_IP_TEMPL, &tcp_repr));
3150    }
3151
3152    #[test]
3153    fn test_closed_reject_after_listen() {
3154        let mut s = socket();
3155        s.listen(LOCAL_END).unwrap();
3156        s.close();
3157
3158        let tcp_repr = TcpRepr {
3159            control: TcpControl::Syn,
3160            ..SEND_TEMPL
3161        };
3162        assert!(!s.socket.accepts(&mut s.cx, &SEND_IP_TEMPL, &tcp_repr));
3163    }
3164
3165    #[test]
3166    fn test_closed_close() {
3167        let mut s = socket();
3168        s.close();
3169        assert_eq!(s.state, State::Closed);
3170    }
3171
3172    // =========================================================================================//
3173    // Tests for the LISTEN state.
3174    // =========================================================================================//
3175    fn socket_listen() -> TestSocket {
3176        let mut s = socket();
3177        s.state = State::Listen;
3178        s.listen_endpoint = LISTEN_END;
3179        s
3180    }
3181
3182    #[test]
3183    fn test_listen_sack_option() {
3184        let mut s = socket_listen();
3185        send!(
3186            s,
3187            TcpRepr {
3188                control: TcpControl::Syn,
3189                seq_number: REMOTE_SEQ,
3190                ack_number: None,
3191                sack_permitted: false,
3192                ..SEND_TEMPL
3193            }
3194        );
3195        assert!(!s.remote_has_sack);
3196        recv!(
3197            s,
3198            [TcpRepr {
3199                control: TcpControl::Syn,
3200                seq_number: LOCAL_SEQ,
3201                ack_number: Some(REMOTE_SEQ + 1),
3202                max_seg_size: Some(BASE_MSS),
3203                ..RECV_TEMPL
3204            }]
3205        );
3206
3207        let mut s = socket_listen();
3208        send!(
3209            s,
3210            TcpRepr {
3211                control: TcpControl::Syn,
3212                seq_number: REMOTE_SEQ,
3213                ack_number: None,
3214                sack_permitted: true,
3215                ..SEND_TEMPL
3216            }
3217        );
3218        assert!(s.remote_has_sack);
3219        recv!(
3220            s,
3221            [TcpRepr {
3222                control: TcpControl::Syn,
3223                seq_number: LOCAL_SEQ,
3224                ack_number: Some(REMOTE_SEQ + 1),
3225                max_seg_size: Some(BASE_MSS),
3226                sack_permitted: true,
3227                ..RECV_TEMPL
3228            }]
3229        );
3230    }
3231
3232    #[test]
3233    fn test_listen_syn_win_scale_buffers() {
3234        for (buffer_size, shift_amt) in &[
3235            (64, 0),
3236            (128, 0),
3237            (1024, 0),
3238            (65535, 0),
3239            (65536, 1),
3240            (65537, 1),
3241            (131071, 1),
3242            (131072, 2),
3243            (524287, 3),
3244            (524288, 4),
3245            (655350, 4),
3246            (1048576, 5),
3247        ] {
3248            let mut s = socket_with_buffer_sizes(64, *buffer_size);
3249            s.state = State::Listen;
3250            s.listen_endpoint = LISTEN_END;
3251            assert_eq!(s.remote_win_shift, *shift_amt);
3252            send!(
3253                s,
3254                TcpRepr {
3255                    control: TcpControl::Syn,
3256                    seq_number: REMOTE_SEQ,
3257                    ack_number: None,
3258                    window_scale: Some(0),
3259                    ..SEND_TEMPL
3260                }
3261            );
3262            assert_eq!(s.remote_win_shift, *shift_amt);
3263            recv!(
3264                s,
3265                [TcpRepr {
3266                    control: TcpControl::Syn,
3267                    seq_number: LOCAL_SEQ,
3268                    ack_number: Some(REMOTE_SEQ + 1),
3269                    max_seg_size: Some(BASE_MSS),
3270                    window_scale: Some(*shift_amt),
3271                    window_len: u16::try_from(*buffer_size).unwrap_or(u16::MAX),
3272                    ..RECV_TEMPL
3273                }]
3274            );
3275        }
3276    }
3277
3278    #[test]
3279    fn test_listen_sanity() {
3280        let mut s = socket();
3281        s.listen(LOCAL_PORT).unwrap();
3282        sanity!(s, socket_listen());
3283    }
3284
3285    #[test]
3286    fn test_listen_validation() {
3287        let mut s = socket();
3288        assert_eq!(s.listen(0), Err(ListenError::Unaddressable));
3289    }
3290
3291    #[test]
3292    fn test_listen_twice() {
3293        let mut s = socket();
3294        assert_eq!(s.listen(80), Ok(()));
3295        // multiple calls to listen are okay if its the same local endpoint and the state is still in listening
3296        assert_eq!(s.listen(80), Ok(()));
3297        s.set_state(State::SynReceived); // state change, simulate incoming connection
3298        assert_eq!(s.listen(80), Err(ListenError::InvalidState));
3299    }
3300
3301    #[test]
3302    fn test_listen_syn() {
3303        let mut s = socket_listen();
3304        send!(
3305            s,
3306            TcpRepr {
3307                control: TcpControl::Syn,
3308                seq_number: REMOTE_SEQ,
3309                ack_number: None,
3310                ..SEND_TEMPL
3311            }
3312        );
3313        sanity!(s, socket_syn_received());
3314    }
3315
3316    #[test]
3317    fn test_listen_syn_reject_ack() {
3318        let mut s = socket_listen();
3319
3320        let tcp_repr = TcpRepr {
3321            control: TcpControl::Syn,
3322            seq_number: REMOTE_SEQ,
3323            ack_number: Some(LOCAL_SEQ),
3324            ..SEND_TEMPL
3325        };
3326        assert!(!s.socket.accepts(&mut s.cx, &SEND_IP_TEMPL, &tcp_repr));
3327
3328        assert_eq!(s.state, State::Listen);
3329    }
3330
3331    #[test]
3332    fn test_listen_rst() {
3333        let mut s = socket_listen();
3334        let tcp_repr = TcpRepr {
3335            control: TcpControl::Rst,
3336            seq_number: REMOTE_SEQ,
3337            ack_number: None,
3338            ..SEND_TEMPL
3339        };
3340        assert!(!s.socket.accepts(&mut s.cx, &SEND_IP_TEMPL, &tcp_repr));
3341        assert_eq!(s.state, State::Listen);
3342    }
3343
3344    #[test]
3345    fn test_listen_close() {
3346        let mut s = socket_listen();
3347        s.close();
3348        assert_eq!(s.state, State::Closed);
3349    }
3350
3351    // =========================================================================================//
3352    // Tests for the SYN-RECEIVED state.
3353    // =========================================================================================//
3354
3355    #[test]
3356    fn test_syn_received_ack() {
3357        let mut s = socket_syn_received();
3358        recv!(
3359            s,
3360            [TcpRepr {
3361                control: TcpControl::Syn,
3362                seq_number: LOCAL_SEQ,
3363                ack_number: Some(REMOTE_SEQ + 1),
3364                max_seg_size: Some(BASE_MSS),
3365                ..RECV_TEMPL
3366            }]
3367        );
3368        send!(
3369            s,
3370            TcpRepr {
3371                seq_number: REMOTE_SEQ + 1,
3372                ack_number: Some(LOCAL_SEQ + 1),
3373                ..SEND_TEMPL
3374            }
3375        );
3376        assert_eq!(s.state, State::Established);
3377        sanity!(s, socket_established());
3378    }
3379
3380    #[cfg(feature = "socket-tcp-pause-synack")]
3381    #[test]
3382    fn test_syn_paused_ack() {
3383        let mut s = socket_syn_received();
3384
3385        s.pause_synack(true);
3386        recv_nothing!(s);
3387        assert_eq!(s.state, State::SynReceived);
3388
3389        s.pause_synack(false);
3390        recv!(
3391            s,
3392            [TcpRepr {
3393                control: TcpControl::Syn,
3394                seq_number: LOCAL_SEQ,
3395                ack_number: Some(REMOTE_SEQ + 1),
3396                max_seg_size: Some(BASE_MSS),
3397                ..RECV_TEMPL
3398            }]
3399        );
3400        send!(
3401            s,
3402            TcpRepr {
3403                seq_number: REMOTE_SEQ + 1,
3404                ack_number: Some(LOCAL_SEQ + 1),
3405                ..SEND_TEMPL
3406            }
3407        );
3408        assert_eq!(s.state, State::Established);
3409    }
3410
3411    #[test]
3412    fn test_syn_received_ack_too_low() {
3413        let mut s = socket_syn_received();
3414        recv!(
3415            s,
3416            [TcpRepr {
3417                control: TcpControl::Syn,
3418                seq_number: LOCAL_SEQ,
3419                ack_number: Some(REMOTE_SEQ + 1),
3420                max_seg_size: Some(BASE_MSS),
3421                ..RECV_TEMPL
3422            }]
3423        );
3424        send!(
3425            s,
3426            TcpRepr {
3427                seq_number: REMOTE_SEQ + 1,
3428                ack_number: Some(LOCAL_SEQ), // wrong
3429                ..SEND_TEMPL
3430            },
3431            Some(TcpRepr {
3432                control: TcpControl::Rst,
3433                seq_number: LOCAL_SEQ,
3434                ack_number: None,
3435                window_len: 0,
3436                ..RECV_TEMPL
3437            })
3438        );
3439        assert_eq!(s.state, State::SynReceived);
3440    }
3441
3442    #[test]
3443    fn test_syn_received_ack_too_high() {
3444        let mut s = socket_syn_received();
3445        recv!(
3446            s,
3447            [TcpRepr {
3448                control: TcpControl::Syn,
3449                seq_number: LOCAL_SEQ,
3450                ack_number: Some(REMOTE_SEQ + 1),
3451                max_seg_size: Some(BASE_MSS),
3452                ..RECV_TEMPL
3453            }]
3454        );
3455        send!(
3456            s,
3457            TcpRepr {
3458                seq_number: REMOTE_SEQ + 1,
3459                ack_number: Some(LOCAL_SEQ + 2), // wrong
3460                ..SEND_TEMPL
3461            },
3462            Some(TcpRepr {
3463                control: TcpControl::Rst,
3464                seq_number: LOCAL_SEQ + 2,
3465                ack_number: None,
3466                window_len: 0,
3467                ..RECV_TEMPL
3468            })
3469        );
3470        assert_eq!(s.state, State::SynReceived);
3471    }
3472
3473    #[test]
3474    fn test_syn_received_fin() {
3475        let mut s = socket_syn_received();
3476        recv!(
3477            s,
3478            [TcpRepr {
3479                control: TcpControl::Syn,
3480                seq_number: LOCAL_SEQ,
3481                ack_number: Some(REMOTE_SEQ + 1),
3482                max_seg_size: Some(BASE_MSS),
3483                ..RECV_TEMPL
3484            }]
3485        );
3486        send!(
3487            s,
3488            TcpRepr {
3489                control: TcpControl::Fin,
3490                seq_number: REMOTE_SEQ + 1,
3491                ack_number: Some(LOCAL_SEQ + 1),
3492                payload: &b"abcdef"[..],
3493                ..SEND_TEMPL
3494            }
3495        );
3496        recv!(
3497            s,
3498            [TcpRepr {
3499                seq_number: LOCAL_SEQ + 1,
3500                ack_number: Some(REMOTE_SEQ + 1 + 6 + 1),
3501                window_len: 58,
3502                ..RECV_TEMPL
3503            }]
3504        );
3505        assert_eq!(s.state, State::CloseWait);
3506
3507        let mut s2 = socket_close_wait();
3508        s2.remote_last_ack = Some(REMOTE_SEQ + 1 + 6 + 1);
3509        s2.remote_last_win = 58;
3510        sanity!(s, s2);
3511    }
3512
3513    #[test]
3514    fn test_syn_received_rst() {
3515        let mut s = socket_syn_received();
3516        s.listen_endpoint = LISTEN_END;
3517        recv!(
3518            s,
3519            [TcpRepr {
3520                control: TcpControl::Syn,
3521                seq_number: LOCAL_SEQ,
3522                ack_number: Some(REMOTE_SEQ + 1),
3523                max_seg_size: Some(BASE_MSS),
3524                ..RECV_TEMPL
3525            }]
3526        );
3527        send!(
3528            s,
3529            TcpRepr {
3530                control: TcpControl::Rst,
3531                seq_number: REMOTE_SEQ + 1,
3532                ack_number: Some(LOCAL_SEQ),
3533                ..SEND_TEMPL
3534            }
3535        );
3536        assert_eq!(s.state, State::Listen);
3537        assert_eq!(s.listen_endpoint, LISTEN_END);
3538        assert_eq!(s.tuple, None);
3539    }
3540
3541    #[test]
3542    fn test_syn_received_no_window_scaling() {
3543        let mut s = socket_listen();
3544        send!(
3545            s,
3546            TcpRepr {
3547                control: TcpControl::Syn,
3548                seq_number: REMOTE_SEQ,
3549                ack_number: None,
3550                ..SEND_TEMPL
3551            }
3552        );
3553        assert_eq!(s.state(), State::SynReceived);
3554        assert_eq!(s.tuple, Some(TUPLE));
3555        recv!(
3556            s,
3557            [TcpRepr {
3558                control: TcpControl::Syn,
3559                seq_number: LOCAL_SEQ,
3560                ack_number: Some(REMOTE_SEQ + 1),
3561                max_seg_size: Some(BASE_MSS),
3562                window_scale: None,
3563                ..RECV_TEMPL
3564            }]
3565        );
3566        send!(
3567            s,
3568            TcpRepr {
3569                seq_number: REMOTE_SEQ + 1,
3570                ack_number: Some(LOCAL_SEQ + 1),
3571                window_scale: None,
3572                ..SEND_TEMPL
3573            }
3574        );
3575        assert_eq!(s.remote_win_shift, 0);
3576        assert_eq!(s.remote_win_scale, None);
3577    }
3578
3579    #[test]
3580    fn test_syn_received_window_scaling() {
3581        for scale in 0..14 {
3582            let mut s = socket_listen();
3583            send!(
3584                s,
3585                TcpRepr {
3586                    control: TcpControl::Syn,
3587                    seq_number: REMOTE_SEQ,
3588                    ack_number: None,
3589                    window_scale: Some(scale),
3590                    ..SEND_TEMPL
3591                }
3592            );
3593            assert_eq!(s.state(), State::SynReceived);
3594            assert_eq!(s.tuple, Some(TUPLE));
3595            recv!(
3596                s,
3597                [TcpRepr {
3598                    control: TcpControl::Syn,
3599                    seq_number: LOCAL_SEQ,
3600                    ack_number: Some(REMOTE_SEQ + 1),
3601                    max_seg_size: Some(BASE_MSS),
3602                    window_scale: Some(0),
3603                    ..RECV_TEMPL
3604                }]
3605            );
3606            send!(
3607                s,
3608                TcpRepr {
3609                    seq_number: REMOTE_SEQ + 1,
3610                    ack_number: Some(LOCAL_SEQ + 1),
3611                    window_scale: None,
3612                    ..SEND_TEMPL
3613                }
3614            );
3615            assert_eq!(s.remote_win_scale, Some(scale));
3616        }
3617    }
3618
3619    #[test]
3620    fn test_syn_received_close() {
3621        let mut s = socket_syn_received();
3622        s.close();
3623        assert_eq!(s.state, State::FinWait1);
3624    }
3625
3626    // =========================================================================================//
3627    // Tests for the SYN-SENT state.
3628    // =========================================================================================//
3629
3630    #[test]
3631    fn test_connect_validation() {
3632        let mut s = socket();
3633        assert_eq!(
3634            s.socket
3635                .connect(&mut s.cx, REMOTE_END, (IpvXAddress::UNSPECIFIED, 0)),
3636            Err(ConnectError::Unaddressable)
3637        );
3638        assert_eq!(
3639            s.socket
3640                .connect(&mut s.cx, REMOTE_END, (IpvXAddress::UNSPECIFIED, 1024)),
3641            Err(ConnectError::Unaddressable)
3642        );
3643        assert_eq!(
3644            s.socket
3645                .connect(&mut s.cx, (IpvXAddress::UNSPECIFIED, 0), LOCAL_END),
3646            Err(ConnectError::Unaddressable)
3647        );
3648        s.socket
3649            .connect(&mut s.cx, REMOTE_END, LOCAL_END)
3650            .expect("Connect failed with valid parameters");
3651        assert_eq!(s.tuple, Some(TUPLE));
3652    }
3653
3654    #[test]
3655    fn test_connect() {
3656        let mut s = socket();
3657        s.local_seq_no = LOCAL_SEQ;
3658        s.socket
3659            .connect(&mut s.cx, REMOTE_END, LOCAL_END.port)
3660            .unwrap();
3661        assert_eq!(s.tuple, Some(TUPLE));
3662        recv!(
3663            s,
3664            [TcpRepr {
3665                control: TcpControl::Syn,
3666                seq_number: LOCAL_SEQ,
3667                ack_number: None,
3668                max_seg_size: Some(BASE_MSS),
3669                window_scale: Some(0),
3670                sack_permitted: true,
3671                ..RECV_TEMPL
3672            }]
3673        );
3674        send!(
3675            s,
3676            TcpRepr {
3677                control: TcpControl::Syn,
3678                seq_number: REMOTE_SEQ,
3679                ack_number: Some(LOCAL_SEQ + 1),
3680                max_seg_size: Some(BASE_MSS - 80),
3681                window_scale: Some(0),
3682                ..SEND_TEMPL
3683            }
3684        );
3685        assert_eq!(s.tuple, Some(TUPLE));
3686    }
3687
3688    #[test]
3689    fn test_connect_unspecified_local() {
3690        let mut s = socket();
3691        assert_eq!(s.socket.connect(&mut s.cx, REMOTE_END, 80), Ok(()));
3692    }
3693
3694    #[test]
3695    fn test_connect_specified_local() {
3696        let mut s = socket();
3697        assert_eq!(
3698            s.socket.connect(&mut s.cx, REMOTE_END, (REMOTE_ADDR, 80)),
3699            Ok(())
3700        );
3701    }
3702
3703    #[test]
3704    fn test_connect_twice() {
3705        let mut s = socket();
3706        assert_eq!(s.socket.connect(&mut s.cx, REMOTE_END, 80), Ok(()));
3707        assert_eq!(
3708            s.socket.connect(&mut s.cx, REMOTE_END, 80),
3709            Err(ConnectError::InvalidState)
3710        );
3711    }
3712
3713    #[test]
3714    fn test_syn_sent_sanity() {
3715        let mut s = socket();
3716        s.local_seq_no = LOCAL_SEQ;
3717        s.socket.connect(&mut s.cx, REMOTE_END, LOCAL_END).unwrap();
3718        sanity!(s, socket_syn_sent());
3719    }
3720
3721    #[test]
3722    fn test_syn_sent_syn_ack() {
3723        let mut s = socket_syn_sent();
3724        recv!(
3725            s,
3726            [TcpRepr {
3727                control: TcpControl::Syn,
3728                seq_number: LOCAL_SEQ,
3729                ack_number: None,
3730                max_seg_size: Some(BASE_MSS),
3731                window_scale: Some(0),
3732                sack_permitted: true,
3733                ..RECV_TEMPL
3734            }]
3735        );
3736        send!(
3737            s,
3738            TcpRepr {
3739                control: TcpControl::Syn,
3740                seq_number: REMOTE_SEQ,
3741                ack_number: Some(LOCAL_SEQ + 1),
3742                max_seg_size: Some(BASE_MSS - 80),
3743                window_scale: Some(0),
3744                ..SEND_TEMPL
3745            }
3746        );
3747        recv!(
3748            s,
3749            [TcpRepr {
3750                seq_number: LOCAL_SEQ + 1,
3751                ack_number: Some(REMOTE_SEQ + 1),
3752                ..RECV_TEMPL
3753            }]
3754        );
3755        recv_nothing!(s, time 1000);
3756        assert_eq!(s.state, State::Established);
3757        sanity!(s, socket_established());
3758    }
3759
3760    #[test]
3761    fn test_syn_sent_syn_received_ack() {
3762        let mut s = socket_syn_sent();
3763        recv!(
3764            s,
3765            [TcpRepr {
3766                control: TcpControl::Syn,
3767                seq_number: LOCAL_SEQ,
3768                ack_number: None,
3769                max_seg_size: Some(BASE_MSS),
3770                window_scale: Some(0),
3771                sack_permitted: true,
3772                ..RECV_TEMPL
3773            }]
3774        );
3775
3776        // A SYN packet changes the SYN-SENT state to SYN-RECEIVED.
3777        send!(
3778            s,
3779            TcpRepr {
3780                control: TcpControl::Syn,
3781                seq_number: REMOTE_SEQ,
3782                ack_number: None,
3783                max_seg_size: Some(BASE_MSS - 80),
3784                window_scale: Some(0),
3785                ..SEND_TEMPL
3786            }
3787        );
3788        assert_eq!(s.state, State::SynReceived);
3789
3790        // The socket will then send a SYN|ACK packet.
3791        recv!(
3792            s,
3793            [TcpRepr {
3794                control: TcpControl::Syn,
3795                seq_number: LOCAL_SEQ,
3796                ack_number: Some(REMOTE_SEQ + 1),
3797                max_seg_size: Some(BASE_MSS),
3798                window_scale: Some(0),
3799                ..RECV_TEMPL
3800            }]
3801        );
3802        recv_nothing!(s);
3803
3804        // The socket may retransmit the SYN|ACK packet.
3805        recv!(
3806            s,
3807            time 1001,
3808            Ok(TcpRepr {
3809                control: TcpControl::Syn,
3810                seq_number: LOCAL_SEQ,
3811                ack_number: Some(REMOTE_SEQ + 1),
3812                max_seg_size: Some(BASE_MSS),
3813                window_scale: Some(0),
3814                ..RECV_TEMPL
3815            })
3816        );
3817
3818        // An ACK packet changes the SYN-RECEIVED state to ESTABLISHED.
3819        send!(
3820            s,
3821            TcpRepr {
3822                control: TcpControl::None,
3823                seq_number: REMOTE_SEQ + 1,
3824                ack_number: Some(LOCAL_SEQ + 1),
3825                ..SEND_TEMPL
3826            }
3827        );
3828        assert_eq!(s.state, State::Established);
3829        sanity!(s, socket_established());
3830    }
3831
3832    #[test]
3833    fn test_syn_sent_syn_ack_not_incremented() {
3834        let mut s = socket_syn_sent();
3835        recv!(
3836            s,
3837            [TcpRepr {
3838                control: TcpControl::Syn,
3839                seq_number: LOCAL_SEQ,
3840                ack_number: None,
3841                max_seg_size: Some(BASE_MSS),
3842                window_scale: Some(0),
3843                sack_permitted: true,
3844                ..RECV_TEMPL
3845            }]
3846        );
3847        send!(
3848            s,
3849            TcpRepr {
3850                control: TcpControl::Syn,
3851                seq_number: REMOTE_SEQ,
3852                ack_number: Some(LOCAL_SEQ), // WRONG
3853                max_seg_size: Some(BASE_MSS - 80),
3854                window_scale: Some(0),
3855                ..SEND_TEMPL
3856            },
3857            Some(TcpRepr {
3858                control: TcpControl::Rst,
3859                seq_number: LOCAL_SEQ,
3860                ack_number: None,
3861                window_len: 0,
3862                ..RECV_TEMPL
3863            })
3864        );
3865        assert_eq!(s.state, State::SynSent);
3866    }
3867
3868    #[test]
3869    fn test_syn_sent_syn_received_rst() {
3870        let mut s = socket_syn_sent();
3871        recv!(
3872            s,
3873            [TcpRepr {
3874                control: TcpControl::Syn,
3875                seq_number: LOCAL_SEQ,
3876                ack_number: None,
3877                max_seg_size: Some(BASE_MSS),
3878                window_scale: Some(0),
3879                sack_permitted: true,
3880                ..RECV_TEMPL
3881            }]
3882        );
3883
3884        // A SYN packet changes the SYN-SENT state to SYN-RECEIVED.
3885        send!(
3886            s,
3887            TcpRepr {
3888                control: TcpControl::Syn,
3889                seq_number: REMOTE_SEQ,
3890                ack_number: None,
3891                max_seg_size: Some(BASE_MSS - 80),
3892                window_scale: Some(0),
3893                ..SEND_TEMPL
3894            }
3895        );
3896        assert_eq!(s.state, State::SynReceived);
3897
3898        // A RST packet changes the SYN-RECEIVED state to CLOSED.
3899        send!(
3900            s,
3901            TcpRepr {
3902                control: TcpControl::Rst,
3903                seq_number: REMOTE_SEQ + 1,
3904                ack_number: Some(LOCAL_SEQ),
3905                ..SEND_TEMPL
3906            }
3907        );
3908        assert_eq!(s.state, State::Closed);
3909    }
3910
3911    #[test]
3912    fn test_syn_sent_rst() {
3913        let mut s = socket_syn_sent();
3914        send!(
3915            s,
3916            TcpRepr {
3917                control: TcpControl::Rst,
3918                seq_number: REMOTE_SEQ,
3919                ack_number: Some(LOCAL_SEQ + 1),
3920                ..SEND_TEMPL
3921            }
3922        );
3923        assert_eq!(s.state, State::Closed);
3924    }
3925
3926    #[test]
3927    fn test_syn_sent_rst_no_ack() {
3928        let mut s = socket_syn_sent();
3929        send!(
3930            s,
3931            TcpRepr {
3932                control: TcpControl::Rst,
3933                seq_number: REMOTE_SEQ,
3934                ack_number: None,
3935                ..SEND_TEMPL
3936            }
3937        );
3938        assert_eq!(s.state, State::SynSent);
3939    }
3940
3941    #[test]
3942    fn test_syn_sent_rst_bad_ack() {
3943        let mut s = socket_syn_sent();
3944        send!(
3945            s,
3946            TcpRepr {
3947                control: TcpControl::Rst,
3948                seq_number: REMOTE_SEQ,
3949                ack_number: Some(TcpSeqNumber(1234)),
3950                ..SEND_TEMPL
3951            }
3952        );
3953        assert_eq!(s.state, State::SynSent);
3954    }
3955
3956    #[test]
3957    fn test_syn_sent_bad_ack() {
3958        let mut s = socket_syn_sent();
3959        recv!(
3960            s,
3961            [TcpRepr {
3962                control: TcpControl::Syn,
3963                seq_number: LOCAL_SEQ,
3964                ack_number: None,
3965                max_seg_size: Some(BASE_MSS),
3966                window_scale: Some(0),
3967                sack_permitted: true,
3968                ..RECV_TEMPL
3969            }]
3970        );
3971        send!(
3972            s,
3973            TcpRepr {
3974                control: TcpControl::None, // Unexpected
3975                seq_number: REMOTE_SEQ,
3976                ack_number: Some(LOCAL_SEQ + 1), // Correct
3977                ..SEND_TEMPL
3978            }
3979        );
3980
3981        // It should trigger no response and change no state
3982        recv!(s, []);
3983        assert_eq!(s.state, State::SynSent);
3984    }
3985
3986    #[test]
3987    fn test_syn_sent_bad_ack_seq_1() {
3988        let mut s = socket_syn_sent();
3989        recv!(
3990            s,
3991            [TcpRepr {
3992                control: TcpControl::Syn,
3993                seq_number: LOCAL_SEQ,
3994                ack_number: None,
3995                max_seg_size: Some(BASE_MSS),
3996                window_scale: Some(0),
3997                sack_permitted: true,
3998                ..RECV_TEMPL
3999            }]
4000        );
4001        send!(
4002            s,
4003            TcpRepr {
4004                control: TcpControl::None,
4005                seq_number: REMOTE_SEQ,
4006                ack_number: Some(LOCAL_SEQ), // WRONG
4007                ..SEND_TEMPL
4008            },
4009            Some(TcpRepr {
4010                control: TcpControl::Rst,
4011                seq_number: LOCAL_SEQ, // matching the ack_number of the unexpected ack
4012                ack_number: None,
4013                window_len: 0,
4014                ..RECV_TEMPL
4015            })
4016        );
4017
4018        // It should trigger a RST, and change no state
4019        assert_eq!(s.state, State::SynSent);
4020    }
4021
4022    #[test]
4023    fn test_syn_sent_bad_ack_seq_2() {
4024        let mut s = socket_syn_sent();
4025        recv!(
4026            s,
4027            [TcpRepr {
4028                control: TcpControl::Syn,
4029                seq_number: LOCAL_SEQ,
4030                ack_number: None,
4031                max_seg_size: Some(BASE_MSS),
4032                window_scale: Some(0),
4033                sack_permitted: true,
4034                ..RECV_TEMPL
4035            }]
4036        );
4037        send!(
4038            s,
4039            TcpRepr {
4040                control: TcpControl::None,
4041                seq_number: REMOTE_SEQ,
4042                ack_number: Some(LOCAL_SEQ + 123456), // WRONG
4043                ..SEND_TEMPL
4044            },
4045            Some(TcpRepr {
4046                control: TcpControl::Rst,
4047                seq_number: LOCAL_SEQ + 123456, // matching the ack_number of the unexpected ack
4048                ack_number: None,
4049                window_len: 0,
4050                ..RECV_TEMPL
4051            })
4052        );
4053
4054        // It should trigger a RST, and change no state
4055        assert_eq!(s.state, State::SynSent);
4056    }
4057
4058    #[test]
4059    fn test_syn_sent_close() {
4060        let mut s = socket();
4061        s.close();
4062        assert_eq!(s.state, State::Closed);
4063    }
4064
4065    #[test]
4066    fn test_syn_sent_sack_option() {
4067        let mut s = socket_syn_sent();
4068        recv!(
4069            s,
4070            [TcpRepr {
4071                control: TcpControl::Syn,
4072                seq_number: LOCAL_SEQ,
4073                ack_number: None,
4074                max_seg_size: Some(BASE_MSS),
4075                window_scale: Some(0),
4076                sack_permitted: true,
4077                ..RECV_TEMPL
4078            }]
4079        );
4080        send!(
4081            s,
4082            TcpRepr {
4083                control: TcpControl::Syn,
4084                seq_number: REMOTE_SEQ,
4085                ack_number: Some(LOCAL_SEQ + 1),
4086                max_seg_size: Some(BASE_MSS - 80),
4087                window_scale: Some(0),
4088                sack_permitted: true,
4089                ..SEND_TEMPL
4090            }
4091        );
4092        assert!(s.remote_has_sack);
4093
4094        let mut s = socket_syn_sent();
4095        recv!(
4096            s,
4097            [TcpRepr {
4098                control: TcpControl::Syn,
4099                seq_number: LOCAL_SEQ,
4100                ack_number: None,
4101                max_seg_size: Some(BASE_MSS),
4102                window_scale: Some(0),
4103                sack_permitted: true,
4104                ..RECV_TEMPL
4105            }]
4106        );
4107        send!(
4108            s,
4109            TcpRepr {
4110                control: TcpControl::Syn,
4111                seq_number: REMOTE_SEQ,
4112                ack_number: Some(LOCAL_SEQ + 1),
4113                max_seg_size: Some(BASE_MSS - 80),
4114                window_scale: Some(0),
4115                sack_permitted: false,
4116                ..SEND_TEMPL
4117            }
4118        );
4119        assert!(!s.remote_has_sack);
4120    }
4121
4122    #[test]
4123    fn test_syn_sent_win_scale_buffers() {
4124        for (buffer_size, shift_amt) in &[
4125            (64, 0),
4126            (128, 0),
4127            (1024, 0),
4128            (65535, 0),
4129            (65536, 1),
4130            (65537, 1),
4131            (131071, 1),
4132            (131072, 2),
4133            (524287, 3),
4134            (524288, 4),
4135            (655350, 4),
4136            (1048576, 5),
4137        ] {
4138            let mut s = socket_with_buffer_sizes(64, *buffer_size);
4139            s.local_seq_no = LOCAL_SEQ;
4140            assert_eq!(s.remote_win_shift, *shift_amt);
4141            s.socket.connect(&mut s.cx, REMOTE_END, LOCAL_END).unwrap();
4142            recv!(
4143                s,
4144                [TcpRepr {
4145                    control: TcpControl::Syn,
4146                    seq_number: LOCAL_SEQ,
4147                    ack_number: None,
4148                    max_seg_size: Some(BASE_MSS),
4149                    window_scale: Some(*shift_amt),
4150                    window_len: u16::try_from(*buffer_size).unwrap_or(u16::MAX),
4151                    sack_permitted: true,
4152                    ..RECV_TEMPL
4153                }]
4154            );
4155        }
4156    }
4157
4158    #[test]
4159    fn test_syn_sent_syn_ack_no_window_scaling() {
4160        let mut s = socket_syn_sent_with_buffer_sizes(1048576, 1048576);
4161        recv!(
4162            s,
4163            [TcpRepr {
4164                control: TcpControl::Syn,
4165                seq_number: LOCAL_SEQ,
4166                ack_number: None,
4167                max_seg_size: Some(BASE_MSS),
4168                // scaling does NOT apply to the window value in SYN packets
4169                window_len: 65535,
4170                window_scale: Some(5),
4171                sack_permitted: true,
4172                ..RECV_TEMPL
4173            }]
4174        );
4175        assert_eq!(s.remote_win_shift, 5);
4176        send!(
4177            s,
4178            TcpRepr {
4179                control: TcpControl::Syn,
4180                seq_number: REMOTE_SEQ,
4181                ack_number: Some(LOCAL_SEQ + 1),
4182                max_seg_size: Some(BASE_MSS - 80),
4183                window_scale: None,
4184                window_len: 42,
4185                ..SEND_TEMPL
4186            }
4187        );
4188        assert_eq!(s.state, State::Established);
4189        assert_eq!(s.remote_win_shift, 0);
4190        assert_eq!(s.remote_win_scale, None);
4191        assert_eq!(s.remote_win_len, 42);
4192    }
4193
4194    #[test]
4195    fn test_syn_sent_syn_ack_window_scaling() {
4196        let mut s = socket_syn_sent();
4197        recv!(
4198            s,
4199            [TcpRepr {
4200                control: TcpControl::Syn,
4201                seq_number: LOCAL_SEQ,
4202                ack_number: None,
4203                max_seg_size: Some(BASE_MSS),
4204                window_scale: Some(0),
4205                sack_permitted: true,
4206                ..RECV_TEMPL
4207            }]
4208        );
4209        send!(
4210            s,
4211            TcpRepr {
4212                control: TcpControl::Syn,
4213                seq_number: REMOTE_SEQ,
4214                ack_number: Some(LOCAL_SEQ + 1),
4215                max_seg_size: Some(BASE_MSS - 80),
4216                window_scale: Some(7),
4217                window_len: 42,
4218                ..SEND_TEMPL
4219            }
4220        );
4221        assert_eq!(s.state, State::Established);
4222        assert_eq!(s.remote_win_scale, Some(7));
4223        // scaling does NOT apply to the window value in SYN packets
4224        assert_eq!(s.remote_win_len, 42);
4225    }
4226
4227    // =========================================================================================//
4228    // Tests for the ESTABLISHED state.
4229    // =========================================================================================//
4230
4231    #[test]
4232    fn test_established_recv() {
4233        let mut s = socket_established();
4234        send!(
4235            s,
4236            TcpRepr {
4237                seq_number: REMOTE_SEQ + 1,
4238                ack_number: Some(LOCAL_SEQ + 1),
4239                payload: &b"abcdef"[..],
4240                ..SEND_TEMPL
4241            }
4242        );
4243        recv!(
4244            s,
4245            [TcpRepr {
4246                seq_number: LOCAL_SEQ + 1,
4247                ack_number: Some(REMOTE_SEQ + 1 + 6),
4248                window_len: 58,
4249                ..RECV_TEMPL
4250            }]
4251        );
4252        assert_eq!(s.rx_buffer.dequeue_many(6), &b"abcdef"[..]);
4253    }
4254
4255    #[test]
4256    fn test_peek_slice() {
4257        const BUF_SIZE: usize = 10;
4258
4259        let send_buf = b"0123456";
4260
4261        let mut s = socket_established_with_buffer_sizes(BUF_SIZE, BUF_SIZE);
4262
4263        // Populate the recv buffer
4264        send!(
4265            s,
4266            TcpRepr {
4267                seq_number: REMOTE_SEQ + 1,
4268                ack_number: Some(LOCAL_SEQ + 1),
4269                payload: &send_buf[..],
4270                ..SEND_TEMPL
4271            }
4272        );
4273
4274        // Peek into the recv buffer
4275        let mut peeked_buf = [0u8; BUF_SIZE];
4276        let actually_peeked = s.peek_slice(&mut peeked_buf[..]).unwrap();
4277        let mut recv_buf = [0u8; BUF_SIZE];
4278        let actually_recvd = s.recv_slice(&mut recv_buf[..]).unwrap();
4279        assert_eq!(
4280            &mut peeked_buf[..actually_peeked],
4281            &mut recv_buf[..actually_recvd]
4282        );
4283    }
4284
4285    #[test]
4286    fn test_peek_slice_buffer_wrap() {
4287        const BUF_SIZE: usize = 10;
4288
4289        let send_buf = b"0123456789";
4290
4291        let mut s = socket_established_with_buffer_sizes(BUF_SIZE, BUF_SIZE);
4292
4293        let _ = s.rx_buffer.enqueue_slice(&send_buf[..8]);
4294        let _ = s.rx_buffer.dequeue_many(6);
4295        let _ = s.rx_buffer.enqueue_slice(&send_buf[..5]);
4296
4297        let mut peeked_buf = [0u8; BUF_SIZE];
4298        let actually_peeked = s.peek_slice(&mut peeked_buf[..]).unwrap();
4299        let mut recv_buf = [0u8; BUF_SIZE];
4300        let actually_recvd = s.recv_slice(&mut recv_buf[..]).unwrap();
4301        assert_eq!(
4302            &mut peeked_buf[..actually_peeked],
4303            &mut recv_buf[..actually_recvd]
4304        );
4305    }
4306
4307    fn setup_rfc2018_cases() -> (TestSocket, Vec<u8>) {
4308        // This is a utility function used by the tests for RFC 2018 cases. It configures a socket
4309        // in a particular way suitable for those cases.
4310        //
4311        // RFC 2018: Assume the left window edge is 5000 and that the data transmitter sends [...]
4312        // segments, each containing 500 data bytes.
4313        let mut s = socket_established_with_buffer_sizes(4000, 4000);
4314        s.remote_has_sack = true;
4315
4316        // create a segment that is 500 bytes long
4317        let mut segment: Vec<u8> = Vec::with_capacity(500);
4318
4319        // move the last ack to 5000 by sending ten of them
4320        for _ in 0..50 {
4321            segment.extend_from_slice(b"abcdefghij")
4322        }
4323        for offset in (0..5000).step_by(500) {
4324            send!(
4325                s,
4326                TcpRepr {
4327                    seq_number: REMOTE_SEQ + 1 + offset,
4328                    ack_number: Some(LOCAL_SEQ + 1),
4329                    payload: &segment,
4330                    ..SEND_TEMPL
4331                }
4332            );
4333            recv!(
4334                s,
4335                [TcpRepr {
4336                    seq_number: LOCAL_SEQ + 1,
4337                    ack_number: Some(REMOTE_SEQ + 1 + offset + 500),
4338                    window_len: 3500,
4339                    ..RECV_TEMPL
4340                }]
4341            );
4342            s.recv(|data| {
4343                assert_eq!(data.len(), 500);
4344                assert_eq!(data, segment.as_slice());
4345                (500, ())
4346            })
4347            .unwrap();
4348        }
4349        assert_eq!(s.remote_last_win, 3500);
4350        (s, segment)
4351    }
4352
4353    #[test]
4354    fn test_established_rfc2018_cases() {
4355        // This test case verifies the exact scenarios described on pages 8-9 of RFC 2018. Please
4356        // ensure its behavior does not deviate from those scenarios.
4357
4358        let (mut s, segment) = setup_rfc2018_cases();
4359        // RFC 2018:
4360        //
4361        // Case 2: The first segment is dropped but the remaining 7 are received.
4362        //
4363        // Upon receiving each of the last seven packets, the data receiver will return a TCP ACK
4364        // segment that acknowledges sequence number 5000 and contains a SACK option specifying one
4365        // block of queued data:
4366        //
4367        //   Triggering   ACK      Left Edge  Right Edge
4368        //   Segment
4369        //
4370        //   5000         (lost)
4371        //   5500         5000     5500       6000
4372        //   6000         5000     5500       6500
4373        //   6500         5000     5500       7000
4374        //   7000         5000     5500       7500
4375        //   7500         5000     5500       8000
4376        //   8000         5000     5500       8500
4377        //   8500         5000     5500       9000
4378        //
4379        for offset in (500..3500).step_by(500) {
4380            send!(
4381                s,
4382                TcpRepr {
4383                    seq_number: REMOTE_SEQ + 1 + offset + 5000,
4384                    ack_number: Some(LOCAL_SEQ + 1),
4385                    payload: &segment,
4386                    ..SEND_TEMPL
4387                },
4388                Some(TcpRepr {
4389                    seq_number: LOCAL_SEQ + 1,
4390                    ack_number: Some(REMOTE_SEQ + 1 + 5000),
4391                    window_len: 4000,
4392                    sack_ranges: [
4393                        Some((
4394                            REMOTE_SEQ.0 as u32 + 1 + 5500,
4395                            REMOTE_SEQ.0 as u32 + 1 + 5500 + offset as u32
4396                        )),
4397                        None,
4398                        None
4399                    ],
4400                    ..RECV_TEMPL
4401                })
4402            );
4403        }
4404    }
4405
4406    #[test]
4407    fn test_established_sack_no_overflow_on_near_max_seqnumber() {
4408        let mut s = socket_established();
4409        s.remote_has_sack = true;
4410        s.remote_seq_no = TcpSeqNumber(-4);
4411        s.remote_last_ack = Some(TcpSeqNumber(-4));
4412
4413        // Send an out-of-order segment 10 bytes past the expected sequence,
4414        // creating a 10-byte hole at the front of the assembler.
4415        send!(
4416            s,
4417            TcpRepr {
4418                seq_number: TcpSeqNumber(-4 + 10),
4419                ack_number: Some(LOCAL_SEQ + 1),
4420                payload: &b"AAAAAAAAAA"[..],
4421                ..SEND_TEMPL
4422            },
4423            Some(TcpRepr {
4424                seq_number: LOCAL_SEQ + 1,
4425                ack_number: Some(TcpSeqNumber(-4)),
4426                window_len: 64,
4427                sack_ranges: [
4428                    Some(((-4_i32 + 10) as u32, (-4_i32 + 20) as u32,)),
4429                    None,
4430                    None,
4431                ],
4432                ..RECV_TEMPL
4433            })
4434        );
4435    }
4436
4437    #[test]
4438    fn test_established_sliding_window_recv() {
4439        let mut s = socket_established();
4440        // Update our scaling parameters for a TCP with a scaled buffer.
4441        assert_eq!(s.rx_buffer.len(), 0);
4442        s.rx_buffer = SocketBuffer::new(vec![0; 262143]);
4443        s.assembler = Assembler::new();
4444        s.remote_win_scale = Some(0);
4445        s.remote_last_win = 65535;
4446        s.remote_win_shift = 2;
4447
4448        // Create a TCP segment that will mostly fill an IP frame.
4449        let mut segment: Vec<u8> = Vec::with_capacity(1400);
4450        for _ in 0..100 {
4451            segment.extend_from_slice(b"abcdefghijklmn")
4452        }
4453        assert_eq!(segment.len(), 1400);
4454
4455        // Send the frame
4456        send!(
4457            s,
4458            TcpRepr {
4459                seq_number: REMOTE_SEQ + 1,
4460                ack_number: Some(LOCAL_SEQ + 1),
4461                payload: &segment,
4462                ..SEND_TEMPL
4463            }
4464        );
4465
4466        // Ensure that the received window size is shifted right by 2.
4467        recv!(
4468            s,
4469            [TcpRepr {
4470                seq_number: LOCAL_SEQ + 1,
4471                ack_number: Some(REMOTE_SEQ + 1 + 1400),
4472                window_len: 65185,
4473                ..RECV_TEMPL
4474            }]
4475        );
4476    }
4477
4478    #[test]
4479    fn test_established_send() {
4480        let mut s = socket_established();
4481        // First roundtrip after establishing.
4482        s.send_slice(b"abcdef").unwrap();
4483        recv!(
4484            s,
4485            [TcpRepr {
4486                seq_number: LOCAL_SEQ + 1,
4487                ack_number: Some(REMOTE_SEQ + 1),
4488                payload: &b"abcdef"[..],
4489                ..RECV_TEMPL
4490            }]
4491        );
4492        assert_eq!(s.tx_buffer.len(), 6);
4493        send!(
4494            s,
4495            TcpRepr {
4496                seq_number: REMOTE_SEQ + 1,
4497                ack_number: Some(LOCAL_SEQ + 1 + 6),
4498                ..SEND_TEMPL
4499            }
4500        );
4501        assert_eq!(s.tx_buffer.len(), 0);
4502        // Second roundtrip.
4503        s.send_slice(b"foobar").unwrap();
4504        recv!(
4505            s,
4506            [TcpRepr {
4507                seq_number: LOCAL_SEQ + 1 + 6,
4508                ack_number: Some(REMOTE_SEQ + 1),
4509                payload: &b"foobar"[..],
4510                ..RECV_TEMPL
4511            }]
4512        );
4513        send!(
4514            s,
4515            TcpRepr {
4516                seq_number: REMOTE_SEQ + 1,
4517                ack_number: Some(LOCAL_SEQ + 1 + 6 + 6),
4518                ..SEND_TEMPL
4519            }
4520        );
4521        assert_eq!(s.tx_buffer.len(), 0);
4522    }
4523
4524    #[test]
4525    fn test_established_send_no_ack_send() {
4526        let mut s = socket_established();
4527        s.set_nagle_enabled(false);
4528        s.send_slice(b"abcdef").unwrap();
4529        recv!(
4530            s,
4531            [TcpRepr {
4532                seq_number: LOCAL_SEQ + 1,
4533                ack_number: Some(REMOTE_SEQ + 1),
4534                payload: &b"abcdef"[..],
4535                ..RECV_TEMPL
4536            }]
4537        );
4538        s.send_slice(b"foobar").unwrap();
4539        recv!(
4540            s,
4541            [TcpRepr {
4542                seq_number: LOCAL_SEQ + 1 + 6,
4543                ack_number: Some(REMOTE_SEQ + 1),
4544                payload: &b"foobar"[..],
4545                ..RECV_TEMPL
4546            }]
4547        );
4548    }
4549
4550    #[test]
4551    fn test_established_send_buf_gt_win() {
4552        let mut data = [0; 32];
4553        for (i, elem) in data.iter_mut().enumerate() {
4554            *elem = i as u8
4555        }
4556
4557        let mut s = socket_established();
4558        s.remote_win_len = 16;
4559        s.send_slice(&data[..]).unwrap();
4560        recv!(
4561            s,
4562            [TcpRepr {
4563                seq_number: LOCAL_SEQ + 1,
4564                ack_number: Some(REMOTE_SEQ + 1),
4565                payload: &data[0..16],
4566                ..RECV_TEMPL
4567            }]
4568        );
4569    }
4570
4571    #[test]
4572    fn test_established_send_window_shrink() {
4573        let mut s = socket_established();
4574
4575        // 6 octets fit on the remote side's window, so we send them.
4576        s.send_slice(b"abcdef").unwrap();
4577        recv!(
4578            s,
4579            [TcpRepr {
4580                seq_number: LOCAL_SEQ + 1,
4581                ack_number: Some(REMOTE_SEQ + 1),
4582                payload: &b"abcdef"[..],
4583                ..RECV_TEMPL
4584            }]
4585        );
4586        assert_eq!(s.tx_buffer.len(), 6);
4587
4588        println!(
4589            "local_seq_no={} remote_win_len={} remote_last_seq={}",
4590            s.local_seq_no, s.remote_win_len, s.remote_last_seq
4591        );
4592
4593        // - Peer doesn't ack them yet
4594        // - Sends data so we need to reply with an ACK
4595        // - ...AND and sends a window announcement that SHRINKS the window, so data we've
4596        //   previously sent is now outside the window. Yes, this is allowed by TCP.
4597        send!(
4598            s,
4599            TcpRepr {
4600                seq_number: REMOTE_SEQ + 1,
4601                ack_number: Some(LOCAL_SEQ + 1),
4602                window_len: 3,
4603                payload: &b"xyzxyz"[..],
4604                ..SEND_TEMPL
4605            }
4606        );
4607        assert_eq!(s.tx_buffer.len(), 6);
4608
4609        println!(
4610            "local_seq_no={} remote_win_len={} remote_last_seq={}",
4611            s.local_seq_no, s.remote_win_len, s.remote_last_seq
4612        );
4613
4614        // More data should not get sent since it doesn't fit in the window
4615        s.send_slice(b"foobar").unwrap();
4616        recv!(
4617            s,
4618            [TcpRepr {
4619                seq_number: LOCAL_SEQ + 1 + 6,
4620                ack_number: Some(REMOTE_SEQ + 1 + 6),
4621                window_len: 64 - 6,
4622                ..RECV_TEMPL
4623            }]
4624        );
4625    }
4626
4627    #[test]
4628    fn test_established_receive_partially_outside_window() {
4629        let mut s = socket_established();
4630
4631        send!(
4632            s,
4633            TcpRepr {
4634                seq_number: REMOTE_SEQ + 1,
4635                ack_number: Some(LOCAL_SEQ + 1),
4636                payload: &b"abc"[..],
4637                ..SEND_TEMPL
4638            }
4639        );
4640
4641        s.recv(|data| {
4642            assert_eq!(data, b"abc");
4643            (3, ())
4644        })
4645        .unwrap();
4646
4647        // Peer decides to retransmit (perhaps because the ACK was lost)
4648        // and also pushed data.
4649        send!(
4650            s,
4651            TcpRepr {
4652                seq_number: REMOTE_SEQ + 1,
4653                ack_number: Some(LOCAL_SEQ + 1),
4654                payload: &b"abcdef"[..],
4655                ..SEND_TEMPL
4656            }
4657        );
4658
4659        s.recv(|data| {
4660            assert_eq!(data, b"def");
4661            (3, ())
4662        })
4663        .unwrap();
4664    }
4665
4666    #[test]
4667    fn test_established_receive_partially_outside_window_fin() {
4668        let mut s = socket_established();
4669
4670        send!(
4671            s,
4672            TcpRepr {
4673                seq_number: REMOTE_SEQ + 1,
4674                ack_number: Some(LOCAL_SEQ + 1),
4675                payload: &b"abc"[..],
4676                ..SEND_TEMPL
4677            }
4678        );
4679
4680        s.recv(|data| {
4681            assert_eq!(data, b"abc");
4682            (3, ())
4683        })
4684        .unwrap();
4685
4686        // Peer decides to retransmit (perhaps because the ACK was lost)
4687        // and also pushed data, and sent a FIN.
4688        send!(
4689            s,
4690            TcpRepr {
4691                seq_number: REMOTE_SEQ + 1,
4692                ack_number: Some(LOCAL_SEQ + 1),
4693                control: TcpControl::Fin,
4694                payload: &b"abcdef"[..],
4695                ..SEND_TEMPL
4696            }
4697        );
4698
4699        s.recv(|data| {
4700            assert_eq!(data, b"def");
4701            (3, ())
4702        })
4703        .unwrap();
4704
4705        // We should accept the FIN, because even though the last packet was partially
4706        // outside the receive window, there is no hole after adding its data to the assembler.
4707        assert_eq!(s.state, State::CloseWait);
4708    }
4709
4710    #[test]
4711    fn test_established_send_wrap() {
4712        let mut s = socket_established();
4713        let local_seq_start = TcpSeqNumber(i32::MAX - 1);
4714        s.local_seq_no = local_seq_start + 1;
4715        s.remote_last_seq = local_seq_start + 1;
4716        s.send_slice(b"abc").unwrap();
4717        recv!(s, time 1000, Ok(TcpRepr {
4718            seq_number: local_seq_start + 1,
4719            ack_number: Some(REMOTE_SEQ + 1),
4720            payload:    &b"abc"[..],
4721            ..RECV_TEMPL
4722        }));
4723    }
4724
4725    #[test]
4726    fn test_established_no_ack() {
4727        let mut s = socket_established();
4728        send!(
4729            s,
4730            TcpRepr {
4731                seq_number: REMOTE_SEQ + 1,
4732                ack_number: None,
4733                ..SEND_TEMPL
4734            }
4735        );
4736    }
4737
4738    #[test]
4739    fn test_established_bad_ack() {
4740        let mut s = socket_established();
4741        // Already acknowledged data.
4742        send!(
4743            s,
4744            TcpRepr {
4745                seq_number: REMOTE_SEQ + 1,
4746                ack_number: Some(TcpSeqNumber(LOCAL_SEQ.0 - 1)),
4747                ..SEND_TEMPL
4748            }
4749        );
4750        assert_eq!(s.local_seq_no, LOCAL_SEQ + 1);
4751        // Data not yet transmitted.
4752        send!(
4753            s,
4754            TcpRepr {
4755                seq_number: REMOTE_SEQ + 1,
4756                ack_number: Some(LOCAL_SEQ + 10),
4757                ..SEND_TEMPL
4758            },
4759            Some(TcpRepr {
4760                seq_number: LOCAL_SEQ + 1,
4761                ack_number: Some(REMOTE_SEQ + 1),
4762                ..RECV_TEMPL
4763            })
4764        );
4765        assert_eq!(s.local_seq_no, LOCAL_SEQ + 1);
4766    }
4767
4768    #[test]
4769    fn test_established_bad_seq() {
4770        let mut s = socket_established();
4771        // Data outside of receive window.
4772        send!(
4773            s,
4774            TcpRepr {
4775                seq_number: REMOTE_SEQ + 1 + 256,
4776                ack_number: Some(LOCAL_SEQ + 1),
4777                ..SEND_TEMPL
4778            },
4779            Some(TcpRepr {
4780                seq_number: LOCAL_SEQ + 1,
4781                ack_number: Some(REMOTE_SEQ + 1),
4782                ..RECV_TEMPL
4783            })
4784        );
4785        assert_eq!(s.remote_seq_no, REMOTE_SEQ + 1);
4786
4787        // Challenge ACKs are rate-limited, we don't get a second one immediately.
4788        send!(
4789            s,
4790            time 100,
4791            TcpRepr {
4792                seq_number: REMOTE_SEQ + 1 + 256,
4793                ack_number: Some(LOCAL_SEQ + 1),
4794                ..SEND_TEMPL
4795            }
4796        );
4797
4798        // If we wait a bit, we do get a new one.
4799        send!(
4800            s,
4801            time 2000,
4802            TcpRepr {
4803                seq_number: REMOTE_SEQ + 1 + 256,
4804                ack_number: Some(LOCAL_SEQ + 1),
4805                ..SEND_TEMPL
4806            },
4807            Some(TcpRepr {
4808                seq_number: LOCAL_SEQ + 1,
4809                ack_number: Some(REMOTE_SEQ + 1),
4810                ..RECV_TEMPL
4811            })
4812        );
4813        assert_eq!(s.remote_seq_no, REMOTE_SEQ + 1);
4814    }
4815
4816    #[test]
4817    fn test_established_fin() {
4818        let mut s = socket_established();
4819        send!(
4820            s,
4821            TcpRepr {
4822                control: TcpControl::Fin,
4823                seq_number: REMOTE_SEQ + 1,
4824                ack_number: Some(LOCAL_SEQ + 1),
4825                ..SEND_TEMPL
4826            }
4827        );
4828        recv!(
4829            s,
4830            [TcpRepr {
4831                seq_number: LOCAL_SEQ + 1,
4832                ack_number: Some(REMOTE_SEQ + 1 + 1),
4833                ..RECV_TEMPL
4834            }]
4835        );
4836        assert_eq!(s.state, State::CloseWait);
4837        sanity!(s, socket_close_wait());
4838    }
4839
4840    #[test]
4841    fn test_established_fin_after_missing() {
4842        let mut s = socket_established();
4843        send!(
4844            s,
4845            TcpRepr {
4846                control: TcpControl::Fin,
4847                seq_number: REMOTE_SEQ + 1 + 6,
4848                ack_number: Some(LOCAL_SEQ + 1),
4849                payload: &b"123456"[..],
4850                ..SEND_TEMPL
4851            },
4852            Some(TcpRepr {
4853                seq_number: LOCAL_SEQ + 1,
4854                ack_number: Some(REMOTE_SEQ + 1),
4855                ..RECV_TEMPL
4856            })
4857        );
4858        assert_eq!(s.state, State::Established);
4859        send!(
4860            s,
4861            TcpRepr {
4862                seq_number: REMOTE_SEQ + 1,
4863                ack_number: Some(LOCAL_SEQ + 1),
4864                payload: &b"abcdef"[..],
4865                ..SEND_TEMPL
4866            },
4867            Some(TcpRepr {
4868                seq_number: LOCAL_SEQ + 1,
4869                ack_number: Some(REMOTE_SEQ + 1 + 6 + 6),
4870                window_len: 52,
4871                ..RECV_TEMPL
4872            })
4873        );
4874        assert_eq!(s.state, State::Established);
4875    }
4876
4877    #[test]
4878    fn test_established_send_fin() {
4879        let mut s = socket_established();
4880        s.send_slice(b"abcdef").unwrap();
4881        send!(
4882            s,
4883            TcpRepr {
4884                control: TcpControl::Fin,
4885                seq_number: REMOTE_SEQ + 1,
4886                ack_number: Some(LOCAL_SEQ + 1),
4887                ..SEND_TEMPL
4888            }
4889        );
4890        assert_eq!(s.state, State::CloseWait);
4891        recv!(
4892            s,
4893            [TcpRepr {
4894                seq_number: LOCAL_SEQ + 1,
4895                ack_number: Some(REMOTE_SEQ + 1 + 1),
4896                payload: &b"abcdef"[..],
4897                ..RECV_TEMPL
4898            }]
4899        );
4900    }
4901
4902    #[test]
4903    fn test_established_rst() {
4904        let mut s = socket_established();
4905        send!(
4906            s,
4907            TcpRepr {
4908                control: TcpControl::Rst,
4909                seq_number: REMOTE_SEQ + 1,
4910                ack_number: Some(LOCAL_SEQ + 1),
4911                ..SEND_TEMPL
4912            }
4913        );
4914        assert_eq!(s.state, State::Closed);
4915    }
4916
4917    #[test]
4918    fn test_established_rst_no_ack() {
4919        let mut s = socket_established();
4920        send!(
4921            s,
4922            TcpRepr {
4923                control: TcpControl::Rst,
4924                seq_number: REMOTE_SEQ + 1,
4925                ack_number: None,
4926                ..SEND_TEMPL
4927            }
4928        );
4929        assert_eq!(s.state, State::Closed);
4930    }
4931
4932    #[test]
4933    fn test_established_close() {
4934        let mut s = socket_established();
4935        s.close();
4936        assert_eq!(s.state, State::FinWait1);
4937        sanity!(s, socket_fin_wait_1());
4938    }
4939
4940    #[test]
4941    fn test_established_abort() {
4942        let mut s = socket_established();
4943        s.abort();
4944        assert_eq!(s.state, State::Closed);
4945        recv!(
4946            s,
4947            [TcpRepr {
4948                control: TcpControl::Rst,
4949                seq_number: LOCAL_SEQ + 1,
4950                ack_number: Some(REMOTE_SEQ + 1),
4951                ..RECV_TEMPL
4952            }]
4953        );
4954    }
4955
4956    #[test]
4957    fn test_established_rst_bad_seq() {
4958        let mut s = socket_established();
4959        send!(
4960            s,
4961            TcpRepr {
4962                control: TcpControl::Rst,
4963                seq_number: REMOTE_SEQ, // Wrong seq
4964                ack_number: None,
4965                ..SEND_TEMPL
4966            },
4967            Some(TcpRepr {
4968                seq_number: LOCAL_SEQ + 1,
4969                ack_number: Some(REMOTE_SEQ + 1),
4970                ..RECV_TEMPL
4971            })
4972        );
4973
4974        assert_eq!(s.state, State::Established);
4975
4976        // Send something to advance seq by 1
4977        send!(
4978            s,
4979            TcpRepr {
4980                seq_number: REMOTE_SEQ + 1, // correct seq
4981                ack_number: Some(LOCAL_SEQ + 1),
4982                payload: &b"a"[..],
4983                ..SEND_TEMPL
4984            }
4985        );
4986
4987        // Send wrong rst again, check that the challenge ack is correctly updated
4988        // The ack number must be updated even if we don't call dispatch on the socket
4989        // See https://github.com/smoltcp-rs/smoltcp/issues/338
4990        send!(
4991            s,
4992            time 2000,
4993            TcpRepr {
4994                control: TcpControl::Rst,
4995                seq_number: REMOTE_SEQ, // Wrong seq
4996                ack_number: None,
4997                ..SEND_TEMPL
4998            },
4999            Some(TcpRepr {
5000                seq_number: LOCAL_SEQ + 1,
5001                ack_number: Some(REMOTE_SEQ + 2), // this has changed
5002                window_len: 63,
5003                ..RECV_TEMPL
5004            })
5005        );
5006    }
5007
5008    // =========================================================================================//
5009    // Tests for the FIN-WAIT-1 state.
5010    // =========================================================================================//
5011
5012    #[test]
5013    fn test_fin_wait_1_fin_ack() {
5014        let mut s = socket_fin_wait_1();
5015        recv!(
5016            s,
5017            [TcpRepr {
5018                control: TcpControl::Fin,
5019                seq_number: LOCAL_SEQ + 1,
5020                ack_number: Some(REMOTE_SEQ + 1),
5021                ..RECV_TEMPL
5022            }]
5023        );
5024        send!(
5025            s,
5026            TcpRepr {
5027                seq_number: REMOTE_SEQ + 1,
5028                ack_number: Some(LOCAL_SEQ + 1 + 1),
5029                ..SEND_TEMPL
5030            }
5031        );
5032        assert_eq!(s.state, State::FinWait2);
5033        sanity!(s, socket_fin_wait_2());
5034    }
5035
5036    #[test]
5037    fn test_fin_wait_1_fin_fin() {
5038        let mut s = socket_fin_wait_1();
5039        recv!(
5040            s,
5041            [TcpRepr {
5042                control: TcpControl::Fin,
5043                seq_number: LOCAL_SEQ + 1,
5044                ack_number: Some(REMOTE_SEQ + 1),
5045                ..RECV_TEMPL
5046            }]
5047        );
5048        send!(
5049            s,
5050            TcpRepr {
5051                control: TcpControl::Fin,
5052                seq_number: REMOTE_SEQ + 1,
5053                ack_number: Some(LOCAL_SEQ + 1),
5054                ..SEND_TEMPL
5055            }
5056        );
5057        assert_eq!(s.state, State::Closing);
5058        sanity!(s, socket_closing());
5059    }
5060
5061    #[test]
5062    fn test_fin_wait_1_fin_with_data_queued() {
5063        let mut s = socket_established();
5064        s.remote_win_len = 6;
5065        s.send_slice(b"abcdef123456").unwrap();
5066        s.close();
5067        recv!(
5068            s,
5069            Ok(TcpRepr {
5070                seq_number: LOCAL_SEQ + 1,
5071                ack_number: Some(REMOTE_SEQ + 1),
5072                payload: &b"abcdef"[..],
5073                ..RECV_TEMPL
5074            })
5075        );
5076        send!(
5077            s,
5078            TcpRepr {
5079                seq_number: REMOTE_SEQ + 1,
5080                ack_number: Some(LOCAL_SEQ + 1 + 6),
5081                ..SEND_TEMPL
5082            }
5083        );
5084        assert_eq!(s.state, State::FinWait1);
5085    }
5086
5087    #[test]
5088    fn test_fin_wait_1_recv() {
5089        let mut s = socket_fin_wait_1();
5090        send!(
5091            s,
5092            TcpRepr {
5093                seq_number: REMOTE_SEQ + 1,
5094                ack_number: Some(LOCAL_SEQ + 1),
5095                payload: &b"abc"[..],
5096                ..SEND_TEMPL
5097            }
5098        );
5099        assert_eq!(s.state, State::FinWait1);
5100        s.recv(|data| {
5101            assert_eq!(data, b"abc");
5102            (3, ())
5103        })
5104        .unwrap();
5105    }
5106
5107    #[test]
5108    fn test_fin_wait_1_close() {
5109        let mut s = socket_fin_wait_1();
5110        s.close();
5111        assert_eq!(s.state, State::FinWait1);
5112    }
5113
5114    // =========================================================================================//
5115    // Tests for the FIN-WAIT-2 state.
5116    // =========================================================================================//
5117
5118    #[test]
5119    fn test_fin_wait_2_fin() {
5120        let mut s = socket_fin_wait_2();
5121        send!(s, time 1_000, TcpRepr {
5122            control: TcpControl::Fin,
5123            seq_number: REMOTE_SEQ + 1,
5124            ack_number: Some(LOCAL_SEQ + 1 + 1),
5125            ..SEND_TEMPL
5126        });
5127        assert_eq!(s.state, State::TimeWait);
5128        sanity!(s, socket_time_wait(false));
5129    }
5130
5131    #[test]
5132    fn test_fin_wait_2_recv() {
5133        let mut s = socket_fin_wait_2();
5134        send!(
5135            s,
5136            TcpRepr {
5137                seq_number: REMOTE_SEQ + 1,
5138                ack_number: Some(LOCAL_SEQ + 1 + 1),
5139                payload: &b"abc"[..],
5140                ..SEND_TEMPL
5141            }
5142        );
5143        assert_eq!(s.state, State::FinWait2);
5144        s.recv(|data| {
5145            assert_eq!(data, b"abc");
5146            (3, ())
5147        })
5148        .unwrap();
5149        recv!(
5150            s,
5151            [TcpRepr {
5152                seq_number: LOCAL_SEQ + 1 + 1,
5153                ack_number: Some(REMOTE_SEQ + 1 + 3),
5154                ..RECV_TEMPL
5155            }]
5156        );
5157    }
5158
5159    #[test]
5160    fn test_fin_wait_2_close() {
5161        let mut s = socket_fin_wait_2();
5162        s.close();
5163        assert_eq!(s.state, State::FinWait2);
5164    }
5165
5166    // =========================================================================================//
5167    // Tests for the CLOSING state.
5168    // =========================================================================================//
5169
5170    #[test]
5171    fn test_closing_ack_fin() {
5172        let mut s = socket_closing();
5173        recv!(
5174            s,
5175            [TcpRepr {
5176                seq_number: LOCAL_SEQ + 1 + 1,
5177                ack_number: Some(REMOTE_SEQ + 1 + 1),
5178                ..RECV_TEMPL
5179            }]
5180        );
5181        send!(s, time 1_000, TcpRepr {
5182            seq_number: REMOTE_SEQ + 1 + 1,
5183            ack_number: Some(LOCAL_SEQ + 1 + 1),
5184            ..SEND_TEMPL
5185        });
5186        assert_eq!(s.state, State::TimeWait);
5187        sanity!(s, socket_time_wait(true));
5188    }
5189
5190    #[test]
5191    fn test_closing_close() {
5192        let mut s = socket_closing();
5193        s.close();
5194        assert_eq!(s.state, State::Closing);
5195    }
5196
5197    // =========================================================================================//
5198    // Tests for the TIME-WAIT state.
5199    // =========================================================================================//
5200
5201    #[test]
5202    fn test_time_wait_from_fin_wait_2_ack() {
5203        let mut s = socket_time_wait(false);
5204        recv!(
5205            s,
5206            [TcpRepr {
5207                seq_number: LOCAL_SEQ + 1 + 1,
5208                ack_number: Some(REMOTE_SEQ + 1 + 1),
5209                ..RECV_TEMPL
5210            }]
5211        );
5212    }
5213
5214    #[test]
5215    fn test_time_wait_from_closing_no_ack() {
5216        let mut s = socket_time_wait(true);
5217        recv!(s, []);
5218    }
5219
5220    #[test]
5221    fn test_time_wait_close() {
5222        let mut s = socket_time_wait(false);
5223        s.close();
5224        assert_eq!(s.state, State::TimeWait);
5225    }
5226
5227    #[test]
5228    fn test_time_wait_retransmit() {
5229        let mut s = socket_time_wait(false);
5230        recv!(
5231            s,
5232            [TcpRepr {
5233                seq_number: LOCAL_SEQ + 1 + 1,
5234                ack_number: Some(REMOTE_SEQ + 1 + 1),
5235                ..RECV_TEMPL
5236            }]
5237        );
5238        send!(s, time 5_000, TcpRepr {
5239            control: TcpControl::Fin,
5240            seq_number: REMOTE_SEQ + 1,
5241            ack_number: Some(LOCAL_SEQ + 1 + 1),
5242            ..SEND_TEMPL
5243        }, Some(TcpRepr {
5244            seq_number: LOCAL_SEQ + 1 + 1,
5245            ack_number: Some(REMOTE_SEQ + 1 + 1),
5246            ..RECV_TEMPL
5247        }));
5248        assert_eq!(
5249            s.timer,
5250            Timer::Close {
5251                expires_at: Instant::from_secs(5) + CLOSE_DELAY
5252            }
5253        );
5254    }
5255
5256    #[test]
5257    fn test_time_wait_timeout() {
5258        let mut s = socket_time_wait(false);
5259        recv!(
5260            s,
5261            [TcpRepr {
5262                seq_number: LOCAL_SEQ + 1 + 1,
5263                ack_number: Some(REMOTE_SEQ + 1 + 1),
5264                ..RECV_TEMPL
5265            }]
5266        );
5267        assert_eq!(s.state, State::TimeWait);
5268        recv_nothing!(s, time 60_000);
5269        assert_eq!(s.state, State::Closed);
5270    }
5271
5272    // =========================================================================================//
5273    // Tests for the CLOSE-WAIT state.
5274    // =========================================================================================//
5275
5276    #[test]
5277    fn test_close_wait_ack() {
5278        let mut s = socket_close_wait();
5279        s.send_slice(b"abcdef").unwrap();
5280        recv!(
5281            s,
5282            [TcpRepr {
5283                seq_number: LOCAL_SEQ + 1,
5284                ack_number: Some(REMOTE_SEQ + 1 + 1),
5285                payload: &b"abcdef"[..],
5286                ..RECV_TEMPL
5287            }]
5288        );
5289        send!(
5290            s,
5291            TcpRepr {
5292                seq_number: REMOTE_SEQ + 1 + 1,
5293                ack_number: Some(LOCAL_SEQ + 1 + 6),
5294                ..SEND_TEMPL
5295            }
5296        );
5297    }
5298
5299    #[test]
5300    fn test_close_wait_close() {
5301        let mut s = socket_close_wait();
5302        s.close();
5303        assert_eq!(s.state, State::LastAck);
5304        sanity!(s, socket_last_ack());
5305    }
5306
5307    // =========================================================================================//
5308    // Tests for the LAST-ACK state.
5309    // =========================================================================================//
5310    #[test]
5311    fn test_last_ack_fin_ack() {
5312        let mut s = socket_last_ack();
5313        recv!(
5314            s,
5315            [TcpRepr {
5316                control: TcpControl::Fin,
5317                seq_number: LOCAL_SEQ + 1,
5318                ack_number: Some(REMOTE_SEQ + 1 + 1),
5319                ..RECV_TEMPL
5320            }]
5321        );
5322        assert_eq!(s.state, State::LastAck);
5323        send!(
5324            s,
5325            TcpRepr {
5326                seq_number: REMOTE_SEQ + 1 + 1,
5327                ack_number: Some(LOCAL_SEQ + 1 + 1),
5328                ..SEND_TEMPL
5329            }
5330        );
5331        assert_eq!(s.state, State::Closed);
5332    }
5333
5334    #[test]
5335    fn test_last_ack_ack_not_of_fin() {
5336        let mut s = socket_last_ack();
5337        recv!(
5338            s,
5339            [TcpRepr {
5340                control: TcpControl::Fin,
5341                seq_number: LOCAL_SEQ + 1,
5342                ack_number: Some(REMOTE_SEQ + 1 + 1),
5343                ..RECV_TEMPL
5344            }]
5345        );
5346        assert_eq!(s.state, State::LastAck);
5347
5348        // A duplicate ACK (ack_number == SND.UNA, not the FIN ACK) must elicit a
5349        // challenge ACK per RFC 9293 §3.10.7.4 and must keep the state in LAST-ACK.
5350        send!(
5351            s,
5352            TcpRepr {
5353                seq_number: REMOTE_SEQ + 1 + 1,
5354                ack_number: Some(LOCAL_SEQ + 1),
5355                ..SEND_TEMPL
5356            },
5357            Some(TcpRepr {
5358                seq_number: LOCAL_SEQ + 1 + 1,
5359                ack_number: Some(REMOTE_SEQ + 1 + 1),
5360                ..RECV_TEMPL
5361            })
5362        );
5363        assert_eq!(s.state, State::LastAck);
5364
5365        // ACK received of fin: socket should change to Closed.
5366        send!(
5367            s,
5368            TcpRepr {
5369                seq_number: REMOTE_SEQ + 1 + 1,
5370                ack_number: Some(LOCAL_SEQ + 1 + 1),
5371                ..SEND_TEMPL
5372            }
5373        );
5374        assert_eq!(s.state, State::Closed);
5375    }
5376
5377    // RFC 9293 §3.10.7.4: duplicate ACK in LAST-ACK must elicit a challenge ACK,
5378    // not be silently dropped.
5379    #[test]
5380    fn test_last_ack_duplicate_ack_challenge_ack() {
5381        let mut s = socket_last_ack();
5382        // Trigger dispatch so our FIN is sent and remote_last_seq advances.
5383        recv!(
5384            s,
5385            [TcpRepr {
5386                control: TcpControl::Fin,
5387                seq_number: LOCAL_SEQ + 1,
5388                ack_number: Some(REMOTE_SEQ + 1 + 1),
5389                ..RECV_TEMPL
5390            }]
5391        );
5392        assert_eq!(s.state, State::LastAck);
5393
5394        // Remote re-sends an ACK for SND.UNA (not the FIN).  RFC 9293 requires a
5395        // challenge ACK in response so the remote can learn the current state.
5396        let challenge = send(
5397            &mut s,
5398            Instant::from_millis(0),
5399            &TcpRepr {
5400                seq_number: REMOTE_SEQ + 1 + 1,
5401                ack_number: Some(LOCAL_SEQ + 1),
5402                ..SEND_TEMPL
5403            },
5404        );
5405        assert_eq!(
5406            challenge,
5407            Some(TcpRepr {
5408                seq_number: LOCAL_SEQ + 1 + 1,
5409                ack_number: Some(REMOTE_SEQ + 1 + 1),
5410                ..RECV_TEMPL
5411            }),
5412            "expected challenge ACK in response to duplicate ACK in LAST-ACK"
5413        );
5414        // State must remain LAST-ACK: we have not received the FIN ACK.
5415        assert_eq!(s.state, State::LastAck);
5416
5417        // A second duplicate in the same second is rate-limited; the FIN ACK
5418        // must still be correctly accepted regardless.
5419        send!(
5420            s,
5421            TcpRepr {
5422                seq_number: REMOTE_SEQ + 1 + 1,
5423                ack_number: Some(LOCAL_SEQ + 1 + 1),
5424                ..SEND_TEMPL
5425            }
5426        );
5427        assert_eq!(s.state, State::Closed);
5428    }
5429
5430    // A partial ACK in LAST-ACK (ack_len > 0 but not FIN ACK) advances SND.UNA
5431    // without a challenge ACK; the FIN will be retransmitted by the timer.
5432    #[test]
5433    fn test_last_ack_partial_ack_no_challenge_ack() {
5434        // Build a LAST-ACK socket that has one byte of data still unacknowledged
5435        // before the FIN.  We manually wire the state so we can send a partial ACK.
5436        let mut s = socket_last_ack();
5437        // Push one byte into the tx buffer to simulate data that preceded the FIN.
5438        let _ = s.tx_buffer.enqueue_slice(b"x");
5439        // Mark it as already sent (remote_last_seq is past the data byte and the FIN).
5440        s.remote_last_seq = LOCAL_SEQ + 1 + 1 + 1; // data(1) + FIN(1)
5441
5442        // Remote ACKs just the data byte, not the FIN (partial ACK).
5443        // ack_number = local_seq_no + 1  =>  ack_len = 1, ack_of_fin = false.
5444        // Per RFC 9293, a valid partial ACK should advance SND.UNA normally;
5445        // no challenge ACK should be emitted.
5446        send!(
5447            s,
5448            TcpRepr {
5449                seq_number: REMOTE_SEQ + 1 + 1,
5450                ack_number: Some(LOCAL_SEQ + 1 + 1), // acks the data byte, not FIN
5451                ..SEND_TEMPL
5452            }
5453        );
5454        // State remains LAST-ACK; FIN retransmission is handled by the timer.
5455        assert_eq!(s.state, State::LastAck);
5456        // SND.UNA has advanced to the partial ACK number.
5457        assert_eq!(s.local_seq_no, LOCAL_SEQ + 1 + 1);
5458    }
5459
5460    #[test]
5461    fn test_last_ack_close() {
5462        let mut s = socket_last_ack();
5463        s.close();
5464        assert_eq!(s.state, State::LastAck);
5465    }
5466
5467    // =========================================================================================//
5468    // Tests for transitioning through multiple states.
5469    // =========================================================================================//
5470
5471    #[test]
5472    fn test_listen() {
5473        let mut s = socket();
5474        s.listen(LISTEN_END).unwrap();
5475        assert_eq!(s.state, State::Listen);
5476    }
5477
5478    #[test]
5479    fn test_three_way_handshake() {
5480        let mut s = socket_listen();
5481        send!(
5482            s,
5483            TcpRepr {
5484                control: TcpControl::Syn,
5485                seq_number: REMOTE_SEQ,
5486                ack_number: None,
5487                ..SEND_TEMPL
5488            }
5489        );
5490        assert_eq!(s.state(), State::SynReceived);
5491        assert_eq!(s.tuple, Some(TUPLE));
5492        recv!(
5493            s,
5494            [TcpRepr {
5495                control: TcpControl::Syn,
5496                seq_number: LOCAL_SEQ,
5497                ack_number: Some(REMOTE_SEQ + 1),
5498                max_seg_size: Some(BASE_MSS),
5499                ..RECV_TEMPL
5500            }]
5501        );
5502        send!(
5503            s,
5504            TcpRepr {
5505                seq_number: REMOTE_SEQ + 1,
5506                ack_number: Some(LOCAL_SEQ + 1),
5507                ..SEND_TEMPL
5508            }
5509        );
5510        assert_eq!(s.state(), State::Established);
5511        assert_eq!(s.local_seq_no, LOCAL_SEQ + 1);
5512        assert_eq!(s.remote_seq_no, REMOTE_SEQ + 1);
5513    }
5514
5515    #[test]
5516    fn test_remote_close() {
5517        let mut s = socket_established();
5518        send!(
5519            s,
5520            TcpRepr {
5521                control: TcpControl::Fin,
5522                seq_number: REMOTE_SEQ + 1,
5523                ack_number: Some(LOCAL_SEQ + 1),
5524                ..SEND_TEMPL
5525            }
5526        );
5527        assert_eq!(s.state, State::CloseWait);
5528        recv!(
5529            s,
5530            [TcpRepr {
5531                seq_number: LOCAL_SEQ + 1,
5532                ack_number: Some(REMOTE_SEQ + 1 + 1),
5533                ..RECV_TEMPL
5534            }]
5535        );
5536        s.close();
5537        assert_eq!(s.state, State::LastAck);
5538        recv!(
5539            s,
5540            [TcpRepr {
5541                control: TcpControl::Fin,
5542                seq_number: LOCAL_SEQ + 1,
5543                ack_number: Some(REMOTE_SEQ + 1 + 1),
5544                ..RECV_TEMPL
5545            }]
5546        );
5547        send!(
5548            s,
5549            TcpRepr {
5550                seq_number: REMOTE_SEQ + 1 + 1,
5551                ack_number: Some(LOCAL_SEQ + 1 + 1),
5552                ..SEND_TEMPL
5553            }
5554        );
5555        assert_eq!(s.state, State::Closed);
5556    }
5557
5558    #[test]
5559    fn test_local_close() {
5560        let mut s = socket_established();
5561        s.close();
5562        assert_eq!(s.state, State::FinWait1);
5563        recv!(
5564            s,
5565            [TcpRepr {
5566                control: TcpControl::Fin,
5567                seq_number: LOCAL_SEQ + 1,
5568                ack_number: Some(REMOTE_SEQ + 1),
5569                ..RECV_TEMPL
5570            }]
5571        );
5572        send!(
5573            s,
5574            TcpRepr {
5575                seq_number: REMOTE_SEQ + 1,
5576                ack_number: Some(LOCAL_SEQ + 1 + 1),
5577                ..SEND_TEMPL
5578            }
5579        );
5580        assert_eq!(s.state, State::FinWait2);
5581        send!(
5582            s,
5583            TcpRepr {
5584                control: TcpControl::Fin,
5585                seq_number: REMOTE_SEQ + 1,
5586                ack_number: Some(LOCAL_SEQ + 1 + 1),
5587                ..SEND_TEMPL
5588            }
5589        );
5590        assert_eq!(s.state, State::TimeWait);
5591        recv!(
5592            s,
5593            [TcpRepr {
5594                seq_number: LOCAL_SEQ + 1 + 1,
5595                ack_number: Some(REMOTE_SEQ + 1 + 1),
5596                ..RECV_TEMPL
5597            }]
5598        );
5599    }
5600
5601    #[test]
5602    fn test_simultaneous_close() {
5603        let mut s = socket_established();
5604        s.close();
5605        assert_eq!(s.state, State::FinWait1);
5606        recv!(
5607            s,
5608            [TcpRepr {
5609                // due to reordering, this is logically located...
5610                control: TcpControl::Fin,
5611                seq_number: LOCAL_SEQ + 1,
5612                ack_number: Some(REMOTE_SEQ + 1),
5613                ..RECV_TEMPL
5614            }]
5615        );
5616        send!(
5617            s,
5618            TcpRepr {
5619                control: TcpControl::Fin,
5620                seq_number: REMOTE_SEQ + 1,
5621                ack_number: Some(LOCAL_SEQ + 1),
5622                ..SEND_TEMPL
5623            }
5624        );
5625        assert_eq!(s.state, State::Closing);
5626        recv!(
5627            s,
5628            [TcpRepr {
5629                seq_number: LOCAL_SEQ + 1 + 1,
5630                ack_number: Some(REMOTE_SEQ + 1 + 1),
5631                ..RECV_TEMPL
5632            }]
5633        );
5634        // ... at this point
5635        send!(
5636            s,
5637            TcpRepr {
5638                seq_number: REMOTE_SEQ + 1 + 1,
5639                ack_number: Some(LOCAL_SEQ + 1 + 1),
5640                ..SEND_TEMPL
5641            }
5642        );
5643        assert_eq!(s.state, State::TimeWait);
5644        recv!(s, []);
5645    }
5646
5647    #[test]
5648    fn test_simultaneous_close_combined_fin_ack() {
5649        let mut s = socket_established();
5650        s.close();
5651        assert_eq!(s.state, State::FinWait1);
5652        recv!(
5653            s,
5654            [TcpRepr {
5655                control: TcpControl::Fin,
5656                seq_number: LOCAL_SEQ + 1,
5657                ack_number: Some(REMOTE_SEQ + 1),
5658                ..RECV_TEMPL
5659            }]
5660        );
5661        send!(
5662            s,
5663            TcpRepr {
5664                control: TcpControl::Fin,
5665                seq_number: REMOTE_SEQ + 1,
5666                ack_number: Some(LOCAL_SEQ + 1 + 1),
5667                ..SEND_TEMPL
5668            }
5669        );
5670        assert_eq!(s.state, State::TimeWait);
5671        recv!(
5672            s,
5673            [TcpRepr {
5674                seq_number: LOCAL_SEQ + 1 + 1,
5675                ack_number: Some(REMOTE_SEQ + 1 + 1),
5676                ..RECV_TEMPL
5677            }]
5678        );
5679    }
5680
5681    #[test]
5682    fn test_simultaneous_close_raced() {
5683        let mut s = socket_established();
5684        s.close();
5685        assert_eq!(s.state, State::FinWait1);
5686
5687        // Socket receives FIN before it has a chance to send its own FIN
5688        send!(
5689            s,
5690            TcpRepr {
5691                control: TcpControl::Fin,
5692                seq_number: REMOTE_SEQ + 1,
5693                ack_number: Some(LOCAL_SEQ + 1),
5694                ..SEND_TEMPL
5695            }
5696        );
5697        assert_eq!(s.state, State::Closing);
5698
5699        // FIN + ack-of-FIN
5700        recv!(
5701            s,
5702            [TcpRepr {
5703                control: TcpControl::Fin,
5704                seq_number: LOCAL_SEQ + 1,
5705                ack_number: Some(REMOTE_SEQ + 1 + 1),
5706                ..RECV_TEMPL
5707            }]
5708        );
5709        assert_eq!(s.state, State::Closing);
5710
5711        send!(
5712            s,
5713            TcpRepr {
5714                seq_number: REMOTE_SEQ + 1 + 1,
5715                ack_number: Some(LOCAL_SEQ + 1 + 1),
5716                ..SEND_TEMPL
5717            }
5718        );
5719        assert_eq!(s.state, State::TimeWait);
5720        recv!(s, []);
5721    }
5722
5723    #[test]
5724    fn test_simultaneous_close_raced_with_data() {
5725        let mut s = socket_established();
5726        s.send_slice(b"abcdef").unwrap();
5727        s.close();
5728        assert_eq!(s.state, State::FinWait1);
5729
5730        // Socket receives FIN before it has a chance to send its own data+FIN
5731        send!(
5732            s,
5733            TcpRepr {
5734                control: TcpControl::Fin,
5735                seq_number: REMOTE_SEQ + 1,
5736                ack_number: Some(LOCAL_SEQ + 1),
5737                ..SEND_TEMPL
5738            }
5739        );
5740        assert_eq!(s.state, State::Closing);
5741
5742        // data + FIN + ack-of-FIN
5743        recv!(
5744            s,
5745            [TcpRepr {
5746                control: TcpControl::Fin,
5747                seq_number: LOCAL_SEQ + 1,
5748                ack_number: Some(REMOTE_SEQ + 1 + 1),
5749                payload: &b"abcdef"[..],
5750                ..RECV_TEMPL
5751            }]
5752        );
5753        assert_eq!(s.state, State::Closing);
5754
5755        send!(
5756            s,
5757            TcpRepr {
5758                seq_number: REMOTE_SEQ + 1 + 1,
5759                ack_number: Some(LOCAL_SEQ + 1 + 6 + 1),
5760                ..SEND_TEMPL
5761            }
5762        );
5763        assert_eq!(s.state, State::TimeWait);
5764        recv!(s, []);
5765    }
5766
5767    #[test]
5768    fn test_fin_with_data() {
5769        let mut s = socket_established();
5770        s.send_slice(b"abcdef").unwrap();
5771        s.close();
5772        recv!(
5773            s,
5774            [TcpRepr {
5775                control: TcpControl::Fin,
5776                seq_number: LOCAL_SEQ + 1,
5777                ack_number: Some(REMOTE_SEQ + 1),
5778                payload: &b"abcdef"[..],
5779                ..RECV_TEMPL
5780            }]
5781        )
5782    }
5783
5784    #[test]
5785    fn test_mutual_close_with_data_1() {
5786        let mut s = socket_established();
5787        s.send_slice(b"abcdef").unwrap();
5788        s.close();
5789        assert_eq!(s.state, State::FinWait1);
5790        recv!(
5791            s,
5792            [TcpRepr {
5793                control: TcpControl::Fin,
5794                seq_number: LOCAL_SEQ + 1,
5795                ack_number: Some(REMOTE_SEQ + 1),
5796                payload: &b"abcdef"[..],
5797                ..RECV_TEMPL
5798            }]
5799        );
5800        send!(
5801            s,
5802            TcpRepr {
5803                control: TcpControl::Fin,
5804                seq_number: REMOTE_SEQ + 1,
5805                ack_number: Some(LOCAL_SEQ + 1 + 6 + 1),
5806                ..SEND_TEMPL
5807            }
5808        );
5809    }
5810
5811    #[test]
5812    fn test_mutual_close_with_data_2() {
5813        let mut s = socket_established();
5814        s.send_slice(b"abcdef").unwrap();
5815        s.close();
5816        assert_eq!(s.state, State::FinWait1);
5817        recv!(
5818            s,
5819            [TcpRepr {
5820                control: TcpControl::Fin,
5821                seq_number: LOCAL_SEQ + 1,
5822                ack_number: Some(REMOTE_SEQ + 1),
5823                payload: &b"abcdef"[..],
5824                ..RECV_TEMPL
5825            }]
5826        );
5827        send!(
5828            s,
5829            TcpRepr {
5830                seq_number: REMOTE_SEQ + 1,
5831                ack_number: Some(LOCAL_SEQ + 1 + 6 + 1),
5832                ..SEND_TEMPL
5833            }
5834        );
5835        assert_eq!(s.state, State::FinWait2);
5836        send!(
5837            s,
5838            TcpRepr {
5839                control: TcpControl::Fin,
5840                seq_number: REMOTE_SEQ + 1,
5841                ack_number: Some(LOCAL_SEQ + 1 + 6 + 1),
5842                ..SEND_TEMPL
5843            }
5844        );
5845        recv!(
5846            s,
5847            [TcpRepr {
5848                seq_number: LOCAL_SEQ + 1 + 6 + 1,
5849                ack_number: Some(REMOTE_SEQ + 1 + 1),
5850                ..RECV_TEMPL
5851            }]
5852        );
5853        assert_eq!(s.state, State::TimeWait);
5854    }
5855
5856    // =========================================================================================//
5857    // Tests for retransmission on packet loss.
5858    // =========================================================================================//
5859
5860    #[test]
5861    fn test_duplicate_seq_ack() {
5862        let mut s = socket_recved();
5863        // remote retransmission
5864        send!(
5865            s,
5866            TcpRepr {
5867                seq_number: REMOTE_SEQ + 1,
5868                ack_number: Some(LOCAL_SEQ + 1),
5869                payload: &b"abcdef"[..],
5870                ..SEND_TEMPL
5871            },
5872            Some(TcpRepr {
5873                seq_number: LOCAL_SEQ + 1,
5874                ack_number: Some(REMOTE_SEQ + 1 + 6),
5875                window_len: 58,
5876                ..RECV_TEMPL
5877            })
5878        );
5879    }
5880
5881    #[test]
5882    fn test_data_retransmit() {
5883        let mut s = socket_established();
5884        s.send_slice(b"abcdef").unwrap();
5885        recv!(s, time 1000, Ok(TcpRepr {
5886            seq_number: LOCAL_SEQ + 1,
5887            ack_number: Some(REMOTE_SEQ + 1),
5888            payload:    &b"abcdef"[..],
5889            ..RECV_TEMPL
5890        }));
5891        recv_nothing!(s, time 1050);
5892        recv!(s, time 2000, Ok(TcpRepr {
5893            seq_number: LOCAL_SEQ + 1,
5894            ack_number: Some(REMOTE_SEQ + 1),
5895            payload:    &b"abcdef"[..],
5896            ..RECV_TEMPL
5897        }));
5898    }
5899
5900    #[test]
5901    fn test_data_retransmit_bursts() {
5902        let mut s = socket_established();
5903        s.remote_mss = 6;
5904        s.send_slice(b"abcdef012345").unwrap();
5905
5906        recv!(s, time 0, Ok(TcpRepr {
5907            control:    TcpControl::None,
5908            seq_number: LOCAL_SEQ + 1,
5909            ack_number: Some(REMOTE_SEQ + 1),
5910            payload:    &b"abcdef"[..],
5911            ..RECV_TEMPL
5912        }), exact);
5913        recv!(s, time 0, Ok(TcpRepr {
5914            control:    TcpControl::Psh,
5915            seq_number: LOCAL_SEQ + 1 + 6,
5916            ack_number: Some(REMOTE_SEQ + 1),
5917            payload:    &b"012345"[..],
5918            ..RECV_TEMPL
5919        }), exact);
5920        recv_nothing!(s, time 0);
5921
5922        recv_nothing!(s, time 50);
5923
5924        recv!(s, time 1000, Ok(TcpRepr {
5925            control:    TcpControl::None,
5926            seq_number: LOCAL_SEQ + 1,
5927            ack_number: Some(REMOTE_SEQ + 1),
5928            payload:    &b"abcdef"[..],
5929            ..RECV_TEMPL
5930        }), exact);
5931        recv!(s, time 1500, Ok(TcpRepr {
5932            control:    TcpControl::Psh,
5933            seq_number: LOCAL_SEQ + 1 + 6,
5934            ack_number: Some(REMOTE_SEQ + 1),
5935            payload:    &b"012345"[..],
5936            ..RECV_TEMPL
5937        }), exact);
5938        recv_nothing!(s, time 1550);
5939    }
5940
5941    #[test]
5942    fn test_data_retransmit_bursts_half_ack() {
5943        let mut s = socket_established();
5944        s.remote_mss = 6;
5945        s.send_slice(b"abcdef012345").unwrap();
5946
5947        recv!(s, time 0, Ok(TcpRepr {
5948            control:    TcpControl::None,
5949            seq_number: LOCAL_SEQ + 1,
5950            ack_number: Some(REMOTE_SEQ + 1),
5951            payload:    &b"abcdef"[..],
5952            ..RECV_TEMPL
5953        }), exact);
5954        recv!(s, time 0, Ok(TcpRepr {
5955            control:    TcpControl::Psh,
5956            seq_number: LOCAL_SEQ + 1 + 6,
5957            ack_number: Some(REMOTE_SEQ + 1),
5958            payload:    &b"012345"[..],
5959            ..RECV_TEMPL
5960        }), exact);
5961        // Acknowledge the first packet
5962        send!(s, time 5, TcpRepr {
5963            seq_number: REMOTE_SEQ + 1,
5964            ack_number: Some(LOCAL_SEQ + 1 + 6),
5965            window_len: 6,
5966            ..SEND_TEMPL
5967        });
5968        // The second packet should be re-sent.
5969        recv!(s, time 1500, Ok(TcpRepr {
5970            control:    TcpControl::Psh,
5971            seq_number: LOCAL_SEQ + 1 + 6,
5972            ack_number: Some(REMOTE_SEQ + 1),
5973            payload:    &b"012345"[..],
5974            ..RECV_TEMPL
5975        }), exact);
5976
5977        recv_nothing!(s, time 1550);
5978    }
5979
5980    #[test]
5981    fn test_retransmit_timer_restart_on_partial_ack() {
5982        let mut s = socket_established();
5983        s.remote_mss = 6;
5984        s.send_slice(b"abcdef012345").unwrap();
5985
5986        recv!(s, time 0, Ok(TcpRepr {
5987            control:    TcpControl::None,
5988            seq_number: LOCAL_SEQ + 1,
5989            ack_number: Some(REMOTE_SEQ + 1),
5990            payload:    &b"abcdef"[..],
5991            ..RECV_TEMPL
5992        }), exact);
5993        recv!(s, time 0, Ok(TcpRepr {
5994            control:    TcpControl::Psh,
5995            seq_number: LOCAL_SEQ + 1 + 6,
5996            ack_number: Some(REMOTE_SEQ + 1),
5997            payload:    &b"012345"[..],
5998            ..RECV_TEMPL
5999        }), exact);
6000        // Acknowledge the first packet
6001        send!(s, time 600, TcpRepr {
6002            seq_number: REMOTE_SEQ + 1,
6003            ack_number: Some(LOCAL_SEQ + 1 + 6),
6004            window_len: 6,
6005            ..SEND_TEMPL
6006        });
6007        // The ACK of the first packet should restart the retransmit timer and delay a retransmission.
6008        recv_nothing!(s, time 2399);
6009        // The second packet should be re-sent.
6010        recv!(s, time 2400, Ok(TcpRepr {
6011            control:    TcpControl::Psh,
6012            seq_number: LOCAL_SEQ + 1 + 6,
6013            ack_number: Some(REMOTE_SEQ + 1),
6014            payload:    &b"012345"[..],
6015            ..RECV_TEMPL
6016        }), exact);
6017    }
6018
6019    #[test]
6020    fn test_data_retransmit_bursts_half_ack_close() {
6021        let mut s = socket_established();
6022        s.remote_mss = 6;
6023        s.send_slice(b"abcdef012345").unwrap();
6024        s.close();
6025
6026        recv!(s, time 0, Ok(TcpRepr {
6027            control:    TcpControl::None,
6028            seq_number: LOCAL_SEQ + 1,
6029            ack_number: Some(REMOTE_SEQ + 1),
6030            payload:    &b"abcdef"[..],
6031            ..RECV_TEMPL
6032        }), exact);
6033        recv!(s, time 0, Ok(TcpRepr {
6034            control:    TcpControl::Fin,
6035            seq_number: LOCAL_SEQ + 1 + 6,
6036            ack_number: Some(REMOTE_SEQ + 1),
6037            payload:    &b"012345"[..],
6038            ..RECV_TEMPL
6039        }), exact);
6040        // Acknowledge the first packet
6041        send!(s, time 5, TcpRepr {
6042            seq_number: REMOTE_SEQ + 1,
6043            ack_number: Some(LOCAL_SEQ + 1 + 6),
6044            window_len: 6,
6045            ..SEND_TEMPL
6046        });
6047        // The second packet should be re-sent.
6048        recv!(s, time 1500, Ok(TcpRepr {
6049            control:    TcpControl::Fin,
6050            seq_number: LOCAL_SEQ + 1 + 6,
6051            ack_number: Some(REMOTE_SEQ + 1),
6052            payload:    &b"012345"[..],
6053            ..RECV_TEMPL
6054        }), exact);
6055
6056        recv_nothing!(s, time 1550);
6057    }
6058
6059    #[test]
6060    fn test_send_data_after_syn_ack_retransmit() {
6061        let mut s = socket_syn_received();
6062        recv!(s, time 50, Ok(TcpRepr {
6063            control:    TcpControl::Syn,
6064            seq_number: LOCAL_SEQ,
6065            ack_number: Some(REMOTE_SEQ + 1),
6066            max_seg_size: Some(BASE_MSS),
6067            ..RECV_TEMPL
6068        }));
6069        recv!(s, time 1050, Ok(TcpRepr { // retransmit
6070            control:    TcpControl::Syn,
6071            seq_number: LOCAL_SEQ,
6072            ack_number: Some(REMOTE_SEQ + 1),
6073            max_seg_size: Some(BASE_MSS),
6074            ..RECV_TEMPL
6075        }));
6076        send!(
6077            s,
6078            TcpRepr {
6079                seq_number: REMOTE_SEQ + 1,
6080                ack_number: Some(LOCAL_SEQ + 1),
6081                ..SEND_TEMPL
6082            }
6083        );
6084        assert_eq!(s.state(), State::Established);
6085        s.send_slice(b"abcdef").unwrap();
6086        recv!(
6087            s,
6088            [TcpRepr {
6089                seq_number: LOCAL_SEQ + 1,
6090                ack_number: Some(REMOTE_SEQ + 1),
6091                payload: &b"abcdef"[..],
6092                ..RECV_TEMPL
6093            }]
6094        )
6095    }
6096
6097    #[test]
6098    fn test_established_retransmit_for_dup_ack() {
6099        let mut s = socket_established();
6100        // Duplicate ACKs do not replace the retransmission timer
6101        s.send_slice(b"abc").unwrap();
6102        recv!(s, time 1000, Ok(TcpRepr {
6103            seq_number: LOCAL_SEQ + 1,
6104            ack_number: Some(REMOTE_SEQ + 1),
6105            payload:    &b"abc"[..],
6106            ..RECV_TEMPL
6107        }));
6108        // Retransmit timer is on because all data was sent
6109        assert_eq!(s.tx_buffer.len(), 3);
6110        // ACK nothing new
6111        send!(
6112            s,
6113            TcpRepr {
6114                seq_number: REMOTE_SEQ + 1,
6115                ack_number: Some(LOCAL_SEQ + 1),
6116                ..SEND_TEMPL
6117            }
6118        );
6119        // Retransmit
6120        recv!(s, time 4000, Ok(TcpRepr {
6121            seq_number: LOCAL_SEQ + 1,
6122            ack_number: Some(REMOTE_SEQ + 1),
6123            payload:    &b"abc"[..],
6124            ..RECV_TEMPL
6125        }));
6126    }
6127
6128    #[test]
6129    fn test_established_retransmit_reset_after_ack() {
6130        let mut s = socket_established();
6131        s.remote_win_len = 6;
6132        s.send_slice(b"abcdef").unwrap();
6133        s.send_slice(b"123456").unwrap();
6134        s.send_slice(b"ABCDEF").unwrap();
6135        recv!(s, time 1000, Ok(TcpRepr {
6136            seq_number: LOCAL_SEQ + 1,
6137            ack_number: Some(REMOTE_SEQ + 1),
6138            payload:    &b"abcdef"[..],
6139            ..RECV_TEMPL
6140        }));
6141        send!(s, time 1005, TcpRepr {
6142            seq_number: REMOTE_SEQ + 1,
6143            ack_number: Some(LOCAL_SEQ + 1 + 6),
6144            window_len: 6,
6145            ..SEND_TEMPL
6146        });
6147        recv!(s, time 1010, Ok(TcpRepr {
6148            seq_number: LOCAL_SEQ + 1 + 6,
6149            ack_number: Some(REMOTE_SEQ + 1),
6150            payload:    &b"123456"[..],
6151            ..RECV_TEMPL
6152        }));
6153        send!(s, time 1015, TcpRepr {
6154            seq_number: REMOTE_SEQ + 1,
6155            ack_number: Some(LOCAL_SEQ + 1 + 6 + 6),
6156            window_len: 6,
6157            ..SEND_TEMPL
6158        });
6159        recv!(s, time 1020, Ok(TcpRepr {
6160            seq_number: LOCAL_SEQ + 1 + 6 + 6,
6161            ack_number: Some(REMOTE_SEQ + 1),
6162            payload:    &b"ABCDEF"[..],
6163            ..RECV_TEMPL
6164        }));
6165    }
6166
6167    #[test]
6168    fn test_established_queue_during_retransmission() {
6169        let mut s = socket_established();
6170        s.remote_mss = 6;
6171        s.send_slice(b"abcdef123456ABCDEF").unwrap();
6172        recv!(s, time 1000, Ok(TcpRepr {
6173            seq_number: LOCAL_SEQ + 1,
6174            ack_number: Some(REMOTE_SEQ + 1),
6175            payload:    &b"abcdef"[..],
6176            ..RECV_TEMPL
6177        })); // this one is dropped
6178        recv!(s, time 1005, Ok(TcpRepr {
6179            seq_number: LOCAL_SEQ + 1 + 6,
6180            ack_number: Some(REMOTE_SEQ + 1),
6181            payload:    &b"123456"[..],
6182            ..RECV_TEMPL
6183        })); // this one is received
6184        recv!(s, time 1010, Ok(TcpRepr {
6185            seq_number: LOCAL_SEQ + 1 + 6 + 6,
6186            ack_number: Some(REMOTE_SEQ + 1),
6187            payload:    &b"ABCDEF"[..],
6188            ..RECV_TEMPL
6189        })); // also dropped
6190        recv!(s, time 3000, Ok(TcpRepr {
6191            seq_number: LOCAL_SEQ + 1,
6192            ack_number: Some(REMOTE_SEQ + 1),
6193            payload:    &b"abcdef"[..],
6194            ..RECV_TEMPL
6195        })); // retransmission
6196        send!(s, time 3005, TcpRepr {
6197            seq_number: REMOTE_SEQ + 1,
6198            ack_number: Some(LOCAL_SEQ + 1 + 6 + 6),
6199            ..SEND_TEMPL
6200        }); // acknowledgement of both segments
6201        recv!(s, time 3010, Ok(TcpRepr {
6202            seq_number: LOCAL_SEQ + 1 + 6 + 6,
6203            ack_number: Some(REMOTE_SEQ + 1),
6204            payload:    &b"ABCDEF"[..],
6205            ..RECV_TEMPL
6206        })); // retransmission of only unacknowledged data
6207    }
6208
6209    #[test]
6210    fn test_close_wait_retransmit_reset_after_ack() {
6211        let mut s = socket_close_wait();
6212        s.remote_win_len = 6;
6213        s.send_slice(b"abcdef").unwrap();
6214        s.send_slice(b"123456").unwrap();
6215        s.send_slice(b"ABCDEF").unwrap();
6216        recv!(s, time 1000, Ok(TcpRepr {
6217            seq_number: LOCAL_SEQ + 1,
6218            ack_number: Some(REMOTE_SEQ + 1 + 1),
6219            payload:    &b"abcdef"[..],
6220            ..RECV_TEMPL
6221        }));
6222        send!(s, time 1005, TcpRepr {
6223            seq_number: REMOTE_SEQ + 1 + 1,
6224            ack_number: Some(LOCAL_SEQ + 1 + 6),
6225            window_len: 6,
6226            ..SEND_TEMPL
6227        });
6228        recv!(s, time 1010, Ok(TcpRepr {
6229            seq_number: LOCAL_SEQ + 1 + 6,
6230            ack_number: Some(REMOTE_SEQ + 1 + 1),
6231            payload:    &b"123456"[..],
6232            ..RECV_TEMPL
6233        }));
6234        send!(s, time 1015, TcpRepr {
6235            seq_number: REMOTE_SEQ + 1 + 1,
6236            ack_number: Some(LOCAL_SEQ + 1 + 6 + 6),
6237            window_len: 6,
6238            ..SEND_TEMPL
6239        });
6240        recv!(s, time 1020, Ok(TcpRepr {
6241            seq_number: LOCAL_SEQ + 1 + 6 + 6,
6242            ack_number: Some(REMOTE_SEQ + 1 + 1),
6243            payload:    &b"ABCDEF"[..],
6244            ..RECV_TEMPL
6245        }));
6246    }
6247
6248    #[test]
6249    fn test_fin_wait_1_retransmit_reset_after_ack() {
6250        let mut s = socket_established();
6251        s.remote_win_len = 6;
6252        s.send_slice(b"abcdef").unwrap();
6253        s.send_slice(b"123456").unwrap();
6254        s.send_slice(b"ABCDEF").unwrap();
6255        s.close();
6256        recv!(s, time 1000, Ok(TcpRepr {
6257            seq_number: LOCAL_SEQ + 1,
6258            ack_number: Some(REMOTE_SEQ + 1),
6259            payload:    &b"abcdef"[..],
6260            ..RECV_TEMPL
6261        }));
6262        send!(s, time 1005, TcpRepr {
6263            seq_number: REMOTE_SEQ + 1,
6264            ack_number: Some(LOCAL_SEQ + 1 + 6),
6265            window_len: 6,
6266            ..SEND_TEMPL
6267        });
6268        recv!(s, time 1010, Ok(TcpRepr {
6269            seq_number: LOCAL_SEQ + 1 + 6,
6270            ack_number: Some(REMOTE_SEQ + 1),
6271            payload:    &b"123456"[..],
6272            ..RECV_TEMPL
6273        }));
6274        send!(s, time 1015, TcpRepr {
6275            seq_number: REMOTE_SEQ + 1,
6276            ack_number: Some(LOCAL_SEQ + 1 + 6 + 6),
6277            window_len: 6,
6278            ..SEND_TEMPL
6279        });
6280        recv!(s, time 1020, Ok(TcpRepr {
6281            control:    TcpControl::Fin,
6282            seq_number: LOCAL_SEQ + 1 + 6 + 6,
6283            ack_number: Some(REMOTE_SEQ + 1),
6284            payload:    &b"ABCDEF"[..],
6285            ..RECV_TEMPL
6286        }));
6287    }
6288
6289    #[test]
6290    fn test_fast_retransmit_after_triple_duplicate_ack() {
6291        let mut s = socket_established();
6292        s.remote_mss = 6;
6293
6294        // Normal ACK of previously received segment
6295        send!(s, time 0, TcpRepr {
6296            seq_number: REMOTE_SEQ + 1,
6297            ack_number: Some(LOCAL_SEQ + 1),
6298            ..SEND_TEMPL
6299        });
6300
6301        // Send a long string of text divided into several packets
6302        // because of previously received "window_len"
6303        s.send_slice(b"xxxxxxyyyyyywwwwwwzzzzzz").unwrap();
6304        // This packet is lost
6305        recv!(s, time 1000, Ok(TcpRepr {
6306            seq_number: LOCAL_SEQ + 1,
6307            ack_number: Some(REMOTE_SEQ + 1),
6308            payload:    &b"xxxxxx"[..],
6309            ..RECV_TEMPL
6310        }));
6311        recv!(s, time 1005, Ok(TcpRepr {
6312            seq_number: LOCAL_SEQ + 1 + 6,
6313            ack_number: Some(REMOTE_SEQ + 1),
6314            payload:    &b"yyyyyy"[..],
6315            ..RECV_TEMPL
6316        }));
6317        recv!(s, time 1010, Ok(TcpRepr {
6318            seq_number: LOCAL_SEQ + 1 + (6 * 2),
6319            ack_number: Some(REMOTE_SEQ + 1),
6320            payload:    &b"wwwwww"[..],
6321            ..RECV_TEMPL
6322        }));
6323        recv!(s, time 1015, Ok(TcpRepr {
6324            seq_number: LOCAL_SEQ + 1 + (6 * 3),
6325            ack_number: Some(REMOTE_SEQ + 1),
6326            payload:    &b"zzzzzz"[..],
6327            ..RECV_TEMPL
6328        }));
6329
6330        // First duplicate ACK
6331        send!(s, time 1050, TcpRepr {
6332            seq_number: REMOTE_SEQ + 1,
6333            ack_number: Some(LOCAL_SEQ + 1),
6334            ..SEND_TEMPL
6335        });
6336        // Second duplicate ACK
6337        send!(s, time 1055, TcpRepr {
6338            seq_number: REMOTE_SEQ + 1,
6339            ack_number: Some(LOCAL_SEQ + 1),
6340            ..SEND_TEMPL
6341        });
6342        // Third duplicate ACK
6343        // Should trigger a fast retransmit of dropped packet
6344        send!(s, time 1060, TcpRepr {
6345            seq_number: REMOTE_SEQ + 1,
6346            ack_number: Some(LOCAL_SEQ + 1),
6347            ..SEND_TEMPL
6348        });
6349
6350        // Fast retransmit packet
6351        recv!(s, time 1100, Ok(TcpRepr {
6352            seq_number: LOCAL_SEQ + 1,
6353            ack_number: Some(REMOTE_SEQ + 1),
6354            payload:    &b"xxxxxx"[..],
6355            ..RECV_TEMPL
6356        }));
6357
6358        recv!(s, time 1105, Ok(TcpRepr {
6359            seq_number: LOCAL_SEQ + 1 + 6,
6360            ack_number: Some(REMOTE_SEQ + 1),
6361            payload:    &b"yyyyyy"[..],
6362            ..RECV_TEMPL
6363        }));
6364        recv!(s, time 1110, Ok(TcpRepr {
6365            seq_number: LOCAL_SEQ + 1 + (6 * 2),
6366            ack_number: Some(REMOTE_SEQ + 1),
6367            payload:    &b"wwwwww"[..],
6368            ..RECV_TEMPL
6369        }));
6370        recv!(s, time 1115, Ok(TcpRepr {
6371            seq_number: LOCAL_SEQ + 1 + (6 * 3),
6372            ack_number: Some(REMOTE_SEQ + 1),
6373            payload:    &b"zzzzzz"[..],
6374            ..RECV_TEMPL
6375        }));
6376
6377        // After all was send out, enter *normal* retransmission,
6378        // don't stay in fast retransmission.
6379        assert!(match s.timer {
6380            Timer::Retransmit { expires_at, .. } => expires_at > Instant::from_millis(1115),
6381            _ => false,
6382        });
6383
6384        // ACK all received segments
6385        send!(s, time 1120, TcpRepr {
6386            seq_number: REMOTE_SEQ + 1,
6387            ack_number: Some(LOCAL_SEQ + 1 + (6 * 4)),
6388            ..SEND_TEMPL
6389        });
6390    }
6391
6392    #[test]
6393    fn test_fast_retransmit_duplicate_detection_with_data() {
6394        let mut s = socket_established();
6395
6396        s.send_slice(b"abc").unwrap(); // This is lost
6397        recv!(s, time 1000, Ok(TcpRepr {
6398            seq_number: LOCAL_SEQ + 1,
6399            ack_number: Some(REMOTE_SEQ + 1),
6400            payload:    &b"abc"[..],
6401            ..RECV_TEMPL
6402        }));
6403
6404        // Normal ACK of previously received segment
6405        send!(
6406            s,
6407            TcpRepr {
6408                seq_number: REMOTE_SEQ + 1,
6409                ack_number: Some(LOCAL_SEQ + 1),
6410                ..SEND_TEMPL
6411            }
6412        );
6413        // First duplicate
6414        send!(
6415            s,
6416            TcpRepr {
6417                seq_number: REMOTE_SEQ + 1,
6418                ack_number: Some(LOCAL_SEQ + 1),
6419                ..SEND_TEMPL
6420            }
6421        );
6422        // Second duplicate
6423        send!(
6424            s,
6425            TcpRepr {
6426                seq_number: REMOTE_SEQ + 1,
6427                ack_number: Some(LOCAL_SEQ + 1),
6428                ..SEND_TEMPL
6429            }
6430        );
6431
6432        assert_eq!(s.local_rx_dup_acks, 2, "duplicate ACK counter is not set");
6433
6434        // This packet has content, hence should not be detected
6435        // as a duplicate ACK and should reset the duplicate ACK count
6436        send!(
6437            s,
6438            TcpRepr {
6439                seq_number: REMOTE_SEQ + 1,
6440                ack_number: Some(LOCAL_SEQ + 1),
6441                payload: &b"xxxxxx"[..],
6442                ..SEND_TEMPL
6443            }
6444        );
6445
6446        recv!(
6447            s,
6448            [TcpRepr {
6449                seq_number: LOCAL_SEQ + 1 + 3,
6450                ack_number: Some(REMOTE_SEQ + 1 + 6),
6451                window_len: 58,
6452                ..RECV_TEMPL
6453            }]
6454        );
6455
6456        assert_eq!(
6457            s.local_rx_dup_acks, 0,
6458            "duplicate ACK counter is not reset when receiving data"
6459        );
6460    }
6461
6462    #[test]
6463    fn test_fast_retransmit_duplicate_detection_with_window_update() {
6464        let mut s = socket_established();
6465
6466        s.send_slice(b"abc").unwrap(); // This is lost
6467        recv!(s, time 1000, Ok(TcpRepr {
6468            seq_number: LOCAL_SEQ + 1,
6469            ack_number: Some(REMOTE_SEQ + 1),
6470            payload:    &b"abc"[..],
6471            ..RECV_TEMPL
6472        }));
6473
6474        // Normal ACK of previously received segment
6475        send!(
6476            s,
6477            TcpRepr {
6478                seq_number: REMOTE_SEQ + 1,
6479                ack_number: Some(LOCAL_SEQ + 1),
6480                ..SEND_TEMPL
6481            }
6482        );
6483        // First duplicate
6484        send!(
6485            s,
6486            TcpRepr {
6487                seq_number: REMOTE_SEQ + 1,
6488                ack_number: Some(LOCAL_SEQ + 1),
6489                ..SEND_TEMPL
6490            }
6491        );
6492        // Second duplicate
6493        send!(
6494            s,
6495            TcpRepr {
6496                seq_number: REMOTE_SEQ + 1,
6497                ack_number: Some(LOCAL_SEQ + 1),
6498                ..SEND_TEMPL
6499            }
6500        );
6501
6502        assert_eq!(s.local_rx_dup_acks, 2, "duplicate ACK counter is not set");
6503
6504        // This packet has a window update, hence should not be detected
6505        // as a duplicate ACK and should reset the duplicate ACK count
6506        send!(
6507            s,
6508            TcpRepr {
6509                seq_number: REMOTE_SEQ + 1,
6510                ack_number: Some(LOCAL_SEQ + 1),
6511                window_len: 400,
6512                ..SEND_TEMPL
6513            }
6514        );
6515
6516        assert_eq!(
6517            s.local_rx_dup_acks, 0,
6518            "duplicate ACK counter is not reset when receiving a window update"
6519        );
6520    }
6521
6522    #[test]
6523    fn test_fast_retransmit_duplicate_detection() {
6524        let mut s = socket_established();
6525        s.remote_mss = 6;
6526
6527        // Normal ACK of previously received segment
6528        send!(s, time 0, TcpRepr {
6529            seq_number: REMOTE_SEQ + 1,
6530            ack_number: Some(LOCAL_SEQ + 1),
6531            ..SEND_TEMPL
6532        });
6533
6534        // First duplicate, should not be counted as there is nothing to resend
6535        send!(s, time 0, TcpRepr {
6536            seq_number: REMOTE_SEQ + 1,
6537            ack_number: Some(LOCAL_SEQ + 1),
6538            ..SEND_TEMPL
6539        });
6540
6541        assert_eq!(
6542            s.local_rx_dup_acks, 0,
6543            "duplicate ACK counter is set but wound not transmit data"
6544        );
6545
6546        // Send a long string of text divided into several packets
6547        // because of small remote_mss
6548        s.send_slice(b"xxxxxxyyyyyywwwwwwzzzzzz").unwrap();
6549
6550        // This packet is reordered in network
6551        recv!(s, time 1000, Ok(TcpRepr {
6552            seq_number: LOCAL_SEQ + 1,
6553            ack_number: Some(REMOTE_SEQ + 1),
6554            payload:    &b"xxxxxx"[..],
6555            ..RECV_TEMPL
6556        }));
6557        recv!(s, time 1005, Ok(TcpRepr {
6558            seq_number: LOCAL_SEQ + 1 + 6,
6559            ack_number: Some(REMOTE_SEQ + 1),
6560            payload:    &b"yyyyyy"[..],
6561            ..RECV_TEMPL
6562        }));
6563        recv!(s, time 1010, Ok(TcpRepr {
6564            seq_number: LOCAL_SEQ + 1 + (6 * 2),
6565            ack_number: Some(REMOTE_SEQ + 1),
6566            payload:    &b"wwwwww"[..],
6567            ..RECV_TEMPL
6568        }));
6569        recv!(s, time 1015, Ok(TcpRepr {
6570            seq_number: LOCAL_SEQ + 1 + (6 * 3),
6571            ack_number: Some(REMOTE_SEQ + 1),
6572            payload:    &b"zzzzzz"[..],
6573            ..RECV_TEMPL
6574        }));
6575
6576        // First duplicate ACK
6577        send!(s, time 1050, TcpRepr {
6578            seq_number: REMOTE_SEQ + 1,
6579            ack_number: Some(LOCAL_SEQ + 1),
6580            ..SEND_TEMPL
6581        });
6582        // Second duplicate ACK
6583        send!(s, time 1055, TcpRepr {
6584            seq_number: REMOTE_SEQ + 1,
6585            ack_number: Some(LOCAL_SEQ + 1),
6586            ..SEND_TEMPL
6587        });
6588        // Reordered packet arrives which should reset duplicate ACK count
6589        send!(s, time 1060, TcpRepr {
6590            seq_number: REMOTE_SEQ + 1,
6591            ack_number: Some(LOCAL_SEQ + 1 + (6 * 3)),
6592            ..SEND_TEMPL
6593        });
6594
6595        assert_eq!(
6596            s.local_rx_dup_acks, 0,
6597            "duplicate ACK counter is not reset when receiving ACK which updates send window"
6598        );
6599
6600        // ACK all received segments
6601        send!(s, time 1120, TcpRepr {
6602            seq_number: REMOTE_SEQ + 1,
6603            ack_number: Some(LOCAL_SEQ + 1 + (6 * 4)),
6604            ..SEND_TEMPL
6605        });
6606    }
6607
6608    #[test]
6609    fn test_fast_retransmit_dup_acks_counter() {
6610        let mut s = socket_established();
6611
6612        s.send_slice(b"abc").unwrap(); // This is lost
6613        recv!(s, time 0, Ok(TcpRepr {
6614            seq_number: LOCAL_SEQ + 1,
6615            ack_number: Some(REMOTE_SEQ + 1),
6616            payload:    &b"abc"[..],
6617            ..RECV_TEMPL
6618        }));
6619
6620        send!(s, time 0, TcpRepr {
6621            seq_number: REMOTE_SEQ + 1,
6622            ack_number: Some(LOCAL_SEQ + 1),
6623            ..SEND_TEMPL
6624        });
6625
6626        // A lot of retransmits happen here
6627        s.local_rx_dup_acks = u8::MAX - 1;
6628
6629        // Send 3 more ACKs, which could overflow local_rx_dup_acks,
6630        // but intended behaviour is that we saturate the bounds
6631        // of local_rx_dup_acks
6632        send!(s, time 0, TcpRepr {
6633            seq_number: REMOTE_SEQ + 1,
6634            ack_number: Some(LOCAL_SEQ + 1),
6635            ..SEND_TEMPL
6636        });
6637        send!(s, time 0, TcpRepr {
6638            seq_number: REMOTE_SEQ + 1,
6639            ack_number: Some(LOCAL_SEQ + 1),
6640            ..SEND_TEMPL
6641        });
6642        send!(s, time 0, TcpRepr {
6643            seq_number: REMOTE_SEQ + 1,
6644            ack_number: Some(LOCAL_SEQ + 1),
6645            ..SEND_TEMPL
6646        });
6647        assert_eq!(
6648            s.local_rx_dup_acks,
6649            u8::MAX,
6650            "duplicate ACK count should not overflow but saturate"
6651        );
6652    }
6653
6654    #[test]
6655    fn test_fast_retransmit_zero_window() {
6656        let mut s = socket_established();
6657
6658        send!(s, time 1000, TcpRepr {
6659            seq_number: REMOTE_SEQ + 1,
6660            ack_number: Some(LOCAL_SEQ + 1),
6661            ..SEND_TEMPL
6662        });
6663
6664        s.send_slice(b"abc").unwrap();
6665
6666        recv!(s, time 0, Ok(TcpRepr {
6667            seq_number: LOCAL_SEQ + 1,
6668            ack_number: Some(REMOTE_SEQ + 1),
6669            payload:    &b"abc"[..],
6670            ..RECV_TEMPL
6671        }));
6672
6673        // 3 dup acks
6674        send!(s, time 1050, TcpRepr {
6675            seq_number: REMOTE_SEQ + 1,
6676            ack_number: Some(LOCAL_SEQ + 1),
6677            ..SEND_TEMPL
6678        });
6679        send!(s, time 1050, TcpRepr {
6680            seq_number: REMOTE_SEQ + 1,
6681            ack_number: Some(LOCAL_SEQ + 1),
6682            ..SEND_TEMPL
6683        });
6684        send!(s, time 1050, TcpRepr {
6685            seq_number: REMOTE_SEQ + 1,
6686            ack_number: Some(LOCAL_SEQ + 1),
6687            window_len: 0, // boom
6688            ..SEND_TEMPL
6689        });
6690
6691        // even though we're in "fast retransmit", we shouldn't
6692        // force-send anything because the remote's window is full.
6693        recv_nothing!(s);
6694    }
6695
6696    #[test]
6697    fn test_retransmit_exponential_backoff() {
6698        let mut s = socket_established();
6699        s.send_slice(b"abcdef").unwrap();
6700        recv!(s, time 0, Ok(TcpRepr {
6701            seq_number: LOCAL_SEQ + 1,
6702            ack_number: Some(REMOTE_SEQ + 1),
6703            payload:    &b"abcdef"[..],
6704            ..RECV_TEMPL
6705        }));
6706
6707        let expected_retransmission_instant = s.rtte.retransmission_timeout().total_millis() as i64;
6708        recv_nothing!(s, time expected_retransmission_instant - 1);
6709        recv!(s, time expected_retransmission_instant, Ok(TcpRepr {
6710            seq_number: LOCAL_SEQ + 1,
6711            ack_number: Some(REMOTE_SEQ + 1),
6712            payload:    &b"abcdef"[..],
6713            ..RECV_TEMPL
6714        }));
6715
6716        // "current time" is expected_retransmission_instant, and we want to wait 2 * retransmission timeout
6717        let expected_retransmission_instant = 3 * expected_retransmission_instant;
6718
6719        recv_nothing!(s, time expected_retransmission_instant - 1);
6720        recv!(s, time expected_retransmission_instant, Ok(TcpRepr {
6721            seq_number: LOCAL_SEQ + 1,
6722            ack_number: Some(REMOTE_SEQ + 1),
6723            payload:    &b"abcdef"[..],
6724            ..RECV_TEMPL
6725        }));
6726    }
6727
6728    #[test]
6729    fn test_data_retransmit_ack_more_than_expected() {
6730        let mut s = socket_established();
6731        s.remote_mss = 6;
6732        s.send_slice(b"aaaaaabbbbbbcccccc").unwrap();
6733
6734        recv!(s, time 0, Ok(TcpRepr {
6735            seq_number: LOCAL_SEQ + 1,
6736            ack_number: Some(REMOTE_SEQ + 1),
6737            payload:    &b"aaaaaa"[..],
6738            ..RECV_TEMPL
6739        }));
6740        recv!(s, time 0, Ok(TcpRepr {
6741            seq_number: LOCAL_SEQ + 1 + 6,
6742            ack_number: Some(REMOTE_SEQ + 1),
6743            payload:    &b"bbbbbb"[..],
6744            ..RECV_TEMPL
6745        }));
6746        recv!(s, time 0, Ok(TcpRepr {
6747            seq_number: LOCAL_SEQ + 1 + 12,
6748            ack_number: Some(REMOTE_SEQ + 1),
6749            payload:    &b"cccccc"[..],
6750            ..RECV_TEMPL
6751        }));
6752        recv_nothing!(s, time 0);
6753
6754        recv_nothing!(s, time 50);
6755
6756        // retransmit timer expires, we want to retransmit all 3 packets
6757        // but we only manage to retransmit 2 (due to e.g. lack of device buffer space)
6758        assert!(s.timer.is_retransmit());
6759        recv!(s, time 1000, Ok(TcpRepr {
6760            seq_number: LOCAL_SEQ + 1,
6761            ack_number: Some(REMOTE_SEQ + 1),
6762            payload:    &b"aaaaaa"[..],
6763            ..RECV_TEMPL
6764        }));
6765        recv!(s, time 1000, Ok(TcpRepr {
6766            seq_number: LOCAL_SEQ + 1 + 6,
6767            ack_number: Some(REMOTE_SEQ + 1),
6768            payload:    &b"bbbbbb"[..],
6769            ..RECV_TEMPL
6770        }));
6771
6772        // ack first packet.
6773        send!(
6774            s,
6775            time 3000,
6776            TcpRepr {
6777                seq_number: REMOTE_SEQ + 1,
6778                ack_number: Some(LOCAL_SEQ + 1 + 6),
6779                ..SEND_TEMPL
6780            }
6781        );
6782
6783        // this should keep retransmit timer on, because there's
6784        // still unacked data.
6785        assert!(s.timer.is_retransmit());
6786
6787        // ack all three packets.
6788        // This might confuse the TCP stack because after the retransmit
6789        // it "thinks" the 3rd packet hasn't been transmitted yet, but it is getting acked.
6790        send!(
6791            s,
6792            time 3000,
6793            TcpRepr {
6794                seq_number: REMOTE_SEQ + 1,
6795                ack_number: Some(LOCAL_SEQ + 1 + 18),
6796                ..SEND_TEMPL
6797            }
6798        );
6799
6800        // this should exit retransmit mode.
6801        assert!(!s.timer.is_retransmit());
6802        // and consider all data ACKed.
6803        assert!(s.tx_buffer.is_empty());
6804        recv_nothing!(s, time 5000);
6805    }
6806
6807    #[test]
6808    fn test_retransmit_fin() {
6809        let mut s = socket_established();
6810        s.close();
6811        recv!(s, time 0, Ok(TcpRepr {
6812            control: TcpControl::Fin,
6813            seq_number: LOCAL_SEQ + 1,
6814            ack_number: Some(REMOTE_SEQ + 1),
6815            ..RECV_TEMPL
6816        }));
6817
6818        recv_nothing!(s, time 999);
6819        recv!(s, time 1000, Ok(TcpRepr {
6820            control: TcpControl::Fin,
6821            seq_number: LOCAL_SEQ + 1,
6822            ack_number: Some(REMOTE_SEQ + 1),
6823            ..RECV_TEMPL
6824        }));
6825    }
6826
6827    #[test]
6828    fn test_retransmit_fin_wait() {
6829        let mut s = socket_fin_wait_1();
6830        // we send FIN
6831        recv!(
6832            s,
6833            [TcpRepr {
6834                control: TcpControl::Fin,
6835                seq_number: LOCAL_SEQ + 1,
6836                ack_number: Some(REMOTE_SEQ + 1),
6837                ..RECV_TEMPL
6838            }]
6839        );
6840        // remote also sends FIN, does NOT ack ours.
6841        send!(
6842            s,
6843            TcpRepr {
6844                control: TcpControl::Fin,
6845                seq_number: REMOTE_SEQ + 1,
6846                ack_number: Some(LOCAL_SEQ + 1),
6847                ..SEND_TEMPL
6848            }
6849        );
6850        // we ack it
6851        recv!(
6852            s,
6853            [TcpRepr {
6854                control: TcpControl::None,
6855                seq_number: LOCAL_SEQ + 2,
6856                ack_number: Some(REMOTE_SEQ + 2),
6857                ..RECV_TEMPL
6858            }]
6859        );
6860
6861        // we haven't got an ACK for our FIN, we should retransmit.
6862        recv_nothing!(s, time 999);
6863        recv!(
6864            s,
6865            time 1000,
6866            [TcpRepr {
6867                control: TcpControl::Fin,
6868                seq_number: LOCAL_SEQ + 1,
6869                ack_number: Some(REMOTE_SEQ + 2),
6870                ..RECV_TEMPL
6871            }]
6872        );
6873        recv_nothing!(s, time 2999);
6874        recv!(
6875            s,
6876            time 3000,
6877            [TcpRepr {
6878                control: TcpControl::Fin,
6879                seq_number: LOCAL_SEQ + 1,
6880                ack_number: Some(REMOTE_SEQ + 2),
6881                ..RECV_TEMPL
6882            }]
6883        );
6884    }
6885
6886    // =========================================================================================//
6887    // Tests for window management.
6888    // =========================================================================================//
6889
6890    #[test]
6891    fn test_maximum_segment_size() {
6892        let mut s = socket_listen();
6893        s.tx_buffer = SocketBuffer::new(vec![0; 32767]);
6894        send!(
6895            s,
6896            TcpRepr {
6897                control: TcpControl::Syn,
6898                seq_number: REMOTE_SEQ,
6899                ack_number: None,
6900                max_seg_size: Some(1000),
6901                ..SEND_TEMPL
6902            }
6903        );
6904        recv!(
6905            s,
6906            [TcpRepr {
6907                control: TcpControl::Syn,
6908                seq_number: LOCAL_SEQ,
6909                ack_number: Some(REMOTE_SEQ + 1),
6910                max_seg_size: Some(BASE_MSS),
6911                ..RECV_TEMPL
6912            }]
6913        );
6914        send!(
6915            s,
6916            TcpRepr {
6917                seq_number: REMOTE_SEQ + 1,
6918                ack_number: Some(LOCAL_SEQ + 1),
6919                window_len: 32767,
6920                ..SEND_TEMPL
6921            }
6922        );
6923        s.send_slice(&[0; 1200][..]).unwrap();
6924        recv!(
6925            s,
6926            Ok(TcpRepr {
6927                seq_number: LOCAL_SEQ + 1,
6928                ack_number: Some(REMOTE_SEQ + 1),
6929                payload: &[0; 1000][..],
6930                ..RECV_TEMPL
6931            })
6932        );
6933    }
6934
6935    #[test]
6936    fn test_recv_out_of_recv_win() {
6937        let mut s = socket_established();
6938        s.set_ack_delay(Some(ACK_DELAY_DEFAULT));
6939        s.remote_mss = 32;
6940
6941        // No ACKs are sent due to the ACK delay.
6942        send!(
6943            s,
6944            TcpRepr {
6945                control: TcpControl::Psh,
6946                seq_number: REMOTE_SEQ + 1,
6947                ack_number: Some(LOCAL_SEQ + 1),
6948                payload: &[0; 32],
6949                ..SEND_TEMPL
6950            }
6951        );
6952        recv_nothing!(s);
6953
6954        // RMSS+1 bytes of data has been received, so ACK is sent without delay.
6955        send!(
6956            s,
6957            TcpRepr {
6958                control: TcpControl::Psh,
6959                seq_number: REMOTE_SEQ + 33,
6960                ack_number: Some(LOCAL_SEQ + 1),
6961                payload: &[0; 1],
6962                ..SEND_TEMPL
6963            }
6964        );
6965        recv!(
6966            s,
6967            Ok(TcpRepr {
6968                seq_number: LOCAL_SEQ + 1,
6969                ack_number: Some(REMOTE_SEQ + 34),
6970                window_len: 31,
6971                ..RECV_TEMPL
6972            })
6973        );
6974
6975        // This frees up a byte in the receive buffer. However, the remote shouldn't be aware of
6976        // this since no ACKs are sent.
6977        s.recv_slice(&mut [0; 1]).unwrap();
6978        recv_nothing!(s);
6979
6980        // Now, if the remote wants to send one byte outside of the receive window that we
6981        // previously advertised, it should not succeed.
6982        send!(
6983            s,
6984            TcpRepr {
6985                control: TcpControl::Psh,
6986                seq_number: REMOTE_SEQ + 34,
6987                ack_number: Some(LOCAL_SEQ + 1),
6988                payload: &[0; 32],
6989                ..SEND_TEMPL
6990            }
6991        );
6992        recv!(
6993            s,
6994            Ok(TcpRepr {
6995                seq_number: LOCAL_SEQ + 1,
6996                ack_number: Some(REMOTE_SEQ + 65),
6997                window_len: 1, // The last byte isn't accepted.
6998                ..RECV_TEMPL
6999            })
7000        );
7001    }
7002
7003    #[test]
7004    fn test_close_wait_no_window_update() {
7005        let mut s = socket_established();
7006        send!(
7007            s,
7008            TcpRepr {
7009                control: TcpControl::Fin,
7010                seq_number: REMOTE_SEQ + 1,
7011                ack_number: Some(LOCAL_SEQ + 1),
7012                payload: &[1, 2, 3, 4],
7013                ..SEND_TEMPL
7014            }
7015        );
7016        assert_eq!(s.state, State::CloseWait);
7017
7018        // we ack the FIN, with the reduced window size.
7019        recv!(
7020            s,
7021            Ok(TcpRepr {
7022                seq_number: LOCAL_SEQ + 1,
7023                ack_number: Some(REMOTE_SEQ + 6),
7024                window_len: 60,
7025                ..RECV_TEMPL
7026            })
7027        );
7028
7029        let rx_buf = &mut [0; 32];
7030        assert_eq!(s.recv_slice(rx_buf), Ok(4));
7031
7032        // check that we do NOT send a window update even if it has changed.
7033        recv_nothing!(s);
7034    }
7035
7036    #[test]
7037    fn test_time_wait_no_window_update() {
7038        let mut s = socket_fin_wait_2();
7039        send!(
7040            s,
7041            TcpRepr {
7042                control: TcpControl::Fin,
7043                seq_number: REMOTE_SEQ + 1,
7044                ack_number: Some(LOCAL_SEQ + 2),
7045                payload: &[1, 2, 3, 4],
7046                ..SEND_TEMPL
7047            }
7048        );
7049        assert_eq!(s.state, State::TimeWait);
7050
7051        // we ack the FIN, with the reduced window size.
7052        recv!(
7053            s,
7054            Ok(TcpRepr {
7055                seq_number: LOCAL_SEQ + 2,
7056                ack_number: Some(REMOTE_SEQ + 6),
7057                window_len: 60,
7058                ..RECV_TEMPL
7059            })
7060        );
7061
7062        let rx_buf = &mut [0; 32];
7063        assert_eq!(s.recv_slice(rx_buf), Ok(4));
7064
7065        // check that we do NOT send a window update even if it has changed.
7066        recv_nothing!(s);
7067    }
7068
7069    // =========================================================================================//
7070    // Tests for flow control.
7071    // =========================================================================================//
7072
7073    #[test]
7074    fn test_psh_transmit() {
7075        let mut s = socket_established();
7076        s.remote_mss = 6;
7077        s.send_slice(b"abcdef").unwrap();
7078        s.send_slice(b"123456").unwrap();
7079        recv!(s, time 0, Ok(TcpRepr {
7080            control:    TcpControl::None,
7081            seq_number: LOCAL_SEQ + 1,
7082            ack_number: Some(REMOTE_SEQ + 1),
7083            payload:    &b"abcdef"[..],
7084            ..RECV_TEMPL
7085        }), exact);
7086        recv!(s, time 0, Ok(TcpRepr {
7087            control:    TcpControl::Psh,
7088            seq_number: LOCAL_SEQ + 1 + 6,
7089            ack_number: Some(REMOTE_SEQ + 1),
7090            payload:    &b"123456"[..],
7091            ..RECV_TEMPL
7092        }), exact);
7093    }
7094
7095    #[test]
7096    fn test_psh_receive() {
7097        let mut s = socket_established();
7098        send!(
7099            s,
7100            TcpRepr {
7101                control: TcpControl::Psh,
7102                seq_number: REMOTE_SEQ + 1,
7103                ack_number: Some(LOCAL_SEQ + 1),
7104                payload: &b"abcdef"[..],
7105                ..SEND_TEMPL
7106            }
7107        );
7108        recv!(
7109            s,
7110            [TcpRepr {
7111                seq_number: LOCAL_SEQ + 1,
7112                ack_number: Some(REMOTE_SEQ + 1 + 6),
7113                window_len: 58,
7114                ..RECV_TEMPL
7115            }]
7116        );
7117    }
7118
7119    #[test]
7120    fn test_zero_window_ack() {
7121        let mut s = socket_established();
7122        s.rx_buffer = SocketBuffer::new(vec![0; 6]);
7123        s.assembler = Assembler::new();
7124        send!(
7125            s,
7126            TcpRepr {
7127                seq_number: REMOTE_SEQ + 1,
7128                ack_number: Some(LOCAL_SEQ + 1),
7129                payload: &b"abcdef"[..],
7130                ..SEND_TEMPL
7131            }
7132        );
7133        recv!(
7134            s,
7135            [TcpRepr {
7136                seq_number: LOCAL_SEQ + 1,
7137                ack_number: Some(REMOTE_SEQ + 1 + 6),
7138                window_len: 0,
7139                ..RECV_TEMPL
7140            }]
7141        );
7142        send!(
7143            s,
7144            TcpRepr {
7145                seq_number: REMOTE_SEQ + 1 + 6,
7146                ack_number: Some(LOCAL_SEQ + 1),
7147                payload: &b"123456"[..],
7148                ..SEND_TEMPL
7149            },
7150            Some(TcpRepr {
7151                seq_number: LOCAL_SEQ + 1,
7152                ack_number: Some(REMOTE_SEQ + 1 + 6),
7153                window_len: 0,
7154                ..RECV_TEMPL
7155            })
7156        );
7157    }
7158
7159    #[test]
7160    fn test_zero_window_fin() {
7161        let mut s = socket_established();
7162        s.rx_buffer = SocketBuffer::new(vec![0; 6]);
7163        s.assembler = Assembler::new();
7164        s.ack_delay = None;
7165
7166        send!(
7167            s,
7168            TcpRepr {
7169                seq_number: REMOTE_SEQ + 1,
7170                ack_number: Some(LOCAL_SEQ + 1),
7171                payload: &b"abcdef"[..],
7172                ..SEND_TEMPL
7173            }
7174        );
7175        recv!(
7176            s,
7177            [TcpRepr {
7178                seq_number: LOCAL_SEQ + 1,
7179                ack_number: Some(REMOTE_SEQ + 1 + 6),
7180                window_len: 0,
7181                ..RECV_TEMPL
7182            }]
7183        );
7184
7185        // Even though the sequence space for the FIN itself is outside the window,
7186        // it is not data, so FIN must be accepted when window full.
7187        send!(
7188            s,
7189            TcpRepr {
7190                seq_number: REMOTE_SEQ + 1 + 6,
7191                ack_number: Some(LOCAL_SEQ + 1),
7192                payload: &[],
7193                control: TcpControl::Fin,
7194                ..SEND_TEMPL
7195            }
7196        );
7197        assert_eq!(s.state, State::CloseWait);
7198
7199        recv!(
7200            s,
7201            [TcpRepr {
7202                seq_number: LOCAL_SEQ + 1,
7203                ack_number: Some(REMOTE_SEQ + 1 + 7),
7204                window_len: 0,
7205                ..RECV_TEMPL
7206            }]
7207        );
7208    }
7209
7210    #[test]
7211    fn test_zero_window_ack_on_window_growth() {
7212        let mut s = socket_established();
7213        s.rx_buffer = SocketBuffer::new(vec![0; 6]);
7214        s.assembler = Assembler::new();
7215        send!(
7216            s,
7217            TcpRepr {
7218                seq_number: REMOTE_SEQ + 1,
7219                ack_number: Some(LOCAL_SEQ + 1),
7220                payload: &b"abcdef"[..],
7221                ..SEND_TEMPL
7222            }
7223        );
7224        recv!(
7225            s,
7226            [TcpRepr {
7227                seq_number: LOCAL_SEQ + 1,
7228                ack_number: Some(REMOTE_SEQ + 1 + 6),
7229                window_len: 0,
7230                ..RECV_TEMPL
7231            }]
7232        );
7233        recv_nothing!(s, time 0);
7234        s.recv(|buffer| {
7235            assert_eq!(&buffer[..3], b"abc");
7236            (3, ())
7237        })
7238        .unwrap();
7239        recv!(s, time 0, Ok(TcpRepr {
7240            seq_number: LOCAL_SEQ + 1,
7241            ack_number: Some(REMOTE_SEQ + 1 + 6),
7242            window_len: 3,
7243            ..RECV_TEMPL
7244        }));
7245        recv_nothing!(s, time 0);
7246        s.recv(|buffer| {
7247            assert_eq!(buffer, b"def");
7248            (buffer.len(), ())
7249        })
7250        .unwrap();
7251        recv!(s, time 0, Ok(TcpRepr {
7252            seq_number: LOCAL_SEQ + 1,
7253            ack_number: Some(REMOTE_SEQ + 1 + 6),
7254            window_len: 6,
7255            ..RECV_TEMPL
7256        }));
7257    }
7258
7259    #[test]
7260    fn test_window_update_with_delay_ack() {
7261        let mut s = socket_established_with_buffer_sizes(6, 6);
7262        s.ack_delay = Some(Duration::from_millis(10));
7263
7264        send!(
7265            s,
7266            TcpRepr {
7267                seq_number: REMOTE_SEQ + 1,
7268                ack_number: Some(LOCAL_SEQ + 1),
7269                payload: &b"abcdef"[..],
7270                ..SEND_TEMPL
7271            }
7272        );
7273
7274        recv_nothing!(s, time 5);
7275
7276        s.recv(|buffer| {
7277            assert_eq!(&buffer[..2], b"ab");
7278            (2, ())
7279        })
7280        .unwrap();
7281        recv!(
7282            s,
7283            time 5,
7284            Ok(TcpRepr {
7285                seq_number: LOCAL_SEQ + 1,
7286                ack_number: Some(REMOTE_SEQ + 1 + 6),
7287                window_len: 2,
7288                ..RECV_TEMPL
7289            })
7290        );
7291
7292        s.recv(|buffer| {
7293            assert_eq!(&buffer[..1], b"c");
7294            (1, ())
7295        })
7296        .unwrap();
7297        recv_nothing!(s, time 5);
7298
7299        s.recv(|buffer| {
7300            assert_eq!(&buffer[..1], b"d");
7301            (1, ())
7302        })
7303        .unwrap();
7304        recv!(
7305            s,
7306            time 5,
7307            Ok(TcpRepr {
7308                seq_number: LOCAL_SEQ + 1,
7309                ack_number: Some(REMOTE_SEQ + 1 + 6),
7310                window_len: 4,
7311                ..RECV_TEMPL
7312            })
7313        );
7314    }
7315
7316    #[test]
7317    fn test_fill_peer_window() {
7318        let mut s = socket_established();
7319        s.remote_mss = 6;
7320        s.send_slice(b"abcdef123456!@#$%^").unwrap();
7321        recv!(
7322            s,
7323            [
7324                TcpRepr {
7325                    seq_number: LOCAL_SEQ + 1,
7326                    ack_number: Some(REMOTE_SEQ + 1),
7327                    payload: &b"abcdef"[..],
7328                    ..RECV_TEMPL
7329                },
7330                TcpRepr {
7331                    seq_number: LOCAL_SEQ + 1 + 6,
7332                    ack_number: Some(REMOTE_SEQ + 1),
7333                    payload: &b"123456"[..],
7334                    ..RECV_TEMPL
7335                },
7336                TcpRepr {
7337                    seq_number: LOCAL_SEQ + 1 + 6 + 6,
7338                    ack_number: Some(REMOTE_SEQ + 1),
7339                    payload: &b"!@#$%^"[..],
7340                    ..RECV_TEMPL
7341                }
7342            ]
7343        );
7344    }
7345
7346    #[test]
7347    fn test_announce_window_after_read() {
7348        let mut s = socket_established();
7349        s.rx_buffer = SocketBuffer::new(vec![0; 6]);
7350        s.assembler = Assembler::new();
7351        send!(
7352            s,
7353            TcpRepr {
7354                seq_number: REMOTE_SEQ + 1,
7355                ack_number: Some(LOCAL_SEQ + 1),
7356                payload: &b"abc"[..],
7357                ..SEND_TEMPL
7358            }
7359        );
7360        recv!(
7361            s,
7362            [TcpRepr {
7363                seq_number: LOCAL_SEQ + 1,
7364                ack_number: Some(REMOTE_SEQ + 1 + 3),
7365                window_len: 3,
7366                ..RECV_TEMPL
7367            }]
7368        );
7369        // Test that `dispatch` updates `remote_last_win`
7370        assert_eq!(s.remote_last_win, s.rx_buffer.window() as u16);
7371        s.recv(|buffer| (buffer.len(), ())).unwrap();
7372        assert!(s.window_to_update());
7373        recv!(
7374            s,
7375            [TcpRepr {
7376                seq_number: LOCAL_SEQ + 1,
7377                ack_number: Some(REMOTE_SEQ + 1 + 3),
7378                window_len: 6,
7379                ..RECV_TEMPL
7380            }]
7381        );
7382        assert_eq!(s.remote_last_win, s.rx_buffer.window() as u16);
7383        // Provoke immediate ACK to test that `process` updates `remote_last_win`
7384        send!(
7385            s,
7386            TcpRepr {
7387                seq_number: REMOTE_SEQ + 1 + 6,
7388                ack_number: Some(LOCAL_SEQ + 1),
7389                payload: &b"def"[..],
7390                ..SEND_TEMPL
7391            },
7392            Some(TcpRepr {
7393                seq_number: LOCAL_SEQ + 1,
7394                ack_number: Some(REMOTE_SEQ + 1 + 3),
7395                window_len: 6,
7396                ..RECV_TEMPL
7397            })
7398        );
7399        send!(
7400            s,
7401            TcpRepr {
7402                seq_number: REMOTE_SEQ + 1 + 3,
7403                ack_number: Some(LOCAL_SEQ + 1),
7404                payload: &b"abc"[..],
7405                ..SEND_TEMPL
7406            },
7407            Some(TcpRepr {
7408                seq_number: LOCAL_SEQ + 1,
7409                ack_number: Some(REMOTE_SEQ + 1 + 9),
7410                window_len: 0,
7411                ..RECV_TEMPL
7412            })
7413        );
7414        assert_eq!(s.remote_last_win, s.rx_buffer.window() as u16);
7415        s.recv(|buffer| (buffer.len(), ())).unwrap();
7416        assert!(s.window_to_update());
7417    }
7418
7419    // =========================================================================================//
7420    // Tests for zero-window probes.
7421    // =========================================================================================//
7422
7423    #[test]
7424    fn test_zero_window_probe_enter_on_win_update() {
7425        let mut s = socket_established();
7426
7427        assert!(!s.timer.is_zero_window_probe());
7428
7429        s.send_slice(b"abcdef123456!@#$%^").unwrap();
7430
7431        assert!(!s.timer.is_zero_window_probe());
7432
7433        send!(
7434            s,
7435            TcpRepr {
7436                seq_number: REMOTE_SEQ + 1,
7437                ack_number: Some(LOCAL_SEQ + 1),
7438                window_len: 0,
7439                ..SEND_TEMPL
7440            }
7441        );
7442
7443        assert!(s.timer.is_zero_window_probe());
7444    }
7445
7446    #[test]
7447    fn test_zero_window_probe_enter_on_send() {
7448        let mut s = socket_established();
7449
7450        send!(
7451            s,
7452            TcpRepr {
7453                seq_number: REMOTE_SEQ + 1,
7454                ack_number: Some(LOCAL_SEQ + 1),
7455                window_len: 0,
7456                ..SEND_TEMPL
7457            }
7458        );
7459
7460        assert!(!s.timer.is_zero_window_probe());
7461
7462        s.send_slice(b"abcdef123456!@#$%^").unwrap();
7463
7464        assert!(s.timer.is_zero_window_probe());
7465    }
7466
7467    #[test]
7468    fn test_zero_window_probe_exit() {
7469        let mut s = socket_established();
7470
7471        s.send_slice(b"abcdef123456!@#$%^").unwrap();
7472
7473        assert!(!s.timer.is_zero_window_probe());
7474
7475        send!(
7476            s,
7477            TcpRepr {
7478                seq_number: REMOTE_SEQ + 1,
7479                ack_number: Some(LOCAL_SEQ + 1),
7480                window_len: 0,
7481                ..SEND_TEMPL
7482            }
7483        );
7484
7485        assert!(s.timer.is_zero_window_probe());
7486
7487        send!(
7488            s,
7489            TcpRepr {
7490                seq_number: REMOTE_SEQ + 1,
7491                ack_number: Some(LOCAL_SEQ + 1),
7492                window_len: 6,
7493                ..SEND_TEMPL
7494            }
7495        );
7496
7497        assert!(!s.timer.is_zero_window_probe());
7498    }
7499
7500    #[test]
7501    fn test_zero_window_probe_exit_ack() {
7502        let mut s = socket_established();
7503
7504        s.send_slice(b"abcdef123456!@#$%^").unwrap();
7505        send!(
7506            s,
7507            TcpRepr {
7508                seq_number: REMOTE_SEQ + 1,
7509                ack_number: Some(LOCAL_SEQ + 1),
7510                window_len: 0,
7511                ..SEND_TEMPL
7512            }
7513        );
7514
7515        recv!(
7516            s,
7517            time 1000,
7518            [TcpRepr {
7519                seq_number: LOCAL_SEQ + 1,
7520                ack_number: Some(REMOTE_SEQ + 1),
7521                payload: &b"a"[..],
7522                ..RECV_TEMPL
7523            }]
7524        );
7525
7526        send!(
7527            s,
7528            time 1010,
7529            TcpRepr {
7530                seq_number: REMOTE_SEQ + 1,
7531                ack_number: Some(LOCAL_SEQ + 2),
7532                window_len: 6,
7533                ..SEND_TEMPL
7534            }
7535        );
7536
7537        recv!(
7538            s,
7539            time 1010,
7540            [TcpRepr {
7541                seq_number: LOCAL_SEQ + 2,
7542                ack_number: Some(REMOTE_SEQ + 1),
7543                payload: &b"bcdef1"[..],
7544                ..RECV_TEMPL
7545            }]
7546        );
7547    }
7548
7549    #[test]
7550    fn test_zero_window_probe_backoff_nack_reply() {
7551        let mut s = socket_established();
7552        s.send_slice(b"abcdef123456!@#$%^").unwrap();
7553        send!(
7554            s,
7555            TcpRepr {
7556                seq_number: REMOTE_SEQ + 1,
7557                ack_number: Some(LOCAL_SEQ + 1),
7558                window_len: 0,
7559                ..SEND_TEMPL
7560            }
7561        );
7562
7563        recv_nothing!(s, time 999);
7564        recv!(
7565            s,
7566            time 1000,
7567            [TcpRepr {
7568                seq_number: LOCAL_SEQ + 1,
7569                ack_number: Some(REMOTE_SEQ + 1),
7570                payload: &b"a"[..],
7571                ..RECV_TEMPL
7572            }]
7573        );
7574        send!(
7575            s,
7576            time 1100,
7577            TcpRepr {
7578                seq_number: REMOTE_SEQ + 1,
7579                ack_number: Some(LOCAL_SEQ + 1),
7580                window_len: 0,
7581                ..SEND_TEMPL
7582            }
7583        );
7584
7585        recv_nothing!(s, time 2999);
7586        recv!(
7587            s,
7588            time 3000,
7589            [TcpRepr {
7590                seq_number: LOCAL_SEQ + 1,
7591                ack_number: Some(REMOTE_SEQ + 1),
7592                payload: &b"a"[..],
7593                ..RECV_TEMPL
7594            }]
7595        );
7596        send!(
7597            s,
7598            time 3100,
7599            TcpRepr {
7600                seq_number: REMOTE_SEQ + 1,
7601                ack_number: Some(LOCAL_SEQ + 1),
7602                window_len: 0,
7603                ..SEND_TEMPL
7604            }
7605        );
7606
7607        recv_nothing!(s, time 6999);
7608        recv!(
7609            s,
7610            time 7000,
7611            [TcpRepr {
7612                seq_number: LOCAL_SEQ + 1,
7613                ack_number: Some(REMOTE_SEQ + 1),
7614                payload: &b"a"[..],
7615                ..RECV_TEMPL
7616            }]
7617        );
7618    }
7619
7620    #[test]
7621    fn test_zero_window_probe_backoff_no_reply() {
7622        let mut s = socket_established();
7623        s.send_slice(b"abcdef123456!@#$%^").unwrap();
7624        send!(
7625            s,
7626            TcpRepr {
7627                seq_number: REMOTE_SEQ + 1,
7628                ack_number: Some(LOCAL_SEQ + 1),
7629                window_len: 0,
7630                ..SEND_TEMPL
7631            }
7632        );
7633
7634        recv_nothing!(s, time 999);
7635        recv!(
7636            s,
7637            time 1000,
7638            [TcpRepr {
7639                seq_number: LOCAL_SEQ + 1,
7640                ack_number: Some(REMOTE_SEQ + 1),
7641                payload: &b"a"[..],
7642                ..RECV_TEMPL
7643            }]
7644        );
7645
7646        recv_nothing!(s, time 2999);
7647        recv!(
7648            s,
7649            time 3000,
7650            [TcpRepr {
7651                seq_number: LOCAL_SEQ + 1,
7652                ack_number: Some(REMOTE_SEQ + 1),
7653                payload: &b"a"[..],
7654                ..RECV_TEMPL
7655            }]
7656        );
7657    }
7658
7659    #[test]
7660    fn test_zero_window_probe_shift() {
7661        let mut s = socket_established();
7662
7663        s.send_slice(b"abcdef123456!@#$%^").unwrap();
7664        send!(
7665            s,
7666            TcpRepr {
7667                seq_number: REMOTE_SEQ + 1,
7668                ack_number: Some(LOCAL_SEQ + 1),
7669                window_len: 0,
7670                ..SEND_TEMPL
7671            }
7672        );
7673
7674        recv_nothing!(s, time 999);
7675        recv!(
7676            s,
7677            time 1000,
7678            [TcpRepr {
7679                seq_number: LOCAL_SEQ + 1,
7680                ack_number: Some(REMOTE_SEQ + 1),
7681                payload: &b"a"[..],
7682                ..RECV_TEMPL
7683            }]
7684        );
7685
7686        recv_nothing!(s, time 2999);
7687        recv!(
7688            s,
7689            time 3000,
7690            [TcpRepr {
7691                seq_number: LOCAL_SEQ + 1,
7692                ack_number: Some(REMOTE_SEQ + 1),
7693                payload: &b"a"[..],
7694                ..RECV_TEMPL
7695            }]
7696        );
7697
7698        // ack the ZWP byte, but still advertise zero window.
7699        // this should restart the ZWP timer.
7700        send!(
7701            s,
7702            time 3100,
7703            TcpRepr {
7704                seq_number: REMOTE_SEQ + 1,
7705                ack_number: Some(LOCAL_SEQ + 2),
7706                window_len: 0,
7707                ..SEND_TEMPL
7708            }
7709        );
7710
7711        // ZWP should be sent at 3100+1000 = 4100
7712        recv_nothing!(s, time 4099);
7713        recv!(
7714            s,
7715            time 4100,
7716            [TcpRepr {
7717                seq_number: LOCAL_SEQ + 2,
7718                ack_number: Some(REMOTE_SEQ + 1),
7719                payload: &b"b"[..],
7720                ..RECV_TEMPL
7721            }]
7722        );
7723    }
7724
7725    // =========================================================================================//
7726    // Tests for timeouts.
7727    // =========================================================================================//
7728
7729    #[test]
7730    fn test_listen_timeout() {
7731        let mut s = socket_listen();
7732        s.set_timeout(Some(Duration::from_millis(100)));
7733        assert_eq!(s.socket.poll_at(&mut s.cx), PollAt::Ingress);
7734    }
7735
7736    #[test]
7737    fn test_connect_timeout() {
7738        let mut s = socket();
7739        s.local_seq_no = LOCAL_SEQ;
7740        s.socket
7741            .connect(&mut s.cx, REMOTE_END, LOCAL_END.port)
7742            .unwrap();
7743        s.set_timeout(Some(Duration::from_millis(100)));
7744        recv!(s, time 150, Ok(TcpRepr {
7745            control:    TcpControl::Syn,
7746            seq_number: LOCAL_SEQ,
7747            ack_number: None,
7748            max_seg_size: Some(BASE_MSS),
7749            window_scale: Some(0),
7750            sack_permitted: true,
7751            ..RECV_TEMPL
7752        }));
7753        assert_eq!(s.state, State::SynSent);
7754        assert_eq!(
7755            s.socket.poll_at(&mut s.cx),
7756            PollAt::Time(Instant::from_millis(250))
7757        );
7758        recv!(s, time 250, Ok(TcpRepr {
7759            control:    TcpControl::Rst,
7760            seq_number: LOCAL_SEQ + 1,
7761            ack_number: Some(TcpSeqNumber(0)),
7762            window_scale: None,
7763            ..RECV_TEMPL
7764        }));
7765        assert_eq!(s.state, State::Closed);
7766    }
7767
7768    #[test]
7769    fn test_established_timeout() {
7770        let mut s = socket_established();
7771        s.set_timeout(Some(Duration::from_millis(2000)));
7772        recv_nothing!(s, time 250);
7773        assert_eq!(
7774            s.socket.poll_at(&mut s.cx),
7775            PollAt::Time(Instant::from_millis(2250))
7776        );
7777        s.send_slice(b"abcdef").unwrap();
7778        assert_eq!(s.socket.poll_at(&mut s.cx), PollAt::Now);
7779        recv!(s, time 255, Ok(TcpRepr {
7780            seq_number: LOCAL_SEQ + 1,
7781            ack_number: Some(REMOTE_SEQ + 1),
7782            payload:    &b"abcdef"[..],
7783            ..RECV_TEMPL
7784        }));
7785        assert_eq!(
7786            s.socket.poll_at(&mut s.cx),
7787            PollAt::Time(Instant::from_millis(1255))
7788        );
7789        recv!(s, time 1255, Ok(TcpRepr {
7790            seq_number: LOCAL_SEQ + 1,
7791            ack_number: Some(REMOTE_SEQ + 1),
7792            payload:    &b"abcdef"[..],
7793            ..RECV_TEMPL
7794        }));
7795        assert_eq!(
7796            s.socket.poll_at(&mut s.cx),
7797            PollAt::Time(Instant::from_millis(2255))
7798        );
7799        recv!(s, time 2255, Ok(TcpRepr {
7800            control:    TcpControl::Rst,
7801            seq_number: LOCAL_SEQ + 1 + 6,
7802            ack_number: Some(REMOTE_SEQ + 1),
7803            ..RECV_TEMPL
7804        }));
7805        assert_eq!(s.state, State::Closed);
7806    }
7807
7808    #[test]
7809    fn test_established_keep_alive_timeout() {
7810        let mut s = socket_established();
7811        s.set_keep_alive(Some(Duration::from_millis(50)));
7812        s.set_timeout(Some(Duration::from_millis(100)));
7813        recv!(s, time 100, Ok(TcpRepr {
7814            seq_number: LOCAL_SEQ,
7815            ack_number: Some(REMOTE_SEQ + 1),
7816            payload:    &[0],
7817            ..RECV_TEMPL
7818        }));
7819        recv_nothing!(s, time 100);
7820        assert_eq!(
7821            s.socket.poll_at(&mut s.cx),
7822            PollAt::Time(Instant::from_millis(150))
7823        );
7824        send!(s, time 105, TcpRepr {
7825            seq_number: REMOTE_SEQ + 1,
7826            ack_number: Some(LOCAL_SEQ + 1),
7827            ..SEND_TEMPL
7828        });
7829        assert_eq!(
7830            s.socket.poll_at(&mut s.cx),
7831            PollAt::Time(Instant::from_millis(155))
7832        );
7833        recv!(s, time 155, Ok(TcpRepr {
7834            seq_number: LOCAL_SEQ,
7835            ack_number: Some(REMOTE_SEQ + 1),
7836            payload:    &[0],
7837            ..RECV_TEMPL
7838        }));
7839        recv_nothing!(s, time 155);
7840        assert_eq!(
7841            s.socket.poll_at(&mut s.cx),
7842            PollAt::Time(Instant::from_millis(205))
7843        );
7844        recv_nothing!(s, time 200);
7845        recv!(s, time 205, Ok(TcpRepr {
7846            control:    TcpControl::Rst,
7847            seq_number: LOCAL_SEQ + 1,
7848            ack_number: Some(REMOTE_SEQ + 1),
7849            ..RECV_TEMPL
7850        }));
7851        recv_nothing!(s, time 205);
7852        assert_eq!(s.state, State::Closed);
7853    }
7854
7855    #[test]
7856    fn test_fin_wait_1_timeout() {
7857        let mut s = socket_fin_wait_1();
7858        s.set_timeout(Some(Duration::from_millis(1000)));
7859        recv!(s, time 100, Ok(TcpRepr {
7860            control:    TcpControl::Fin,
7861            seq_number: LOCAL_SEQ + 1,
7862            ack_number: Some(REMOTE_SEQ + 1),
7863            ..RECV_TEMPL
7864        }));
7865        recv!(s, time 1100, Ok(TcpRepr {
7866            control:    TcpControl::Rst,
7867            seq_number: LOCAL_SEQ + 1 + 1,
7868            ack_number: Some(REMOTE_SEQ + 1),
7869            ..RECV_TEMPL
7870        }));
7871        assert_eq!(s.state, State::Closed);
7872    }
7873
7874    #[test]
7875    fn test_last_ack_timeout() {
7876        let mut s = socket_last_ack();
7877        s.set_timeout(Some(Duration::from_millis(1000)));
7878        recv!(s, time 100, Ok(TcpRepr {
7879            control:    TcpControl::Fin,
7880            seq_number: LOCAL_SEQ + 1,
7881            ack_number: Some(REMOTE_SEQ + 1 + 1),
7882            ..RECV_TEMPL
7883        }));
7884        recv!(s, time 1100, Ok(TcpRepr {
7885            control:    TcpControl::Rst,
7886            seq_number: LOCAL_SEQ + 1 + 1,
7887            ack_number: Some(REMOTE_SEQ + 1 + 1),
7888            ..RECV_TEMPL
7889        }));
7890        assert_eq!(s.state, State::Closed);
7891    }
7892
7893    #[test]
7894    fn test_closed_timeout() {
7895        let mut s = socket_established();
7896        s.set_timeout(Some(Duration::from_millis(200)));
7897        s.remote_last_ts = Some(Instant::from_millis(100));
7898        s.abort();
7899        assert_eq!(s.socket.poll_at(&mut s.cx), PollAt::Now);
7900        recv!(s, time 100, Ok(TcpRepr {
7901            control:    TcpControl::Rst,
7902            seq_number: LOCAL_SEQ + 1,
7903            ack_number: Some(REMOTE_SEQ + 1),
7904            ..RECV_TEMPL
7905        }));
7906        assert_eq!(s.socket.poll_at(&mut s.cx), PollAt::Ingress);
7907    }
7908
7909    // =========================================================================================//
7910    // Tests for keep-alive.
7911    // =========================================================================================//
7912
7913    #[test]
7914    fn test_responds_to_keep_alive() {
7915        let mut s = socket_established();
7916        send!(
7917            s,
7918            TcpRepr {
7919                seq_number: REMOTE_SEQ,
7920                ack_number: Some(LOCAL_SEQ + 1),
7921                ..SEND_TEMPL
7922            },
7923            Some(TcpRepr {
7924                seq_number: LOCAL_SEQ + 1,
7925                ack_number: Some(REMOTE_SEQ + 1),
7926                ..RECV_TEMPL
7927            })
7928        );
7929    }
7930
7931    #[test]
7932    fn test_sends_keep_alive() {
7933        let mut s = socket_established();
7934        s.set_keep_alive(Some(Duration::from_millis(100)));
7935
7936        // drain the forced keep-alive packet
7937        assert_eq!(s.socket.poll_at(&mut s.cx), PollAt::Now);
7938        recv!(s, time 0, Ok(TcpRepr {
7939            seq_number: LOCAL_SEQ,
7940            ack_number: Some(REMOTE_SEQ + 1),
7941            payload:    &[0],
7942            ..RECV_TEMPL
7943        }));
7944
7945        assert_eq!(
7946            s.socket.poll_at(&mut s.cx),
7947            PollAt::Time(Instant::from_millis(100))
7948        );
7949        recv_nothing!(s, time 95);
7950        recv!(s, time 100, Ok(TcpRepr {
7951            seq_number: LOCAL_SEQ,
7952            ack_number: Some(REMOTE_SEQ + 1),
7953            payload:    &[0],
7954            ..RECV_TEMPL
7955        }));
7956
7957        assert_eq!(
7958            s.socket.poll_at(&mut s.cx),
7959            PollAt::Time(Instant::from_millis(200))
7960        );
7961        recv_nothing!(s, time 195);
7962        recv!(s, time 200, Ok(TcpRepr {
7963            seq_number: LOCAL_SEQ,
7964            ack_number: Some(REMOTE_SEQ + 1),
7965            payload:    &[0],
7966            ..RECV_TEMPL
7967        }));
7968
7969        send!(s, time 250, TcpRepr {
7970            seq_number: REMOTE_SEQ + 1,
7971            ack_number: Some(LOCAL_SEQ + 1),
7972            ..SEND_TEMPL
7973        });
7974        assert_eq!(
7975            s.socket.poll_at(&mut s.cx),
7976            PollAt::Time(Instant::from_millis(350))
7977        );
7978        recv_nothing!(s, time 345);
7979        recv!(s, time 350, Ok(TcpRepr {
7980            seq_number: LOCAL_SEQ,
7981            ack_number: Some(REMOTE_SEQ + 1),
7982            payload:    &b"\x00"[..],
7983            ..RECV_TEMPL
7984        }));
7985    }
7986
7987    // =========================================================================================//
7988    // Tests for time-to-live configuration.
7989    // =========================================================================================//
7990
7991    #[test]
7992    fn test_set_hop_limit() {
7993        let mut s = socket_syn_received();
7994
7995        s.set_hop_limit(Some(0x2a));
7996        assert_eq!(
7997            s.socket.dispatch(&mut s.cx, |_, (ip_repr, _)| {
7998                assert_eq!(ip_repr.hop_limit(), 0x2a);
7999                Ok::<_, ()>(())
8000            }),
8001            Ok(())
8002        );
8003
8004        // assert that user-configurable settings are kept,
8005        // see https://github.com/smoltcp-rs/smoltcp/issues/601.
8006        s.reset();
8007        assert_eq!(s.hop_limit(), Some(0x2a));
8008    }
8009
8010    #[test]
8011    #[should_panic(expected = "the time-to-live value of a packet must not be zero")]
8012    fn test_set_hop_limit_zero() {
8013        let mut s = socket_syn_received();
8014        s.set_hop_limit(Some(0));
8015    }
8016
8017    // =========================================================================================//
8018    // Tests for reassembly.
8019    // =========================================================================================//
8020
8021    #[test]
8022    fn test_out_of_order() {
8023        let mut s = socket_established();
8024        send!(
8025            s,
8026            TcpRepr {
8027                seq_number: REMOTE_SEQ + 1 + 3,
8028                ack_number: Some(LOCAL_SEQ + 1),
8029                payload: &b"def"[..],
8030                ..SEND_TEMPL
8031            },
8032            Some(TcpRepr {
8033                seq_number: LOCAL_SEQ + 1,
8034                ack_number: Some(REMOTE_SEQ + 1),
8035                ..RECV_TEMPL
8036            })
8037        );
8038        s.recv(|buffer| {
8039            assert_eq!(buffer, b"");
8040            (buffer.len(), ())
8041        })
8042        .unwrap();
8043        send!(
8044            s,
8045            TcpRepr {
8046                seq_number: REMOTE_SEQ + 1,
8047                ack_number: Some(LOCAL_SEQ + 1),
8048                payload: &b"abcdef"[..],
8049                ..SEND_TEMPL
8050            },
8051            Some(TcpRepr {
8052                seq_number: LOCAL_SEQ + 1,
8053                ack_number: Some(REMOTE_SEQ + 1 + 6),
8054                window_len: 58,
8055                ..RECV_TEMPL
8056            })
8057        );
8058        s.recv(|buffer| {
8059            assert_eq!(buffer, b"abcdef");
8060            (buffer.len(), ())
8061        })
8062        .unwrap();
8063    }
8064
8065    #[test]
8066    fn test_buffer_wraparound_rx() {
8067        let mut s = socket_established();
8068        s.rx_buffer = SocketBuffer::new(vec![0; 6]);
8069        s.assembler = Assembler::new();
8070        send!(
8071            s,
8072            TcpRepr {
8073                seq_number: REMOTE_SEQ + 1,
8074                ack_number: Some(LOCAL_SEQ + 1),
8075                payload: &b"abc"[..],
8076                ..SEND_TEMPL
8077            }
8078        );
8079        s.recv(|buffer| {
8080            assert_eq!(buffer, b"abc");
8081            (buffer.len(), ())
8082        })
8083        .unwrap();
8084        send!(
8085            s,
8086            TcpRepr {
8087                seq_number: REMOTE_SEQ + 1 + 3,
8088                ack_number: Some(LOCAL_SEQ + 1),
8089                payload: &b"defghi"[..],
8090                ..SEND_TEMPL
8091            }
8092        );
8093        let mut data = [0; 6];
8094        assert_eq!(s.recv_slice(&mut data[..]), Ok(6));
8095        assert_eq!(data, &b"defghi"[..]);
8096    }
8097
8098    #[test]
8099    fn test_buffer_wraparound_tx() {
8100        let mut s = socket_established();
8101        s.set_nagle_enabled(false);
8102
8103        s.tx_buffer = SocketBuffer::new(vec![b'.'; 9]);
8104        assert_eq!(s.send_slice(b"xxxyyy"), Ok(6));
8105        assert_eq!(s.tx_buffer.dequeue_many(3), &b"xxx"[..]);
8106        assert_eq!(s.tx_buffer.len(), 3);
8107
8108        // "abcdef" not contiguous in tx buffer
8109        assert_eq!(s.send_slice(b"abcdef"), Ok(6));
8110        recv!(
8111            s,
8112            Ok(TcpRepr {
8113                seq_number: LOCAL_SEQ + 1,
8114                ack_number: Some(REMOTE_SEQ + 1),
8115                payload: &b"yyyabc"[..],
8116                ..RECV_TEMPL
8117            })
8118        );
8119        recv!(
8120            s,
8121            Ok(TcpRepr {
8122                seq_number: LOCAL_SEQ + 1 + 6,
8123                ack_number: Some(REMOTE_SEQ + 1),
8124                payload: &b"def"[..],
8125                ..RECV_TEMPL
8126            })
8127        );
8128    }
8129
8130    // =========================================================================================//
8131    // Tests for graceful vs ungraceful rx close
8132    // =========================================================================================//
8133
8134    #[test]
8135    fn test_rx_close_fin() {
8136        let mut s = socket_established();
8137        send!(
8138            s,
8139            TcpRepr {
8140                control: TcpControl::Fin,
8141                seq_number: REMOTE_SEQ + 1,
8142                ack_number: Some(LOCAL_SEQ + 1),
8143                payload: &b"abc"[..],
8144                ..SEND_TEMPL
8145            }
8146        );
8147        s.recv(|data| {
8148            assert_eq!(data, b"abc");
8149            (3, ())
8150        })
8151        .unwrap();
8152        assert_eq!(s.recv(|_| (0, ())), Err(RecvError::Finished));
8153    }
8154
8155    #[test]
8156    fn test_rx_close_fin_in_fin_wait_1() {
8157        let mut s = socket_fin_wait_1();
8158        send!(
8159            s,
8160            TcpRepr {
8161                control: TcpControl::Fin,
8162                seq_number: REMOTE_SEQ + 1,
8163                ack_number: Some(LOCAL_SEQ + 1),
8164                payload: &b"abc"[..],
8165                ..SEND_TEMPL
8166            }
8167        );
8168        assert_eq!(s.state, State::Closing);
8169        s.recv(|data| {
8170            assert_eq!(data, b"abc");
8171            (3, ())
8172        })
8173        .unwrap();
8174        assert_eq!(s.recv(|_| (0, ())), Err(RecvError::Finished));
8175    }
8176
8177    #[test]
8178    fn test_rx_close_fin_in_fin_wait_2() {
8179        let mut s = socket_fin_wait_2();
8180        send!(
8181            s,
8182            TcpRepr {
8183                control: TcpControl::Fin,
8184                seq_number: REMOTE_SEQ + 1,
8185                ack_number: Some(LOCAL_SEQ + 1 + 1),
8186                payload: &b"abc"[..],
8187                ..SEND_TEMPL
8188            }
8189        );
8190        assert_eq!(s.state, State::TimeWait);
8191        s.recv(|data| {
8192            assert_eq!(data, b"abc");
8193            (3, ())
8194        })
8195        .unwrap();
8196        assert_eq!(s.recv(|_| (0, ())), Err(RecvError::Finished));
8197    }
8198
8199    #[test]
8200    fn test_rx_close_fin_with_hole() {
8201        let mut s = socket_established();
8202        send!(
8203            s,
8204            TcpRepr {
8205                seq_number: REMOTE_SEQ + 1,
8206                ack_number: Some(LOCAL_SEQ + 1),
8207                payload: &b"abc"[..],
8208                ..SEND_TEMPL
8209            }
8210        );
8211        send!(
8212            s,
8213            TcpRepr {
8214                control: TcpControl::Fin,
8215                seq_number: REMOTE_SEQ + 1 + 6,
8216                ack_number: Some(LOCAL_SEQ + 1),
8217                payload: &b"ghi"[..],
8218                ..SEND_TEMPL
8219            },
8220            Some(TcpRepr {
8221                seq_number: LOCAL_SEQ + 1,
8222                ack_number: Some(REMOTE_SEQ + 1 + 3),
8223                window_len: 61,
8224                ..RECV_TEMPL
8225            })
8226        );
8227        s.recv(|data| {
8228            assert_eq!(data, b"abc");
8229            (3, ())
8230        })
8231        .unwrap();
8232        s.recv(|data| {
8233            assert_eq!(data, b"");
8234            (0, ())
8235        })
8236        .unwrap();
8237        send!(
8238            s,
8239            TcpRepr {
8240                control: TcpControl::Rst,
8241                seq_number: REMOTE_SEQ + 1 + 9,
8242                ack_number: Some(LOCAL_SEQ + 1),
8243                ..SEND_TEMPL
8244            }
8245        );
8246        // Error must be `Illegal` even if we've received a FIN,
8247        // because we are missing data.
8248        assert_eq!(s.recv(|_| (0, ())), Err(RecvError::InvalidState));
8249    }
8250
8251    #[test]
8252    fn test_rx_close_rst() {
8253        let mut s = socket_established();
8254        send!(
8255            s,
8256            TcpRepr {
8257                seq_number: REMOTE_SEQ + 1,
8258                ack_number: Some(LOCAL_SEQ + 1),
8259                payload: &b"abc"[..],
8260                ..SEND_TEMPL
8261            }
8262        );
8263        send!(
8264            s,
8265            TcpRepr {
8266                control: TcpControl::Rst,
8267                seq_number: REMOTE_SEQ + 1 + 3,
8268                ack_number: Some(LOCAL_SEQ + 1),
8269                ..SEND_TEMPL
8270            }
8271        );
8272        s.recv(|data| {
8273            assert_eq!(data, b"abc");
8274            (3, ())
8275        })
8276        .unwrap();
8277        assert_eq!(s.recv(|_| (0, ())), Err(RecvError::InvalidState));
8278    }
8279
8280    #[test]
8281    fn test_rx_close_rst_with_hole() {
8282        let mut s = socket_established();
8283        send!(
8284            s,
8285            TcpRepr {
8286                seq_number: REMOTE_SEQ + 1,
8287                ack_number: Some(LOCAL_SEQ + 1),
8288                payload: &b"abc"[..],
8289                ..SEND_TEMPL
8290            }
8291        );
8292        send!(
8293            s,
8294            TcpRepr {
8295                seq_number: REMOTE_SEQ + 1 + 6,
8296                ack_number: Some(LOCAL_SEQ + 1),
8297                payload: &b"ghi"[..],
8298                ..SEND_TEMPL
8299            },
8300            Some(TcpRepr {
8301                seq_number: LOCAL_SEQ + 1,
8302                ack_number: Some(REMOTE_SEQ + 1 + 3),
8303                window_len: 61,
8304                ..RECV_TEMPL
8305            })
8306        );
8307        send!(
8308            s,
8309            TcpRepr {
8310                control: TcpControl::Rst,
8311                seq_number: REMOTE_SEQ + 1 + 9,
8312                ack_number: Some(LOCAL_SEQ + 1),
8313                ..SEND_TEMPL
8314            }
8315        );
8316        s.recv(|data| {
8317            assert_eq!(data, b"abc");
8318            (3, ())
8319        })
8320        .unwrap();
8321        assert_eq!(s.recv(|_| (0, ())), Err(RecvError::InvalidState));
8322    }
8323
8324    // =========================================================================================//
8325    // Tests for delayed ACK
8326    // =========================================================================================//
8327
8328    #[test]
8329    fn test_delayed_ack() {
8330        let mut s = socket_established();
8331        s.set_ack_delay(Some(ACK_DELAY_DEFAULT));
8332        send!(
8333            s,
8334            TcpRepr {
8335                seq_number: REMOTE_SEQ + 1,
8336                ack_number: Some(LOCAL_SEQ + 1),
8337                payload: &b"abc"[..],
8338                ..SEND_TEMPL
8339            }
8340        );
8341
8342        // No ACK is immediately sent.
8343        recv_nothing!(s);
8344
8345        // After 10ms, it is sent.
8346        recv!(s, time 11, Ok(TcpRepr {
8347            seq_number: LOCAL_SEQ + 1,
8348            ack_number: Some(REMOTE_SEQ + 1 + 3),
8349            window_len: 61,
8350            ..RECV_TEMPL
8351        }));
8352    }
8353
8354    #[test]
8355    fn test_delayed_ack_win() {
8356        let mut s = socket_established();
8357        s.set_ack_delay(Some(ACK_DELAY_DEFAULT));
8358        send!(
8359            s,
8360            TcpRepr {
8361                seq_number: REMOTE_SEQ + 1,
8362                ack_number: Some(LOCAL_SEQ + 1),
8363                payload: &b"abc"[..],
8364                ..SEND_TEMPL
8365            }
8366        );
8367
8368        // Reading the data off the buffer should cause a window update.
8369        s.recv(|data| {
8370            assert_eq!(data, b"abc");
8371            (3, ())
8372        })
8373        .unwrap();
8374
8375        // However, no ACK or window update is immediately sent.
8376        recv_nothing!(s);
8377
8378        // After 10ms, it is sent.
8379        recv!(s, time 11, Ok(TcpRepr {
8380            seq_number: LOCAL_SEQ + 1,
8381            ack_number: Some(REMOTE_SEQ + 1 + 3),
8382            ..RECV_TEMPL
8383        }));
8384    }
8385
8386    #[test]
8387    fn test_delayed_ack_reply() {
8388        let mut s = socket_established();
8389        s.set_ack_delay(Some(ACK_DELAY_DEFAULT));
8390        send!(
8391            s,
8392            TcpRepr {
8393                seq_number: REMOTE_SEQ + 1,
8394                ack_number: Some(LOCAL_SEQ + 1),
8395                payload: &b"abc"[..],
8396                ..SEND_TEMPL
8397            }
8398        );
8399
8400        s.recv(|data| {
8401            assert_eq!(data, b"abc");
8402            (3, ())
8403        })
8404        .unwrap();
8405
8406        s.send_slice(&b"xyz"[..]).unwrap();
8407
8408        // Writing data to the socket causes ACK to not be delayed,
8409        // because it is immediately sent with the data.
8410        recv!(
8411            s,
8412            Ok(TcpRepr {
8413                seq_number: LOCAL_SEQ + 1,
8414                ack_number: Some(REMOTE_SEQ + 1 + 3),
8415                payload: &b"xyz"[..],
8416                ..RECV_TEMPL
8417            })
8418        );
8419    }
8420
8421    #[test]
8422    fn test_delayed_ack_every_rmss() {
8423        let mut s = socket_established_with_buffer_sizes(DEFAULT_MSS * 2, DEFAULT_MSS * 2);
8424        s.set_ack_delay(Some(ACK_DELAY_DEFAULT));
8425        send!(
8426            s,
8427            TcpRepr {
8428                seq_number: REMOTE_SEQ + 1,
8429                ack_number: Some(LOCAL_SEQ + 1),
8430                payload: &[0; DEFAULT_MSS - 1],
8431                ..SEND_TEMPL
8432            }
8433        );
8434
8435        // No ACK is immediately sent.
8436        recv_nothing!(s);
8437
8438        send!(
8439            s,
8440            TcpRepr {
8441                seq_number: REMOTE_SEQ + 1 + (DEFAULT_MSS - 1),
8442                ack_number: Some(LOCAL_SEQ + 1),
8443                payload: &b"a"[..],
8444                ..SEND_TEMPL
8445            }
8446        );
8447
8448        // No ACK is immediately sent.
8449        recv_nothing!(s);
8450
8451        send!(
8452            s,
8453            TcpRepr {
8454                seq_number: REMOTE_SEQ + 1 + DEFAULT_MSS,
8455                ack_number: Some(LOCAL_SEQ + 1),
8456                payload: &b"a"[..],
8457                ..SEND_TEMPL
8458            }
8459        );
8460
8461        // RMSS+1 bytes of data has been received, so ACK is sent without delay.
8462        recv!(
8463            s,
8464            Ok(TcpRepr {
8465                seq_number: LOCAL_SEQ + 1,
8466                ack_number: Some(REMOTE_SEQ + 1 + (DEFAULT_MSS + 1)),
8467                window_len: (DEFAULT_MSS - 1) as u16,
8468                ..RECV_TEMPL
8469            })
8470        );
8471    }
8472
8473    #[test]
8474    fn test_delayed_ack_every_rmss_or_more() {
8475        let mut s = socket_established_with_buffer_sizes(DEFAULT_MSS * 2, DEFAULT_MSS * 2);
8476        s.set_ack_delay(Some(ACK_DELAY_DEFAULT));
8477        send!(
8478            s,
8479            TcpRepr {
8480                seq_number: REMOTE_SEQ + 1,
8481                ack_number: Some(LOCAL_SEQ + 1),
8482                payload: &[0; DEFAULT_MSS],
8483                ..SEND_TEMPL
8484            }
8485        );
8486
8487        // No ACK is immediately sent.
8488        recv_nothing!(s);
8489
8490        send!(
8491            s,
8492            TcpRepr {
8493                seq_number: REMOTE_SEQ + 1 + DEFAULT_MSS,
8494                ack_number: Some(LOCAL_SEQ + 1),
8495                payload: &b"a"[..],
8496                ..SEND_TEMPL
8497            }
8498        );
8499
8500        send!(
8501            s,
8502            TcpRepr {
8503                seq_number: REMOTE_SEQ + 1 + (DEFAULT_MSS + 1),
8504                ack_number: Some(LOCAL_SEQ + 1),
8505                payload: &b"b"[..],
8506                ..SEND_TEMPL
8507            }
8508        );
8509
8510        // RMSS+2 bytes of data has been received, so ACK is sent without delay.
8511        recv!(
8512            s,
8513            Ok(TcpRepr {
8514                seq_number: LOCAL_SEQ + 1,
8515                ack_number: Some(REMOTE_SEQ + 1 + (DEFAULT_MSS + 2)),
8516                window_len: (DEFAULT_MSS - 2) as u16,
8517                ..RECV_TEMPL
8518            })
8519        );
8520    }
8521
8522    // =========================================================================================//
8523    // Tests for Nagle's Algorithm
8524    // =========================================================================================//
8525
8526    #[test]
8527    fn test_nagle() {
8528        let mut s = socket_established();
8529        s.remote_mss = 6;
8530
8531        s.send_slice(b"abcdef").unwrap();
8532        recv!(
8533            s,
8534            [TcpRepr {
8535                seq_number: LOCAL_SEQ + 1,
8536                ack_number: Some(REMOTE_SEQ + 1),
8537                payload: &b"abcdef"[..],
8538                ..RECV_TEMPL
8539            }]
8540        );
8541
8542        // If there's data in flight, full segments get sent.
8543        s.send_slice(b"foobar").unwrap();
8544        recv!(
8545            s,
8546            [TcpRepr {
8547                seq_number: LOCAL_SEQ + 1 + 6,
8548                ack_number: Some(REMOTE_SEQ + 1),
8549                payload: &b"foobar"[..],
8550                ..RECV_TEMPL
8551            }]
8552        );
8553
8554        s.send_slice(b"aaabbbccc").unwrap();
8555        // If there's data in flight, not-full segments don't get sent.
8556        recv!(
8557            s,
8558            [TcpRepr {
8559                seq_number: LOCAL_SEQ + 1 + 6 + 6,
8560                ack_number: Some(REMOTE_SEQ + 1),
8561                payload: &b"aaabbb"[..],
8562                ..RECV_TEMPL
8563            }]
8564        );
8565
8566        // Data gets ACKd, so there's no longer data in flight
8567        send!(
8568            s,
8569            TcpRepr {
8570                seq_number: REMOTE_SEQ + 1,
8571                ack_number: Some(LOCAL_SEQ + 1 + 6 + 6 + 6),
8572                ..SEND_TEMPL
8573            }
8574        );
8575
8576        // Now non-full segment gets sent.
8577        recv!(
8578            s,
8579            [TcpRepr {
8580                seq_number: LOCAL_SEQ + 1 + 6 + 6 + 6,
8581                ack_number: Some(REMOTE_SEQ + 1),
8582                payload: &b"ccc"[..],
8583                ..RECV_TEMPL
8584            }]
8585        );
8586    }
8587
8588    #[test]
8589    fn test_final_packet_in_stream_doesnt_wait_for_nagle() {
8590        let mut s = socket_established();
8591        s.remote_mss = 6;
8592        s.send_slice(b"abcdef0").unwrap();
8593        s.socket.close();
8594
8595        recv!(s, time 0, Ok(TcpRepr {
8596            control:    TcpControl::None,
8597            seq_number: LOCAL_SEQ + 1,
8598            ack_number: Some(REMOTE_SEQ + 1),
8599            payload:    &b"abcdef"[..],
8600            ..RECV_TEMPL
8601        }), exact);
8602        recv!(s, time 0, Ok(TcpRepr {
8603            control:    TcpControl::Fin,
8604            seq_number: LOCAL_SEQ + 1 + 6,
8605            ack_number: Some(REMOTE_SEQ + 1),
8606            payload:    &b"0"[..],
8607            ..RECV_TEMPL
8608        }), exact);
8609    }
8610
8611    // =========================================================================================//
8612    // Tests for packet filtering.
8613    // =========================================================================================//
8614
8615    #[test]
8616    fn test_doesnt_accept_wrong_port() {
8617        let mut s = socket_established();
8618        s.rx_buffer = SocketBuffer::new(vec![0; 6]);
8619        s.assembler = Assembler::new();
8620
8621        let tcp_repr = TcpRepr {
8622            seq_number: REMOTE_SEQ + 1,
8623            ack_number: Some(LOCAL_SEQ + 1),
8624            dst_port: LOCAL_PORT + 1,
8625            ..SEND_TEMPL
8626        };
8627        assert!(!s.socket.accepts(&mut s.cx, &SEND_IP_TEMPL, &tcp_repr));
8628
8629        let tcp_repr = TcpRepr {
8630            seq_number: REMOTE_SEQ + 1,
8631            ack_number: Some(LOCAL_SEQ + 1),
8632            src_port: REMOTE_PORT + 1,
8633            ..SEND_TEMPL
8634        };
8635        assert!(!s.socket.accepts(&mut s.cx, &SEND_IP_TEMPL, &tcp_repr));
8636    }
8637
8638    #[test]
8639    fn test_doesnt_accept_wrong_ip() {
8640        let mut s = socket_established();
8641
8642        let tcp_repr = TcpRepr {
8643            seq_number: REMOTE_SEQ + 1,
8644            ack_number: Some(LOCAL_SEQ + 1),
8645            payload: &b"abcdef"[..],
8646            ..SEND_TEMPL
8647        };
8648
8649        let ip_repr = IpReprIpvX(IpvXRepr {
8650            src_addr: REMOTE_ADDR,
8651            dst_addr: LOCAL_ADDR,
8652            next_header: IpProtocol::Tcp,
8653            payload_len: tcp_repr.buffer_len(),
8654            hop_limit: 64,
8655        });
8656        assert!(s.socket.accepts(&mut s.cx, &ip_repr, &tcp_repr));
8657
8658        let ip_repr_wrong_src = IpReprIpvX(IpvXRepr {
8659            src_addr: OTHER_ADDR,
8660            dst_addr: LOCAL_ADDR,
8661            next_header: IpProtocol::Tcp,
8662            payload_len: tcp_repr.buffer_len(),
8663            hop_limit: 64,
8664        });
8665        assert!(!s.socket.accepts(&mut s.cx, &ip_repr_wrong_src, &tcp_repr));
8666
8667        let ip_repr_wrong_dst = IpReprIpvX(IpvXRepr {
8668            src_addr: REMOTE_ADDR,
8669            dst_addr: OTHER_ADDR,
8670            next_header: IpProtocol::Tcp,
8671            payload_len: tcp_repr.buffer_len(),
8672            hop_limit: 64,
8673        });
8674        assert!(!s.socket.accepts(&mut s.cx, &ip_repr_wrong_dst, &tcp_repr));
8675    }
8676
8677    // =========================================================================================//
8678    // Timer tests
8679    // =========================================================================================//
8680
8681    #[test]
8682    fn test_timer_retransmit() {
8683        const RTO: Duration = Duration::from_millis(100);
8684        let mut r = Timer::new();
8685        assert!(!r.should_retransmit(Instant::from_secs(1)));
8686        r.set_for_retransmit(Instant::from_millis(1000), RTO);
8687        assert!(!r.should_retransmit(Instant::from_millis(1000)));
8688        assert!(!r.should_retransmit(Instant::from_millis(1050)));
8689        assert!(r.should_retransmit(Instant::from_millis(1101)));
8690        r.set_for_retransmit(Instant::from_millis(1101), RTO);
8691        assert!(!r.should_retransmit(Instant::from_millis(1101)));
8692        assert!(!r.should_retransmit(Instant::from_millis(1150)));
8693        assert!(!r.should_retransmit(Instant::from_millis(1200)));
8694        assert!(r.should_retransmit(Instant::from_millis(1301)));
8695        r.set_for_idle(Instant::from_millis(1301), None);
8696        assert!(!r.should_retransmit(Instant::from_millis(1350)));
8697    }
8698
8699    #[test]
8700    fn test_rtt_estimator() {
8701        let mut r = RttEstimator::default();
8702
8703        let rtos = &[
8704            6000, 5000, 4252, 3692, 3272, 2956, 2720, 2540, 2408, 2308, 2232, 2176, 2132, 2100,
8705            2076, 2060, 2048, 2036, 2028, 2024, 2020, 2016, 2012, 2012,
8706        ];
8707
8708        for &rto in rtos {
8709            r.sample(2000);
8710            assert_eq!(r.retransmission_timeout(), Duration::from_millis(rto));
8711        }
8712    }
8713
8714    #[test]
8715    fn test_set_get_congestion_control() {
8716        let mut s = socket_established();
8717
8718        #[cfg(feature = "socket-tcp-reno")]
8719        {
8720            s.set_congestion_control(CongestionControl::Reno);
8721            assert_eq!(s.congestion_control(), CongestionControl::Reno);
8722        }
8723
8724        #[cfg(feature = "socket-tcp-cubic")]
8725        {
8726            s.set_congestion_control(CongestionControl::Cubic);
8727            assert_eq!(s.congestion_control(), CongestionControl::Cubic);
8728        }
8729
8730        s.set_congestion_control(CongestionControl::None);
8731        assert_eq!(s.congestion_control(), CongestionControl::None);
8732    }
8733
8734    // =========================================================================================//
8735    // Timestamp tests
8736    // =========================================================================================//
8737
8738    #[test]
8739    fn test_tsval_established_connection() {
8740        let mut s = socket_established();
8741        s.set_tsval_generator(Some(|| 1));
8742
8743        assert!(s.timestamp_enabled());
8744
8745        // First roundtrip after establishing.
8746        s.send_slice(b"abcdef").unwrap();
8747        recv!(
8748            s,
8749            [TcpRepr {
8750                seq_number: LOCAL_SEQ + 1,
8751                ack_number: Some(REMOTE_SEQ + 1),
8752                payload: &b"abcdef"[..],
8753                timestamp: Some(TcpTimestampRepr::new(1, 0)),
8754                ..RECV_TEMPL
8755            }]
8756        );
8757        assert_eq!(s.tx_buffer.len(), 6);
8758        send!(
8759            s,
8760            TcpRepr {
8761                seq_number: REMOTE_SEQ + 1,
8762                ack_number: Some(LOCAL_SEQ + 1 + 6),
8763                timestamp: Some(TcpTimestampRepr::new(500, 1)),
8764                ..SEND_TEMPL
8765            }
8766        );
8767        assert_eq!(s.tx_buffer.len(), 0);
8768        // Second roundtrip.
8769        s.send_slice(b"foobar").unwrap();
8770        recv!(
8771            s,
8772            [TcpRepr {
8773                seq_number: LOCAL_SEQ + 1 + 6,
8774                ack_number: Some(REMOTE_SEQ + 1),
8775                payload: &b"foobar"[..],
8776                timestamp: Some(TcpTimestampRepr::new(1, 500)),
8777                ..RECV_TEMPL
8778            }]
8779        );
8780        send!(
8781            s,
8782            TcpRepr {
8783                seq_number: REMOTE_SEQ + 1,
8784                ack_number: Some(LOCAL_SEQ + 1 + 6 + 6),
8785                ..SEND_TEMPL
8786            }
8787        );
8788        assert_eq!(s.tx_buffer.len(), 0);
8789    }
8790
8791    #[test]
8792    fn test_tsval_disabled_in_remote_client() {
8793        let mut s = socket_listen();
8794        s.set_tsval_generator(Some(|| 1));
8795        assert!(s.timestamp_enabled());
8796        send!(
8797            s,
8798            TcpRepr {
8799                control: TcpControl::Syn,
8800                seq_number: REMOTE_SEQ,
8801                ack_number: None,
8802                ..SEND_TEMPL
8803            }
8804        );
8805        assert_eq!(s.state(), State::SynReceived);
8806        assert_eq!(s.tuple, Some(TUPLE));
8807        assert!(!s.timestamp_enabled());
8808        recv!(
8809            s,
8810            [TcpRepr {
8811                control: TcpControl::Syn,
8812                seq_number: LOCAL_SEQ,
8813                ack_number: Some(REMOTE_SEQ + 1),
8814                max_seg_size: Some(BASE_MSS),
8815                ..RECV_TEMPL
8816            }]
8817        );
8818        send!(
8819            s,
8820            TcpRepr {
8821                seq_number: REMOTE_SEQ + 1,
8822                ack_number: Some(LOCAL_SEQ + 1),
8823                ..SEND_TEMPL
8824            }
8825        );
8826        assert_eq!(s.state(), State::Established);
8827        assert_eq!(s.local_seq_no, LOCAL_SEQ + 1);
8828        assert_eq!(s.remote_seq_no, REMOTE_SEQ + 1);
8829    }
8830
8831    #[test]
8832    fn test_tsval_disabled_in_local_server() {
8833        let mut s = socket_listen();
8834        // s.set_timestamp(false); // commented to alert if the default state changes
8835        assert!(!s.timestamp_enabled());
8836        send!(
8837            s,
8838            TcpRepr {
8839                control: TcpControl::Syn,
8840                seq_number: REMOTE_SEQ,
8841                ack_number: None,
8842                timestamp: Some(TcpTimestampRepr::new(500, 0)),
8843                ..SEND_TEMPL
8844            }
8845        );
8846        assert_eq!(s.state(), State::SynReceived);
8847        assert_eq!(s.tuple, Some(TUPLE));
8848        assert!(!s.timestamp_enabled());
8849        recv!(
8850            s,
8851            [TcpRepr {
8852                control: TcpControl::Syn,
8853                seq_number: LOCAL_SEQ,
8854                ack_number: Some(REMOTE_SEQ + 1),
8855                max_seg_size: Some(BASE_MSS),
8856                ..RECV_TEMPL
8857            }]
8858        );
8859        send!(
8860            s,
8861            TcpRepr {
8862                seq_number: REMOTE_SEQ + 1,
8863                ack_number: Some(LOCAL_SEQ + 1),
8864                ..SEND_TEMPL
8865            }
8866        );
8867        assert_eq!(s.state(), State::Established);
8868        assert_eq!(s.local_seq_no, LOCAL_SEQ + 1);
8869        assert_eq!(s.remote_seq_no, REMOTE_SEQ + 1);
8870    }
8871
8872    #[test]
8873    fn test_tsval_disabled_in_remote_server() {
8874        let mut s = socket();
8875        s.set_tsval_generator(Some(|| 1));
8876        assert!(s.timestamp_enabled());
8877        s.local_seq_no = LOCAL_SEQ;
8878        s.socket
8879            .connect(&mut s.cx, REMOTE_END, LOCAL_END.port)
8880            .unwrap();
8881        assert_eq!(s.tuple, Some(TUPLE));
8882        recv!(
8883            s,
8884            [TcpRepr {
8885                control: TcpControl::Syn,
8886                seq_number: LOCAL_SEQ,
8887                ack_number: None,
8888                max_seg_size: Some(BASE_MSS),
8889                window_scale: Some(0),
8890                sack_permitted: true,
8891                timestamp: Some(TcpTimestampRepr::new(1, 0)),
8892                ..RECV_TEMPL
8893            }]
8894        );
8895        send!(
8896            s,
8897            TcpRepr {
8898                control: TcpControl::Syn,
8899                seq_number: REMOTE_SEQ,
8900                ack_number: Some(LOCAL_SEQ + 1),
8901                max_seg_size: Some(BASE_MSS - 80),
8902                window_scale: Some(0),
8903                timestamp: None,
8904                ..SEND_TEMPL
8905            }
8906        );
8907        assert!(!s.timestamp_enabled());
8908        s.send_slice(b"abcdef").unwrap();
8909        recv!(
8910            s,
8911            [TcpRepr {
8912                seq_number: LOCAL_SEQ + 1,
8913                ack_number: Some(REMOTE_SEQ + 1),
8914                payload: &b"abcdef"[..],
8915                timestamp: None,
8916                ..RECV_TEMPL
8917            }]
8918        );
8919    }
8920
8921    #[test]
8922    fn test_tsval_disabled_in_local_client() {
8923        let mut s = socket();
8924        // s.set_timestamp(false); // commented to alert if the default state changes
8925        assert!(!s.timestamp_enabled());
8926        s.local_seq_no = LOCAL_SEQ;
8927        s.socket
8928            .connect(&mut s.cx, REMOTE_END, LOCAL_END.port)
8929            .unwrap();
8930        assert_eq!(s.tuple, Some(TUPLE));
8931        recv!(
8932            s,
8933            [TcpRepr {
8934                control: TcpControl::Syn,
8935                seq_number: LOCAL_SEQ,
8936                ack_number: None,
8937                max_seg_size: Some(BASE_MSS),
8938                window_scale: Some(0),
8939                sack_permitted: true,
8940                ..RECV_TEMPL
8941            }]
8942        );
8943        send!(
8944            s,
8945            TcpRepr {
8946                control: TcpControl::Syn,
8947                seq_number: REMOTE_SEQ,
8948                ack_number: Some(LOCAL_SEQ + 1),
8949                max_seg_size: Some(BASE_MSS - 80),
8950                window_scale: Some(0),
8951                timestamp: Some(TcpTimestampRepr::new(500, 0)),
8952                ..SEND_TEMPL
8953            }
8954        );
8955        assert!(!s.timestamp_enabled());
8956        s.send_slice(b"abcdef").unwrap();
8957        recv!(
8958            s,
8959            [TcpRepr {
8960                seq_number: LOCAL_SEQ + 1,
8961                ack_number: Some(REMOTE_SEQ + 1),
8962                payload: &b"abcdef"[..],
8963                timestamp: None,
8964                ..RECV_TEMPL
8965            }]
8966        );
8967    }
8968
8969    // =========================================================================================//
8970    // Tests for source IP address change.
8971    // =========================================================================================//
8972
8973    #[test]
8974    fn test_established_close_on_src_ip_change() {
8975        let mut s = socket_established();
8976
8977        // Verify socket is working normally
8978        s.send_slice(b"abc").unwrap();
8979        recv!(
8980            s,
8981            [TcpRepr {
8982                seq_number: LOCAL_SEQ + 1,
8983                ack_number: Some(REMOTE_SEQ + 1),
8984                payload: &b"abc"[..],
8985                ..RECV_TEMPL
8986            }]
8987        );
8988
8989        // Simulate interface IP change - remove the socket's source IP
8990        // and add a different one.
8991        let mut new_addrs = heapless::Vec::<IpCidr, IFACE_MAX_ADDR_COUNT>::new();
8992        new_addrs.push(IpCidr::new(OTHER_ADDR.into(), 24)).unwrap();
8993        s.cx.set_ip_addrs(new_addrs);
8994
8995        // The socket's source IP is no longer on the interface.
8996        // When dispatch() runs, it should detect this and reset the socket
8997        // silently (no RST sent, since that would use the invalid source IP).
8998        s.send_slice(b"def").unwrap();
8999        recv_nothing!(s);
9000        assert_eq!(s.state, State::Closed);
9001    }
9002}