netlink_packet_route/tc/stats/
queue.rs

1// SPDX-License-Identifier: MIT
2
3use netlink_packet_core::{DecodeError, Emitable, Parseable};
4
5/// Queuing statistics
6#[derive(Default, Debug, PartialEq, Eq, Clone, Copy)]
7#[non_exhaustive]
8pub struct TcStatsQueue {
9    /// queue length
10    pub qlen: u32,
11    /// backlog size of queue
12    pub backlog: u32,
13    /// number of dropped packets
14    pub drops: u32,
15    /// number of requeues
16    pub requeues: u32,
17    /// number of enqueues over the limit
18    pub overlimits: u32,
19}
20
21const STATS_QUEUE_LEN: usize = 20;
22
23buffer!(TcStatsQueueBuffer( STATS_QUEUE_LEN) {
24    qlen: (u32, 0..4),
25    backlog: (u32, 4..8),
26    drops: (u32, 8..12),
27    requeues: (u32, 12..16),
28    overlimits: (u32, 16..20),
29});
30
31impl<T: AsRef<[u8]>> Parseable<TcStatsQueueBuffer<T>> for TcStatsQueue {
32    fn parse(buf: &TcStatsQueueBuffer<T>) -> Result<Self, DecodeError> {
33        Ok(Self {
34            qlen: buf.qlen(),
35            backlog: buf.backlog(),
36            drops: buf.drops(),
37            requeues: buf.requeues(),
38            overlimits: buf.overlimits(),
39        })
40    }
41}
42
43impl Emitable for TcStatsQueue {
44    fn buffer_len(&self) -> usize {
45        STATS_QUEUE_LEN
46    }
47
48    fn emit(&self, buffer: &mut [u8]) {
49        let mut buffer = TcStatsQueueBuffer::new(buffer);
50        buffer.set_qlen(self.qlen);
51        buffer.set_backlog(self.backlog);
52        buffer.set_drops(self.drops);
53        buffer.set_requeues(self.requeues);
54        buffer.set_overlimits(self.overlimits);
55    }
56}