Skip to main content

netlink_packet_xfrm/policy/modify/
message.rs

1// SPDX-License-Identifier: MIT
2
3use 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}