@@ -856,10 +856,18 @@ impl<'a> TcpSocket<'a> {
856
856
_ => {
857
857
let mut send_challenge_ack = false ;
858
858
859
- let window_start = self . remote_seq_no ;
860
- let window_end = window_start + self . rx_buffer . capacity ( ) ;
859
+ let window_start = self . remote_seq_no + self . rx_buffer . len ( ) ;
860
+ let window_end = self . remote_seq_no + self . rx_buffer . capacity ( ) ;
861
861
let segment_start = repr. seq_number ;
862
- let segment_end = segment_start + repr. segment_len ( ) ;
862
+ let segment_end = repr. seq_number + repr. segment_len ( ) ;
863
+
864
+ if window_start == window_end && segment_start != segment_end {
865
+ net_debug ! ( "[{}]{}:{}: non-zero-length segment with zero receive window, \
866
+ will only send an ACK",
867
+ self . debug_id, self . local_endpoint, self . remote_endpoint) ;
868
+ send_challenge_ack = true ;
869
+ }
870
+
863
871
if !( ( window_start <= segment_start && segment_start <= window_end) ||
864
872
( window_start <= segment_end && segment_end <= window_end) ) {
865
873
net_debug ! ( "[{}]{}:{}: segment not in receive window \
@@ -870,11 +878,11 @@ impl<'a> TcpSocket<'a> {
870
878
}
871
879
872
880
// For now, do not actually try to reassemble out-of-order segments.
873
- if segment_start != window_start + self . rx_buffer . len ( ) {
881
+ if segment_start != window_start {
874
882
net_debug ! ( "[{}]{}:{}: out-of-order SEQ ({} not equal to {}), \
875
883
will send challenge ACK",
876
884
self . debug_id, self . local_endpoint, self . remote_endpoint,
877
- segment_start, window_start + self . rx_buffer . len ( ) ) ;
885
+ segment_start, window_start) ;
878
886
// Some segments between what we have last received and this segment
879
887
// went missing. Send a duplicate ACK; RFC 793 does not specify the behavior
880
888
// required when receiving a duplicate ACK, but in practice (see RFC 1122
@@ -1092,16 +1100,9 @@ impl<'a> TcpSocket<'a> {
1092
1100
self . debug_id, self . local_endpoint, self . remote_endpoint,
1093
1101
repr. payload. len( ) , self . rx_buffer. len( ) + repr. payload. len( ) ) ;
1094
1102
self . rx_buffer . enqueue_slice ( repr. payload ) ;
1095
-
1096
- // Send an acknowledgement.
1097
- self . remote_last_ack = Some ( self . remote_seq_no + self . rx_buffer . len ( ) ) ;
1098
- self . remote_last_win = self . rx_buffer . window ( ) as u16 ;
1099
- Ok ( Some ( self . ack_reply ( ip_repr, & repr) ) )
1100
- } else {
1101
- // No data to acknowledge; the logic to acknowledge SYN and FIN flags
1102
- // resides in dispatch().
1103
- Ok ( None )
1104
1103
}
1104
+
1105
+ Ok ( None )
1105
1106
}
1106
1107
1107
1108
fn seq_to_transmit ( & self , control : TcpControl ) -> bool {
@@ -1664,12 +1665,13 @@ mod test {
1664
1665
ack_number: Some ( LOCAL_SEQ + 1 ) ,
1665
1666
payload: & b"abcdef" [ ..] ,
1666
1667
..SEND_TEMPL
1667
- } , Ok ( Some ( TcpRepr {
1668
+ } ) ;
1669
+ recv ! ( s, [ TcpRepr {
1668
1670
seq_number: LOCAL_SEQ + 1 ,
1669
1671
ack_number: Some ( REMOTE_SEQ + 1 + 6 + 1 ) ,
1670
1672
window_len: 58 ,
1671
1673
..RECV_TEMPL
1672
- } ) ) ) ;
1674
+ } ] ) ;
1673
1675
assert_eq ! ( s. state, State :: CloseWait ) ;
1674
1676
sanity ! ( s, TcpSocket {
1675
1677
remote_last_ack: Some ( REMOTE_SEQ + 1 + 6 + 1 ) ,
@@ -1881,12 +1883,13 @@ mod test {
1881
1883
ack_number: Some ( LOCAL_SEQ + 1 ) ,
1882
1884
payload: & b"abcdef" [ ..] ,
1883
1885
..SEND_TEMPL
1884
- } , Ok ( Some ( TcpRepr {
1886
+ } ) ;
1887
+ recv ! ( s, [ TcpRepr {
1885
1888
seq_number: LOCAL_SEQ + 1 ,
1886
1889
ack_number: Some ( REMOTE_SEQ + 1 + 6 ) ,
1887
1890
window_len: 58 ,
1888
1891
..RECV_TEMPL
1889
- } ) ) ) ;
1892
+ } ] ) ;
1890
1893
assert_eq ! ( s. rx_buffer. dequeue( 6 ) , & b"abcdef" [ ..] ) ;
1891
1894
}
1892
1895
@@ -2610,12 +2613,13 @@ mod test {
2610
2613
ack_number: Some ( LOCAL_SEQ + 1 ) ,
2611
2614
payload: & b"abcdef" [ ..] ,
2612
2615
..SEND_TEMPL
2613
- } , Ok ( Some ( TcpRepr {
2616
+ } ) ;
2617
+ recv ! ( s, [ TcpRepr {
2614
2618
seq_number: LOCAL_SEQ + 1 ,
2615
2619
ack_number: Some ( REMOTE_SEQ + 1 + 6 ) ,
2616
2620
window_len: 58 ,
2617
2621
..RECV_TEMPL
2618
- } ) ) ) ;
2622
+ } ] ) ;
2619
2623
s
2620
2624
}
2621
2625
@@ -2644,12 +2648,13 @@ mod test {
2644
2648
ack_number: Some ( LOCAL_SEQ + 1 ) ,
2645
2649
payload: & b"abcdef" [ ..] ,
2646
2650
..SEND_TEMPL
2647
- } , Ok ( Some ( TcpRepr {
2651
+ } ) ;
2652
+ recv ! ( s, [ TcpRepr {
2648
2653
seq_number: LOCAL_SEQ + 1 ,
2649
2654
ack_number: Some ( REMOTE_SEQ + 1 + 6 ) ,
2650
2655
window_len: 58 ,
2651
2656
..RECV_TEMPL
2652
- } ) ) ) ;
2657
+ } ] ) ;
2653
2658
send ! ( s, TcpRepr {
2654
2659
seq_number: REMOTE_SEQ + 1 + 6 + 6 ,
2655
2660
ack_number: Some ( LOCAL_SEQ + 1 ) ,
@@ -2950,12 +2955,13 @@ mod test {
2950
2955
ack_number: Some ( LOCAL_SEQ + 1 ) ,
2951
2956
payload: & b"abcdef" [ ..] ,
2952
2957
..SEND_TEMPL
2953
- } , Ok ( Some ( TcpRepr {
2958
+ } ) ;
2959
+ recv ! ( s, [ TcpRepr {
2954
2960
seq_number: LOCAL_SEQ + 1 ,
2955
2961
ack_number: Some ( REMOTE_SEQ + 1 + 6 ) ,
2956
2962
window_len: 58 ,
2957
2963
..RECV_TEMPL
2958
- } ) ) ) ;
2964
+ } ] ) ;
2959
2965
}
2960
2966
2961
2967
#[ test]
@@ -2967,12 +2973,13 @@ mod test {
2967
2973
ack_number: Some ( LOCAL_SEQ + 1 ) ,
2968
2974
payload: & b"abcdef" [ ..] ,
2969
2975
..SEND_TEMPL
2970
- } , Ok ( Some ( TcpRepr {
2976
+ } ) ;
2977
+ recv ! ( s, [ TcpRepr {
2971
2978
seq_number: LOCAL_SEQ + 1 ,
2972
2979
ack_number: Some ( REMOTE_SEQ + 1 + 6 ) ,
2973
2980
window_len: 0 ,
2974
2981
..RECV_TEMPL
2975
- } ) ) ) ;
2982
+ } ] ) ;
2976
2983
send ! ( s, TcpRepr {
2977
2984
seq_number: REMOTE_SEQ + 1 + 6 ,
2978
2985
ack_number: Some ( LOCAL_SEQ + 1 ) ,
@@ -2995,12 +3002,13 @@ mod test {
2995
3002
ack_number: Some ( LOCAL_SEQ + 1 ) ,
2996
3003
payload: & b"abcdef" [ ..] ,
2997
3004
..SEND_TEMPL
2998
- } , Ok ( Some ( TcpRepr {
3005
+ } ) ;
3006
+ recv ! ( s, [ TcpRepr {
2999
3007
seq_number: LOCAL_SEQ + 1 ,
3000
3008
ack_number: Some ( REMOTE_SEQ + 1 + 6 ) ,
3001
3009
window_len: 0 ,
3002
3010
..RECV_TEMPL
3003
- } ) ) ) ;
3011
+ } ] ) ;
3004
3012
recv ! ( s, time 0 , Err ( Error :: Exhausted ) ) ;
3005
3013
assert_eq ! ( s. recv( 3 ) , Ok ( & b"abc" [ ..] ) ) ;
3006
3014
recv ! ( s, time 0 , Ok ( TcpRepr {
0 commit comments