these changes don't work correctly

This commit is contained in:
2026-03-02 22:13:17 +07:00
parent b6381b8b7b
commit 1f247073ca
13 changed files with 994 additions and 11 deletions
Generated
+399 -3
View File
@@ -96,6 +96,30 @@ version = "1.0.101"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5f0e0fee31ef5ed1ba1316088939cea399010ed7731dba877ed44aeb407a75ea" checksum = "5f0e0fee31ef5ed1ba1316088939cea399010ed7731dba877ed44aeb407a75ea"
[[package]]
name = "async-channel"
version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2"
dependencies = [
"concurrent-queue",
"event-listener-strategy",
"futures-core",
"pin-project-lite",
]
[[package]]
name = "async-task"
version = "4.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de"
[[package]]
name = "atomic-waker"
version = "1.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
[[package]] [[package]]
name = "bitflags" name = "bitflags"
version = "1.3.2" version = "1.3.2"
@@ -117,6 +141,19 @@ dependencies = [
"generic-array", "generic-array",
] ]
[[package]]
name = "blocking"
version = "1.6.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21"
dependencies = [
"async-channel",
"async-task",
"futures-io",
"futures-lite",
"piper",
]
[[package]] [[package]]
name = "byteorder" name = "byteorder"
version = "1.5.0" version = "1.5.0"
@@ -129,6 +166,26 @@ version = "1.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33"
[[package]]
name = "c2rust-bitfields"
version = "0.21.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dcee50917f9de1a018e3f4f9a8f2ff3d030a288cffa4b18d9b391e97c12e4cfb"
dependencies = [
"c2rust-bitfields-derive",
]
[[package]]
name = "c2rust-bitfields-derive"
version = "0.21.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3b457277798202ccd365b9c112ebee08ddd57f1033916c8b8ea52f222e5b715d"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]] [[package]]
name = "cesu8" name = "cesu8"
version = "1.1.0" version = "1.1.0"
@@ -141,6 +198,12 @@ version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
[[package]]
name = "cfg_aliases"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
[[package]] [[package]]
name = "chacha20" name = "chacha20"
version = "0.9.1" version = "0.9.1"
@@ -243,6 +306,15 @@ dependencies = [
"memchr", "memchr",
] ]
[[package]]
name = "concurrent-queue"
version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973"
dependencies = [
"crossbeam-utils",
]
[[package]] [[package]]
name = "cpufeatures" name = "cpufeatures"
version = "0.2.17" version = "0.2.17"
@@ -261,6 +333,12 @@ dependencies = [
"libc", "libc",
] ]
[[package]]
name = "crossbeam-utils"
version = "0.8.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
[[package]] [[package]]
name = "crypto-common" name = "crypto-common"
version = "0.1.7" version = "0.1.7"
@@ -335,6 +413,33 @@ dependencies = [
"windows-sys 0.61.2", "windows-sys 0.61.2",
] ]
[[package]]
name = "event-listener"
version = "5.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab"
dependencies = [
"concurrent-queue",
"parking",
"pin-project-lite",
]
[[package]]
name = "event-listener-strategy"
version = "0.5.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93"
dependencies = [
"event-listener",
"pin-project-lite",
]
[[package]]
name = "fastrand"
version = "2.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be"
[[package]] [[package]]
name = "fiat-crypto" name = "fiat-crypto"
version = "0.2.9" version = "0.2.9"
@@ -347,6 +452,104 @@ version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
[[package]]
name = "futures"
version = "0.3.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d"
dependencies = [
"futures-channel",
"futures-core",
"futures-executor",
"futures-io",
"futures-sink",
"futures-task",
"futures-util",
]
[[package]]
name = "futures-channel"
version = "0.3.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d"
dependencies = [
"futures-core",
"futures-sink",
]
[[package]]
name = "futures-core"
version = "0.3.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d"
[[package]]
name = "futures-executor"
version = "0.3.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d"
dependencies = [
"futures-core",
"futures-task",
"futures-util",
]
[[package]]
name = "futures-io"
version = "0.3.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718"
[[package]]
name = "futures-lite"
version = "2.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad"
dependencies = [
"futures-core",
"pin-project-lite",
]
[[package]]
name = "futures-macro"
version = "0.3.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "futures-sink"
version = "0.3.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893"
[[package]]
name = "futures-task"
version = "0.3.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393"
[[package]]
name = "futures-util"
version = "0.3.32"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6"
dependencies = [
"futures-channel",
"futures-core",
"futures-io",
"futures-macro",
"futures-sink",
"futures-task",
"memchr",
"pin-project-lite",
"slab",
]
[[package]] [[package]]
name = "generic-array" name = "generic-array"
version = "0.14.7" version = "0.14.7"
@@ -473,6 +676,12 @@ dependencies = [
"generic-array", "generic-array",
] ]
[[package]]
name = "ipnet"
version = "2.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130"
[[package]] [[package]]
name = "is_terminal_polyfill" name = "is_terminal_polyfill"
version = "1.70.2" version = "1.70.2"
@@ -496,7 +705,7 @@ dependencies = [
"combine", "combine",
"jni-sys", "jni-sys",
"log", "log",
"thiserror", "thiserror 1.0.69",
"walkdir", "walkdir",
"windows-sys 0.45.0", "windows-sys 0.45.0",
] ]
@@ -525,6 +734,16 @@ version = "0.2.182"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112" checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112"
[[package]]
name = "libloading"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "754ca22de805bb5744484a5b151a9e1a8e837d5dc232c2d7d8c2e3492edc8b60"
dependencies = [
"cfg-if",
"windows-link",
]
[[package]] [[package]]
name = "lock_api" name = "lock_api"
version = "0.4.14" version = "0.4.14"
@@ -577,11 +796,17 @@ name = "netrunner-client"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"android_logger", "android_logger",
"bytes",
"jni", "jni",
"lazy_static",
"libc",
"log", "log",
"netrunner-common", "netrunner-common",
"smoltcp", "smoltcp",
"tokio", "tokio",
"tracing",
"tracing-subscriber",
"tun",
] ]
[[package]] [[package]]
@@ -611,6 +836,18 @@ dependencies = [
"tokio", "tokio",
] ]
[[package]]
name = "nix"
version = "0.30.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6"
dependencies = [
"bitflags 2.11.0",
"cfg-if",
"cfg_aliases",
"libc",
]
[[package]] [[package]]
name = "nu-ansi-term" name = "nu-ansi-term"
version = "0.50.3" version = "0.50.3"
@@ -638,6 +875,12 @@ version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381"
[[package]]
name = "parking"
version = "2.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba"
[[package]] [[package]]
name = "parking_lot" name = "parking_lot"
version = "0.12.5" version = "0.12.5"
@@ -667,6 +910,17 @@ version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b"
[[package]]
name = "piper"
version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1"
dependencies = [
"atomic-waker",
"fastrand",
"futures-io",
]
[[package]] [[package]]
name = "poly1305" name = "poly1305"
version = "0.8.0" version = "0.8.0"
@@ -879,6 +1133,12 @@ dependencies = [
"libc", "libc",
] ]
[[package]]
name = "slab"
version = "0.4.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5"
[[package]] [[package]]
name = "smallvec" name = "smallvec"
version = "1.15.1" version = "1.15.1"
@@ -943,7 +1203,16 @@ version = "1.0.69"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52"
dependencies = [ dependencies = [
"thiserror-impl", "thiserror-impl 1.0.69",
]
[[package]]
name = "thiserror"
version = "2.0.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4"
dependencies = [
"thiserror-impl 2.0.18",
] ]
[[package]] [[package]]
@@ -957,6 +1226,17 @@ dependencies = [
"syn", "syn",
] ]
[[package]]
name = "thiserror-impl"
version = "2.0.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]] [[package]]
name = "thread_local" name = "thread_local"
version = "1.1.9" version = "1.1.9"
@@ -1055,6 +1335,23 @@ dependencies = [
"tracing-log", "tracing-log",
] ]
[[package]]
name = "tun"
version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b35f176015650e3bd849e85808d809e5b54da2ba7df983c5c3b601a2a8f1095e"
dependencies = [
"bytes",
"cfg-if",
"ipnet",
"libc",
"log",
"nix",
"thiserror 2.0.18",
"windows-sys 0.61.2",
"wintun-bindings",
]
[[package]] [[package]]
name = "typenum" name = "typenum"
version = "1.19.0" version = "1.19.0"
@@ -1193,6 +1490,15 @@ dependencies = [
"windows-targets 0.42.2", "windows-targets 0.42.2",
] ]
[[package]]
name = "windows-sys"
version = "0.59.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
dependencies = [
"windows-targets 0.52.6",
]
[[package]] [[package]]
name = "windows-sys" name = "windows-sys"
version = "0.60.2" version = "0.60.2"
@@ -1226,6 +1532,22 @@ dependencies = [
"windows_x86_64_msvc 0.42.2", "windows_x86_64_msvc 0.42.2",
] ]
[[package]]
name = "windows-targets"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
dependencies = [
"windows_aarch64_gnullvm 0.52.6",
"windows_aarch64_msvc 0.52.6",
"windows_i686_gnu 0.52.6",
"windows_i686_gnullvm 0.52.6",
"windows_i686_msvc 0.52.6",
"windows_x86_64_gnu 0.52.6",
"windows_x86_64_gnullvm 0.52.6",
"windows_x86_64_msvc 0.52.6",
]
[[package]] [[package]]
name = "windows-targets" name = "windows-targets"
version = "0.53.5" version = "0.53.5"
@@ -1236,7 +1558,7 @@ dependencies = [
"windows_aarch64_gnullvm 0.53.1", "windows_aarch64_gnullvm 0.53.1",
"windows_aarch64_msvc 0.53.1", "windows_aarch64_msvc 0.53.1",
"windows_i686_gnu 0.53.1", "windows_i686_gnu 0.53.1",
"windows_i686_gnullvm", "windows_i686_gnullvm 0.53.1",
"windows_i686_msvc 0.53.1", "windows_i686_msvc 0.53.1",
"windows_x86_64_gnu 0.53.1", "windows_x86_64_gnu 0.53.1",
"windows_x86_64_gnullvm 0.53.1", "windows_x86_64_gnullvm 0.53.1",
@@ -1249,6 +1571,12 @@ version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8"
[[package]]
name = "windows_aarch64_gnullvm"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
[[package]] [[package]]
name = "windows_aarch64_gnullvm" name = "windows_aarch64_gnullvm"
version = "0.53.1" version = "0.53.1"
@@ -1261,6 +1589,12 @@ version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43"
[[package]]
name = "windows_aarch64_msvc"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
[[package]] [[package]]
name = "windows_aarch64_msvc" name = "windows_aarch64_msvc"
version = "0.53.1" version = "0.53.1"
@@ -1273,12 +1607,24 @@ version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f"
[[package]]
name = "windows_i686_gnu"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
[[package]] [[package]]
name = "windows_i686_gnu" name = "windows_i686_gnu"
version = "0.53.1" version = "0.53.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3"
[[package]]
name = "windows_i686_gnullvm"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
[[package]] [[package]]
name = "windows_i686_gnullvm" name = "windows_i686_gnullvm"
version = "0.53.1" version = "0.53.1"
@@ -1291,6 +1637,12 @@ version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060"
[[package]]
name = "windows_i686_msvc"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
[[package]] [[package]]
name = "windows_i686_msvc" name = "windows_i686_msvc"
version = "0.53.1" version = "0.53.1"
@@ -1303,6 +1655,12 @@ version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36"
[[package]]
name = "windows_x86_64_gnu"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
[[package]] [[package]]
name = "windows_x86_64_gnu" name = "windows_x86_64_gnu"
version = "0.53.1" version = "0.53.1"
@@ -1315,6 +1673,12 @@ version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3"
[[package]]
name = "windows_x86_64_gnullvm"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
[[package]] [[package]]
name = "windows_x86_64_gnullvm" name = "windows_x86_64_gnullvm"
version = "0.53.1" version = "0.53.1"
@@ -1327,12 +1691,44 @@ version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0"
[[package]]
name = "windows_x86_64_msvc"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
[[package]] [[package]]
name = "windows_x86_64_msvc" name = "windows_x86_64_msvc"
version = "0.53.1" version = "0.53.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650"
[[package]]
name = "winreg"
version = "0.55.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cb5a765337c50e9ec252c2069be9bf91c7df47afb103b642ba3a53bf8101be97"
dependencies = [
"cfg-if",
"windows-sys 0.59.0",
]
[[package]]
name = "wintun-bindings"
version = "0.7.34"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "27ae04d34b8569174e849128d2e36538329a27daa79c06ed0375f2c5d6704461"
dependencies = [
"blocking",
"c2rust-bitfields",
"futures",
"libloading",
"log",
"thiserror 2.0.18",
"windows-sys 0.61.2",
"winreg",
]
[[package]] [[package]]
name = "wit-bindgen" name = "wit-bindgen"
version = "0.51.0" version = "0.51.0"
+6
View File
@@ -15,5 +15,11 @@ netrunner-common = { path = "../common" } # Наша общая либа
smoltcp = { version = "0.12.0", default-features = false, features = ["medium-ip", "proto-ipv4", "socket-tcp"] } smoltcp = { version = "0.12.0", default-features = false, features = ["medium-ip", "proto-ipv4", "socket-tcp"] }
tokio = { version = "1.36", features = ["full"] } tokio = { version = "1.36", features = ["full"] }
jni = "0.21" jni = "0.21"
bytes = "1.5"
android_logger = "0.13" android_logger = "0.13"
log = "0.4" log = "0.4"
tun = "0.8.5"
lazy_static = "1.4.0"
libc = "0.2.182"
tracing = "0.1"
tracing-subscriber = { version = "0.3", features = ["env-filter", "fmt"] }
+2
View File
@@ -0,0 +1,2 @@
pub mod stack;
pub mod tun;
+67 -1
View File
@@ -1 +1,67 @@
fn main() {} mod stack;
mod tun;
use netrunner_common::{
logger_init, proxy::connection::connection::ConnectionRole, proxy::network::Network,
};
use stack::interface::NetStack;
use tracing::{error, info};
use tun::{desktop::create_linux_tun, device::TunDevice};
#[tokio::main]
async fn main() {
// 1. Инициализация логов
logger_init();
info!("Starting NetRunner VPN Bridge...");
// 2. Настройка физического уровня (TUN)
let tun_dev = create_linux_tun();
let my_phy = TunDevice::new(tun_dev, 1500);
// 3. Создаем объект Network
let net = Network::new(8080, ConnectionRole::Client, Some("0.0.0.0:4443".into()));
// 4. Инициализируем ЕДИНЫЙ туннель для всего приложения.
// Этот метод внутри создает TLS-подключение, Muxer и запускает TunnelEngine.
info!("Initializing global TLS tunnel to proxy...");
let muxer = match net.initialize_client_tunnel().await {
Ok(m) => m,
Err(e) => {
error!("Failed to initialize global tunnel: {}", e);
return;
}
};
// 5. Создаем стек, передавая ему РАБОЧИЙ муксер.
// Теперь данные из TUN будут уходить в реальный TLS-туннель.
let mut stack = NetStack::new(my_phy, muxer.clone());
// 6. Запускаем SOCKS-сервер (Network), чтобы он слушал порт 8080
// и использовал тот же самый муксер для обычных прокси-запросов.
let net_handle = {
let muxer_for_net = muxer.clone();
tokio::spawn(async move {
info!("SOCKS5 server starting on 127.0.0.1:8080");
net.run_with_muxer(muxer_for_net).await;
})
};
info!("VPN BRIDGE IS RUNNING");
// 7. Запускаем цикл обработки стека (блокирующий поток)
let stack_loop = tokio::task::spawn_blocking(move || loop {
stack.poll();
});
// Ждем завершения (по сути бесконечно)
tokio::select! {
res = stack_loop => {
if let Err(e) = res {
error!("Stack loop panicked: {:?}", e);
}
}
_ = net_handle => {
error!("Network server stopped unexpectedly");
}
}
}
+353
View File
@@ -0,0 +1,353 @@
use bytes::{Bytes, BytesMut};
use netrunner_common::protocol::codec::frame::FrameType;
use netrunner_common::protocol::codec::socks::{SocksReply, SocksRequest};
use netrunner_common::protocol::parser::parser::Parser;
use netrunner_common::proxy::connection::muxer::{MuxMessage, Muxer};
use smoltcp::iface::{Config, Interface, SocketHandle, SocketSet, SocketStorage};
use smoltcp::socket::tcp::{Socket as SmolTcpSocket, SocketBuffer};
use smoltcp::socket::AnySocket;
use smoltcp::time::Instant;
use smoltcp::wire::IpListenEndpoint;
use std::collections::HashMap;
use std::os::unix::io::AsRawFd;
use tracing::{debug, info, trace};
pub enum BridgeState {
WaitingHandshake,
WaitingConnect,
DataTransferring {
tx_to_muxer: tokio::sync::mpsc::Sender<MuxMessage>,
stream_id: u32,
},
}
pub struct NetStack<D: smoltcp::phy::Device + AsRawFd + 'static> {
interface: Interface,
device: &'static mut D,
sockets: SocketSet<'static>,
socket_buffers: HashMap<SocketHandle, BytesMut>,
bridges: HashMap<SocketHandle, BridgeState>,
muxer: Muxer,
outbound_rx: tokio::sync::mpsc::UnboundedReceiver<(SocketHandle, Bytes)>,
outbound_tx: tokio::sync::mpsc::UnboundedSender<(SocketHandle, Bytes)>,
}
lazy_static::lazy_static! {
static ref START_TIME: std::time::Instant = std::time::Instant::now();
}
fn _current_smoltcp_time() -> Instant {
let nanos = START_TIME.elapsed().as_micros() as i64;
smoltcp::time::Instant::from_micros(nanos)
}
impl<D: smoltcp::phy::Device + AsRawFd> NetStack<D> {
pub fn new(device_obj: D, muxer: Muxer) -> Self {
let now = _current_smoltcp_time();
let device: &'static mut D = Box::leak(Box::new(device_obj));
let config = Config::new(smoltcp::wire::HardwareAddress::Ip);
let mut interface = Interface::new(config, device, now);
interface.set_any_ip(true);
interface.update_ip_addrs(|addrs| {
addrs
.push(smoltcp::wire::IpCidr::new(
smoltcp::wire::IpAddress::v4(10, 0, 0, 2),
24,
))
.unwrap();
});
interface
.routes_mut()
.add_default_ipv4_route(smoltcp::wire::Ipv4Address::new(10, 0, 0, 1))
.unwrap();
let rx_data = Box::leak(vec![0u8; 4096].into_boxed_slice());
let tx_data = Box::leak(vec![0u8; 4096].into_boxed_slice());
let mut socket = SmolTcpSocket::new(SocketBuffer::new(rx_data), SocketBuffer::new(tx_data));
// 4. Теперь listen() сработает, так как у интерфейса есть адрес!
let endpoint = IpListenEndpoint {
addr: None, // ВАЖНО: Принимаем пакеты для ЛЮБОГО IP назначения
port: 443, // Для HTTPS
};
socket.listen(endpoint).unwrap();
let storage: Vec<SocketStorage> = (0..16).map(|_| SocketStorage::EMPTY).collect();
let mut sockets = SocketSet::new(Box::leak(storage.into_boxed_slice()));
sockets.add(socket);
let (outbound_tx, outbound_rx) = tokio::sync::mpsc::unbounded_channel();
Self {
interface,
device,
sockets,
socket_buffers: HashMap::new(),
bridges: HashMap::new(),
muxer,
outbound_rx,
outbound_tx,
}
}
fn drive_interface(&mut self, timestamp: Instant) {
match self
.interface
.poll(timestamp, self.device, &mut self.sockets)
{
smoltcp::iface::PollResult::None => {}
res => debug!("Interface activity: {:?}", res),
}
let delay = self
.interface
.poll_delay(timestamp, &self.sockets)
.map(|d| d.total_millis() as i32)
.unwrap_or(10);
let raw_fd = self.device.as_raw_fd();
let mut fds = [libc::pollfd {
fd: raw_fd,
events: libc::POLLIN, // Ждем данные на вход
revents: 0,
}];
unsafe {
libc::poll(fds.as_mut_ptr(), 1, delay);
}
}
fn manage_socket_lifecycle(&mut self) {
for (_, any_socket) in self.sockets.iter_mut() {
let socket = SmolTcpSocket::downcast_mut(any_socket).unwrap();
// Если сокет закрылся или "отвисел" в TimeWait, возвращаем его в Listen
if !socket.is_active() && !socket.is_listening() {
let endpoint = IpListenEndpoint {
addr: None,
port: 443,
};
socket.listen(endpoint).unwrap();
println!("DEBUG: Сокет готов к новому соединению");
}
}
}
fn process_socks_logic(&mut self, handle: SocketHandle) {
let buf = self.socket_buffers.get_mut(&handle).unwrap();
let state = self
.bridges
.entry(handle)
.or_insert(BridgeState::WaitingHandshake);
trace!(handle = ?handle, buf_len = buf.len(), "Processing SOCKS logic");
match state {
BridgeState::WaitingHandshake => {
if let Ok(Some(SocksRequest::Handshake { .. })) = SocksRequest::parse(buf) {
let mut reply = BytesMut::with_capacity(2);
SocksReply::HandshakeSelect { method: 0x00 }.write_to(&mut reply);
let socket = self.sockets.get_mut::<SmolTcpSocket>(handle);
socket.send_slice(&reply).unwrap();
*state = BridgeState::WaitingConnect;
return; // <--- ВАЖНО: Выходим, чтобы smoltcp отправил этот пакет отдельно
}
}
BridgeState::WaitingConnect => {
// 1. Парсим запрос (парсер должен сам отрезать байты через advance/split_to)
if let Ok(Some(SocksRequest::Connect { target, .. })) = SocksRequest::parse(buf) {
let stream_id = self.muxer.next_id();
let target_str = target.to_string();
info!(handle = ?handle, target = %target_str, stream_id, "SOCKS5 Connect request");
let (v_tx, mut v_rx) = tokio::sync::mpsc::channel::<Bytes>(1024);
// 2. Пытаемся зарегистрировать стрим СИНХРОННО
// Это гарантирует, что Muxer узнает об ID до того, как придет ответ из сети
if self.muxer.try_register_stream(stream_id, v_tx.clone()) {
debug!(stream_id, "Stream registered synchronously via try_write");
// Сразу шлем Connect в сеть
let _ = self.muxer.to_network.try_send(MuxMessage {
stream_id,
frame_type: FrameType::Connect,
data: Bytes::from(target_str),
});
} else {
// ПЛАН Б: Если лок занят, спавним асинхронную задачу.
// ВАЖНО: Мы НЕ шлем Connect здесь, его пришлет сама задача ПОСЛЕ регистрации.
let muxer_clone = self.muxer.clone();
let target_bytes = Bytes::from(target_str);
let v_tx_clone = v_tx.clone();
tokio::spawn(async move {
muxer_clone.register_stream(stream_id, v_tx_clone).await;
let _ = muxer_clone
.to_network
.send(MuxMessage {
stream_id,
frame_type: FrameType::Connect,
data: target_bytes,
})
.await;
debug!(
stream_id,
"Stream registered asynchronously (lock was busy)"
);
});
}
// 3. Запускаем задачу проброса данных из сети в smoltcp
let outbound_tx = self.outbound_tx.clone();
let handle_clone = handle;
tokio::spawn(async move {
while let Some(data) = v_rx.recv().await {
if outbound_tx.send((handle_clone, data)).is_err() {
break;
}
}
});
buf.clear();
// 4. Отвечаем клиенту (curl)
let mut reply = BytesMut::new();
SocksReply::ConnectResult {
reply_code: 0x00,
atyp: 0x01,
addr: [0, 0, 0, 0],
port: 0,
}
.write_to(&mut reply);
let socket = self.sockets.get_mut::<SmolTcpSocket>(handle);
socket
.send_slice(&reply)
.expect("Failed to send SOCKS reply");
// ПЕРЕХОД
*state = BridgeState::DataTransferring {
tx_to_muxer: self.muxer.to_network.clone(),
stream_id,
};
return;
}
}
BridgeState::DataTransferring {
tx_to_muxer,
stream_id,
} => {
if !buf.is_empty() {
// Забираем все накопленные данные из буфера
let data = buf.split().freeze();
trace!(handle = ?handle, stream_id = *stream_id, bytes = data.len(), "Forwarding data smoltcp -> muxer");
// Отправляем в Muxer
let _ = tx_to_muxer.try_send(MuxMessage {
stream_id: *stream_id,
frame_type: FrameType::Data,
data,
});
}
}
}
}
fn process_payloads(&mut self) {
let handles: Vec<_> = self.sockets.iter().map(|(h, _)| h).collect();
for handle in handles {
let socket = self.sockets.get_mut::<SmolTcpSocket>(handle);
// 1. СОСТОЯНИЕ: Соединение только что установилось
if socket.is_active() && !self.bridges.contains_key(&handle) {
if let Some(target) = socket.local_endpoint() {
let stream_id = self.muxer.next_id();
info!("TUN Intercept: Auto-initiating SOCKS for target {}", target);
// ВАЖНО: Мы САМИ инициируем процесс для локального прокси
// Регистрируем стрим в муксере
let (v_tx, mut v_rx) = tokio::sync::mpsc::channel::<Bytes>(1024);
self.muxer.try_register_stream(stream_id, v_tx);
// Шлем CONNECT (твой муксер/прокси поймет это как SOCKS-запрос)
let _ = self.muxer.to_network.try_send(MuxMessage {
stream_id,
frame_type: FrameType::Connect,
data: Bytes::from(target.to_string()),
});
// Запускаем стандартную задачу проброса данных ИЗ сети в smoltcp
let outbound_tx = self.outbound_tx.clone();
tokio::spawn(async move {
while let Some(data) = v_rx.recv().await {
let _ = outbound_tx.send((handle, data));
}
});
// Переходим сразу в режим передачи данных
// Теперь всё, что пришлет Firefox, мы будем просто гнать в Muxer как FrameType::Data
self.bridges.insert(
handle,
BridgeState::DataTransferring {
stream_id,
tx_to_muxer: self.muxer.to_network.clone(),
},
);
continue;
}
}
// 2. СОСТОЯНИЕ: Передача данных (DataTransferring)
if let Some(BridgeState::DataTransferring {
stream_id,
tx_to_muxer,
}) = self.bridges.get(&handle)
{
if socket.can_recv() {
let mut temp_buf = vec![0u8; 2048];
if let Ok(size) = socket.recv_slice(&mut temp_buf) {
// Это РЕАЛЬНЫЕ данные от Firefox (например, TLS Client Hello)
// Мы их просто оборачиваем в твой протокол и шлем в муксер
let _ = tx_to_muxer.try_send(MuxMessage {
stream_id: *stream_id,
frame_type: FrameType::Data,
data: Bytes::copy_from_slice(&temp_buf[..size]),
});
}
}
}
}
}
pub fn poll(&mut self) {
let timestamp = _current_smoltcp_time();
self.drive_interface(timestamp);
self.process_payloads();
while let Ok((handle, data)) = self.outbound_rx.try_recv() {
if let Some(socket_state) = self.bridges.get(&handle) {
// ПИШЕМ ТОЛЬКО ЕСЛИ МЫ УЖЕ В DATA TRANSFER
if let BridgeState::DataTransferring { .. } = socket_state {
if self.sockets.iter().any(|(h, _)| h == handle) {
let socket = self.sockets.get_mut::<SmolTcpSocket>(handle);
if socket.can_send() {
debug!(handle = ?handle, len = data.len(), head = ?&data[..std::cmp::min(data.len(), 10)], "Writing to curl");
let _ = socket.send_slice(&data);
}
}
} else {
// Если мы еще в WaitingConnect, возвращаем данные в очередь
// или просто игнорируем (они придут следующим тиком)
debug!(handle = ?handle, "Data arrived before SOCKS handshake finished, delaying...");
// Можно использовать self.outbound_tx.send(...) чтобы вернуть в хвост
}
}
}
self.manage_socket_lifecycle();
}
}
+1
View File
@@ -0,0 +1 @@
pub mod interface;
+14
View File
@@ -0,0 +1,14 @@
use tun::Device;
pub fn create_linux_tun() -> Device {
let mut config = tun::Configuration::default();
config
.tun_name("netr0")
.address((10, 0, 0, 1)) // IP нашего "моста"
.netmask((255, 255, 255, 0)) // Маска подсети
.up(); // Сразу включаем интерфейс
// Это создаст в системе интерфейс tun0
let dev = tun::create(&config).expect("Нужны права root или CAP_NET_ADMIN!");
dev
}
+105
View File
@@ -0,0 +1,105 @@
use bytes::{Bytes, BytesMut};
use smoltcp::phy::{ChecksumCapabilities, Device, DeviceCapabilities, Medium, RxToken, TxToken};
use std::io::{Read, Write};
use std::os::fd::RawFd;
use std::os::unix::io::AsRawFd;
pub struct TunDevice<T: Read + Write + AsRawFd> {
pub io: T, // Сюда мы запихнем или File (Android) или Tun-либу
mtu: usize,
read_buffer: BytesMut,
}
impl<T: Read + Write + AsRawFd> TunDevice<T> {
pub fn new(io: T, mtu: usize) -> Self {
let fd = io.as_raw_fd();
unsafe {
let flags = libc::fcntl(fd, libc::F_GETFL);
if flags == -1 {
panic!("Не удалось получить флаги файла");
}
libc::fcntl(fd, libc::F_SETFL, flags | libc::O_NONBLOCK);
}
Self {
io,
mtu,
read_buffer: BytesMut::with_capacity(mtu),
}
}
}
impl<T: Read + Write + AsRawFd> Device for TunDevice<T> {
type RxToken<'a>
= TunRxToken
where
Self: 'a;
type TxToken<'a>
= TunTxToken<'a, T>
where
Self: 'a;
fn capabilities(&self) -> DeviceCapabilities {
let mut caps = DeviceCapabilities::default();
caps.medium = Medium::Ip;
caps.max_transmission_unit = self.mtu;
caps.checksum = ChecksumCapabilities::ignored();
caps
}
fn receive(
&mut self,
_timestamp: smoltcp::time::Instant,
) -> Option<(Self::RxToken<'_>, Self::TxToken<'_>)> {
let mut tmp_buf = [0u8; 2048];
match self.io.read(&mut tmp_buf) {
Ok(n) if n > 0 => {
let rx_data = Bytes::copy_from_slice(&tmp_buf[..n]);
let rx = TunRxToken { buffer: rx_data };
let tx = TunTxToken { io: &mut self.io };
Some((rx, tx))
}
_ => None,
}
}
fn transmit(&mut self, _timestamp: smoltcp::time::Instant) -> Option<Self::TxToken<'_>> {
Some(TunTxToken { io: &mut self.io })
}
}
pub struct TunRxToken {
buffer: Bytes,
}
impl RxToken for TunRxToken {
fn consume<R, F>(mut self, f: F) -> R
where
F: FnOnce(&[u8]) -> R,
{
f(&mut self.buffer)
}
}
pub struct TunTxToken<'a, T: Write> {
io: &'a mut T,
}
impl<'a, T: Write> TxToken for TunTxToken<'a, T> {
fn consume<R, F>(self, len: usize, f: F) -> R
where
F: FnOnce(&mut [u8]) -> R,
{
// ПРЯМАЯ ЗАПИСЬ БЕЗ ДОБАВЛЕНИЯ PI-ЗАГОЛОВКА
let mut buffer = vec![0u8; len];
let result = f(&mut buffer);
let _ = self.io.write_all(&buffer);
result
}
}
impl<T: Read + Write + AsRawFd> AsRawFd for TunDevice<T> {
fn as_raw_fd(&self) -> RawFd {
self.io.as_raw_fd()
}
}
+2
View File
@@ -0,0 +1,2 @@
pub mod desktop;
pub mod device;
+3 -3
View File
@@ -1,8 +1,8 @@
pub mod crypto; mod crypto;
mod logger; mod logger;
pub mod protocol; pub mod protocol;
pub mod proxy; pub mod proxy;
pub mod tlseng; mod tlseng;
pub mod utils; mod utils;
pub use logger::logger_init; pub use logger::logger_init;
+11
View File
@@ -106,7 +106,18 @@ impl SocksReply {
impl SocksTarget { impl SocksTarget {
pub fn to_string(&self) -> String { pub fn to_string(&self) -> String {
if self.host.len() == 4 {
// Похоже на IPv4
let ip =
std::net::Ipv4Addr::new(self.host[0], self.host[1], self.host[2], self.host[3]);
format!("{}:{}", ip, self.port)
} else if self.host.len() == 16 {
// Похоже на IPv6
format!("[...]:{}", self.port)
} else {
// Считаем, что это домен (текст)
let host_str = String::from_utf8_lossy(&self.host); let host_str = String::from_utf8_lossy(&self.host);
format!("{}:{}", host_str, self.port) format!("{}:{}", host_str, self.port)
} }
} }
}
+11
View File
@@ -50,6 +50,17 @@ impl Muxer {
self.id_gen.next() self.id_gen.next()
} }
pub fn try_register_stream(&self, id: u32, tx: tokio::sync::mpsc::Sender<Bytes>) -> bool {
// 1. Исправлено имя поля: streams вместо active_streams
// 2. Добавлена аннотация типа для guard, чтобы Rust понимал, что внутри HashMap
if let Ok(mut guard) = self.streams.try_write() {
let guard: &mut HashMap<u32, Sender<Bytes>> = &mut *guard;
guard.insert(id, tx);
true
} else {
false
}
}
pub async fn register_stream(&self, stream_id: u32, tx: Sender<Bytes>) { pub async fn register_stream(&self, stream_id: u32, tx: Sender<Bytes>) {
let mut lock = self.streams.write().await; let mut lock = self.streams.write().await;
lock.insert(stream_id, tx); lock.insert(stream_id, tx);
+17 -1
View File
@@ -29,6 +29,22 @@ impl Network {
} }
} }
pub async fn run_with_muxer(&self, muxer: Muxer) {
let addr = format!("127.0.0.1:{}", self.port);
let listener = TcpListener::bind(&addr).await.expect("SOCKS bind failed");
info!(socks_addr = %addr, "SOCKS5 server listener started");
loop {
if let Ok((stream, client_addr)) = listener.accept().await {
let current_muxer = muxer.clone();
tokio::spawn(async move {
let connection = Connection::new(stream, client_addr, false);
let _ = connection.handle_socks_client(current_muxer).await;
});
}
}
}
// Добавляем инструмент, чтобы видеть параметры запуска сети в логах // Добавляем инструмент, чтобы видеть параметры запуска сети в логах
#[instrument(skip(self), fields(role = ?self.role, port = self.port))] #[instrument(skip(self), fields(role = ?self.role, port = self.port))]
pub async fn run(&self) { pub async fn run(&self) {
@@ -84,7 +100,7 @@ impl Network {
} }
/// Вспомогательный метод для Клиента: создает TLS туннель и запускает TunnelEngine /// Вспомогательный метод для Клиента: создает TLS туннель и запускает TunnelEngine
async fn initialize_client_tunnel(&self) -> Result<Muxer, String> { pub async fn initialize_client_tunnel(&self) -> Result<Muxer, String> {
let server_addr = self.remote_proxy_addr.as_ref().ok_or("No proxy addr")?; let server_addr = self.remote_proxy_addr.as_ref().ok_or("No proxy addr")?;
// Вместо создания Connection (который нужен для обработки клиентов), // Вместо создания Connection (который нужен для обработки клиентов),