net_file/translator/
global_header.rs1use std::fmt;
2
3use serde_derive::Serialize;
4
5#[derive(Serialize)]
20pub struct GlobalHeader {
21 magic_number: u32,
24 version_major: u16,
26 version_minor: u16,
28 thiszone: u32,
30 sigfigs: u32,
32 snaplen: u32,
34 network: u32,
37}
38
39const PCAPH_MAGIC_NUM_LE: u32 = 3569595041;
40const PCAPH_VER_MAJOR: u16 = 2;
41const PCAPH_VER_MINOR: u16 = 4;
42const PCAPH_THISZONE: u32 = 0;
43const PCAPH_SIGFIGS: u32 = 0;
44const PCAPH_SNAPLEN: u32 = 65535;
45const LINKTYPE_ETHERNET: u32 = 1;
46
47impl Default for GlobalHeader {
48 fn default() -> Self {
49 let pcaph_magic_num_be = u32::from_be(PCAPH_MAGIC_NUM_LE);
50
51 GlobalHeader {
52 magic_number: pcaph_magic_num_be,
53 version_major: PCAPH_VER_MAJOR,
54 version_minor: PCAPH_VER_MINOR,
55 thiszone: PCAPH_THISZONE,
56 sigfigs: PCAPH_SIGFIGS,
57 snaplen: PCAPH_SNAPLEN,
58 network: LINKTYPE_ETHERNET,
59 }
60 }
61}
62
63impl fmt::Debug for GlobalHeader {
64 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
65 write!(f, "GlobalHeader {{ magic_number={}, version_major={}, version_minor={}, thiszone={}, sigfigs={}, snaplen={}, network={}, binary={:?} }}",
66 self.magic_number,
67 self.version_major,
68 self.version_minor,
69 self.thiszone,
70 self.sigfigs,
71 self.snaplen,
72 self.network,
73 self.to_bytes())
74 }
75}
76
77impl GlobalHeader {
78 pub fn to_bytes(&self) -> Vec<u8> {
79 bincode::serialize(&self).unwrap()
80 }
81}
82
83#[cfg(test)]
84mod tests {
85 use super::*;
86
87 const PCAPH_MAGIC_NUM_BE: u32 = 2712847316;
88
89 #[test]
90 fn expected_create_global_header() {
91 let global_header = GlobalHeader::default();
92 let buf = global_header.to_bytes();
93
94 println!("{:?}", global_header);
95 assert_eq!(24, buf.len());
96 assert_eq!(PCAPH_MAGIC_NUM_BE, global_header.magic_number);
97 assert_eq!(PCAPH_VER_MAJOR, global_header.version_major);
98 assert_eq!(PCAPH_VER_MINOR, global_header.version_minor);
99 assert_eq!(PCAPH_THISZONE, global_header.thiszone);
100 assert_eq!(PCAPH_SIGFIGS, global_header.sigfigs);
101 assert_eq!(PCAPH_SNAPLEN, global_header.snaplen);
102 assert_eq!(LINKTYPE_ETHERNET, global_header.network);
103 }
104}