|
@@ -228,24 +228,25 @@ impl<'a, 'b, 'c, DeviceT: Device + 'a> Interface<'a, 'b, 'c, DeviceT> {
|
|
|
|
|
|
if !handled && protocol == IpProtocol::Tcp {
|
|
|
let tcp_packet = try!(TcpPacket::new(ipv4_packet.payload()));
|
|
|
-
|
|
|
- let tcp_reply_repr = TcpRepr {
|
|
|
- src_port: tcp_packet.dst_port(),
|
|
|
- dst_port: tcp_packet.src_port(),
|
|
|
- control: TcpControl::Rst,
|
|
|
- seq_number: tcp_packet.ack_number(),
|
|
|
- ack_number: Some(tcp_packet.seq_number() +
|
|
|
- tcp_packet.segment_len()),
|
|
|
- window_len: 0,
|
|
|
- payload: &[]
|
|
|
- };
|
|
|
- let ipv4_reply_repr = Ipv4Repr {
|
|
|
- src_addr: dst_addr,
|
|
|
- dst_addr: src_addr,
|
|
|
- protocol: IpProtocol::Tcp,
|
|
|
- payload_len: tcp_reply_repr.buffer_len()
|
|
|
- };
|
|
|
- response = Response::Tcpv4(ipv4_reply_repr, tcp_reply_repr);
|
|
|
+ if !tcp_packet.rst() {
|
|
|
+ let tcp_reply_repr = TcpRepr {
|
|
|
+ src_port: tcp_packet.dst_port(),
|
|
|
+ dst_port: tcp_packet.src_port(),
|
|
|
+ control: TcpControl::Rst,
|
|
|
+ seq_number: tcp_packet.ack_number(),
|
|
|
+ ack_number: Some(tcp_packet.seq_number() +
|
|
|
+ tcp_packet.segment_len()),
|
|
|
+ window_len: 0,
|
|
|
+ payload: &[]
|
|
|
+ };
|
|
|
+ let ipv4_reply_repr = Ipv4Repr {
|
|
|
+ src_addr: dst_addr,
|
|
|
+ dst_addr: src_addr,
|
|
|
+ protocol: IpProtocol::Tcp,
|
|
|
+ payload_len: tcp_reply_repr.buffer_len()
|
|
|
+ };
|
|
|
+ response = Response::Tcpv4(ipv4_reply_repr, tcp_reply_repr);
|
|
|
+ }
|
|
|
} else if !handled {
|
|
|
let reason;
|
|
|
if protocol == IpProtocol::Udp {
|