#![feature(test)] extern crate test; pub use sniffglue::*; #[cfg(test)] mod tests { use super::*; use test::Bencher; const HTML: [u8; 390] = [ 32, 32, 32, 32, 32, 32, 32, 112, 97, 100, 100, 105, 110, 103, 58, 32, 49, 101, 109, 59, 10, 32, 32, 32, 32, 32, 32, 32, 32, 125, 10, 32, 32, 32, 32, 125, 10, 32, 32, 32, 32, 60, 47, 115, 116, 121, 108, 101, 62, 32, 32, 32, 32, 10, 60, 47, 104, 101, 97, 100, 62, 10, 10, 60, 98, 111, 100, 121, 62, 10, 60, 100, 105, 118, 62, 10, 32, 32, 32, 32, 60, 104, 49, 62, 69, 120, 97, 109, 112, 108, 101, 32, 68, 111, 109, 97, 105, 110, 60, 47, 104, 49, 62, 10, 32, 32, 32, 32, 60, 112, 62, 84, 104, 105, 115, 32, 100, 111, 109, 97, 105, 110, 32, 105, 115, 32, 101, 115, 116, 97, 98, 108, 105, 115, 104, 101, 100, 32, 116, 111, 32, 98, 101, 32, 117, 115, 101, 100, 32, 102, 111, 114, 32, 105, 108, 108, 117, 115, 116, 114, 97, 116, 105, 118, 101, 32, 101, 120, 97, 109, 112, 108, 101, 115, 32, 105, 110, 32, 100, 111, 99, 117, 109, 101, 110, 116, 115, 46, 32, 89, 111, 117, 32, 109, 97, 121, 32, 117, 115, 101, 32, 116, 104, 105, 115, 10, 32, 32, 32, 32, 100, 111, 109, 97, 105, 110, 32, 105, 110, 32, 101, 120, 97, 109, 112, 108, 101, 115, 32, 119, 105, 116, 104, 111, 117, 116, 32, 112, 114, 105, 111, 114, 32, 99, 111, 111, 114, 100, 105, 110, 97, 116, 105, 111, 110, 32, 111, 114, 32, 97, 115, 107, 105, 110, 103, 32, 102, 111, 114, 32, 112, 101, 114, 109, 105, 115, 115, 105, 111, 110, 46, 60, 47, 112, 62, 10, 32, 32, 32, 32, 60, 112, 62, 60, 97, 32, 104, 114, 101, 102, 61, 34, 104, 116, 116, 112, 58, 47, 47, 119, 119, 119, 46, 105, 97, 110, 97, 46, 111, 114, 103, 47, 100, 111, 109, 97, 105, 110, 115, 47, 101, 120, 97, 109, 112, 108, 101, 34, 62, 77, 111, 114, 101, 32, 105, 110, 102, 111, 114, 109, 97, 116, 105, 111, 110, 46, 46, 46, 60, 47, 97, 62, 60, 47, 112, 62, 10, 60, 47, 100, 105, 118, 62, 10, 60, 47, 98, 111, 100, 121, 62, 10, 60, 47, 104, 116, 109, 108, 62, 10 ]; #[bench] fn tcp(b: &mut Bencher) { use structs::raw::Raw::Ether; use structs::ether::Ether::IPv4; use structs::ipv4::IPv4::TCP; use structs::tcp::TCP::Text; use pktparse::ethernet::{MacAddress, EtherType, EthernetFrame}; use pktparse::ipv4::IPv4Header; use pktparse::ip::IPProtocol; use pktparse::tcp::TcpHeader; let mut pkt = Vec::new(); pkt.extend([ 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 8, 0, 69, 0, 1, 186, 78, 105, 64, 0, 55, 6, 251, 115, 93, 184, 216, 34, 192, 168, 44, 55, 0, 80, 142, 158, 133, 72, 141, 7, 64, 115, 177, 1, 128, 24, 1, 27, 200, 121, 0, 0, 1, 1, 8, 10, 59, 135, 198, 7, 93, 127, 194, 19, ].iter()); pkt.extend(HTML.iter()); let expected = Ok(Ether( EthernetFrame { source_mac: MacAddress([0x11, 0x22, 0x33, 0x44, 0x55, 0x66]), dest_mac: MacAddress([0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc]), ethertype: EtherType::IPv4, }, IPv4(IPv4Header { version: 4, ihl: 5, tos: 0, length: 442, id: 20073, flags: 2, fragment_offset: 0, ttl: 55, protocol: IPProtocol::TCP, chksum: 64371, source_addr: "93.184.216.34".parse().unwrap(), dest_addr: "192.168.44.55".parse().unwrap(), }, TCP(TcpHeader { source_port: 80, dest_port: 36510, sequence_no: 2236124423, ack_no: 1081323777, data_offset: 8, reserved: 0, flag_urg: false, flag_ack: true, flag_psh: true, flag_rst: false, flag_syn: false, flag_fin: false, window: 283, checksum: 51321, urgent_pointer: 0, options: None }, Text(String::from_utf8(HTML.to_vec()).unwrap()) )))); b.iter(|| { let x = centrifuge::parse_eth(&pkt); assert_eq!(expected, x); }); } #[bench] fn bench_empty(b: &mut Bencher) { b.iter(|| { centrifuge::parse_eth(&[]).ok(); }); } #[bench] fn bench(b: &mut Bencher) { let mut pkt = Vec::new(); pkt.extend([ 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 8, 0, 69, 0, 1, 186, 78, 105, 64, 0, 55, 6, 251, 115, 93, 184, 216, 34, 192, 168, 44, 55, 0, 80, 142, 158, 133, 72, 141, 7, 64, 115, 177, 1, 128, 24, 1, 27, 200, 121, 0, 0, 1, 1, 8, 10, 59, 135, 198, 7, 93, 127, 194, 19, ].iter()); pkt.extend(HTML.iter()); b.iter(|| { centrifuge::parse_eth(&pkt).ok(); }); } }