@@ -1806,6 +1806,7 @@ impl<'a> Socket<'a> {
1806
1806
self . remote_seq_no = repr. seq_number + 1 ;
1807
1807
self . remote_last_seq = self . local_seq_no + 1 ;
1808
1808
self . remote_last_ack = Some ( repr. seq_number ) ;
1809
+ self . remote_has_sack = repr. sack_permitted ;
1809
1810
self . remote_win_scale = repr. window_scale ;
1810
1811
// Remote doesn't support window scaling, don't do it.
1811
1812
if self . remote_win_scale . is_none ( ) {
@@ -3724,6 +3725,63 @@ mod test {
3724
3725
assert_eq ! ( s. state, State :: Closed ) ;
3725
3726
}
3726
3727
3728
+ #[ test]
3729
+ fn test_syn_sent_sack_option ( ) {
3730
+ let mut s = socket_syn_sent ( ) ;
3731
+ recv ! (
3732
+ s,
3733
+ [ TcpRepr {
3734
+ control: TcpControl :: Syn ,
3735
+ seq_number: LOCAL_SEQ ,
3736
+ ack_number: None ,
3737
+ max_seg_size: Some ( BASE_MSS ) ,
3738
+ window_scale: Some ( 0 ) ,
3739
+ sack_permitted: true ,
3740
+ ..RECV_TEMPL
3741
+ } ]
3742
+ ) ;
3743
+ send ! (
3744
+ s,
3745
+ TcpRepr {
3746
+ control: TcpControl :: Syn ,
3747
+ seq_number: REMOTE_SEQ ,
3748
+ ack_number: Some ( LOCAL_SEQ + 1 ) ,
3749
+ max_seg_size: Some ( BASE_MSS - 80 ) ,
3750
+ window_scale: Some ( 0 ) ,
3751
+ sack_permitted: true ,
3752
+ ..SEND_TEMPL
3753
+ }
3754
+ ) ;
3755
+ assert ! ( s. remote_has_sack) ;
3756
+
3757
+ let mut s = socket_syn_sent ( ) ;
3758
+ recv ! (
3759
+ s,
3760
+ [ TcpRepr {
3761
+ control: TcpControl :: Syn ,
3762
+ seq_number: LOCAL_SEQ ,
3763
+ ack_number: None ,
3764
+ max_seg_size: Some ( BASE_MSS ) ,
3765
+ window_scale: Some ( 0 ) ,
3766
+ sack_permitted: true ,
3767
+ ..RECV_TEMPL
3768
+ } ]
3769
+ ) ;
3770
+ send ! (
3771
+ s,
3772
+ TcpRepr {
3773
+ control: TcpControl :: Syn ,
3774
+ seq_number: REMOTE_SEQ ,
3775
+ ack_number: Some ( LOCAL_SEQ + 1 ) ,
3776
+ max_seg_size: Some ( BASE_MSS - 80 ) ,
3777
+ window_scale: Some ( 0 ) ,
3778
+ sack_permitted: false ,
3779
+ ..SEND_TEMPL
3780
+ }
3781
+ ) ;
3782
+ assert ! ( !s. remote_has_sack) ;
3783
+ }
3784
+
3727
3785
#[ test]
3728
3786
fn test_syn_sent_win_scale_buffers ( ) {
3729
3787
for ( buffer_size, shift_amt) in & [
0 commit comments