use crate::block::opts::*;
use crate::block::util::*;
use bytes::{Buf, Bytes};
#[derive(Clone, PartialEq, Eq, Debug)]
pub struct EnhancedPacket {
pub interface_id: u32,
pub timestamp: Timestamp,
pub captured_len: u32,
pub packet_len: u32,
pub packet_data: Bytes,
pub epb_flags: u32,
pub epb_hash: Vec<Bytes>,
pub epb_dropcount: Option<u64>,
pub epb_packetid: Option<u64>,
pub epb_queue: Option<u32>,
pub epb_verdict: Vec<Bytes>,
}
impl FromBytes for EnhancedPacket {
fn parse<T: Buf>(mut buf: T, endianness: Endianness) -> Result<EnhancedPacket, BlockError> {
ensure_remaining!(buf, 20);
let interface_id = read_u32(&mut buf, endianness);
let timestamp = read_ts(&mut buf, endianness);
let captured_len = read_u32(&mut buf, endianness);
let packet_len = read_u32(&mut buf, endianness);
let packet_data = read_bytes(&mut buf, captured_len)?;
let mut epb_flags = 0;
let mut epb_hash = vec![];
let mut epb_dropcount = None;
let mut epb_packetid = None;
let mut epb_queue = None;
let mut epb_verdict = vec![];
parse_options(buf, endianness, |ty, bytes| {
match ty {
2 => {
if let Some(x) = bytes_to_u32(bytes, endianness) {
epb_flags = x;
}
}
3 => epb_hash.push(bytes),
4 => epb_dropcount = bytes_to_u64(bytes, endianness),
5 => epb_packetid = bytes_to_u64(bytes, endianness),
6 => epb_queue = bytes_to_u32(bytes, endianness),
7 => epb_verdict.push(bytes),
_ => (), }
});
Ok(EnhancedPacket {
interface_id,
timestamp,
captured_len,
packet_len,
packet_data,
epb_flags,
epb_hash,
epb_dropcount,
epb_packetid,
epb_queue,
epb_verdict,
})
}
}