rtnetlink/link/
property_del.rs1use crate::{
4 packet::{
5 nlas::link::{Nla, Prop},
6 LinkMessage,
7 NetlinkMessage,
8 NetlinkPayload,
9 RtnlMessage,
10 NLM_F_ACK,
11 NLM_F_EXCL,
12 NLM_F_REQUEST,
13 },
14 Error,
15 Handle,
16};
17use futures::stream::StreamExt;
18
19pub struct LinkDelPropRequest {
20 handle: Handle,
21 message: LinkMessage,
22}
23
24impl LinkDelPropRequest {
25 pub(crate) fn new(handle: Handle, index: u32) -> Self {
26 let mut message = LinkMessage::default();
27 message.header.index = index;
28 LinkDelPropRequest { handle, message }
29 }
30
31 pub async fn execute(self) -> Result<(), Error> {
33 let LinkDelPropRequest {
34 mut handle,
35 message,
36 } = self;
37 let mut req = NetlinkMessage::from(RtnlMessage::DelLinkProp(message));
38 req.header.flags = NLM_F_REQUEST | NLM_F_ACK | NLM_F_EXCL;
39
40 let mut response = handle.request(req)?;
41 while let Some(message) = response.next().await {
42 if let NetlinkPayload::Error(err) = message.payload {
43 return Err(Error::NetlinkError(err));
44 }
45 }
46 Ok(())
47 }
48
49 pub fn message_mut(&mut self) -> &mut LinkMessage {
51 &mut self.message
52 }
53
54 pub fn alt_ifname(mut self, alt_ifnames: &[&str]) -> Self {
57 let mut props = Vec::new();
58 for alt_ifname in alt_ifnames {
59 props.push(Prop::AltIfName(alt_ifname.to_string()));
60 }
61
62 self.message.nlas.push(Nla::PropList(props));
63 self
64 }
65}