netlink_tc/
types.rs

1use serde::{Deserialize, Serialize};
2
3use crate::{errors::TcError, Clsact, FqCodel, FqCodelXStats, Htb, HtbGlob, HtbXstats};
4
5/// This struct is an intermediate representation for netlink `tc` messages.
6/// Any downstream structs should be constructed into this struct.
7#[derive(Debug, Default, PartialEq)]
8pub struct TcMsg {
9    pub header: TcHeader,
10    pub attrs: Vec<TcAttr>,
11}
12
13#[derive(Debug, Default, PartialEq)]
14pub struct TcHeader {
15    pub index: i32,
16    pub handle: u32,
17    pub parent: u32,
18}
19
20#[derive(Debug, PartialEq)]
21pub enum TcAttr {
22    Unspec(Vec<u8>),
23    Kind(String),
24    Options(Vec<TcOption>),
25    Stats(Vec<u8>),
26    Xstats(Vec<u8>),
27    Rate(Vec<u8>),
28    Fcnt(Vec<u8>),
29    Stats2(Vec<TcStats2>),
30    Stab(Vec<u8>),
31    Pad(Vec<u8>),
32    Chain(Vec<u8>),
33    HwOffload(u8),
34}
35
36#[derive(Clone, Debug, Default, PartialEq)]
37pub struct TcOption {
38    pub kind: u16,
39    pub bytes: Vec<u8>,
40}
41
42#[derive(Debug, PartialEq)]
43pub enum TcStats2 {
44    StatsBasic(Vec<u8>),
45    StatsQueue(Vec<u8>),
46    StatsApp(Vec<u8>),
47}
48
49/// This struct is an intermediate representation for netlink `link` messages.
50/// Any downstream structs should be constructed into this struct.
51#[derive(Debug)]
52pub struct LinkMsg {
53    pub header: LinkHeader,
54    pub attr: LinkAttr,
55}
56
57#[derive(Debug)]
58pub struct LinkHeader {
59    pub index: u32,
60}
61
62#[derive(Debug)]
63pub struct LinkAttr {
64    pub name: String,
65}
66
67#[derive(Debug, Default)]
68pub struct Tc {
69    pub msg: TcMessage,
70    pub attr: Attribute,
71}
72
73#[derive(Debug, Default)]
74pub struct TcMessage {
75    pub index: u32,
76    pub handle: u32,
77    pub parent: u32,
78}
79
80#[derive(Debug, Default)]
81pub struct Attribute {
82    pub kind: String,
83    pub stats: Option<Stats>,
84    pub stats2: Option<Stats2>,
85    pub qdisc: Option<QDisc>,
86    pub class: Option<Class>,
87    pub xstats: Option<XStats>,
88}
89
90#[derive(Debug, Default, Serialize, Deserialize)]
91pub struct Stats {
92    pub bytes: u64,
93    pub packets: u32,
94    pub drops: u32,
95    pub overlimits: u32,
96    pub bps: u32,
97    pub pps: u32,
98    pub qlen: u32,
99    pub backlog: u32,
100}
101
102#[derive(Debug, Default, Serialize, Deserialize)]
103pub struct StatsBasic {
104    pub bytes: u64,
105    pub packets: u32,
106}
107
108#[derive(Debug, Default, Serialize, Deserialize)]
109pub struct StatsQueue {
110    pub qlen: u32,
111    pub backlog: u32,
112    pub drops: u32,
113    pub requeues: u32,
114    pub overlimits: u32,
115}
116
117#[derive(Debug, Default)]
118pub struct Stats2 {
119    pub basic: Option<StatsBasic>,
120    pub queue: Option<StatsQueue>,
121    // pub app: Option<StatsApp>,
122}
123
124#[derive(Debug, PartialEq)]
125pub enum QDisc {
126    FqCodel(FqCodel),
127    Clsact(Clsact),
128    Htb(HtbGlob),
129}
130
131#[derive(Debug, PartialEq)]
132pub enum Class {
133    Htb(Htb),
134}
135
136#[derive(Debug, PartialEq)]
137pub enum XStats {
138    FqCodel(FqCodelXStats),
139    Htb(HtbXstats),
140}
141
142/// Defined in `include/uapi/linux/pkt_sched.h` as `struct tc_ratespec`
143#[derive(Default, Debug, Serialize, Deserialize, PartialEq)]
144pub struct RateSpec {
145    pub cell_log: u8,
146    pub linklayer: u8,
147    pub overhead: u16,
148    pub cell_align: u16,
149    pub mpu: u16,
150    pub rate: u32,
151}
152
153pub fn unmarshal_rate_spec(buf: &[u8]) -> Result<RateSpec, TcError> {
154    bincode::deserialize(buf).map_err(TcError::UnmarshalStruct)
155}
156
157/// A subset of structs defined in `include/uapi/linux/if_link.h`.
158#[derive(Debug)]
159pub struct Link {
160    pub index: u32,
161    pub name: String,
162}