rtnetlink/link/
property_add.rs1use 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 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 pub fn message_mut(&mut self) -> &mut LinkMessage {
53 &mut self.message
54 }
55
56 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}