1use core::fmt::Display;
6#[cfg(feature = "async")]
7use core::task::Waker;
8use core::{fmt, mem};
9
10use crate::phy::PacketMeta;
11#[cfg(feature = "async")]
12use crate::socket::WakerRegistration;
13use crate::socket::{Context, PollAt};
14use crate::storage::{Assembler, RingBuffer};
15use crate::time::{Duration, Instant};
16use crate::wire::{
17 IpAddress, IpEndpoint, IpListenEndpoint, IpProtocol, IpRepr, TCP_HEADER_LEN, TcpControl,
18 TcpRepr, TcpSeqNumber, TcpTimestampGenerator, TcpTimestampRepr,
19};
20
21mod congestion;
22
23macro_rules! tcp_trace {
24 ($($arg:expr),*) => (net_log!(trace, $($arg),*));
25}
26
27#[derive(Debug, PartialEq, Eq, Clone, Copy)]
29#[cfg_attr(feature = "defmt", derive(defmt::Format))]
30pub enum ListenError {
31 InvalidState,
32 Unaddressable,
33}
34
35impl Display for ListenError {
36 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
37 match *self {
38 ListenError::InvalidState => write!(f, "invalid state"),
39 ListenError::Unaddressable => write!(f, "unaddressable destination"),
40 }
41 }
42}
43
44impl core::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
63impl core::error::Error for ConnectError {}
64
65#[derive(Debug, PartialEq, Eq, Clone, Copy)]
67#[cfg_attr(feature = "defmt", derive(defmt::Format))]
68pub enum SendError {
69 InvalidState,
70}
71
72impl Display for SendError {
73 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
74 match *self {
75 SendError::InvalidState => write!(f, "invalid state"),
76 }
77 }
78}
79
80impl core::error::Error for SendError {}
81
82#[derive(Debug, PartialEq, Eq, Clone, Copy)]
84#[cfg_attr(feature = "defmt", derive(defmt::Format))]
85pub enum RecvError {
86 InvalidState,
87 Finished,
88}
89
90impl Display for RecvError {
91 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
92 match *self {
93 RecvError::InvalidState => write!(f, "invalid state"),
94 RecvError::Finished => write!(f, "operation finished"),
95 }
96 }
97}
98
99impl core::error::Error for RecvError {}
100
101pub type SocketBuffer<'a> = RingBuffer<'a, u8>;
103
104#[derive(Debug, PartialEq, Eq, Clone, Copy)]
108#[cfg_attr(feature = "defmt", derive(defmt::Format))]
109pub enum State {
110 Closed,
111 Listen,
112 SynSent,
113 SynReceived,
114 Established,
115 FinWait1,
116 FinWait2,
117 CloseWait,
118 Closing,
119 LastAck,
120 TimeWait,
121}
122
123impl fmt::Display for State {
124 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
125 match *self {
126 State::Closed => write!(f, "CLOSED"),
127 State::Listen => write!(f, "LISTEN"),
128 State::SynSent => write!(f, "SYN-SENT"),
129 State::SynReceived => write!(f, "SYN-RECEIVED"),
130 State::Established => write!(f, "ESTABLISHED"),
131 State::FinWait1 => write!(f, "FIN-WAIT-1"),
132 State::FinWait2 => write!(f, "FIN-WAIT-2"),
133 State::CloseWait => write!(f, "CLOSE-WAIT"),
134 State::Closing => write!(f, "CLOSING"),
135 State::LastAck => write!(f, "LAST-ACK"),
136 State::TimeWait => write!(f, "TIME-WAIT"),
137 }
138 }
139}
140
141const RTTE_INITIAL_RTO: u32 = 1000;
145
146const RTTE_MIN_MARGIN: u32 = 5;
149
150const RTTE_K: u32 = 4;
152
153const RTTE_MIN_RTO: u32 = 1000;
156
157const RTTE_MAX_RTO: u32 = 60_000;
160
161#[derive(Debug, Clone, Copy)]
162#[cfg_attr(feature = "defmt", derive(defmt::Format))]
163struct RttEstimator {
164 have_measurement: bool,
166 srtt: u32,
169 rttvar: u32,
171 rto: u32,
173 timestamp: Option<(Instant, TcpSeqNumber)>,
174 max_seq_sent: Option<TcpSeqNumber>,
175 rto_count: u8,
176}
177
178impl Default for RttEstimator {
179 fn default() -> Self {
180 Self {
181 have_measurement: false,
182 srtt: 0, rttvar: 0, rto: RTTE_INITIAL_RTO,
185 timestamp: None,
186 max_seq_sent: None,
187 rto_count: 0,
188 }
189 }
190}
191
192impl RttEstimator {
193 fn retransmission_timeout(&self) -> Duration {
194 Duration::from_millis(self.rto as _)
195 }
196
197 #[cfg(feature = "socket-tcp-cubic")]
198 fn smoothed_rtt(&self) -> u32 {
199 if self.have_measurement { self.srtt } else { 0 }
200 }
201
202 fn sample(&mut self, new_rtt: u32) {
203 if self.have_measurement {
204 let diff = (self.srtt as i32 - new_rtt as i32).unsigned_abs();
206 self.rttvar = (self.rttvar * 3 + diff).div_ceil(4);
207 self.srtt = (self.srtt * 7 + new_rtt).div_ceil(8);
208 } else {
209 self.have_measurement = true;
211 self.srtt = new_rtt;
212 self.rttvar = new_rtt / 2;
213 }
214
215 let margin = RTTE_MIN_MARGIN.max(self.rttvar * RTTE_K);
217 self.rto = (self.srtt + margin).clamp(RTTE_MIN_RTO, RTTE_MAX_RTO);
218
219 self.rto_count = 0;
220
221 tcp_trace!(
222 "rtte: sample={:?} srtt={:?} rttvar={:?} rto={:?}",
223 new_rtt,
224 self.srtt,
225 self.rttvar,
226 self.rto
227 );
228 }
229
230 fn on_send(&mut self, timestamp: Instant, seq: TcpSeqNumber) {
231 if self
232 .max_seq_sent
233 .map(|max_seq_sent| seq > max_seq_sent)
234 .unwrap_or(true)
235 {
236 self.max_seq_sent = Some(seq);
237 if self.timestamp.is_none() {
238 self.timestamp = Some((timestamp, seq));
239 tcp_trace!("rtte: sampling at seq={:?}", seq);
240 }
241 }
242 }
243
244 fn on_ack(&mut self, timestamp: Instant, seq: TcpSeqNumber) {
245 if let Some((sent_timestamp, sent_seq)) = self.timestamp
246 && seq >= sent_seq
247 {
248 self.sample((timestamp - sent_timestamp).total_millis() as u32);
249 self.timestamp = None;
250 }
251 }
252
253 fn on_rto(&mut self) {
254 self.rto = (self.rto * 2).min(RTTE_MAX_RTO);
258 tcp_trace!("rtte: doubling rto to {:?}", self.rto);
259
260 self.rto_count += 1;
266 if self.rto_count >= 3 {
267 self.rto_count = 0;
268 self.have_measurement = false;
269 tcp_trace!("rtte: too many retransmissions, clearing srtt, rttvar.");
270 }
271 }
272
273 fn on_retransmit(&mut self) {
274 if self.timestamp.is_some() {
275 tcp_trace!("rtte: abort sampling due to retransmit");
276 }
277 self.timestamp = None;
278 }
279}
280
281#[derive(Debug, Clone, Copy, PartialEq)]
282#[cfg_attr(feature = "defmt", derive(defmt::Format))]
283enum Timer {
284 Idle {
285 keep_alive_at: Option<Instant>,
286 },
287 Retransmit {
288 expires_at: Instant,
289 },
290 FastRetransmit,
291 ZeroWindowProbe {
292 expires_at: Instant,
293 delay: Duration,
294 },
295 Close {
296 expires_at: Instant,
297 },
298}
299
300const ACK_DELAY_DEFAULT: Duration = Duration::from_millis(10);
301const CLOSE_DELAY: Duration = Duration::from_millis(10_000);
302
303impl Timer {
304 fn new() -> Timer {
305 Timer::Idle {
306 keep_alive_at: None,
307 }
308 }
309
310 fn should_keep_alive(&self, timestamp: Instant) -> bool {
311 match *self {
312 Timer::Idle {
313 keep_alive_at: Some(keep_alive_at),
314 } if timestamp >= keep_alive_at => true,
315 _ => false,
316 }
317 }
318
319 fn should_retransmit(&self, timestamp: Instant) -> bool {
320 match *self {
321 Timer::Retransmit { expires_at } if timestamp >= expires_at => true,
322 Timer::FastRetransmit => true,
323 _ => false,
324 }
325 }
326
327 fn should_close(&self, timestamp: Instant) -> bool {
328 match *self {
329 Timer::Close { expires_at } if timestamp >= expires_at => true,
330 _ => false,
331 }
332 }
333
334 fn should_zero_window_probe(&self, timestamp: Instant) -> bool {
335 match *self {
336 Timer::ZeroWindowProbe { expires_at, .. } if timestamp >= expires_at => true,
337 _ => false,
338 }
339 }
340
341 fn poll_at(&self) -> PollAt {
342 match *self {
343 Timer::Idle {
344 keep_alive_at: Some(keep_alive_at),
345 } => PollAt::Time(keep_alive_at),
346 Timer::Idle {
347 keep_alive_at: None,
348 } => PollAt::Ingress,
349 Timer::ZeroWindowProbe { expires_at, .. } => PollAt::Time(expires_at),
350 Timer::Retransmit { expires_at, .. } => PollAt::Time(expires_at),
351 Timer::FastRetransmit => PollAt::Now,
352 Timer::Close { expires_at } => PollAt::Time(expires_at),
353 }
354 }
355
356 fn set_for_idle(&mut self, timestamp: Instant, interval: Option<Duration>) {
357 *self = Timer::Idle {
358 keep_alive_at: interval.map(|interval| timestamp + interval),
359 }
360 }
361
362 fn set_keep_alive(&mut self) {
363 if let Timer::Idle { keep_alive_at } = self
364 && keep_alive_at.is_none()
365 {
366 *keep_alive_at = Some(Instant::from_millis(0))
367 }
368 }
369
370 fn rewind_keep_alive(&mut self, timestamp: Instant, interval: Option<Duration>) {
371 if let Timer::Idle { keep_alive_at } = self {
372 *keep_alive_at = interval.map(|interval| timestamp + interval)
373 }
374 }
375
376 fn set_for_retransmit(&mut self, timestamp: Instant, delay: Duration) {
377 match *self {
378 Timer::Idle { .. }
379 | Timer::FastRetransmit
380 | Timer::Retransmit { .. }
381 | Timer::ZeroWindowProbe { .. } => {
382 *self = Timer::Retransmit {
383 expires_at: timestamp + delay,
384 }
385 }
386 Timer::Close { .. } => (),
387 }
388 }
389
390 fn set_for_fast_retransmit(&mut self) {
391 *self = Timer::FastRetransmit
392 }
393
394 fn set_for_close(&mut self, timestamp: Instant) {
395 *self = Timer::Close {
396 expires_at: timestamp + CLOSE_DELAY,
397 }
398 }
399
400 fn set_for_zero_window_probe(&mut self, timestamp: Instant, delay: Duration) {
401 *self = Timer::ZeroWindowProbe {
402 expires_at: timestamp + delay,
403 delay,
404 }
405 }
406
407 fn rewind_zero_window_probe(&mut self, timestamp: Instant) {
408 if let Timer::ZeroWindowProbe { mut delay, .. } = *self {
409 delay = (delay * 2).min(Duration::from_millis(RTTE_MAX_RTO as _));
410 *self = Timer::ZeroWindowProbe {
411 expires_at: timestamp + delay,
412 delay,
413 }
414 }
415 }
416
417 fn is_idle(&self) -> bool {
418 matches!(self, Timer::Idle { .. })
419 }
420
421 fn is_zero_window_probe(&self) -> bool {
422 matches!(self, Timer::ZeroWindowProbe { .. })
423 }
424
425 fn is_retransmit(&self) -> bool {
426 matches!(self, Timer::Retransmit { .. } | Timer::FastRetransmit)
427 }
428}
429
430#[derive(Debug, PartialEq, Eq, Clone, Copy)]
431enum AckDelayTimer {
432 Idle,
433 Waiting(Instant),
434 Immediate,
435}
436
437#[derive(Debug, Copy, Clone, Eq, PartialEq)]
438#[cfg_attr(feature = "defmt", derive(defmt::Format))]
439struct Tuple {
440 local: IpEndpoint,
441 remote: IpEndpoint,
442}
443
444impl Display for Tuple {
445 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
446 write!(f, "{}:{}", self.local, self.remote)
447 }
448}
449
450#[derive(Debug, Copy, Clone, Eq, PartialEq)]
452#[cfg_attr(feature = "defmt", derive(defmt::Format))]
453pub enum CongestionControl {
454 None,
455
456 #[cfg(feature = "socket-tcp-reno")]
457 Reno,
458
459 #[cfg(feature = "socket-tcp-cubic")]
460 Cubic,
461}
462
463#[derive(Debug)]
470pub struct Socket<'a> {
471 state: State,
472 timer: Timer,
473 rtte: RttEstimator,
474 assembler: Assembler,
475 rx_buffer: SocketBuffer<'a>,
476 rx_fin_received: bool,
477 tx_buffer: SocketBuffer<'a>,
478 timeout: Option<Duration>,
480 keep_alive: Option<Duration>,
482 hop_limit: Option<u8>,
484 listen_endpoint: IpListenEndpoint,
487 tuple: Option<Tuple>,
489 local_seq_no: TcpSeqNumber,
492 remote_seq_no: TcpSeqNumber,
495 remote_last_seq: TcpSeqNumber,
498 remote_last_ack: Option<TcpSeqNumber>,
501 remote_last_win: u16,
503 remote_win_shift: u8,
506 remote_win_len: usize,
509 remote_win_scale: Option<u8>,
511 remote_has_sack: bool,
513 remote_mss: usize,
515 remote_last_ts: Option<Instant>,
517 local_rx_last_seq: Option<TcpSeqNumber>,
519 local_rx_last_ack: Option<TcpSeqNumber>,
521 local_rx_dup_acks: u8,
524 pending_fast_retransmit: bool,
526
527 ack_delay: Option<Duration>,
529 ack_delay_timer: AckDelayTimer,
532
533 challenge_ack_timer: Instant,
535
536 nagle: bool,
538
539 congestion_controller: congestion::AnyController,
541
542 tsval_generator: Option<TcpTimestampGenerator>,
544
545 last_remote_tsval: u32,
547
548 #[cfg(feature = "async")]
549 rx_waker: WakerRegistration,
550 #[cfg(feature = "async")]
551 tx_waker: WakerRegistration,
552
553 #[cfg(feature = "socket-tcp-pause-synack")]
555 synack_paused: bool,
556}
557
558const DEFAULT_MSS: usize = 536;
559
560const MIN_REMOTE_MSS: usize = 48;
568
569impl<'a> Socket<'a> {
570 #[allow(unused_comparisons)] pub fn new<T>(rx_buffer: T, tx_buffer: T) -> Socket<'a>
573 where
574 T: Into<SocketBuffer<'a>>,
575 {
576 let (rx_buffer, tx_buffer) = (rx_buffer.into(), tx_buffer.into());
577 let rx_capacity = rx_buffer.capacity();
578
579 #[cfg(not(target_pointer_width = "16"))] if rx_capacity > (1 << 30) {
585 panic!("receiving buffer too large, cannot exceed 1 GiB")
586 }
587 let rx_cap_log2 = mem::size_of::<usize>() * 8 - rx_capacity.leading_zeros() as usize;
588
589 Socket {
590 state: State::Closed,
591 timer: Timer::new(),
592 rtte: RttEstimator::default(),
593 assembler: Assembler::new(),
594 tx_buffer,
595 rx_buffer,
596 rx_fin_received: false,
597 timeout: None,
598 keep_alive: None,
599 hop_limit: None,
600 listen_endpoint: IpListenEndpoint::default(),
601 tuple: None,
602 local_seq_no: TcpSeqNumber::default(),
603 remote_seq_no: TcpSeqNumber::default(),
604 remote_last_seq: TcpSeqNumber::default(),
605 remote_last_ack: None,
606 remote_last_win: 0,
607 remote_win_len: 0,
608 remote_win_shift: rx_cap_log2.saturating_sub(16) as u8,
609 remote_win_scale: None,
610 remote_has_sack: false,
611 remote_mss: DEFAULT_MSS,
612 remote_last_ts: None,
613 local_rx_last_ack: None,
614 local_rx_last_seq: None,
615 local_rx_dup_acks: 0,
616 pending_fast_retransmit: false,
617 ack_delay: Some(ACK_DELAY_DEFAULT),
618 ack_delay_timer: AckDelayTimer::Idle,
619 challenge_ack_timer: Instant::from_secs(0),
620 nagle: true,
621 tsval_generator: None,
622 last_remote_tsval: 0,
623 congestion_controller: congestion::AnyController::new(),
624
625 #[cfg(feature = "async")]
626 rx_waker: WakerRegistration::new(),
627 #[cfg(feature = "async")]
628 tx_waker: WakerRegistration::new(),
629
630 #[cfg(feature = "socket-tcp-pause-synack")]
631 synack_paused: false,
632 }
633 }
634
635 pub fn set_tsval_generator(&mut self, generator: Option<TcpTimestampGenerator>) {
637 self.tsval_generator = generator;
638 }
639
640 pub fn timestamp_enabled(&self) -> bool {
642 self.tsval_generator.is_some()
643 }
644
645 pub fn set_congestion_control(&mut self, congestion_control: CongestionControl) {
666 use congestion::*;
667
668 self.congestion_controller = match congestion_control {
669 CongestionControl::None => AnyController::None(no_control::NoControl),
670
671 #[cfg(feature = "socket-tcp-reno")]
672 CongestionControl::Reno => AnyController::Reno(reno::Reno::new()),
673
674 #[cfg(feature = "socket-tcp-cubic")]
675 CongestionControl::Cubic => AnyController::Cubic(cubic::Cubic::new()),
676 }
677 }
678
679 pub fn congestion_control(&self) -> CongestionControl {
681 use congestion::*;
682
683 match self.congestion_controller {
684 AnyController::None(_) => CongestionControl::None,
685
686 #[cfg(feature = "socket-tcp-reno")]
687 AnyController::Reno(_) => CongestionControl::Reno,
688
689 #[cfg(feature = "socket-tcp-cubic")]
690 AnyController::Cubic(_) => CongestionControl::Cubic,
691 }
692 }
693
694 #[cfg(feature = "async")]
707 pub fn register_recv_waker(&mut self, waker: &Waker) {
708 self.rx_waker.register(waker)
709 }
710
711 #[cfg(feature = "async")]
725 pub fn register_send_waker(&mut self, waker: &Waker) {
726 self.tx_waker.register(waker)
727 }
728
729 pub fn timeout(&self) -> Option<Duration> {
733 self.timeout
734 }
735
736 pub fn ack_delay(&self) -> Option<Duration> {
740 self.ack_delay
741 }
742
743 pub fn nagle_enabled(&self) -> bool {
747 self.nagle
748 }
749
750 #[cfg(feature = "socket-tcp-pause-synack")]
756 pub fn pause_synack(&mut self, pause: bool) {
757 self.synack_paused = pause;
758 }
759
760 #[inline]
764 fn scaled_window(&self) -> u16 {
765 u16::try_from(self.rx_buffer.window() >> self.remote_win_shift).unwrap_or(u16::MAX)
766 }
767
768 #[inline]
777 fn last_scaled_window(&self) -> Option<u16> {
778 let last_ack = self.remote_last_ack?;
779 let next_ack = self.remote_seq_no + self.rx_buffer.len();
780
781 let last_win = (self.remote_last_win as usize) << self.remote_win_shift;
782 let last_win_adjusted = last_ack + last_win - next_ack;
783
784 Some(u16::try_from(last_win_adjusted >> self.remote_win_shift).unwrap_or(u16::MAX))
785 }
786
787 pub fn set_timeout(&mut self, duration: Option<Duration>) {
799 self.timeout = duration
800 }
801
802 pub fn set_ack_delay(&mut self, duration: Option<Duration>) {
806 self.ack_delay = duration
807 }
808
809 pub fn set_nagle_enabled(&mut self, enabled: bool) {
822 self.nagle = enabled
823 }
824
825 pub fn keep_alive(&self) -> Option<Duration> {
829 self.keep_alive
830 }
831
832 pub fn set_keep_alive(&mut self, interval: Option<Duration>) {
845 self.keep_alive = interval;
846 if self.keep_alive.is_some() {
847 self.timer.set_keep_alive();
850 }
851 }
852
853 pub fn hop_limit(&self) -> Option<u8> {
857 self.hop_limit
858 }
859
860 pub fn set_hop_limit(&mut self, hop_limit: Option<u8>) {
872 if let Some(0) = hop_limit {
874 panic!("the time-to-live value of a packet must not be zero")
875 }
876
877 self.hop_limit = hop_limit
878 }
879
880 #[inline]
882 pub fn listen_endpoint(&self) -> IpListenEndpoint {
883 self.listen_endpoint
884 }
885
886 #[inline]
888 pub fn local_endpoint(&self) -> Option<IpEndpoint> {
889 Some(self.tuple?.local)
890 }
891
892 #[inline]
894 pub fn remote_endpoint(&self) -> Option<IpEndpoint> {
895 Some(self.tuple?.remote)
896 }
897
898 #[inline]
900 pub fn state(&self) -> State {
901 self.state
902 }
903
904 fn reset(&mut self) {
905 let rx_cap_log2 =
906 mem::size_of::<usize>() * 8 - self.rx_buffer.capacity().leading_zeros() as usize;
907
908 self.state = State::Closed;
909 self.timer = Timer::new();
910 self.rtte = RttEstimator::default();
911 self.assembler = Assembler::new();
912 self.tx_buffer.clear();
913 self.rx_buffer.clear();
914 self.rx_fin_received = false;
915 self.listen_endpoint = IpListenEndpoint::default();
916 self.tuple = None;
917 self.local_seq_no = TcpSeqNumber::default();
918 self.remote_seq_no = TcpSeqNumber::default();
919 self.remote_last_seq = TcpSeqNumber::default();
920 self.remote_last_ack = None;
921 self.remote_last_win = 0;
922 self.remote_win_len = 0;
923 self.remote_win_scale = None;
924 self.remote_win_shift = rx_cap_log2.saturating_sub(16) as u8;
925 self.remote_mss = DEFAULT_MSS;
926 self.remote_last_ts = None;
927 self.ack_delay_timer = AckDelayTimer::Idle;
928 self.challenge_ack_timer = Instant::from_secs(0);
929
930 #[cfg(feature = "async")]
931 {
932 self.rx_waker.wake();
933 self.tx_waker.wake();
934 }
935 }
936
937 pub fn listen<T>(&mut self, local_endpoint: T) -> Result<(), ListenError>
943 where
944 T: Into<IpListenEndpoint>,
945 {
946 let local_endpoint = local_endpoint.into();
947 if local_endpoint.port == 0 {
948 return Err(ListenError::Unaddressable);
949 }
950
951 if self.is_open() {
952 if matches!(self.state, State::Listen) && self.listen_endpoint == local_endpoint {
961 return Ok(());
962 } else {
963 return Err(ListenError::InvalidState);
964 }
965 }
966
967 self.reset();
968 self.listen_endpoint = local_endpoint;
969 self.tuple = None;
970 self.set_state(State::Listen);
971 Ok(())
972 }
973
974 pub fn connect<T, U>(
1014 &mut self,
1015 cx: &mut Context,
1016 remote_endpoint: T,
1017 local_endpoint: U,
1018 ) -> Result<(), ConnectError>
1019 where
1020 T: Into<IpEndpoint>,
1021 U: Into<IpListenEndpoint>,
1022 {
1023 let remote_endpoint: IpEndpoint = remote_endpoint.into();
1024 let local_endpoint: IpListenEndpoint = local_endpoint.into();
1025
1026 if self.is_open() {
1027 return Err(ConnectError::InvalidState);
1028 }
1029 if remote_endpoint.port == 0 || remote_endpoint.addr.is_unspecified() {
1030 return Err(ConnectError::Unaddressable);
1031 }
1032 if local_endpoint.port == 0 {
1033 return Err(ConnectError::Unaddressable);
1034 }
1035
1036 let local_endpoint = IpEndpoint {
1038 addr: match local_endpoint.addr {
1039 Some(addr) => {
1040 if addr.is_unspecified() {
1041 return Err(ConnectError::Unaddressable);
1042 }
1043 addr
1044 }
1045 None => cx
1046 .get_source_address(&remote_endpoint.addr)
1047 .ok_or(ConnectError::Unaddressable)?,
1048 },
1049 port: local_endpoint.port,
1050 };
1051
1052 if local_endpoint.addr.version() != remote_endpoint.addr.version() {
1053 return Err(ConnectError::Unaddressable);
1054 }
1055
1056 self.reset();
1057 self.tuple = Some(Tuple {
1058 local: local_endpoint,
1059 remote: remote_endpoint,
1060 });
1061 self.set_state(State::SynSent);
1062
1063 let seq = Self::random_seq_no(cx);
1064 self.local_seq_no = seq;
1065 self.remote_last_seq = seq;
1066 Ok(())
1067 }
1068
1069 #[cfg(test)]
1070 fn random_seq_no(_cx: &mut Context) -> TcpSeqNumber {
1071 TcpSeqNumber(10000)
1072 }
1073
1074 #[cfg(not(test))]
1075 fn random_seq_no(cx: &mut Context) -> TcpSeqNumber {
1076 TcpSeqNumber(cx.rand().rand_u32() as i32)
1077 }
1078
1079 pub fn close(&mut self) {
1085 match self.state {
1086 State::Listen => self.set_state(State::Closed),
1088 State::SynSent => self.set_state(State::Closed),
1091 State::SynReceived | State::Established => self.set_state(State::FinWait1),
1094 State::CloseWait => self.set_state(State::LastAck),
1095 State::FinWait1
1099 | State::FinWait2
1100 | State::Closing
1101 | State::TimeWait
1102 | State::LastAck
1103 | State::Closed => (),
1104 }
1105 }
1106
1107 pub fn abort(&mut self) {
1115 self.set_state(State::Closed);
1116 }
1117
1118 #[inline]
1122 pub fn is_listening(&self) -> bool {
1123 match self.state {
1124 State::Listen => true,
1125 _ => false,
1126 }
1127 }
1128
1129 #[inline]
1138 pub fn is_open(&self) -> bool {
1139 match self.state {
1140 State::Closed => false,
1141 State::TimeWait => false,
1142 _ => true,
1143 }
1144 }
1145
1146 #[inline]
1159 pub fn is_active(&self) -> bool {
1160 match self.state {
1161 State::Closed => false,
1162 State::TimeWait => false,
1163 State::Listen => false,
1164 _ => true,
1165 }
1166 }
1167
1168 #[inline]
1178 pub fn may_send(&self) -> bool {
1179 match self.state {
1180 State::Established => true,
1181 State::CloseWait => true,
1184 _ => false,
1185 }
1186 }
1187
1188 #[inline]
1197 pub fn may_recv(&self) -> bool {
1198 match self.state {
1199 State::Established => true,
1200 State::FinWait1 | State::FinWait2 => true,
1203 _ if self.can_recv() => true,
1205 _ => false,
1206 }
1207 }
1208
1209 #[inline]
1212 pub fn can_send(&self) -> bool {
1213 if !self.may_send() {
1214 return false;
1215 }
1216
1217 !self.tx_buffer.is_full()
1218 }
1219
1220 #[inline]
1222 pub fn recv_capacity(&self) -> usize {
1223 self.rx_buffer.capacity()
1224 }
1225
1226 #[inline]
1228 pub fn send_capacity(&self) -> usize {
1229 self.tx_buffer.capacity()
1230 }
1231
1232 #[inline]
1234 pub fn can_recv(&self) -> bool {
1235 !self.rx_buffer.is_empty()
1236 }
1237
1238 fn send_impl<'b, F, R>(&'b mut self, f: F) -> Result<R, SendError>
1239 where
1240 F: FnOnce(&'b mut SocketBuffer<'a>) -> (usize, R),
1241 {
1242 if !self.may_send() {
1243 return Err(SendError::InvalidState);
1244 }
1245
1246 let old_length = self.tx_buffer.len();
1247 let (size, result) = f(&mut self.tx_buffer);
1248 if size > 0 {
1249 if old_length == 0 {
1253 self.remote_last_ts = None
1254 }
1255
1256 if self.remote_win_len == 0 && self.timer.is_idle() {
1259 let delay = self.rtte.retransmission_timeout();
1260 tcp_trace!("starting zero-window-probe timer for t+{}", delay);
1261
1262 self.timer.set_for_zero_window_probe(Instant::ZERO, delay);
1265 }
1266
1267 #[cfg(any(test, feature = "verbose"))]
1268 tcp_trace!(
1269 "tx buffer: enqueueing {} octets (now {})",
1270 size,
1271 old_length + size
1272 );
1273 }
1274 Ok(result)
1275 }
1276
1277 pub fn send<'b, F, R>(&'b mut self, f: F) -> Result<R, SendError>
1283 where
1284 F: FnOnce(&'b mut [u8]) -> (usize, R),
1285 {
1286 self.send_impl(|tx_buffer| tx_buffer.enqueue_many_with(f))
1287 }
1288
1289 pub fn send_slice(&mut self, data: &[u8]) -> Result<usize, SendError> {
1296 self.send_impl(|tx_buffer| {
1297 let size = tx_buffer.enqueue_slice(data);
1298 (size, size)
1299 })
1300 }
1301
1302 fn recv_error_check(&mut self) -> Result<(), RecvError> {
1303 if !self.may_recv() {
1307 if self.rx_fin_received {
1308 return Err(RecvError::Finished);
1309 }
1310 return Err(RecvError::InvalidState);
1311 }
1312
1313 Ok(())
1314 }
1315
1316 fn recv_impl<'b, F, R>(&'b mut self, f: F) -> Result<R, RecvError>
1317 where
1318 F: FnOnce(&'b mut SocketBuffer<'a>) -> (usize, R),
1319 {
1320 self.recv_error_check()?;
1321
1322 let _old_length = self.rx_buffer.len();
1323 let (size, result) = f(&mut self.rx_buffer);
1324 self.remote_seq_no += size;
1325 if size > 0 {
1326 #[cfg(any(test, feature = "verbose"))]
1327 tcp_trace!(
1328 "rx buffer: dequeueing {} octets (now {})",
1329 size,
1330 _old_length - size
1331 );
1332 }
1333 Ok(result)
1334 }
1335
1336 pub fn recv<'b, F, R>(&'b mut self, f: F) -> Result<R, RecvError>
1347 where
1348 F: FnOnce(&'b mut [u8]) -> (usize, R),
1349 {
1350 self.recv_impl(|rx_buffer| rx_buffer.dequeue_many_with(f))
1351 }
1352
1353 pub fn recv_slice(&mut self, data: &mut [u8]) -> Result<usize, RecvError> {
1360 self.recv_impl(|rx_buffer| {
1361 let size = rx_buffer.dequeue_slice(data);
1362 (size, size)
1363 })
1364 }
1365
1366 pub fn peek(&mut self, size: usize) -> Result<&[u8], RecvError> {
1371 self.recv_error_check()?;
1372
1373 let buffer = self.rx_buffer.get_allocated(0, size);
1374 if !buffer.is_empty() {
1375 #[cfg(any(test, feature = "verbose"))]
1376 tcp_trace!("rx buffer: peeking at {} octets", buffer.len());
1377 }
1378 Ok(buffer)
1379 }
1380
1381 pub fn peek_slice(&mut self, data: &mut [u8]) -> Result<usize, RecvError> {
1386 Ok(self.rx_buffer.read_allocated(0, data))
1387 }
1388
1389 pub fn send_queue(&self) -> usize {
1393 self.tx_buffer.len()
1394 }
1395
1396 fn flight_size(&self) -> usize {
1398 self.remote_last_seq - self.local_seq_no
1399 }
1400
1401 fn cwnd_remaining(&self) -> usize {
1402 self.congestion_controller
1403 .inner()
1404 .window()
1405 .saturating_sub(self.flight_size())
1406 }
1407
1408 pub fn recv_queue(&self) -> usize {
1414 self.rx_buffer.len()
1415 }
1416
1417 fn set_state(&mut self, state: State) {
1418 if self.state != state {
1419 tcp_trace!("state={}=>{}", self.state, state);
1420 }
1421
1422 self.state = state;
1423
1424 #[cfg(feature = "async")]
1425 {
1426 self.rx_waker.wake();
1430 self.tx_waker.wake();
1431 }
1432 }
1433
1434 pub(crate) fn reply(ip_repr: &IpRepr, repr: &TcpRepr) -> (IpRepr, TcpRepr<'static>) {
1435 let reply_repr = TcpRepr {
1436 src_port: repr.dst_port,
1437 dst_port: repr.src_port,
1438 control: TcpControl::None,
1439 seq_number: TcpSeqNumber(0),
1440 ack_number: None,
1441 window_len: 0,
1442 window_scale: None,
1443 max_seg_size: None,
1444 sack_permitted: false,
1445 sack_ranges: [None, None, None],
1446 timestamp: None,
1447 payload: &[],
1448 };
1449 let ip_reply_repr = IpRepr::new(
1450 ip_repr.dst_addr(),
1451 ip_repr.src_addr(),
1452 IpProtocol::Tcp,
1453 reply_repr.buffer_len(),
1454 64,
1455 );
1456 (ip_reply_repr, reply_repr)
1457 }
1458
1459 pub(crate) fn rst_reply(ip_repr: &IpRepr, repr: &TcpRepr) -> (IpRepr, TcpRepr<'static>) {
1460 debug_assert!(repr.control != TcpControl::Rst);
1461
1462 let (ip_reply_repr, mut reply_repr) = Self::reply(ip_repr, repr);
1463
1464 reply_repr.control = TcpControl::Rst;
1467 reply_repr.seq_number = repr.ack_number.unwrap_or_default();
1468 if repr.control == TcpControl::Syn && repr.ack_number.is_none() {
1469 reply_repr.ack_number = Some(repr.seq_number + repr.segment_len());
1470 }
1471
1472 (ip_reply_repr, reply_repr)
1473 }
1474
1475 fn ack_reply(&mut self, ip_repr: &IpRepr, repr: &TcpRepr) -> (IpRepr, TcpRepr<'static>) {
1476 let (mut ip_reply_repr, mut reply_repr) = Self::reply(ip_repr, repr);
1477 reply_repr.timestamp = repr
1478 .timestamp
1479 .and_then(|tcp_ts| tcp_ts.generate_reply(self.tsval_generator));
1480
1481 reply_repr.seq_number = self.remote_last_seq;
1486 reply_repr.ack_number = Some(self.remote_seq_no + self.rx_buffer.len());
1487 self.remote_last_ack = reply_repr.ack_number;
1488
1489 reply_repr.window_len = self.scaled_window();
1493 self.remote_last_win = reply_repr.window_len;
1494
1495 if self.remote_has_sack {
1498 net_debug!("sending sACK option with current assembler ranges");
1499
1500 reply_repr.sack_ranges[0] = None;
1505
1506 let ack = reply_repr.ack_number.unwrap_or(TcpSeqNumber(0));
1507
1508 if let Some(last_seg_seq) = self.local_rx_last_seq {
1509 reply_repr.sack_ranges[0] = self
1510 .assembler
1511 .iter_data()
1512 .map(|(left, right)| (ack + left, ack + right))
1513 .find(|&(left, right)| left <= last_seg_seq && right >= last_seg_seq)
1514 .map(|(left, right)| (left.0 as u32, right.0 as u32));
1515 }
1516
1517 if reply_repr.sack_ranges[0].is_none() {
1518 reply_repr.sack_ranges[0] = self
1526 .assembler
1527 .iter_data()
1528 .map(|(left, right)| (ack + left, ack + right))
1529 .next()
1530 .map(|(left, right)| (left.0 as u32, right.0 as u32));
1531 }
1532 }
1533
1534 ip_reply_repr.set_payload_len(reply_repr.buffer_len());
1536 (ip_reply_repr, reply_repr)
1537 }
1538
1539 fn challenge_ack_reply(
1540 &mut self,
1541 cx: &mut Context,
1542 ip_repr: &IpRepr,
1543 repr: &TcpRepr,
1544 ) -> Option<(IpRepr, TcpRepr<'static>)> {
1545 if cx.now() < self.challenge_ack_timer {
1546 return None;
1547 }
1548
1549 self.challenge_ack_timer = cx.now() + Duration::from_secs(1);
1551
1552 Some(self.ack_reply(ip_repr, repr))
1553 }
1554
1555 pub(crate) fn accepts(&self, _cx: &mut Context, ip_repr: &IpRepr, repr: &TcpRepr) -> bool {
1556 if self.state == State::Closed {
1557 return false;
1558 }
1559
1560 if self.state == State::Listen
1564 && (repr.ack_number.is_some() || repr.control == TcpControl::Rst)
1565 {
1566 return false;
1567 }
1568
1569 if let Some(tuple) = &self.tuple {
1570 ip_repr.dst_addr() == tuple.local.addr
1572 && repr.dst_port == tuple.local.port
1573 && ip_repr.src_addr() == tuple.remote.addr
1574 && repr.src_port == tuple.remote.port
1575 } else {
1576 let addr_ok = match self.listen_endpoint.addr {
1578 Some(addr) => ip_repr.dst_addr() == addr,
1579 None => true,
1580 };
1581 addr_ok && repr.dst_port != 0 && repr.dst_port == self.listen_endpoint.port
1582 }
1583 }
1584
1585 pub(crate) fn process(
1586 &mut self,
1587 cx: &mut Context,
1588 ip_repr: &IpRepr,
1589 repr: &TcpRepr,
1590 ) -> Option<(IpRepr, TcpRepr<'static>)> {
1591 debug_assert!(self.accepts(cx, ip_repr, repr));
1592
1593 let (sent_syn, sent_fin) = match self.state {
1595 State::SynSent | State::SynReceived => (true, false),
1597 State::FinWait1 | State::LastAck | State::Closing => (false, true),
1599 _ => (false, false),
1602 };
1603 let control_len = (sent_syn as usize) + (sent_fin as usize);
1604
1605 match (self.state, repr.control, repr.ack_number) {
1607 (State::SynSent, TcpControl::Rst, None) => {
1610 net_debug!("unacceptable RST (expecting RST|ACK) in response to initial SYN");
1611 return None;
1612 }
1613 (State::SynSent, TcpControl::Rst, Some(ack_number)) => {
1614 if ack_number != self.local_seq_no + 1 {
1615 net_debug!("unacceptable RST|ACK in response to initial SYN");
1616 return None;
1617 }
1618 }
1619 (_, TcpControl::Rst, _) => (),
1621 (State::Listen, _, None) => (),
1623 (State::Listen, _, Some(_)) => unreachable!(),
1625 (State::SynSent, TcpControl::Syn, Some(ack_number)) => {
1627 if ack_number != self.local_seq_no + 1 {
1628 net_debug!("unacceptable SYN|ACK in response to initial SYN");
1629 return Some(Self::rst_reply(ip_repr, repr));
1630 }
1631 }
1632 (State::SynSent, TcpControl::Syn, None) => (),
1636 (State::SynSent, TcpControl::None, Some(ack_number)) => {
1638 if ack_number == self.local_seq_no + 1 {
1643 net_debug!(
1644 "expecting a SYN|ACK, received an ACK with the right ack_number, ignoring."
1645 );
1646 return None;
1647 }
1648
1649 net_debug!(
1650 "expecting a SYN|ACK, received an ACK with the wrong ack_number, sending RST."
1651 );
1652 return Some(Self::rst_reply(ip_repr, repr));
1653 }
1654 (State::SynSent, _, _) => {
1656 net_debug!("expecting a SYN|ACK");
1657 return None;
1658 }
1659 (_, _, None) => {
1661 net_debug!("expecting an ACK");
1662 return None;
1663 }
1664 (State::SynReceived, _, Some(ack_number)) => {
1666 if ack_number != self.local_seq_no + 1 {
1667 net_debug!("unacceptable ACK in response to SYN|ACK");
1668 return Some(Self::rst_reply(ip_repr, repr));
1669 }
1670 }
1671 (_, _, Some(ack_number)) => {
1673 let unacknowledged = self.tx_buffer.len() + control_len;
1674
1675 let mut ack_min = self.local_seq_no;
1677 let ack_max = self.local_seq_no + unacknowledged;
1678
1679 if sent_syn {
1681 ack_min += 1;
1682 }
1683
1684 if ack_number < ack_min {
1685 net_debug!(
1686 "duplicate ACK ({} not in {}...{})",
1687 ack_number,
1688 ack_min,
1689 ack_max
1690 );
1691 return None;
1692 }
1693
1694 if ack_number > ack_max {
1695 net_debug!(
1696 "unacceptable ACK ({} not in {}...{})",
1697 ack_number,
1698 ack_min,
1699 ack_max
1700 );
1701 return self.challenge_ack_reply(cx, ip_repr, repr);
1702 }
1703 }
1704 }
1705
1706 let window_start = self.remote_seq_no + self.rx_buffer.len();
1707 let window_end = if let Some(last_ack) = self.remote_last_ack {
1708 last_ack + ((self.remote_last_win as usize) << self.remote_win_shift)
1709 } else {
1710 window_start
1711 };
1712 let segment_start = repr.seq_number;
1713 let segment_end = repr.seq_number + repr.payload.len();
1714
1715 let (payload, payload_offset) = match self.state {
1716 State::Listen | State::SynSent => (&[][..], 0),
1718 _ => {
1719 let segment_in_window = match (
1721 segment_start == segment_end,
1722 window_start == window_end,
1723 ) {
1724 (true, _) if segment_end == window_start - 1 => {
1725 net_debug!(
1726 "received a keep-alive or window probe packet, will send an ACK"
1727 );
1728 false
1729 }
1730 (true, true) => {
1731 if window_start == segment_start {
1732 true
1733 } else {
1734 net_debug!(
1735 "zero-length segment not inside zero-length window, will send an ACK."
1736 );
1737 false
1738 }
1739 }
1740 (true, false) => {
1741 if window_start <= segment_start && segment_start < window_end {
1742 true
1743 } else {
1744 net_debug!("zero-length segment not inside window, will send an ACK.");
1745 false
1746 }
1747 }
1748 (false, true) => {
1749 net_debug!(
1750 "non-zero-length segment with zero receive window, will only send an ACK"
1751 );
1752 false
1753 }
1754 (false, false) => {
1755 if (window_start <= segment_start && segment_start < window_end)
1756 || (window_start < segment_end && segment_end <= window_end)
1757 {
1758 true
1759 } else {
1760 net_debug!(
1761 "segment not in receive window ({}..{} not intersecting {}..{}), will send challenge ACK",
1762 segment_start,
1763 segment_end,
1764 window_start,
1765 window_end
1766 );
1767 false
1768 }
1769 }
1770 };
1771
1772 if segment_in_window {
1773 let overlap_start = window_start.max(segment_start);
1774 let overlap_end = window_end.min(segment_end);
1775
1776 debug_assert!(overlap_start <= overlap_end);
1778
1779 self.local_rx_last_seq = Some(repr.seq_number);
1780
1781 (
1782 &repr.payload[overlap_start - segment_start..overlap_end - segment_start],
1783 overlap_start - window_start,
1784 )
1785 } else {
1786 if repr.control == TcpControl::Rst {
1791 net_debug!("dropping out-of-window RST");
1792 return None;
1793 }
1794
1795 if self.state == State::TimeWait {
1798 self.timer.set_for_close(cx.now());
1799 }
1800
1801 if !repr.payload.is_empty()
1822 && matches!(
1823 repr.control,
1824 TcpControl::None | TcpControl::Psh | TcpControl::Fin
1825 )
1826 {
1827 return Some(self.ack_reply(ip_repr, repr));
1828 }
1829
1830 return self.challenge_ack_reply(cx, ip_repr, repr);
1831 }
1832 }
1833 };
1834
1835 let mut ack_len = 0;
1838 let mut ack_of_fin = false;
1839 let mut ack_all = false;
1840 if repr.control != TcpControl::Rst
1841 && let Some(ack_number) = repr.ack_number
1842 {
1843 let tx_buffer_start_seq = self.local_seq_no + (sent_syn as usize);
1847
1848 if ack_number >= tx_buffer_start_seq {
1849 ack_len = ack_number - tx_buffer_start_seq;
1850
1851 if sent_fin && self.tx_buffer.len() + 1 == ack_len {
1854 ack_len -= 1;
1855 tcp_trace!("received ACK of FIN");
1856 ack_of_fin = true;
1857 }
1858
1859 ack_all = self.remote_last_seq <= ack_number;
1860 }
1861 }
1862
1863 let mut control = repr.control;
1865 control = control.quash_psh();
1866
1867 if control == TcpControl::Fin && window_start < segment_start {
1870 tcp_trace!(
1871 "ignoring FIN because we don't have full data yet. window_start={} segment_start={}",
1872 window_start,
1873 segment_start
1874 );
1875 control = TcpControl::None;
1876 }
1877
1878 match (self.state, control) {
1880 (State::Listen, TcpControl::Rst) => return None,
1882
1883 (State::SynReceived, TcpControl::Rst) if self.listen_endpoint.port != 0 => {
1888 tcp_trace!("received RST");
1889 self.tuple = None;
1890 self.set_state(State::Listen);
1891 return None;
1892 }
1893
1894 (_, TcpControl::Rst) => {
1896 tcp_trace!("received RST");
1897 self.set_state(State::Closed);
1898 self.tuple = None;
1899 return None;
1900 }
1901
1902 (State::Listen, TcpControl::Syn) => {
1904 tcp_trace!("received SYN");
1905 if let Some(max_seg_size) = repr.max_seg_size {
1906 if max_seg_size != 0 {
1908 self.remote_mss = (max_seg_size as usize).max(MIN_REMOTE_MSS);
1909 self.congestion_controller
1910 .inner_mut()
1911 .set_mss(self.remote_mss);
1912 }
1913 }
1914
1915 self.tuple = Some(Tuple {
1916 local: IpEndpoint::new(ip_repr.dst_addr(), repr.dst_port),
1917 remote: IpEndpoint::new(ip_repr.src_addr(), repr.src_port),
1918 });
1919 self.local_seq_no = Self::random_seq_no(cx);
1920 self.remote_seq_no = repr.seq_number + 1;
1921 self.remote_last_seq = self.local_seq_no;
1922 self.remote_has_sack = repr.sack_permitted;
1923 self.remote_win_scale = repr.window_scale;
1924 if self.remote_win_scale.is_none() {
1926 self.remote_win_shift = 0;
1927 }
1928 if repr.timestamp.is_none() {
1930 self.tsval_generator = None;
1931 }
1932 self.set_state(State::SynReceived);
1933 self.timer.set_for_idle(cx.now(), self.keep_alive);
1934 }
1935
1936 (State::SynReceived, TcpControl::None) => {
1938 self.set_state(State::Established);
1939 }
1940
1941 (State::SynReceived, TcpControl::Fin) => {
1945 self.remote_seq_no += 1;
1946 self.rx_fin_received = true;
1947 self.set_state(State::CloseWait);
1948 }
1949
1950 (State::SynSent, TcpControl::Syn) => {
1953 if repr.ack_number.is_some() {
1954 tcp_trace!("received SYN|ACK");
1955 } else {
1956 tcp_trace!("received SYN");
1957 }
1958 if let Some(max_seg_size) = repr.max_seg_size {
1959 if max_seg_size != 0 {
1961 self.remote_mss = (max_seg_size as usize).max(MIN_REMOTE_MSS);
1962 self.congestion_controller
1963 .inner_mut()
1964 .set_mss(self.remote_mss);
1965 }
1966 }
1967
1968 self.remote_seq_no = repr.seq_number + 1;
1969 self.remote_last_seq = self.local_seq_no + 1;
1970 self.remote_last_ack = Some(repr.seq_number);
1971 self.remote_has_sack = repr.sack_permitted;
1972 self.remote_win_scale = repr.window_scale;
1973 if self.remote_win_scale.is_none() {
1975 self.remote_win_shift = 0;
1976 }
1977 if repr.timestamp.is_none() {
1979 self.tsval_generator = None;
1980 }
1981
1982 if repr.ack_number.is_some() {
1983 self.set_state(State::Established);
1984 } else {
1985 self.set_state(State::SynReceived);
1986 }
1987 }
1988
1989 (State::Established, TcpControl::None) => {}
1990
1991 (State::Established, TcpControl::Fin) => {
1993 self.remote_seq_no += 1;
1994 self.rx_fin_received = true;
1995 self.set_state(State::CloseWait);
1996 }
1997
1998 (State::FinWait1, TcpControl::None) => {
2001 if ack_of_fin {
2002 self.set_state(State::FinWait2);
2003 }
2004 }
2005
2006 (State::FinWait1, TcpControl::Fin) => {
2009 self.remote_seq_no += 1;
2010 self.rx_fin_received = true;
2011 if ack_of_fin {
2012 self.set_state(State::TimeWait);
2013 self.timer.set_for_close(cx.now());
2014 } else {
2015 self.set_state(State::Closing);
2016 }
2017 }
2018
2019 (State::FinWait2, TcpControl::None) => {}
2020
2021 (State::FinWait2, TcpControl::Fin) => {
2023 self.remote_seq_no += 1;
2024 self.rx_fin_received = true;
2025 self.set_state(State::TimeWait);
2026 self.timer.set_for_close(cx.now());
2027 }
2028
2029 (State::Closing, TcpControl::None) => {
2031 if ack_of_fin {
2032 self.set_state(State::TimeWait);
2033 self.timer.set_for_close(cx.now());
2034 }
2035 }
2036
2037 (State::CloseWait, TcpControl::None) => {}
2038
2039 (State::LastAck, TcpControl::None) => {
2041 if ack_of_fin {
2042 self.set_state(State::Closed);
2044 self.tuple = None;
2045 } else if ack_len == 0 {
2046 return self.challenge_ack_reply(cx, ip_repr, repr);
2049 }
2050 }
2052
2053 _ => {
2054 net_debug!("unexpected packet {}", repr);
2055 return None;
2056 }
2057 }
2058
2059 self.remote_last_ts = Some(cx.now());
2061
2062 let scale = match repr.control {
2065 TcpControl::Syn => 0,
2066 _ => self.remote_win_scale.unwrap_or(0),
2067 };
2068 let new_remote_win_len = (repr.window_len as usize) << (scale as usize);
2069 let is_window_update = new_remote_win_len != self.remote_win_len;
2070 self.remote_win_len = new_remote_win_len;
2071
2072 self.congestion_controller
2073 .inner_mut()
2074 .set_remote_window(new_remote_win_len);
2075
2076 if ack_len > 0 {
2077 debug_assert!(self.tx_buffer.len() >= ack_len);
2079 tcp_trace!(
2080 "tx buffer: dequeueing {} octets (now {})",
2081 ack_len,
2082 self.tx_buffer.len() - ack_len
2083 );
2084 self.tx_buffer.dequeue_allocated(ack_len);
2085
2086 #[cfg(feature = "async")]
2088 self.tx_waker.wake();
2089 }
2090
2091 if let Some(ack_number) = repr.ack_number {
2092 match self.local_rx_last_ack {
2096 Some(last_rx_ack)
2100 if repr.payload.is_empty()
2101 && last_rx_ack == ack_number
2102 && ack_number < self.remote_last_seq
2103 && !is_window_update =>
2104 {
2105 self.local_rx_dup_acks = self.local_rx_dup_acks.saturating_add(1);
2107
2108 net_debug!(
2109 "received duplicate ACK for seq {} (duplicate nr {}{})",
2110 ack_number,
2111 self.local_rx_dup_acks,
2112 if self.local_rx_dup_acks == u8::MAX {
2113 "+"
2114 } else {
2115 ""
2116 }
2117 );
2118
2119 if self.local_rx_dup_acks == 3 {
2120 self.timer.set_for_fast_retransmit();
2121 net_debug!("started fast retransmit");
2122 }
2123
2124 let in_flight = self.flight_size();
2126 self.congestion_controller.inner_mut().on_dup_ack(
2127 cx.now(),
2128 self.remote_mss,
2129 in_flight,
2130 );
2131 }
2132
2133 _ => {
2136 if self.local_rx_dup_acks > 0 {
2137 self.local_rx_dup_acks = 0;
2138 net_debug!("reset duplicate ACK count");
2139 }
2140 self.local_rx_last_ack = Some(ack_number);
2141
2142 self.rtte.on_ack(cx.now(), ack_number);
2144 let new_flight_size = self.flight_size().saturating_sub(ack_len);
2145 self.congestion_controller.inner_mut().on_ack(
2146 cx.now(),
2147 ack_len,
2148 new_flight_size,
2149 &self.rtte,
2150 );
2151 }
2152 };
2153
2154 self.local_seq_no = ack_number;
2157
2158 if self.remote_last_seq < self.local_seq_no {
2164 self.remote_last_seq = self.local_seq_no
2165 }
2166 }
2167
2168 if let Some(timestamp) = repr.timestamp {
2170 self.last_remote_tsval = timestamp.tsval;
2171 }
2172
2173 match self.timer {
2175 Timer::Retransmit { .. } | Timer::FastRetransmit => {
2176 if ack_all {
2177 self.timer.set_for_idle(cx.now(), self.keep_alive);
2179 } else if ack_len > 0 {
2180 let rto = self.rtte.retransmission_timeout();
2182 self.timer.set_for_retransmit(cx.now(), rto);
2183 }
2184 }
2185 Timer::Idle { .. } => {
2186 self.timer.set_for_idle(cx.now(), self.keep_alive);
2188 }
2189 _ => {}
2190 }
2191
2192 if self.remote_win_len == 0
2194 && !self.tx_buffer.is_empty()
2195 && (self.timer.is_idle() || ack_len > 0)
2196 {
2197 let delay = self.rtte.retransmission_timeout();
2198 tcp_trace!("starting zero-window-probe timer for t+{}", delay);
2199 self.timer.set_for_zero_window_probe(cx.now(), delay);
2200 }
2201 if self.remote_win_len != 0 && self.timer.is_zero_window_probe() {
2202 tcp_trace!("stopping zero-window-probe timer");
2203 self.timer.set_for_idle(cx.now(), self.keep_alive);
2204 }
2205
2206 let payload_len = payload.len();
2207 if payload_len == 0 {
2208 return None;
2209 }
2210
2211 let assembler_was_empty = self.assembler.is_empty();
2212
2213 let Ok(contig_len) = self
2215 .assembler
2216 .add_then_remove_front(payload_offset, payload_len)
2217 else {
2218 net_debug!(
2219 "assembler: too many holes to add {} octets at offset {}",
2220 payload_len,
2221 payload_offset
2222 );
2223 return None;
2224 };
2225
2226 tcp_trace!(
2228 "rx buffer: receiving {} octets at offset {}",
2229 payload_len,
2230 payload_offset
2231 );
2232 let len_written = self.rx_buffer.write_unallocated(payload_offset, payload);
2233 debug_assert!(len_written == payload_len);
2234
2235 if contig_len != 0 {
2236 tcp_trace!(
2238 "rx buffer: enqueueing {} octets (now {})",
2239 contig_len,
2240 self.rx_buffer.len() + contig_len
2241 );
2242 self.rx_buffer.enqueue_unallocated(contig_len);
2243
2244 #[cfg(feature = "async")]
2246 self.rx_waker.wake();
2247 }
2248
2249 if !self.assembler.is_empty() {
2250 tcp_trace!("assembler: {}", self.assembler);
2252 }
2253
2254 if let Some(ack_delay) = self.ack_delay
2256 && self.ack_to_transmit()
2257 {
2258 self.ack_delay_timer = match self.ack_delay_timer {
2259 AckDelayTimer::Idle => {
2260 tcp_trace!("starting delayed ack timer");
2261 AckDelayTimer::Waiting(cx.now() + ack_delay)
2262 }
2263 AckDelayTimer::Waiting(_) if self.immediate_ack_to_transmit() => {
2264 tcp_trace!("delayed ack timer already started, forcing expiry");
2265 AckDelayTimer::Immediate
2266 }
2267 timer @ AckDelayTimer::Waiting(_) => {
2268 tcp_trace!("waiting until delayed ack timer expires");
2269 timer
2270 }
2271 AckDelayTimer::Immediate => {
2272 tcp_trace!("delayed ack timer already force-expired");
2273 AckDelayTimer::Immediate
2274 }
2275 };
2276 }
2277
2278 if !self.assembler.is_empty() || !assembler_was_empty {
2282 tcp_trace!("ACKing incoming segment");
2286 Some(self.ack_reply(ip_repr, repr))
2287 } else {
2288 None
2289 }
2290 }
2291
2292 fn timed_out(&self, timestamp: Instant) -> bool {
2293 match (self.remote_last_ts, self.timeout) {
2294 (Some(remote_last_ts), Some(timeout)) => timestamp >= remote_last_ts + timeout,
2295 (_, _) => false,
2296 }
2297 }
2298
2299 fn seq_to_transmit(&self, cx: &mut Context) -> bool {
2300 if self.pending_fast_retransmit && !self.tx_buffer.is_empty() {
2302 return true;
2303 }
2304
2305 let ip_header_len = match self.tuple.unwrap().local.addr {
2306 #[cfg(feature = "proto-ipv4")]
2307 IpAddress::Ipv4(_) => crate::wire::IPV4_HEADER_LEN,
2308 #[cfg(feature = "proto-ipv6")]
2309 IpAddress::Ipv6(_) => crate::wire::IPV6_HEADER_LEN,
2310 };
2311
2312 let options_len = if self.tsval_generator.is_some() {
2314 12
2315 } else {
2316 0
2317 };
2318
2319 let local_mss = cx.ip_mtu() - ip_header_len - TCP_HEADER_LEN;
2320 let effective_mss = local_mss.min(self.remote_mss).saturating_sub(options_len);
2321
2322 let data_in_flight = self.remote_last_seq != self.local_seq_no;
2324
2325 if matches!(self.state, State::SynSent | State::SynReceived) && !data_in_flight {
2327 return true;
2328 }
2329
2330 let max_send_seq =
2332 self.local_seq_no + core::cmp::min(self.remote_win_len, self.tx_buffer.len());
2333
2334 let capped_send_seq = if max_send_seq >= self.remote_last_seq {
2336 max_send_seq - self.remote_last_seq
2337 } else {
2338 0
2339 };
2340
2341 let max_send = capped_send_seq.min(self.cwnd_remaining());
2343
2344 let mut can_send = max_send != 0;
2346 let can_send_full = max_send >= effective_mss;
2348
2349 let want_fin = match self.state {
2351 State::FinWait1 => true,
2352 State::Closing => true,
2353 State::LastAck => true,
2354 _ => false,
2355 };
2356
2357 if self.nagle && data_in_flight && !can_send_full && !want_fin {
2363 can_send = false;
2364 }
2365
2366 let can_fin = want_fin && self.remote_last_seq == self.local_seq_no + self.tx_buffer.len();
2371
2372 can_send || can_fin
2373 }
2374
2375 fn delayed_ack_expired(&self, timestamp: Instant) -> bool {
2376 match self.ack_delay_timer {
2377 AckDelayTimer::Idle => true,
2378 AckDelayTimer::Waiting(t) => t <= timestamp,
2379 AckDelayTimer::Immediate => true,
2380 }
2381 }
2382
2383 fn ack_to_transmit(&self) -> bool {
2384 if let Some(remote_last_ack) = self.remote_last_ack {
2385 remote_last_ack < self.remote_seq_no + self.rx_buffer.len()
2386 } else {
2387 false
2388 }
2389 }
2390
2391 fn immediate_ack_to_transmit(&self) -> bool {
2402 if let Some(remote_last_ack) = self.remote_last_ack {
2403 remote_last_ack + self.remote_mss < self.remote_seq_no + self.rx_buffer.len()
2404 } else {
2405 false
2406 }
2407 }
2408
2409 fn window_to_update(&self) -> bool {
2416 match self.state {
2417 State::SynSent
2418 | State::SynReceived
2419 | State::Established
2420 | State::FinWait1
2421 | State::FinWait2 => {
2422 let new_win = self.scaled_window();
2423 if let Some(last_win) = self.last_scaled_window() {
2424 new_win > 0 && new_win / 2 >= last_win
2425 } else {
2426 false
2427 }
2428 }
2429 _ => false,
2430 }
2431 }
2432
2433 pub(crate) fn dispatch<F, E>(&mut self, cx: &mut Context, emit: F) -> Result<(), E>
2434 where
2435 F: FnOnce(&mut Context, PacketMeta, (IpRepr, TcpRepr)) -> Result<(), E>,
2436 {
2437 if self.tuple.is_none() {
2438 return Ok(());
2439 }
2440
2441 let tuple = self.tuple.unwrap();
2443
2444 if !cx.has_ip_addr(tuple.local.addr) {
2449 net_debug!("source IP address no longer available, closing socket");
2450 self.reset();
2451 return Ok(());
2452 }
2453
2454 if self.remote_last_ts.is_none() {
2455 self.remote_last_ts = Some(cx.now());
2463 }
2464
2465 self.congestion_controller
2466 .inner_mut()
2467 .pre_transmit(cx.now());
2468
2469 if self.timed_out(cx.now()) {
2471 net_debug!("timeout exceeded");
2473 self.set_state(State::Closed);
2474 } else if self.timer.should_retransmit(cx.now()) {
2475 if let Timer::Retransmit { .. } = self.timer {
2476 net_debug!("retransmitting after rto");
2478
2479 let in_flight = self.flight_size();
2481 self.congestion_controller
2482 .inner_mut()
2483 .on_rto(cx.now(), in_flight);
2484
2485 self.remote_last_seq = self.local_seq_no;
2489
2490 self.rtte.on_rto();
2492 } else {
2493 net_debug!("retransmitting for fast-retransmit");
2495
2496 let in_flight = self.flight_size();
2498 self.congestion_controller
2499 .inner_mut()
2500 .on_loss(cx.now(), in_flight);
2501
2502 self.pending_fast_retransmit = true;
2503 }
2504
2505 self.timer.set_for_idle(cx.now(), self.keep_alive);
2510
2511 self.rtte.on_retransmit();
2513 }
2514
2515 #[cfg(feature = "socket-tcp-pause-synack")]
2516 if matches!(self.state, State::SynReceived) && self.synack_paused {
2517 return Ok(());
2518 }
2519
2520 if self.seq_to_transmit(cx) {
2522 tcp_trace!("outgoing segment will send data or flags");
2524 } else if self.ack_to_transmit() && self.delayed_ack_expired(cx.now()) {
2525 tcp_trace!("outgoing segment will acknowledge");
2527 } else if self.window_to_update() {
2528 tcp_trace!("outgoing segment will update window");
2530 } else if self.state == State::Closed {
2531 tcp_trace!("outgoing segment will abort connection");
2533 } else if self.timer.should_keep_alive(cx.now()) {
2534 tcp_trace!("keep-alive timer expired");
2536 } else if self.timer.should_zero_window_probe(cx.now()) {
2537 tcp_trace!("sending zero-window probe");
2538 } else if self.timer.should_close(cx.now()) {
2539 tcp_trace!("TIME-WAIT timer expired");
2541 self.reset();
2542 return Ok(());
2543 } else {
2544 return Ok(());
2545 }
2546
2547 let mut ip_repr = IpRepr::new(
2550 tuple.local.addr,
2551 tuple.remote.addr,
2552 IpProtocol::Tcp,
2553 0,
2554 self.hop_limit.unwrap_or(64),
2555 );
2556
2557 let mut repr = TcpRepr {
2560 src_port: tuple.local.port,
2561 dst_port: tuple.remote.port,
2562 control: TcpControl::None,
2563 seq_number: self.remote_last_seq,
2564 ack_number: Some(self.remote_seq_no + self.rx_buffer.len()),
2565 window_len: self.scaled_window(),
2566 window_scale: None,
2567 max_seg_size: None,
2568 sack_permitted: false,
2569 sack_ranges: [None, None, None],
2570 timestamp: TcpTimestampRepr::generate_reply_with_tsval(
2571 self.tsval_generator,
2572 self.last_remote_tsval,
2573 ),
2574 payload: &[],
2575 };
2576
2577 let mut is_zero_window_probe = false;
2578
2579 #[cfg_attr(
2580 not(feature = "segmentation-offload"),
2581 expect(
2582 unused_mut,
2583 reason = "The default is not mutated if the segmentation offload feature is not enabled."
2584 )
2585 )]
2586 let mut packet_meta = PacketMeta::default();
2587
2588 match self.state {
2589 State::Closed => {
2592 repr.control = TcpControl::Rst;
2593 }
2594
2595 State::Listen => return Ok(()),
2597
2598 State::SynSent | State::SynReceived => {
2601 repr.control = TcpControl::Syn;
2602 repr.seq_number = self.local_seq_no;
2603 repr.window_len = u16::try_from(self.rx_buffer.window()).unwrap_or(u16::MAX);
2605 if self.state == State::SynSent {
2606 repr.ack_number = None;
2607 repr.window_scale = Some(self.remote_win_shift);
2608 repr.sack_permitted = true;
2609 } else {
2610 repr.sack_permitted = self.remote_has_sack;
2611 repr.window_scale = self.remote_win_scale.map(|_| self.remote_win_shift);
2612 }
2613 }
2614
2615 State::Established
2618 | State::FinWait1
2619 | State::Closing
2620 | State::CloseWait
2621 | State::LastAck => {
2622 let options_len = repr.header_len() - TCP_HEADER_LEN;
2631 let local_mss = cx.ip_mtu() - ip_repr.header_len() - TCP_HEADER_LEN;
2632 let effective_mss = local_mss.min(self.remote_mss).saturating_sub(options_len);
2633
2634 let offset = if self.pending_fast_retransmit {
2635 let size = effective_mss.min(self.tx_buffer.len());
2636 repr.seq_number = self.local_seq_no;
2637 repr.payload = self.tx_buffer.get_allocated(0, size);
2638
2639 self.pending_fast_retransmit = false;
2640
2641 0
2642 } else {
2643 let win_right_edge = self.local_seq_no + self.remote_win_len;
2645
2646 let mut win_limit = if win_right_edge >= self.remote_last_seq {
2648 win_right_edge - self.remote_last_seq
2649 } else {
2650 0
2656 };
2657
2658 if win_limit == 0 && self.timer.should_zero_window_probe(cx.now()) {
2660 win_limit = 1;
2661 is_zero_window_probe = true;
2662 }
2663
2664 #[cfg(not(feature = "segmentation-offload"))]
2675 let device_limit = effective_mss;
2676
2677 #[cfg(feature = "segmentation-offload")]
2678 let device_limit = {
2679 let segmentation_caps = cx.segmentation_caps();
2680 match ip_repr.version() {
2681 #[cfg(feature = "proto-ipv4")]
2682 crate::wire::IpVersion::Ipv4 => segmentation_caps.tcpv4,
2683 #[cfg(feature = "proto-ipv6")]
2684 crate::wire::IpVersion::Ipv6 => segmentation_caps.tcpv6,
2685 }
2686 .map(|buf_size| {
2687 let pre_ip_header_len = cx.max_transmission_unit() - cx.ip_mtu();
2688 buf_size.get()
2689 - pre_ip_header_len
2690 - ip_repr.header_len()
2691 - TCP_HEADER_LEN
2692 - options_len
2693 })
2694 .unwrap_or(effective_mss)
2695 };
2696
2697 let size = if is_zero_window_probe {
2698 win_limit.min(device_limit)
2704 } else {
2705 win_limit.min(device_limit).min(self.cwnd_remaining())
2706 };
2707
2708 let offset = self.flight_size();
2709 repr.payload = self.tx_buffer.get_allocated(offset, size);
2710
2711 #[cfg(feature = "segmentation-offload")]
2712 if repr.payload.len() > effective_mss {
2713 packet_meta.segmentation_offload_size =
2714 core::num::NonZeroU16::try_from(u16::try_from(effective_mss).unwrap())
2715 .unwrap()
2716 .into();
2717 }
2718
2719 offset
2720 };
2721
2722 if offset + repr.payload.len() == self.tx_buffer.len() {
2725 match self.state {
2726 State::FinWait1 | State::LastAck | State::Closing => {
2727 repr.control = TcpControl::Fin
2728 }
2729 State::Established | State::CloseWait if !repr.payload.is_empty() => {
2730 repr.control = TcpControl::Psh
2731 }
2732 _ => (),
2733 }
2734 }
2735 }
2736
2737 State::FinWait2 | State::TimeWait => {}
2739 }
2740
2741 let is_keep_alive;
2746 if self.timer.should_keep_alive(cx.now()) && repr.is_empty() {
2747 repr.seq_number = repr.seq_number - 1;
2748 repr.payload = b"\x00"; is_keep_alive = true;
2750 } else {
2751 is_keep_alive = false;
2752 }
2753
2754 if is_keep_alive {
2756 tcp_trace!("sending a keep-alive");
2757 } else if !repr.payload.is_empty() {
2758 tcp_trace!(
2759 "tx buffer: sending {} octets at offset {}",
2760 repr.payload.len(),
2761 self.flight_size()
2762 );
2763 }
2764 if repr.control != TcpControl::None || repr.payload.is_empty() {
2765 let flags = match (repr.control, repr.ack_number) {
2766 (TcpControl::Syn, None) => "SYN",
2767 (TcpControl::Syn, Some(_)) => "SYN|ACK",
2768 (TcpControl::Fin, Some(_)) => "FIN|ACK",
2769 (TcpControl::Rst, Some(_)) => "RST|ACK",
2770 (TcpControl::Psh, Some(_)) => "PSH|ACK",
2771 (TcpControl::None, Some(_)) => "ACK",
2772 _ => "<unreachable>",
2773 };
2774 tcp_trace!("sending {}", flags);
2775 }
2776
2777 if repr.control == TcpControl::Syn {
2778 let max_segment_size = cx.ip_mtu() - ip_repr.header_len() - TCP_HEADER_LEN;
2780 repr.max_seg_size = Some(max_segment_size as u16);
2781 }
2782
2783 ip_repr.set_payload_len(repr.buffer_len());
2791 emit(cx, packet_meta, (ip_repr, repr))?;
2792
2793 self.timer.rewind_keep_alive(cx.now(), self.keep_alive);
2796
2797 match self.ack_delay_timer {
2799 AckDelayTimer::Idle => {}
2800 AckDelayTimer::Waiting(_) => {
2801 tcp_trace!("stop delayed ack timer")
2802 }
2803 AckDelayTimer::Immediate => {
2804 tcp_trace!("stop delayed ack timer (was force-expired)")
2805 }
2806 }
2807 self.ack_delay_timer = AckDelayTimer::Idle;
2808
2809 if is_zero_window_probe {
2811 self.timer.rewind_zero_window_probe(cx.now());
2812 return Ok(());
2813 }
2814
2815 if is_keep_alive {
2818 return Ok(());
2819 }
2820
2821 self.remote_last_seq = self
2825 .remote_last_seq
2826 .max(repr.seq_number + repr.segment_len());
2827 self.remote_last_ack = repr.ack_number;
2828 self.remote_last_win = repr.window_len;
2829
2830 if repr.segment_len() > 0 {
2831 self.rtte
2832 .on_send(cx.now(), repr.seq_number + repr.segment_len());
2833 self.congestion_controller
2834 .inner_mut()
2835 .post_transmit(cx.now(), repr.segment_len());
2836 }
2837
2838 if repr.segment_len() > 0 && !self.timer.is_retransmit() {
2839 let rto = self.rtte.retransmission_timeout();
2843 self.timer.set_for_retransmit(cx.now(), rto);
2844 }
2845
2846 if self.state == State::Closed {
2847 self.tuple = None;
2849 #[cfg(feature = "async")]
2850 {
2851 self.tx_waker.wake();
2853 }
2854 }
2855
2856 Ok(())
2857 }
2858
2859 #[allow(clippy::if_same_then_else)]
2860 pub(crate) fn poll_at(&self, cx: &mut Context) -> PollAt {
2861 if self.tuple.is_none() {
2863 PollAt::Ingress
2865 } else if self.remote_last_ts.is_none() {
2866 PollAt::Now
2868 } else if self.state == State::Closed {
2869 PollAt::Now
2871 } else if self.seq_to_transmit(cx) {
2872 PollAt::Now
2874 } else if self.window_to_update() {
2875 PollAt::Now
2877 } else {
2878 let want_ack = self.ack_to_transmit();
2879
2880 let delayed_ack_poll_at = match (want_ack, self.ack_delay_timer) {
2881 (false, _) => PollAt::Ingress,
2882 (true, AckDelayTimer::Idle) => PollAt::Now,
2883 (true, AckDelayTimer::Waiting(t)) => PollAt::Time(t),
2884 (true, AckDelayTimer::Immediate) => PollAt::Now,
2885 };
2886
2887 let timeout_poll_at = match (self.remote_last_ts, self.timeout) {
2888 (Some(remote_last_ts), Some(timeout)) => PollAt::Time(remote_last_ts + timeout),
2891 (_, _) => PollAt::Ingress,
2893 };
2894
2895 *[self.timer.poll_at(), timeout_poll_at, delayed_ack_poll_at]
2897 .iter()
2898 .min()
2899 .unwrap_or(&PollAt::Ingress)
2900 }
2901 }
2902}
2903
2904impl<'a> fmt::Write for Socket<'a> {
2905 fn write_str(&mut self, slice: &str) -> fmt::Result {
2906 let slice = slice.as_bytes();
2907 if self.send_slice(slice) == Ok(slice.len()) {
2908 Ok(())
2909 } else {
2910 Err(fmt::Error)
2911 }
2912 }
2913}
2914
2915#[cfg(all(test, feature = "medium-ip"))]
2919mod test {
2920 use super::*;
2921 use crate::config::IFACE_MAX_ADDR_COUNT;
2922 use crate::wire::{IpCidr, IpRepr};
2923 use std::ops::{Deref, DerefMut};
2924 use std::vec::Vec;
2925
2926 const LOCAL_PORT: u16 = 80;
2931 const REMOTE_PORT: u16 = 49500;
2932 const LISTEN_END: IpListenEndpoint = IpListenEndpoint {
2933 addr: None,
2934 port: LOCAL_PORT,
2935 };
2936 const TUPLE: Tuple = Tuple {
2937 local: LOCAL_END,
2938 remote: REMOTE_END,
2939 };
2940 const LOCAL_SEQ: TcpSeqNumber = TcpSeqNumber(10000);
2941 const REMOTE_SEQ: TcpSeqNumber = TcpSeqNumber(-10001);
2942
2943 cfg_if::cfg_if! {
2944 if #[cfg(feature = "proto-ipv4")] {
2945 use crate::wire::Ipv4Address as IpvXAddress;
2946 use crate::wire::Ipv4Repr as IpvXRepr;
2947 use IpRepr::Ipv4 as IpReprIpvX;
2948
2949 const LOCAL_ADDR: IpvXAddress = IpvXAddress::new(192, 168, 1, 1);
2950 const REMOTE_ADDR: IpvXAddress = IpvXAddress::new(192, 168, 1, 2);
2951 const OTHER_ADDR: IpvXAddress = IpvXAddress::new(192, 168, 1, 3);
2952
2953 const BASE_MSS: u16 = 1460;
2954
2955 const LOCAL_END: IpEndpoint = IpEndpoint {
2956 addr: IpAddress::Ipv4(LOCAL_ADDR),
2957 port: LOCAL_PORT,
2958 };
2959 const REMOTE_END: IpEndpoint = IpEndpoint {
2960 addr: IpAddress::Ipv4(REMOTE_ADDR),
2961 port: REMOTE_PORT,
2962 };
2963 } else {
2964 use crate::wire::Ipv6Address as IpvXAddress;
2965 use crate::wire::Ipv6Repr as IpvXRepr;
2966 use IpRepr::Ipv6 as IpReprIpvX;
2967
2968 const LOCAL_ADDR: IpvXAddress = IpvXAddress::new(0xfe80, 0, 0, 0, 0, 0, 0, 1);
2969 const REMOTE_ADDR: IpvXAddress = IpvXAddress::new(0xfe80, 0, 0, 0, 0, 0, 0, 2);
2970 const OTHER_ADDR: IpvXAddress = IpvXAddress::new(0xfe80, 0, 0, 0, 0, 0, 0, 3);
2971
2972 const BASE_MSS: u16 = 1440;
2973
2974 const LOCAL_END: IpEndpoint = IpEndpoint {
2975 addr: IpAddress::Ipv6(LOCAL_ADDR),
2976 port: LOCAL_PORT,
2977 };
2978 const REMOTE_END: IpEndpoint = IpEndpoint {
2979 addr: IpAddress::Ipv6(REMOTE_ADDR),
2980 port: REMOTE_PORT,
2981 };
2982 }
2983 }
2984
2985 const SEND_IP_TEMPL: IpRepr = IpReprIpvX(IpvXRepr {
2986 src_addr: LOCAL_ADDR,
2987 dst_addr: REMOTE_ADDR,
2988 next_header: IpProtocol::Tcp,
2989 payload_len: 20,
2990 hop_limit: 64,
2991 });
2992 const SEND_TEMPL: TcpRepr<'static> = TcpRepr {
2993 src_port: REMOTE_PORT,
2994 dst_port: LOCAL_PORT,
2995 control: TcpControl::None,
2996 seq_number: TcpSeqNumber(0),
2997 ack_number: Some(TcpSeqNumber(0)),
2998 window_len: 256,
2999 window_scale: None,
3000 max_seg_size: None,
3001 sack_permitted: false,
3002 sack_ranges: [None, None, None],
3003 timestamp: None,
3004 payload: &[],
3005 };
3006 const _RECV_IP_TEMPL: IpRepr = IpReprIpvX(IpvXRepr {
3007 src_addr: LOCAL_ADDR,
3008 dst_addr: REMOTE_ADDR,
3009 next_header: IpProtocol::Tcp,
3010 payload_len: 20,
3011 hop_limit: 64,
3012 });
3013 const RECV_TEMPL: TcpRepr<'static> = TcpRepr {
3014 src_port: LOCAL_PORT,
3015 dst_port: REMOTE_PORT,
3016 control: TcpControl::None,
3017 seq_number: TcpSeqNumber(0),
3018 ack_number: Some(TcpSeqNumber(0)),
3019 window_len: 64,
3020 window_scale: None,
3021 max_seg_size: None,
3022 sack_permitted: false,
3023 sack_ranges: [None, None, None],
3024 timestamp: None,
3025 payload: &[],
3026 };
3027
3028 struct TestSocket {
3033 socket: Socket<'static>,
3034 cx: Context,
3035 }
3036
3037 impl Deref for TestSocket {
3038 type Target = Socket<'static>;
3039 fn deref(&self) -> &Self::Target {
3040 &self.socket
3041 }
3042 }
3043
3044 impl DerefMut for TestSocket {
3045 fn deref_mut(&mut self) -> &mut Self::Target {
3046 &mut self.socket
3047 }
3048 }
3049
3050 #[track_caller]
3051 fn send(
3052 socket: &mut TestSocket,
3053 timestamp: Instant,
3054 repr: &TcpRepr,
3055 ) -> Option<TcpRepr<'static>> {
3056 socket.cx.set_now(timestamp);
3057
3058 let ip_repr = IpReprIpvX(IpvXRepr {
3059 src_addr: REMOTE_ADDR,
3060 dst_addr: LOCAL_ADDR,
3061 next_header: IpProtocol::Tcp,
3062 payload_len: repr.buffer_len(),
3063 hop_limit: 64,
3064 });
3065 net_trace!("send: {}", repr);
3066
3067 assert!(socket.socket.accepts(&mut socket.cx, &ip_repr, repr));
3068
3069 match socket.socket.process(&mut socket.cx, &ip_repr, repr) {
3070 Some((_ip_repr, repr)) => {
3071 net_trace!("recv: {}", repr);
3072 Some(repr)
3073 }
3074 None => None,
3075 }
3076 }
3077
3078 #[track_caller]
3079 fn recv<F>(socket: &mut TestSocket, timestamp: Instant, mut f: F)
3080 where
3081 F: FnMut(Result<TcpRepr, ()>),
3082 {
3083 socket.cx.set_now(timestamp);
3084
3085 let mut sent = 0;
3086 let result = socket
3087 .socket
3088 .dispatch(&mut socket.cx, |_, _, (ip_repr, tcp_repr)| {
3089 assert_eq!(ip_repr.next_header(), IpProtocol::Tcp);
3090 assert_eq!(ip_repr.src_addr(), LOCAL_ADDR.into());
3091 assert_eq!(ip_repr.dst_addr(), REMOTE_ADDR.into());
3092 assert_eq!(ip_repr.payload_len(), tcp_repr.buffer_len());
3093
3094 net_trace!("recv: {}", tcp_repr);
3095 sent += 1;
3096 Ok(f(Ok(tcp_repr)))
3097 });
3098 match result {
3099 Ok(()) => assert_eq!(sent, 1, "Exactly one packet should be sent"),
3100 Err(e) => f(Err(e)),
3101 }
3102 }
3103
3104 #[track_caller]
3105 fn recv_nothing(socket: &mut TestSocket, timestamp: Instant) {
3106 socket.cx.set_now(timestamp);
3107
3108 let mut fail = false;
3109 let result: Result<(), ()> = socket.socket.dispatch(&mut socket.cx, |_, _, _| {
3110 fail = true;
3111 Ok(())
3112 });
3113 if fail {
3114 panic!("Should not send a packet")
3115 }
3116
3117 assert_eq!(result, Ok(()))
3118 }
3119
3120 #[collapse_debuginfo(yes)]
3121 macro_rules! send {
3122 ($socket:ident, $repr:expr) =>
3123 (send!($socket, time 0, $repr));
3124 ($socket:ident, $repr:expr, $result:expr) =>
3125 (send!($socket, time 0, $repr, $result));
3126 ($socket:ident, time $time:expr, $repr:expr) =>
3127 (send!($socket, time $time, $repr, None));
3128 ($socket:ident, time $time:expr, $repr:expr, $result:expr) =>
3129 (assert_eq!(send(&mut $socket, Instant::from_millis($time), &$repr), $result));
3130 }
3131
3132 #[collapse_debuginfo(yes)]
3133 macro_rules! recv {
3134 ($socket:ident, [$( $repr:expr ),*]) => ({
3135 $( recv!($socket, Ok($repr)); )*
3136 recv_nothing!($socket)
3137 });
3138 ($socket:ident, time $time:expr, [$( $repr:expr ),*]) => ({
3139 $( recv!($socket, time $time, Ok($repr)); )*
3140 recv_nothing!($socket, time $time)
3141 });
3142 ($socket:ident, $result:expr) =>
3143 (recv!($socket, time 0, $result));
3144 ($socket:ident, time $time:expr, $result:expr) =>
3145 (recv(&mut $socket, Instant::from_millis($time), |result| {
3146 let result = result.map(|mut repr| {
3148 repr.control = repr.control.quash_psh();
3149 repr
3150 });
3151 assert_eq!(result, $result)
3152 }));
3153 ($socket:ident, time $time:expr, $result:expr, exact) =>
3154 (recv(&mut $socket, Instant::from_millis($time), |repr| assert_eq!(repr, $result)));
3155 }
3156
3157 #[collapse_debuginfo(yes)]
3158 macro_rules! recv_nothing {
3159 ($socket:ident) => (recv_nothing!($socket, time 0));
3160 ($socket:ident, time $time:expr) => (recv_nothing(&mut $socket, Instant::from_millis($time)));
3161 }
3162
3163 #[collapse_debuginfo(yes)]
3164 macro_rules! sanity {
3165 ($socket1:expr, $socket2:expr) => {{
3166 let (s1, s2) = ($socket1, $socket2);
3167 assert_eq!(s1.state, s2.state, "state");
3168 assert_eq!(s1.tuple, s2.tuple, "tuple");
3169 assert_eq!(s1.local_seq_no, s2.local_seq_no, "local_seq_no");
3170 assert_eq!(s1.remote_seq_no, s2.remote_seq_no, "remote_seq_no");
3171 assert_eq!(s1.remote_last_seq, s2.remote_last_seq, "remote_last_seq");
3172 assert_eq!(s1.remote_last_ack, s2.remote_last_ack, "remote_last_ack");
3173 assert_eq!(s1.remote_last_win, s2.remote_last_win, "remote_last_win");
3174 assert_eq!(s1.remote_win_len, s2.remote_win_len, "remote_win_len");
3175 assert_eq!(s1.timer, s2.timer, "timer");
3176 }};
3177 }
3178
3179 fn socket() -> TestSocket {
3180 socket_with_buffer_sizes(64, 64)
3181 }
3182
3183 fn socket_with_buffer_sizes(tx_len: usize, rx_len: usize) -> TestSocket {
3184 let (iface, _, _) = crate::tests::setup(crate::phy::Medium::Ip);
3185
3186 let rx_buffer = SocketBuffer::new(vec![0; rx_len]);
3187 let tx_buffer = SocketBuffer::new(vec![0; tx_len]);
3188 let mut socket = Socket::new(rx_buffer, tx_buffer);
3189 socket.set_ack_delay(None);
3190 TestSocket {
3191 socket,
3192 cx: iface.inner,
3193 }
3194 }
3195
3196 fn socket_syn_received_with_buffer_sizes(tx_len: usize, rx_len: usize) -> TestSocket {
3197 let mut s = socket_with_buffer_sizes(tx_len, rx_len);
3198 s.state = State::SynReceived;
3199 s.tuple = Some(TUPLE);
3200 s.local_seq_no = LOCAL_SEQ;
3201 s.remote_seq_no = REMOTE_SEQ + 1;
3202 s.remote_last_seq = LOCAL_SEQ;
3203 s.remote_win_len = 256;
3204 s
3205 }
3206
3207 fn socket_syn_received() -> TestSocket {
3208 socket_syn_received_with_buffer_sizes(64, 64)
3209 }
3210
3211 fn socket_syn_sent_with_buffer_sizes(tx_len: usize, rx_len: usize) -> TestSocket {
3212 let mut s = socket_with_buffer_sizes(tx_len, rx_len);
3213 s.state = State::SynSent;
3214 s.tuple = Some(TUPLE);
3215 s.local_seq_no = LOCAL_SEQ;
3216 s.remote_last_seq = LOCAL_SEQ;
3217 s
3218 }
3219
3220 fn socket_syn_sent() -> TestSocket {
3221 socket_syn_sent_with_buffer_sizes(64, 64)
3222 }
3223
3224 fn socket_established_with_buffer_sizes(tx_len: usize, rx_len: usize) -> TestSocket {
3225 let mut s = socket_syn_received_with_buffer_sizes(tx_len, rx_len);
3226 s.state = State::Established;
3227 s.local_seq_no = LOCAL_SEQ + 1;
3228 s.remote_last_seq = LOCAL_SEQ + 1;
3229 s.remote_last_ack = Some(REMOTE_SEQ + 1);
3230 s.remote_last_win = s.scaled_window();
3231 s
3232 }
3233
3234 fn socket_established() -> TestSocket {
3235 socket_established_with_buffer_sizes(64, 64)
3236 }
3237
3238 fn socket_fin_wait_1() -> TestSocket {
3239 let mut s = socket_established();
3240 s.state = State::FinWait1;
3241 s
3242 }
3243
3244 fn socket_fin_wait_2() -> TestSocket {
3245 let mut s = socket_fin_wait_1();
3246 s.state = State::FinWait2;
3247 s.local_seq_no = LOCAL_SEQ + 1 + 1;
3248 s.remote_last_seq = LOCAL_SEQ + 1 + 1;
3249 s
3250 }
3251
3252 fn socket_closing() -> TestSocket {
3253 let mut s = socket_fin_wait_1();
3254 s.state = State::Closing;
3255 s.remote_last_seq = LOCAL_SEQ + 1 + 1;
3256 s.remote_seq_no = REMOTE_SEQ + 1 + 1;
3257 s.timer = Timer::Retransmit {
3258 expires_at: Instant::from_millis_const(1000),
3259 };
3260 s
3261 }
3262
3263 fn socket_time_wait(from_closing: bool) -> TestSocket {
3264 let mut s = socket_fin_wait_2();
3265 s.state = State::TimeWait;
3266 s.remote_seq_no = REMOTE_SEQ + 1 + 1;
3267 if from_closing {
3268 s.remote_last_ack = Some(REMOTE_SEQ + 1 + 1);
3269 }
3270 s.timer = Timer::Close {
3271 expires_at: Instant::from_secs(1) + CLOSE_DELAY,
3272 };
3273 s
3274 }
3275
3276 fn socket_close_wait() -> TestSocket {
3277 let mut s = socket_established();
3278 s.state = State::CloseWait;
3279 s.remote_seq_no = REMOTE_SEQ + 1 + 1;
3280 s.remote_last_ack = Some(REMOTE_SEQ + 1 + 1);
3281 s
3282 }
3283
3284 fn socket_last_ack() -> TestSocket {
3285 let mut s = socket_close_wait();
3286 s.state = State::LastAck;
3287 s
3288 }
3289
3290 fn socket_recved() -> TestSocket {
3291 let mut s = socket_established();
3292 send!(
3293 s,
3294 TcpRepr {
3295 seq_number: REMOTE_SEQ + 1,
3296 ack_number: Some(LOCAL_SEQ + 1),
3297 payload: &b"abcdef"[..],
3298 ..SEND_TEMPL
3299 }
3300 );
3301 recv!(
3302 s,
3303 [TcpRepr {
3304 seq_number: LOCAL_SEQ + 1,
3305 ack_number: Some(REMOTE_SEQ + 1 + 6),
3306 window_len: 58,
3307 ..RECV_TEMPL
3308 }]
3309 );
3310 s
3311 }
3312
3313 #[test]
3317 fn test_closed_reject() {
3318 let mut s = socket();
3319 assert_eq!(s.state, State::Closed);
3320
3321 let tcp_repr = TcpRepr {
3322 control: TcpControl::Syn,
3323 ..SEND_TEMPL
3324 };
3325 assert!(!s.socket.accepts(&mut s.cx, &SEND_IP_TEMPL, &tcp_repr));
3326 }
3327
3328 #[test]
3329 fn test_closed_reject_after_listen() {
3330 let mut s = socket();
3331 s.listen(LOCAL_END).unwrap();
3332 s.close();
3333
3334 let tcp_repr = TcpRepr {
3335 control: TcpControl::Syn,
3336 ..SEND_TEMPL
3337 };
3338 assert!(!s.socket.accepts(&mut s.cx, &SEND_IP_TEMPL, &tcp_repr));
3339 }
3340
3341 #[test]
3342 fn test_closed_close() {
3343 let mut s = socket();
3344 s.close();
3345 assert_eq!(s.state, State::Closed);
3346 }
3347
3348 fn socket_listen() -> TestSocket {
3352 let mut s = socket();
3353 s.state = State::Listen;
3354 s.listen_endpoint = LISTEN_END;
3355 s
3356 }
3357
3358 #[test]
3359 fn test_listen_sack_option() {
3360 let mut s = socket_listen();
3361 send!(
3362 s,
3363 TcpRepr {
3364 control: TcpControl::Syn,
3365 seq_number: REMOTE_SEQ,
3366 ack_number: None,
3367 sack_permitted: false,
3368 ..SEND_TEMPL
3369 }
3370 );
3371 assert!(!s.remote_has_sack);
3372 recv!(
3373 s,
3374 [TcpRepr {
3375 control: TcpControl::Syn,
3376 seq_number: LOCAL_SEQ,
3377 ack_number: Some(REMOTE_SEQ + 1),
3378 max_seg_size: Some(BASE_MSS),
3379 ..RECV_TEMPL
3380 }]
3381 );
3382
3383 let mut s = socket_listen();
3384 send!(
3385 s,
3386 TcpRepr {
3387 control: TcpControl::Syn,
3388 seq_number: REMOTE_SEQ,
3389 ack_number: None,
3390 sack_permitted: true,
3391 ..SEND_TEMPL
3392 }
3393 );
3394 assert!(s.remote_has_sack);
3395 recv!(
3396 s,
3397 [TcpRepr {
3398 control: TcpControl::Syn,
3399 seq_number: LOCAL_SEQ,
3400 ack_number: Some(REMOTE_SEQ + 1),
3401 max_seg_size: Some(BASE_MSS),
3402 sack_permitted: true,
3403 ..RECV_TEMPL
3404 }]
3405 );
3406 }
3407
3408 #[test]
3409 fn test_listen_syn_win_scale_buffers() {
3410 for (buffer_size, shift_amt) in &[
3411 (64, 0),
3412 (128, 0),
3413 (1024, 0),
3414 (65535, 0),
3415 (65536, 1),
3416 (65537, 1),
3417 (131071, 1),
3418 (131072, 2),
3419 (524287, 3),
3420 (524288, 4),
3421 (655350, 4),
3422 (1048576, 5),
3423 ] {
3424 let mut s = socket_with_buffer_sizes(64, *buffer_size);
3425 s.state = State::Listen;
3426 s.listen_endpoint = LISTEN_END;
3427 assert_eq!(s.remote_win_shift, *shift_amt);
3428 send!(
3429 s,
3430 TcpRepr {
3431 control: TcpControl::Syn,
3432 seq_number: REMOTE_SEQ,
3433 ack_number: None,
3434 window_scale: Some(0),
3435 ..SEND_TEMPL
3436 }
3437 );
3438 assert_eq!(s.remote_win_shift, *shift_amt);
3439 recv!(
3440 s,
3441 [TcpRepr {
3442 control: TcpControl::Syn,
3443 seq_number: LOCAL_SEQ,
3444 ack_number: Some(REMOTE_SEQ + 1),
3445 max_seg_size: Some(BASE_MSS),
3446 window_scale: Some(*shift_amt),
3447 window_len: u16::try_from(*buffer_size).unwrap_or(u16::MAX),
3448 ..RECV_TEMPL
3449 }]
3450 );
3451 }
3452 }
3453
3454 #[test]
3455 fn test_listen_syn_tiny_mss_is_clamped() {
3456 let mut s = socket_listen();
3457 send!(
3458 s,
3459 TcpRepr {
3460 control: TcpControl::Syn,
3461 seq_number: REMOTE_SEQ,
3462 ack_number: None,
3463 max_seg_size: Some(10),
3464 ..SEND_TEMPL
3465 }
3466 );
3467 assert_eq!(s.state, State::SynReceived);
3468 assert_eq!(s.remote_mss, MIN_REMOTE_MSS);
3469 }
3470
3471 #[test]
3472 fn test_listen_syn_zero_mss_is_ignored() {
3473 let mut s = socket_listen();
3474 send!(
3475 s,
3476 TcpRepr {
3477 control: TcpControl::Syn,
3478 seq_number: REMOTE_SEQ,
3479 ack_number: None,
3480 max_seg_size: Some(0),
3481 ..SEND_TEMPL
3482 }
3483 );
3484 assert_eq!(s.state, State::SynReceived);
3485 assert_eq!(s.remote_mss, DEFAULT_MSS);
3486 }
3487
3488 #[test]
3489 fn test_listen_sanity() {
3490 let mut s = socket();
3491 s.listen(LOCAL_PORT).unwrap();
3492 sanity!(s, socket_listen());
3493 }
3494
3495 #[test]
3496 fn test_listen_validation() {
3497 let mut s = socket();
3498 assert_eq!(s.listen(0), Err(ListenError::Unaddressable));
3499 }
3500
3501 #[test]
3502 fn test_listen_twice() {
3503 let mut s = socket();
3504 assert_eq!(s.listen(80), Ok(()));
3505 assert_eq!(s.listen(80), Ok(()));
3507 s.set_state(State::SynReceived); assert_eq!(s.listen(80), Err(ListenError::InvalidState));
3509 }
3510
3511 #[test]
3512 fn test_listen_syn() {
3513 let mut s = socket_listen();
3514 send!(
3515 s,
3516 TcpRepr {
3517 control: TcpControl::Syn,
3518 seq_number: REMOTE_SEQ,
3519 ack_number: None,
3520 ..SEND_TEMPL
3521 }
3522 );
3523 sanity!(s, socket_syn_received());
3524 }
3525
3526 #[test]
3527 fn test_listen_syn_reject_ack() {
3528 let mut s = socket_listen();
3529
3530 let tcp_repr = TcpRepr {
3531 control: TcpControl::Syn,
3532 seq_number: REMOTE_SEQ,
3533 ack_number: Some(LOCAL_SEQ),
3534 ..SEND_TEMPL
3535 };
3536 assert!(!s.socket.accepts(&mut s.cx, &SEND_IP_TEMPL, &tcp_repr));
3537
3538 assert_eq!(s.state, State::Listen);
3539 }
3540
3541 #[test]
3542 fn test_listen_rst() {
3543 let mut s = socket_listen();
3544 let tcp_repr = TcpRepr {
3545 control: TcpControl::Rst,
3546 seq_number: REMOTE_SEQ,
3547 ack_number: None,
3548 ..SEND_TEMPL
3549 };
3550 assert!(!s.socket.accepts(&mut s.cx, &SEND_IP_TEMPL, &tcp_repr));
3551 assert_eq!(s.state, State::Listen);
3552 }
3553
3554 #[test]
3555 fn test_listen_close() {
3556 let mut s = socket_listen();
3557 s.close();
3558 assert_eq!(s.state, State::Closed);
3559 }
3560
3561 #[test]
3566 fn test_syn_received_ack() {
3567 let mut s = socket_syn_received();
3568 recv!(
3569 s,
3570 [TcpRepr {
3571 control: TcpControl::Syn,
3572 seq_number: LOCAL_SEQ,
3573 ack_number: Some(REMOTE_SEQ + 1),
3574 max_seg_size: Some(BASE_MSS),
3575 ..RECV_TEMPL
3576 }]
3577 );
3578 send!(
3579 s,
3580 TcpRepr {
3581 seq_number: REMOTE_SEQ + 1,
3582 ack_number: Some(LOCAL_SEQ + 1),
3583 ..SEND_TEMPL
3584 }
3585 );
3586 assert_eq!(s.state, State::Established);
3587 sanity!(s, socket_established());
3588 }
3589
3590 #[cfg(feature = "socket-tcp-pause-synack")]
3591 #[test]
3592 fn test_syn_paused_ack() {
3593 let mut s = socket_syn_received();
3594
3595 s.pause_synack(true);
3596 recv_nothing!(s);
3597 assert_eq!(s.state, State::SynReceived);
3598
3599 s.pause_synack(false);
3600 recv!(
3601 s,
3602 [TcpRepr {
3603 control: TcpControl::Syn,
3604 seq_number: LOCAL_SEQ,
3605 ack_number: Some(REMOTE_SEQ + 1),
3606 max_seg_size: Some(BASE_MSS),
3607 ..RECV_TEMPL
3608 }]
3609 );
3610 send!(
3611 s,
3612 TcpRepr {
3613 seq_number: REMOTE_SEQ + 1,
3614 ack_number: Some(LOCAL_SEQ + 1),
3615 ..SEND_TEMPL
3616 }
3617 );
3618 assert_eq!(s.state, State::Established);
3619 }
3620
3621 #[test]
3622 fn test_syn_received_ack_too_low() {
3623 let mut s = socket_syn_received();
3624 recv!(
3625 s,
3626 [TcpRepr {
3627 control: TcpControl::Syn,
3628 seq_number: LOCAL_SEQ,
3629 ack_number: Some(REMOTE_SEQ + 1),
3630 max_seg_size: Some(BASE_MSS),
3631 ..RECV_TEMPL
3632 }]
3633 );
3634 send!(
3635 s,
3636 TcpRepr {
3637 seq_number: REMOTE_SEQ + 1,
3638 ack_number: Some(LOCAL_SEQ), ..SEND_TEMPL
3640 },
3641 Some(TcpRepr {
3642 control: TcpControl::Rst,
3643 seq_number: LOCAL_SEQ,
3644 ack_number: None,
3645 window_len: 0,
3646 ..RECV_TEMPL
3647 })
3648 );
3649 assert_eq!(s.state, State::SynReceived);
3650 }
3651
3652 #[test]
3653 fn test_syn_received_ack_too_high() {
3654 let mut s = socket_syn_received();
3655 recv!(
3656 s,
3657 [TcpRepr {
3658 control: TcpControl::Syn,
3659 seq_number: LOCAL_SEQ,
3660 ack_number: Some(REMOTE_SEQ + 1),
3661 max_seg_size: Some(BASE_MSS),
3662 ..RECV_TEMPL
3663 }]
3664 );
3665 send!(
3666 s,
3667 TcpRepr {
3668 seq_number: REMOTE_SEQ + 1,
3669 ack_number: Some(LOCAL_SEQ + 2), ..SEND_TEMPL
3671 },
3672 Some(TcpRepr {
3673 control: TcpControl::Rst,
3674 seq_number: LOCAL_SEQ + 2,
3675 ack_number: None,
3676 window_len: 0,
3677 ..RECV_TEMPL
3678 })
3679 );
3680 assert_eq!(s.state, State::SynReceived);
3681 }
3682
3683 #[test]
3684 fn test_syn_received_fin() {
3685 let mut s = socket_syn_received();
3686 recv!(
3687 s,
3688 [TcpRepr {
3689 control: TcpControl::Syn,
3690 seq_number: LOCAL_SEQ,
3691 ack_number: Some(REMOTE_SEQ + 1),
3692 max_seg_size: Some(BASE_MSS),
3693 ..RECV_TEMPL
3694 }]
3695 );
3696 send!(
3697 s,
3698 TcpRepr {
3699 control: TcpControl::Fin,
3700 seq_number: REMOTE_SEQ + 1,
3701 ack_number: Some(LOCAL_SEQ + 1),
3702 payload: &b"abcdef"[..],
3703 ..SEND_TEMPL
3704 }
3705 );
3706 recv!(
3707 s,
3708 [TcpRepr {
3709 seq_number: LOCAL_SEQ + 1,
3710 ack_number: Some(REMOTE_SEQ + 1 + 6 + 1),
3711 window_len: 58,
3712 ..RECV_TEMPL
3713 }]
3714 );
3715 assert_eq!(s.state, State::CloseWait);
3716
3717 let mut s2 = socket_close_wait();
3718 s2.remote_last_ack = Some(REMOTE_SEQ + 1 + 6 + 1);
3719 s2.remote_last_win = 58;
3720 sanity!(s, s2);
3721 }
3722
3723 #[test]
3724 fn test_syn_received_rst() {
3725 let mut s = socket_syn_received();
3726 s.listen_endpoint = LISTEN_END;
3727 recv!(
3728 s,
3729 [TcpRepr {
3730 control: TcpControl::Syn,
3731 seq_number: LOCAL_SEQ,
3732 ack_number: Some(REMOTE_SEQ + 1),
3733 max_seg_size: Some(BASE_MSS),
3734 ..RECV_TEMPL
3735 }]
3736 );
3737 send!(
3738 s,
3739 TcpRepr {
3740 control: TcpControl::Rst,
3741 seq_number: REMOTE_SEQ + 1,
3742 ack_number: Some(LOCAL_SEQ),
3743 ..SEND_TEMPL
3744 }
3745 );
3746 assert_eq!(s.state, State::Listen);
3747 assert_eq!(s.listen_endpoint, LISTEN_END);
3748 assert_eq!(s.tuple, None);
3749 }
3750
3751 #[test]
3752 fn test_syn_received_no_window_scaling() {
3753 let mut s = socket_listen();
3754 send!(
3755 s,
3756 TcpRepr {
3757 control: TcpControl::Syn,
3758 seq_number: REMOTE_SEQ,
3759 ack_number: None,
3760 ..SEND_TEMPL
3761 }
3762 );
3763 assert_eq!(s.state(), State::SynReceived);
3764 assert_eq!(s.tuple, Some(TUPLE));
3765 recv!(
3766 s,
3767 [TcpRepr {
3768 control: TcpControl::Syn,
3769 seq_number: LOCAL_SEQ,
3770 ack_number: Some(REMOTE_SEQ + 1),
3771 max_seg_size: Some(BASE_MSS),
3772 window_scale: None,
3773 ..RECV_TEMPL
3774 }]
3775 );
3776 send!(
3777 s,
3778 TcpRepr {
3779 seq_number: REMOTE_SEQ + 1,
3780 ack_number: Some(LOCAL_SEQ + 1),
3781 window_scale: None,
3782 ..SEND_TEMPL
3783 }
3784 );
3785 assert_eq!(s.remote_win_shift, 0);
3786 assert_eq!(s.remote_win_scale, None);
3787 }
3788
3789 #[test]
3790 fn test_syn_received_window_scaling() {
3791 for scale in 0..14 {
3792 let mut s = socket_listen();
3793 send!(
3794 s,
3795 TcpRepr {
3796 control: TcpControl::Syn,
3797 seq_number: REMOTE_SEQ,
3798 ack_number: None,
3799 window_scale: Some(scale),
3800 ..SEND_TEMPL
3801 }
3802 );
3803 assert_eq!(s.state(), State::SynReceived);
3804 assert_eq!(s.tuple, Some(TUPLE));
3805 recv!(
3806 s,
3807 [TcpRepr {
3808 control: TcpControl::Syn,
3809 seq_number: LOCAL_SEQ,
3810 ack_number: Some(REMOTE_SEQ + 1),
3811 max_seg_size: Some(BASE_MSS),
3812 window_scale: Some(0),
3813 ..RECV_TEMPL
3814 }]
3815 );
3816 send!(
3817 s,
3818 TcpRepr {
3819 seq_number: REMOTE_SEQ + 1,
3820 ack_number: Some(LOCAL_SEQ + 1),
3821 window_scale: None,
3822 ..SEND_TEMPL
3823 }
3824 );
3825 assert_eq!(s.remote_win_scale, Some(scale));
3826 }
3827 }
3828
3829 #[test]
3830 fn test_syn_received_close() {
3831 let mut s = socket_syn_received();
3832 s.close();
3833 assert_eq!(s.state, State::FinWait1);
3834 }
3835
3836 #[test]
3841 fn test_connect_validation() {
3842 let mut s = socket();
3843 assert_eq!(
3844 s.socket
3845 .connect(&mut s.cx, REMOTE_END, (IpvXAddress::UNSPECIFIED, 0)),
3846 Err(ConnectError::Unaddressable)
3847 );
3848 assert_eq!(
3849 s.socket
3850 .connect(&mut s.cx, REMOTE_END, (IpvXAddress::UNSPECIFIED, 1024)),
3851 Err(ConnectError::Unaddressable)
3852 );
3853 assert_eq!(
3854 s.socket
3855 .connect(&mut s.cx, (IpvXAddress::UNSPECIFIED, 0), LOCAL_END),
3856 Err(ConnectError::Unaddressable)
3857 );
3858 s.socket
3859 .connect(&mut s.cx, REMOTE_END, LOCAL_END)
3860 .expect("Connect failed with valid parameters");
3861 assert_eq!(s.tuple, Some(TUPLE));
3862 }
3863
3864 #[test]
3865 fn test_connect() {
3866 let mut s = socket();
3867 s.local_seq_no = LOCAL_SEQ;
3868 s.socket
3869 .connect(&mut s.cx, REMOTE_END, LOCAL_END.port)
3870 .unwrap();
3871 assert_eq!(s.tuple, Some(TUPLE));
3872 recv!(
3873 s,
3874 [TcpRepr {
3875 control: TcpControl::Syn,
3876 seq_number: LOCAL_SEQ,
3877 ack_number: None,
3878 max_seg_size: Some(BASE_MSS),
3879 window_scale: Some(0),
3880 sack_permitted: true,
3881 ..RECV_TEMPL
3882 }]
3883 );
3884 send!(
3885 s,
3886 TcpRepr {
3887 control: TcpControl::Syn,
3888 seq_number: REMOTE_SEQ,
3889 ack_number: Some(LOCAL_SEQ + 1),
3890 max_seg_size: Some(BASE_MSS - 80),
3891 window_scale: Some(0),
3892 ..SEND_TEMPL
3893 }
3894 );
3895 assert_eq!(s.tuple, Some(TUPLE));
3896 }
3897
3898 #[test]
3899 fn test_connect_synack_tiny_mss_is_clamped() {
3900 let mut s = socket();
3901 s.local_seq_no = LOCAL_SEQ;
3902 s.socket
3903 .connect(&mut s.cx, REMOTE_END, LOCAL_END.port)
3904 .unwrap();
3905 recv!(
3906 s,
3907 [TcpRepr {
3908 control: TcpControl::Syn,
3909 seq_number: LOCAL_SEQ,
3910 ack_number: None,
3911 max_seg_size: Some(BASE_MSS),
3912 window_scale: Some(0),
3913 sack_permitted: true,
3914 ..RECV_TEMPL
3915 }]
3916 );
3917 send!(
3918 s,
3919 TcpRepr {
3920 control: TcpControl::Syn,
3921 seq_number: REMOTE_SEQ,
3922 ack_number: Some(LOCAL_SEQ + 1),
3923 max_seg_size: Some(10),
3924 window_scale: Some(0),
3925 ..SEND_TEMPL
3926 }
3927 );
3928 assert_eq!(s.state, State::Established);
3929 assert_eq!(s.remote_mss, MIN_REMOTE_MSS);
3930 }
3931
3932 #[test]
3933 fn test_connect_synack_zero_mss_is_ignored() {
3934 let mut s = socket();
3935 s.local_seq_no = LOCAL_SEQ;
3936 s.socket
3937 .connect(&mut s.cx, REMOTE_END, LOCAL_END.port)
3938 .unwrap();
3939 recv!(
3940 s,
3941 [TcpRepr {
3942 control: TcpControl::Syn,
3943 seq_number: LOCAL_SEQ,
3944 ack_number: None,
3945 max_seg_size: Some(BASE_MSS),
3946 window_scale: Some(0),
3947 sack_permitted: true,
3948 ..RECV_TEMPL
3949 }]
3950 );
3951 send!(
3952 s,
3953 TcpRepr {
3954 control: TcpControl::Syn,
3955 seq_number: REMOTE_SEQ,
3956 ack_number: Some(LOCAL_SEQ + 1),
3957 max_seg_size: Some(0),
3958 window_scale: Some(0),
3959 ..SEND_TEMPL
3960 }
3961 );
3962 assert_eq!(s.state, State::Established);
3963 assert_eq!(s.remote_mss, DEFAULT_MSS);
3964 }
3965
3966 #[test]
3967 fn test_connect_unspecified_local() {
3968 let mut s = socket();
3969 assert_eq!(s.socket.connect(&mut s.cx, REMOTE_END, 80), Ok(()));
3970 }
3971
3972 #[test]
3973 fn test_connect_specified_local() {
3974 let mut s = socket();
3975 assert_eq!(
3976 s.socket.connect(&mut s.cx, REMOTE_END, (REMOTE_ADDR, 80)),
3977 Ok(())
3978 );
3979 }
3980
3981 #[test]
3982 fn test_connect_twice() {
3983 let mut s = socket();
3984 assert_eq!(s.socket.connect(&mut s.cx, REMOTE_END, 80), Ok(()));
3985 assert_eq!(
3986 s.socket.connect(&mut s.cx, REMOTE_END, 80),
3987 Err(ConnectError::InvalidState)
3988 );
3989 }
3990
3991 #[test]
3992 fn test_syn_sent_sanity() {
3993 let mut s = socket();
3994 s.local_seq_no = LOCAL_SEQ;
3995 s.socket.connect(&mut s.cx, REMOTE_END, LOCAL_END).unwrap();
3996 sanity!(s, socket_syn_sent());
3997 }
3998
3999 #[test]
4000 fn test_syn_sent_syn_ack() {
4001 let mut s = socket_syn_sent();
4002 recv!(
4003 s,
4004 [TcpRepr {
4005 control: TcpControl::Syn,
4006 seq_number: LOCAL_SEQ,
4007 ack_number: None,
4008 max_seg_size: Some(BASE_MSS),
4009 window_scale: Some(0),
4010 sack_permitted: true,
4011 ..RECV_TEMPL
4012 }]
4013 );
4014 send!(
4015 s,
4016 TcpRepr {
4017 control: TcpControl::Syn,
4018 seq_number: REMOTE_SEQ,
4019 ack_number: Some(LOCAL_SEQ + 1),
4020 max_seg_size: Some(BASE_MSS - 80),
4021 window_scale: Some(0),
4022 ..SEND_TEMPL
4023 }
4024 );
4025 recv!(
4026 s,
4027 [TcpRepr {
4028 seq_number: LOCAL_SEQ + 1,
4029 ack_number: Some(REMOTE_SEQ + 1),
4030 ..RECV_TEMPL
4031 }]
4032 );
4033 recv_nothing!(s, time 1000);
4034 assert_eq!(s.state, State::Established);
4035 sanity!(s, socket_established());
4036 }
4037
4038 #[test]
4039 fn test_syn_sent_syn_received_ack() {
4040 let mut s = socket_syn_sent();
4041 recv!(
4042 s,
4043 [TcpRepr {
4044 control: TcpControl::Syn,
4045 seq_number: LOCAL_SEQ,
4046 ack_number: None,
4047 max_seg_size: Some(BASE_MSS),
4048 window_scale: Some(0),
4049 sack_permitted: true,
4050 ..RECV_TEMPL
4051 }]
4052 );
4053
4054 send!(
4056 s,
4057 TcpRepr {
4058 control: TcpControl::Syn,
4059 seq_number: REMOTE_SEQ,
4060 ack_number: None,
4061 max_seg_size: Some(BASE_MSS - 80),
4062 window_scale: Some(0),
4063 ..SEND_TEMPL
4064 }
4065 );
4066 assert_eq!(s.state, State::SynReceived);
4067
4068 recv!(
4070 s,
4071 [TcpRepr {
4072 control: TcpControl::Syn,
4073 seq_number: LOCAL_SEQ,
4074 ack_number: Some(REMOTE_SEQ + 1),
4075 max_seg_size: Some(BASE_MSS),
4076 window_scale: Some(0),
4077 ..RECV_TEMPL
4078 }]
4079 );
4080 recv_nothing!(s);
4081
4082 recv!(
4084 s,
4085 time 1001,
4086 Ok(TcpRepr {
4087 control: TcpControl::Syn,
4088 seq_number: LOCAL_SEQ,
4089 ack_number: Some(REMOTE_SEQ + 1),
4090 max_seg_size: Some(BASE_MSS),
4091 window_scale: Some(0),
4092 ..RECV_TEMPL
4093 })
4094 );
4095
4096 send!(
4098 s,
4099 TcpRepr {
4100 control: TcpControl::None,
4101 seq_number: REMOTE_SEQ + 1,
4102 ack_number: Some(LOCAL_SEQ + 1),
4103 ..SEND_TEMPL
4104 }
4105 );
4106 assert_eq!(s.state, State::Established);
4107 sanity!(s, socket_established());
4108 }
4109
4110 #[test]
4111 fn test_syn_sent_syn_ack_not_incremented() {
4112 let mut s = socket_syn_sent();
4113 recv!(
4114 s,
4115 [TcpRepr {
4116 control: TcpControl::Syn,
4117 seq_number: LOCAL_SEQ,
4118 ack_number: None,
4119 max_seg_size: Some(BASE_MSS),
4120 window_scale: Some(0),
4121 sack_permitted: true,
4122 ..RECV_TEMPL
4123 }]
4124 );
4125 send!(
4126 s,
4127 TcpRepr {
4128 control: TcpControl::Syn,
4129 seq_number: REMOTE_SEQ,
4130 ack_number: Some(LOCAL_SEQ), max_seg_size: Some(BASE_MSS - 80),
4132 window_scale: Some(0),
4133 ..SEND_TEMPL
4134 },
4135 Some(TcpRepr {
4136 control: TcpControl::Rst,
4137 seq_number: LOCAL_SEQ,
4138 ack_number: None,
4139 window_len: 0,
4140 ..RECV_TEMPL
4141 })
4142 );
4143 assert_eq!(s.state, State::SynSent);
4144 }
4145
4146 #[test]
4147 fn test_syn_sent_syn_received_rst() {
4148 let mut s = socket_syn_sent();
4149 recv!(
4150 s,
4151 [TcpRepr {
4152 control: TcpControl::Syn,
4153 seq_number: LOCAL_SEQ,
4154 ack_number: None,
4155 max_seg_size: Some(BASE_MSS),
4156 window_scale: Some(0),
4157 sack_permitted: true,
4158 ..RECV_TEMPL
4159 }]
4160 );
4161
4162 send!(
4164 s,
4165 TcpRepr {
4166 control: TcpControl::Syn,
4167 seq_number: REMOTE_SEQ,
4168 ack_number: None,
4169 max_seg_size: Some(BASE_MSS - 80),
4170 window_scale: Some(0),
4171 ..SEND_TEMPL
4172 }
4173 );
4174 assert_eq!(s.state, State::SynReceived);
4175
4176 send!(
4178 s,
4179 TcpRepr {
4180 control: TcpControl::Rst,
4181 seq_number: REMOTE_SEQ + 1,
4182 ack_number: Some(LOCAL_SEQ),
4183 ..SEND_TEMPL
4184 }
4185 );
4186 assert_eq!(s.state, State::Closed);
4187 }
4188
4189 #[test]
4190 fn test_syn_sent_rst() {
4191 let mut s = socket_syn_sent();
4192 send!(
4193 s,
4194 TcpRepr {
4195 control: TcpControl::Rst,
4196 seq_number: REMOTE_SEQ,
4197 ack_number: Some(LOCAL_SEQ + 1),
4198 ..SEND_TEMPL
4199 }
4200 );
4201 assert_eq!(s.state, State::Closed);
4202 }
4203
4204 #[test]
4205 fn test_syn_sent_rst_no_ack() {
4206 let mut s = socket_syn_sent();
4207 send!(
4208 s,
4209 TcpRepr {
4210 control: TcpControl::Rst,
4211 seq_number: REMOTE_SEQ,
4212 ack_number: None,
4213 ..SEND_TEMPL
4214 }
4215 );
4216 assert_eq!(s.state, State::SynSent);
4217 }
4218
4219 #[test]
4220 fn test_syn_sent_rst_bad_ack() {
4221 let mut s = socket_syn_sent();
4222 send!(
4223 s,
4224 TcpRepr {
4225 control: TcpControl::Rst,
4226 seq_number: REMOTE_SEQ,
4227 ack_number: Some(TcpSeqNumber(1234)),
4228 ..SEND_TEMPL
4229 }
4230 );
4231 assert_eq!(s.state, State::SynSent);
4232 }
4233
4234 #[test]
4235 fn test_syn_sent_bad_ack() {
4236 let mut s = socket_syn_sent();
4237 recv!(
4238 s,
4239 [TcpRepr {
4240 control: TcpControl::Syn,
4241 seq_number: LOCAL_SEQ,
4242 ack_number: None,
4243 max_seg_size: Some(BASE_MSS),
4244 window_scale: Some(0),
4245 sack_permitted: true,
4246 ..RECV_TEMPL
4247 }]
4248 );
4249 send!(
4250 s,
4251 TcpRepr {
4252 control: TcpControl::None, seq_number: REMOTE_SEQ,
4254 ack_number: Some(LOCAL_SEQ + 1), ..SEND_TEMPL
4256 }
4257 );
4258
4259 recv!(s, []);
4261 assert_eq!(s.state, State::SynSent);
4262 }
4263
4264 #[test]
4265 fn test_syn_sent_bad_ack_seq_1() {
4266 let mut s = socket_syn_sent();
4267 recv!(
4268 s,
4269 [TcpRepr {
4270 control: TcpControl::Syn,
4271 seq_number: LOCAL_SEQ,
4272 ack_number: None,
4273 max_seg_size: Some(BASE_MSS),
4274 window_scale: Some(0),
4275 sack_permitted: true,
4276 ..RECV_TEMPL
4277 }]
4278 );
4279 send!(
4280 s,
4281 TcpRepr {
4282 control: TcpControl::None,
4283 seq_number: REMOTE_SEQ,
4284 ack_number: Some(LOCAL_SEQ), ..SEND_TEMPL
4286 },
4287 Some(TcpRepr {
4288 control: TcpControl::Rst,
4289 seq_number: LOCAL_SEQ, ack_number: None,
4291 window_len: 0,
4292 ..RECV_TEMPL
4293 })
4294 );
4295
4296 assert_eq!(s.state, State::SynSent);
4298 }
4299
4300 #[test]
4301 fn test_syn_sent_bad_ack_seq_2() {
4302 let mut s = socket_syn_sent();
4303 recv!(
4304 s,
4305 [TcpRepr {
4306 control: TcpControl::Syn,
4307 seq_number: LOCAL_SEQ,
4308 ack_number: None,
4309 max_seg_size: Some(BASE_MSS),
4310 window_scale: Some(0),
4311 sack_permitted: true,
4312 ..RECV_TEMPL
4313 }]
4314 );
4315 send!(
4316 s,
4317 TcpRepr {
4318 control: TcpControl::None,
4319 seq_number: REMOTE_SEQ,
4320 ack_number: Some(LOCAL_SEQ + 123456), ..SEND_TEMPL
4322 },
4323 Some(TcpRepr {
4324 control: TcpControl::Rst,
4325 seq_number: LOCAL_SEQ + 123456, ack_number: None,
4327 window_len: 0,
4328 ..RECV_TEMPL
4329 })
4330 );
4331
4332 assert_eq!(s.state, State::SynSent);
4334 }
4335
4336 #[test]
4337 fn test_syn_sent_close() {
4338 let mut s = socket();
4339 s.close();
4340 assert_eq!(s.state, State::Closed);
4341 }
4342
4343 #[test]
4344 fn test_syn_sent_sack_option() {
4345 let mut s = socket_syn_sent();
4346 recv!(
4347 s,
4348 [TcpRepr {
4349 control: TcpControl::Syn,
4350 seq_number: LOCAL_SEQ,
4351 ack_number: None,
4352 max_seg_size: Some(BASE_MSS),
4353 window_scale: Some(0),
4354 sack_permitted: true,
4355 ..RECV_TEMPL
4356 }]
4357 );
4358 send!(
4359 s,
4360 TcpRepr {
4361 control: TcpControl::Syn,
4362 seq_number: REMOTE_SEQ,
4363 ack_number: Some(LOCAL_SEQ + 1),
4364 max_seg_size: Some(BASE_MSS - 80),
4365 window_scale: Some(0),
4366 sack_permitted: true,
4367 ..SEND_TEMPL
4368 }
4369 );
4370 assert!(s.remote_has_sack);
4371
4372 let mut s = socket_syn_sent();
4373 recv!(
4374 s,
4375 [TcpRepr {
4376 control: TcpControl::Syn,
4377 seq_number: LOCAL_SEQ,
4378 ack_number: None,
4379 max_seg_size: Some(BASE_MSS),
4380 window_scale: Some(0),
4381 sack_permitted: true,
4382 ..RECV_TEMPL
4383 }]
4384 );
4385 send!(
4386 s,
4387 TcpRepr {
4388 control: TcpControl::Syn,
4389 seq_number: REMOTE_SEQ,
4390 ack_number: Some(LOCAL_SEQ + 1),
4391 max_seg_size: Some(BASE_MSS - 80),
4392 window_scale: Some(0),
4393 sack_permitted: false,
4394 ..SEND_TEMPL
4395 }
4396 );
4397 assert!(!s.remote_has_sack);
4398 }
4399
4400 #[test]
4401 fn test_syn_sent_win_scale_buffers() {
4402 for (buffer_size, shift_amt) in &[
4403 (64, 0),
4404 (128, 0),
4405 (1024, 0),
4406 (65535, 0),
4407 (65536, 1),
4408 (65537, 1),
4409 (131071, 1),
4410 (131072, 2),
4411 (524287, 3),
4412 (524288, 4),
4413 (655350, 4),
4414 (1048576, 5),
4415 ] {
4416 let mut s = socket_with_buffer_sizes(64, *buffer_size);
4417 s.local_seq_no = LOCAL_SEQ;
4418 assert_eq!(s.remote_win_shift, *shift_amt);
4419 s.socket.connect(&mut s.cx, REMOTE_END, LOCAL_END).unwrap();
4420 recv!(
4421 s,
4422 [TcpRepr {
4423 control: TcpControl::Syn,
4424 seq_number: LOCAL_SEQ,
4425 ack_number: None,
4426 max_seg_size: Some(BASE_MSS),
4427 window_scale: Some(*shift_amt),
4428 window_len: u16::try_from(*buffer_size).unwrap_or(u16::MAX),
4429 sack_permitted: true,
4430 ..RECV_TEMPL
4431 }]
4432 );
4433 }
4434 }
4435
4436 #[test]
4437 fn test_syn_sent_syn_ack_no_window_scaling() {
4438 let mut s = socket_syn_sent_with_buffer_sizes(1048576, 1048576);
4439 recv!(
4440 s,
4441 [TcpRepr {
4442 control: TcpControl::Syn,
4443 seq_number: LOCAL_SEQ,
4444 ack_number: None,
4445 max_seg_size: Some(BASE_MSS),
4446 window_len: 65535,
4448 window_scale: Some(5),
4449 sack_permitted: true,
4450 ..RECV_TEMPL
4451 }]
4452 );
4453 assert_eq!(s.remote_win_shift, 5);
4454 send!(
4455 s,
4456 TcpRepr {
4457 control: TcpControl::Syn,
4458 seq_number: REMOTE_SEQ,
4459 ack_number: Some(LOCAL_SEQ + 1),
4460 max_seg_size: Some(BASE_MSS - 80),
4461 window_scale: None,
4462 window_len: 42,
4463 ..SEND_TEMPL
4464 }
4465 );
4466 assert_eq!(s.state, State::Established);
4467 assert_eq!(s.remote_win_shift, 0);
4468 assert_eq!(s.remote_win_scale, None);
4469 assert_eq!(s.remote_win_len, 42);
4470 }
4471
4472 #[test]
4473 fn test_syn_sent_syn_ack_window_scaling() {
4474 let mut s = socket_syn_sent();
4475 recv!(
4476 s,
4477 [TcpRepr {
4478 control: TcpControl::Syn,
4479 seq_number: LOCAL_SEQ,
4480 ack_number: None,
4481 max_seg_size: Some(BASE_MSS),
4482 window_scale: Some(0),
4483 sack_permitted: true,
4484 ..RECV_TEMPL
4485 }]
4486 );
4487 send!(
4488 s,
4489 TcpRepr {
4490 control: TcpControl::Syn,
4491 seq_number: REMOTE_SEQ,
4492 ack_number: Some(LOCAL_SEQ + 1),
4493 max_seg_size: Some(BASE_MSS - 80),
4494 window_scale: Some(7),
4495 window_len: 42,
4496 ..SEND_TEMPL
4497 }
4498 );
4499 assert_eq!(s.state, State::Established);
4500 assert_eq!(s.remote_win_scale, Some(7));
4501 assert_eq!(s.remote_win_len, 42);
4503 }
4504
4505 #[test]
4510 fn test_established_recv() {
4511 let mut s = socket_established();
4512 send!(
4513 s,
4514 TcpRepr {
4515 seq_number: REMOTE_SEQ + 1,
4516 ack_number: Some(LOCAL_SEQ + 1),
4517 payload: &b"abcdef"[..],
4518 ..SEND_TEMPL
4519 }
4520 );
4521 recv!(
4522 s,
4523 [TcpRepr {
4524 seq_number: LOCAL_SEQ + 1,
4525 ack_number: Some(REMOTE_SEQ + 1 + 6),
4526 window_len: 58,
4527 ..RECV_TEMPL
4528 }]
4529 );
4530 assert_eq!(s.rx_buffer.dequeue_many(6), &b"abcdef"[..]);
4531 }
4532
4533 #[test]
4534 fn test_peek_slice() {
4535 const BUF_SIZE: usize = 10;
4536
4537 let send_buf = b"0123456";
4538
4539 let mut s = socket_established_with_buffer_sizes(BUF_SIZE, BUF_SIZE);
4540
4541 send!(
4543 s,
4544 TcpRepr {
4545 seq_number: REMOTE_SEQ + 1,
4546 ack_number: Some(LOCAL_SEQ + 1),
4547 payload: &send_buf[..],
4548 ..SEND_TEMPL
4549 }
4550 );
4551
4552 let mut peeked_buf = [0u8; BUF_SIZE];
4554 let actually_peeked = s.peek_slice(&mut peeked_buf[..]).unwrap();
4555 let mut recv_buf = [0u8; BUF_SIZE];
4556 let actually_recvd = s.recv_slice(&mut recv_buf[..]).unwrap();
4557 assert_eq!(
4558 &mut peeked_buf[..actually_peeked],
4559 &mut recv_buf[..actually_recvd]
4560 );
4561 }
4562
4563 #[test]
4564 fn test_peek_slice_buffer_wrap() {
4565 const BUF_SIZE: usize = 10;
4566
4567 let send_buf = b"0123456789";
4568
4569 let mut s = socket_established_with_buffer_sizes(BUF_SIZE, BUF_SIZE);
4570
4571 let _ = s.rx_buffer.enqueue_slice(&send_buf[..8]);
4572 let _ = s.rx_buffer.dequeue_many(6);
4573 let _ = s.rx_buffer.enqueue_slice(&send_buf[..5]);
4574
4575 let mut peeked_buf = [0u8; BUF_SIZE];
4576 let actually_peeked = s.peek_slice(&mut peeked_buf[..]).unwrap();
4577 let mut recv_buf = [0u8; BUF_SIZE];
4578 let actually_recvd = s.recv_slice(&mut recv_buf[..]).unwrap();
4579 assert_eq!(
4580 &mut peeked_buf[..actually_peeked],
4581 &mut recv_buf[..actually_recvd]
4582 );
4583 }
4584
4585 fn setup_rfc2018_cases() -> (TestSocket, Vec<u8>) {
4586 let mut s = socket_established_with_buffer_sizes(4000, 4000);
4592 s.remote_has_sack = true;
4593
4594 let mut segment: Vec<u8> = Vec::with_capacity(500);
4596
4597 for _ in 0..50 {
4599 segment.extend_from_slice(b"abcdefghij")
4600 }
4601 for offset in (0..5000).step_by(500) {
4602 send!(
4603 s,
4604 TcpRepr {
4605 seq_number: REMOTE_SEQ + 1 + offset,
4606 ack_number: Some(LOCAL_SEQ + 1),
4607 payload: &segment,
4608 ..SEND_TEMPL
4609 }
4610 );
4611 recv!(
4612 s,
4613 [TcpRepr {
4614 seq_number: LOCAL_SEQ + 1,
4615 ack_number: Some(REMOTE_SEQ + 1 + offset + 500),
4616 window_len: 3500,
4617 ..RECV_TEMPL
4618 }]
4619 );
4620 s.recv(|data| {
4621 assert_eq!(data.len(), 500);
4622 assert_eq!(data, segment.as_slice());
4623 (500, ())
4624 })
4625 .unwrap();
4626 }
4627 assert_eq!(s.remote_last_win, 3500);
4628 (s, segment)
4629 }
4630
4631 #[test]
4632 fn test_established_rfc2018_cases() {
4633 let (mut s, segment) = setup_rfc2018_cases();
4637 for offset in (500..3500).step_by(500) {
4658 send!(
4659 s,
4660 TcpRepr {
4661 seq_number: REMOTE_SEQ + 1 + offset + 5000,
4662 ack_number: Some(LOCAL_SEQ + 1),
4663 payload: &segment,
4664 ..SEND_TEMPL
4665 },
4666 Some(TcpRepr {
4667 seq_number: LOCAL_SEQ + 1,
4668 ack_number: Some(REMOTE_SEQ + 1 + 5000),
4669 window_len: 4000,
4670 sack_ranges: [
4671 Some((
4672 REMOTE_SEQ.0 as u32 + 1 + 5500,
4673 REMOTE_SEQ.0 as u32 + 1 + 5500 + offset as u32
4674 )),
4675 None,
4676 None
4677 ],
4678 ..RECV_TEMPL
4679 })
4680 );
4681 }
4682 }
4683
4684 #[test]
4685 fn test_established_sack_no_overflow_on_near_max_seqnumber() {
4686 let mut s = socket_established();
4687 s.remote_has_sack = true;
4688 s.remote_seq_no = TcpSeqNumber(-4);
4689 s.remote_last_ack = Some(TcpSeqNumber(-4));
4690
4691 send!(
4694 s,
4695 TcpRepr {
4696 seq_number: TcpSeqNumber(-4 + 10),
4697 ack_number: Some(LOCAL_SEQ + 1),
4698 payload: &b"AAAAAAAAAA"[..],
4699 ..SEND_TEMPL
4700 },
4701 Some(TcpRepr {
4702 seq_number: LOCAL_SEQ + 1,
4703 ack_number: Some(TcpSeqNumber(-4)),
4704 window_len: 64,
4705 sack_ranges: [
4706 Some(((-4_i32 + 10) as u32, (-4_i32 + 20) as u32,)),
4707 None,
4708 None,
4709 ],
4710 ..RECV_TEMPL
4711 })
4712 );
4713 }
4714
4715 #[test]
4716 fn test_established_sliding_window_recv() {
4717 let mut s = socket_established();
4718 assert_eq!(s.rx_buffer.len(), 0);
4720 s.rx_buffer = SocketBuffer::new(vec![0; 262143]);
4721 s.assembler = Assembler::new();
4722 s.remote_win_scale = Some(0);
4723 s.remote_last_win = 65535;
4724 s.remote_win_shift = 2;
4725
4726 let mut segment: Vec<u8> = Vec::with_capacity(1400);
4728 for _ in 0..100 {
4729 segment.extend_from_slice(b"abcdefghijklmn")
4730 }
4731 assert_eq!(segment.len(), 1400);
4732
4733 send!(
4735 s,
4736 TcpRepr {
4737 seq_number: REMOTE_SEQ + 1,
4738 ack_number: Some(LOCAL_SEQ + 1),
4739 payload: &segment,
4740 ..SEND_TEMPL
4741 }
4742 );
4743
4744 recv!(
4746 s,
4747 [TcpRepr {
4748 seq_number: LOCAL_SEQ + 1,
4749 ack_number: Some(REMOTE_SEQ + 1 + 1400),
4750 window_len: 65185,
4751 ..RECV_TEMPL
4752 }]
4753 );
4754 }
4755
4756 #[test]
4757 fn test_established_send() {
4758 let mut s = socket_established();
4759 s.send_slice(b"abcdef").unwrap();
4761 recv!(
4762 s,
4763 [TcpRepr {
4764 seq_number: LOCAL_SEQ + 1,
4765 ack_number: Some(REMOTE_SEQ + 1),
4766 payload: &b"abcdef"[..],
4767 ..RECV_TEMPL
4768 }]
4769 );
4770 assert_eq!(s.tx_buffer.len(), 6);
4771 send!(
4772 s,
4773 TcpRepr {
4774 seq_number: REMOTE_SEQ + 1,
4775 ack_number: Some(LOCAL_SEQ + 1 + 6),
4776 ..SEND_TEMPL
4777 }
4778 );
4779 assert_eq!(s.tx_buffer.len(), 0);
4780 s.send_slice(b"foobar").unwrap();
4782 recv!(
4783 s,
4784 [TcpRepr {
4785 seq_number: LOCAL_SEQ + 1 + 6,
4786 ack_number: Some(REMOTE_SEQ + 1),
4787 payload: &b"foobar"[..],
4788 ..RECV_TEMPL
4789 }]
4790 );
4791 send!(
4792 s,
4793 TcpRepr {
4794 seq_number: REMOTE_SEQ + 1,
4795 ack_number: Some(LOCAL_SEQ + 1 + 6 + 6),
4796 ..SEND_TEMPL
4797 }
4798 );
4799 assert_eq!(s.tx_buffer.len(), 0);
4800 }
4801
4802 #[test]
4803 fn test_established_send_no_ack_send() {
4804 let mut s = socket_established();
4805 s.set_nagle_enabled(false);
4806 s.send_slice(b"abcdef").unwrap();
4807 recv!(
4808 s,
4809 [TcpRepr {
4810 seq_number: LOCAL_SEQ + 1,
4811 ack_number: Some(REMOTE_SEQ + 1),
4812 payload: &b"abcdef"[..],
4813 ..RECV_TEMPL
4814 }]
4815 );
4816 s.send_slice(b"foobar").unwrap();
4817 recv!(
4818 s,
4819 [TcpRepr {
4820 seq_number: LOCAL_SEQ + 1 + 6,
4821 ack_number: Some(REMOTE_SEQ + 1),
4822 payload: &b"foobar"[..],
4823 ..RECV_TEMPL
4824 }]
4825 );
4826 }
4827
4828 #[test]
4829 fn test_established_send_buf_gt_win() {
4830 let mut data = [0; 32];
4831 for (i, elem) in data.iter_mut().enumerate() {
4832 *elem = i as u8
4833 }
4834
4835 let mut s = socket_established();
4836 s.remote_win_len = 16;
4837 s.send_slice(&data[..]).unwrap();
4838 recv!(
4839 s,
4840 [TcpRepr {
4841 seq_number: LOCAL_SEQ + 1,
4842 ack_number: Some(REMOTE_SEQ + 1),
4843 payload: &data[0..16],
4844 ..RECV_TEMPL
4845 }]
4846 );
4847 }
4848
4849 #[test]
4850 fn test_established_send_window_shrink() {
4851 let mut s = socket_established();
4852
4853 s.send_slice(b"abcdef").unwrap();
4855 recv!(
4856 s,
4857 [TcpRepr {
4858 seq_number: LOCAL_SEQ + 1,
4859 ack_number: Some(REMOTE_SEQ + 1),
4860 payload: &b"abcdef"[..],
4861 ..RECV_TEMPL
4862 }]
4863 );
4864 assert_eq!(s.tx_buffer.len(), 6);
4865
4866 println!(
4867 "local_seq_no={} remote_win_len={} remote_last_seq={}",
4868 s.local_seq_no, s.remote_win_len, s.remote_last_seq
4869 );
4870
4871 send!(
4876 s,
4877 TcpRepr {
4878 seq_number: REMOTE_SEQ + 1,
4879 ack_number: Some(LOCAL_SEQ + 1),
4880 window_len: 3,
4881 payload: &b"xyzxyz"[..],
4882 ..SEND_TEMPL
4883 }
4884 );
4885 assert_eq!(s.tx_buffer.len(), 6);
4886
4887 println!(
4888 "local_seq_no={} remote_win_len={} remote_last_seq={}",
4889 s.local_seq_no, s.remote_win_len, s.remote_last_seq
4890 );
4891
4892 s.send_slice(b"foobar").unwrap();
4894 recv!(
4895 s,
4896 [TcpRepr {
4897 seq_number: LOCAL_SEQ + 1 + 6,
4898 ack_number: Some(REMOTE_SEQ + 1 + 6),
4899 window_len: 64 - 6,
4900 ..RECV_TEMPL
4901 }]
4902 );
4903 }
4904
4905 #[test]
4906 fn test_established_receive_partially_outside_window() {
4907 let mut s = socket_established();
4908
4909 send!(
4910 s,
4911 TcpRepr {
4912 seq_number: REMOTE_SEQ + 1,
4913 ack_number: Some(LOCAL_SEQ + 1),
4914 payload: &b"abc"[..],
4915 ..SEND_TEMPL
4916 }
4917 );
4918
4919 s.recv(|data| {
4920 assert_eq!(data, b"abc");
4921 (3, ())
4922 })
4923 .unwrap();
4924
4925 send!(
4928 s,
4929 TcpRepr {
4930 seq_number: REMOTE_SEQ + 1,
4931 ack_number: Some(LOCAL_SEQ + 1),
4932 payload: &b"abcdef"[..],
4933 ..SEND_TEMPL
4934 }
4935 );
4936
4937 s.recv(|data| {
4938 assert_eq!(data, b"def");
4939 (3, ())
4940 })
4941 .unwrap();
4942 }
4943
4944 #[test]
4945 fn test_established_receive_partially_outside_window_fin() {
4946 let mut s = socket_established();
4947
4948 send!(
4949 s,
4950 TcpRepr {
4951 seq_number: REMOTE_SEQ + 1,
4952 ack_number: Some(LOCAL_SEQ + 1),
4953 payload: &b"abc"[..],
4954 ..SEND_TEMPL
4955 }
4956 );
4957
4958 s.recv(|data| {
4959 assert_eq!(data, b"abc");
4960 (3, ())
4961 })
4962 .unwrap();
4963
4964 send!(
4967 s,
4968 TcpRepr {
4969 seq_number: REMOTE_SEQ + 1,
4970 ack_number: Some(LOCAL_SEQ + 1),
4971 control: TcpControl::Fin,
4972 payload: &b"abcdef"[..],
4973 ..SEND_TEMPL
4974 }
4975 );
4976
4977 s.recv(|data| {
4978 assert_eq!(data, b"def");
4979 (3, ())
4980 })
4981 .unwrap();
4982
4983 assert_eq!(s.state, State::CloseWait);
4986 }
4987
4988 #[test]
4989 fn test_established_send_wrap() {
4990 let mut s = socket_established();
4991 let local_seq_start = TcpSeqNumber(i32::MAX - 1);
4992 s.local_seq_no = local_seq_start + 1;
4993 s.remote_last_seq = local_seq_start + 1;
4994 s.send_slice(b"abc").unwrap();
4995 recv!(s, time 1000, Ok(TcpRepr {
4996 seq_number: local_seq_start + 1,
4997 ack_number: Some(REMOTE_SEQ + 1),
4998 payload: &b"abc"[..],
4999 ..RECV_TEMPL
5000 }));
5001 }
5002
5003 #[test]
5004 fn test_established_no_ack() {
5005 let mut s = socket_established();
5006 send!(
5007 s,
5008 TcpRepr {
5009 seq_number: REMOTE_SEQ + 1,
5010 ack_number: None,
5011 ..SEND_TEMPL
5012 }
5013 );
5014 }
5015
5016 #[test]
5017 fn test_established_bad_ack() {
5018 let mut s = socket_established();
5019 send!(
5021 s,
5022 TcpRepr {
5023 seq_number: REMOTE_SEQ + 1,
5024 ack_number: Some(TcpSeqNumber(LOCAL_SEQ.0 - 1)),
5025 ..SEND_TEMPL
5026 }
5027 );
5028 assert_eq!(s.local_seq_no, LOCAL_SEQ + 1);
5029 send!(
5031 s,
5032 TcpRepr {
5033 seq_number: REMOTE_SEQ + 1,
5034 ack_number: Some(LOCAL_SEQ + 10),
5035 ..SEND_TEMPL
5036 },
5037 Some(TcpRepr {
5038 seq_number: LOCAL_SEQ + 1,
5039 ack_number: Some(REMOTE_SEQ + 1),
5040 ..RECV_TEMPL
5041 })
5042 );
5043 assert_eq!(s.local_seq_no, LOCAL_SEQ + 1);
5044 }
5045
5046 #[test]
5047 fn test_established_bad_seq() {
5048 let mut s = socket_established();
5049 send!(
5051 s,
5052 TcpRepr {
5053 seq_number: REMOTE_SEQ + 1 + 256,
5054 ack_number: Some(LOCAL_SEQ + 1),
5055 ..SEND_TEMPL
5056 },
5057 Some(TcpRepr {
5058 seq_number: LOCAL_SEQ + 1,
5059 ack_number: Some(REMOTE_SEQ + 1),
5060 ..RECV_TEMPL
5061 })
5062 );
5063 assert_eq!(s.remote_seq_no, REMOTE_SEQ + 1);
5064
5065 send!(
5067 s,
5068 time 100,
5069 TcpRepr {
5070 seq_number: REMOTE_SEQ + 1 + 256,
5071 ack_number: Some(LOCAL_SEQ + 1),
5072 ..SEND_TEMPL
5073 }
5074 );
5075
5076 send!(
5078 s,
5079 time 2000,
5080 TcpRepr {
5081 seq_number: REMOTE_SEQ + 1 + 256,
5082 ack_number: Some(LOCAL_SEQ + 1),
5083 ..SEND_TEMPL
5084 },
5085 Some(TcpRepr {
5086 seq_number: LOCAL_SEQ + 1,
5087 ack_number: Some(REMOTE_SEQ + 1),
5088 ..RECV_TEMPL
5089 })
5090 );
5091 assert_eq!(s.remote_seq_no, REMOTE_SEQ + 1);
5092 }
5093
5094 #[test]
5095 fn test_old_data_ack_not_rate_limited() {
5096 let mut s = socket_established();
5097 send!(
5098 s,
5099 TcpRepr {
5100 seq_number: REMOTE_SEQ + 1,
5101 ack_number: Some(LOCAL_SEQ + 1),
5102 payload: &b"abcdef"[..],
5103 ..SEND_TEMPL
5104 }
5105 );
5106 recv!(
5107 s,
5108 [TcpRepr {
5109 seq_number: LOCAL_SEQ + 1,
5110 ack_number: Some(REMOTE_SEQ + 1 + 6),
5111 window_len: 58,
5112 ..RECV_TEMPL
5113 }]
5114 );
5115 s.recv(|data| {
5116 assert_eq!(data, b"abcdef");
5117 (6, ())
5118 })
5119 .unwrap();
5120 send!(
5125 s,
5126 time 100,
5127 TcpRepr {
5128 seq_number: REMOTE_SEQ + 1,
5129 ack_number: Some(LOCAL_SEQ + 1),
5130 payload: &b"abcdef"[..],
5131 ..SEND_TEMPL
5132 },
5133 Some(TcpRepr {
5134 seq_number: LOCAL_SEQ + 1,
5135 ack_number: Some(REMOTE_SEQ + 1 + 6),
5136 ..RECV_TEMPL
5137 })
5138 );
5139 send!(
5140 s,
5141 time 200,
5142 TcpRepr {
5143 seq_number: REMOTE_SEQ + 1,
5144 ack_number: Some(LOCAL_SEQ + 1),
5145 payload: &b"abcdef"[..],
5146 ..SEND_TEMPL
5147 },
5148 Some(TcpRepr {
5149 seq_number: LOCAL_SEQ + 1,
5150 ack_number: Some(REMOTE_SEQ + 1 + 6),
5151 ..RECV_TEMPL
5152 })
5153 );
5154 }
5155
5156 #[test]
5157 fn test_bad_seq_rst_dropped_silently() {
5158 let mut s = socket_established();
5159 send!(
5162 s,
5163 TcpRepr {
5164 control: TcpControl::Rst,
5165 seq_number: REMOTE_SEQ + 1 + 256,
5166 ack_number: Some(LOCAL_SEQ + 1),
5167 ..SEND_TEMPL
5168 }
5169 );
5170 assert_eq!(s.state, State::Established);
5171
5172 send!(
5175 s,
5176 time 100,
5177 TcpRepr {
5178 control: TcpControl::Rst,
5179 seq_number: REMOTE_SEQ + 1 + 256,
5180 ack_number: Some(LOCAL_SEQ + 1),
5181 payload: &b"abcdef"[..],
5182 ..SEND_TEMPL
5183 }
5184 );
5185 assert_eq!(s.state, State::Established);
5186 }
5187
5188 #[test]
5189 fn test_bad_seq_syn_with_data_rate_limited() {
5190 let mut s = socket_established();
5191 send!(
5195 s,
5196 TcpRepr {
5197 control: TcpControl::Syn,
5198 seq_number: REMOTE_SEQ + 1 + 256,
5199 ack_number: Some(LOCAL_SEQ + 1),
5200 payload: &b"abcdef"[..],
5201 ..SEND_TEMPL
5202 },
5203 Some(TcpRepr {
5204 seq_number: LOCAL_SEQ + 1,
5205 ack_number: Some(REMOTE_SEQ + 1),
5206 ..RECV_TEMPL
5207 })
5208 );
5209
5210 send!(
5212 s,
5213 time 100,
5214 TcpRepr {
5215 control: TcpControl::Syn,
5216 seq_number: REMOTE_SEQ + 1 + 256,
5217 ack_number: Some(LOCAL_SEQ + 1),
5218 payload: &b"abcdef"[..],
5219 ..SEND_TEMPL
5220 }
5221 );
5222 assert_eq!(s.state, State::Established);
5223 }
5224
5225 #[test]
5226 fn test_established_options_reduce_payload_when_local_mss_limited() {
5227 const EFFECTIVE_MSS: usize = 64;
5228
5229 let mut s = socket_established();
5231 s.set_tsval_generator(Some(|| 1));
5232 s.remote_mss = EFFECTIVE_MSS;
5233
5234 s.send_slice(&[0; EFFECTIVE_MSS]).unwrap();
5236 recv!(
5237 s,
5238 [TcpRepr {
5239 seq_number: LOCAL_SEQ + 1,
5240 ack_number: Some(REMOTE_SEQ + 1),
5241 payload: &[0; EFFECTIVE_MSS - 12],
5242 timestamp: Some(TcpTimestampRepr::new(1, 0)),
5243 ..RECV_TEMPL
5244 }]
5245 );
5246 }
5247
5248 #[test]
5249 fn test_established_options_reduce_payload_when_remote_mss_limited() {
5250 const EFFECTIVE_MSS: usize = BASE_MSS as usize;
5251
5252 let mut s = socket_established_with_buffer_sizes(EFFECTIVE_MSS, 64);
5254 s.set_tsval_generator(Some(|| 1));
5255 s.remote_mss = 9999;
5256 s.remote_win_len = 9999;
5257
5258 s.send_slice(&[0; EFFECTIVE_MSS]).unwrap();
5260 recv!(
5261 s,
5262 [TcpRepr {
5263 seq_number: LOCAL_SEQ + 1,
5264 ack_number: Some(REMOTE_SEQ + 1),
5265 payload: &[0; EFFECTIVE_MSS - 12],
5266 timestamp: Some(TcpTimestampRepr::new(1, 0)),
5267 ..RECV_TEMPL
5268 }]
5269 );
5270 }
5271
5272 #[test]
5273 fn test_established_tiny_mss_with_options_makes_progress() {
5274 let mut s = socket();
5279 s.set_tsval_generator(Some(|| 1));
5280 s.local_seq_no = LOCAL_SEQ;
5281 s.socket
5282 .connect(&mut s.cx, REMOTE_END, LOCAL_END.port)
5283 .unwrap();
5284 recv!(
5285 s,
5286 [TcpRepr {
5287 control: TcpControl::Syn,
5288 seq_number: LOCAL_SEQ,
5289 ack_number: None,
5290 max_seg_size: Some(BASE_MSS),
5291 window_scale: Some(0),
5292 sack_permitted: true,
5293 timestamp: Some(TcpTimestampRepr::new(1, 0)),
5294 ..RECV_TEMPL
5295 }]
5296 );
5297 send!(
5298 s,
5299 TcpRepr {
5300 control: TcpControl::Syn,
5301 seq_number: REMOTE_SEQ,
5302 ack_number: Some(LOCAL_SEQ + 1),
5303 max_seg_size: Some(10),
5304 window_scale: Some(0),
5305 timestamp: Some(TcpTimestampRepr::new(500, 1)),
5306 ..SEND_TEMPL
5307 }
5308 );
5309 assert_eq!(s.state, State::Established);
5310 assert_eq!(s.remote_mss, MIN_REMOTE_MSS);
5311
5312 s.send_slice(&[0; 64]).unwrap();
5313 recv!(
5314 s,
5315 [TcpRepr {
5316 seq_number: LOCAL_SEQ + 1,
5317 ack_number: Some(REMOTE_SEQ + 1),
5318 payload: &[0; MIN_REMOTE_MSS - 12],
5319 timestamp: Some(TcpTimestampRepr::new(1, 500)),
5320 ..RECV_TEMPL
5321 }]
5322 );
5323 }
5324
5325 #[test]
5326 fn test_established_fin() {
5327 let mut s = socket_established();
5328 send!(
5329 s,
5330 TcpRepr {
5331 control: TcpControl::Fin,
5332 seq_number: REMOTE_SEQ + 1,
5333 ack_number: Some(LOCAL_SEQ + 1),
5334 ..SEND_TEMPL
5335 }
5336 );
5337 recv!(
5338 s,
5339 [TcpRepr {
5340 seq_number: LOCAL_SEQ + 1,
5341 ack_number: Some(REMOTE_SEQ + 1 + 1),
5342 ..RECV_TEMPL
5343 }]
5344 );
5345 assert_eq!(s.state, State::CloseWait);
5346 sanity!(s, socket_close_wait());
5347 }
5348
5349 #[test]
5350 fn test_established_fin_after_missing() {
5351 let mut s = socket_established();
5352 send!(
5353 s,
5354 TcpRepr {
5355 control: TcpControl::Fin,
5356 seq_number: REMOTE_SEQ + 1 + 6,
5357 ack_number: Some(LOCAL_SEQ + 1),
5358 payload: &b"123456"[..],
5359 ..SEND_TEMPL
5360 },
5361 Some(TcpRepr {
5362 seq_number: LOCAL_SEQ + 1,
5363 ack_number: Some(REMOTE_SEQ + 1),
5364 ..RECV_TEMPL
5365 })
5366 );
5367 assert_eq!(s.state, State::Established);
5368 send!(
5369 s,
5370 TcpRepr {
5371 seq_number: REMOTE_SEQ + 1,
5372 ack_number: Some(LOCAL_SEQ + 1),
5373 payload: &b"abcdef"[..],
5374 ..SEND_TEMPL
5375 },
5376 Some(TcpRepr {
5377 seq_number: LOCAL_SEQ + 1,
5378 ack_number: Some(REMOTE_SEQ + 1 + 6 + 6),
5379 window_len: 52,
5380 ..RECV_TEMPL
5381 })
5382 );
5383 assert_eq!(s.state, State::Established);
5384 }
5385
5386 #[test]
5387 fn test_established_send_fin() {
5388 let mut s = socket_established();
5389 s.send_slice(b"abcdef").unwrap();
5390 send!(
5391 s,
5392 TcpRepr {
5393 control: TcpControl::Fin,
5394 seq_number: REMOTE_SEQ + 1,
5395 ack_number: Some(LOCAL_SEQ + 1),
5396 ..SEND_TEMPL
5397 }
5398 );
5399 assert_eq!(s.state, State::CloseWait);
5400 recv!(
5401 s,
5402 [TcpRepr {
5403 seq_number: LOCAL_SEQ + 1,
5404 ack_number: Some(REMOTE_SEQ + 1 + 1),
5405 payload: &b"abcdef"[..],
5406 ..RECV_TEMPL
5407 }]
5408 );
5409 }
5410
5411 #[test]
5412 fn test_established_rst() {
5413 let mut s = socket_established();
5414 send!(
5415 s,
5416 TcpRepr {
5417 control: TcpControl::Rst,
5418 seq_number: REMOTE_SEQ + 1,
5419 ack_number: Some(LOCAL_SEQ + 1),
5420 ..SEND_TEMPL
5421 }
5422 );
5423 assert_eq!(s.state, State::Closed);
5424 }
5425
5426 #[test]
5427 fn test_established_rst_no_ack() {
5428 let mut s = socket_established();
5429 send!(
5430 s,
5431 TcpRepr {
5432 control: TcpControl::Rst,
5433 seq_number: REMOTE_SEQ + 1,
5434 ack_number: None,
5435 ..SEND_TEMPL
5436 }
5437 );
5438 assert_eq!(s.state, State::Closed);
5439 }
5440
5441 #[test]
5442 fn test_established_close() {
5443 let mut s = socket_established();
5444 s.close();
5445 assert_eq!(s.state, State::FinWait1);
5446 sanity!(s, socket_fin_wait_1());
5447 }
5448
5449 #[test]
5450 fn test_established_abort() {
5451 let mut s = socket_established();
5452 s.abort();
5453 assert_eq!(s.state, State::Closed);
5454 recv!(
5455 s,
5456 [TcpRepr {
5457 control: TcpControl::Rst,
5458 seq_number: LOCAL_SEQ + 1,
5459 ack_number: Some(REMOTE_SEQ + 1),
5460 ..RECV_TEMPL
5461 }]
5462 );
5463 }
5464
5465 #[test]
5466 fn test_established_rst_bad_seq() {
5467 let mut s = socket_established();
5468 send!(
5471 s,
5472 TcpRepr {
5473 control: TcpControl::Rst,
5474 seq_number: REMOTE_SEQ, ack_number: None,
5476 ..SEND_TEMPL
5477 }
5478 );
5479
5480 assert_eq!(s.state, State::Established);
5481
5482 send!(
5484 s,
5485 time 2000,
5486 TcpRepr {
5487 control: TcpControl::Rst,
5488 seq_number: REMOTE_SEQ + 1, ack_number: None,
5490 ..SEND_TEMPL
5491 }
5492 );
5493
5494 assert_eq!(s.state, State::Closed);
5495 }
5496
5497 #[test]
5498 fn test_established_bad_seq_challenge_ack_updated() {
5499 let mut s = socket_established();
5500 send!(
5501 s,
5502 TcpRepr {
5503 seq_number: REMOTE_SEQ, ack_number: Some(LOCAL_SEQ + 1),
5505 ..SEND_TEMPL
5506 },
5507 Some(TcpRepr {
5508 seq_number: LOCAL_SEQ + 1,
5509 ack_number: Some(REMOTE_SEQ + 1),
5510 ..RECV_TEMPL
5511 })
5512 );
5513
5514 assert_eq!(s.state, State::Established);
5515
5516 send!(
5518 s,
5519 TcpRepr {
5520 seq_number: REMOTE_SEQ + 1, ack_number: Some(LOCAL_SEQ + 1),
5522 payload: &b"a"[..],
5523 ..SEND_TEMPL
5524 }
5525 );
5526
5527 send!(
5531 s,
5532 time 2000,
5533 TcpRepr {
5534 seq_number: REMOTE_SEQ, ack_number: Some(LOCAL_SEQ + 1),
5536 ..SEND_TEMPL
5537 },
5538 Some(TcpRepr {
5539 seq_number: LOCAL_SEQ + 1,
5540 ack_number: Some(REMOTE_SEQ + 2), window_len: 63,
5542 ..RECV_TEMPL
5543 })
5544 );
5545 }
5546
5547 #[test]
5552 fn test_fin_wait_1_fin_ack() {
5553 let mut s = socket_fin_wait_1();
5554 recv!(
5555 s,
5556 [TcpRepr {
5557 control: TcpControl::Fin,
5558 seq_number: LOCAL_SEQ + 1,
5559 ack_number: Some(REMOTE_SEQ + 1),
5560 ..RECV_TEMPL
5561 }]
5562 );
5563 send!(
5564 s,
5565 TcpRepr {
5566 seq_number: REMOTE_SEQ + 1,
5567 ack_number: Some(LOCAL_SEQ + 1 + 1),
5568 ..SEND_TEMPL
5569 }
5570 );
5571 assert_eq!(s.state, State::FinWait2);
5572 sanity!(s, socket_fin_wait_2());
5573 }
5574
5575 #[test]
5576 fn test_fin_wait_1_fin_fin() {
5577 let mut s = socket_fin_wait_1();
5578 recv!(
5579 s,
5580 [TcpRepr {
5581 control: TcpControl::Fin,
5582 seq_number: LOCAL_SEQ + 1,
5583 ack_number: Some(REMOTE_SEQ + 1),
5584 ..RECV_TEMPL
5585 }]
5586 );
5587 send!(
5588 s,
5589 TcpRepr {
5590 control: TcpControl::Fin,
5591 seq_number: REMOTE_SEQ + 1,
5592 ack_number: Some(LOCAL_SEQ + 1),
5593 ..SEND_TEMPL
5594 }
5595 );
5596 assert_eq!(s.state, State::Closing);
5597 sanity!(s, socket_closing());
5598 }
5599
5600 #[test]
5601 fn test_fin_wait_1_fin_with_data_queued() {
5602 let mut s = socket_established();
5603 s.remote_win_len = 6;
5604 s.send_slice(b"abcdef123456").unwrap();
5605 s.close();
5606 recv!(
5607 s,
5608 Ok(TcpRepr {
5609 seq_number: LOCAL_SEQ + 1,
5610 ack_number: Some(REMOTE_SEQ + 1),
5611 payload: &b"abcdef"[..],
5612 ..RECV_TEMPL
5613 })
5614 );
5615 send!(
5616 s,
5617 TcpRepr {
5618 seq_number: REMOTE_SEQ + 1,
5619 ack_number: Some(LOCAL_SEQ + 1 + 6),
5620 ..SEND_TEMPL
5621 }
5622 );
5623 assert_eq!(s.state, State::FinWait1);
5624 }
5625
5626 #[test]
5627 fn test_fin_wait_1_recv() {
5628 let mut s = socket_fin_wait_1();
5629 send!(
5630 s,
5631 TcpRepr {
5632 seq_number: REMOTE_SEQ + 1,
5633 ack_number: Some(LOCAL_SEQ + 1),
5634 payload: &b"abc"[..],
5635 ..SEND_TEMPL
5636 }
5637 );
5638 assert_eq!(s.state, State::FinWait1);
5639 s.recv(|data| {
5640 assert_eq!(data, b"abc");
5641 (3, ())
5642 })
5643 .unwrap();
5644 }
5645
5646 #[test]
5647 fn test_fin_wait_1_close() {
5648 let mut s = socket_fin_wait_1();
5649 s.close();
5650 assert_eq!(s.state, State::FinWait1);
5651 }
5652
5653 #[test]
5658 fn test_fin_wait_2_fin() {
5659 let mut s = socket_fin_wait_2();
5660 send!(s, time 1_000, TcpRepr {
5661 control: TcpControl::Fin,
5662 seq_number: REMOTE_SEQ + 1,
5663 ack_number: Some(LOCAL_SEQ + 1 + 1),
5664 ..SEND_TEMPL
5665 });
5666 assert_eq!(s.state, State::TimeWait);
5667 sanity!(s, socket_time_wait(false));
5668 }
5669
5670 #[test]
5671 fn test_fin_wait_2_recv() {
5672 let mut s = socket_fin_wait_2();
5673 send!(
5674 s,
5675 TcpRepr {
5676 seq_number: REMOTE_SEQ + 1,
5677 ack_number: Some(LOCAL_SEQ + 1 + 1),
5678 payload: &b"abc"[..],
5679 ..SEND_TEMPL
5680 }
5681 );
5682 assert_eq!(s.state, State::FinWait2);
5683 s.recv(|data| {
5684 assert_eq!(data, b"abc");
5685 (3, ())
5686 })
5687 .unwrap();
5688 recv!(
5689 s,
5690 [TcpRepr {
5691 seq_number: LOCAL_SEQ + 1 + 1,
5692 ack_number: Some(REMOTE_SEQ + 1 + 3),
5693 ..RECV_TEMPL
5694 }]
5695 );
5696 }
5697
5698 #[test]
5699 fn test_fin_wait_2_close() {
5700 let mut s = socket_fin_wait_2();
5701 s.close();
5702 assert_eq!(s.state, State::FinWait2);
5703 }
5704
5705 #[test]
5710 fn test_closing_ack_fin() {
5711 let mut s = socket_closing();
5712 recv!(
5713 s,
5714 [TcpRepr {
5715 seq_number: LOCAL_SEQ + 1 + 1,
5716 ack_number: Some(REMOTE_SEQ + 1 + 1),
5717 ..RECV_TEMPL
5718 }]
5719 );
5720 send!(s, time 1_000, TcpRepr {
5721 seq_number: REMOTE_SEQ + 1 + 1,
5722 ack_number: Some(LOCAL_SEQ + 1 + 1),
5723 ..SEND_TEMPL
5724 });
5725 assert_eq!(s.state, State::TimeWait);
5726 sanity!(s, socket_time_wait(true));
5727 }
5728
5729 #[test]
5730 fn test_closing_close() {
5731 let mut s = socket_closing();
5732 s.close();
5733 assert_eq!(s.state, State::Closing);
5734 }
5735
5736 #[test]
5741 fn test_time_wait_from_fin_wait_2_ack() {
5742 let mut s = socket_time_wait(false);
5743 recv!(
5744 s,
5745 [TcpRepr {
5746 seq_number: LOCAL_SEQ + 1 + 1,
5747 ack_number: Some(REMOTE_SEQ + 1 + 1),
5748 ..RECV_TEMPL
5749 }]
5750 );
5751 }
5752
5753 #[test]
5754 fn test_time_wait_from_closing_no_ack() {
5755 let mut s = socket_time_wait(true);
5756 recv!(s, []);
5757 }
5758
5759 #[test]
5760 fn test_time_wait_close() {
5761 let mut s = socket_time_wait(false);
5762 s.close();
5763 assert_eq!(s.state, State::TimeWait);
5764 }
5765
5766 #[test]
5767 fn test_time_wait_retransmit() {
5768 let mut s = socket_time_wait(false);
5769 recv!(
5770 s,
5771 [TcpRepr {
5772 seq_number: LOCAL_SEQ + 1 + 1,
5773 ack_number: Some(REMOTE_SEQ + 1 + 1),
5774 ..RECV_TEMPL
5775 }]
5776 );
5777 send!(s, time 5_000, TcpRepr {
5778 control: TcpControl::Fin,
5779 seq_number: REMOTE_SEQ + 1,
5780 ack_number: Some(LOCAL_SEQ + 1 + 1),
5781 ..SEND_TEMPL
5782 }, Some(TcpRepr {
5783 seq_number: LOCAL_SEQ + 1 + 1,
5784 ack_number: Some(REMOTE_SEQ + 1 + 1),
5785 ..RECV_TEMPL
5786 }));
5787 assert_eq!(
5788 s.timer,
5789 Timer::Close {
5790 expires_at: Instant::from_secs(5) + CLOSE_DELAY
5791 }
5792 );
5793 }
5794
5795 #[test]
5796 fn test_time_wait_timeout() {
5797 let mut s = socket_time_wait(false);
5798 recv!(
5799 s,
5800 [TcpRepr {
5801 seq_number: LOCAL_SEQ + 1 + 1,
5802 ack_number: Some(REMOTE_SEQ + 1 + 1),
5803 ..RECV_TEMPL
5804 }]
5805 );
5806 assert_eq!(s.state, State::TimeWait);
5807 recv_nothing!(s, time 60_000);
5808 assert_eq!(s.state, State::Closed);
5809 }
5810
5811 #[test]
5816 fn test_close_wait_ack() {
5817 let mut s = socket_close_wait();
5818 s.send_slice(b"abcdef").unwrap();
5819 recv!(
5820 s,
5821 [TcpRepr {
5822 seq_number: LOCAL_SEQ + 1,
5823 ack_number: Some(REMOTE_SEQ + 1 + 1),
5824 payload: &b"abcdef"[..],
5825 ..RECV_TEMPL
5826 }]
5827 );
5828 send!(
5829 s,
5830 TcpRepr {
5831 seq_number: REMOTE_SEQ + 1 + 1,
5832 ack_number: Some(LOCAL_SEQ + 1 + 6),
5833 ..SEND_TEMPL
5834 }
5835 );
5836 }
5837
5838 #[test]
5839 fn test_close_wait_close() {
5840 let mut s = socket_close_wait();
5841 s.close();
5842 assert_eq!(s.state, State::LastAck);
5843 sanity!(s, socket_last_ack());
5844 }
5845
5846 #[test]
5850 fn test_last_ack_fin_ack() {
5851 let mut s = socket_last_ack();
5852 recv!(
5853 s,
5854 [TcpRepr {
5855 control: TcpControl::Fin,
5856 seq_number: LOCAL_SEQ + 1,
5857 ack_number: Some(REMOTE_SEQ + 1 + 1),
5858 ..RECV_TEMPL
5859 }]
5860 );
5861 assert_eq!(s.state, State::LastAck);
5862 send!(
5863 s,
5864 TcpRepr {
5865 seq_number: REMOTE_SEQ + 1 + 1,
5866 ack_number: Some(LOCAL_SEQ + 1 + 1),
5867 ..SEND_TEMPL
5868 }
5869 );
5870 assert_eq!(s.state, State::Closed);
5871 }
5872
5873 #[test]
5874 fn test_last_ack_ack_not_of_fin() {
5875 let mut s = socket_last_ack();
5876 recv!(
5877 s,
5878 [TcpRepr {
5879 control: TcpControl::Fin,
5880 seq_number: LOCAL_SEQ + 1,
5881 ack_number: Some(REMOTE_SEQ + 1 + 1),
5882 ..RECV_TEMPL
5883 }]
5884 );
5885 assert_eq!(s.state, State::LastAck);
5886
5887 send!(
5890 s,
5891 TcpRepr {
5892 seq_number: REMOTE_SEQ + 1 + 1,
5893 ack_number: Some(LOCAL_SEQ + 1),
5894 ..SEND_TEMPL
5895 },
5896 Some(TcpRepr {
5897 seq_number: LOCAL_SEQ + 1 + 1,
5898 ack_number: Some(REMOTE_SEQ + 1 + 1),
5899 ..RECV_TEMPL
5900 })
5901 );
5902 assert_eq!(s.state, State::LastAck);
5903
5904 send!(
5906 s,
5907 TcpRepr {
5908 seq_number: REMOTE_SEQ + 1 + 1,
5909 ack_number: Some(LOCAL_SEQ + 1 + 1),
5910 ..SEND_TEMPL
5911 }
5912 );
5913 assert_eq!(s.state, State::Closed);
5914 }
5915
5916 #[test]
5919 fn test_last_ack_duplicate_ack_challenge_ack() {
5920 let mut s = socket_last_ack();
5921 recv!(
5923 s,
5924 [TcpRepr {
5925 control: TcpControl::Fin,
5926 seq_number: LOCAL_SEQ + 1,
5927 ack_number: Some(REMOTE_SEQ + 1 + 1),
5928 ..RECV_TEMPL
5929 }]
5930 );
5931 assert_eq!(s.state, State::LastAck);
5932
5933 let challenge = send(
5936 &mut s,
5937 Instant::from_millis(0),
5938 &TcpRepr {
5939 seq_number: REMOTE_SEQ + 1 + 1,
5940 ack_number: Some(LOCAL_SEQ + 1),
5941 ..SEND_TEMPL
5942 },
5943 );
5944 assert_eq!(
5945 challenge,
5946 Some(TcpRepr {
5947 seq_number: LOCAL_SEQ + 1 + 1,
5948 ack_number: Some(REMOTE_SEQ + 1 + 1),
5949 ..RECV_TEMPL
5950 }),
5951 "expected challenge ACK in response to duplicate ACK in LAST-ACK"
5952 );
5953 assert_eq!(s.state, State::LastAck);
5955
5956 send!(
5959 s,
5960 TcpRepr {
5961 seq_number: REMOTE_SEQ + 1 + 1,
5962 ack_number: Some(LOCAL_SEQ + 1 + 1),
5963 ..SEND_TEMPL
5964 }
5965 );
5966 assert_eq!(s.state, State::Closed);
5967 }
5968
5969 #[test]
5972 fn test_last_ack_partial_ack_no_challenge_ack() {
5973 let mut s = socket_last_ack();
5976 let _ = s.tx_buffer.enqueue_slice(b"x");
5978 s.remote_last_seq = LOCAL_SEQ + 1 + 1 + 1; send!(
5986 s,
5987 TcpRepr {
5988 seq_number: REMOTE_SEQ + 1 + 1,
5989 ack_number: Some(LOCAL_SEQ + 1 + 1), ..SEND_TEMPL
5991 }
5992 );
5993 assert_eq!(s.state, State::LastAck);
5995 assert_eq!(s.local_seq_no, LOCAL_SEQ + 1 + 1);
5997 }
5998
5999 #[test]
6000 fn test_last_ack_close() {
6001 let mut s = socket_last_ack();
6002 s.close();
6003 assert_eq!(s.state, State::LastAck);
6004 }
6005
6006 #[test]
6011 fn test_listen() {
6012 let mut s = socket();
6013 s.listen(LISTEN_END).unwrap();
6014 assert_eq!(s.state, State::Listen);
6015 }
6016
6017 #[test]
6018 fn test_three_way_handshake() {
6019 let mut s = socket_listen();
6020 send!(
6021 s,
6022 TcpRepr {
6023 control: TcpControl::Syn,
6024 seq_number: REMOTE_SEQ,
6025 ack_number: None,
6026 ..SEND_TEMPL
6027 }
6028 );
6029 assert_eq!(s.state(), State::SynReceived);
6030 assert_eq!(s.tuple, Some(TUPLE));
6031 recv!(
6032 s,
6033 [TcpRepr {
6034 control: TcpControl::Syn,
6035 seq_number: LOCAL_SEQ,
6036 ack_number: Some(REMOTE_SEQ + 1),
6037 max_seg_size: Some(BASE_MSS),
6038 ..RECV_TEMPL
6039 }]
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 assert_eq!(s.local_seq_no, LOCAL_SEQ + 1);
6051 assert_eq!(s.remote_seq_no, REMOTE_SEQ + 1);
6052 }
6053
6054 #[test]
6055 fn test_remote_close() {
6056 let mut s = socket_established();
6057 send!(
6058 s,
6059 TcpRepr {
6060 control: TcpControl::Fin,
6061 seq_number: REMOTE_SEQ + 1,
6062 ack_number: Some(LOCAL_SEQ + 1),
6063 ..SEND_TEMPL
6064 }
6065 );
6066 assert_eq!(s.state, State::CloseWait);
6067 recv!(
6068 s,
6069 [TcpRepr {
6070 seq_number: LOCAL_SEQ + 1,
6071 ack_number: Some(REMOTE_SEQ + 1 + 1),
6072 ..RECV_TEMPL
6073 }]
6074 );
6075 s.close();
6076 assert_eq!(s.state, State::LastAck);
6077 recv!(
6078 s,
6079 [TcpRepr {
6080 control: TcpControl::Fin,
6081 seq_number: LOCAL_SEQ + 1,
6082 ack_number: Some(REMOTE_SEQ + 1 + 1),
6083 ..RECV_TEMPL
6084 }]
6085 );
6086 send!(
6087 s,
6088 TcpRepr {
6089 seq_number: REMOTE_SEQ + 1 + 1,
6090 ack_number: Some(LOCAL_SEQ + 1 + 1),
6091 ..SEND_TEMPL
6092 }
6093 );
6094 assert_eq!(s.state, State::Closed);
6095 }
6096
6097 #[test]
6098 fn test_local_close() {
6099 let mut s = socket_established();
6100 s.close();
6101 assert_eq!(s.state, State::FinWait1);
6102 recv!(
6103 s,
6104 [TcpRepr {
6105 control: TcpControl::Fin,
6106 seq_number: LOCAL_SEQ + 1,
6107 ack_number: Some(REMOTE_SEQ + 1),
6108 ..RECV_TEMPL
6109 }]
6110 );
6111 send!(
6112 s,
6113 TcpRepr {
6114 seq_number: REMOTE_SEQ + 1,
6115 ack_number: Some(LOCAL_SEQ + 1 + 1),
6116 ..SEND_TEMPL
6117 }
6118 );
6119 assert_eq!(s.state, State::FinWait2);
6120 send!(
6121 s,
6122 TcpRepr {
6123 control: TcpControl::Fin,
6124 seq_number: REMOTE_SEQ + 1,
6125 ack_number: Some(LOCAL_SEQ + 1 + 1),
6126 ..SEND_TEMPL
6127 }
6128 );
6129 assert_eq!(s.state, State::TimeWait);
6130 recv!(
6131 s,
6132 [TcpRepr {
6133 seq_number: LOCAL_SEQ + 1 + 1,
6134 ack_number: Some(REMOTE_SEQ + 1 + 1),
6135 ..RECV_TEMPL
6136 }]
6137 );
6138 }
6139
6140 #[test]
6141 fn test_simultaneous_close() {
6142 let mut s = socket_established();
6143 s.close();
6144 assert_eq!(s.state, State::FinWait1);
6145 recv!(
6146 s,
6147 [TcpRepr {
6148 control: TcpControl::Fin,
6150 seq_number: LOCAL_SEQ + 1,
6151 ack_number: Some(REMOTE_SEQ + 1),
6152 ..RECV_TEMPL
6153 }]
6154 );
6155 send!(
6156 s,
6157 TcpRepr {
6158 control: TcpControl::Fin,
6159 seq_number: REMOTE_SEQ + 1,
6160 ack_number: Some(LOCAL_SEQ + 1),
6161 ..SEND_TEMPL
6162 }
6163 );
6164 assert_eq!(s.state, State::Closing);
6165 recv!(
6166 s,
6167 [TcpRepr {
6168 seq_number: LOCAL_SEQ + 1 + 1,
6169 ack_number: Some(REMOTE_SEQ + 1 + 1),
6170 ..RECV_TEMPL
6171 }]
6172 );
6173 send!(
6175 s,
6176 TcpRepr {
6177 seq_number: REMOTE_SEQ + 1 + 1,
6178 ack_number: Some(LOCAL_SEQ + 1 + 1),
6179 ..SEND_TEMPL
6180 }
6181 );
6182 assert_eq!(s.state, State::TimeWait);
6183 recv!(s, []);
6184 }
6185
6186 #[test]
6187 fn test_simultaneous_close_combined_fin_ack() {
6188 let mut s = socket_established();
6189 s.close();
6190 assert_eq!(s.state, State::FinWait1);
6191 recv!(
6192 s,
6193 [TcpRepr {
6194 control: TcpControl::Fin,
6195 seq_number: LOCAL_SEQ + 1,
6196 ack_number: Some(REMOTE_SEQ + 1),
6197 ..RECV_TEMPL
6198 }]
6199 );
6200 send!(
6201 s,
6202 TcpRepr {
6203 control: TcpControl::Fin,
6204 seq_number: REMOTE_SEQ + 1,
6205 ack_number: Some(LOCAL_SEQ + 1 + 1),
6206 ..SEND_TEMPL
6207 }
6208 );
6209 assert_eq!(s.state, State::TimeWait);
6210 recv!(
6211 s,
6212 [TcpRepr {
6213 seq_number: LOCAL_SEQ + 1 + 1,
6214 ack_number: Some(REMOTE_SEQ + 1 + 1),
6215 ..RECV_TEMPL
6216 }]
6217 );
6218 }
6219
6220 #[test]
6221 fn test_simultaneous_close_raced() {
6222 let mut s = socket_established();
6223 s.close();
6224 assert_eq!(s.state, State::FinWait1);
6225
6226 send!(
6228 s,
6229 TcpRepr {
6230 control: TcpControl::Fin,
6231 seq_number: REMOTE_SEQ + 1,
6232 ack_number: Some(LOCAL_SEQ + 1),
6233 ..SEND_TEMPL
6234 }
6235 );
6236 assert_eq!(s.state, State::Closing);
6237
6238 recv!(
6240 s,
6241 [TcpRepr {
6242 control: TcpControl::Fin,
6243 seq_number: LOCAL_SEQ + 1,
6244 ack_number: Some(REMOTE_SEQ + 1 + 1),
6245 ..RECV_TEMPL
6246 }]
6247 );
6248 assert_eq!(s.state, State::Closing);
6249
6250 send!(
6251 s,
6252 TcpRepr {
6253 seq_number: REMOTE_SEQ + 1 + 1,
6254 ack_number: Some(LOCAL_SEQ + 1 + 1),
6255 ..SEND_TEMPL
6256 }
6257 );
6258 assert_eq!(s.state, State::TimeWait);
6259 recv!(s, []);
6260 }
6261
6262 #[test]
6263 fn test_simultaneous_close_raced_with_data() {
6264 let mut s = socket_established();
6265 s.send_slice(b"abcdef").unwrap();
6266 s.close();
6267 assert_eq!(s.state, State::FinWait1);
6268
6269 send!(
6271 s,
6272 TcpRepr {
6273 control: TcpControl::Fin,
6274 seq_number: REMOTE_SEQ + 1,
6275 ack_number: Some(LOCAL_SEQ + 1),
6276 ..SEND_TEMPL
6277 }
6278 );
6279 assert_eq!(s.state, State::Closing);
6280
6281 recv!(
6283 s,
6284 [TcpRepr {
6285 control: TcpControl::Fin,
6286 seq_number: LOCAL_SEQ + 1,
6287 ack_number: Some(REMOTE_SEQ + 1 + 1),
6288 payload: &b"abcdef"[..],
6289 ..RECV_TEMPL
6290 }]
6291 );
6292 assert_eq!(s.state, State::Closing);
6293
6294 send!(
6295 s,
6296 TcpRepr {
6297 seq_number: REMOTE_SEQ + 1 + 1,
6298 ack_number: Some(LOCAL_SEQ + 1 + 6 + 1),
6299 ..SEND_TEMPL
6300 }
6301 );
6302 assert_eq!(s.state, State::TimeWait);
6303 recv!(s, []);
6304 }
6305
6306 #[test]
6307 fn test_fin_with_data() {
6308 let mut s = socket_established();
6309 s.send_slice(b"abcdef").unwrap();
6310 s.close();
6311 recv!(
6312 s,
6313 [TcpRepr {
6314 control: TcpControl::Fin,
6315 seq_number: LOCAL_SEQ + 1,
6316 ack_number: Some(REMOTE_SEQ + 1),
6317 payload: &b"abcdef"[..],
6318 ..RECV_TEMPL
6319 }]
6320 )
6321 }
6322
6323 #[test]
6324 fn test_mutual_close_with_data_1() {
6325 let mut s = socket_established();
6326 s.send_slice(b"abcdef").unwrap();
6327 s.close();
6328 assert_eq!(s.state, State::FinWait1);
6329 recv!(
6330 s,
6331 [TcpRepr {
6332 control: TcpControl::Fin,
6333 seq_number: LOCAL_SEQ + 1,
6334 ack_number: Some(REMOTE_SEQ + 1),
6335 payload: &b"abcdef"[..],
6336 ..RECV_TEMPL
6337 }]
6338 );
6339 send!(
6340 s,
6341 TcpRepr {
6342 control: TcpControl::Fin,
6343 seq_number: REMOTE_SEQ + 1,
6344 ack_number: Some(LOCAL_SEQ + 1 + 6 + 1),
6345 ..SEND_TEMPL
6346 }
6347 );
6348 }
6349
6350 #[test]
6351 fn test_mutual_close_with_data_2() {
6352 let mut s = socket_established();
6353 s.send_slice(b"abcdef").unwrap();
6354 s.close();
6355 assert_eq!(s.state, State::FinWait1);
6356 recv!(
6357 s,
6358 [TcpRepr {
6359 control: TcpControl::Fin,
6360 seq_number: LOCAL_SEQ + 1,
6361 ack_number: Some(REMOTE_SEQ + 1),
6362 payload: &b"abcdef"[..],
6363 ..RECV_TEMPL
6364 }]
6365 );
6366 send!(
6367 s,
6368 TcpRepr {
6369 seq_number: REMOTE_SEQ + 1,
6370 ack_number: Some(LOCAL_SEQ + 1 + 6 + 1),
6371 ..SEND_TEMPL
6372 }
6373 );
6374 assert_eq!(s.state, State::FinWait2);
6375 send!(
6376 s,
6377 TcpRepr {
6378 control: TcpControl::Fin,
6379 seq_number: REMOTE_SEQ + 1,
6380 ack_number: Some(LOCAL_SEQ + 1 + 6 + 1),
6381 ..SEND_TEMPL
6382 }
6383 );
6384 recv!(
6385 s,
6386 [TcpRepr {
6387 seq_number: LOCAL_SEQ + 1 + 6 + 1,
6388 ack_number: Some(REMOTE_SEQ + 1 + 1),
6389 ..RECV_TEMPL
6390 }]
6391 );
6392 assert_eq!(s.state, State::TimeWait);
6393 }
6394
6395 #[test]
6400 fn test_duplicate_seq_ack() {
6401 let mut s = socket_recved();
6402 send!(
6404 s,
6405 TcpRepr {
6406 seq_number: REMOTE_SEQ + 1,
6407 ack_number: Some(LOCAL_SEQ + 1),
6408 payload: &b"abcdef"[..],
6409 ..SEND_TEMPL
6410 },
6411 Some(TcpRepr {
6412 seq_number: LOCAL_SEQ + 1,
6413 ack_number: Some(REMOTE_SEQ + 1 + 6),
6414 window_len: 58,
6415 ..RECV_TEMPL
6416 })
6417 );
6418 }
6419
6420 #[test]
6421 fn test_data_retransmit() {
6422 let mut s = socket_established();
6423 s.send_slice(b"abcdef").unwrap();
6424 recv!(s, time 1000, Ok(TcpRepr {
6425 seq_number: LOCAL_SEQ + 1,
6426 ack_number: Some(REMOTE_SEQ + 1),
6427 payload: &b"abcdef"[..],
6428 ..RECV_TEMPL
6429 }));
6430 recv_nothing!(s, time 1050);
6431 recv!(s, time 2000, Ok(TcpRepr {
6432 seq_number: LOCAL_SEQ + 1,
6433 ack_number: Some(REMOTE_SEQ + 1),
6434 payload: &b"abcdef"[..],
6435 ..RECV_TEMPL
6436 }));
6437 }
6438
6439 #[test]
6440 #[cfg(feature = "socket-tcp-reno")]
6441 fn test_congestion_window_limits_data_in_flight() {
6442 let mut s = socket_established_with_buffer_sizes(8192, 64);
6443 s.set_congestion_control(CongestionControl::Reno);
6444 s.remote_win_len = 65535;
6445 s.remote_mss = 1024;
6446
6447 let data = [b'x'; 8192];
6448 s.send_slice(&data[..]).unwrap();
6449
6450 recv!(s, time 0, Ok(TcpRepr {
6453 seq_number: LOCAL_SEQ + 1,
6454 ack_number: Some(REMOTE_SEQ + 1),
6455 payload: &data[..1024],
6456 ..RECV_TEMPL
6457 }));
6458 recv!(s, time 0, Ok(TcpRepr {
6459 seq_number: LOCAL_SEQ + 1 + 1024,
6460 ack_number: Some(REMOTE_SEQ + 1),
6461 payload: &data[..1024],
6462 ..RECV_TEMPL
6463 }));
6464 recv_nothing!(s, time 0);
6465
6466 send!(s, time 10, TcpRepr {
6469 seq_number: REMOTE_SEQ + 1,
6470 ack_number: Some(LOCAL_SEQ + 1 + 1024),
6471 window_len: 65535,
6472 ..SEND_TEMPL
6473 });
6474 recv!(s, time 10, Ok(TcpRepr {
6475 seq_number: LOCAL_SEQ + 1 + 2048,
6476 ack_number: Some(REMOTE_SEQ + 1),
6477 payload: &data[..1024],
6478 ..RECV_TEMPL
6479 }));
6480 }
6481
6482 #[test]
6483 #[cfg(feature = "socket-tcp-reno")]
6484 fn test_congestion_window_doesnt_limit_fast_retransmit() {
6485 let mut s = socket_established_with_buffer_sizes(8192, 64);
6486 s.set_congestion_control(CongestionControl::Reno);
6487 s.remote_win_len = 65535;
6488 s.remote_mss = 1024;
6489
6490 send!(s, time 0, TcpRepr {
6492 seq_number: REMOTE_SEQ + 1,
6493 ack_number: Some(LOCAL_SEQ + 1),
6494 window_len: 65535,
6495 ..SEND_TEMPL
6496 });
6497
6498 let data = [b'x'; 8192];
6499 s.send_slice(&data[..]).unwrap();
6500
6501 recv!(s, time 0, Ok(TcpRepr {
6503 seq_number: LOCAL_SEQ + 1,
6504 ack_number: Some(REMOTE_SEQ + 1),
6505 payload: &data[..1024],
6506 ..RECV_TEMPL
6507 }));
6508
6509 recv!(s, time 0, Ok(TcpRepr {
6510 seq_number: LOCAL_SEQ + 1 + 1024,
6511 ack_number: Some(REMOTE_SEQ + 1),
6512 payload: &data[..1024],
6513 ..RECV_TEMPL
6514 }));
6515 recv_nothing!(s, time 0);
6516
6517 send!(s, time 10, TcpRepr {
6519 seq_number: REMOTE_SEQ + 1,
6520 ack_number: Some(LOCAL_SEQ + 1),
6521 window_len: 65535,
6522 ..SEND_TEMPL
6523 });
6524 send!(s, time 10, TcpRepr {
6525 seq_number: REMOTE_SEQ + 1,
6526 ack_number: Some(LOCAL_SEQ + 1),
6527 window_len: 65535,
6528 ..SEND_TEMPL
6529 });
6530 send!(s, time 10, TcpRepr {
6531 seq_number: REMOTE_SEQ + 1,
6532 ack_number: Some(LOCAL_SEQ + 1),
6533 window_len: 65535,
6534 ..SEND_TEMPL
6535 });
6536
6537 recv!(s, time 20, Ok(TcpRepr {
6539 seq_number: LOCAL_SEQ + 1,
6540 ack_number: Some(REMOTE_SEQ + 1),
6541 payload: &data[..1024],
6542 ..RECV_TEMPL
6543 }));
6544 }
6545
6546 #[test]
6547 fn test_data_retransmit_bursts() {
6548 let mut s = socket_established();
6549 s.remote_mss = 6;
6550 s.send_slice(b"abcdef012345").unwrap();
6551
6552 recv!(s, time 0, Ok(TcpRepr {
6553 control: TcpControl::None,
6554 seq_number: LOCAL_SEQ + 1,
6555 ack_number: Some(REMOTE_SEQ + 1),
6556 payload: &b"abcdef"[..],
6557 ..RECV_TEMPL
6558 }), exact);
6559 recv!(s, time 0, Ok(TcpRepr {
6560 control: TcpControl::Psh,
6561 seq_number: LOCAL_SEQ + 1 + 6,
6562 ack_number: Some(REMOTE_SEQ + 1),
6563 payload: &b"012345"[..],
6564 ..RECV_TEMPL
6565 }), exact);
6566 recv_nothing!(s, time 0);
6567
6568 recv_nothing!(s, time 50);
6569
6570 recv!(s, time 1000, Ok(TcpRepr {
6571 control: TcpControl::None,
6572 seq_number: LOCAL_SEQ + 1,
6573 ack_number: Some(REMOTE_SEQ + 1),
6574 payload: &b"abcdef"[..],
6575 ..RECV_TEMPL
6576 }), exact);
6577 recv!(s, time 1500, Ok(TcpRepr {
6578 control: TcpControl::Psh,
6579 seq_number: LOCAL_SEQ + 1 + 6,
6580 ack_number: Some(REMOTE_SEQ + 1),
6581 payload: &b"012345"[..],
6582 ..RECV_TEMPL
6583 }), exact);
6584 recv_nothing!(s, time 1550);
6585 }
6586
6587 #[test]
6588 fn test_data_retransmit_bursts_half_ack() {
6589 let mut s = socket_established();
6590 s.remote_mss = 6;
6591 s.send_slice(b"abcdef012345").unwrap();
6592
6593 recv!(s, time 0, Ok(TcpRepr {
6594 control: TcpControl::None,
6595 seq_number: LOCAL_SEQ + 1,
6596 ack_number: Some(REMOTE_SEQ + 1),
6597 payload: &b"abcdef"[..],
6598 ..RECV_TEMPL
6599 }), exact);
6600 recv!(s, time 0, Ok(TcpRepr {
6601 control: TcpControl::Psh,
6602 seq_number: LOCAL_SEQ + 1 + 6,
6603 ack_number: Some(REMOTE_SEQ + 1),
6604 payload: &b"012345"[..],
6605 ..RECV_TEMPL
6606 }), exact);
6607 send!(s, time 5, TcpRepr {
6609 seq_number: REMOTE_SEQ + 1,
6610 ack_number: Some(LOCAL_SEQ + 1 + 6),
6611 window_len: 6,
6612 ..SEND_TEMPL
6613 });
6614 recv!(s, time 1500, Ok(TcpRepr {
6616 control: TcpControl::Psh,
6617 seq_number: LOCAL_SEQ + 1 + 6,
6618 ack_number: Some(REMOTE_SEQ + 1),
6619 payload: &b"012345"[..],
6620 ..RECV_TEMPL
6621 }), exact);
6622
6623 recv_nothing!(s, time 1550);
6624 }
6625
6626 #[test]
6627 fn test_retransmit_timer_restart_on_partial_ack() {
6628 let mut s = socket_established();
6629 s.remote_mss = 6;
6630 s.send_slice(b"abcdef012345").unwrap();
6631
6632 recv!(s, time 0, Ok(TcpRepr {
6633 control: TcpControl::None,
6634 seq_number: LOCAL_SEQ + 1,
6635 ack_number: Some(REMOTE_SEQ + 1),
6636 payload: &b"abcdef"[..],
6637 ..RECV_TEMPL
6638 }), exact);
6639 recv!(s, time 0, Ok(TcpRepr {
6640 control: TcpControl::Psh,
6641 seq_number: LOCAL_SEQ + 1 + 6,
6642 ack_number: Some(REMOTE_SEQ + 1),
6643 payload: &b"012345"[..],
6644 ..RECV_TEMPL
6645 }), exact);
6646 send!(s, time 600, TcpRepr {
6648 seq_number: REMOTE_SEQ + 1,
6649 ack_number: Some(LOCAL_SEQ + 1 + 6),
6650 window_len: 6,
6651 ..SEND_TEMPL
6652 });
6653 recv_nothing!(s, time 2399);
6655 recv!(s, time 2400, Ok(TcpRepr {
6657 control: TcpControl::Psh,
6658 seq_number: LOCAL_SEQ + 1 + 6,
6659 ack_number: Some(REMOTE_SEQ + 1),
6660 payload: &b"012345"[..],
6661 ..RECV_TEMPL
6662 }), exact);
6663 }
6664
6665 #[test]
6666 fn test_data_retransmit_bursts_half_ack_close() {
6667 let mut s = socket_established();
6668 s.remote_mss = 6;
6669 s.send_slice(b"abcdef012345").unwrap();
6670 s.close();
6671
6672 recv!(s, time 0, Ok(TcpRepr {
6673 control: TcpControl::None,
6674 seq_number: LOCAL_SEQ + 1,
6675 ack_number: Some(REMOTE_SEQ + 1),
6676 payload: &b"abcdef"[..],
6677 ..RECV_TEMPL
6678 }), exact);
6679 recv!(s, time 0, Ok(TcpRepr {
6680 control: TcpControl::Fin,
6681 seq_number: LOCAL_SEQ + 1 + 6,
6682 ack_number: Some(REMOTE_SEQ + 1),
6683 payload: &b"012345"[..],
6684 ..RECV_TEMPL
6685 }), exact);
6686 send!(s, time 5, TcpRepr {
6688 seq_number: REMOTE_SEQ + 1,
6689 ack_number: Some(LOCAL_SEQ + 1 + 6),
6690 window_len: 6,
6691 ..SEND_TEMPL
6692 });
6693 recv!(s, time 1500, Ok(TcpRepr {
6695 control: TcpControl::Fin,
6696 seq_number: LOCAL_SEQ + 1 + 6,
6697 ack_number: Some(REMOTE_SEQ + 1),
6698 payload: &b"012345"[..],
6699 ..RECV_TEMPL
6700 }), exact);
6701
6702 recv_nothing!(s, time 1550);
6703 }
6704
6705 #[test]
6706 fn test_send_data_after_syn_ack_retransmit() {
6707 let mut s = socket_syn_received();
6708 recv!(s, time 50, Ok(TcpRepr {
6709 control: TcpControl::Syn,
6710 seq_number: LOCAL_SEQ,
6711 ack_number: Some(REMOTE_SEQ + 1),
6712 max_seg_size: Some(BASE_MSS),
6713 ..RECV_TEMPL
6714 }));
6715 recv!(s, time 1050, Ok(TcpRepr { control: TcpControl::Syn,
6717 seq_number: LOCAL_SEQ,
6718 ack_number: Some(REMOTE_SEQ + 1),
6719 max_seg_size: Some(BASE_MSS),
6720 ..RECV_TEMPL
6721 }));
6722 send!(
6723 s,
6724 TcpRepr {
6725 seq_number: REMOTE_SEQ + 1,
6726 ack_number: Some(LOCAL_SEQ + 1),
6727 ..SEND_TEMPL
6728 }
6729 );
6730 assert_eq!(s.state(), State::Established);
6731 s.send_slice(b"abcdef").unwrap();
6732 recv!(
6733 s,
6734 [TcpRepr {
6735 seq_number: LOCAL_SEQ + 1,
6736 ack_number: Some(REMOTE_SEQ + 1),
6737 payload: &b"abcdef"[..],
6738 ..RECV_TEMPL
6739 }]
6740 )
6741 }
6742
6743 #[test]
6744 fn test_established_retransmit_for_dup_ack() {
6745 let mut s = socket_established();
6746 s.send_slice(b"abc").unwrap();
6748 recv!(s, time 1000, Ok(TcpRepr {
6749 seq_number: LOCAL_SEQ + 1,
6750 ack_number: Some(REMOTE_SEQ + 1),
6751 payload: &b"abc"[..],
6752 ..RECV_TEMPL
6753 }));
6754 assert_eq!(s.tx_buffer.len(), 3);
6756 send!(
6758 s,
6759 TcpRepr {
6760 seq_number: REMOTE_SEQ + 1,
6761 ack_number: Some(LOCAL_SEQ + 1),
6762 ..SEND_TEMPL
6763 }
6764 );
6765 recv!(s, time 4000, Ok(TcpRepr {
6767 seq_number: LOCAL_SEQ + 1,
6768 ack_number: Some(REMOTE_SEQ + 1),
6769 payload: &b"abc"[..],
6770 ..RECV_TEMPL
6771 }));
6772 }
6773
6774 #[test]
6775 fn test_established_retransmit_reset_after_ack() {
6776 let mut s = socket_established();
6777 s.remote_win_len = 6;
6778 s.send_slice(b"abcdef").unwrap();
6779 s.send_slice(b"123456").unwrap();
6780 s.send_slice(b"ABCDEF").unwrap();
6781 recv!(s, time 1000, Ok(TcpRepr {
6782 seq_number: LOCAL_SEQ + 1,
6783 ack_number: Some(REMOTE_SEQ + 1),
6784 payload: &b"abcdef"[..],
6785 ..RECV_TEMPL
6786 }));
6787 send!(s, time 1005, TcpRepr {
6788 seq_number: REMOTE_SEQ + 1,
6789 ack_number: Some(LOCAL_SEQ + 1 + 6),
6790 window_len: 6,
6791 ..SEND_TEMPL
6792 });
6793 recv!(s, time 1010, Ok(TcpRepr {
6794 seq_number: LOCAL_SEQ + 1 + 6,
6795 ack_number: Some(REMOTE_SEQ + 1),
6796 payload: &b"123456"[..],
6797 ..RECV_TEMPL
6798 }));
6799 send!(s, time 1015, TcpRepr {
6800 seq_number: REMOTE_SEQ + 1,
6801 ack_number: Some(LOCAL_SEQ + 1 + 6 + 6),
6802 window_len: 6,
6803 ..SEND_TEMPL
6804 });
6805 recv!(s, time 1020, Ok(TcpRepr {
6806 seq_number: LOCAL_SEQ + 1 + 6 + 6,
6807 ack_number: Some(REMOTE_SEQ + 1),
6808 payload: &b"ABCDEF"[..],
6809 ..RECV_TEMPL
6810 }));
6811 }
6812
6813 #[test]
6814 fn test_established_queue_during_retransmission() {
6815 let mut s = socket_established();
6816 s.remote_mss = 6;
6817 s.send_slice(b"abcdef123456ABCDEF").unwrap();
6818 recv!(s, time 1000, Ok(TcpRepr {
6819 seq_number: LOCAL_SEQ + 1,
6820 ack_number: Some(REMOTE_SEQ + 1),
6821 payload: &b"abcdef"[..],
6822 ..RECV_TEMPL
6823 })); recv!(s, time 1005, Ok(TcpRepr {
6825 seq_number: LOCAL_SEQ + 1 + 6,
6826 ack_number: Some(REMOTE_SEQ + 1),
6827 payload: &b"123456"[..],
6828 ..RECV_TEMPL
6829 })); recv!(s, time 1010, Ok(TcpRepr {
6831 seq_number: LOCAL_SEQ + 1 + 6 + 6,
6832 ack_number: Some(REMOTE_SEQ + 1),
6833 payload: &b"ABCDEF"[..],
6834 ..RECV_TEMPL
6835 })); recv!(s, time 3000, Ok(TcpRepr {
6837 seq_number: LOCAL_SEQ + 1,
6838 ack_number: Some(REMOTE_SEQ + 1),
6839 payload: &b"abcdef"[..],
6840 ..RECV_TEMPL
6841 })); send!(s, time 3005, TcpRepr {
6843 seq_number: REMOTE_SEQ + 1,
6844 ack_number: Some(LOCAL_SEQ + 1 + 6 + 6),
6845 ..SEND_TEMPL
6846 }); recv!(s, time 3010, Ok(TcpRepr {
6848 seq_number: LOCAL_SEQ + 1 + 6 + 6,
6849 ack_number: Some(REMOTE_SEQ + 1),
6850 payload: &b"ABCDEF"[..],
6851 ..RECV_TEMPL
6852 })); }
6854
6855 #[test]
6856 fn test_close_wait_retransmit_reset_after_ack() {
6857 let mut s = socket_close_wait();
6858 s.remote_win_len = 6;
6859 s.send_slice(b"abcdef").unwrap();
6860 s.send_slice(b"123456").unwrap();
6861 s.send_slice(b"ABCDEF").unwrap();
6862 recv!(s, time 1000, Ok(TcpRepr {
6863 seq_number: LOCAL_SEQ + 1,
6864 ack_number: Some(REMOTE_SEQ + 1 + 1),
6865 payload: &b"abcdef"[..],
6866 ..RECV_TEMPL
6867 }));
6868 send!(s, time 1005, TcpRepr {
6869 seq_number: REMOTE_SEQ + 1 + 1,
6870 ack_number: Some(LOCAL_SEQ + 1 + 6),
6871 window_len: 6,
6872 ..SEND_TEMPL
6873 });
6874 recv!(s, time 1010, Ok(TcpRepr {
6875 seq_number: LOCAL_SEQ + 1 + 6,
6876 ack_number: Some(REMOTE_SEQ + 1 + 1),
6877 payload: &b"123456"[..],
6878 ..RECV_TEMPL
6879 }));
6880 send!(s, time 1015, TcpRepr {
6881 seq_number: REMOTE_SEQ + 1 + 1,
6882 ack_number: Some(LOCAL_SEQ + 1 + 6 + 6),
6883 window_len: 6,
6884 ..SEND_TEMPL
6885 });
6886 recv!(s, time 1020, Ok(TcpRepr {
6887 seq_number: LOCAL_SEQ + 1 + 6 + 6,
6888 ack_number: Some(REMOTE_SEQ + 1 + 1),
6889 payload: &b"ABCDEF"[..],
6890 ..RECV_TEMPL
6891 }));
6892 }
6893
6894 #[test]
6895 fn test_fin_wait_1_retransmit_reset_after_ack() {
6896 let mut s = socket_established();
6897 s.remote_win_len = 6;
6898 s.send_slice(b"abcdef").unwrap();
6899 s.send_slice(b"123456").unwrap();
6900 s.send_slice(b"ABCDEF").unwrap();
6901 s.close();
6902 recv!(s, time 1000, Ok(TcpRepr {
6903 seq_number: LOCAL_SEQ + 1,
6904 ack_number: Some(REMOTE_SEQ + 1),
6905 payload: &b"abcdef"[..],
6906 ..RECV_TEMPL
6907 }));
6908 send!(s, time 1005, TcpRepr {
6909 seq_number: REMOTE_SEQ + 1,
6910 ack_number: Some(LOCAL_SEQ + 1 + 6),
6911 window_len: 6,
6912 ..SEND_TEMPL
6913 });
6914 recv!(s, time 1010, Ok(TcpRepr {
6915 seq_number: LOCAL_SEQ + 1 + 6,
6916 ack_number: Some(REMOTE_SEQ + 1),
6917 payload: &b"123456"[..],
6918 ..RECV_TEMPL
6919 }));
6920 send!(s, time 1015, TcpRepr {
6921 seq_number: REMOTE_SEQ + 1,
6922 ack_number: Some(LOCAL_SEQ + 1 + 6 + 6),
6923 window_len: 6,
6924 ..SEND_TEMPL
6925 });
6926 recv!(s, time 1020, Ok(TcpRepr {
6927 control: TcpControl::Fin,
6928 seq_number: LOCAL_SEQ + 1 + 6 + 6,
6929 ack_number: Some(REMOTE_SEQ + 1),
6930 payload: &b"ABCDEF"[..],
6931 ..RECV_TEMPL
6932 }));
6933 }
6934
6935 #[test]
6936 fn test_fast_retransmit_after_triple_duplicate_ack() {
6937 let mut s = socket_established();
6938 s.remote_mss = 3;
6939
6940 send!(s, time 0, TcpRepr {
6942 seq_number: REMOTE_SEQ + 1,
6943 ack_number: Some(LOCAL_SEQ + 1),
6944 ..SEND_TEMPL
6945 });
6946
6947 s.send_slice(b"aaaBBBcccDDDeeeFFF").unwrap();
6950
6951 recv!(s, time 1000, Ok(TcpRepr {
6953 seq_number: LOCAL_SEQ + 1,
6954 ack_number: Some(REMOTE_SEQ + 1),
6955 payload: &b"aaa"[..],
6956 ..RECV_TEMPL
6957 }));
6958
6959 recv!(s, time 1005, Ok(TcpRepr {
6961 seq_number: LOCAL_SEQ + 1 + 3,
6962 ack_number: Some(REMOTE_SEQ + 1),
6963 payload: &b"BBB"[..],
6964 ..RECV_TEMPL
6965 }));
6966 recv!(s, time 1010, Ok(TcpRepr {
6967 seq_number: LOCAL_SEQ + 1 + (3 * 2),
6968 ack_number: Some(REMOTE_SEQ + 1),
6969 payload: &b"ccc"[..],
6970 ..RECV_TEMPL
6971 }));
6972 recv!(s, time 1015, Ok(TcpRepr {
6973 seq_number: LOCAL_SEQ + 1 + (3 * 3),
6974 ack_number: Some(REMOTE_SEQ + 1),
6975 payload: &b"DDD"[..],
6976 ..RECV_TEMPL
6977 }));
6978
6979 send!(s, time 1050, TcpRepr {
6981 seq_number: REMOTE_SEQ + 1,
6982 ack_number: Some(LOCAL_SEQ + 1),
6983 ..SEND_TEMPL
6984 });
6985 send!(s, time 1055, TcpRepr {
6986 seq_number: REMOTE_SEQ + 1,
6987 ack_number: Some(LOCAL_SEQ + 1),
6988 ..SEND_TEMPL
6989 });
6990 send!(s, time 1060, TcpRepr {
6991 seq_number: REMOTE_SEQ + 1,
6992 ack_number: Some(LOCAL_SEQ + 1),
6993 ..SEND_TEMPL
6994 });
6995
6996 recv!(s, time 1100, Ok(TcpRepr {
6998 seq_number: LOCAL_SEQ + 1,
6999 ack_number: Some(REMOTE_SEQ + 1),
7000 payload: &b"aaa"[..],
7001 ..RECV_TEMPL
7002 }));
7003
7004 recv!(s, time 1105, Ok(TcpRepr {
7006 seq_number: LOCAL_SEQ + 1 + (3 * 4),
7007 ack_number: Some(REMOTE_SEQ + 1),
7008 payload: &b"eee"[..],
7009 ..RECV_TEMPL
7010 }));
7011 recv!(s, time 1110, Ok(TcpRepr {
7012 seq_number: LOCAL_SEQ + 1 + (3 * 5),
7013 ack_number: Some(REMOTE_SEQ + 1),
7014 payload: &b"FFF"[..],
7015 ..RECV_TEMPL
7016 }));
7017
7018 send!(s, time 1120, TcpRepr {
7020 seq_number: REMOTE_SEQ + 1,
7021 ack_number: Some(LOCAL_SEQ + 1 + (3 * 5)),
7022 ..SEND_TEMPL
7023 });
7024 }
7025
7026 #[test]
7027 fn test_fast_retransmit_duplicate_detection_with_data() {
7028 let mut s = socket_established();
7029
7030 s.send_slice(b"abc").unwrap(); recv!(s, time 1000, Ok(TcpRepr {
7032 seq_number: LOCAL_SEQ + 1,
7033 ack_number: Some(REMOTE_SEQ + 1),
7034 payload: &b"abc"[..],
7035 ..RECV_TEMPL
7036 }));
7037
7038 send!(
7040 s,
7041 TcpRepr {
7042 seq_number: REMOTE_SEQ + 1,
7043 ack_number: Some(LOCAL_SEQ + 1),
7044 ..SEND_TEMPL
7045 }
7046 );
7047 send!(
7049 s,
7050 TcpRepr {
7051 seq_number: REMOTE_SEQ + 1,
7052 ack_number: Some(LOCAL_SEQ + 1),
7053 ..SEND_TEMPL
7054 }
7055 );
7056 send!(
7058 s,
7059 TcpRepr {
7060 seq_number: REMOTE_SEQ + 1,
7061 ack_number: Some(LOCAL_SEQ + 1),
7062 ..SEND_TEMPL
7063 }
7064 );
7065
7066 assert_eq!(s.local_rx_dup_acks, 2, "duplicate ACK counter is not set");
7067
7068 send!(
7071 s,
7072 TcpRepr {
7073 seq_number: REMOTE_SEQ + 1,
7074 ack_number: Some(LOCAL_SEQ + 1),
7075 payload: &b"xxxxxx"[..],
7076 ..SEND_TEMPL
7077 }
7078 );
7079
7080 recv!(
7081 s,
7082 [TcpRepr {
7083 seq_number: LOCAL_SEQ + 1 + 3,
7084 ack_number: Some(REMOTE_SEQ + 1 + 6),
7085 window_len: 58,
7086 ..RECV_TEMPL
7087 }]
7088 );
7089
7090 assert_eq!(
7091 s.local_rx_dup_acks, 0,
7092 "duplicate ACK counter is not reset when receiving data"
7093 );
7094 }
7095
7096 #[test]
7097 fn test_fast_retransmit_duplicate_detection_with_window_update() {
7098 let mut s = socket_established();
7099
7100 s.send_slice(b"abc").unwrap(); recv!(s, time 1000, Ok(TcpRepr {
7102 seq_number: LOCAL_SEQ + 1,
7103 ack_number: Some(REMOTE_SEQ + 1),
7104 payload: &b"abc"[..],
7105 ..RECV_TEMPL
7106 }));
7107
7108 send!(
7110 s,
7111 TcpRepr {
7112 seq_number: REMOTE_SEQ + 1,
7113 ack_number: Some(LOCAL_SEQ + 1),
7114 ..SEND_TEMPL
7115 }
7116 );
7117 send!(
7119 s,
7120 TcpRepr {
7121 seq_number: REMOTE_SEQ + 1,
7122 ack_number: Some(LOCAL_SEQ + 1),
7123 ..SEND_TEMPL
7124 }
7125 );
7126 send!(
7128 s,
7129 TcpRepr {
7130 seq_number: REMOTE_SEQ + 1,
7131 ack_number: Some(LOCAL_SEQ + 1),
7132 ..SEND_TEMPL
7133 }
7134 );
7135
7136 assert_eq!(s.local_rx_dup_acks, 2, "duplicate ACK counter is not set");
7137
7138 send!(
7141 s,
7142 TcpRepr {
7143 seq_number: REMOTE_SEQ + 1,
7144 ack_number: Some(LOCAL_SEQ + 1),
7145 window_len: 400,
7146 ..SEND_TEMPL
7147 }
7148 );
7149
7150 assert_eq!(
7151 s.local_rx_dup_acks, 0,
7152 "duplicate ACK counter is not reset when receiving a window update"
7153 );
7154 }
7155
7156 #[test]
7157 fn test_fast_retransmit_duplicate_detection() {
7158 let mut s = socket_established();
7159 s.remote_mss = 6;
7160
7161 send!(s, time 0, TcpRepr {
7163 seq_number: REMOTE_SEQ + 1,
7164 ack_number: Some(LOCAL_SEQ + 1),
7165 ..SEND_TEMPL
7166 });
7167
7168 send!(s, time 0, TcpRepr {
7170 seq_number: REMOTE_SEQ + 1,
7171 ack_number: Some(LOCAL_SEQ + 1),
7172 ..SEND_TEMPL
7173 });
7174
7175 assert_eq!(
7176 s.local_rx_dup_acks, 0,
7177 "duplicate ACK counter is set but wound not transmit data"
7178 );
7179
7180 s.send_slice(b"xxxxxxyyyyyywwwwwwzzzzzz").unwrap();
7183
7184 recv!(s, time 1000, Ok(TcpRepr {
7186 seq_number: LOCAL_SEQ + 1,
7187 ack_number: Some(REMOTE_SEQ + 1),
7188 payload: &b"xxxxxx"[..],
7189 ..RECV_TEMPL
7190 }));
7191 recv!(s, time 1005, Ok(TcpRepr {
7192 seq_number: LOCAL_SEQ + 1 + 6,
7193 ack_number: Some(REMOTE_SEQ + 1),
7194 payload: &b"yyyyyy"[..],
7195 ..RECV_TEMPL
7196 }));
7197 recv!(s, time 1010, Ok(TcpRepr {
7198 seq_number: LOCAL_SEQ + 1 + (6 * 2),
7199 ack_number: Some(REMOTE_SEQ + 1),
7200 payload: &b"wwwwww"[..],
7201 ..RECV_TEMPL
7202 }));
7203 recv!(s, time 1015, Ok(TcpRepr {
7204 seq_number: LOCAL_SEQ + 1 + (6 * 3),
7205 ack_number: Some(REMOTE_SEQ + 1),
7206 payload: &b"zzzzzz"[..],
7207 ..RECV_TEMPL
7208 }));
7209
7210 send!(s, time 1050, TcpRepr {
7212 seq_number: REMOTE_SEQ + 1,
7213 ack_number: Some(LOCAL_SEQ + 1),
7214 ..SEND_TEMPL
7215 });
7216 send!(s, time 1055, TcpRepr {
7218 seq_number: REMOTE_SEQ + 1,
7219 ack_number: Some(LOCAL_SEQ + 1),
7220 ..SEND_TEMPL
7221 });
7222 send!(s, time 1060, TcpRepr {
7224 seq_number: REMOTE_SEQ + 1,
7225 ack_number: Some(LOCAL_SEQ + 1 + (6 * 3)),
7226 ..SEND_TEMPL
7227 });
7228
7229 assert_eq!(
7230 s.local_rx_dup_acks, 0,
7231 "duplicate ACK counter is not reset when receiving ACK which updates send window"
7232 );
7233
7234 send!(s, time 1120, TcpRepr {
7236 seq_number: REMOTE_SEQ + 1,
7237 ack_number: Some(LOCAL_SEQ + 1 + (6 * 4)),
7238 ..SEND_TEMPL
7239 });
7240 }
7241
7242 #[test]
7243 fn test_fast_retransmit_dup_acks_counter() {
7244 let mut s = socket_established();
7245
7246 s.send_slice(b"abc").unwrap(); recv!(s, time 0, Ok(TcpRepr {
7248 seq_number: LOCAL_SEQ + 1,
7249 ack_number: Some(REMOTE_SEQ + 1),
7250 payload: &b"abc"[..],
7251 ..RECV_TEMPL
7252 }));
7253
7254 send!(s, time 0, TcpRepr {
7255 seq_number: REMOTE_SEQ + 1,
7256 ack_number: Some(LOCAL_SEQ + 1),
7257 ..SEND_TEMPL
7258 });
7259
7260 s.local_rx_dup_acks = u8::MAX - 1;
7262
7263 send!(s, time 0, TcpRepr {
7267 seq_number: REMOTE_SEQ + 1,
7268 ack_number: Some(LOCAL_SEQ + 1),
7269 ..SEND_TEMPL
7270 });
7271 send!(s, time 0, TcpRepr {
7272 seq_number: REMOTE_SEQ + 1,
7273 ack_number: Some(LOCAL_SEQ + 1),
7274 ..SEND_TEMPL
7275 });
7276 send!(s, time 0, TcpRepr {
7277 seq_number: REMOTE_SEQ + 1,
7278 ack_number: Some(LOCAL_SEQ + 1),
7279 ..SEND_TEMPL
7280 });
7281 assert_eq!(
7282 s.local_rx_dup_acks,
7283 u8::MAX,
7284 "duplicate ACK count should not overflow but saturate"
7285 );
7286 }
7287
7288 #[test]
7289 fn test_fast_retransmit_zero_window() {
7290 let mut s = socket_established();
7291
7292 send!(s, time 1000, TcpRepr {
7293 seq_number: REMOTE_SEQ + 1,
7294 ack_number: Some(LOCAL_SEQ + 1),
7295 ..SEND_TEMPL
7296 });
7297
7298 s.send_slice(b"abc").unwrap();
7299
7300 recv!(s, time 0, Ok(TcpRepr {
7301 seq_number: LOCAL_SEQ + 1,
7302 ack_number: Some(REMOTE_SEQ + 1),
7303 payload: &b"abc"[..],
7304 ..RECV_TEMPL
7305 }));
7306
7307 send!(s, time 1050, TcpRepr {
7309 seq_number: REMOTE_SEQ + 1,
7310 ack_number: Some(LOCAL_SEQ + 1),
7311 ..SEND_TEMPL
7312 });
7313 send!(s, time 1050, TcpRepr {
7314 seq_number: REMOTE_SEQ + 1,
7315 ack_number: Some(LOCAL_SEQ + 1),
7316 ..SEND_TEMPL
7317 });
7318 send!(s, time 1050, TcpRepr {
7319 seq_number: REMOTE_SEQ + 1,
7320 ack_number: Some(LOCAL_SEQ + 1),
7321 window_len: 0, ..SEND_TEMPL
7323 });
7324
7325 recv_nothing!(s);
7328 }
7329
7330 #[test]
7331 fn test_retransmit_exponential_backoff() {
7332 let mut s = socket_established();
7333 s.send_slice(b"abcdef").unwrap();
7334 recv!(s, time 0, Ok(TcpRepr {
7335 seq_number: LOCAL_SEQ + 1,
7336 ack_number: Some(REMOTE_SEQ + 1),
7337 payload: &b"abcdef"[..],
7338 ..RECV_TEMPL
7339 }));
7340
7341 let expected_retransmission_instant = s.rtte.retransmission_timeout().total_millis() as i64;
7342 recv_nothing!(s, time expected_retransmission_instant - 1);
7343 recv!(s, time expected_retransmission_instant, Ok(TcpRepr {
7344 seq_number: LOCAL_SEQ + 1,
7345 ack_number: Some(REMOTE_SEQ + 1),
7346 payload: &b"abcdef"[..],
7347 ..RECV_TEMPL
7348 }));
7349
7350 let expected_retransmission_instant = 3 * expected_retransmission_instant;
7352
7353 recv_nothing!(s, time expected_retransmission_instant - 1);
7354 recv!(s, time expected_retransmission_instant, Ok(TcpRepr {
7355 seq_number: LOCAL_SEQ + 1,
7356 ack_number: Some(REMOTE_SEQ + 1),
7357 payload: &b"abcdef"[..],
7358 ..RECV_TEMPL
7359 }));
7360 }
7361
7362 #[test]
7363 fn test_data_retransmit_ack_more_than_expected() {
7364 let mut s = socket_established();
7365 s.remote_mss = 6;
7366 s.send_slice(b"aaaaaabbbbbbcccccc").unwrap();
7367
7368 recv!(s, time 0, Ok(TcpRepr {
7369 seq_number: LOCAL_SEQ + 1,
7370 ack_number: Some(REMOTE_SEQ + 1),
7371 payload: &b"aaaaaa"[..],
7372 ..RECV_TEMPL
7373 }));
7374 recv!(s, time 0, Ok(TcpRepr {
7375 seq_number: LOCAL_SEQ + 1 + 6,
7376 ack_number: Some(REMOTE_SEQ + 1),
7377 payload: &b"bbbbbb"[..],
7378 ..RECV_TEMPL
7379 }));
7380 recv!(s, time 0, Ok(TcpRepr {
7381 seq_number: LOCAL_SEQ + 1 + 12,
7382 ack_number: Some(REMOTE_SEQ + 1),
7383 payload: &b"cccccc"[..],
7384 ..RECV_TEMPL
7385 }));
7386 recv_nothing!(s, time 0);
7387
7388 recv_nothing!(s, time 50);
7389
7390 assert!(s.timer.is_retransmit());
7393 recv!(s, time 1000, Ok(TcpRepr {
7394 seq_number: LOCAL_SEQ + 1,
7395 ack_number: Some(REMOTE_SEQ + 1),
7396 payload: &b"aaaaaa"[..],
7397 ..RECV_TEMPL
7398 }));
7399 recv!(s, time 1000, Ok(TcpRepr {
7400 seq_number: LOCAL_SEQ + 1 + 6,
7401 ack_number: Some(REMOTE_SEQ + 1),
7402 payload: &b"bbbbbb"[..],
7403 ..RECV_TEMPL
7404 }));
7405
7406 send!(
7408 s,
7409 time 3000,
7410 TcpRepr {
7411 seq_number: REMOTE_SEQ + 1,
7412 ack_number: Some(LOCAL_SEQ + 1 + 6),
7413 ..SEND_TEMPL
7414 }
7415 );
7416
7417 assert!(s.timer.is_retransmit());
7420
7421 send!(
7425 s,
7426 time 3000,
7427 TcpRepr {
7428 seq_number: REMOTE_SEQ + 1,
7429 ack_number: Some(LOCAL_SEQ + 1 + 18),
7430 ..SEND_TEMPL
7431 }
7432 );
7433
7434 assert!(!s.timer.is_retransmit());
7436 assert!(s.tx_buffer.is_empty());
7438 recv_nothing!(s, time 5000);
7439 }
7440
7441 #[test]
7442 fn test_retransmit_fin() {
7443 let mut s = socket_established();
7444 s.close();
7445 recv!(s, time 0, Ok(TcpRepr {
7446 control: TcpControl::Fin,
7447 seq_number: LOCAL_SEQ + 1,
7448 ack_number: Some(REMOTE_SEQ + 1),
7449 ..RECV_TEMPL
7450 }));
7451
7452 recv_nothing!(s, time 999);
7453 recv!(s, time 1000, Ok(TcpRepr {
7454 control: TcpControl::Fin,
7455 seq_number: LOCAL_SEQ + 1,
7456 ack_number: Some(REMOTE_SEQ + 1),
7457 ..RECV_TEMPL
7458 }));
7459 }
7460
7461 #[test]
7462 fn test_retransmit_fin_wait() {
7463 let mut s = socket_fin_wait_1();
7464 recv!(
7466 s,
7467 [TcpRepr {
7468 control: TcpControl::Fin,
7469 seq_number: LOCAL_SEQ + 1,
7470 ack_number: Some(REMOTE_SEQ + 1),
7471 ..RECV_TEMPL
7472 }]
7473 );
7474 send!(
7476 s,
7477 TcpRepr {
7478 control: TcpControl::Fin,
7479 seq_number: REMOTE_SEQ + 1,
7480 ack_number: Some(LOCAL_SEQ + 1),
7481 ..SEND_TEMPL
7482 }
7483 );
7484 recv!(
7486 s,
7487 [TcpRepr {
7488 control: TcpControl::None,
7489 seq_number: LOCAL_SEQ + 2,
7490 ack_number: Some(REMOTE_SEQ + 2),
7491 ..RECV_TEMPL
7492 }]
7493 );
7494
7495 recv_nothing!(s, time 999);
7497 recv!(
7498 s,
7499 time 1000,
7500 [TcpRepr {
7501 control: TcpControl::Fin,
7502 seq_number: LOCAL_SEQ + 1,
7503 ack_number: Some(REMOTE_SEQ + 2),
7504 ..RECV_TEMPL
7505 }]
7506 );
7507 recv_nothing!(s, time 2999);
7508 recv!(
7509 s,
7510 time 3000,
7511 [TcpRepr {
7512 control: TcpControl::Fin,
7513 seq_number: LOCAL_SEQ + 1,
7514 ack_number: Some(REMOTE_SEQ + 2),
7515 ..RECV_TEMPL
7516 }]
7517 );
7518 }
7519
7520 #[test]
7525 fn test_maximum_segment_size() {
7526 let mut s = socket_listen();
7527 s.tx_buffer = SocketBuffer::new(vec![0; 32767]);
7528 send!(
7529 s,
7530 TcpRepr {
7531 control: TcpControl::Syn,
7532 seq_number: REMOTE_SEQ,
7533 ack_number: None,
7534 max_seg_size: Some(1000),
7535 ..SEND_TEMPL
7536 }
7537 );
7538 recv!(
7539 s,
7540 [TcpRepr {
7541 control: TcpControl::Syn,
7542 seq_number: LOCAL_SEQ,
7543 ack_number: Some(REMOTE_SEQ + 1),
7544 max_seg_size: Some(BASE_MSS),
7545 ..RECV_TEMPL
7546 }]
7547 );
7548 send!(
7549 s,
7550 TcpRepr {
7551 seq_number: REMOTE_SEQ + 1,
7552 ack_number: Some(LOCAL_SEQ + 1),
7553 window_len: 32767,
7554 ..SEND_TEMPL
7555 }
7556 );
7557 s.send_slice(&[0; 1200][..]).unwrap();
7558 recv!(
7559 s,
7560 Ok(TcpRepr {
7561 seq_number: LOCAL_SEQ + 1,
7562 ack_number: Some(REMOTE_SEQ + 1),
7563 payload: &[0; 1000][..],
7564 ..RECV_TEMPL
7565 })
7566 );
7567 }
7568
7569 #[cfg(feature = "segmentation-offload")]
7570 #[test]
7571 fn test_segmentation_offload() {
7572 use crate::tests::segmentation_offload::MAX_SEGMENTABLE_SIZE;
7573 use crate::wire;
7574
7575 let (interface, _, _) =
7576 crate::tests::segmentation_offload::setup_segmenting(crate::phy::Medium::Ip);
7577 let mut s = TestSocket {
7578 cx: interface.inner,
7579 ..socket_listen()
7580 };
7581 s.tx_buffer = SocketBuffer::new(vec![0; 2 * MAX_SEGMENTABLE_SIZE]);
7582
7583 send!(
7584 s,
7585 TcpRepr {
7586 control: TcpControl::Syn,
7587 seq_number: REMOTE_SEQ,
7588 ack_number: None,
7589 window_scale: Some(2),
7590 ..SEND_TEMPL
7591 }
7592 );
7593 recv!(
7594 s,
7595 [TcpRepr {
7596 control: TcpControl::Syn,
7597 seq_number: LOCAL_SEQ,
7598 ack_number: Some(REMOTE_SEQ + 1),
7599 max_seg_size: Some(BASE_MSS),
7600 window_scale: Some(0),
7601 ..RECV_TEMPL
7602 }]
7603 );
7604 send!(
7605 s,
7606 TcpRepr {
7607 seq_number: REMOTE_SEQ + 1,
7608 ack_number: Some(LOCAL_SEQ + 1),
7609 window_len: u16::MAX,
7610 ..SEND_TEMPL
7611 }
7612 );
7613
7614 s.send_slice(&[0; 2 * MAX_SEGMENTABLE_SIZE][..]).unwrap();
7615
7616 let ip_header_len = match s.local_endpoint().unwrap().addr {
7621 #[cfg(feature = "proto-ipv4")]
7622 IpAddress::Ipv4(_) => {
7623 assert!(MAX_SEGMENTABLE_SIZE > usize::from(u16::MAX));
7624 wire::IPV4_HEADER_LEN
7625 }
7626 #[cfg(feature = "proto-ipv6")]
7627 IpAddress::Ipv6(_) => {
7628 assert!(MAX_SEGMENTABLE_SIZE - wire::IPV6_HEADER_LEN > usize::from(u16::MAX));
7629 wire::IPV6_HEADER_LEN
7630 }
7631 };
7632 let payload = vec![0; MAX_SEGMENTABLE_SIZE - ip_header_len - TCP_HEADER_LEN];
7633 assert!(
7634 payload.len() > usize::from(BASE_MSS),
7635 "the payload is not large enough to require segmentation!"
7636 );
7637
7638 recv!(
7639 s,
7640 [
7641 TcpRepr {
7642 seq_number: LOCAL_SEQ + 1,
7643 ack_number: Some(REMOTE_SEQ + 1),
7644 payload: payload.as_slice(),
7645 ..RECV_TEMPL
7646 },
7647 TcpRepr {
7648 seq_number: LOCAL_SEQ + payload.len() + 1,
7649 ack_number: Some(REMOTE_SEQ + 1),
7650 payload: payload.as_slice(),
7651 ..RECV_TEMPL
7652 }
7653 ]
7654 );
7655 }
7656
7657 #[test]
7658 fn test_recv_out_of_recv_win() {
7659 let mut s = socket_established();
7660 s.set_ack_delay(Some(ACK_DELAY_DEFAULT));
7661 s.remote_mss = 32;
7662
7663 send!(
7665 s,
7666 TcpRepr {
7667 control: TcpControl::Psh,
7668 seq_number: REMOTE_SEQ + 1,
7669 ack_number: Some(LOCAL_SEQ + 1),
7670 payload: &[0; 32],
7671 ..SEND_TEMPL
7672 }
7673 );
7674 recv_nothing!(s);
7675
7676 send!(
7678 s,
7679 TcpRepr {
7680 control: TcpControl::Psh,
7681 seq_number: REMOTE_SEQ + 33,
7682 ack_number: Some(LOCAL_SEQ + 1),
7683 payload: &[0; 1],
7684 ..SEND_TEMPL
7685 }
7686 );
7687 recv!(
7688 s,
7689 Ok(TcpRepr {
7690 seq_number: LOCAL_SEQ + 1,
7691 ack_number: Some(REMOTE_SEQ + 34),
7692 window_len: 31,
7693 ..RECV_TEMPL
7694 })
7695 );
7696
7697 s.recv_slice(&mut [0; 1]).unwrap();
7700 recv_nothing!(s);
7701
7702 send!(
7705 s,
7706 TcpRepr {
7707 control: TcpControl::Psh,
7708 seq_number: REMOTE_SEQ + 34,
7709 ack_number: Some(LOCAL_SEQ + 1),
7710 payload: &[0; 32],
7711 ..SEND_TEMPL
7712 }
7713 );
7714 recv!(
7715 s,
7716 Ok(TcpRepr {
7717 seq_number: LOCAL_SEQ + 1,
7718 ack_number: Some(REMOTE_SEQ + 65),
7719 window_len: 1, ..RECV_TEMPL
7721 })
7722 );
7723 }
7724
7725 #[test]
7726 fn test_close_wait_no_window_update() {
7727 let mut s = socket_established();
7728 send!(
7729 s,
7730 TcpRepr {
7731 control: TcpControl::Fin,
7732 seq_number: REMOTE_SEQ + 1,
7733 ack_number: Some(LOCAL_SEQ + 1),
7734 payload: &[1, 2, 3, 4],
7735 ..SEND_TEMPL
7736 }
7737 );
7738 assert_eq!(s.state, State::CloseWait);
7739
7740 recv!(
7742 s,
7743 Ok(TcpRepr {
7744 seq_number: LOCAL_SEQ + 1,
7745 ack_number: Some(REMOTE_SEQ + 6),
7746 window_len: 60,
7747 ..RECV_TEMPL
7748 })
7749 );
7750
7751 let rx_buf = &mut [0; 32];
7752 assert_eq!(s.recv_slice(rx_buf), Ok(4));
7753
7754 recv_nothing!(s);
7756 }
7757
7758 #[test]
7759 fn test_time_wait_no_window_update() {
7760 let mut s = socket_fin_wait_2();
7761 send!(
7762 s,
7763 TcpRepr {
7764 control: TcpControl::Fin,
7765 seq_number: REMOTE_SEQ + 1,
7766 ack_number: Some(LOCAL_SEQ + 2),
7767 payload: &[1, 2, 3, 4],
7768 ..SEND_TEMPL
7769 }
7770 );
7771 assert_eq!(s.state, State::TimeWait);
7772
7773 recv!(
7775 s,
7776 Ok(TcpRepr {
7777 seq_number: LOCAL_SEQ + 2,
7778 ack_number: Some(REMOTE_SEQ + 6),
7779 window_len: 60,
7780 ..RECV_TEMPL
7781 })
7782 );
7783
7784 let rx_buf = &mut [0; 32];
7785 assert_eq!(s.recv_slice(rx_buf), Ok(4));
7786
7787 recv_nothing!(s);
7789 }
7790
7791 #[test]
7796 fn test_psh_transmit() {
7797 let mut s = socket_established();
7798 s.remote_mss = 6;
7799 s.send_slice(b"abcdef").unwrap();
7800 s.send_slice(b"123456").unwrap();
7801 recv!(s, time 0, Ok(TcpRepr {
7802 control: TcpControl::None,
7803 seq_number: LOCAL_SEQ + 1,
7804 ack_number: Some(REMOTE_SEQ + 1),
7805 payload: &b"abcdef"[..],
7806 ..RECV_TEMPL
7807 }), exact);
7808 recv!(s, time 0, Ok(TcpRepr {
7809 control: TcpControl::Psh,
7810 seq_number: LOCAL_SEQ + 1 + 6,
7811 ack_number: Some(REMOTE_SEQ + 1),
7812 payload: &b"123456"[..],
7813 ..RECV_TEMPL
7814 }), exact);
7815 }
7816
7817 #[test]
7818 fn test_psh_receive() {
7819 let mut s = socket_established();
7820 send!(
7821 s,
7822 TcpRepr {
7823 control: TcpControl::Psh,
7824 seq_number: REMOTE_SEQ + 1,
7825 ack_number: Some(LOCAL_SEQ + 1),
7826 payload: &b"abcdef"[..],
7827 ..SEND_TEMPL
7828 }
7829 );
7830 recv!(
7831 s,
7832 [TcpRepr {
7833 seq_number: LOCAL_SEQ + 1,
7834 ack_number: Some(REMOTE_SEQ + 1 + 6),
7835 window_len: 58,
7836 ..RECV_TEMPL
7837 }]
7838 );
7839 }
7840
7841 #[test]
7842 fn test_zero_window_ack() {
7843 let mut s = socket_established();
7844 s.rx_buffer = SocketBuffer::new(vec![0; 6]);
7845 s.assembler = Assembler::new();
7846 send!(
7847 s,
7848 TcpRepr {
7849 seq_number: REMOTE_SEQ + 1,
7850 ack_number: Some(LOCAL_SEQ + 1),
7851 payload: &b"abcdef"[..],
7852 ..SEND_TEMPL
7853 }
7854 );
7855 recv!(
7856 s,
7857 [TcpRepr {
7858 seq_number: LOCAL_SEQ + 1,
7859 ack_number: Some(REMOTE_SEQ + 1 + 6),
7860 window_len: 0,
7861 ..RECV_TEMPL
7862 }]
7863 );
7864 send!(
7865 s,
7866 TcpRepr {
7867 seq_number: REMOTE_SEQ + 1 + 6,
7868 ack_number: Some(LOCAL_SEQ + 1),
7869 payload: &b"123456"[..],
7870 ..SEND_TEMPL
7871 },
7872 Some(TcpRepr {
7873 seq_number: LOCAL_SEQ + 1,
7874 ack_number: Some(REMOTE_SEQ + 1 + 6),
7875 window_len: 0,
7876 ..RECV_TEMPL
7877 })
7878 );
7879 }
7880
7881 #[test]
7882 fn test_zero_window_ack_not_rate_limited() {
7883 let mut s = socket_established();
7884 s.rx_buffer = SocketBuffer::new(vec![0; 6]);
7885 s.assembler = Assembler::new();
7886 send!(
7887 s,
7888 TcpRepr {
7889 seq_number: REMOTE_SEQ + 1,
7890 ack_number: Some(LOCAL_SEQ + 1),
7891 payload: &b"abcdef"[..],
7892 ..SEND_TEMPL
7893 }
7894 );
7895 recv!(
7896 s,
7897 [TcpRepr {
7898 seq_number: LOCAL_SEQ + 1,
7899 ack_number: Some(REMOTE_SEQ + 1 + 6),
7900 window_len: 0,
7901 ..RECV_TEMPL
7902 }]
7903 );
7904 send!(
7905 s,
7906 TcpRepr {
7907 seq_number: REMOTE_SEQ + 1 + 6,
7908 ack_number: Some(LOCAL_SEQ + 1),
7909 payload: &b"123456"[..],
7910 ..SEND_TEMPL
7911 },
7912 Some(TcpRepr {
7913 seq_number: LOCAL_SEQ + 1,
7914 ack_number: Some(REMOTE_SEQ + 1 + 6),
7915 window_len: 0,
7916 ..RECV_TEMPL
7917 })
7918 );
7919 send!(
7924 s,
7925 time 100,
7926 TcpRepr {
7927 seq_number: REMOTE_SEQ + 1 + 6,
7928 ack_number: Some(LOCAL_SEQ + 1),
7929 payload: &b"123456"[..],
7930 ..SEND_TEMPL
7931 },
7932 Some(TcpRepr {
7933 seq_number: LOCAL_SEQ + 1,
7934 ack_number: Some(REMOTE_SEQ + 1 + 6),
7935 window_len: 0,
7936 ..RECV_TEMPL
7937 })
7938 );
7939 }
7940
7941 #[test]
7942 fn test_zero_window_fin() {
7943 let mut s = socket_established();
7944 s.rx_buffer = SocketBuffer::new(vec![0; 6]);
7945 s.assembler = Assembler::new();
7946 s.ack_delay = None;
7947
7948 send!(
7949 s,
7950 TcpRepr {
7951 seq_number: REMOTE_SEQ + 1,
7952 ack_number: Some(LOCAL_SEQ + 1),
7953 payload: &b"abcdef"[..],
7954 ..SEND_TEMPL
7955 }
7956 );
7957 recv!(
7958 s,
7959 [TcpRepr {
7960 seq_number: LOCAL_SEQ + 1,
7961 ack_number: Some(REMOTE_SEQ + 1 + 6),
7962 window_len: 0,
7963 ..RECV_TEMPL
7964 }]
7965 );
7966
7967 send!(
7970 s,
7971 TcpRepr {
7972 seq_number: REMOTE_SEQ + 1 + 6,
7973 ack_number: Some(LOCAL_SEQ + 1),
7974 payload: &[],
7975 control: TcpControl::Fin,
7976 ..SEND_TEMPL
7977 }
7978 );
7979 assert_eq!(s.state, State::CloseWait);
7980
7981 recv!(
7982 s,
7983 [TcpRepr {
7984 seq_number: LOCAL_SEQ + 1,
7985 ack_number: Some(REMOTE_SEQ + 1 + 7),
7986 window_len: 0,
7987 ..RECV_TEMPL
7988 }]
7989 );
7990 }
7991
7992 #[test]
7993 fn test_zero_window_ack_on_window_growth() {
7994 let mut s = socket_established();
7995 s.rx_buffer = SocketBuffer::new(vec![0; 6]);
7996 s.assembler = Assembler::new();
7997 send!(
7998 s,
7999 TcpRepr {
8000 seq_number: REMOTE_SEQ + 1,
8001 ack_number: Some(LOCAL_SEQ + 1),
8002 payload: &b"abcdef"[..],
8003 ..SEND_TEMPL
8004 }
8005 );
8006 recv!(
8007 s,
8008 [TcpRepr {
8009 seq_number: LOCAL_SEQ + 1,
8010 ack_number: Some(REMOTE_SEQ + 1 + 6),
8011 window_len: 0,
8012 ..RECV_TEMPL
8013 }]
8014 );
8015 recv_nothing!(s, time 0);
8016 s.recv(|buffer| {
8017 assert_eq!(&buffer[..3], b"abc");
8018 (3, ())
8019 })
8020 .unwrap();
8021 recv!(s, time 0, Ok(TcpRepr {
8022 seq_number: LOCAL_SEQ + 1,
8023 ack_number: Some(REMOTE_SEQ + 1 + 6),
8024 window_len: 3,
8025 ..RECV_TEMPL
8026 }));
8027 recv_nothing!(s, time 0);
8028 s.recv(|buffer| {
8029 assert_eq!(buffer, b"def");
8030 (buffer.len(), ())
8031 })
8032 .unwrap();
8033 recv!(s, time 0, Ok(TcpRepr {
8034 seq_number: LOCAL_SEQ + 1,
8035 ack_number: Some(REMOTE_SEQ + 1 + 6),
8036 window_len: 6,
8037 ..RECV_TEMPL
8038 }));
8039 }
8040
8041 #[test]
8042 fn test_window_update_with_delay_ack() {
8043 let mut s = socket_established_with_buffer_sizes(6, 6);
8044 s.ack_delay = Some(Duration::from_millis(10));
8045
8046 send!(
8047 s,
8048 TcpRepr {
8049 seq_number: REMOTE_SEQ + 1,
8050 ack_number: Some(LOCAL_SEQ + 1),
8051 payload: &b"abcdef"[..],
8052 ..SEND_TEMPL
8053 }
8054 );
8055
8056 recv_nothing!(s, time 5);
8057
8058 s.recv(|buffer| {
8059 assert_eq!(&buffer[..2], b"ab");
8060 (2, ())
8061 })
8062 .unwrap();
8063 recv!(
8064 s,
8065 time 5,
8066 Ok(TcpRepr {
8067 seq_number: LOCAL_SEQ + 1,
8068 ack_number: Some(REMOTE_SEQ + 1 + 6),
8069 window_len: 2,
8070 ..RECV_TEMPL
8071 })
8072 );
8073
8074 s.recv(|buffer| {
8075 assert_eq!(&buffer[..1], b"c");
8076 (1, ())
8077 })
8078 .unwrap();
8079 recv_nothing!(s, time 5);
8080
8081 s.recv(|buffer| {
8082 assert_eq!(&buffer[..1], b"d");
8083 (1, ())
8084 })
8085 .unwrap();
8086 recv!(
8087 s,
8088 time 5,
8089 Ok(TcpRepr {
8090 seq_number: LOCAL_SEQ + 1,
8091 ack_number: Some(REMOTE_SEQ + 1 + 6),
8092 window_len: 4,
8093 ..RECV_TEMPL
8094 })
8095 );
8096 }
8097
8098 #[test]
8099 fn test_fill_peer_window() {
8100 let mut s = socket_established();
8101 s.remote_mss = 6;
8102 s.send_slice(b"abcdef123456!@#$%^").unwrap();
8103 recv!(
8104 s,
8105 [
8106 TcpRepr {
8107 seq_number: LOCAL_SEQ + 1,
8108 ack_number: Some(REMOTE_SEQ + 1),
8109 payload: &b"abcdef"[..],
8110 ..RECV_TEMPL
8111 },
8112 TcpRepr {
8113 seq_number: LOCAL_SEQ + 1 + 6,
8114 ack_number: Some(REMOTE_SEQ + 1),
8115 payload: &b"123456"[..],
8116 ..RECV_TEMPL
8117 },
8118 TcpRepr {
8119 seq_number: LOCAL_SEQ + 1 + 6 + 6,
8120 ack_number: Some(REMOTE_SEQ + 1),
8121 payload: &b"!@#$%^"[..],
8122 ..RECV_TEMPL
8123 }
8124 ]
8125 );
8126 }
8127
8128 #[test]
8129 fn test_announce_window_after_read() {
8130 let mut s = socket_established();
8131 s.rx_buffer = SocketBuffer::new(vec![0; 6]);
8132 s.assembler = Assembler::new();
8133 send!(
8134 s,
8135 TcpRepr {
8136 seq_number: REMOTE_SEQ + 1,
8137 ack_number: Some(LOCAL_SEQ + 1),
8138 payload: &b"abc"[..],
8139 ..SEND_TEMPL
8140 }
8141 );
8142 recv!(
8143 s,
8144 [TcpRepr {
8145 seq_number: LOCAL_SEQ + 1,
8146 ack_number: Some(REMOTE_SEQ + 1 + 3),
8147 window_len: 3,
8148 ..RECV_TEMPL
8149 }]
8150 );
8151 assert_eq!(s.remote_last_win, s.rx_buffer.window() as u16);
8153 s.recv(|buffer| (buffer.len(), ())).unwrap();
8154 assert!(s.window_to_update());
8155 recv!(
8156 s,
8157 [TcpRepr {
8158 seq_number: LOCAL_SEQ + 1,
8159 ack_number: Some(REMOTE_SEQ + 1 + 3),
8160 window_len: 6,
8161 ..RECV_TEMPL
8162 }]
8163 );
8164 assert_eq!(s.remote_last_win, s.rx_buffer.window() as u16);
8165 send!(
8167 s,
8168 TcpRepr {
8169 seq_number: REMOTE_SEQ + 1 + 6,
8170 ack_number: Some(LOCAL_SEQ + 1),
8171 payload: &b"def"[..],
8172 ..SEND_TEMPL
8173 },
8174 Some(TcpRepr {
8175 seq_number: LOCAL_SEQ + 1,
8176 ack_number: Some(REMOTE_SEQ + 1 + 3),
8177 window_len: 6,
8178 ..RECV_TEMPL
8179 })
8180 );
8181 send!(
8182 s,
8183 TcpRepr {
8184 seq_number: REMOTE_SEQ + 1 + 3,
8185 ack_number: Some(LOCAL_SEQ + 1),
8186 payload: &b"abc"[..],
8187 ..SEND_TEMPL
8188 },
8189 Some(TcpRepr {
8190 seq_number: LOCAL_SEQ + 1,
8191 ack_number: Some(REMOTE_SEQ + 1 + 9),
8192 window_len: 0,
8193 ..RECV_TEMPL
8194 })
8195 );
8196 assert_eq!(s.remote_last_win, s.rx_buffer.window() as u16);
8197 s.recv(|buffer| (buffer.len(), ())).unwrap();
8198 assert!(s.window_to_update());
8199 }
8200
8201 #[test]
8206 fn test_zero_window_probe_enter_on_win_update() {
8207 let mut s = socket_established();
8208
8209 assert!(!s.timer.is_zero_window_probe());
8210
8211 s.send_slice(b"abcdef123456!@#$%^").unwrap();
8212
8213 assert!(!s.timer.is_zero_window_probe());
8214
8215 send!(
8216 s,
8217 TcpRepr {
8218 seq_number: REMOTE_SEQ + 1,
8219 ack_number: Some(LOCAL_SEQ + 1),
8220 window_len: 0,
8221 ..SEND_TEMPL
8222 }
8223 );
8224
8225 assert!(s.timer.is_zero_window_probe());
8226 }
8227
8228 #[test]
8229 fn test_zero_window_probe_enter_on_send() {
8230 let mut s = socket_established();
8231
8232 send!(
8233 s,
8234 TcpRepr {
8235 seq_number: REMOTE_SEQ + 1,
8236 ack_number: Some(LOCAL_SEQ + 1),
8237 window_len: 0,
8238 ..SEND_TEMPL
8239 }
8240 );
8241
8242 assert!(!s.timer.is_zero_window_probe());
8243
8244 s.send_slice(b"abcdef123456!@#$%^").unwrap();
8245
8246 assert!(s.timer.is_zero_window_probe());
8247 }
8248
8249 #[test]
8250 fn test_zero_window_probe_exit() {
8251 let mut s = socket_established();
8252
8253 s.send_slice(b"abcdef123456!@#$%^").unwrap();
8254
8255 assert!(!s.timer.is_zero_window_probe());
8256
8257 send!(
8258 s,
8259 TcpRepr {
8260 seq_number: REMOTE_SEQ + 1,
8261 ack_number: Some(LOCAL_SEQ + 1),
8262 window_len: 0,
8263 ..SEND_TEMPL
8264 }
8265 );
8266
8267 assert!(s.timer.is_zero_window_probe());
8268
8269 send!(
8270 s,
8271 TcpRepr {
8272 seq_number: REMOTE_SEQ + 1,
8273 ack_number: Some(LOCAL_SEQ + 1),
8274 window_len: 6,
8275 ..SEND_TEMPL
8276 }
8277 );
8278
8279 assert!(!s.timer.is_zero_window_probe());
8280 }
8281
8282 #[test]
8283 fn test_zero_window_probe_exit_ack() {
8284 let mut s = socket_established();
8285
8286 s.send_slice(b"abcdef123456!@#$%^").unwrap();
8287 send!(
8288 s,
8289 TcpRepr {
8290 seq_number: REMOTE_SEQ + 1,
8291 ack_number: Some(LOCAL_SEQ + 1),
8292 window_len: 0,
8293 ..SEND_TEMPL
8294 }
8295 );
8296
8297 recv!(
8298 s,
8299 time 1000,
8300 [TcpRepr {
8301 seq_number: LOCAL_SEQ + 1,
8302 ack_number: Some(REMOTE_SEQ + 1),
8303 payload: &b"a"[..],
8304 ..RECV_TEMPL
8305 }]
8306 );
8307
8308 send!(
8309 s,
8310 time 1010,
8311 TcpRepr {
8312 seq_number: REMOTE_SEQ + 1,
8313 ack_number: Some(LOCAL_SEQ + 2),
8314 window_len: 6,
8315 ..SEND_TEMPL
8316 }
8317 );
8318
8319 recv!(
8320 s,
8321 time 1010,
8322 [TcpRepr {
8323 seq_number: LOCAL_SEQ + 2,
8324 ack_number: Some(REMOTE_SEQ + 1),
8325 payload: &b"bcdef1"[..],
8326 ..RECV_TEMPL
8327 }]
8328 );
8329 }
8330
8331 #[test]
8332 #[cfg(feature = "socket-tcp-reno")]
8333 fn test_zero_window_probe_not_capped_by_cwnd() {
8334 let mut s = socket_established_with_buffer_sizes(8192, 64);
8335 s.set_congestion_control(CongestionControl::Reno);
8336 s.remote_win_len = 65535;
8337 s.remote_mss = 1024;
8338
8339 let data = [b'x'; 4096];
8340 s.send_slice(&data[..]).unwrap();
8341
8342 recv!(s, time 0, Ok(TcpRepr {
8345 seq_number: LOCAL_SEQ + 1,
8346 ack_number: Some(REMOTE_SEQ + 1),
8347 payload: &data[..1024],
8348 ..RECV_TEMPL
8349 }));
8350 recv!(s, time 0, Ok(TcpRepr {
8351 seq_number: LOCAL_SEQ + 1 + 1024,
8352 ack_number: Some(REMOTE_SEQ + 1),
8353 payload: &data[..1024],
8354 ..RECV_TEMPL
8355 }));
8356 recv_nothing!(s, time 0);
8357
8358 send!(s, time 10, TcpRepr {
8361 seq_number: REMOTE_SEQ + 1,
8362 ack_number: Some(LOCAL_SEQ + 1),
8363 window_len: 0,
8364 ..SEND_TEMPL
8365 });
8366
8367 s.timer
8371 .set_for_zero_window_probe(Instant::from_millis(10), Duration::from_millis(100));
8372
8373 recv!(s, time 110, Ok(TcpRepr {
8378 seq_number: LOCAL_SEQ + 1 + 2048,
8379 ack_number: Some(REMOTE_SEQ + 1),
8380 payload: &data[..1],
8381 ..RECV_TEMPL
8382 }));
8383 }
8384
8385 #[test]
8386 fn test_zero_window_probe_backoff_nack_reply() {
8387 let mut s = socket_established();
8388 s.send_slice(b"abcdef123456!@#$%^").unwrap();
8389 send!(
8390 s,
8391 TcpRepr {
8392 seq_number: REMOTE_SEQ + 1,
8393 ack_number: Some(LOCAL_SEQ + 1),
8394 window_len: 0,
8395 ..SEND_TEMPL
8396 }
8397 );
8398
8399 recv_nothing!(s, time 999);
8400 recv!(
8401 s,
8402 time 1000,
8403 [TcpRepr {
8404 seq_number: LOCAL_SEQ + 1,
8405 ack_number: Some(REMOTE_SEQ + 1),
8406 payload: &b"a"[..],
8407 ..RECV_TEMPL
8408 }]
8409 );
8410 send!(
8411 s,
8412 time 1100,
8413 TcpRepr {
8414 seq_number: REMOTE_SEQ + 1,
8415 ack_number: Some(LOCAL_SEQ + 1),
8416 window_len: 0,
8417 ..SEND_TEMPL
8418 }
8419 );
8420
8421 recv_nothing!(s, time 2999);
8422 recv!(
8423 s,
8424 time 3000,
8425 [TcpRepr {
8426 seq_number: LOCAL_SEQ + 1,
8427 ack_number: Some(REMOTE_SEQ + 1),
8428 payload: &b"a"[..],
8429 ..RECV_TEMPL
8430 }]
8431 );
8432 send!(
8433 s,
8434 time 3100,
8435 TcpRepr {
8436 seq_number: REMOTE_SEQ + 1,
8437 ack_number: Some(LOCAL_SEQ + 1),
8438 window_len: 0,
8439 ..SEND_TEMPL
8440 }
8441 );
8442
8443 recv_nothing!(s, time 6999);
8444 recv!(
8445 s,
8446 time 7000,
8447 [TcpRepr {
8448 seq_number: LOCAL_SEQ + 1,
8449 ack_number: Some(REMOTE_SEQ + 1),
8450 payload: &b"a"[..],
8451 ..RECV_TEMPL
8452 }]
8453 );
8454 }
8455
8456 #[test]
8457 fn test_zero_window_probe_backoff_no_reply() {
8458 let mut s = socket_established();
8459 s.send_slice(b"abcdef123456!@#$%^").unwrap();
8460 send!(
8461 s,
8462 TcpRepr {
8463 seq_number: REMOTE_SEQ + 1,
8464 ack_number: Some(LOCAL_SEQ + 1),
8465 window_len: 0,
8466 ..SEND_TEMPL
8467 }
8468 );
8469
8470 recv_nothing!(s, time 999);
8471 recv!(
8472 s,
8473 time 1000,
8474 [TcpRepr {
8475 seq_number: LOCAL_SEQ + 1,
8476 ack_number: Some(REMOTE_SEQ + 1),
8477 payload: &b"a"[..],
8478 ..RECV_TEMPL
8479 }]
8480 );
8481
8482 recv_nothing!(s, time 2999);
8483 recv!(
8484 s,
8485 time 3000,
8486 [TcpRepr {
8487 seq_number: LOCAL_SEQ + 1,
8488 ack_number: Some(REMOTE_SEQ + 1),
8489 payload: &b"a"[..],
8490 ..RECV_TEMPL
8491 }]
8492 );
8493 }
8494
8495 #[test]
8496 fn test_zero_window_probe_shift() {
8497 let mut s = socket_established();
8498
8499 s.send_slice(b"abcdef123456!@#$%^").unwrap();
8500 send!(
8501 s,
8502 TcpRepr {
8503 seq_number: REMOTE_SEQ + 1,
8504 ack_number: Some(LOCAL_SEQ + 1),
8505 window_len: 0,
8506 ..SEND_TEMPL
8507 }
8508 );
8509
8510 recv_nothing!(s, time 999);
8511 recv!(
8512 s,
8513 time 1000,
8514 [TcpRepr {
8515 seq_number: LOCAL_SEQ + 1,
8516 ack_number: Some(REMOTE_SEQ + 1),
8517 payload: &b"a"[..],
8518 ..RECV_TEMPL
8519 }]
8520 );
8521
8522 recv_nothing!(s, time 2999);
8523 recv!(
8524 s,
8525 time 3000,
8526 [TcpRepr {
8527 seq_number: LOCAL_SEQ + 1,
8528 ack_number: Some(REMOTE_SEQ + 1),
8529 payload: &b"a"[..],
8530 ..RECV_TEMPL
8531 }]
8532 );
8533
8534 send!(
8537 s,
8538 time 3100,
8539 TcpRepr {
8540 seq_number: REMOTE_SEQ + 1,
8541 ack_number: Some(LOCAL_SEQ + 2),
8542 window_len: 0,
8543 ..SEND_TEMPL
8544 }
8545 );
8546
8547 recv_nothing!(s, time 4099);
8549 recv!(
8550 s,
8551 time 4100,
8552 [TcpRepr {
8553 seq_number: LOCAL_SEQ + 2,
8554 ack_number: Some(REMOTE_SEQ + 1),
8555 payload: &b"b"[..],
8556 ..RECV_TEMPL
8557 }]
8558 );
8559 }
8560
8561 #[test]
8566 fn test_listen_timeout() {
8567 let mut s = socket_listen();
8568 s.set_timeout(Some(Duration::from_millis(100)));
8569 assert_eq!(s.socket.poll_at(&mut s.cx), PollAt::Ingress);
8570 }
8571
8572 #[test]
8573 fn test_connect_timeout() {
8574 let mut s = socket();
8575 s.local_seq_no = LOCAL_SEQ;
8576 s.socket
8577 .connect(&mut s.cx, REMOTE_END, LOCAL_END.port)
8578 .unwrap();
8579 s.set_timeout(Some(Duration::from_millis(100)));
8580 recv!(s, time 150, Ok(TcpRepr {
8581 control: TcpControl::Syn,
8582 seq_number: LOCAL_SEQ,
8583 ack_number: None,
8584 max_seg_size: Some(BASE_MSS),
8585 window_scale: Some(0),
8586 sack_permitted: true,
8587 ..RECV_TEMPL
8588 }));
8589 assert_eq!(s.state, State::SynSent);
8590 assert_eq!(
8591 s.socket.poll_at(&mut s.cx),
8592 PollAt::Time(Instant::from_millis(250))
8593 );
8594 recv!(s, time 250, Ok(TcpRepr {
8595 control: TcpControl::Rst,
8596 seq_number: LOCAL_SEQ + 1,
8597 ack_number: Some(TcpSeqNumber(0)),
8598 window_scale: None,
8599 ..RECV_TEMPL
8600 }));
8601 assert_eq!(s.state, State::Closed);
8602 }
8603
8604 #[test]
8605 fn test_established_timeout() {
8606 let mut s = socket_established();
8607 s.set_timeout(Some(Duration::from_millis(2000)));
8608 recv_nothing!(s, time 250);
8609 assert_eq!(
8610 s.socket.poll_at(&mut s.cx),
8611 PollAt::Time(Instant::from_millis(2250))
8612 );
8613 s.send_slice(b"abcdef").unwrap();
8614 assert_eq!(s.socket.poll_at(&mut s.cx), PollAt::Now);
8615 recv!(s, time 255, Ok(TcpRepr {
8616 seq_number: LOCAL_SEQ + 1,
8617 ack_number: Some(REMOTE_SEQ + 1),
8618 payload: &b"abcdef"[..],
8619 ..RECV_TEMPL
8620 }));
8621 assert_eq!(
8622 s.socket.poll_at(&mut s.cx),
8623 PollAt::Time(Instant::from_millis(1255))
8624 );
8625 recv!(s, time 1255, Ok(TcpRepr {
8626 seq_number: LOCAL_SEQ + 1,
8627 ack_number: Some(REMOTE_SEQ + 1),
8628 payload: &b"abcdef"[..],
8629 ..RECV_TEMPL
8630 }));
8631 assert_eq!(
8632 s.socket.poll_at(&mut s.cx),
8633 PollAt::Time(Instant::from_millis(2255))
8634 );
8635 recv!(s, time 2255, Ok(TcpRepr {
8636 control: TcpControl::Rst,
8637 seq_number: LOCAL_SEQ + 1 + 6,
8638 ack_number: Some(REMOTE_SEQ + 1),
8639 ..RECV_TEMPL
8640 }));
8641 assert_eq!(s.state, State::Closed);
8642 }
8643
8644 #[test]
8645 fn test_established_keep_alive_timeout() {
8646 let mut s = socket_established();
8647 s.set_keep_alive(Some(Duration::from_millis(50)));
8648 s.set_timeout(Some(Duration::from_millis(100)));
8649 recv!(s, time 100, Ok(TcpRepr {
8650 seq_number: LOCAL_SEQ,
8651 ack_number: Some(REMOTE_SEQ + 1),
8652 payload: &[0],
8653 ..RECV_TEMPL
8654 }));
8655 recv_nothing!(s, time 100);
8656 assert_eq!(
8657 s.socket.poll_at(&mut s.cx),
8658 PollAt::Time(Instant::from_millis(150))
8659 );
8660 send!(s, time 105, TcpRepr {
8661 seq_number: REMOTE_SEQ + 1,
8662 ack_number: Some(LOCAL_SEQ + 1),
8663 ..SEND_TEMPL
8664 });
8665 assert_eq!(
8666 s.socket.poll_at(&mut s.cx),
8667 PollAt::Time(Instant::from_millis(155))
8668 );
8669 recv!(s, time 155, Ok(TcpRepr {
8670 seq_number: LOCAL_SEQ,
8671 ack_number: Some(REMOTE_SEQ + 1),
8672 payload: &[0],
8673 ..RECV_TEMPL
8674 }));
8675 recv_nothing!(s, time 155);
8676 assert_eq!(
8677 s.socket.poll_at(&mut s.cx),
8678 PollAt::Time(Instant::from_millis(205))
8679 );
8680 recv_nothing!(s, time 200);
8681 recv!(s, time 205, Ok(TcpRepr {
8682 control: TcpControl::Rst,
8683 seq_number: LOCAL_SEQ + 1,
8684 ack_number: Some(REMOTE_SEQ + 1),
8685 ..RECV_TEMPL
8686 }));
8687 recv_nothing!(s, time 205);
8688 assert_eq!(s.state, State::Closed);
8689 }
8690
8691 #[test]
8692 fn test_fin_wait_1_timeout() {
8693 let mut s = socket_fin_wait_1();
8694 s.set_timeout(Some(Duration::from_millis(1000)));
8695 recv!(s, time 100, Ok(TcpRepr {
8696 control: TcpControl::Fin,
8697 seq_number: LOCAL_SEQ + 1,
8698 ack_number: Some(REMOTE_SEQ + 1),
8699 ..RECV_TEMPL
8700 }));
8701 recv!(s, time 1100, Ok(TcpRepr {
8702 control: TcpControl::Rst,
8703 seq_number: LOCAL_SEQ + 1 + 1,
8704 ack_number: Some(REMOTE_SEQ + 1),
8705 ..RECV_TEMPL
8706 }));
8707 assert_eq!(s.state, State::Closed);
8708 }
8709
8710 #[test]
8711 fn test_last_ack_timeout() {
8712 let mut s = socket_last_ack();
8713 s.set_timeout(Some(Duration::from_millis(1000)));
8714 recv!(s, time 100, Ok(TcpRepr {
8715 control: TcpControl::Fin,
8716 seq_number: LOCAL_SEQ + 1,
8717 ack_number: Some(REMOTE_SEQ + 1 + 1),
8718 ..RECV_TEMPL
8719 }));
8720 recv!(s, time 1100, Ok(TcpRepr {
8721 control: TcpControl::Rst,
8722 seq_number: LOCAL_SEQ + 1 + 1,
8723 ack_number: Some(REMOTE_SEQ + 1 + 1),
8724 ..RECV_TEMPL
8725 }));
8726 assert_eq!(s.state, State::Closed);
8727 }
8728
8729 #[test]
8730 fn test_closed_timeout() {
8731 let mut s = socket_established();
8732 s.set_timeout(Some(Duration::from_millis(200)));
8733 s.remote_last_ts = Some(Instant::from_millis(100));
8734 s.abort();
8735 assert_eq!(s.socket.poll_at(&mut s.cx), PollAt::Now);
8736 recv!(s, time 100, Ok(TcpRepr {
8737 control: TcpControl::Rst,
8738 seq_number: LOCAL_SEQ + 1,
8739 ack_number: Some(REMOTE_SEQ + 1),
8740 ..RECV_TEMPL
8741 }));
8742 assert_eq!(s.socket.poll_at(&mut s.cx), PollAt::Ingress);
8743 }
8744
8745 #[test]
8750 fn test_responds_to_keep_alive() {
8751 let mut s = socket_established();
8752 send!(
8753 s,
8754 TcpRepr {
8755 seq_number: REMOTE_SEQ,
8756 ack_number: Some(LOCAL_SEQ + 1),
8757 ..SEND_TEMPL
8758 },
8759 Some(TcpRepr {
8760 seq_number: LOCAL_SEQ + 1,
8761 ack_number: Some(REMOTE_SEQ + 1),
8762 ..RECV_TEMPL
8763 })
8764 );
8765 }
8766
8767 #[test]
8768 fn test_sends_keep_alive() {
8769 let mut s = socket_established();
8770 s.set_keep_alive(Some(Duration::from_millis(100)));
8771
8772 assert_eq!(s.socket.poll_at(&mut s.cx), PollAt::Now);
8774 recv!(s, time 0, Ok(TcpRepr {
8775 seq_number: LOCAL_SEQ,
8776 ack_number: Some(REMOTE_SEQ + 1),
8777 payload: &[0],
8778 ..RECV_TEMPL
8779 }));
8780
8781 assert_eq!(
8782 s.socket.poll_at(&mut s.cx),
8783 PollAt::Time(Instant::from_millis(100))
8784 );
8785 recv_nothing!(s, time 95);
8786 recv!(s, time 100, Ok(TcpRepr {
8787 seq_number: LOCAL_SEQ,
8788 ack_number: Some(REMOTE_SEQ + 1),
8789 payload: &[0],
8790 ..RECV_TEMPL
8791 }));
8792
8793 assert_eq!(
8794 s.socket.poll_at(&mut s.cx),
8795 PollAt::Time(Instant::from_millis(200))
8796 );
8797 recv_nothing!(s, time 195);
8798 recv!(s, time 200, Ok(TcpRepr {
8799 seq_number: LOCAL_SEQ,
8800 ack_number: Some(REMOTE_SEQ + 1),
8801 payload: &[0],
8802 ..RECV_TEMPL
8803 }));
8804
8805 send!(s, time 250, TcpRepr {
8806 seq_number: REMOTE_SEQ + 1,
8807 ack_number: Some(LOCAL_SEQ + 1),
8808 ..SEND_TEMPL
8809 });
8810 assert_eq!(
8811 s.socket.poll_at(&mut s.cx),
8812 PollAt::Time(Instant::from_millis(350))
8813 );
8814 recv_nothing!(s, time 345);
8815 recv!(s, time 350, Ok(TcpRepr {
8816 seq_number: LOCAL_SEQ,
8817 ack_number: Some(REMOTE_SEQ + 1),
8818 payload: &b"\x00"[..],
8819 ..RECV_TEMPL
8820 }));
8821 }
8822
8823 #[test]
8828 fn test_set_hop_limit() {
8829 let mut s = socket_syn_received();
8830
8831 s.set_hop_limit(Some(0x2a));
8832 assert_eq!(
8833 s.socket.dispatch(&mut s.cx, |_, _, (ip_repr, _)| {
8834 assert_eq!(ip_repr.hop_limit(), 0x2a);
8835 Ok::<_, ()>(())
8836 }),
8837 Ok(())
8838 );
8839
8840 s.reset();
8843 assert_eq!(s.hop_limit(), Some(0x2a));
8844 }
8845
8846 #[test]
8847 #[should_panic(expected = "the time-to-live value of a packet must not be zero")]
8848 fn test_set_hop_limit_zero() {
8849 let mut s = socket_syn_received();
8850 s.set_hop_limit(Some(0));
8851 }
8852
8853 #[test]
8858 fn test_out_of_order() {
8859 let mut s = socket_established();
8860 send!(
8861 s,
8862 TcpRepr {
8863 seq_number: REMOTE_SEQ + 1 + 3,
8864 ack_number: Some(LOCAL_SEQ + 1),
8865 payload: &b"def"[..],
8866 ..SEND_TEMPL
8867 },
8868 Some(TcpRepr {
8869 seq_number: LOCAL_SEQ + 1,
8870 ack_number: Some(REMOTE_SEQ + 1),
8871 ..RECV_TEMPL
8872 })
8873 );
8874 s.recv(|buffer| {
8875 assert_eq!(buffer, b"");
8876 (buffer.len(), ())
8877 })
8878 .unwrap();
8879 send!(
8880 s,
8881 TcpRepr {
8882 seq_number: REMOTE_SEQ + 1,
8883 ack_number: Some(LOCAL_SEQ + 1),
8884 payload: &b"abcdef"[..],
8885 ..SEND_TEMPL
8886 },
8887 Some(TcpRepr {
8888 seq_number: LOCAL_SEQ + 1,
8889 ack_number: Some(REMOTE_SEQ + 1 + 6),
8890 window_len: 58,
8891 ..RECV_TEMPL
8892 })
8893 );
8894 s.recv(|buffer| {
8895 assert_eq!(buffer, b"abcdef");
8896 (buffer.len(), ())
8897 })
8898 .unwrap();
8899 }
8900
8901 #[test]
8902 fn test_buffer_wraparound_rx() {
8903 let mut s = socket_established();
8904 s.rx_buffer = SocketBuffer::new(vec![0; 6]);
8905 s.assembler = Assembler::new();
8906 send!(
8907 s,
8908 TcpRepr {
8909 seq_number: REMOTE_SEQ + 1,
8910 ack_number: Some(LOCAL_SEQ + 1),
8911 payload: &b"abc"[..],
8912 ..SEND_TEMPL
8913 }
8914 );
8915 s.recv(|buffer| {
8916 assert_eq!(buffer, b"abc");
8917 (buffer.len(), ())
8918 })
8919 .unwrap();
8920 send!(
8921 s,
8922 TcpRepr {
8923 seq_number: REMOTE_SEQ + 1 + 3,
8924 ack_number: Some(LOCAL_SEQ + 1),
8925 payload: &b"defghi"[..],
8926 ..SEND_TEMPL
8927 }
8928 );
8929 let mut data = [0; 6];
8930 assert_eq!(s.recv_slice(&mut data[..]), Ok(6));
8931 assert_eq!(data, &b"defghi"[..]);
8932 }
8933
8934 #[test]
8935 fn test_buffer_wraparound_tx() {
8936 let mut s = socket_established();
8937 s.set_nagle_enabled(false);
8938
8939 s.tx_buffer = SocketBuffer::new(vec![b'.'; 9]);
8940 assert_eq!(s.send_slice(b"xxxyyy"), Ok(6));
8941 assert_eq!(s.tx_buffer.dequeue_many(3), &b"xxx"[..]);
8942 assert_eq!(s.tx_buffer.len(), 3);
8943
8944 assert_eq!(s.send_slice(b"abcdef"), Ok(6));
8946 recv!(
8947 s,
8948 Ok(TcpRepr {
8949 seq_number: LOCAL_SEQ + 1,
8950 ack_number: Some(REMOTE_SEQ + 1),
8951 payload: &b"yyyabc"[..],
8952 ..RECV_TEMPL
8953 })
8954 );
8955 recv!(
8956 s,
8957 Ok(TcpRepr {
8958 seq_number: LOCAL_SEQ + 1 + 6,
8959 ack_number: Some(REMOTE_SEQ + 1),
8960 payload: &b"def"[..],
8961 ..RECV_TEMPL
8962 })
8963 );
8964 }
8965
8966 #[test]
8971 fn test_rx_close_fin() {
8972 let mut s = socket_established();
8973 send!(
8974 s,
8975 TcpRepr {
8976 control: TcpControl::Fin,
8977 seq_number: REMOTE_SEQ + 1,
8978 ack_number: Some(LOCAL_SEQ + 1),
8979 payload: &b"abc"[..],
8980 ..SEND_TEMPL
8981 }
8982 );
8983 s.recv(|data| {
8984 assert_eq!(data, b"abc");
8985 (3, ())
8986 })
8987 .unwrap();
8988 assert_eq!(s.recv(|_| (0, ())), Err(RecvError::Finished));
8989 }
8990
8991 #[test]
8992 fn test_rx_close_fin_in_fin_wait_1() {
8993 let mut s = socket_fin_wait_1();
8994 send!(
8995 s,
8996 TcpRepr {
8997 control: TcpControl::Fin,
8998 seq_number: REMOTE_SEQ + 1,
8999 ack_number: Some(LOCAL_SEQ + 1),
9000 payload: &b"abc"[..],
9001 ..SEND_TEMPL
9002 }
9003 );
9004 assert_eq!(s.state, State::Closing);
9005 s.recv(|data| {
9006 assert_eq!(data, b"abc");
9007 (3, ())
9008 })
9009 .unwrap();
9010 assert_eq!(s.recv(|_| (0, ())), Err(RecvError::Finished));
9011 }
9012
9013 #[test]
9014 fn test_rx_close_fin_in_fin_wait_2() {
9015 let mut s = socket_fin_wait_2();
9016 send!(
9017 s,
9018 TcpRepr {
9019 control: TcpControl::Fin,
9020 seq_number: REMOTE_SEQ + 1,
9021 ack_number: Some(LOCAL_SEQ + 1 + 1),
9022 payload: &b"abc"[..],
9023 ..SEND_TEMPL
9024 }
9025 );
9026 assert_eq!(s.state, State::TimeWait);
9027 s.recv(|data| {
9028 assert_eq!(data, b"abc");
9029 (3, ())
9030 })
9031 .unwrap();
9032 assert_eq!(s.recv(|_| (0, ())), Err(RecvError::Finished));
9033 }
9034
9035 #[test]
9036 fn test_rx_close_fin_with_hole() {
9037 let mut s = socket_established();
9038 send!(
9039 s,
9040 TcpRepr {
9041 seq_number: REMOTE_SEQ + 1,
9042 ack_number: Some(LOCAL_SEQ + 1),
9043 payload: &b"abc"[..],
9044 ..SEND_TEMPL
9045 }
9046 );
9047 send!(
9048 s,
9049 TcpRepr {
9050 control: TcpControl::Fin,
9051 seq_number: REMOTE_SEQ + 1 + 6,
9052 ack_number: Some(LOCAL_SEQ + 1),
9053 payload: &b"ghi"[..],
9054 ..SEND_TEMPL
9055 },
9056 Some(TcpRepr {
9057 seq_number: LOCAL_SEQ + 1,
9058 ack_number: Some(REMOTE_SEQ + 1 + 3),
9059 window_len: 61,
9060 ..RECV_TEMPL
9061 })
9062 );
9063 s.recv(|data| {
9064 assert_eq!(data, b"abc");
9065 (3, ())
9066 })
9067 .unwrap();
9068 s.recv(|data| {
9069 assert_eq!(data, b"");
9070 (0, ())
9071 })
9072 .unwrap();
9073 send!(
9074 s,
9075 TcpRepr {
9076 control: TcpControl::Rst,
9077 seq_number: REMOTE_SEQ + 1 + 9,
9078 ack_number: Some(LOCAL_SEQ + 1),
9079 ..SEND_TEMPL
9080 }
9081 );
9082 assert_eq!(s.recv(|_| (0, ())), Err(RecvError::InvalidState));
9085 }
9086
9087 #[test]
9088 fn test_rx_close_rst() {
9089 let mut s = socket_established();
9090 send!(
9091 s,
9092 TcpRepr {
9093 seq_number: REMOTE_SEQ + 1,
9094 ack_number: Some(LOCAL_SEQ + 1),
9095 payload: &b"abc"[..],
9096 ..SEND_TEMPL
9097 }
9098 );
9099 send!(
9100 s,
9101 TcpRepr {
9102 control: TcpControl::Rst,
9103 seq_number: REMOTE_SEQ + 1 + 3,
9104 ack_number: Some(LOCAL_SEQ + 1),
9105 ..SEND_TEMPL
9106 }
9107 );
9108 s.recv(|data| {
9109 assert_eq!(data, b"abc");
9110 (3, ())
9111 })
9112 .unwrap();
9113 assert_eq!(s.recv(|_| (0, ())), Err(RecvError::InvalidState));
9114 }
9115
9116 #[test]
9117 fn test_rx_close_rst_with_hole() {
9118 let mut s = socket_established();
9119 send!(
9120 s,
9121 TcpRepr {
9122 seq_number: REMOTE_SEQ + 1,
9123 ack_number: Some(LOCAL_SEQ + 1),
9124 payload: &b"abc"[..],
9125 ..SEND_TEMPL
9126 }
9127 );
9128 send!(
9129 s,
9130 TcpRepr {
9131 seq_number: REMOTE_SEQ + 1 + 6,
9132 ack_number: Some(LOCAL_SEQ + 1),
9133 payload: &b"ghi"[..],
9134 ..SEND_TEMPL
9135 },
9136 Some(TcpRepr {
9137 seq_number: LOCAL_SEQ + 1,
9138 ack_number: Some(REMOTE_SEQ + 1 + 3),
9139 window_len: 61,
9140 ..RECV_TEMPL
9141 })
9142 );
9143 send!(
9144 s,
9145 TcpRepr {
9146 control: TcpControl::Rst,
9147 seq_number: REMOTE_SEQ + 1 + 9,
9148 ack_number: Some(LOCAL_SEQ + 1),
9149 ..SEND_TEMPL
9150 }
9151 );
9152 s.recv(|data| {
9153 assert_eq!(data, b"abc");
9154 (3, ())
9155 })
9156 .unwrap();
9157 assert_eq!(s.recv(|_| (0, ())), Err(RecvError::InvalidState));
9158 }
9159
9160 #[test]
9165 fn test_delayed_ack() {
9166 let mut s = socket_established();
9167 s.set_ack_delay(Some(ACK_DELAY_DEFAULT));
9168 send!(
9169 s,
9170 TcpRepr {
9171 seq_number: REMOTE_SEQ + 1,
9172 ack_number: Some(LOCAL_SEQ + 1),
9173 payload: &b"abc"[..],
9174 ..SEND_TEMPL
9175 }
9176 );
9177
9178 recv_nothing!(s);
9180
9181 recv!(s, time 11, Ok(TcpRepr {
9183 seq_number: LOCAL_SEQ + 1,
9184 ack_number: Some(REMOTE_SEQ + 1 + 3),
9185 window_len: 61,
9186 ..RECV_TEMPL
9187 }));
9188 }
9189
9190 #[test]
9191 fn test_delayed_ack_win() {
9192 let mut s = socket_established();
9193 s.set_ack_delay(Some(ACK_DELAY_DEFAULT));
9194 send!(
9195 s,
9196 TcpRepr {
9197 seq_number: REMOTE_SEQ + 1,
9198 ack_number: Some(LOCAL_SEQ + 1),
9199 payload: &b"abc"[..],
9200 ..SEND_TEMPL
9201 }
9202 );
9203
9204 s.recv(|data| {
9206 assert_eq!(data, b"abc");
9207 (3, ())
9208 })
9209 .unwrap();
9210
9211 recv_nothing!(s);
9213
9214 recv!(s, time 11, Ok(TcpRepr {
9216 seq_number: LOCAL_SEQ + 1,
9217 ack_number: Some(REMOTE_SEQ + 1 + 3),
9218 ..RECV_TEMPL
9219 }));
9220 }
9221
9222 #[test]
9223 fn test_delayed_ack_reply() {
9224 let mut s = socket_established();
9225 s.set_ack_delay(Some(ACK_DELAY_DEFAULT));
9226 send!(
9227 s,
9228 TcpRepr {
9229 seq_number: REMOTE_SEQ + 1,
9230 ack_number: Some(LOCAL_SEQ + 1),
9231 payload: &b"abc"[..],
9232 ..SEND_TEMPL
9233 }
9234 );
9235
9236 s.recv(|data| {
9237 assert_eq!(data, b"abc");
9238 (3, ())
9239 })
9240 .unwrap();
9241
9242 s.send_slice(&b"xyz"[..]).unwrap();
9243
9244 recv!(
9247 s,
9248 Ok(TcpRepr {
9249 seq_number: LOCAL_SEQ + 1,
9250 ack_number: Some(REMOTE_SEQ + 1 + 3),
9251 payload: &b"xyz"[..],
9252 ..RECV_TEMPL
9253 })
9254 );
9255 }
9256
9257 #[test]
9258 fn test_delayed_ack_every_rmss() {
9259 let mut s = socket_established_with_buffer_sizes(DEFAULT_MSS * 2, DEFAULT_MSS * 2);
9260 s.set_ack_delay(Some(ACK_DELAY_DEFAULT));
9261 send!(
9262 s,
9263 TcpRepr {
9264 seq_number: REMOTE_SEQ + 1,
9265 ack_number: Some(LOCAL_SEQ + 1),
9266 payload: &[0; DEFAULT_MSS - 1],
9267 ..SEND_TEMPL
9268 }
9269 );
9270
9271 recv_nothing!(s);
9273
9274 send!(
9275 s,
9276 TcpRepr {
9277 seq_number: REMOTE_SEQ + 1 + (DEFAULT_MSS - 1),
9278 ack_number: Some(LOCAL_SEQ + 1),
9279 payload: &b"a"[..],
9280 ..SEND_TEMPL
9281 }
9282 );
9283
9284 recv_nothing!(s);
9286
9287 send!(
9288 s,
9289 TcpRepr {
9290 seq_number: REMOTE_SEQ + 1 + DEFAULT_MSS,
9291 ack_number: Some(LOCAL_SEQ + 1),
9292 payload: &b"a"[..],
9293 ..SEND_TEMPL
9294 }
9295 );
9296
9297 recv!(
9299 s,
9300 Ok(TcpRepr {
9301 seq_number: LOCAL_SEQ + 1,
9302 ack_number: Some(REMOTE_SEQ + 1 + (DEFAULT_MSS + 1)),
9303 window_len: (DEFAULT_MSS - 1) as u16,
9304 ..RECV_TEMPL
9305 })
9306 );
9307 }
9308
9309 #[test]
9310 fn test_delayed_ack_every_rmss_or_more() {
9311 let mut s = socket_established_with_buffer_sizes(DEFAULT_MSS * 2, DEFAULT_MSS * 2);
9312 s.set_ack_delay(Some(ACK_DELAY_DEFAULT));
9313 send!(
9314 s,
9315 TcpRepr {
9316 seq_number: REMOTE_SEQ + 1,
9317 ack_number: Some(LOCAL_SEQ + 1),
9318 payload: &[0; DEFAULT_MSS],
9319 ..SEND_TEMPL
9320 }
9321 );
9322
9323 recv_nothing!(s);
9325
9326 send!(
9327 s,
9328 TcpRepr {
9329 seq_number: REMOTE_SEQ + 1 + DEFAULT_MSS,
9330 ack_number: Some(LOCAL_SEQ + 1),
9331 payload: &b"a"[..],
9332 ..SEND_TEMPL
9333 }
9334 );
9335
9336 send!(
9337 s,
9338 TcpRepr {
9339 seq_number: REMOTE_SEQ + 1 + (DEFAULT_MSS + 1),
9340 ack_number: Some(LOCAL_SEQ + 1),
9341 payload: &b"b"[..],
9342 ..SEND_TEMPL
9343 }
9344 );
9345
9346 recv!(
9348 s,
9349 Ok(TcpRepr {
9350 seq_number: LOCAL_SEQ + 1,
9351 ack_number: Some(REMOTE_SEQ + 1 + (DEFAULT_MSS + 2)),
9352 window_len: (DEFAULT_MSS - 2) as u16,
9353 ..RECV_TEMPL
9354 })
9355 );
9356 }
9357
9358 #[test]
9363 fn test_nagle() {
9364 let mut s = socket_established();
9365 s.remote_mss = 6;
9366
9367 s.send_slice(b"abcdef").unwrap();
9368 recv!(
9369 s,
9370 [TcpRepr {
9371 seq_number: LOCAL_SEQ + 1,
9372 ack_number: Some(REMOTE_SEQ + 1),
9373 payload: &b"abcdef"[..],
9374 ..RECV_TEMPL
9375 }]
9376 );
9377
9378 s.send_slice(b"foobar").unwrap();
9380 recv!(
9381 s,
9382 [TcpRepr {
9383 seq_number: LOCAL_SEQ + 1 + 6,
9384 ack_number: Some(REMOTE_SEQ + 1),
9385 payload: &b"foobar"[..],
9386 ..RECV_TEMPL
9387 }]
9388 );
9389
9390 s.send_slice(b"aaabbbccc").unwrap();
9391 recv!(
9393 s,
9394 [TcpRepr {
9395 seq_number: LOCAL_SEQ + 1 + 6 + 6,
9396 ack_number: Some(REMOTE_SEQ + 1),
9397 payload: &b"aaabbb"[..],
9398 ..RECV_TEMPL
9399 }]
9400 );
9401
9402 send!(
9404 s,
9405 TcpRepr {
9406 seq_number: REMOTE_SEQ + 1,
9407 ack_number: Some(LOCAL_SEQ + 1 + 6 + 6 + 6),
9408 ..SEND_TEMPL
9409 }
9410 );
9411
9412 recv!(
9414 s,
9415 [TcpRepr {
9416 seq_number: LOCAL_SEQ + 1 + 6 + 6 + 6,
9417 ack_number: Some(REMOTE_SEQ + 1),
9418 payload: &b"ccc"[..],
9419 ..RECV_TEMPL
9420 }]
9421 );
9422 }
9423
9424 #[test]
9425 fn test_nagle_works_with_reduced_payload_from_options() {
9426 const EFFECTIVE_MSS: usize = 64;
9427
9428 let mut s = socket_established_with_buffer_sizes(256, 64);
9429 s.set_nagle_enabled(true);
9430 s.set_tsval_generator(Some(|| 1));
9431 s.remote_mss = EFFECTIVE_MSS;
9432
9433 s.send_slice(b"abcdef").unwrap();
9435 recv!(
9436 s,
9437 [TcpRepr {
9438 seq_number: LOCAL_SEQ + 1,
9439 ack_number: Some(REMOTE_SEQ + 1),
9440 payload: &b"abcdef"[..],
9441 timestamp: Some(TcpTimestampRepr::new(1, 0)),
9442 ..RECV_TEMPL
9443 }]
9444 );
9445
9446 s.send_slice(&[0; EFFECTIVE_MSS - 12]).unwrap();
9448 recv!(
9449 s,
9450 time 0,
9451 [TcpRepr {
9452 seq_number: LOCAL_SEQ + 1 + 6,
9453 ack_number: Some(REMOTE_SEQ + 1),
9454 payload: &[0; EFFECTIVE_MSS - 12],
9455 timestamp: Some(TcpTimestampRepr::new(1, 0)),
9456 ..RECV_TEMPL
9457 }]
9458 );
9459 }
9460
9461 #[test]
9462 fn test_final_packet_in_stream_doesnt_wait_for_nagle() {
9463 let mut s = socket_established();
9464 s.remote_mss = 6;
9465 s.send_slice(b"abcdef0").unwrap();
9466 s.socket.close();
9467
9468 recv!(s, time 0, Ok(TcpRepr {
9469 control: TcpControl::None,
9470 seq_number: LOCAL_SEQ + 1,
9471 ack_number: Some(REMOTE_SEQ + 1),
9472 payload: &b"abcdef"[..],
9473 ..RECV_TEMPL
9474 }), exact);
9475 recv!(s, time 0, Ok(TcpRepr {
9476 control: TcpControl::Fin,
9477 seq_number: LOCAL_SEQ + 1 + 6,
9478 ack_number: Some(REMOTE_SEQ + 1),
9479 payload: &b"0"[..],
9480 ..RECV_TEMPL
9481 }), exact);
9482 }
9483
9484 #[test]
9489 fn test_doesnt_accept_wrong_port() {
9490 let mut s = socket_established();
9491 s.rx_buffer = SocketBuffer::new(vec![0; 6]);
9492 s.assembler = Assembler::new();
9493
9494 let tcp_repr = TcpRepr {
9495 seq_number: REMOTE_SEQ + 1,
9496 ack_number: Some(LOCAL_SEQ + 1),
9497 dst_port: LOCAL_PORT + 1,
9498 ..SEND_TEMPL
9499 };
9500 assert!(!s.socket.accepts(&mut s.cx, &SEND_IP_TEMPL, &tcp_repr));
9501
9502 let tcp_repr = TcpRepr {
9503 seq_number: REMOTE_SEQ + 1,
9504 ack_number: Some(LOCAL_SEQ + 1),
9505 src_port: REMOTE_PORT + 1,
9506 ..SEND_TEMPL
9507 };
9508 assert!(!s.socket.accepts(&mut s.cx, &SEND_IP_TEMPL, &tcp_repr));
9509 }
9510
9511 #[test]
9512 fn test_doesnt_accept_wrong_ip() {
9513 let mut s = socket_established();
9514
9515 let tcp_repr = TcpRepr {
9516 seq_number: REMOTE_SEQ + 1,
9517 ack_number: Some(LOCAL_SEQ + 1),
9518 payload: &b"abcdef"[..],
9519 ..SEND_TEMPL
9520 };
9521
9522 let ip_repr = IpReprIpvX(IpvXRepr {
9523 src_addr: REMOTE_ADDR,
9524 dst_addr: LOCAL_ADDR,
9525 next_header: IpProtocol::Tcp,
9526 payload_len: tcp_repr.buffer_len(),
9527 hop_limit: 64,
9528 });
9529 assert!(s.socket.accepts(&mut s.cx, &ip_repr, &tcp_repr));
9530
9531 let ip_repr_wrong_src = IpReprIpvX(IpvXRepr {
9532 src_addr: OTHER_ADDR,
9533 dst_addr: LOCAL_ADDR,
9534 next_header: IpProtocol::Tcp,
9535 payload_len: tcp_repr.buffer_len(),
9536 hop_limit: 64,
9537 });
9538 assert!(!s.socket.accepts(&mut s.cx, &ip_repr_wrong_src, &tcp_repr));
9539
9540 let ip_repr_wrong_dst = IpReprIpvX(IpvXRepr {
9541 src_addr: REMOTE_ADDR,
9542 dst_addr: OTHER_ADDR,
9543 next_header: IpProtocol::Tcp,
9544 payload_len: tcp_repr.buffer_len(),
9545 hop_limit: 64,
9546 });
9547 assert!(!s.socket.accepts(&mut s.cx, &ip_repr_wrong_dst, &tcp_repr));
9548 }
9549
9550 #[test]
9555 fn test_timer_retransmit() {
9556 const RTO: Duration = Duration::from_millis(100);
9557 let mut r = Timer::new();
9558 assert!(!r.should_retransmit(Instant::from_secs(1)));
9559 r.set_for_retransmit(Instant::from_millis(1000), RTO);
9560 assert!(!r.should_retransmit(Instant::from_millis(1000)));
9561 assert!(!r.should_retransmit(Instant::from_millis(1050)));
9562 assert!(r.should_retransmit(Instant::from_millis(1101)));
9563 r.set_for_retransmit(Instant::from_millis(1101), RTO);
9564 assert!(!r.should_retransmit(Instant::from_millis(1101)));
9565 assert!(!r.should_retransmit(Instant::from_millis(1150)));
9566 assert!(!r.should_retransmit(Instant::from_millis(1200)));
9567 assert!(r.should_retransmit(Instant::from_millis(1301)));
9568 r.set_for_idle(Instant::from_millis(1301), None);
9569 assert!(!r.should_retransmit(Instant::from_millis(1350)));
9570 }
9571
9572 #[test]
9573 fn test_rtt_estimator() {
9574 let mut r = RttEstimator::default();
9575
9576 let rtos = &[
9577 6000, 5000, 4252, 3692, 3272, 2956, 2720, 2540, 2408, 2308, 2232, 2176, 2132, 2100,
9578 2076, 2060, 2048, 2036, 2028, 2024, 2020, 2016, 2012, 2012,
9579 ];
9580
9581 for &rto in rtos {
9582 r.sample(2000);
9583 assert_eq!(r.retransmission_timeout(), Duration::from_millis(rto));
9584 }
9585 }
9586
9587 #[test]
9588 fn test_set_get_congestion_control() {
9589 let mut s = socket_established();
9590
9591 #[cfg(feature = "socket-tcp-reno")]
9592 {
9593 s.set_congestion_control(CongestionControl::Reno);
9594 assert_eq!(s.congestion_control(), CongestionControl::Reno);
9595 }
9596
9597 #[cfg(feature = "socket-tcp-cubic")]
9598 {
9599 s.set_congestion_control(CongestionControl::Cubic);
9600 assert_eq!(s.congestion_control(), CongestionControl::Cubic);
9601 }
9602
9603 s.set_congestion_control(CongestionControl::None);
9604 assert_eq!(s.congestion_control(), CongestionControl::None);
9605 }
9606
9607 #[test]
9612 fn test_tsval_established_connection() {
9613 let mut s = socket_established();
9614 s.set_tsval_generator(Some(|| 1));
9615
9616 assert!(s.timestamp_enabled());
9617
9618 s.send_slice(b"abcdef").unwrap();
9620 recv!(
9621 s,
9622 [TcpRepr {
9623 seq_number: LOCAL_SEQ + 1,
9624 ack_number: Some(REMOTE_SEQ + 1),
9625 payload: &b"abcdef"[..],
9626 timestamp: Some(TcpTimestampRepr::new(1, 0)),
9627 ..RECV_TEMPL
9628 }]
9629 );
9630 assert_eq!(s.tx_buffer.len(), 6);
9631 send!(
9632 s,
9633 TcpRepr {
9634 seq_number: REMOTE_SEQ + 1,
9635 ack_number: Some(LOCAL_SEQ + 1 + 6),
9636 timestamp: Some(TcpTimestampRepr::new(500, 1)),
9637 ..SEND_TEMPL
9638 }
9639 );
9640 assert_eq!(s.tx_buffer.len(), 0);
9641 s.send_slice(b"foobar").unwrap();
9643 recv!(
9644 s,
9645 [TcpRepr {
9646 seq_number: LOCAL_SEQ + 1 + 6,
9647 ack_number: Some(REMOTE_SEQ + 1),
9648 payload: &b"foobar"[..],
9649 timestamp: Some(TcpTimestampRepr::new(1, 500)),
9650 ..RECV_TEMPL
9651 }]
9652 );
9653 send!(
9654 s,
9655 TcpRepr {
9656 seq_number: REMOTE_SEQ + 1,
9657 ack_number: Some(LOCAL_SEQ + 1 + 6 + 6),
9658 ..SEND_TEMPL
9659 }
9660 );
9661 assert_eq!(s.tx_buffer.len(), 0);
9662 }
9663
9664 #[test]
9665 fn test_tsval_disabled_in_remote_client() {
9666 let mut s = socket_listen();
9667 s.set_tsval_generator(Some(|| 1));
9668 assert!(s.timestamp_enabled());
9669 send!(
9670 s,
9671 TcpRepr {
9672 control: TcpControl::Syn,
9673 seq_number: REMOTE_SEQ,
9674 ack_number: None,
9675 ..SEND_TEMPL
9676 }
9677 );
9678 assert_eq!(s.state(), State::SynReceived);
9679 assert_eq!(s.tuple, Some(TUPLE));
9680 assert!(!s.timestamp_enabled());
9681 recv!(
9682 s,
9683 [TcpRepr {
9684 control: TcpControl::Syn,
9685 seq_number: LOCAL_SEQ,
9686 ack_number: Some(REMOTE_SEQ + 1),
9687 max_seg_size: Some(BASE_MSS),
9688 ..RECV_TEMPL
9689 }]
9690 );
9691 send!(
9692 s,
9693 TcpRepr {
9694 seq_number: REMOTE_SEQ + 1,
9695 ack_number: Some(LOCAL_SEQ + 1),
9696 ..SEND_TEMPL
9697 }
9698 );
9699 assert_eq!(s.state(), State::Established);
9700 assert_eq!(s.local_seq_no, LOCAL_SEQ + 1);
9701 assert_eq!(s.remote_seq_no, REMOTE_SEQ + 1);
9702 }
9703
9704 #[test]
9705 fn test_tsval_disabled_in_local_server() {
9706 let mut s = socket_listen();
9707 assert!(!s.timestamp_enabled());
9709 send!(
9710 s,
9711 TcpRepr {
9712 control: TcpControl::Syn,
9713 seq_number: REMOTE_SEQ,
9714 ack_number: None,
9715 timestamp: Some(TcpTimestampRepr::new(500, 0)),
9716 ..SEND_TEMPL
9717 }
9718 );
9719 assert_eq!(s.state(), State::SynReceived);
9720 assert_eq!(s.tuple, Some(TUPLE));
9721 assert!(!s.timestamp_enabled());
9722 recv!(
9723 s,
9724 [TcpRepr {
9725 control: TcpControl::Syn,
9726 seq_number: LOCAL_SEQ,
9727 ack_number: Some(REMOTE_SEQ + 1),
9728 max_seg_size: Some(BASE_MSS),
9729 ..RECV_TEMPL
9730 }]
9731 );
9732 send!(
9733 s,
9734 TcpRepr {
9735 seq_number: REMOTE_SEQ + 1,
9736 ack_number: Some(LOCAL_SEQ + 1),
9737 ..SEND_TEMPL
9738 }
9739 );
9740 assert_eq!(s.state(), State::Established);
9741 assert_eq!(s.local_seq_no, LOCAL_SEQ + 1);
9742 assert_eq!(s.remote_seq_no, REMOTE_SEQ + 1);
9743 }
9744
9745 #[test]
9746 fn test_tsval_disabled_in_remote_server() {
9747 let mut s = socket();
9748 s.set_tsval_generator(Some(|| 1));
9749 assert!(s.timestamp_enabled());
9750 s.local_seq_no = LOCAL_SEQ;
9751 s.socket
9752 .connect(&mut s.cx, REMOTE_END, LOCAL_END.port)
9753 .unwrap();
9754 assert_eq!(s.tuple, Some(TUPLE));
9755 recv!(
9756 s,
9757 [TcpRepr {
9758 control: TcpControl::Syn,
9759 seq_number: LOCAL_SEQ,
9760 ack_number: None,
9761 max_seg_size: Some(BASE_MSS),
9762 window_scale: Some(0),
9763 sack_permitted: true,
9764 timestamp: Some(TcpTimestampRepr::new(1, 0)),
9765 ..RECV_TEMPL
9766 }]
9767 );
9768 send!(
9769 s,
9770 TcpRepr {
9771 control: TcpControl::Syn,
9772 seq_number: REMOTE_SEQ,
9773 ack_number: Some(LOCAL_SEQ + 1),
9774 max_seg_size: Some(BASE_MSS - 80),
9775 window_scale: Some(0),
9776 timestamp: None,
9777 ..SEND_TEMPL
9778 }
9779 );
9780 assert!(!s.timestamp_enabled());
9781 s.send_slice(b"abcdef").unwrap();
9782 recv!(
9783 s,
9784 [TcpRepr {
9785 seq_number: LOCAL_SEQ + 1,
9786 ack_number: Some(REMOTE_SEQ + 1),
9787 payload: &b"abcdef"[..],
9788 timestamp: None,
9789 ..RECV_TEMPL
9790 }]
9791 );
9792 }
9793
9794 #[test]
9795 fn test_tsval_disabled_in_local_client() {
9796 let mut s = socket();
9797 assert!(!s.timestamp_enabled());
9799 s.local_seq_no = LOCAL_SEQ;
9800 s.socket
9801 .connect(&mut s.cx, REMOTE_END, LOCAL_END.port)
9802 .unwrap();
9803 assert_eq!(s.tuple, Some(TUPLE));
9804 recv!(
9805 s,
9806 [TcpRepr {
9807 control: TcpControl::Syn,
9808 seq_number: LOCAL_SEQ,
9809 ack_number: None,
9810 max_seg_size: Some(BASE_MSS),
9811 window_scale: Some(0),
9812 sack_permitted: true,
9813 ..RECV_TEMPL
9814 }]
9815 );
9816 send!(
9817 s,
9818 TcpRepr {
9819 control: TcpControl::Syn,
9820 seq_number: REMOTE_SEQ,
9821 ack_number: Some(LOCAL_SEQ + 1),
9822 max_seg_size: Some(BASE_MSS - 80),
9823 window_scale: Some(0),
9824 timestamp: Some(TcpTimestampRepr::new(500, 0)),
9825 ..SEND_TEMPL
9826 }
9827 );
9828 assert!(!s.timestamp_enabled());
9829 s.send_slice(b"abcdef").unwrap();
9830 recv!(
9831 s,
9832 [TcpRepr {
9833 seq_number: LOCAL_SEQ + 1,
9834 ack_number: Some(REMOTE_SEQ + 1),
9835 payload: &b"abcdef"[..],
9836 timestamp: None,
9837 ..RECV_TEMPL
9838 }]
9839 );
9840 }
9841
9842 #[test]
9847 fn test_established_close_on_src_ip_change() {
9848 let mut s = socket_established();
9849
9850 s.send_slice(b"abc").unwrap();
9852 recv!(
9853 s,
9854 [TcpRepr {
9855 seq_number: LOCAL_SEQ + 1,
9856 ack_number: Some(REMOTE_SEQ + 1),
9857 payload: &b"abc"[..],
9858 ..RECV_TEMPL
9859 }]
9860 );
9861
9862 let mut new_addrs = heapless::Vec::<IpCidr, IFACE_MAX_ADDR_COUNT>::new();
9865 new_addrs.push(IpCidr::new(OTHER_ADDR.into(), 24)).unwrap();
9866 s.cx.set_ip_addrs(new_addrs);
9867
9868 s.send_slice(b"def").unwrap();
9872 recv_nothing!(s);
9873 assert_eq!(s.state, State::Closed);
9874 }
9875}