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