use crate::block::opts::*;
use crate::block::util::*;
use bytes::Buf;
#[derive(Clone, PartialEq, Eq, Debug)]
pub struct InterfaceStatistics {
pub interface_id: u32,
pub timestamp: Timestamp,
pub isb_starttime: Option<Timestamp>,
pub isb_endtime: Option<Timestamp>,
pub isb_ifrecv: Option<u64>,
pub isb_ifdrop: Option<u64>,
pub isb_filter_accept: Option<u64>,
pub isb_osdrop: Option<u64>,
pub isb_usrdeliv: Option<u64>,
}
impl FromBytes for InterfaceStatistics {
fn parse<T: Buf>(
mut buf: T,
endianness: Endianness,
) -> Result<InterfaceStatistics, BlockError> {
ensure_remaining!(buf, 12);
let interface_id = read_u32(&mut buf, endianness);
let timestamp = read_ts(&mut buf, endianness);
let mut isb_starttime = None;
let mut isb_endtime = None;
let mut isb_ifrecv = None;
let mut isb_ifdrop = None;
let mut isb_filter_accept = None;
let mut isb_osdrop = None;
let mut isb_usrdeliv = None;
parse_options(buf, endianness, |ty, bytes| {
match ty {
2 => isb_starttime = bytes_to_ts(bytes, endianness),
3 => isb_endtime = bytes_to_ts(bytes, endianness),
4 => isb_ifrecv = bytes_to_u64(bytes, endianness),
5 => isb_ifdrop = bytes_to_u64(bytes, endianness),
6 => isb_filter_accept = bytes_to_u64(bytes, endianness),
7 => isb_osdrop = bytes_to_u64(bytes, endianness),
8 => isb_usrdeliv = bytes_to_u64(bytes, endianness),
_ => (), }
});
Ok(InterfaceStatistics {
interface_id,
timestamp,
isb_starttime,
isb_endtime,
isb_ifrecv,
isb_ifdrop,
isb_filter_accept,
isb_osdrop,
isb_usrdeliv,
})
}
}