Browse Source

Use signed integers to represent TCP sequence numbers.

whitequark 8 years ago
parent
commit
e13e40668a
2 changed files with 20 additions and 20 deletions
  1. 4 4
      src/socket/tcp.rs
  2. 16 16
      src/wire/tcp.rs

+ 4 - 4
src/socket/tcp.rs

@@ -71,8 +71,8 @@ impl<'a> Into<StreamBuffer<'a>> for Managed<'a, [u8]> {
 pub struct Stream<'a> {
     local_end:  IpEndpoint,
     remote_end: IpEndpoint,
-    local_seq:  u32,
-    remote_seq: u32,
+    local_seq:  i32,
+    remote_seq: i32,
     rx_buffer:  StreamBuffer<'a>,
     tx_buffer:  StreamBuffer<'a>
 }
@@ -144,8 +144,8 @@ impl<'a> PacketRepr for TcpRepr<'a> {
 pub struct Incoming {
     local_end:  IpEndpoint,
     remote_end: IpEndpoint,
-    local_seq:  u32,
-    remote_seq: u32
+    local_seq:  i32,
+    remote_seq: i32
 }
 
 impl Incoming {

+ 16 - 16
src/wire/tcp.rs

@@ -69,16 +69,16 @@ impl<T: AsRef<[u8]>> Packet<T> {
 
     /// Return the sequence number field.
     #[inline(always)]
-    pub fn seq_number(&self) -> u32 {
+    pub fn seq_number(&self) -> i32 {
         let data = self.buffer.as_ref();
-        NetworkEndian::read_u32(&data[field::SEQ_NUM])
+        NetworkEndian::read_i32(&data[field::SEQ_NUM])
     }
 
     /// Return the acknowledgement number field.
     #[inline(always)]
-    pub fn ack_number(&self) -> u32 {
+    pub fn ack_number(&self) -> i32 {
         let data = self.buffer.as_ref();
-        NetworkEndian::read_u32(&data[field::ACK_NUM])
+        NetworkEndian::read_i32(&data[field::ACK_NUM])
     }
 
     /// Return the FIN flag.
@@ -224,16 +224,16 @@ impl<T: AsRef<[u8]> + AsMut<[u8]>> Packet<T> {
 
     /// Set the sequence number field.
     #[inline(always)]
-    pub fn set_seq_number(&mut self, value: u32) {
+    pub fn set_seq_number(&mut self, value: i32) {
         let mut data = self.buffer.as_mut();
-        NetworkEndian::write_u32(&mut data[field::SEQ_NUM], value)
+        NetworkEndian::write_i32(&mut data[field::SEQ_NUM], value)
     }
 
     /// Set the acknowledgement number field.
     #[inline(always)]
-    pub fn set_ack_number(&mut self, value: u32) {
+    pub fn set_ack_number(&mut self, value: i32) {
         let mut data = self.buffer.as_mut();
-        NetworkEndian::write_u32(&mut data[field::ACK_NUM], value)
+        NetworkEndian::write_i32(&mut data[field::ACK_NUM], value)
     }
 
     /// Clear the entire flags field.
@@ -391,8 +391,8 @@ pub struct Repr<'a> {
     pub src_port:   u16,
     pub dst_port:   u16,
     pub control:    Control,
-    pub seq_number: u32,
-    pub ack_number: Option<u32>,
+    pub seq_number: i32,
+    pub ack_number: Option<i32>,
     pub window_len: u16,
     pub payload:    &'a [u8]
 }
@@ -488,9 +488,9 @@ impl<'a, T: AsRef<[u8]> + ?Sized> fmt::Display for Packet<&'a T> {
         if self.ece() { try!(write!(f, " ece")) }
         if self.cwr() { try!(write!(f, " cwr")) }
         if self.ns()  { try!(write!(f, " ns" )) }
-        try!(write!(f, " seq={}", self.seq_number()));
+        try!(write!(f, " seq={}", self.seq_number() as u32));
         if self.ack() {
-            try!(write!(f, " ack={}", self.ack_number()));
+            try!(write!(f, " ack={}", self.ack_number() as u32));
         }
         try!(write!(f, " win={}", self.window_len()));
         if self.urg() {
@@ -511,9 +511,9 @@ impl<'a> fmt::Display for Repr<'a> {
             Control::Rst => try!(write!(f, " rst")),
             Control::None => ()
         }
-        try!(write!(f, " seq={}", self.seq_number));
+        try!(write!(f, " seq={}", self.seq_number as u32));
         if let Some(ack_number) = self.ack_number {
-            try!(write!(f, " ack={}", ack_number));
+            try!(write!(f, " ack={}", ack_number as u32));
         }
         try!(write!(f, " win={}", self.window_len));
         try!(write!(f, " len={}", self.payload.len()));
@@ -558,7 +558,7 @@ mod test {
         assert_eq!(packet.src_port(), 48896);
         assert_eq!(packet.dst_port(), 80);
         assert_eq!(packet.seq_number(), 0x01234567);
-        assert_eq!(packet.ack_number(), 0x89abcdef);
+        assert_eq!(packet.ack_number(), 0x89abcdefu32 as i32);
         assert_eq!(packet.header_len(), 20);
         assert_eq!(packet.fin(), true);
         assert_eq!(packet.syn(), false);
@@ -580,7 +580,7 @@ mod test {
         packet.set_src_port(48896);
         packet.set_dst_port(80);
         packet.set_seq_number(0x01234567);
-        packet.set_ack_number(0x89abcdef);
+        packet.set_ack_number(0x89abcdefu32 as i32);
         packet.set_header_len(20);
         packet.set_fin(true);
         packet.set_syn(false);