nbpf_sys/
pm.rs

1use std::ffi::CString;
2
3use crate::{
4    nbpf_free, nbpf_match, nbpf_parse, nbpf_pkt_info_t, nbpf_tree_t, packet_info::PacketInfo,
5};
6
7#[derive(Debug)]
8pub struct Tree {
9    ptr: *mut nbpf_tree_t,
10}
11
12unsafe impl Send for Tree {}
13unsafe impl Sync for Tree {}
14
15impl Tree {
16    pub fn new(filter: &str) -> Self {
17        let filter = CString::new(filter).unwrap();
18        unsafe {
19            let ptr = nbpf_parse(filter.as_ptr(), None);
20            Tree { ptr }
21        }
22    }
23
24    pub fn match_pkt(&self, packet_info: &PacketInfo) -> i32 {
25        unsafe {
26            nbpf_match(
27                self.ptr as *const nbpf_tree_t,
28                packet_info.get_ptr() as *const nbpf_pkt_info_t,
29            )
30        }
31    }
32}
33
34impl Drop for Tree {
35    fn drop(&mut self) {
36        unsafe {
37            nbpf_free(self.ptr);
38        }
39    }
40}