use std::fmt;
use std::ops::Deref;
use serde_derive::Serialize;
#[derive(Serialize)]
pub struct Packet {
tv_sec: u32,
tv_usec: u32,
caplen: u32,
len: u32,
#[serde(skip_serializing)]
data: Vec<u8>,
}
impl From<pcap::Packet<'_>> for Packet {
fn from(pcap_packet: pcap::Packet) -> Self {
Packet {
tv_sec: pcap_packet.header.ts.tv_sec as u32,
tv_usec: pcap_packet.header.ts.tv_usec as u32,
caplen: pcap_packet.header.caplen,
len: pcap_packet.header.len,
data: pcap_packet.data.to_vec(),
}
}
}
impl fmt::Debug for Packet {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(
f,
"Packet {{ ts: {}.{:06}, caplen: {}, len: {}, data: {:?}, binary: {:?} }}",
self.tv_sec, self.tv_usec, self.caplen, self.len, self.data, self.to_bytes()
)
}
}
impl Packet {
pub fn to_bytes(&self) -> Vec<u8> {
let mut bytes = bincode::serialize(&self).unwrap();
bytes.append(&mut self.data.deref().to_vec());
bytes
}
}
#[cfg(test)]
mod tests {
use pcap::Capture;
use crate::test_resources;
use super::*;
#[test]
fn expected_encode_file() {
let mut capture = Capture::from_file(test_resources!("captures/arp.pcap")).unwrap();
let packet = capture.next_packet().unwrap();
let packet = Packet::from(packet);
println!("{:?}", packet);
assert_eq!(46, packet.to_bytes().len());
}
}