pcap_async/
lib.rs

1//! # pcap-async
2//!
3//! Async/await wrappers [pcap-sys](https://github.com/protectwise/pcap-sys).
4//!
5//!```no_run
6//! use futures::StreamExt;
7//! use pcap_async::{Config, Handle, PacketStream};
8//! use std::sync::Arc;
9//!
10//! fn main() {
11//!     let handle = Handle::lookup().expect("No handle created");
12//!     smol::block_on(async move {
13//!         let mut provider = PacketStream::new(Config::default(), Arc::clone(&handle))
14//!             .expect("Could not create provider")
15//!             .boxed();
16//!         while let Some(packets) = provider.next().await {
17//!
18//!         }
19//!         handle.interrupt();
20//!     });
21//! }
22#![deny(unused_must_use, unused_imports, bare_trait_objects)]
23#![allow(dead_code, unused_imports)]
24pub mod bpf;
25mod bridge_stream;
26mod config;
27pub mod errors;
28mod handle;
29mod info;
30mod packet;
31pub mod pcap_util;
32mod stats;
33mod stream;
34
35pub use crate::{
36    bridge_stream::BridgeStream, config::Config, errors::Error, handle::Handle, info::Info,
37    packet::Packet, stats::Stats, stream::PacketStream, stream::StreamItem,
38};
39pub use byteorder::{BigEndian, LittleEndian, NativeEndian, WriteBytesExt};
40use log::*;
41use std::sync::Arc;
42
43#[cfg(test)]
44mod tests {
45    use super::*;
46    use futures::StreamExt;
47    use std::path::PathBuf;
48
49    #[test]
50    fn capture_from_file() {
51        let _ = env_logger::try_init();
52
53        let pcap_path = PathBuf::from(env!("CARGO_MANIFEST_DIR"))
54            .join("resources")
55            .join("4SICS-GeekLounge-151020.pcap");
56
57        info!("Benchmarking against {:?}", pcap_path.clone());
58
59        let clone_path = pcap_path.clone();
60
61        let handle = Handle::file_capture(clone_path.to_str().expect("No path found"))
62            .expect("No handle created");
63
64        let mut cfg = Config::default();
65        cfg.with_max_packets_read(5000);
66
67        let packets = smol::block_on(async move {
68            let packet_provider =
69                PacketStream::new(Config::default(), std::sync::Arc::clone(&handle))
70                    .expect("Failed to build");
71            let fut_packets = packet_provider.collect::<Vec<_>>();
72            let packets: Result<Vec<_>, Error> = fut_packets.await.into_iter().collect();
73            let packets = packets
74                .expect("Could not get packets")
75                .iter()
76                .flatten()
77                .count();
78
79            handle.interrupt();
80
81            packets
82        });
83
84        assert_eq!(packets, 246137);
85    }
86}