diff --git a/src/socket/tcp.rs b/src/socket/tcp.rs index 988bce90..46f1b36f 100644 --- a/src/socket/tcp.rs +++ b/src/socket/tcp.rs @@ -3725,6 +3725,63 @@ mod test { assert_eq!(s.state, State::Closed); } + #[test] + fn test_syn_sent_sack_option() { + let mut s = socket_syn_sent(); + recv!( + s, + [TcpRepr { + control: TcpControl::Syn, + seq_number: LOCAL_SEQ, + ack_number: None, + max_seg_size: Some(BASE_MSS), + window_scale: Some(0), + sack_permitted: true, + ..RECV_TEMPL + }] + ); + send!( + s, + TcpRepr { + control: TcpControl::Syn, + seq_number: REMOTE_SEQ, + ack_number: Some(LOCAL_SEQ + 1), + max_seg_size: Some(BASE_MSS - 80), + window_scale: Some(0), + sack_permitted: true, + ..SEND_TEMPL + } + ); + assert!(s.remote_has_sack); + + let mut s = socket_syn_sent(); + recv!( + s, + [TcpRepr { + control: TcpControl::Syn, + seq_number: LOCAL_SEQ, + ack_number: None, + max_seg_size: Some(BASE_MSS), + window_scale: Some(0), + sack_permitted: true, + ..RECV_TEMPL + }] + ); + send!( + s, + TcpRepr { + control: TcpControl::Syn, + seq_number: REMOTE_SEQ, + ack_number: Some(LOCAL_SEQ + 1), + max_seg_size: Some(BASE_MSS - 80), + window_scale: Some(0), + sack_permitted: false, + ..SEND_TEMPL + } + ); + assert!(!s.remote_has_sack); + } + #[test] fn test_syn_sent_win_scale_buffers() { for (buffer_size, shift_amt) in &[