@@ -734,19 +734,20 @@ impl<'a> TcpSocket<'a> {
734
734
// Every acknowledgement must be for transmitted but unacknowledged data.
735
735
( _, & TcpRepr { ack_number : Some ( ack_number) , .. } ) => {
736
736
let unacknowledged = self . tx_buffer . len ( ) + control_len;
737
+
737
738
if ack_number < self . local_seq_no {
738
739
net_debug ! ( "[{}]{}:{}: duplicate ACK ({} not in {}...{})" ,
739
740
self . debug_id, self . local_endpoint, self . remote_endpoint,
740
741
ack_number, self . local_seq_no, self . local_seq_no + unacknowledged) ;
741
- // FIXME: instead of waiting for the retransmit timer to kick in,
742
- // reset it here.
742
+ // FIXME: implement fast retransmit
743
743
return Err ( Error :: Dropped )
744
744
}
745
+
745
746
if ack_number > self . local_seq_no + unacknowledged {
746
747
net_debug ! ( "[{}]{}:{}: unacceptable ACK ({} not in {}...{})" ,
747
748
self . debug_id, self . local_endpoint, self . remote_endpoint,
748
749
ack_number, self . local_seq_no, self . local_seq_no + unacknowledged) ;
749
- return Err ( Error :: Dropped )
750
+ return Ok ( Some ( self . ack_reply ( ip_repr , & repr ) ) )
750
751
}
751
752
}
752
753
}
@@ -2903,6 +2904,20 @@ mod test {
2903
2904
} ) ) ;
2904
2905
}
2905
2906
2907
+ #[ test]
2908
+ fn test_unacceptable_ack_challenge_ack ( ) {
2909
+ let mut s = socket_established ( ) ;
2910
+ send ! ( s, TcpRepr {
2911
+ seq_number: REMOTE_SEQ + 1 ,
2912
+ ack_number: Some ( LOCAL_SEQ + 1 + 1 ) ,
2913
+ ..SEND_TEMPL
2914
+ } , Ok ( Some ( TcpRepr {
2915
+ seq_number: LOCAL_SEQ + 1 ,
2916
+ ack_number: Some ( REMOTE_SEQ + 1 ) ,
2917
+ ..RECV_TEMPL
2918
+ } ) ) ) ;
2919
+ }
2920
+
2906
2921
#[ test]
2907
2922
fn test_fill_peer_window ( ) {
2908
2923
let mut s = socket_established ( ) ;
0 commit comments