Quellcode durchsuchen

Return interior pointers more uniformly.

whitequark vor 8 Jahren
Ursprung
Commit
04b546a3b8
4 geänderte Dateien mit 25 neuen und 19 gelöschten Zeilen
  1. 2 2
      src/iface/ethernet.rs
  2. 2 0
      src/wire/ethernet.rs
  3. 11 9
      src/wire/icmpv4.rs
  4. 10 8
      src/wire/ipv4.rs

+ 2 - 2
src/iface/ethernet.rs

@@ -169,8 +169,8 @@ impl<'a, DeviceT: Device, ArpCacheT: ArpCache> Interface<'a, DeviceT, ArpCacheT>
         if let Response::Nop = response { return Ok(()) }
 
         let tx_size = self.device.mtu();
-        let tx_buffer = try!(self.device.transmit(tx_size));
-        let mut frame = try!(EthernetFrame::new(tx_buffer));
+        let mut tx_buffer = try!(self.device.transmit(tx_size));
+        let mut frame = try!(EthernetFrame::new(&mut tx_buffer));
         frame.set_src_addr(self.hardware_addr);
 
         match response {

+ 2 - 0
src/wire/ethernet.rs

@@ -148,7 +148,9 @@ impl<T: AsRef<[u8]> + AsMut<[u8]>> Frame<T> {
         let data = self.buffer.as_mut();
         NetworkEndian::write_u16(&mut data[field::ETHERTYPE], value.into())
     }
+}
 
+impl<'a, T: AsRef<[u8]> + AsMut<[u8]> + ?Sized> Frame<&'a mut T> {
     /// Return a mutable pointer to the payload.
     #[inline(always)]
     pub fn payload_mut(&mut self) -> &mut [u8] {

+ 11 - 9
src/wire/icmpv4.rs

@@ -272,14 +272,6 @@ impl<T: AsRef<[u8]> + AsMut<[u8]>> Packet<T> {
         NetworkEndian::write_u16(&mut data[field::ECHO_SEQNO], value)
     }
 
-    /// Return a mutable pointer to the type-specific data.
-    #[inline(always)]
-    pub fn data_mut(&mut self) -> &mut [u8] {
-        let range = self.header_len()..;
-        let mut data = self.buffer.as_mut();
-        &mut data[range]
-    }
-
     /// Compute and fill in the header checksum.
     pub fn fill_checksum(&mut self) {
         self.set_checksum(0);
@@ -291,6 +283,16 @@ impl<T: AsRef<[u8]> + AsMut<[u8]>> Packet<T> {
     }
 }
 
+impl<'a, T: AsRef<[u8]> + AsMut<[u8]> + ?Sized> Packet<&'a mut T> {
+    /// Return a mutable pointer to the type-specific data.
+    #[inline(always)]
+    pub fn data_mut(&mut self) -> &mut [u8] {
+        let range = self.header_len()..;
+        let mut data = self.buffer.as_mut();
+        &mut data[range]
+    }
+}
+
 /// A high-level representation of an Internet Control Message Protocol version 4 packet header.
 #[derive(Debug, PartialEq, Eq, Clone, Copy)]
 pub enum Repr<'a> {
@@ -344,7 +346,7 @@ impl<'a> Repr<'a> {
     }
 
     /// Emit a high-level representation into an Internet Protocol version 4 packet.
-    pub fn emit<T: AsRef<[u8]> + AsMut<[u8]>>(&self, packet: &mut Packet<T>) {
+    pub fn emit<T: AsRef<[u8]> + AsMut<[u8]> + ?Sized>(&self, packet: &mut Packet<&mut T>) {
         packet.set_msg_code(0);
         match self {
             &Repr::EchoRequest { ident, seq_no, data } => {

+ 10 - 8
src/wire/ipv4.rs

@@ -329,14 +329,6 @@ impl<T: AsRef<[u8]> + AsMut<[u8]>> Packet<T> {
         data[field::DST_ADDR].copy_from_slice(value.as_bytes())
     }
 
-    /// Return a mutable pointer to the payload.
-    #[inline(always)]
-    pub fn payload_mut(&mut self) -> &mut [u8] {
-        let range = self.header_len() as usize..;
-        let data = self.buffer.as_mut();
-        &mut data[range]
-    }
-
     /// Compute and fill in the header checksum.
     pub fn fill_checksum(&mut self) {
         self.set_checksum(0);
@@ -348,6 +340,16 @@ impl<T: AsRef<[u8]> + AsMut<[u8]>> Packet<T> {
     }
 }
 
+impl<'a, T: AsRef<[u8]> + AsMut<[u8]> + ?Sized> Packet<&'a mut T> {
+    /// Return a mutable pointer to the payload.
+    #[inline(always)]
+    pub fn payload_mut(&mut self) -> &mut [u8] {
+        let range = self.header_len() as usize..;
+        let data = self.buffer.as_mut();
+        &mut data[range]
+    }
+}
+
 /// A high-level representation of an Internet Protocol version 4 packet header.
 #[derive(Debug, PartialEq, Eq, Clone, Copy)]
 pub struct Repr {