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