@@ -830,30 +830,33 @@ impl<'a> TcpSocket<'a> {
830
830
}
831
831
}
832
832
833
- match ( self . state , repr ) {
833
+ match self . state {
834
834
// In LISTEN and SYN-SENT states, we have not yet synchronized with the remote end.
835
- ( State :: Listen , _ ) => ( ) ,
836
- ( State :: SynSent , _ ) => ( ) ,
835
+ State :: Listen => ( ) ,
836
+ State :: SynSent => ( ) ,
837
837
// In all other states, segments must occupy a valid portion of the receive window.
838
- ( _ , & TcpRepr { seq_number , .. } ) => {
838
+ _ => {
839
839
let mut send_challenge_ack = false ;
840
840
841
- let window_start = self . remote_last_ack ;
842
- let window_end = window_start + self . rx_buffer . capacity ( ) ;
843
- if seq_number < window_start || seq_number > window_end {
844
- net_debug ! ( "[{}]{}:{}: SEQ not in receive window ({} not in {}..{}), \
845
- will send challenge ACK",
841
+ let window_start = self . remote_seq_no ;
842
+ let window_end = window_start + self . rx_buffer . capacity ( ) ;
843
+ let segment_start = repr. seq_number ;
844
+ let segment_end = segment_start + repr. segment_len ( ) ;
845
+ if !( ( window_start <= segment_start && segment_start <= window_end) ||
846
+ ( window_start <= segment_end && segment_end <= window_end) ) {
847
+ net_debug ! ( "[{}]{}:{}: segment not in receive window \
848
+ ({}..{} not intersecting {}..{}), will send challenge ACK",
846
849
self . debug_id, self . local_endpoint, self . remote_endpoint,
847
- seq_number , window_start, window_end) ;
850
+ segment_start , segment_end , window_start, window_end) ;
848
851
send_challenge_ack = true ;
849
852
}
850
853
851
854
// For now, do not actually try to reassemble out-of-order segments.
852
- if seq_number != self . remote_last_ack {
855
+ if segment_start != window_start + self . rx_buffer . len ( ) {
853
856
net_debug ! ( "[{}]{}:{}: out-of-order SEQ ({} not in ..{}), \
854
857
will send challenge ACK",
855
858
self . debug_id, self . local_endpoint, self . remote_endpoint,
856
- seq_number , self . remote_last_ack) ;
859
+ segment_start , self . remote_last_ack) ;
857
860
// Some segments between what we have last received and this segment
858
861
// went missing. Send a duplicate ACK; RFC 793 does not specify the behavior
859
862
// required when receiving a duplicate ACK, but in practice (see RFC 1122
0 commit comments