netlink_packet_route/rtnl/tc/nlas/
stats_queue.rs

1// SPDX-License-Identifier: MIT
2
3use crate::{
4    traits::{Emitable, Parseable},
5    DecodeError,
6};
7
8/// Queuing statistics
9#[derive(Debug, PartialEq, Eq, Clone, Copy)]
10pub struct StatsQueue {
11    /// queue length
12    pub qlen: u32,
13    /// backlog size of queue
14    pub backlog: u32,
15    /// number of dropped packets
16    pub drops: u32,
17    /// number of requeues
18    pub requeues: u32,
19    /// number of enqueues over the limit
20    pub overlimits: u32,
21}
22
23pub const STATS_QUEUE_LEN: usize = 20;
24
25buffer!(StatsQueueBuffer( STATS_QUEUE_LEN) {
26    qlen: (u32, 0..4),
27    backlog: (u32, 4..8),
28    drops: (u32, 8..12),
29    requeues: (u32, 12..16),
30    overlimits: (u32, 16..20),
31});
32
33impl<T: AsRef<[u8]>> Parseable<StatsQueueBuffer<T>> for StatsQueue {
34    fn parse(buf: &StatsQueueBuffer<T>) -> Result<Self, DecodeError> {
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 StatsQueue {
46    fn buffer_len(&self) -> usize {
47        STATS_QUEUE_LEN
48    }
49
50    fn emit(&self, buffer: &mut [u8]) {
51        let mut buffer = StatsQueueBuffer::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}