1use serde::{Deserialize, Serialize};
2
3use crate::{errors::TcError, Clsact, FqCodel, FqCodelXStats, Htb, HtbGlob, HtbXstats};
4
5#[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#[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 }
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#[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#[derive(Debug)]
159pub struct Link {
160 pub index: u32,
161 pub name: String,
162}