use futures::stream::StreamExt;
use crate::{try_nl, Error, Handle};
use netlink_packet_core::{NetlinkMessage, NLM_F_ACK, NLM_F_REQUEST};
use netlink_packet_xfrm::{policy::FlushMessage, UserPolicyType, XfrmAttrs, XfrmMessage};
#[non_exhaustive]
pub struct PolicyFlushRequest {
handle: Handle,
message: FlushMessage,
}
impl PolicyFlushRequest {
pub(crate) fn new(handle: Handle) -> Self {
let message = FlushMessage::default();
PolicyFlushRequest { handle, message }
}
pub fn ptype(mut self, ptype: u8) -> Self {
self.message
.nlas
.push(XfrmAttrs::PolicyType(UserPolicyType {
ptype,
..Default::default()
}));
self
}
pub async fn execute(self) -> Result<(), Error> {
let PolicyFlushRequest {
mut handle,
message,
} = self;
let mut req = NetlinkMessage::from(XfrmMessage::FlushPolicy(message));
req.header.flags = NLM_F_REQUEST | NLM_F_ACK;
let mut response = handle.request(req)?;
while let Some(message) = response.next().await {
try_nl!(message);
}
Ok(())
}
pub fn execute_noack(self) -> Result<(), Error> {
let PolicyFlushRequest {
mut handle,
message,
} = self;
let mut req = NetlinkMessage::from(XfrmMessage::FlushPolicy(message));
req.header.flags = NLM_F_REQUEST;
let mut _response = handle.request(req)?;
Ok(())
}
pub fn message_mut(&mut self) -> &mut FlushMessage {
&mut self.message
}
}