netlink_packet_route/tc/stats/
queue.rs

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