netlink_packet_route/link/af_spec/
inet6_icmp.rs

1// SPDX-License-Identifier: MIT
2
3use netlink_packet_utils::traits::{Emitable, Parseable};
4use netlink_packet_utils::DecodeError;
5
6pub(crate) const ICMP6_STATS_LEN: usize = 48;
7
8#[derive(Clone, Copy, Eq, PartialEq, Debug, Default)]
9#[non_exhaustive]
10pub struct Icmp6Stats {
11    pub num: i64,
12    pub in_msgs: i64,
13    pub in_errors: i64,
14    pub out_msgs: i64,
15    pub out_errors: i64,
16    pub csum_errors: i64,
17}
18
19buffer!(Icmp6StatsBuffer(ICMP6_STATS_LEN) {
20    num: (i64, 0..8),
21    in_msgs: (i64, 8..16),
22    in_errors: (i64, 16..24),
23    out_msgs: (i64, 24..32),
24    out_errors: (i64, 32..40),
25    csum_errors: (i64, 40..48),
26});
27
28impl<T: AsRef<[u8]>> Parseable<Icmp6StatsBuffer<T>> for Icmp6Stats {
29    type Error = DecodeError;
30    fn parse(buf: &Icmp6StatsBuffer<T>) -> Result<Self, DecodeError> {
31        Ok(Self {
32            num: buf.num(),
33            in_msgs: buf.in_msgs(),
34            in_errors: buf.in_errors(),
35            out_msgs: buf.out_msgs(),
36            out_errors: buf.out_errors(),
37            csum_errors: buf.csum_errors(),
38        })
39    }
40}
41
42impl Emitable for Icmp6Stats {
43    fn buffer_len(&self) -> usize {
44        ICMP6_STATS_LEN
45    }
46
47    fn emit(&self, buffer: &mut [u8]) {
48        let mut buffer = Icmp6StatsBuffer::new(buffer);
49        buffer.set_num(self.num);
50        buffer.set_in_msgs(self.in_msgs);
51        buffer.set_in_errors(self.in_errors);
52        buffer.set_out_msgs(self.out_msgs);
53        buffer.set_out_errors(self.out_errors);
54        buffer.set_csum_errors(self.csum_errors);
55    }
56}