netlink_packet_xfrm/state/modify/
message.rs1use 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}