Переглянути джерело

Use correct sequence numbers in TCP RST packets.

whitequark 8 роки тому
батько
коміт
4427bc35bd
2 змінених файлів з 13 додано та 2 видалено
  1. 3 2
      src/iface/ethernet.rs
  2. 10 0
      src/wire/tcp.rs

+ 3 - 2
src/iface/ethernet.rs

@@ -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:    &[]
                             };

+ 10 - 0
src/wire/tcp.rs

@@ -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