libtun 0.1.0

a cross-platform(macosx, linux) tunnel library
Documentation
use crate::*;
use ipnet::IpNet;

#[test]
fn test() {
  async_std::task::block_on(async {
    if let Err(e) = it_works().await {
      eprintln!("ERROR: {}", e);
    };
  })
}

use std::net::IpAddr;

async fn it_works() -> Result<()> {
  let ipnet = "192.168.11.1/24".parse::<IpNet>().context(ParseAddrFail)?;
  let tun = Systun::from_ipnet(&ipnet).await?;
  nettool::icmp::send_ping(ipnet.addr()).await.unwrap();
  let mut reader = tun.reader();
  let mut pkt = reader.read().await?;
  assert_eq!(pkt.source_addr(), "192.168.11.0".parse::<IpAddr>().unwrap());
  assert_eq!(pkt.dest_addr(), ipnet.addr());
  assert_eq!(pkt.version(), 4);
  assert_eq!(pkt.ihl(), 5);
  assert_eq!(pkt.type_of_service(), 0);
  assert_eq!(pkt.total_length(), 52);
  assert_eq!(pkt.flags(), 0);
  assert_eq!(pkt.ttl(), 64);
  assert_eq!(pkt.protocol(), 1); // ICMP
  assert_eq!(pkt.checksum(), pkt.cal_checksum());
  let mut icmp = protocol::icmp::from(pkt.payload_mut());
  assert_eq!(icmp.typ(), 8);
  let echo = icmp.echo();
  let echo_data = echo.data();
  for i in 0..echo_data.len() {
    assert_eq!(i as u8, echo_data[i]);
  }
  assert_eq!(echo.checksum(), echo.cal_checksum());
  Ok(())
}