use riptun::{Result, TokioTun};
use std::io::ErrorKind;
use std::sync::Arc;
const NUM_QUEUES: usize = 5;
#[tokio::main]
pub async fn main() -> Result<()> {
let async_dev = TokioTun::new("rip%d", NUM_QUEUES)?;
println!("[INFO] => Created new virtual device: {}", async_dev.name());
let mut handles = Vec::with_capacity(NUM_QUEUES);
let async_dev = Arc::new(async_dev);
for queue in 0..NUM_QUEUES {
let handle_dev = async_dev.clone();
let handle = tokio::spawn(async move {
let mut buffer: [u8; 1500] = [0x00; 1500];
loop {
let read = match handle_dev.recv_via(queue, &mut buffer).await {
Ok(read) => read,
Err(err) if err.kind() == ErrorKind::WouldBlock => continue,
Err(err) => {
println!("[ERROR][Queue: {:?}] => {}", queue, err);
continue;
}
};
println!(
"[INFO][Queue: {}] => Packet data ({}B): {:?}",
queue,
read,
&buffer[..read]
);
}
});
handles.push(handle);
}
futures_util::future::join_all(handles).await;
Ok(())
}