Skip to content

Commit 51cfceb

Browse files
Ashoncathay4t
authored andcommitted
Impl tc filter del command
1 parent c32046b commit 51cfceb

File tree

3 files changed

+90
-1
lines changed

3 files changed

+90
-1
lines changed

src/traffic_control/del_filter.rs

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
// SPDX-License-Identifier: MIT
2+
3+
use futures::stream::StreamExt;
4+
use netlink_packet_core::{NetlinkMessage, NLM_F_ACK, NLM_F_REQUEST};
5+
use netlink_packet_route::{
6+
tc::{TcHandle, TcMessage},
7+
RouteNetlinkMessage,
8+
};
9+
10+
use crate::{try_nl, Error, Handle};
11+
12+
#[derive(Debug, Clone)]
13+
pub struct TrafficFilterDelRequest {
14+
handle: Handle,
15+
message: TcMessage,
16+
flags: u16,
17+
}
18+
19+
impl TrafficFilterDelRequest {
20+
pub(crate) fn new(handle: Handle, ifindex: i32) -> Self {
21+
Self {
22+
handle,
23+
message: TcMessage::with_index(ifindex),
24+
flags: NLM_F_REQUEST | NLM_F_ACK,
25+
}
26+
}
27+
28+
/// Execute the request
29+
pub async fn execute(self) -> Result<(), Error> {
30+
let Self {
31+
mut handle,
32+
message,
33+
flags,
34+
} = self;
35+
36+
let mut req = NetlinkMessage::from(
37+
RouteNetlinkMessage::DelTrafficFilter(message),
38+
);
39+
req.header.flags = flags;
40+
41+
let mut response = handle.request(req)?;
42+
if let Some(message) = response.next().await {
43+
try_nl!(message);
44+
}
45+
46+
Ok(())
47+
}
48+
49+
/// Set parent.
50+
/// Equivalent to `[ root | ingress | egress | parent CLASSID ]`
51+
/// command args. They are mutually exclusive.
52+
pub fn parent(mut self, parent: u32) -> Self {
53+
self.message.header.parent = parent.into();
54+
self
55+
}
56+
57+
/// Set parent to root.
58+
pub fn root(mut self) -> Self {
59+
self.message.header.parent = TcHandle::ROOT;
60+
self
61+
}
62+
63+
/// Set parent to ingress.
64+
pub fn ingress(mut self) -> Self {
65+
self.message.header.parent = TcHandle {
66+
major: 0xffff,
67+
minor: TcHandle::MIN_INGRESS,
68+
};
69+
self
70+
}
71+
72+
/// Set parent to egress.
73+
pub fn egress(mut self) -> Self {
74+
self.message.header.parent = TcHandle {
75+
major: 0xffff,
76+
minor: TcHandle::MIN_EGRESS,
77+
};
78+
self
79+
}
80+
}

src/traffic_control/handle.rs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22

33
use super::{
44
QDiscDelRequest, QDiscGetRequest, QDiscNewRequest, TrafficChainGetRequest,
5-
TrafficClassGetRequest, TrafficFilterGetRequest, TrafficFilterNewRequest,
5+
TrafficClassGetRequest, TrafficFilterDelRequest, TrafficFilterGetRequest,
6+
TrafficFilterNewRequest,
67
};
78

89
use crate::Handle;
@@ -103,6 +104,12 @@ impl TrafficFilterHandle {
103104
)
104105
}
105106

107+
/// Delete a filter from a node, don't replace if the object already exists.
108+
/// ( equivalent to `tc filter del dev STRING`)
109+
pub fn del(&mut self) -> TrafficFilterDelRequest {
110+
TrafficFilterDelRequest::new(self.handle.clone(), self.ifindex)
111+
}
112+
106113
/// Change the filter, the handle cannot be changed and neither can the
107114
/// parent. In other words, change cannot move a node.
108115
/// ( equivalent to `tc filter change dev STRING`)

src/traffic_control/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
mod add_filter;
44
mod add_qdisc;
5+
mod del_filter;
56
mod del_qdisc;
67
mod get;
78
mod handle;
@@ -10,6 +11,7 @@ mod test;
1011

1112
pub use self::add_filter::TrafficFilterNewRequest;
1213
pub use self::add_qdisc::QDiscNewRequest;
14+
pub use self::del_filter::TrafficFilterDelRequest;
1315
pub use self::del_qdisc::QDiscDelRequest;
1416
pub use self::get::{
1517
QDiscGetRequest, TrafficChainGetRequest, TrafficClassGetRequest,

0 commit comments

Comments
 (0)