rtnetlink/link/
property_add.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_APPEND,
12        NLM_F_CREATE,
13        NLM_F_EXCL,
14        NLM_F_REQUEST,
15    },
16    Error,
17    Handle,
18};
19use futures::stream::StreamExt;
20
21pub struct LinkNewPropRequest {
22    handle: Handle,
23    message: LinkMessage,
24}
25
26impl LinkNewPropRequest {
27    pub(crate) fn new(handle: Handle, index: u32) -> Self {
28        let mut message = LinkMessage::default();
29        message.header.index = index;
30        LinkNewPropRequest { handle, message }
31    }
32
33    /// Execute the request
34    pub async fn execute(self) -> Result<(), Error> {
35        let LinkNewPropRequest {
36            mut handle,
37            message,
38        } = self;
39        let mut req = NetlinkMessage::from(RtnlMessage::NewLinkProp(message));
40        req.header.flags = NLM_F_REQUEST | NLM_F_ACK | NLM_F_EXCL | NLM_F_CREATE | NLM_F_APPEND;
41
42        let mut response = handle.request(req)?;
43        while let Some(message) = response.next().await {
44            if let NetlinkPayload::Error(err) = message.payload {
45                return Err(Error::NetlinkError(err));
46            }
47        }
48        Ok(())
49    }
50
51    /// Return a mutable reference to the request
52    pub fn message_mut(&mut self) -> &mut LinkMessage {
53        &mut self.message
54    }
55
56    /// Add alternative name to the link. This is equivalent to `ip link property add altname
57    /// ALT_IFNAME dev LINK`.
58    pub fn alt_ifname(mut self, alt_ifnames: &[&str]) -> Self {
59        let mut props = Vec::new();
60        for alt_ifname in alt_ifnames {
61            props.push(Prop::AltIfName(alt_ifname.to_string()));
62        }
63
64        self.message.nlas.push(Nla::PropList(props));
65        self
66    }
67}