Преглед изворни кода

Don't switch TCP state from FIN-WAIT-1 to FIN-WAIT-2 with queued data.

whitequark пре 8 година
родитељ
комит
4d11b5297f
1 измењених фајлова са 11 додато и 2 уклоњено
  1. 11 2
      src/socket/tcp.rs

+ 11 - 2
src/socket/tcp.rs

@@ -725,9 +725,12 @@ impl<'a> TcpSocket<'a> {
                 self.retransmit.reset();
             }
 
-            // ACK packets in FIN-WAIT-1 state change it to FIN-WAIT-2.
+            // ACK packets in FIN-WAIT-1 state change it to FIN-WAIT-2, if we've already
+            // sent everything in the transmit buffer.
             (State::FinWait1, TcpRepr { control: TcpControl::None, .. }) => {
-                self.set_state(State::FinWait2);
+                if self.tx_buffer.empty() {
+                    self.set_state(State::FinWait2);
+                }
             }
 
             // FIN packets in FIN-WAIT-1 state change it to CLOSING.
@@ -1654,6 +1657,12 @@ mod test {
             payload:    &b"abcdef"[..],
             ..RECV_TEMPL
         }]);
+        send!(s, TcpRepr {
+            seq_number: REMOTE_SEQ + 1,
+            ack_number: Some(LOCAL_SEQ + 1 + 6),
+            ..SEND_TEMPL
+        });
+        assert_eq!(s.state, State::FinWait1);
     }
 
     #[test]