From 0d7a6255f69739cba19a1125a5a236912f4804d6 Mon Sep 17 00:00:00 2001 From: Dan Robertson Date: Sun, 24 Dec 2017 00:18:01 +0000 Subject: [PATCH] Add bench tests - Add basic infrastructure for bench tests - Add bench tests for - TcpRepr::emit - UdpRepr::emit - Ipv4Repr::emit - Ipv6Repr::emit --- benches/bench.rs | 107 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 benches/bench.rs diff --git a/benches/bench.rs b/benches/bench.rs new file mode 100644 index 0000000..a1fa436 --- /dev/null +++ b/benches/bench.rs @@ -0,0 +1,107 @@ +#![feature(test)] + +extern crate test; +extern crate smoltcp; + +mod wire { + use test; + #[cfg(feature = "proto-ipv6")] + use smoltcp::wire::{Ipv6Address, Ipv6Repr, Ipv6Packet}; + #[cfg(feature = "proto-ipv4")] + use smoltcp::wire::{Ipv4Address, Ipv4Repr, Ipv4Packet}; + use smoltcp::phy::{ChecksumCapabilities}; + use smoltcp::wire::{IpAddress, IpProtocol}; + use smoltcp::wire::{TcpRepr, TcpPacket, TcpSeqNumber, TcpControl}; + use smoltcp::wire::{UdpRepr, UdpPacket}; + + #[cfg(feature = "proto-ipv6")] + const SRC_ADDR: IpAddress = IpAddress::Ipv6(Ipv6Address([0xfe, 0x80, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1])); + #[cfg(feature = "proto-ipv6")] + const DST_ADDR: IpAddress = IpAddress::Ipv6(Ipv6Address([0xfe, 0x80, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2])); + + #[cfg(all(not(feature = "proto-ipv6"), feature = "proto-ipv4"))] + const SRC_ADDR: IpAddress = IpAddress::Ipv4(Ipv4Address([192, 168, 1, 1])); + #[cfg(all(not(feature = "proto-ipv6"), feature = "proto-ipv4"))] + const DST_ADDR: IpAddress = IpAddress::Ipv4(Ipv4Address([192, 168, 1, 2])); + + #[bench] + #[cfg(any(feature = "proto-ipv6", feature = "proto-ipv4"))] + fn bench_emit_tcp(b: &mut test::Bencher) { + static PAYLOAD_BYTES: [u8; 400] = + [0x2a; 400]; + let repr = TcpRepr { + src_port: 48896, + dst_port: 80, + seq_number: TcpSeqNumber(0x01234567), + ack_number: None, + window_len: 0x0123, + control: TcpControl::Syn, + max_seg_size: None, + payload: &PAYLOAD_BYTES + }; + let mut bytes = vec![0xa5; repr.buffer_len()]; + + b.iter(|| { + let mut packet = TcpPacket::new(&mut bytes); + repr.emit(&mut packet, &SRC_ADDR, &DST_ADDR, &ChecksumCapabilities::default()); + }); + } + + #[bench] + #[cfg(any(feature = "proto-ipv6", feature = "proto-ipv4"))] + fn bench_emit_udp(b: &mut test::Bencher) { + static PAYLOAD_BYTES: [u8; 400] = + [0x2a; 400]; + let repr = UdpRepr { + src_port: 48896, + dst_port: 80, + payload: &PAYLOAD_BYTES + }; + let mut bytes = vec![0xa5; repr.buffer_len()]; + + b.iter(|| { + let mut packet = UdpPacket::new(&mut bytes); + repr.emit(&mut packet, &SRC_ADDR, &DST_ADDR, &ChecksumCapabilities::default()); + }); + } + + #[bench] + #[cfg(feature = "proto-ipv4")] + fn bench_emit_ipv4(b: &mut test::Bencher) { + let repr = Ipv4Repr { + src_addr: Ipv4Address([192, 168, 1, 1]), + dst_addr: Ipv4Address([192, 168, 1, 2]), + protocol: IpProtocol::Tcp, + payload_len: 100, + hop_limit: 64 + }; + let mut bytes = vec![0xa5; repr.buffer_len()]; + + b.iter(|| { + let mut packet = Ipv4Packet::new(&mut bytes); + repr.emit(&mut packet, &ChecksumCapabilities::default()); + }); + } + + #[bench] + #[cfg(feature = "proto-ipv6")] + fn bench_emit_ipv6(b: &mut test::Bencher) { + let repr = Ipv6Repr { + src_addr: Ipv6Address([0xfe, 0x80, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1]), + dst_addr: Ipv6Address([0xfe, 0x80, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2]), + next_header: IpProtocol::Tcp, + payload_len: 100, + hop_limit: 64 + }; + let mut bytes = vec![0xa5; repr.buffer_len()]; + + b.iter(|| { + let mut packet = Ipv6Packet::new(&mut bytes); + repr.emit(&mut packet); + }); + } +}