diff --git a/src/socket/tcp.rs b/src/socket/tcp.rs index cde9397..d4adfbe 100644 --- a/src/socket/tcp.rs +++ b/src/socket/tcp.rs @@ -1165,7 +1165,7 @@ impl<'a> TcpSocket<'a> { // of why we sometimes send an RST and sometimes an RST|ACK reply_repr.control = TcpControl::Rst; reply_repr.seq_number = repr.ack_number.unwrap_or_default(); - if repr.control == TcpControl::Syn { + if repr.control == TcpControl::Syn && repr.ack_number.is_none() { reply_repr.ack_number = Some(repr.seq_number + repr.segment_len()); } @@ -1350,7 +1350,7 @@ impl<'a> TcpSocket<'a> { self.local_endpoint, self.remote_endpoint ); - return Err(Error::Dropped); + return Ok(Some(Self::rst_reply(ip_repr, repr))); } } // Anything else in the SYN-SENT state is invalid. @@ -3414,7 +3414,13 @@ mod test { window_scale: Some(0), ..SEND_TEMPL }, - Err(Error::Dropped) + Ok(Some(TcpRepr { + control: TcpControl::Rst, + seq_number: LOCAL_SEQ, + ack_number: None, + window_len: 0, + ..RECV_TEMPL + })) ); assert_eq!(s.state, State::SynSent); }