|
@@ -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 &[
|