1use netlink_packet_core::{DecodeError, Emitable, Parseable};
4
5pub(crate) const INET6_STATS_LEN: usize = 304;
6
7buffer!(Inet6StatsBuffer(INET6_STATS_LEN) {
8 num: (i64, 0..8),
9 in_pkts: (i64, 8..16),
10 in_octets: (i64, 16..24),
11 in_delivers: (i64, 24..32),
12 out_forw_datagrams: (i64, 32..40),
13 out_requests: (i64, 40..48),
14 out_octets: (i64, 48..56),
15 in_hdr_errors: (i64, 56..64),
16 in_too_big_errors: (i64, 64..72),
17 in_no_routes: (i64, 72..80),
18 in_addr_errors: (i64, 80..88),
19 in_unknown_protos: (i64, 88..96),
20 in_truncated_pkts: (i64, 96..104),
21 in_discards: (i64, 104..112),
22 out_discards: (i64, 112..120),
23 out_no_routes: (i64, 120..128),
24 reasm_timeout: (i64, 128..136),
25 reasm_reqds: (i64, 136..144),
26 reasm_oks: (i64, 144..152),
27 reasm_fails: (i64, 152..160),
28 frag_oks: (i64, 160..168),
29 frag_fails: (i64, 168..176),
30 frag_creates: (i64, 176..184),
31 in_mcast_pkts: (i64, 184..192),
32 out_mcast_pkts: (i64, 192..200),
33 in_bcast_pkts: (i64, 200..208),
34 out_bcast_pkts: (i64, 208..216),
35 in_mcast_octets: (i64, 216..224),
36 out_mcast_octets: (i64, 224..232),
37 in_bcast_octets: (i64, 232..240),
38 out_bcast_octets: (i64, 240..248),
39 in_csum_errors: (i64, 248..256),
40 in_no_ect_pkts: (i64, 256..264),
41 in_ect1_pkts: (i64, 264..272),
42 in_ect0_pkts: (i64, 272..280),
43 in_ce_pkts: (i64, 280..288),
44 reasm_overlaps: (i64, 288..296),
45 out_pkts: (i64, 296..304),
46});
47
48#[derive(Clone, Copy, Eq, PartialEq, Debug, Default)]
49#[non_exhaustive]
50pub struct Inet6Stats {
51 pub num: i64,
52 pub in_pkts: i64,
53 pub in_octets: i64,
54 pub in_delivers: i64,
55 pub out_forw_datagrams: i64,
56 pub out_requests: i64,
57 pub out_octets: i64,
58 pub in_hdr_errors: i64,
59 pub in_too_big_errors: i64,
60 pub in_no_routes: i64,
61 pub in_addr_errors: i64,
62 pub in_unknown_protos: i64,
63 pub in_truncated_pkts: i64,
64 pub in_discards: i64,
65 pub out_discards: i64,
66 pub out_no_routes: i64,
67 pub reasm_timeout: i64,
68 pub reasm_reqds: i64,
69 pub reasm_oks: i64,
70 pub reasm_fails: i64,
71 pub frag_oks: i64,
72 pub frag_fails: i64,
73 pub frag_creates: i64,
74 pub in_mcast_pkts: i64,
75 pub out_mcast_pkts: i64,
76 pub in_bcast_pkts: i64,
77 pub out_bcast_pkts: i64,
78 pub in_mcast_octets: i64,
79 pub out_mcast_octets: i64,
80 pub in_bcast_octets: i64,
81 pub out_bcast_octets: i64,
82 pub in_csum_errors: i64,
83 pub in_no_ect_pkts: i64,
84 pub in_ect1_pkts: i64,
85 pub in_ect0_pkts: i64,
86 pub in_ce_pkts: i64,
87 pub reasm_overlaps: i64,
88 pub out_pkts: i64,
89}
90
91impl<T: AsRef<[u8]>> Parseable<Inet6StatsBuffer<T>> for Inet6Stats {
92 fn parse(buf: &Inet6StatsBuffer<T>) -> Result<Self, DecodeError> {
93 Ok(Self {
94 num: buf.num(),
95 in_pkts: buf.in_pkts(),
96 in_octets: buf.in_octets(),
97 in_delivers: buf.in_delivers(),
98 out_forw_datagrams: buf.out_forw_datagrams(),
99 out_requests: buf.out_requests(),
100 out_octets: buf.out_octets(),
101 in_hdr_errors: buf.in_hdr_errors(),
102 in_too_big_errors: buf.in_too_big_errors(),
103 in_no_routes: buf.in_no_routes(),
104 in_addr_errors: buf.in_addr_errors(),
105 in_unknown_protos: buf.in_unknown_protos(),
106 in_truncated_pkts: buf.in_truncated_pkts(),
107 in_discards: buf.in_discards(),
108 out_discards: buf.out_discards(),
109 out_no_routes: buf.out_no_routes(),
110 reasm_timeout: buf.reasm_timeout(),
111 reasm_reqds: buf.reasm_reqds(),
112 reasm_oks: buf.reasm_oks(),
113 reasm_fails: buf.reasm_fails(),
114 frag_oks: buf.frag_oks(),
115 frag_fails: buf.frag_fails(),
116 frag_creates: buf.frag_creates(),
117 in_mcast_pkts: buf.in_mcast_pkts(),
118 out_mcast_pkts: buf.out_mcast_pkts(),
119 in_bcast_pkts: buf.in_bcast_pkts(),
120 out_bcast_pkts: buf.out_bcast_pkts(),
121 in_mcast_octets: buf.in_mcast_octets(),
122 out_mcast_octets: buf.out_mcast_octets(),
123 in_bcast_octets: buf.in_bcast_octets(),
124 out_bcast_octets: buf.out_bcast_octets(),
125 in_csum_errors: buf.in_csum_errors(),
126 in_no_ect_pkts: buf.in_no_ect_pkts(),
127 in_ect1_pkts: buf.in_ect1_pkts(),
128 in_ect0_pkts: buf.in_ect0_pkts(),
129 in_ce_pkts: buf.in_ce_pkts(),
130 reasm_overlaps: buf.reasm_overlaps(),
131 out_pkts: buf.out_pkts(),
132 })
133 }
134}
135
136impl Emitable for Inet6Stats {
137 fn buffer_len(&self) -> usize {
138 INET6_STATS_LEN
139 }
140
141 fn emit(&self, buffer: &mut [u8]) {
142 let mut buffer = Inet6StatsBuffer::new(buffer);
143 buffer.set_num(self.num);
144 buffer.set_in_pkts(self.in_pkts);
145 buffer.set_in_octets(self.in_octets);
146 buffer.set_in_delivers(self.in_delivers);
147 buffer.set_out_forw_datagrams(self.out_forw_datagrams);
148 buffer.set_out_requests(self.out_requests);
149 buffer.set_out_octets(self.out_octets);
150 buffer.set_in_hdr_errors(self.in_hdr_errors);
151 buffer.set_in_too_big_errors(self.in_too_big_errors);
152 buffer.set_in_no_routes(self.in_no_routes);
153 buffer.set_in_addr_errors(self.in_addr_errors);
154 buffer.set_in_unknown_protos(self.in_unknown_protos);
155 buffer.set_in_truncated_pkts(self.in_truncated_pkts);
156 buffer.set_in_discards(self.in_discards);
157 buffer.set_out_discards(self.out_discards);
158 buffer.set_out_no_routes(self.out_no_routes);
159 buffer.set_reasm_timeout(self.reasm_timeout);
160 buffer.set_reasm_reqds(self.reasm_reqds);
161 buffer.set_reasm_oks(self.reasm_oks);
162 buffer.set_reasm_fails(self.reasm_fails);
163 buffer.set_frag_oks(self.frag_oks);
164 buffer.set_frag_fails(self.frag_fails);
165 buffer.set_frag_creates(self.frag_creates);
166 buffer.set_in_mcast_pkts(self.in_mcast_pkts);
167 buffer.set_out_mcast_pkts(self.out_mcast_pkts);
168 buffer.set_in_bcast_pkts(self.in_bcast_pkts);
169 buffer.set_out_bcast_pkts(self.out_bcast_pkts);
170 buffer.set_in_mcast_octets(self.in_mcast_octets);
171 buffer.set_out_mcast_octets(self.out_mcast_octets);
172 buffer.set_in_bcast_octets(self.in_bcast_octets);
173 buffer.set_out_bcast_octets(self.out_bcast_octets);
174 buffer.set_in_csum_errors(self.in_csum_errors);
175 buffer.set_in_no_ect_pkts(self.in_no_ect_pkts);
176 buffer.set_in_ect1_pkts(self.in_ect1_pkts);
177 buffer.set_in_ect0_pkts(self.in_ect0_pkts);
178 buffer.set_in_ce_pkts(self.in_ce_pkts);
179 buffer.set_reasm_overlaps(self.reasm_overlaps);
180 buffer.set_out_pkts(self.out_pkts);
181 }
182}