Skip to content

Commit 3226770

Browse files
committedAug 30, 2017
Fix the TCP SEQ acceptability check.
It has nothing to do with the last ACK transmitted.
1 parent b927085 commit 3226770

File tree

1 file changed

+15
-12
lines changed

1 file changed

+15
-12
lines changed
 

Diff for: ‎src/socket/tcp.rs

+15-12
Original file line numberDiff line numberDiff line change
@@ -830,30 +830,33 @@ impl<'a> TcpSocket<'a> {
830830
}
831831
}
832832

833-
match (self.state, repr) {
833+
match self.state {
834834
// In LISTEN and SYN-SENT states, we have not yet synchronized with the remote end.
835-
(State::Listen, _) => (),
836-
(State::SynSent, _) => (),
835+
State::Listen => (),
836+
State::SynSent => (),
837837
// In all other states, segments must occupy a valid portion of the receive window.
838-
(_, &TcpRepr { seq_number, .. }) => {
838+
_ => {
839839
let mut send_challenge_ack = false;
840840

841-
let window_start = self.remote_last_ack;
842-
let window_end = window_start + self.rx_buffer.capacity();
843-
if seq_number < window_start || seq_number > window_end {
844-
net_debug!("[{}]{}:{}: SEQ not in receive window ({} not in {}..{}), \
845-
will send challenge ACK",
841+
let window_start = self.remote_seq_no;
842+
let window_end = window_start + self.rx_buffer.capacity();
843+
let segment_start = repr.seq_number;
844+
let segment_end = segment_start + repr.segment_len();
845+
if !((window_start <= segment_start && segment_start <= window_end) ||
846+
(window_start <= segment_end && segment_end <= window_end)) {
847+
net_debug!("[{}]{}:{}: segment not in receive window \
848+
({}..{} not intersecting {}..{}), will send challenge ACK",
846849
self.debug_id, self.local_endpoint, self.remote_endpoint,
847-
seq_number, window_start, window_end);
850+
segment_start, segment_end, window_start, window_end);
848851
send_challenge_ack = true;
849852
}
850853

851854
// For now, do not actually try to reassemble out-of-order segments.
852-
if seq_number != self.remote_last_ack {
855+
if segment_start != window_start + self.rx_buffer.len() {
853856
net_debug!("[{}]{}:{}: out-of-order SEQ ({} not in ..{}), \
854857
will send challenge ACK",
855858
self.debug_id, self.local_endpoint, self.remote_endpoint,
856-
seq_number, self.remote_last_ack);
859+
segment_start, self.remote_last_ack);
857860
// Some segments between what we have last received and this segment
858861
// went missing. Send a duplicate ACK; RFC 793 does not specify the behavior
859862
// required when receiving a duplicate ACK, but in practice (see RFC 1122

0 commit comments

Comments
 (0)