浏览代码

tcp: do not switch to ESTABLISHED when ack in syn-received is one too low.

Dario Nieuwenhuis 3 年之前
父节点
当前提交
1adca5b9ec
共有 1 个文件被更改,包括 9 次插入2 次删除
  1. 9 2
      src/socket/tcp.rs

+ 9 - 2
src/socket/tcp.rs

@@ -1396,9 +1396,14 @@ impl<'a> TcpSocket<'a> {
                 let unacknowledged = self.tx_buffer.len() + control_len;
 
                 // Acceptable ACK range (both inclusive)
-                let ack_min = self.local_seq_no;
+                let mut ack_min = self.local_seq_no;
                 let ack_max = self.local_seq_no + unacknowledged;
 
+                // If we have sent a SYN, it MUST be acknowledged.
+                if sent_syn {
+                    ack_min += 1;
+                }
+
                 if ack_number < ack_min {
                     net_debug!(
                         "{}:{}:{}: duplicate ACK ({} not in {}...{})",
@@ -3061,8 +3066,10 @@ mod test {
                 seq_number: REMOTE_SEQ + 1,
                 ack_number: Some(LOCAL_SEQ), // wrong
                 ..SEND_TEMPL
-            }
+            },
+            Err(Error::Dropped)
         );
+        assert_eq!(s.state, State::SynReceived);
     }
 
     #[test]