netlink_packet_route/tc/stats/
queue.rs

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