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 if let Some(last_seg_seq) = self.local_rx_last_seq.map(|s| s.0 as u32) {
1479 reply_repr.sack_ranges[0] = self
1480 .assembler
1481 .iter_data(reply_repr.ack_number.map(|s| s.0 as usize).unwrap_or(0))
1482 .map(|(left, right)| (left as u32, right as u32))
1483 .find(|(left, right)| *left <= last_seg_seq && *right >= last_seg_seq);
1484 }
1485
1486 if reply_repr.sack_ranges[0].is_none() {
1487 reply_repr.sack_ranges[0] = self
1495 .assembler
1496 .iter_data(reply_repr.ack_number.map(|s| s.0 as usize).unwrap_or(0))
1497 .map(|(left, right)| (left as u32, right as u32))
1498 .next();
1499 }
1500 }
1501
1502 ip_reply_repr.set_payload_len(reply_repr.buffer_len());
1504 (ip_reply_repr, reply_repr)
1505 }
1506
1507 fn challenge_ack_reply(
1508 &mut self,
1509 cx: &mut Context,
1510 ip_repr: &IpRepr,
1511 repr: &TcpRepr,
1512 ) -> Option<(IpRepr, TcpRepr<'static>)> {
1513 if cx.now() < self.challenge_ack_timer {
1514 return None;
1515 }
1516
1517 self.challenge_ack_timer = cx.now() + Duration::from_secs(1);
1519
1520 Some(self.ack_reply(ip_repr, repr))
1521 }
1522
1523 pub(crate) fn accepts(&self, _cx: &mut Context, ip_repr: &IpRepr, repr: &TcpRepr) -> bool {
1524 if self.state == State::Closed {
1525 return false;
1526 }
1527
1528 if self.state == State::Listen
1532 && (repr.ack_number.is_some() || repr.control == TcpControl::Rst)
1533 {
1534 return false;
1535 }
1536
1537 if let Some(tuple) = &self.tuple {
1538 ip_repr.dst_addr() == tuple.local.addr
1540 && repr.dst_port == tuple.local.port
1541 && ip_repr.src_addr() == tuple.remote.addr
1542 && repr.src_port == tuple.remote.port
1543 } else {
1544 let addr_ok = match self.listen_endpoint.addr {
1546 Some(addr) => ip_repr.dst_addr() == addr,
1547 None => true,
1548 };
1549 addr_ok && repr.dst_port != 0 && repr.dst_port == self.listen_endpoint.port
1550 }
1551 }
1552
1553 pub(crate) fn process(
1554 &mut self,
1555 cx: &mut Context,
1556 ip_repr: &IpRepr,
1557 repr: &TcpRepr,
1558 ) -> Option<(IpRepr, TcpRepr<'static>)> {
1559 debug_assert!(self.accepts(cx, ip_repr, repr));
1560
1561 let (sent_syn, sent_fin) = match self.state {
1563 State::SynSent | State::SynReceived => (true, false),
1565 State::FinWait1 | State::LastAck | State::Closing => (false, true),
1567 _ => (false, false),
1570 };
1571 let control_len = (sent_syn as usize) + (sent_fin as usize);
1572
1573 match (self.state, repr.control, repr.ack_number) {
1575 (State::SynSent, TcpControl::Rst, None) => {
1578 net_debug!("unacceptable RST (expecting RST|ACK) in response to initial SYN");
1579 return None;
1580 }
1581 (State::SynSent, TcpControl::Rst, Some(ack_number)) => {
1582 if ack_number != self.local_seq_no + 1 {
1583 net_debug!("unacceptable RST|ACK in response to initial SYN");
1584 return None;
1585 }
1586 }
1587 (_, TcpControl::Rst, _) => (),
1589 (State::Listen, _, None) => (),
1591 (State::Listen, _, Some(_)) => unreachable!(),
1593 (State::SynSent, TcpControl::Syn, Some(ack_number)) => {
1595 if ack_number != self.local_seq_no + 1 {
1596 net_debug!("unacceptable SYN|ACK in response to initial SYN");
1597 return Some(Self::rst_reply(ip_repr, repr));
1598 }
1599 }
1600 (State::SynSent, TcpControl::Syn, None) => (),
1604 (State::SynSent, TcpControl::None, Some(ack_number)) => {
1606 if ack_number == self.local_seq_no + 1 {
1611 net_debug!(
1612 "expecting a SYN|ACK, received an ACK with the right ack_number, ignoring."
1613 );
1614 return None;
1615 }
1616
1617 net_debug!(
1618 "expecting a SYN|ACK, received an ACK with the wrong ack_number, sending RST."
1619 );
1620 return Some(Self::rst_reply(ip_repr, repr));
1621 }
1622 (State::SynSent, _, _) => {
1624 net_debug!("expecting a SYN|ACK");
1625 return None;
1626 }
1627 (_, _, None) => {
1629 net_debug!("expecting an ACK");
1630 return None;
1631 }
1632 (State::SynReceived, _, Some(ack_number)) => {
1634 if ack_number != self.local_seq_no + 1 {
1635 net_debug!("unacceptable ACK in response to SYN|ACK");
1636 return Some(Self::rst_reply(ip_repr, repr));
1637 }
1638 }
1639 (_, _, Some(ack_number)) => {
1641 let unacknowledged = self.tx_buffer.len() + control_len;
1642
1643 let mut ack_min = self.local_seq_no;
1645 let ack_max = self.local_seq_no + unacknowledged;
1646
1647 if sent_syn {
1649 ack_min += 1;
1650 }
1651
1652 if ack_number < ack_min {
1653 net_debug!(
1654 "duplicate ACK ({} not in {}...{})",
1655 ack_number,
1656 ack_min,
1657 ack_max
1658 );
1659 return None;
1660 }
1661
1662 if ack_number > ack_max {
1663 net_debug!(
1664 "unacceptable ACK ({} not in {}...{})",
1665 ack_number,
1666 ack_min,
1667 ack_max
1668 );
1669 return self.challenge_ack_reply(cx, ip_repr, repr);
1670 }
1671 }
1672 }
1673
1674 let window_start = self.remote_seq_no + self.rx_buffer.len();
1675 let window_end = if let Some(last_ack) = self.remote_last_ack {
1676 last_ack + ((self.remote_last_win as usize) << self.remote_win_shift)
1677 } else {
1678 window_start
1679 };
1680 let segment_start = repr.seq_number;
1681 let segment_end = repr.seq_number + repr.payload.len();
1682
1683 let (payload, payload_offset) = match self.state {
1684 State::Listen | State::SynSent => (&[][..], 0),
1686 _ => {
1687 let segment_in_window = match (
1689 segment_start == segment_end,
1690 window_start == window_end,
1691 ) {
1692 (true, _) if segment_end == window_start - 1 => {
1693 net_debug!(
1694 "received a keep-alive or window probe packet, will send an ACK"
1695 );
1696 false
1697 }
1698 (true, true) => {
1699 if window_start == segment_start {
1700 true
1701 } else {
1702 net_debug!(
1703 "zero-length segment not inside zero-length window, will send an ACK."
1704 );
1705 false
1706 }
1707 }
1708 (true, false) => {
1709 if window_start <= segment_start && segment_start < window_end {
1710 true
1711 } else {
1712 net_debug!("zero-length segment not inside window, will send an ACK.");
1713 false
1714 }
1715 }
1716 (false, true) => {
1717 net_debug!(
1718 "non-zero-length segment with zero receive window, will only send an ACK"
1719 );
1720 false
1721 }
1722 (false, false) => {
1723 if (window_start <= segment_start && segment_start < window_end)
1724 || (window_start < segment_end && segment_end <= window_end)
1725 {
1726 true
1727 } else {
1728 net_debug!(
1729 "segment not in receive window ({}..{} not intersecting {}..{}), will send challenge ACK",
1730 segment_start,
1731 segment_end,
1732 window_start,
1733 window_end
1734 );
1735 false
1736 }
1737 }
1738 };
1739
1740 if segment_in_window {
1741 let overlap_start = window_start.max(segment_start);
1742 let overlap_end = window_end.min(segment_end);
1743
1744 debug_assert!(overlap_start <= overlap_end);
1746
1747 self.local_rx_last_seq = Some(repr.seq_number);
1748
1749 (
1750 &repr.payload[overlap_start - segment_start..overlap_end - segment_start],
1751 overlap_start - window_start,
1752 )
1753 } else {
1754 if self.state == State::TimeWait {
1757 self.timer.set_for_close(cx.now());
1758 }
1759
1760 return self.challenge_ack_reply(cx, ip_repr, repr);
1761 }
1762 }
1763 };
1764
1765 let mut ack_len = 0;
1768 let mut ack_of_fin = false;
1769 let mut ack_all = false;
1770 if repr.control != TcpControl::Rst
1771 && let Some(ack_number) = repr.ack_number
1772 {
1773 let tx_buffer_start_seq = self.local_seq_no + (sent_syn as usize);
1777
1778 if ack_number >= tx_buffer_start_seq {
1779 ack_len = ack_number - tx_buffer_start_seq;
1780
1781 if sent_fin && self.tx_buffer.len() + 1 == ack_len {
1784 ack_len -= 1;
1785 tcp_trace!("received ACK of FIN");
1786 ack_of_fin = true;
1787 }
1788
1789 ack_all = self.remote_last_seq <= ack_number;
1790 }
1791
1792 self.rtte.on_ack(cx.now(), ack_number);
1793 self.congestion_controller
1794 .inner_mut()
1795 .on_ack(cx.now(), ack_len, &self.rtte);
1796 }
1797
1798 let mut control = repr.control;
1800 control = control.quash_psh();
1801
1802 if control == TcpControl::Fin && window_start < segment_start {
1805 tcp_trace!(
1806 "ignoring FIN because we don't have full data yet. window_start={} segment_start={}",
1807 window_start,
1808 segment_start
1809 );
1810 control = TcpControl::None;
1811 }
1812
1813 match (self.state, control) {
1815 (State::Listen, TcpControl::Rst) => return None,
1817
1818 (State::SynReceived, TcpControl::Rst) if self.listen_endpoint.port != 0 => {
1823 tcp_trace!("received RST");
1824 self.tuple = None;
1825 self.set_state(State::Listen);
1826 return None;
1827 }
1828
1829 (_, TcpControl::Rst) => {
1831 tcp_trace!("received RST");
1832 self.set_state(State::Closed);
1833 self.tuple = None;
1834 return None;
1835 }
1836
1837 (State::Listen, TcpControl::Syn) => {
1839 tcp_trace!("received SYN");
1840 if let Some(max_seg_size) = repr.max_seg_size {
1841 if max_seg_size == 0 {
1842 tcp_trace!("received SYNACK with zero MSS, ignoring");
1843 return None;
1844 }
1845 self.congestion_controller
1846 .inner_mut()
1847 .set_mss(max_seg_size as usize);
1848 self.remote_mss = max_seg_size as usize
1849 }
1850
1851 self.tuple = Some(Tuple {
1852 local: IpEndpoint::new(ip_repr.dst_addr(), repr.dst_port),
1853 remote: IpEndpoint::new(ip_repr.src_addr(), repr.src_port),
1854 });
1855 self.local_seq_no = Self::random_seq_no(cx);
1856 self.remote_seq_no = repr.seq_number + 1;
1857 self.remote_last_seq = self.local_seq_no;
1858 self.remote_has_sack = repr.sack_permitted;
1859 self.remote_win_scale = repr.window_scale;
1860 if self.remote_win_scale.is_none() {
1862 self.remote_win_shift = 0;
1863 }
1864 if repr.timestamp.is_none() {
1866 self.tsval_generator = None;
1867 }
1868 self.set_state(State::SynReceived);
1869 self.timer.set_for_idle(cx.now(), self.keep_alive);
1870 }
1871
1872 (State::SynReceived, TcpControl::None) => {
1874 self.set_state(State::Established);
1875 }
1876
1877 (State::SynReceived, TcpControl::Fin) => {
1881 self.remote_seq_no += 1;
1882 self.rx_fin_received = true;
1883 self.set_state(State::CloseWait);
1884 }
1885
1886 (State::SynSent, TcpControl::Syn) => {
1889 if repr.ack_number.is_some() {
1890 tcp_trace!("received SYN|ACK");
1891 } else {
1892 tcp_trace!("received SYN");
1893 }
1894 if let Some(max_seg_size) = repr.max_seg_size {
1895 if max_seg_size == 0 {
1896 tcp_trace!("received SYNACK with zero MSS, ignoring");
1897 return None;
1898 }
1899 self.remote_mss = max_seg_size as usize;
1900 self.congestion_controller
1901 .inner_mut()
1902 .set_mss(self.remote_mss);
1903 }
1904
1905 self.remote_seq_no = repr.seq_number + 1;
1906 self.remote_last_seq = self.local_seq_no + 1;
1907 self.remote_last_ack = Some(repr.seq_number);
1908 self.remote_has_sack = repr.sack_permitted;
1909 self.remote_win_scale = repr.window_scale;
1910 if self.remote_win_scale.is_none() {
1912 self.remote_win_shift = 0;
1913 }
1914 if repr.timestamp.is_none() {
1916 self.tsval_generator = None;
1917 }
1918
1919 if repr.ack_number.is_some() {
1920 self.set_state(State::Established);
1921 } else {
1922 self.set_state(State::SynReceived);
1923 }
1924 }
1925
1926 (State::Established, TcpControl::None) => {}
1927
1928 (State::Established, TcpControl::Fin) => {
1930 self.remote_seq_no += 1;
1931 self.rx_fin_received = true;
1932 self.set_state(State::CloseWait);
1933 }
1934
1935 (State::FinWait1, TcpControl::None) => {
1938 if ack_of_fin {
1939 self.set_state(State::FinWait2);
1940 }
1941 }
1942
1943 (State::FinWait1, TcpControl::Fin) => {
1946 self.remote_seq_no += 1;
1947 self.rx_fin_received = true;
1948 if ack_of_fin {
1949 self.set_state(State::TimeWait);
1950 self.timer.set_for_close(cx.now());
1951 } else {
1952 self.set_state(State::Closing);
1953 }
1954 }
1955
1956 (State::FinWait2, TcpControl::None) => {}
1957
1958 (State::FinWait2, TcpControl::Fin) => {
1960 self.remote_seq_no += 1;
1961 self.rx_fin_received = true;
1962 self.set_state(State::TimeWait);
1963 self.timer.set_for_close(cx.now());
1964 }
1965
1966 (State::Closing, TcpControl::None) => {
1968 if ack_of_fin {
1969 self.set_state(State::TimeWait);
1970 self.timer.set_for_close(cx.now());
1971 }
1972 }
1973
1974 (State::CloseWait, TcpControl::None) => {}
1975
1976 (State::LastAck, TcpControl::None) => {
1978 if ack_of_fin {
1979 self.set_state(State::Closed);
1981 self.tuple = None;
1982 } else if ack_len == 0 {
1983 return self.challenge_ack_reply(cx, ip_repr, repr);
1986 }
1987 }
1989
1990 _ => {
1991 net_debug!("unexpected packet {}", repr);
1992 return None;
1993 }
1994 }
1995
1996 self.remote_last_ts = Some(cx.now());
1998
1999 let scale = match repr.control {
2002 TcpControl::Syn => 0,
2003 _ => self.remote_win_scale.unwrap_or(0),
2004 };
2005 let new_remote_win_len = (repr.window_len as usize) << (scale as usize);
2006 let is_window_update = new_remote_win_len != self.remote_win_len;
2007 self.remote_win_len = new_remote_win_len;
2008
2009 self.congestion_controller
2010 .inner_mut()
2011 .set_remote_window(new_remote_win_len);
2012
2013 if ack_len > 0 {
2014 debug_assert!(self.tx_buffer.len() >= ack_len);
2016 tcp_trace!(
2017 "tx buffer: dequeueing {} octets (now {})",
2018 ack_len,
2019 self.tx_buffer.len() - ack_len
2020 );
2021 self.tx_buffer.dequeue_allocated(ack_len);
2022
2023 #[cfg(feature = "async")]
2025 self.tx_waker.wake();
2026 }
2027
2028 if let Some(ack_number) = repr.ack_number {
2029 match self.local_rx_last_ack {
2037 Some(last_rx_ack)
2041 if repr.payload.is_empty()
2042 && last_rx_ack == ack_number
2043 && ack_number < self.remote_last_seq
2044 && !is_window_update =>
2045 {
2046 self.local_rx_dup_acks = self.local_rx_dup_acks.saturating_add(1);
2048
2049 self.congestion_controller
2051 .inner_mut()
2052 .on_duplicate_ack(cx.now());
2053
2054 net_debug!(
2055 "received duplicate ACK for seq {} (duplicate nr {}{})",
2056 ack_number,
2057 self.local_rx_dup_acks,
2058 if self.local_rx_dup_acks == u8::MAX {
2059 "+"
2060 } else {
2061 ""
2062 }
2063 );
2064
2065 if self.local_rx_dup_acks == 3 {
2066 self.timer.set_for_fast_retransmit();
2067 net_debug!("started fast retransmit");
2068 }
2069 }
2070 _ => {
2072 if self.local_rx_dup_acks > 0 {
2073 self.local_rx_dup_acks = 0;
2074 net_debug!("reset duplicate ACK count");
2075 }
2076 self.local_rx_last_ack = Some(ack_number);
2077 }
2078 };
2079 self.local_seq_no = ack_number;
2082 if self.remote_last_seq < self.local_seq_no {
2088 self.remote_last_seq = self.local_seq_no
2089 }
2090 }
2091
2092 if let Some(timestamp) = repr.timestamp {
2094 self.last_remote_tsval = timestamp.tsval;
2095 }
2096
2097 match self.timer {
2099 Timer::Retransmit { .. } | Timer::FastRetransmit => {
2100 if ack_all {
2101 self.timer.set_for_idle(cx.now(), self.keep_alive);
2103 } else if ack_len > 0 {
2104 let rto = self.rtte.retransmission_timeout();
2106 self.timer.set_for_retransmit(cx.now(), rto);
2107 }
2108 }
2109 Timer::Idle { .. } => {
2110 self.timer.set_for_idle(cx.now(), self.keep_alive);
2112 }
2113 _ => {}
2114 }
2115
2116 if self.remote_win_len == 0
2118 && !self.tx_buffer.is_empty()
2119 && (self.timer.is_idle() || ack_len > 0)
2120 {
2121 let delay = self.rtte.retransmission_timeout();
2122 tcp_trace!("starting zero-window-probe timer for t+{}", delay);
2123 self.timer.set_for_zero_window_probe(cx.now(), delay);
2124 }
2125 if self.remote_win_len != 0 && self.timer.is_zero_window_probe() {
2126 tcp_trace!("stopping zero-window-probe timer");
2127 self.timer.set_for_idle(cx.now(), self.keep_alive);
2128 }
2129
2130 let payload_len = payload.len();
2131 if payload_len == 0 {
2132 return None;
2133 }
2134
2135 let assembler_was_empty = self.assembler.is_empty();
2136
2137 let Ok(contig_len) = self
2139 .assembler
2140 .add_then_remove_front(payload_offset, payload_len)
2141 else {
2142 net_debug!(
2143 "assembler: too many holes to add {} octets at offset {}",
2144 payload_len,
2145 payload_offset
2146 );
2147 return None;
2148 };
2149
2150 tcp_trace!(
2152 "rx buffer: receiving {} octets at offset {}",
2153 payload_len,
2154 payload_offset
2155 );
2156 let len_written = self.rx_buffer.write_unallocated(payload_offset, payload);
2157 debug_assert!(len_written == payload_len);
2158
2159 if contig_len != 0 {
2160 tcp_trace!(
2162 "rx buffer: enqueueing {} octets (now {})",
2163 contig_len,
2164 self.rx_buffer.len() + contig_len
2165 );
2166 self.rx_buffer.enqueue_unallocated(contig_len);
2167
2168 #[cfg(feature = "async")]
2170 self.rx_waker.wake();
2171 }
2172
2173 if !self.assembler.is_empty() {
2174 tcp_trace!("assembler: {}", self.assembler);
2176 }
2177
2178 if let Some(ack_delay) = self.ack_delay
2180 && self.ack_to_transmit()
2181 {
2182 self.ack_delay_timer = match self.ack_delay_timer {
2183 AckDelayTimer::Idle => {
2184 tcp_trace!("starting delayed ack timer");
2185 AckDelayTimer::Waiting(cx.now() + ack_delay)
2186 }
2187 AckDelayTimer::Waiting(_) if self.immediate_ack_to_transmit() => {
2188 tcp_trace!("delayed ack timer already started, forcing expiry");
2189 AckDelayTimer::Immediate
2190 }
2191 timer @ AckDelayTimer::Waiting(_) => {
2192 tcp_trace!("waiting until delayed ack timer expires");
2193 timer
2194 }
2195 AckDelayTimer::Immediate => {
2196 tcp_trace!("delayed ack timer already force-expired");
2197 AckDelayTimer::Immediate
2198 }
2199 };
2200 }
2201
2202 if !self.assembler.is_empty() || !assembler_was_empty {
2206 tcp_trace!("ACKing incoming segment");
2210 Some(self.ack_reply(ip_repr, repr))
2211 } else {
2212 None
2213 }
2214 }
2215
2216 fn timed_out(&self, timestamp: Instant) -> bool {
2217 match (self.remote_last_ts, self.timeout) {
2218 (Some(remote_last_ts), Some(timeout)) => timestamp >= remote_last_ts + timeout,
2219 (_, _) => false,
2220 }
2221 }
2222
2223 fn seq_to_transmit(&self, cx: &mut Context) -> bool {
2224 let ip_header_len = match self.tuple.unwrap().local.addr {
2225 #[cfg(feature = "proto-ipv4")]
2226 IpAddress::Ipv4(_) => crate::wire::IPV4_HEADER_LEN,
2227 #[cfg(feature = "proto-ipv6")]
2228 IpAddress::Ipv6(_) => crate::wire::IPV6_HEADER_LEN,
2229 };
2230
2231 let local_mss = cx.ip_mtu() - ip_header_len - TCP_HEADER_LEN;
2233
2234 let effective_mss = local_mss.min(self.remote_mss);
2236
2237 let data_in_flight = self.remote_last_seq != self.local_seq_no;
2239
2240 if matches!(self.state, State::SynSent | State::SynReceived) && !data_in_flight {
2242 return true;
2243 }
2244
2245 let max_send_seq =
2247 self.local_seq_no + core::cmp::min(self.remote_win_len, self.tx_buffer.len());
2248
2249 let max_send = if max_send_seq >= self.remote_last_seq {
2251 max_send_seq - self.remote_last_seq
2252 } else {
2253 0
2254 };
2255
2256 let max_send = max_send.min(self.congestion_controller.inner().window());
2258
2259 let mut can_send = max_send != 0;
2261 let can_send_full = max_send >= effective_mss;
2263
2264 let want_fin = match self.state {
2266 State::FinWait1 => true,
2267 State::Closing => true,
2268 State::LastAck => true,
2269 _ => false,
2270 };
2271
2272 if self.nagle && data_in_flight && !can_send_full && !want_fin {
2278 can_send = false;
2279 }
2280
2281 let can_fin = want_fin && self.remote_last_seq == self.local_seq_no + self.tx_buffer.len();
2286
2287 can_send || can_fin
2288 }
2289
2290 fn delayed_ack_expired(&self, timestamp: Instant) -> bool {
2291 match self.ack_delay_timer {
2292 AckDelayTimer::Idle => true,
2293 AckDelayTimer::Waiting(t) => t <= timestamp,
2294 AckDelayTimer::Immediate => true,
2295 }
2296 }
2297
2298 fn ack_to_transmit(&self) -> bool {
2299 if let Some(remote_last_ack) = self.remote_last_ack {
2300 remote_last_ack < self.remote_seq_no + self.rx_buffer.len()
2301 } else {
2302 false
2303 }
2304 }
2305
2306 fn immediate_ack_to_transmit(&self) -> bool {
2317 if let Some(remote_last_ack) = self.remote_last_ack {
2318 remote_last_ack + self.remote_mss < self.remote_seq_no + self.rx_buffer.len()
2319 } else {
2320 false
2321 }
2322 }
2323
2324 fn window_to_update(&self) -> bool {
2331 match self.state {
2332 State::SynSent
2333 | State::SynReceived
2334 | State::Established
2335 | State::FinWait1
2336 | State::FinWait2 => {
2337 let new_win = self.scaled_window();
2338 if let Some(last_win) = self.last_scaled_window() {
2339 new_win > 0 && new_win / 2 >= last_win
2340 } else {
2341 false
2342 }
2343 }
2344 _ => false,
2345 }
2346 }
2347
2348 pub(crate) fn dispatch<F, E>(&mut self, cx: &mut Context, emit: F) -> Result<(), E>
2349 where
2350 F: FnOnce(&mut Context, (IpRepr, TcpRepr)) -> Result<(), E>,
2351 {
2352 if self.tuple.is_none() {
2353 return Ok(());
2354 }
2355
2356 let tuple = self.tuple.unwrap();
2358
2359 if !cx.has_ip_addr(tuple.local.addr) {
2364 net_debug!("source IP address no longer available, closing socket");
2365 self.reset();
2366 return Ok(());
2367 }
2368
2369 if self.remote_last_ts.is_none() {
2370 self.remote_last_ts = Some(cx.now());
2378 }
2379
2380 self.congestion_controller
2381 .inner_mut()
2382 .pre_transmit(cx.now());
2383
2384 if self.timed_out(cx.now()) {
2386 net_debug!("timeout exceeded");
2388 self.set_state(State::Closed);
2389 } else if !self.seq_to_transmit(cx) && self.timer.should_retransmit(cx.now()) {
2390 net_debug!("retransmitting");
2392
2393 self.remote_last_seq = self.local_seq_no;
2397
2398 self.timer.set_for_idle(cx.now(), self.keep_alive);
2403
2404 self.rtte.on_retransmit();
2406
2407 self.congestion_controller
2409 .inner_mut()
2410 .on_retransmit(cx.now());
2411 }
2412
2413 #[cfg(feature = "socket-tcp-pause-synack")]
2414 if matches!(self.state, State::SynReceived) && self.synack_paused {
2415 return Ok(());
2416 }
2417
2418 if self.seq_to_transmit(cx) {
2420 tcp_trace!("outgoing segment will send data or flags");
2422 } else if self.ack_to_transmit() && self.delayed_ack_expired(cx.now()) {
2423 tcp_trace!("outgoing segment will acknowledge");
2425 } else if self.window_to_update() {
2426 tcp_trace!("outgoing segment will update window");
2428 } else if self.state == State::Closed {
2429 tcp_trace!("outgoing segment will abort connection");
2431 } else if self.timer.should_keep_alive(cx.now()) {
2432 tcp_trace!("keep-alive timer expired");
2434 } else if self.timer.should_zero_window_probe(cx.now()) {
2435 tcp_trace!("sending zero-window probe");
2436 } else if self.timer.should_close(cx.now()) {
2437 tcp_trace!("TIME-WAIT timer expired");
2439 self.reset();
2440 return Ok(());
2441 } else {
2442 return Ok(());
2443 }
2444
2445 let mut ip_repr = IpRepr::new(
2448 tuple.local.addr,
2449 tuple.remote.addr,
2450 IpProtocol::Tcp,
2451 0,
2452 self.hop_limit.unwrap_or(64),
2453 );
2454
2455 let mut repr = TcpRepr {
2458 src_port: tuple.local.port,
2459 dst_port: tuple.remote.port,
2460 control: TcpControl::None,
2461 seq_number: self.remote_last_seq,
2462 ack_number: Some(self.remote_seq_no + self.rx_buffer.len()),
2463 window_len: self.scaled_window(),
2464 window_scale: None,
2465 max_seg_size: None,
2466 sack_permitted: false,
2467 sack_ranges: [None, None, None],
2468 timestamp: TcpTimestampRepr::generate_reply_with_tsval(
2469 self.tsval_generator,
2470 self.last_remote_tsval,
2471 ),
2472 payload: &[],
2473 };
2474
2475 let mut is_zero_window_probe = false;
2476
2477 match self.state {
2478 State::Closed => {
2481 repr.control = TcpControl::Rst;
2482 }
2483
2484 State::Listen => return Ok(()),
2486
2487 State::SynSent | State::SynReceived => {
2490 repr.control = TcpControl::Syn;
2491 repr.seq_number = self.local_seq_no;
2492 repr.window_len = u16::try_from(self.rx_buffer.window()).unwrap_or(u16::MAX);
2494 if self.state == State::SynSent {
2495 repr.ack_number = None;
2496 repr.window_scale = Some(self.remote_win_shift);
2497 repr.sack_permitted = true;
2498 } else {
2499 repr.sack_permitted = self.remote_has_sack;
2500 repr.window_scale = self.remote_win_scale.map(|_| self.remote_win_shift);
2501 }
2502 }
2503
2504 State::Established
2507 | State::FinWait1
2508 | State::Closing
2509 | State::CloseWait
2510 | State::LastAck => {
2511 let win_right_edge = self.local_seq_no + self.remote_win_len;
2516
2517 let mut win_limit = if win_right_edge >= self.remote_last_seq {
2519 win_right_edge - self.remote_last_seq
2520 } else {
2521 0
2527 };
2528
2529 if win_limit == 0 && self.timer.should_zero_window_probe(cx.now()) {
2531 win_limit = 1;
2532 is_zero_window_probe = true;
2533 }
2534
2535 let size = win_limit
2540 .min(self.remote_mss)
2541 .min(cx.ip_mtu() - ip_repr.header_len() - TCP_HEADER_LEN);
2542
2543 let offset = self.remote_last_seq - self.local_seq_no;
2544 repr.payload = self.tx_buffer.get_allocated(offset, size);
2545
2546 if offset + repr.payload.len() == self.tx_buffer.len() {
2549 match self.state {
2550 State::FinWait1 | State::LastAck | State::Closing => {
2551 repr.control = TcpControl::Fin
2552 }
2553 State::Established | State::CloseWait if !repr.payload.is_empty() => {
2554 repr.control = TcpControl::Psh
2555 }
2556 _ => (),
2557 }
2558 }
2559 }
2560
2561 State::FinWait2 | State::TimeWait => {}
2563 }
2564
2565 let is_keep_alive;
2570 if self.timer.should_keep_alive(cx.now()) && repr.is_empty() {
2571 repr.seq_number = repr.seq_number - 1;
2572 repr.payload = b"\x00"; is_keep_alive = true;
2574 } else {
2575 is_keep_alive = false;
2576 }
2577
2578 if is_keep_alive {
2580 tcp_trace!("sending a keep-alive");
2581 } else if !repr.payload.is_empty() {
2582 tcp_trace!(
2583 "tx buffer: sending {} octets at offset {}",
2584 repr.payload.len(),
2585 self.remote_last_seq - self.local_seq_no
2586 );
2587 }
2588 if repr.control != TcpControl::None || repr.payload.is_empty() {
2589 let flags = match (repr.control, repr.ack_number) {
2590 (TcpControl::Syn, None) => "SYN",
2591 (TcpControl::Syn, Some(_)) => "SYN|ACK",
2592 (TcpControl::Fin, Some(_)) => "FIN|ACK",
2593 (TcpControl::Rst, Some(_)) => "RST|ACK",
2594 (TcpControl::Psh, Some(_)) => "PSH|ACK",
2595 (TcpControl::None, Some(_)) => "ACK",
2596 _ => "<unreachable>",
2597 };
2598 tcp_trace!("sending {}", flags);
2599 }
2600
2601 if repr.control == TcpControl::Syn {
2602 let max_segment_size = cx.ip_mtu() - ip_repr.header_len() - TCP_HEADER_LEN;
2604 repr.max_seg_size = Some(max_segment_size as u16);
2605 }
2606
2607 ip_repr.set_payload_len(repr.buffer_len());
2615 emit(cx, (ip_repr, repr))?;
2616
2617 self.timer.rewind_keep_alive(cx.now(), self.keep_alive);
2620
2621 match self.ack_delay_timer {
2623 AckDelayTimer::Idle => {}
2624 AckDelayTimer::Waiting(_) => {
2625 tcp_trace!("stop delayed ack timer")
2626 }
2627 AckDelayTimer::Immediate => {
2628 tcp_trace!("stop delayed ack timer (was force-expired)")
2629 }
2630 }
2631 self.ack_delay_timer = AckDelayTimer::Idle;
2632
2633 if is_zero_window_probe {
2635 self.timer.rewind_zero_window_probe(cx.now());
2636 return Ok(());
2637 }
2638
2639 if is_keep_alive {
2642 return Ok(());
2643 }
2644
2645 self.remote_last_seq = repr.seq_number + repr.segment_len();
2647 self.remote_last_ack = repr.ack_number;
2648 self.remote_last_win = repr.window_len;
2649
2650 if repr.segment_len() > 0 {
2651 self.rtte
2652 .on_send(cx.now(), repr.seq_number + repr.segment_len());
2653 self.congestion_controller
2654 .inner_mut()
2655 .post_transmit(cx.now(), repr.segment_len());
2656 }
2657
2658 if repr.segment_len() > 0 && !self.timer.is_retransmit() {
2659 let rto = self.rtte.retransmission_timeout();
2663 self.timer.set_for_retransmit(cx.now(), rto);
2664 }
2665
2666 if self.state == State::Closed {
2667 self.tuple = None;
2669 #[cfg(feature = "async")]
2670 {
2671 self.tx_waker.wake();
2673 }
2674 }
2675
2676 Ok(())
2677 }
2678
2679 #[allow(clippy::if_same_then_else)]
2680 pub(crate) fn poll_at(&self, cx: &mut Context) -> PollAt {
2681 if self.tuple.is_none() {
2683 PollAt::Ingress
2685 } else if self.remote_last_ts.is_none() {
2686 PollAt::Now
2688 } else if self.state == State::Closed {
2689 PollAt::Now
2691 } else if self.seq_to_transmit(cx) {
2692 PollAt::Now
2694 } else if self.window_to_update() {
2695 PollAt::Now
2697 } else {
2698 let want_ack = self.ack_to_transmit();
2699
2700 let delayed_ack_poll_at = match (want_ack, self.ack_delay_timer) {
2701 (false, _) => PollAt::Ingress,
2702 (true, AckDelayTimer::Idle) => PollAt::Now,
2703 (true, AckDelayTimer::Waiting(t)) => PollAt::Time(t),
2704 (true, AckDelayTimer::Immediate) => PollAt::Now,
2705 };
2706
2707 let timeout_poll_at = match (self.remote_last_ts, self.timeout) {
2708 (Some(remote_last_ts), Some(timeout)) => PollAt::Time(remote_last_ts + timeout),
2711 (_, _) => PollAt::Ingress,
2713 };
2714
2715 *[self.timer.poll_at(), timeout_poll_at, delayed_ack_poll_at]
2717 .iter()
2718 .min()
2719 .unwrap_or(&PollAt::Ingress)
2720 }
2721 }
2722}
2723
2724impl<'a> fmt::Write for Socket<'a> {
2725 fn write_str(&mut self, slice: &str) -> fmt::Result {
2726 let slice = slice.as_bytes();
2727 if self.send_slice(slice) == Ok(slice.len()) {
2728 Ok(())
2729 } else {
2730 Err(fmt::Error)
2731 }
2732 }
2733}
2734
2735#[cfg(all(test, feature = "medium-ip"))]
2739mod test {
2740 use super::*;
2741 use crate::config::IFACE_MAX_ADDR_COUNT;
2742 use crate::wire::{IpCidr, IpRepr};
2743 use std::ops::{Deref, DerefMut};
2744 use std::vec::Vec;
2745
2746 const LOCAL_PORT: u16 = 80;
2751 const REMOTE_PORT: u16 = 49500;
2752 const LISTEN_END: IpListenEndpoint = IpListenEndpoint {
2753 addr: None,
2754 port: LOCAL_PORT,
2755 };
2756 const TUPLE: Tuple = Tuple {
2757 local: LOCAL_END,
2758 remote: REMOTE_END,
2759 };
2760 const LOCAL_SEQ: TcpSeqNumber = TcpSeqNumber(10000);
2761 const REMOTE_SEQ: TcpSeqNumber = TcpSeqNumber(-10001);
2762
2763 cfg_if::cfg_if! {
2764 if #[cfg(feature = "proto-ipv4")] {
2765 use crate::wire::Ipv4Address as IpvXAddress;
2766 use crate::wire::Ipv4Repr as IpvXRepr;
2767 use IpRepr::Ipv4 as IpReprIpvX;
2768
2769 const LOCAL_ADDR: IpvXAddress = IpvXAddress::new(192, 168, 1, 1);
2770 const REMOTE_ADDR: IpvXAddress = IpvXAddress::new(192, 168, 1, 2);
2771 const OTHER_ADDR: IpvXAddress = IpvXAddress::new(192, 168, 1, 3);
2772
2773 const BASE_MSS: u16 = 1460;
2774
2775 const LOCAL_END: IpEndpoint = IpEndpoint {
2776 addr: IpAddress::Ipv4(LOCAL_ADDR),
2777 port: LOCAL_PORT,
2778 };
2779 const REMOTE_END: IpEndpoint = IpEndpoint {
2780 addr: IpAddress::Ipv4(REMOTE_ADDR),
2781 port: REMOTE_PORT,
2782 };
2783 } else {
2784 use crate::wire::Ipv6Address as IpvXAddress;
2785 use crate::wire::Ipv6Repr as IpvXRepr;
2786 use IpRepr::Ipv6 as IpReprIpvX;
2787
2788 const LOCAL_ADDR: IpvXAddress = IpvXAddress::new(0xfe80, 0, 0, 0, 0, 0, 0, 1);
2789 const REMOTE_ADDR: IpvXAddress = IpvXAddress::new(0xfe80, 0, 0, 0, 0, 0, 0, 2);
2790 const OTHER_ADDR: IpvXAddress = IpvXAddress::new(0xfe80, 0, 0, 0, 0, 0, 0, 3);
2791
2792 const BASE_MSS: u16 = 1440;
2793
2794 const LOCAL_END: IpEndpoint = IpEndpoint {
2795 addr: IpAddress::Ipv6(LOCAL_ADDR),
2796 port: LOCAL_PORT,
2797 };
2798 const REMOTE_END: IpEndpoint = IpEndpoint {
2799 addr: IpAddress::Ipv6(REMOTE_ADDR),
2800 port: REMOTE_PORT,
2801 };
2802 }
2803 }
2804
2805 const SEND_IP_TEMPL: IpRepr = IpReprIpvX(IpvXRepr {
2806 src_addr: LOCAL_ADDR,
2807 dst_addr: REMOTE_ADDR,
2808 next_header: IpProtocol::Tcp,
2809 payload_len: 20,
2810 hop_limit: 64,
2811 });
2812 const SEND_TEMPL: TcpRepr<'static> = TcpRepr {
2813 src_port: REMOTE_PORT,
2814 dst_port: LOCAL_PORT,
2815 control: TcpControl::None,
2816 seq_number: TcpSeqNumber(0),
2817 ack_number: Some(TcpSeqNumber(0)),
2818 window_len: 256,
2819 window_scale: None,
2820 max_seg_size: None,
2821 sack_permitted: false,
2822 sack_ranges: [None, None, None],
2823 timestamp: None,
2824 payload: &[],
2825 };
2826 const _RECV_IP_TEMPL: IpRepr = IpReprIpvX(IpvXRepr {
2827 src_addr: LOCAL_ADDR,
2828 dst_addr: REMOTE_ADDR,
2829 next_header: IpProtocol::Tcp,
2830 payload_len: 20,
2831 hop_limit: 64,
2832 });
2833 const RECV_TEMPL: TcpRepr<'static> = TcpRepr {
2834 src_port: LOCAL_PORT,
2835 dst_port: REMOTE_PORT,
2836 control: TcpControl::None,
2837 seq_number: TcpSeqNumber(0),
2838 ack_number: Some(TcpSeqNumber(0)),
2839 window_len: 64,
2840 window_scale: None,
2841 max_seg_size: None,
2842 sack_permitted: false,
2843 sack_ranges: [None, None, None],
2844 timestamp: None,
2845 payload: &[],
2846 };
2847
2848 struct TestSocket {
2853 socket: Socket<'static>,
2854 cx: Context,
2855 }
2856
2857 impl Deref for TestSocket {
2858 type Target = Socket<'static>;
2859 fn deref(&self) -> &Self::Target {
2860 &self.socket
2861 }
2862 }
2863
2864 impl DerefMut for TestSocket {
2865 fn deref_mut(&mut self) -> &mut Self::Target {
2866 &mut self.socket
2867 }
2868 }
2869
2870 #[track_caller]
2871 fn send(
2872 socket: &mut TestSocket,
2873 timestamp: Instant,
2874 repr: &TcpRepr,
2875 ) -> Option<TcpRepr<'static>> {
2876 socket.cx.set_now(timestamp);
2877
2878 let ip_repr = IpReprIpvX(IpvXRepr {
2879 src_addr: REMOTE_ADDR,
2880 dst_addr: LOCAL_ADDR,
2881 next_header: IpProtocol::Tcp,
2882 payload_len: repr.buffer_len(),
2883 hop_limit: 64,
2884 });
2885 net_trace!("send: {}", repr);
2886
2887 assert!(socket.socket.accepts(&mut socket.cx, &ip_repr, repr));
2888
2889 match socket.socket.process(&mut socket.cx, &ip_repr, repr) {
2890 Some((_ip_repr, repr)) => {
2891 net_trace!("recv: {}", repr);
2892 Some(repr)
2893 }
2894 None => None,
2895 }
2896 }
2897
2898 #[track_caller]
2899 fn recv<F>(socket: &mut TestSocket, timestamp: Instant, mut f: F)
2900 where
2901 F: FnMut(Result<TcpRepr, ()>),
2902 {
2903 socket.cx.set_now(timestamp);
2904
2905 let mut sent = 0;
2906 let result = socket
2907 .socket
2908 .dispatch(&mut socket.cx, |_, (ip_repr, tcp_repr)| {
2909 assert_eq!(ip_repr.next_header(), IpProtocol::Tcp);
2910 assert_eq!(ip_repr.src_addr(), LOCAL_ADDR.into());
2911 assert_eq!(ip_repr.dst_addr(), REMOTE_ADDR.into());
2912 assert_eq!(ip_repr.payload_len(), tcp_repr.buffer_len());
2913
2914 net_trace!("recv: {}", tcp_repr);
2915 sent += 1;
2916 Ok(f(Ok(tcp_repr)))
2917 });
2918 match result {
2919 Ok(()) => assert_eq!(sent, 1, "Exactly one packet should be sent"),
2920 Err(e) => f(Err(e)),
2921 }
2922 }
2923
2924 #[track_caller]
2925 fn recv_nothing(socket: &mut TestSocket, timestamp: Instant) {
2926 socket.cx.set_now(timestamp);
2927
2928 let mut fail = false;
2929 let result: Result<(), ()> = socket.socket.dispatch(&mut socket.cx, |_, _| {
2930 fail = true;
2931 Ok(())
2932 });
2933 if fail {
2934 panic!("Should not send a packet")
2935 }
2936
2937 assert_eq!(result, Ok(()))
2938 }
2939
2940 #[collapse_debuginfo(yes)]
2941 macro_rules! send {
2942 ($socket:ident, $repr:expr) =>
2943 (send!($socket, time 0, $repr));
2944 ($socket:ident, $repr:expr, $result:expr) =>
2945 (send!($socket, time 0, $repr, $result));
2946 ($socket:ident, time $time:expr, $repr:expr) =>
2947 (send!($socket, time $time, $repr, None));
2948 ($socket:ident, time $time:expr, $repr:expr, $result:expr) =>
2949 (assert_eq!(send(&mut $socket, Instant::from_millis($time), &$repr), $result));
2950 }
2951
2952 #[collapse_debuginfo(yes)]
2953 macro_rules! recv {
2954 ($socket:ident, [$( $repr:expr ),*]) => ({
2955 $( recv!($socket, Ok($repr)); )*
2956 recv_nothing!($socket)
2957 });
2958 ($socket:ident, time $time:expr, [$( $repr:expr ),*]) => ({
2959 $( recv!($socket, time $time, Ok($repr)); )*
2960 recv_nothing!($socket, time $time)
2961 });
2962 ($socket:ident, $result:expr) =>
2963 (recv!($socket, time 0, $result));
2964 ($socket:ident, time $time:expr, $result:expr) =>
2965 (recv(&mut $socket, Instant::from_millis($time), |result| {
2966 let result = result.map(|mut repr| {
2968 repr.control = repr.control.quash_psh();
2969 repr
2970 });
2971 assert_eq!(result, $result)
2972 }));
2973 ($socket:ident, time $time:expr, $result:expr, exact) =>
2974 (recv(&mut $socket, Instant::from_millis($time), |repr| assert_eq!(repr, $result)));
2975 }
2976
2977 #[collapse_debuginfo(yes)]
2978 macro_rules! recv_nothing {
2979 ($socket:ident) => (recv_nothing!($socket, time 0));
2980 ($socket:ident, time $time:expr) => (recv_nothing(&mut $socket, Instant::from_millis($time)));
2981 }
2982
2983 #[collapse_debuginfo(yes)]
2984 macro_rules! sanity {
2985 ($socket1:expr, $socket2:expr) => {{
2986 let (s1, s2) = ($socket1, $socket2);
2987 assert_eq!(s1.state, s2.state, "state");
2988 assert_eq!(s1.tuple, s2.tuple, "tuple");
2989 assert_eq!(s1.local_seq_no, s2.local_seq_no, "local_seq_no");
2990 assert_eq!(s1.remote_seq_no, s2.remote_seq_no, "remote_seq_no");
2991 assert_eq!(s1.remote_last_seq, s2.remote_last_seq, "remote_last_seq");
2992 assert_eq!(s1.remote_last_ack, s2.remote_last_ack, "remote_last_ack");
2993 assert_eq!(s1.remote_last_win, s2.remote_last_win, "remote_last_win");
2994 assert_eq!(s1.remote_win_len, s2.remote_win_len, "remote_win_len");
2995 assert_eq!(s1.timer, s2.timer, "timer");
2996 }};
2997 }
2998
2999 fn socket() -> TestSocket {
3000 socket_with_buffer_sizes(64, 64)
3001 }
3002
3003 fn socket_with_buffer_sizes(tx_len: usize, rx_len: usize) -> TestSocket {
3004 let (iface, _, _) = crate::tests::setup(crate::phy::Medium::Ip);
3005
3006 let rx_buffer = SocketBuffer::new(vec![0; rx_len]);
3007 let tx_buffer = SocketBuffer::new(vec![0; tx_len]);
3008 let mut socket = Socket::new(rx_buffer, tx_buffer);
3009 socket.set_ack_delay(None);
3010 TestSocket {
3011 socket,
3012 cx: iface.inner,
3013 }
3014 }
3015
3016 fn socket_syn_received_with_buffer_sizes(tx_len: usize, rx_len: usize) -> TestSocket {
3017 let mut s = socket_with_buffer_sizes(tx_len, rx_len);
3018 s.state = State::SynReceived;
3019 s.tuple = Some(TUPLE);
3020 s.local_seq_no = LOCAL_SEQ;
3021 s.remote_seq_no = REMOTE_SEQ + 1;
3022 s.remote_last_seq = LOCAL_SEQ;
3023 s.remote_win_len = 256;
3024 s
3025 }
3026
3027 fn socket_syn_received() -> TestSocket {
3028 socket_syn_received_with_buffer_sizes(64, 64)
3029 }
3030
3031 fn socket_syn_sent_with_buffer_sizes(tx_len: usize, rx_len: usize) -> TestSocket {
3032 let mut s = socket_with_buffer_sizes(tx_len, rx_len);
3033 s.state = State::SynSent;
3034 s.tuple = Some(TUPLE);
3035 s.local_seq_no = LOCAL_SEQ;
3036 s.remote_last_seq = LOCAL_SEQ;
3037 s
3038 }
3039
3040 fn socket_syn_sent() -> TestSocket {
3041 socket_syn_sent_with_buffer_sizes(64, 64)
3042 }
3043
3044 fn socket_established_with_buffer_sizes(tx_len: usize, rx_len: usize) -> TestSocket {
3045 let mut s = socket_syn_received_with_buffer_sizes(tx_len, rx_len);
3046 s.state = State::Established;
3047 s.local_seq_no = LOCAL_SEQ + 1;
3048 s.remote_last_seq = LOCAL_SEQ + 1;
3049 s.remote_last_ack = Some(REMOTE_SEQ + 1);
3050 s.remote_last_win = s.scaled_window();
3051 s
3052 }
3053
3054 fn socket_established() -> TestSocket {
3055 socket_established_with_buffer_sizes(64, 64)
3056 }
3057
3058 fn socket_fin_wait_1() -> TestSocket {
3059 let mut s = socket_established();
3060 s.state = State::FinWait1;
3061 s
3062 }
3063
3064 fn socket_fin_wait_2() -> TestSocket {
3065 let mut s = socket_fin_wait_1();
3066 s.state = State::FinWait2;
3067 s.local_seq_no = LOCAL_SEQ + 1 + 1;
3068 s.remote_last_seq = LOCAL_SEQ + 1 + 1;
3069 s
3070 }
3071
3072 fn socket_closing() -> TestSocket {
3073 let mut s = socket_fin_wait_1();
3074 s.state = State::Closing;
3075 s.remote_last_seq = LOCAL_SEQ + 1 + 1;
3076 s.remote_seq_no = REMOTE_SEQ + 1 + 1;
3077 s.timer = Timer::Retransmit {
3078 expires_at: Instant::from_millis_const(1000),
3079 };
3080 s
3081 }
3082
3083 fn socket_time_wait(from_closing: bool) -> TestSocket {
3084 let mut s = socket_fin_wait_2();
3085 s.state = State::TimeWait;
3086 s.remote_seq_no = REMOTE_SEQ + 1 + 1;
3087 if from_closing {
3088 s.remote_last_ack = Some(REMOTE_SEQ + 1 + 1);
3089 }
3090 s.timer = Timer::Close {
3091 expires_at: Instant::from_secs(1) + CLOSE_DELAY,
3092 };
3093 s
3094 }
3095
3096 fn socket_close_wait() -> TestSocket {
3097 let mut s = socket_established();
3098 s.state = State::CloseWait;
3099 s.remote_seq_no = REMOTE_SEQ + 1 + 1;
3100 s.remote_last_ack = Some(REMOTE_SEQ + 1 + 1);
3101 s
3102 }
3103
3104 fn socket_last_ack() -> TestSocket {
3105 let mut s = socket_close_wait();
3106 s.state = State::LastAck;
3107 s
3108 }
3109
3110 fn socket_recved() -> TestSocket {
3111 let mut s = socket_established();
3112 send!(
3113 s,
3114 TcpRepr {
3115 seq_number: REMOTE_SEQ + 1,
3116 ack_number: Some(LOCAL_SEQ + 1),
3117 payload: &b"abcdef"[..],
3118 ..SEND_TEMPL
3119 }
3120 );
3121 recv!(
3122 s,
3123 [TcpRepr {
3124 seq_number: LOCAL_SEQ + 1,
3125 ack_number: Some(REMOTE_SEQ + 1 + 6),
3126 window_len: 58,
3127 ..RECV_TEMPL
3128 }]
3129 );
3130 s
3131 }
3132
3133 #[test]
3137 fn test_closed_reject() {
3138 let mut s = socket();
3139 assert_eq!(s.state, State::Closed);
3140
3141 let tcp_repr = TcpRepr {
3142 control: TcpControl::Syn,
3143 ..SEND_TEMPL
3144 };
3145 assert!(!s.socket.accepts(&mut s.cx, &SEND_IP_TEMPL, &tcp_repr));
3146 }
3147
3148 #[test]
3149 fn test_closed_reject_after_listen() {
3150 let mut s = socket();
3151 s.listen(LOCAL_END).unwrap();
3152 s.close();
3153
3154 let tcp_repr = TcpRepr {
3155 control: TcpControl::Syn,
3156 ..SEND_TEMPL
3157 };
3158 assert!(!s.socket.accepts(&mut s.cx, &SEND_IP_TEMPL, &tcp_repr));
3159 }
3160
3161 #[test]
3162 fn test_closed_close() {
3163 let mut s = socket();
3164 s.close();
3165 assert_eq!(s.state, State::Closed);
3166 }
3167
3168 fn socket_listen() -> TestSocket {
3172 let mut s = socket();
3173 s.state = State::Listen;
3174 s.listen_endpoint = LISTEN_END;
3175 s
3176 }
3177
3178 #[test]
3179 fn test_listen_sack_option() {
3180 let mut s = socket_listen();
3181 send!(
3182 s,
3183 TcpRepr {
3184 control: TcpControl::Syn,
3185 seq_number: REMOTE_SEQ,
3186 ack_number: None,
3187 sack_permitted: false,
3188 ..SEND_TEMPL
3189 }
3190 );
3191 assert!(!s.remote_has_sack);
3192 recv!(
3193 s,
3194 [TcpRepr {
3195 control: TcpControl::Syn,
3196 seq_number: LOCAL_SEQ,
3197 ack_number: Some(REMOTE_SEQ + 1),
3198 max_seg_size: Some(BASE_MSS),
3199 ..RECV_TEMPL
3200 }]
3201 );
3202
3203 let mut s = socket_listen();
3204 send!(
3205 s,
3206 TcpRepr {
3207 control: TcpControl::Syn,
3208 seq_number: REMOTE_SEQ,
3209 ack_number: None,
3210 sack_permitted: true,
3211 ..SEND_TEMPL
3212 }
3213 );
3214 assert!(s.remote_has_sack);
3215 recv!(
3216 s,
3217 [TcpRepr {
3218 control: TcpControl::Syn,
3219 seq_number: LOCAL_SEQ,
3220 ack_number: Some(REMOTE_SEQ + 1),
3221 max_seg_size: Some(BASE_MSS),
3222 sack_permitted: true,
3223 ..RECV_TEMPL
3224 }]
3225 );
3226 }
3227
3228 #[test]
3229 fn test_listen_syn_win_scale_buffers() {
3230 for (buffer_size, shift_amt) in &[
3231 (64, 0),
3232 (128, 0),
3233 (1024, 0),
3234 (65535, 0),
3235 (65536, 1),
3236 (65537, 1),
3237 (131071, 1),
3238 (131072, 2),
3239 (524287, 3),
3240 (524288, 4),
3241 (655350, 4),
3242 (1048576, 5),
3243 ] {
3244 let mut s = socket_with_buffer_sizes(64, *buffer_size);
3245 s.state = State::Listen;
3246 s.listen_endpoint = LISTEN_END;
3247 assert_eq!(s.remote_win_shift, *shift_amt);
3248 send!(
3249 s,
3250 TcpRepr {
3251 control: TcpControl::Syn,
3252 seq_number: REMOTE_SEQ,
3253 ack_number: None,
3254 window_scale: Some(0),
3255 ..SEND_TEMPL
3256 }
3257 );
3258 assert_eq!(s.remote_win_shift, *shift_amt);
3259 recv!(
3260 s,
3261 [TcpRepr {
3262 control: TcpControl::Syn,
3263 seq_number: LOCAL_SEQ,
3264 ack_number: Some(REMOTE_SEQ + 1),
3265 max_seg_size: Some(BASE_MSS),
3266 window_scale: Some(*shift_amt),
3267 window_len: u16::try_from(*buffer_size).unwrap_or(u16::MAX),
3268 ..RECV_TEMPL
3269 }]
3270 );
3271 }
3272 }
3273
3274 #[test]
3275 fn test_listen_sanity() {
3276 let mut s = socket();
3277 s.listen(LOCAL_PORT).unwrap();
3278 sanity!(s, socket_listen());
3279 }
3280
3281 #[test]
3282 fn test_listen_validation() {
3283 let mut s = socket();
3284 assert_eq!(s.listen(0), Err(ListenError::Unaddressable));
3285 }
3286
3287 #[test]
3288 fn test_listen_twice() {
3289 let mut s = socket();
3290 assert_eq!(s.listen(80), Ok(()));
3291 assert_eq!(s.listen(80), Ok(()));
3293 s.set_state(State::SynReceived); assert_eq!(s.listen(80), Err(ListenError::InvalidState));
3295 }
3296
3297 #[test]
3298 fn test_listen_syn() {
3299 let mut s = socket_listen();
3300 send!(
3301 s,
3302 TcpRepr {
3303 control: TcpControl::Syn,
3304 seq_number: REMOTE_SEQ,
3305 ack_number: None,
3306 ..SEND_TEMPL
3307 }
3308 );
3309 sanity!(s, socket_syn_received());
3310 }
3311
3312 #[test]
3313 fn test_listen_syn_reject_ack() {
3314 let mut s = socket_listen();
3315
3316 let tcp_repr = TcpRepr {
3317 control: TcpControl::Syn,
3318 seq_number: REMOTE_SEQ,
3319 ack_number: Some(LOCAL_SEQ),
3320 ..SEND_TEMPL
3321 };
3322 assert!(!s.socket.accepts(&mut s.cx, &SEND_IP_TEMPL, &tcp_repr));
3323
3324 assert_eq!(s.state, State::Listen);
3325 }
3326
3327 #[test]
3328 fn test_listen_rst() {
3329 let mut s = socket_listen();
3330 let tcp_repr = TcpRepr {
3331 control: TcpControl::Rst,
3332 seq_number: REMOTE_SEQ,
3333 ack_number: None,
3334 ..SEND_TEMPL
3335 };
3336 assert!(!s.socket.accepts(&mut s.cx, &SEND_IP_TEMPL, &tcp_repr));
3337 assert_eq!(s.state, State::Listen);
3338 }
3339
3340 #[test]
3341 fn test_listen_close() {
3342 let mut s = socket_listen();
3343 s.close();
3344 assert_eq!(s.state, State::Closed);
3345 }
3346
3347 #[test]
3352 fn test_syn_received_ack() {
3353 let mut s = socket_syn_received();
3354 recv!(
3355 s,
3356 [TcpRepr {
3357 control: TcpControl::Syn,
3358 seq_number: LOCAL_SEQ,
3359 ack_number: Some(REMOTE_SEQ + 1),
3360 max_seg_size: Some(BASE_MSS),
3361 ..RECV_TEMPL
3362 }]
3363 );
3364 send!(
3365 s,
3366 TcpRepr {
3367 seq_number: REMOTE_SEQ + 1,
3368 ack_number: Some(LOCAL_SEQ + 1),
3369 ..SEND_TEMPL
3370 }
3371 );
3372 assert_eq!(s.state, State::Established);
3373 sanity!(s, socket_established());
3374 }
3375
3376 #[cfg(feature = "socket-tcp-pause-synack")]
3377 #[test]
3378 fn test_syn_paused_ack() {
3379 let mut s = socket_syn_received();
3380
3381 s.pause_synack(true);
3382 recv_nothing!(s);
3383 assert_eq!(s.state, State::SynReceived);
3384
3385 s.pause_synack(false);
3386 recv!(
3387 s,
3388 [TcpRepr {
3389 control: TcpControl::Syn,
3390 seq_number: LOCAL_SEQ,
3391 ack_number: Some(REMOTE_SEQ + 1),
3392 max_seg_size: Some(BASE_MSS),
3393 ..RECV_TEMPL
3394 }]
3395 );
3396 send!(
3397 s,
3398 TcpRepr {
3399 seq_number: REMOTE_SEQ + 1,
3400 ack_number: Some(LOCAL_SEQ + 1),
3401 ..SEND_TEMPL
3402 }
3403 );
3404 assert_eq!(s.state, State::Established);
3405 }
3406
3407 #[test]
3408 fn test_syn_received_ack_too_low() {
3409 let mut s = socket_syn_received();
3410 recv!(
3411 s,
3412 [TcpRepr {
3413 control: TcpControl::Syn,
3414 seq_number: LOCAL_SEQ,
3415 ack_number: Some(REMOTE_SEQ + 1),
3416 max_seg_size: Some(BASE_MSS),
3417 ..RECV_TEMPL
3418 }]
3419 );
3420 send!(
3421 s,
3422 TcpRepr {
3423 seq_number: REMOTE_SEQ + 1,
3424 ack_number: Some(LOCAL_SEQ), ..SEND_TEMPL
3426 },
3427 Some(TcpRepr {
3428 control: TcpControl::Rst,
3429 seq_number: LOCAL_SEQ,
3430 ack_number: None,
3431 window_len: 0,
3432 ..RECV_TEMPL
3433 })
3434 );
3435 assert_eq!(s.state, State::SynReceived);
3436 }
3437
3438 #[test]
3439 fn test_syn_received_ack_too_high() {
3440 let mut s = socket_syn_received();
3441 recv!(
3442 s,
3443 [TcpRepr {
3444 control: TcpControl::Syn,
3445 seq_number: LOCAL_SEQ,
3446 ack_number: Some(REMOTE_SEQ + 1),
3447 max_seg_size: Some(BASE_MSS),
3448 ..RECV_TEMPL
3449 }]
3450 );
3451 send!(
3452 s,
3453 TcpRepr {
3454 seq_number: REMOTE_SEQ + 1,
3455 ack_number: Some(LOCAL_SEQ + 2), ..SEND_TEMPL
3457 },
3458 Some(TcpRepr {
3459 control: TcpControl::Rst,
3460 seq_number: LOCAL_SEQ + 2,
3461 ack_number: None,
3462 window_len: 0,
3463 ..RECV_TEMPL
3464 })
3465 );
3466 assert_eq!(s.state, State::SynReceived);
3467 }
3468
3469 #[test]
3470 fn test_syn_received_fin() {
3471 let mut s = socket_syn_received();
3472 recv!(
3473 s,
3474 [TcpRepr {
3475 control: TcpControl::Syn,
3476 seq_number: LOCAL_SEQ,
3477 ack_number: Some(REMOTE_SEQ + 1),
3478 max_seg_size: Some(BASE_MSS),
3479 ..RECV_TEMPL
3480 }]
3481 );
3482 send!(
3483 s,
3484 TcpRepr {
3485 control: TcpControl::Fin,
3486 seq_number: REMOTE_SEQ + 1,
3487 ack_number: Some(LOCAL_SEQ + 1),
3488 payload: &b"abcdef"[..],
3489 ..SEND_TEMPL
3490 }
3491 );
3492 recv!(
3493 s,
3494 [TcpRepr {
3495 seq_number: LOCAL_SEQ + 1,
3496 ack_number: Some(REMOTE_SEQ + 1 + 6 + 1),
3497 window_len: 58,
3498 ..RECV_TEMPL
3499 }]
3500 );
3501 assert_eq!(s.state, State::CloseWait);
3502
3503 let mut s2 = socket_close_wait();
3504 s2.remote_last_ack = Some(REMOTE_SEQ + 1 + 6 + 1);
3505 s2.remote_last_win = 58;
3506 sanity!(s, s2);
3507 }
3508
3509 #[test]
3510 fn test_syn_received_rst() {
3511 let mut s = socket_syn_received();
3512 s.listen_endpoint = LISTEN_END;
3513 recv!(
3514 s,
3515 [TcpRepr {
3516 control: TcpControl::Syn,
3517 seq_number: LOCAL_SEQ,
3518 ack_number: Some(REMOTE_SEQ + 1),
3519 max_seg_size: Some(BASE_MSS),
3520 ..RECV_TEMPL
3521 }]
3522 );
3523 send!(
3524 s,
3525 TcpRepr {
3526 control: TcpControl::Rst,
3527 seq_number: REMOTE_SEQ + 1,
3528 ack_number: Some(LOCAL_SEQ),
3529 ..SEND_TEMPL
3530 }
3531 );
3532 assert_eq!(s.state, State::Listen);
3533 assert_eq!(s.listen_endpoint, LISTEN_END);
3534 assert_eq!(s.tuple, None);
3535 }
3536
3537 #[test]
3538 fn test_syn_received_no_window_scaling() {
3539 let mut s = socket_listen();
3540 send!(
3541 s,
3542 TcpRepr {
3543 control: TcpControl::Syn,
3544 seq_number: REMOTE_SEQ,
3545 ack_number: None,
3546 ..SEND_TEMPL
3547 }
3548 );
3549 assert_eq!(s.state(), State::SynReceived);
3550 assert_eq!(s.tuple, Some(TUPLE));
3551 recv!(
3552 s,
3553 [TcpRepr {
3554 control: TcpControl::Syn,
3555 seq_number: LOCAL_SEQ,
3556 ack_number: Some(REMOTE_SEQ + 1),
3557 max_seg_size: Some(BASE_MSS),
3558 window_scale: None,
3559 ..RECV_TEMPL
3560 }]
3561 );
3562 send!(
3563 s,
3564 TcpRepr {
3565 seq_number: REMOTE_SEQ + 1,
3566 ack_number: Some(LOCAL_SEQ + 1),
3567 window_scale: None,
3568 ..SEND_TEMPL
3569 }
3570 );
3571 assert_eq!(s.remote_win_shift, 0);
3572 assert_eq!(s.remote_win_scale, None);
3573 }
3574
3575 #[test]
3576 fn test_syn_received_window_scaling() {
3577 for scale in 0..14 {
3578 let mut s = socket_listen();
3579 send!(
3580 s,
3581 TcpRepr {
3582 control: TcpControl::Syn,
3583 seq_number: REMOTE_SEQ,
3584 ack_number: None,
3585 window_scale: Some(scale),
3586 ..SEND_TEMPL
3587 }
3588 );
3589 assert_eq!(s.state(), State::SynReceived);
3590 assert_eq!(s.tuple, Some(TUPLE));
3591 recv!(
3592 s,
3593 [TcpRepr {
3594 control: TcpControl::Syn,
3595 seq_number: LOCAL_SEQ,
3596 ack_number: Some(REMOTE_SEQ + 1),
3597 max_seg_size: Some(BASE_MSS),
3598 window_scale: Some(0),
3599 ..RECV_TEMPL
3600 }]
3601 );
3602 send!(
3603 s,
3604 TcpRepr {
3605 seq_number: REMOTE_SEQ + 1,
3606 ack_number: Some(LOCAL_SEQ + 1),
3607 window_scale: None,
3608 ..SEND_TEMPL
3609 }
3610 );
3611 assert_eq!(s.remote_win_scale, Some(scale));
3612 }
3613 }
3614
3615 #[test]
3616 fn test_syn_received_close() {
3617 let mut s = socket_syn_received();
3618 s.close();
3619 assert_eq!(s.state, State::FinWait1);
3620 }
3621
3622 #[test]
3627 fn test_connect_validation() {
3628 let mut s = socket();
3629 assert_eq!(
3630 s.socket
3631 .connect(&mut s.cx, REMOTE_END, (IpvXAddress::UNSPECIFIED, 0)),
3632 Err(ConnectError::Unaddressable)
3633 );
3634 assert_eq!(
3635 s.socket
3636 .connect(&mut s.cx, REMOTE_END, (IpvXAddress::UNSPECIFIED, 1024)),
3637 Err(ConnectError::Unaddressable)
3638 );
3639 assert_eq!(
3640 s.socket
3641 .connect(&mut s.cx, (IpvXAddress::UNSPECIFIED, 0), LOCAL_END),
3642 Err(ConnectError::Unaddressable)
3643 );
3644 s.socket
3645 .connect(&mut s.cx, REMOTE_END, LOCAL_END)
3646 .expect("Connect failed with valid parameters");
3647 assert_eq!(s.tuple, Some(TUPLE));
3648 }
3649
3650 #[test]
3651 fn test_connect() {
3652 let mut s = socket();
3653 s.local_seq_no = LOCAL_SEQ;
3654 s.socket
3655 .connect(&mut s.cx, REMOTE_END, LOCAL_END.port)
3656 .unwrap();
3657 assert_eq!(s.tuple, Some(TUPLE));
3658 recv!(
3659 s,
3660 [TcpRepr {
3661 control: TcpControl::Syn,
3662 seq_number: LOCAL_SEQ,
3663 ack_number: None,
3664 max_seg_size: Some(BASE_MSS),
3665 window_scale: Some(0),
3666 sack_permitted: true,
3667 ..RECV_TEMPL
3668 }]
3669 );
3670 send!(
3671 s,
3672 TcpRepr {
3673 control: TcpControl::Syn,
3674 seq_number: REMOTE_SEQ,
3675 ack_number: Some(LOCAL_SEQ + 1),
3676 max_seg_size: Some(BASE_MSS - 80),
3677 window_scale: Some(0),
3678 ..SEND_TEMPL
3679 }
3680 );
3681 assert_eq!(s.tuple, Some(TUPLE));
3682 }
3683
3684 #[test]
3685 fn test_connect_unspecified_local() {
3686 let mut s = socket();
3687 assert_eq!(s.socket.connect(&mut s.cx, REMOTE_END, 80), Ok(()));
3688 }
3689
3690 #[test]
3691 fn test_connect_specified_local() {
3692 let mut s = socket();
3693 assert_eq!(
3694 s.socket.connect(&mut s.cx, REMOTE_END, (REMOTE_ADDR, 80)),
3695 Ok(())
3696 );
3697 }
3698
3699 #[test]
3700 fn test_connect_twice() {
3701 let mut s = socket();
3702 assert_eq!(s.socket.connect(&mut s.cx, REMOTE_END, 80), Ok(()));
3703 assert_eq!(
3704 s.socket.connect(&mut s.cx, REMOTE_END, 80),
3705 Err(ConnectError::InvalidState)
3706 );
3707 }
3708
3709 #[test]
3710 fn test_syn_sent_sanity() {
3711 let mut s = socket();
3712 s.local_seq_no = LOCAL_SEQ;
3713 s.socket.connect(&mut s.cx, REMOTE_END, LOCAL_END).unwrap();
3714 sanity!(s, socket_syn_sent());
3715 }
3716
3717 #[test]
3718 fn test_syn_sent_syn_ack() {
3719 let mut s = socket_syn_sent();
3720 recv!(
3721 s,
3722 [TcpRepr {
3723 control: TcpControl::Syn,
3724 seq_number: LOCAL_SEQ,
3725 ack_number: None,
3726 max_seg_size: Some(BASE_MSS),
3727 window_scale: Some(0),
3728 sack_permitted: true,
3729 ..RECV_TEMPL
3730 }]
3731 );
3732 send!(
3733 s,
3734 TcpRepr {
3735 control: TcpControl::Syn,
3736 seq_number: REMOTE_SEQ,
3737 ack_number: Some(LOCAL_SEQ + 1),
3738 max_seg_size: Some(BASE_MSS - 80),
3739 window_scale: Some(0),
3740 ..SEND_TEMPL
3741 }
3742 );
3743 recv!(
3744 s,
3745 [TcpRepr {
3746 seq_number: LOCAL_SEQ + 1,
3747 ack_number: Some(REMOTE_SEQ + 1),
3748 ..RECV_TEMPL
3749 }]
3750 );
3751 recv_nothing!(s, time 1000);
3752 assert_eq!(s.state, State::Established);
3753 sanity!(s, socket_established());
3754 }
3755
3756 #[test]
3757 fn test_syn_sent_syn_received_ack() {
3758 let mut s = socket_syn_sent();
3759 recv!(
3760 s,
3761 [TcpRepr {
3762 control: TcpControl::Syn,
3763 seq_number: LOCAL_SEQ,
3764 ack_number: None,
3765 max_seg_size: Some(BASE_MSS),
3766 window_scale: Some(0),
3767 sack_permitted: true,
3768 ..RECV_TEMPL
3769 }]
3770 );
3771
3772 send!(
3774 s,
3775 TcpRepr {
3776 control: TcpControl::Syn,
3777 seq_number: REMOTE_SEQ,
3778 ack_number: None,
3779 max_seg_size: Some(BASE_MSS - 80),
3780 window_scale: Some(0),
3781 ..SEND_TEMPL
3782 }
3783 );
3784 assert_eq!(s.state, State::SynReceived);
3785
3786 recv!(
3788 s,
3789 [TcpRepr {
3790 control: TcpControl::Syn,
3791 seq_number: LOCAL_SEQ,
3792 ack_number: Some(REMOTE_SEQ + 1),
3793 max_seg_size: Some(BASE_MSS),
3794 window_scale: Some(0),
3795 ..RECV_TEMPL
3796 }]
3797 );
3798 recv_nothing!(s);
3799
3800 recv!(
3802 s,
3803 time 1001,
3804 Ok(TcpRepr {
3805 control: TcpControl::Syn,
3806 seq_number: LOCAL_SEQ,
3807 ack_number: Some(REMOTE_SEQ + 1),
3808 max_seg_size: Some(BASE_MSS),
3809 window_scale: Some(0),
3810 ..RECV_TEMPL
3811 })
3812 );
3813
3814 send!(
3816 s,
3817 TcpRepr {
3818 control: TcpControl::None,
3819 seq_number: REMOTE_SEQ + 1,
3820 ack_number: Some(LOCAL_SEQ + 1),
3821 ..SEND_TEMPL
3822 }
3823 );
3824 assert_eq!(s.state, State::Established);
3825 sanity!(s, socket_established());
3826 }
3827
3828 #[test]
3829 fn test_syn_sent_syn_ack_not_incremented() {
3830 let mut s = socket_syn_sent();
3831 recv!(
3832 s,
3833 [TcpRepr {
3834 control: TcpControl::Syn,
3835 seq_number: LOCAL_SEQ,
3836 ack_number: None,
3837 max_seg_size: Some(BASE_MSS),
3838 window_scale: Some(0),
3839 sack_permitted: true,
3840 ..RECV_TEMPL
3841 }]
3842 );
3843 send!(
3844 s,
3845 TcpRepr {
3846 control: TcpControl::Syn,
3847 seq_number: REMOTE_SEQ,
3848 ack_number: Some(LOCAL_SEQ), max_seg_size: Some(BASE_MSS - 80),
3850 window_scale: Some(0),
3851 ..SEND_TEMPL
3852 },
3853 Some(TcpRepr {
3854 control: TcpControl::Rst,
3855 seq_number: LOCAL_SEQ,
3856 ack_number: None,
3857 window_len: 0,
3858 ..RECV_TEMPL
3859 })
3860 );
3861 assert_eq!(s.state, State::SynSent);
3862 }
3863
3864 #[test]
3865 fn test_syn_sent_syn_received_rst() {
3866 let mut s = socket_syn_sent();
3867 recv!(
3868 s,
3869 [TcpRepr {
3870 control: TcpControl::Syn,
3871 seq_number: LOCAL_SEQ,
3872 ack_number: None,
3873 max_seg_size: Some(BASE_MSS),
3874 window_scale: Some(0),
3875 sack_permitted: true,
3876 ..RECV_TEMPL
3877 }]
3878 );
3879
3880 send!(
3882 s,
3883 TcpRepr {
3884 control: TcpControl::Syn,
3885 seq_number: REMOTE_SEQ,
3886 ack_number: None,
3887 max_seg_size: Some(BASE_MSS - 80),
3888 window_scale: Some(0),
3889 ..SEND_TEMPL
3890 }
3891 );
3892 assert_eq!(s.state, State::SynReceived);
3893
3894 send!(
3896 s,
3897 TcpRepr {
3898 control: TcpControl::Rst,
3899 seq_number: REMOTE_SEQ + 1,
3900 ack_number: Some(LOCAL_SEQ),
3901 ..SEND_TEMPL
3902 }
3903 );
3904 assert_eq!(s.state, State::Closed);
3905 }
3906
3907 #[test]
3908 fn test_syn_sent_rst() {
3909 let mut s = socket_syn_sent();
3910 send!(
3911 s,
3912 TcpRepr {
3913 control: TcpControl::Rst,
3914 seq_number: REMOTE_SEQ,
3915 ack_number: Some(LOCAL_SEQ + 1),
3916 ..SEND_TEMPL
3917 }
3918 );
3919 assert_eq!(s.state, State::Closed);
3920 }
3921
3922 #[test]
3923 fn test_syn_sent_rst_no_ack() {
3924 let mut s = socket_syn_sent();
3925 send!(
3926 s,
3927 TcpRepr {
3928 control: TcpControl::Rst,
3929 seq_number: REMOTE_SEQ,
3930 ack_number: None,
3931 ..SEND_TEMPL
3932 }
3933 );
3934 assert_eq!(s.state, State::SynSent);
3935 }
3936
3937 #[test]
3938 fn test_syn_sent_rst_bad_ack() {
3939 let mut s = socket_syn_sent();
3940 send!(
3941 s,
3942 TcpRepr {
3943 control: TcpControl::Rst,
3944 seq_number: REMOTE_SEQ,
3945 ack_number: Some(TcpSeqNumber(1234)),
3946 ..SEND_TEMPL
3947 }
3948 );
3949 assert_eq!(s.state, State::SynSent);
3950 }
3951
3952 #[test]
3953 fn test_syn_sent_bad_ack() {
3954 let mut s = socket_syn_sent();
3955 recv!(
3956 s,
3957 [TcpRepr {
3958 control: TcpControl::Syn,
3959 seq_number: LOCAL_SEQ,
3960 ack_number: None,
3961 max_seg_size: Some(BASE_MSS),
3962 window_scale: Some(0),
3963 sack_permitted: true,
3964 ..RECV_TEMPL
3965 }]
3966 );
3967 send!(
3968 s,
3969 TcpRepr {
3970 control: TcpControl::None, seq_number: REMOTE_SEQ,
3972 ack_number: Some(LOCAL_SEQ + 1), ..SEND_TEMPL
3974 }
3975 );
3976
3977 recv!(s, []);
3979 assert_eq!(s.state, State::SynSent);
3980 }
3981
3982 #[test]
3983 fn test_syn_sent_bad_ack_seq_1() {
3984 let mut s = socket_syn_sent();
3985 recv!(
3986 s,
3987 [TcpRepr {
3988 control: TcpControl::Syn,
3989 seq_number: LOCAL_SEQ,
3990 ack_number: None,
3991 max_seg_size: Some(BASE_MSS),
3992 window_scale: Some(0),
3993 sack_permitted: true,
3994 ..RECV_TEMPL
3995 }]
3996 );
3997 send!(
3998 s,
3999 TcpRepr {
4000 control: TcpControl::None,
4001 seq_number: REMOTE_SEQ,
4002 ack_number: Some(LOCAL_SEQ), ..SEND_TEMPL
4004 },
4005 Some(TcpRepr {
4006 control: TcpControl::Rst,
4007 seq_number: LOCAL_SEQ, ack_number: None,
4009 window_len: 0,
4010 ..RECV_TEMPL
4011 })
4012 );
4013
4014 assert_eq!(s.state, State::SynSent);
4016 }
4017
4018 #[test]
4019 fn test_syn_sent_bad_ack_seq_2() {
4020 let mut s = socket_syn_sent();
4021 recv!(
4022 s,
4023 [TcpRepr {
4024 control: TcpControl::Syn,
4025 seq_number: LOCAL_SEQ,
4026 ack_number: None,
4027 max_seg_size: Some(BASE_MSS),
4028 window_scale: Some(0),
4029 sack_permitted: true,
4030 ..RECV_TEMPL
4031 }]
4032 );
4033 send!(
4034 s,
4035 TcpRepr {
4036 control: TcpControl::None,
4037 seq_number: REMOTE_SEQ,
4038 ack_number: Some(LOCAL_SEQ + 123456), ..SEND_TEMPL
4040 },
4041 Some(TcpRepr {
4042 control: TcpControl::Rst,
4043 seq_number: LOCAL_SEQ + 123456, ack_number: None,
4045 window_len: 0,
4046 ..RECV_TEMPL
4047 })
4048 );
4049
4050 assert_eq!(s.state, State::SynSent);
4052 }
4053
4054 #[test]
4055 fn test_syn_sent_close() {
4056 let mut s = socket();
4057 s.close();
4058 assert_eq!(s.state, State::Closed);
4059 }
4060
4061 #[test]
4062 fn test_syn_sent_sack_option() {
4063 let mut s = socket_syn_sent();
4064 recv!(
4065 s,
4066 [TcpRepr {
4067 control: TcpControl::Syn,
4068 seq_number: LOCAL_SEQ,
4069 ack_number: None,
4070 max_seg_size: Some(BASE_MSS),
4071 window_scale: Some(0),
4072 sack_permitted: true,
4073 ..RECV_TEMPL
4074 }]
4075 );
4076 send!(
4077 s,
4078 TcpRepr {
4079 control: TcpControl::Syn,
4080 seq_number: REMOTE_SEQ,
4081 ack_number: Some(LOCAL_SEQ + 1),
4082 max_seg_size: Some(BASE_MSS - 80),
4083 window_scale: Some(0),
4084 sack_permitted: true,
4085 ..SEND_TEMPL
4086 }
4087 );
4088 assert!(s.remote_has_sack);
4089
4090 let mut s = socket_syn_sent();
4091 recv!(
4092 s,
4093 [TcpRepr {
4094 control: TcpControl::Syn,
4095 seq_number: LOCAL_SEQ,
4096 ack_number: None,
4097 max_seg_size: Some(BASE_MSS),
4098 window_scale: Some(0),
4099 sack_permitted: true,
4100 ..RECV_TEMPL
4101 }]
4102 );
4103 send!(
4104 s,
4105 TcpRepr {
4106 control: TcpControl::Syn,
4107 seq_number: REMOTE_SEQ,
4108 ack_number: Some(LOCAL_SEQ + 1),
4109 max_seg_size: Some(BASE_MSS - 80),
4110 window_scale: Some(0),
4111 sack_permitted: false,
4112 ..SEND_TEMPL
4113 }
4114 );
4115 assert!(!s.remote_has_sack);
4116 }
4117
4118 #[test]
4119 fn test_syn_sent_win_scale_buffers() {
4120 for (buffer_size, shift_amt) in &[
4121 (64, 0),
4122 (128, 0),
4123 (1024, 0),
4124 (65535, 0),
4125 (65536, 1),
4126 (65537, 1),
4127 (131071, 1),
4128 (131072, 2),
4129 (524287, 3),
4130 (524288, 4),
4131 (655350, 4),
4132 (1048576, 5),
4133 ] {
4134 let mut s = socket_with_buffer_sizes(64, *buffer_size);
4135 s.local_seq_no = LOCAL_SEQ;
4136 assert_eq!(s.remote_win_shift, *shift_amt);
4137 s.socket.connect(&mut s.cx, REMOTE_END, LOCAL_END).unwrap();
4138 recv!(
4139 s,
4140 [TcpRepr {
4141 control: TcpControl::Syn,
4142 seq_number: LOCAL_SEQ,
4143 ack_number: None,
4144 max_seg_size: Some(BASE_MSS),
4145 window_scale: Some(*shift_amt),
4146 window_len: u16::try_from(*buffer_size).unwrap_or(u16::MAX),
4147 sack_permitted: true,
4148 ..RECV_TEMPL
4149 }]
4150 );
4151 }
4152 }
4153
4154 #[test]
4155 fn test_syn_sent_syn_ack_no_window_scaling() {
4156 let mut s = socket_syn_sent_with_buffer_sizes(1048576, 1048576);
4157 recv!(
4158 s,
4159 [TcpRepr {
4160 control: TcpControl::Syn,
4161 seq_number: LOCAL_SEQ,
4162 ack_number: None,
4163 max_seg_size: Some(BASE_MSS),
4164 window_len: 65535,
4166 window_scale: Some(5),
4167 sack_permitted: true,
4168 ..RECV_TEMPL
4169 }]
4170 );
4171 assert_eq!(s.remote_win_shift, 5);
4172 send!(
4173 s,
4174 TcpRepr {
4175 control: TcpControl::Syn,
4176 seq_number: REMOTE_SEQ,
4177 ack_number: Some(LOCAL_SEQ + 1),
4178 max_seg_size: Some(BASE_MSS - 80),
4179 window_scale: None,
4180 window_len: 42,
4181 ..SEND_TEMPL
4182 }
4183 );
4184 assert_eq!(s.state, State::Established);
4185 assert_eq!(s.remote_win_shift, 0);
4186 assert_eq!(s.remote_win_scale, None);
4187 assert_eq!(s.remote_win_len, 42);
4188 }
4189
4190 #[test]
4191 fn test_syn_sent_syn_ack_window_scaling() {
4192 let mut s = socket_syn_sent();
4193 recv!(
4194 s,
4195 [TcpRepr {
4196 control: TcpControl::Syn,
4197 seq_number: LOCAL_SEQ,
4198 ack_number: None,
4199 max_seg_size: Some(BASE_MSS),
4200 window_scale: Some(0),
4201 sack_permitted: true,
4202 ..RECV_TEMPL
4203 }]
4204 );
4205 send!(
4206 s,
4207 TcpRepr {
4208 control: TcpControl::Syn,
4209 seq_number: REMOTE_SEQ,
4210 ack_number: Some(LOCAL_SEQ + 1),
4211 max_seg_size: Some(BASE_MSS - 80),
4212 window_scale: Some(7),
4213 window_len: 42,
4214 ..SEND_TEMPL
4215 }
4216 );
4217 assert_eq!(s.state, State::Established);
4218 assert_eq!(s.remote_win_scale, Some(7));
4219 assert_eq!(s.remote_win_len, 42);
4221 }
4222
4223 #[test]
4228 fn test_established_recv() {
4229 let mut s = socket_established();
4230 send!(
4231 s,
4232 TcpRepr {
4233 seq_number: REMOTE_SEQ + 1,
4234 ack_number: Some(LOCAL_SEQ + 1),
4235 payload: &b"abcdef"[..],
4236 ..SEND_TEMPL
4237 }
4238 );
4239 recv!(
4240 s,
4241 [TcpRepr {
4242 seq_number: LOCAL_SEQ + 1,
4243 ack_number: Some(REMOTE_SEQ + 1 + 6),
4244 window_len: 58,
4245 ..RECV_TEMPL
4246 }]
4247 );
4248 assert_eq!(s.rx_buffer.dequeue_many(6), &b"abcdef"[..]);
4249 }
4250
4251 #[test]
4252 fn test_peek_slice() {
4253 const BUF_SIZE: usize = 10;
4254
4255 let send_buf = b"0123456";
4256
4257 let mut s = socket_established_with_buffer_sizes(BUF_SIZE, BUF_SIZE);
4258
4259 send!(
4261 s,
4262 TcpRepr {
4263 seq_number: REMOTE_SEQ + 1,
4264 ack_number: Some(LOCAL_SEQ + 1),
4265 payload: &send_buf[..],
4266 ..SEND_TEMPL
4267 }
4268 );
4269
4270 let mut peeked_buf = [0u8; BUF_SIZE];
4272 let actually_peeked = s.peek_slice(&mut peeked_buf[..]).unwrap();
4273 let mut recv_buf = [0u8; BUF_SIZE];
4274 let actually_recvd = s.recv_slice(&mut recv_buf[..]).unwrap();
4275 assert_eq!(
4276 &mut peeked_buf[..actually_peeked],
4277 &mut recv_buf[..actually_recvd]
4278 );
4279 }
4280
4281 #[test]
4282 fn test_peek_slice_buffer_wrap() {
4283 const BUF_SIZE: usize = 10;
4284
4285 let send_buf = b"0123456789";
4286
4287 let mut s = socket_established_with_buffer_sizes(BUF_SIZE, BUF_SIZE);
4288
4289 let _ = s.rx_buffer.enqueue_slice(&send_buf[..8]);
4290 let _ = s.rx_buffer.dequeue_many(6);
4291 let _ = s.rx_buffer.enqueue_slice(&send_buf[..5]);
4292
4293 let mut peeked_buf = [0u8; BUF_SIZE];
4294 let actually_peeked = s.peek_slice(&mut peeked_buf[..]).unwrap();
4295 let mut recv_buf = [0u8; BUF_SIZE];
4296 let actually_recvd = s.recv_slice(&mut recv_buf[..]).unwrap();
4297 assert_eq!(
4298 &mut peeked_buf[..actually_peeked],
4299 &mut recv_buf[..actually_recvd]
4300 );
4301 }
4302
4303 fn setup_rfc2018_cases() -> (TestSocket, Vec<u8>) {
4304 let mut s = socket_established_with_buffer_sizes(4000, 4000);
4310 s.remote_has_sack = true;
4311
4312 let mut segment: Vec<u8> = Vec::with_capacity(500);
4314
4315 for _ in 0..50 {
4317 segment.extend_from_slice(b"abcdefghij")
4318 }
4319 for offset in (0..5000).step_by(500) {
4320 send!(
4321 s,
4322 TcpRepr {
4323 seq_number: REMOTE_SEQ + 1 + offset,
4324 ack_number: Some(LOCAL_SEQ + 1),
4325 payload: &segment,
4326 ..SEND_TEMPL
4327 }
4328 );
4329 recv!(
4330 s,
4331 [TcpRepr {
4332 seq_number: LOCAL_SEQ + 1,
4333 ack_number: Some(REMOTE_SEQ + 1 + offset + 500),
4334 window_len: 3500,
4335 ..RECV_TEMPL
4336 }]
4337 );
4338 s.recv(|data| {
4339 assert_eq!(data.len(), 500);
4340 assert_eq!(data, segment.as_slice());
4341 (500, ())
4342 })
4343 .unwrap();
4344 }
4345 assert_eq!(s.remote_last_win, 3500);
4346 (s, segment)
4347 }
4348
4349 #[test]
4350 fn test_established_rfc2018_cases() {
4351 let (mut s, segment) = setup_rfc2018_cases();
4355 for offset in (500..3500).step_by(500) {
4376 send!(
4377 s,
4378 TcpRepr {
4379 seq_number: REMOTE_SEQ + 1 + offset + 5000,
4380 ack_number: Some(LOCAL_SEQ + 1),
4381 payload: &segment,
4382 ..SEND_TEMPL
4383 },
4384 Some(TcpRepr {
4385 seq_number: LOCAL_SEQ + 1,
4386 ack_number: Some(REMOTE_SEQ + 1 + 5000),
4387 window_len: 4000,
4388 sack_ranges: [
4389 Some((
4390 REMOTE_SEQ.0 as u32 + 1 + 5500,
4391 REMOTE_SEQ.0 as u32 + 1 + 5500 + offset as u32
4392 )),
4393 None,
4394 None
4395 ],
4396 ..RECV_TEMPL
4397 })
4398 );
4399 }
4400 }
4401
4402 #[test]
4403 fn test_established_sliding_window_recv() {
4404 let mut s = socket_established();
4405 assert_eq!(s.rx_buffer.len(), 0);
4407 s.rx_buffer = SocketBuffer::new(vec![0; 262143]);
4408 s.assembler = Assembler::new();
4409 s.remote_win_scale = Some(0);
4410 s.remote_last_win = 65535;
4411 s.remote_win_shift = 2;
4412
4413 let mut segment: Vec<u8> = Vec::with_capacity(1400);
4415 for _ in 0..100 {
4416 segment.extend_from_slice(b"abcdefghijklmn")
4417 }
4418 assert_eq!(segment.len(), 1400);
4419
4420 send!(
4422 s,
4423 TcpRepr {
4424 seq_number: REMOTE_SEQ + 1,
4425 ack_number: Some(LOCAL_SEQ + 1),
4426 payload: &segment,
4427 ..SEND_TEMPL
4428 }
4429 );
4430
4431 recv!(
4433 s,
4434 [TcpRepr {
4435 seq_number: LOCAL_SEQ + 1,
4436 ack_number: Some(REMOTE_SEQ + 1 + 1400),
4437 window_len: 65185,
4438 ..RECV_TEMPL
4439 }]
4440 );
4441 }
4442
4443 #[test]
4444 fn test_established_send() {
4445 let mut s = socket_established();
4446 s.send_slice(b"abcdef").unwrap();
4448 recv!(
4449 s,
4450 [TcpRepr {
4451 seq_number: LOCAL_SEQ + 1,
4452 ack_number: Some(REMOTE_SEQ + 1),
4453 payload: &b"abcdef"[..],
4454 ..RECV_TEMPL
4455 }]
4456 );
4457 assert_eq!(s.tx_buffer.len(), 6);
4458 send!(
4459 s,
4460 TcpRepr {
4461 seq_number: REMOTE_SEQ + 1,
4462 ack_number: Some(LOCAL_SEQ + 1 + 6),
4463 ..SEND_TEMPL
4464 }
4465 );
4466 assert_eq!(s.tx_buffer.len(), 0);
4467 s.send_slice(b"foobar").unwrap();
4469 recv!(
4470 s,
4471 [TcpRepr {
4472 seq_number: LOCAL_SEQ + 1 + 6,
4473 ack_number: Some(REMOTE_SEQ + 1),
4474 payload: &b"foobar"[..],
4475 ..RECV_TEMPL
4476 }]
4477 );
4478 send!(
4479 s,
4480 TcpRepr {
4481 seq_number: REMOTE_SEQ + 1,
4482 ack_number: Some(LOCAL_SEQ + 1 + 6 + 6),
4483 ..SEND_TEMPL
4484 }
4485 );
4486 assert_eq!(s.tx_buffer.len(), 0);
4487 }
4488
4489 #[test]
4490 fn test_established_send_no_ack_send() {
4491 let mut s = socket_established();
4492 s.set_nagle_enabled(false);
4493 s.send_slice(b"abcdef").unwrap();
4494 recv!(
4495 s,
4496 [TcpRepr {
4497 seq_number: LOCAL_SEQ + 1,
4498 ack_number: Some(REMOTE_SEQ + 1),
4499 payload: &b"abcdef"[..],
4500 ..RECV_TEMPL
4501 }]
4502 );
4503 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 }
4514
4515 #[test]
4516 fn test_established_send_buf_gt_win() {
4517 let mut data = [0; 32];
4518 for (i, elem) in data.iter_mut().enumerate() {
4519 *elem = i as u8
4520 }
4521
4522 let mut s = socket_established();
4523 s.remote_win_len = 16;
4524 s.send_slice(&data[..]).unwrap();
4525 recv!(
4526 s,
4527 [TcpRepr {
4528 seq_number: LOCAL_SEQ + 1,
4529 ack_number: Some(REMOTE_SEQ + 1),
4530 payload: &data[0..16],
4531 ..RECV_TEMPL
4532 }]
4533 );
4534 }
4535
4536 #[test]
4537 fn test_established_send_window_shrink() {
4538 let mut s = socket_established();
4539
4540 s.send_slice(b"abcdef").unwrap();
4542 recv!(
4543 s,
4544 [TcpRepr {
4545 seq_number: LOCAL_SEQ + 1,
4546 ack_number: Some(REMOTE_SEQ + 1),
4547 payload: &b"abcdef"[..],
4548 ..RECV_TEMPL
4549 }]
4550 );
4551 assert_eq!(s.tx_buffer.len(), 6);
4552
4553 println!(
4554 "local_seq_no={} remote_win_len={} remote_last_seq={}",
4555 s.local_seq_no, s.remote_win_len, s.remote_last_seq
4556 );
4557
4558 send!(
4563 s,
4564 TcpRepr {
4565 seq_number: REMOTE_SEQ + 1,
4566 ack_number: Some(LOCAL_SEQ + 1),
4567 window_len: 3,
4568 payload: &b"xyzxyz"[..],
4569 ..SEND_TEMPL
4570 }
4571 );
4572 assert_eq!(s.tx_buffer.len(), 6);
4573
4574 println!(
4575 "local_seq_no={} remote_win_len={} remote_last_seq={}",
4576 s.local_seq_no, s.remote_win_len, s.remote_last_seq
4577 );
4578
4579 s.send_slice(b"foobar").unwrap();
4581 recv!(
4582 s,
4583 [TcpRepr {
4584 seq_number: LOCAL_SEQ + 1 + 6,
4585 ack_number: Some(REMOTE_SEQ + 1 + 6),
4586 window_len: 64 - 6,
4587 ..RECV_TEMPL
4588 }]
4589 );
4590 }
4591
4592 #[test]
4593 fn test_established_receive_partially_outside_window() {
4594 let mut s = socket_established();
4595
4596 send!(
4597 s,
4598 TcpRepr {
4599 seq_number: REMOTE_SEQ + 1,
4600 ack_number: Some(LOCAL_SEQ + 1),
4601 payload: &b"abc"[..],
4602 ..SEND_TEMPL
4603 }
4604 );
4605
4606 s.recv(|data| {
4607 assert_eq!(data, b"abc");
4608 (3, ())
4609 })
4610 .unwrap();
4611
4612 send!(
4615 s,
4616 TcpRepr {
4617 seq_number: REMOTE_SEQ + 1,
4618 ack_number: Some(LOCAL_SEQ + 1),
4619 payload: &b"abcdef"[..],
4620 ..SEND_TEMPL
4621 }
4622 );
4623
4624 s.recv(|data| {
4625 assert_eq!(data, b"def");
4626 (3, ())
4627 })
4628 .unwrap();
4629 }
4630
4631 #[test]
4632 fn test_established_receive_partially_outside_window_fin() {
4633 let mut s = socket_established();
4634
4635 send!(
4636 s,
4637 TcpRepr {
4638 seq_number: REMOTE_SEQ + 1,
4639 ack_number: Some(LOCAL_SEQ + 1),
4640 payload: &b"abc"[..],
4641 ..SEND_TEMPL
4642 }
4643 );
4644
4645 s.recv(|data| {
4646 assert_eq!(data, b"abc");
4647 (3, ())
4648 })
4649 .unwrap();
4650
4651 send!(
4654 s,
4655 TcpRepr {
4656 seq_number: REMOTE_SEQ + 1,
4657 ack_number: Some(LOCAL_SEQ + 1),
4658 control: TcpControl::Fin,
4659 payload: &b"abcdef"[..],
4660 ..SEND_TEMPL
4661 }
4662 );
4663
4664 s.recv(|data| {
4665 assert_eq!(data, b"def");
4666 (3, ())
4667 })
4668 .unwrap();
4669
4670 assert_eq!(s.state, State::CloseWait);
4673 }
4674
4675 #[test]
4676 fn test_established_send_wrap() {
4677 let mut s = socket_established();
4678 let local_seq_start = TcpSeqNumber(i32::MAX - 1);
4679 s.local_seq_no = local_seq_start + 1;
4680 s.remote_last_seq = local_seq_start + 1;
4681 s.send_slice(b"abc").unwrap();
4682 recv!(s, time 1000, Ok(TcpRepr {
4683 seq_number: local_seq_start + 1,
4684 ack_number: Some(REMOTE_SEQ + 1),
4685 payload: &b"abc"[..],
4686 ..RECV_TEMPL
4687 }));
4688 }
4689
4690 #[test]
4691 fn test_established_no_ack() {
4692 let mut s = socket_established();
4693 send!(
4694 s,
4695 TcpRepr {
4696 seq_number: REMOTE_SEQ + 1,
4697 ack_number: None,
4698 ..SEND_TEMPL
4699 }
4700 );
4701 }
4702
4703 #[test]
4704 fn test_established_bad_ack() {
4705 let mut s = socket_established();
4706 send!(
4708 s,
4709 TcpRepr {
4710 seq_number: REMOTE_SEQ + 1,
4711 ack_number: Some(TcpSeqNumber(LOCAL_SEQ.0 - 1)),
4712 ..SEND_TEMPL
4713 }
4714 );
4715 assert_eq!(s.local_seq_no, LOCAL_SEQ + 1);
4716 send!(
4718 s,
4719 TcpRepr {
4720 seq_number: REMOTE_SEQ + 1,
4721 ack_number: Some(LOCAL_SEQ + 10),
4722 ..SEND_TEMPL
4723 },
4724 Some(TcpRepr {
4725 seq_number: LOCAL_SEQ + 1,
4726 ack_number: Some(REMOTE_SEQ + 1),
4727 ..RECV_TEMPL
4728 })
4729 );
4730 assert_eq!(s.local_seq_no, LOCAL_SEQ + 1);
4731 }
4732
4733 #[test]
4734 fn test_established_bad_seq() {
4735 let mut s = socket_established();
4736 send!(
4738 s,
4739 TcpRepr {
4740 seq_number: REMOTE_SEQ + 1 + 256,
4741 ack_number: Some(LOCAL_SEQ + 1),
4742 ..SEND_TEMPL
4743 },
4744 Some(TcpRepr {
4745 seq_number: LOCAL_SEQ + 1,
4746 ack_number: Some(REMOTE_SEQ + 1),
4747 ..RECV_TEMPL
4748 })
4749 );
4750 assert_eq!(s.remote_seq_no, REMOTE_SEQ + 1);
4751
4752 send!(
4754 s,
4755 time 100,
4756 TcpRepr {
4757 seq_number: REMOTE_SEQ + 1 + 256,
4758 ack_number: Some(LOCAL_SEQ + 1),
4759 ..SEND_TEMPL
4760 }
4761 );
4762
4763 send!(
4765 s,
4766 time 2000,
4767 TcpRepr {
4768 seq_number: REMOTE_SEQ + 1 + 256,
4769 ack_number: Some(LOCAL_SEQ + 1),
4770 ..SEND_TEMPL
4771 },
4772 Some(TcpRepr {
4773 seq_number: LOCAL_SEQ + 1,
4774 ack_number: Some(REMOTE_SEQ + 1),
4775 ..RECV_TEMPL
4776 })
4777 );
4778 assert_eq!(s.remote_seq_no, REMOTE_SEQ + 1);
4779 }
4780
4781 #[test]
4782 fn test_established_fin() {
4783 let mut s = socket_established();
4784 send!(
4785 s,
4786 TcpRepr {
4787 control: TcpControl::Fin,
4788 seq_number: REMOTE_SEQ + 1,
4789 ack_number: Some(LOCAL_SEQ + 1),
4790 ..SEND_TEMPL
4791 }
4792 );
4793 recv!(
4794 s,
4795 [TcpRepr {
4796 seq_number: LOCAL_SEQ + 1,
4797 ack_number: Some(REMOTE_SEQ + 1 + 1),
4798 ..RECV_TEMPL
4799 }]
4800 );
4801 assert_eq!(s.state, State::CloseWait);
4802 sanity!(s, socket_close_wait());
4803 }
4804
4805 #[test]
4806 fn test_established_fin_after_missing() {
4807 let mut s = socket_established();
4808 send!(
4809 s,
4810 TcpRepr {
4811 control: TcpControl::Fin,
4812 seq_number: REMOTE_SEQ + 1 + 6,
4813 ack_number: Some(LOCAL_SEQ + 1),
4814 payload: &b"123456"[..],
4815 ..SEND_TEMPL
4816 },
4817 Some(TcpRepr {
4818 seq_number: LOCAL_SEQ + 1,
4819 ack_number: Some(REMOTE_SEQ + 1),
4820 ..RECV_TEMPL
4821 })
4822 );
4823 assert_eq!(s.state, State::Established);
4824 send!(
4825 s,
4826 TcpRepr {
4827 seq_number: REMOTE_SEQ + 1,
4828 ack_number: Some(LOCAL_SEQ + 1),
4829 payload: &b"abcdef"[..],
4830 ..SEND_TEMPL
4831 },
4832 Some(TcpRepr {
4833 seq_number: LOCAL_SEQ + 1,
4834 ack_number: Some(REMOTE_SEQ + 1 + 6 + 6),
4835 window_len: 52,
4836 ..RECV_TEMPL
4837 })
4838 );
4839 assert_eq!(s.state, State::Established);
4840 }
4841
4842 #[test]
4843 fn test_established_send_fin() {
4844 let mut s = socket_established();
4845 s.send_slice(b"abcdef").unwrap();
4846 send!(
4847 s,
4848 TcpRepr {
4849 control: TcpControl::Fin,
4850 seq_number: REMOTE_SEQ + 1,
4851 ack_number: Some(LOCAL_SEQ + 1),
4852 ..SEND_TEMPL
4853 }
4854 );
4855 assert_eq!(s.state, State::CloseWait);
4856 recv!(
4857 s,
4858 [TcpRepr {
4859 seq_number: LOCAL_SEQ + 1,
4860 ack_number: Some(REMOTE_SEQ + 1 + 1),
4861 payload: &b"abcdef"[..],
4862 ..RECV_TEMPL
4863 }]
4864 );
4865 }
4866
4867 #[test]
4868 fn test_established_rst() {
4869 let mut s = socket_established();
4870 send!(
4871 s,
4872 TcpRepr {
4873 control: TcpControl::Rst,
4874 seq_number: REMOTE_SEQ + 1,
4875 ack_number: Some(LOCAL_SEQ + 1),
4876 ..SEND_TEMPL
4877 }
4878 );
4879 assert_eq!(s.state, State::Closed);
4880 }
4881
4882 #[test]
4883 fn test_established_rst_no_ack() {
4884 let mut s = socket_established();
4885 send!(
4886 s,
4887 TcpRepr {
4888 control: TcpControl::Rst,
4889 seq_number: REMOTE_SEQ + 1,
4890 ack_number: None,
4891 ..SEND_TEMPL
4892 }
4893 );
4894 assert_eq!(s.state, State::Closed);
4895 }
4896
4897 #[test]
4898 fn test_established_close() {
4899 let mut s = socket_established();
4900 s.close();
4901 assert_eq!(s.state, State::FinWait1);
4902 sanity!(s, socket_fin_wait_1());
4903 }
4904
4905 #[test]
4906 fn test_established_abort() {
4907 let mut s = socket_established();
4908 s.abort();
4909 assert_eq!(s.state, State::Closed);
4910 recv!(
4911 s,
4912 [TcpRepr {
4913 control: TcpControl::Rst,
4914 seq_number: LOCAL_SEQ + 1,
4915 ack_number: Some(REMOTE_SEQ + 1),
4916 ..RECV_TEMPL
4917 }]
4918 );
4919 }
4920
4921 #[test]
4922 fn test_established_rst_bad_seq() {
4923 let mut s = socket_established();
4924 send!(
4925 s,
4926 TcpRepr {
4927 control: TcpControl::Rst,
4928 seq_number: REMOTE_SEQ, ack_number: None,
4930 ..SEND_TEMPL
4931 },
4932 Some(TcpRepr {
4933 seq_number: LOCAL_SEQ + 1,
4934 ack_number: Some(REMOTE_SEQ + 1),
4935 ..RECV_TEMPL
4936 })
4937 );
4938
4939 assert_eq!(s.state, State::Established);
4940
4941 send!(
4943 s,
4944 TcpRepr {
4945 seq_number: REMOTE_SEQ + 1, ack_number: Some(LOCAL_SEQ + 1),
4947 payload: &b"a"[..],
4948 ..SEND_TEMPL
4949 }
4950 );
4951
4952 send!(
4956 s,
4957 time 2000,
4958 TcpRepr {
4959 control: TcpControl::Rst,
4960 seq_number: REMOTE_SEQ, ack_number: None,
4962 ..SEND_TEMPL
4963 },
4964 Some(TcpRepr {
4965 seq_number: LOCAL_SEQ + 1,
4966 ack_number: Some(REMOTE_SEQ + 2), window_len: 63,
4968 ..RECV_TEMPL
4969 })
4970 );
4971 }
4972
4973 #[test]
4978 fn test_fin_wait_1_fin_ack() {
4979 let mut s = socket_fin_wait_1();
4980 recv!(
4981 s,
4982 [TcpRepr {
4983 control: TcpControl::Fin,
4984 seq_number: LOCAL_SEQ + 1,
4985 ack_number: Some(REMOTE_SEQ + 1),
4986 ..RECV_TEMPL
4987 }]
4988 );
4989 send!(
4990 s,
4991 TcpRepr {
4992 seq_number: REMOTE_SEQ + 1,
4993 ack_number: Some(LOCAL_SEQ + 1 + 1),
4994 ..SEND_TEMPL
4995 }
4996 );
4997 assert_eq!(s.state, State::FinWait2);
4998 sanity!(s, socket_fin_wait_2());
4999 }
5000
5001 #[test]
5002 fn test_fin_wait_1_fin_fin() {
5003 let mut s = socket_fin_wait_1();
5004 recv!(
5005 s,
5006 [TcpRepr {
5007 control: TcpControl::Fin,
5008 seq_number: LOCAL_SEQ + 1,
5009 ack_number: Some(REMOTE_SEQ + 1),
5010 ..RECV_TEMPL
5011 }]
5012 );
5013 send!(
5014 s,
5015 TcpRepr {
5016 control: TcpControl::Fin,
5017 seq_number: REMOTE_SEQ + 1,
5018 ack_number: Some(LOCAL_SEQ + 1),
5019 ..SEND_TEMPL
5020 }
5021 );
5022 assert_eq!(s.state, State::Closing);
5023 sanity!(s, socket_closing());
5024 }
5025
5026 #[test]
5027 fn test_fin_wait_1_fin_with_data_queued() {
5028 let mut s = socket_established();
5029 s.remote_win_len = 6;
5030 s.send_slice(b"abcdef123456").unwrap();
5031 s.close();
5032 recv!(
5033 s,
5034 Ok(TcpRepr {
5035 seq_number: LOCAL_SEQ + 1,
5036 ack_number: Some(REMOTE_SEQ + 1),
5037 payload: &b"abcdef"[..],
5038 ..RECV_TEMPL
5039 })
5040 );
5041 send!(
5042 s,
5043 TcpRepr {
5044 seq_number: REMOTE_SEQ + 1,
5045 ack_number: Some(LOCAL_SEQ + 1 + 6),
5046 ..SEND_TEMPL
5047 }
5048 );
5049 assert_eq!(s.state, State::FinWait1);
5050 }
5051
5052 #[test]
5053 fn test_fin_wait_1_recv() {
5054 let mut s = socket_fin_wait_1();
5055 send!(
5056 s,
5057 TcpRepr {
5058 seq_number: REMOTE_SEQ + 1,
5059 ack_number: Some(LOCAL_SEQ + 1),
5060 payload: &b"abc"[..],
5061 ..SEND_TEMPL
5062 }
5063 );
5064 assert_eq!(s.state, State::FinWait1);
5065 s.recv(|data| {
5066 assert_eq!(data, b"abc");
5067 (3, ())
5068 })
5069 .unwrap();
5070 }
5071
5072 #[test]
5073 fn test_fin_wait_1_close() {
5074 let mut s = socket_fin_wait_1();
5075 s.close();
5076 assert_eq!(s.state, State::FinWait1);
5077 }
5078
5079 #[test]
5084 fn test_fin_wait_2_fin() {
5085 let mut s = socket_fin_wait_2();
5086 send!(s, time 1_000, TcpRepr {
5087 control: TcpControl::Fin,
5088 seq_number: REMOTE_SEQ + 1,
5089 ack_number: Some(LOCAL_SEQ + 1 + 1),
5090 ..SEND_TEMPL
5091 });
5092 assert_eq!(s.state, State::TimeWait);
5093 sanity!(s, socket_time_wait(false));
5094 }
5095
5096 #[test]
5097 fn test_fin_wait_2_recv() {
5098 let mut s = socket_fin_wait_2();
5099 send!(
5100 s,
5101 TcpRepr {
5102 seq_number: REMOTE_SEQ + 1,
5103 ack_number: Some(LOCAL_SEQ + 1 + 1),
5104 payload: &b"abc"[..],
5105 ..SEND_TEMPL
5106 }
5107 );
5108 assert_eq!(s.state, State::FinWait2);
5109 s.recv(|data| {
5110 assert_eq!(data, b"abc");
5111 (3, ())
5112 })
5113 .unwrap();
5114 recv!(
5115 s,
5116 [TcpRepr {
5117 seq_number: LOCAL_SEQ + 1 + 1,
5118 ack_number: Some(REMOTE_SEQ + 1 + 3),
5119 ..RECV_TEMPL
5120 }]
5121 );
5122 }
5123
5124 #[test]
5125 fn test_fin_wait_2_close() {
5126 let mut s = socket_fin_wait_2();
5127 s.close();
5128 assert_eq!(s.state, State::FinWait2);
5129 }
5130
5131 #[test]
5136 fn test_closing_ack_fin() {
5137 let mut s = socket_closing();
5138 recv!(
5139 s,
5140 [TcpRepr {
5141 seq_number: LOCAL_SEQ + 1 + 1,
5142 ack_number: Some(REMOTE_SEQ + 1 + 1),
5143 ..RECV_TEMPL
5144 }]
5145 );
5146 send!(s, time 1_000, TcpRepr {
5147 seq_number: REMOTE_SEQ + 1 + 1,
5148 ack_number: Some(LOCAL_SEQ + 1 + 1),
5149 ..SEND_TEMPL
5150 });
5151 assert_eq!(s.state, State::TimeWait);
5152 sanity!(s, socket_time_wait(true));
5153 }
5154
5155 #[test]
5156 fn test_closing_close() {
5157 let mut s = socket_closing();
5158 s.close();
5159 assert_eq!(s.state, State::Closing);
5160 }
5161
5162 #[test]
5167 fn test_time_wait_from_fin_wait_2_ack() {
5168 let mut s = socket_time_wait(false);
5169 recv!(
5170 s,
5171 [TcpRepr {
5172 seq_number: LOCAL_SEQ + 1 + 1,
5173 ack_number: Some(REMOTE_SEQ + 1 + 1),
5174 ..RECV_TEMPL
5175 }]
5176 );
5177 }
5178
5179 #[test]
5180 fn test_time_wait_from_closing_no_ack() {
5181 let mut s = socket_time_wait(true);
5182 recv!(s, []);
5183 }
5184
5185 #[test]
5186 fn test_time_wait_close() {
5187 let mut s = socket_time_wait(false);
5188 s.close();
5189 assert_eq!(s.state, State::TimeWait);
5190 }
5191
5192 #[test]
5193 fn test_time_wait_retransmit() {
5194 let mut s = socket_time_wait(false);
5195 recv!(
5196 s,
5197 [TcpRepr {
5198 seq_number: LOCAL_SEQ + 1 + 1,
5199 ack_number: Some(REMOTE_SEQ + 1 + 1),
5200 ..RECV_TEMPL
5201 }]
5202 );
5203 send!(s, time 5_000, TcpRepr {
5204 control: TcpControl::Fin,
5205 seq_number: REMOTE_SEQ + 1,
5206 ack_number: Some(LOCAL_SEQ + 1 + 1),
5207 ..SEND_TEMPL
5208 }, Some(TcpRepr {
5209 seq_number: LOCAL_SEQ + 1 + 1,
5210 ack_number: Some(REMOTE_SEQ + 1 + 1),
5211 ..RECV_TEMPL
5212 }));
5213 assert_eq!(
5214 s.timer,
5215 Timer::Close {
5216 expires_at: Instant::from_secs(5) + CLOSE_DELAY
5217 }
5218 );
5219 }
5220
5221 #[test]
5222 fn test_time_wait_timeout() {
5223 let mut s = socket_time_wait(false);
5224 recv!(
5225 s,
5226 [TcpRepr {
5227 seq_number: LOCAL_SEQ + 1 + 1,
5228 ack_number: Some(REMOTE_SEQ + 1 + 1),
5229 ..RECV_TEMPL
5230 }]
5231 );
5232 assert_eq!(s.state, State::TimeWait);
5233 recv_nothing!(s, time 60_000);
5234 assert_eq!(s.state, State::Closed);
5235 }
5236
5237 #[test]
5242 fn test_close_wait_ack() {
5243 let mut s = socket_close_wait();
5244 s.send_slice(b"abcdef").unwrap();
5245 recv!(
5246 s,
5247 [TcpRepr {
5248 seq_number: LOCAL_SEQ + 1,
5249 ack_number: Some(REMOTE_SEQ + 1 + 1),
5250 payload: &b"abcdef"[..],
5251 ..RECV_TEMPL
5252 }]
5253 );
5254 send!(
5255 s,
5256 TcpRepr {
5257 seq_number: REMOTE_SEQ + 1 + 1,
5258 ack_number: Some(LOCAL_SEQ + 1 + 6),
5259 ..SEND_TEMPL
5260 }
5261 );
5262 }
5263
5264 #[test]
5265 fn test_close_wait_close() {
5266 let mut s = socket_close_wait();
5267 s.close();
5268 assert_eq!(s.state, State::LastAck);
5269 sanity!(s, socket_last_ack());
5270 }
5271
5272 #[test]
5276 fn test_last_ack_fin_ack() {
5277 let mut s = socket_last_ack();
5278 recv!(
5279 s,
5280 [TcpRepr {
5281 control: TcpControl::Fin,
5282 seq_number: LOCAL_SEQ + 1,
5283 ack_number: Some(REMOTE_SEQ + 1 + 1),
5284 ..RECV_TEMPL
5285 }]
5286 );
5287 assert_eq!(s.state, State::LastAck);
5288 send!(
5289 s,
5290 TcpRepr {
5291 seq_number: REMOTE_SEQ + 1 + 1,
5292 ack_number: Some(LOCAL_SEQ + 1 + 1),
5293 ..SEND_TEMPL
5294 }
5295 );
5296 assert_eq!(s.state, State::Closed);
5297 }
5298
5299 #[test]
5300 fn test_last_ack_ack_not_of_fin() {
5301 let mut s = socket_last_ack();
5302 recv!(
5303 s,
5304 [TcpRepr {
5305 control: TcpControl::Fin,
5306 seq_number: LOCAL_SEQ + 1,
5307 ack_number: Some(REMOTE_SEQ + 1 + 1),
5308 ..RECV_TEMPL
5309 }]
5310 );
5311 assert_eq!(s.state, State::LastAck);
5312
5313 send!(
5316 s,
5317 TcpRepr {
5318 seq_number: REMOTE_SEQ + 1 + 1,
5319 ack_number: Some(LOCAL_SEQ + 1),
5320 ..SEND_TEMPL
5321 },
5322 Some(TcpRepr {
5323 seq_number: LOCAL_SEQ + 1 + 1,
5324 ack_number: Some(REMOTE_SEQ + 1 + 1),
5325 ..RECV_TEMPL
5326 })
5327 );
5328 assert_eq!(s.state, State::LastAck);
5329
5330 send!(
5332 s,
5333 TcpRepr {
5334 seq_number: REMOTE_SEQ + 1 + 1,
5335 ack_number: Some(LOCAL_SEQ + 1 + 1),
5336 ..SEND_TEMPL
5337 }
5338 );
5339 assert_eq!(s.state, State::Closed);
5340 }
5341
5342 #[test]
5345 fn test_last_ack_duplicate_ack_challenge_ack() {
5346 let mut s = socket_last_ack();
5347 recv!(
5349 s,
5350 [TcpRepr {
5351 control: TcpControl::Fin,
5352 seq_number: LOCAL_SEQ + 1,
5353 ack_number: Some(REMOTE_SEQ + 1 + 1),
5354 ..RECV_TEMPL
5355 }]
5356 );
5357 assert_eq!(s.state, State::LastAck);
5358
5359 let challenge = send(
5362 &mut s,
5363 Instant::from_millis(0),
5364 &TcpRepr {
5365 seq_number: REMOTE_SEQ + 1 + 1,
5366 ack_number: Some(LOCAL_SEQ + 1),
5367 ..SEND_TEMPL
5368 },
5369 );
5370 assert_eq!(
5371 challenge,
5372 Some(TcpRepr {
5373 seq_number: LOCAL_SEQ + 1 + 1,
5374 ack_number: Some(REMOTE_SEQ + 1 + 1),
5375 ..RECV_TEMPL
5376 }),
5377 "expected challenge ACK in response to duplicate ACK in LAST-ACK"
5378 );
5379 assert_eq!(s.state, State::LastAck);
5381
5382 send!(
5385 s,
5386 TcpRepr {
5387 seq_number: REMOTE_SEQ + 1 + 1,
5388 ack_number: Some(LOCAL_SEQ + 1 + 1),
5389 ..SEND_TEMPL
5390 }
5391 );
5392 assert_eq!(s.state, State::Closed);
5393 }
5394
5395 #[test]
5398 fn test_last_ack_partial_ack_no_challenge_ack() {
5399 let mut s = socket_last_ack();
5402 let _ = s.tx_buffer.enqueue_slice(b"x");
5404 s.remote_last_seq = LOCAL_SEQ + 1 + 1 + 1; send!(
5412 s,
5413 TcpRepr {
5414 seq_number: REMOTE_SEQ + 1 + 1,
5415 ack_number: Some(LOCAL_SEQ + 1 + 1), ..SEND_TEMPL
5417 }
5418 );
5419 assert_eq!(s.state, State::LastAck);
5421 assert_eq!(s.local_seq_no, LOCAL_SEQ + 1 + 1);
5423 }
5424
5425 #[test]
5426 fn test_last_ack_close() {
5427 let mut s = socket_last_ack();
5428 s.close();
5429 assert_eq!(s.state, State::LastAck);
5430 }
5431
5432 #[test]
5437 fn test_listen() {
5438 let mut s = socket();
5439 s.listen(LISTEN_END).unwrap();
5440 assert_eq!(s.state, State::Listen);
5441 }
5442
5443 #[test]
5444 fn test_three_way_handshake() {
5445 let mut s = socket_listen();
5446 send!(
5447 s,
5448 TcpRepr {
5449 control: TcpControl::Syn,
5450 seq_number: REMOTE_SEQ,
5451 ack_number: None,
5452 ..SEND_TEMPL
5453 }
5454 );
5455 assert_eq!(s.state(), State::SynReceived);
5456 assert_eq!(s.tuple, Some(TUPLE));
5457 recv!(
5458 s,
5459 [TcpRepr {
5460 control: TcpControl::Syn,
5461 seq_number: LOCAL_SEQ,
5462 ack_number: Some(REMOTE_SEQ + 1),
5463 max_seg_size: Some(BASE_MSS),
5464 ..RECV_TEMPL
5465 }]
5466 );
5467 send!(
5468 s,
5469 TcpRepr {
5470 seq_number: REMOTE_SEQ + 1,
5471 ack_number: Some(LOCAL_SEQ + 1),
5472 ..SEND_TEMPL
5473 }
5474 );
5475 assert_eq!(s.state(), State::Established);
5476 assert_eq!(s.local_seq_no, LOCAL_SEQ + 1);
5477 assert_eq!(s.remote_seq_no, REMOTE_SEQ + 1);
5478 }
5479
5480 #[test]
5481 fn test_remote_close() {
5482 let mut s = socket_established();
5483 send!(
5484 s,
5485 TcpRepr {
5486 control: TcpControl::Fin,
5487 seq_number: REMOTE_SEQ + 1,
5488 ack_number: Some(LOCAL_SEQ + 1),
5489 ..SEND_TEMPL
5490 }
5491 );
5492 assert_eq!(s.state, State::CloseWait);
5493 recv!(
5494 s,
5495 [TcpRepr {
5496 seq_number: LOCAL_SEQ + 1,
5497 ack_number: Some(REMOTE_SEQ + 1 + 1),
5498 ..RECV_TEMPL
5499 }]
5500 );
5501 s.close();
5502 assert_eq!(s.state, State::LastAck);
5503 recv!(
5504 s,
5505 [TcpRepr {
5506 control: TcpControl::Fin,
5507 seq_number: LOCAL_SEQ + 1,
5508 ack_number: Some(REMOTE_SEQ + 1 + 1),
5509 ..RECV_TEMPL
5510 }]
5511 );
5512 send!(
5513 s,
5514 TcpRepr {
5515 seq_number: REMOTE_SEQ + 1 + 1,
5516 ack_number: Some(LOCAL_SEQ + 1 + 1),
5517 ..SEND_TEMPL
5518 }
5519 );
5520 assert_eq!(s.state, State::Closed);
5521 }
5522
5523 #[test]
5524 fn test_local_close() {
5525 let mut s = socket_established();
5526 s.close();
5527 assert_eq!(s.state, State::FinWait1);
5528 recv!(
5529 s,
5530 [TcpRepr {
5531 control: TcpControl::Fin,
5532 seq_number: LOCAL_SEQ + 1,
5533 ack_number: Some(REMOTE_SEQ + 1),
5534 ..RECV_TEMPL
5535 }]
5536 );
5537 send!(
5538 s,
5539 TcpRepr {
5540 seq_number: REMOTE_SEQ + 1,
5541 ack_number: Some(LOCAL_SEQ + 1 + 1),
5542 ..SEND_TEMPL
5543 }
5544 );
5545 assert_eq!(s.state, State::FinWait2);
5546 send!(
5547 s,
5548 TcpRepr {
5549 control: TcpControl::Fin,
5550 seq_number: REMOTE_SEQ + 1,
5551 ack_number: Some(LOCAL_SEQ + 1 + 1),
5552 ..SEND_TEMPL
5553 }
5554 );
5555 assert_eq!(s.state, State::TimeWait);
5556 recv!(
5557 s,
5558 [TcpRepr {
5559 seq_number: LOCAL_SEQ + 1 + 1,
5560 ack_number: Some(REMOTE_SEQ + 1 + 1),
5561 ..RECV_TEMPL
5562 }]
5563 );
5564 }
5565
5566 #[test]
5567 fn test_simultaneous_close() {
5568 let mut s = socket_established();
5569 s.close();
5570 assert_eq!(s.state, State::FinWait1);
5571 recv!(
5572 s,
5573 [TcpRepr {
5574 control: TcpControl::Fin,
5576 seq_number: LOCAL_SEQ + 1,
5577 ack_number: Some(REMOTE_SEQ + 1),
5578 ..RECV_TEMPL
5579 }]
5580 );
5581 send!(
5582 s,
5583 TcpRepr {
5584 control: TcpControl::Fin,
5585 seq_number: REMOTE_SEQ + 1,
5586 ack_number: Some(LOCAL_SEQ + 1),
5587 ..SEND_TEMPL
5588 }
5589 );
5590 assert_eq!(s.state, State::Closing);
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 send!(
5601 s,
5602 TcpRepr {
5603 seq_number: REMOTE_SEQ + 1 + 1,
5604 ack_number: Some(LOCAL_SEQ + 1 + 1),
5605 ..SEND_TEMPL
5606 }
5607 );
5608 assert_eq!(s.state, State::TimeWait);
5609 recv!(s, []);
5610 }
5611
5612 #[test]
5613 fn test_simultaneous_close_combined_fin_ack() {
5614 let mut s = socket_established();
5615 s.close();
5616 assert_eq!(s.state, State::FinWait1);
5617 recv!(
5618 s,
5619 [TcpRepr {
5620 control: TcpControl::Fin,
5621 seq_number: LOCAL_SEQ + 1,
5622 ack_number: Some(REMOTE_SEQ + 1),
5623 ..RECV_TEMPL
5624 }]
5625 );
5626 send!(
5627 s,
5628 TcpRepr {
5629 control: TcpControl::Fin,
5630 seq_number: REMOTE_SEQ + 1,
5631 ack_number: Some(LOCAL_SEQ + 1 + 1),
5632 ..SEND_TEMPL
5633 }
5634 );
5635 assert_eq!(s.state, State::TimeWait);
5636 recv!(
5637 s,
5638 [TcpRepr {
5639 seq_number: LOCAL_SEQ + 1 + 1,
5640 ack_number: Some(REMOTE_SEQ + 1 + 1),
5641 ..RECV_TEMPL
5642 }]
5643 );
5644 }
5645
5646 #[test]
5647 fn test_simultaneous_close_raced() {
5648 let mut s = socket_established();
5649 s.close();
5650 assert_eq!(s.state, State::FinWait1);
5651
5652 send!(
5654 s,
5655 TcpRepr {
5656 control: TcpControl::Fin,
5657 seq_number: REMOTE_SEQ + 1,
5658 ack_number: Some(LOCAL_SEQ + 1),
5659 ..SEND_TEMPL
5660 }
5661 );
5662 assert_eq!(s.state, State::Closing);
5663
5664 recv!(
5666 s,
5667 [TcpRepr {
5668 control: TcpControl::Fin,
5669 seq_number: LOCAL_SEQ + 1,
5670 ack_number: Some(REMOTE_SEQ + 1 + 1),
5671 ..RECV_TEMPL
5672 }]
5673 );
5674 assert_eq!(s.state, State::Closing);
5675
5676 send!(
5677 s,
5678 TcpRepr {
5679 seq_number: REMOTE_SEQ + 1 + 1,
5680 ack_number: Some(LOCAL_SEQ + 1 + 1),
5681 ..SEND_TEMPL
5682 }
5683 );
5684 assert_eq!(s.state, State::TimeWait);
5685 recv!(s, []);
5686 }
5687
5688 #[test]
5689 fn test_simultaneous_close_raced_with_data() {
5690 let mut s = socket_established();
5691 s.send_slice(b"abcdef").unwrap();
5692 s.close();
5693 assert_eq!(s.state, State::FinWait1);
5694
5695 send!(
5697 s,
5698 TcpRepr {
5699 control: TcpControl::Fin,
5700 seq_number: REMOTE_SEQ + 1,
5701 ack_number: Some(LOCAL_SEQ + 1),
5702 ..SEND_TEMPL
5703 }
5704 );
5705 assert_eq!(s.state, State::Closing);
5706
5707 recv!(
5709 s,
5710 [TcpRepr {
5711 control: TcpControl::Fin,
5712 seq_number: LOCAL_SEQ + 1,
5713 ack_number: Some(REMOTE_SEQ + 1 + 1),
5714 payload: &b"abcdef"[..],
5715 ..RECV_TEMPL
5716 }]
5717 );
5718 assert_eq!(s.state, State::Closing);
5719
5720 send!(
5721 s,
5722 TcpRepr {
5723 seq_number: REMOTE_SEQ + 1 + 1,
5724 ack_number: Some(LOCAL_SEQ + 1 + 6 + 1),
5725 ..SEND_TEMPL
5726 }
5727 );
5728 assert_eq!(s.state, State::TimeWait);
5729 recv!(s, []);
5730 }
5731
5732 #[test]
5733 fn test_fin_with_data() {
5734 let mut s = socket_established();
5735 s.send_slice(b"abcdef").unwrap();
5736 s.close();
5737 recv!(
5738 s,
5739 [TcpRepr {
5740 control: TcpControl::Fin,
5741 seq_number: LOCAL_SEQ + 1,
5742 ack_number: Some(REMOTE_SEQ + 1),
5743 payload: &b"abcdef"[..],
5744 ..RECV_TEMPL
5745 }]
5746 )
5747 }
5748
5749 #[test]
5750 fn test_mutual_close_with_data_1() {
5751 let mut s = socket_established();
5752 s.send_slice(b"abcdef").unwrap();
5753 s.close();
5754 assert_eq!(s.state, State::FinWait1);
5755 recv!(
5756 s,
5757 [TcpRepr {
5758 control: TcpControl::Fin,
5759 seq_number: LOCAL_SEQ + 1,
5760 ack_number: Some(REMOTE_SEQ + 1),
5761 payload: &b"abcdef"[..],
5762 ..RECV_TEMPL
5763 }]
5764 );
5765 send!(
5766 s,
5767 TcpRepr {
5768 control: TcpControl::Fin,
5769 seq_number: REMOTE_SEQ + 1,
5770 ack_number: Some(LOCAL_SEQ + 1 + 6 + 1),
5771 ..SEND_TEMPL
5772 }
5773 );
5774 }
5775
5776 #[test]
5777 fn test_mutual_close_with_data_2() {
5778 let mut s = socket_established();
5779 s.send_slice(b"abcdef").unwrap();
5780 s.close();
5781 assert_eq!(s.state, State::FinWait1);
5782 recv!(
5783 s,
5784 [TcpRepr {
5785 control: TcpControl::Fin,
5786 seq_number: LOCAL_SEQ + 1,
5787 ack_number: Some(REMOTE_SEQ + 1),
5788 payload: &b"abcdef"[..],
5789 ..RECV_TEMPL
5790 }]
5791 );
5792 send!(
5793 s,
5794 TcpRepr {
5795 seq_number: REMOTE_SEQ + 1,
5796 ack_number: Some(LOCAL_SEQ + 1 + 6 + 1),
5797 ..SEND_TEMPL
5798 }
5799 );
5800 assert_eq!(s.state, State::FinWait2);
5801 send!(
5802 s,
5803 TcpRepr {
5804 control: TcpControl::Fin,
5805 seq_number: REMOTE_SEQ + 1,
5806 ack_number: Some(LOCAL_SEQ + 1 + 6 + 1),
5807 ..SEND_TEMPL
5808 }
5809 );
5810 recv!(
5811 s,
5812 [TcpRepr {
5813 seq_number: LOCAL_SEQ + 1 + 6 + 1,
5814 ack_number: Some(REMOTE_SEQ + 1 + 1),
5815 ..RECV_TEMPL
5816 }]
5817 );
5818 assert_eq!(s.state, State::TimeWait);
5819 }
5820
5821 #[test]
5826 fn test_duplicate_seq_ack() {
5827 let mut s = socket_recved();
5828 send!(
5830 s,
5831 TcpRepr {
5832 seq_number: REMOTE_SEQ + 1,
5833 ack_number: Some(LOCAL_SEQ + 1),
5834 payload: &b"abcdef"[..],
5835 ..SEND_TEMPL
5836 },
5837 Some(TcpRepr {
5838 seq_number: LOCAL_SEQ + 1,
5839 ack_number: Some(REMOTE_SEQ + 1 + 6),
5840 window_len: 58,
5841 ..RECV_TEMPL
5842 })
5843 );
5844 }
5845
5846 #[test]
5847 fn test_data_retransmit() {
5848 let mut s = socket_established();
5849 s.send_slice(b"abcdef").unwrap();
5850 recv!(s, time 1000, Ok(TcpRepr {
5851 seq_number: LOCAL_SEQ + 1,
5852 ack_number: Some(REMOTE_SEQ + 1),
5853 payload: &b"abcdef"[..],
5854 ..RECV_TEMPL
5855 }));
5856 recv_nothing!(s, time 1050);
5857 recv!(s, time 2000, Ok(TcpRepr {
5858 seq_number: LOCAL_SEQ + 1,
5859 ack_number: Some(REMOTE_SEQ + 1),
5860 payload: &b"abcdef"[..],
5861 ..RECV_TEMPL
5862 }));
5863 }
5864
5865 #[test]
5866 fn test_data_retransmit_bursts() {
5867 let mut s = socket_established();
5868 s.remote_mss = 6;
5869 s.send_slice(b"abcdef012345").unwrap();
5870
5871 recv!(s, time 0, Ok(TcpRepr {
5872 control: TcpControl::None,
5873 seq_number: LOCAL_SEQ + 1,
5874 ack_number: Some(REMOTE_SEQ + 1),
5875 payload: &b"abcdef"[..],
5876 ..RECV_TEMPL
5877 }), exact);
5878 recv!(s, time 0, Ok(TcpRepr {
5879 control: TcpControl::Psh,
5880 seq_number: LOCAL_SEQ + 1 + 6,
5881 ack_number: Some(REMOTE_SEQ + 1),
5882 payload: &b"012345"[..],
5883 ..RECV_TEMPL
5884 }), exact);
5885 recv_nothing!(s, time 0);
5886
5887 recv_nothing!(s, time 50);
5888
5889 recv!(s, time 1000, Ok(TcpRepr {
5890 control: TcpControl::None,
5891 seq_number: LOCAL_SEQ + 1,
5892 ack_number: Some(REMOTE_SEQ + 1),
5893 payload: &b"abcdef"[..],
5894 ..RECV_TEMPL
5895 }), exact);
5896 recv!(s, time 1500, Ok(TcpRepr {
5897 control: TcpControl::Psh,
5898 seq_number: LOCAL_SEQ + 1 + 6,
5899 ack_number: Some(REMOTE_SEQ + 1),
5900 payload: &b"012345"[..],
5901 ..RECV_TEMPL
5902 }), exact);
5903 recv_nothing!(s, time 1550);
5904 }
5905
5906 #[test]
5907 fn test_data_retransmit_bursts_half_ack() {
5908 let mut s = socket_established();
5909 s.remote_mss = 6;
5910 s.send_slice(b"abcdef012345").unwrap();
5911
5912 recv!(s, time 0, Ok(TcpRepr {
5913 control: TcpControl::None,
5914 seq_number: LOCAL_SEQ + 1,
5915 ack_number: Some(REMOTE_SEQ + 1),
5916 payload: &b"abcdef"[..],
5917 ..RECV_TEMPL
5918 }), exact);
5919 recv!(s, time 0, Ok(TcpRepr {
5920 control: TcpControl::Psh,
5921 seq_number: LOCAL_SEQ + 1 + 6,
5922 ack_number: Some(REMOTE_SEQ + 1),
5923 payload: &b"012345"[..],
5924 ..RECV_TEMPL
5925 }), exact);
5926 send!(s, time 5, TcpRepr {
5928 seq_number: REMOTE_SEQ + 1,
5929 ack_number: Some(LOCAL_SEQ + 1 + 6),
5930 window_len: 6,
5931 ..SEND_TEMPL
5932 });
5933 recv!(s, time 1500, Ok(TcpRepr {
5935 control: TcpControl::Psh,
5936 seq_number: LOCAL_SEQ + 1 + 6,
5937 ack_number: Some(REMOTE_SEQ + 1),
5938 payload: &b"012345"[..],
5939 ..RECV_TEMPL
5940 }), exact);
5941
5942 recv_nothing!(s, time 1550);
5943 }
5944
5945 #[test]
5946 fn test_retransmit_timer_restart_on_partial_ack() {
5947 let mut s = socket_established();
5948 s.remote_mss = 6;
5949 s.send_slice(b"abcdef012345").unwrap();
5950
5951 recv!(s, time 0, Ok(TcpRepr {
5952 control: TcpControl::None,
5953 seq_number: LOCAL_SEQ + 1,
5954 ack_number: Some(REMOTE_SEQ + 1),
5955 payload: &b"abcdef"[..],
5956 ..RECV_TEMPL
5957 }), exact);
5958 recv!(s, time 0, Ok(TcpRepr {
5959 control: TcpControl::Psh,
5960 seq_number: LOCAL_SEQ + 1 + 6,
5961 ack_number: Some(REMOTE_SEQ + 1),
5962 payload: &b"012345"[..],
5963 ..RECV_TEMPL
5964 }), exact);
5965 send!(s, time 600, TcpRepr {
5967 seq_number: REMOTE_SEQ + 1,
5968 ack_number: Some(LOCAL_SEQ + 1 + 6),
5969 window_len: 6,
5970 ..SEND_TEMPL
5971 });
5972 recv_nothing!(s, time 2399);
5974 recv!(s, time 2400, Ok(TcpRepr {
5976 control: TcpControl::Psh,
5977 seq_number: LOCAL_SEQ + 1 + 6,
5978 ack_number: Some(REMOTE_SEQ + 1),
5979 payload: &b"012345"[..],
5980 ..RECV_TEMPL
5981 }), exact);
5982 }
5983
5984 #[test]
5985 fn test_data_retransmit_bursts_half_ack_close() {
5986 let mut s = socket_established();
5987 s.remote_mss = 6;
5988 s.send_slice(b"abcdef012345").unwrap();
5989 s.close();
5990
5991 recv!(s, time 0, Ok(TcpRepr {
5992 control: TcpControl::None,
5993 seq_number: LOCAL_SEQ + 1,
5994 ack_number: Some(REMOTE_SEQ + 1),
5995 payload: &b"abcdef"[..],
5996 ..RECV_TEMPL
5997 }), exact);
5998 recv!(s, time 0, Ok(TcpRepr {
5999 control: TcpControl::Fin,
6000 seq_number: LOCAL_SEQ + 1 + 6,
6001 ack_number: Some(REMOTE_SEQ + 1),
6002 payload: &b"012345"[..],
6003 ..RECV_TEMPL
6004 }), exact);
6005 send!(s, time 5, TcpRepr {
6007 seq_number: REMOTE_SEQ + 1,
6008 ack_number: Some(LOCAL_SEQ + 1 + 6),
6009 window_len: 6,
6010 ..SEND_TEMPL
6011 });
6012 recv!(s, time 1500, Ok(TcpRepr {
6014 control: TcpControl::Fin,
6015 seq_number: LOCAL_SEQ + 1 + 6,
6016 ack_number: Some(REMOTE_SEQ + 1),
6017 payload: &b"012345"[..],
6018 ..RECV_TEMPL
6019 }), exact);
6020
6021 recv_nothing!(s, time 1550);
6022 }
6023
6024 #[test]
6025 fn test_send_data_after_syn_ack_retransmit() {
6026 let mut s = socket_syn_received();
6027 recv!(s, time 50, Ok(TcpRepr {
6028 control: TcpControl::Syn,
6029 seq_number: LOCAL_SEQ,
6030 ack_number: Some(REMOTE_SEQ + 1),
6031 max_seg_size: Some(BASE_MSS),
6032 ..RECV_TEMPL
6033 }));
6034 recv!(s, time 1050, Ok(TcpRepr { control: TcpControl::Syn,
6036 seq_number: LOCAL_SEQ,
6037 ack_number: Some(REMOTE_SEQ + 1),
6038 max_seg_size: Some(BASE_MSS),
6039 ..RECV_TEMPL
6040 }));
6041 send!(
6042 s,
6043 TcpRepr {
6044 seq_number: REMOTE_SEQ + 1,
6045 ack_number: Some(LOCAL_SEQ + 1),
6046 ..SEND_TEMPL
6047 }
6048 );
6049 assert_eq!(s.state(), State::Established);
6050 s.send_slice(b"abcdef").unwrap();
6051 recv!(
6052 s,
6053 [TcpRepr {
6054 seq_number: LOCAL_SEQ + 1,
6055 ack_number: Some(REMOTE_SEQ + 1),
6056 payload: &b"abcdef"[..],
6057 ..RECV_TEMPL
6058 }]
6059 )
6060 }
6061
6062 #[test]
6063 fn test_established_retransmit_for_dup_ack() {
6064 let mut s = socket_established();
6065 s.send_slice(b"abc").unwrap();
6067 recv!(s, time 1000, Ok(TcpRepr {
6068 seq_number: LOCAL_SEQ + 1,
6069 ack_number: Some(REMOTE_SEQ + 1),
6070 payload: &b"abc"[..],
6071 ..RECV_TEMPL
6072 }));
6073 assert_eq!(s.tx_buffer.len(), 3);
6075 send!(
6077 s,
6078 TcpRepr {
6079 seq_number: REMOTE_SEQ + 1,
6080 ack_number: Some(LOCAL_SEQ + 1),
6081 ..SEND_TEMPL
6082 }
6083 );
6084 recv!(s, time 4000, Ok(TcpRepr {
6086 seq_number: LOCAL_SEQ + 1,
6087 ack_number: Some(REMOTE_SEQ + 1),
6088 payload: &b"abc"[..],
6089 ..RECV_TEMPL
6090 }));
6091 }
6092
6093 #[test]
6094 fn test_established_retransmit_reset_after_ack() {
6095 let mut s = socket_established();
6096 s.remote_win_len = 6;
6097 s.send_slice(b"abcdef").unwrap();
6098 s.send_slice(b"123456").unwrap();
6099 s.send_slice(b"ABCDEF").unwrap();
6100 recv!(s, time 1000, Ok(TcpRepr {
6101 seq_number: LOCAL_SEQ + 1,
6102 ack_number: Some(REMOTE_SEQ + 1),
6103 payload: &b"abcdef"[..],
6104 ..RECV_TEMPL
6105 }));
6106 send!(s, time 1005, TcpRepr {
6107 seq_number: REMOTE_SEQ + 1,
6108 ack_number: Some(LOCAL_SEQ + 1 + 6),
6109 window_len: 6,
6110 ..SEND_TEMPL
6111 });
6112 recv!(s, time 1010, Ok(TcpRepr {
6113 seq_number: LOCAL_SEQ + 1 + 6,
6114 ack_number: Some(REMOTE_SEQ + 1),
6115 payload: &b"123456"[..],
6116 ..RECV_TEMPL
6117 }));
6118 send!(s, time 1015, TcpRepr {
6119 seq_number: REMOTE_SEQ + 1,
6120 ack_number: Some(LOCAL_SEQ + 1 + 6 + 6),
6121 window_len: 6,
6122 ..SEND_TEMPL
6123 });
6124 recv!(s, time 1020, Ok(TcpRepr {
6125 seq_number: LOCAL_SEQ + 1 + 6 + 6,
6126 ack_number: Some(REMOTE_SEQ + 1),
6127 payload: &b"ABCDEF"[..],
6128 ..RECV_TEMPL
6129 }));
6130 }
6131
6132 #[test]
6133 fn test_established_queue_during_retransmission() {
6134 let mut s = socket_established();
6135 s.remote_mss = 6;
6136 s.send_slice(b"abcdef123456ABCDEF").unwrap();
6137 recv!(s, time 1000, Ok(TcpRepr {
6138 seq_number: LOCAL_SEQ + 1,
6139 ack_number: Some(REMOTE_SEQ + 1),
6140 payload: &b"abcdef"[..],
6141 ..RECV_TEMPL
6142 })); recv!(s, time 1005, Ok(TcpRepr {
6144 seq_number: LOCAL_SEQ + 1 + 6,
6145 ack_number: Some(REMOTE_SEQ + 1),
6146 payload: &b"123456"[..],
6147 ..RECV_TEMPL
6148 })); recv!(s, time 1010, Ok(TcpRepr {
6150 seq_number: LOCAL_SEQ + 1 + 6 + 6,
6151 ack_number: Some(REMOTE_SEQ + 1),
6152 payload: &b"ABCDEF"[..],
6153 ..RECV_TEMPL
6154 })); recv!(s, time 3000, Ok(TcpRepr {
6156 seq_number: LOCAL_SEQ + 1,
6157 ack_number: Some(REMOTE_SEQ + 1),
6158 payload: &b"abcdef"[..],
6159 ..RECV_TEMPL
6160 })); send!(s, time 3005, TcpRepr {
6162 seq_number: REMOTE_SEQ + 1,
6163 ack_number: Some(LOCAL_SEQ + 1 + 6 + 6),
6164 ..SEND_TEMPL
6165 }); recv!(s, time 3010, Ok(TcpRepr {
6167 seq_number: LOCAL_SEQ + 1 + 6 + 6,
6168 ack_number: Some(REMOTE_SEQ + 1),
6169 payload: &b"ABCDEF"[..],
6170 ..RECV_TEMPL
6171 })); }
6173
6174 #[test]
6175 fn test_close_wait_retransmit_reset_after_ack() {
6176 let mut s = socket_close_wait();
6177 s.remote_win_len = 6;
6178 s.send_slice(b"abcdef").unwrap();
6179 s.send_slice(b"123456").unwrap();
6180 s.send_slice(b"ABCDEF").unwrap();
6181 recv!(s, time 1000, Ok(TcpRepr {
6182 seq_number: LOCAL_SEQ + 1,
6183 ack_number: Some(REMOTE_SEQ + 1 + 1),
6184 payload: &b"abcdef"[..],
6185 ..RECV_TEMPL
6186 }));
6187 send!(s, time 1005, TcpRepr {
6188 seq_number: REMOTE_SEQ + 1 + 1,
6189 ack_number: Some(LOCAL_SEQ + 1 + 6),
6190 window_len: 6,
6191 ..SEND_TEMPL
6192 });
6193 recv!(s, time 1010, Ok(TcpRepr {
6194 seq_number: LOCAL_SEQ + 1 + 6,
6195 ack_number: Some(REMOTE_SEQ + 1 + 1),
6196 payload: &b"123456"[..],
6197 ..RECV_TEMPL
6198 }));
6199 send!(s, time 1015, TcpRepr {
6200 seq_number: REMOTE_SEQ + 1 + 1,
6201 ack_number: Some(LOCAL_SEQ + 1 + 6 + 6),
6202 window_len: 6,
6203 ..SEND_TEMPL
6204 });
6205 recv!(s, time 1020, Ok(TcpRepr {
6206 seq_number: LOCAL_SEQ + 1 + 6 + 6,
6207 ack_number: Some(REMOTE_SEQ + 1 + 1),
6208 payload: &b"ABCDEF"[..],
6209 ..RECV_TEMPL
6210 }));
6211 }
6212
6213 #[test]
6214 fn test_fin_wait_1_retransmit_reset_after_ack() {
6215 let mut s = socket_established();
6216 s.remote_win_len = 6;
6217 s.send_slice(b"abcdef").unwrap();
6218 s.send_slice(b"123456").unwrap();
6219 s.send_slice(b"ABCDEF").unwrap();
6220 s.close();
6221 recv!(s, time 1000, Ok(TcpRepr {
6222 seq_number: LOCAL_SEQ + 1,
6223 ack_number: Some(REMOTE_SEQ + 1),
6224 payload: &b"abcdef"[..],
6225 ..RECV_TEMPL
6226 }));
6227 send!(s, time 1005, TcpRepr {
6228 seq_number: REMOTE_SEQ + 1,
6229 ack_number: Some(LOCAL_SEQ + 1 + 6),
6230 window_len: 6,
6231 ..SEND_TEMPL
6232 });
6233 recv!(s, time 1010, Ok(TcpRepr {
6234 seq_number: LOCAL_SEQ + 1 + 6,
6235 ack_number: Some(REMOTE_SEQ + 1),
6236 payload: &b"123456"[..],
6237 ..RECV_TEMPL
6238 }));
6239 send!(s, time 1015, TcpRepr {
6240 seq_number: REMOTE_SEQ + 1,
6241 ack_number: Some(LOCAL_SEQ + 1 + 6 + 6),
6242 window_len: 6,
6243 ..SEND_TEMPL
6244 });
6245 recv!(s, time 1020, Ok(TcpRepr {
6246 control: TcpControl::Fin,
6247 seq_number: LOCAL_SEQ + 1 + 6 + 6,
6248 ack_number: Some(REMOTE_SEQ + 1),
6249 payload: &b"ABCDEF"[..],
6250 ..RECV_TEMPL
6251 }));
6252 }
6253
6254 #[test]
6255 fn test_fast_retransmit_after_triple_duplicate_ack() {
6256 let mut s = socket_established();
6257 s.remote_mss = 6;
6258
6259 send!(s, time 0, TcpRepr {
6261 seq_number: REMOTE_SEQ + 1,
6262 ack_number: Some(LOCAL_SEQ + 1),
6263 ..SEND_TEMPL
6264 });
6265
6266 s.send_slice(b"xxxxxxyyyyyywwwwwwzzzzzz").unwrap();
6269 recv!(s, time 1000, Ok(TcpRepr {
6271 seq_number: LOCAL_SEQ + 1,
6272 ack_number: Some(REMOTE_SEQ + 1),
6273 payload: &b"xxxxxx"[..],
6274 ..RECV_TEMPL
6275 }));
6276 recv!(s, time 1005, Ok(TcpRepr {
6277 seq_number: LOCAL_SEQ + 1 + 6,
6278 ack_number: Some(REMOTE_SEQ + 1),
6279 payload: &b"yyyyyy"[..],
6280 ..RECV_TEMPL
6281 }));
6282 recv!(s, time 1010, Ok(TcpRepr {
6283 seq_number: LOCAL_SEQ + 1 + (6 * 2),
6284 ack_number: Some(REMOTE_SEQ + 1),
6285 payload: &b"wwwwww"[..],
6286 ..RECV_TEMPL
6287 }));
6288 recv!(s, time 1015, Ok(TcpRepr {
6289 seq_number: LOCAL_SEQ + 1 + (6 * 3),
6290 ack_number: Some(REMOTE_SEQ + 1),
6291 payload: &b"zzzzzz"[..],
6292 ..RECV_TEMPL
6293 }));
6294
6295 send!(s, time 1050, TcpRepr {
6297 seq_number: REMOTE_SEQ + 1,
6298 ack_number: Some(LOCAL_SEQ + 1),
6299 ..SEND_TEMPL
6300 });
6301 send!(s, time 1055, TcpRepr {
6303 seq_number: REMOTE_SEQ + 1,
6304 ack_number: Some(LOCAL_SEQ + 1),
6305 ..SEND_TEMPL
6306 });
6307 send!(s, time 1060, TcpRepr {
6310 seq_number: REMOTE_SEQ + 1,
6311 ack_number: Some(LOCAL_SEQ + 1),
6312 ..SEND_TEMPL
6313 });
6314
6315 recv!(s, time 1100, Ok(TcpRepr {
6317 seq_number: LOCAL_SEQ + 1,
6318 ack_number: Some(REMOTE_SEQ + 1),
6319 payload: &b"xxxxxx"[..],
6320 ..RECV_TEMPL
6321 }));
6322
6323 recv!(s, time 1105, Ok(TcpRepr {
6324 seq_number: LOCAL_SEQ + 1 + 6,
6325 ack_number: Some(REMOTE_SEQ + 1),
6326 payload: &b"yyyyyy"[..],
6327 ..RECV_TEMPL
6328 }));
6329 recv!(s, time 1110, Ok(TcpRepr {
6330 seq_number: LOCAL_SEQ + 1 + (6 * 2),
6331 ack_number: Some(REMOTE_SEQ + 1),
6332 payload: &b"wwwwww"[..],
6333 ..RECV_TEMPL
6334 }));
6335 recv!(s, time 1115, Ok(TcpRepr {
6336 seq_number: LOCAL_SEQ + 1 + (6 * 3),
6337 ack_number: Some(REMOTE_SEQ + 1),
6338 payload: &b"zzzzzz"[..],
6339 ..RECV_TEMPL
6340 }));
6341
6342 assert!(match s.timer {
6345 Timer::Retransmit { expires_at, .. } => expires_at > Instant::from_millis(1115),
6346 _ => false,
6347 });
6348
6349 send!(s, time 1120, TcpRepr {
6351 seq_number: REMOTE_SEQ + 1,
6352 ack_number: Some(LOCAL_SEQ + 1 + (6 * 4)),
6353 ..SEND_TEMPL
6354 });
6355 }
6356
6357 #[test]
6358 fn test_fast_retransmit_duplicate_detection_with_data() {
6359 let mut s = socket_established();
6360
6361 s.send_slice(b"abc").unwrap(); recv!(s, time 1000, Ok(TcpRepr {
6363 seq_number: LOCAL_SEQ + 1,
6364 ack_number: Some(REMOTE_SEQ + 1),
6365 payload: &b"abc"[..],
6366 ..RECV_TEMPL
6367 }));
6368
6369 send!(
6371 s,
6372 TcpRepr {
6373 seq_number: REMOTE_SEQ + 1,
6374 ack_number: Some(LOCAL_SEQ + 1),
6375 ..SEND_TEMPL
6376 }
6377 );
6378 send!(
6380 s,
6381 TcpRepr {
6382 seq_number: REMOTE_SEQ + 1,
6383 ack_number: Some(LOCAL_SEQ + 1),
6384 ..SEND_TEMPL
6385 }
6386 );
6387 send!(
6389 s,
6390 TcpRepr {
6391 seq_number: REMOTE_SEQ + 1,
6392 ack_number: Some(LOCAL_SEQ + 1),
6393 ..SEND_TEMPL
6394 }
6395 );
6396
6397 assert_eq!(s.local_rx_dup_acks, 2, "duplicate ACK counter is not set");
6398
6399 send!(
6402 s,
6403 TcpRepr {
6404 seq_number: REMOTE_SEQ + 1,
6405 ack_number: Some(LOCAL_SEQ + 1),
6406 payload: &b"xxxxxx"[..],
6407 ..SEND_TEMPL
6408 }
6409 );
6410
6411 recv!(
6412 s,
6413 [TcpRepr {
6414 seq_number: LOCAL_SEQ + 1 + 3,
6415 ack_number: Some(REMOTE_SEQ + 1 + 6),
6416 window_len: 58,
6417 ..RECV_TEMPL
6418 }]
6419 );
6420
6421 assert_eq!(
6422 s.local_rx_dup_acks, 0,
6423 "duplicate ACK counter is not reset when receiving data"
6424 );
6425 }
6426
6427 #[test]
6428 fn test_fast_retransmit_duplicate_detection_with_window_update() {
6429 let mut s = socket_established();
6430
6431 s.send_slice(b"abc").unwrap(); recv!(s, time 1000, Ok(TcpRepr {
6433 seq_number: LOCAL_SEQ + 1,
6434 ack_number: Some(REMOTE_SEQ + 1),
6435 payload: &b"abc"[..],
6436 ..RECV_TEMPL
6437 }));
6438
6439 send!(
6441 s,
6442 TcpRepr {
6443 seq_number: REMOTE_SEQ + 1,
6444 ack_number: Some(LOCAL_SEQ + 1),
6445 ..SEND_TEMPL
6446 }
6447 );
6448 send!(
6450 s,
6451 TcpRepr {
6452 seq_number: REMOTE_SEQ + 1,
6453 ack_number: Some(LOCAL_SEQ + 1),
6454 ..SEND_TEMPL
6455 }
6456 );
6457 send!(
6459 s,
6460 TcpRepr {
6461 seq_number: REMOTE_SEQ + 1,
6462 ack_number: Some(LOCAL_SEQ + 1),
6463 ..SEND_TEMPL
6464 }
6465 );
6466
6467 assert_eq!(s.local_rx_dup_acks, 2, "duplicate ACK counter is not set");
6468
6469 send!(
6472 s,
6473 TcpRepr {
6474 seq_number: REMOTE_SEQ + 1,
6475 ack_number: Some(LOCAL_SEQ + 1),
6476 window_len: 400,
6477 ..SEND_TEMPL
6478 }
6479 );
6480
6481 assert_eq!(
6482 s.local_rx_dup_acks, 0,
6483 "duplicate ACK counter is not reset when receiving a window update"
6484 );
6485 }
6486
6487 #[test]
6488 fn test_fast_retransmit_duplicate_detection() {
6489 let mut s = socket_established();
6490 s.remote_mss = 6;
6491
6492 send!(s, time 0, TcpRepr {
6494 seq_number: REMOTE_SEQ + 1,
6495 ack_number: Some(LOCAL_SEQ + 1),
6496 ..SEND_TEMPL
6497 });
6498
6499 send!(s, time 0, TcpRepr {
6501 seq_number: REMOTE_SEQ + 1,
6502 ack_number: Some(LOCAL_SEQ + 1),
6503 ..SEND_TEMPL
6504 });
6505
6506 assert_eq!(
6507 s.local_rx_dup_acks, 0,
6508 "duplicate ACK counter is set but wound not transmit data"
6509 );
6510
6511 s.send_slice(b"xxxxxxyyyyyywwwwwwzzzzzz").unwrap();
6514
6515 recv!(s, time 1000, Ok(TcpRepr {
6517 seq_number: LOCAL_SEQ + 1,
6518 ack_number: Some(REMOTE_SEQ + 1),
6519 payload: &b"xxxxxx"[..],
6520 ..RECV_TEMPL
6521 }));
6522 recv!(s, time 1005, Ok(TcpRepr {
6523 seq_number: LOCAL_SEQ + 1 + 6,
6524 ack_number: Some(REMOTE_SEQ + 1),
6525 payload: &b"yyyyyy"[..],
6526 ..RECV_TEMPL
6527 }));
6528 recv!(s, time 1010, Ok(TcpRepr {
6529 seq_number: LOCAL_SEQ + 1 + (6 * 2),
6530 ack_number: Some(REMOTE_SEQ + 1),
6531 payload: &b"wwwwww"[..],
6532 ..RECV_TEMPL
6533 }));
6534 recv!(s, time 1015, Ok(TcpRepr {
6535 seq_number: LOCAL_SEQ + 1 + (6 * 3),
6536 ack_number: Some(REMOTE_SEQ + 1),
6537 payload: &b"zzzzzz"[..],
6538 ..RECV_TEMPL
6539 }));
6540
6541 send!(s, time 1050, TcpRepr {
6543 seq_number: REMOTE_SEQ + 1,
6544 ack_number: Some(LOCAL_SEQ + 1),
6545 ..SEND_TEMPL
6546 });
6547 send!(s, time 1055, TcpRepr {
6549 seq_number: REMOTE_SEQ + 1,
6550 ack_number: Some(LOCAL_SEQ + 1),
6551 ..SEND_TEMPL
6552 });
6553 send!(s, time 1060, TcpRepr {
6555 seq_number: REMOTE_SEQ + 1,
6556 ack_number: Some(LOCAL_SEQ + 1 + (6 * 3)),
6557 ..SEND_TEMPL
6558 });
6559
6560 assert_eq!(
6561 s.local_rx_dup_acks, 0,
6562 "duplicate ACK counter is not reset when receiving ACK which updates send window"
6563 );
6564
6565 send!(s, time 1120, TcpRepr {
6567 seq_number: REMOTE_SEQ + 1,
6568 ack_number: Some(LOCAL_SEQ + 1 + (6 * 4)),
6569 ..SEND_TEMPL
6570 });
6571 }
6572
6573 #[test]
6574 fn test_fast_retransmit_dup_acks_counter() {
6575 let mut s = socket_established();
6576
6577 s.send_slice(b"abc").unwrap(); recv!(s, time 0, Ok(TcpRepr {
6579 seq_number: LOCAL_SEQ + 1,
6580 ack_number: Some(REMOTE_SEQ + 1),
6581 payload: &b"abc"[..],
6582 ..RECV_TEMPL
6583 }));
6584
6585 send!(s, time 0, TcpRepr {
6586 seq_number: REMOTE_SEQ + 1,
6587 ack_number: Some(LOCAL_SEQ + 1),
6588 ..SEND_TEMPL
6589 });
6590
6591 s.local_rx_dup_acks = u8::MAX - 1;
6593
6594 send!(s, time 0, TcpRepr {
6598 seq_number: REMOTE_SEQ + 1,
6599 ack_number: Some(LOCAL_SEQ + 1),
6600 ..SEND_TEMPL
6601 });
6602 send!(s, time 0, TcpRepr {
6603 seq_number: REMOTE_SEQ + 1,
6604 ack_number: Some(LOCAL_SEQ + 1),
6605 ..SEND_TEMPL
6606 });
6607 send!(s, time 0, TcpRepr {
6608 seq_number: REMOTE_SEQ + 1,
6609 ack_number: Some(LOCAL_SEQ + 1),
6610 ..SEND_TEMPL
6611 });
6612 assert_eq!(
6613 s.local_rx_dup_acks,
6614 u8::MAX,
6615 "duplicate ACK count should not overflow but saturate"
6616 );
6617 }
6618
6619 #[test]
6620 fn test_fast_retransmit_zero_window() {
6621 let mut s = socket_established();
6622
6623 send!(s, time 1000, TcpRepr {
6624 seq_number: REMOTE_SEQ + 1,
6625 ack_number: Some(LOCAL_SEQ + 1),
6626 ..SEND_TEMPL
6627 });
6628
6629 s.send_slice(b"abc").unwrap();
6630
6631 recv!(s, time 0, Ok(TcpRepr {
6632 seq_number: LOCAL_SEQ + 1,
6633 ack_number: Some(REMOTE_SEQ + 1),
6634 payload: &b"abc"[..],
6635 ..RECV_TEMPL
6636 }));
6637
6638 send!(s, time 1050, TcpRepr {
6640 seq_number: REMOTE_SEQ + 1,
6641 ack_number: Some(LOCAL_SEQ + 1),
6642 ..SEND_TEMPL
6643 });
6644 send!(s, time 1050, TcpRepr {
6645 seq_number: REMOTE_SEQ + 1,
6646 ack_number: Some(LOCAL_SEQ + 1),
6647 ..SEND_TEMPL
6648 });
6649 send!(s, time 1050, TcpRepr {
6650 seq_number: REMOTE_SEQ + 1,
6651 ack_number: Some(LOCAL_SEQ + 1),
6652 window_len: 0, ..SEND_TEMPL
6654 });
6655
6656 recv_nothing!(s);
6659 }
6660
6661 #[test]
6662 fn test_retransmit_exponential_backoff() {
6663 let mut s = socket_established();
6664 s.send_slice(b"abcdef").unwrap();
6665 recv!(s, time 0, Ok(TcpRepr {
6666 seq_number: LOCAL_SEQ + 1,
6667 ack_number: Some(REMOTE_SEQ + 1),
6668 payload: &b"abcdef"[..],
6669 ..RECV_TEMPL
6670 }));
6671
6672 let expected_retransmission_instant = s.rtte.retransmission_timeout().total_millis() as i64;
6673 recv_nothing!(s, time expected_retransmission_instant - 1);
6674 recv!(s, time expected_retransmission_instant, Ok(TcpRepr {
6675 seq_number: LOCAL_SEQ + 1,
6676 ack_number: Some(REMOTE_SEQ + 1),
6677 payload: &b"abcdef"[..],
6678 ..RECV_TEMPL
6679 }));
6680
6681 let expected_retransmission_instant = 3 * expected_retransmission_instant;
6683
6684 recv_nothing!(s, time expected_retransmission_instant - 1);
6685 recv!(s, time expected_retransmission_instant, Ok(TcpRepr {
6686 seq_number: LOCAL_SEQ + 1,
6687 ack_number: Some(REMOTE_SEQ + 1),
6688 payload: &b"abcdef"[..],
6689 ..RECV_TEMPL
6690 }));
6691 }
6692
6693 #[test]
6694 fn test_data_retransmit_ack_more_than_expected() {
6695 let mut s = socket_established();
6696 s.remote_mss = 6;
6697 s.send_slice(b"aaaaaabbbbbbcccccc").unwrap();
6698
6699 recv!(s, time 0, Ok(TcpRepr {
6700 seq_number: LOCAL_SEQ + 1,
6701 ack_number: Some(REMOTE_SEQ + 1),
6702 payload: &b"aaaaaa"[..],
6703 ..RECV_TEMPL
6704 }));
6705 recv!(s, time 0, Ok(TcpRepr {
6706 seq_number: LOCAL_SEQ + 1 + 6,
6707 ack_number: Some(REMOTE_SEQ + 1),
6708 payload: &b"bbbbbb"[..],
6709 ..RECV_TEMPL
6710 }));
6711 recv!(s, time 0, Ok(TcpRepr {
6712 seq_number: LOCAL_SEQ + 1 + 12,
6713 ack_number: Some(REMOTE_SEQ + 1),
6714 payload: &b"cccccc"[..],
6715 ..RECV_TEMPL
6716 }));
6717 recv_nothing!(s, time 0);
6718
6719 recv_nothing!(s, time 50);
6720
6721 assert!(s.timer.is_retransmit());
6724 recv!(s, time 1000, Ok(TcpRepr {
6725 seq_number: LOCAL_SEQ + 1,
6726 ack_number: Some(REMOTE_SEQ + 1),
6727 payload: &b"aaaaaa"[..],
6728 ..RECV_TEMPL
6729 }));
6730 recv!(s, time 1000, Ok(TcpRepr {
6731 seq_number: LOCAL_SEQ + 1 + 6,
6732 ack_number: Some(REMOTE_SEQ + 1),
6733 payload: &b"bbbbbb"[..],
6734 ..RECV_TEMPL
6735 }));
6736
6737 send!(
6739 s,
6740 time 3000,
6741 TcpRepr {
6742 seq_number: REMOTE_SEQ + 1,
6743 ack_number: Some(LOCAL_SEQ + 1 + 6),
6744 ..SEND_TEMPL
6745 }
6746 );
6747
6748 assert!(s.timer.is_retransmit());
6751
6752 send!(
6756 s,
6757 time 3000,
6758 TcpRepr {
6759 seq_number: REMOTE_SEQ + 1,
6760 ack_number: Some(LOCAL_SEQ + 1 + 18),
6761 ..SEND_TEMPL
6762 }
6763 );
6764
6765 assert!(!s.timer.is_retransmit());
6767 assert!(s.tx_buffer.is_empty());
6769 recv_nothing!(s, time 5000);
6770 }
6771
6772 #[test]
6773 fn test_retransmit_fin() {
6774 let mut s = socket_established();
6775 s.close();
6776 recv!(s, time 0, Ok(TcpRepr {
6777 control: TcpControl::Fin,
6778 seq_number: LOCAL_SEQ + 1,
6779 ack_number: Some(REMOTE_SEQ + 1),
6780 ..RECV_TEMPL
6781 }));
6782
6783 recv_nothing!(s, time 999);
6784 recv!(s, time 1000, Ok(TcpRepr {
6785 control: TcpControl::Fin,
6786 seq_number: LOCAL_SEQ + 1,
6787 ack_number: Some(REMOTE_SEQ + 1),
6788 ..RECV_TEMPL
6789 }));
6790 }
6791
6792 #[test]
6793 fn test_retransmit_fin_wait() {
6794 let mut s = socket_fin_wait_1();
6795 recv!(
6797 s,
6798 [TcpRepr {
6799 control: TcpControl::Fin,
6800 seq_number: LOCAL_SEQ + 1,
6801 ack_number: Some(REMOTE_SEQ + 1),
6802 ..RECV_TEMPL
6803 }]
6804 );
6805 send!(
6807 s,
6808 TcpRepr {
6809 control: TcpControl::Fin,
6810 seq_number: REMOTE_SEQ + 1,
6811 ack_number: Some(LOCAL_SEQ + 1),
6812 ..SEND_TEMPL
6813 }
6814 );
6815 recv!(
6817 s,
6818 [TcpRepr {
6819 control: TcpControl::None,
6820 seq_number: LOCAL_SEQ + 2,
6821 ack_number: Some(REMOTE_SEQ + 2),
6822 ..RECV_TEMPL
6823 }]
6824 );
6825
6826 recv_nothing!(s, time 999);
6828 recv!(
6829 s,
6830 time 1000,
6831 [TcpRepr {
6832 control: TcpControl::Fin,
6833 seq_number: LOCAL_SEQ + 1,
6834 ack_number: Some(REMOTE_SEQ + 2),
6835 ..RECV_TEMPL
6836 }]
6837 );
6838 recv_nothing!(s, time 2999);
6839 recv!(
6840 s,
6841 time 3000,
6842 [TcpRepr {
6843 control: TcpControl::Fin,
6844 seq_number: LOCAL_SEQ + 1,
6845 ack_number: Some(REMOTE_SEQ + 2),
6846 ..RECV_TEMPL
6847 }]
6848 );
6849 }
6850
6851 #[test]
6856 fn test_maximum_segment_size() {
6857 let mut s = socket_listen();
6858 s.tx_buffer = SocketBuffer::new(vec![0; 32767]);
6859 send!(
6860 s,
6861 TcpRepr {
6862 control: TcpControl::Syn,
6863 seq_number: REMOTE_SEQ,
6864 ack_number: None,
6865 max_seg_size: Some(1000),
6866 ..SEND_TEMPL
6867 }
6868 );
6869 recv!(
6870 s,
6871 [TcpRepr {
6872 control: TcpControl::Syn,
6873 seq_number: LOCAL_SEQ,
6874 ack_number: Some(REMOTE_SEQ + 1),
6875 max_seg_size: Some(BASE_MSS),
6876 ..RECV_TEMPL
6877 }]
6878 );
6879 send!(
6880 s,
6881 TcpRepr {
6882 seq_number: REMOTE_SEQ + 1,
6883 ack_number: Some(LOCAL_SEQ + 1),
6884 window_len: 32767,
6885 ..SEND_TEMPL
6886 }
6887 );
6888 s.send_slice(&[0; 1200][..]).unwrap();
6889 recv!(
6890 s,
6891 Ok(TcpRepr {
6892 seq_number: LOCAL_SEQ + 1,
6893 ack_number: Some(REMOTE_SEQ + 1),
6894 payload: &[0; 1000][..],
6895 ..RECV_TEMPL
6896 })
6897 );
6898 }
6899
6900 #[test]
6901 fn test_recv_out_of_recv_win() {
6902 let mut s = socket_established();
6903 s.set_ack_delay(Some(ACK_DELAY_DEFAULT));
6904 s.remote_mss = 32;
6905
6906 send!(
6908 s,
6909 TcpRepr {
6910 control: TcpControl::Psh,
6911 seq_number: REMOTE_SEQ + 1,
6912 ack_number: Some(LOCAL_SEQ + 1),
6913 payload: &[0; 32],
6914 ..SEND_TEMPL
6915 }
6916 );
6917 recv_nothing!(s);
6918
6919 send!(
6921 s,
6922 TcpRepr {
6923 control: TcpControl::Psh,
6924 seq_number: REMOTE_SEQ + 33,
6925 ack_number: Some(LOCAL_SEQ + 1),
6926 payload: &[0; 1],
6927 ..SEND_TEMPL
6928 }
6929 );
6930 recv!(
6931 s,
6932 Ok(TcpRepr {
6933 seq_number: LOCAL_SEQ + 1,
6934 ack_number: Some(REMOTE_SEQ + 34),
6935 window_len: 31,
6936 ..RECV_TEMPL
6937 })
6938 );
6939
6940 s.recv_slice(&mut [0; 1]).unwrap();
6943 recv_nothing!(s);
6944
6945 send!(
6948 s,
6949 TcpRepr {
6950 control: TcpControl::Psh,
6951 seq_number: REMOTE_SEQ + 34,
6952 ack_number: Some(LOCAL_SEQ + 1),
6953 payload: &[0; 32],
6954 ..SEND_TEMPL
6955 }
6956 );
6957 recv!(
6958 s,
6959 Ok(TcpRepr {
6960 seq_number: LOCAL_SEQ + 1,
6961 ack_number: Some(REMOTE_SEQ + 65),
6962 window_len: 1, ..RECV_TEMPL
6964 })
6965 );
6966 }
6967
6968 #[test]
6969 fn test_close_wait_no_window_update() {
6970 let mut s = socket_established();
6971 send!(
6972 s,
6973 TcpRepr {
6974 control: TcpControl::Fin,
6975 seq_number: REMOTE_SEQ + 1,
6976 ack_number: Some(LOCAL_SEQ + 1),
6977 payload: &[1, 2, 3, 4],
6978 ..SEND_TEMPL
6979 }
6980 );
6981 assert_eq!(s.state, State::CloseWait);
6982
6983 recv!(
6985 s,
6986 Ok(TcpRepr {
6987 seq_number: LOCAL_SEQ + 1,
6988 ack_number: Some(REMOTE_SEQ + 6),
6989 window_len: 60,
6990 ..RECV_TEMPL
6991 })
6992 );
6993
6994 let rx_buf = &mut [0; 32];
6995 assert_eq!(s.recv_slice(rx_buf), Ok(4));
6996
6997 recv_nothing!(s);
6999 }
7000
7001 #[test]
7002 fn test_time_wait_no_window_update() {
7003 let mut s = socket_fin_wait_2();
7004 send!(
7005 s,
7006 TcpRepr {
7007 control: TcpControl::Fin,
7008 seq_number: REMOTE_SEQ + 1,
7009 ack_number: Some(LOCAL_SEQ + 2),
7010 payload: &[1, 2, 3, 4],
7011 ..SEND_TEMPL
7012 }
7013 );
7014 assert_eq!(s.state, State::TimeWait);
7015
7016 recv!(
7018 s,
7019 Ok(TcpRepr {
7020 seq_number: LOCAL_SEQ + 2,
7021 ack_number: Some(REMOTE_SEQ + 6),
7022 window_len: 60,
7023 ..RECV_TEMPL
7024 })
7025 );
7026
7027 let rx_buf = &mut [0; 32];
7028 assert_eq!(s.recv_slice(rx_buf), Ok(4));
7029
7030 recv_nothing!(s);
7032 }
7033
7034 #[test]
7039 fn test_psh_transmit() {
7040 let mut s = socket_established();
7041 s.remote_mss = 6;
7042 s.send_slice(b"abcdef").unwrap();
7043 s.send_slice(b"123456").unwrap();
7044 recv!(s, time 0, Ok(TcpRepr {
7045 control: TcpControl::None,
7046 seq_number: LOCAL_SEQ + 1,
7047 ack_number: Some(REMOTE_SEQ + 1),
7048 payload: &b"abcdef"[..],
7049 ..RECV_TEMPL
7050 }), exact);
7051 recv!(s, time 0, Ok(TcpRepr {
7052 control: TcpControl::Psh,
7053 seq_number: LOCAL_SEQ + 1 + 6,
7054 ack_number: Some(REMOTE_SEQ + 1),
7055 payload: &b"123456"[..],
7056 ..RECV_TEMPL
7057 }), exact);
7058 }
7059
7060 #[test]
7061 fn test_psh_receive() {
7062 let mut s = socket_established();
7063 send!(
7064 s,
7065 TcpRepr {
7066 control: TcpControl::Psh,
7067 seq_number: REMOTE_SEQ + 1,
7068 ack_number: Some(LOCAL_SEQ + 1),
7069 payload: &b"abcdef"[..],
7070 ..SEND_TEMPL
7071 }
7072 );
7073 recv!(
7074 s,
7075 [TcpRepr {
7076 seq_number: LOCAL_SEQ + 1,
7077 ack_number: Some(REMOTE_SEQ + 1 + 6),
7078 window_len: 58,
7079 ..RECV_TEMPL
7080 }]
7081 );
7082 }
7083
7084 #[test]
7085 fn test_zero_window_ack() {
7086 let mut s = socket_established();
7087 s.rx_buffer = SocketBuffer::new(vec![0; 6]);
7088 s.assembler = Assembler::new();
7089 send!(
7090 s,
7091 TcpRepr {
7092 seq_number: REMOTE_SEQ + 1,
7093 ack_number: Some(LOCAL_SEQ + 1),
7094 payload: &b"abcdef"[..],
7095 ..SEND_TEMPL
7096 }
7097 );
7098 recv!(
7099 s,
7100 [TcpRepr {
7101 seq_number: LOCAL_SEQ + 1,
7102 ack_number: Some(REMOTE_SEQ + 1 + 6),
7103 window_len: 0,
7104 ..RECV_TEMPL
7105 }]
7106 );
7107 send!(
7108 s,
7109 TcpRepr {
7110 seq_number: REMOTE_SEQ + 1 + 6,
7111 ack_number: Some(LOCAL_SEQ + 1),
7112 payload: &b"123456"[..],
7113 ..SEND_TEMPL
7114 },
7115 Some(TcpRepr {
7116 seq_number: LOCAL_SEQ + 1,
7117 ack_number: Some(REMOTE_SEQ + 1 + 6),
7118 window_len: 0,
7119 ..RECV_TEMPL
7120 })
7121 );
7122 }
7123
7124 #[test]
7125 fn test_zero_window_fin() {
7126 let mut s = socket_established();
7127 s.rx_buffer = SocketBuffer::new(vec![0; 6]);
7128 s.assembler = Assembler::new();
7129 s.ack_delay = None;
7130
7131 send!(
7132 s,
7133 TcpRepr {
7134 seq_number: REMOTE_SEQ + 1,
7135 ack_number: Some(LOCAL_SEQ + 1),
7136 payload: &b"abcdef"[..],
7137 ..SEND_TEMPL
7138 }
7139 );
7140 recv!(
7141 s,
7142 [TcpRepr {
7143 seq_number: LOCAL_SEQ + 1,
7144 ack_number: Some(REMOTE_SEQ + 1 + 6),
7145 window_len: 0,
7146 ..RECV_TEMPL
7147 }]
7148 );
7149
7150 send!(
7153 s,
7154 TcpRepr {
7155 seq_number: REMOTE_SEQ + 1 + 6,
7156 ack_number: Some(LOCAL_SEQ + 1),
7157 payload: &[],
7158 control: TcpControl::Fin,
7159 ..SEND_TEMPL
7160 }
7161 );
7162 assert_eq!(s.state, State::CloseWait);
7163
7164 recv!(
7165 s,
7166 [TcpRepr {
7167 seq_number: LOCAL_SEQ + 1,
7168 ack_number: Some(REMOTE_SEQ + 1 + 7),
7169 window_len: 0,
7170 ..RECV_TEMPL
7171 }]
7172 );
7173 }
7174
7175 #[test]
7176 fn test_zero_window_ack_on_window_growth() {
7177 let mut s = socket_established();
7178 s.rx_buffer = SocketBuffer::new(vec![0; 6]);
7179 s.assembler = Assembler::new();
7180 send!(
7181 s,
7182 TcpRepr {
7183 seq_number: REMOTE_SEQ + 1,
7184 ack_number: Some(LOCAL_SEQ + 1),
7185 payload: &b"abcdef"[..],
7186 ..SEND_TEMPL
7187 }
7188 );
7189 recv!(
7190 s,
7191 [TcpRepr {
7192 seq_number: LOCAL_SEQ + 1,
7193 ack_number: Some(REMOTE_SEQ + 1 + 6),
7194 window_len: 0,
7195 ..RECV_TEMPL
7196 }]
7197 );
7198 recv_nothing!(s, time 0);
7199 s.recv(|buffer| {
7200 assert_eq!(&buffer[..3], b"abc");
7201 (3, ())
7202 })
7203 .unwrap();
7204 recv!(s, time 0, Ok(TcpRepr {
7205 seq_number: LOCAL_SEQ + 1,
7206 ack_number: Some(REMOTE_SEQ + 1 + 6),
7207 window_len: 3,
7208 ..RECV_TEMPL
7209 }));
7210 recv_nothing!(s, time 0);
7211 s.recv(|buffer| {
7212 assert_eq!(buffer, b"def");
7213 (buffer.len(), ())
7214 })
7215 .unwrap();
7216 recv!(s, time 0, Ok(TcpRepr {
7217 seq_number: LOCAL_SEQ + 1,
7218 ack_number: Some(REMOTE_SEQ + 1 + 6),
7219 window_len: 6,
7220 ..RECV_TEMPL
7221 }));
7222 }
7223
7224 #[test]
7225 fn test_window_update_with_delay_ack() {
7226 let mut s = socket_established_with_buffer_sizes(6, 6);
7227 s.ack_delay = Some(Duration::from_millis(10));
7228
7229 send!(
7230 s,
7231 TcpRepr {
7232 seq_number: REMOTE_SEQ + 1,
7233 ack_number: Some(LOCAL_SEQ + 1),
7234 payload: &b"abcdef"[..],
7235 ..SEND_TEMPL
7236 }
7237 );
7238
7239 recv_nothing!(s, time 5);
7240
7241 s.recv(|buffer| {
7242 assert_eq!(&buffer[..2], b"ab");
7243 (2, ())
7244 })
7245 .unwrap();
7246 recv!(
7247 s,
7248 time 5,
7249 Ok(TcpRepr {
7250 seq_number: LOCAL_SEQ + 1,
7251 ack_number: Some(REMOTE_SEQ + 1 + 6),
7252 window_len: 2,
7253 ..RECV_TEMPL
7254 })
7255 );
7256
7257 s.recv(|buffer| {
7258 assert_eq!(&buffer[..1], b"c");
7259 (1, ())
7260 })
7261 .unwrap();
7262 recv_nothing!(s, time 5);
7263
7264 s.recv(|buffer| {
7265 assert_eq!(&buffer[..1], b"d");
7266 (1, ())
7267 })
7268 .unwrap();
7269 recv!(
7270 s,
7271 time 5,
7272 Ok(TcpRepr {
7273 seq_number: LOCAL_SEQ + 1,
7274 ack_number: Some(REMOTE_SEQ + 1 + 6),
7275 window_len: 4,
7276 ..RECV_TEMPL
7277 })
7278 );
7279 }
7280
7281 #[test]
7282 fn test_fill_peer_window() {
7283 let mut s = socket_established();
7284 s.remote_mss = 6;
7285 s.send_slice(b"abcdef123456!@#$%^").unwrap();
7286 recv!(
7287 s,
7288 [
7289 TcpRepr {
7290 seq_number: LOCAL_SEQ + 1,
7291 ack_number: Some(REMOTE_SEQ + 1),
7292 payload: &b"abcdef"[..],
7293 ..RECV_TEMPL
7294 },
7295 TcpRepr {
7296 seq_number: LOCAL_SEQ + 1 + 6,
7297 ack_number: Some(REMOTE_SEQ + 1),
7298 payload: &b"123456"[..],
7299 ..RECV_TEMPL
7300 },
7301 TcpRepr {
7302 seq_number: LOCAL_SEQ + 1 + 6 + 6,
7303 ack_number: Some(REMOTE_SEQ + 1),
7304 payload: &b"!@#$%^"[..],
7305 ..RECV_TEMPL
7306 }
7307 ]
7308 );
7309 }
7310
7311 #[test]
7312 fn test_announce_window_after_read() {
7313 let mut s = socket_established();
7314 s.rx_buffer = SocketBuffer::new(vec![0; 6]);
7315 s.assembler = Assembler::new();
7316 send!(
7317 s,
7318 TcpRepr {
7319 seq_number: REMOTE_SEQ + 1,
7320 ack_number: Some(LOCAL_SEQ + 1),
7321 payload: &b"abc"[..],
7322 ..SEND_TEMPL
7323 }
7324 );
7325 recv!(
7326 s,
7327 [TcpRepr {
7328 seq_number: LOCAL_SEQ + 1,
7329 ack_number: Some(REMOTE_SEQ + 1 + 3),
7330 window_len: 3,
7331 ..RECV_TEMPL
7332 }]
7333 );
7334 assert_eq!(s.remote_last_win, s.rx_buffer.window() as u16);
7336 s.recv(|buffer| (buffer.len(), ())).unwrap();
7337 assert!(s.window_to_update());
7338 recv!(
7339 s,
7340 [TcpRepr {
7341 seq_number: LOCAL_SEQ + 1,
7342 ack_number: Some(REMOTE_SEQ + 1 + 3),
7343 window_len: 6,
7344 ..RECV_TEMPL
7345 }]
7346 );
7347 assert_eq!(s.remote_last_win, s.rx_buffer.window() as u16);
7348 send!(
7350 s,
7351 TcpRepr {
7352 seq_number: REMOTE_SEQ + 1 + 6,
7353 ack_number: Some(LOCAL_SEQ + 1),
7354 payload: &b"def"[..],
7355 ..SEND_TEMPL
7356 },
7357 Some(TcpRepr {
7358 seq_number: LOCAL_SEQ + 1,
7359 ack_number: Some(REMOTE_SEQ + 1 + 3),
7360 window_len: 6,
7361 ..RECV_TEMPL
7362 })
7363 );
7364 send!(
7365 s,
7366 TcpRepr {
7367 seq_number: REMOTE_SEQ + 1 + 3,
7368 ack_number: Some(LOCAL_SEQ + 1),
7369 payload: &b"abc"[..],
7370 ..SEND_TEMPL
7371 },
7372 Some(TcpRepr {
7373 seq_number: LOCAL_SEQ + 1,
7374 ack_number: Some(REMOTE_SEQ + 1 + 9),
7375 window_len: 0,
7376 ..RECV_TEMPL
7377 })
7378 );
7379 assert_eq!(s.remote_last_win, s.rx_buffer.window() as u16);
7380 s.recv(|buffer| (buffer.len(), ())).unwrap();
7381 assert!(s.window_to_update());
7382 }
7383
7384 #[test]
7389 fn test_zero_window_probe_enter_on_win_update() {
7390 let mut s = socket_established();
7391
7392 assert!(!s.timer.is_zero_window_probe());
7393
7394 s.send_slice(b"abcdef123456!@#$%^").unwrap();
7395
7396 assert!(!s.timer.is_zero_window_probe());
7397
7398 send!(
7399 s,
7400 TcpRepr {
7401 seq_number: REMOTE_SEQ + 1,
7402 ack_number: Some(LOCAL_SEQ + 1),
7403 window_len: 0,
7404 ..SEND_TEMPL
7405 }
7406 );
7407
7408 assert!(s.timer.is_zero_window_probe());
7409 }
7410
7411 #[test]
7412 fn test_zero_window_probe_enter_on_send() {
7413 let mut s = socket_established();
7414
7415 send!(
7416 s,
7417 TcpRepr {
7418 seq_number: REMOTE_SEQ + 1,
7419 ack_number: Some(LOCAL_SEQ + 1),
7420 window_len: 0,
7421 ..SEND_TEMPL
7422 }
7423 );
7424
7425 assert!(!s.timer.is_zero_window_probe());
7426
7427 s.send_slice(b"abcdef123456!@#$%^").unwrap();
7428
7429 assert!(s.timer.is_zero_window_probe());
7430 }
7431
7432 #[test]
7433 fn test_zero_window_probe_exit() {
7434 let mut s = socket_established();
7435
7436 s.send_slice(b"abcdef123456!@#$%^").unwrap();
7437
7438 assert!(!s.timer.is_zero_window_probe());
7439
7440 send!(
7441 s,
7442 TcpRepr {
7443 seq_number: REMOTE_SEQ + 1,
7444 ack_number: Some(LOCAL_SEQ + 1),
7445 window_len: 0,
7446 ..SEND_TEMPL
7447 }
7448 );
7449
7450 assert!(s.timer.is_zero_window_probe());
7451
7452 send!(
7453 s,
7454 TcpRepr {
7455 seq_number: REMOTE_SEQ + 1,
7456 ack_number: Some(LOCAL_SEQ + 1),
7457 window_len: 6,
7458 ..SEND_TEMPL
7459 }
7460 );
7461
7462 assert!(!s.timer.is_zero_window_probe());
7463 }
7464
7465 #[test]
7466 fn test_zero_window_probe_exit_ack() {
7467 let mut s = socket_established();
7468
7469 s.send_slice(b"abcdef123456!@#$%^").unwrap();
7470 send!(
7471 s,
7472 TcpRepr {
7473 seq_number: REMOTE_SEQ + 1,
7474 ack_number: Some(LOCAL_SEQ + 1),
7475 window_len: 0,
7476 ..SEND_TEMPL
7477 }
7478 );
7479
7480 recv!(
7481 s,
7482 time 1000,
7483 [TcpRepr {
7484 seq_number: LOCAL_SEQ + 1,
7485 ack_number: Some(REMOTE_SEQ + 1),
7486 payload: &b"a"[..],
7487 ..RECV_TEMPL
7488 }]
7489 );
7490
7491 send!(
7492 s,
7493 time 1010,
7494 TcpRepr {
7495 seq_number: REMOTE_SEQ + 1,
7496 ack_number: Some(LOCAL_SEQ + 2),
7497 window_len: 6,
7498 ..SEND_TEMPL
7499 }
7500 );
7501
7502 recv!(
7503 s,
7504 time 1010,
7505 [TcpRepr {
7506 seq_number: LOCAL_SEQ + 2,
7507 ack_number: Some(REMOTE_SEQ + 1),
7508 payload: &b"bcdef1"[..],
7509 ..RECV_TEMPL
7510 }]
7511 );
7512 }
7513
7514 #[test]
7515 fn test_zero_window_probe_backoff_nack_reply() {
7516 let mut s = socket_established();
7517 s.send_slice(b"abcdef123456!@#$%^").unwrap();
7518 send!(
7519 s,
7520 TcpRepr {
7521 seq_number: REMOTE_SEQ + 1,
7522 ack_number: Some(LOCAL_SEQ + 1),
7523 window_len: 0,
7524 ..SEND_TEMPL
7525 }
7526 );
7527
7528 recv_nothing!(s, time 999);
7529 recv!(
7530 s,
7531 time 1000,
7532 [TcpRepr {
7533 seq_number: LOCAL_SEQ + 1,
7534 ack_number: Some(REMOTE_SEQ + 1),
7535 payload: &b"a"[..],
7536 ..RECV_TEMPL
7537 }]
7538 );
7539 send!(
7540 s,
7541 time 1100,
7542 TcpRepr {
7543 seq_number: REMOTE_SEQ + 1,
7544 ack_number: Some(LOCAL_SEQ + 1),
7545 window_len: 0,
7546 ..SEND_TEMPL
7547 }
7548 );
7549
7550 recv_nothing!(s, time 2999);
7551 recv!(
7552 s,
7553 time 3000,
7554 [TcpRepr {
7555 seq_number: LOCAL_SEQ + 1,
7556 ack_number: Some(REMOTE_SEQ + 1),
7557 payload: &b"a"[..],
7558 ..RECV_TEMPL
7559 }]
7560 );
7561 send!(
7562 s,
7563 time 3100,
7564 TcpRepr {
7565 seq_number: REMOTE_SEQ + 1,
7566 ack_number: Some(LOCAL_SEQ + 1),
7567 window_len: 0,
7568 ..SEND_TEMPL
7569 }
7570 );
7571
7572 recv_nothing!(s, time 6999);
7573 recv!(
7574 s,
7575 time 7000,
7576 [TcpRepr {
7577 seq_number: LOCAL_SEQ + 1,
7578 ack_number: Some(REMOTE_SEQ + 1),
7579 payload: &b"a"[..],
7580 ..RECV_TEMPL
7581 }]
7582 );
7583 }
7584
7585 #[test]
7586 fn test_zero_window_probe_backoff_no_reply() {
7587 let mut s = socket_established();
7588 s.send_slice(b"abcdef123456!@#$%^").unwrap();
7589 send!(
7590 s,
7591 TcpRepr {
7592 seq_number: REMOTE_SEQ + 1,
7593 ack_number: Some(LOCAL_SEQ + 1),
7594 window_len: 0,
7595 ..SEND_TEMPL
7596 }
7597 );
7598
7599 recv_nothing!(s, time 999);
7600 recv!(
7601 s,
7602 time 1000,
7603 [TcpRepr {
7604 seq_number: LOCAL_SEQ + 1,
7605 ack_number: Some(REMOTE_SEQ + 1),
7606 payload: &b"a"[..],
7607 ..RECV_TEMPL
7608 }]
7609 );
7610
7611 recv_nothing!(s, time 2999);
7612 recv!(
7613 s,
7614 time 3000,
7615 [TcpRepr {
7616 seq_number: LOCAL_SEQ + 1,
7617 ack_number: Some(REMOTE_SEQ + 1),
7618 payload: &b"a"[..],
7619 ..RECV_TEMPL
7620 }]
7621 );
7622 }
7623
7624 #[test]
7625 fn test_zero_window_probe_shift() {
7626 let mut s = socket_established();
7627
7628 s.send_slice(b"abcdef123456!@#$%^").unwrap();
7629 send!(
7630 s,
7631 TcpRepr {
7632 seq_number: REMOTE_SEQ + 1,
7633 ack_number: Some(LOCAL_SEQ + 1),
7634 window_len: 0,
7635 ..SEND_TEMPL
7636 }
7637 );
7638
7639 recv_nothing!(s, time 999);
7640 recv!(
7641 s,
7642 time 1000,
7643 [TcpRepr {
7644 seq_number: LOCAL_SEQ + 1,
7645 ack_number: Some(REMOTE_SEQ + 1),
7646 payload: &b"a"[..],
7647 ..RECV_TEMPL
7648 }]
7649 );
7650
7651 recv_nothing!(s, time 2999);
7652 recv!(
7653 s,
7654 time 3000,
7655 [TcpRepr {
7656 seq_number: LOCAL_SEQ + 1,
7657 ack_number: Some(REMOTE_SEQ + 1),
7658 payload: &b"a"[..],
7659 ..RECV_TEMPL
7660 }]
7661 );
7662
7663 send!(
7666 s,
7667 time 3100,
7668 TcpRepr {
7669 seq_number: REMOTE_SEQ + 1,
7670 ack_number: Some(LOCAL_SEQ + 2),
7671 window_len: 0,
7672 ..SEND_TEMPL
7673 }
7674 );
7675
7676 recv_nothing!(s, time 4099);
7678 recv!(
7679 s,
7680 time 4100,
7681 [TcpRepr {
7682 seq_number: LOCAL_SEQ + 2,
7683 ack_number: Some(REMOTE_SEQ + 1),
7684 payload: &b"b"[..],
7685 ..RECV_TEMPL
7686 }]
7687 );
7688 }
7689
7690 #[test]
7695 fn test_listen_timeout() {
7696 let mut s = socket_listen();
7697 s.set_timeout(Some(Duration::from_millis(100)));
7698 assert_eq!(s.socket.poll_at(&mut s.cx), PollAt::Ingress);
7699 }
7700
7701 #[test]
7702 fn test_connect_timeout() {
7703 let mut s = socket();
7704 s.local_seq_no = LOCAL_SEQ;
7705 s.socket
7706 .connect(&mut s.cx, REMOTE_END, LOCAL_END.port)
7707 .unwrap();
7708 s.set_timeout(Some(Duration::from_millis(100)));
7709 recv!(s, time 150, Ok(TcpRepr {
7710 control: TcpControl::Syn,
7711 seq_number: LOCAL_SEQ,
7712 ack_number: None,
7713 max_seg_size: Some(BASE_MSS),
7714 window_scale: Some(0),
7715 sack_permitted: true,
7716 ..RECV_TEMPL
7717 }));
7718 assert_eq!(s.state, State::SynSent);
7719 assert_eq!(
7720 s.socket.poll_at(&mut s.cx),
7721 PollAt::Time(Instant::from_millis(250))
7722 );
7723 recv!(s, time 250, Ok(TcpRepr {
7724 control: TcpControl::Rst,
7725 seq_number: LOCAL_SEQ + 1,
7726 ack_number: Some(TcpSeqNumber(0)),
7727 window_scale: None,
7728 ..RECV_TEMPL
7729 }));
7730 assert_eq!(s.state, State::Closed);
7731 }
7732
7733 #[test]
7734 fn test_established_timeout() {
7735 let mut s = socket_established();
7736 s.set_timeout(Some(Duration::from_millis(2000)));
7737 recv_nothing!(s, time 250);
7738 assert_eq!(
7739 s.socket.poll_at(&mut s.cx),
7740 PollAt::Time(Instant::from_millis(2250))
7741 );
7742 s.send_slice(b"abcdef").unwrap();
7743 assert_eq!(s.socket.poll_at(&mut s.cx), PollAt::Now);
7744 recv!(s, time 255, Ok(TcpRepr {
7745 seq_number: LOCAL_SEQ + 1,
7746 ack_number: Some(REMOTE_SEQ + 1),
7747 payload: &b"abcdef"[..],
7748 ..RECV_TEMPL
7749 }));
7750 assert_eq!(
7751 s.socket.poll_at(&mut s.cx),
7752 PollAt::Time(Instant::from_millis(1255))
7753 );
7754 recv!(s, time 1255, Ok(TcpRepr {
7755 seq_number: LOCAL_SEQ + 1,
7756 ack_number: Some(REMOTE_SEQ + 1),
7757 payload: &b"abcdef"[..],
7758 ..RECV_TEMPL
7759 }));
7760 assert_eq!(
7761 s.socket.poll_at(&mut s.cx),
7762 PollAt::Time(Instant::from_millis(2255))
7763 );
7764 recv!(s, time 2255, Ok(TcpRepr {
7765 control: TcpControl::Rst,
7766 seq_number: LOCAL_SEQ + 1 + 6,
7767 ack_number: Some(REMOTE_SEQ + 1),
7768 ..RECV_TEMPL
7769 }));
7770 assert_eq!(s.state, State::Closed);
7771 }
7772
7773 #[test]
7774 fn test_established_keep_alive_timeout() {
7775 let mut s = socket_established();
7776 s.set_keep_alive(Some(Duration::from_millis(50)));
7777 s.set_timeout(Some(Duration::from_millis(100)));
7778 recv!(s, time 100, Ok(TcpRepr {
7779 seq_number: LOCAL_SEQ,
7780 ack_number: Some(REMOTE_SEQ + 1),
7781 payload: &[0],
7782 ..RECV_TEMPL
7783 }));
7784 recv_nothing!(s, time 100);
7785 assert_eq!(
7786 s.socket.poll_at(&mut s.cx),
7787 PollAt::Time(Instant::from_millis(150))
7788 );
7789 send!(s, time 105, TcpRepr {
7790 seq_number: REMOTE_SEQ + 1,
7791 ack_number: Some(LOCAL_SEQ + 1),
7792 ..SEND_TEMPL
7793 });
7794 assert_eq!(
7795 s.socket.poll_at(&mut s.cx),
7796 PollAt::Time(Instant::from_millis(155))
7797 );
7798 recv!(s, time 155, Ok(TcpRepr {
7799 seq_number: LOCAL_SEQ,
7800 ack_number: Some(REMOTE_SEQ + 1),
7801 payload: &[0],
7802 ..RECV_TEMPL
7803 }));
7804 recv_nothing!(s, time 155);
7805 assert_eq!(
7806 s.socket.poll_at(&mut s.cx),
7807 PollAt::Time(Instant::from_millis(205))
7808 );
7809 recv_nothing!(s, time 200);
7810 recv!(s, time 205, Ok(TcpRepr {
7811 control: TcpControl::Rst,
7812 seq_number: LOCAL_SEQ + 1,
7813 ack_number: Some(REMOTE_SEQ + 1),
7814 ..RECV_TEMPL
7815 }));
7816 recv_nothing!(s, time 205);
7817 assert_eq!(s.state, State::Closed);
7818 }
7819
7820 #[test]
7821 fn test_fin_wait_1_timeout() {
7822 let mut s = socket_fin_wait_1();
7823 s.set_timeout(Some(Duration::from_millis(1000)));
7824 recv!(s, time 100, Ok(TcpRepr {
7825 control: TcpControl::Fin,
7826 seq_number: LOCAL_SEQ + 1,
7827 ack_number: Some(REMOTE_SEQ + 1),
7828 ..RECV_TEMPL
7829 }));
7830 recv!(s, time 1100, Ok(TcpRepr {
7831 control: TcpControl::Rst,
7832 seq_number: LOCAL_SEQ + 1 + 1,
7833 ack_number: Some(REMOTE_SEQ + 1),
7834 ..RECV_TEMPL
7835 }));
7836 assert_eq!(s.state, State::Closed);
7837 }
7838
7839 #[test]
7840 fn test_last_ack_timeout() {
7841 let mut s = socket_last_ack();
7842 s.set_timeout(Some(Duration::from_millis(1000)));
7843 recv!(s, time 100, Ok(TcpRepr {
7844 control: TcpControl::Fin,
7845 seq_number: LOCAL_SEQ + 1,
7846 ack_number: Some(REMOTE_SEQ + 1 + 1),
7847 ..RECV_TEMPL
7848 }));
7849 recv!(s, time 1100, Ok(TcpRepr {
7850 control: TcpControl::Rst,
7851 seq_number: LOCAL_SEQ + 1 + 1,
7852 ack_number: Some(REMOTE_SEQ + 1 + 1),
7853 ..RECV_TEMPL
7854 }));
7855 assert_eq!(s.state, State::Closed);
7856 }
7857
7858 #[test]
7859 fn test_closed_timeout() {
7860 let mut s = socket_established();
7861 s.set_timeout(Some(Duration::from_millis(200)));
7862 s.remote_last_ts = Some(Instant::from_millis(100));
7863 s.abort();
7864 assert_eq!(s.socket.poll_at(&mut s.cx), PollAt::Now);
7865 recv!(s, time 100, Ok(TcpRepr {
7866 control: TcpControl::Rst,
7867 seq_number: LOCAL_SEQ + 1,
7868 ack_number: Some(REMOTE_SEQ + 1),
7869 ..RECV_TEMPL
7870 }));
7871 assert_eq!(s.socket.poll_at(&mut s.cx), PollAt::Ingress);
7872 }
7873
7874 #[test]
7879 fn test_responds_to_keep_alive() {
7880 let mut s = socket_established();
7881 send!(
7882 s,
7883 TcpRepr {
7884 seq_number: REMOTE_SEQ,
7885 ack_number: Some(LOCAL_SEQ + 1),
7886 ..SEND_TEMPL
7887 },
7888 Some(TcpRepr {
7889 seq_number: LOCAL_SEQ + 1,
7890 ack_number: Some(REMOTE_SEQ + 1),
7891 ..RECV_TEMPL
7892 })
7893 );
7894 }
7895
7896 #[test]
7897 fn test_sends_keep_alive() {
7898 let mut s = socket_established();
7899 s.set_keep_alive(Some(Duration::from_millis(100)));
7900
7901 assert_eq!(s.socket.poll_at(&mut s.cx), PollAt::Now);
7903 recv!(s, time 0, Ok(TcpRepr {
7904 seq_number: LOCAL_SEQ,
7905 ack_number: Some(REMOTE_SEQ + 1),
7906 payload: &[0],
7907 ..RECV_TEMPL
7908 }));
7909
7910 assert_eq!(
7911 s.socket.poll_at(&mut s.cx),
7912 PollAt::Time(Instant::from_millis(100))
7913 );
7914 recv_nothing!(s, time 95);
7915 recv!(s, time 100, Ok(TcpRepr {
7916 seq_number: LOCAL_SEQ,
7917 ack_number: Some(REMOTE_SEQ + 1),
7918 payload: &[0],
7919 ..RECV_TEMPL
7920 }));
7921
7922 assert_eq!(
7923 s.socket.poll_at(&mut s.cx),
7924 PollAt::Time(Instant::from_millis(200))
7925 );
7926 recv_nothing!(s, time 195);
7927 recv!(s, time 200, Ok(TcpRepr {
7928 seq_number: LOCAL_SEQ,
7929 ack_number: Some(REMOTE_SEQ + 1),
7930 payload: &[0],
7931 ..RECV_TEMPL
7932 }));
7933
7934 send!(s, time 250, TcpRepr {
7935 seq_number: REMOTE_SEQ + 1,
7936 ack_number: Some(LOCAL_SEQ + 1),
7937 ..SEND_TEMPL
7938 });
7939 assert_eq!(
7940 s.socket.poll_at(&mut s.cx),
7941 PollAt::Time(Instant::from_millis(350))
7942 );
7943 recv_nothing!(s, time 345);
7944 recv!(s, time 350, Ok(TcpRepr {
7945 seq_number: LOCAL_SEQ,
7946 ack_number: Some(REMOTE_SEQ + 1),
7947 payload: &b"\x00"[..],
7948 ..RECV_TEMPL
7949 }));
7950 }
7951
7952 #[test]
7957 fn test_set_hop_limit() {
7958 let mut s = socket_syn_received();
7959
7960 s.set_hop_limit(Some(0x2a));
7961 assert_eq!(
7962 s.socket.dispatch(&mut s.cx, |_, (ip_repr, _)| {
7963 assert_eq!(ip_repr.hop_limit(), 0x2a);
7964 Ok::<_, ()>(())
7965 }),
7966 Ok(())
7967 );
7968
7969 s.reset();
7972 assert_eq!(s.hop_limit(), Some(0x2a));
7973 }
7974
7975 #[test]
7976 #[should_panic(expected = "the time-to-live value of a packet must not be zero")]
7977 fn test_set_hop_limit_zero() {
7978 let mut s = socket_syn_received();
7979 s.set_hop_limit(Some(0));
7980 }
7981
7982 #[test]
7987 fn test_out_of_order() {
7988 let mut s = socket_established();
7989 send!(
7990 s,
7991 TcpRepr {
7992 seq_number: REMOTE_SEQ + 1 + 3,
7993 ack_number: Some(LOCAL_SEQ + 1),
7994 payload: &b"def"[..],
7995 ..SEND_TEMPL
7996 },
7997 Some(TcpRepr {
7998 seq_number: LOCAL_SEQ + 1,
7999 ack_number: Some(REMOTE_SEQ + 1),
8000 ..RECV_TEMPL
8001 })
8002 );
8003 s.recv(|buffer| {
8004 assert_eq!(buffer, b"");
8005 (buffer.len(), ())
8006 })
8007 .unwrap();
8008 send!(
8009 s,
8010 TcpRepr {
8011 seq_number: REMOTE_SEQ + 1,
8012 ack_number: Some(LOCAL_SEQ + 1),
8013 payload: &b"abcdef"[..],
8014 ..SEND_TEMPL
8015 },
8016 Some(TcpRepr {
8017 seq_number: LOCAL_SEQ + 1,
8018 ack_number: Some(REMOTE_SEQ + 1 + 6),
8019 window_len: 58,
8020 ..RECV_TEMPL
8021 })
8022 );
8023 s.recv(|buffer| {
8024 assert_eq!(buffer, b"abcdef");
8025 (buffer.len(), ())
8026 })
8027 .unwrap();
8028 }
8029
8030 #[test]
8031 fn test_buffer_wraparound_rx() {
8032 let mut s = socket_established();
8033 s.rx_buffer = SocketBuffer::new(vec![0; 6]);
8034 s.assembler = Assembler::new();
8035 send!(
8036 s,
8037 TcpRepr {
8038 seq_number: REMOTE_SEQ + 1,
8039 ack_number: Some(LOCAL_SEQ + 1),
8040 payload: &b"abc"[..],
8041 ..SEND_TEMPL
8042 }
8043 );
8044 s.recv(|buffer| {
8045 assert_eq!(buffer, b"abc");
8046 (buffer.len(), ())
8047 })
8048 .unwrap();
8049 send!(
8050 s,
8051 TcpRepr {
8052 seq_number: REMOTE_SEQ + 1 + 3,
8053 ack_number: Some(LOCAL_SEQ + 1),
8054 payload: &b"defghi"[..],
8055 ..SEND_TEMPL
8056 }
8057 );
8058 let mut data = [0; 6];
8059 assert_eq!(s.recv_slice(&mut data[..]), Ok(6));
8060 assert_eq!(data, &b"defghi"[..]);
8061 }
8062
8063 #[test]
8064 fn test_buffer_wraparound_tx() {
8065 let mut s = socket_established();
8066 s.set_nagle_enabled(false);
8067
8068 s.tx_buffer = SocketBuffer::new(vec![b'.'; 9]);
8069 assert_eq!(s.send_slice(b"xxxyyy"), Ok(6));
8070 assert_eq!(s.tx_buffer.dequeue_many(3), &b"xxx"[..]);
8071 assert_eq!(s.tx_buffer.len(), 3);
8072
8073 assert_eq!(s.send_slice(b"abcdef"), Ok(6));
8075 recv!(
8076 s,
8077 Ok(TcpRepr {
8078 seq_number: LOCAL_SEQ + 1,
8079 ack_number: Some(REMOTE_SEQ + 1),
8080 payload: &b"yyyabc"[..],
8081 ..RECV_TEMPL
8082 })
8083 );
8084 recv!(
8085 s,
8086 Ok(TcpRepr {
8087 seq_number: LOCAL_SEQ + 1 + 6,
8088 ack_number: Some(REMOTE_SEQ + 1),
8089 payload: &b"def"[..],
8090 ..RECV_TEMPL
8091 })
8092 );
8093 }
8094
8095 #[test]
8100 fn test_rx_close_fin() {
8101 let mut s = socket_established();
8102 send!(
8103 s,
8104 TcpRepr {
8105 control: TcpControl::Fin,
8106 seq_number: REMOTE_SEQ + 1,
8107 ack_number: Some(LOCAL_SEQ + 1),
8108 payload: &b"abc"[..],
8109 ..SEND_TEMPL
8110 }
8111 );
8112 s.recv(|data| {
8113 assert_eq!(data, b"abc");
8114 (3, ())
8115 })
8116 .unwrap();
8117 assert_eq!(s.recv(|_| (0, ())), Err(RecvError::Finished));
8118 }
8119
8120 #[test]
8121 fn test_rx_close_fin_in_fin_wait_1() {
8122 let mut s = socket_fin_wait_1();
8123 send!(
8124 s,
8125 TcpRepr {
8126 control: TcpControl::Fin,
8127 seq_number: REMOTE_SEQ + 1,
8128 ack_number: Some(LOCAL_SEQ + 1),
8129 payload: &b"abc"[..],
8130 ..SEND_TEMPL
8131 }
8132 );
8133 assert_eq!(s.state, State::Closing);
8134 s.recv(|data| {
8135 assert_eq!(data, b"abc");
8136 (3, ())
8137 })
8138 .unwrap();
8139 assert_eq!(s.recv(|_| (0, ())), Err(RecvError::Finished));
8140 }
8141
8142 #[test]
8143 fn test_rx_close_fin_in_fin_wait_2() {
8144 let mut s = socket_fin_wait_2();
8145 send!(
8146 s,
8147 TcpRepr {
8148 control: TcpControl::Fin,
8149 seq_number: REMOTE_SEQ + 1,
8150 ack_number: Some(LOCAL_SEQ + 1 + 1),
8151 payload: &b"abc"[..],
8152 ..SEND_TEMPL
8153 }
8154 );
8155 assert_eq!(s.state, State::TimeWait);
8156 s.recv(|data| {
8157 assert_eq!(data, b"abc");
8158 (3, ())
8159 })
8160 .unwrap();
8161 assert_eq!(s.recv(|_| (0, ())), Err(RecvError::Finished));
8162 }
8163
8164 #[test]
8165 fn test_rx_close_fin_with_hole() {
8166 let mut s = socket_established();
8167 send!(
8168 s,
8169 TcpRepr {
8170 seq_number: REMOTE_SEQ + 1,
8171 ack_number: Some(LOCAL_SEQ + 1),
8172 payload: &b"abc"[..],
8173 ..SEND_TEMPL
8174 }
8175 );
8176 send!(
8177 s,
8178 TcpRepr {
8179 control: TcpControl::Fin,
8180 seq_number: REMOTE_SEQ + 1 + 6,
8181 ack_number: Some(LOCAL_SEQ + 1),
8182 payload: &b"ghi"[..],
8183 ..SEND_TEMPL
8184 },
8185 Some(TcpRepr {
8186 seq_number: LOCAL_SEQ + 1,
8187 ack_number: Some(REMOTE_SEQ + 1 + 3),
8188 window_len: 61,
8189 ..RECV_TEMPL
8190 })
8191 );
8192 s.recv(|data| {
8193 assert_eq!(data, b"abc");
8194 (3, ())
8195 })
8196 .unwrap();
8197 s.recv(|data| {
8198 assert_eq!(data, b"");
8199 (0, ())
8200 })
8201 .unwrap();
8202 send!(
8203 s,
8204 TcpRepr {
8205 control: TcpControl::Rst,
8206 seq_number: REMOTE_SEQ + 1 + 9,
8207 ack_number: Some(LOCAL_SEQ + 1),
8208 ..SEND_TEMPL
8209 }
8210 );
8211 assert_eq!(s.recv(|_| (0, ())), Err(RecvError::InvalidState));
8214 }
8215
8216 #[test]
8217 fn test_rx_close_rst() {
8218 let mut s = socket_established();
8219 send!(
8220 s,
8221 TcpRepr {
8222 seq_number: REMOTE_SEQ + 1,
8223 ack_number: Some(LOCAL_SEQ + 1),
8224 payload: &b"abc"[..],
8225 ..SEND_TEMPL
8226 }
8227 );
8228 send!(
8229 s,
8230 TcpRepr {
8231 control: TcpControl::Rst,
8232 seq_number: REMOTE_SEQ + 1 + 3,
8233 ack_number: Some(LOCAL_SEQ + 1),
8234 ..SEND_TEMPL
8235 }
8236 );
8237 s.recv(|data| {
8238 assert_eq!(data, b"abc");
8239 (3, ())
8240 })
8241 .unwrap();
8242 assert_eq!(s.recv(|_| (0, ())), Err(RecvError::InvalidState));
8243 }
8244
8245 #[test]
8246 fn test_rx_close_rst_with_hole() {
8247 let mut s = socket_established();
8248 send!(
8249 s,
8250 TcpRepr {
8251 seq_number: REMOTE_SEQ + 1,
8252 ack_number: Some(LOCAL_SEQ + 1),
8253 payload: &b"abc"[..],
8254 ..SEND_TEMPL
8255 }
8256 );
8257 send!(
8258 s,
8259 TcpRepr {
8260 seq_number: REMOTE_SEQ + 1 + 6,
8261 ack_number: Some(LOCAL_SEQ + 1),
8262 payload: &b"ghi"[..],
8263 ..SEND_TEMPL
8264 },
8265 Some(TcpRepr {
8266 seq_number: LOCAL_SEQ + 1,
8267 ack_number: Some(REMOTE_SEQ + 1 + 3),
8268 window_len: 61,
8269 ..RECV_TEMPL
8270 })
8271 );
8272 send!(
8273 s,
8274 TcpRepr {
8275 control: TcpControl::Rst,
8276 seq_number: REMOTE_SEQ + 1 + 9,
8277 ack_number: Some(LOCAL_SEQ + 1),
8278 ..SEND_TEMPL
8279 }
8280 );
8281 s.recv(|data| {
8282 assert_eq!(data, b"abc");
8283 (3, ())
8284 })
8285 .unwrap();
8286 assert_eq!(s.recv(|_| (0, ())), Err(RecvError::InvalidState));
8287 }
8288
8289 #[test]
8294 fn test_delayed_ack() {
8295 let mut s = socket_established();
8296 s.set_ack_delay(Some(ACK_DELAY_DEFAULT));
8297 send!(
8298 s,
8299 TcpRepr {
8300 seq_number: REMOTE_SEQ + 1,
8301 ack_number: Some(LOCAL_SEQ + 1),
8302 payload: &b"abc"[..],
8303 ..SEND_TEMPL
8304 }
8305 );
8306
8307 recv_nothing!(s);
8309
8310 recv!(s, time 11, Ok(TcpRepr {
8312 seq_number: LOCAL_SEQ + 1,
8313 ack_number: Some(REMOTE_SEQ + 1 + 3),
8314 window_len: 61,
8315 ..RECV_TEMPL
8316 }));
8317 }
8318
8319 #[test]
8320 fn test_delayed_ack_win() {
8321 let mut s = socket_established();
8322 s.set_ack_delay(Some(ACK_DELAY_DEFAULT));
8323 send!(
8324 s,
8325 TcpRepr {
8326 seq_number: REMOTE_SEQ + 1,
8327 ack_number: Some(LOCAL_SEQ + 1),
8328 payload: &b"abc"[..],
8329 ..SEND_TEMPL
8330 }
8331 );
8332
8333 s.recv(|data| {
8335 assert_eq!(data, b"abc");
8336 (3, ())
8337 })
8338 .unwrap();
8339
8340 recv_nothing!(s);
8342
8343 recv!(s, time 11, Ok(TcpRepr {
8345 seq_number: LOCAL_SEQ + 1,
8346 ack_number: Some(REMOTE_SEQ + 1 + 3),
8347 ..RECV_TEMPL
8348 }));
8349 }
8350
8351 #[test]
8352 fn test_delayed_ack_reply() {
8353 let mut s = socket_established();
8354 s.set_ack_delay(Some(ACK_DELAY_DEFAULT));
8355 send!(
8356 s,
8357 TcpRepr {
8358 seq_number: REMOTE_SEQ + 1,
8359 ack_number: Some(LOCAL_SEQ + 1),
8360 payload: &b"abc"[..],
8361 ..SEND_TEMPL
8362 }
8363 );
8364
8365 s.recv(|data| {
8366 assert_eq!(data, b"abc");
8367 (3, ())
8368 })
8369 .unwrap();
8370
8371 s.send_slice(&b"xyz"[..]).unwrap();
8372
8373 recv!(
8376 s,
8377 Ok(TcpRepr {
8378 seq_number: LOCAL_SEQ + 1,
8379 ack_number: Some(REMOTE_SEQ + 1 + 3),
8380 payload: &b"xyz"[..],
8381 ..RECV_TEMPL
8382 })
8383 );
8384 }
8385
8386 #[test]
8387 fn test_delayed_ack_every_rmss() {
8388 let mut s = socket_established_with_buffer_sizes(DEFAULT_MSS * 2, DEFAULT_MSS * 2);
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: &[0; DEFAULT_MSS - 1],
8396 ..SEND_TEMPL
8397 }
8398 );
8399
8400 recv_nothing!(s);
8402
8403 send!(
8404 s,
8405 TcpRepr {
8406 seq_number: REMOTE_SEQ + 1 + (DEFAULT_MSS - 1),
8407 ack_number: Some(LOCAL_SEQ + 1),
8408 payload: &b"a"[..],
8409 ..SEND_TEMPL
8410 }
8411 );
8412
8413 recv_nothing!(s);
8415
8416 send!(
8417 s,
8418 TcpRepr {
8419 seq_number: REMOTE_SEQ + 1 + DEFAULT_MSS,
8420 ack_number: Some(LOCAL_SEQ + 1),
8421 payload: &b"a"[..],
8422 ..SEND_TEMPL
8423 }
8424 );
8425
8426 recv!(
8428 s,
8429 Ok(TcpRepr {
8430 seq_number: LOCAL_SEQ + 1,
8431 ack_number: Some(REMOTE_SEQ + 1 + (DEFAULT_MSS + 1)),
8432 window_len: (DEFAULT_MSS - 1) as u16,
8433 ..RECV_TEMPL
8434 })
8435 );
8436 }
8437
8438 #[test]
8439 fn test_delayed_ack_every_rmss_or_more() {
8440 let mut s = socket_established_with_buffer_sizes(DEFAULT_MSS * 2, DEFAULT_MSS * 2);
8441 s.set_ack_delay(Some(ACK_DELAY_DEFAULT));
8442 send!(
8443 s,
8444 TcpRepr {
8445 seq_number: REMOTE_SEQ + 1,
8446 ack_number: Some(LOCAL_SEQ + 1),
8447 payload: &[0; DEFAULT_MSS],
8448 ..SEND_TEMPL
8449 }
8450 );
8451
8452 recv_nothing!(s);
8454
8455 send!(
8456 s,
8457 TcpRepr {
8458 seq_number: REMOTE_SEQ + 1 + DEFAULT_MSS,
8459 ack_number: Some(LOCAL_SEQ + 1),
8460 payload: &b"a"[..],
8461 ..SEND_TEMPL
8462 }
8463 );
8464
8465 send!(
8466 s,
8467 TcpRepr {
8468 seq_number: REMOTE_SEQ + 1 + (DEFAULT_MSS + 1),
8469 ack_number: Some(LOCAL_SEQ + 1),
8470 payload: &b"b"[..],
8471 ..SEND_TEMPL
8472 }
8473 );
8474
8475 recv!(
8477 s,
8478 Ok(TcpRepr {
8479 seq_number: LOCAL_SEQ + 1,
8480 ack_number: Some(REMOTE_SEQ + 1 + (DEFAULT_MSS + 2)),
8481 window_len: (DEFAULT_MSS - 2) as u16,
8482 ..RECV_TEMPL
8483 })
8484 );
8485 }
8486
8487 #[test]
8492 fn test_nagle() {
8493 let mut s = socket_established();
8494 s.remote_mss = 6;
8495
8496 s.send_slice(b"abcdef").unwrap();
8497 recv!(
8498 s,
8499 [TcpRepr {
8500 seq_number: LOCAL_SEQ + 1,
8501 ack_number: Some(REMOTE_SEQ + 1),
8502 payload: &b"abcdef"[..],
8503 ..RECV_TEMPL
8504 }]
8505 );
8506
8507 s.send_slice(b"foobar").unwrap();
8509 recv!(
8510 s,
8511 [TcpRepr {
8512 seq_number: LOCAL_SEQ + 1 + 6,
8513 ack_number: Some(REMOTE_SEQ + 1),
8514 payload: &b"foobar"[..],
8515 ..RECV_TEMPL
8516 }]
8517 );
8518
8519 s.send_slice(b"aaabbbccc").unwrap();
8520 recv!(
8522 s,
8523 [TcpRepr {
8524 seq_number: LOCAL_SEQ + 1 + 6 + 6,
8525 ack_number: Some(REMOTE_SEQ + 1),
8526 payload: &b"aaabbb"[..],
8527 ..RECV_TEMPL
8528 }]
8529 );
8530
8531 send!(
8533 s,
8534 TcpRepr {
8535 seq_number: REMOTE_SEQ + 1,
8536 ack_number: Some(LOCAL_SEQ + 1 + 6 + 6 + 6),
8537 ..SEND_TEMPL
8538 }
8539 );
8540
8541 recv!(
8543 s,
8544 [TcpRepr {
8545 seq_number: LOCAL_SEQ + 1 + 6 + 6 + 6,
8546 ack_number: Some(REMOTE_SEQ + 1),
8547 payload: &b"ccc"[..],
8548 ..RECV_TEMPL
8549 }]
8550 );
8551 }
8552
8553 #[test]
8554 fn test_final_packet_in_stream_doesnt_wait_for_nagle() {
8555 let mut s = socket_established();
8556 s.remote_mss = 6;
8557 s.send_slice(b"abcdef0").unwrap();
8558 s.socket.close();
8559
8560 recv!(s, time 0, Ok(TcpRepr {
8561 control: TcpControl::None,
8562 seq_number: LOCAL_SEQ + 1,
8563 ack_number: Some(REMOTE_SEQ + 1),
8564 payload: &b"abcdef"[..],
8565 ..RECV_TEMPL
8566 }), exact);
8567 recv!(s, time 0, Ok(TcpRepr {
8568 control: TcpControl::Fin,
8569 seq_number: LOCAL_SEQ + 1 + 6,
8570 ack_number: Some(REMOTE_SEQ + 1),
8571 payload: &b"0"[..],
8572 ..RECV_TEMPL
8573 }), exact);
8574 }
8575
8576 #[test]
8581 fn test_doesnt_accept_wrong_port() {
8582 let mut s = socket_established();
8583 s.rx_buffer = SocketBuffer::new(vec![0; 6]);
8584 s.assembler = Assembler::new();
8585
8586 let tcp_repr = TcpRepr {
8587 seq_number: REMOTE_SEQ + 1,
8588 ack_number: Some(LOCAL_SEQ + 1),
8589 dst_port: LOCAL_PORT + 1,
8590 ..SEND_TEMPL
8591 };
8592 assert!(!s.socket.accepts(&mut s.cx, &SEND_IP_TEMPL, &tcp_repr));
8593
8594 let tcp_repr = TcpRepr {
8595 seq_number: REMOTE_SEQ + 1,
8596 ack_number: Some(LOCAL_SEQ + 1),
8597 src_port: REMOTE_PORT + 1,
8598 ..SEND_TEMPL
8599 };
8600 assert!(!s.socket.accepts(&mut s.cx, &SEND_IP_TEMPL, &tcp_repr));
8601 }
8602
8603 #[test]
8604 fn test_doesnt_accept_wrong_ip() {
8605 let mut s = socket_established();
8606
8607 let tcp_repr = TcpRepr {
8608 seq_number: REMOTE_SEQ + 1,
8609 ack_number: Some(LOCAL_SEQ + 1),
8610 payload: &b"abcdef"[..],
8611 ..SEND_TEMPL
8612 };
8613
8614 let ip_repr = IpReprIpvX(IpvXRepr {
8615 src_addr: REMOTE_ADDR,
8616 dst_addr: LOCAL_ADDR,
8617 next_header: IpProtocol::Tcp,
8618 payload_len: tcp_repr.buffer_len(),
8619 hop_limit: 64,
8620 });
8621 assert!(s.socket.accepts(&mut s.cx, &ip_repr, &tcp_repr));
8622
8623 let ip_repr_wrong_src = IpReprIpvX(IpvXRepr {
8624 src_addr: OTHER_ADDR,
8625 dst_addr: LOCAL_ADDR,
8626 next_header: IpProtocol::Tcp,
8627 payload_len: tcp_repr.buffer_len(),
8628 hop_limit: 64,
8629 });
8630 assert!(!s.socket.accepts(&mut s.cx, &ip_repr_wrong_src, &tcp_repr));
8631
8632 let ip_repr_wrong_dst = IpReprIpvX(IpvXRepr {
8633 src_addr: REMOTE_ADDR,
8634 dst_addr: OTHER_ADDR,
8635 next_header: IpProtocol::Tcp,
8636 payload_len: tcp_repr.buffer_len(),
8637 hop_limit: 64,
8638 });
8639 assert!(!s.socket.accepts(&mut s.cx, &ip_repr_wrong_dst, &tcp_repr));
8640 }
8641
8642 #[test]
8647 fn test_timer_retransmit() {
8648 const RTO: Duration = Duration::from_millis(100);
8649 let mut r = Timer::new();
8650 assert!(!r.should_retransmit(Instant::from_secs(1)));
8651 r.set_for_retransmit(Instant::from_millis(1000), RTO);
8652 assert!(!r.should_retransmit(Instant::from_millis(1000)));
8653 assert!(!r.should_retransmit(Instant::from_millis(1050)));
8654 assert!(r.should_retransmit(Instant::from_millis(1101)));
8655 r.set_for_retransmit(Instant::from_millis(1101), RTO);
8656 assert!(!r.should_retransmit(Instant::from_millis(1101)));
8657 assert!(!r.should_retransmit(Instant::from_millis(1150)));
8658 assert!(!r.should_retransmit(Instant::from_millis(1200)));
8659 assert!(r.should_retransmit(Instant::from_millis(1301)));
8660 r.set_for_idle(Instant::from_millis(1301), None);
8661 assert!(!r.should_retransmit(Instant::from_millis(1350)));
8662 }
8663
8664 #[test]
8665 fn test_rtt_estimator() {
8666 let mut r = RttEstimator::default();
8667
8668 let rtos = &[
8669 6000, 5000, 4252, 3692, 3272, 2956, 2720, 2540, 2408, 2308, 2232, 2176, 2132, 2100,
8670 2076, 2060, 2048, 2036, 2028, 2024, 2020, 2016, 2012, 2012,
8671 ];
8672
8673 for &rto in rtos {
8674 r.sample(2000);
8675 assert_eq!(r.retransmission_timeout(), Duration::from_millis(rto));
8676 }
8677 }
8678
8679 #[test]
8680 fn test_set_get_congestion_control() {
8681 let mut s = socket_established();
8682
8683 #[cfg(feature = "socket-tcp-reno")]
8684 {
8685 s.set_congestion_control(CongestionControl::Reno);
8686 assert_eq!(s.congestion_control(), CongestionControl::Reno);
8687 }
8688
8689 #[cfg(feature = "socket-tcp-cubic")]
8690 {
8691 s.set_congestion_control(CongestionControl::Cubic);
8692 assert_eq!(s.congestion_control(), CongestionControl::Cubic);
8693 }
8694
8695 s.set_congestion_control(CongestionControl::None);
8696 assert_eq!(s.congestion_control(), CongestionControl::None);
8697 }
8698
8699 #[test]
8704 fn test_tsval_established_connection() {
8705 let mut s = socket_established();
8706 s.set_tsval_generator(Some(|| 1));
8707
8708 assert!(s.timestamp_enabled());
8709
8710 s.send_slice(b"abcdef").unwrap();
8712 recv!(
8713 s,
8714 [TcpRepr {
8715 seq_number: LOCAL_SEQ + 1,
8716 ack_number: Some(REMOTE_SEQ + 1),
8717 payload: &b"abcdef"[..],
8718 timestamp: Some(TcpTimestampRepr::new(1, 0)),
8719 ..RECV_TEMPL
8720 }]
8721 );
8722 assert_eq!(s.tx_buffer.len(), 6);
8723 send!(
8724 s,
8725 TcpRepr {
8726 seq_number: REMOTE_SEQ + 1,
8727 ack_number: Some(LOCAL_SEQ + 1 + 6),
8728 timestamp: Some(TcpTimestampRepr::new(500, 1)),
8729 ..SEND_TEMPL
8730 }
8731 );
8732 assert_eq!(s.tx_buffer.len(), 0);
8733 s.send_slice(b"foobar").unwrap();
8735 recv!(
8736 s,
8737 [TcpRepr {
8738 seq_number: LOCAL_SEQ + 1 + 6,
8739 ack_number: Some(REMOTE_SEQ + 1),
8740 payload: &b"foobar"[..],
8741 timestamp: Some(TcpTimestampRepr::new(1, 500)),
8742 ..RECV_TEMPL
8743 }]
8744 );
8745 send!(
8746 s,
8747 TcpRepr {
8748 seq_number: REMOTE_SEQ + 1,
8749 ack_number: Some(LOCAL_SEQ + 1 + 6 + 6),
8750 ..SEND_TEMPL
8751 }
8752 );
8753 assert_eq!(s.tx_buffer.len(), 0);
8754 }
8755
8756 #[test]
8757 fn test_tsval_disabled_in_remote_client() {
8758 let mut s = socket_listen();
8759 s.set_tsval_generator(Some(|| 1));
8760 assert!(s.timestamp_enabled());
8761 send!(
8762 s,
8763 TcpRepr {
8764 control: TcpControl::Syn,
8765 seq_number: REMOTE_SEQ,
8766 ack_number: None,
8767 ..SEND_TEMPL
8768 }
8769 );
8770 assert_eq!(s.state(), State::SynReceived);
8771 assert_eq!(s.tuple, Some(TUPLE));
8772 assert!(!s.timestamp_enabled());
8773 recv!(
8774 s,
8775 [TcpRepr {
8776 control: TcpControl::Syn,
8777 seq_number: LOCAL_SEQ,
8778 ack_number: Some(REMOTE_SEQ + 1),
8779 max_seg_size: Some(BASE_MSS),
8780 ..RECV_TEMPL
8781 }]
8782 );
8783 send!(
8784 s,
8785 TcpRepr {
8786 seq_number: REMOTE_SEQ + 1,
8787 ack_number: Some(LOCAL_SEQ + 1),
8788 ..SEND_TEMPL
8789 }
8790 );
8791 assert_eq!(s.state(), State::Established);
8792 assert_eq!(s.local_seq_no, LOCAL_SEQ + 1);
8793 assert_eq!(s.remote_seq_no, REMOTE_SEQ + 1);
8794 }
8795
8796 #[test]
8797 fn test_tsval_disabled_in_local_server() {
8798 let mut s = socket_listen();
8799 assert!(!s.timestamp_enabled());
8801 send!(
8802 s,
8803 TcpRepr {
8804 control: TcpControl::Syn,
8805 seq_number: REMOTE_SEQ,
8806 ack_number: None,
8807 timestamp: Some(TcpTimestampRepr::new(500, 0)),
8808 ..SEND_TEMPL
8809 }
8810 );
8811 assert_eq!(s.state(), State::SynReceived);
8812 assert_eq!(s.tuple, Some(TUPLE));
8813 assert!(!s.timestamp_enabled());
8814 recv!(
8815 s,
8816 [TcpRepr {
8817 control: TcpControl::Syn,
8818 seq_number: LOCAL_SEQ,
8819 ack_number: Some(REMOTE_SEQ + 1),
8820 max_seg_size: Some(BASE_MSS),
8821 ..RECV_TEMPL
8822 }]
8823 );
8824 send!(
8825 s,
8826 TcpRepr {
8827 seq_number: REMOTE_SEQ + 1,
8828 ack_number: Some(LOCAL_SEQ + 1),
8829 ..SEND_TEMPL
8830 }
8831 );
8832 assert_eq!(s.state(), State::Established);
8833 assert_eq!(s.local_seq_no, LOCAL_SEQ + 1);
8834 assert_eq!(s.remote_seq_no, REMOTE_SEQ + 1);
8835 }
8836
8837 #[test]
8838 fn test_tsval_disabled_in_remote_server() {
8839 let mut s = socket();
8840 s.set_tsval_generator(Some(|| 1));
8841 assert!(s.timestamp_enabled());
8842 s.local_seq_no = LOCAL_SEQ;
8843 s.socket
8844 .connect(&mut s.cx, REMOTE_END, LOCAL_END.port)
8845 .unwrap();
8846 assert_eq!(s.tuple, Some(TUPLE));
8847 recv!(
8848 s,
8849 [TcpRepr {
8850 control: TcpControl::Syn,
8851 seq_number: LOCAL_SEQ,
8852 ack_number: None,
8853 max_seg_size: Some(BASE_MSS),
8854 window_scale: Some(0),
8855 sack_permitted: true,
8856 timestamp: Some(TcpTimestampRepr::new(1, 0)),
8857 ..RECV_TEMPL
8858 }]
8859 );
8860 send!(
8861 s,
8862 TcpRepr {
8863 control: TcpControl::Syn,
8864 seq_number: REMOTE_SEQ,
8865 ack_number: Some(LOCAL_SEQ + 1),
8866 max_seg_size: Some(BASE_MSS - 80),
8867 window_scale: Some(0),
8868 timestamp: None,
8869 ..SEND_TEMPL
8870 }
8871 );
8872 assert!(!s.timestamp_enabled());
8873 s.send_slice(b"abcdef").unwrap();
8874 recv!(
8875 s,
8876 [TcpRepr {
8877 seq_number: LOCAL_SEQ + 1,
8878 ack_number: Some(REMOTE_SEQ + 1),
8879 payload: &b"abcdef"[..],
8880 timestamp: None,
8881 ..RECV_TEMPL
8882 }]
8883 );
8884 }
8885
8886 #[test]
8887 fn test_tsval_disabled_in_local_client() {
8888 let mut s = socket();
8889 assert!(!s.timestamp_enabled());
8891 s.local_seq_no = LOCAL_SEQ;
8892 s.socket
8893 .connect(&mut s.cx, REMOTE_END, LOCAL_END.port)
8894 .unwrap();
8895 assert_eq!(s.tuple, Some(TUPLE));
8896 recv!(
8897 s,
8898 [TcpRepr {
8899 control: TcpControl::Syn,
8900 seq_number: LOCAL_SEQ,
8901 ack_number: None,
8902 max_seg_size: Some(BASE_MSS),
8903 window_scale: Some(0),
8904 sack_permitted: true,
8905 ..RECV_TEMPL
8906 }]
8907 );
8908 send!(
8909 s,
8910 TcpRepr {
8911 control: TcpControl::Syn,
8912 seq_number: REMOTE_SEQ,
8913 ack_number: Some(LOCAL_SEQ + 1),
8914 max_seg_size: Some(BASE_MSS - 80),
8915 window_scale: Some(0),
8916 timestamp: Some(TcpTimestampRepr::new(500, 0)),
8917 ..SEND_TEMPL
8918 }
8919 );
8920 assert!(!s.timestamp_enabled());
8921 s.send_slice(b"abcdef").unwrap();
8922 recv!(
8923 s,
8924 [TcpRepr {
8925 seq_number: LOCAL_SEQ + 1,
8926 ack_number: Some(REMOTE_SEQ + 1),
8927 payload: &b"abcdef"[..],
8928 timestamp: None,
8929 ..RECV_TEMPL
8930 }]
8931 );
8932 }
8933
8934 #[test]
8939 fn test_established_close_on_src_ip_change() {
8940 let mut s = socket_established();
8941
8942 s.send_slice(b"abc").unwrap();
8944 recv!(
8945 s,
8946 [TcpRepr {
8947 seq_number: LOCAL_SEQ + 1,
8948 ack_number: Some(REMOTE_SEQ + 1),
8949 payload: &b"abc"[..],
8950 ..RECV_TEMPL
8951 }]
8952 );
8953
8954 let mut new_addrs = heapless::Vec::<IpCidr, IFACE_MAX_ADDR_COUNT>::new();
8957 new_addrs.push(IpCidr::new(OTHER_ADDR.into(), 24)).unwrap();
8958 s.cx.set_ip_addrs(new_addrs);
8959
8960 s.send_slice(b"def").unwrap();
8964 recv_nothing!(s);
8965 assert_eq!(s.state, State::Closed);
8966 }
8967}