Skip to content

Commit 54905ee

Browse files
authored
Merge pull request #995 from XOR-op/fix-sack
fix: internal sACK flag not set correctly for client socket
2 parents d667a2a + ffcb62e commit 54905ee

File tree

1 file changed

+58
-0
lines changed

1 file changed

+58
-0
lines changed

src/socket/tcp.rs

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1806,6 +1806,7 @@ impl<'a> Socket<'a> {
18061806
self.remote_seq_no = repr.seq_number + 1;
18071807
self.remote_last_seq = self.local_seq_no + 1;
18081808
self.remote_last_ack = Some(repr.seq_number);
1809+
self.remote_has_sack = repr.sack_permitted;
18091810
self.remote_win_scale = repr.window_scale;
18101811
// Remote doesn't support window scaling, don't do it.
18111812
if self.remote_win_scale.is_none() {
@@ -3724,6 +3725,63 @@ mod test {
37243725
assert_eq!(s.state, State::Closed);
37253726
}
37263727

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+
37273785
#[test]
37283786
fn test_syn_sent_win_scale_buffers() {
37293787
for (buffer_size, shift_amt) in &[

0 commit comments

Comments
 (0)