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}