netlink_packet_route/tc/stats/
xstats.rs1use 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}