netlink_packet_route/link/
stats64.rs

1// SPDX-License-Identifier: MIT
2
3use netlink_packet_utils::traits::{Emitable, Parseable};
4use netlink_packet_utils::DecodeError;
5
6pub(crate) const LINK_STATS64_LEN: usize = 200;
7
8buffer!(Stats64Buffer(LINK_STATS64_LEN) {
9    rx_packets: (u64, 0..8),
10    tx_packets: (u64, 8..16),
11    rx_bytes: (u64, 16..24),
12    tx_bytes: (u64, 24..32),
13    rx_errors: (u64, 32..40),
14    tx_errors: (u64, 40..48),
15    rx_dropped: (u64, 48..56),
16    tx_dropped: (u64, 56..64),
17    multicast: (u64, 64..72),
18    collisions: (u64, 72..80),
19    rx_length_errors: (u64, 80..88),
20    rx_over_errors: (u64, 88..96),
21    rx_crc_errors: (u64, 96..104),
22    rx_frame_errors: (u64, 104..112),
23    rx_fifo_errors: (u64, 112..120),
24    rx_missed_errors: (u64, 120..128),
25    tx_aborted_errors: (u64, 128..136),
26    tx_carrier_errors: (u64, 136..144),
27    tx_fifo_errors: (u64, 144..152),
28    tx_heartbeat_errors: (u64, 152..160),
29    tx_window_errors: (u64, 160..168),
30    rx_compressed: (u64, 168..176),
31    tx_compressed: (u64, 176..184),
32    rx_nohandler: (u64, 184..192),
33    rx_otherhost_dropped: (u64, 192..200),
34});
35
36#[derive(Debug, Clone, Copy, Eq, PartialEq, Default)]
37#[non_exhaustive]
38pub struct Stats64 {
39    /// total packets received
40    pub rx_packets: u64,
41    /// total packets transmitted
42    pub tx_packets: u64,
43    /// total bytes received
44    pub rx_bytes: u64,
45    /// total bytes transmitted
46    pub tx_bytes: u64,
47    /// bad packets received
48    pub rx_errors: u64,
49    /// packet transmit problems
50    pub tx_errors: u64,
51    /// no space in linux buffers
52    pub rx_dropped: u64,
53    /// no space available in linux
54    pub tx_dropped: u64,
55    /// multicast packets received
56    pub multicast: u64,
57    pub collisions: u64,
58
59    // detailed rx_errors
60    pub rx_length_errors: u64,
61    /// receiver ring buff overflow
62    pub rx_over_errors: u64,
63    /// received packets with crc error
64    pub rx_crc_errors: u64,
65    /// received frame alignment errors
66    pub rx_frame_errors: u64,
67    /// recv'r fifo overrun
68    pub rx_fifo_errors: u64,
69    /// receiver missed packet
70    pub rx_missed_errors: u64,
71
72    // detailed tx_errors
73    pub tx_aborted_errors: u64,
74    pub tx_carrier_errors: u64,
75    pub tx_fifo_errors: u64,
76    pub tx_heartbeat_errors: u64,
77    pub tx_window_errors: u64,
78
79    // for cslip etc
80    pub rx_compressed: u64,
81    pub tx_compressed: u64,
82
83    /// dropped, no handler found
84    pub rx_nohandler: u64,
85
86    pub rx_otherhost_dropped: u64,
87}
88
89impl<T: AsRef<[u8]>> Parseable<Stats64Buffer<T>> for Stats64 {
90    type Error = DecodeError;
91    fn parse(buf: &Stats64Buffer<T>) -> Result<Self, DecodeError> {
92        Ok(Self {
93            rx_packets: buf.rx_packets(),
94            tx_packets: buf.tx_packets(),
95            rx_bytes: buf.rx_bytes(),
96            tx_bytes: buf.tx_bytes(),
97            rx_errors: buf.rx_errors(),
98            tx_errors: buf.tx_errors(),
99            rx_dropped: buf.rx_dropped(),
100            tx_dropped: buf.tx_dropped(),
101            multicast: buf.multicast(),
102            collisions: buf.collisions(),
103            rx_length_errors: buf.rx_length_errors(),
104            rx_over_errors: buf.rx_over_errors(),
105            rx_crc_errors: buf.rx_crc_errors(),
106            rx_frame_errors: buf.rx_frame_errors(),
107            rx_fifo_errors: buf.rx_fifo_errors(),
108            rx_missed_errors: buf.rx_missed_errors(),
109            tx_aborted_errors: buf.tx_aborted_errors(),
110            tx_carrier_errors: buf.tx_carrier_errors(),
111            tx_fifo_errors: buf.tx_fifo_errors(),
112            tx_heartbeat_errors: buf.tx_heartbeat_errors(),
113            tx_window_errors: buf.tx_window_errors(),
114            rx_compressed: buf.rx_compressed(),
115            tx_compressed: buf.tx_compressed(),
116            rx_nohandler: buf.rx_nohandler(),
117            rx_otherhost_dropped: buf.rx_otherhost_dropped(),
118        })
119    }
120}
121
122impl Emitable for Stats64 {
123    fn buffer_len(&self) -> usize {
124        LINK_STATS64_LEN
125    }
126
127    fn emit(&self, buffer: &mut [u8]) {
128        let mut buffer = Stats64Buffer::new(buffer);
129        buffer.set_rx_packets(self.rx_packets);
130        buffer.set_tx_packets(self.tx_packets);
131        buffer.set_rx_bytes(self.rx_bytes);
132        buffer.set_tx_bytes(self.tx_bytes);
133        buffer.set_rx_errors(self.rx_errors);
134        buffer.set_tx_errors(self.tx_errors);
135        buffer.set_rx_dropped(self.rx_dropped);
136        buffer.set_tx_dropped(self.tx_dropped);
137        buffer.set_multicast(self.multicast);
138        buffer.set_collisions(self.collisions);
139        buffer.set_rx_length_errors(self.rx_length_errors);
140        buffer.set_rx_over_errors(self.rx_over_errors);
141        buffer.set_rx_crc_errors(self.rx_crc_errors);
142        buffer.set_rx_frame_errors(self.rx_frame_errors);
143        buffer.set_rx_fifo_errors(self.rx_fifo_errors);
144        buffer.set_rx_missed_errors(self.rx_missed_errors);
145        buffer.set_tx_aborted_errors(self.tx_aborted_errors);
146        buffer.set_tx_carrier_errors(self.tx_carrier_errors);
147        buffer.set_tx_fifo_errors(self.tx_fifo_errors);
148        buffer.set_tx_heartbeat_errors(self.tx_heartbeat_errors);
149        buffer.set_tx_window_errors(self.tx_window_errors);
150        buffer.set_rx_compressed(self.rx_compressed);
151        buffer.set_tx_compressed(self.tx_compressed);
152        buffer.set_rx_nohandler(self.rx_nohandler);
153        buffer.set_rx_otherhost_dropped(self.rx_otherhost_dropped);
154    }
155}