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