rtnetlink/traffic_control/
handle.rs

1// SPDX-License-Identifier: MIT
2
3use super::{
4    QDiscDelRequest,
5    QDiscGetRequest,
6    QDiscNewRequest,
7    TrafficChainGetRequest,
8    TrafficClassGetRequest,
9    TrafficFilterGetRequest,
10    TrafficFilterNewRequest,
11};
12
13use crate::{
14    packet::{TcMessage, NLM_F_CREATE, NLM_F_EXCL, NLM_F_REPLACE},
15    Handle,
16};
17
18pub struct QDiscHandle(Handle);
19
20impl QDiscHandle {
21    pub fn new(handle: Handle) -> Self {
22        QDiscHandle(handle)
23    }
24
25    /// Retrieve the list of qdisc (equivalent to `tc qdisc show`)
26    pub fn get(&mut self) -> QDiscGetRequest {
27        QDiscGetRequest::new(self.0.clone())
28    }
29
30    /// Create a new qdisc, don't replace if the object already exists.
31    /// ( equivalent to `tc qdisc add dev STRING`)
32    pub fn add(&mut self, index: i32) -> QDiscNewRequest {
33        let msg = TcMessage::with_index(index);
34        QDiscNewRequest::new(self.0.clone(), msg, NLM_F_EXCL | NLM_F_CREATE)
35    }
36
37    /// Change the qdisc, the handle cannot be changed and neither can the parent.
38    /// In other words, change cannot move a node.
39    /// ( equivalent to `tc qdisc change dev STRING`)
40    pub fn change(&mut self, index: i32) -> QDiscNewRequest {
41        let msg = TcMessage::with_index(index);
42        QDiscNewRequest::new(self.0.clone(), msg, 0)
43    }
44
45    /// Replace existing matching qdisc, create qdisc if it doesn't already exist.
46    /// ( equivalent to `tc qdisc replace dev STRING`)
47    pub fn replace(&mut self, index: i32) -> QDiscNewRequest {
48        let msg = TcMessage::with_index(index);
49        QDiscNewRequest::new(self.0.clone(), msg, NLM_F_CREATE | NLM_F_REPLACE)
50    }
51
52    /// Performs a replace where the node must exist already.
53    /// ( equivalent to `tc qdisc link dev STRING`)
54    pub fn link(&mut self, index: i32) -> QDiscNewRequest {
55        let msg = TcMessage::with_index(index);
56        QDiscNewRequest::new(self.0.clone(), msg, NLM_F_REPLACE)
57    }
58
59    /// Delete the qdisc ( equivalent to `tc qdisc del dev STRING`)
60    pub fn del(&mut self, index: i32) -> QDiscDelRequest {
61        let msg = TcMessage::with_index(index);
62        QDiscDelRequest::new(self.0.clone(), msg)
63    }
64}
65
66pub struct TrafficClassHandle {
67    handle: Handle,
68    ifindex: i32,
69}
70
71impl TrafficClassHandle {
72    pub fn new(handle: Handle, ifindex: i32) -> Self {
73        TrafficClassHandle { handle, ifindex }
74    }
75
76    /// Retrieve the list of traffic class (equivalent to
77    /// `tc class show dev <interface_name>`)
78    pub fn get(&mut self) -> TrafficClassGetRequest {
79        TrafficClassGetRequest::new(self.handle.clone(), self.ifindex)
80    }
81}
82
83pub struct TrafficFilterHandle {
84    handle: Handle,
85    ifindex: i32,
86}
87
88impl TrafficFilterHandle {
89    pub fn new(handle: Handle, ifindex: i32) -> Self {
90        TrafficFilterHandle { handle, ifindex }
91    }
92
93    /// Retrieve the list of filter (equivalent to
94    /// `tc filter show dev <iface_name>`)
95    pub fn get(&mut self) -> TrafficFilterGetRequest {
96        TrafficFilterGetRequest::new(self.handle.clone(), self.ifindex)
97    }
98
99    /// Add a filter to a node, don't replace if the object already exists.
100    /// ( equivalent to `tc filter add dev STRING`)
101    pub fn add(&mut self) -> TrafficFilterNewRequest {
102        TrafficFilterNewRequest::new(self.handle.clone(), self.ifindex, NLM_F_EXCL | NLM_F_CREATE)
103    }
104
105    /// Change the filter, the handle cannot be changed and neither can the parent.
106    /// In other words, change cannot move a node.
107    /// ( equivalent to `tc filter change dev STRING`)
108    pub fn change(&mut self) -> TrafficFilterNewRequest {
109        TrafficFilterNewRequest::new(self.handle.clone(), self.ifindex, 0)
110    }
111
112    /// Replace existing matching filter, create filter if it doesn't already exist.
113    /// ( equivalent to `tc filter replace dev STRING`)
114    pub fn replace(&mut self) -> TrafficFilterNewRequest {
115        TrafficFilterNewRequest::new(self.handle.clone(), self.ifindex, NLM_F_CREATE)
116    }
117}
118
119pub struct TrafficChainHandle {
120    handle: Handle,
121    ifindex: i32,
122}
123
124impl TrafficChainHandle {
125    pub fn new(handle: Handle, ifindex: i32) -> Self {
126        TrafficChainHandle { handle, ifindex }
127    }
128
129    /// Retrieve the list of chain (equivalent to
130    /// `tc chain show dev <iface_name>`)
131    pub fn get(&mut self) -> TrafficChainGetRequest {
132        TrafficChainGetRequest::new(self.handle.clone(), self.ifindex)
133    }
134}