use pnet::datalink;
use crossbeam_channel::Sender;
use crate::parser::{parse_packet, ParsedPacket};
pub fn capture_packets(interface: datalink::NetworkInterface, sender: Sender<ParsedPacket>) {
let (_, mut rx) = match datalink::channel(&interface, Default::default()) {
Ok(pnet::datalink::Channel::Ethernet(tx, rx)) => (tx, rx),
Ok(_) => {
return;
},
Err(e) => {
eprintln!("[{}]: Error creating channel: {}. Skipping.", interface.name, e);
return;
}
};
loop {
match rx.next() {
Ok(packet) => {
let parsed_packet = parse_packet(interface.name.clone(), packet);
if sender.send(parsed_packet).is_err() {
break;
}
}
Err(e) => {
eprintln!("[{}]: Packet read error: {}. Stopping capture.", interface.name, e);
break;
}
}
}
}