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