Skip to content

Commit c79203a

Browse files
committed
Only clear retransmit timer when all packets are acked
1 parent aa7e967 commit c79203a

File tree

1 file changed

+86
-2
lines changed

1 file changed

+86
-2
lines changed

src/socket/tcp.rs

Lines changed: 86 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1493,6 +1493,7 @@ impl<'a> TcpSocket<'a> {
14931493
// from the sequence space.
14941494
let mut ack_len = 0;
14951495
let mut ack_of_fin = false;
1496+
let mut ack_all = false;
14961497
if repr.control != TcpControl::Rst {
14971498
if let Some(ack_number) = repr.ack_number {
14981499
// Sequence number corresponding to the first byte in `tx_buffer`.
@@ -1514,6 +1515,8 @@ impl<'a> TcpSocket<'a> {
15141515
);
15151516
ack_of_fin = true;
15161517
}
1518+
1519+
ack_all = self.remote_last_seq == ack_number
15171520
}
15181521

15191522
self.rtte.on_ack(cx.now(), ack_number);
@@ -1643,7 +1646,7 @@ impl<'a> TcpSocket<'a> {
16431646
// ACK packets in ESTABLISHED state reset the retransmit timer,
16441647
// except for duplicate ACK packets which preserve it.
16451648
(State::Established, TcpControl::None) => {
1646-
if !self.timer.is_retransmit() || ack_len != 0 {
1649+
if !self.timer.is_retransmit() || ack_all {
16471650
self.timer.set_for_idle(cx.now(), self.keep_alive);
16481651
}
16491652
}
@@ -1662,7 +1665,9 @@ impl<'a> TcpSocket<'a> {
16621665
if ack_of_fin {
16631666
self.set_state(State::FinWait2);
16641667
}
1665-
self.timer.set_for_idle(cx.now(), self.keep_alive);
1668+
if ack_all {
1669+
self.timer.set_for_idle(cx.now(), self.keep_alive);
1670+
}
16661671
}
16671672

16681673
// FIN packets in FIN-WAIT-1 state change it to CLOSING, or to TIME-WAIT
@@ -5137,6 +5142,85 @@ mod test {
51375142
recv!(s, time 1550, Err(Error::Exhausted));
51385143
}
51395144

5145+
#[test]
5146+
fn test_data_retransmit_bursts_half_ack() {
5147+
let mut s = socket_established();
5148+
s.remote_mss = 6;
5149+
s.send_slice(b"abcdef012345").unwrap();
5150+
5151+
recv!(s, time 0, Ok(TcpRepr {
5152+
control: TcpControl::None,
5153+
seq_number: LOCAL_SEQ + 1,
5154+
ack_number: Some(REMOTE_SEQ + 1),
5155+
payload: &b"abcdef"[..],
5156+
..RECV_TEMPL
5157+
}), exact);
5158+
recv!(s, time 0, Ok(TcpRepr {
5159+
control: TcpControl::Psh,
5160+
seq_number: LOCAL_SEQ + 1 + 6,
5161+
ack_number: Some(REMOTE_SEQ + 1),
5162+
payload: &b"012345"[..],
5163+
..RECV_TEMPL
5164+
}), exact);
5165+
// Acknowledge the first packet
5166+
send!(s, time 5, TcpRepr {
5167+
seq_number: REMOTE_SEQ + 1,
5168+
ack_number: Some(LOCAL_SEQ + 1 + 6),
5169+
window_len: 6,
5170+
..SEND_TEMPL
5171+
});
5172+
// The second packet should be re-sent.
5173+
recv!(s, time 1500, Ok(TcpRepr {
5174+
control: TcpControl::Psh,
5175+
seq_number: LOCAL_SEQ + 1 + 6,
5176+
ack_number: Some(REMOTE_SEQ + 1),
5177+
payload: &b"012345"[..],
5178+
..RECV_TEMPL
5179+
}), exact);
5180+
5181+
recv!(s, time 1550, Err(Error::Exhausted));
5182+
}
5183+
5184+
#[test]
5185+
fn test_data_retransmit_bursts_half_ack_close() {
5186+
let mut s = socket_established();
5187+
s.remote_mss = 6;
5188+
s.send_slice(b"abcdef012345").unwrap();
5189+
s.close();
5190+
5191+
recv!(s, time 0, Ok(TcpRepr {
5192+
control: TcpControl::None,
5193+
seq_number: LOCAL_SEQ + 1,
5194+
ack_number: Some(REMOTE_SEQ + 1),
5195+
payload: &b"abcdef"[..],
5196+
..RECV_TEMPL
5197+
}), exact);
5198+
recv!(s, time 0, Ok(TcpRepr {
5199+
control: TcpControl::Fin,
5200+
seq_number: LOCAL_SEQ + 1 + 6,
5201+
ack_number: Some(REMOTE_SEQ + 1),
5202+
payload: &b"012345"[..],
5203+
..RECV_TEMPL
5204+
}), exact);
5205+
// Acknowledge the first packet
5206+
send!(s, time 5, TcpRepr {
5207+
seq_number: REMOTE_SEQ + 1,
5208+
ack_number: Some(LOCAL_SEQ + 1 + 6),
5209+
window_len: 6,
5210+
..SEND_TEMPL
5211+
});
5212+
// The second packet should be re-sent.
5213+
recv!(s, time 1500, Ok(TcpRepr {
5214+
control: TcpControl::Fin,
5215+
seq_number: LOCAL_SEQ + 1 + 6,
5216+
ack_number: Some(REMOTE_SEQ + 1),
5217+
payload: &b"012345"[..],
5218+
..RECV_TEMPL
5219+
}), exact);
5220+
5221+
recv!(s, time 1550, Err(Error::Exhausted));
5222+
}
5223+
51405224
#[test]
51415225
fn test_send_data_after_syn_ack_retransmit() {
51425226
let mut s = socket_syn_received();

0 commit comments

Comments
 (0)