netlink_packet_xfrm/policy/modify/
message.rs1use core::mem::size_of;
4
5use netlink_packet_core::{DecodeError, Emitable, ErrorContext, Parseable};
6
7use crate::{
8 nlas::VecXfrmAttrs, UserPolicyInfo, UserPolicyInfoBuffer, XfrmAttrs,
9};
10
11#[derive(Debug, PartialEq, Eq, Clone, Default)]
12pub struct ModifyMessage {
13 pub user_policy_info: UserPolicyInfo,
14 pub nlas: Vec<XfrmAttrs>,
15}
16
17impl Emitable for ModifyMessage {
18 fn buffer_len(&self) -> usize {
19 self.user_policy_info.buffer_len() + self.nlas.as_slice().buffer_len()
20 }
21
22 fn emit(&self, buffer: &mut [u8]) {
23 self.user_policy_info.emit(buffer);
24 self.nlas
25 .as_slice()
26 .emit(&mut buffer[self.user_policy_info.buffer_len()..]);
27 }
28}
29
30impl Parseable<[u8]> for ModifyMessage {
31 fn parse(buf: &[u8]) -> Result<Self, DecodeError> {
32 let user_policy_info =
33 UserPolicyInfo::parse(&buf[..size_of::<UserPolicyInfoBuffer>()])
34 .context(
35 "failed to parse policy modify message user policy info",
36 )?;
37 Ok(Self {
38 user_policy_info,
39 nlas: VecXfrmAttrs::parse(
40 &buf[size_of::<UserPolicyInfoBuffer>()..],
41 )
42 .context("failed to parse policy modify message NLAs")?
43 .0,
44 })
45 }
46}