diff --git a/pcap-rewrite/src/filters/dispatch_filter.rs b/pcap-rewrite/src/filters/dispatch_filter.rs index b257de7..517a712 100644 --- a/pcap-rewrite/src/filters/dispatch_filter.rs +++ b/pcap-rewrite/src/filters/dispatch_filter.rs @@ -20,7 +20,8 @@ use crate::filters::key_parser_ipv4; use crate::filters::key_parser_ipv6; /// Function to extract key from data -pub type GetKeyFn = Box Result>; +// pub type GetKeyFn = Box Result>; +pub type GetKeyFn = fn(&ParseContext, &[u8]) -> Result; /// Function to keep/drop extract key from container pub type KeepFn = Box Result>; @@ -124,8 +125,8 @@ impl DispatchFilterBuilder { Ok(Box::new(DispatchFilter::new( ipaddr_container, - Box::new(key_parser_ipv4::parse_src_ipaddr), - Box::new(key_parser_ipv6::parse_src_ipaddr), + key_parser_ipv4::parse_src_ipaddr, + key_parser_ipv6::parse_src_ipaddr, Box::new(keep), ))) } @@ -142,8 +143,8 @@ impl DispatchFilterBuilder { Ok(Box::new(DispatchFilter::new( ipaddr_container, - Box::new(key_parser_ipv4::parse_dst_ipaddr), - Box::new(key_parser_ipv6::parse_dst_ipaddr), + key_parser_ipv4::parse_dst_ipaddr, + key_parser_ipv6::parse_dst_ipaddr, keep, ))) } @@ -162,8 +163,8 @@ impl DispatchFilterBuilder { Ok(Box::new(DispatchFilter::new( ipaddr_container, - Box::new(key_parser_ipv4::parse_src_dst_ipaddr), - Box::new(key_parser_ipv6::parse_src_dst_ipaddr), + key_parser_ipv4::parse_src_dst_ipaddr, + key_parser_ipv6::parse_src_dst_ipaddr, keep, ))) } @@ -184,8 +185,8 @@ impl DispatchFilterBuilder { Ok(Box::new(DispatchFilter::new( ipaddr_proto_port_container, - Box::new(key_parser_ipv4::parse_src_ipaddr_proto_dst_port), - Box::new(key_parser_ipv6::parse_src_ipaddr_proto_dst_port), + key_parser_ipv4::parse_src_ipaddr_proto_dst_port, + key_parser_ipv6::parse_src_ipaddr_proto_dst_port, keep, ))) } @@ -200,8 +201,8 @@ impl DispatchFilterBuilder { Ok(Box::new(DispatchFilter::new( five_tuple_container, - Box::new(key_parser_ipv4::parse_five_tuple), - Box::new(key_parser_ipv6::parse_five_tuple), + key_parser_ipv4::parse_five_tuple, + key_parser_ipv6::parse_five_tuple, keep, ))) } diff --git a/pcap-rewrite/src/filters/filter_utils.rs b/pcap-rewrite/src/filters/filter_utils.rs index 81c0865..d606043 100644 --- a/pcap-rewrite/src/filters/filter_utils.rs +++ b/pcap-rewrite/src/filters/filter_utils.rs @@ -1,15 +1,20 @@ use log::warn; -use libpcap_tools::{Error,ParseContext}; +use libpcap_tools::{Error, ParseContext}; use pnet_packet::ethernet::{EtherTypes, EthernetPacket}; use pnet_packet::vlan::VlanPacket; use pnet_packet::Packet; use pnet_packet::PrimitiveValues; +/// Function to convert TwoTupleProtoIpid/FiveTuple data to key container +pub type KeyExtractionFn = fn(&ParseContext, &[u8]) -> Result; + pub fn extract_callback_ethernet( ctx: &ParseContext, - get_key_from_ipv4_l3_data: &dyn Fn(&ParseContext, &[u8]) -> Result, - get_key_from_ipv6_l3_data: &dyn Fn(&ParseContext, &[u8]) -> Result, + // get_key_from_ipv4_l3_data: &dyn Fn(&ParseContext, &[u8]) -> Result, + // get_key_from_ipv6_l3_data: &dyn Fn(&ParseContext, &[u8]) -> Result, + get_key_from_ipv4_l3_data: &KeyExtractionFn, + get_key_from_ipv6_l3_data: &KeyExtractionFn, packet_data: &[u8], ) -> Result { let ethernet_packet = EthernetPacket::new(packet_data) @@ -22,8 +27,8 @@ pub fn extract_callback_ethernet( let vlan_packet = VlanPacket::new(ethernet_packet.payload()) .ok_or(Error::Pnet("Expected VLAN packet but could not parse"))?; match vlan_packet.get_ethertype() { - EtherTypes::Ipv4 => (get_key_from_ipv4_l3_data)(ctx,ethernet_packet.payload()), - EtherTypes::Ipv6 => (get_key_from_ipv6_l3_data)(ctx,ethernet_packet.payload()), + EtherTypes::Ipv4 => (get_key_from_ipv4_l3_data)(ctx, ethernet_packet.payload()), + EtherTypes::Ipv6 => (get_key_from_ipv6_l3_data)(ctx, ethernet_packet.payload()), _ => { warn!( "Unimplemented Ethertype in 33024/802.11q: {:?}/{:x}", diff --git a/pcap-rewrite/src/filters/fragmentation/fragmentation_filter.rs b/pcap-rewrite/src/filters/fragmentation/fragmentation_filter.rs index 8204191..cb1bfb0 100644 --- a/pcap-rewrite/src/filters/fragmentation/fragmentation_filter.rs +++ b/pcap-rewrite/src/filters/fragmentation/fragmentation_filter.rs @@ -29,7 +29,7 @@ use super::convert_fn; /// Function to convert TwoTupleProtoIpid/FiveTuple data to key container pub type ConvertFn = Box) -> Container>; /// Function to extract key from data -pub type GetKeyFn = Box Result>; +pub type GetKeyFn = fn(&ParseContext, &[u8]) -> Result; /// Function to keep/drop extract key from container pub type KeepFn = Box Result>; @@ -151,7 +151,7 @@ impl FragmentationFilter { ctx: &ParseContext, packet_data: PacketData<'j>, ) -> FResult, Error> { - let key = match packet_data { + let key: Key = match packet_data { PacketData::L2(data) => { if data.len() < 14 { return Err(Error::DataParser("L2 data too small for ethernet")); @@ -255,8 +255,8 @@ impl FragmentationFilterBuilder { HashSet::new(), Box::new(convert_fn::convert_data_hs_to_src_ipaddrc), ipaddr_container, - Box::new(key_parser_ipv4::parse_src_ipaddr), - Box::new(key_parser_ipv6::parse_src_ipaddr), + key_parser_ipv4::parse_src_ipaddr, + key_parser_ipv6::parse_src_ipaddr, keep, ))) } @@ -274,8 +274,8 @@ impl FragmentationFilterBuilder { HashSet::new(), Box::new(convert_fn::convert_data_hs_to_dst_ipaddrc), ipaddr_container, - Box::new(key_parser_ipv4::parse_dst_ipaddr), - Box::new(key_parser_ipv6::parse_dst_ipaddr), + key_parser_ipv4::parse_dst_ipaddr, + key_parser_ipv6::parse_dst_ipaddr, keep, ))) } @@ -295,8 +295,8 @@ impl FragmentationFilterBuilder { HashSet::new(), Box::new(convert_fn::convert_data_hs_to_src_dst_ipaddrc), ipaddr_container, - Box::new(key_parser_ipv4::parse_src_dst_ipaddr), - Box::new(key_parser_ipv6::parse_src_dst_ipaddr), + key_parser_ipv4::parse_src_dst_ipaddr, + key_parser_ipv6::parse_src_dst_ipaddr, keep, ))) } @@ -317,8 +317,8 @@ impl FragmentationFilterBuilder { HashSet::new(), Box::new(convert_fn::convert_data_hs_to_src_ipaddr_proto_dst_port_container), ipaddr_proto_port_container, - Box::new(key_parser_ipv4::parse_src_ipaddr_proto_dst_port), - Box::new(key_parser_ipv6::parse_src_ipaddr_proto_dst_port), + key_parser_ipv4::parse_src_ipaddr_proto_dst_port, + key_parser_ipv6::parse_src_ipaddr_proto_dst_port, keep, ))) } @@ -347,8 +347,8 @@ impl FragmentationFilterBuilder { HashSet::new(), Box::new(convert_fn::convert_data_hs_to_ctuple), (two_tuple_proto_proto_ipid_c, five_tuple_container), - Box::new(key_parser_ipv4::parse_two_tuple_proto_ipid_five_tuple), - Box::new(key_parser_ipv6::parse_two_tuple_proto_ipid_five_tuple), + key_parser_ipv4::parse_two_tuple_proto_ipid_five_tuple, + key_parser_ipv6::parse_two_tuple_proto_ipid_five_tuple, keep, ))) }