@@ -1677,7 +1677,11 @@ impl<'a> Socket<'a> {
1677
1677
}
1678
1678
1679
1679
let window_start = self . remote_seq_no + self . rx_buffer . len ( ) ;
1680
- let window_end = self . remote_seq_no + self . rx_buffer . capacity ( ) ;
1680
+ let window_end = if let Some ( last_ack) = self . remote_last_ack {
1681
+ last_ack + ( ( self . remote_last_win as usize ) << self . remote_win_shift )
1682
+ } else {
1683
+ window_start
1684
+ } ;
1681
1685
let segment_start = repr. seq_number ;
1682
1686
let segment_end = repr. seq_number + repr. payload . len ( ) ;
1683
1687
@@ -6789,6 +6793,74 @@ mod test {
6789
6793
) ;
6790
6794
}
6791
6795
6796
+ #[ test]
6797
+ fn test_recv_out_of_recv_win ( ) {
6798
+ let mut s = socket_established ( ) ;
6799
+ s. set_ack_delay ( Some ( ACK_DELAY_DEFAULT ) ) ;
6800
+ s. remote_mss = 32 ;
6801
+
6802
+ // No ACKs are sent due to the ACK delay.
6803
+ send ! (
6804
+ s,
6805
+ TcpRepr {
6806
+ control: TcpControl :: Psh ,
6807
+ seq_number: REMOTE_SEQ + 1 ,
6808
+ ack_number: Some ( LOCAL_SEQ + 1 ) ,
6809
+ payload: & [ 0 ; 32 ] ,
6810
+ ..SEND_TEMPL
6811
+ }
6812
+ ) ;
6813
+ recv_nothing ! ( s) ;
6814
+
6815
+ // RMSS+1 bytes of data has been received, so ACK is sent without delay.
6816
+ send ! (
6817
+ s,
6818
+ TcpRepr {
6819
+ control: TcpControl :: Psh ,
6820
+ seq_number: REMOTE_SEQ + 33 ,
6821
+ ack_number: Some ( LOCAL_SEQ + 1 ) ,
6822
+ payload: & [ 0 ; 1 ] ,
6823
+ ..SEND_TEMPL
6824
+ }
6825
+ ) ;
6826
+ recv ! (
6827
+ s,
6828
+ Ok ( TcpRepr {
6829
+ seq_number: LOCAL_SEQ + 1 ,
6830
+ ack_number: Some ( REMOTE_SEQ + 34 ) ,
6831
+ window_len: 31 ,
6832
+ ..RECV_TEMPL
6833
+ } )
6834
+ ) ;
6835
+
6836
+ // This frees up a byte in the receive buffer. However, the remote shouldn't be aware of
6837
+ // this since no ACKs are sent.
6838
+ s. recv_slice ( & mut [ 0 ; 1 ] ) . unwrap ( ) ;
6839
+ recv_nothing ! ( s) ;
6840
+
6841
+ // Now, if the remote wants to send one byte outside of the receive window that we
6842
+ // previously advertised, it should not succeed.
6843
+ send ! (
6844
+ s,
6845
+ TcpRepr {
6846
+ control: TcpControl :: Psh ,
6847
+ seq_number: REMOTE_SEQ + 34 ,
6848
+ ack_number: Some ( LOCAL_SEQ + 1 ) ,
6849
+ payload: & [ 0 ; 32 ] ,
6850
+ ..SEND_TEMPL
6851
+ }
6852
+ ) ;
6853
+ recv ! (
6854
+ s,
6855
+ Ok ( TcpRepr {
6856
+ seq_number: LOCAL_SEQ + 1 ,
6857
+ ack_number: Some ( REMOTE_SEQ + 65 ) ,
6858
+ window_len: 1 , // The last byte isn't accepted.
6859
+ ..RECV_TEMPL
6860
+ } )
6861
+ ) ;
6862
+ }
6863
+
6792
6864
#[ test]
6793
6865
fn test_close_wait_no_window_update ( ) {
6794
6866
let mut s = socket_established ( ) ;
0 commit comments