smoltcp/socket/
tcp.rs

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