Skip to main content

netlink_packet_xfrm/state/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::{nlas::VecXfrmAttrs, UserSaInfo, UserSaInfoBuffer, XfrmAttrs};
8
9#[derive(Debug, PartialEq, Eq, Clone, Default)]
10pub struct ModifyMessage {
11    pub user_sa_info: UserSaInfo,
12    pub nlas: Vec<XfrmAttrs>,
13}
14
15impl Emitable for ModifyMessage {
16    fn buffer_len(&self) -> usize {
17        self.user_sa_info.buffer_len() + self.nlas.as_slice().buffer_len()
18    }
19
20    fn emit(&self, buffer: &mut [u8]) {
21        self.user_sa_info.emit(buffer);
22        self.nlas
23            .as_slice()
24            .emit(&mut buffer[self.user_sa_info.buffer_len()..]);
25    }
26}
27
28impl Parseable<[u8]> for ModifyMessage {
29    fn parse(buf: &[u8]) -> Result<Self, DecodeError> {
30        let user_sa_info =
31            UserSaInfo::parse(&buf[..size_of::<UserSaInfoBuffer>()])
32                .context("failed to parse state modify message user sa info")?;
33        Ok(Self {
34            user_sa_info,
35            nlas: VecXfrmAttrs::parse(&buf[size_of::<UserSaInfoBuffer>()..])
36                .context("failed to parse state modify message NLAs")?
37                .0,
38        })
39    }
40}