use pnet::datalink::{Channel, NetworkInterface};
use tokio::sync::mpsc;
use tokio::sync::mpsc::{Receiver, Sender};
use bytes;
use nom::HexDisplay;
pub fn raw_interface(name: &str, ipv6_filter: bool) -> (NetworkInterface, Sender<bytes::Bytes>, Receiver<bytes::Bytes>) {
let interfaces = pnet::datalink::interfaces();
let interface = interfaces
.into_iter()
.find(|iface| iface.name == name.to_string())
.unwrap();
let (mut sender, mut receiver) =
match pnet::datalink::channel(&interface, Default::default()) {
Ok(Channel::Ethernet(tx, rx)) => (tx, rx),
Ok(_) => panic!("Unknown channel type"),
Err(e) => panic!("Error happened {}", e),
};
let (tx1, rx) = mpsc::channel::<bytes::Bytes>(10000);
let (tx, mut rx2) = mpsc::channel::<bytes::Bytes>(10000);
tokio::task::spawn_blocking(move || {
loop {
let packet = match receiver.next() {
Ok(packet) => {
if ipv6_filter && packet[12..14] == [0x86, 0xdd] {
trace!("[filter ipv6 packet]\n{}", packet.to_hex(16));
continue
}
packet
},
Err(e) => {
println!("ERROR: raw_interface: {:?}", e);
break;
}
};
let data = bytes::Bytes::copy_from_slice(packet);
match tx1.blocking_send(data) {
Ok(_) => continue,
Err(_) => break
}
}
});
tokio::task::spawn_blocking(move || {
loop {
let packet = match rx2.blocking_recv() {
Some(packet) => packet,
None => break
};
let _ = sender.send_to(&packet[..], None);
}
});
(interface, tx, rx)
}