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