1use futures::stream::StreamExt;
4use netlink_packet_core::{
5 NetlinkMessage, NLM_F_ACK, NLM_F_CREATE, NLM_F_EXCL, NLM_F_REPLACE,
6 NLM_F_REQUEST,
7};
8use netlink_packet_route::{link::LinkMessage, RouteNetlinkMessage};
9
10use crate::{try_nl, Error, Handle};
11
12pub struct LinkAddRequest {
19 handle: Handle,
20 message: LinkMessage,
21 flags: u16,
22}
23
24impl LinkAddRequest {
25 pub(crate) fn new(handle: Handle, message: LinkMessage) -> Self {
26 LinkAddRequest {
27 handle,
28 message,
29 flags: NLM_F_REQUEST | NLM_F_ACK | NLM_F_CREATE | NLM_F_EXCL,
30 }
31 }
32
33 pub fn replace(self) -> Self {
35 let mut ret = self;
36 ret.flags -= NLM_F_EXCL;
37 ret.flags |= NLM_F_REPLACE;
38 ret
39 }
40
41 pub fn set_flags(self, flags: u16) -> Self {
43 let mut ret = self;
44 ret.flags = flags;
45 ret
46 }
47
48 pub async fn execute(self) -> Result<(), Error> {
50 let LinkAddRequest {
51 mut handle,
52 message,
53 flags,
54 } = self;
55 let mut req =
56 NetlinkMessage::from(RouteNetlinkMessage::NewLink(message));
57 req.header.flags = flags;
58
59 let mut response = handle.request(req)?;
60 while let Some(message) = response.next().await {
61 try_nl!(message);
62 }
63 Ok(())
64 }
65}