rtnetlink/traffic_control/
handle.rs

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