netlink_packet_route/link/
stats.rs
1use netlink_packet_utils::traits::{Emitable, Parseable};
4use netlink_packet_utils::DecodeError;
5
6pub(crate) const LINK_STATS_LEN: usize = 96;
7
8#[derive(Debug, Clone, Copy, Eq, PartialEq, Default)]
9#[non_exhaustive]
10pub struct Stats {
11 pub rx_packets: u32,
13 pub tx_packets: u32,
15 pub rx_bytes: u32,
17 pub tx_bytes: u32,
19 pub rx_errors: u32,
21 pub tx_errors: u32,
23 pub rx_dropped: u32,
25 pub tx_dropped: u32,
27 pub multicast: u32,
29 pub collisions: u32,
30
31 pub rx_length_errors: u32,
33 pub rx_over_errors: u32,
35 pub rx_crc_errors: u32,
37 pub rx_frame_errors: u32,
39 pub rx_fifo_errors: u32,
41 pub rx_missed_errors: u32,
43
44 pub tx_aborted_errors: u32,
46 pub tx_carrier_errors: u32,
47 pub tx_fifo_errors: u32,
48 pub tx_heartbeat_errors: u32,
49 pub tx_window_errors: u32,
50
51 pub rx_compressed: u32,
53 pub tx_compressed: u32,
54
55 pub rx_nohandler: u32,
57}
58
59buffer!(StatsBuffer(LINK_STATS_LEN) {
60 rx_packets: (u32, 0..4),
61 tx_packets: (u32, 4..8),
62 rx_bytes: (u32, 8..12),
63 tx_bytes: (u32, 12..16),
64 rx_errors: (u32, 16..20),
65 tx_errors: (u32, 20..24),
66 rx_dropped: (u32, 24..28),
67 tx_dropped: (u32, 28..32),
68 multicast: (u32, 32..36),
69 collisions: (u32, 36..40),
70 rx_length_errors: (u32, 40..44),
71 rx_over_errors: (u32, 44..48),
72 rx_crc_errors: (u32, 48..52),
73 rx_frame_errors: (u32, 52..56),
74 rx_fifo_errors: (u32, 56..60),
75 rx_missed_errors: (u32, 60..64),
76 tx_aborted_errors: (u32, 64..68),
77 tx_carrier_errors: (u32, 68..72),
78 tx_fifo_errors: (u32, 72..76),
79 tx_heartbeat_errors: (u32, 76..80),
80 tx_window_errors: (u32, 80..84),
81 rx_compressed: (u32, 84..88),
82 tx_compressed: (u32, 88..92),
83 rx_nohandler: (u32, 92..96),
84});
85
86impl<T: AsRef<[u8]>> Parseable<StatsBuffer<T>> for Stats {
87 type Error = DecodeError;
88 fn parse(buf: &StatsBuffer<T>) -> Result<Self, DecodeError> {
89 Ok(Self {
90 rx_packets: buf.rx_packets(),
91 tx_packets: buf.tx_packets(),
92 rx_bytes: buf.rx_bytes(),
93 tx_bytes: buf.tx_bytes(),
94 rx_errors: buf.rx_errors(),
95 tx_errors: buf.tx_errors(),
96 rx_dropped: buf.rx_dropped(),
97 tx_dropped: buf.tx_dropped(),
98 multicast: buf.multicast(),
99 collisions: buf.collisions(),
100 rx_length_errors: buf.rx_length_errors(),
101 rx_over_errors: buf.rx_over_errors(),
102 rx_crc_errors: buf.rx_crc_errors(),
103 rx_frame_errors: buf.rx_frame_errors(),
104 rx_fifo_errors: buf.rx_fifo_errors(),
105 rx_missed_errors: buf.rx_missed_errors(),
106 tx_aborted_errors: buf.tx_aborted_errors(),
107 tx_carrier_errors: buf.tx_carrier_errors(),
108 tx_fifo_errors: buf.tx_fifo_errors(),
109 tx_heartbeat_errors: buf.tx_heartbeat_errors(),
110 tx_window_errors: buf.tx_window_errors(),
111 rx_compressed: buf.rx_compressed(),
112 tx_compressed: buf.tx_compressed(),
113 rx_nohandler: buf.rx_nohandler(),
114 })
115 }
116}
117
118impl Emitable for Stats {
119 fn buffer_len(&self) -> usize {
120 LINK_STATS_LEN
121 }
122
123 fn emit(&self, buffer: &mut [u8]) {
124 let mut buffer = StatsBuffer::new(buffer);
125 buffer.set_rx_packets(self.rx_packets);
126 buffer.set_tx_packets(self.tx_packets);
127 buffer.set_rx_bytes(self.rx_bytes);
128 buffer.set_tx_bytes(self.tx_bytes);
129 buffer.set_rx_errors(self.rx_errors);
130 buffer.set_tx_errors(self.tx_errors);
131 buffer.set_rx_dropped(self.rx_dropped);
132 buffer.set_tx_dropped(self.tx_dropped);
133 buffer.set_multicast(self.multicast);
134 buffer.set_collisions(self.collisions);
135 buffer.set_rx_length_errors(self.rx_length_errors);
136 buffer.set_rx_over_errors(self.rx_over_errors);
137 buffer.set_rx_crc_errors(self.rx_crc_errors);
138 buffer.set_rx_frame_errors(self.rx_frame_errors);
139 buffer.set_rx_fifo_errors(self.rx_fifo_errors);
140 buffer.set_rx_missed_errors(self.rx_missed_errors);
141 buffer.set_tx_aborted_errors(self.tx_aborted_errors);
142 buffer.set_tx_carrier_errors(self.tx_carrier_errors);
143 buffer.set_tx_fifo_errors(self.tx_fifo_errors);
144 buffer.set_tx_heartbeat_errors(self.tx_heartbeat_errors);
145 buffer.set_tx_window_errors(self.tx_window_errors);
146 buffer.set_rx_compressed(self.rx_compressed);
147 buffer.set_tx_compressed(self.tx_compressed);
148 buffer.set_rx_nohandler(self.rx_nohandler);
149 }
150}