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