From f84b234a381a4a65ddc325df581b005453be452c Mon Sep 17 00:00:00 2001 From: whitequark Date: Mon, 28 Aug 2017 06:01:13 +0000 Subject: [PATCH] Add a test for TCP sockets returning ACKs even with zero window. --- src/socket/tcp.rs | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/src/socket/tcp.rs b/src/socket/tcp.rs index 2c527f4..3e8becd 100644 --- a/src/socket/tcp.rs +++ b/src/socket/tcp.rs @@ -720,8 +720,7 @@ impl<'a> TcpSocket<'a> { reply_repr.control = TcpControl::Rst; reply_repr.seq_number = repr.ack_number.unwrap_or_default(); if repr.control == TcpControl::Syn { - reply_repr.ack_number = Some(repr.seq_number + - repr.segment_len()); + reply_repr.ack_number = Some(repr.seq_number + repr.segment_len()); } (ip_reply_repr, reply_repr) @@ -2895,4 +2894,32 @@ mod test { ..RECV_TEMPL }))); } + + #[test] + fn test_zero_window_ack() { + let mut s = socket_established(); + s.rx_buffer = SocketBuffer::new(vec![0; 6]); + send!(s, TcpRepr { + seq_number: REMOTE_SEQ + 1, + ack_number: Some(LOCAL_SEQ + 1), + payload: &b"abcdef"[..], + ..SEND_TEMPL + }, Ok(Some(TcpRepr { + seq_number: LOCAL_SEQ + 1, + ack_number: Some(REMOTE_SEQ + 1 + 6), + window_len: 0, + ..RECV_TEMPL + }))); + send!(s, TcpRepr { + seq_number: REMOTE_SEQ + 1 + 6, + ack_number: Some(LOCAL_SEQ + 1), + payload: &b"123456"[..], + ..SEND_TEMPL + }, Ok(Some(TcpRepr { + seq_number: LOCAL_SEQ + 1, + ack_number: Some(REMOTE_SEQ + 1 + 6), + window_len: 0, + ..RECV_TEMPL + }))); + } }