Browse Source

Merge pull request #1003 from ProfFan/fan/add_send_recv_queue

Add `send_queue`/`recv_queue` to UDP/ICMP/Raw Socket
Dario Nieuwenhuis 5 months ago
parent
commit
b8fb01cede
4 changed files with 41 additions and 0 deletions
  1. 10 0
      src/socket/icmp.rs
  2. 10 0
      src/socket/raw.rs
  3. 16 0
      src/socket/udp.rs
  4. 5 0
      src/storage/packet_buffer.rs

+ 10 - 0
src/socket/icmp.rs

@@ -412,6 +412,16 @@ impl<'a> Socket<'a> {
         Ok((length, endpoint))
     }
 
+    /// Return the amount of octets queued in the transmit buffer.
+    pub fn send_queue(&self) -> usize {
+        self.tx_buffer.payload_bytes_count()
+    }
+
+    /// Return the amount of octets queued in the receive buffer.
+    pub fn recv_queue(&self) -> usize {
+        self.rx_buffer.payload_bytes_count()
+    }
+
     /// Fitler determining whether the socket accepts a given ICMPv4 packet.
     /// Accepted packets are enqueued into the socket's receive buffer.
     #[cfg(feature = "proto-ipv4")]

+ 10 - 0
src/socket/raw.rs

@@ -327,6 +327,16 @@ impl<'a> Socket<'a> {
         Ok(length)
     }
 
+    /// Return the amount of octets queued in the transmit buffer.
+    pub fn send_queue(&self) -> usize {
+        self.tx_buffer.payload_bytes_count()
+    }
+
+    /// Return the amount of octets queued in the receive buffer.
+    pub fn recv_queue(&self) -> usize {
+        self.rx_buffer.payload_bytes_count()
+    }
+
     pub(crate) fn accepts(&self, ip_repr: &IpRepr) -> bool {
         if ip_repr.version() != self.ip_version {
             return false;

+ 16 - 0
src/socket/udp.rs

@@ -459,6 +459,22 @@ impl<'a> Socket<'a> {
         Ok((length, endpoint))
     }
 
+    /// Return the amount of octets queued in the transmit buffer.
+    ///
+    /// Note that the Berkeley sockets interface does not have an equivalent of this API.
+    pub fn send_queue(&self) -> usize {
+        self.tx_buffer.payload_bytes_count()
+    }
+
+    /// Return the amount of octets queued in the receive buffer. This value can be larger than
+    /// the slice read by the next `recv` or `peek` call because it includes all queued octets,
+    /// and not only the octets that may be returned as a contiguous slice.
+    ///
+    /// Note that the Berkeley sockets interface does not have an equivalent of this API.
+    pub fn recv_queue(&self) -> usize {
+        self.rx_buffer.payload_bytes_count()
+    }
+
     pub(crate) fn accepts(&self, cx: &mut Context, ip_repr: &IpRepr, repr: &UdpRepr) -> bool {
         if self.endpoint.port != repr.dst_port {
             return false;

+ 5 - 0
src/storage/packet_buffer.rs

@@ -239,6 +239,11 @@ impl<'a, H> PacketBuffer<'a, H> {
         self.payload_ring.capacity()
     }
 
+    /// Return the current number of bytes in the payload ring buffer.
+    pub fn payload_bytes_count(&self) -> usize {
+        self.payload_ring.len()
+    }
+
     /// Reset the packet buffer and clear any staged.
     #[allow(unused)]
     pub(crate) fn reset(&mut self) {