Commit 67667c4d authored by nanamicat's avatar nanamicat

rust-next

parent f5ffc9fe
Pipeline #41918 passed with stages
in 1 minute and 13 seconds
...@@ -2,15 +2,6 @@ ...@@ -2,15 +2,6 @@
# It is not intended for manual editing. # It is not intended for manual editing.
version = 4 version = 4
[[package]]
name = "aho-corasick"
version = "1.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
dependencies = [
"memchr",
]
[[package]] [[package]]
name = "async-channel" name = "async-channel"
version = "2.3.1" version = "2.3.1"
...@@ -35,12 +26,6 @@ version = "1.1.2" ...@@ -35,12 +26,6 @@ version = "1.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
[[package]]
name = "autocfg"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26"
[[package]] [[package]]
name = "base64" name = "base64"
version = "0.22.1" version = "0.22.1"
...@@ -49,9 +34,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" ...@@ -49,9 +34,9 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6"
[[package]] [[package]]
name = "bitflags" name = "bitflags"
version = "2.6.0" version = "2.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3"
[[package]] [[package]]
name = "blocking" name = "blocking"
...@@ -68,24 +53,24 @@ dependencies = [ ...@@ -68,24 +53,24 @@ dependencies = [
[[package]] [[package]]
name = "bytes" name = "bytes"
version = "1.9.0" version = "1.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3"
[[package]] [[package]]
name = "c2rust-bitfields" name = "c2rust-bitfields"
version = "0.19.0" version = "0.20.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "367e5d1b30f28be590b6b3868da1578361d29d9bfac516d22f497d28ed7c9055" checksum = "46dc7d2bffa0d0b3d47eb2dc69973466858281446c2ac9f6d8a10e92ab1017df"
dependencies = [ dependencies = [
"c2rust-bitfields-derive", "c2rust-bitfields-derive",
] ]
[[package]] [[package]]
name = "c2rust-bitfields-derive" name = "c2rust-bitfields-derive"
version = "0.19.0" version = "0.20.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a279db9c50c4024eeca1a763b6e0f033848ce74e83e47454bcf8a8a98f7b0b56" checksum = "ebe1117afa5937ce280034e31fa1e84ed1824a252f75380327eed438535333f8"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
...@@ -94,9 +79,9 @@ dependencies = [ ...@@ -94,9 +79,9 @@ dependencies = [
[[package]] [[package]]
name = "cfg-if" name = "cfg-if"
version = "1.0.0" 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 = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
[[package]] [[package]]
name = "cfg_aliases" name = "cfg_aliases"
...@@ -165,9 +150,9 @@ dependencies = [ ...@@ -165,9 +150,9 @@ dependencies = [
[[package]] [[package]]
name = "crossbeam-utils" name = "crossbeam-utils"
version = "0.8.20" version = "0.8.21"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
[[package]] [[package]]
name = "event-listener" name = "event-listener"
...@@ -262,7 +247,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" ...@@ -262,7 +247,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.90", "syn 2.0.111",
] ]
[[package]] [[package]]
...@@ -295,32 +280,11 @@ dependencies = [ ...@@ -295,32 +280,11 @@ dependencies = [
"slab", "slab",
] ]
[[package]]
name = "glob"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2"
[[package]]
name = "grouping_by"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ad3dbb820113291dd2f6aea7fb4fa6594d80381b287d4ec03ee56bb692870a9"
[[package]] [[package]]
name = "ipnet" name = "ipnet"
version = "2.10.1" version = "2.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130"
[[package]]
name = "ipnetwork"
version = "0.20.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bf466541e9d546596ee94f9f69590f89473455f88372423e0008fc1a7daf100e"
dependencies = [
"serde",
]
[[package]] [[package]]
name = "itoa" name = "itoa"
...@@ -330,9 +294,9 @@ checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" ...@@ -330,9 +294,9 @@ checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674"
[[package]] [[package]]
name = "libc" name = "libc"
version = "0.2.167" version = "0.2.178"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "09d6582e104315a817dff97f75133544b2e094ee22447d2acf4a74e189ba06fc" checksum = "37c93d8daa9d8a012fd8ab92f088405fb202ea0b6ab73ee2482ae66af4f42091"
[[package]] [[package]]
name = "libloading" name = "libloading"
...@@ -341,26 +305,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" ...@@ -341,26 +305,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"windows-targets", "windows-targets 0.52.6",
] ]
[[package]] [[package]]
name = "log" name = "log"
version = "0.4.22" version = "0.4.29"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897"
[[package]] [[package]]
name = "memchr" name = "memchr"
version = "2.7.4" version = "2.7.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273"
[[package]] [[package]]
name = "nix" name = "nix"
version = "0.29.0" version = "0.30.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6"
dependencies = [ dependencies = [
"bitflags", "bitflags",
"cfg-if", "cfg-if",
...@@ -368,12 +332,6 @@ dependencies = [ ...@@ -368,12 +332,6 @@ dependencies = [
"libc", "libc",
] ]
[[package]]
name = "no-std-net"
version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "43794a0ace135be66a25d3ae77d41b91615fb68ae937f904090203e81f755b65"
[[package]] [[package]]
name = "parking" name = "parking"
version = "2.2.1" version = "2.2.1"
...@@ -382,9 +340,9 @@ checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" ...@@ -382,9 +340,9 @@ checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba"
[[package]] [[package]]
name = "pin-project-lite" name = "pin-project-lite"
version = "0.2.15" 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 = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b"
[[package]] [[package]]
name = "pin-utils" name = "pin-utils"
...@@ -403,168 +361,58 @@ dependencies = [ ...@@ -403,168 +361,58 @@ dependencies = [
"futures-io", "futures-io",
] ]
[[package]]
name = "pnet"
version = "0.35.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "682396b533413cc2e009fbb48aadf93619a149d3e57defba19ff50ce0201bd0d"
dependencies = [
"ipnetwork",
"pnet_base",
"pnet_datalink",
"pnet_packet",
"pnet_sys",
"pnet_transport",
]
[[package]]
name = "pnet_base"
version = "0.35.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ffc190d4067df16af3aba49b3b74c469e611cad6314676eaf1157f31aa0fb2f7"
dependencies = [
"no-std-net",
]
[[package]]
name = "pnet_datalink"
version = "0.35.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e79e70ec0be163102a332e1d2d5586d362ad76b01cec86f830241f2b6452a7b7"
dependencies = [
"ipnetwork",
"libc",
"pnet_base",
"pnet_sys",
"winapi",
]
[[package]]
name = "pnet_macros"
version = "0.35.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "13325ac86ee1a80a480b0bc8e3d30c25d133616112bb16e86f712dcf8a71c863"
dependencies = [
"proc-macro2",
"quote",
"regex",
"syn 2.0.90",
]
[[package]]
name = "pnet_macros_support"
version = "0.35.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eed67a952585d509dd0003049b1fc56b982ac665c8299b124b90ea2bdb3134ab"
dependencies = [
"pnet_base",
]
[[package]]
name = "pnet_packet"
version = "0.35.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4c96ebadfab635fcc23036ba30a7d33a80c39e8461b8bd7dc7bb186acb96560f"
dependencies = [
"glob",
"pnet_base",
"pnet_macros",
"pnet_macros_support",
]
[[package]]
name = "pnet_sys"
version = "0.35.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7d4643d3d4db6b08741050c2f3afa9a892c4244c085a72fcda93c9c2c9a00f4b"
dependencies = [
"libc",
"winapi",
]
[[package]]
name = "pnet_transport"
version = "0.35.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5f604d98bc2a6591cf719b58d3203fd882bdd6bf1db696c4ac97978e9f4776bf"
dependencies = [
"libc",
"pnet_base",
"pnet_packet",
"pnet_sys",
]
[[package]] [[package]]
name = "proc-macro2" name = "proc-macro2"
version = "1.0.92" version = "1.0.103"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8"
dependencies = [ dependencies = [
"unicode-ident", "unicode-ident",
] ]
[[package]] [[package]]
name = "quote" name = "quote"
version = "1.0.37" version = "1.0.42"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
] ]
[[package]] [[package]]
name = "regex" name = "ryu"
version = "1.11.1" version = "1.0.19"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd"
dependencies = [
"aho-corasick",
"memchr",
"regex-automata",
"regex-syntax",
]
[[package]] [[package]]
name = "regex-automata" name = "serde"
version = "0.4.9" version = "1.0.228"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
dependencies = [ dependencies = [
"aho-corasick", "serde_core",
"memchr", "serde_derive",
"regex-syntax",
] ]
[[package]] [[package]]
name = "regex-syntax" name = "serde_core"
version = "0.8.5" version = "1.0.228"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
[[package]]
name = "ryu"
version = "1.0.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6ea1a2d0a644769cc99faa24c3ad26b379b786fe7c36fd3c546254801650e6dd"
[[package]]
name = "serde"
version = "1.0.217"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
dependencies = [ dependencies = [
"serde_derive", "serde_derive",
] ]
[[package]] [[package]]
name = "serde_derive" name = "serde_derive"
version = "1.0.217" version = "1.0.228"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.90", "syn 2.0.111",
] ]
[[package]] [[package]]
...@@ -581,21 +429,18 @@ dependencies = [ ...@@ -581,21 +429,18 @@ dependencies = [
[[package]] [[package]]
name = "slab" name = "slab"
version = "0.4.9" version = "0.4.11"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589"
dependencies = [
"autocfg",
]
[[package]] [[package]]
name = "socket2" name = "socket2"
version = "0.5.8" version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881"
dependencies = [ dependencies = [
"libc", "libc",
"windows-sys 0.52.0", "windows-sys 0.60.2",
] ]
[[package]] [[package]]
...@@ -611,9 +456,9 @@ dependencies = [ ...@@ -611,9 +456,9 @@ dependencies = [
[[package]] [[package]]
name = "syn" name = "syn"
version = "2.0.90" version = "2.0.111"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
...@@ -622,29 +467,29 @@ dependencies = [ ...@@ -622,29 +467,29 @@ dependencies = [
[[package]] [[package]]
name = "thiserror" name = "thiserror"
version = "2.0.3" version = "2.0.17"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c006c85c7651b3cf2ada4584faa36773bd07bac24acfb39f3c431b36d7e667aa" checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8"
dependencies = [ dependencies = [
"thiserror-impl", "thiserror-impl",
] ]
[[package]] [[package]]
name = "thiserror-impl" name = "thiserror-impl"
version = "2.0.3" version = "2.0.17"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f077553d607adc1caf65430528a576c757a71ed73944b66ebb58ef2bbd243568" checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
"syn 2.0.90", "syn 2.0.111",
] ]
[[package]] [[package]]
name = "tun" name = "tun"
version = "0.7.5" version = "0.8.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f3c3f82bccbec181c56278683da7d915cf875a6cf8a450b3bcf1367de222775e" checksum = "3a1527bfc1f78acb1287bbd132ee44bdbf9d064c9f3ca176cb2635253f891f76"
dependencies = [ dependencies = [
"bytes", "bytes",
"cfg-if", "cfg-if",
...@@ -653,7 +498,7 @@ dependencies = [ ...@@ -653,7 +498,7 @@ dependencies = [
"log", "log",
"nix", "nix",
"thiserror", "thiserror",
"windows-sys 0.59.0", "windows-sys 0.60.2",
"wintun-bindings", "wintun-bindings",
] ]
...@@ -664,8 +509,7 @@ dependencies = [ ...@@ -664,8 +509,7 @@ dependencies = [
"base64", "base64",
"crossbeam", "crossbeam",
"crossbeam-utils", "crossbeam-utils",
"grouping_by", "libc",
"pnet",
"serde", "serde",
"serde_json", "serde_json",
"socket2", "socket2",
...@@ -674,48 +518,32 @@ dependencies = [ ...@@ -674,48 +518,32 @@ dependencies = [
[[package]] [[package]]
name = "unicode-ident" name = "unicode-ident"
version = "1.0.14" version = "1.0.22"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5"
[[package]] [[package]]
name = "winapi" name = "windows-link"
version = "0.3.9" version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
dependencies = [
"winapi-i686-pc-windows-gnu",
"winapi-x86_64-pc-windows-gnu",
]
[[package]]
name = "winapi-i686-pc-windows-gnu"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
[[package]]
name = "winapi-x86_64-pc-windows-gnu"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
[[package]] [[package]]
name = "windows-sys" name = "windows-sys"
version = "0.52.0" version = "0.59.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
dependencies = [ dependencies = [
"windows-targets", "windows-targets 0.52.6",
] ]
[[package]] [[package]]
name = "windows-sys" name = "windows-sys"
version = "0.59.0" version = "0.60.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb"
dependencies = [ dependencies = [
"windows-targets", "windows-targets 0.53.5",
] ]
[[package]] [[package]]
...@@ -724,14 +552,31 @@ version = "0.52.6" ...@@ -724,14 +552,31 @@ version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
dependencies = [ dependencies = [
"windows_aarch64_gnullvm", "windows_aarch64_gnullvm 0.52.6",
"windows_aarch64_msvc", "windows_aarch64_msvc 0.52.6",
"windows_i686_gnu", "windows_i686_gnu 0.52.6",
"windows_i686_gnullvm", "windows_i686_gnullvm 0.52.6",
"windows_i686_msvc", "windows_i686_msvc 0.52.6",
"windows_x86_64_gnu", "windows_x86_64_gnu 0.52.6",
"windows_x86_64_gnullvm", "windows_x86_64_gnullvm 0.52.6",
"windows_x86_64_msvc", "windows_x86_64_msvc 0.52.6",
]
[[package]]
name = "windows-targets"
version = "0.53.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3"
dependencies = [
"windows-link",
"windows_aarch64_gnullvm 0.53.1",
"windows_aarch64_msvc 0.53.1",
"windows_i686_gnu 0.53.1",
"windows_i686_gnullvm 0.53.1",
"windows_i686_msvc 0.53.1",
"windows_x86_64_gnu 0.53.1",
"windows_x86_64_gnullvm 0.53.1",
"windows_x86_64_msvc 0.53.1",
] ]
[[package]] [[package]]
...@@ -740,53 +585,111 @@ version = "0.52.6" ...@@ -740,53 +585,111 @@ version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
[[package]]
name = "windows_aarch64_gnullvm"
version = "0.53.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53"
[[package]] [[package]]
name = "windows_aarch64_msvc" name = "windows_aarch64_msvc"
version = "0.52.6" version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
[[package]]
name = "windows_aarch64_msvc"
version = "0.53.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006"
[[package]] [[package]]
name = "windows_i686_gnu" name = "windows_i686_gnu"
version = "0.52.6" version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
[[package]]
name = "windows_i686_gnu"
version = "0.53.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3"
[[package]] [[package]]
name = "windows_i686_gnullvm" name = "windows_i686_gnullvm"
version = "0.52.6" version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
[[package]]
name = "windows_i686_gnullvm"
version = "0.53.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c"
[[package]] [[package]]
name = "windows_i686_msvc" name = "windows_i686_msvc"
version = "0.52.6" version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
[[package]]
name = "windows_i686_msvc"
version = "0.53.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2"
[[package]] [[package]]
name = "windows_x86_64_gnu" name = "windows_x86_64_gnu"
version = "0.52.6" version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
[[package]]
name = "windows_x86_64_gnu"
version = "0.53.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499"
[[package]] [[package]]
name = "windows_x86_64_gnullvm" name = "windows_x86_64_gnullvm"
version = "0.52.6" version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
[[package]]
name = "windows_x86_64_gnullvm"
version = "0.53.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1"
[[package]] [[package]]
name = "windows_x86_64_msvc" name = "windows_x86_64_msvc"
version = "0.52.6" version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
[[package]]
name = "windows_x86_64_msvc"
version = "0.53.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
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]] [[package]]
name = "wintun-bindings" name = "wintun-bindings"
version = "0.7.17" version = "0.7.32"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a8aed5bc5516ca7a52018b0a198911566edfa07584bdbfd71ea39161aa13806e" checksum = "b88303b411e20a1319b368dcd04db1480003ed46ac35193e139f542720b15fbf"
dependencies = [ dependencies = [
"blocking", "blocking",
"c2rust-bitfields", "c2rust-bitfields",
...@@ -794,5 +697,6 @@ dependencies = [ ...@@ -794,5 +697,6 @@ dependencies = [
"libloading", "libloading",
"log", "log",
"thiserror", "thiserror",
"windows-sys 0.59.0", "windows-sys 0.60.2",
"winreg",
] ]
[package] [package]
name = "tun1" name = "tun1"
version = "0.1.0" version = "0.1.0"
edition = "2021" edition = "2024"
[dependencies] [dependencies]
tun = "0.7" tun = "0.8"
socket2 = { version = "0.5.8", features = ["all"] } socket2 = { version = "0.6.1", features = ["all"] }
pnet = "0.35.0" serde = { version = "1.0.228", features = ["derive"] }
serde = { version = "1.0.217", features = ["derive"] }
serde_json = "1.0" serde_json = "1.0"
base64 = "0.22.1" base64 = "0.22.1"
crossbeam = "0.8.4" crossbeam = "0.8.4"
crossbeam-utils = "0.8.20" crossbeam-utils = "0.8.21"
grouping_by = "0.2.2" libc = "0.2.178"
FROM rust:1.84-alpine3.21 as builder FROM rust:1.91-alpine3.22 as chef
RUN apk add --no-cache musl-dev RUN apk add --no-cache musl-dev
RUN cargo install cargo-chef
WORKDIR /usr/src/app WORKDIR /usr/src/app
FROM chef as planner
COPY Cargo.toml Cargo.lock ./ COPY Cargo.toml Cargo.lock ./
RUN mkdir src && \ COPY src src
echo 'fn main() {}' > src/main.rs && \ RUN cargo chef prepare --recipe-path recipe.json
cargo build --release && \
cargo clean --package $(awk '/name/ {gsub(/"/,""); print $3}' Cargo.toml | sed ':a;N;$!ba;s/\n//g' | tr -d '\r') && \
rm -rf src
FROM chef as builder
COPY --from=planner /usr/src/app/recipe.json recipe.json
RUN cargo chef cook --release --recipe-path recipe.json
COPY Cargo.toml Cargo.lock ./
COPY src src COPY src src
RUN cargo build --release RUN cargo build --release
FROM alpine:3.21 FROM alpine:3.22
RUN apk --no-cache add libgcc libstdc++ bash iproute2 iptables iptables-legacy ipset netcat-openbsd jq RUN apk --no-cache add libgcc libstdc++ bash iproute2 iptables iptables-legacy ipset netcat-openbsd jq
COPY --from=builder /usr/src/app/target/release/tun1 /usr/local/bin/tun COPY --from=builder /usr/src/app/target/release/tun1 /usr/local/bin/tun
COPY ./entrypoint.sh /entrypoint.sh COPY ./entrypoint.sh /entrypoint.sh
......
mod router; mod router;
use crate::router::{Router, SECRET_LENGTH};
use crate::router::{Router, RouterReader, RouterWriter, SECRET_LENGTH}; use crossbeam_utils::thread;
use std::collections::HashMap;
use std::env; use std::env;
use std::error::Error; use std::error::Error;
use std::intrinsics::transmute;
use std::io::{Read, Write}; use std::io::{Read, Write};
use std::mem::MaybeUninit; use std::mem::MaybeUninit;
use std::sync::Arc; use std::mem::{size_of, transmute};
use std::sync::atomic::Ordering;
#[repr(C)] #[repr(C)]
pub struct Meta { pub struct Meta {
...@@ -18,10 +17,16 @@ pub struct Meta { ...@@ -18,10 +17,16 @@ pub struct Meta {
use serde::Deserialize; use serde::Deserialize;
#[derive(Deserialize)]
pub struct Config {
pub local_id: u8,
pub local_secret: String,
pub routers: Vec<ConfigRouter>,
}
#[derive(Deserialize)] #[derive(Deserialize)]
pub struct ConfigRouter { pub struct ConfigRouter {
pub remote_id: u8, pub remote_id: u8,
pub proto: i32, pub proto: u8,
pub family: u8, pub family: u8,
pub mark: u32, pub mark: u32,
pub endpoint: String, pub endpoint: String,
...@@ -30,105 +35,79 @@ pub struct ConfigRouter { ...@@ -30,105 +35,79 @@ pub struct ConfigRouter {
pub up: String, pub up: String,
} }
#[derive(Deserialize)]
pub struct Config {
pub local_id: u8,
pub local_secret: String,
pub routers: Vec<ConfigRouter>,
}
use crossbeam_utils::thread;
use grouping_by::GroupingBy;
use pnet::packet::ipv4::Ipv4Packet;
use socket2::Socket;
fn main() -> Result<(), Box<dyn Error>> { fn main() -> Result<(), Box<dyn Error>> {
println!("Starting");
let config: Config = serde_json::from_str(env::args().nth(1).ok_or("need param")?.as_str())?; let config: Config = serde_json::from_str(env::args().nth(1).ok_or("need param")?.as_str())?;
let local_secret: [u8; SECRET_LENGTH] = Router::create_secret(config.local_secret.as_str())?; let local_secret: [u8; SECRET_LENGTH] = Router::create_secret(config.local_secret.as_str())?;
let mut sockets: HashMap<u16, Arc<Socket>> = HashMap::new(); let routers: Vec<Router> = config
let routers: HashMap<u8, Router> = config
.routers .routers
.iter()
.map(|c| Router::new(c, &mut sockets).map(|router| (c.remote_id, router)))
.collect::<Result<_, _>>()?;
let (mut router_readers, router_writers): (
HashMap<u8, RouterReader>,
HashMap<u8, RouterWriter>,
) = routers
.into_iter()
.map(|(id, router)| {
let (reader, writer) = router.split();
((id, reader), (id, writer))
})
.unzip();
let router_writers3: Vec<(Arc<Socket>, HashMap<u8, RouterWriter>)> = router_writers
.into_iter() .into_iter()
.grouping_by(|(_, v)| v.key()) .map(|c| Router::new(c, config.local_id))
.into_iter() .collect::<Result<Vec<_>, _>>()?;
.map(|(k, v)| {
(
Arc::clone(sockets.get_mut(&k).unwrap()),
v.into_iter().collect(),
)
})
.collect();
println!("created tuns"); println!("created tuns");
const META_SIZE: usize = size_of::<Meta>();
thread::scope(|s| { thread::scope(|s| {
for router in router_readers.values_mut() { for router in routers {
s.spawn(|_| { let (mut reader, mut writer) = router.split();
s.spawn(move |_| {
let mut buffer = [0u8; 1500 - 20]; // minus typical IP header space let mut buffer = [0u8; 1500 - 20]; // minus typical IP header space
let meta_size = size_of::<Meta>();
// Pre-initialize with our Meta header (local -> remote) // Pre-initialize with our Meta header (local -> remote)
let meta = Meta { let meta = Meta {
src_id: config.local_id, src_id: config.local_id,
dst_id: router.config.remote_id, dst_id: reader.config.remote_id,
reversed: 0, reversed: 0,
}; };
// Turn the Meta struct into bytes // Turn the Meta struct into bytes
let meta_bytes = unsafe { let meta_bytes: &[u8; META_SIZE] =
std::slice::from_raw_parts(&meta as *const Meta as *const u8, meta_size) unsafe { &*(&meta as *const Meta as *const [u8; META_SIZE]) };
}; buffer[..META_SIZE].copy_from_slice(meta_bytes);
buffer[..meta_size].copy_from_slice(meta_bytes);
loop { loop {
let n = router.tun_reader.read(&mut buffer[meta_size..]).unwrap(); let n = reader.tun_reader.read(&mut buffer[META_SIZE..]).unwrap();
if let Some(ref addr) = *router.endpoint.read().unwrap() { let guard = crossbeam::epoch::pin();
router.encrypt(&mut buffer[meta_size..meta_size + n]); let shared = reader.endpoint.load(Ordering::Acquire, &guard);
#[cfg(target_os = "linux")] if let Some(addr) = unsafe { shared.as_ref() } {
let _ = router.socket.set_mark(router.config.mark); reader.encrypt(&mut buffer[META_SIZE..META_SIZE + n]);
let _ = router.socket.send_to(&buffer[..meta_size + n], addr); let _ = reader.socket.send_to(&buffer[..META_SIZE + n], addr);
} }
} }
}); });
}
for (socket, mut router_writers) in router_writers3 {
s.spawn(move |_| { s.spawn(move |_| {
let mut recv_buf = [MaybeUninit::uninit(); 1500]; let mut recv_buf = [MaybeUninit::uninit(); 1500];
loop { loop {
let _ = (|| { let _ = (|| {
let (len, addr) = socket.recv_from(&mut recv_buf).unwrap(); let (len, addr) = writer.socket.recv_from(&mut recv_buf).unwrap();
let data: &mut [u8] = unsafe { transmute(&mut recv_buf[..len]) }; let packet: &mut [u8] = unsafe { transmute(&mut recv_buf[..len]) };
// if addr.is_ipv6() { println!("{:X?}", packet) }
let offset = if addr.is_ipv4() {
(packet[0] & 0x0f) as usize * 4
} else {
0
} + META_SIZE;
let packet = Ipv4Packet::new(data).ok_or("malformed packet")?; let guard = crossbeam::epoch::pin();
let header_len = packet.get_header_length() as usize * 4; let current_shared = writer.endpoint.load(Ordering::SeqCst, &guard);
let (_ip_header, rest) = data let is_same = unsafe { current_shared.as_ref() }
.split_at_mut_checked(header_len) .map(|c| *c == addr)
.ok_or("malformed packet")?; .unwrap_or(false);
let (meta_bytes, payload) = rest if !is_same {
.split_at_mut_checked(size_of::<Meta>()) let new_shared = crossbeam::epoch::Owned::new(addr).into_shared(&guard);
.ok_or("malformed packet")?; let old_shared =
let meta: &Meta = unsafe { transmute(meta_bytes.as_ptr()) }; writer.endpoint.swap(new_shared, Ordering::SeqCst, &guard);
if meta.dst_id == config.local_id && meta.reversed == 0 { unsafe {
let router = router_writers guard.defer_destroy(old_shared);
.get_mut(&meta.src_id) }
.ok_or("missing router")?;
*router.endpoint.write().unwrap() = Some(addr);
router.decrypt(payload, &local_secret);
router.tun_writer.write_all(payload)?;
} }
let payload = &mut packet[offset..];
writer.decrypt(payload, &local_secret);
writer.tun_writer.write_all(payload)?;
Ok::<(), Box<dyn Error>>(()) Ok::<(), Box<dyn Error>>(())
})(); })();
} }
......
use socket2::{Domain, Protocol, SockAddr, Socket, Type}; use base64::prelude::BASE64_STANDARD;
use std::collections::hash_map::Entry; use base64::Engine;
use std::collections::HashMap; use socket2::{Domain, Protocol, SockAddr, SockFilter, Socket, Type};
use std::net::ToSocketAddrs; use std::net::ToSocketAddrs;
use std::process::{Command, ExitStatus}; use std::process::{Command, ExitStatus};
use std::sync::{Arc, RwLock}; use std::sync::Arc;
use tun::{Reader, Writer}; use tun::{Reader, Writer};
pub const SECRET_LENGTH: usize = 32; pub const SECRET_LENGTH: usize = 32;
use crate::ConfigRouter; use crate::{ConfigRouter, Meta};
use base64::prelude::*; use crossbeam::epoch::Atomic;
use libc::{BPF_ABS, BPF_B, BPF_IND, BPF_JEQ, BPF_JMP, BPF_K, BPF_LD, BPF_LDX, BPF_MSH, BPF_RET, BPF_W};
// tun -> raw // tun -> raw
pub struct RouterReader<'a> { pub struct RouterReader {
pub config: &'a ConfigRouter, pub config: ConfigRouter,
pub secret: [u8; SECRET_LENGTH], pub secret: [u8; SECRET_LENGTH],
pub tun_reader: Reader, pub tun_reader: Reader,
pub socket: Arc<Socket>, pub socket: Arc<Socket>,
pub endpoint: Arc<RwLock<Option<SockAddr>>>, pub endpoint: Arc<Atomic<SockAddr>>,
} }
impl<'a> RouterReader<'a> { impl RouterReader {
pub(crate) fn encrypt(&self, data: &mut [u8]) { pub(crate) fn encrypt(&self, data: &mut [u8]) {
for (i, b) in data.iter_mut().enumerate() { for (i, b) in data.iter_mut().enumerate() {
*b ^= self.secret[i % SECRET_LENGTH]; *b ^= self.secret[i % SECRET_LENGTH];
...@@ -27,34 +28,30 @@ impl<'a> RouterReader<'a> { ...@@ -27,34 +28,30 @@ impl<'a> RouterReader<'a> {
} }
// raw -> tun // raw -> tun
pub struct RouterWriter<'a> { pub struct RouterWriter {
pub config: &'a ConfigRouter,
pub tun_writer: Writer, pub tun_writer: Writer,
pub endpoint: Arc<RwLock<Option<SockAddr>>>, pub socket: Arc<Socket>,
pub endpoint: Arc<Atomic<SockAddr>>,
} }
impl<'a> RouterWriter<'a> { impl RouterWriter {
pub(crate) fn decrypt(&self, data: &mut [u8], secret: &[u8; SECRET_LENGTH]) { pub(crate) fn decrypt(&self, data: &mut [u8], secret: &[u8; SECRET_LENGTH]) {
for (i, b) in data.iter_mut().enumerate() { for (i, b) in data.iter_mut().enumerate() {
*b ^= secret[i % SECRET_LENGTH]; *b ^= secret[i % SECRET_LENGTH];
} }
} }
pub(crate) fn key(&self) -> u16 {
Router::key(self.config)
}
} }
pub struct Router<'a> { pub struct Router {
pub config: &'a ConfigRouter, pub config: ConfigRouter,
pub secret: [u8; SECRET_LENGTH], pub secret: [u8; SECRET_LENGTH],
pub tun_reader: Reader, pub tun_reader: Reader,
pub tun_writer: Writer, pub tun_writer: Writer,
pub socket: Arc<Socket>, pub socket: Arc<Socket>,
pub endpoint: Arc<RwLock<Option<SockAddr>>>, pub endpoint: Arc<Atomic<SockAddr>>,
} }
impl<'a> Router<'a> { impl Router {
pub(crate) fn create_secret( pub(crate) fn create_secret(
config: &str, config: &str,
) -> Result<[u8; SECRET_LENGTH], Box<dyn std::error::Error>> { ) -> Result<[u8; SECRET_LENGTH], Box<dyn std::error::Error>> {
...@@ -65,30 +62,75 @@ impl<'a> Router<'a> { ...@@ -65,30 +62,75 @@ impl<'a> Router<'a> {
Ok(secret) Ok(secret)
} }
fn key(config: &ConfigRouter) -> u16 {
(config.family as u16) << 8 | config.proto as u16
}
fn create_raw_socket( fn create_raw_socket(
config: &ConfigRouter, config: &ConfigRouter,
sockets: &mut HashMap<u16, Arc<Socket>>, local_id: u8,
) -> Result<Arc<Socket>, Box<dyn std::error::Error>> { ) -> Result<Arc<Socket>, Box<dyn std::error::Error>> {
let key = Router::key(config); let result = Socket::new(
let result = match sockets.entry(key) {
Entry::Occupied(entry) => entry.get().clone(),
Entry::Vacant(entry) => entry
.insert(Arc::new(Socket::new(
if config.family == 6 { if config.family == 6 {
Domain::IPV6 Domain::IPV6
} else { } else {
Domain::IPV4 Domain::IPV4
}, },
Type::RAW, Type::RAW,
Some(Protocol::from(config.proto)), Some(Protocol::from(config.proto as i32)),
)?)) )?;
.clone(), #[cfg(target_os = "linux")]
result.set_mark(config.mark)?;
Self::attach_readable_filter(config, local_id, &result)?;
Ok(Arc::new(result))
}
fn attach_readable_filter(
config: &ConfigRouter,
local_id: u8,
socket: &Socket,
) -> Result<(), Box<dyn std::error::Error>> {
// 由于多个对端可能会使用相同的 ipprpto 号,这里确保每个 socket 上只会收到自己对应的对端发来的消息
const META_SIZE: usize = size_of::<Meta>();
let meta = Meta {
src_id: config.remote_id,
dst_id: local_id,
reversed: 0,
};
let meta_bytes: [u8; META_SIZE] =
unsafe { *(&meta as *const Meta as *const [u8; META_SIZE]) };
let value = u32::from_be_bytes(meta_bytes);
// 如果你的协议是 UDP,这里必须是 8 (跳过 UDP 头: SrcPort(2)+DstPort(2)+Len(2)+Sum(2))
// 如果是纯自定义 IP 协议,这里是 0
let payload_offset = 0;
let filter: &[SockFilter] = match config.family {
4 => &[
// [IPv4] 计算 IPv4 头长度: X = 4 * (IP[0] & 0xf)
bpf_stmt(BPF_LDX | BPF_B | BPF_MSH, 0),
// A = Packet[X + payload_offset]
bpf_stmt(BPF_LD | BPF_W | BPF_IND, payload_offset),
// if (A == target_val) goto Accept; else goto Reject;
bpf_jump(BPF_JMP | BPF_JEQ | BPF_K, value, 0, 1),
// 【接受 (True 路径)】
bpf_stmt(BPF_RET | BPF_K, u32::MAX),
// 【拒绝 (False 路径)】
bpf_stmt(BPF_RET | BPF_K, 0),
],
6 => &[
// raw socket IPv6 没有 header,加载第 0 字节到累加器 A
bpf_stmt(BPF_LD | BPF_W | BPF_ABS, 0),
// if (A == target_val) goto Accept; else goto Reject;
bpf_jump(BPF_JMP | BPF_JEQ | BPF_K, value, 0, 1),
// 【接受 (True 路径)】
bpf_stmt(BPF_RET | BPF_K, u32::MAX),
// 【拒绝 (False 路径)】
bpf_stmt(BPF_RET | BPF_K, 0),
],
_ => Err("unsupported family")?,
}; };
Ok(result) socket.attach_filter(filter)?;
Ok(())
} }
fn create_tun_device( fn create_tun_device(
config: &ConfigRouter, config: &ConfigRouter,
) -> Result<(Reader, Writer), Box<dyn std::error::Error>> { ) -> Result<(Reader, Writer), Box<dyn std::error::Error>> {
...@@ -104,21 +146,18 @@ impl<'a> Router<'a> { ...@@ -104,21 +146,18 @@ impl<'a> Router<'a> {
fn create_endpoint( fn create_endpoint(
config: &ConfigRouter, config: &ConfigRouter,
) -> Result<Arc<RwLock<Option<SockAddr>>>, Box<dyn std::error::Error>> { ) -> Result<Arc<Atomic<SockAddr>>, Box<dyn std::error::Error>> {
let parsed = (config.endpoint.clone(), 0u16) let parsed = (config.endpoint.clone(), 0u16)
.to_socket_addrs()? .to_socket_addrs()?
.next() .next()
.ok_or(config.endpoint.clone())?; .ok_or(config.endpoint.clone())?;
Ok(Arc::new(RwLock::new(Some(parsed.into())))) Ok(Arc::new(Atomic::new(parsed.into())))
} }
pub fn new( pub fn new(config: ConfigRouter, local_id: u8) -> Result<Router, Box<dyn std::error::Error>> {
config: &'a ConfigRouter,
sockets: &mut HashMap<u16, Arc<Socket>>,
) -> Result<Router<'a>, Box<dyn std::error::Error>> {
let secret = Self::create_secret(config.remote_secret.as_str())?; let secret = Self::create_secret(config.remote_secret.as_str())?;
let endpoint = Self::create_endpoint(&config)?; let endpoint = Self::create_endpoint(&config)?;
let socket = Self::create_raw_socket(&config, sockets)?; let socket = Self::create_raw_socket(&config, local_id)?;
let (tun_reader, tun_writer) = Self::create_tun_device(&config)?; let (tun_reader, tun_writer) = Self::create_tun_device(&config)?;
Self::run_up_script(&config)?; Self::run_up_script(&config)?;
...@@ -134,11 +173,11 @@ impl<'a> Router<'a> { ...@@ -134,11 +173,11 @@ impl<'a> Router<'a> {
Ok(router) Ok(router)
} }
pub fn split(self) -> (RouterReader<'a>, RouterWriter<'a>) { pub fn split(self) -> (RouterReader, RouterWriter) {
let writer = RouterWriter { let writer = RouterWriter {
config: self.config, endpoint: self.endpoint.clone(),
endpoint: Arc::clone(&self.endpoint),
tun_writer: self.tun_writer, tun_writer: self.tun_writer,
socket: self.socket.clone(),
}; };
let reader = RouterReader { let reader = RouterReader {
...@@ -152,3 +191,11 @@ impl<'a> Router<'a> { ...@@ -152,3 +191,11 @@ impl<'a> Router<'a> {
(reader, writer) (reader, writer)
} }
} }
fn bpf_stmt(code: u32, k: u32) -> SockFilter {
SockFilter::new(code as u16, 0, 0, k)
}
fn bpf_jump(code: u32, k: u32, jt: u8, jf: u8) -> SockFilter {
SockFilter::new(code as u16, jt, jf, k)
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment