├── .gitignore ├── resources └── netcat_docker_compose.png ├── configurations ├── config_1.toml ├── config_2.toml └── config_3.toml ├── Dockerfile ├── justfile ├── Cargo.toml ├── compose.yaml ├── src ├── main.rs ├── config.rs └── lib.rs ├── README.md └── Cargo.lock /.gitignore: -------------------------------------------------------------------------------- 1 | /target 2 | *.gz 3 | -------------------------------------------------------------------------------- /resources/netcat_docker_compose.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/anirudhsudhir/snoopy/HEAD/resources/netcat_docker_compose.png -------------------------------------------------------------------------------- /configurations/config_1.toml: -------------------------------------------------------------------------------- 1 | [interface] 2 | name = "peer_1" 3 | virtual_address = "10.0.0.2" 4 | virtual_netmask = "255.255.255.0" 5 | endpoint = "peer_1:8080" 6 | 7 | [[peers]] 8 | virtual_address = "10.0.0.3" 9 | endpoint = "peer_2:8080" 10 | 11 | 12 | [[peers]] 13 | virtual_address = "10.0.0.4" 14 | endpoint = "peer_3:8080" 15 | -------------------------------------------------------------------------------- /configurations/config_2.toml: -------------------------------------------------------------------------------- 1 | [interface] 2 | name = "peer_2" 3 | virtual_address = "10.0.0.3" 4 | virtual_netmask = "255.255.255.0" 5 | endpoint = "peer_2:8080" 6 | 7 | [[peers]] 8 | virtual_address = "10.0.0.2" 9 | endpoint = "peer_1:8080" 10 | 11 | 12 | [[peers]] 13 | virtual_address = "10.0.0.4" 14 | endpoint = "peer_3:8080" 15 | -------------------------------------------------------------------------------- /configurations/config_3.toml: -------------------------------------------------------------------------------- 1 | [interface] 2 | name = "peer_3" 3 | virtual_address = "10.0.0.4" 4 | virtual_netmask = "255.255.255.0" 5 | endpoint = "peer_3:8080" 6 | 7 | [[peers]] 8 | virtual_address = "10.0.0.2" 9 | endpoint = "peer_1:8080" 10 | 11 | 12 | [[peers]] 13 | virtual_address = "10.0.0.3" 14 | endpoint = "peer_2:8080" 15 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | # TODO: Build the binary and copy it to a minimal image using a multi-stage build 2 | 3 | FROM alpine 4 | 5 | WORKDIR /usr/app/snoopy 6 | 7 | RUN apk update 8 | RUN apk add netcat-openbsd python3 curl 9 | 10 | COPY target/aarch64-unknown-linux-musl/debug/snoopy . 11 | 12 | ENV LOG_LEVEL=TRACE 13 | CMD ["./snoopy","config.toml"] 14 | -------------------------------------------------------------------------------- /justfile: -------------------------------------------------------------------------------- 1 | default: 2 | just --list 3 | 4 | build-linux-aarch64: 5 | cargo b --target aarch64-unknown-linux-musl 6 | 7 | build-image: build-linux-aarch64 8 | docker build --platform linux/aarch64 -t snoopy_test . 9 | 10 | exec-peer-1: 11 | docker compose exec peer_1 sh 12 | 13 | exec-peer-2: 14 | docker compose exec peer_2 sh 15 | 16 | exec-peer-3: 17 | docker compose exec peer_3 sh 18 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "snoopy" 3 | version = "0.1.0" 4 | edition = "2024" 5 | 6 | [dependencies] 7 | tokio = { version = "1.44.2", features = [ 8 | "rt", 9 | "rt-multi-thread", 10 | "macros", 11 | "net", 12 | ] } 13 | tun = { version = "0.7.13", features = ["async"] } 14 | thiserror = "2.0.12" 15 | tracing = "0.1.41" 16 | tracing-subscriber = { version = "0.3.18", features = ["std", "chrono", "fmt"] } 17 | serde = { version = "1.0.219", features = ["derive"] } 18 | toml = "0.8.20" 19 | etherparse = "0.17.0" 20 | -------------------------------------------------------------------------------- /compose.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | peer_1: 3 | image: snoopy_test 4 | volumes: 5 | - ./configurations/config_1.toml:/usr/app/snoopy/config.toml 6 | cap_add: 7 | - NET_ADMIN 8 | devices: 9 | - /dev/net/tun 10 | 11 | peer_2: 12 | image: snoopy_test 13 | volumes: 14 | - ./configurations/config_2.toml:/usr/app/snoopy/config.toml 15 | cap_add: 16 | - NET_ADMIN 17 | devices: 18 | - /dev/net/tun 19 | 20 | peer_3: 21 | image: snoopy_test 22 | volumes: 23 | - ./configurations/config_3.toml:/usr/app/snoopy/config.toml 24 | cap_add: 25 | - NET_ADMIN 26 | devices: 27 | - /dev/net/tun 28 | -------------------------------------------------------------------------------- /src/main.rs: -------------------------------------------------------------------------------- 1 | use std::env; 2 | 3 | use snoopy::{Device, config}; 4 | 5 | const USAGE: &str = "Usage: ./snoopy [path_to_config]"; 6 | 7 | #[tokio::main] 8 | async fn main() { 9 | println!( 10 | r#" 11 | _________ ____ ____ ____ __ __ 12 | / ___/ __ \/ __ \/ __ \/ __ \/ / / / 13 | (__ ) / / / /_/ / /_/ / /_/ / /_/ / 14 | /____/_/ /_/\____/\____/ .___/\__, / 15 | /_/ /____/ 16 | 17 | A VPN written in Rust 18 | "# 19 | ); 20 | 21 | let mut args = env::args(); 22 | args.next(); 23 | let conf = config::parse_config(&args.next().expect(USAGE)); 24 | 25 | let dev = Device::new(conf).await.unwrap(); 26 | dev.start().await.expect("failed to start the VPN"); 27 | } 28 | -------------------------------------------------------------------------------- /src/config.rs: -------------------------------------------------------------------------------- 1 | // TODO: validate configuration parameters strictly at runtime 2 | 3 | use serde::Deserialize; 4 | 5 | use std::net::IpAddr; 6 | 7 | #[derive(Deserialize, Debug)] 8 | pub struct Config { 9 | pub interface: Interface, 10 | pub peers: Vec, 11 | } 12 | 13 | #[derive(Deserialize, Debug)] 14 | pub struct Interface { 15 | pub name: String, 16 | pub virtual_address: IpAddr, 17 | pub virtual_netmask: IpAddr, 18 | pub endpoint: String, 19 | } 20 | 21 | #[derive(Deserialize, Debug)] 22 | pub struct Peer { 23 | pub virtual_address: IpAddr, 24 | pub endpoint: String, 25 | } 26 | 27 | pub fn parse_config(config_path: &str) -> Config { 28 | let config = std::fs::read_to_string(config_path).expect("failed to read config from file"); 29 | toml::from_str(&config).expect("failed to parse toml from config") 30 | // validate_conf(&mut conf); 31 | // conf 32 | } 33 | 34 | // fn validate_conf(config: &mut Config) -> Result<(), String> { 35 | // Ok(()) 36 | // } 37 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Snoopy 2 | 3 | A VPN written in Rust. 4 | 5 | Inspired by [https://write.yiransheng.com/vpn](https://write.yiransheng.com/vpn) 6 | 7 | --- 8 | 9 | ## Demo - `netcat` between two containers 10 | 11 | #### peer_1 12 | 13 | Virtual Network IP: 10.0.0.2 14 | 15 | #### peer_2 16 | 17 | Virtual Network IP: 10.0.0.3 18 | 19 | ![Netcat between two containers](resources/netcat_docker_compose.png) 20 | 21 | --- 22 | 23 | ## Usage 24 | 25 | 1. Install `just` - [https://just.systems/man/en/](https://just.systems/man/en/) 26 | 27 | 2. Build the binary and image 28 | 29 | ```sh 30 | just build-image 31 | ``` 32 | 33 | 3. Start the peers 34 | 35 | ```sh 36 | docker compose up 37 | ``` 38 | 39 | 4. Exec into the containers from two different terminal sessions 40 | 41 | ```sh 42 | just exec-peer-1 # peer-1 43 | 44 | # another session 45 | just exec-peer-2 # peer-2 46 | ``` 47 | 48 | 5. Use the virtual addresses for communication 49 | 50 | Example: 51 | 52 | ```sh 53 | # peer_1 54 | nc -vl 10.0.0.2 12345 55 | 56 | # from peer_2 57 | nc -v 10.0.0.2 12345 58 | ``` 59 | 60 | 6. Stop the containers 61 | 62 | ```sh 63 | docker compose down 64 | ``` 65 | 66 | --- 67 | 68 | ## Credits 69 | 70 | - [https://github.com/meh/rust-tun/](https://github.com/meh/rust-tun/) 71 | 72 | --- 73 | -------------------------------------------------------------------------------- /src/lib.rs: -------------------------------------------------------------------------------- 1 | pub mod config; 2 | 3 | use etherparse::{NetSlice, SlicedPacket}; 4 | use tokio::net::UdpSocket; 5 | use tracing::{error, trace}; 6 | use tracing_subscriber::{FmtSubscriber, fmt::time}; 7 | use tun::{AsyncDevice, Configuration}; 8 | 9 | use std::{collections::HashMap, env, io, net::IpAddr}; 10 | 11 | pub use config::{Config, Peer}; 12 | 13 | const TUN_PACKET_MTU: u16 = 1472; 14 | 15 | #[derive(Debug, thiserror::Error)] 16 | #[non_exhaustive] 17 | pub enum Error { 18 | #[error("tun error")] 19 | TunError(#[from] tun::Error), 20 | #[error("I/O error")] 21 | IoError(#[from] io::Error), 22 | } 23 | 24 | pub struct Device { 25 | tun_iface: AsyncDevice, 26 | virtual_addr: IpAddr, 27 | endpoint_sock: UdpSocket, 28 | peers: HashMap, 29 | } 30 | 31 | impl Device { 32 | pub async fn new(vpn_config: Config) -> Result { 33 | bootstrap_tracing(); 34 | 35 | let mut config = Configuration::default(); 36 | 37 | config 38 | .address(vpn_config.interface.virtual_address) 39 | .netmask(vpn_config.interface.virtual_netmask) 40 | .up(); 41 | 42 | // network connection might have an mtu of 1500 43 | // the udp header has 28 bytes 44 | // setting packet mtu to 1472 at the tun interface prevents fragmentation in the network 45 | config.mtu(TUN_PACKET_MTU); 46 | 47 | let tun_device = tun::create_as_async(&config).inspect_err(|e| { 48 | error!( 49 | "[Vpn::new] failed to create tun device with addr = {:?} -> {:?}", 50 | vpn_config.interface.virtual_address, e 51 | ) 52 | })?; 53 | 54 | let udp_local_sock = UdpSocket::bind(&vpn_config.interface.endpoint) 55 | .await 56 | .inspect_err(|e| { 57 | error!( 58 | "[Vpn::new] failed to bind to udp send socket to addr = {} -> {:?}", 59 | vpn_config.interface.endpoint, e 60 | ) 61 | })?; 62 | 63 | trace!("[Vpn::new] finished setting up tun interface and UDP endpoint socket"); 64 | 65 | let mut map = HashMap::new(); 66 | for peer in vpn_config.peers { 67 | map.insert(peer.virtual_address, peer.endpoint); 68 | } 69 | 70 | Ok(Device { 71 | tun_iface: tun_device, 72 | virtual_addr: vpn_config.interface.virtual_address, 73 | endpoint_sock: udp_local_sock, 74 | peers: map, 75 | }) 76 | } 77 | 78 | #[warn(unused_parens)] 79 | pub async fn start(&self) -> Result<(), Error> { 80 | trace!("[Vpn::start] listening on the UDP socket and the tun device"); 81 | loop { 82 | let mut udp_buf = [0u8; 1600]; 83 | let mut tun_buf = [0u8; 1600]; 84 | 85 | tokio::select! { 86 | res = self.endpoint_sock.recv_from(&mut udp_buf) => { 87 | let (len, recv_addr) = res.inspect_err(|e| { 88 | error!( 89 | "[Vpn::start] failed to recv from udp recv socket -> {:?}", 90 | e 91 | ) 92 | })?; 93 | 94 | trace!( 95 | "[Vpn::start] received packet at udp socket from {:?}, attempting to forward packet to tun interface = {:?}", 96 | recv_addr, self.virtual_addr 97 | ); 98 | 99 | self.tun_iface.send(&udp_buf[..len]).await.inspect_err(|e| { 100 | error!( 101 | "[Vpn::start] failed to send packet to tun interface = {:?} -> {:?}", 102 | self.virtual_addr, e 103 | ) 104 | })?; 105 | 106 | trace!( 107 | "[Vpn::start] forwarded packet to tun interface = {:?}", 108 | self.virtual_addr 109 | ); 110 | } 111 | 112 | res = self.tun_iface.recv(&mut tun_buf) => { 113 | let len = res.inspect_err(|e| { 114 | error!( 115 | "[Vpn::start] failed to recv from tun interface = {:?} -> {:?}", 116 | self.virtual_addr, e 117 | ) 118 | })?; 119 | 120 | let headers = SlicedPacket::from_ip(&tun_buf).unwrap(); 121 | let dest_ip_addr = match headers.net.unwrap() { 122 | NetSlice::Ipv4(ipv4) => { 123 | trace!("[vpn::start] received Ipv4 packet at tun interface: src addr: {:?}, dst addr: {:?}", ipv4.header().source_addr(), ipv4.header().destination_addr()); 124 | IpAddr::V4(ipv4.header().destination_addr()) 125 | } 126 | NetSlice::Ipv6(ipv6) => { 127 | trace!("[vpn::start] received Ipv6 packet at tun interface: src addr: {:?}, dst addr: {:?}", ipv6.header().source_addr(), ipv6.header().destination_addr()); 128 | continue; 129 | } 130 | NetSlice::Arp(arp) => { 131 | trace!("[vpn::start] received arp packet at tun interface, skipping: {:?}", arp); 132 | continue; 133 | } 134 | }; 135 | 136 | let des_addr = dest_ip_addr.to_string(); 137 | let send_addr = self.peers.get(&dest_ip_addr).unwrap_or(&des_addr); 138 | trace!( 139 | "[Vpn::start] received packet at tun interface, attempting to forward packet to remote udp socket = {:?}", 140 | send_addr 141 | ); 142 | 143 | self.endpoint_sock 144 | .send_to(&tun_buf[..len], send_addr) 145 | .await 146 | .inspect_err(|e| { 147 | error!( 148 | "[Vpn::start] failed to send packet to remote udp socket = {:?} -> {:?}",send_addr, 149 | e 150 | ) 151 | })?; 152 | 153 | trace!( 154 | "[Vpn::start] forwarded packet to remote udp socket = {:?}", 155 | send_addr 156 | ); 157 | } 158 | 159 | } 160 | } 161 | } 162 | } 163 | 164 | fn bootstrap_tracing() { 165 | let logging_level = match env::var("LOG_LEVEL") { 166 | Ok(level) => match level.as_str() { 167 | "TRACE" => tracing::Level::TRACE, 168 | "DEBUG" => tracing::Level::DEBUG, 169 | "INFO" => tracing::Level::INFO, 170 | "WARN" => tracing::Level::WARN, 171 | "ERROR" => tracing::Level::ERROR, 172 | _ => tracing::Level::INFO, 173 | }, 174 | Err(_) => tracing::Level::INFO, 175 | }; 176 | 177 | let subscriber = FmtSubscriber::builder() 178 | .with_max_level(logging_level) 179 | .with_timer(time::ChronoLocal::rfc_3339()) 180 | .with_target(true) 181 | .with_writer(std::io::stderr) 182 | .finish(); 183 | 184 | let _ = tracing::subscriber::set_global_default(subscriber); 185 | } 186 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 4 4 | 5 | [[package]] 6 | name = "addr2line" 7 | version = "0.24.2" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" 10 | dependencies = [ 11 | "gimli", 12 | ] 13 | 14 | [[package]] 15 | name = "adler2" 16 | version = "2.0.0" 17 | source = "registry+https://github.com/rust-lang/crates.io-index" 18 | checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" 19 | 20 | [[package]] 21 | name = "android-tzdata" 22 | version = "0.1.1" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" 25 | 26 | [[package]] 27 | name = "android_system_properties" 28 | version = "0.1.5" 29 | source = "registry+https://github.com/rust-lang/crates.io-index" 30 | checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 31 | dependencies = [ 32 | "libc", 33 | ] 34 | 35 | [[package]] 36 | name = "arrayvec" 37 | version = "0.7.6" 38 | source = "registry+https://github.com/rust-lang/crates.io-index" 39 | checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" 40 | 41 | [[package]] 42 | name = "async-channel" 43 | version = "2.3.1" 44 | source = "registry+https://github.com/rust-lang/crates.io-index" 45 | checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" 46 | dependencies = [ 47 | "concurrent-queue", 48 | "event-listener-strategy", 49 | "futures-core", 50 | "pin-project-lite", 51 | ] 52 | 53 | [[package]] 54 | name = "async-task" 55 | version = "4.7.1" 56 | source = "registry+https://github.com/rust-lang/crates.io-index" 57 | checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" 58 | 59 | [[package]] 60 | name = "atomic-waker" 61 | version = "1.1.2" 62 | source = "registry+https://github.com/rust-lang/crates.io-index" 63 | checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" 64 | 65 | [[package]] 66 | name = "autocfg" 67 | version = "1.4.0" 68 | source = "registry+https://github.com/rust-lang/crates.io-index" 69 | checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" 70 | 71 | [[package]] 72 | name = "backtrace" 73 | version = "0.3.74" 74 | source = "registry+https://github.com/rust-lang/crates.io-index" 75 | checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" 76 | dependencies = [ 77 | "addr2line", 78 | "cfg-if", 79 | "libc", 80 | "miniz_oxide", 81 | "object", 82 | "rustc-demangle", 83 | "windows-targets", 84 | ] 85 | 86 | [[package]] 87 | name = "bitflags" 88 | version = "2.9.0" 89 | source = "registry+https://github.com/rust-lang/crates.io-index" 90 | checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" 91 | 92 | [[package]] 93 | name = "blocking" 94 | version = "1.6.1" 95 | source = "registry+https://github.com/rust-lang/crates.io-index" 96 | checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" 97 | dependencies = [ 98 | "async-channel", 99 | "async-task", 100 | "futures-io", 101 | "futures-lite", 102 | "piper", 103 | ] 104 | 105 | [[package]] 106 | name = "bumpalo" 107 | version = "3.17.0" 108 | source = "registry+https://github.com/rust-lang/crates.io-index" 109 | checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" 110 | 111 | [[package]] 112 | name = "bytes" 113 | version = "1.10.1" 114 | source = "registry+https://github.com/rust-lang/crates.io-index" 115 | checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" 116 | 117 | [[package]] 118 | name = "c2rust-bitfields" 119 | version = "0.19.0" 120 | source = "registry+https://github.com/rust-lang/crates.io-index" 121 | checksum = "367e5d1b30f28be590b6b3868da1578361d29d9bfac516d22f497d28ed7c9055" 122 | dependencies = [ 123 | "c2rust-bitfields-derive", 124 | ] 125 | 126 | [[package]] 127 | name = "c2rust-bitfields-derive" 128 | version = "0.19.0" 129 | source = "registry+https://github.com/rust-lang/crates.io-index" 130 | checksum = "a279db9c50c4024eeca1a763b6e0f033848ce74e83e47454bcf8a8a98f7b0b56" 131 | dependencies = [ 132 | "proc-macro2", 133 | "quote", 134 | "syn 1.0.109", 135 | ] 136 | 137 | [[package]] 138 | name = "cc" 139 | version = "1.2.19" 140 | source = "registry+https://github.com/rust-lang/crates.io-index" 141 | checksum = "8e3a13707ac958681c13b39b458c073d0d9bc8a22cb1b2f4c8e55eb72c13f362" 142 | dependencies = [ 143 | "shlex", 144 | ] 145 | 146 | [[package]] 147 | name = "cfg-if" 148 | version = "1.0.0" 149 | source = "registry+https://github.com/rust-lang/crates.io-index" 150 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 151 | 152 | [[package]] 153 | name = "cfg_aliases" 154 | version = "0.2.1" 155 | source = "registry+https://github.com/rust-lang/crates.io-index" 156 | checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" 157 | 158 | [[package]] 159 | name = "chrono" 160 | version = "0.4.40" 161 | source = "registry+https://github.com/rust-lang/crates.io-index" 162 | checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c" 163 | dependencies = [ 164 | "android-tzdata", 165 | "iana-time-zone", 166 | "num-traits", 167 | "windows-link", 168 | ] 169 | 170 | [[package]] 171 | name = "concurrent-queue" 172 | version = "2.5.0" 173 | source = "registry+https://github.com/rust-lang/crates.io-index" 174 | checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" 175 | dependencies = [ 176 | "crossbeam-utils", 177 | ] 178 | 179 | [[package]] 180 | name = "core-foundation-sys" 181 | version = "0.8.7" 182 | source = "registry+https://github.com/rust-lang/crates.io-index" 183 | checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 184 | 185 | [[package]] 186 | name = "crossbeam-utils" 187 | version = "0.8.21" 188 | source = "registry+https://github.com/rust-lang/crates.io-index" 189 | checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" 190 | 191 | [[package]] 192 | name = "equivalent" 193 | version = "1.0.2" 194 | source = "registry+https://github.com/rust-lang/crates.io-index" 195 | checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" 196 | 197 | [[package]] 198 | name = "etherparse" 199 | version = "0.17.0" 200 | source = "registry+https://github.com/rust-lang/crates.io-index" 201 | checksum = "b14e4ac78394e3ea04edbbc412099cf54f2f52ded51efb79c466a282729399d2" 202 | dependencies = [ 203 | "arrayvec", 204 | ] 205 | 206 | [[package]] 207 | name = "event-listener" 208 | version = "5.4.0" 209 | source = "registry+https://github.com/rust-lang/crates.io-index" 210 | checksum = "3492acde4c3fc54c845eaab3eed8bd00c7a7d881f78bfc801e43a93dec1331ae" 211 | dependencies = [ 212 | "concurrent-queue", 213 | "parking", 214 | "pin-project-lite", 215 | ] 216 | 217 | [[package]] 218 | name = "event-listener-strategy" 219 | version = "0.5.4" 220 | source = "registry+https://github.com/rust-lang/crates.io-index" 221 | checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" 222 | dependencies = [ 223 | "event-listener", 224 | "pin-project-lite", 225 | ] 226 | 227 | [[package]] 228 | name = "fastrand" 229 | version = "2.3.0" 230 | source = "registry+https://github.com/rust-lang/crates.io-index" 231 | checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 232 | 233 | [[package]] 234 | name = "futures" 235 | version = "0.3.31" 236 | source = "registry+https://github.com/rust-lang/crates.io-index" 237 | checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" 238 | dependencies = [ 239 | "futures-channel", 240 | "futures-core", 241 | "futures-executor", 242 | "futures-io", 243 | "futures-sink", 244 | "futures-task", 245 | "futures-util", 246 | ] 247 | 248 | [[package]] 249 | name = "futures-channel" 250 | version = "0.3.31" 251 | source = "registry+https://github.com/rust-lang/crates.io-index" 252 | checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 253 | dependencies = [ 254 | "futures-core", 255 | "futures-sink", 256 | ] 257 | 258 | [[package]] 259 | name = "futures-core" 260 | version = "0.3.31" 261 | source = "registry+https://github.com/rust-lang/crates.io-index" 262 | checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 263 | 264 | [[package]] 265 | name = "futures-executor" 266 | version = "0.3.31" 267 | source = "registry+https://github.com/rust-lang/crates.io-index" 268 | checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" 269 | dependencies = [ 270 | "futures-core", 271 | "futures-task", 272 | "futures-util", 273 | ] 274 | 275 | [[package]] 276 | name = "futures-io" 277 | version = "0.3.31" 278 | source = "registry+https://github.com/rust-lang/crates.io-index" 279 | checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" 280 | 281 | [[package]] 282 | name = "futures-lite" 283 | version = "2.6.0" 284 | source = "registry+https://github.com/rust-lang/crates.io-index" 285 | checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" 286 | dependencies = [ 287 | "futures-core", 288 | "pin-project-lite", 289 | ] 290 | 291 | [[package]] 292 | name = "futures-macro" 293 | version = "0.3.31" 294 | source = "registry+https://github.com/rust-lang/crates.io-index" 295 | checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" 296 | dependencies = [ 297 | "proc-macro2", 298 | "quote", 299 | "syn 2.0.100", 300 | ] 301 | 302 | [[package]] 303 | name = "futures-sink" 304 | version = "0.3.31" 305 | source = "registry+https://github.com/rust-lang/crates.io-index" 306 | checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" 307 | 308 | [[package]] 309 | name = "futures-task" 310 | version = "0.3.31" 311 | source = "registry+https://github.com/rust-lang/crates.io-index" 312 | checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 313 | 314 | [[package]] 315 | name = "futures-util" 316 | version = "0.3.31" 317 | source = "registry+https://github.com/rust-lang/crates.io-index" 318 | checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 319 | dependencies = [ 320 | "futures-channel", 321 | "futures-core", 322 | "futures-io", 323 | "futures-macro", 324 | "futures-sink", 325 | "futures-task", 326 | "memchr", 327 | "pin-project-lite", 328 | "pin-utils", 329 | "slab", 330 | ] 331 | 332 | [[package]] 333 | name = "gimli" 334 | version = "0.31.1" 335 | source = "registry+https://github.com/rust-lang/crates.io-index" 336 | checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" 337 | 338 | [[package]] 339 | name = "hashbrown" 340 | version = "0.15.2" 341 | source = "registry+https://github.com/rust-lang/crates.io-index" 342 | checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" 343 | 344 | [[package]] 345 | name = "iana-time-zone" 346 | version = "0.1.63" 347 | source = "registry+https://github.com/rust-lang/crates.io-index" 348 | checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" 349 | dependencies = [ 350 | "android_system_properties", 351 | "core-foundation-sys", 352 | "iana-time-zone-haiku", 353 | "js-sys", 354 | "log", 355 | "wasm-bindgen", 356 | "windows-core", 357 | ] 358 | 359 | [[package]] 360 | name = "iana-time-zone-haiku" 361 | version = "0.1.2" 362 | source = "registry+https://github.com/rust-lang/crates.io-index" 363 | checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" 364 | dependencies = [ 365 | "cc", 366 | ] 367 | 368 | [[package]] 369 | name = "indexmap" 370 | version = "2.9.0" 371 | source = "registry+https://github.com/rust-lang/crates.io-index" 372 | checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" 373 | dependencies = [ 374 | "equivalent", 375 | "hashbrown", 376 | ] 377 | 378 | [[package]] 379 | name = "ipnet" 380 | version = "2.11.0" 381 | source = "registry+https://github.com/rust-lang/crates.io-index" 382 | checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" 383 | 384 | [[package]] 385 | name = "js-sys" 386 | version = "0.3.77" 387 | source = "registry+https://github.com/rust-lang/crates.io-index" 388 | checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" 389 | dependencies = [ 390 | "once_cell", 391 | "wasm-bindgen", 392 | ] 393 | 394 | [[package]] 395 | name = "lazy_static" 396 | version = "1.5.0" 397 | source = "registry+https://github.com/rust-lang/crates.io-index" 398 | checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 399 | 400 | [[package]] 401 | name = "libc" 402 | version = "0.2.172" 403 | source = "registry+https://github.com/rust-lang/crates.io-index" 404 | checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" 405 | 406 | [[package]] 407 | name = "libloading" 408 | version = "0.8.6" 409 | source = "registry+https://github.com/rust-lang/crates.io-index" 410 | checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" 411 | dependencies = [ 412 | "cfg-if", 413 | "windows-targets", 414 | ] 415 | 416 | [[package]] 417 | name = "log" 418 | version = "0.4.27" 419 | source = "registry+https://github.com/rust-lang/crates.io-index" 420 | checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" 421 | 422 | [[package]] 423 | name = "memchr" 424 | version = "2.7.4" 425 | source = "registry+https://github.com/rust-lang/crates.io-index" 426 | checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 427 | 428 | [[package]] 429 | name = "miniz_oxide" 430 | version = "0.8.8" 431 | source = "registry+https://github.com/rust-lang/crates.io-index" 432 | checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" 433 | dependencies = [ 434 | "adler2", 435 | ] 436 | 437 | [[package]] 438 | name = "mio" 439 | version = "1.0.3" 440 | source = "registry+https://github.com/rust-lang/crates.io-index" 441 | checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" 442 | dependencies = [ 443 | "libc", 444 | "wasi", 445 | "windows-sys 0.52.0", 446 | ] 447 | 448 | [[package]] 449 | name = "nix" 450 | version = "0.29.0" 451 | source = "registry+https://github.com/rust-lang/crates.io-index" 452 | checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" 453 | dependencies = [ 454 | "bitflags", 455 | "cfg-if", 456 | "cfg_aliases", 457 | "libc", 458 | ] 459 | 460 | [[package]] 461 | name = "nu-ansi-term" 462 | version = "0.46.0" 463 | source = "registry+https://github.com/rust-lang/crates.io-index" 464 | checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" 465 | dependencies = [ 466 | "overload", 467 | "winapi", 468 | ] 469 | 470 | [[package]] 471 | name = "num-traits" 472 | version = "0.2.19" 473 | source = "registry+https://github.com/rust-lang/crates.io-index" 474 | checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 475 | dependencies = [ 476 | "autocfg", 477 | ] 478 | 479 | [[package]] 480 | name = "object" 481 | version = "0.36.7" 482 | source = "registry+https://github.com/rust-lang/crates.io-index" 483 | checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" 484 | dependencies = [ 485 | "memchr", 486 | ] 487 | 488 | [[package]] 489 | name = "once_cell" 490 | version = "1.21.3" 491 | source = "registry+https://github.com/rust-lang/crates.io-index" 492 | checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" 493 | 494 | [[package]] 495 | name = "overload" 496 | version = "0.1.1" 497 | source = "registry+https://github.com/rust-lang/crates.io-index" 498 | checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" 499 | 500 | [[package]] 501 | name = "parking" 502 | version = "2.2.1" 503 | source = "registry+https://github.com/rust-lang/crates.io-index" 504 | checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" 505 | 506 | [[package]] 507 | name = "pin-project-lite" 508 | version = "0.2.16" 509 | source = "registry+https://github.com/rust-lang/crates.io-index" 510 | checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 511 | 512 | [[package]] 513 | name = "pin-utils" 514 | version = "0.1.0" 515 | source = "registry+https://github.com/rust-lang/crates.io-index" 516 | checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 517 | 518 | [[package]] 519 | name = "piper" 520 | version = "0.2.4" 521 | source = "registry+https://github.com/rust-lang/crates.io-index" 522 | checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" 523 | dependencies = [ 524 | "atomic-waker", 525 | "fastrand", 526 | "futures-io", 527 | ] 528 | 529 | [[package]] 530 | name = "proc-macro2" 531 | version = "1.0.95" 532 | source = "registry+https://github.com/rust-lang/crates.io-index" 533 | checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" 534 | dependencies = [ 535 | "unicode-ident", 536 | ] 537 | 538 | [[package]] 539 | name = "quote" 540 | version = "1.0.40" 541 | source = "registry+https://github.com/rust-lang/crates.io-index" 542 | checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" 543 | dependencies = [ 544 | "proc-macro2", 545 | ] 546 | 547 | [[package]] 548 | name = "rustc-demangle" 549 | version = "0.1.24" 550 | source = "registry+https://github.com/rust-lang/crates.io-index" 551 | checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" 552 | 553 | [[package]] 554 | name = "rustversion" 555 | version = "1.0.20" 556 | source = "registry+https://github.com/rust-lang/crates.io-index" 557 | checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" 558 | 559 | [[package]] 560 | name = "serde" 561 | version = "1.0.219" 562 | source = "registry+https://github.com/rust-lang/crates.io-index" 563 | checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" 564 | dependencies = [ 565 | "serde_derive", 566 | ] 567 | 568 | [[package]] 569 | name = "serde_derive" 570 | version = "1.0.219" 571 | source = "registry+https://github.com/rust-lang/crates.io-index" 572 | checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" 573 | dependencies = [ 574 | "proc-macro2", 575 | "quote", 576 | "syn 2.0.100", 577 | ] 578 | 579 | [[package]] 580 | name = "serde_spanned" 581 | version = "0.6.8" 582 | source = "registry+https://github.com/rust-lang/crates.io-index" 583 | checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" 584 | dependencies = [ 585 | "serde", 586 | ] 587 | 588 | [[package]] 589 | name = "sharded-slab" 590 | version = "0.1.7" 591 | source = "registry+https://github.com/rust-lang/crates.io-index" 592 | checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" 593 | dependencies = [ 594 | "lazy_static", 595 | ] 596 | 597 | [[package]] 598 | name = "shlex" 599 | version = "1.3.0" 600 | source = "registry+https://github.com/rust-lang/crates.io-index" 601 | checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 602 | 603 | [[package]] 604 | name = "slab" 605 | version = "0.4.9" 606 | source = "registry+https://github.com/rust-lang/crates.io-index" 607 | checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 608 | dependencies = [ 609 | "autocfg", 610 | ] 611 | 612 | [[package]] 613 | name = "smallvec" 614 | version = "1.15.0" 615 | source = "registry+https://github.com/rust-lang/crates.io-index" 616 | checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" 617 | 618 | [[package]] 619 | name = "snoopy" 620 | version = "0.1.0" 621 | dependencies = [ 622 | "etherparse", 623 | "serde", 624 | "thiserror", 625 | "tokio", 626 | "toml", 627 | "tracing", 628 | "tracing-subscriber", 629 | "tun", 630 | ] 631 | 632 | [[package]] 633 | name = "socket2" 634 | version = "0.5.9" 635 | source = "registry+https://github.com/rust-lang/crates.io-index" 636 | checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" 637 | dependencies = [ 638 | "libc", 639 | "windows-sys 0.52.0", 640 | ] 641 | 642 | [[package]] 643 | name = "syn" 644 | version = "1.0.109" 645 | source = "registry+https://github.com/rust-lang/crates.io-index" 646 | checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 647 | dependencies = [ 648 | "proc-macro2", 649 | "quote", 650 | "unicode-ident", 651 | ] 652 | 653 | [[package]] 654 | name = "syn" 655 | version = "2.0.100" 656 | source = "registry+https://github.com/rust-lang/crates.io-index" 657 | checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" 658 | dependencies = [ 659 | "proc-macro2", 660 | "quote", 661 | "unicode-ident", 662 | ] 663 | 664 | [[package]] 665 | name = "thiserror" 666 | version = "2.0.12" 667 | source = "registry+https://github.com/rust-lang/crates.io-index" 668 | checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" 669 | dependencies = [ 670 | "thiserror-impl", 671 | ] 672 | 673 | [[package]] 674 | name = "thiserror-impl" 675 | version = "2.0.12" 676 | source = "registry+https://github.com/rust-lang/crates.io-index" 677 | checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" 678 | dependencies = [ 679 | "proc-macro2", 680 | "quote", 681 | "syn 2.0.100", 682 | ] 683 | 684 | [[package]] 685 | name = "thread_local" 686 | version = "1.1.8" 687 | source = "registry+https://github.com/rust-lang/crates.io-index" 688 | checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" 689 | dependencies = [ 690 | "cfg-if", 691 | "once_cell", 692 | ] 693 | 694 | [[package]] 695 | name = "tokio" 696 | version = "1.44.2" 697 | source = "registry+https://github.com/rust-lang/crates.io-index" 698 | checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48" 699 | dependencies = [ 700 | "backtrace", 701 | "bytes", 702 | "libc", 703 | "mio", 704 | "pin-project-lite", 705 | "socket2", 706 | "tokio-macros", 707 | "windows-sys 0.52.0", 708 | ] 709 | 710 | [[package]] 711 | name = "tokio-macros" 712 | version = "2.5.0" 713 | source = "registry+https://github.com/rust-lang/crates.io-index" 714 | checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" 715 | dependencies = [ 716 | "proc-macro2", 717 | "quote", 718 | "syn 2.0.100", 719 | ] 720 | 721 | [[package]] 722 | name = "tokio-util" 723 | version = "0.7.14" 724 | source = "registry+https://github.com/rust-lang/crates.io-index" 725 | checksum = "6b9590b93e6fcc1739458317cccd391ad3955e2bde8913edf6f95f9e65a8f034" 726 | dependencies = [ 727 | "bytes", 728 | "futures-core", 729 | "futures-sink", 730 | "pin-project-lite", 731 | "tokio", 732 | ] 733 | 734 | [[package]] 735 | name = "toml" 736 | version = "0.8.20" 737 | source = "registry+https://github.com/rust-lang/crates.io-index" 738 | checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148" 739 | dependencies = [ 740 | "serde", 741 | "serde_spanned", 742 | "toml_datetime", 743 | "toml_edit", 744 | ] 745 | 746 | [[package]] 747 | name = "toml_datetime" 748 | version = "0.6.8" 749 | source = "registry+https://github.com/rust-lang/crates.io-index" 750 | checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" 751 | dependencies = [ 752 | "serde", 753 | ] 754 | 755 | [[package]] 756 | name = "toml_edit" 757 | version = "0.22.24" 758 | source = "registry+https://github.com/rust-lang/crates.io-index" 759 | checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" 760 | dependencies = [ 761 | "indexmap", 762 | "serde", 763 | "serde_spanned", 764 | "toml_datetime", 765 | "winnow", 766 | ] 767 | 768 | [[package]] 769 | name = "tracing" 770 | version = "0.1.41" 771 | source = "registry+https://github.com/rust-lang/crates.io-index" 772 | checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" 773 | dependencies = [ 774 | "pin-project-lite", 775 | "tracing-attributes", 776 | "tracing-core", 777 | ] 778 | 779 | [[package]] 780 | name = "tracing-attributes" 781 | version = "0.1.28" 782 | source = "registry+https://github.com/rust-lang/crates.io-index" 783 | checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" 784 | dependencies = [ 785 | "proc-macro2", 786 | "quote", 787 | "syn 2.0.100", 788 | ] 789 | 790 | [[package]] 791 | name = "tracing-core" 792 | version = "0.1.33" 793 | source = "registry+https://github.com/rust-lang/crates.io-index" 794 | checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" 795 | dependencies = [ 796 | "once_cell", 797 | "valuable", 798 | ] 799 | 800 | [[package]] 801 | name = "tracing-log" 802 | version = "0.2.0" 803 | source = "registry+https://github.com/rust-lang/crates.io-index" 804 | checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" 805 | dependencies = [ 806 | "log", 807 | "once_cell", 808 | "tracing-core", 809 | ] 810 | 811 | [[package]] 812 | name = "tracing-subscriber" 813 | version = "0.3.19" 814 | source = "registry+https://github.com/rust-lang/crates.io-index" 815 | checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" 816 | dependencies = [ 817 | "chrono", 818 | "nu-ansi-term", 819 | "sharded-slab", 820 | "smallvec", 821 | "thread_local", 822 | "tracing-core", 823 | "tracing-log", 824 | ] 825 | 826 | [[package]] 827 | name = "tun" 828 | version = "0.7.18" 829 | source = "registry+https://github.com/rust-lang/crates.io-index" 830 | checksum = "caaf6aa0a713f0e3b20157f6048d113b6256c045e0e2d80734d54cf1c72dc24a" 831 | dependencies = [ 832 | "bytes", 833 | "cfg-if", 834 | "futures", 835 | "futures-core", 836 | "ipnet", 837 | "libc", 838 | "log", 839 | "nix", 840 | "thiserror", 841 | "tokio", 842 | "tokio-util", 843 | "windows-sys 0.59.0", 844 | "wintun-bindings", 845 | ] 846 | 847 | [[package]] 848 | name = "unicode-ident" 849 | version = "1.0.18" 850 | source = "registry+https://github.com/rust-lang/crates.io-index" 851 | checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" 852 | 853 | [[package]] 854 | name = "valuable" 855 | version = "0.1.1" 856 | source = "registry+https://github.com/rust-lang/crates.io-index" 857 | checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" 858 | 859 | [[package]] 860 | name = "wasi" 861 | version = "0.11.0+wasi-snapshot-preview1" 862 | source = "registry+https://github.com/rust-lang/crates.io-index" 863 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 864 | 865 | [[package]] 866 | name = "wasm-bindgen" 867 | version = "0.2.100" 868 | source = "registry+https://github.com/rust-lang/crates.io-index" 869 | checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" 870 | dependencies = [ 871 | "cfg-if", 872 | "once_cell", 873 | "rustversion", 874 | "wasm-bindgen-macro", 875 | ] 876 | 877 | [[package]] 878 | name = "wasm-bindgen-backend" 879 | version = "0.2.100" 880 | source = "registry+https://github.com/rust-lang/crates.io-index" 881 | checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" 882 | dependencies = [ 883 | "bumpalo", 884 | "log", 885 | "proc-macro2", 886 | "quote", 887 | "syn 2.0.100", 888 | "wasm-bindgen-shared", 889 | ] 890 | 891 | [[package]] 892 | name = "wasm-bindgen-macro" 893 | version = "0.2.100" 894 | source = "registry+https://github.com/rust-lang/crates.io-index" 895 | checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" 896 | dependencies = [ 897 | "quote", 898 | "wasm-bindgen-macro-support", 899 | ] 900 | 901 | [[package]] 902 | name = "wasm-bindgen-macro-support" 903 | version = "0.2.100" 904 | source = "registry+https://github.com/rust-lang/crates.io-index" 905 | checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" 906 | dependencies = [ 907 | "proc-macro2", 908 | "quote", 909 | "syn 2.0.100", 910 | "wasm-bindgen-backend", 911 | "wasm-bindgen-shared", 912 | ] 913 | 914 | [[package]] 915 | name = "wasm-bindgen-shared" 916 | version = "0.2.100" 917 | source = "registry+https://github.com/rust-lang/crates.io-index" 918 | checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" 919 | dependencies = [ 920 | "unicode-ident", 921 | ] 922 | 923 | [[package]] 924 | name = "winapi" 925 | version = "0.3.9" 926 | source = "registry+https://github.com/rust-lang/crates.io-index" 927 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 928 | dependencies = [ 929 | "winapi-i686-pc-windows-gnu", 930 | "winapi-x86_64-pc-windows-gnu", 931 | ] 932 | 933 | [[package]] 934 | name = "winapi-i686-pc-windows-gnu" 935 | version = "0.4.0" 936 | source = "registry+https://github.com/rust-lang/crates.io-index" 937 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 938 | 939 | [[package]] 940 | name = "winapi-x86_64-pc-windows-gnu" 941 | version = "0.4.0" 942 | source = "registry+https://github.com/rust-lang/crates.io-index" 943 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 944 | 945 | [[package]] 946 | name = "windows-core" 947 | version = "0.61.0" 948 | source = "registry+https://github.com/rust-lang/crates.io-index" 949 | checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980" 950 | dependencies = [ 951 | "windows-implement", 952 | "windows-interface", 953 | "windows-link", 954 | "windows-result", 955 | "windows-strings", 956 | ] 957 | 958 | [[package]] 959 | name = "windows-implement" 960 | version = "0.60.0" 961 | source = "registry+https://github.com/rust-lang/crates.io-index" 962 | checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" 963 | dependencies = [ 964 | "proc-macro2", 965 | "quote", 966 | "syn 2.0.100", 967 | ] 968 | 969 | [[package]] 970 | name = "windows-interface" 971 | version = "0.59.1" 972 | source = "registry+https://github.com/rust-lang/crates.io-index" 973 | checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" 974 | dependencies = [ 975 | "proc-macro2", 976 | "quote", 977 | "syn 2.0.100", 978 | ] 979 | 980 | [[package]] 981 | name = "windows-link" 982 | version = "0.1.1" 983 | source = "registry+https://github.com/rust-lang/crates.io-index" 984 | checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" 985 | 986 | [[package]] 987 | name = "windows-result" 988 | version = "0.3.2" 989 | source = "registry+https://github.com/rust-lang/crates.io-index" 990 | checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" 991 | dependencies = [ 992 | "windows-link", 993 | ] 994 | 995 | [[package]] 996 | name = "windows-strings" 997 | version = "0.4.0" 998 | source = "registry+https://github.com/rust-lang/crates.io-index" 999 | checksum = "7a2ba9642430ee452d5a7aa78d72907ebe8cfda358e8cb7918a2050581322f97" 1000 | dependencies = [ 1001 | "windows-link", 1002 | ] 1003 | 1004 | [[package]] 1005 | name = "windows-sys" 1006 | version = "0.52.0" 1007 | source = "registry+https://github.com/rust-lang/crates.io-index" 1008 | checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 1009 | dependencies = [ 1010 | "windows-targets", 1011 | ] 1012 | 1013 | [[package]] 1014 | name = "windows-sys" 1015 | version = "0.59.0" 1016 | source = "registry+https://github.com/rust-lang/crates.io-index" 1017 | checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 1018 | dependencies = [ 1019 | "windows-targets", 1020 | ] 1021 | 1022 | [[package]] 1023 | name = "windows-targets" 1024 | version = "0.52.6" 1025 | source = "registry+https://github.com/rust-lang/crates.io-index" 1026 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 1027 | dependencies = [ 1028 | "windows_aarch64_gnullvm", 1029 | "windows_aarch64_msvc", 1030 | "windows_i686_gnu", 1031 | "windows_i686_gnullvm", 1032 | "windows_i686_msvc", 1033 | "windows_x86_64_gnu", 1034 | "windows_x86_64_gnullvm", 1035 | "windows_x86_64_msvc", 1036 | ] 1037 | 1038 | [[package]] 1039 | name = "windows_aarch64_gnullvm" 1040 | version = "0.52.6" 1041 | source = "registry+https://github.com/rust-lang/crates.io-index" 1042 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 1043 | 1044 | [[package]] 1045 | name = "windows_aarch64_msvc" 1046 | version = "0.52.6" 1047 | source = "registry+https://github.com/rust-lang/crates.io-index" 1048 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 1049 | 1050 | [[package]] 1051 | name = "windows_i686_gnu" 1052 | version = "0.52.6" 1053 | source = "registry+https://github.com/rust-lang/crates.io-index" 1054 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 1055 | 1056 | [[package]] 1057 | name = "windows_i686_gnullvm" 1058 | version = "0.52.6" 1059 | source = "registry+https://github.com/rust-lang/crates.io-index" 1060 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 1061 | 1062 | [[package]] 1063 | name = "windows_i686_msvc" 1064 | version = "0.52.6" 1065 | source = "registry+https://github.com/rust-lang/crates.io-index" 1066 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 1067 | 1068 | [[package]] 1069 | name = "windows_x86_64_gnu" 1070 | version = "0.52.6" 1071 | source = "registry+https://github.com/rust-lang/crates.io-index" 1072 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 1073 | 1074 | [[package]] 1075 | name = "windows_x86_64_gnullvm" 1076 | version = "0.52.6" 1077 | source = "registry+https://github.com/rust-lang/crates.io-index" 1078 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 1079 | 1080 | [[package]] 1081 | name = "windows_x86_64_msvc" 1082 | version = "0.52.6" 1083 | source = "registry+https://github.com/rust-lang/crates.io-index" 1084 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 1085 | 1086 | [[package]] 1087 | name = "winnow" 1088 | version = "0.7.6" 1089 | source = "registry+https://github.com/rust-lang/crates.io-index" 1090 | checksum = "63d3fcd9bba44b03821e7d699eeee959f3126dcc4aa8e4ae18ec617c2a5cea10" 1091 | dependencies = [ 1092 | "memchr", 1093 | ] 1094 | 1095 | [[package]] 1096 | name = "winreg" 1097 | version = "0.55.0" 1098 | source = "registry+https://github.com/rust-lang/crates.io-index" 1099 | checksum = "cb5a765337c50e9ec252c2069be9bf91c7df47afb103b642ba3a53bf8101be97" 1100 | dependencies = [ 1101 | "cfg-if", 1102 | "windows-sys 0.59.0", 1103 | ] 1104 | 1105 | [[package]] 1106 | name = "wintun-bindings" 1107 | version = "0.7.31" 1108 | source = "registry+https://github.com/rust-lang/crates.io-index" 1109 | checksum = "605f50b13e12e1f9f99dc5e93701d779dbe47282fec186cb8a079165368d3124" 1110 | dependencies = [ 1111 | "blocking", 1112 | "c2rust-bitfields", 1113 | "futures", 1114 | "libloading", 1115 | "log", 1116 | "thiserror", 1117 | "windows-sys 0.59.0", 1118 | "winreg", 1119 | ] 1120 | --------------------------------------------------------------------------------