1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
// SPDX-License-Identifier: MIT

use anyhow::Context;

use core::ops::Range;

use crate::{UserPolicyInfo, UserPolicyInfoBuffer, XFRM_USER_POLICY_INFO_LEN};

use netlink_packet_utils::{buffer, traits::*, DecodeError};

#[derive(Debug, Clone, Copy, Eq, PartialEq, Default)]
pub struct UserPolicyExpire {
    pub pol: UserPolicyInfo,
    pub hard: u8,
}

const POL_FIELD: Range<usize> = 0..XFRM_USER_POLICY_INFO_LEN;
const HARD_FIELD: usize = POL_FIELD.end;

pub const XFRM_USER_POLICY_EXPIRE_LEN: usize =
    (XFRM_USER_POLICY_INFO_LEN + 1 + 7) & !7; // 176

buffer!(UserPolicyExpireBuffer(XFRM_USER_POLICY_EXPIRE_LEN) {
    pol: (slice, POL_FIELD),
    hard: (u8, HARD_FIELD)
});

impl<T: AsRef<[u8]> + ?Sized> Parseable<UserPolicyExpireBuffer<&T>>
    for UserPolicyExpire
{
    fn parse(buf: &UserPolicyExpireBuffer<&T>) -> Result<Self, DecodeError> {
        let pol = UserPolicyInfo::parse(&UserPolicyInfoBuffer::new(&buf.pol()))
            .context("failed to parse user policy info")?;
        Ok(UserPolicyExpire {
            pol,
            hard: buf.hard(),
        })
    }
}

impl Emitable for UserPolicyExpire {
    fn buffer_len(&self) -> usize {
        XFRM_USER_POLICY_EXPIRE_LEN
    }

    fn emit(&self, buffer: &mut [u8]) {
        let mut buffer = UserPolicyExpireBuffer::new(buffer);
        self.pol.emit(buffer.pol_mut());
        buffer.set_hard(self.hard);
    }
}