use std::sync::atomic::{AtomicU64, Ordering};
#[derive(Debug, Default)]
pub struct VirtioNetCounters {
pub(crate) tx_packets: AtomicU64,
pub(crate) tx_bytes: AtomicU64,
pub(crate) rx_packets: AtomicU64,
pub(crate) rx_bytes: AtomicU64,
pub(crate) tx_dropped_no_rx_buffer: AtomicU64,
pub(crate) tx_dropped_rx_poisoned: AtomicU64,
pub(crate) tx_chain_invalid: AtomicU64,
pub(crate) tx_oversize_dropped: AtomicU64,
pub(crate) rx_chain_invalid: AtomicU64,
pub(crate) rx_write_failed: AtomicU64,
pub(crate) tx_add_used_failures: AtomicU64,
pub(crate) rx_add_used_failures: AtomicU64,
pub(crate) invalid_avail_idx_count: AtomicU64,
}
impl VirtioNetCounters {
pub(crate) fn record_tx_completed(&self, frame_bytes: u64) {
self.tx_packets.fetch_add(1, Ordering::Relaxed);
self.tx_bytes.fetch_add(frame_bytes, Ordering::Relaxed);
}
pub(crate) fn record_rx_delivered(&self, frame_bytes: u64) {
self.rx_packets.fetch_add(1, Ordering::Relaxed);
self.rx_bytes.fetch_add(frame_bytes, Ordering::Relaxed);
}
pub(crate) fn record_tx_dropped_no_rx_buffer(&self) {
self.tx_dropped_no_rx_buffer.fetch_add(1, Ordering::Relaxed);
}
pub(crate) fn record_tx_dropped_rx_poisoned(&self) {
self.tx_dropped_rx_poisoned.fetch_add(1, Ordering::Relaxed);
}
pub(crate) fn record_tx_chain_invalid(&self) {
self.tx_chain_invalid.fetch_add(1, Ordering::Relaxed);
}
pub(crate) fn record_tx_oversize_dropped(&self) {
self.tx_oversize_dropped.fetch_add(1, Ordering::Relaxed);
}
pub(crate) fn record_rx_chain_invalid(&self) {
self.rx_chain_invalid.fetch_add(1, Ordering::Relaxed);
}
pub(crate) fn record_rx_write_failed(&self) {
self.rx_write_failed.fetch_add(1, Ordering::Relaxed);
}
pub(crate) fn record_tx_add_used_failure(&self) {
self.tx_add_used_failures.fetch_add(1, Ordering::Relaxed);
}
pub(crate) fn record_rx_add_used_failure(&self) {
self.rx_add_used_failures.fetch_add(1, Ordering::Relaxed);
}
pub(crate) fn record_invalid_avail_idx(&self) {
self.invalid_avail_idx_count.fetch_add(1, Ordering::Relaxed);
}
pub fn tx_packets(&self) -> u64 {
self.tx_packets.load(Ordering::Relaxed)
}
pub fn tx_bytes(&self) -> u64 {
self.tx_bytes.load(Ordering::Relaxed)
}
pub fn rx_packets(&self) -> u64 {
self.rx_packets.load(Ordering::Relaxed)
}
pub fn rx_bytes(&self) -> u64 {
self.rx_bytes.load(Ordering::Relaxed)
}
pub fn tx_dropped_no_rx_buffer(&self) -> u64 {
self.tx_dropped_no_rx_buffer.load(Ordering::Relaxed)
}
pub fn tx_dropped_rx_poisoned(&self) -> u64 {
self.tx_dropped_rx_poisoned.load(Ordering::Relaxed)
}
pub fn tx_chain_invalid(&self) -> u64 {
self.tx_chain_invalid.load(Ordering::Relaxed)
}
pub fn tx_oversize_dropped(&self) -> u64 {
self.tx_oversize_dropped.load(Ordering::Relaxed)
}
pub fn rx_chain_invalid(&self) -> u64 {
self.rx_chain_invalid.load(Ordering::Relaxed)
}
pub fn rx_write_failed(&self) -> u64 {
self.rx_write_failed.load(Ordering::Relaxed)
}
pub fn tx_add_used_failures(&self) -> u64 {
self.tx_add_used_failures.load(Ordering::Relaxed)
}
pub fn rx_add_used_failures(&self) -> u64 {
self.rx_add_used_failures.load(Ordering::Relaxed)
}
pub fn invalid_avail_idx_count(&self) -> u64 {
self.invalid_avail_idx_count.load(Ordering::Relaxed)
}
pub fn snapshot(&self) -> VirtioNetCountersSnapshot {
VirtioNetCountersSnapshot {
tx_packets: self.tx_packets(),
tx_bytes: self.tx_bytes(),
rx_packets: self.rx_packets(),
rx_bytes: self.rx_bytes(),
tx_dropped_no_rx_buffer: self.tx_dropped_no_rx_buffer(),
tx_dropped_rx_poisoned: self.tx_dropped_rx_poisoned(),
tx_chain_invalid: self.tx_chain_invalid(),
tx_oversize_dropped: self.tx_oversize_dropped(),
rx_chain_invalid: self.rx_chain_invalid(),
rx_write_failed: self.rx_write_failed(),
tx_add_used_failures: self.tx_add_used_failures(),
rx_add_used_failures: self.rx_add_used_failures(),
invalid_avail_idx_count: self.invalid_avail_idx_count(),
}
}
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Hash, serde::Serialize, serde::Deserialize)]
pub struct VirtioNetCountersSnapshot {
pub tx_packets: u64,
pub tx_bytes: u64,
pub rx_packets: u64,
pub rx_bytes: u64,
pub tx_dropped_no_rx_buffer: u64,
pub tx_dropped_rx_poisoned: u64,
pub tx_chain_invalid: u64,
pub tx_oversize_dropped: u64,
pub rx_chain_invalid: u64,
pub rx_write_failed: u64,
pub tx_add_used_failures: u64,
pub rx_add_used_failures: u64,
pub invalid_avail_idx_count: u64,
}