mod adapter;
mod dll;
use std::io;
use crate::filter::PacketFilter;
use crate::Interface;
pub use adapter::NpcapAdapter;
#[derive(Clone, Copy, Debug)]
pub enum NpcapMode {
Capture,
Statistic,
}
#[derive(Clone, Copy, Debug)]
pub enum NpcapTimeout {
Immediate,
Milliseconds(u32),
None,
}
pub(crate) struct SnifferImpl {
adapter: NpcapAdapter,
}
impl SnifferImpl {
#[inline]
pub fn new(iface: Interface) -> io::Result<Self> {
let adapter = NpcapAdapter::new(iface)?;
adapter.set_filter(&mut PacketFilter::reject_all())?;
Ok(Self { adapter })
}
#[inline]
pub fn activate(&mut self, filter: Option<PacketFilter>) -> io::Result<()> {
self.adapter.flush()?;
let mut filter = filter.unwrap_or(PacketFilter::reject_all());
self.adapter.set_filter(&mut filter)
}
#[inline]
pub fn deactivate(&mut self) -> io::Result<()> {
self.adapter.set_filter(&mut PacketFilter::reject_all())
}
#[inline]
pub fn set_nonblocking(&self, nonblocking: bool) -> io::Result<()> {
self.adapter.set_nonblocking(nonblocking);
Ok(())
}
#[inline]
pub fn nonblocking(&self) -> io::Result<bool> {
Ok(self.adapter.nonblocking())
}
#[inline]
pub fn send(&self, buf: &[u8]) -> io::Result<usize> {
self.adapter.send(buf)
}
#[inline]
pub fn recv(&self, buf: &mut [u8]) -> io::Result<usize> {
self.adapter.recv(buf)
}
}
unsafe impl Send for SnifferImpl {}
unsafe impl Sync for SnifferImpl {}