lk-inside 0.3.1

A terminal user interface (TUI) application for interactive data analysis.
Documentation
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(_) => {
            // Silently ignore non-ethernet interfaces
            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() {
                    // If the receiver is dropped, the channel is closed.
                    // This is our signal to stop capturing.
                    break;
                }
            }
            Err(e) => {
                eprintln!("[{}]: Packet read error: {}. Stopping capture.", interface.name, e);
                break;
            }
        }
    }
}