rtnetlink/link/
property_del.rs

1// SPDX-License-Identifier: MIT
2
3use futures::stream::StreamExt;
4use netlink_packet_core::{
5    NetlinkMessage, NetlinkPayload, NLM_F_ACK, NLM_F_EXCL, NLM_F_REQUEST,
6};
7use netlink_packet_route::{
8    link::nlas::{Nla, Prop},
9    LinkMessage, RtnlMessage,
10};
11
12use crate::{Error, Handle};
13
14pub struct LinkDelPropRequest {
15    handle: Handle,
16    message: LinkMessage,
17}
18
19impl LinkDelPropRequest {
20    pub(crate) fn new(handle: Handle, index: u32) -> Self {
21        let mut message = LinkMessage::default();
22        message.header.index = index;
23        LinkDelPropRequest { handle, message }
24    }
25
26    /// Execute the request
27    pub async fn execute(self) -> Result<(), Error> {
28        let LinkDelPropRequest {
29            mut handle,
30            message,
31        } = self;
32        let mut req = NetlinkMessage::from(RtnlMessage::DelLinkProp(message));
33        req.header.flags = NLM_F_REQUEST | NLM_F_ACK | NLM_F_EXCL;
34
35        let mut response = handle.request(req)?;
36        while let Some(message) = response.next().await {
37            if let NetlinkPayload::Error(err) = message.payload {
38                return Err(Error::NetlinkError(err));
39            }
40        }
41        Ok(())
42    }
43
44    /// Return a mutable reference to the request
45    pub fn message_mut(&mut self) -> &mut LinkMessage {
46        &mut self.message
47    }
48
49    /// Remove alternative name to the link. This is equivalent to `ip link
50    /// property del altname ALT_IFNAME dev LINK`.
51    pub fn alt_ifname(mut self, alt_ifnames: &[&str]) -> Self {
52        let mut props = Vec::new();
53        for alt_ifname in alt_ifnames {
54            props.push(Prop::AltIfName(alt_ifname.to_string()));
55        }
56
57        self.message.nlas.push(Nla::PropList(props));
58        self
59    }
60}