use std::fmt;
use serde_derive::Serialize;
#[derive(Serialize)]
pub struct GlobalHeader {
magic_number: u32,
version_major: u16,
version_minor: u16,
thiszone: u32,
sigfigs: u32,
snaplen: u32,
network: u32,
}
const PCAPH_MAGIC_NUM_LE: u32 = 3569595041;
const PCAPH_VER_MAJOR: u16 = 2;
const PCAPH_VER_MINOR: u16 = 4;
const PCAPH_THISZONE: u32 = 0;
const PCAPH_SIGFIGS: u32 = 0;
const PCAPH_SNAPLEN: u32 = 65535;
const LINKTYPE_ETHERNET: u32 = 1;
impl Default for GlobalHeader {
fn default() -> Self {
let pcaph_magic_num_be = u32::from_be(PCAPH_MAGIC_NUM_LE);
GlobalHeader {
magic_number: pcaph_magic_num_be,
version_major: PCAPH_VER_MAJOR,
version_minor: PCAPH_VER_MINOR,
thiszone: PCAPH_THISZONE,
sigfigs: PCAPH_SIGFIGS,
snaplen: PCAPH_SNAPLEN,
network: LINKTYPE_ETHERNET,
}
}
}
impl fmt::Debug for GlobalHeader {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "GlobalHeader {{ magic_number={}, version_major={}, version_minor={}, thiszone={}, sigfigs={}, snaplen={}, network={}, binary={:?} }}",
self.magic_number,
self.version_major,
self.version_minor,
self.thiszone,
self.sigfigs,
self.snaplen,
self.network,
self.to_bytes())
}
}
impl GlobalHeader {
pub fn to_bytes(&self) -> Vec<u8> {
bincode::serialize(&self).unwrap()
}
}
#[cfg(test)]
mod tests {
use super::*;
const PCAPH_MAGIC_NUM_BE: u32 = 2712847316;
#[test]
fn expected_create_global_header() {
let global_header = GlobalHeader::default();
let buf = global_header.to_bytes();
println!("{:?}", global_header);
assert_eq!(24, buf.len());
assert_eq!(PCAPH_MAGIC_NUM_BE, global_header.magic_number);
assert_eq!(PCAPH_VER_MAJOR, global_header.version_major);
assert_eq!(PCAPH_VER_MINOR, global_header.version_minor);
assert_eq!(PCAPH_THISZONE, global_header.thiszone);
assert_eq!(PCAPH_SIGFIGS, global_header.sigfigs);
assert_eq!(PCAPH_SNAPLEN, global_header.snaplen);
assert_eq!(LINKTYPE_ETHERNET, global_header.network);
}
}