netlink_packet_route/tc/stats/
xstats.rs

1// SPDX-License-Identifier: MIT
2
3use netlink_packet_core::{
4    DecodeError, Emitable, NlaBuffer, Parseable, ParseableParametrized,
5};
6
7use crate::tc::{TcFqCodelXstats, TcQdiscFqCodel};
8
9#[derive(Debug, PartialEq, Eq, Clone)]
10#[non_exhaustive]
11pub enum TcXstats {
12    FqCodel(TcFqCodelXstats),
13    Other(Vec<u8>),
14}
15
16impl Emitable for TcXstats {
17    fn buffer_len(&self) -> usize {
18        match self {
19            Self::FqCodel(v) => v.buffer_len(),
20            Self::Other(v) => v.len(),
21        }
22    }
23
24    fn emit(&self, buffer: &mut [u8]) {
25        match self {
26            Self::FqCodel(v) => v.emit(buffer),
27            Self::Other(v) => buffer.copy_from_slice(v.as_slice()),
28        }
29    }
30}
31
32impl<'a, T> ParseableParametrized<NlaBuffer<&'a T>, &str> for TcXstats
33where
34    T: AsRef<[u8]> + ?Sized,
35{
36    fn parse_with_param(
37        buf: &NlaBuffer<&'a T>,
38        kind: &str,
39    ) -> Result<TcXstats, DecodeError> {
40        Ok(match kind {
41            TcQdiscFqCodel::KIND => {
42                TcXstats::FqCodel(TcFqCodelXstats::parse(buf.value())?)
43            }
44            _ => TcXstats::Other(buf.value().to_vec()),
45        })
46    }
47}