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, TCP_HEADER_LEN, TcpControl,
17 TcpRepr, TcpSeqNumber, TcpTimestampGenerator, TcpTimestampRepr,
18};
19
20mod congestion;
21
22macro_rules! tcp_trace {
23 ($($arg:expr),*) => (net_log!(trace, $($arg),*));
24}
25
26#[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_RTO: u32 = 1000;
148
149const RTTE_MIN_MARGIN: u32 = 5;
152
153const RTTE_K: u32 = 4;
155
156const RTTE_MIN_RTO: u32 = 1000;
159
160const RTTE_MAX_RTO: u32 = 60_000;
163
164#[derive(Debug, Clone, Copy)]
165#[cfg_attr(feature = "defmt", derive(defmt::Format))]
166struct RttEstimator {
167 have_measurement: bool,
169 srtt: u32,
172 rttvar: u32,
174 rto: u32,
176 timestamp: Option<(Instant, TcpSeqNumber)>,
177 max_seq_sent: Option<TcpSeqNumber>,
178 rto_count: u8,
179}
180
181impl Default for RttEstimator {
182 fn default() -> Self {
183 Self {
184 have_measurement: false,
185 srtt: 0, rttvar: 0, rto: RTTE_INITIAL_RTO,
188 timestamp: None,
189 max_seq_sent: None,
190 rto_count: 0,
191 }
192 }
193}
194
195impl RttEstimator {
196 fn retransmission_timeout(&self) -> Duration {
197 Duration::from_millis(self.rto as _)
198 }
199
200 fn sample(&mut self, new_rtt: u32) {
201 if self.have_measurement {
202 let diff = (self.srtt as i32 - new_rtt as i32).unsigned_abs();
204 self.rttvar = (self.rttvar * 3 + diff).div_ceil(4);
205 self.srtt = (self.srtt * 7 + new_rtt).div_ceil(8);
206 } else {
207 self.have_measurement = true;
209 self.srtt = new_rtt;
210 self.rttvar = new_rtt / 2;
211 }
212
213 let margin = RTTE_MIN_MARGIN.max(self.rttvar * RTTE_K);
215 self.rto = (self.srtt + margin).clamp(RTTE_MIN_RTO, RTTE_MAX_RTO);
216
217 self.rto_count = 0;
218
219 tcp_trace!(
220 "rtte: sample={:?} srtt={:?} rttvar={:?} rto={:?}",
221 new_rtt,
222 self.srtt,
223 self.rttvar,
224 self.rto
225 );
226 }
227
228 fn on_send(&mut self, timestamp: Instant, seq: TcpSeqNumber) {
229 if self
230 .max_seq_sent
231 .map(|max_seq_sent| seq > max_seq_sent)
232 .unwrap_or(true)
233 {
234 self.max_seq_sent = Some(seq);
235 if self.timestamp.is_none() {
236 self.timestamp = Some((timestamp, seq));
237 tcp_trace!("rtte: sampling at seq={:?}", seq);
238 }
239 }
240 }
241
242 fn on_ack(&mut self, timestamp: Instant, seq: TcpSeqNumber) {
243 if let Some((sent_timestamp, sent_seq)) = self.timestamp
244 && seq >= sent_seq
245 {
246 self.sample((timestamp - sent_timestamp).total_millis() as u32);
247 self.timestamp = None;
248 }
249 }
250
251 fn on_retransmit(&mut self) {
252 if self.timestamp.is_some() {
253 tcp_trace!("rtte: abort sampling due to retransmit");
254 }
255 self.timestamp = None;
256
257 self.rto = (self.rto * 2).min(RTTE_MAX_RTO);
261 tcp_trace!("rtte: doubling rto to {:?}", self.rto);
262
263 self.rto_count += 1;
269 if self.rto_count >= 3 {
270 self.rto_count = 0;
271 self.have_measurement = false;
272 tcp_trace!("rtte: too many retransmissions, clearing srtt, rttvar.");
273 }
274 }
275}
276
277#[derive(Debug, Clone, Copy, PartialEq)]
278#[cfg_attr(feature = "defmt", derive(defmt::Format))]
279enum Timer {
280 Idle {
281 keep_alive_at: Option<Instant>,
282 },
283 Retransmit {
284 expires_at: Instant,
285 },
286 FastRetransmit,
287 ZeroWindowProbe {
288 expires_at: Instant,
289 delay: Duration,
290 },
291 Close {
292 expires_at: Instant,
293 },
294}
295
296const ACK_DELAY_DEFAULT: Duration = Duration::from_millis(10);
297const CLOSE_DELAY: Duration = Duration::from_millis(10_000);
298
299impl Timer {
300 fn new() -> Timer {
301 Timer::Idle {
302 keep_alive_at: None,
303 }
304 }
305
306 fn should_keep_alive(&self, timestamp: Instant) -> bool {
307 match *self {
308 Timer::Idle {
309 keep_alive_at: Some(keep_alive_at),
310 } if timestamp >= keep_alive_at => true,
311 _ => false,
312 }
313 }
314
315 fn should_retransmit(&self, timestamp: Instant) -> bool {
316 match *self {
317 Timer::Retransmit { expires_at } if timestamp >= expires_at => true,
318 Timer::FastRetransmit => true,
319 _ => false,
320 }
321 }
322
323 fn should_close(&self, timestamp: Instant) -> bool {
324 match *self {
325 Timer::Close { expires_at } if timestamp >= expires_at => true,
326 _ => false,
327 }
328 }
329
330 fn should_zero_window_probe(&self, timestamp: Instant) -> bool {
331 match *self {
332 Timer::ZeroWindowProbe { expires_at, .. } if timestamp >= expires_at => true,
333 _ => false,
334 }
335 }
336
337 fn poll_at(&self) -> PollAt {
338 match *self {
339 Timer::Idle {
340 keep_alive_at: Some(keep_alive_at),
341 } => PollAt::Time(keep_alive_at),
342 Timer::Idle {
343 keep_alive_at: None,
344 } => PollAt::Ingress,
345 Timer::ZeroWindowProbe { expires_at, .. } => PollAt::Time(expires_at),
346 Timer::Retransmit { expires_at, .. } => PollAt::Time(expires_at),
347 Timer::FastRetransmit => PollAt::Now,
348 Timer::Close { expires_at } => PollAt::Time(expires_at),
349 }
350 }
351
352 fn set_for_idle(&mut self, timestamp: Instant, interval: Option<Duration>) {
353 *self = Timer::Idle {
354 keep_alive_at: interval.map(|interval| timestamp + interval),
355 }
356 }
357
358 fn set_keep_alive(&mut self) {
359 if let Timer::Idle { keep_alive_at } = self
360 && keep_alive_at.is_none()
361 {
362 *keep_alive_at = Some(Instant::from_millis(0))
363 }
364 }
365
366 fn rewind_keep_alive(&mut self, timestamp: Instant, interval: Option<Duration>) {
367 if let Timer::Idle { keep_alive_at } = self {
368 *keep_alive_at = interval.map(|interval| timestamp + interval)
369 }
370 }
371
372 fn set_for_retransmit(&mut self, timestamp: Instant, delay: Duration) {
373 match *self {
374 Timer::Idle { .. }
375 | Timer::FastRetransmit
376 | Timer::Retransmit { .. }
377 | Timer::ZeroWindowProbe { .. } => {
378 *self = Timer::Retransmit {
379 expires_at: timestamp + delay,
380 }
381 }
382 Timer::Close { .. } => (),
383 }
384 }
385
386 fn set_for_fast_retransmit(&mut self) {
387 *self = Timer::FastRetransmit
388 }
389
390 fn set_for_close(&mut self, timestamp: Instant) {
391 *self = Timer::Close {
392 expires_at: timestamp + CLOSE_DELAY,
393 }
394 }
395
396 fn set_for_zero_window_probe(&mut self, timestamp: Instant, delay: Duration) {
397 *self = Timer::ZeroWindowProbe {
398 expires_at: timestamp + delay,
399 delay,
400 }
401 }
402
403 fn rewind_zero_window_probe(&mut self, timestamp: Instant) {
404 if let Timer::ZeroWindowProbe { mut delay, .. } = *self {
405 delay = (delay * 2).min(Duration::from_millis(RTTE_MAX_RTO as _));
406 *self = Timer::ZeroWindowProbe {
407 expires_at: timestamp + delay,
408 delay,
409 }
410 }
411 }
412
413 fn is_idle(&self) -> bool {
414 matches!(self, Timer::Idle { .. })
415 }
416
417 fn is_zero_window_probe(&self) -> bool {
418 matches!(self, Timer::ZeroWindowProbe { .. })
419 }
420
421 fn is_retransmit(&self) -> bool {
422 matches!(self, Timer::Retransmit { .. } | Timer::FastRetransmit)
423 }
424}
425
426#[derive(Debug, PartialEq, Eq, Clone, Copy)]
427enum AckDelayTimer {
428 Idle,
429 Waiting(Instant),
430 Immediate,
431}
432
433#[derive(Debug, Copy, Clone, Eq, PartialEq)]
434#[cfg_attr(feature = "defmt", derive(defmt::Format))]
435struct Tuple {
436 local: IpEndpoint,
437 remote: IpEndpoint,
438}
439
440impl Display for Tuple {
441 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
442 write!(f, "{}:{}", self.local, self.remote)
443 }
444}
445
446#[derive(Debug, Copy, Clone, Eq, PartialEq)]
448#[cfg_attr(feature = "defmt", derive(defmt::Format))]
449pub enum CongestionControl {
450 None,
451
452 #[cfg(feature = "socket-tcp-reno")]
453 Reno,
454
455 #[cfg(feature = "socket-tcp-cubic")]
456 Cubic,
457}
458
459#[derive(Debug)]
466pub struct Socket<'a> {
467 state: State,
468 timer: Timer,
469 rtte: RttEstimator,
470 assembler: Assembler,
471 rx_buffer: SocketBuffer<'a>,
472 rx_fin_received: bool,
473 tx_buffer: SocketBuffer<'a>,
474 timeout: Option<Duration>,
476 keep_alive: Option<Duration>,
478 hop_limit: Option<u8>,
480 listen_endpoint: IpListenEndpoint,
483 tuple: Option<Tuple>,
485 local_seq_no: TcpSeqNumber,
488 remote_seq_no: TcpSeqNumber,
491 remote_last_seq: TcpSeqNumber,
494 remote_last_ack: Option<TcpSeqNumber>,
497 remote_last_win: u16,
499 remote_win_shift: u8,
502 remote_win_len: usize,
505 remote_win_scale: Option<u8>,
507 remote_has_sack: bool,
509 remote_mss: usize,
511 remote_last_ts: Option<Instant>,
513 local_rx_last_seq: Option<TcpSeqNumber>,
515 local_rx_last_ack: Option<TcpSeqNumber>,
517 local_rx_dup_acks: u8,
520
521 ack_delay: Option<Duration>,
523 ack_delay_timer: AckDelayTimer,
526
527 challenge_ack_timer: Instant,
529
530 nagle: bool,
532
533 congestion_controller: congestion::AnyController,
535
536 tsval_generator: Option<TcpTimestampGenerator>,
538
539 last_remote_tsval: u32,
541
542 #[cfg(feature = "async")]
543 rx_waker: WakerRegistration,
544 #[cfg(feature = "async")]
545 tx_waker: WakerRegistration,
546
547 #[cfg(feature = "socket-tcp-pause-synack")]
549 synack_paused: bool,
550}
551
552const DEFAULT_MSS: usize = 536;
553
554impl<'a> Socket<'a> {
555 #[allow(unused_comparisons)] pub fn new<T>(rx_buffer: T, tx_buffer: T) -> Socket<'a>
558 where
559 T: Into<SocketBuffer<'a>>,
560 {
561 let (rx_buffer, tx_buffer) = (rx_buffer.into(), tx_buffer.into());
562 let rx_capacity = rx_buffer.capacity();
563
564 #[cfg(not(target_pointer_width = "16"))] if rx_capacity > (1 << 30) {
570 panic!("receiving buffer too large, cannot exceed 1 GiB")
571 }
572 let rx_cap_log2 = mem::size_of::<usize>() * 8 - rx_capacity.leading_zeros() as usize;
573
574 Socket {
575 state: State::Closed,
576 timer: Timer::new(),
577 rtte: RttEstimator::default(),
578 assembler: Assembler::new(),
579 tx_buffer,
580 rx_buffer,
581 rx_fin_received: false,
582 timeout: None,
583 keep_alive: None,
584 hop_limit: None,
585 listen_endpoint: IpListenEndpoint::default(),
586 tuple: None,
587 local_seq_no: TcpSeqNumber::default(),
588 remote_seq_no: TcpSeqNumber::default(),
589 remote_last_seq: TcpSeqNumber::default(),
590 remote_last_ack: None,
591 remote_last_win: 0,
592 remote_win_len: 0,
593 remote_win_shift: rx_cap_log2.saturating_sub(16) as u8,
594 remote_win_scale: None,
595 remote_has_sack: false,
596 remote_mss: DEFAULT_MSS,
597 remote_last_ts: None,
598 local_rx_last_ack: None,
599 local_rx_last_seq: None,
600 local_rx_dup_acks: 0,
601 ack_delay: Some(ACK_DELAY_DEFAULT),
602 ack_delay_timer: AckDelayTimer::Idle,
603 challenge_ack_timer: Instant::from_secs(0),
604 nagle: true,
605 tsval_generator: None,
606 last_remote_tsval: 0,
607 congestion_controller: congestion::AnyController::new(),
608
609 #[cfg(feature = "async")]
610 rx_waker: WakerRegistration::new(),
611 #[cfg(feature = "async")]
612 tx_waker: WakerRegistration::new(),
613
614 #[cfg(feature = "socket-tcp-pause-synack")]
615 synack_paused: false,
616 }
617 }
618
619 pub fn set_tsval_generator(&mut self, generator: Option<TcpTimestampGenerator>) {
621 self.tsval_generator = generator;
622 }
623
624 pub fn timestamp_enabled(&self) -> bool {
626 self.tsval_generator.is_some()
627 }
628
629 pub fn set_congestion_control(&mut self, congestion_control: CongestionControl) {
650 use congestion::*;
651
652 self.congestion_controller = match congestion_control {
653 CongestionControl::None => AnyController::None(no_control::NoControl),
654
655 #[cfg(feature = "socket-tcp-reno")]
656 CongestionControl::Reno => AnyController::Reno(reno::Reno::new()),
657
658 #[cfg(feature = "socket-tcp-cubic")]
659 CongestionControl::Cubic => AnyController::Cubic(cubic::Cubic::new()),
660 }
661 }
662
663 pub fn congestion_control(&self) -> CongestionControl {
665 use congestion::*;
666
667 match self.congestion_controller {
668 AnyController::None(_) => CongestionControl::None,
669
670 #[cfg(feature = "socket-tcp-reno")]
671 AnyController::Reno(_) => CongestionControl::Reno,
672
673 #[cfg(feature = "socket-tcp-cubic")]
674 AnyController::Cubic(_) => CongestionControl::Cubic,
675 }
676 }
677
678 #[cfg(feature = "async")]
691 pub fn register_recv_waker(&mut self, waker: &Waker) {
692 self.rx_waker.register(waker)
693 }
694
695 #[cfg(feature = "async")]
709 pub fn register_send_waker(&mut self, waker: &Waker) {
710 self.tx_waker.register(waker)
711 }
712
713 pub fn timeout(&self) -> Option<Duration> {
717 self.timeout
718 }
719
720 pub fn ack_delay(&self) -> Option<Duration> {
724 self.ack_delay
725 }
726
727 pub fn nagle_enabled(&self) -> bool {
731 self.nagle
732 }
733
734 #[cfg(feature = "socket-tcp-pause-synack")]
740 pub fn pause_synack(&mut self, pause: bool) {
741 self.synack_paused = pause;
742 }
743
744 #[inline]
748 fn scaled_window(&self) -> u16 {
749 u16::try_from(self.rx_buffer.window() >> self.remote_win_shift).unwrap_or(u16::MAX)
750 }
751
752 #[inline]
761 fn last_scaled_window(&self) -> Option<u16> {
762 let last_ack = self.remote_last_ack?;
763 let next_ack = self.remote_seq_no + self.rx_buffer.len();
764
765 let last_win = (self.remote_last_win as usize) << self.remote_win_shift;
766 let last_win_adjusted = last_ack + last_win - next_ack;
767
768 Some(u16::try_from(last_win_adjusted >> self.remote_win_shift).unwrap_or(u16::MAX))
769 }
770
771 pub fn set_timeout(&mut self, duration: Option<Duration>) {
783 self.timeout = duration
784 }
785
786 pub fn set_ack_delay(&mut self, duration: Option<Duration>) {
790 self.ack_delay = duration
791 }
792
793 pub fn set_nagle_enabled(&mut self, enabled: bool) {
806 self.nagle = enabled
807 }
808
809 pub fn keep_alive(&self) -> Option<Duration> {
813 self.keep_alive
814 }
815
816 pub fn set_keep_alive(&mut self, interval: Option<Duration>) {
829 self.keep_alive = interval;
830 if self.keep_alive.is_some() {
831 self.timer.set_keep_alive();
834 }
835 }
836
837 pub fn hop_limit(&self) -> Option<u8> {
841 self.hop_limit
842 }
843
844 pub fn set_hop_limit(&mut self, hop_limit: Option<u8>) {
856 if let Some(0) = hop_limit {
858 panic!("the time-to-live value of a packet must not be zero")
859 }
860
861 self.hop_limit = hop_limit
862 }
863
864 #[inline]
866 pub fn listen_endpoint(&self) -> IpListenEndpoint {
867 self.listen_endpoint
868 }
869
870 #[inline]
872 pub fn local_endpoint(&self) -> Option<IpEndpoint> {
873 Some(self.tuple?.local)
874 }
875
876 #[inline]
878 pub fn remote_endpoint(&self) -> Option<IpEndpoint> {
879 Some(self.tuple?.remote)
880 }
881
882 #[inline]
884 pub fn state(&self) -> State {
885 self.state
886 }
887
888 fn reset(&mut self) {
889 let rx_cap_log2 =
890 mem::size_of::<usize>() * 8 - self.rx_buffer.capacity().leading_zeros() as usize;
891
892 self.state = State::Closed;
893 self.timer = Timer::new();
894 self.rtte = RttEstimator::default();
895 self.assembler = Assembler::new();
896 self.tx_buffer.clear();
897 self.rx_buffer.clear();
898 self.rx_fin_received = false;
899 self.listen_endpoint = IpListenEndpoint::default();
900 self.tuple = None;
901 self.local_seq_no = TcpSeqNumber::default();
902 self.remote_seq_no = TcpSeqNumber::default();
903 self.remote_last_seq = TcpSeqNumber::default();
904 self.remote_last_ack = None;
905 self.remote_last_win = 0;
906 self.remote_win_len = 0;
907 self.remote_win_scale = None;
908 self.remote_win_shift = rx_cap_log2.saturating_sub(16) as u8;
909 self.remote_mss = DEFAULT_MSS;
910 self.remote_last_ts = None;
911 self.ack_delay_timer = AckDelayTimer::Idle;
912 self.challenge_ack_timer = Instant::from_secs(0);
913
914 #[cfg(feature = "async")]
915 {
916 self.rx_waker.wake();
917 self.tx_waker.wake();
918 }
919 }
920
921 pub fn listen<T>(&mut self, local_endpoint: T) -> Result<(), ListenError>
927 where
928 T: Into<IpListenEndpoint>,
929 {
930 let local_endpoint = local_endpoint.into();
931 if local_endpoint.port == 0 {
932 return Err(ListenError::Unaddressable);
933 }
934
935 if self.is_open() {
936 if matches!(self.state, State::Listen) && self.listen_endpoint == local_endpoint {
945 return Ok(());
946 } else {
947 return Err(ListenError::InvalidState);
948 }
949 }
950
951 self.reset();
952 self.listen_endpoint = local_endpoint;
953 self.tuple = None;
954 self.set_state(State::Listen);
955 Ok(())
956 }
957
958 pub fn connect<T, U>(
998 &mut self,
999 cx: &mut Context,
1000 remote_endpoint: T,
1001 local_endpoint: U,
1002 ) -> Result<(), ConnectError>
1003 where
1004 T: Into<IpEndpoint>,
1005 U: Into<IpListenEndpoint>,
1006 {
1007 let remote_endpoint: IpEndpoint = remote_endpoint.into();
1008 let local_endpoint: IpListenEndpoint = local_endpoint.into();
1009
1010 if self.is_open() {
1011 return Err(ConnectError::InvalidState);
1012 }
1013 if remote_endpoint.port == 0 || remote_endpoint.addr.is_unspecified() {
1014 return Err(ConnectError::Unaddressable);
1015 }
1016 if local_endpoint.port == 0 {
1017 return Err(ConnectError::Unaddressable);
1018 }
1019
1020 let local_endpoint = IpEndpoint {
1022 addr: match local_endpoint.addr {
1023 Some(addr) => {
1024 if addr.is_unspecified() {
1025 return Err(ConnectError::Unaddressable);
1026 }
1027 addr
1028 }
1029 None => cx
1030 .get_source_address(&remote_endpoint.addr)
1031 .ok_or(ConnectError::Unaddressable)?,
1032 },
1033 port: local_endpoint.port,
1034 };
1035
1036 if local_endpoint.addr.version() != remote_endpoint.addr.version() {
1037 return Err(ConnectError::Unaddressable);
1038 }
1039
1040 self.reset();
1041 self.tuple = Some(Tuple {
1042 local: local_endpoint,
1043 remote: remote_endpoint,
1044 });
1045 self.set_state(State::SynSent);
1046
1047 let seq = Self::random_seq_no(cx);
1048 self.local_seq_no = seq;
1049 self.remote_last_seq = seq;
1050 Ok(())
1051 }
1052
1053 #[cfg(test)]
1054 fn random_seq_no(_cx: &mut Context) -> TcpSeqNumber {
1055 TcpSeqNumber(10000)
1056 }
1057
1058 #[cfg(not(test))]
1059 fn random_seq_no(cx: &mut Context) -> TcpSeqNumber {
1060 TcpSeqNumber(cx.rand().rand_u32() as i32)
1061 }
1062
1063 pub fn close(&mut self) {
1069 match self.state {
1070 State::Listen => self.set_state(State::Closed),
1072 State::SynSent => self.set_state(State::Closed),
1075 State::SynReceived | State::Established => self.set_state(State::FinWait1),
1078 State::CloseWait => self.set_state(State::LastAck),
1079 State::FinWait1
1083 | State::FinWait2
1084 | State::Closing
1085 | State::TimeWait
1086 | State::LastAck
1087 | State::Closed => (),
1088 }
1089 }
1090
1091 pub fn abort(&mut self) {
1099 self.set_state(State::Closed);
1100 }
1101
1102 #[inline]
1106 pub fn is_listening(&self) -> bool {
1107 match self.state {
1108 State::Listen => true,
1109 _ => false,
1110 }
1111 }
1112
1113 #[inline]
1122 pub fn is_open(&self) -> bool {
1123 match self.state {
1124 State::Closed => false,
1125 State::TimeWait => false,
1126 _ => true,
1127 }
1128 }
1129
1130 #[inline]
1143 pub fn is_active(&self) -> bool {
1144 match self.state {
1145 State::Closed => false,
1146 State::TimeWait => false,
1147 State::Listen => false,
1148 _ => true,
1149 }
1150 }
1151
1152 #[inline]
1162 pub fn may_send(&self) -> bool {
1163 match self.state {
1164 State::Established => true,
1165 State::CloseWait => true,
1168 _ => false,
1169 }
1170 }
1171
1172 #[inline]
1181 pub fn may_recv(&self) -> bool {
1182 match self.state {
1183 State::Established => true,
1184 State::FinWait1 | State::FinWait2 => true,
1187 _ if self.can_recv() => true,
1189 _ => false,
1190 }
1191 }
1192
1193 #[inline]
1196 pub fn can_send(&self) -> bool {
1197 if !self.may_send() {
1198 return false;
1199 }
1200
1201 !self.tx_buffer.is_full()
1202 }
1203
1204 #[inline]
1206 pub fn recv_capacity(&self) -> usize {
1207 self.rx_buffer.capacity()
1208 }
1209
1210 #[inline]
1212 pub fn send_capacity(&self) -> usize {
1213 self.tx_buffer.capacity()
1214 }
1215
1216 #[inline]
1218 pub fn can_recv(&self) -> bool {
1219 !self.rx_buffer.is_empty()
1220 }
1221
1222 fn send_impl<'b, F, R>(&'b mut self, f: F) -> Result<R, SendError>
1223 where
1224 F: FnOnce(&'b mut SocketBuffer<'a>) -> (usize, R),
1225 {
1226 if !self.may_send() {
1227 return Err(SendError::InvalidState);
1228 }
1229
1230 let old_length = self.tx_buffer.len();
1231 let (size, result) = f(&mut self.tx_buffer);
1232 if size > 0 {
1233 if old_length == 0 {
1237 self.remote_last_ts = None
1238 }
1239
1240 if self.remote_win_len == 0 && self.timer.is_idle() {
1243 let delay = self.rtte.retransmission_timeout();
1244 tcp_trace!("starting zero-window-probe timer for t+{}", delay);
1245
1246 self.timer.set_for_zero_window_probe(Instant::ZERO, delay);
1249 }
1250
1251 #[cfg(any(test, feature = "verbose"))]
1252 tcp_trace!(
1253 "tx buffer: enqueueing {} octets (now {})",
1254 size,
1255 old_length + size
1256 );
1257 }
1258 Ok(result)
1259 }
1260
1261 pub fn send<'b, F, R>(&'b mut self, f: F) -> Result<R, SendError>
1267 where
1268 F: FnOnce(&'b mut [u8]) -> (usize, R),
1269 {
1270 self.send_impl(|tx_buffer| tx_buffer.enqueue_many_with(f))
1271 }
1272
1273 pub fn send_slice(&mut self, data: &[u8]) -> Result<usize, SendError> {
1280 self.send_impl(|tx_buffer| {
1281 let size = tx_buffer.enqueue_slice(data);
1282 (size, size)
1283 })
1284 }
1285
1286 fn recv_error_check(&mut self) -> Result<(), RecvError> {
1287 if !self.may_recv() {
1291 if self.rx_fin_received {
1292 return Err(RecvError::Finished);
1293 }
1294 return Err(RecvError::InvalidState);
1295 }
1296
1297 Ok(())
1298 }
1299
1300 fn recv_impl<'b, F, R>(&'b mut self, f: F) -> Result<R, RecvError>
1301 where
1302 F: FnOnce(&'b mut SocketBuffer<'a>) -> (usize, R),
1303 {
1304 self.recv_error_check()?;
1305
1306 let _old_length = self.rx_buffer.len();
1307 let (size, result) = f(&mut self.rx_buffer);
1308 self.remote_seq_no += size;
1309 if size > 0 {
1310 #[cfg(any(test, feature = "verbose"))]
1311 tcp_trace!(
1312 "rx buffer: dequeueing {} octets (now {})",
1313 size,
1314 _old_length - size
1315 );
1316 }
1317 Ok(result)
1318 }
1319
1320 pub fn recv<'b, F, R>(&'b mut self, f: F) -> Result<R, RecvError>
1331 where
1332 F: FnOnce(&'b mut [u8]) -> (usize, R),
1333 {
1334 self.recv_impl(|rx_buffer| rx_buffer.dequeue_many_with(f))
1335 }
1336
1337 pub fn recv_slice(&mut self, data: &mut [u8]) -> Result<usize, RecvError> {
1344 self.recv_impl(|rx_buffer| {
1345 let size = rx_buffer.dequeue_slice(data);
1346 (size, size)
1347 })
1348 }
1349
1350 pub fn peek(&mut self, size: usize) -> Result<&[u8], RecvError> {
1355 self.recv_error_check()?;
1356
1357 let buffer = self.rx_buffer.get_allocated(0, size);
1358 if !buffer.is_empty() {
1359 #[cfg(any(test, feature = "verbose"))]
1360 tcp_trace!("rx buffer: peeking at {} octets", buffer.len());
1361 }
1362 Ok(buffer)
1363 }
1364
1365 pub fn peek_slice(&mut self, data: &mut [u8]) -> Result<usize, RecvError> {
1370 Ok(self.rx_buffer.read_allocated(0, data))
1371 }
1372
1373 pub fn send_queue(&self) -> usize {
1377 self.tx_buffer.len()
1378 }
1379
1380 pub fn recv_queue(&self) -> usize {
1386 self.rx_buffer.len()
1387 }
1388
1389 fn set_state(&mut self, state: State) {
1390 if self.state != state {
1391 tcp_trace!("state={}=>{}", self.state, state);
1392 }
1393
1394 self.state = state;
1395
1396 #[cfg(feature = "async")]
1397 {
1398 self.rx_waker.wake();
1402 self.tx_waker.wake();
1403 }
1404 }
1405
1406 pub(crate) fn reply(ip_repr: &IpRepr, repr: &TcpRepr) -> (IpRepr, TcpRepr<'static>) {
1407 let reply_repr = TcpRepr {
1408 src_port: repr.dst_port,
1409 dst_port: repr.src_port,
1410 control: TcpControl::None,
1411 seq_number: TcpSeqNumber(0),
1412 ack_number: None,
1413 window_len: 0,
1414 window_scale: None,
1415 max_seg_size: None,
1416 sack_permitted: false,
1417 sack_ranges: [None, None, None],
1418 timestamp: None,
1419 payload: &[],
1420 };
1421 let ip_reply_repr = IpRepr::new(
1422 ip_repr.dst_addr(),
1423 ip_repr.src_addr(),
1424 IpProtocol::Tcp,
1425 reply_repr.buffer_len(),
1426 64,
1427 );
1428 (ip_reply_repr, reply_repr)
1429 }
1430
1431 pub(crate) fn rst_reply(ip_repr: &IpRepr, repr: &TcpRepr) -> (IpRepr, TcpRepr<'static>) {
1432 debug_assert!(repr.control != TcpControl::Rst);
1433
1434 let (ip_reply_repr, mut reply_repr) = Self::reply(ip_repr, repr);
1435
1436 reply_repr.control = TcpControl::Rst;
1439 reply_repr.seq_number = repr.ack_number.unwrap_or_default();
1440 if repr.control == TcpControl::Syn && repr.ack_number.is_none() {
1441 reply_repr.ack_number = Some(repr.seq_number + repr.segment_len());
1442 }
1443
1444 (ip_reply_repr, reply_repr)
1445 }
1446
1447 fn ack_reply(&mut self, ip_repr: &IpRepr, repr: &TcpRepr) -> (IpRepr, TcpRepr<'static>) {
1448 let (mut ip_reply_repr, mut reply_repr) = Self::reply(ip_repr, repr);
1449 reply_repr.timestamp = repr
1450 .timestamp
1451 .and_then(|tcp_ts| tcp_ts.generate_reply(self.tsval_generator));
1452
1453 reply_repr.seq_number = self.remote_last_seq;
1458 reply_repr.ack_number = Some(self.remote_seq_no + self.rx_buffer.len());
1459 self.remote_last_ack = reply_repr.ack_number;
1460
1461 reply_repr.window_len = self.scaled_window();
1465 self.remote_last_win = reply_repr.window_len;
1466
1467 if self.remote_has_sack {
1470 net_debug!("sending sACK option with current assembler ranges");
1471
1472 reply_repr.sack_ranges[0] = None;
1477
1478 let ack = reply_repr.ack_number.unwrap_or(TcpSeqNumber(0));
1479
1480 if let Some(last_seg_seq) = self.local_rx_last_seq {
1481 reply_repr.sack_ranges[0] = self
1482 .assembler
1483 .iter_data()
1484 .map(|(left, right)| (ack + left, ack + right))
1485 .find(|&(left, right)| left <= last_seg_seq && right >= last_seg_seq)
1486 .map(|(left, right)| (left.0 as u32, right.0 as u32));
1487 }
1488
1489 if reply_repr.sack_ranges[0].is_none() {
1490 reply_repr.sack_ranges[0] = self
1498 .assembler
1499 .iter_data()
1500 .map(|(left, right)| (ack + left, ack + right))
1501 .next()
1502 .map(|(left, right)| (left.0 as u32, right.0 as u32));
1503 }
1504 }
1505
1506 ip_reply_repr.set_payload_len(reply_repr.buffer_len());
1508 (ip_reply_repr, reply_repr)
1509 }
1510
1511 fn challenge_ack_reply(
1512 &mut self,
1513 cx: &mut Context,
1514 ip_repr: &IpRepr,
1515 repr: &TcpRepr,
1516 ) -> Option<(IpRepr, TcpRepr<'static>)> {
1517 if cx.now() < self.challenge_ack_timer {
1518 return None;
1519 }
1520
1521 self.challenge_ack_timer = cx.now() + Duration::from_secs(1);
1523
1524 Some(self.ack_reply(ip_repr, repr))
1525 }
1526
1527 pub(crate) fn accepts(&self, _cx: &mut Context, ip_repr: &IpRepr, repr: &TcpRepr) -> bool {
1528 if self.state == State::Closed {
1529 return false;
1530 }
1531
1532 if self.state == State::Listen
1536 && (repr.ack_number.is_some() || repr.control == TcpControl::Rst)
1537 {
1538 return false;
1539 }
1540
1541 if let Some(tuple) = &self.tuple {
1542 ip_repr.dst_addr() == tuple.local.addr
1544 && repr.dst_port == tuple.local.port
1545 && ip_repr.src_addr() == tuple.remote.addr
1546 && repr.src_port == tuple.remote.port
1547 } else {
1548 let addr_ok = match self.listen_endpoint.addr {
1550 Some(addr) => ip_repr.dst_addr() == addr,
1551 None => true,
1552 };
1553 addr_ok && repr.dst_port != 0 && repr.dst_port == self.listen_endpoint.port
1554 }
1555 }
1556
1557 pub(crate) fn process(
1558 &mut self,
1559 cx: &mut Context,
1560 ip_repr: &IpRepr,
1561 repr: &TcpRepr,
1562 ) -> Option<(IpRepr, TcpRepr<'static>)> {
1563 debug_assert!(self.accepts(cx, ip_repr, repr));
1564
1565 let (sent_syn, sent_fin) = match self.state {
1567 State::SynSent | State::SynReceived => (true, false),
1569 State::FinWait1 | State::LastAck | State::Closing => (false, true),
1571 _ => (false, false),
1574 };
1575 let control_len = (sent_syn as usize) + (sent_fin as usize);
1576
1577 match (self.state, repr.control, repr.ack_number) {
1579 (State::SynSent, TcpControl::Rst, None) => {
1582 net_debug!("unacceptable RST (expecting RST|ACK) in response to initial SYN");
1583 return None;
1584 }
1585 (State::SynSent, TcpControl::Rst, Some(ack_number)) => {
1586 if ack_number != self.local_seq_no + 1 {
1587 net_debug!("unacceptable RST|ACK in response to initial SYN");
1588 return None;
1589 }
1590 }
1591 (_, TcpControl::Rst, _) => (),
1593 (State::Listen, _, None) => (),
1595 (State::Listen, _, Some(_)) => unreachable!(),
1597 (State::SynSent, TcpControl::Syn, Some(ack_number)) => {
1599 if ack_number != self.local_seq_no + 1 {
1600 net_debug!("unacceptable SYN|ACK in response to initial SYN");
1601 return Some(Self::rst_reply(ip_repr, repr));
1602 }
1603 }
1604 (State::SynSent, TcpControl::Syn, None) => (),
1608 (State::SynSent, TcpControl::None, Some(ack_number)) => {
1610 if ack_number == self.local_seq_no + 1 {
1615 net_debug!(
1616 "expecting a SYN|ACK, received an ACK with the right ack_number, ignoring."
1617 );
1618 return None;
1619 }
1620
1621 net_debug!(
1622 "expecting a SYN|ACK, received an ACK with the wrong ack_number, sending RST."
1623 );
1624 return Some(Self::rst_reply(ip_repr, repr));
1625 }
1626 (State::SynSent, _, _) => {
1628 net_debug!("expecting a SYN|ACK");
1629 return None;
1630 }
1631 (_, _, None) => {
1633 net_debug!("expecting an ACK");
1634 return None;
1635 }
1636 (State::SynReceived, _, Some(ack_number)) => {
1638 if ack_number != self.local_seq_no + 1 {
1639 net_debug!("unacceptable ACK in response to SYN|ACK");
1640 return Some(Self::rst_reply(ip_repr, repr));
1641 }
1642 }
1643 (_, _, Some(ack_number)) => {
1645 let unacknowledged = self.tx_buffer.len() + control_len;
1646
1647 let mut ack_min = self.local_seq_no;
1649 let ack_max = self.local_seq_no + unacknowledged;
1650
1651 if sent_syn {
1653 ack_min += 1;
1654 }
1655
1656 if ack_number < ack_min {
1657 net_debug!(
1658 "duplicate ACK ({} not in {}...{})",
1659 ack_number,
1660 ack_min,
1661 ack_max
1662 );
1663 return None;
1664 }
1665
1666 if ack_number > ack_max {
1667 net_debug!(
1668 "unacceptable ACK ({} not in {}...{})",
1669 ack_number,
1670 ack_min,
1671 ack_max
1672 );
1673 return self.challenge_ack_reply(cx, ip_repr, repr);
1674 }
1675 }
1676 }
1677
1678 let window_start = self.remote_seq_no + self.rx_buffer.len();
1679 let window_end = if let Some(last_ack) = self.remote_last_ack {
1680 last_ack + ((self.remote_last_win as usize) << self.remote_win_shift)
1681 } else {
1682 window_start
1683 };
1684 let segment_start = repr.seq_number;
1685 let segment_end = repr.seq_number + repr.payload.len();
1686
1687 let (payload, payload_offset) = match self.state {
1688 State::Listen | State::SynSent => (&[][..], 0),
1690 _ => {
1691 let segment_in_window = match (
1693 segment_start == segment_end,
1694 window_start == window_end,
1695 ) {
1696 (true, _) if segment_end == window_start - 1 => {
1697 net_debug!(
1698 "received a keep-alive or window probe packet, will send an ACK"
1699 );
1700 false
1701 }
1702 (true, true) => {
1703 if window_start == segment_start {
1704 true
1705 } else {
1706 net_debug!(
1707 "zero-length segment not inside zero-length window, will send an ACK."
1708 );
1709 false
1710 }
1711 }
1712 (true, false) => {
1713 if window_start <= segment_start && segment_start < window_end {
1714 true
1715 } else {
1716 net_debug!("zero-length segment not inside window, will send an ACK.");
1717 false
1718 }
1719 }
1720 (false, true) => {
1721 net_debug!(
1722 "non-zero-length segment with zero receive window, will only send an ACK"
1723 );
1724 false
1725 }
1726 (false, false) => {
1727 if (window_start <= segment_start && segment_start < window_end)
1728 || (window_start < segment_end && segment_end <= window_end)
1729 {
1730 true
1731 } else {
1732 net_debug!(
1733 "segment not in receive window ({}..{} not intersecting {}..{}), will send challenge ACK",
1734 segment_start,
1735 segment_end,
1736 window_start,
1737 window_end
1738 );
1739 false
1740 }
1741 }
1742 };
1743
1744 if segment_in_window {
1745 let overlap_start = window_start.max(segment_start);
1746 let overlap_end = window_end.min(segment_end);
1747
1748 debug_assert!(overlap_start <= overlap_end);
1750
1751 self.local_rx_last_seq = Some(repr.seq_number);
1752
1753 (
1754 &repr.payload[overlap_start - segment_start..overlap_end - segment_start],
1755 overlap_start - window_start,
1756 )
1757 } else {
1758 if self.state == State::TimeWait {
1761 self.timer.set_for_close(cx.now());
1762 }
1763
1764 return self.challenge_ack_reply(cx, ip_repr, repr);
1765 }
1766 }
1767 };
1768
1769 let mut ack_len = 0;
1772 let mut ack_of_fin = false;
1773 let mut ack_all = false;
1774 if repr.control != TcpControl::Rst
1775 && let Some(ack_number) = repr.ack_number
1776 {
1777 let tx_buffer_start_seq = self.local_seq_no + (sent_syn as usize);
1781
1782 if ack_number >= tx_buffer_start_seq {
1783 ack_len = ack_number - tx_buffer_start_seq;
1784
1785 if sent_fin && self.tx_buffer.len() + 1 == ack_len {
1788 ack_len -= 1;
1789 tcp_trace!("received ACK of FIN");
1790 ack_of_fin = true;
1791 }
1792
1793 ack_all = self.remote_last_seq <= ack_number;
1794 }
1795
1796 self.rtte.on_ack(cx.now(), ack_number);
1797 self.congestion_controller
1798 .inner_mut()
1799 .on_ack(cx.now(), ack_len, &self.rtte);
1800 }
1801
1802 let mut control = repr.control;
1804 control = control.quash_psh();
1805
1806 if control == TcpControl::Fin && window_start < segment_start {
1809 tcp_trace!(
1810 "ignoring FIN because we don't have full data yet. window_start={} segment_start={}",
1811 window_start,
1812 segment_start
1813 );
1814 control = TcpControl::None;
1815 }
1816
1817 match (self.state, control) {
1819 (State::Listen, TcpControl::Rst) => return None,
1821
1822 (State::SynReceived, TcpControl::Rst) if self.listen_endpoint.port != 0 => {
1827 tcp_trace!("received RST");
1828 self.tuple = None;
1829 self.set_state(State::Listen);
1830 return None;
1831 }
1832
1833 (_, TcpControl::Rst) => {
1835 tcp_trace!("received RST");
1836 self.set_state(State::Closed);
1837 self.tuple = None;
1838 return None;
1839 }
1840
1841 (State::Listen, TcpControl::Syn) => {
1843 tcp_trace!("received SYN");
1844 if let Some(max_seg_size) = repr.max_seg_size {
1845 if max_seg_size == 0 {
1846 tcp_trace!("received SYNACK with zero MSS, ignoring");
1847 return None;
1848 }
1849 self.congestion_controller
1850 .inner_mut()
1851 .set_mss(max_seg_size as usize);
1852 self.remote_mss = max_seg_size as usize
1853 }
1854
1855 self.tuple = Some(Tuple {
1856 local: IpEndpoint::new(ip_repr.dst_addr(), repr.dst_port),
1857 remote: IpEndpoint::new(ip_repr.src_addr(), repr.src_port),
1858 });
1859 self.local_seq_no = Self::random_seq_no(cx);
1860 self.remote_seq_no = repr.seq_number + 1;
1861 self.remote_last_seq = self.local_seq_no;
1862 self.remote_has_sack = repr.sack_permitted;
1863 self.remote_win_scale = repr.window_scale;
1864 if self.remote_win_scale.is_none() {
1866 self.remote_win_shift = 0;
1867 }
1868 if repr.timestamp.is_none() {
1870 self.tsval_generator = None;
1871 }
1872 self.set_state(State::SynReceived);
1873 self.timer.set_for_idle(cx.now(), self.keep_alive);
1874 }
1875
1876 (State::SynReceived, TcpControl::None) => {
1878 self.set_state(State::Established);
1879 }
1880
1881 (State::SynReceived, TcpControl::Fin) => {
1885 self.remote_seq_no += 1;
1886 self.rx_fin_received = true;
1887 self.set_state(State::CloseWait);
1888 }
1889
1890 (State::SynSent, TcpControl::Syn) => {
1893 if repr.ack_number.is_some() {
1894 tcp_trace!("received SYN|ACK");
1895 } else {
1896 tcp_trace!("received SYN");
1897 }
1898 if let Some(max_seg_size) = repr.max_seg_size {
1899 if max_seg_size == 0 {
1900 tcp_trace!("received SYNACK with zero MSS, ignoring");
1901 return None;
1902 }
1903 self.remote_mss = max_seg_size as usize;
1904 self.congestion_controller
1905 .inner_mut()
1906 .set_mss(self.remote_mss);
1907 }
1908
1909 self.remote_seq_no = repr.seq_number + 1;
1910 self.remote_last_seq = self.local_seq_no + 1;
1911 self.remote_last_ack = Some(repr.seq_number);
1912 self.remote_has_sack = repr.sack_permitted;
1913 self.remote_win_scale = repr.window_scale;
1914 if self.remote_win_scale.is_none() {
1916 self.remote_win_shift = 0;
1917 }
1918 if repr.timestamp.is_none() {
1920 self.tsval_generator = None;
1921 }
1922
1923 if repr.ack_number.is_some() {
1924 self.set_state(State::Established);
1925 } else {
1926 self.set_state(State::SynReceived);
1927 }
1928 }
1929
1930 (State::Established, TcpControl::None) => {}
1931
1932 (State::Established, TcpControl::Fin) => {
1934 self.remote_seq_no += 1;
1935 self.rx_fin_received = true;
1936 self.set_state(State::CloseWait);
1937 }
1938
1939 (State::FinWait1, TcpControl::None) => {
1942 if ack_of_fin {
1943 self.set_state(State::FinWait2);
1944 }
1945 }
1946
1947 (State::FinWait1, TcpControl::Fin) => {
1950 self.remote_seq_no += 1;
1951 self.rx_fin_received = true;
1952 if ack_of_fin {
1953 self.set_state(State::TimeWait);
1954 self.timer.set_for_close(cx.now());
1955 } else {
1956 self.set_state(State::Closing);
1957 }
1958 }
1959
1960 (State::FinWait2, TcpControl::None) => {}
1961
1962 (State::FinWait2, TcpControl::Fin) => {
1964 self.remote_seq_no += 1;
1965 self.rx_fin_received = true;
1966 self.set_state(State::TimeWait);
1967 self.timer.set_for_close(cx.now());
1968 }
1969
1970 (State::Closing, TcpControl::None) => {
1972 if ack_of_fin {
1973 self.set_state(State::TimeWait);
1974 self.timer.set_for_close(cx.now());
1975 }
1976 }
1977
1978 (State::CloseWait, TcpControl::None) => {}
1979
1980 (State::LastAck, TcpControl::None) => {
1982 if ack_of_fin {
1983 self.set_state(State::Closed);
1985 self.tuple = None;
1986 } else if ack_len == 0 {
1987 return self.challenge_ack_reply(cx, ip_repr, repr);
1990 }
1991 }
1993
1994 _ => {
1995 net_debug!("unexpected packet {}", repr);
1996 return None;
1997 }
1998 }
1999
2000 self.remote_last_ts = Some(cx.now());
2002
2003 let scale = match repr.control {
2006 TcpControl::Syn => 0,
2007 _ => self.remote_win_scale.unwrap_or(0),
2008 };
2009 let new_remote_win_len = (repr.window_len as usize) << (scale as usize);
2010 let is_window_update = new_remote_win_len != self.remote_win_len;
2011 self.remote_win_len = new_remote_win_len;
2012
2013 self.congestion_controller
2014 .inner_mut()
2015 .set_remote_window(new_remote_win_len);
2016
2017 if ack_len > 0 {
2018 debug_assert!(self.tx_buffer.len() >= ack_len);
2020 tcp_trace!(
2021 "tx buffer: dequeueing {} octets (now {})",
2022 ack_len,
2023 self.tx_buffer.len() - ack_len
2024 );
2025 self.tx_buffer.dequeue_allocated(ack_len);
2026
2027 #[cfg(feature = "async")]
2029 self.tx_waker.wake();
2030 }
2031
2032 if let Some(ack_number) = repr.ack_number {
2033 match self.local_rx_last_ack {
2041 Some(last_rx_ack)
2045 if repr.payload.is_empty()
2046 && last_rx_ack == ack_number
2047 && ack_number < self.remote_last_seq
2048 && !is_window_update =>
2049 {
2050 self.local_rx_dup_acks = self.local_rx_dup_acks.saturating_add(1);
2052
2053 self.congestion_controller
2055 .inner_mut()
2056 .on_duplicate_ack(cx.now());
2057
2058 net_debug!(
2059 "received duplicate ACK for seq {} (duplicate nr {}{})",
2060 ack_number,
2061 self.local_rx_dup_acks,
2062 if self.local_rx_dup_acks == u8::MAX {
2063 "+"
2064 } else {
2065 ""
2066 }
2067 );
2068
2069 if self.local_rx_dup_acks == 3 {
2070 self.timer.set_for_fast_retransmit();
2071 net_debug!("started fast retransmit");
2072 }
2073 }
2074 _ => {
2076 if self.local_rx_dup_acks > 0 {
2077 self.local_rx_dup_acks = 0;
2078 net_debug!("reset duplicate ACK count");
2079 }
2080 self.local_rx_last_ack = Some(ack_number);
2081 }
2082 };
2083 self.local_seq_no = ack_number;
2086 if self.remote_last_seq < self.local_seq_no {
2092 self.remote_last_seq = self.local_seq_no
2093 }
2094 }
2095
2096 if let Some(timestamp) = repr.timestamp {
2098 self.last_remote_tsval = timestamp.tsval;
2099 }
2100
2101 match self.timer {
2103 Timer::Retransmit { .. } | Timer::FastRetransmit => {
2104 if ack_all {
2105 self.timer.set_for_idle(cx.now(), self.keep_alive);
2107 } else if ack_len > 0 {
2108 let rto = self.rtte.retransmission_timeout();
2110 self.timer.set_for_retransmit(cx.now(), rto);
2111 }
2112 }
2113 Timer::Idle { .. } => {
2114 self.timer.set_for_idle(cx.now(), self.keep_alive);
2116 }
2117 _ => {}
2118 }
2119
2120 if self.remote_win_len == 0
2122 && !self.tx_buffer.is_empty()
2123 && (self.timer.is_idle() || ack_len > 0)
2124 {
2125 let delay = self.rtte.retransmission_timeout();
2126 tcp_trace!("starting zero-window-probe timer for t+{}", delay);
2127 self.timer.set_for_zero_window_probe(cx.now(), delay);
2128 }
2129 if self.remote_win_len != 0 && self.timer.is_zero_window_probe() {
2130 tcp_trace!("stopping zero-window-probe timer");
2131 self.timer.set_for_idle(cx.now(), self.keep_alive);
2132 }
2133
2134 let payload_len = payload.len();
2135 if payload_len == 0 {
2136 return None;
2137 }
2138
2139 let assembler_was_empty = self.assembler.is_empty();
2140
2141 let Ok(contig_len) = self
2143 .assembler
2144 .add_then_remove_front(payload_offset, payload_len)
2145 else {
2146 net_debug!(
2147 "assembler: too many holes to add {} octets at offset {}",
2148 payload_len,
2149 payload_offset
2150 );
2151 return None;
2152 };
2153
2154 tcp_trace!(
2156 "rx buffer: receiving {} octets at offset {}",
2157 payload_len,
2158 payload_offset
2159 );
2160 let len_written = self.rx_buffer.write_unallocated(payload_offset, payload);
2161 debug_assert!(len_written == payload_len);
2162
2163 if contig_len != 0 {
2164 tcp_trace!(
2166 "rx buffer: enqueueing {} octets (now {})",
2167 contig_len,
2168 self.rx_buffer.len() + contig_len
2169 );
2170 self.rx_buffer.enqueue_unallocated(contig_len);
2171
2172 #[cfg(feature = "async")]
2174 self.rx_waker.wake();
2175 }
2176
2177 if !self.assembler.is_empty() {
2178 tcp_trace!("assembler: {}", self.assembler);
2180 }
2181
2182 if let Some(ack_delay) = self.ack_delay
2184 && self.ack_to_transmit()
2185 {
2186 self.ack_delay_timer = match self.ack_delay_timer {
2187 AckDelayTimer::Idle => {
2188 tcp_trace!("starting delayed ack timer");
2189 AckDelayTimer::Waiting(cx.now() + ack_delay)
2190 }
2191 AckDelayTimer::Waiting(_) if self.immediate_ack_to_transmit() => {
2192 tcp_trace!("delayed ack timer already started, forcing expiry");
2193 AckDelayTimer::Immediate
2194 }
2195 timer @ AckDelayTimer::Waiting(_) => {
2196 tcp_trace!("waiting until delayed ack timer expires");
2197 timer
2198 }
2199 AckDelayTimer::Immediate => {
2200 tcp_trace!("delayed ack timer already force-expired");
2201 AckDelayTimer::Immediate
2202 }
2203 };
2204 }
2205
2206 if !self.assembler.is_empty() || !assembler_was_empty {
2210 tcp_trace!("ACKing incoming segment");
2214 Some(self.ack_reply(ip_repr, repr))
2215 } else {
2216 None
2217 }
2218 }
2219
2220 fn timed_out(&self, timestamp: Instant) -> bool {
2221 match (self.remote_last_ts, self.timeout) {
2222 (Some(remote_last_ts), Some(timeout)) => timestamp >= remote_last_ts + timeout,
2223 (_, _) => false,
2224 }
2225 }
2226
2227 fn seq_to_transmit(&self, cx: &mut Context) -> bool {
2228 let ip_header_len = match self.tuple.unwrap().local.addr {
2229 #[cfg(feature = "proto-ipv4")]
2230 IpAddress::Ipv4(_) => crate::wire::IPV4_HEADER_LEN,
2231 #[cfg(feature = "proto-ipv6")]
2232 IpAddress::Ipv6(_) => crate::wire::IPV6_HEADER_LEN,
2233 };
2234
2235 let local_mss = cx.ip_mtu() - ip_header_len - TCP_HEADER_LEN;
2237
2238 let effective_mss = local_mss.min(self.remote_mss);
2240
2241 let data_in_flight = self.remote_last_seq != self.local_seq_no;
2243
2244 if matches!(self.state, State::SynSent | State::SynReceived) && !data_in_flight {
2246 return true;
2247 }
2248
2249 let max_send_seq =
2251 self.local_seq_no + core::cmp::min(self.remote_win_len, self.tx_buffer.len());
2252
2253 let max_send = if max_send_seq >= self.remote_last_seq {
2255 max_send_seq - self.remote_last_seq
2256 } else {
2257 0
2258 };
2259
2260 let max_send = max_send.min(self.congestion_controller.inner().window());
2262
2263 let mut can_send = max_send != 0;
2265 let can_send_full = max_send >= effective_mss;
2267
2268 let want_fin = match self.state {
2270 State::FinWait1 => true,
2271 State::Closing => true,
2272 State::LastAck => true,
2273 _ => false,
2274 };
2275
2276 if self.nagle && data_in_flight && !can_send_full && !want_fin {
2282 can_send = false;
2283 }
2284
2285 let can_fin = want_fin && self.remote_last_seq == self.local_seq_no + self.tx_buffer.len();
2290
2291 can_send || can_fin
2292 }
2293
2294 fn delayed_ack_expired(&self, timestamp: Instant) -> bool {
2295 match self.ack_delay_timer {
2296 AckDelayTimer::Idle => true,
2297 AckDelayTimer::Waiting(t) => t <= timestamp,
2298 AckDelayTimer::Immediate => true,
2299 }
2300 }
2301
2302 fn ack_to_transmit(&self) -> bool {
2303 if let Some(remote_last_ack) = self.remote_last_ack {
2304 remote_last_ack < self.remote_seq_no + self.rx_buffer.len()
2305 } else {
2306 false
2307 }
2308 }
2309
2310 fn immediate_ack_to_transmit(&self) -> bool {
2321 if let Some(remote_last_ack) = self.remote_last_ack {
2322 remote_last_ack + self.remote_mss < self.remote_seq_no + self.rx_buffer.len()
2323 } else {
2324 false
2325 }
2326 }
2327
2328 fn window_to_update(&self) -> bool {
2335 match self.state {
2336 State::SynSent
2337 | State::SynReceived
2338 | State::Established
2339 | State::FinWait1
2340 | State::FinWait2 => {
2341 let new_win = self.scaled_window();
2342 if let Some(last_win) = self.last_scaled_window() {
2343 new_win > 0 && new_win / 2 >= last_win
2344 } else {
2345 false
2346 }
2347 }
2348 _ => false,
2349 }
2350 }
2351
2352 pub(crate) fn dispatch<F, E>(&mut self, cx: &mut Context, emit: F) -> Result<(), E>
2353 where
2354 F: FnOnce(&mut Context, (IpRepr, TcpRepr)) -> Result<(), E>,
2355 {
2356 if self.tuple.is_none() {
2357 return Ok(());
2358 }
2359
2360 let tuple = self.tuple.unwrap();
2362
2363 if !cx.has_ip_addr(tuple.local.addr) {
2368 net_debug!("source IP address no longer available, closing socket");
2369 self.reset();
2370 return Ok(());
2371 }
2372
2373 if self.remote_last_ts.is_none() {
2374 self.remote_last_ts = Some(cx.now());
2382 }
2383
2384 self.congestion_controller
2385 .inner_mut()
2386 .pre_transmit(cx.now());
2387
2388 if self.timed_out(cx.now()) {
2390 net_debug!("timeout exceeded");
2392 self.set_state(State::Closed);
2393 } else if !self.seq_to_transmit(cx) && self.timer.should_retransmit(cx.now()) {
2394 net_debug!("retransmitting");
2396
2397 self.remote_last_seq = self.local_seq_no;
2401
2402 self.timer.set_for_idle(cx.now(), self.keep_alive);
2407
2408 self.rtte.on_retransmit();
2410
2411 self.congestion_controller
2413 .inner_mut()
2414 .on_retransmit(cx.now());
2415 }
2416
2417 #[cfg(feature = "socket-tcp-pause-synack")]
2418 if matches!(self.state, State::SynReceived) && self.synack_paused {
2419 return Ok(());
2420 }
2421
2422 if self.seq_to_transmit(cx) {
2424 tcp_trace!("outgoing segment will send data or flags");
2426 } else if self.ack_to_transmit() && self.delayed_ack_expired(cx.now()) {
2427 tcp_trace!("outgoing segment will acknowledge");
2429 } else if self.window_to_update() {
2430 tcp_trace!("outgoing segment will update window");
2432 } else if self.state == State::Closed {
2433 tcp_trace!("outgoing segment will abort connection");
2435 } else if self.timer.should_keep_alive(cx.now()) {
2436 tcp_trace!("keep-alive timer expired");
2438 } else if self.timer.should_zero_window_probe(cx.now()) {
2439 tcp_trace!("sending zero-window probe");
2440 } else if self.timer.should_close(cx.now()) {
2441 tcp_trace!("TIME-WAIT timer expired");
2443 self.reset();
2444 return Ok(());
2445 } else {
2446 return Ok(());
2447 }
2448
2449 let mut ip_repr = IpRepr::new(
2452 tuple.local.addr,
2453 tuple.remote.addr,
2454 IpProtocol::Tcp,
2455 0,
2456 self.hop_limit.unwrap_or(64),
2457 );
2458
2459 let mut repr = TcpRepr {
2462 src_port: tuple.local.port,
2463 dst_port: tuple.remote.port,
2464 control: TcpControl::None,
2465 seq_number: self.remote_last_seq,
2466 ack_number: Some(self.remote_seq_no + self.rx_buffer.len()),
2467 window_len: self.scaled_window(),
2468 window_scale: None,
2469 max_seg_size: None,
2470 sack_permitted: false,
2471 sack_ranges: [None, None, None],
2472 timestamp: TcpTimestampRepr::generate_reply_with_tsval(
2473 self.tsval_generator,
2474 self.last_remote_tsval,
2475 ),
2476 payload: &[],
2477 };
2478
2479 let mut is_zero_window_probe = false;
2480
2481 match self.state {
2482 State::Closed => {
2485 repr.control = TcpControl::Rst;
2486 }
2487
2488 State::Listen => return Ok(()),
2490
2491 State::SynSent | State::SynReceived => {
2494 repr.control = TcpControl::Syn;
2495 repr.seq_number = self.local_seq_no;
2496 repr.window_len = u16::try_from(self.rx_buffer.window()).unwrap_or(u16::MAX);
2498 if self.state == State::SynSent {
2499 repr.ack_number = None;
2500 repr.window_scale = Some(self.remote_win_shift);
2501 repr.sack_permitted = true;
2502 } else {
2503 repr.sack_permitted = self.remote_has_sack;
2504 repr.window_scale = self.remote_win_scale.map(|_| self.remote_win_shift);
2505 }
2506 }
2507
2508 State::Established
2511 | State::FinWait1
2512 | State::Closing
2513 | State::CloseWait
2514 | State::LastAck => {
2515 let win_right_edge = self.local_seq_no + self.remote_win_len;
2520
2521 let mut win_limit = if win_right_edge >= self.remote_last_seq {
2523 win_right_edge - self.remote_last_seq
2524 } else {
2525 0
2531 };
2532
2533 if win_limit == 0 && self.timer.should_zero_window_probe(cx.now()) {
2535 win_limit = 1;
2536 is_zero_window_probe = true;
2537 }
2538
2539 let size = win_limit
2544 .min(self.remote_mss)
2545 .min(cx.ip_mtu() - ip_repr.header_len() - TCP_HEADER_LEN);
2546
2547 let offset = self.remote_last_seq - self.local_seq_no;
2548 repr.payload = self.tx_buffer.get_allocated(offset, size);
2549
2550 if offset + repr.payload.len() == self.tx_buffer.len() {
2553 match self.state {
2554 State::FinWait1 | State::LastAck | State::Closing => {
2555 repr.control = TcpControl::Fin
2556 }
2557 State::Established | State::CloseWait if !repr.payload.is_empty() => {
2558 repr.control = TcpControl::Psh
2559 }
2560 _ => (),
2561 }
2562 }
2563 }
2564
2565 State::FinWait2 | State::TimeWait => {}
2567 }
2568
2569 let is_keep_alive;
2574 if self.timer.should_keep_alive(cx.now()) && repr.is_empty() {
2575 repr.seq_number = repr.seq_number - 1;
2576 repr.payload = b"\x00"; is_keep_alive = true;
2578 } else {
2579 is_keep_alive = false;
2580 }
2581
2582 if is_keep_alive {
2584 tcp_trace!("sending a keep-alive");
2585 } else if !repr.payload.is_empty() {
2586 tcp_trace!(
2587 "tx buffer: sending {} octets at offset {}",
2588 repr.payload.len(),
2589 self.remote_last_seq - self.local_seq_no
2590 );
2591 }
2592 if repr.control != TcpControl::None || repr.payload.is_empty() {
2593 let flags = match (repr.control, repr.ack_number) {
2594 (TcpControl::Syn, None) => "SYN",
2595 (TcpControl::Syn, Some(_)) => "SYN|ACK",
2596 (TcpControl::Fin, Some(_)) => "FIN|ACK",
2597 (TcpControl::Rst, Some(_)) => "RST|ACK",
2598 (TcpControl::Psh, Some(_)) => "PSH|ACK",
2599 (TcpControl::None, Some(_)) => "ACK",
2600 _ => "<unreachable>",
2601 };
2602 tcp_trace!("sending {}", flags);
2603 }
2604
2605 if repr.control == TcpControl::Syn {
2606 let max_segment_size = cx.ip_mtu() - ip_repr.header_len() - TCP_HEADER_LEN;
2608 repr.max_seg_size = Some(max_segment_size as u16);
2609 }
2610
2611 ip_repr.set_payload_len(repr.buffer_len());
2619 emit(cx, (ip_repr, repr))?;
2620
2621 self.timer.rewind_keep_alive(cx.now(), self.keep_alive);
2624
2625 match self.ack_delay_timer {
2627 AckDelayTimer::Idle => {}
2628 AckDelayTimer::Waiting(_) => {
2629 tcp_trace!("stop delayed ack timer")
2630 }
2631 AckDelayTimer::Immediate => {
2632 tcp_trace!("stop delayed ack timer (was force-expired)")
2633 }
2634 }
2635 self.ack_delay_timer = AckDelayTimer::Idle;
2636
2637 if is_zero_window_probe {
2639 self.timer.rewind_zero_window_probe(cx.now());
2640 return Ok(());
2641 }
2642
2643 if is_keep_alive {
2646 return Ok(());
2647 }
2648
2649 self.remote_last_seq = repr.seq_number + repr.segment_len();
2651 self.remote_last_ack = repr.ack_number;
2652 self.remote_last_win = repr.window_len;
2653
2654 if repr.segment_len() > 0 {
2655 self.rtte
2656 .on_send(cx.now(), repr.seq_number + repr.segment_len());
2657 self.congestion_controller
2658 .inner_mut()
2659 .post_transmit(cx.now(), repr.segment_len());
2660 }
2661
2662 if repr.segment_len() > 0 && !self.timer.is_retransmit() {
2663 let rto = self.rtte.retransmission_timeout();
2667 self.timer.set_for_retransmit(cx.now(), rto);
2668 }
2669
2670 if self.state == State::Closed {
2671 self.tuple = None;
2673 #[cfg(feature = "async")]
2674 {
2675 self.tx_waker.wake();
2677 }
2678 }
2679
2680 Ok(())
2681 }
2682
2683 #[allow(clippy::if_same_then_else)]
2684 pub(crate) fn poll_at(&self, cx: &mut Context) -> PollAt {
2685 if self.tuple.is_none() {
2687 PollAt::Ingress
2689 } else if self.remote_last_ts.is_none() {
2690 PollAt::Now
2692 } else if self.state == State::Closed {
2693 PollAt::Now
2695 } else if self.seq_to_transmit(cx) {
2696 PollAt::Now
2698 } else if self.window_to_update() {
2699 PollAt::Now
2701 } else {
2702 let want_ack = self.ack_to_transmit();
2703
2704 let delayed_ack_poll_at = match (want_ack, self.ack_delay_timer) {
2705 (false, _) => PollAt::Ingress,
2706 (true, AckDelayTimer::Idle) => PollAt::Now,
2707 (true, AckDelayTimer::Waiting(t)) => PollAt::Time(t),
2708 (true, AckDelayTimer::Immediate) => PollAt::Now,
2709 };
2710
2711 let timeout_poll_at = match (self.remote_last_ts, self.timeout) {
2712 (Some(remote_last_ts), Some(timeout)) => PollAt::Time(remote_last_ts + timeout),
2715 (_, _) => PollAt::Ingress,
2717 };
2718
2719 *[self.timer.poll_at(), timeout_poll_at, delayed_ack_poll_at]
2721 .iter()
2722 .min()
2723 .unwrap_or(&PollAt::Ingress)
2724 }
2725 }
2726}
2727
2728impl<'a> fmt::Write for Socket<'a> {
2729 fn write_str(&mut self, slice: &str) -> fmt::Result {
2730 let slice = slice.as_bytes();
2731 if self.send_slice(slice) == Ok(slice.len()) {
2732 Ok(())
2733 } else {
2734 Err(fmt::Error)
2735 }
2736 }
2737}
2738
2739#[cfg(all(test, feature = "medium-ip"))]
2743mod test {
2744 use super::*;
2745 use crate::config::IFACE_MAX_ADDR_COUNT;
2746 use crate::wire::{IpCidr, IpRepr};
2747 use std::ops::{Deref, DerefMut};
2748 use std::vec::Vec;
2749
2750 const LOCAL_PORT: u16 = 80;
2755 const REMOTE_PORT: u16 = 49500;
2756 const LISTEN_END: IpListenEndpoint = IpListenEndpoint {
2757 addr: None,
2758 port: LOCAL_PORT,
2759 };
2760 const TUPLE: Tuple = Tuple {
2761 local: LOCAL_END,
2762 remote: REMOTE_END,
2763 };
2764 const LOCAL_SEQ: TcpSeqNumber = TcpSeqNumber(10000);
2765 const REMOTE_SEQ: TcpSeqNumber = TcpSeqNumber(-10001);
2766
2767 cfg_if::cfg_if! {
2768 if #[cfg(feature = "proto-ipv4")] {
2769 use crate::wire::Ipv4Address as IpvXAddress;
2770 use crate::wire::Ipv4Repr as IpvXRepr;
2771 use IpRepr::Ipv4 as IpReprIpvX;
2772
2773 const LOCAL_ADDR: IpvXAddress = IpvXAddress::new(192, 168, 1, 1);
2774 const REMOTE_ADDR: IpvXAddress = IpvXAddress::new(192, 168, 1, 2);
2775 const OTHER_ADDR: IpvXAddress = IpvXAddress::new(192, 168, 1, 3);
2776
2777 const BASE_MSS: u16 = 1460;
2778
2779 const LOCAL_END: IpEndpoint = IpEndpoint {
2780 addr: IpAddress::Ipv4(LOCAL_ADDR),
2781 port: LOCAL_PORT,
2782 };
2783 const REMOTE_END: IpEndpoint = IpEndpoint {
2784 addr: IpAddress::Ipv4(REMOTE_ADDR),
2785 port: REMOTE_PORT,
2786 };
2787 } else {
2788 use crate::wire::Ipv6Address as IpvXAddress;
2789 use crate::wire::Ipv6Repr as IpvXRepr;
2790 use IpRepr::Ipv6 as IpReprIpvX;
2791
2792 const LOCAL_ADDR: IpvXAddress = IpvXAddress::new(0xfe80, 0, 0, 0, 0, 0, 0, 1);
2793 const REMOTE_ADDR: IpvXAddress = IpvXAddress::new(0xfe80, 0, 0, 0, 0, 0, 0, 2);
2794 const OTHER_ADDR: IpvXAddress = IpvXAddress::new(0xfe80, 0, 0, 0, 0, 0, 0, 3);
2795
2796 const BASE_MSS: u16 = 1440;
2797
2798 const LOCAL_END: IpEndpoint = IpEndpoint {
2799 addr: IpAddress::Ipv6(LOCAL_ADDR),
2800 port: LOCAL_PORT,
2801 };
2802 const REMOTE_END: IpEndpoint = IpEndpoint {
2803 addr: IpAddress::Ipv6(REMOTE_ADDR),
2804 port: REMOTE_PORT,
2805 };
2806 }
2807 }
2808
2809 const SEND_IP_TEMPL: IpRepr = IpReprIpvX(IpvXRepr {
2810 src_addr: LOCAL_ADDR,
2811 dst_addr: REMOTE_ADDR,
2812 next_header: IpProtocol::Tcp,
2813 payload_len: 20,
2814 hop_limit: 64,
2815 });
2816 const SEND_TEMPL: TcpRepr<'static> = TcpRepr {
2817 src_port: REMOTE_PORT,
2818 dst_port: LOCAL_PORT,
2819 control: TcpControl::None,
2820 seq_number: TcpSeqNumber(0),
2821 ack_number: Some(TcpSeqNumber(0)),
2822 window_len: 256,
2823 window_scale: None,
2824 max_seg_size: None,
2825 sack_permitted: false,
2826 sack_ranges: [None, None, None],
2827 timestamp: None,
2828 payload: &[],
2829 };
2830 const _RECV_IP_TEMPL: IpRepr = IpReprIpvX(IpvXRepr {
2831 src_addr: LOCAL_ADDR,
2832 dst_addr: REMOTE_ADDR,
2833 next_header: IpProtocol::Tcp,
2834 payload_len: 20,
2835 hop_limit: 64,
2836 });
2837 const RECV_TEMPL: TcpRepr<'static> = TcpRepr {
2838 src_port: LOCAL_PORT,
2839 dst_port: REMOTE_PORT,
2840 control: TcpControl::None,
2841 seq_number: TcpSeqNumber(0),
2842 ack_number: Some(TcpSeqNumber(0)),
2843 window_len: 64,
2844 window_scale: None,
2845 max_seg_size: None,
2846 sack_permitted: false,
2847 sack_ranges: [None, None, None],
2848 timestamp: None,
2849 payload: &[],
2850 };
2851
2852 struct TestSocket {
2857 socket: Socket<'static>,
2858 cx: Context,
2859 }
2860
2861 impl Deref for TestSocket {
2862 type Target = Socket<'static>;
2863 fn deref(&self) -> &Self::Target {
2864 &self.socket
2865 }
2866 }
2867
2868 impl DerefMut for TestSocket {
2869 fn deref_mut(&mut self) -> &mut Self::Target {
2870 &mut self.socket
2871 }
2872 }
2873
2874 #[track_caller]
2875 fn send(
2876 socket: &mut TestSocket,
2877 timestamp: Instant,
2878 repr: &TcpRepr,
2879 ) -> Option<TcpRepr<'static>> {
2880 socket.cx.set_now(timestamp);
2881
2882 let ip_repr = IpReprIpvX(IpvXRepr {
2883 src_addr: REMOTE_ADDR,
2884 dst_addr: LOCAL_ADDR,
2885 next_header: IpProtocol::Tcp,
2886 payload_len: repr.buffer_len(),
2887 hop_limit: 64,
2888 });
2889 net_trace!("send: {}", repr);
2890
2891 assert!(socket.socket.accepts(&mut socket.cx, &ip_repr, repr));
2892
2893 match socket.socket.process(&mut socket.cx, &ip_repr, repr) {
2894 Some((_ip_repr, repr)) => {
2895 net_trace!("recv: {}", repr);
2896 Some(repr)
2897 }
2898 None => None,
2899 }
2900 }
2901
2902 #[track_caller]
2903 fn recv<F>(socket: &mut TestSocket, timestamp: Instant, mut f: F)
2904 where
2905 F: FnMut(Result<TcpRepr, ()>),
2906 {
2907 socket.cx.set_now(timestamp);
2908
2909 let mut sent = 0;
2910 let result = socket
2911 .socket
2912 .dispatch(&mut socket.cx, |_, (ip_repr, tcp_repr)| {
2913 assert_eq!(ip_repr.next_header(), IpProtocol::Tcp);
2914 assert_eq!(ip_repr.src_addr(), LOCAL_ADDR.into());
2915 assert_eq!(ip_repr.dst_addr(), REMOTE_ADDR.into());
2916 assert_eq!(ip_repr.payload_len(), tcp_repr.buffer_len());
2917
2918 net_trace!("recv: {}", tcp_repr);
2919 sent += 1;
2920 Ok(f(Ok(tcp_repr)))
2921 });
2922 match result {
2923 Ok(()) => assert_eq!(sent, 1, "Exactly one packet should be sent"),
2924 Err(e) => f(Err(e)),
2925 }
2926 }
2927
2928 #[track_caller]
2929 fn recv_nothing(socket: &mut TestSocket, timestamp: Instant) {
2930 socket.cx.set_now(timestamp);
2931
2932 let mut fail = false;
2933 let result: Result<(), ()> = socket.socket.dispatch(&mut socket.cx, |_, _| {
2934 fail = true;
2935 Ok(())
2936 });
2937 if fail {
2938 panic!("Should not send a packet")
2939 }
2940
2941 assert_eq!(result, Ok(()))
2942 }
2943
2944 #[collapse_debuginfo(yes)]
2945 macro_rules! send {
2946 ($socket:ident, $repr:expr) =>
2947 (send!($socket, time 0, $repr));
2948 ($socket:ident, $repr:expr, $result:expr) =>
2949 (send!($socket, time 0, $repr, $result));
2950 ($socket:ident, time $time:expr, $repr:expr) =>
2951 (send!($socket, time $time, $repr, None));
2952 ($socket:ident, time $time:expr, $repr:expr, $result:expr) =>
2953 (assert_eq!(send(&mut $socket, Instant::from_millis($time), &$repr), $result));
2954 }
2955
2956 #[collapse_debuginfo(yes)]
2957 macro_rules! recv {
2958 ($socket:ident, [$( $repr:expr ),*]) => ({
2959 $( recv!($socket, Ok($repr)); )*
2960 recv_nothing!($socket)
2961 });
2962 ($socket:ident, time $time:expr, [$( $repr:expr ),*]) => ({
2963 $( recv!($socket, time $time, Ok($repr)); )*
2964 recv_nothing!($socket, time $time)
2965 });
2966 ($socket:ident, $result:expr) =>
2967 (recv!($socket, time 0, $result));
2968 ($socket:ident, time $time:expr, $result:expr) =>
2969 (recv(&mut $socket, Instant::from_millis($time), |result| {
2970 let result = result.map(|mut repr| {
2972 repr.control = repr.control.quash_psh();
2973 repr
2974 });
2975 assert_eq!(result, $result)
2976 }));
2977 ($socket:ident, time $time:expr, $result:expr, exact) =>
2978 (recv(&mut $socket, Instant::from_millis($time), |repr| assert_eq!(repr, $result)));
2979 }
2980
2981 #[collapse_debuginfo(yes)]
2982 macro_rules! recv_nothing {
2983 ($socket:ident) => (recv_nothing!($socket, time 0));
2984 ($socket:ident, time $time:expr) => (recv_nothing(&mut $socket, Instant::from_millis($time)));
2985 }
2986
2987 #[collapse_debuginfo(yes)]
2988 macro_rules! sanity {
2989 ($socket1:expr, $socket2:expr) => {{
2990 let (s1, s2) = ($socket1, $socket2);
2991 assert_eq!(s1.state, s2.state, "state");
2992 assert_eq!(s1.tuple, s2.tuple, "tuple");
2993 assert_eq!(s1.local_seq_no, s2.local_seq_no, "local_seq_no");
2994 assert_eq!(s1.remote_seq_no, s2.remote_seq_no, "remote_seq_no");
2995 assert_eq!(s1.remote_last_seq, s2.remote_last_seq, "remote_last_seq");
2996 assert_eq!(s1.remote_last_ack, s2.remote_last_ack, "remote_last_ack");
2997 assert_eq!(s1.remote_last_win, s2.remote_last_win, "remote_last_win");
2998 assert_eq!(s1.remote_win_len, s2.remote_win_len, "remote_win_len");
2999 assert_eq!(s1.timer, s2.timer, "timer");
3000 }};
3001 }
3002
3003 fn socket() -> TestSocket {
3004 socket_with_buffer_sizes(64, 64)
3005 }
3006
3007 fn socket_with_buffer_sizes(tx_len: usize, rx_len: usize) -> TestSocket {
3008 let (iface, _, _) = crate::tests::setup(crate::phy::Medium::Ip);
3009
3010 let rx_buffer = SocketBuffer::new(vec![0; rx_len]);
3011 let tx_buffer = SocketBuffer::new(vec![0; tx_len]);
3012 let mut socket = Socket::new(rx_buffer, tx_buffer);
3013 socket.set_ack_delay(None);
3014 TestSocket {
3015 socket,
3016 cx: iface.inner,
3017 }
3018 }
3019
3020 fn socket_syn_received_with_buffer_sizes(tx_len: usize, rx_len: usize) -> TestSocket {
3021 let mut s = socket_with_buffer_sizes(tx_len, rx_len);
3022 s.state = State::SynReceived;
3023 s.tuple = Some(TUPLE);
3024 s.local_seq_no = LOCAL_SEQ;
3025 s.remote_seq_no = REMOTE_SEQ + 1;
3026 s.remote_last_seq = LOCAL_SEQ;
3027 s.remote_win_len = 256;
3028 s
3029 }
3030
3031 fn socket_syn_received() -> TestSocket {
3032 socket_syn_received_with_buffer_sizes(64, 64)
3033 }
3034
3035 fn socket_syn_sent_with_buffer_sizes(tx_len: usize, rx_len: usize) -> TestSocket {
3036 let mut s = socket_with_buffer_sizes(tx_len, rx_len);
3037 s.state = State::SynSent;
3038 s.tuple = Some(TUPLE);
3039 s.local_seq_no = LOCAL_SEQ;
3040 s.remote_last_seq = LOCAL_SEQ;
3041 s
3042 }
3043
3044 fn socket_syn_sent() -> TestSocket {
3045 socket_syn_sent_with_buffer_sizes(64, 64)
3046 }
3047
3048 fn socket_established_with_buffer_sizes(tx_len: usize, rx_len: usize) -> TestSocket {
3049 let mut s = socket_syn_received_with_buffer_sizes(tx_len, rx_len);
3050 s.state = State::Established;
3051 s.local_seq_no = LOCAL_SEQ + 1;
3052 s.remote_last_seq = LOCAL_SEQ + 1;
3053 s.remote_last_ack = Some(REMOTE_SEQ + 1);
3054 s.remote_last_win = s.scaled_window();
3055 s
3056 }
3057
3058 fn socket_established() -> TestSocket {
3059 socket_established_with_buffer_sizes(64, 64)
3060 }
3061
3062 fn socket_fin_wait_1() -> TestSocket {
3063 let mut s = socket_established();
3064 s.state = State::FinWait1;
3065 s
3066 }
3067
3068 fn socket_fin_wait_2() -> TestSocket {
3069 let mut s = socket_fin_wait_1();
3070 s.state = State::FinWait2;
3071 s.local_seq_no = LOCAL_SEQ + 1 + 1;
3072 s.remote_last_seq = LOCAL_SEQ + 1 + 1;
3073 s
3074 }
3075
3076 fn socket_closing() -> TestSocket {
3077 let mut s = socket_fin_wait_1();
3078 s.state = State::Closing;
3079 s.remote_last_seq = LOCAL_SEQ + 1 + 1;
3080 s.remote_seq_no = REMOTE_SEQ + 1 + 1;
3081 s.timer = Timer::Retransmit {
3082 expires_at: Instant::from_millis_const(1000),
3083 };
3084 s
3085 }
3086
3087 fn socket_time_wait(from_closing: bool) -> TestSocket {
3088 let mut s = socket_fin_wait_2();
3089 s.state = State::TimeWait;
3090 s.remote_seq_no = REMOTE_SEQ + 1 + 1;
3091 if from_closing {
3092 s.remote_last_ack = Some(REMOTE_SEQ + 1 + 1);
3093 }
3094 s.timer = Timer::Close {
3095 expires_at: Instant::from_secs(1) + CLOSE_DELAY,
3096 };
3097 s
3098 }
3099
3100 fn socket_close_wait() -> TestSocket {
3101 let mut s = socket_established();
3102 s.state = State::CloseWait;
3103 s.remote_seq_no = REMOTE_SEQ + 1 + 1;
3104 s.remote_last_ack = Some(REMOTE_SEQ + 1 + 1);
3105 s
3106 }
3107
3108 fn socket_last_ack() -> TestSocket {
3109 let mut s = socket_close_wait();
3110 s.state = State::LastAck;
3111 s
3112 }
3113
3114 fn socket_recved() -> TestSocket {
3115 let mut s = socket_established();
3116 send!(
3117 s,
3118 TcpRepr {
3119 seq_number: REMOTE_SEQ + 1,
3120 ack_number: Some(LOCAL_SEQ + 1),
3121 payload: &b"abcdef"[..],
3122 ..SEND_TEMPL
3123 }
3124 );
3125 recv!(
3126 s,
3127 [TcpRepr {
3128 seq_number: LOCAL_SEQ + 1,
3129 ack_number: Some(REMOTE_SEQ + 1 + 6),
3130 window_len: 58,
3131 ..RECV_TEMPL
3132 }]
3133 );
3134 s
3135 }
3136
3137 #[test]
3141 fn test_closed_reject() {
3142 let mut s = socket();
3143 assert_eq!(s.state, State::Closed);
3144
3145 let tcp_repr = TcpRepr {
3146 control: TcpControl::Syn,
3147 ..SEND_TEMPL
3148 };
3149 assert!(!s.socket.accepts(&mut s.cx, &SEND_IP_TEMPL, &tcp_repr));
3150 }
3151
3152 #[test]
3153 fn test_closed_reject_after_listen() {
3154 let mut s = socket();
3155 s.listen(LOCAL_END).unwrap();
3156 s.close();
3157
3158 let tcp_repr = TcpRepr {
3159 control: TcpControl::Syn,
3160 ..SEND_TEMPL
3161 };
3162 assert!(!s.socket.accepts(&mut s.cx, &SEND_IP_TEMPL, &tcp_repr));
3163 }
3164
3165 #[test]
3166 fn test_closed_close() {
3167 let mut s = socket();
3168 s.close();
3169 assert_eq!(s.state, State::Closed);
3170 }
3171
3172 fn socket_listen() -> TestSocket {
3176 let mut s = socket();
3177 s.state = State::Listen;
3178 s.listen_endpoint = LISTEN_END;
3179 s
3180 }
3181
3182 #[test]
3183 fn test_listen_sack_option() {
3184 let mut s = socket_listen();
3185 send!(
3186 s,
3187 TcpRepr {
3188 control: TcpControl::Syn,
3189 seq_number: REMOTE_SEQ,
3190 ack_number: None,
3191 sack_permitted: false,
3192 ..SEND_TEMPL
3193 }
3194 );
3195 assert!(!s.remote_has_sack);
3196 recv!(
3197 s,
3198 [TcpRepr {
3199 control: TcpControl::Syn,
3200 seq_number: LOCAL_SEQ,
3201 ack_number: Some(REMOTE_SEQ + 1),
3202 max_seg_size: Some(BASE_MSS),
3203 ..RECV_TEMPL
3204 }]
3205 );
3206
3207 let mut s = socket_listen();
3208 send!(
3209 s,
3210 TcpRepr {
3211 control: TcpControl::Syn,
3212 seq_number: REMOTE_SEQ,
3213 ack_number: None,
3214 sack_permitted: true,
3215 ..SEND_TEMPL
3216 }
3217 );
3218 assert!(s.remote_has_sack);
3219 recv!(
3220 s,
3221 [TcpRepr {
3222 control: TcpControl::Syn,
3223 seq_number: LOCAL_SEQ,
3224 ack_number: Some(REMOTE_SEQ + 1),
3225 max_seg_size: Some(BASE_MSS),
3226 sack_permitted: true,
3227 ..RECV_TEMPL
3228 }]
3229 );
3230 }
3231
3232 #[test]
3233 fn test_listen_syn_win_scale_buffers() {
3234 for (buffer_size, shift_amt) in &[
3235 (64, 0),
3236 (128, 0),
3237 (1024, 0),
3238 (65535, 0),
3239 (65536, 1),
3240 (65537, 1),
3241 (131071, 1),
3242 (131072, 2),
3243 (524287, 3),
3244 (524288, 4),
3245 (655350, 4),
3246 (1048576, 5),
3247 ] {
3248 let mut s = socket_with_buffer_sizes(64, *buffer_size);
3249 s.state = State::Listen;
3250 s.listen_endpoint = LISTEN_END;
3251 assert_eq!(s.remote_win_shift, *shift_amt);
3252 send!(
3253 s,
3254 TcpRepr {
3255 control: TcpControl::Syn,
3256 seq_number: REMOTE_SEQ,
3257 ack_number: None,
3258 window_scale: Some(0),
3259 ..SEND_TEMPL
3260 }
3261 );
3262 assert_eq!(s.remote_win_shift, *shift_amt);
3263 recv!(
3264 s,
3265 [TcpRepr {
3266 control: TcpControl::Syn,
3267 seq_number: LOCAL_SEQ,
3268 ack_number: Some(REMOTE_SEQ + 1),
3269 max_seg_size: Some(BASE_MSS),
3270 window_scale: Some(*shift_amt),
3271 window_len: u16::try_from(*buffer_size).unwrap_or(u16::MAX),
3272 ..RECV_TEMPL
3273 }]
3274 );
3275 }
3276 }
3277
3278 #[test]
3279 fn test_listen_sanity() {
3280 let mut s = socket();
3281 s.listen(LOCAL_PORT).unwrap();
3282 sanity!(s, socket_listen());
3283 }
3284
3285 #[test]
3286 fn test_listen_validation() {
3287 let mut s = socket();
3288 assert_eq!(s.listen(0), Err(ListenError::Unaddressable));
3289 }
3290
3291 #[test]
3292 fn test_listen_twice() {
3293 let mut s = socket();
3294 assert_eq!(s.listen(80), Ok(()));
3295 assert_eq!(s.listen(80), Ok(()));
3297 s.set_state(State::SynReceived); assert_eq!(s.listen(80), Err(ListenError::InvalidState));
3299 }
3300
3301 #[test]
3302 fn test_listen_syn() {
3303 let mut s = socket_listen();
3304 send!(
3305 s,
3306 TcpRepr {
3307 control: TcpControl::Syn,
3308 seq_number: REMOTE_SEQ,
3309 ack_number: None,
3310 ..SEND_TEMPL
3311 }
3312 );
3313 sanity!(s, socket_syn_received());
3314 }
3315
3316 #[test]
3317 fn test_listen_syn_reject_ack() {
3318 let mut s = socket_listen();
3319
3320 let tcp_repr = TcpRepr {
3321 control: TcpControl::Syn,
3322 seq_number: REMOTE_SEQ,
3323 ack_number: Some(LOCAL_SEQ),
3324 ..SEND_TEMPL
3325 };
3326 assert!(!s.socket.accepts(&mut s.cx, &SEND_IP_TEMPL, &tcp_repr));
3327
3328 assert_eq!(s.state, State::Listen);
3329 }
3330
3331 #[test]
3332 fn test_listen_rst() {
3333 let mut s = socket_listen();
3334 let tcp_repr = TcpRepr {
3335 control: TcpControl::Rst,
3336 seq_number: REMOTE_SEQ,
3337 ack_number: None,
3338 ..SEND_TEMPL
3339 };
3340 assert!(!s.socket.accepts(&mut s.cx, &SEND_IP_TEMPL, &tcp_repr));
3341 assert_eq!(s.state, State::Listen);
3342 }
3343
3344 #[test]
3345 fn test_listen_close() {
3346 let mut s = socket_listen();
3347 s.close();
3348 assert_eq!(s.state, State::Closed);
3349 }
3350
3351 #[test]
3356 fn test_syn_received_ack() {
3357 let mut s = socket_syn_received();
3358 recv!(
3359 s,
3360 [TcpRepr {
3361 control: TcpControl::Syn,
3362 seq_number: LOCAL_SEQ,
3363 ack_number: Some(REMOTE_SEQ + 1),
3364 max_seg_size: Some(BASE_MSS),
3365 ..RECV_TEMPL
3366 }]
3367 );
3368 send!(
3369 s,
3370 TcpRepr {
3371 seq_number: REMOTE_SEQ + 1,
3372 ack_number: Some(LOCAL_SEQ + 1),
3373 ..SEND_TEMPL
3374 }
3375 );
3376 assert_eq!(s.state, State::Established);
3377 sanity!(s, socket_established());
3378 }
3379
3380 #[cfg(feature = "socket-tcp-pause-synack")]
3381 #[test]
3382 fn test_syn_paused_ack() {
3383 let mut s = socket_syn_received();
3384
3385 s.pause_synack(true);
3386 recv_nothing!(s);
3387 assert_eq!(s.state, State::SynReceived);
3388
3389 s.pause_synack(false);
3390 recv!(
3391 s,
3392 [TcpRepr {
3393 control: TcpControl::Syn,
3394 seq_number: LOCAL_SEQ,
3395 ack_number: Some(REMOTE_SEQ + 1),
3396 max_seg_size: Some(BASE_MSS),
3397 ..RECV_TEMPL
3398 }]
3399 );
3400 send!(
3401 s,
3402 TcpRepr {
3403 seq_number: REMOTE_SEQ + 1,
3404 ack_number: Some(LOCAL_SEQ + 1),
3405 ..SEND_TEMPL
3406 }
3407 );
3408 assert_eq!(s.state, State::Established);
3409 }
3410
3411 #[test]
3412 fn test_syn_received_ack_too_low() {
3413 let mut s = socket_syn_received();
3414 recv!(
3415 s,
3416 [TcpRepr {
3417 control: TcpControl::Syn,
3418 seq_number: LOCAL_SEQ,
3419 ack_number: Some(REMOTE_SEQ + 1),
3420 max_seg_size: Some(BASE_MSS),
3421 ..RECV_TEMPL
3422 }]
3423 );
3424 send!(
3425 s,
3426 TcpRepr {
3427 seq_number: REMOTE_SEQ + 1,
3428 ack_number: Some(LOCAL_SEQ), ..SEND_TEMPL
3430 },
3431 Some(TcpRepr {
3432 control: TcpControl::Rst,
3433 seq_number: LOCAL_SEQ,
3434 ack_number: None,
3435 window_len: 0,
3436 ..RECV_TEMPL
3437 })
3438 );
3439 assert_eq!(s.state, State::SynReceived);
3440 }
3441
3442 #[test]
3443 fn test_syn_received_ack_too_high() {
3444 let mut s = socket_syn_received();
3445 recv!(
3446 s,
3447 [TcpRepr {
3448 control: TcpControl::Syn,
3449 seq_number: LOCAL_SEQ,
3450 ack_number: Some(REMOTE_SEQ + 1),
3451 max_seg_size: Some(BASE_MSS),
3452 ..RECV_TEMPL
3453 }]
3454 );
3455 send!(
3456 s,
3457 TcpRepr {
3458 seq_number: REMOTE_SEQ + 1,
3459 ack_number: Some(LOCAL_SEQ + 2), ..SEND_TEMPL
3461 },
3462 Some(TcpRepr {
3463 control: TcpControl::Rst,
3464 seq_number: LOCAL_SEQ + 2,
3465 ack_number: None,
3466 window_len: 0,
3467 ..RECV_TEMPL
3468 })
3469 );
3470 assert_eq!(s.state, State::SynReceived);
3471 }
3472
3473 #[test]
3474 fn test_syn_received_fin() {
3475 let mut s = socket_syn_received();
3476 recv!(
3477 s,
3478 [TcpRepr {
3479 control: TcpControl::Syn,
3480 seq_number: LOCAL_SEQ,
3481 ack_number: Some(REMOTE_SEQ + 1),
3482 max_seg_size: Some(BASE_MSS),
3483 ..RECV_TEMPL
3484 }]
3485 );
3486 send!(
3487 s,
3488 TcpRepr {
3489 control: TcpControl::Fin,
3490 seq_number: REMOTE_SEQ + 1,
3491 ack_number: Some(LOCAL_SEQ + 1),
3492 payload: &b"abcdef"[..],
3493 ..SEND_TEMPL
3494 }
3495 );
3496 recv!(
3497 s,
3498 [TcpRepr {
3499 seq_number: LOCAL_SEQ + 1,
3500 ack_number: Some(REMOTE_SEQ + 1 + 6 + 1),
3501 window_len: 58,
3502 ..RECV_TEMPL
3503 }]
3504 );
3505 assert_eq!(s.state, State::CloseWait);
3506
3507 let mut s2 = socket_close_wait();
3508 s2.remote_last_ack = Some(REMOTE_SEQ + 1 + 6 + 1);
3509 s2.remote_last_win = 58;
3510 sanity!(s, s2);
3511 }
3512
3513 #[test]
3514 fn test_syn_received_rst() {
3515 let mut s = socket_syn_received();
3516 s.listen_endpoint = LISTEN_END;
3517 recv!(
3518 s,
3519 [TcpRepr {
3520 control: TcpControl::Syn,
3521 seq_number: LOCAL_SEQ,
3522 ack_number: Some(REMOTE_SEQ + 1),
3523 max_seg_size: Some(BASE_MSS),
3524 ..RECV_TEMPL
3525 }]
3526 );
3527 send!(
3528 s,
3529 TcpRepr {
3530 control: TcpControl::Rst,
3531 seq_number: REMOTE_SEQ + 1,
3532 ack_number: Some(LOCAL_SEQ),
3533 ..SEND_TEMPL
3534 }
3535 );
3536 assert_eq!(s.state, State::Listen);
3537 assert_eq!(s.listen_endpoint, LISTEN_END);
3538 assert_eq!(s.tuple, None);
3539 }
3540
3541 #[test]
3542 fn test_syn_received_no_window_scaling() {
3543 let mut s = socket_listen();
3544 send!(
3545 s,
3546 TcpRepr {
3547 control: TcpControl::Syn,
3548 seq_number: REMOTE_SEQ,
3549 ack_number: None,
3550 ..SEND_TEMPL
3551 }
3552 );
3553 assert_eq!(s.state(), State::SynReceived);
3554 assert_eq!(s.tuple, Some(TUPLE));
3555 recv!(
3556 s,
3557 [TcpRepr {
3558 control: TcpControl::Syn,
3559 seq_number: LOCAL_SEQ,
3560 ack_number: Some(REMOTE_SEQ + 1),
3561 max_seg_size: Some(BASE_MSS),
3562 window_scale: None,
3563 ..RECV_TEMPL
3564 }]
3565 );
3566 send!(
3567 s,
3568 TcpRepr {
3569 seq_number: REMOTE_SEQ + 1,
3570 ack_number: Some(LOCAL_SEQ + 1),
3571 window_scale: None,
3572 ..SEND_TEMPL
3573 }
3574 );
3575 assert_eq!(s.remote_win_shift, 0);
3576 assert_eq!(s.remote_win_scale, None);
3577 }
3578
3579 #[test]
3580 fn test_syn_received_window_scaling() {
3581 for scale in 0..14 {
3582 let mut s = socket_listen();
3583 send!(
3584 s,
3585 TcpRepr {
3586 control: TcpControl::Syn,
3587 seq_number: REMOTE_SEQ,
3588 ack_number: None,
3589 window_scale: Some(scale),
3590 ..SEND_TEMPL
3591 }
3592 );
3593 assert_eq!(s.state(), State::SynReceived);
3594 assert_eq!(s.tuple, Some(TUPLE));
3595 recv!(
3596 s,
3597 [TcpRepr {
3598 control: TcpControl::Syn,
3599 seq_number: LOCAL_SEQ,
3600 ack_number: Some(REMOTE_SEQ + 1),
3601 max_seg_size: Some(BASE_MSS),
3602 window_scale: Some(0),
3603 ..RECV_TEMPL
3604 }]
3605 );
3606 send!(
3607 s,
3608 TcpRepr {
3609 seq_number: REMOTE_SEQ + 1,
3610 ack_number: Some(LOCAL_SEQ + 1),
3611 window_scale: None,
3612 ..SEND_TEMPL
3613 }
3614 );
3615 assert_eq!(s.remote_win_scale, Some(scale));
3616 }
3617 }
3618
3619 #[test]
3620 fn test_syn_received_close() {
3621 let mut s = socket_syn_received();
3622 s.close();
3623 assert_eq!(s.state, State::FinWait1);
3624 }
3625
3626 #[test]
3631 fn test_connect_validation() {
3632 let mut s = socket();
3633 assert_eq!(
3634 s.socket
3635 .connect(&mut s.cx, REMOTE_END, (IpvXAddress::UNSPECIFIED, 0)),
3636 Err(ConnectError::Unaddressable)
3637 );
3638 assert_eq!(
3639 s.socket
3640 .connect(&mut s.cx, REMOTE_END, (IpvXAddress::UNSPECIFIED, 1024)),
3641 Err(ConnectError::Unaddressable)
3642 );
3643 assert_eq!(
3644 s.socket
3645 .connect(&mut s.cx, (IpvXAddress::UNSPECIFIED, 0), LOCAL_END),
3646 Err(ConnectError::Unaddressable)
3647 );
3648 s.socket
3649 .connect(&mut s.cx, REMOTE_END, LOCAL_END)
3650 .expect("Connect failed with valid parameters");
3651 assert_eq!(s.tuple, Some(TUPLE));
3652 }
3653
3654 #[test]
3655 fn test_connect() {
3656 let mut s = socket();
3657 s.local_seq_no = LOCAL_SEQ;
3658 s.socket
3659 .connect(&mut s.cx, REMOTE_END, LOCAL_END.port)
3660 .unwrap();
3661 assert_eq!(s.tuple, Some(TUPLE));
3662 recv!(
3663 s,
3664 [TcpRepr {
3665 control: TcpControl::Syn,
3666 seq_number: LOCAL_SEQ,
3667 ack_number: None,
3668 max_seg_size: Some(BASE_MSS),
3669 window_scale: Some(0),
3670 sack_permitted: true,
3671 ..RECV_TEMPL
3672 }]
3673 );
3674 send!(
3675 s,
3676 TcpRepr {
3677 control: TcpControl::Syn,
3678 seq_number: REMOTE_SEQ,
3679 ack_number: Some(LOCAL_SEQ + 1),
3680 max_seg_size: Some(BASE_MSS - 80),
3681 window_scale: Some(0),
3682 ..SEND_TEMPL
3683 }
3684 );
3685 assert_eq!(s.tuple, Some(TUPLE));
3686 }
3687
3688 #[test]
3689 fn test_connect_unspecified_local() {
3690 let mut s = socket();
3691 assert_eq!(s.socket.connect(&mut s.cx, REMOTE_END, 80), Ok(()));
3692 }
3693
3694 #[test]
3695 fn test_connect_specified_local() {
3696 let mut s = socket();
3697 assert_eq!(
3698 s.socket.connect(&mut s.cx, REMOTE_END, (REMOTE_ADDR, 80)),
3699 Ok(())
3700 );
3701 }
3702
3703 #[test]
3704 fn test_connect_twice() {
3705 let mut s = socket();
3706 assert_eq!(s.socket.connect(&mut s.cx, REMOTE_END, 80), Ok(()));
3707 assert_eq!(
3708 s.socket.connect(&mut s.cx, REMOTE_END, 80),
3709 Err(ConnectError::InvalidState)
3710 );
3711 }
3712
3713 #[test]
3714 fn test_syn_sent_sanity() {
3715 let mut s = socket();
3716 s.local_seq_no = LOCAL_SEQ;
3717 s.socket.connect(&mut s.cx, REMOTE_END, LOCAL_END).unwrap();
3718 sanity!(s, socket_syn_sent());
3719 }
3720
3721 #[test]
3722 fn test_syn_sent_syn_ack() {
3723 let mut s = socket_syn_sent();
3724 recv!(
3725 s,
3726 [TcpRepr {
3727 control: TcpControl::Syn,
3728 seq_number: LOCAL_SEQ,
3729 ack_number: None,
3730 max_seg_size: Some(BASE_MSS),
3731 window_scale: Some(0),
3732 sack_permitted: true,
3733 ..RECV_TEMPL
3734 }]
3735 );
3736 send!(
3737 s,
3738 TcpRepr {
3739 control: TcpControl::Syn,
3740 seq_number: REMOTE_SEQ,
3741 ack_number: Some(LOCAL_SEQ + 1),
3742 max_seg_size: Some(BASE_MSS - 80),
3743 window_scale: Some(0),
3744 ..SEND_TEMPL
3745 }
3746 );
3747 recv!(
3748 s,
3749 [TcpRepr {
3750 seq_number: LOCAL_SEQ + 1,
3751 ack_number: Some(REMOTE_SEQ + 1),
3752 ..RECV_TEMPL
3753 }]
3754 );
3755 recv_nothing!(s, time 1000);
3756 assert_eq!(s.state, State::Established);
3757 sanity!(s, socket_established());
3758 }
3759
3760 #[test]
3761 fn test_syn_sent_syn_received_ack() {
3762 let mut s = socket_syn_sent();
3763 recv!(
3764 s,
3765 [TcpRepr {
3766 control: TcpControl::Syn,
3767 seq_number: LOCAL_SEQ,
3768 ack_number: None,
3769 max_seg_size: Some(BASE_MSS),
3770 window_scale: Some(0),
3771 sack_permitted: true,
3772 ..RECV_TEMPL
3773 }]
3774 );
3775
3776 send!(
3778 s,
3779 TcpRepr {
3780 control: TcpControl::Syn,
3781 seq_number: REMOTE_SEQ,
3782 ack_number: None,
3783 max_seg_size: Some(BASE_MSS - 80),
3784 window_scale: Some(0),
3785 ..SEND_TEMPL
3786 }
3787 );
3788 assert_eq!(s.state, State::SynReceived);
3789
3790 recv!(
3792 s,
3793 [TcpRepr {
3794 control: TcpControl::Syn,
3795 seq_number: LOCAL_SEQ,
3796 ack_number: Some(REMOTE_SEQ + 1),
3797 max_seg_size: Some(BASE_MSS),
3798 window_scale: Some(0),
3799 ..RECV_TEMPL
3800 }]
3801 );
3802 recv_nothing!(s);
3803
3804 recv!(
3806 s,
3807 time 1001,
3808 Ok(TcpRepr {
3809 control: TcpControl::Syn,
3810 seq_number: LOCAL_SEQ,
3811 ack_number: Some(REMOTE_SEQ + 1),
3812 max_seg_size: Some(BASE_MSS),
3813 window_scale: Some(0),
3814 ..RECV_TEMPL
3815 })
3816 );
3817
3818 send!(
3820 s,
3821 TcpRepr {
3822 control: TcpControl::None,
3823 seq_number: REMOTE_SEQ + 1,
3824 ack_number: Some(LOCAL_SEQ + 1),
3825 ..SEND_TEMPL
3826 }
3827 );
3828 assert_eq!(s.state, State::Established);
3829 sanity!(s, socket_established());
3830 }
3831
3832 #[test]
3833 fn test_syn_sent_syn_ack_not_incremented() {
3834 let mut s = socket_syn_sent();
3835 recv!(
3836 s,
3837 [TcpRepr {
3838 control: TcpControl::Syn,
3839 seq_number: LOCAL_SEQ,
3840 ack_number: None,
3841 max_seg_size: Some(BASE_MSS),
3842 window_scale: Some(0),
3843 sack_permitted: true,
3844 ..RECV_TEMPL
3845 }]
3846 );
3847 send!(
3848 s,
3849 TcpRepr {
3850 control: TcpControl::Syn,
3851 seq_number: REMOTE_SEQ,
3852 ack_number: Some(LOCAL_SEQ), max_seg_size: Some(BASE_MSS - 80),
3854 window_scale: Some(0),
3855 ..SEND_TEMPL
3856 },
3857 Some(TcpRepr {
3858 control: TcpControl::Rst,
3859 seq_number: LOCAL_SEQ,
3860 ack_number: None,
3861 window_len: 0,
3862 ..RECV_TEMPL
3863 })
3864 );
3865 assert_eq!(s.state, State::SynSent);
3866 }
3867
3868 #[test]
3869 fn test_syn_sent_syn_received_rst() {
3870 let mut s = socket_syn_sent();
3871 recv!(
3872 s,
3873 [TcpRepr {
3874 control: TcpControl::Syn,
3875 seq_number: LOCAL_SEQ,
3876 ack_number: None,
3877 max_seg_size: Some(BASE_MSS),
3878 window_scale: Some(0),
3879 sack_permitted: true,
3880 ..RECV_TEMPL
3881 }]
3882 );
3883
3884 send!(
3886 s,
3887 TcpRepr {
3888 control: TcpControl::Syn,
3889 seq_number: REMOTE_SEQ,
3890 ack_number: None,
3891 max_seg_size: Some(BASE_MSS - 80),
3892 window_scale: Some(0),
3893 ..SEND_TEMPL
3894 }
3895 );
3896 assert_eq!(s.state, State::SynReceived);
3897
3898 send!(
3900 s,
3901 TcpRepr {
3902 control: TcpControl::Rst,
3903 seq_number: REMOTE_SEQ + 1,
3904 ack_number: Some(LOCAL_SEQ),
3905 ..SEND_TEMPL
3906 }
3907 );
3908 assert_eq!(s.state, State::Closed);
3909 }
3910
3911 #[test]
3912 fn test_syn_sent_rst() {
3913 let mut s = socket_syn_sent();
3914 send!(
3915 s,
3916 TcpRepr {
3917 control: TcpControl::Rst,
3918 seq_number: REMOTE_SEQ,
3919 ack_number: Some(LOCAL_SEQ + 1),
3920 ..SEND_TEMPL
3921 }
3922 );
3923 assert_eq!(s.state, State::Closed);
3924 }
3925
3926 #[test]
3927 fn test_syn_sent_rst_no_ack() {
3928 let mut s = socket_syn_sent();
3929 send!(
3930 s,
3931 TcpRepr {
3932 control: TcpControl::Rst,
3933 seq_number: REMOTE_SEQ,
3934 ack_number: None,
3935 ..SEND_TEMPL
3936 }
3937 );
3938 assert_eq!(s.state, State::SynSent);
3939 }
3940
3941 #[test]
3942 fn test_syn_sent_rst_bad_ack() {
3943 let mut s = socket_syn_sent();
3944 send!(
3945 s,
3946 TcpRepr {
3947 control: TcpControl::Rst,
3948 seq_number: REMOTE_SEQ,
3949 ack_number: Some(TcpSeqNumber(1234)),
3950 ..SEND_TEMPL
3951 }
3952 );
3953 assert_eq!(s.state, State::SynSent);
3954 }
3955
3956 #[test]
3957 fn test_syn_sent_bad_ack() {
3958 let mut s = socket_syn_sent();
3959 recv!(
3960 s,
3961 [TcpRepr {
3962 control: TcpControl::Syn,
3963 seq_number: LOCAL_SEQ,
3964 ack_number: None,
3965 max_seg_size: Some(BASE_MSS),
3966 window_scale: Some(0),
3967 sack_permitted: true,
3968 ..RECV_TEMPL
3969 }]
3970 );
3971 send!(
3972 s,
3973 TcpRepr {
3974 control: TcpControl::None, seq_number: REMOTE_SEQ,
3976 ack_number: Some(LOCAL_SEQ + 1), ..SEND_TEMPL
3978 }
3979 );
3980
3981 recv!(s, []);
3983 assert_eq!(s.state, State::SynSent);
3984 }
3985
3986 #[test]
3987 fn test_syn_sent_bad_ack_seq_1() {
3988 let mut s = socket_syn_sent();
3989 recv!(
3990 s,
3991 [TcpRepr {
3992 control: TcpControl::Syn,
3993 seq_number: LOCAL_SEQ,
3994 ack_number: None,
3995 max_seg_size: Some(BASE_MSS),
3996 window_scale: Some(0),
3997 sack_permitted: true,
3998 ..RECV_TEMPL
3999 }]
4000 );
4001 send!(
4002 s,
4003 TcpRepr {
4004 control: TcpControl::None,
4005 seq_number: REMOTE_SEQ,
4006 ack_number: Some(LOCAL_SEQ), ..SEND_TEMPL
4008 },
4009 Some(TcpRepr {
4010 control: TcpControl::Rst,
4011 seq_number: LOCAL_SEQ, ack_number: None,
4013 window_len: 0,
4014 ..RECV_TEMPL
4015 })
4016 );
4017
4018 assert_eq!(s.state, State::SynSent);
4020 }
4021
4022 #[test]
4023 fn test_syn_sent_bad_ack_seq_2() {
4024 let mut s = socket_syn_sent();
4025 recv!(
4026 s,
4027 [TcpRepr {
4028 control: TcpControl::Syn,
4029 seq_number: LOCAL_SEQ,
4030 ack_number: None,
4031 max_seg_size: Some(BASE_MSS),
4032 window_scale: Some(0),
4033 sack_permitted: true,
4034 ..RECV_TEMPL
4035 }]
4036 );
4037 send!(
4038 s,
4039 TcpRepr {
4040 control: TcpControl::None,
4041 seq_number: REMOTE_SEQ,
4042 ack_number: Some(LOCAL_SEQ + 123456), ..SEND_TEMPL
4044 },
4045 Some(TcpRepr {
4046 control: TcpControl::Rst,
4047 seq_number: LOCAL_SEQ + 123456, ack_number: None,
4049 window_len: 0,
4050 ..RECV_TEMPL
4051 })
4052 );
4053
4054 assert_eq!(s.state, State::SynSent);
4056 }
4057
4058 #[test]
4059 fn test_syn_sent_close() {
4060 let mut s = socket();
4061 s.close();
4062 assert_eq!(s.state, State::Closed);
4063 }
4064
4065 #[test]
4066 fn test_syn_sent_sack_option() {
4067 let mut s = socket_syn_sent();
4068 recv!(
4069 s,
4070 [TcpRepr {
4071 control: TcpControl::Syn,
4072 seq_number: LOCAL_SEQ,
4073 ack_number: None,
4074 max_seg_size: Some(BASE_MSS),
4075 window_scale: Some(0),
4076 sack_permitted: true,
4077 ..RECV_TEMPL
4078 }]
4079 );
4080 send!(
4081 s,
4082 TcpRepr {
4083 control: TcpControl::Syn,
4084 seq_number: REMOTE_SEQ,
4085 ack_number: Some(LOCAL_SEQ + 1),
4086 max_seg_size: Some(BASE_MSS - 80),
4087 window_scale: Some(0),
4088 sack_permitted: true,
4089 ..SEND_TEMPL
4090 }
4091 );
4092 assert!(s.remote_has_sack);
4093
4094 let mut s = socket_syn_sent();
4095 recv!(
4096 s,
4097 [TcpRepr {
4098 control: TcpControl::Syn,
4099 seq_number: LOCAL_SEQ,
4100 ack_number: None,
4101 max_seg_size: Some(BASE_MSS),
4102 window_scale: Some(0),
4103 sack_permitted: true,
4104 ..RECV_TEMPL
4105 }]
4106 );
4107 send!(
4108 s,
4109 TcpRepr {
4110 control: TcpControl::Syn,
4111 seq_number: REMOTE_SEQ,
4112 ack_number: Some(LOCAL_SEQ + 1),
4113 max_seg_size: Some(BASE_MSS - 80),
4114 window_scale: Some(0),
4115 sack_permitted: false,
4116 ..SEND_TEMPL
4117 }
4118 );
4119 assert!(!s.remote_has_sack);
4120 }
4121
4122 #[test]
4123 fn test_syn_sent_win_scale_buffers() {
4124 for (buffer_size, shift_amt) in &[
4125 (64, 0),
4126 (128, 0),
4127 (1024, 0),
4128 (65535, 0),
4129 (65536, 1),
4130 (65537, 1),
4131 (131071, 1),
4132 (131072, 2),
4133 (524287, 3),
4134 (524288, 4),
4135 (655350, 4),
4136 (1048576, 5),
4137 ] {
4138 let mut s = socket_with_buffer_sizes(64, *buffer_size);
4139 s.local_seq_no = LOCAL_SEQ;
4140 assert_eq!(s.remote_win_shift, *shift_amt);
4141 s.socket.connect(&mut s.cx, REMOTE_END, LOCAL_END).unwrap();
4142 recv!(
4143 s,
4144 [TcpRepr {
4145 control: TcpControl::Syn,
4146 seq_number: LOCAL_SEQ,
4147 ack_number: None,
4148 max_seg_size: Some(BASE_MSS),
4149 window_scale: Some(*shift_amt),
4150 window_len: u16::try_from(*buffer_size).unwrap_or(u16::MAX),
4151 sack_permitted: true,
4152 ..RECV_TEMPL
4153 }]
4154 );
4155 }
4156 }
4157
4158 #[test]
4159 fn test_syn_sent_syn_ack_no_window_scaling() {
4160 let mut s = socket_syn_sent_with_buffer_sizes(1048576, 1048576);
4161 recv!(
4162 s,
4163 [TcpRepr {
4164 control: TcpControl::Syn,
4165 seq_number: LOCAL_SEQ,
4166 ack_number: None,
4167 max_seg_size: Some(BASE_MSS),
4168 window_len: 65535,
4170 window_scale: Some(5),
4171 sack_permitted: true,
4172 ..RECV_TEMPL
4173 }]
4174 );
4175 assert_eq!(s.remote_win_shift, 5);
4176 send!(
4177 s,
4178 TcpRepr {
4179 control: TcpControl::Syn,
4180 seq_number: REMOTE_SEQ,
4181 ack_number: Some(LOCAL_SEQ + 1),
4182 max_seg_size: Some(BASE_MSS - 80),
4183 window_scale: None,
4184 window_len: 42,
4185 ..SEND_TEMPL
4186 }
4187 );
4188 assert_eq!(s.state, State::Established);
4189 assert_eq!(s.remote_win_shift, 0);
4190 assert_eq!(s.remote_win_scale, None);
4191 assert_eq!(s.remote_win_len, 42);
4192 }
4193
4194 #[test]
4195 fn test_syn_sent_syn_ack_window_scaling() {
4196 let mut s = socket_syn_sent();
4197 recv!(
4198 s,
4199 [TcpRepr {
4200 control: TcpControl::Syn,
4201 seq_number: LOCAL_SEQ,
4202 ack_number: None,
4203 max_seg_size: Some(BASE_MSS),
4204 window_scale: Some(0),
4205 sack_permitted: true,
4206 ..RECV_TEMPL
4207 }]
4208 );
4209 send!(
4210 s,
4211 TcpRepr {
4212 control: TcpControl::Syn,
4213 seq_number: REMOTE_SEQ,
4214 ack_number: Some(LOCAL_SEQ + 1),
4215 max_seg_size: Some(BASE_MSS - 80),
4216 window_scale: Some(7),
4217 window_len: 42,
4218 ..SEND_TEMPL
4219 }
4220 );
4221 assert_eq!(s.state, State::Established);
4222 assert_eq!(s.remote_win_scale, Some(7));
4223 assert_eq!(s.remote_win_len, 42);
4225 }
4226
4227 #[test]
4232 fn test_established_recv() {
4233 let mut s = socket_established();
4234 send!(
4235 s,
4236 TcpRepr {
4237 seq_number: REMOTE_SEQ + 1,
4238 ack_number: Some(LOCAL_SEQ + 1),
4239 payload: &b"abcdef"[..],
4240 ..SEND_TEMPL
4241 }
4242 );
4243 recv!(
4244 s,
4245 [TcpRepr {
4246 seq_number: LOCAL_SEQ + 1,
4247 ack_number: Some(REMOTE_SEQ + 1 + 6),
4248 window_len: 58,
4249 ..RECV_TEMPL
4250 }]
4251 );
4252 assert_eq!(s.rx_buffer.dequeue_many(6), &b"abcdef"[..]);
4253 }
4254
4255 #[test]
4256 fn test_peek_slice() {
4257 const BUF_SIZE: usize = 10;
4258
4259 let send_buf = b"0123456";
4260
4261 let mut s = socket_established_with_buffer_sizes(BUF_SIZE, BUF_SIZE);
4262
4263 send!(
4265 s,
4266 TcpRepr {
4267 seq_number: REMOTE_SEQ + 1,
4268 ack_number: Some(LOCAL_SEQ + 1),
4269 payload: &send_buf[..],
4270 ..SEND_TEMPL
4271 }
4272 );
4273
4274 let mut peeked_buf = [0u8; BUF_SIZE];
4276 let actually_peeked = s.peek_slice(&mut peeked_buf[..]).unwrap();
4277 let mut recv_buf = [0u8; BUF_SIZE];
4278 let actually_recvd = s.recv_slice(&mut recv_buf[..]).unwrap();
4279 assert_eq!(
4280 &mut peeked_buf[..actually_peeked],
4281 &mut recv_buf[..actually_recvd]
4282 );
4283 }
4284
4285 #[test]
4286 fn test_peek_slice_buffer_wrap() {
4287 const BUF_SIZE: usize = 10;
4288
4289 let send_buf = b"0123456789";
4290
4291 let mut s = socket_established_with_buffer_sizes(BUF_SIZE, BUF_SIZE);
4292
4293 let _ = s.rx_buffer.enqueue_slice(&send_buf[..8]);
4294 let _ = s.rx_buffer.dequeue_many(6);
4295 let _ = s.rx_buffer.enqueue_slice(&send_buf[..5]);
4296
4297 let mut peeked_buf = [0u8; BUF_SIZE];
4298 let actually_peeked = s.peek_slice(&mut peeked_buf[..]).unwrap();
4299 let mut recv_buf = [0u8; BUF_SIZE];
4300 let actually_recvd = s.recv_slice(&mut recv_buf[..]).unwrap();
4301 assert_eq!(
4302 &mut peeked_buf[..actually_peeked],
4303 &mut recv_buf[..actually_recvd]
4304 );
4305 }
4306
4307 fn setup_rfc2018_cases() -> (TestSocket, Vec<u8>) {
4308 let mut s = socket_established_with_buffer_sizes(4000, 4000);
4314 s.remote_has_sack = true;
4315
4316 let mut segment: Vec<u8> = Vec::with_capacity(500);
4318
4319 for _ in 0..50 {
4321 segment.extend_from_slice(b"abcdefghij")
4322 }
4323 for offset in (0..5000).step_by(500) {
4324 send!(
4325 s,
4326 TcpRepr {
4327 seq_number: REMOTE_SEQ + 1 + offset,
4328 ack_number: Some(LOCAL_SEQ + 1),
4329 payload: &segment,
4330 ..SEND_TEMPL
4331 }
4332 );
4333 recv!(
4334 s,
4335 [TcpRepr {
4336 seq_number: LOCAL_SEQ + 1,
4337 ack_number: Some(REMOTE_SEQ + 1 + offset + 500),
4338 window_len: 3500,
4339 ..RECV_TEMPL
4340 }]
4341 );
4342 s.recv(|data| {
4343 assert_eq!(data.len(), 500);
4344 assert_eq!(data, segment.as_slice());
4345 (500, ())
4346 })
4347 .unwrap();
4348 }
4349 assert_eq!(s.remote_last_win, 3500);
4350 (s, segment)
4351 }
4352
4353 #[test]
4354 fn test_established_rfc2018_cases() {
4355 let (mut s, segment) = setup_rfc2018_cases();
4359 for offset in (500..3500).step_by(500) {
4380 send!(
4381 s,
4382 TcpRepr {
4383 seq_number: REMOTE_SEQ + 1 + offset + 5000,
4384 ack_number: Some(LOCAL_SEQ + 1),
4385 payload: &segment,
4386 ..SEND_TEMPL
4387 },
4388 Some(TcpRepr {
4389 seq_number: LOCAL_SEQ + 1,
4390 ack_number: Some(REMOTE_SEQ + 1 + 5000),
4391 window_len: 4000,
4392 sack_ranges: [
4393 Some((
4394 REMOTE_SEQ.0 as u32 + 1 + 5500,
4395 REMOTE_SEQ.0 as u32 + 1 + 5500 + offset as u32
4396 )),
4397 None,
4398 None
4399 ],
4400 ..RECV_TEMPL
4401 })
4402 );
4403 }
4404 }
4405
4406 #[test]
4407 fn test_established_sack_no_overflow_on_near_max_seqnumber() {
4408 let mut s = socket_established();
4409 s.remote_has_sack = true;
4410 s.remote_seq_no = TcpSeqNumber(-4);
4411 s.remote_last_ack = Some(TcpSeqNumber(-4));
4412
4413 send!(
4416 s,
4417 TcpRepr {
4418 seq_number: TcpSeqNumber(-4 + 10),
4419 ack_number: Some(LOCAL_SEQ + 1),
4420 payload: &b"AAAAAAAAAA"[..],
4421 ..SEND_TEMPL
4422 },
4423 Some(TcpRepr {
4424 seq_number: LOCAL_SEQ + 1,
4425 ack_number: Some(TcpSeqNumber(-4)),
4426 window_len: 64,
4427 sack_ranges: [
4428 Some(((-4_i32 + 10) as u32, (-4_i32 + 20) as u32,)),
4429 None,
4430 None,
4431 ],
4432 ..RECV_TEMPL
4433 })
4434 );
4435 }
4436
4437 #[test]
4438 fn test_established_sliding_window_recv() {
4439 let mut s = socket_established();
4440 assert_eq!(s.rx_buffer.len(), 0);
4442 s.rx_buffer = SocketBuffer::new(vec![0; 262143]);
4443 s.assembler = Assembler::new();
4444 s.remote_win_scale = Some(0);
4445 s.remote_last_win = 65535;
4446 s.remote_win_shift = 2;
4447
4448 let mut segment: Vec<u8> = Vec::with_capacity(1400);
4450 for _ in 0..100 {
4451 segment.extend_from_slice(b"abcdefghijklmn")
4452 }
4453 assert_eq!(segment.len(), 1400);
4454
4455 send!(
4457 s,
4458 TcpRepr {
4459 seq_number: REMOTE_SEQ + 1,
4460 ack_number: Some(LOCAL_SEQ + 1),
4461 payload: &segment,
4462 ..SEND_TEMPL
4463 }
4464 );
4465
4466 recv!(
4468 s,
4469 [TcpRepr {
4470 seq_number: LOCAL_SEQ + 1,
4471 ack_number: Some(REMOTE_SEQ + 1 + 1400),
4472 window_len: 65185,
4473 ..RECV_TEMPL
4474 }]
4475 );
4476 }
4477
4478 #[test]
4479 fn test_established_send() {
4480 let mut s = socket_established();
4481 s.send_slice(b"abcdef").unwrap();
4483 recv!(
4484 s,
4485 [TcpRepr {
4486 seq_number: LOCAL_SEQ + 1,
4487 ack_number: Some(REMOTE_SEQ + 1),
4488 payload: &b"abcdef"[..],
4489 ..RECV_TEMPL
4490 }]
4491 );
4492 assert_eq!(s.tx_buffer.len(), 6);
4493 send!(
4494 s,
4495 TcpRepr {
4496 seq_number: REMOTE_SEQ + 1,
4497 ack_number: Some(LOCAL_SEQ + 1 + 6),
4498 ..SEND_TEMPL
4499 }
4500 );
4501 assert_eq!(s.tx_buffer.len(), 0);
4502 s.send_slice(b"foobar").unwrap();
4504 recv!(
4505 s,
4506 [TcpRepr {
4507 seq_number: LOCAL_SEQ + 1 + 6,
4508 ack_number: Some(REMOTE_SEQ + 1),
4509 payload: &b"foobar"[..],
4510 ..RECV_TEMPL
4511 }]
4512 );
4513 send!(
4514 s,
4515 TcpRepr {
4516 seq_number: REMOTE_SEQ + 1,
4517 ack_number: Some(LOCAL_SEQ + 1 + 6 + 6),
4518 ..SEND_TEMPL
4519 }
4520 );
4521 assert_eq!(s.tx_buffer.len(), 0);
4522 }
4523
4524 #[test]
4525 fn test_established_send_no_ack_send() {
4526 let mut s = socket_established();
4527 s.set_nagle_enabled(false);
4528 s.send_slice(b"abcdef").unwrap();
4529 recv!(
4530 s,
4531 [TcpRepr {
4532 seq_number: LOCAL_SEQ + 1,
4533 ack_number: Some(REMOTE_SEQ + 1),
4534 payload: &b"abcdef"[..],
4535 ..RECV_TEMPL
4536 }]
4537 );
4538 s.send_slice(b"foobar").unwrap();
4539 recv!(
4540 s,
4541 [TcpRepr {
4542 seq_number: LOCAL_SEQ + 1 + 6,
4543 ack_number: Some(REMOTE_SEQ + 1),
4544 payload: &b"foobar"[..],
4545 ..RECV_TEMPL
4546 }]
4547 );
4548 }
4549
4550 #[test]
4551 fn test_established_send_buf_gt_win() {
4552 let mut data = [0; 32];
4553 for (i, elem) in data.iter_mut().enumerate() {
4554 *elem = i as u8
4555 }
4556
4557 let mut s = socket_established();
4558 s.remote_win_len = 16;
4559 s.send_slice(&data[..]).unwrap();
4560 recv!(
4561 s,
4562 [TcpRepr {
4563 seq_number: LOCAL_SEQ + 1,
4564 ack_number: Some(REMOTE_SEQ + 1),
4565 payload: &data[0..16],
4566 ..RECV_TEMPL
4567 }]
4568 );
4569 }
4570
4571 #[test]
4572 fn test_established_send_window_shrink() {
4573 let mut s = socket_established();
4574
4575 s.send_slice(b"abcdef").unwrap();
4577 recv!(
4578 s,
4579 [TcpRepr {
4580 seq_number: LOCAL_SEQ + 1,
4581 ack_number: Some(REMOTE_SEQ + 1),
4582 payload: &b"abcdef"[..],
4583 ..RECV_TEMPL
4584 }]
4585 );
4586 assert_eq!(s.tx_buffer.len(), 6);
4587
4588 println!(
4589 "local_seq_no={} remote_win_len={} remote_last_seq={}",
4590 s.local_seq_no, s.remote_win_len, s.remote_last_seq
4591 );
4592
4593 send!(
4598 s,
4599 TcpRepr {
4600 seq_number: REMOTE_SEQ + 1,
4601 ack_number: Some(LOCAL_SEQ + 1),
4602 window_len: 3,
4603 payload: &b"xyzxyz"[..],
4604 ..SEND_TEMPL
4605 }
4606 );
4607 assert_eq!(s.tx_buffer.len(), 6);
4608
4609 println!(
4610 "local_seq_no={} remote_win_len={} remote_last_seq={}",
4611 s.local_seq_no, s.remote_win_len, s.remote_last_seq
4612 );
4613
4614 s.send_slice(b"foobar").unwrap();
4616 recv!(
4617 s,
4618 [TcpRepr {
4619 seq_number: LOCAL_SEQ + 1 + 6,
4620 ack_number: Some(REMOTE_SEQ + 1 + 6),
4621 window_len: 64 - 6,
4622 ..RECV_TEMPL
4623 }]
4624 );
4625 }
4626
4627 #[test]
4628 fn test_established_receive_partially_outside_window() {
4629 let mut s = socket_established();
4630
4631 send!(
4632 s,
4633 TcpRepr {
4634 seq_number: REMOTE_SEQ + 1,
4635 ack_number: Some(LOCAL_SEQ + 1),
4636 payload: &b"abc"[..],
4637 ..SEND_TEMPL
4638 }
4639 );
4640
4641 s.recv(|data| {
4642 assert_eq!(data, b"abc");
4643 (3, ())
4644 })
4645 .unwrap();
4646
4647 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 );
4658
4659 s.recv(|data| {
4660 assert_eq!(data, b"def");
4661 (3, ())
4662 })
4663 .unwrap();
4664 }
4665
4666 #[test]
4667 fn test_established_receive_partially_outside_window_fin() {
4668 let mut s = socket_established();
4669
4670 send!(
4671 s,
4672 TcpRepr {
4673 seq_number: REMOTE_SEQ + 1,
4674 ack_number: Some(LOCAL_SEQ + 1),
4675 payload: &b"abc"[..],
4676 ..SEND_TEMPL
4677 }
4678 );
4679
4680 s.recv(|data| {
4681 assert_eq!(data, b"abc");
4682 (3, ())
4683 })
4684 .unwrap();
4685
4686 send!(
4689 s,
4690 TcpRepr {
4691 seq_number: REMOTE_SEQ + 1,
4692 ack_number: Some(LOCAL_SEQ + 1),
4693 control: TcpControl::Fin,
4694 payload: &b"abcdef"[..],
4695 ..SEND_TEMPL
4696 }
4697 );
4698
4699 s.recv(|data| {
4700 assert_eq!(data, b"def");
4701 (3, ())
4702 })
4703 .unwrap();
4704
4705 assert_eq!(s.state, State::CloseWait);
4708 }
4709
4710 #[test]
4711 fn test_established_send_wrap() {
4712 let mut s = socket_established();
4713 let local_seq_start = TcpSeqNumber(i32::MAX - 1);
4714 s.local_seq_no = local_seq_start + 1;
4715 s.remote_last_seq = local_seq_start + 1;
4716 s.send_slice(b"abc").unwrap();
4717 recv!(s, time 1000, Ok(TcpRepr {
4718 seq_number: local_seq_start + 1,
4719 ack_number: Some(REMOTE_SEQ + 1),
4720 payload: &b"abc"[..],
4721 ..RECV_TEMPL
4722 }));
4723 }
4724
4725 #[test]
4726 fn test_established_no_ack() {
4727 let mut s = socket_established();
4728 send!(
4729 s,
4730 TcpRepr {
4731 seq_number: REMOTE_SEQ + 1,
4732 ack_number: None,
4733 ..SEND_TEMPL
4734 }
4735 );
4736 }
4737
4738 #[test]
4739 fn test_established_bad_ack() {
4740 let mut s = socket_established();
4741 send!(
4743 s,
4744 TcpRepr {
4745 seq_number: REMOTE_SEQ + 1,
4746 ack_number: Some(TcpSeqNumber(LOCAL_SEQ.0 - 1)),
4747 ..SEND_TEMPL
4748 }
4749 );
4750 assert_eq!(s.local_seq_no, LOCAL_SEQ + 1);
4751 send!(
4753 s,
4754 TcpRepr {
4755 seq_number: REMOTE_SEQ + 1,
4756 ack_number: Some(LOCAL_SEQ + 10),
4757 ..SEND_TEMPL
4758 },
4759 Some(TcpRepr {
4760 seq_number: LOCAL_SEQ + 1,
4761 ack_number: Some(REMOTE_SEQ + 1),
4762 ..RECV_TEMPL
4763 })
4764 );
4765 assert_eq!(s.local_seq_no, LOCAL_SEQ + 1);
4766 }
4767
4768 #[test]
4769 fn test_established_bad_seq() {
4770 let mut s = socket_established();
4771 send!(
4773 s,
4774 TcpRepr {
4775 seq_number: REMOTE_SEQ + 1 + 256,
4776 ack_number: Some(LOCAL_SEQ + 1),
4777 ..SEND_TEMPL
4778 },
4779 Some(TcpRepr {
4780 seq_number: LOCAL_SEQ + 1,
4781 ack_number: Some(REMOTE_SEQ + 1),
4782 ..RECV_TEMPL
4783 })
4784 );
4785 assert_eq!(s.remote_seq_no, REMOTE_SEQ + 1);
4786
4787 send!(
4789 s,
4790 time 100,
4791 TcpRepr {
4792 seq_number: REMOTE_SEQ + 1 + 256,
4793 ack_number: Some(LOCAL_SEQ + 1),
4794 ..SEND_TEMPL
4795 }
4796 );
4797
4798 send!(
4800 s,
4801 time 2000,
4802 TcpRepr {
4803 seq_number: REMOTE_SEQ + 1 + 256,
4804 ack_number: Some(LOCAL_SEQ + 1),
4805 ..SEND_TEMPL
4806 },
4807 Some(TcpRepr {
4808 seq_number: LOCAL_SEQ + 1,
4809 ack_number: Some(REMOTE_SEQ + 1),
4810 ..RECV_TEMPL
4811 })
4812 );
4813 assert_eq!(s.remote_seq_no, REMOTE_SEQ + 1);
4814 }
4815
4816 #[test]
4817 fn test_established_fin() {
4818 let mut s = socket_established();
4819 send!(
4820 s,
4821 TcpRepr {
4822 control: TcpControl::Fin,
4823 seq_number: REMOTE_SEQ + 1,
4824 ack_number: Some(LOCAL_SEQ + 1),
4825 ..SEND_TEMPL
4826 }
4827 );
4828 recv!(
4829 s,
4830 [TcpRepr {
4831 seq_number: LOCAL_SEQ + 1,
4832 ack_number: Some(REMOTE_SEQ + 1 + 1),
4833 ..RECV_TEMPL
4834 }]
4835 );
4836 assert_eq!(s.state, State::CloseWait);
4837 sanity!(s, socket_close_wait());
4838 }
4839
4840 #[test]
4841 fn test_established_fin_after_missing() {
4842 let mut s = socket_established();
4843 send!(
4844 s,
4845 TcpRepr {
4846 control: TcpControl::Fin,
4847 seq_number: REMOTE_SEQ + 1 + 6,
4848 ack_number: Some(LOCAL_SEQ + 1),
4849 payload: &b"123456"[..],
4850 ..SEND_TEMPL
4851 },
4852 Some(TcpRepr {
4853 seq_number: LOCAL_SEQ + 1,
4854 ack_number: Some(REMOTE_SEQ + 1),
4855 ..RECV_TEMPL
4856 })
4857 );
4858 assert_eq!(s.state, State::Established);
4859 send!(
4860 s,
4861 TcpRepr {
4862 seq_number: REMOTE_SEQ + 1,
4863 ack_number: Some(LOCAL_SEQ + 1),
4864 payload: &b"abcdef"[..],
4865 ..SEND_TEMPL
4866 },
4867 Some(TcpRepr {
4868 seq_number: LOCAL_SEQ + 1,
4869 ack_number: Some(REMOTE_SEQ + 1 + 6 + 6),
4870 window_len: 52,
4871 ..RECV_TEMPL
4872 })
4873 );
4874 assert_eq!(s.state, State::Established);
4875 }
4876
4877 #[test]
4878 fn test_established_send_fin() {
4879 let mut s = socket_established();
4880 s.send_slice(b"abcdef").unwrap();
4881 send!(
4882 s,
4883 TcpRepr {
4884 control: TcpControl::Fin,
4885 seq_number: REMOTE_SEQ + 1,
4886 ack_number: Some(LOCAL_SEQ + 1),
4887 ..SEND_TEMPL
4888 }
4889 );
4890 assert_eq!(s.state, State::CloseWait);
4891 recv!(
4892 s,
4893 [TcpRepr {
4894 seq_number: LOCAL_SEQ + 1,
4895 ack_number: Some(REMOTE_SEQ + 1 + 1),
4896 payload: &b"abcdef"[..],
4897 ..RECV_TEMPL
4898 }]
4899 );
4900 }
4901
4902 #[test]
4903 fn test_established_rst() {
4904 let mut s = socket_established();
4905 send!(
4906 s,
4907 TcpRepr {
4908 control: TcpControl::Rst,
4909 seq_number: REMOTE_SEQ + 1,
4910 ack_number: Some(LOCAL_SEQ + 1),
4911 ..SEND_TEMPL
4912 }
4913 );
4914 assert_eq!(s.state, State::Closed);
4915 }
4916
4917 #[test]
4918 fn test_established_rst_no_ack() {
4919 let mut s = socket_established();
4920 send!(
4921 s,
4922 TcpRepr {
4923 control: TcpControl::Rst,
4924 seq_number: REMOTE_SEQ + 1,
4925 ack_number: None,
4926 ..SEND_TEMPL
4927 }
4928 );
4929 assert_eq!(s.state, State::Closed);
4930 }
4931
4932 #[test]
4933 fn test_established_close() {
4934 let mut s = socket_established();
4935 s.close();
4936 assert_eq!(s.state, State::FinWait1);
4937 sanity!(s, socket_fin_wait_1());
4938 }
4939
4940 #[test]
4941 fn test_established_abort() {
4942 let mut s = socket_established();
4943 s.abort();
4944 assert_eq!(s.state, State::Closed);
4945 recv!(
4946 s,
4947 [TcpRepr {
4948 control: TcpControl::Rst,
4949 seq_number: LOCAL_SEQ + 1,
4950 ack_number: Some(REMOTE_SEQ + 1),
4951 ..RECV_TEMPL
4952 }]
4953 );
4954 }
4955
4956 #[test]
4957 fn test_established_rst_bad_seq() {
4958 let mut s = socket_established();
4959 send!(
4960 s,
4961 TcpRepr {
4962 control: TcpControl::Rst,
4963 seq_number: REMOTE_SEQ, ack_number: None,
4965 ..SEND_TEMPL
4966 },
4967 Some(TcpRepr {
4968 seq_number: LOCAL_SEQ + 1,
4969 ack_number: Some(REMOTE_SEQ + 1),
4970 ..RECV_TEMPL
4971 })
4972 );
4973
4974 assert_eq!(s.state, State::Established);
4975
4976 send!(
4978 s,
4979 TcpRepr {
4980 seq_number: REMOTE_SEQ + 1, ack_number: Some(LOCAL_SEQ + 1),
4982 payload: &b"a"[..],
4983 ..SEND_TEMPL
4984 }
4985 );
4986
4987 send!(
4991 s,
4992 time 2000,
4993 TcpRepr {
4994 control: TcpControl::Rst,
4995 seq_number: REMOTE_SEQ, ack_number: None,
4997 ..SEND_TEMPL
4998 },
4999 Some(TcpRepr {
5000 seq_number: LOCAL_SEQ + 1,
5001 ack_number: Some(REMOTE_SEQ + 2), window_len: 63,
5003 ..RECV_TEMPL
5004 })
5005 );
5006 }
5007
5008 #[test]
5013 fn test_fin_wait_1_fin_ack() {
5014 let mut s = socket_fin_wait_1();
5015 recv!(
5016 s,
5017 [TcpRepr {
5018 control: TcpControl::Fin,
5019 seq_number: LOCAL_SEQ + 1,
5020 ack_number: Some(REMOTE_SEQ + 1),
5021 ..RECV_TEMPL
5022 }]
5023 );
5024 send!(
5025 s,
5026 TcpRepr {
5027 seq_number: REMOTE_SEQ + 1,
5028 ack_number: Some(LOCAL_SEQ + 1 + 1),
5029 ..SEND_TEMPL
5030 }
5031 );
5032 assert_eq!(s.state, State::FinWait2);
5033 sanity!(s, socket_fin_wait_2());
5034 }
5035
5036 #[test]
5037 fn test_fin_wait_1_fin_fin() {
5038 let mut s = socket_fin_wait_1();
5039 recv!(
5040 s,
5041 [TcpRepr {
5042 control: TcpControl::Fin,
5043 seq_number: LOCAL_SEQ + 1,
5044 ack_number: Some(REMOTE_SEQ + 1),
5045 ..RECV_TEMPL
5046 }]
5047 );
5048 send!(
5049 s,
5050 TcpRepr {
5051 control: TcpControl::Fin,
5052 seq_number: REMOTE_SEQ + 1,
5053 ack_number: Some(LOCAL_SEQ + 1),
5054 ..SEND_TEMPL
5055 }
5056 );
5057 assert_eq!(s.state, State::Closing);
5058 sanity!(s, socket_closing());
5059 }
5060
5061 #[test]
5062 fn test_fin_wait_1_fin_with_data_queued() {
5063 let mut s = socket_established();
5064 s.remote_win_len = 6;
5065 s.send_slice(b"abcdef123456").unwrap();
5066 s.close();
5067 recv!(
5068 s,
5069 Ok(TcpRepr {
5070 seq_number: LOCAL_SEQ + 1,
5071 ack_number: Some(REMOTE_SEQ + 1),
5072 payload: &b"abcdef"[..],
5073 ..RECV_TEMPL
5074 })
5075 );
5076 send!(
5077 s,
5078 TcpRepr {
5079 seq_number: REMOTE_SEQ + 1,
5080 ack_number: Some(LOCAL_SEQ + 1 + 6),
5081 ..SEND_TEMPL
5082 }
5083 );
5084 assert_eq!(s.state, State::FinWait1);
5085 }
5086
5087 #[test]
5088 fn test_fin_wait_1_recv() {
5089 let mut s = socket_fin_wait_1();
5090 send!(
5091 s,
5092 TcpRepr {
5093 seq_number: REMOTE_SEQ + 1,
5094 ack_number: Some(LOCAL_SEQ + 1),
5095 payload: &b"abc"[..],
5096 ..SEND_TEMPL
5097 }
5098 );
5099 assert_eq!(s.state, State::FinWait1);
5100 s.recv(|data| {
5101 assert_eq!(data, b"abc");
5102 (3, ())
5103 })
5104 .unwrap();
5105 }
5106
5107 #[test]
5108 fn test_fin_wait_1_close() {
5109 let mut s = socket_fin_wait_1();
5110 s.close();
5111 assert_eq!(s.state, State::FinWait1);
5112 }
5113
5114 #[test]
5119 fn test_fin_wait_2_fin() {
5120 let mut s = socket_fin_wait_2();
5121 send!(s, time 1_000, TcpRepr {
5122 control: TcpControl::Fin,
5123 seq_number: REMOTE_SEQ + 1,
5124 ack_number: Some(LOCAL_SEQ + 1 + 1),
5125 ..SEND_TEMPL
5126 });
5127 assert_eq!(s.state, State::TimeWait);
5128 sanity!(s, socket_time_wait(false));
5129 }
5130
5131 #[test]
5132 fn test_fin_wait_2_recv() {
5133 let mut s = socket_fin_wait_2();
5134 send!(
5135 s,
5136 TcpRepr {
5137 seq_number: REMOTE_SEQ + 1,
5138 ack_number: Some(LOCAL_SEQ + 1 + 1),
5139 payload: &b"abc"[..],
5140 ..SEND_TEMPL
5141 }
5142 );
5143 assert_eq!(s.state, State::FinWait2);
5144 s.recv(|data| {
5145 assert_eq!(data, b"abc");
5146 (3, ())
5147 })
5148 .unwrap();
5149 recv!(
5150 s,
5151 [TcpRepr {
5152 seq_number: LOCAL_SEQ + 1 + 1,
5153 ack_number: Some(REMOTE_SEQ + 1 + 3),
5154 ..RECV_TEMPL
5155 }]
5156 );
5157 }
5158
5159 #[test]
5160 fn test_fin_wait_2_close() {
5161 let mut s = socket_fin_wait_2();
5162 s.close();
5163 assert_eq!(s.state, State::FinWait2);
5164 }
5165
5166 #[test]
5171 fn test_closing_ack_fin() {
5172 let mut s = socket_closing();
5173 recv!(
5174 s,
5175 [TcpRepr {
5176 seq_number: LOCAL_SEQ + 1 + 1,
5177 ack_number: Some(REMOTE_SEQ + 1 + 1),
5178 ..RECV_TEMPL
5179 }]
5180 );
5181 send!(s, time 1_000, TcpRepr {
5182 seq_number: REMOTE_SEQ + 1 + 1,
5183 ack_number: Some(LOCAL_SEQ + 1 + 1),
5184 ..SEND_TEMPL
5185 });
5186 assert_eq!(s.state, State::TimeWait);
5187 sanity!(s, socket_time_wait(true));
5188 }
5189
5190 #[test]
5191 fn test_closing_close() {
5192 let mut s = socket_closing();
5193 s.close();
5194 assert_eq!(s.state, State::Closing);
5195 }
5196
5197 #[test]
5202 fn test_time_wait_from_fin_wait_2_ack() {
5203 let mut s = socket_time_wait(false);
5204 recv!(
5205 s,
5206 [TcpRepr {
5207 seq_number: LOCAL_SEQ + 1 + 1,
5208 ack_number: Some(REMOTE_SEQ + 1 + 1),
5209 ..RECV_TEMPL
5210 }]
5211 );
5212 }
5213
5214 #[test]
5215 fn test_time_wait_from_closing_no_ack() {
5216 let mut s = socket_time_wait(true);
5217 recv!(s, []);
5218 }
5219
5220 #[test]
5221 fn test_time_wait_close() {
5222 let mut s = socket_time_wait(false);
5223 s.close();
5224 assert_eq!(s.state, State::TimeWait);
5225 }
5226
5227 #[test]
5228 fn test_time_wait_retransmit() {
5229 let mut s = socket_time_wait(false);
5230 recv!(
5231 s,
5232 [TcpRepr {
5233 seq_number: LOCAL_SEQ + 1 + 1,
5234 ack_number: Some(REMOTE_SEQ + 1 + 1),
5235 ..RECV_TEMPL
5236 }]
5237 );
5238 send!(s, time 5_000, TcpRepr {
5239 control: TcpControl::Fin,
5240 seq_number: REMOTE_SEQ + 1,
5241 ack_number: Some(LOCAL_SEQ + 1 + 1),
5242 ..SEND_TEMPL
5243 }, Some(TcpRepr {
5244 seq_number: LOCAL_SEQ + 1 + 1,
5245 ack_number: Some(REMOTE_SEQ + 1 + 1),
5246 ..RECV_TEMPL
5247 }));
5248 assert_eq!(
5249 s.timer,
5250 Timer::Close {
5251 expires_at: Instant::from_secs(5) + CLOSE_DELAY
5252 }
5253 );
5254 }
5255
5256 #[test]
5257 fn test_time_wait_timeout() {
5258 let mut s = socket_time_wait(false);
5259 recv!(
5260 s,
5261 [TcpRepr {
5262 seq_number: LOCAL_SEQ + 1 + 1,
5263 ack_number: Some(REMOTE_SEQ + 1 + 1),
5264 ..RECV_TEMPL
5265 }]
5266 );
5267 assert_eq!(s.state, State::TimeWait);
5268 recv_nothing!(s, time 60_000);
5269 assert_eq!(s.state, State::Closed);
5270 }
5271
5272 #[test]
5277 fn test_close_wait_ack() {
5278 let mut s = socket_close_wait();
5279 s.send_slice(b"abcdef").unwrap();
5280 recv!(
5281 s,
5282 [TcpRepr {
5283 seq_number: LOCAL_SEQ + 1,
5284 ack_number: Some(REMOTE_SEQ + 1 + 1),
5285 payload: &b"abcdef"[..],
5286 ..RECV_TEMPL
5287 }]
5288 );
5289 send!(
5290 s,
5291 TcpRepr {
5292 seq_number: REMOTE_SEQ + 1 + 1,
5293 ack_number: Some(LOCAL_SEQ + 1 + 6),
5294 ..SEND_TEMPL
5295 }
5296 );
5297 }
5298
5299 #[test]
5300 fn test_close_wait_close() {
5301 let mut s = socket_close_wait();
5302 s.close();
5303 assert_eq!(s.state, State::LastAck);
5304 sanity!(s, socket_last_ack());
5305 }
5306
5307 #[test]
5311 fn test_last_ack_fin_ack() {
5312 let mut s = socket_last_ack();
5313 recv!(
5314 s,
5315 [TcpRepr {
5316 control: TcpControl::Fin,
5317 seq_number: LOCAL_SEQ + 1,
5318 ack_number: Some(REMOTE_SEQ + 1 + 1),
5319 ..RECV_TEMPL
5320 }]
5321 );
5322 assert_eq!(s.state, State::LastAck);
5323 send!(
5324 s,
5325 TcpRepr {
5326 seq_number: REMOTE_SEQ + 1 + 1,
5327 ack_number: Some(LOCAL_SEQ + 1 + 1),
5328 ..SEND_TEMPL
5329 }
5330 );
5331 assert_eq!(s.state, State::Closed);
5332 }
5333
5334 #[test]
5335 fn test_last_ack_ack_not_of_fin() {
5336 let mut s = socket_last_ack();
5337 recv!(
5338 s,
5339 [TcpRepr {
5340 control: TcpControl::Fin,
5341 seq_number: LOCAL_SEQ + 1,
5342 ack_number: Some(REMOTE_SEQ + 1 + 1),
5343 ..RECV_TEMPL
5344 }]
5345 );
5346 assert_eq!(s.state, State::LastAck);
5347
5348 send!(
5351 s,
5352 TcpRepr {
5353 seq_number: REMOTE_SEQ + 1 + 1,
5354 ack_number: Some(LOCAL_SEQ + 1),
5355 ..SEND_TEMPL
5356 },
5357 Some(TcpRepr {
5358 seq_number: LOCAL_SEQ + 1 + 1,
5359 ack_number: Some(REMOTE_SEQ + 1 + 1),
5360 ..RECV_TEMPL
5361 })
5362 );
5363 assert_eq!(s.state, State::LastAck);
5364
5365 send!(
5367 s,
5368 TcpRepr {
5369 seq_number: REMOTE_SEQ + 1 + 1,
5370 ack_number: Some(LOCAL_SEQ + 1 + 1),
5371 ..SEND_TEMPL
5372 }
5373 );
5374 assert_eq!(s.state, State::Closed);
5375 }
5376
5377 #[test]
5380 fn test_last_ack_duplicate_ack_challenge_ack() {
5381 let mut s = socket_last_ack();
5382 recv!(
5384 s,
5385 [TcpRepr {
5386 control: TcpControl::Fin,
5387 seq_number: LOCAL_SEQ + 1,
5388 ack_number: Some(REMOTE_SEQ + 1 + 1),
5389 ..RECV_TEMPL
5390 }]
5391 );
5392 assert_eq!(s.state, State::LastAck);
5393
5394 let challenge = send(
5397 &mut s,
5398 Instant::from_millis(0),
5399 &TcpRepr {
5400 seq_number: REMOTE_SEQ + 1 + 1,
5401 ack_number: Some(LOCAL_SEQ + 1),
5402 ..SEND_TEMPL
5403 },
5404 );
5405 assert_eq!(
5406 challenge,
5407 Some(TcpRepr {
5408 seq_number: LOCAL_SEQ + 1 + 1,
5409 ack_number: Some(REMOTE_SEQ + 1 + 1),
5410 ..RECV_TEMPL
5411 }),
5412 "expected challenge ACK in response to duplicate ACK in LAST-ACK"
5413 );
5414 assert_eq!(s.state, State::LastAck);
5416
5417 send!(
5420 s,
5421 TcpRepr {
5422 seq_number: REMOTE_SEQ + 1 + 1,
5423 ack_number: Some(LOCAL_SEQ + 1 + 1),
5424 ..SEND_TEMPL
5425 }
5426 );
5427 assert_eq!(s.state, State::Closed);
5428 }
5429
5430 #[test]
5433 fn test_last_ack_partial_ack_no_challenge_ack() {
5434 let mut s = socket_last_ack();
5437 let _ = s.tx_buffer.enqueue_slice(b"x");
5439 s.remote_last_seq = LOCAL_SEQ + 1 + 1 + 1; send!(
5447 s,
5448 TcpRepr {
5449 seq_number: REMOTE_SEQ + 1 + 1,
5450 ack_number: Some(LOCAL_SEQ + 1 + 1), ..SEND_TEMPL
5452 }
5453 );
5454 assert_eq!(s.state, State::LastAck);
5456 assert_eq!(s.local_seq_no, LOCAL_SEQ + 1 + 1);
5458 }
5459
5460 #[test]
5461 fn test_last_ack_close() {
5462 let mut s = socket_last_ack();
5463 s.close();
5464 assert_eq!(s.state, State::LastAck);
5465 }
5466
5467 #[test]
5472 fn test_listen() {
5473 let mut s = socket();
5474 s.listen(LISTEN_END).unwrap();
5475 assert_eq!(s.state, State::Listen);
5476 }
5477
5478 #[test]
5479 fn test_three_way_handshake() {
5480 let mut s = socket_listen();
5481 send!(
5482 s,
5483 TcpRepr {
5484 control: TcpControl::Syn,
5485 seq_number: REMOTE_SEQ,
5486 ack_number: None,
5487 ..SEND_TEMPL
5488 }
5489 );
5490 assert_eq!(s.state(), State::SynReceived);
5491 assert_eq!(s.tuple, Some(TUPLE));
5492 recv!(
5493 s,
5494 [TcpRepr {
5495 control: TcpControl::Syn,
5496 seq_number: LOCAL_SEQ,
5497 ack_number: Some(REMOTE_SEQ + 1),
5498 max_seg_size: Some(BASE_MSS),
5499 ..RECV_TEMPL
5500 }]
5501 );
5502 send!(
5503 s,
5504 TcpRepr {
5505 seq_number: REMOTE_SEQ + 1,
5506 ack_number: Some(LOCAL_SEQ + 1),
5507 ..SEND_TEMPL
5508 }
5509 );
5510 assert_eq!(s.state(), State::Established);
5511 assert_eq!(s.local_seq_no, LOCAL_SEQ + 1);
5512 assert_eq!(s.remote_seq_no, REMOTE_SEQ + 1);
5513 }
5514
5515 #[test]
5516 fn test_remote_close() {
5517 let mut s = socket_established();
5518 send!(
5519 s,
5520 TcpRepr {
5521 control: TcpControl::Fin,
5522 seq_number: REMOTE_SEQ + 1,
5523 ack_number: Some(LOCAL_SEQ + 1),
5524 ..SEND_TEMPL
5525 }
5526 );
5527 assert_eq!(s.state, State::CloseWait);
5528 recv!(
5529 s,
5530 [TcpRepr {
5531 seq_number: LOCAL_SEQ + 1,
5532 ack_number: Some(REMOTE_SEQ + 1 + 1),
5533 ..RECV_TEMPL
5534 }]
5535 );
5536 s.close();
5537 assert_eq!(s.state, State::LastAck);
5538 recv!(
5539 s,
5540 [TcpRepr {
5541 control: TcpControl::Fin,
5542 seq_number: LOCAL_SEQ + 1,
5543 ack_number: Some(REMOTE_SEQ + 1 + 1),
5544 ..RECV_TEMPL
5545 }]
5546 );
5547 send!(
5548 s,
5549 TcpRepr {
5550 seq_number: REMOTE_SEQ + 1 + 1,
5551 ack_number: Some(LOCAL_SEQ + 1 + 1),
5552 ..SEND_TEMPL
5553 }
5554 );
5555 assert_eq!(s.state, State::Closed);
5556 }
5557
5558 #[test]
5559 fn test_local_close() {
5560 let mut s = socket_established();
5561 s.close();
5562 assert_eq!(s.state, State::FinWait1);
5563 recv!(
5564 s,
5565 [TcpRepr {
5566 control: TcpControl::Fin,
5567 seq_number: LOCAL_SEQ + 1,
5568 ack_number: Some(REMOTE_SEQ + 1),
5569 ..RECV_TEMPL
5570 }]
5571 );
5572 send!(
5573 s,
5574 TcpRepr {
5575 seq_number: REMOTE_SEQ + 1,
5576 ack_number: Some(LOCAL_SEQ + 1 + 1),
5577 ..SEND_TEMPL
5578 }
5579 );
5580 assert_eq!(s.state, State::FinWait2);
5581 send!(
5582 s,
5583 TcpRepr {
5584 control: TcpControl::Fin,
5585 seq_number: REMOTE_SEQ + 1,
5586 ack_number: Some(LOCAL_SEQ + 1 + 1),
5587 ..SEND_TEMPL
5588 }
5589 );
5590 assert_eq!(s.state, State::TimeWait);
5591 recv!(
5592 s,
5593 [TcpRepr {
5594 seq_number: LOCAL_SEQ + 1 + 1,
5595 ack_number: Some(REMOTE_SEQ + 1 + 1),
5596 ..RECV_TEMPL
5597 }]
5598 );
5599 }
5600
5601 #[test]
5602 fn test_simultaneous_close() {
5603 let mut s = socket_established();
5604 s.close();
5605 assert_eq!(s.state, State::FinWait1);
5606 recv!(
5607 s,
5608 [TcpRepr {
5609 control: TcpControl::Fin,
5611 seq_number: LOCAL_SEQ + 1,
5612 ack_number: Some(REMOTE_SEQ + 1),
5613 ..RECV_TEMPL
5614 }]
5615 );
5616 send!(
5617 s,
5618 TcpRepr {
5619 control: TcpControl::Fin,
5620 seq_number: REMOTE_SEQ + 1,
5621 ack_number: Some(LOCAL_SEQ + 1),
5622 ..SEND_TEMPL
5623 }
5624 );
5625 assert_eq!(s.state, State::Closing);
5626 recv!(
5627 s,
5628 [TcpRepr {
5629 seq_number: LOCAL_SEQ + 1 + 1,
5630 ack_number: Some(REMOTE_SEQ + 1 + 1),
5631 ..RECV_TEMPL
5632 }]
5633 );
5634 send!(
5636 s,
5637 TcpRepr {
5638 seq_number: REMOTE_SEQ + 1 + 1,
5639 ack_number: Some(LOCAL_SEQ + 1 + 1),
5640 ..SEND_TEMPL
5641 }
5642 );
5643 assert_eq!(s.state, State::TimeWait);
5644 recv!(s, []);
5645 }
5646
5647 #[test]
5648 fn test_simultaneous_close_combined_fin_ack() {
5649 let mut s = socket_established();
5650 s.close();
5651 assert_eq!(s.state, State::FinWait1);
5652 recv!(
5653 s,
5654 [TcpRepr {
5655 control: TcpControl::Fin,
5656 seq_number: LOCAL_SEQ + 1,
5657 ack_number: Some(REMOTE_SEQ + 1),
5658 ..RECV_TEMPL
5659 }]
5660 );
5661 send!(
5662 s,
5663 TcpRepr {
5664 control: TcpControl::Fin,
5665 seq_number: REMOTE_SEQ + 1,
5666 ack_number: Some(LOCAL_SEQ + 1 + 1),
5667 ..SEND_TEMPL
5668 }
5669 );
5670 assert_eq!(s.state, State::TimeWait);
5671 recv!(
5672 s,
5673 [TcpRepr {
5674 seq_number: LOCAL_SEQ + 1 + 1,
5675 ack_number: Some(REMOTE_SEQ + 1 + 1),
5676 ..RECV_TEMPL
5677 }]
5678 );
5679 }
5680
5681 #[test]
5682 fn test_simultaneous_close_raced() {
5683 let mut s = socket_established();
5684 s.close();
5685 assert_eq!(s.state, State::FinWait1);
5686
5687 send!(
5689 s,
5690 TcpRepr {
5691 control: TcpControl::Fin,
5692 seq_number: REMOTE_SEQ + 1,
5693 ack_number: Some(LOCAL_SEQ + 1),
5694 ..SEND_TEMPL
5695 }
5696 );
5697 assert_eq!(s.state, State::Closing);
5698
5699 recv!(
5701 s,
5702 [TcpRepr {
5703 control: TcpControl::Fin,
5704 seq_number: LOCAL_SEQ + 1,
5705 ack_number: Some(REMOTE_SEQ + 1 + 1),
5706 ..RECV_TEMPL
5707 }]
5708 );
5709 assert_eq!(s.state, State::Closing);
5710
5711 send!(
5712 s,
5713 TcpRepr {
5714 seq_number: REMOTE_SEQ + 1 + 1,
5715 ack_number: Some(LOCAL_SEQ + 1 + 1),
5716 ..SEND_TEMPL
5717 }
5718 );
5719 assert_eq!(s.state, State::TimeWait);
5720 recv!(s, []);
5721 }
5722
5723 #[test]
5724 fn test_simultaneous_close_raced_with_data() {
5725 let mut s = socket_established();
5726 s.send_slice(b"abcdef").unwrap();
5727 s.close();
5728 assert_eq!(s.state, State::FinWait1);
5729
5730 send!(
5732 s,
5733 TcpRepr {
5734 control: TcpControl::Fin,
5735 seq_number: REMOTE_SEQ + 1,
5736 ack_number: Some(LOCAL_SEQ + 1),
5737 ..SEND_TEMPL
5738 }
5739 );
5740 assert_eq!(s.state, State::Closing);
5741
5742 recv!(
5744 s,
5745 [TcpRepr {
5746 control: TcpControl::Fin,
5747 seq_number: LOCAL_SEQ + 1,
5748 ack_number: Some(REMOTE_SEQ + 1 + 1),
5749 payload: &b"abcdef"[..],
5750 ..RECV_TEMPL
5751 }]
5752 );
5753 assert_eq!(s.state, State::Closing);
5754
5755 send!(
5756 s,
5757 TcpRepr {
5758 seq_number: REMOTE_SEQ + 1 + 1,
5759 ack_number: Some(LOCAL_SEQ + 1 + 6 + 1),
5760 ..SEND_TEMPL
5761 }
5762 );
5763 assert_eq!(s.state, State::TimeWait);
5764 recv!(s, []);
5765 }
5766
5767 #[test]
5768 fn test_fin_with_data() {
5769 let mut s = socket_established();
5770 s.send_slice(b"abcdef").unwrap();
5771 s.close();
5772 recv!(
5773 s,
5774 [TcpRepr {
5775 control: TcpControl::Fin,
5776 seq_number: LOCAL_SEQ + 1,
5777 ack_number: Some(REMOTE_SEQ + 1),
5778 payload: &b"abcdef"[..],
5779 ..RECV_TEMPL
5780 }]
5781 )
5782 }
5783
5784 #[test]
5785 fn test_mutual_close_with_data_1() {
5786 let mut s = socket_established();
5787 s.send_slice(b"abcdef").unwrap();
5788 s.close();
5789 assert_eq!(s.state, State::FinWait1);
5790 recv!(
5791 s,
5792 [TcpRepr {
5793 control: TcpControl::Fin,
5794 seq_number: LOCAL_SEQ + 1,
5795 ack_number: Some(REMOTE_SEQ + 1),
5796 payload: &b"abcdef"[..],
5797 ..RECV_TEMPL
5798 }]
5799 );
5800 send!(
5801 s,
5802 TcpRepr {
5803 control: TcpControl::Fin,
5804 seq_number: REMOTE_SEQ + 1,
5805 ack_number: Some(LOCAL_SEQ + 1 + 6 + 1),
5806 ..SEND_TEMPL
5807 }
5808 );
5809 }
5810
5811 #[test]
5812 fn test_mutual_close_with_data_2() {
5813 let mut s = socket_established();
5814 s.send_slice(b"abcdef").unwrap();
5815 s.close();
5816 assert_eq!(s.state, State::FinWait1);
5817 recv!(
5818 s,
5819 [TcpRepr {
5820 control: TcpControl::Fin,
5821 seq_number: LOCAL_SEQ + 1,
5822 ack_number: Some(REMOTE_SEQ + 1),
5823 payload: &b"abcdef"[..],
5824 ..RECV_TEMPL
5825 }]
5826 );
5827 send!(
5828 s,
5829 TcpRepr {
5830 seq_number: REMOTE_SEQ + 1,
5831 ack_number: Some(LOCAL_SEQ + 1 + 6 + 1),
5832 ..SEND_TEMPL
5833 }
5834 );
5835 assert_eq!(s.state, State::FinWait2);
5836 send!(
5837 s,
5838 TcpRepr {
5839 control: TcpControl::Fin,
5840 seq_number: REMOTE_SEQ + 1,
5841 ack_number: Some(LOCAL_SEQ + 1 + 6 + 1),
5842 ..SEND_TEMPL
5843 }
5844 );
5845 recv!(
5846 s,
5847 [TcpRepr {
5848 seq_number: LOCAL_SEQ + 1 + 6 + 1,
5849 ack_number: Some(REMOTE_SEQ + 1 + 1),
5850 ..RECV_TEMPL
5851 }]
5852 );
5853 assert_eq!(s.state, State::TimeWait);
5854 }
5855
5856 #[test]
5861 fn test_duplicate_seq_ack() {
5862 let mut s = socket_recved();
5863 send!(
5865 s,
5866 TcpRepr {
5867 seq_number: REMOTE_SEQ + 1,
5868 ack_number: Some(LOCAL_SEQ + 1),
5869 payload: &b"abcdef"[..],
5870 ..SEND_TEMPL
5871 },
5872 Some(TcpRepr {
5873 seq_number: LOCAL_SEQ + 1,
5874 ack_number: Some(REMOTE_SEQ + 1 + 6),
5875 window_len: 58,
5876 ..RECV_TEMPL
5877 })
5878 );
5879 }
5880
5881 #[test]
5882 fn test_data_retransmit() {
5883 let mut s = socket_established();
5884 s.send_slice(b"abcdef").unwrap();
5885 recv!(s, time 1000, Ok(TcpRepr {
5886 seq_number: LOCAL_SEQ + 1,
5887 ack_number: Some(REMOTE_SEQ + 1),
5888 payload: &b"abcdef"[..],
5889 ..RECV_TEMPL
5890 }));
5891 recv_nothing!(s, time 1050);
5892 recv!(s, time 2000, Ok(TcpRepr {
5893 seq_number: LOCAL_SEQ + 1,
5894 ack_number: Some(REMOTE_SEQ + 1),
5895 payload: &b"abcdef"[..],
5896 ..RECV_TEMPL
5897 }));
5898 }
5899
5900 #[test]
5901 fn test_data_retransmit_bursts() {
5902 let mut s = socket_established();
5903 s.remote_mss = 6;
5904 s.send_slice(b"abcdef012345").unwrap();
5905
5906 recv!(s, time 0, Ok(TcpRepr {
5907 control: TcpControl::None,
5908 seq_number: LOCAL_SEQ + 1,
5909 ack_number: Some(REMOTE_SEQ + 1),
5910 payload: &b"abcdef"[..],
5911 ..RECV_TEMPL
5912 }), exact);
5913 recv!(s, time 0, Ok(TcpRepr {
5914 control: TcpControl::Psh,
5915 seq_number: LOCAL_SEQ + 1 + 6,
5916 ack_number: Some(REMOTE_SEQ + 1),
5917 payload: &b"012345"[..],
5918 ..RECV_TEMPL
5919 }), exact);
5920 recv_nothing!(s, time 0);
5921
5922 recv_nothing!(s, time 50);
5923
5924 recv!(s, time 1000, Ok(TcpRepr {
5925 control: TcpControl::None,
5926 seq_number: LOCAL_SEQ + 1,
5927 ack_number: Some(REMOTE_SEQ + 1),
5928 payload: &b"abcdef"[..],
5929 ..RECV_TEMPL
5930 }), exact);
5931 recv!(s, time 1500, Ok(TcpRepr {
5932 control: TcpControl::Psh,
5933 seq_number: LOCAL_SEQ + 1 + 6,
5934 ack_number: Some(REMOTE_SEQ + 1),
5935 payload: &b"012345"[..],
5936 ..RECV_TEMPL
5937 }), exact);
5938 recv_nothing!(s, time 1550);
5939 }
5940
5941 #[test]
5942 fn test_data_retransmit_bursts_half_ack() {
5943 let mut s = socket_established();
5944 s.remote_mss = 6;
5945 s.send_slice(b"abcdef012345").unwrap();
5946
5947 recv!(s, time 0, Ok(TcpRepr {
5948 control: TcpControl::None,
5949 seq_number: LOCAL_SEQ + 1,
5950 ack_number: Some(REMOTE_SEQ + 1),
5951 payload: &b"abcdef"[..],
5952 ..RECV_TEMPL
5953 }), exact);
5954 recv!(s, time 0, Ok(TcpRepr {
5955 control: TcpControl::Psh,
5956 seq_number: LOCAL_SEQ + 1 + 6,
5957 ack_number: Some(REMOTE_SEQ + 1),
5958 payload: &b"012345"[..],
5959 ..RECV_TEMPL
5960 }), exact);
5961 send!(s, time 5, TcpRepr {
5963 seq_number: REMOTE_SEQ + 1,
5964 ack_number: Some(LOCAL_SEQ + 1 + 6),
5965 window_len: 6,
5966 ..SEND_TEMPL
5967 });
5968 recv!(s, time 1500, Ok(TcpRepr {
5970 control: TcpControl::Psh,
5971 seq_number: LOCAL_SEQ + 1 + 6,
5972 ack_number: Some(REMOTE_SEQ + 1),
5973 payload: &b"012345"[..],
5974 ..RECV_TEMPL
5975 }), exact);
5976
5977 recv_nothing!(s, time 1550);
5978 }
5979
5980 #[test]
5981 fn test_retransmit_timer_restart_on_partial_ack() {
5982 let mut s = socket_established();
5983 s.remote_mss = 6;
5984 s.send_slice(b"abcdef012345").unwrap();
5985
5986 recv!(s, time 0, Ok(TcpRepr {
5987 control: TcpControl::None,
5988 seq_number: LOCAL_SEQ + 1,
5989 ack_number: Some(REMOTE_SEQ + 1),
5990 payload: &b"abcdef"[..],
5991 ..RECV_TEMPL
5992 }), exact);
5993 recv!(s, time 0, Ok(TcpRepr {
5994 control: TcpControl::Psh,
5995 seq_number: LOCAL_SEQ + 1 + 6,
5996 ack_number: Some(REMOTE_SEQ + 1),
5997 payload: &b"012345"[..],
5998 ..RECV_TEMPL
5999 }), exact);
6000 send!(s, time 600, TcpRepr {
6002 seq_number: REMOTE_SEQ + 1,
6003 ack_number: Some(LOCAL_SEQ + 1 + 6),
6004 window_len: 6,
6005 ..SEND_TEMPL
6006 });
6007 recv_nothing!(s, time 2399);
6009 recv!(s, time 2400, Ok(TcpRepr {
6011 control: TcpControl::Psh,
6012 seq_number: LOCAL_SEQ + 1 + 6,
6013 ack_number: Some(REMOTE_SEQ + 1),
6014 payload: &b"012345"[..],
6015 ..RECV_TEMPL
6016 }), exact);
6017 }
6018
6019 #[test]
6020 fn test_data_retransmit_bursts_half_ack_close() {
6021 let mut s = socket_established();
6022 s.remote_mss = 6;
6023 s.send_slice(b"abcdef012345").unwrap();
6024 s.close();
6025
6026 recv!(s, time 0, Ok(TcpRepr {
6027 control: TcpControl::None,
6028 seq_number: LOCAL_SEQ + 1,
6029 ack_number: Some(REMOTE_SEQ + 1),
6030 payload: &b"abcdef"[..],
6031 ..RECV_TEMPL
6032 }), exact);
6033 recv!(s, time 0, Ok(TcpRepr {
6034 control: TcpControl::Fin,
6035 seq_number: LOCAL_SEQ + 1 + 6,
6036 ack_number: Some(REMOTE_SEQ + 1),
6037 payload: &b"012345"[..],
6038 ..RECV_TEMPL
6039 }), exact);
6040 send!(s, time 5, TcpRepr {
6042 seq_number: REMOTE_SEQ + 1,
6043 ack_number: Some(LOCAL_SEQ + 1 + 6),
6044 window_len: 6,
6045 ..SEND_TEMPL
6046 });
6047 recv!(s, time 1500, Ok(TcpRepr {
6049 control: TcpControl::Fin,
6050 seq_number: LOCAL_SEQ + 1 + 6,
6051 ack_number: Some(REMOTE_SEQ + 1),
6052 payload: &b"012345"[..],
6053 ..RECV_TEMPL
6054 }), exact);
6055
6056 recv_nothing!(s, time 1550);
6057 }
6058
6059 #[test]
6060 fn test_send_data_after_syn_ack_retransmit() {
6061 let mut s = socket_syn_received();
6062 recv!(s, time 50, Ok(TcpRepr {
6063 control: TcpControl::Syn,
6064 seq_number: LOCAL_SEQ,
6065 ack_number: Some(REMOTE_SEQ + 1),
6066 max_seg_size: Some(BASE_MSS),
6067 ..RECV_TEMPL
6068 }));
6069 recv!(s, time 1050, Ok(TcpRepr { control: TcpControl::Syn,
6071 seq_number: LOCAL_SEQ,
6072 ack_number: Some(REMOTE_SEQ + 1),
6073 max_seg_size: Some(BASE_MSS),
6074 ..RECV_TEMPL
6075 }));
6076 send!(
6077 s,
6078 TcpRepr {
6079 seq_number: REMOTE_SEQ + 1,
6080 ack_number: Some(LOCAL_SEQ + 1),
6081 ..SEND_TEMPL
6082 }
6083 );
6084 assert_eq!(s.state(), State::Established);
6085 s.send_slice(b"abcdef").unwrap();
6086 recv!(
6087 s,
6088 [TcpRepr {
6089 seq_number: LOCAL_SEQ + 1,
6090 ack_number: Some(REMOTE_SEQ + 1),
6091 payload: &b"abcdef"[..],
6092 ..RECV_TEMPL
6093 }]
6094 )
6095 }
6096
6097 #[test]
6098 fn test_established_retransmit_for_dup_ack() {
6099 let mut s = socket_established();
6100 s.send_slice(b"abc").unwrap();
6102 recv!(s, time 1000, Ok(TcpRepr {
6103 seq_number: LOCAL_SEQ + 1,
6104 ack_number: Some(REMOTE_SEQ + 1),
6105 payload: &b"abc"[..],
6106 ..RECV_TEMPL
6107 }));
6108 assert_eq!(s.tx_buffer.len(), 3);
6110 send!(
6112 s,
6113 TcpRepr {
6114 seq_number: REMOTE_SEQ + 1,
6115 ack_number: Some(LOCAL_SEQ + 1),
6116 ..SEND_TEMPL
6117 }
6118 );
6119 recv!(s, time 4000, Ok(TcpRepr {
6121 seq_number: LOCAL_SEQ + 1,
6122 ack_number: Some(REMOTE_SEQ + 1),
6123 payload: &b"abc"[..],
6124 ..RECV_TEMPL
6125 }));
6126 }
6127
6128 #[test]
6129 fn test_established_retransmit_reset_after_ack() {
6130 let mut s = socket_established();
6131 s.remote_win_len = 6;
6132 s.send_slice(b"abcdef").unwrap();
6133 s.send_slice(b"123456").unwrap();
6134 s.send_slice(b"ABCDEF").unwrap();
6135 recv!(s, time 1000, Ok(TcpRepr {
6136 seq_number: LOCAL_SEQ + 1,
6137 ack_number: Some(REMOTE_SEQ + 1),
6138 payload: &b"abcdef"[..],
6139 ..RECV_TEMPL
6140 }));
6141 send!(s, time 1005, TcpRepr {
6142 seq_number: REMOTE_SEQ + 1,
6143 ack_number: Some(LOCAL_SEQ + 1 + 6),
6144 window_len: 6,
6145 ..SEND_TEMPL
6146 });
6147 recv!(s, time 1010, Ok(TcpRepr {
6148 seq_number: LOCAL_SEQ + 1 + 6,
6149 ack_number: Some(REMOTE_SEQ + 1),
6150 payload: &b"123456"[..],
6151 ..RECV_TEMPL
6152 }));
6153 send!(s, time 1015, TcpRepr {
6154 seq_number: REMOTE_SEQ + 1,
6155 ack_number: Some(LOCAL_SEQ + 1 + 6 + 6),
6156 window_len: 6,
6157 ..SEND_TEMPL
6158 });
6159 recv!(s, time 1020, Ok(TcpRepr {
6160 seq_number: LOCAL_SEQ + 1 + 6 + 6,
6161 ack_number: Some(REMOTE_SEQ + 1),
6162 payload: &b"ABCDEF"[..],
6163 ..RECV_TEMPL
6164 }));
6165 }
6166
6167 #[test]
6168 fn test_established_queue_during_retransmission() {
6169 let mut s = socket_established();
6170 s.remote_mss = 6;
6171 s.send_slice(b"abcdef123456ABCDEF").unwrap();
6172 recv!(s, time 1000, Ok(TcpRepr {
6173 seq_number: LOCAL_SEQ + 1,
6174 ack_number: Some(REMOTE_SEQ + 1),
6175 payload: &b"abcdef"[..],
6176 ..RECV_TEMPL
6177 })); recv!(s, time 1005, Ok(TcpRepr {
6179 seq_number: LOCAL_SEQ + 1 + 6,
6180 ack_number: Some(REMOTE_SEQ + 1),
6181 payload: &b"123456"[..],
6182 ..RECV_TEMPL
6183 })); recv!(s, time 1010, Ok(TcpRepr {
6185 seq_number: LOCAL_SEQ + 1 + 6 + 6,
6186 ack_number: Some(REMOTE_SEQ + 1),
6187 payload: &b"ABCDEF"[..],
6188 ..RECV_TEMPL
6189 })); recv!(s, time 3000, Ok(TcpRepr {
6191 seq_number: LOCAL_SEQ + 1,
6192 ack_number: Some(REMOTE_SEQ + 1),
6193 payload: &b"abcdef"[..],
6194 ..RECV_TEMPL
6195 })); send!(s, time 3005, TcpRepr {
6197 seq_number: REMOTE_SEQ + 1,
6198 ack_number: Some(LOCAL_SEQ + 1 + 6 + 6),
6199 ..SEND_TEMPL
6200 }); recv!(s, time 3010, Ok(TcpRepr {
6202 seq_number: LOCAL_SEQ + 1 + 6 + 6,
6203 ack_number: Some(REMOTE_SEQ + 1),
6204 payload: &b"ABCDEF"[..],
6205 ..RECV_TEMPL
6206 })); }
6208
6209 #[test]
6210 fn test_close_wait_retransmit_reset_after_ack() {
6211 let mut s = socket_close_wait();
6212 s.remote_win_len = 6;
6213 s.send_slice(b"abcdef").unwrap();
6214 s.send_slice(b"123456").unwrap();
6215 s.send_slice(b"ABCDEF").unwrap();
6216 recv!(s, time 1000, Ok(TcpRepr {
6217 seq_number: LOCAL_SEQ + 1,
6218 ack_number: Some(REMOTE_SEQ + 1 + 1),
6219 payload: &b"abcdef"[..],
6220 ..RECV_TEMPL
6221 }));
6222 send!(s, time 1005, TcpRepr {
6223 seq_number: REMOTE_SEQ + 1 + 1,
6224 ack_number: Some(LOCAL_SEQ + 1 + 6),
6225 window_len: 6,
6226 ..SEND_TEMPL
6227 });
6228 recv!(s, time 1010, Ok(TcpRepr {
6229 seq_number: LOCAL_SEQ + 1 + 6,
6230 ack_number: Some(REMOTE_SEQ + 1 + 1),
6231 payload: &b"123456"[..],
6232 ..RECV_TEMPL
6233 }));
6234 send!(s, time 1015, TcpRepr {
6235 seq_number: REMOTE_SEQ + 1 + 1,
6236 ack_number: Some(LOCAL_SEQ + 1 + 6 + 6),
6237 window_len: 6,
6238 ..SEND_TEMPL
6239 });
6240 recv!(s, time 1020, Ok(TcpRepr {
6241 seq_number: LOCAL_SEQ + 1 + 6 + 6,
6242 ack_number: Some(REMOTE_SEQ + 1 + 1),
6243 payload: &b"ABCDEF"[..],
6244 ..RECV_TEMPL
6245 }));
6246 }
6247
6248 #[test]
6249 fn test_fin_wait_1_retransmit_reset_after_ack() {
6250 let mut s = socket_established();
6251 s.remote_win_len = 6;
6252 s.send_slice(b"abcdef").unwrap();
6253 s.send_slice(b"123456").unwrap();
6254 s.send_slice(b"ABCDEF").unwrap();
6255 s.close();
6256 recv!(s, time 1000, Ok(TcpRepr {
6257 seq_number: LOCAL_SEQ + 1,
6258 ack_number: Some(REMOTE_SEQ + 1),
6259 payload: &b"abcdef"[..],
6260 ..RECV_TEMPL
6261 }));
6262 send!(s, time 1005, TcpRepr {
6263 seq_number: REMOTE_SEQ + 1,
6264 ack_number: Some(LOCAL_SEQ + 1 + 6),
6265 window_len: 6,
6266 ..SEND_TEMPL
6267 });
6268 recv!(s, time 1010, Ok(TcpRepr {
6269 seq_number: LOCAL_SEQ + 1 + 6,
6270 ack_number: Some(REMOTE_SEQ + 1),
6271 payload: &b"123456"[..],
6272 ..RECV_TEMPL
6273 }));
6274 send!(s, time 1015, TcpRepr {
6275 seq_number: REMOTE_SEQ + 1,
6276 ack_number: Some(LOCAL_SEQ + 1 + 6 + 6),
6277 window_len: 6,
6278 ..SEND_TEMPL
6279 });
6280 recv!(s, time 1020, Ok(TcpRepr {
6281 control: TcpControl::Fin,
6282 seq_number: LOCAL_SEQ + 1 + 6 + 6,
6283 ack_number: Some(REMOTE_SEQ + 1),
6284 payload: &b"ABCDEF"[..],
6285 ..RECV_TEMPL
6286 }));
6287 }
6288
6289 #[test]
6290 fn test_fast_retransmit_after_triple_duplicate_ack() {
6291 let mut s = socket_established();
6292 s.remote_mss = 6;
6293
6294 send!(s, time 0, TcpRepr {
6296 seq_number: REMOTE_SEQ + 1,
6297 ack_number: Some(LOCAL_SEQ + 1),
6298 ..SEND_TEMPL
6299 });
6300
6301 s.send_slice(b"xxxxxxyyyyyywwwwwwzzzzzz").unwrap();
6304 recv!(s, time 1000, Ok(TcpRepr {
6306 seq_number: LOCAL_SEQ + 1,
6307 ack_number: Some(REMOTE_SEQ + 1),
6308 payload: &b"xxxxxx"[..],
6309 ..RECV_TEMPL
6310 }));
6311 recv!(s, time 1005, Ok(TcpRepr {
6312 seq_number: LOCAL_SEQ + 1 + 6,
6313 ack_number: Some(REMOTE_SEQ + 1),
6314 payload: &b"yyyyyy"[..],
6315 ..RECV_TEMPL
6316 }));
6317 recv!(s, time 1010, Ok(TcpRepr {
6318 seq_number: LOCAL_SEQ + 1 + (6 * 2),
6319 ack_number: Some(REMOTE_SEQ + 1),
6320 payload: &b"wwwwww"[..],
6321 ..RECV_TEMPL
6322 }));
6323 recv!(s, time 1015, Ok(TcpRepr {
6324 seq_number: LOCAL_SEQ + 1 + (6 * 3),
6325 ack_number: Some(REMOTE_SEQ + 1),
6326 payload: &b"zzzzzz"[..],
6327 ..RECV_TEMPL
6328 }));
6329
6330 send!(s, time 1050, TcpRepr {
6332 seq_number: REMOTE_SEQ + 1,
6333 ack_number: Some(LOCAL_SEQ + 1),
6334 ..SEND_TEMPL
6335 });
6336 send!(s, time 1055, TcpRepr {
6338 seq_number: REMOTE_SEQ + 1,
6339 ack_number: Some(LOCAL_SEQ + 1),
6340 ..SEND_TEMPL
6341 });
6342 send!(s, time 1060, TcpRepr {
6345 seq_number: REMOTE_SEQ + 1,
6346 ack_number: Some(LOCAL_SEQ + 1),
6347 ..SEND_TEMPL
6348 });
6349
6350 recv!(s, time 1100, Ok(TcpRepr {
6352 seq_number: LOCAL_SEQ + 1,
6353 ack_number: Some(REMOTE_SEQ + 1),
6354 payload: &b"xxxxxx"[..],
6355 ..RECV_TEMPL
6356 }));
6357
6358 recv!(s, time 1105, Ok(TcpRepr {
6359 seq_number: LOCAL_SEQ + 1 + 6,
6360 ack_number: Some(REMOTE_SEQ + 1),
6361 payload: &b"yyyyyy"[..],
6362 ..RECV_TEMPL
6363 }));
6364 recv!(s, time 1110, Ok(TcpRepr {
6365 seq_number: LOCAL_SEQ + 1 + (6 * 2),
6366 ack_number: Some(REMOTE_SEQ + 1),
6367 payload: &b"wwwwww"[..],
6368 ..RECV_TEMPL
6369 }));
6370 recv!(s, time 1115, Ok(TcpRepr {
6371 seq_number: LOCAL_SEQ + 1 + (6 * 3),
6372 ack_number: Some(REMOTE_SEQ + 1),
6373 payload: &b"zzzzzz"[..],
6374 ..RECV_TEMPL
6375 }));
6376
6377 assert!(match s.timer {
6380 Timer::Retransmit { expires_at, .. } => expires_at > Instant::from_millis(1115),
6381 _ => false,
6382 });
6383
6384 send!(s, time 1120, TcpRepr {
6386 seq_number: REMOTE_SEQ + 1,
6387 ack_number: Some(LOCAL_SEQ + 1 + (6 * 4)),
6388 ..SEND_TEMPL
6389 });
6390 }
6391
6392 #[test]
6393 fn test_fast_retransmit_duplicate_detection_with_data() {
6394 let mut s = socket_established();
6395
6396 s.send_slice(b"abc").unwrap(); recv!(s, time 1000, Ok(TcpRepr {
6398 seq_number: LOCAL_SEQ + 1,
6399 ack_number: Some(REMOTE_SEQ + 1),
6400 payload: &b"abc"[..],
6401 ..RECV_TEMPL
6402 }));
6403
6404 send!(
6406 s,
6407 TcpRepr {
6408 seq_number: REMOTE_SEQ + 1,
6409 ack_number: Some(LOCAL_SEQ + 1),
6410 ..SEND_TEMPL
6411 }
6412 );
6413 send!(
6415 s,
6416 TcpRepr {
6417 seq_number: REMOTE_SEQ + 1,
6418 ack_number: Some(LOCAL_SEQ + 1),
6419 ..SEND_TEMPL
6420 }
6421 );
6422 send!(
6424 s,
6425 TcpRepr {
6426 seq_number: REMOTE_SEQ + 1,
6427 ack_number: Some(LOCAL_SEQ + 1),
6428 ..SEND_TEMPL
6429 }
6430 );
6431
6432 assert_eq!(s.local_rx_dup_acks, 2, "duplicate ACK counter is not set");
6433
6434 send!(
6437 s,
6438 TcpRepr {
6439 seq_number: REMOTE_SEQ + 1,
6440 ack_number: Some(LOCAL_SEQ + 1),
6441 payload: &b"xxxxxx"[..],
6442 ..SEND_TEMPL
6443 }
6444 );
6445
6446 recv!(
6447 s,
6448 [TcpRepr {
6449 seq_number: LOCAL_SEQ + 1 + 3,
6450 ack_number: Some(REMOTE_SEQ + 1 + 6),
6451 window_len: 58,
6452 ..RECV_TEMPL
6453 }]
6454 );
6455
6456 assert_eq!(
6457 s.local_rx_dup_acks, 0,
6458 "duplicate ACK counter is not reset when receiving data"
6459 );
6460 }
6461
6462 #[test]
6463 fn test_fast_retransmit_duplicate_detection_with_window_update() {
6464 let mut s = socket_established();
6465
6466 s.send_slice(b"abc").unwrap(); recv!(s, time 1000, Ok(TcpRepr {
6468 seq_number: LOCAL_SEQ + 1,
6469 ack_number: Some(REMOTE_SEQ + 1),
6470 payload: &b"abc"[..],
6471 ..RECV_TEMPL
6472 }));
6473
6474 send!(
6476 s,
6477 TcpRepr {
6478 seq_number: REMOTE_SEQ + 1,
6479 ack_number: Some(LOCAL_SEQ + 1),
6480 ..SEND_TEMPL
6481 }
6482 );
6483 send!(
6485 s,
6486 TcpRepr {
6487 seq_number: REMOTE_SEQ + 1,
6488 ack_number: Some(LOCAL_SEQ + 1),
6489 ..SEND_TEMPL
6490 }
6491 );
6492 send!(
6494 s,
6495 TcpRepr {
6496 seq_number: REMOTE_SEQ + 1,
6497 ack_number: Some(LOCAL_SEQ + 1),
6498 ..SEND_TEMPL
6499 }
6500 );
6501
6502 assert_eq!(s.local_rx_dup_acks, 2, "duplicate ACK counter is not set");
6503
6504 send!(
6507 s,
6508 TcpRepr {
6509 seq_number: REMOTE_SEQ + 1,
6510 ack_number: Some(LOCAL_SEQ + 1),
6511 window_len: 400,
6512 ..SEND_TEMPL
6513 }
6514 );
6515
6516 assert_eq!(
6517 s.local_rx_dup_acks, 0,
6518 "duplicate ACK counter is not reset when receiving a window update"
6519 );
6520 }
6521
6522 #[test]
6523 fn test_fast_retransmit_duplicate_detection() {
6524 let mut s = socket_established();
6525 s.remote_mss = 6;
6526
6527 send!(s, time 0, TcpRepr {
6529 seq_number: REMOTE_SEQ + 1,
6530 ack_number: Some(LOCAL_SEQ + 1),
6531 ..SEND_TEMPL
6532 });
6533
6534 send!(s, time 0, TcpRepr {
6536 seq_number: REMOTE_SEQ + 1,
6537 ack_number: Some(LOCAL_SEQ + 1),
6538 ..SEND_TEMPL
6539 });
6540
6541 assert_eq!(
6542 s.local_rx_dup_acks, 0,
6543 "duplicate ACK counter is set but wound not transmit data"
6544 );
6545
6546 s.send_slice(b"xxxxxxyyyyyywwwwwwzzzzzz").unwrap();
6549
6550 recv!(s, time 1000, Ok(TcpRepr {
6552 seq_number: LOCAL_SEQ + 1,
6553 ack_number: Some(REMOTE_SEQ + 1),
6554 payload: &b"xxxxxx"[..],
6555 ..RECV_TEMPL
6556 }));
6557 recv!(s, time 1005, Ok(TcpRepr {
6558 seq_number: LOCAL_SEQ + 1 + 6,
6559 ack_number: Some(REMOTE_SEQ + 1),
6560 payload: &b"yyyyyy"[..],
6561 ..RECV_TEMPL
6562 }));
6563 recv!(s, time 1010, Ok(TcpRepr {
6564 seq_number: LOCAL_SEQ + 1 + (6 * 2),
6565 ack_number: Some(REMOTE_SEQ + 1),
6566 payload: &b"wwwwww"[..],
6567 ..RECV_TEMPL
6568 }));
6569 recv!(s, time 1015, Ok(TcpRepr {
6570 seq_number: LOCAL_SEQ + 1 + (6 * 3),
6571 ack_number: Some(REMOTE_SEQ + 1),
6572 payload: &b"zzzzzz"[..],
6573 ..RECV_TEMPL
6574 }));
6575
6576 send!(s, time 1050, TcpRepr {
6578 seq_number: REMOTE_SEQ + 1,
6579 ack_number: Some(LOCAL_SEQ + 1),
6580 ..SEND_TEMPL
6581 });
6582 send!(s, time 1055, TcpRepr {
6584 seq_number: REMOTE_SEQ + 1,
6585 ack_number: Some(LOCAL_SEQ + 1),
6586 ..SEND_TEMPL
6587 });
6588 send!(s, time 1060, TcpRepr {
6590 seq_number: REMOTE_SEQ + 1,
6591 ack_number: Some(LOCAL_SEQ + 1 + (6 * 3)),
6592 ..SEND_TEMPL
6593 });
6594
6595 assert_eq!(
6596 s.local_rx_dup_acks, 0,
6597 "duplicate ACK counter is not reset when receiving ACK which updates send window"
6598 );
6599
6600 send!(s, time 1120, TcpRepr {
6602 seq_number: REMOTE_SEQ + 1,
6603 ack_number: Some(LOCAL_SEQ + 1 + (6 * 4)),
6604 ..SEND_TEMPL
6605 });
6606 }
6607
6608 #[test]
6609 fn test_fast_retransmit_dup_acks_counter() {
6610 let mut s = socket_established();
6611
6612 s.send_slice(b"abc").unwrap(); recv!(s, time 0, Ok(TcpRepr {
6614 seq_number: LOCAL_SEQ + 1,
6615 ack_number: Some(REMOTE_SEQ + 1),
6616 payload: &b"abc"[..],
6617 ..RECV_TEMPL
6618 }));
6619
6620 send!(s, time 0, TcpRepr {
6621 seq_number: REMOTE_SEQ + 1,
6622 ack_number: Some(LOCAL_SEQ + 1),
6623 ..SEND_TEMPL
6624 });
6625
6626 s.local_rx_dup_acks = u8::MAX - 1;
6628
6629 send!(s, time 0, TcpRepr {
6633 seq_number: REMOTE_SEQ + 1,
6634 ack_number: Some(LOCAL_SEQ + 1),
6635 ..SEND_TEMPL
6636 });
6637 send!(s, time 0, TcpRepr {
6638 seq_number: REMOTE_SEQ + 1,
6639 ack_number: Some(LOCAL_SEQ + 1),
6640 ..SEND_TEMPL
6641 });
6642 send!(s, time 0, TcpRepr {
6643 seq_number: REMOTE_SEQ + 1,
6644 ack_number: Some(LOCAL_SEQ + 1),
6645 ..SEND_TEMPL
6646 });
6647 assert_eq!(
6648 s.local_rx_dup_acks,
6649 u8::MAX,
6650 "duplicate ACK count should not overflow but saturate"
6651 );
6652 }
6653
6654 #[test]
6655 fn test_fast_retransmit_zero_window() {
6656 let mut s = socket_established();
6657
6658 send!(s, time 1000, TcpRepr {
6659 seq_number: REMOTE_SEQ + 1,
6660 ack_number: Some(LOCAL_SEQ + 1),
6661 ..SEND_TEMPL
6662 });
6663
6664 s.send_slice(b"abc").unwrap();
6665
6666 recv!(s, time 0, Ok(TcpRepr {
6667 seq_number: LOCAL_SEQ + 1,
6668 ack_number: Some(REMOTE_SEQ + 1),
6669 payload: &b"abc"[..],
6670 ..RECV_TEMPL
6671 }));
6672
6673 send!(s, time 1050, TcpRepr {
6675 seq_number: REMOTE_SEQ + 1,
6676 ack_number: Some(LOCAL_SEQ + 1),
6677 ..SEND_TEMPL
6678 });
6679 send!(s, time 1050, TcpRepr {
6680 seq_number: REMOTE_SEQ + 1,
6681 ack_number: Some(LOCAL_SEQ + 1),
6682 ..SEND_TEMPL
6683 });
6684 send!(s, time 1050, TcpRepr {
6685 seq_number: REMOTE_SEQ + 1,
6686 ack_number: Some(LOCAL_SEQ + 1),
6687 window_len: 0, ..SEND_TEMPL
6689 });
6690
6691 recv_nothing!(s);
6694 }
6695
6696 #[test]
6697 fn test_retransmit_exponential_backoff() {
6698 let mut s = socket_established();
6699 s.send_slice(b"abcdef").unwrap();
6700 recv!(s, time 0, Ok(TcpRepr {
6701 seq_number: LOCAL_SEQ + 1,
6702 ack_number: Some(REMOTE_SEQ + 1),
6703 payload: &b"abcdef"[..],
6704 ..RECV_TEMPL
6705 }));
6706
6707 let expected_retransmission_instant = s.rtte.retransmission_timeout().total_millis() as i64;
6708 recv_nothing!(s, time expected_retransmission_instant - 1);
6709 recv!(s, time expected_retransmission_instant, Ok(TcpRepr {
6710 seq_number: LOCAL_SEQ + 1,
6711 ack_number: Some(REMOTE_SEQ + 1),
6712 payload: &b"abcdef"[..],
6713 ..RECV_TEMPL
6714 }));
6715
6716 let expected_retransmission_instant = 3 * expected_retransmission_instant;
6718
6719 recv_nothing!(s, time expected_retransmission_instant - 1);
6720 recv!(s, time expected_retransmission_instant, Ok(TcpRepr {
6721 seq_number: LOCAL_SEQ + 1,
6722 ack_number: Some(REMOTE_SEQ + 1),
6723 payload: &b"abcdef"[..],
6724 ..RECV_TEMPL
6725 }));
6726 }
6727
6728 #[test]
6729 fn test_data_retransmit_ack_more_than_expected() {
6730 let mut s = socket_established();
6731 s.remote_mss = 6;
6732 s.send_slice(b"aaaaaabbbbbbcccccc").unwrap();
6733
6734 recv!(s, time 0, Ok(TcpRepr {
6735 seq_number: LOCAL_SEQ + 1,
6736 ack_number: Some(REMOTE_SEQ + 1),
6737 payload: &b"aaaaaa"[..],
6738 ..RECV_TEMPL
6739 }));
6740 recv!(s, time 0, Ok(TcpRepr {
6741 seq_number: LOCAL_SEQ + 1 + 6,
6742 ack_number: Some(REMOTE_SEQ + 1),
6743 payload: &b"bbbbbb"[..],
6744 ..RECV_TEMPL
6745 }));
6746 recv!(s, time 0, Ok(TcpRepr {
6747 seq_number: LOCAL_SEQ + 1 + 12,
6748 ack_number: Some(REMOTE_SEQ + 1),
6749 payload: &b"cccccc"[..],
6750 ..RECV_TEMPL
6751 }));
6752 recv_nothing!(s, time 0);
6753
6754 recv_nothing!(s, time 50);
6755
6756 assert!(s.timer.is_retransmit());
6759 recv!(s, time 1000, Ok(TcpRepr {
6760 seq_number: LOCAL_SEQ + 1,
6761 ack_number: Some(REMOTE_SEQ + 1),
6762 payload: &b"aaaaaa"[..],
6763 ..RECV_TEMPL
6764 }));
6765 recv!(s, time 1000, Ok(TcpRepr {
6766 seq_number: LOCAL_SEQ + 1 + 6,
6767 ack_number: Some(REMOTE_SEQ + 1),
6768 payload: &b"bbbbbb"[..],
6769 ..RECV_TEMPL
6770 }));
6771
6772 send!(
6774 s,
6775 time 3000,
6776 TcpRepr {
6777 seq_number: REMOTE_SEQ + 1,
6778 ack_number: Some(LOCAL_SEQ + 1 + 6),
6779 ..SEND_TEMPL
6780 }
6781 );
6782
6783 assert!(s.timer.is_retransmit());
6786
6787 send!(
6791 s,
6792 time 3000,
6793 TcpRepr {
6794 seq_number: REMOTE_SEQ + 1,
6795 ack_number: Some(LOCAL_SEQ + 1 + 18),
6796 ..SEND_TEMPL
6797 }
6798 );
6799
6800 assert!(!s.timer.is_retransmit());
6802 assert!(s.tx_buffer.is_empty());
6804 recv_nothing!(s, time 5000);
6805 }
6806
6807 #[test]
6808 fn test_retransmit_fin() {
6809 let mut s = socket_established();
6810 s.close();
6811 recv!(s, time 0, Ok(TcpRepr {
6812 control: TcpControl::Fin,
6813 seq_number: LOCAL_SEQ + 1,
6814 ack_number: Some(REMOTE_SEQ + 1),
6815 ..RECV_TEMPL
6816 }));
6817
6818 recv_nothing!(s, time 999);
6819 recv!(s, time 1000, Ok(TcpRepr {
6820 control: TcpControl::Fin,
6821 seq_number: LOCAL_SEQ + 1,
6822 ack_number: Some(REMOTE_SEQ + 1),
6823 ..RECV_TEMPL
6824 }));
6825 }
6826
6827 #[test]
6828 fn test_retransmit_fin_wait() {
6829 let mut s = socket_fin_wait_1();
6830 recv!(
6832 s,
6833 [TcpRepr {
6834 control: TcpControl::Fin,
6835 seq_number: LOCAL_SEQ + 1,
6836 ack_number: Some(REMOTE_SEQ + 1),
6837 ..RECV_TEMPL
6838 }]
6839 );
6840 send!(
6842 s,
6843 TcpRepr {
6844 control: TcpControl::Fin,
6845 seq_number: REMOTE_SEQ + 1,
6846 ack_number: Some(LOCAL_SEQ + 1),
6847 ..SEND_TEMPL
6848 }
6849 );
6850 recv!(
6852 s,
6853 [TcpRepr {
6854 control: TcpControl::None,
6855 seq_number: LOCAL_SEQ + 2,
6856 ack_number: Some(REMOTE_SEQ + 2),
6857 ..RECV_TEMPL
6858 }]
6859 );
6860
6861 recv_nothing!(s, time 999);
6863 recv!(
6864 s,
6865 time 1000,
6866 [TcpRepr {
6867 control: TcpControl::Fin,
6868 seq_number: LOCAL_SEQ + 1,
6869 ack_number: Some(REMOTE_SEQ + 2),
6870 ..RECV_TEMPL
6871 }]
6872 );
6873 recv_nothing!(s, time 2999);
6874 recv!(
6875 s,
6876 time 3000,
6877 [TcpRepr {
6878 control: TcpControl::Fin,
6879 seq_number: LOCAL_SEQ + 1,
6880 ack_number: Some(REMOTE_SEQ + 2),
6881 ..RECV_TEMPL
6882 }]
6883 );
6884 }
6885
6886 #[test]
6891 fn test_maximum_segment_size() {
6892 let mut s = socket_listen();
6893 s.tx_buffer = SocketBuffer::new(vec![0; 32767]);
6894 send!(
6895 s,
6896 TcpRepr {
6897 control: TcpControl::Syn,
6898 seq_number: REMOTE_SEQ,
6899 ack_number: None,
6900 max_seg_size: Some(1000),
6901 ..SEND_TEMPL
6902 }
6903 );
6904 recv!(
6905 s,
6906 [TcpRepr {
6907 control: TcpControl::Syn,
6908 seq_number: LOCAL_SEQ,
6909 ack_number: Some(REMOTE_SEQ + 1),
6910 max_seg_size: Some(BASE_MSS),
6911 ..RECV_TEMPL
6912 }]
6913 );
6914 send!(
6915 s,
6916 TcpRepr {
6917 seq_number: REMOTE_SEQ + 1,
6918 ack_number: Some(LOCAL_SEQ + 1),
6919 window_len: 32767,
6920 ..SEND_TEMPL
6921 }
6922 );
6923 s.send_slice(&[0; 1200][..]).unwrap();
6924 recv!(
6925 s,
6926 Ok(TcpRepr {
6927 seq_number: LOCAL_SEQ + 1,
6928 ack_number: Some(REMOTE_SEQ + 1),
6929 payload: &[0; 1000][..],
6930 ..RECV_TEMPL
6931 })
6932 );
6933 }
6934
6935 #[test]
6936 fn test_recv_out_of_recv_win() {
6937 let mut s = socket_established();
6938 s.set_ack_delay(Some(ACK_DELAY_DEFAULT));
6939 s.remote_mss = 32;
6940
6941 send!(
6943 s,
6944 TcpRepr {
6945 control: TcpControl::Psh,
6946 seq_number: REMOTE_SEQ + 1,
6947 ack_number: Some(LOCAL_SEQ + 1),
6948 payload: &[0; 32],
6949 ..SEND_TEMPL
6950 }
6951 );
6952 recv_nothing!(s);
6953
6954 send!(
6956 s,
6957 TcpRepr {
6958 control: TcpControl::Psh,
6959 seq_number: REMOTE_SEQ + 33,
6960 ack_number: Some(LOCAL_SEQ + 1),
6961 payload: &[0; 1],
6962 ..SEND_TEMPL
6963 }
6964 );
6965 recv!(
6966 s,
6967 Ok(TcpRepr {
6968 seq_number: LOCAL_SEQ + 1,
6969 ack_number: Some(REMOTE_SEQ + 34),
6970 window_len: 31,
6971 ..RECV_TEMPL
6972 })
6973 );
6974
6975 s.recv_slice(&mut [0; 1]).unwrap();
6978 recv_nothing!(s);
6979
6980 send!(
6983 s,
6984 TcpRepr {
6985 control: TcpControl::Psh,
6986 seq_number: REMOTE_SEQ + 34,
6987 ack_number: Some(LOCAL_SEQ + 1),
6988 payload: &[0; 32],
6989 ..SEND_TEMPL
6990 }
6991 );
6992 recv!(
6993 s,
6994 Ok(TcpRepr {
6995 seq_number: LOCAL_SEQ + 1,
6996 ack_number: Some(REMOTE_SEQ + 65),
6997 window_len: 1, ..RECV_TEMPL
6999 })
7000 );
7001 }
7002
7003 #[test]
7004 fn test_close_wait_no_window_update() {
7005 let mut s = socket_established();
7006 send!(
7007 s,
7008 TcpRepr {
7009 control: TcpControl::Fin,
7010 seq_number: REMOTE_SEQ + 1,
7011 ack_number: Some(LOCAL_SEQ + 1),
7012 payload: &[1, 2, 3, 4],
7013 ..SEND_TEMPL
7014 }
7015 );
7016 assert_eq!(s.state, State::CloseWait);
7017
7018 recv!(
7020 s,
7021 Ok(TcpRepr {
7022 seq_number: LOCAL_SEQ + 1,
7023 ack_number: Some(REMOTE_SEQ + 6),
7024 window_len: 60,
7025 ..RECV_TEMPL
7026 })
7027 );
7028
7029 let rx_buf = &mut [0; 32];
7030 assert_eq!(s.recv_slice(rx_buf), Ok(4));
7031
7032 recv_nothing!(s);
7034 }
7035
7036 #[test]
7037 fn test_time_wait_no_window_update() {
7038 let mut s = socket_fin_wait_2();
7039 send!(
7040 s,
7041 TcpRepr {
7042 control: TcpControl::Fin,
7043 seq_number: REMOTE_SEQ + 1,
7044 ack_number: Some(LOCAL_SEQ + 2),
7045 payload: &[1, 2, 3, 4],
7046 ..SEND_TEMPL
7047 }
7048 );
7049 assert_eq!(s.state, State::TimeWait);
7050
7051 recv!(
7053 s,
7054 Ok(TcpRepr {
7055 seq_number: LOCAL_SEQ + 2,
7056 ack_number: Some(REMOTE_SEQ + 6),
7057 window_len: 60,
7058 ..RECV_TEMPL
7059 })
7060 );
7061
7062 let rx_buf = &mut [0; 32];
7063 assert_eq!(s.recv_slice(rx_buf), Ok(4));
7064
7065 recv_nothing!(s);
7067 }
7068
7069 #[test]
7074 fn test_psh_transmit() {
7075 let mut s = socket_established();
7076 s.remote_mss = 6;
7077 s.send_slice(b"abcdef").unwrap();
7078 s.send_slice(b"123456").unwrap();
7079 recv!(s, time 0, Ok(TcpRepr {
7080 control: TcpControl::None,
7081 seq_number: LOCAL_SEQ + 1,
7082 ack_number: Some(REMOTE_SEQ + 1),
7083 payload: &b"abcdef"[..],
7084 ..RECV_TEMPL
7085 }), exact);
7086 recv!(s, time 0, Ok(TcpRepr {
7087 control: TcpControl::Psh,
7088 seq_number: LOCAL_SEQ + 1 + 6,
7089 ack_number: Some(REMOTE_SEQ + 1),
7090 payload: &b"123456"[..],
7091 ..RECV_TEMPL
7092 }), exact);
7093 }
7094
7095 #[test]
7096 fn test_psh_receive() {
7097 let mut s = socket_established();
7098 send!(
7099 s,
7100 TcpRepr {
7101 control: TcpControl::Psh,
7102 seq_number: REMOTE_SEQ + 1,
7103 ack_number: Some(LOCAL_SEQ + 1),
7104 payload: &b"abcdef"[..],
7105 ..SEND_TEMPL
7106 }
7107 );
7108 recv!(
7109 s,
7110 [TcpRepr {
7111 seq_number: LOCAL_SEQ + 1,
7112 ack_number: Some(REMOTE_SEQ + 1 + 6),
7113 window_len: 58,
7114 ..RECV_TEMPL
7115 }]
7116 );
7117 }
7118
7119 #[test]
7120 fn test_zero_window_ack() {
7121 let mut s = socket_established();
7122 s.rx_buffer = SocketBuffer::new(vec![0; 6]);
7123 s.assembler = Assembler::new();
7124 send!(
7125 s,
7126 TcpRepr {
7127 seq_number: REMOTE_SEQ + 1,
7128 ack_number: Some(LOCAL_SEQ + 1),
7129 payload: &b"abcdef"[..],
7130 ..SEND_TEMPL
7131 }
7132 );
7133 recv!(
7134 s,
7135 [TcpRepr {
7136 seq_number: LOCAL_SEQ + 1,
7137 ack_number: Some(REMOTE_SEQ + 1 + 6),
7138 window_len: 0,
7139 ..RECV_TEMPL
7140 }]
7141 );
7142 send!(
7143 s,
7144 TcpRepr {
7145 seq_number: REMOTE_SEQ + 1 + 6,
7146 ack_number: Some(LOCAL_SEQ + 1),
7147 payload: &b"123456"[..],
7148 ..SEND_TEMPL
7149 },
7150 Some(TcpRepr {
7151 seq_number: LOCAL_SEQ + 1,
7152 ack_number: Some(REMOTE_SEQ + 1 + 6),
7153 window_len: 0,
7154 ..RECV_TEMPL
7155 })
7156 );
7157 }
7158
7159 #[test]
7160 fn test_zero_window_fin() {
7161 let mut s = socket_established();
7162 s.rx_buffer = SocketBuffer::new(vec![0; 6]);
7163 s.assembler = Assembler::new();
7164 s.ack_delay = None;
7165
7166 send!(
7167 s,
7168 TcpRepr {
7169 seq_number: REMOTE_SEQ + 1,
7170 ack_number: Some(LOCAL_SEQ + 1),
7171 payload: &b"abcdef"[..],
7172 ..SEND_TEMPL
7173 }
7174 );
7175 recv!(
7176 s,
7177 [TcpRepr {
7178 seq_number: LOCAL_SEQ + 1,
7179 ack_number: Some(REMOTE_SEQ + 1 + 6),
7180 window_len: 0,
7181 ..RECV_TEMPL
7182 }]
7183 );
7184
7185 send!(
7188 s,
7189 TcpRepr {
7190 seq_number: REMOTE_SEQ + 1 + 6,
7191 ack_number: Some(LOCAL_SEQ + 1),
7192 payload: &[],
7193 control: TcpControl::Fin,
7194 ..SEND_TEMPL
7195 }
7196 );
7197 assert_eq!(s.state, State::CloseWait);
7198
7199 recv!(
7200 s,
7201 [TcpRepr {
7202 seq_number: LOCAL_SEQ + 1,
7203 ack_number: Some(REMOTE_SEQ + 1 + 7),
7204 window_len: 0,
7205 ..RECV_TEMPL
7206 }]
7207 );
7208 }
7209
7210 #[test]
7211 fn test_zero_window_ack_on_window_growth() {
7212 let mut s = socket_established();
7213 s.rx_buffer = SocketBuffer::new(vec![0; 6]);
7214 s.assembler = Assembler::new();
7215 send!(
7216 s,
7217 TcpRepr {
7218 seq_number: REMOTE_SEQ + 1,
7219 ack_number: Some(LOCAL_SEQ + 1),
7220 payload: &b"abcdef"[..],
7221 ..SEND_TEMPL
7222 }
7223 );
7224 recv!(
7225 s,
7226 [TcpRepr {
7227 seq_number: LOCAL_SEQ + 1,
7228 ack_number: Some(REMOTE_SEQ + 1 + 6),
7229 window_len: 0,
7230 ..RECV_TEMPL
7231 }]
7232 );
7233 recv_nothing!(s, time 0);
7234 s.recv(|buffer| {
7235 assert_eq!(&buffer[..3], b"abc");
7236 (3, ())
7237 })
7238 .unwrap();
7239 recv!(s, time 0, Ok(TcpRepr {
7240 seq_number: LOCAL_SEQ + 1,
7241 ack_number: Some(REMOTE_SEQ + 1 + 6),
7242 window_len: 3,
7243 ..RECV_TEMPL
7244 }));
7245 recv_nothing!(s, time 0);
7246 s.recv(|buffer| {
7247 assert_eq!(buffer, b"def");
7248 (buffer.len(), ())
7249 })
7250 .unwrap();
7251 recv!(s, time 0, Ok(TcpRepr {
7252 seq_number: LOCAL_SEQ + 1,
7253 ack_number: Some(REMOTE_SEQ + 1 + 6),
7254 window_len: 6,
7255 ..RECV_TEMPL
7256 }));
7257 }
7258
7259 #[test]
7260 fn test_window_update_with_delay_ack() {
7261 let mut s = socket_established_with_buffer_sizes(6, 6);
7262 s.ack_delay = Some(Duration::from_millis(10));
7263
7264 send!(
7265 s,
7266 TcpRepr {
7267 seq_number: REMOTE_SEQ + 1,
7268 ack_number: Some(LOCAL_SEQ + 1),
7269 payload: &b"abcdef"[..],
7270 ..SEND_TEMPL
7271 }
7272 );
7273
7274 recv_nothing!(s, time 5);
7275
7276 s.recv(|buffer| {
7277 assert_eq!(&buffer[..2], b"ab");
7278 (2, ())
7279 })
7280 .unwrap();
7281 recv!(
7282 s,
7283 time 5,
7284 Ok(TcpRepr {
7285 seq_number: LOCAL_SEQ + 1,
7286 ack_number: Some(REMOTE_SEQ + 1 + 6),
7287 window_len: 2,
7288 ..RECV_TEMPL
7289 })
7290 );
7291
7292 s.recv(|buffer| {
7293 assert_eq!(&buffer[..1], b"c");
7294 (1, ())
7295 })
7296 .unwrap();
7297 recv_nothing!(s, time 5);
7298
7299 s.recv(|buffer| {
7300 assert_eq!(&buffer[..1], b"d");
7301 (1, ())
7302 })
7303 .unwrap();
7304 recv!(
7305 s,
7306 time 5,
7307 Ok(TcpRepr {
7308 seq_number: LOCAL_SEQ + 1,
7309 ack_number: Some(REMOTE_SEQ + 1 + 6),
7310 window_len: 4,
7311 ..RECV_TEMPL
7312 })
7313 );
7314 }
7315
7316 #[test]
7317 fn test_fill_peer_window() {
7318 let mut s = socket_established();
7319 s.remote_mss = 6;
7320 s.send_slice(b"abcdef123456!@#$%^").unwrap();
7321 recv!(
7322 s,
7323 [
7324 TcpRepr {
7325 seq_number: LOCAL_SEQ + 1,
7326 ack_number: Some(REMOTE_SEQ + 1),
7327 payload: &b"abcdef"[..],
7328 ..RECV_TEMPL
7329 },
7330 TcpRepr {
7331 seq_number: LOCAL_SEQ + 1 + 6,
7332 ack_number: Some(REMOTE_SEQ + 1),
7333 payload: &b"123456"[..],
7334 ..RECV_TEMPL
7335 },
7336 TcpRepr {
7337 seq_number: LOCAL_SEQ + 1 + 6 + 6,
7338 ack_number: Some(REMOTE_SEQ + 1),
7339 payload: &b"!@#$%^"[..],
7340 ..RECV_TEMPL
7341 }
7342 ]
7343 );
7344 }
7345
7346 #[test]
7347 fn test_announce_window_after_read() {
7348 let mut s = socket_established();
7349 s.rx_buffer = SocketBuffer::new(vec![0; 6]);
7350 s.assembler = Assembler::new();
7351 send!(
7352 s,
7353 TcpRepr {
7354 seq_number: REMOTE_SEQ + 1,
7355 ack_number: Some(LOCAL_SEQ + 1),
7356 payload: &b"abc"[..],
7357 ..SEND_TEMPL
7358 }
7359 );
7360 recv!(
7361 s,
7362 [TcpRepr {
7363 seq_number: LOCAL_SEQ + 1,
7364 ack_number: Some(REMOTE_SEQ + 1 + 3),
7365 window_len: 3,
7366 ..RECV_TEMPL
7367 }]
7368 );
7369 assert_eq!(s.remote_last_win, s.rx_buffer.window() as u16);
7371 s.recv(|buffer| (buffer.len(), ())).unwrap();
7372 assert!(s.window_to_update());
7373 recv!(
7374 s,
7375 [TcpRepr {
7376 seq_number: LOCAL_SEQ + 1,
7377 ack_number: Some(REMOTE_SEQ + 1 + 3),
7378 window_len: 6,
7379 ..RECV_TEMPL
7380 }]
7381 );
7382 assert_eq!(s.remote_last_win, s.rx_buffer.window() as u16);
7383 send!(
7385 s,
7386 TcpRepr {
7387 seq_number: REMOTE_SEQ + 1 + 6,
7388 ack_number: Some(LOCAL_SEQ + 1),
7389 payload: &b"def"[..],
7390 ..SEND_TEMPL
7391 },
7392 Some(TcpRepr {
7393 seq_number: LOCAL_SEQ + 1,
7394 ack_number: Some(REMOTE_SEQ + 1 + 3),
7395 window_len: 6,
7396 ..RECV_TEMPL
7397 })
7398 );
7399 send!(
7400 s,
7401 TcpRepr {
7402 seq_number: REMOTE_SEQ + 1 + 3,
7403 ack_number: Some(LOCAL_SEQ + 1),
7404 payload: &b"abc"[..],
7405 ..SEND_TEMPL
7406 },
7407 Some(TcpRepr {
7408 seq_number: LOCAL_SEQ + 1,
7409 ack_number: Some(REMOTE_SEQ + 1 + 9),
7410 window_len: 0,
7411 ..RECV_TEMPL
7412 })
7413 );
7414 assert_eq!(s.remote_last_win, s.rx_buffer.window() as u16);
7415 s.recv(|buffer| (buffer.len(), ())).unwrap();
7416 assert!(s.window_to_update());
7417 }
7418
7419 #[test]
7424 fn test_zero_window_probe_enter_on_win_update() {
7425 let mut s = socket_established();
7426
7427 assert!(!s.timer.is_zero_window_probe());
7428
7429 s.send_slice(b"abcdef123456!@#$%^").unwrap();
7430
7431 assert!(!s.timer.is_zero_window_probe());
7432
7433 send!(
7434 s,
7435 TcpRepr {
7436 seq_number: REMOTE_SEQ + 1,
7437 ack_number: Some(LOCAL_SEQ + 1),
7438 window_len: 0,
7439 ..SEND_TEMPL
7440 }
7441 );
7442
7443 assert!(s.timer.is_zero_window_probe());
7444 }
7445
7446 #[test]
7447 fn test_zero_window_probe_enter_on_send() {
7448 let mut s = socket_established();
7449
7450 send!(
7451 s,
7452 TcpRepr {
7453 seq_number: REMOTE_SEQ + 1,
7454 ack_number: Some(LOCAL_SEQ + 1),
7455 window_len: 0,
7456 ..SEND_TEMPL
7457 }
7458 );
7459
7460 assert!(!s.timer.is_zero_window_probe());
7461
7462 s.send_slice(b"abcdef123456!@#$%^").unwrap();
7463
7464 assert!(s.timer.is_zero_window_probe());
7465 }
7466
7467 #[test]
7468 fn test_zero_window_probe_exit() {
7469 let mut s = socket_established();
7470
7471 s.send_slice(b"abcdef123456!@#$%^").unwrap();
7472
7473 assert!(!s.timer.is_zero_window_probe());
7474
7475 send!(
7476 s,
7477 TcpRepr {
7478 seq_number: REMOTE_SEQ + 1,
7479 ack_number: Some(LOCAL_SEQ + 1),
7480 window_len: 0,
7481 ..SEND_TEMPL
7482 }
7483 );
7484
7485 assert!(s.timer.is_zero_window_probe());
7486
7487 send!(
7488 s,
7489 TcpRepr {
7490 seq_number: REMOTE_SEQ + 1,
7491 ack_number: Some(LOCAL_SEQ + 1),
7492 window_len: 6,
7493 ..SEND_TEMPL
7494 }
7495 );
7496
7497 assert!(!s.timer.is_zero_window_probe());
7498 }
7499
7500 #[test]
7501 fn test_zero_window_probe_exit_ack() {
7502 let mut s = socket_established();
7503
7504 s.send_slice(b"abcdef123456!@#$%^").unwrap();
7505 send!(
7506 s,
7507 TcpRepr {
7508 seq_number: REMOTE_SEQ + 1,
7509 ack_number: Some(LOCAL_SEQ + 1),
7510 window_len: 0,
7511 ..SEND_TEMPL
7512 }
7513 );
7514
7515 recv!(
7516 s,
7517 time 1000,
7518 [TcpRepr {
7519 seq_number: LOCAL_SEQ + 1,
7520 ack_number: Some(REMOTE_SEQ + 1),
7521 payload: &b"a"[..],
7522 ..RECV_TEMPL
7523 }]
7524 );
7525
7526 send!(
7527 s,
7528 time 1010,
7529 TcpRepr {
7530 seq_number: REMOTE_SEQ + 1,
7531 ack_number: Some(LOCAL_SEQ + 2),
7532 window_len: 6,
7533 ..SEND_TEMPL
7534 }
7535 );
7536
7537 recv!(
7538 s,
7539 time 1010,
7540 [TcpRepr {
7541 seq_number: LOCAL_SEQ + 2,
7542 ack_number: Some(REMOTE_SEQ + 1),
7543 payload: &b"bcdef1"[..],
7544 ..RECV_TEMPL
7545 }]
7546 );
7547 }
7548
7549 #[test]
7550 fn test_zero_window_probe_backoff_nack_reply() {
7551 let mut s = socket_established();
7552 s.send_slice(b"abcdef123456!@#$%^").unwrap();
7553 send!(
7554 s,
7555 TcpRepr {
7556 seq_number: REMOTE_SEQ + 1,
7557 ack_number: Some(LOCAL_SEQ + 1),
7558 window_len: 0,
7559 ..SEND_TEMPL
7560 }
7561 );
7562
7563 recv_nothing!(s, time 999);
7564 recv!(
7565 s,
7566 time 1000,
7567 [TcpRepr {
7568 seq_number: LOCAL_SEQ + 1,
7569 ack_number: Some(REMOTE_SEQ + 1),
7570 payload: &b"a"[..],
7571 ..RECV_TEMPL
7572 }]
7573 );
7574 send!(
7575 s,
7576 time 1100,
7577 TcpRepr {
7578 seq_number: REMOTE_SEQ + 1,
7579 ack_number: Some(LOCAL_SEQ + 1),
7580 window_len: 0,
7581 ..SEND_TEMPL
7582 }
7583 );
7584
7585 recv_nothing!(s, time 2999);
7586 recv!(
7587 s,
7588 time 3000,
7589 [TcpRepr {
7590 seq_number: LOCAL_SEQ + 1,
7591 ack_number: Some(REMOTE_SEQ + 1),
7592 payload: &b"a"[..],
7593 ..RECV_TEMPL
7594 }]
7595 );
7596 send!(
7597 s,
7598 time 3100,
7599 TcpRepr {
7600 seq_number: REMOTE_SEQ + 1,
7601 ack_number: Some(LOCAL_SEQ + 1),
7602 window_len: 0,
7603 ..SEND_TEMPL
7604 }
7605 );
7606
7607 recv_nothing!(s, time 6999);
7608 recv!(
7609 s,
7610 time 7000,
7611 [TcpRepr {
7612 seq_number: LOCAL_SEQ + 1,
7613 ack_number: Some(REMOTE_SEQ + 1),
7614 payload: &b"a"[..],
7615 ..RECV_TEMPL
7616 }]
7617 );
7618 }
7619
7620 #[test]
7621 fn test_zero_window_probe_backoff_no_reply() {
7622 let mut s = socket_established();
7623 s.send_slice(b"abcdef123456!@#$%^").unwrap();
7624 send!(
7625 s,
7626 TcpRepr {
7627 seq_number: REMOTE_SEQ + 1,
7628 ack_number: Some(LOCAL_SEQ + 1),
7629 window_len: 0,
7630 ..SEND_TEMPL
7631 }
7632 );
7633
7634 recv_nothing!(s, time 999);
7635 recv!(
7636 s,
7637 time 1000,
7638 [TcpRepr {
7639 seq_number: LOCAL_SEQ + 1,
7640 ack_number: Some(REMOTE_SEQ + 1),
7641 payload: &b"a"[..],
7642 ..RECV_TEMPL
7643 }]
7644 );
7645
7646 recv_nothing!(s, time 2999);
7647 recv!(
7648 s,
7649 time 3000,
7650 [TcpRepr {
7651 seq_number: LOCAL_SEQ + 1,
7652 ack_number: Some(REMOTE_SEQ + 1),
7653 payload: &b"a"[..],
7654 ..RECV_TEMPL
7655 }]
7656 );
7657 }
7658
7659 #[test]
7660 fn test_zero_window_probe_shift() {
7661 let mut s = socket_established();
7662
7663 s.send_slice(b"abcdef123456!@#$%^").unwrap();
7664 send!(
7665 s,
7666 TcpRepr {
7667 seq_number: REMOTE_SEQ + 1,
7668 ack_number: Some(LOCAL_SEQ + 1),
7669 window_len: 0,
7670 ..SEND_TEMPL
7671 }
7672 );
7673
7674 recv_nothing!(s, time 999);
7675 recv!(
7676 s,
7677 time 1000,
7678 [TcpRepr {
7679 seq_number: LOCAL_SEQ + 1,
7680 ack_number: Some(REMOTE_SEQ + 1),
7681 payload: &b"a"[..],
7682 ..RECV_TEMPL
7683 }]
7684 );
7685
7686 recv_nothing!(s, time 2999);
7687 recv!(
7688 s,
7689 time 3000,
7690 [TcpRepr {
7691 seq_number: LOCAL_SEQ + 1,
7692 ack_number: Some(REMOTE_SEQ + 1),
7693 payload: &b"a"[..],
7694 ..RECV_TEMPL
7695 }]
7696 );
7697
7698 send!(
7701 s,
7702 time 3100,
7703 TcpRepr {
7704 seq_number: REMOTE_SEQ + 1,
7705 ack_number: Some(LOCAL_SEQ + 2),
7706 window_len: 0,
7707 ..SEND_TEMPL
7708 }
7709 );
7710
7711 recv_nothing!(s, time 4099);
7713 recv!(
7714 s,
7715 time 4100,
7716 [TcpRepr {
7717 seq_number: LOCAL_SEQ + 2,
7718 ack_number: Some(REMOTE_SEQ + 1),
7719 payload: &b"b"[..],
7720 ..RECV_TEMPL
7721 }]
7722 );
7723 }
7724
7725 #[test]
7730 fn test_listen_timeout() {
7731 let mut s = socket_listen();
7732 s.set_timeout(Some(Duration::from_millis(100)));
7733 assert_eq!(s.socket.poll_at(&mut s.cx), PollAt::Ingress);
7734 }
7735
7736 #[test]
7737 fn test_connect_timeout() {
7738 let mut s = socket();
7739 s.local_seq_no = LOCAL_SEQ;
7740 s.socket
7741 .connect(&mut s.cx, REMOTE_END, LOCAL_END.port)
7742 .unwrap();
7743 s.set_timeout(Some(Duration::from_millis(100)));
7744 recv!(s, time 150, Ok(TcpRepr {
7745 control: TcpControl::Syn,
7746 seq_number: LOCAL_SEQ,
7747 ack_number: None,
7748 max_seg_size: Some(BASE_MSS),
7749 window_scale: Some(0),
7750 sack_permitted: true,
7751 ..RECV_TEMPL
7752 }));
7753 assert_eq!(s.state, State::SynSent);
7754 assert_eq!(
7755 s.socket.poll_at(&mut s.cx),
7756 PollAt::Time(Instant::from_millis(250))
7757 );
7758 recv!(s, time 250, Ok(TcpRepr {
7759 control: TcpControl::Rst,
7760 seq_number: LOCAL_SEQ + 1,
7761 ack_number: Some(TcpSeqNumber(0)),
7762 window_scale: None,
7763 ..RECV_TEMPL
7764 }));
7765 assert_eq!(s.state, State::Closed);
7766 }
7767
7768 #[test]
7769 fn test_established_timeout() {
7770 let mut s = socket_established();
7771 s.set_timeout(Some(Duration::from_millis(2000)));
7772 recv_nothing!(s, time 250);
7773 assert_eq!(
7774 s.socket.poll_at(&mut s.cx),
7775 PollAt::Time(Instant::from_millis(2250))
7776 );
7777 s.send_slice(b"abcdef").unwrap();
7778 assert_eq!(s.socket.poll_at(&mut s.cx), PollAt::Now);
7779 recv!(s, time 255, Ok(TcpRepr {
7780 seq_number: LOCAL_SEQ + 1,
7781 ack_number: Some(REMOTE_SEQ + 1),
7782 payload: &b"abcdef"[..],
7783 ..RECV_TEMPL
7784 }));
7785 assert_eq!(
7786 s.socket.poll_at(&mut s.cx),
7787 PollAt::Time(Instant::from_millis(1255))
7788 );
7789 recv!(s, time 1255, Ok(TcpRepr {
7790 seq_number: LOCAL_SEQ + 1,
7791 ack_number: Some(REMOTE_SEQ + 1),
7792 payload: &b"abcdef"[..],
7793 ..RECV_TEMPL
7794 }));
7795 assert_eq!(
7796 s.socket.poll_at(&mut s.cx),
7797 PollAt::Time(Instant::from_millis(2255))
7798 );
7799 recv!(s, time 2255, Ok(TcpRepr {
7800 control: TcpControl::Rst,
7801 seq_number: LOCAL_SEQ + 1 + 6,
7802 ack_number: Some(REMOTE_SEQ + 1),
7803 ..RECV_TEMPL
7804 }));
7805 assert_eq!(s.state, State::Closed);
7806 }
7807
7808 #[test]
7809 fn test_established_keep_alive_timeout() {
7810 let mut s = socket_established();
7811 s.set_keep_alive(Some(Duration::from_millis(50)));
7812 s.set_timeout(Some(Duration::from_millis(100)));
7813 recv!(s, time 100, Ok(TcpRepr {
7814 seq_number: LOCAL_SEQ,
7815 ack_number: Some(REMOTE_SEQ + 1),
7816 payload: &[0],
7817 ..RECV_TEMPL
7818 }));
7819 recv_nothing!(s, time 100);
7820 assert_eq!(
7821 s.socket.poll_at(&mut s.cx),
7822 PollAt::Time(Instant::from_millis(150))
7823 );
7824 send!(s, time 105, TcpRepr {
7825 seq_number: REMOTE_SEQ + 1,
7826 ack_number: Some(LOCAL_SEQ + 1),
7827 ..SEND_TEMPL
7828 });
7829 assert_eq!(
7830 s.socket.poll_at(&mut s.cx),
7831 PollAt::Time(Instant::from_millis(155))
7832 );
7833 recv!(s, time 155, Ok(TcpRepr {
7834 seq_number: LOCAL_SEQ,
7835 ack_number: Some(REMOTE_SEQ + 1),
7836 payload: &[0],
7837 ..RECV_TEMPL
7838 }));
7839 recv_nothing!(s, time 155);
7840 assert_eq!(
7841 s.socket.poll_at(&mut s.cx),
7842 PollAt::Time(Instant::from_millis(205))
7843 );
7844 recv_nothing!(s, time 200);
7845 recv!(s, time 205, Ok(TcpRepr {
7846 control: TcpControl::Rst,
7847 seq_number: LOCAL_SEQ + 1,
7848 ack_number: Some(REMOTE_SEQ + 1),
7849 ..RECV_TEMPL
7850 }));
7851 recv_nothing!(s, time 205);
7852 assert_eq!(s.state, State::Closed);
7853 }
7854
7855 #[test]
7856 fn test_fin_wait_1_timeout() {
7857 let mut s = socket_fin_wait_1();
7858 s.set_timeout(Some(Duration::from_millis(1000)));
7859 recv!(s, time 100, Ok(TcpRepr {
7860 control: TcpControl::Fin,
7861 seq_number: LOCAL_SEQ + 1,
7862 ack_number: Some(REMOTE_SEQ + 1),
7863 ..RECV_TEMPL
7864 }));
7865 recv!(s, time 1100, Ok(TcpRepr {
7866 control: TcpControl::Rst,
7867 seq_number: LOCAL_SEQ + 1 + 1,
7868 ack_number: Some(REMOTE_SEQ + 1),
7869 ..RECV_TEMPL
7870 }));
7871 assert_eq!(s.state, State::Closed);
7872 }
7873
7874 #[test]
7875 fn test_last_ack_timeout() {
7876 let mut s = socket_last_ack();
7877 s.set_timeout(Some(Duration::from_millis(1000)));
7878 recv!(s, time 100, Ok(TcpRepr {
7879 control: TcpControl::Fin,
7880 seq_number: LOCAL_SEQ + 1,
7881 ack_number: Some(REMOTE_SEQ + 1 + 1),
7882 ..RECV_TEMPL
7883 }));
7884 recv!(s, time 1100, Ok(TcpRepr {
7885 control: TcpControl::Rst,
7886 seq_number: LOCAL_SEQ + 1 + 1,
7887 ack_number: Some(REMOTE_SEQ + 1 + 1),
7888 ..RECV_TEMPL
7889 }));
7890 assert_eq!(s.state, State::Closed);
7891 }
7892
7893 #[test]
7894 fn test_closed_timeout() {
7895 let mut s = socket_established();
7896 s.set_timeout(Some(Duration::from_millis(200)));
7897 s.remote_last_ts = Some(Instant::from_millis(100));
7898 s.abort();
7899 assert_eq!(s.socket.poll_at(&mut s.cx), PollAt::Now);
7900 recv!(s, time 100, Ok(TcpRepr {
7901 control: TcpControl::Rst,
7902 seq_number: LOCAL_SEQ + 1,
7903 ack_number: Some(REMOTE_SEQ + 1),
7904 ..RECV_TEMPL
7905 }));
7906 assert_eq!(s.socket.poll_at(&mut s.cx), PollAt::Ingress);
7907 }
7908
7909 #[test]
7914 fn test_responds_to_keep_alive() {
7915 let mut s = socket_established();
7916 send!(
7917 s,
7918 TcpRepr {
7919 seq_number: REMOTE_SEQ,
7920 ack_number: Some(LOCAL_SEQ + 1),
7921 ..SEND_TEMPL
7922 },
7923 Some(TcpRepr {
7924 seq_number: LOCAL_SEQ + 1,
7925 ack_number: Some(REMOTE_SEQ + 1),
7926 ..RECV_TEMPL
7927 })
7928 );
7929 }
7930
7931 #[test]
7932 fn test_sends_keep_alive() {
7933 let mut s = socket_established();
7934 s.set_keep_alive(Some(Duration::from_millis(100)));
7935
7936 assert_eq!(s.socket.poll_at(&mut s.cx), PollAt::Now);
7938 recv!(s, time 0, Ok(TcpRepr {
7939 seq_number: LOCAL_SEQ,
7940 ack_number: Some(REMOTE_SEQ + 1),
7941 payload: &[0],
7942 ..RECV_TEMPL
7943 }));
7944
7945 assert_eq!(
7946 s.socket.poll_at(&mut s.cx),
7947 PollAt::Time(Instant::from_millis(100))
7948 );
7949 recv_nothing!(s, time 95);
7950 recv!(s, time 100, Ok(TcpRepr {
7951 seq_number: LOCAL_SEQ,
7952 ack_number: Some(REMOTE_SEQ + 1),
7953 payload: &[0],
7954 ..RECV_TEMPL
7955 }));
7956
7957 assert_eq!(
7958 s.socket.poll_at(&mut s.cx),
7959 PollAt::Time(Instant::from_millis(200))
7960 );
7961 recv_nothing!(s, time 195);
7962 recv!(s, time 200, Ok(TcpRepr {
7963 seq_number: LOCAL_SEQ,
7964 ack_number: Some(REMOTE_SEQ + 1),
7965 payload: &[0],
7966 ..RECV_TEMPL
7967 }));
7968
7969 send!(s, time 250, TcpRepr {
7970 seq_number: REMOTE_SEQ + 1,
7971 ack_number: Some(LOCAL_SEQ + 1),
7972 ..SEND_TEMPL
7973 });
7974 assert_eq!(
7975 s.socket.poll_at(&mut s.cx),
7976 PollAt::Time(Instant::from_millis(350))
7977 );
7978 recv_nothing!(s, time 345);
7979 recv!(s, time 350, Ok(TcpRepr {
7980 seq_number: LOCAL_SEQ,
7981 ack_number: Some(REMOTE_SEQ + 1),
7982 payload: &b"\x00"[..],
7983 ..RECV_TEMPL
7984 }));
7985 }
7986
7987 #[test]
7992 fn test_set_hop_limit() {
7993 let mut s = socket_syn_received();
7994
7995 s.set_hop_limit(Some(0x2a));
7996 assert_eq!(
7997 s.socket.dispatch(&mut s.cx, |_, (ip_repr, _)| {
7998 assert_eq!(ip_repr.hop_limit(), 0x2a);
7999 Ok::<_, ()>(())
8000 }),
8001 Ok(())
8002 );
8003
8004 s.reset();
8007 assert_eq!(s.hop_limit(), Some(0x2a));
8008 }
8009
8010 #[test]
8011 #[should_panic(expected = "the time-to-live value of a packet must not be zero")]
8012 fn test_set_hop_limit_zero() {
8013 let mut s = socket_syn_received();
8014 s.set_hop_limit(Some(0));
8015 }
8016
8017 #[test]
8022 fn test_out_of_order() {
8023 let mut s = socket_established();
8024 send!(
8025 s,
8026 TcpRepr {
8027 seq_number: REMOTE_SEQ + 1 + 3,
8028 ack_number: Some(LOCAL_SEQ + 1),
8029 payload: &b"def"[..],
8030 ..SEND_TEMPL
8031 },
8032 Some(TcpRepr {
8033 seq_number: LOCAL_SEQ + 1,
8034 ack_number: Some(REMOTE_SEQ + 1),
8035 ..RECV_TEMPL
8036 })
8037 );
8038 s.recv(|buffer| {
8039 assert_eq!(buffer, b"");
8040 (buffer.len(), ())
8041 })
8042 .unwrap();
8043 send!(
8044 s,
8045 TcpRepr {
8046 seq_number: REMOTE_SEQ + 1,
8047 ack_number: Some(LOCAL_SEQ + 1),
8048 payload: &b"abcdef"[..],
8049 ..SEND_TEMPL
8050 },
8051 Some(TcpRepr {
8052 seq_number: LOCAL_SEQ + 1,
8053 ack_number: Some(REMOTE_SEQ + 1 + 6),
8054 window_len: 58,
8055 ..RECV_TEMPL
8056 })
8057 );
8058 s.recv(|buffer| {
8059 assert_eq!(buffer, b"abcdef");
8060 (buffer.len(), ())
8061 })
8062 .unwrap();
8063 }
8064
8065 #[test]
8066 fn test_buffer_wraparound_rx() {
8067 let mut s = socket_established();
8068 s.rx_buffer = SocketBuffer::new(vec![0; 6]);
8069 s.assembler = Assembler::new();
8070 send!(
8071 s,
8072 TcpRepr {
8073 seq_number: REMOTE_SEQ + 1,
8074 ack_number: Some(LOCAL_SEQ + 1),
8075 payload: &b"abc"[..],
8076 ..SEND_TEMPL
8077 }
8078 );
8079 s.recv(|buffer| {
8080 assert_eq!(buffer, b"abc");
8081 (buffer.len(), ())
8082 })
8083 .unwrap();
8084 send!(
8085 s,
8086 TcpRepr {
8087 seq_number: REMOTE_SEQ + 1 + 3,
8088 ack_number: Some(LOCAL_SEQ + 1),
8089 payload: &b"defghi"[..],
8090 ..SEND_TEMPL
8091 }
8092 );
8093 let mut data = [0; 6];
8094 assert_eq!(s.recv_slice(&mut data[..]), Ok(6));
8095 assert_eq!(data, &b"defghi"[..]);
8096 }
8097
8098 #[test]
8099 fn test_buffer_wraparound_tx() {
8100 let mut s = socket_established();
8101 s.set_nagle_enabled(false);
8102
8103 s.tx_buffer = SocketBuffer::new(vec![b'.'; 9]);
8104 assert_eq!(s.send_slice(b"xxxyyy"), Ok(6));
8105 assert_eq!(s.tx_buffer.dequeue_many(3), &b"xxx"[..]);
8106 assert_eq!(s.tx_buffer.len(), 3);
8107
8108 assert_eq!(s.send_slice(b"abcdef"), Ok(6));
8110 recv!(
8111 s,
8112 Ok(TcpRepr {
8113 seq_number: LOCAL_SEQ + 1,
8114 ack_number: Some(REMOTE_SEQ + 1),
8115 payload: &b"yyyabc"[..],
8116 ..RECV_TEMPL
8117 })
8118 );
8119 recv!(
8120 s,
8121 Ok(TcpRepr {
8122 seq_number: LOCAL_SEQ + 1 + 6,
8123 ack_number: Some(REMOTE_SEQ + 1),
8124 payload: &b"def"[..],
8125 ..RECV_TEMPL
8126 })
8127 );
8128 }
8129
8130 #[test]
8135 fn test_rx_close_fin() {
8136 let mut s = socket_established();
8137 send!(
8138 s,
8139 TcpRepr {
8140 control: TcpControl::Fin,
8141 seq_number: REMOTE_SEQ + 1,
8142 ack_number: Some(LOCAL_SEQ + 1),
8143 payload: &b"abc"[..],
8144 ..SEND_TEMPL
8145 }
8146 );
8147 s.recv(|data| {
8148 assert_eq!(data, b"abc");
8149 (3, ())
8150 })
8151 .unwrap();
8152 assert_eq!(s.recv(|_| (0, ())), Err(RecvError::Finished));
8153 }
8154
8155 #[test]
8156 fn test_rx_close_fin_in_fin_wait_1() {
8157 let mut s = socket_fin_wait_1();
8158 send!(
8159 s,
8160 TcpRepr {
8161 control: TcpControl::Fin,
8162 seq_number: REMOTE_SEQ + 1,
8163 ack_number: Some(LOCAL_SEQ + 1),
8164 payload: &b"abc"[..],
8165 ..SEND_TEMPL
8166 }
8167 );
8168 assert_eq!(s.state, State::Closing);
8169 s.recv(|data| {
8170 assert_eq!(data, b"abc");
8171 (3, ())
8172 })
8173 .unwrap();
8174 assert_eq!(s.recv(|_| (0, ())), Err(RecvError::Finished));
8175 }
8176
8177 #[test]
8178 fn test_rx_close_fin_in_fin_wait_2() {
8179 let mut s = socket_fin_wait_2();
8180 send!(
8181 s,
8182 TcpRepr {
8183 control: TcpControl::Fin,
8184 seq_number: REMOTE_SEQ + 1,
8185 ack_number: Some(LOCAL_SEQ + 1 + 1),
8186 payload: &b"abc"[..],
8187 ..SEND_TEMPL
8188 }
8189 );
8190 assert_eq!(s.state, State::TimeWait);
8191 s.recv(|data| {
8192 assert_eq!(data, b"abc");
8193 (3, ())
8194 })
8195 .unwrap();
8196 assert_eq!(s.recv(|_| (0, ())), Err(RecvError::Finished));
8197 }
8198
8199 #[test]
8200 fn test_rx_close_fin_with_hole() {
8201 let mut s = socket_established();
8202 send!(
8203 s,
8204 TcpRepr {
8205 seq_number: REMOTE_SEQ + 1,
8206 ack_number: Some(LOCAL_SEQ + 1),
8207 payload: &b"abc"[..],
8208 ..SEND_TEMPL
8209 }
8210 );
8211 send!(
8212 s,
8213 TcpRepr {
8214 control: TcpControl::Fin,
8215 seq_number: REMOTE_SEQ + 1 + 6,
8216 ack_number: Some(LOCAL_SEQ + 1),
8217 payload: &b"ghi"[..],
8218 ..SEND_TEMPL
8219 },
8220 Some(TcpRepr {
8221 seq_number: LOCAL_SEQ + 1,
8222 ack_number: Some(REMOTE_SEQ + 1 + 3),
8223 window_len: 61,
8224 ..RECV_TEMPL
8225 })
8226 );
8227 s.recv(|data| {
8228 assert_eq!(data, b"abc");
8229 (3, ())
8230 })
8231 .unwrap();
8232 s.recv(|data| {
8233 assert_eq!(data, b"");
8234 (0, ())
8235 })
8236 .unwrap();
8237 send!(
8238 s,
8239 TcpRepr {
8240 control: TcpControl::Rst,
8241 seq_number: REMOTE_SEQ + 1 + 9,
8242 ack_number: Some(LOCAL_SEQ + 1),
8243 ..SEND_TEMPL
8244 }
8245 );
8246 assert_eq!(s.recv(|_| (0, ())), Err(RecvError::InvalidState));
8249 }
8250
8251 #[test]
8252 fn test_rx_close_rst() {
8253 let mut s = socket_established();
8254 send!(
8255 s,
8256 TcpRepr {
8257 seq_number: REMOTE_SEQ + 1,
8258 ack_number: Some(LOCAL_SEQ + 1),
8259 payload: &b"abc"[..],
8260 ..SEND_TEMPL
8261 }
8262 );
8263 send!(
8264 s,
8265 TcpRepr {
8266 control: TcpControl::Rst,
8267 seq_number: REMOTE_SEQ + 1 + 3,
8268 ack_number: Some(LOCAL_SEQ + 1),
8269 ..SEND_TEMPL
8270 }
8271 );
8272 s.recv(|data| {
8273 assert_eq!(data, b"abc");
8274 (3, ())
8275 })
8276 .unwrap();
8277 assert_eq!(s.recv(|_| (0, ())), Err(RecvError::InvalidState));
8278 }
8279
8280 #[test]
8281 fn test_rx_close_rst_with_hole() {
8282 let mut s = socket_established();
8283 send!(
8284 s,
8285 TcpRepr {
8286 seq_number: REMOTE_SEQ + 1,
8287 ack_number: Some(LOCAL_SEQ + 1),
8288 payload: &b"abc"[..],
8289 ..SEND_TEMPL
8290 }
8291 );
8292 send!(
8293 s,
8294 TcpRepr {
8295 seq_number: REMOTE_SEQ + 1 + 6,
8296 ack_number: Some(LOCAL_SEQ + 1),
8297 payload: &b"ghi"[..],
8298 ..SEND_TEMPL
8299 },
8300 Some(TcpRepr {
8301 seq_number: LOCAL_SEQ + 1,
8302 ack_number: Some(REMOTE_SEQ + 1 + 3),
8303 window_len: 61,
8304 ..RECV_TEMPL
8305 })
8306 );
8307 send!(
8308 s,
8309 TcpRepr {
8310 control: TcpControl::Rst,
8311 seq_number: REMOTE_SEQ + 1 + 9,
8312 ack_number: Some(LOCAL_SEQ + 1),
8313 ..SEND_TEMPL
8314 }
8315 );
8316 s.recv(|data| {
8317 assert_eq!(data, b"abc");
8318 (3, ())
8319 })
8320 .unwrap();
8321 assert_eq!(s.recv(|_| (0, ())), Err(RecvError::InvalidState));
8322 }
8323
8324 #[test]
8329 fn test_delayed_ack() {
8330 let mut s = socket_established();
8331 s.set_ack_delay(Some(ACK_DELAY_DEFAULT));
8332 send!(
8333 s,
8334 TcpRepr {
8335 seq_number: REMOTE_SEQ + 1,
8336 ack_number: Some(LOCAL_SEQ + 1),
8337 payload: &b"abc"[..],
8338 ..SEND_TEMPL
8339 }
8340 );
8341
8342 recv_nothing!(s);
8344
8345 recv!(s, time 11, Ok(TcpRepr {
8347 seq_number: LOCAL_SEQ + 1,
8348 ack_number: Some(REMOTE_SEQ + 1 + 3),
8349 window_len: 61,
8350 ..RECV_TEMPL
8351 }));
8352 }
8353
8354 #[test]
8355 fn test_delayed_ack_win() {
8356 let mut s = socket_established();
8357 s.set_ack_delay(Some(ACK_DELAY_DEFAULT));
8358 send!(
8359 s,
8360 TcpRepr {
8361 seq_number: REMOTE_SEQ + 1,
8362 ack_number: Some(LOCAL_SEQ + 1),
8363 payload: &b"abc"[..],
8364 ..SEND_TEMPL
8365 }
8366 );
8367
8368 s.recv(|data| {
8370 assert_eq!(data, b"abc");
8371 (3, ())
8372 })
8373 .unwrap();
8374
8375 recv_nothing!(s);
8377
8378 recv!(s, time 11, Ok(TcpRepr {
8380 seq_number: LOCAL_SEQ + 1,
8381 ack_number: Some(REMOTE_SEQ + 1 + 3),
8382 ..RECV_TEMPL
8383 }));
8384 }
8385
8386 #[test]
8387 fn test_delayed_ack_reply() {
8388 let mut s = socket_established();
8389 s.set_ack_delay(Some(ACK_DELAY_DEFAULT));
8390 send!(
8391 s,
8392 TcpRepr {
8393 seq_number: REMOTE_SEQ + 1,
8394 ack_number: Some(LOCAL_SEQ + 1),
8395 payload: &b"abc"[..],
8396 ..SEND_TEMPL
8397 }
8398 );
8399
8400 s.recv(|data| {
8401 assert_eq!(data, b"abc");
8402 (3, ())
8403 })
8404 .unwrap();
8405
8406 s.send_slice(&b"xyz"[..]).unwrap();
8407
8408 recv!(
8411 s,
8412 Ok(TcpRepr {
8413 seq_number: LOCAL_SEQ + 1,
8414 ack_number: Some(REMOTE_SEQ + 1 + 3),
8415 payload: &b"xyz"[..],
8416 ..RECV_TEMPL
8417 })
8418 );
8419 }
8420
8421 #[test]
8422 fn test_delayed_ack_every_rmss() {
8423 let mut s = socket_established_with_buffer_sizes(DEFAULT_MSS * 2, DEFAULT_MSS * 2);
8424 s.set_ack_delay(Some(ACK_DELAY_DEFAULT));
8425 send!(
8426 s,
8427 TcpRepr {
8428 seq_number: REMOTE_SEQ + 1,
8429 ack_number: Some(LOCAL_SEQ + 1),
8430 payload: &[0; DEFAULT_MSS - 1],
8431 ..SEND_TEMPL
8432 }
8433 );
8434
8435 recv_nothing!(s);
8437
8438 send!(
8439 s,
8440 TcpRepr {
8441 seq_number: REMOTE_SEQ + 1 + (DEFAULT_MSS - 1),
8442 ack_number: Some(LOCAL_SEQ + 1),
8443 payload: &b"a"[..],
8444 ..SEND_TEMPL
8445 }
8446 );
8447
8448 recv_nothing!(s);
8450
8451 send!(
8452 s,
8453 TcpRepr {
8454 seq_number: REMOTE_SEQ + 1 + DEFAULT_MSS,
8455 ack_number: Some(LOCAL_SEQ + 1),
8456 payload: &b"a"[..],
8457 ..SEND_TEMPL
8458 }
8459 );
8460
8461 recv!(
8463 s,
8464 Ok(TcpRepr {
8465 seq_number: LOCAL_SEQ + 1,
8466 ack_number: Some(REMOTE_SEQ + 1 + (DEFAULT_MSS + 1)),
8467 window_len: (DEFAULT_MSS - 1) as u16,
8468 ..RECV_TEMPL
8469 })
8470 );
8471 }
8472
8473 #[test]
8474 fn test_delayed_ack_every_rmss_or_more() {
8475 let mut s = socket_established_with_buffer_sizes(DEFAULT_MSS * 2, DEFAULT_MSS * 2);
8476 s.set_ack_delay(Some(ACK_DELAY_DEFAULT));
8477 send!(
8478 s,
8479 TcpRepr {
8480 seq_number: REMOTE_SEQ + 1,
8481 ack_number: Some(LOCAL_SEQ + 1),
8482 payload: &[0; DEFAULT_MSS],
8483 ..SEND_TEMPL
8484 }
8485 );
8486
8487 recv_nothing!(s);
8489
8490 send!(
8491 s,
8492 TcpRepr {
8493 seq_number: REMOTE_SEQ + 1 + DEFAULT_MSS,
8494 ack_number: Some(LOCAL_SEQ + 1),
8495 payload: &b"a"[..],
8496 ..SEND_TEMPL
8497 }
8498 );
8499
8500 send!(
8501 s,
8502 TcpRepr {
8503 seq_number: REMOTE_SEQ + 1 + (DEFAULT_MSS + 1),
8504 ack_number: Some(LOCAL_SEQ + 1),
8505 payload: &b"b"[..],
8506 ..SEND_TEMPL
8507 }
8508 );
8509
8510 recv!(
8512 s,
8513 Ok(TcpRepr {
8514 seq_number: LOCAL_SEQ + 1,
8515 ack_number: Some(REMOTE_SEQ + 1 + (DEFAULT_MSS + 2)),
8516 window_len: (DEFAULT_MSS - 2) as u16,
8517 ..RECV_TEMPL
8518 })
8519 );
8520 }
8521
8522 #[test]
8527 fn test_nagle() {
8528 let mut s = socket_established();
8529 s.remote_mss = 6;
8530
8531 s.send_slice(b"abcdef").unwrap();
8532 recv!(
8533 s,
8534 [TcpRepr {
8535 seq_number: LOCAL_SEQ + 1,
8536 ack_number: Some(REMOTE_SEQ + 1),
8537 payload: &b"abcdef"[..],
8538 ..RECV_TEMPL
8539 }]
8540 );
8541
8542 s.send_slice(b"foobar").unwrap();
8544 recv!(
8545 s,
8546 [TcpRepr {
8547 seq_number: LOCAL_SEQ + 1 + 6,
8548 ack_number: Some(REMOTE_SEQ + 1),
8549 payload: &b"foobar"[..],
8550 ..RECV_TEMPL
8551 }]
8552 );
8553
8554 s.send_slice(b"aaabbbccc").unwrap();
8555 recv!(
8557 s,
8558 [TcpRepr {
8559 seq_number: LOCAL_SEQ + 1 + 6 + 6,
8560 ack_number: Some(REMOTE_SEQ + 1),
8561 payload: &b"aaabbb"[..],
8562 ..RECV_TEMPL
8563 }]
8564 );
8565
8566 send!(
8568 s,
8569 TcpRepr {
8570 seq_number: REMOTE_SEQ + 1,
8571 ack_number: Some(LOCAL_SEQ + 1 + 6 + 6 + 6),
8572 ..SEND_TEMPL
8573 }
8574 );
8575
8576 recv!(
8578 s,
8579 [TcpRepr {
8580 seq_number: LOCAL_SEQ + 1 + 6 + 6 + 6,
8581 ack_number: Some(REMOTE_SEQ + 1),
8582 payload: &b"ccc"[..],
8583 ..RECV_TEMPL
8584 }]
8585 );
8586 }
8587
8588 #[test]
8589 fn test_final_packet_in_stream_doesnt_wait_for_nagle() {
8590 let mut s = socket_established();
8591 s.remote_mss = 6;
8592 s.send_slice(b"abcdef0").unwrap();
8593 s.socket.close();
8594
8595 recv!(s, time 0, Ok(TcpRepr {
8596 control: TcpControl::None,
8597 seq_number: LOCAL_SEQ + 1,
8598 ack_number: Some(REMOTE_SEQ + 1),
8599 payload: &b"abcdef"[..],
8600 ..RECV_TEMPL
8601 }), exact);
8602 recv!(s, time 0, Ok(TcpRepr {
8603 control: TcpControl::Fin,
8604 seq_number: LOCAL_SEQ + 1 + 6,
8605 ack_number: Some(REMOTE_SEQ + 1),
8606 payload: &b"0"[..],
8607 ..RECV_TEMPL
8608 }), exact);
8609 }
8610
8611 #[test]
8616 fn test_doesnt_accept_wrong_port() {
8617 let mut s = socket_established();
8618 s.rx_buffer = SocketBuffer::new(vec![0; 6]);
8619 s.assembler = Assembler::new();
8620
8621 let tcp_repr = TcpRepr {
8622 seq_number: REMOTE_SEQ + 1,
8623 ack_number: Some(LOCAL_SEQ + 1),
8624 dst_port: LOCAL_PORT + 1,
8625 ..SEND_TEMPL
8626 };
8627 assert!(!s.socket.accepts(&mut s.cx, &SEND_IP_TEMPL, &tcp_repr));
8628
8629 let tcp_repr = TcpRepr {
8630 seq_number: REMOTE_SEQ + 1,
8631 ack_number: Some(LOCAL_SEQ + 1),
8632 src_port: REMOTE_PORT + 1,
8633 ..SEND_TEMPL
8634 };
8635 assert!(!s.socket.accepts(&mut s.cx, &SEND_IP_TEMPL, &tcp_repr));
8636 }
8637
8638 #[test]
8639 fn test_doesnt_accept_wrong_ip() {
8640 let mut s = socket_established();
8641
8642 let tcp_repr = TcpRepr {
8643 seq_number: REMOTE_SEQ + 1,
8644 ack_number: Some(LOCAL_SEQ + 1),
8645 payload: &b"abcdef"[..],
8646 ..SEND_TEMPL
8647 };
8648
8649 let ip_repr = IpReprIpvX(IpvXRepr {
8650 src_addr: REMOTE_ADDR,
8651 dst_addr: LOCAL_ADDR,
8652 next_header: IpProtocol::Tcp,
8653 payload_len: tcp_repr.buffer_len(),
8654 hop_limit: 64,
8655 });
8656 assert!(s.socket.accepts(&mut s.cx, &ip_repr, &tcp_repr));
8657
8658 let ip_repr_wrong_src = IpReprIpvX(IpvXRepr {
8659 src_addr: OTHER_ADDR,
8660 dst_addr: LOCAL_ADDR,
8661 next_header: IpProtocol::Tcp,
8662 payload_len: tcp_repr.buffer_len(),
8663 hop_limit: 64,
8664 });
8665 assert!(!s.socket.accepts(&mut s.cx, &ip_repr_wrong_src, &tcp_repr));
8666
8667 let ip_repr_wrong_dst = IpReprIpvX(IpvXRepr {
8668 src_addr: REMOTE_ADDR,
8669 dst_addr: OTHER_ADDR,
8670 next_header: IpProtocol::Tcp,
8671 payload_len: tcp_repr.buffer_len(),
8672 hop_limit: 64,
8673 });
8674 assert!(!s.socket.accepts(&mut s.cx, &ip_repr_wrong_dst, &tcp_repr));
8675 }
8676
8677 #[test]
8682 fn test_timer_retransmit() {
8683 const RTO: Duration = Duration::from_millis(100);
8684 let mut r = Timer::new();
8685 assert!(!r.should_retransmit(Instant::from_secs(1)));
8686 r.set_for_retransmit(Instant::from_millis(1000), RTO);
8687 assert!(!r.should_retransmit(Instant::from_millis(1000)));
8688 assert!(!r.should_retransmit(Instant::from_millis(1050)));
8689 assert!(r.should_retransmit(Instant::from_millis(1101)));
8690 r.set_for_retransmit(Instant::from_millis(1101), RTO);
8691 assert!(!r.should_retransmit(Instant::from_millis(1101)));
8692 assert!(!r.should_retransmit(Instant::from_millis(1150)));
8693 assert!(!r.should_retransmit(Instant::from_millis(1200)));
8694 assert!(r.should_retransmit(Instant::from_millis(1301)));
8695 r.set_for_idle(Instant::from_millis(1301), None);
8696 assert!(!r.should_retransmit(Instant::from_millis(1350)));
8697 }
8698
8699 #[test]
8700 fn test_rtt_estimator() {
8701 let mut r = RttEstimator::default();
8702
8703 let rtos = &[
8704 6000, 5000, 4252, 3692, 3272, 2956, 2720, 2540, 2408, 2308, 2232, 2176, 2132, 2100,
8705 2076, 2060, 2048, 2036, 2028, 2024, 2020, 2016, 2012, 2012,
8706 ];
8707
8708 for &rto in rtos {
8709 r.sample(2000);
8710 assert_eq!(r.retransmission_timeout(), Duration::from_millis(rto));
8711 }
8712 }
8713
8714 #[test]
8715 fn test_set_get_congestion_control() {
8716 let mut s = socket_established();
8717
8718 #[cfg(feature = "socket-tcp-reno")]
8719 {
8720 s.set_congestion_control(CongestionControl::Reno);
8721 assert_eq!(s.congestion_control(), CongestionControl::Reno);
8722 }
8723
8724 #[cfg(feature = "socket-tcp-cubic")]
8725 {
8726 s.set_congestion_control(CongestionControl::Cubic);
8727 assert_eq!(s.congestion_control(), CongestionControl::Cubic);
8728 }
8729
8730 s.set_congestion_control(CongestionControl::None);
8731 assert_eq!(s.congestion_control(), CongestionControl::None);
8732 }
8733
8734 #[test]
8739 fn test_tsval_established_connection() {
8740 let mut s = socket_established();
8741 s.set_tsval_generator(Some(|| 1));
8742
8743 assert!(s.timestamp_enabled());
8744
8745 s.send_slice(b"abcdef").unwrap();
8747 recv!(
8748 s,
8749 [TcpRepr {
8750 seq_number: LOCAL_SEQ + 1,
8751 ack_number: Some(REMOTE_SEQ + 1),
8752 payload: &b"abcdef"[..],
8753 timestamp: Some(TcpTimestampRepr::new(1, 0)),
8754 ..RECV_TEMPL
8755 }]
8756 );
8757 assert_eq!(s.tx_buffer.len(), 6);
8758 send!(
8759 s,
8760 TcpRepr {
8761 seq_number: REMOTE_SEQ + 1,
8762 ack_number: Some(LOCAL_SEQ + 1 + 6),
8763 timestamp: Some(TcpTimestampRepr::new(500, 1)),
8764 ..SEND_TEMPL
8765 }
8766 );
8767 assert_eq!(s.tx_buffer.len(), 0);
8768 s.send_slice(b"foobar").unwrap();
8770 recv!(
8771 s,
8772 [TcpRepr {
8773 seq_number: LOCAL_SEQ + 1 + 6,
8774 ack_number: Some(REMOTE_SEQ + 1),
8775 payload: &b"foobar"[..],
8776 timestamp: Some(TcpTimestampRepr::new(1, 500)),
8777 ..RECV_TEMPL
8778 }]
8779 );
8780 send!(
8781 s,
8782 TcpRepr {
8783 seq_number: REMOTE_SEQ + 1,
8784 ack_number: Some(LOCAL_SEQ + 1 + 6 + 6),
8785 ..SEND_TEMPL
8786 }
8787 );
8788 assert_eq!(s.tx_buffer.len(), 0);
8789 }
8790
8791 #[test]
8792 fn test_tsval_disabled_in_remote_client() {
8793 let mut s = socket_listen();
8794 s.set_tsval_generator(Some(|| 1));
8795 assert!(s.timestamp_enabled());
8796 send!(
8797 s,
8798 TcpRepr {
8799 control: TcpControl::Syn,
8800 seq_number: REMOTE_SEQ,
8801 ack_number: None,
8802 ..SEND_TEMPL
8803 }
8804 );
8805 assert_eq!(s.state(), State::SynReceived);
8806 assert_eq!(s.tuple, Some(TUPLE));
8807 assert!(!s.timestamp_enabled());
8808 recv!(
8809 s,
8810 [TcpRepr {
8811 control: TcpControl::Syn,
8812 seq_number: LOCAL_SEQ,
8813 ack_number: Some(REMOTE_SEQ + 1),
8814 max_seg_size: Some(BASE_MSS),
8815 ..RECV_TEMPL
8816 }]
8817 );
8818 send!(
8819 s,
8820 TcpRepr {
8821 seq_number: REMOTE_SEQ + 1,
8822 ack_number: Some(LOCAL_SEQ + 1),
8823 ..SEND_TEMPL
8824 }
8825 );
8826 assert_eq!(s.state(), State::Established);
8827 assert_eq!(s.local_seq_no, LOCAL_SEQ + 1);
8828 assert_eq!(s.remote_seq_no, REMOTE_SEQ + 1);
8829 }
8830
8831 #[test]
8832 fn test_tsval_disabled_in_local_server() {
8833 let mut s = socket_listen();
8834 assert!(!s.timestamp_enabled());
8836 send!(
8837 s,
8838 TcpRepr {
8839 control: TcpControl::Syn,
8840 seq_number: REMOTE_SEQ,
8841 ack_number: None,
8842 timestamp: Some(TcpTimestampRepr::new(500, 0)),
8843 ..SEND_TEMPL
8844 }
8845 );
8846 assert_eq!(s.state(), State::SynReceived);
8847 assert_eq!(s.tuple, Some(TUPLE));
8848 assert!(!s.timestamp_enabled());
8849 recv!(
8850 s,
8851 [TcpRepr {
8852 control: TcpControl::Syn,
8853 seq_number: LOCAL_SEQ,
8854 ack_number: Some(REMOTE_SEQ + 1),
8855 max_seg_size: Some(BASE_MSS),
8856 ..RECV_TEMPL
8857 }]
8858 );
8859 send!(
8860 s,
8861 TcpRepr {
8862 seq_number: REMOTE_SEQ + 1,
8863 ack_number: Some(LOCAL_SEQ + 1),
8864 ..SEND_TEMPL
8865 }
8866 );
8867 assert_eq!(s.state(), State::Established);
8868 assert_eq!(s.local_seq_no, LOCAL_SEQ + 1);
8869 assert_eq!(s.remote_seq_no, REMOTE_SEQ + 1);
8870 }
8871
8872 #[test]
8873 fn test_tsval_disabled_in_remote_server() {
8874 let mut s = socket();
8875 s.set_tsval_generator(Some(|| 1));
8876 assert!(s.timestamp_enabled());
8877 s.local_seq_no = LOCAL_SEQ;
8878 s.socket
8879 .connect(&mut s.cx, REMOTE_END, LOCAL_END.port)
8880 .unwrap();
8881 assert_eq!(s.tuple, Some(TUPLE));
8882 recv!(
8883 s,
8884 [TcpRepr {
8885 control: TcpControl::Syn,
8886 seq_number: LOCAL_SEQ,
8887 ack_number: None,
8888 max_seg_size: Some(BASE_MSS),
8889 window_scale: Some(0),
8890 sack_permitted: true,
8891 timestamp: Some(TcpTimestampRepr::new(1, 0)),
8892 ..RECV_TEMPL
8893 }]
8894 );
8895 send!(
8896 s,
8897 TcpRepr {
8898 control: TcpControl::Syn,
8899 seq_number: REMOTE_SEQ,
8900 ack_number: Some(LOCAL_SEQ + 1),
8901 max_seg_size: Some(BASE_MSS - 80),
8902 window_scale: Some(0),
8903 timestamp: None,
8904 ..SEND_TEMPL
8905 }
8906 );
8907 assert!(!s.timestamp_enabled());
8908 s.send_slice(b"abcdef").unwrap();
8909 recv!(
8910 s,
8911 [TcpRepr {
8912 seq_number: LOCAL_SEQ + 1,
8913 ack_number: Some(REMOTE_SEQ + 1),
8914 payload: &b"abcdef"[..],
8915 timestamp: None,
8916 ..RECV_TEMPL
8917 }]
8918 );
8919 }
8920
8921 #[test]
8922 fn test_tsval_disabled_in_local_client() {
8923 let mut s = socket();
8924 assert!(!s.timestamp_enabled());
8926 s.local_seq_no = LOCAL_SEQ;
8927 s.socket
8928 .connect(&mut s.cx, REMOTE_END, LOCAL_END.port)
8929 .unwrap();
8930 assert_eq!(s.tuple, Some(TUPLE));
8931 recv!(
8932 s,
8933 [TcpRepr {
8934 control: TcpControl::Syn,
8935 seq_number: LOCAL_SEQ,
8936 ack_number: None,
8937 max_seg_size: Some(BASE_MSS),
8938 window_scale: Some(0),
8939 sack_permitted: true,
8940 ..RECV_TEMPL
8941 }]
8942 );
8943 send!(
8944 s,
8945 TcpRepr {
8946 control: TcpControl::Syn,
8947 seq_number: REMOTE_SEQ,
8948 ack_number: Some(LOCAL_SEQ + 1),
8949 max_seg_size: Some(BASE_MSS - 80),
8950 window_scale: Some(0),
8951 timestamp: Some(TcpTimestampRepr::new(500, 0)),
8952 ..SEND_TEMPL
8953 }
8954 );
8955 assert!(!s.timestamp_enabled());
8956 s.send_slice(b"abcdef").unwrap();
8957 recv!(
8958 s,
8959 [TcpRepr {
8960 seq_number: LOCAL_SEQ + 1,
8961 ack_number: Some(REMOTE_SEQ + 1),
8962 payload: &b"abcdef"[..],
8963 timestamp: None,
8964 ..RECV_TEMPL
8965 }]
8966 );
8967 }
8968
8969 #[test]
8974 fn test_established_close_on_src_ip_change() {
8975 let mut s = socket_established();
8976
8977 s.send_slice(b"abc").unwrap();
8979 recv!(
8980 s,
8981 [TcpRepr {
8982 seq_number: LOCAL_SEQ + 1,
8983 ack_number: Some(REMOTE_SEQ + 1),
8984 payload: &b"abc"[..],
8985 ..RECV_TEMPL
8986 }]
8987 );
8988
8989 let mut new_addrs = heapless::Vec::<IpCidr, IFACE_MAX_ADDR_COUNT>::new();
8992 new_addrs.push(IpCidr::new(OTHER_ADDR.into(), 24)).unwrap();
8993 s.cx.set_ip_addrs(new_addrs);
8994
8995 s.send_slice(b"def").unwrap();
8999 recv_nothing!(s);
9000 assert_eq!(s.state, State::Closed);
9001 }
9002}