rtnetlink/link/
property_del.rs

1// SPDX-License-Identifier: MIT
2
3use 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    /// Execute the request
32    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    /// Return a mutable reference to the request
50    pub fn message_mut(&mut self) -> &mut LinkMessage {
51        &mut self.message
52    }
53
54    /// Remove alternative name to the link. This is equivalent to `ip link property del altname
55    /// ALT_IFNAME dev LINK`.
56    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}