Use correct sequence numbers in TCP RST packets.

v0.7.x
whitequark 2016-12-23 07:31:15 +00:00
parent 3bd715e1bc
commit 6d8d3cb29d
2 changed files with 13 additions and 2 deletions

View File

@ -233,8 +233,9 @@ impl<'a, 'b: 'a,
src_port: tcp_packet.dst_port(),
dst_port: tcp_packet.src_port(),
control: TcpControl::Rst,
seq_number: 0,
ack_number: Some(tcp_packet.seq_number() + 1),
seq_number: tcp_packet.ack_number(),
ack_number: Some(tcp_packet.seq_number() +
tcp_packet.segment_len()),
window_len: 0,
payload: &[]
};

View File

@ -182,6 +182,16 @@ impl<T: AsRef<[u8]>> Packet<T> {
NetworkEndian::read_u16(&data[field::URGENT])
}
/// Return the length of the segment, in terms of sequence space.
#[inline(always)]
pub fn segment_len(&self) -> i32 {
let data = self.buffer.as_ref();
let mut length = data.len() - self.header_len() as usize;
if self.syn() { length += 1}
if self.fin() { length += 1}
length as i32
}
/// Validate the packet checksum.
///
/// # Panics