diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..ff5e93d --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,8 @@ +{ + "rust-analyzer.check.allTargets": false, + "rust-analyzer.cargo.target": "xtensa-esp32-none-elf", + "rust-analyzer.cargo.features": [ + "esp32" + ], + "editor.formatOnSave": true +} \ No newline at end of file diff --git a/README.md b/README.md index 403dbee..6240a38 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,24 @@ # Ferris on Air Ferris on Air (FoA) is an open source 802.11 stack for the ESP32 written in async rust, with the work of the [esp32-open-mac](https://esp32-open-mac.be/) project. The stack is intended to be used with [embassy](https://embassy.dev/) and is still in very early stages of development. We do not claim to be Wi-Fi certified, but implement the features specified by IEEE 802.11 to our best knowledge. + ## Design The main FoA crate acts as a multiplexer, that divides access to the hardware up into a number of virtual interfaces (VIF's). These can then be passed to interface implementations, like `foa_sta` or [`foa_dswifi`](https://github.com/mjwells2002/foa_dswifi). These interface implementations can coexist, enabling things like AP/STA operation in the future. + ## Structure The `foa` crate contains the LMAC, TX buffer management and RX ARC buffer management. `foa_sta` contains a rudimentary implementation of a station interface. `examples` contain a set of examples showing how to use different parts of the stack. + ## Usage For a concrete usage example, see `examples`. These examples can be run with `./run_example.sh [SSID] [LOG_LEVEL]`. + +- Install the ESP32 rust toolchain, by following https://docs.esp-rs.org/book/installation/index.html; for now we only support Xtensa targets, so follow those steps. We're using `no_std`, so you don't need to follow the `std` steps. +- Install `espflash` by running `cargo install espflash` +- CHIP can be esp32 or esp32s2 +- DEFMT_LOG accepts the following logging levels: error, warn, info, debug, trace. Enabling a logging level also enables higher severity logging levels + ## Note The docs sometimes contain anecdotes I left during coding, since I believe them to be interesting. + ## License This project is licensed under Apache 2.0 or MIT at your option. diff --git a/examples/.vscode/settings.json b/examples/.vscode/settings.json index a72c739..538a0b6 100644 --- a/examples/.vscode/settings.json +++ b/examples/.vscode/settings.json @@ -1,5 +1,8 @@ { "rust-analyzer.check.allTargets": false, "rust-analyzer.cargo.target": "xtensa-esp32-none-elf", - "editor.formatOnSave": true -} + "editor.formatOnSave": true, + "rust-analyzer.cargo.features": [ + "esp32" + ], +} \ No newline at end of file diff --git a/examples/Cargo.lock b/examples/Cargo.lock index e3a1481..6dc35a2 100644 --- a/examples/Cargo.lock +++ b/examples/Cargo.lock @@ -54,9 +54,9 @@ checksum = "78200ac3468a57d333cd0ea5dd398e25111194dcacd49208afca95c629a6311d" [[package]] name = "anyhow" -version = "1.0.98" +version = "1.0.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" +checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100" [[package]] name = "as-slice" @@ -81,9 +81,9 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "awdl-frame-parser" @@ -161,9 +161,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.9.1" +version = "2.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" +checksum = "6a65b545ab31d687cff52899d4890855fec459eb6afe0da6417b8a18da87aa29" [[package]] name = "block-buffer" @@ -186,9 +186,9 @@ dependencies = [ [[package]] name = "bytemuck" -version = "1.23.1" +version = "1.23.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c76a5792e44e4abe34d3abf15636779261d45a7450612059293d1d2cfc63422" +checksum = "3995eaeebcdf32f91f980d360f78732ddc061097ab4e39991ae7a6ace9194677" [[package]] name = "byteorder" @@ -235,9 +235,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.4.2" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" dependencies = [ "cfg-if", ] @@ -285,8 +285,18 @@ version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" dependencies = [ - "darling_core", - "darling_macro", + "darling_core 0.20.11", + "darling_macro 0.20.11", +] + +[[package]] +name = "darling" +version = "0.21.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08440b3dd222c3d0433e63e097463969485f112baff337dfdaca043a0d760570" +dependencies = [ + "darling_core 0.21.2", + "darling_macro 0.21.2", ] [[package]] @@ -303,13 +313,37 @@ dependencies = [ "syn", ] +[[package]] +name = "darling_core" +version = "0.21.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25b7912bc28a04ab1b7715a68ea03aaa15662b43a1a4b2c480531fd19f8bf7e" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "darling_macro" version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ - "darling_core", + "darling_core 0.20.11", + "quote", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.21.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce154b9bea7fb0c8e8326e62d00354000c36e79770ff21b8c84e3aa267d9d531" +dependencies = [ + "darling_core 0.21.2", "quote", "syn", ] @@ -393,9 +427,9 @@ dependencies = [ [[package]] name = "delegate" -version = "0.13.3" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9b6483c2bbed26f97861cf57651d4f2b731964a28cd2257f934a4b452480d21" +checksum = "6178a82cf56c836a3ba61a7935cdb1c49bfaa6fa4327cd5bf554a503087de26b" dependencies = [ "proc-macro2", "quote", @@ -453,10 +487,11 @@ dependencies = [ [[package]] name = "embassy-embedded-hal" -version = "0.3.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fea5ef5bed4d3468dfd44f5c9fa4cda8f54c86d4fb4ae683eacf9d39e2ea12" +checksum = "8c62a3bf127e03832fb97d8b01a058775e617653bc89e2a12c256485a7fb54c1" dependencies = [ + "embassy-embedded-hal 0.4.0", "embassy-futures", "embassy-sync 0.6.2", "embassy-time", @@ -468,6 +503,23 @@ dependencies = [ "nb 1.1.0", ] +[[package]] +name = "embassy-embedded-hal" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1611b7a7ab5d1fbed84c338df26d56fd9bded58006ebb029075112ed2c5e039" +dependencies = [ + "embassy-futures", + "embassy-hal-internal", + "embassy-sync 0.7.1", + "embedded-hal 0.2.7", + "embedded-hal 1.0.0", + "embedded-hal-async", + "embedded-storage", + "embedded-storage-async", + "nb 1.1.0", +] + [[package]] name = "embassy-executor" version = "0.7.0" @@ -486,7 +538,7 @@ version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3577b1e9446f61381179a330fc5324b01d511624c55f25e3c66c9e3c626dbecf" dependencies = [ - "darling", + "darling 0.20.11", "proc-macro2", "quote", "syn", @@ -501,6 +553,15 @@ dependencies = [ "defmt 0.3.100", ] +[[package]] +name = "embassy-hal-internal" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95285007a91b619dc9f26ea8f55452aa6c60f7115a4edc05085cd2bd3127cd7a" +dependencies = [ + "num-traits", +] + [[package]] name = "embassy-net" version = "0.7.0" @@ -530,13 +591,13 @@ dependencies = [ [[package]] name = "embassy-net-driver-channel" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4818c32afec43e3cae234f324bad9a976c9aa7501022d26ff60a4017a1a006b7" +checksum = "25a567ab50319d866ad5e6c583ed665ba9b07865389644d3d82e45bf1497c934" dependencies = [ "embassy-futures", "embassy-net-driver", - "embassy-sync 0.6.2", + "embassy-sync 0.7.1", ] [[package]] @@ -555,15 +616,15 @@ dependencies = [ [[package]] name = "embassy-sync" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cef1a8a1ea892f9b656de0295532ac5d8067e9830d49ec75076291fd6066b136" +checksum = "03c372c90d3525a648684fa1c131decaf7d9ff181030db09c876fad6043443b9" dependencies = [ "cfg-if", "critical-section", "embedded-io-async", + "futures-core", "futures-sink", - "futures-util", "heapless 0.8.0", ] @@ -605,9 +666,12 @@ dependencies = [ [[package]] name = "embassy-usb-driver" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fc247028eae04174b6635104a35b1ed336aabef4654f5e87a8f32327d231970" +checksum = "340c5ce591ef58c6449e43f51d2c53efe1bf0bb6a40cbf80afa0d259c7d52c76" +dependencies = [ + "embedded-io-async", +] [[package]] name = "embassy-usb-synopsys-otg" @@ -732,20 +796,20 @@ dependencies = [ [[package]] name = "enumset" -version = "1.1.6" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11a6b7c3d347de0a9f7bfd2f853be43fe32fa6fac30c70f6d6d67a1e936b87ee" +checksum = "41326c68a68a5d2235daf392dc0da9f342a6579284b1a12ce1e6fed6c95fe19e" dependencies = [ "enumset_derive", ] [[package]] name = "enumset_derive" -version = "0.11.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6da3ea9e1d1a3b1593e15781f930120e72aa7501610b2f82e5b6739c72e8eac5" +checksum = "86b0b3dd7a4444d18c9331b659b5f309577448a2e47f0c125fed64407bc0a82c" dependencies = [ - "darling", + "darling 0.21.2", "proc-macro2", "quote", "syn", @@ -800,6 +864,15 @@ dependencies = [ "strum", ] +[[package]] +name = "esp-config" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "158dba334d3a2acd8d93873c0ae723ca1037cc78eefe5d6b4c5919b0ca28e38e" +dependencies = [ + "document-features", +] + [[package]] name = "esp-config" version = "0.4.0" @@ -831,14 +904,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3887eda2917deef3d99e7a5c324f9190714e99055361ad36890dffd0a995b49" dependencies = [ "bitfield", - "bitflags 2.9.1", + "bitflags 2.9.2", "bytemuck", "cfg-if", "critical-section", "delegate", "digest", "document-features", - "embassy-embedded-hal", + "embassy-embedded-hal 0.3.2", "embassy-futures", "embassy-sync 0.6.2", "embassy-usb-driver", @@ -999,7 +1072,7 @@ dependencies = [ "defmt 1.0.1", "defmt-or-log", "embassy-futures", - "embassy-sync 0.7.0", + "embassy-sync 0.7.1", "embassy-time", "esp-hal", "esp-wifi-sys", @@ -1134,6 +1207,7 @@ dependencies = [ "esp-println", "foa", "foa_awdl", + "foa_mesh", "foa_sta", "heapless 0.8.0", "rand_core 0.9.3", @@ -1165,7 +1239,7 @@ dependencies = [ "defmt 1.0.1", "defmt-or-log", "embassy-futures", - "embassy-sync 0.7.0", + "embassy-sync 0.7.1", "embassy-time", "esp-config 0.5.0", "esp-hal", @@ -1185,7 +1259,7 @@ dependencies = [ "defmt-or-log", "embassy-futures", "embassy-net-driver-channel", - "embassy-sync 0.7.0", + "embassy-sync 0.7.1", "embassy-time", "esp-config 0.4.0", "ether-type", @@ -1198,6 +1272,25 @@ dependencies = [ "smoltcp", ] +[[package]] +name = "foa_mesh" +version = "0.1.0" +dependencies = [ + "defmt 0.3.100", + "defmt-or-log", + "embassy-futures", + "embassy-net-driver-channel", + "embassy-sync 0.6.2", + "embassy-time", + "esp-config 0.3.1", + "ethernet", + "foa", + "heapless 0.8.0", + "ieee80211", + "llc-rs", + "rand_core 0.6.4", +] + [[package]] name = "foa_sta" version = "0.1.0" @@ -1207,7 +1300,7 @@ dependencies = [ "embassy-futures", "embassy-net", "embassy-net-driver-channel", - "embassy-sync 0.7.0", + "embassy-sync 0.7.1", "embassy-time", "esp-config 0.4.0", "ethernet", @@ -1334,9 +1427,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.4" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" [[package]] name = "heapless" @@ -1405,9 +1498,9 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "ieee80211" -version = "0.5.7" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c708bbeae0b32ebeb6847424a9561a1a10855b9357309427c884dc93c181e7d" +checksum = "7418f9be3522922d6e87647eacd5275641f6c225cf4a444a64c31e366ac37559" dependencies = [ "aes-kw", "bitfield-struct", @@ -1429,9 +1522,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.9.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" +checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" dependencies = [ "equivalent", "hashbrown", @@ -1455,11 +1548,11 @@ dependencies = [ [[package]] name = "instability" -version = "0.3.7" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf9fed6d91cfb734e7476a06bde8300a1b94e217e1b523b6f0cd1a01998c71d" +checksum = "435d80800b936787d62688c927b6490e887c7ef5ff9ce922c6c6050fca75eb9a" dependencies = [ - "darling", + "darling 0.20.11", "indoc", "proc-macro2", "quote", @@ -1498,9 +1591,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.173" +version = "0.2.175" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8cfeafaffdbc32176b64fb251369d52ea9f0a8fbc6f8759edffef7b525d64bb" +checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" [[package]] name = "linked_list_allocator" @@ -1510,9 +1603,9 @@ checksum = "9afa463f5405ee81cdb9cc2baf37e08ec7e4c8209442b5d72c04cfb2cd6e6286" [[package]] name = "litrs" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5" +checksum = "f5e54036fe321fd421e10d732f155734c4e4afd610dd556d9a82833ab3ee0bed" dependencies = [ "proc-macro2", ] @@ -1792,9 +1885,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.95" +version = "1.0.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +checksum = "d61789d7719defeb74ea5fe81f2fdfdbd28a803847077cecce2ff14e1472f6f1" dependencies = [ "unicode-ident", ] @@ -1904,12 +1997,6 @@ dependencies = [ "syn", ] -[[package]] -name = "rustversion" -version = "1.0.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" - [[package]] name = "ryu" version = "1.0.20" @@ -1977,9 +2064,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.140" +version = "1.0.142" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +checksum = "030fedb782600dcbd6f02d479bf0d817ac3bb40d644745b769d6a96bc3afc5a7" dependencies = [ "itoa", "memchr", @@ -2059,23 +2146,22 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "strum" -version = "0.27.1" +version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f64def088c51c9510a8579e3c5d67c65349dcf755e5479ad3d010aa6454e2c32" +checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" dependencies = [ "strum_macros", ] [[package]] name = "strum_macros" -version = "0.27.1" +version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c77a8c5abcaf0f9ce05d62342b7d298c346515365c36b673df4ebe3ced01fde8" +checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" dependencies = [ "heck", "proc-macro2", "quote", - "rustversion", "syn", ] @@ -2087,9 +2173,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.103" +version = "2.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4307e30089d6fd6aff212f2da3a1f9e32f3223b1f010fb09b7c95f90f3ca1e8" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" dependencies = [ "proc-macro2", "quote", @@ -2107,18 +2193,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.12" +version = "2.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +checksum = "0b0949c3a6c842cbde3f1686d6eea5a010516deb7085f79db747562d4102f41e" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "2.0.12" +version = "2.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +checksum = "cc5b44b4ab9c2fdd0e0512e6bece8388e214c0749f5862b114cc5b7a25daf227" dependencies = [ "proc-macro2", "quote", @@ -2305,9 +2391,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74c7b26e3480b707944fc872477815d29a8e429d2f93a1ce000f5fa84a15cbcd" +checksum = "f3edebf492c8125044983378ecb5766203ad3b4c2f7a922bd7dd207f6d443e95" dependencies = [ "memchr", ] @@ -2346,18 +2432,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.25" +version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" +checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.25" +version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" +checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" dependencies = [ "proc-macro2", "quote", diff --git a/examples/Cargo.toml b/examples/Cargo.toml index ba6a3a4..ee3e083 100644 --- a/examples/Cargo.toml +++ b/examples/Cargo.toml @@ -34,6 +34,7 @@ embassy-executor = { version = "0.7.0", features = [ foa = { path = "../foa", features = ["defmt"] } foa_sta = { path = "../foa_sta", features = ["defmt"] } foa_awdl = { path = "../foa_awdl", features = ["defmt"] } +foa_mesh = { path = "../foa_mesh", features = ["defmt"] } static_cell = "2.1.0" heapless = "0.8.0" diff --git a/examples/src/bin/mesh_single.rs b/examples/src/bin/mesh_single.rs new file mode 100644 index 0000000..a4239d7 --- /dev/null +++ b/examples/src/bin/mesh_single.rs @@ -0,0 +1,68 @@ +#![no_std] +#![no_main] + +use defmt::{debug, info}; +use embassy_executor::Spawner; +use embassy_time::Timer; +use esp_backtrace as _; +use esp_hal::{rng::Rng, timer::timg::TimerGroup}; +use esp_println as _; +use foa::{FoAResources, FoARunner, VirtualInterface}; +use foa_mesh::MeshRunner; +use foa_mesh::state::MeshResources; +use heapless::String; + +macro_rules! mk_static { + ($t:ty,$val:expr) => {{ + static STATIC_CELL: static_cell::StaticCell<$t> = static_cell::StaticCell::new(); + #[deny(unused_attributes)] + let x = STATIC_CELL.uninit().write(($val)); + x + }}; +} + +#[embassy_executor::task] +async fn foa_task(mut runner: FoARunner<'static>) -> ! { + runner.run().await; +} +#[embassy_executor::task] +async fn mesh_task(mut runner: MeshRunner<'static, 'static, Rng>) -> ! { + runner.run().await +} + +#[esp_hal_embassy::main] +async fn main(spawner: Spawner) { + info!("Welcome!"); + let peripherals = esp_hal::init(esp_hal::Config::default()); + + let timg0 = TimerGroup::new(peripherals.TIMG0); + info!("Embassy!"); + esp_hal_embassy::init(timg0.timer0); + info!("After embassy!"); + + let foa_resources = mk_static!(FoAResources, FoAResources::new()); + let ([mesh_vif, ..], foa_runner) = foa::init(foa_resources, peripherals.WIFI, peripherals.ADC2); + spawner.spawn(foa_task(foa_runner)).unwrap(); + let mesh_vif = mk_static!(VirtualInterface<'static>, mesh_vif); + let mesh_resources = mk_static!(MeshResources, MeshResources::new()); + + let (mut mesh_control, mesh_runner, _mesh_net_device) = foa_mesh::new_mesh_interface( + mesh_resources, + mesh_vif, + 2, + String::try_from("meshtest").unwrap(), + Rng::new(peripherals.RNG), + ); + info!("Before spawn!"); + spawner.spawn(mesh_task(mesh_runner)).unwrap(); + info!("Starting!"); + + mesh_control + .start() + .await + .expect("Failed to start Mesh interface."); + loop { + Timer::after_millis(1000).await; + debug!("still alive!"); + } +} diff --git a/foa/Cargo.lock b/foa/Cargo.lock index c117aaf..05c1967 100644 --- a/foa/Cargo.lock +++ b/foa/Cargo.lock @@ -24,15 +24,15 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.98" +version = "1.0.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" +checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100" [[package]] name = "autocfg" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "basic-toml" @@ -82,9 +82,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.9.1" +version = "2.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" +checksum = "6a65b545ab31d687cff52899d4890855fec459eb6afe0da6417b8a18da87aa29" [[package]] name = "block-buffer" @@ -97,9 +97,9 @@ dependencies = [ [[package]] name = "bytemuck" -version = "1.23.1" +version = "1.23.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c76a5792e44e4abe34d3abf15636779261d45a7450612059293d1d2cfc63422" +checksum = "3995eaeebcdf32f91f980d360f78732ddc061097ab4e39991ae7a6ace9194677" [[package]] name = "byteorder" @@ -140,9 +140,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.4.2" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" dependencies = [ "cfg-if", ] @@ -169,8 +169,18 @@ version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" dependencies = [ - "darling_core", - "darling_macro", + "darling_core 0.20.11", + "darling_macro 0.20.11", +] + +[[package]] +name = "darling" +version = "0.21.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08440b3dd222c3d0433e63e097463969485f112baff337dfdaca043a0d760570" +dependencies = [ + "darling_core 0.21.2", + "darling_macro 0.21.2", ] [[package]] @@ -187,13 +197,37 @@ dependencies = [ "syn", ] +[[package]] +name = "darling_core" +version = "0.21.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25b7912bc28a04ab1b7715a68ea03aaa15662b43a1a4b2c480531fd19f8bf7e" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "darling_macro" version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ - "darling_core", + "darling_core 0.20.11", + "quote", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.21.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce154b9bea7fb0c8e8326e62d00354000c36e79770ff21b8c84e3aa267d9d531" +dependencies = [ + "darling_core 0.21.2", "quote", "syn", ] @@ -269,9 +303,9 @@ dependencies = [ [[package]] name = "delegate" -version = "0.13.3" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9b6483c2bbed26f97861cf57651d4f2b731964a28cd2257f934a4b452480d21" +checksum = "6178a82cf56c836a3ba61a7935cdb1c49bfaa6fa4327cd5bf554a503087de26b" dependencies = [ "proc-macro2", "quote", @@ -300,10 +334,11 @@ dependencies = [ [[package]] name = "embassy-embedded-hal" -version = "0.3.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fea5ef5bed4d3468dfd44f5c9fa4cda8f54c86d4fb4ae683eacf9d39e2ea12" +checksum = "8c62a3bf127e03832fb97d8b01a058775e617653bc89e2a12c256485a7fb54c1" dependencies = [ + "embassy-embedded-hal 0.4.0", "embassy-futures", "embassy-sync 0.6.2", "embassy-time", @@ -315,12 +350,38 @@ dependencies = [ "nb 1.1.0", ] +[[package]] +name = "embassy-embedded-hal" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1611b7a7ab5d1fbed84c338df26d56fd9bded58006ebb029075112ed2c5e039" +dependencies = [ + "embassy-futures", + "embassy-hal-internal", + "embassy-sync 0.7.1", + "embedded-hal 0.2.7", + "embedded-hal 1.0.0", + "embedded-hal-async", + "embedded-storage", + "embedded-storage-async", + "nb 1.1.0", +] + [[package]] name = "embassy-futures" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f878075b9794c1e4ac788c95b728f26aa6366d32eeb10c7051389f898f7d067" +[[package]] +name = "embassy-hal-internal" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95285007a91b619dc9f26ea8f55452aa6c60f7115a4edc05085cd2bd3127cd7a" +dependencies = [ + "num-traits", +] + [[package]] name = "embassy-sync" version = "0.6.2" @@ -337,15 +398,15 @@ dependencies = [ [[package]] name = "embassy-sync" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cef1a8a1ea892f9b656de0295532ac5d8067e9830d49ec75076291fd6066b136" +checksum = "03c372c90d3525a648684fa1c131decaf7d9ff181030db09c876fad6043443b9" dependencies = [ "cfg-if", "critical-section", "embedded-io-async", + "futures-core", "futures-sink", - "futures-util", "heapless", ] @@ -376,9 +437,12 @@ dependencies = [ [[package]] name = "embassy-usb-driver" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fc247028eae04174b6635104a35b1ed336aabef4654f5e87a8f32327d231970" +checksum = "340c5ce591ef58c6449e43f51d2c53efe1bf0bb6a40cbf80afa0d259c7d52c76" +dependencies = [ + "embedded-io-async", +] [[package]] name = "embassy-usb-synopsys-otg" @@ -457,20 +521,20 @@ dependencies = [ [[package]] name = "enumset" -version = "1.1.6" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11a6b7c3d347de0a9f7bfd2f853be43fe32fa6fac30c70f6d6d67a1e936b87ee" +checksum = "41326c68a68a5d2235daf392dc0da9f342a6579284b1a12ce1e6fed6c95fe19e" dependencies = [ "enumset_derive", ] [[package]] name = "enumset_derive" -version = "0.11.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6da3ea9e1d1a3b1593e15781f930120e72aa7501610b2f82e5b6739c72e8eac5" +checksum = "86b0b3dd7a4444d18c9331b659b5f309577448a2e47f0c125fed64407bc0a82c" dependencies = [ - "darling", + "darling 0.21.2", "proc-macro2", "quote", "syn", @@ -502,14 +566,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3887eda2917deef3d99e7a5c324f9190714e99055361ad36890dffd0a995b49" dependencies = [ "bitfield", - "bitflags 2.9.1", + "bitflags 2.9.2", "bytemuck", "cfg-if", "critical-section", "delegate", "digest", "document-features", - "embassy-embedded-hal", + "embassy-embedded-hal 0.3.2", "embassy-futures", "embassy-sync 0.6.2", "embassy-usb-driver", @@ -635,7 +699,7 @@ dependencies = [ "defmt", "defmt-or-log", "embassy-futures", - "embassy-sync 0.7.0", + "embassy-sync 0.7.1", "embassy-time", "esp-hal", "esp-wifi-sys", @@ -755,7 +819,7 @@ dependencies = [ "defmt", "defmt-or-log", "embassy-futures", - "embassy-sync 0.7.0", + "embassy-sync 0.7.1", "embassy-time", "esp-config", "esp-hal", @@ -832,9 +896,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.4" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" [[package]] name = "heapless" @@ -869,9 +933,9 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "ieee80211" -version = "0.5.7" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c708bbeae0b32ebeb6847424a9561a1a10855b9357309427c884dc93c181e7d" +checksum = "7418f9be3522922d6e87647eacd5275641f6c225cf4a444a64c31e366ac37559" dependencies = [ "aes-kw", "bitfield-struct", @@ -893,9 +957,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.9.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" +checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" dependencies = [ "equivalent", "hashbrown", @@ -919,11 +983,11 @@ dependencies = [ [[package]] name = "instability" -version = "0.3.7" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf9fed6d91cfb734e7476a06bde8300a1b94e217e1b523b6f0cd1a01998c71d" +checksum = "435d80800b936787d62688c927b6490e887c7ef5ff9ce922c6c6050fca75eb9a" dependencies = [ - "darling", + "darling 0.20.11", "indoc", "proc-macro2", "quote", @@ -938,15 +1002,15 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "libc" -version = "0.2.173" +version = "0.2.175" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8cfeafaffdbc32176b64fb251369d52ea9f0a8fbc6f8759edffef7b525d64bb" +checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" [[package]] name = "litrs" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5" +checksum = "f5e54036fe321fd421e10d732f155734c4e4afd610dd556d9a82833ab3ee0bed" dependencies = [ "proc-macro2", ] @@ -1156,9 +1220,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.95" +version = "1.0.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +checksum = "d61789d7719defeb74ea5fe81f2fdfdbd28a803847077cecce2ff14e1472f6f1" dependencies = [ "unicode-ident", ] @@ -1237,12 +1301,6 @@ dependencies = [ "syn", ] -[[package]] -name = "rustversion" -version = "1.0.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" - [[package]] name = "ryu" version = "1.0.20" @@ -1347,23 +1405,22 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "strum" -version = "0.27.1" +version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f64def088c51c9510a8579e3c5d67c65349dcf755e5479ad3d010aa6454e2c32" +checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" dependencies = [ "strum_macros", ] [[package]] name = "strum_macros" -version = "0.27.1" +version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c77a8c5abcaf0f9ce05d62342b7d298c346515365c36b673df4ebe3ced01fde8" +checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" dependencies = [ "heck", "proc-macro2", "quote", - "rustversion", "syn", ] @@ -1375,9 +1432,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.103" +version = "2.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4307e30089d6fd6aff212f2da3a1f9e32f3223b1f010fb09b7c95f90f3ca1e8" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" dependencies = [ "proc-macro2", "quote", @@ -1395,18 +1452,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.12" +version = "2.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +checksum = "0b0949c3a6c842cbde3f1686d6eea5a010516deb7085f79db747562d4102f41e" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "2.0.12" +version = "2.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +checksum = "cc5b44b4ab9c2fdd0e0512e6bece8388e214c0749f5862b114cc5b7a25daf227" dependencies = [ "proc-macro2", "quote", @@ -1577,9 +1634,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74c7b26e3480b707944fc872477815d29a8e429d2f93a1ce000f5fa84a15cbcd" +checksum = "f3edebf492c8125044983378ecb5766203ad3b4c2f7a922bd7dd207f6d443e95" dependencies = [ "memchr", ] diff --git a/foa/Cargo.toml b/foa/Cargo.toml index d028f02..4302d84 100644 --- a/foa/Cargo.toml +++ b/foa/Cargo.toml @@ -7,9 +7,9 @@ edition = "2024" embassy-sync = "0.7.0" embassy-futures = "0.1.1" -esp-hal = "=1.0.0-rc.0" -esp-wifi-hal = "=0.1.5" -static_cell = "2.1.1" +esp-hal = "1.0.0-beta.0" +esp-wifi-hal = "0.1.0-alpha.4" +static_cell = "2.1.0" critical-section = "1.2.0" portable-atomic = "1.11.1" esp-config = "0.5.0" @@ -17,7 +17,7 @@ defmt-or-log = { version = "0.2.1", default-features = false } defmt = { version = "1.0.1", optional = true } embassy-time = "0.4.0" heapless = "0.8.0" -ieee80211 = "0.5.7" +ieee80211 = "0.5.9" [build-dependencies] esp-config = { version = "0.5.0", features = ["build"] } diff --git a/foa_awdl/Cargo.lock b/foa_awdl/Cargo.lock index 7669791..723c5a1 100644 --- a/foa_awdl/Cargo.lock +++ b/foa_awdl/Cargo.lock @@ -24,15 +24,15 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.98" +version = "1.0.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" +checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100" [[package]] name = "autocfg" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "awdl-frame-parser" @@ -98,9 +98,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.9.1" +version = "2.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" +checksum = "6a65b545ab31d687cff52899d4890855fec459eb6afe0da6417b8a18da87aa29" [[package]] name = "block-buffer" @@ -113,9 +113,9 @@ dependencies = [ [[package]] name = "bytemuck" -version = "1.23.1" +version = "1.23.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c76a5792e44e4abe34d3abf15636779261d45a7450612059293d1d2cfc63422" +checksum = "3995eaeebcdf32f91f980d360f78732ddc061097ab4e39991ae7a6ace9194677" [[package]] name = "byteorder" @@ -156,9 +156,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.4.2" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" dependencies = [ "cfg-if", ] @@ -185,8 +185,18 @@ version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" dependencies = [ - "darling_core", - "darling_macro", + "darling_core 0.20.11", + "darling_macro 0.20.11", +] + +[[package]] +name = "darling" +version = "0.21.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08440b3dd222c3d0433e63e097463969485f112baff337dfdaca043a0d760570" +dependencies = [ + "darling_core 0.21.2", + "darling_macro 0.21.2", ] [[package]] @@ -203,13 +213,37 @@ dependencies = [ "syn", ] +[[package]] +name = "darling_core" +version = "0.21.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25b7912bc28a04ab1b7715a68ea03aaa15662b43a1a4b2c480531fd19f8bf7e" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "darling_macro" version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ - "darling_core", + "darling_core 0.20.11", + "quote", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.21.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce154b9bea7fb0c8e8326e62d00354000c36e79770ff21b8c84e3aa267d9d531" +dependencies = [ + "darling_core 0.21.2", "quote", "syn", ] @@ -229,15 +263,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "87c5c1460bfb0f719e899feab6ae532e5e0f059cdc85913bab8e6a0d7980245e" -[[package]] -name = "defmt" -version = "0.3.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0963443817029b2024136fc4dd07a5107eb8f977eaf18fcd1fdeb11306b64ad" -dependencies = [ - "defmt 1.0.1", -] - [[package]] name = "defmt" version = "1.0.1" @@ -263,11 +288,11 @@ dependencies = [ [[package]] name = "defmt-or-log" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8370630b4dee85ab47d9087813771c5c7fe88d24fdd48649bbdfe6089da4c53a" +checksum = "4439fab1ae9faccf0f69cdf2671989ba40f246e178c7f87d6e4fd5270e53a979" dependencies = [ - "defmt 0.3.100", + "defmt", "defmt-or-log-macros", "log", ] @@ -294,9 +319,9 @@ dependencies = [ [[package]] name = "delegate" -version = "0.13.3" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9b6483c2bbed26f97861cf57651d4f2b731964a28cd2257f934a4b452480d21" +checksum = "6178a82cf56c836a3ba61a7935cdb1c49bfaa6fa4327cd5bf554a503087de26b" dependencies = [ "proc-macro2", "quote", @@ -325,10 +350,11 @@ dependencies = [ [[package]] name = "embassy-embedded-hal" -version = "0.3.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fea5ef5bed4d3468dfd44f5c9fa4cda8f54c86d4fb4ae683eacf9d39e2ea12" +checksum = "8c62a3bf127e03832fb97d8b01a058775e617653bc89e2a12c256485a7fb54c1" dependencies = [ + "embassy-embedded-hal 0.4.0", "embassy-futures", "embassy-sync 0.6.2", "embassy-time", @@ -340,12 +366,38 @@ dependencies = [ "nb 1.1.0", ] +[[package]] +name = "embassy-embedded-hal" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1611b7a7ab5d1fbed84c338df26d56fd9bded58006ebb029075112ed2c5e039" +dependencies = [ + "embassy-futures", + "embassy-hal-internal", + "embassy-sync 0.7.1", + "embedded-hal 0.2.7", + "embedded-hal 1.0.0", + "embedded-hal-async", + "embedded-storage", + "embedded-storage-async", + "nb 1.1.0", +] + [[package]] name = "embassy-futures" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f878075b9794c1e4ac788c95b728f26aa6366d32eeb10c7051389f898f7d067" +[[package]] +name = "embassy-hal-internal" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95285007a91b619dc9f26ea8f55452aa6c60f7115a4edc05085cd2bd3127cd7a" +dependencies = [ + "num-traits", +] + [[package]] name = "embassy-net-driver" version = "0.2.0" @@ -354,13 +406,13 @@ checksum = "524eb3c489760508f71360112bca70f6e53173e6fe48fc5f0efd0f5ab217751d" [[package]] name = "embassy-net-driver-channel" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4818c32afec43e3cae234f324bad9a976c9aa7501022d26ff60a4017a1a006b7" +checksum = "25a567ab50319d866ad5e6c583ed665ba9b07865389644d3d82e45bf1497c934" dependencies = [ "embassy-futures", "embassy-net-driver", - "embassy-sync 0.6.2", + "embassy-sync 0.7.1", ] [[package]] @@ -379,15 +431,15 @@ dependencies = [ [[package]] name = "embassy-sync" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cef1a8a1ea892f9b656de0295532ac5d8067e9830d49ec75076291fd6066b136" +checksum = "03c372c90d3525a648684fa1c131decaf7d9ff181030db09c876fad6043443b9" dependencies = [ "cfg-if", "critical-section", "embedded-io-async", + "futures-core", "futures-sink", - "futures-util", "heapless", ] @@ -418,9 +470,12 @@ dependencies = [ [[package]] name = "embassy-usb-driver" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fc247028eae04174b6635104a35b1ed336aabef4654f5e87a8f32327d231970" +checksum = "340c5ce591ef58c6449e43f51d2c53efe1bf0bb6a40cbf80afa0d259c7d52c76" +dependencies = [ + "embedded-io-async", +] [[package]] name = "embassy-usb-synopsys-otg" @@ -497,34 +552,22 @@ dependencies = [ "embedded-storage", ] -[[package]] -name = "enum-as-inner" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "enumset" -version = "1.1.6" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11a6b7c3d347de0a9f7bfd2f853be43fe32fa6fac30c70f6d6d67a1e936b87ee" +checksum = "41326c68a68a5d2235daf392dc0da9f342a6579284b1a12ce1e6fed6c95fe19e" dependencies = [ "enumset_derive", ] [[package]] name = "enumset_derive" -version = "0.11.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6da3ea9e1d1a3b1593e15781f930120e72aa7501610b2f82e5b6739c72e8eac5" +checksum = "86b0b3dd7a4444d18c9331b659b5f309577448a2e47f0c125fed64407bc0a82c" dependencies = [ - "darling", + "darling 0.21.2", "proc-macro2", "quote", "syn", @@ -537,43 +580,44 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] -name = "esp-build" -version = "0.3.0" +name = "esp-config" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "837020ff95fbf4c15c206541dda7994f1bbe6e1505e36a6a5ecb51fdb61656d7" +checksum = "2c8c4c95d8d6243ddb39efe1fcf2524c9becd0f86bb3e24048ed30b4f553609f" dependencies = [ - "quote", - "syn", - "termcolor", + "document-features", + "serde", + "serde_json", ] [[package]] name = "esp-config" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c8c4c95d8d6243ddb39efe1fcf2524c9becd0f86bb3e24048ed30b4f553609f" +checksum = "abd4a8db4b72794637a25944bc8d361c3cc271d4f03987ce8741312b6b61529c" dependencies = [ "document-features", + "esp-metadata-generated", + "evalexpr", "serde", - "serde_json", + "serde_yaml", ] [[package]] name = "esp-hal" -version = "1.0.0-beta.1" +version = "1.0.0-rc.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d973697621cd3eef9c3f260fa8c1af77d8547cfc92734255d8e8ddf05c7d331" +checksum = "f3887eda2917deef3d99e7a5c324f9190714e99055361ad36890dffd0a995b49" dependencies = [ - "basic-toml", "bitfield", - "bitflags 2.9.1", + "bitflags 2.9.2", "bytemuck", "cfg-if", "critical-section", "delegate", "digest", "document-features", - "embassy-embedded-hal", + "embassy-embedded-hal 0.3.2", "embassy-futures", "embassy-sync 0.6.2", "embassy-usb-driver", @@ -584,14 +628,19 @@ dependencies = [ "embedded-io", "embedded-io-async", "enumset", - "esp-build", - "esp-config", + "esp-config 0.5.0", "esp-hal-procmacros", - "esp-metadata", + "esp-metadata-generated", "esp-riscv-rt", + "esp-rom-sys", "esp-synopsys-usb-otg", "esp32", + "esp32c2", + "esp32c3", + "esp32c6", + "esp32h2", "esp32s2", + "esp32s3", "fugit", "instability", "nb 1.1.0", @@ -609,44 +658,66 @@ dependencies = [ [[package]] name = "esp-hal-procmacros" -version = "0.18.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73164008cb2eada2ef85e6b0e459001d851f9b8e65e96e0d594bdfa8cf1b813b" +checksum = "fbece384edaf0d1eabfa45afa96d910634d4158638ef983b2d419a8dec832246" dependencies = [ - "darling", "document-features", "litrs", "object", "proc-macro-crate", - "proc-macro-error2", "proc-macro2", "quote", "syn", + "termcolor", ] [[package]] name = "esp-metadata" -version = "0.7.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0154d59933c2419ef25a01938517cc6969f47b6af53ebb34c279393aa20d9654" +checksum = "a6fbc1d166be84c0750f121e95c8989ddebd7e7bdd86af3594a6cfb34f039650" dependencies = [ "anyhow", "basic-toml", + "indexmap", + "proc-macro2", + "quote", "serde", "strum", ] +[[package]] +name = "esp-metadata-generated" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "189d36b8c8a752bdebec67fd02a15ebb1432feea345553749bca7ce2393cc795" +dependencies = [ + "esp-metadata", +] + [[package]] name = "esp-riscv-rt" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c05c2badd16cbd6307d463090615332b77c17a6766b41ba5fe5bb783310e8af6" +checksum = "9a00370dfcb0ccc01c6b2540076379c6efd6890a27f584de217c38e3239e19d5" dependencies = [ "document-features", "riscv", "riscv-rt-macros", ] +[[package]] +name = "esp-rom-sys" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "646aca2b30503b6c6f34250255fbd5887fd0c4104ea90802c1fea34f3035e7d6" +dependencies = [ + "cfg-if", + "document-features", + "esp-metadata-generated", +] + [[package]] name = "esp-synopsys-usb-otg" version = "0.4.2" @@ -662,17 +733,17 @@ dependencies = [ [[package]] name = "esp-wifi-hal" -version = "0.1.3" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7838d40d074742d5f46c3660217788c133793fc8cdb5af80225433131233646" +checksum = "e6bea2e1ce476a20f260e3474da0506b0583ac86effd4861f5144a2ca515aa73" dependencies = [ "bitfield-struct", "cfg-if", "critical-section", - "defmt 1.0.1", + "defmt", "defmt-or-log", "embassy-futures", - "embassy-sync 0.7.0", + "embassy-sync 0.7.1", "embassy-time", "esp-hal", "esp-wifi-sys", @@ -694,9 +765,49 @@ dependencies = [ [[package]] name = "esp32" -version = "0.37.0" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7680f79e3a4770e59c2dc25b17dcd852921ee57ffae9a4c4806c9ca5001d54d" +dependencies = [ + "critical-section", + "vcell", +] + +[[package]] +name = "esp32c2" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83ddfdb413ef0739d84bd3fce771e6e0feb6457ac1bcdd7a1dcd6326061e919d" +checksum = "da1bcf86fca83543e0e95561cba27bbcc6b6e7adc5428f49187f5868bc0c3ed2" +dependencies = [ + "critical-section", + "vcell", +] + +[[package]] +name = "esp32c3" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce2c5a33d4377f974cbe8cadf8307f04f2c39755704cb09e81852c63ee4ac7b8" +dependencies = [ + "critical-section", + "vcell", +] + +[[package]] +name = "esp32c6" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ca8fc81b7164df58b5e04aaac9e987459312e51903cca807317990293973a6e" +dependencies = [ + "critical-section", + "vcell", +] + +[[package]] +name = "esp32h2" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80171d08c17d8c63b53334c60ca654786a7593481531d19b639c4e5c76d276de" dependencies = [ "critical-section", "vcell", @@ -704,9 +815,19 @@ dependencies = [ [[package]] name = "esp32s2" -version = "0.28.0" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c90d347480fca91f4be3e94b576af9c6c7987795c58dc3c5a7c108b6b3966dc" +dependencies = [ + "critical-section", + "vcell", +] + +[[package]] +name = "esp32s3" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4391e38b14eb59a675e816598bde7d9b8c8f43a695a284bd97bcd0cf3092404" +checksum = "a3769c56222c4548833f236c7009f1f8b3f2387af26366f6bd1cea456666a49d" dependencies = [ "critical-section", "vcell", @@ -732,6 +853,12 @@ dependencies = [ "scroll", ] +[[package]] +name = "evalexpr" +version = "12.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02a3229bec56a977f174b32fe7b8d89e8c79ebb4493d10ad763b6676dc2dc0c9" + [[package]] name = "fnv" version = "1.0.7" @@ -743,12 +870,12 @@ name = "foa" version = "0.1.0" dependencies = [ "critical-section", - "defmt 1.0.1", + "defmt", "defmt-or-log", "embassy-futures", - "embassy-sync 0.7.0", + "embassy-sync 0.7.1", "embassy-time", - "esp-config", + "esp-config 0.5.0", "esp-hal", "esp-wifi-hal", "heapless", @@ -762,13 +889,13 @@ name = "foa_awdl" version = "0.1.0" dependencies = [ "awdl-frame-parser", - "defmt 1.0.1", + "defmt", "defmt-or-log", "embassy-futures", "embassy-net-driver-channel", - "embassy-sync 0.7.0", + "embassy-sync 0.7.1", "embassy-time", - "esp-config", + "esp-config 0.4.0", "ether-type", "ethernet", "foa", @@ -845,9 +972,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.4" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" [[package]] name = "heapless" @@ -882,15 +1009,15 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "ieee80211" -version = "0.5.7" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c708bbeae0b32ebeb6847424a9561a1a10855b9357309427c884dc93c181e7d" +checksum = "7418f9be3522922d6e87647eacd5275641f6c225cf4a444a64c31e366ac37559" dependencies = [ "aes-kw", "bitfield-struct", "const_soft_float", "crc32fast", - "defmt 1.0.1", + "defmt", "digest", "hmac", "llc-rs", @@ -906,12 +1033,13 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.9.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" +checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" dependencies = [ "equivalent", "hashbrown", + "serde", ] [[package]] @@ -931,11 +1059,11 @@ dependencies = [ [[package]] name = "instability" -version = "0.3.7" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf9fed6d91cfb734e7476a06bde8300a1b94e217e1b523b6f0cd1a01998c71d" +checksum = "435d80800b936787d62688c927b6490e887c7ef5ff9ce922c6c6050fca75eb9a" dependencies = [ - "darling", + "darling 0.20.11", "indoc", "proc-macro2", "quote", @@ -950,15 +1078,15 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "libc" -version = "0.2.173" +version = "0.2.175" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8cfeafaffdbc32176b64fb251369d52ea9f0a8fbc6f8759edffef7b525d64bb" +checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" [[package]] name = "litrs" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5" +checksum = "f5e54036fe321fd421e10d732f155734c4e4afd610dd556d9a82833ab3ee0bed" dependencies = [ "proc-macro2", ] @@ -986,7 +1114,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b31995b891e21d023d0e7732e8ea7634ca58101f1352b159eb64234824d899f8" dependencies = [ - "defmt 1.0.1", + "defmt", "scroll", ] @@ -1011,15 +1139,6 @@ version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" -[[package]] -name = "minijinja" -version = "2.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd72e8b4e42274540edabec853f607c015c73436159b06c39c7af85a20433155" -dependencies = [ - "serde", -] - [[package]] name = "nb" version = "0.1.3" @@ -1183,9 +1302,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.95" +version = "1.0.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +checksum = "d61789d7719defeb74ea5fe81f2fdfdbd28a803847077cecce2ff14e1472f6f1" dependencies = [ "unicode-ident", ] @@ -1264,12 +1383,6 @@ dependencies = [ "syn", ] -[[package]] -name = "rustversion" -version = "1.0.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" - [[package]] name = "ryu" version = "1.0.20" @@ -1318,9 +1431,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.140" +version = "1.0.142" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +checksum = "030fedb782600dcbd6f02d479bf0d817ac3bb40d644745b769d6a96bc3afc5a7" dependencies = [ "itoa", "memchr", @@ -1329,12 +1442,16 @@ dependencies = [ ] [[package]] -name = "serde_spanned" -version = "0.6.9" +name = "serde_yaml" +version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ + "indexmap", + "itoa", + "ryu", "serde", + "unsafe-libyaml", ] [[package]] @@ -1380,9 +1497,9 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" [[package]] name = "static_cell" -version = "2.1.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d89b0684884a883431282db1e4343f34afc2ff6996fe1f4a1664519b66e14c1e" +checksum = "0530892bb4fa575ee0da4b86f86c667132a94b74bb72160f58ee5a4afec74c23" dependencies = [ "portable-atomic", ] @@ -1395,23 +1512,22 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "strum" -version = "0.27.1" +version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f64def088c51c9510a8579e3c5d67c65349dcf755e5479ad3d010aa6454e2c32" +checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" dependencies = [ "strum_macros", ] [[package]] name = "strum_macros" -version = "0.27.1" +version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c77a8c5abcaf0f9ce05d62342b7d298c346515365c36b673df4ebe3ced01fde8" +checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" dependencies = [ "heck", "proc-macro2", "quote", - "rustversion", "syn", ] @@ -1423,9 +1539,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.103" +version = "2.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4307e30089d6fd6aff212f2da3a1f9e32f3223b1f010fb09b7c95f90f3ca1e8" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" dependencies = [ "proc-macro2", "quote", @@ -1443,18 +1559,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.12" +version = "2.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +checksum = "0b0949c3a6c842cbde3f1686d6eea5a010516deb7085f79db747562d4102f41e" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "2.0.12" +version = "2.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +checksum = "cc5b44b4ab9c2fdd0e0512e6bece8388e214c0749f5862b114cc5b7a25daf227" dependencies = [ "proc-macro2", "quote", @@ -1472,26 +1588,11 @@ dependencies = [ "scroll", ] -[[package]] -name = "toml" -version = "0.8.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" -dependencies = [ - "serde", - "serde_spanned", - "toml_datetime", - "toml_edit", -] - [[package]] name = "toml_datetime" version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" -dependencies = [ - "serde", -] [[package]] name = "toml_edit" @@ -1500,19 +1601,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ "indexmap", - "serde", - "serde_spanned", "toml_datetime", - "toml_write", "winnow", ] -[[package]] -name = "toml_write" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" - [[package]] name = "try_take" version = "0.1.0" @@ -1537,6 +1629,12 @@ version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +[[package]] +name = "unsafe-libyaml" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" + [[package]] name = "usb-device" version = "0.3.2" @@ -1649,48 +1747,40 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74c7b26e3480b707944fc872477815d29a8e429d2f93a1ce000f5fa84a15cbcd" +checksum = "f3edebf492c8125044983378ecb5766203ad3b4c2f7a922bd7dd207f6d443e95" dependencies = [ "memchr", ] [[package]] name = "xtensa-lx" -version = "0.11.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68737a6c8f32ddcd97476acf68ddc6d411697fd94f64a601af16854b74967dff" +checksum = "3a564fffeb3cd773a524e8d8a5c66ca5e9739ea7450e36a3e6a54dd31f1e652f" dependencies = [ "critical-section", - "document-features", ] [[package]] name = "xtensa-lx-rt" -version = "0.19.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "235815f34d1bf9c2f9c07917e2b63efbcab5ca5ce9d8faddb97b7105eed1ade3" +checksum = "520a8fb0121eb6868f4f5ff383e262dc863f9042496724e01673a98a9b7e6c2b" dependencies = [ - "anyhow", "document-features", - "enum-as-inner", - "minijinja", "r0", - "serde", - "strum", - "toml", "xtensa-lx", "xtensa-lx-rt-proc-macros", ] [[package]] name = "xtensa-lx-rt-proc-macros" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c1ab67b22f0576b953a25c43bdfed0ff84af2e01ced85e95c29e7bac6bf2180" +checksum = "c5a56a616147f5947ceb673790dd618d77b30e26e677f4a896df049d73059438" dependencies = [ - "darling", "proc-macro2", "quote", "syn", diff --git a/foa_awdl/Cargo.toml b/foa_awdl/Cargo.toml index 64080b4..63f2e1a 100644 --- a/foa_awdl/Cargo.toml +++ b/foa_awdl/Cargo.toml @@ -7,7 +7,7 @@ edition = "2021" embassy-futures = "0.1.1" embassy-sync = "0.7.0" embassy-time = "0.4.0" -ieee80211 = "0.5.7" +ieee80211 = "0.5.9" foa = { path = "../foa/" } heapless = "0.8.0" rand_core = "0.9.3" diff --git a/foa_mesh/.cargo/config.toml b/foa_mesh/.cargo/config.toml new file mode 100644 index 0000000..85dad2e --- /dev/null +++ b/foa_mesh/.cargo/config.toml @@ -0,0 +1,3 @@ +[unstable] +build-std = ["core"] + diff --git a/foa_mesh/.gitignore b/foa_mesh/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/foa_mesh/.gitignore @@ -0,0 +1 @@ +/target diff --git a/foa_mesh/.vscode/settings.json b/foa_mesh/.vscode/settings.json new file mode 100644 index 0000000..5e676b8 --- /dev/null +++ b/foa_mesh/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "rust-analyzer.check.allTargets": false, + "rust-analyzer.cargo.target": "xtensa-esp32-none-elf", + "rust-analyzer.cargo.features": ["esp32"], + "editor.formatOnSave": true +} diff --git a/foa_mesh/Cargo.lock b/foa_mesh/Cargo.lock new file mode 100644 index 0000000..6fe1e12 --- /dev/null +++ b/foa_mesh/Cargo.lock @@ -0,0 +1,1738 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "aes-kw" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69fa2b352dcefb5f7f3a5fb840e02665d311d878955380515e4fd50095dd3d8c" +dependencies = [ + "aes", +] + +[[package]] +name = "anyhow" +version = "1.0.99" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100" + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "basic-toml" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba62675e8242a4c4e806d12f11d136e626e6c8361d6b829310732241652a178a" +dependencies = [ + "serde", +] + +[[package]] +name = "bitfield" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db1bcd90f88eabbf0cadbfb87a45bceeaebcd3b4bc9e43da379cd2ef0162590d" +dependencies = [ + "bitfield-macros", +] + +[[package]] +name = "bitfield-macros" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3787a07661997bfc05dd3431e379c0188573f78857080cf682e1393ab8e4d64c" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "bitfield-struct" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3ca019570363e800b05ad4fd890734f28ac7b72f563ad8a35079efb793616f8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a65b545ab31d687cff52899d4890855fec459eb6afe0da6417b8a18da87aa29" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bytemuck" +version = "1.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3995eaeebcdf32f91f980d360f78732ddc061097ab4e39991ae7a6ace9194677" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "cfg-if" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + +[[package]] +name = "const_soft_float" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87ca1caa64ef4ed453e68bb3db612e51cf1b2f5b871337f0fcab1c8f87cc3dff" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "critical-section" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "darling" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" +dependencies = [ + "darling_core 0.20.11", + "darling_macro 0.20.11", +] + +[[package]] +name = "darling" +version = "0.21.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08440b3dd222c3d0433e63e097463969485f112baff337dfdaca043a0d760570" +dependencies = [ + "darling_core 0.21.2", + "darling_macro 0.21.2", +] + +[[package]] +name = "darling_core" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn", +] + +[[package]] +name = "darling_core" +version = "0.21.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25b7912bc28a04ab1b7715a68ea03aaa15662b43a1a4b2c480531fd19f8bf7e" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" +dependencies = [ + "darling_core 0.20.11", + "quote", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.21.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce154b9bea7fb0c8e8326e62d00354000c36e79770ff21b8c84e3aa267d9d531" +dependencies = [ + "darling_core 0.21.2", + "quote", + "syn", +] + +[[package]] +name = "defile" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa3324a455850286c803c1c16d3835a44a9457765899417775e4dc6080cd942d" +dependencies = [ + "defile-proc_macros", +] + +[[package]] +name = "defile-proc_macros" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87c5c1460bfb0f719e899feab6ae532e5e0f059cdc85913bab8e6a0d7980245e" + +[[package]] +name = "defmt" +version = "0.3.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0963443817029b2024136fc4dd07a5107eb8f977eaf18fcd1fdeb11306b64ad" +dependencies = [ + "defmt 1.0.1", +] + +[[package]] +name = "defmt" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "548d977b6da32fa1d1fda2876453da1e7df63ad0304c8b3dae4dbe7b96f39b78" +dependencies = [ + "bitflags 1.3.2", + "defmt-macros", +] + +[[package]] +name = "defmt-macros" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d4fc12a85bcf441cfe44344c4b72d58493178ce635338a3f3b78943aceb258e" +dependencies = [ + "defmt-parser", + "proc-macro-error2", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "defmt-or-log" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4439fab1ae9faccf0f69cdf2671989ba40f246e178c7f87d6e4fd5270e53a979" +dependencies = [ + "defmt 1.0.1", + "defmt-or-log-macros", + "log", +] + +[[package]] +name = "defmt-or-log-macros" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d675dd299edbb7c8e01d4e9f520a0d8f22a8fe4af812c211c3fad5e9dcf41763" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "defmt-parser" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10d60334b3b2e7c9d91ef8150abfb6fa4c1c39ebbcf4a81c2e346aad939fee3e" +dependencies = [ + "thiserror", +] + +[[package]] +name = "delegate" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6178a82cf56c836a3ba61a7935cdb1c49bfaa6fa4327cd5bf554a503087de26b" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", + "subtle", +] + +[[package]] +name = "document-features" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95249b50c6c185bee49034bcb378a49dc2b5dff0be90ff6616d31d64febab05d" +dependencies = [ + "litrs", +] + +[[package]] +name = "embassy-embedded-hal" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c62a3bf127e03832fb97d8b01a058775e617653bc89e2a12c256485a7fb54c1" +dependencies = [ + "embassy-embedded-hal 0.4.0", + "embassy-futures", + "embassy-sync 0.6.2", + "embassy-time", + "embedded-hal 0.2.7", + "embedded-hal 1.0.0", + "embedded-hal-async", + "embedded-storage", + "embedded-storage-async", + "nb 1.1.0", +] + +[[package]] +name = "embassy-embedded-hal" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1611b7a7ab5d1fbed84c338df26d56fd9bded58006ebb029075112ed2c5e039" +dependencies = [ + "embassy-futures", + "embassy-hal-internal", + "embassy-sync 0.7.1", + "embedded-hal 0.2.7", + "embedded-hal 1.0.0", + "embedded-hal-async", + "embedded-storage", + "embedded-storage-async", + "nb 1.1.0", +] + +[[package]] +name = "embassy-futures" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f878075b9794c1e4ac788c95b728f26aa6366d32eeb10c7051389f898f7d067" + +[[package]] +name = "embassy-hal-internal" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95285007a91b619dc9f26ea8f55452aa6c60f7115a4edc05085cd2bd3127cd7a" +dependencies = [ + "num-traits", +] + +[[package]] +name = "embassy-net-driver" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524eb3c489760508f71360112bca70f6e53173e6fe48fc5f0efd0f5ab217751d" + +[[package]] +name = "embassy-net-driver-channel" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25a567ab50319d866ad5e6c583ed665ba9b07865389644d3d82e45bf1497c934" +dependencies = [ + "embassy-futures", + "embassy-net-driver", + "embassy-sync 0.7.1", +] + +[[package]] +name = "embassy-sync" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d2c8cdff05a7a51ba0087489ea44b0b1d97a296ca6b1d6d1a33ea7423d34049" +dependencies = [ + "cfg-if", + "critical-section", + "embedded-io-async", + "futures-sink", + "futures-util", + "heapless", +] + +[[package]] +name = "embassy-sync" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c372c90d3525a648684fa1c131decaf7d9ff181030db09c876fad6043443b9" +dependencies = [ + "cfg-if", + "critical-section", + "embedded-io-async", + "futures-core", + "futures-sink", + "heapless", +] + +[[package]] +name = "embassy-time" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f820157f198ada183ad62e0a66f554c610cdcd1a9f27d4b316358103ced7a1f8" +dependencies = [ + "cfg-if", + "critical-section", + "document-features", + "embassy-time-driver", + "embedded-hal 0.2.7", + "embedded-hal 1.0.0", + "embedded-hal-async", + "futures-util", +] + +[[package]] +name = "embassy-time-driver" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d45f5d833b6d98bd2aab0c2de70b18bfaa10faf661a1578fd8e5dfb15eb7eba" +dependencies = [ + "document-features", +] + +[[package]] +name = "embassy-usb-driver" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "340c5ce591ef58c6449e43f51d2c53efe1bf0bb6a40cbf80afa0d259c7d52c76" +dependencies = [ + "embedded-io-async", +] + +[[package]] +name = "embassy-usb-synopsys-otg" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08e753b23799329780c7ac434264026d0422044d6649ed70a73441b14a6436d7" +dependencies = [ + "critical-section", + "embassy-sync 0.6.2", + "embassy-usb-driver", +] + +[[package]] +name = "embedded-can" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9d2e857f87ac832df68fa498d18ddc679175cf3d2e4aa893988e5601baf9438" +dependencies = [ + "nb 1.1.0", +] + +[[package]] +name = "embedded-hal" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35949884794ad573cf46071e41c9b60efb0cb311e3ca01f7af807af1debc66ff" +dependencies = [ + "nb 0.1.3", + "void", +] + +[[package]] +name = "embedded-hal" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "361a90feb7004eca4019fb28352a9465666b24f840f5c3cddf0ff13920590b89" + +[[package]] +name = "embedded-hal-async" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c4c685bbef7fe13c3c6dd4da26841ed3980ef33e841cddfa15ce8a8fb3f1884" +dependencies = [ + "embedded-hal 1.0.0", +] + +[[package]] +name = "embedded-io" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" + +[[package]] +name = "embedded-io-async" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ff09972d4073aa8c299395be75161d582e7629cd663171d62af73c8d50dba3f" +dependencies = [ + "embedded-io", +] + +[[package]] +name = "embedded-storage" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a21dea9854beb860f3062d10228ce9b976da520a73474aed3171ec276bc0c032" + +[[package]] +name = "embedded-storage-async" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1763775e2323b7d5f0aa6090657f5e21cfa02ede71f5dc40eead06d64dcd15cc" +dependencies = [ + "embedded-storage", +] + +[[package]] +name = "enumset" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41326c68a68a5d2235daf392dc0da9f342a6579284b1a12ce1e6fed6c95fe19e" +dependencies = [ + "enumset_derive", +] + +[[package]] +name = "enumset_derive" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b0b3dd7a4444d18c9331b659b5f309577448a2e47f0c125fed64407bc0a82c" +dependencies = [ + "darling 0.21.2", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "esp-config" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "158dba334d3a2acd8d93873c0ae723ca1037cc78eefe5d6b4c5919b0ca28e38e" +dependencies = [ + "document-features", +] + +[[package]] +name = "esp-config" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abd4a8db4b72794637a25944bc8d361c3cc271d4f03987ce8741312b6b61529c" +dependencies = [ + "document-features", + "esp-metadata-generated", + "evalexpr", + "serde", + "serde_yaml", +] + +[[package]] +name = "esp-hal" +version = "1.0.0-rc.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3887eda2917deef3d99e7a5c324f9190714e99055361ad36890dffd0a995b49" +dependencies = [ + "bitfield", + "bitflags 2.9.2", + "bytemuck", + "cfg-if", + "critical-section", + "delegate", + "digest", + "document-features", + "embassy-embedded-hal 0.3.2", + "embassy-futures", + "embassy-sync 0.6.2", + "embassy-usb-driver", + "embassy-usb-synopsys-otg", + "embedded-can", + "embedded-hal 1.0.0", + "embedded-hal-async", + "embedded-io", + "embedded-io-async", + "enumset", + "esp-config 0.5.0", + "esp-hal-procmacros", + "esp-metadata-generated", + "esp-riscv-rt", + "esp-rom-sys", + "esp-synopsys-usb-otg", + "esp32", + "esp32c2", + "esp32c3", + "esp32c6", + "esp32h2", + "esp32s2", + "esp32s3", + "fugit", + "instability", + "nb 1.1.0", + "paste", + "portable-atomic", + "rand_core 0.6.4", + "rand_core 0.9.3", + "riscv", + "serde", + "strum", + "ufmt-write", + "xtensa-lx", + "xtensa-lx-rt", +] + +[[package]] +name = "esp-hal-procmacros" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbece384edaf0d1eabfa45afa96d910634d4158638ef983b2d419a8dec832246" +dependencies = [ + "document-features", + "litrs", + "object", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", + "termcolor", +] + +[[package]] +name = "esp-metadata" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6fbc1d166be84c0750f121e95c8989ddebd7e7bdd86af3594a6cfb34f039650" +dependencies = [ + "anyhow", + "basic-toml", + "indexmap", + "proc-macro2", + "quote", + "serde", + "strum", +] + +[[package]] +name = "esp-metadata-generated" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "189d36b8c8a752bdebec67fd02a15ebb1432feea345553749bca7ce2393cc795" +dependencies = [ + "esp-metadata", +] + +[[package]] +name = "esp-riscv-rt" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a00370dfcb0ccc01c6b2540076379c6efd6890a27f584de217c38e3239e19d5" +dependencies = [ + "document-features", + "riscv", + "riscv-rt-macros", +] + +[[package]] +name = "esp-rom-sys" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "646aca2b30503b6c6f34250255fbd5887fd0c4104ea90802c1fea34f3035e7d6" +dependencies = [ + "cfg-if", + "document-features", + "esp-metadata-generated", +] + +[[package]] +name = "esp-synopsys-usb-otg" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8938451cb19032f13365328ea66ab38c8d16deecdf322067442297110eb74468" +dependencies = [ + "critical-section", + "embedded-hal 0.2.7", + "ral-registers", + "usb-device", + "vcell", +] + +[[package]] +name = "esp-wifi-hal" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6bea2e1ce476a20f260e3474da0506b0583ac86effd4861f5144a2ca515aa73" +dependencies = [ + "bitfield-struct", + "cfg-if", + "critical-section", + "defmt 1.0.1", + "defmt-or-log", + "embassy-futures", + "embassy-sync 0.7.1", + "embassy-time", + "esp-hal", + "esp-wifi-sys", + "esp32", + "esp32s2", + "macro-bits", + "portable-atomic", + "static_cell", +] + +[[package]] +name = "esp-wifi-sys" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6b5438361891c431970194a733415006fb3d00b6eb70b3dcb66fd58f04d9b39" +dependencies = [ + "anyhow", +] + +[[package]] +name = "esp32" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7680f79e3a4770e59c2dc25b17dcd852921ee57ffae9a4c4806c9ca5001d54d" +dependencies = [ + "critical-section", + "vcell", +] + +[[package]] +name = "esp32c2" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da1bcf86fca83543e0e95561cba27bbcc6b6e7adc5428f49187f5868bc0c3ed2" +dependencies = [ + "critical-section", + "vcell", +] + +[[package]] +name = "esp32c3" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce2c5a33d4377f974cbe8cadf8307f04f2c39755704cb09e81852c63ee4ac7b8" +dependencies = [ + "critical-section", + "vcell", +] + +[[package]] +name = "esp32c6" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ca8fc81b7164df58b5e04aaac9e987459312e51903cca807317990293973a6e" +dependencies = [ + "critical-section", + "vcell", +] + +[[package]] +name = "esp32h2" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80171d08c17d8c63b53334c60ca654786a7593481531d19b639c4e5c76d276de" +dependencies = [ + "critical-section", + "vcell", +] + +[[package]] +name = "esp32s2" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c90d347480fca91f4be3e94b576af9c6c7987795c58dc3c5a7c108b6b3966dc" +dependencies = [ + "critical-section", + "vcell", +] + +[[package]] +name = "esp32s3" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3769c56222c4548833f236c7009f1f8b3f2387af26366f6bd1cea456666a49d" +dependencies = [ + "critical-section", + "vcell", +] + +[[package]] +name = "ether-type" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e886b8e15547bd98f54a78b5ad1b381d825fa8cd09c088615fc00e26957fabd7" +dependencies = [ + "macro-bits", +] + +[[package]] +name = "ethernet" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06a5436daf57432a98a6026008181a7c3e45d9eddfbe04efa044bf69049b7d90" +dependencies = [ + "ether-type", + "mac-parser", + "scroll", +] + +[[package]] +name = "evalexpr" +version = "12.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02a3229bec56a977f174b32fe7b8d89e8c79ebb4493d10ad763b6676dc2dc0c9" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foa" +version = "0.1.0" +dependencies = [ + "critical-section", + "defmt 1.0.1", + "defmt-or-log", + "embassy-futures", + "embassy-sync 0.7.1", + "embassy-time", + "esp-config 0.5.0", + "esp-hal", + "esp-wifi-hal", + "heapless", + "ieee80211", + "portable-atomic", + "static_cell", +] + +[[package]] +name = "foa_mesh" +version = "0.1.0" +dependencies = [ + "defmt 0.3.100", + "defmt-or-log", + "embassy-futures", + "embassy-net-driver-channel", + "embassy-sync 0.6.2", + "embassy-time", + "esp-config 0.3.1", + "ethernet", + "foa", + "heapless", + "ieee80211", + "llc-rs", + "rand_core 0.6.4", +] + +[[package]] +name = "fugit" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17186ad64927d5ac8f02c1e77ccefa08ccd9eaa314d5a4772278aa204a22f7e7" +dependencies = [ + "gcd", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-core", + "futures-task", + "pin-project-lite", + "pin-utils", +] + +[[package]] +name = "gcd" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d758ba1b47b00caf47f24925c0074ecb20d6dfcffe7f6d53395c0465674841a" + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "hash32" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d60b12902ba28e2730cd37e95b8c9223af2808df9e902d4df49588d1470606" +dependencies = [ + "byteorder", +] + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" + +[[package]] +name = "heapless" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bfb9eb618601c89945a70e254898da93b13be0388091d42117462b265bb3fad" +dependencies = [ + "hash32", + "stable_deref_trait", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "ieee80211" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7418f9be3522922d6e87647eacd5275641f6c225cf4a444a64c31e366ac37559" +dependencies = [ + "aes-kw", + "bitfield-struct", + "const_soft_float", + "crc32fast", + "defmt 1.0.1", + "digest", + "hmac", + "llc-rs", + "mac-parser", + "macro-bits", + "num", + "pbkdf2", + "scroll", + "sha1", + "sha2", + "tlv-rs", +] + +[[package]] +name = "indexmap" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" +dependencies = [ + "equivalent", + "hashbrown", + "serde", +] + +[[package]] +name = "indoc" +version = "2.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c7245a08504955605670dbf141fceab975f15ca21570696aebe9d2e71576bd" + +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "generic-array", +] + +[[package]] +name = "instability" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435d80800b936787d62688c927b6490e887c7ef5ff9ce922c6c6050fca75eb9a" +dependencies = [ + "darling 0.20.11", + "indoc", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "libc" +version = "0.2.175" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" + +[[package]] +name = "litrs" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5e54036fe321fd421e10d732f155734c4e4afd610dd556d9a82833ab3ee0bed" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "llc-rs" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33bd85503d851a892baeffb0c56799623e908f55a92d912eabbe568c6e1af45b" +dependencies = [ + "ether-type", + "macro-bits", + "scroll", +] + +[[package]] +name = "log" +version = "0.4.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" + +[[package]] +name = "mac-parser" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b31995b891e21d023d0e7732e8ea7634ca58101f1352b159eb64234824d899f8" +dependencies = [ + "defmt 1.0.1", + "scroll", +] + +[[package]] +name = "macro-bits" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eb7867e4591ecd9f96c60f33481a3a07783d6f1ab2de522d0f243c487260c9a" +dependencies = [ + "defile", +] + +[[package]] +name = "memchr" +version = "2.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" + +[[package]] +name = "nb" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "801d31da0513b6ec5214e9bf433a77966320625a37860f910be265be6e18d06f" +dependencies = [ + "nb 1.1.0", +] + +[[package]] +name = "nb" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d5439c4ad607c3c23abf66de8c8bf57ba8adcd1f129e699851a6e43935d339d" + +[[package]] +name = "no-panic" +version = "0.1.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "113d1abd5bb3dc25a75d9b3a973f40e31eb03e0bae23c172b32cca4bcb9cfad2" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "num" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" +dependencies = [ + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "memchr", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pbkdf2" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" +dependencies = [ + "digest", + "hmac", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "portable-atomic" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" + +[[package]] +name = "proc-macro-crate" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" +dependencies = [ + "toml_edit", +] + +[[package]] +name = "proc-macro-error-attr2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-error2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +dependencies = [ + "proc-macro-error-attr2", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "proc-macro2" +version = "1.0.97" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d61789d7719defeb74ea5fe81f2fdfdbd28a803847077cecce2ff14e1472f6f1" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r0" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd7a31eed1591dcbc95d92ad7161908e72f4677f8fabf2a32ca49b4237cbf211" + +[[package]] +name = "ral-registers" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46b71a9d9206e8b46714c74255adcaea8b11e0350c1d8456165073c3f75fc81a" + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" + +[[package]] +name = "riscv" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ea8ff73d3720bdd0a97925f0bf79ad2744b6da8ff36be3840c48ac81191d7a7" +dependencies = [ + "critical-section", + "embedded-hal 1.0.0", + "paste", + "riscv-macros", + "riscv-pac", +] + +[[package]] +name = "riscv-macros" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f265be5d634272320a7de94cea15c22a3bfdd4eb42eb43edc528415f066a1f25" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "riscv-pac" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8188909339ccc0c68cfb5a04648313f09621e8b87dc03095454f1a11f6c5d436" + +[[package]] +name = "riscv-rt-macros" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc71814687c45ba4cd1e47a54e03a2dbc62ca3667098fbae9cc6b423956758fa" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "scroll" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1257cd4248b4132760d6524d6dda4e053bc648c9070b960929bf50cfb1e7add" +dependencies = [ + "scroll_derive", +] + +[[package]] +name = "scroll_derive" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22fc4f90c27b57691bbaf11d8ecc7cfbfe98a4da6dbe60226115d322aa80c06e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_yaml" +version = "0.9.34+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" +dependencies = [ + "indexmap", + "itoa", + "ryu", + "serde", + "unsafe-libyaml", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "static_cell" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0530892bb4fa575ee0da4b86f86c667132a94b74bb72160f58ee5a4afec74c23" +dependencies = [ + "portable-atomic", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "strum" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "2.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "thiserror" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b0949c3a6c842cbde3f1686d6eea5a010516deb7085f79db747562d4102f41e" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc5b44b4ab9c2fdd0e0512e6bece8388e214c0749f5862b114cc5b7a25daf227" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tlv-rs" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6997294e7285bc4160c9bb47b49e120dec31b53143a7dc247392baa1d9d244d" +dependencies = [ + "heapless", + "no-panic", + "scroll", +] + +[[package]] +name = "toml_datetime" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" + +[[package]] +name = "toml_edit" +version = "0.22.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +dependencies = [ + "indexmap", + "toml_datetime", + "winnow", +] + +[[package]] +name = "typenum" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" + +[[package]] +name = "ufmt-write" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e87a2ed6b42ec5e28cc3b94c09982969e9227600b2e3dcbc1db927a84c06bd69" + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "unsafe-libyaml" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861" + +[[package]] +name = "usb-device" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98816b1accafbb09085168b90f27e93d790b4bfa19d883466b5e53315b5f06a6" +dependencies = [ + "heapless", + "portable-atomic", +] + +[[package]] +name = "vcell" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77439c1b53d2303b20d9459b1ade71a83c716e3f9c34f3228c00e6f185d6c002" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" + +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3edebf492c8125044983378ecb5766203ad3b4c2f7a922bd7dd207f6d443e95" +dependencies = [ + "memchr", +] + +[[package]] +name = "xtensa-lx" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a564fffeb3cd773a524e8d8a5c66ca5e9739ea7450e36a3e6a54dd31f1e652f" +dependencies = [ + "critical-section", +] + +[[package]] +name = "xtensa-lx-rt" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520a8fb0121eb6868f4f5ff383e262dc863f9042496724e01673a98a9b7e6c2b" +dependencies = [ + "document-features", + "r0", + "xtensa-lx", + "xtensa-lx-rt-proc-macros", +] + +[[package]] +name = "xtensa-lx-rt-proc-macros" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5a56a616147f5947ceb673790dd618d77b30e26e677f4a896df049d73059438" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/foa_mesh/Cargo.toml b/foa_mesh/Cargo.toml new file mode 100644 index 0000000..07f710b --- /dev/null +++ b/foa_mesh/Cargo.toml @@ -0,0 +1,34 @@ +[package] +name = "foa_mesh" +version = "0.1.0" +edition = "2024" + +[dependencies] +embassy-futures = "0.1.1" +embassy-sync = "0.6.2" +embassy-time = "0.4.0" +embassy-net-driver-channel = "0.3.0" + +foa = { path = "../foa/" } + +defmt = { version = "0.3.10", optional = true } +defmt-or-log = { version = "0.2.1", default-features = false } +esp-config = "0.3.1" +heapless = "0.8.0" +rand_core = "0.6.0" + +llc-rs = "0.1.0" +ethernet = { version = "0.1.5", default-features = false } +ieee80211 = "0.5.9" + +[build-dependencies] +esp-config = { version = "0.3.1", features = ["build"] } + +[features] +esp32 = ["foa/esp32"] +esp32s2 = ["foa/esp32s2"] + +defmt = ["dep:defmt", "defmt-or-log/defmt", "ieee80211/defmt", "foa/defmt"] +log = ["defmt-or-log/log"] + + diff --git a/foa_mesh/build.rs b/foa_mesh/build.rs new file mode 100644 index 0000000..51267fe --- /dev/null +++ b/foa_mesh/build.rs @@ -0,0 +1,34 @@ +use esp_config::{Validator, Value, generate_config}; + +fn main() { + generate_config( + "foa_mesh", + &[ + ( + "RX_QUEUE_DEPTH", + "The depth of the user and background RX queues.", + Value::Integer(4), + Some(Validator::PositiveInteger), + ), + ( + "NET_TX_BUFFERS", + "The amount of TX buffers used for embassy_net_driver_channel.", + Value::Integer(4), + Some(Validator::PositiveInteger), + ), + ( + "NET_RX_BUFFERS", + "The amount of RX buffers used for embassy_net_driver_channel.", + Value::Integer(4), + Some(Validator::PositiveInteger), + ), + ( + "MAX_NUM_PEERS", + "Maximum amount of peers connected at the same time.", + Value::Integer(4), + Some(Validator::PositiveInteger), + ), + ], + true, + ); +} diff --git a/foa_mesh/config.toml b/foa_mesh/config.toml new file mode 100644 index 0000000..85dad2e --- /dev/null +++ b/foa_mesh/config.toml @@ -0,0 +1,3 @@ +[unstable] +build-std = ["core"] + diff --git a/foa_mesh/rust-toolchain.toml b/foa_mesh/rust-toolchain.toml new file mode 100644 index 0000000..a2f5ab5 --- /dev/null +++ b/foa_mesh/rust-toolchain.toml @@ -0,0 +1,2 @@ +[toolchain] +channel = "esp" diff --git a/foa_mesh/src/control.rs b/foa_mesh/src/control.rs new file mode 100644 index 0000000..adfde2c --- /dev/null +++ b/foa_mesh/src/control.rs @@ -0,0 +1,74 @@ +use foa::{LMacInterfaceControl, esp_wifi_hal::RxFilterBank}; +use ieee80211::mac_parser::MACAddress; + +use crate::{CommonResources, MeshError, rx_router::MeshRxRouterEndpoint, state::MeshState}; + +pub struct MeshControl<'foa, 'vif> { + pub(crate) interface_control: &'vif LMacInterfaceControl<'foa>, + pub(crate) rx_router_endpoint: MeshRxRouterEndpoint<'foa, 'vif>, + pub(crate) common_resources: &'vif CommonResources, + + pub(crate) channel: u8, + pub(crate) mac_address: MACAddress, + pub(crate) mesh_id: heapless::String<32>, +} + +impl MeshControl<'_, '_> { + /// Set and enable all filters required for the interface. + fn enable_filters(&self) { + self.interface_control.set_filter_parameters( + RxFilterBank::ReceiverAddress, + *self.mac_address, + None, + ); + self.interface_control + .set_filter_status(RxFilterBank::ReceiverAddress, true); + self.interface_control + .set_scanning_mode(foa::esp_wifi_hal::ScanningMode::ManagementAndData); + } + /// Disable all filter for the interface. + fn disable_filters(&self) { + self.interface_control + .set_filter_status(RxFilterBank::ReceiverAddress, false); + } + /// Start a Mesh session. + /// + /// If a session is already in progress, it will be immediately aborted and the new session + /// takes over. + pub async fn start(&mut self) -> Result<(), MeshError> { + let bringup_operation = self + .interface_control + .begin_interface_bringup_operation(self.channel) + .map_err(|_| MeshError::FailedToAcquireChannelLock)?; + self.interface_control + .wait_for_off_channel_completion() + .await; + self.enable_filters(); + self.common_resources + .state_signal + .signal(MeshState::Active { + our_address: self.mac_address, + channel: self.channel, + mesh_id: self.mesh_id.clone(), + }); + bringup_operation.complete(); + Ok(()) + } + /// Stop the currently active Mesh session. + /// + /// If no session is in progress, this won't do anything. + pub fn stop(&mut self) { + self.interface_control.unlock_channel(); + self.disable_filters(); + self.common_resources + .state_signal + .signal(MeshState::Inactive); + } + + /// Set the MAC address of the interface. + /// + /// This will only take effect after restarting the interface. + pub fn set_mac_address(&mut self, mac_address: [u8; 6]) { + self.mac_address = MACAddress::new(mac_address); + } +} diff --git a/foa_mesh/src/lib.rs b/foa_mesh/src/lib.rs new file mode 100644 index 0000000..1b7b08d --- /dev/null +++ b/foa_mesh/src/lib.rs @@ -0,0 +1,72 @@ +#![no_std] +#![feature(cell_update)] + +mod control; +pub mod peer_state; +mod runner; +mod rx_router; +pub mod state; + +use embassy_net_driver_channel::{Device as NetDevice, driver::HardwareAddress}; +use esp_config::esp_config_int; +use foa::VirtualInterface; +use ieee80211::mac_parser::MACAddress; +use rand_core::RngCore; +use state::{CommonResources, MeshResources}; + +pub use {control::MeshControl, runner::MeshRunner}; + +pub(crate) const RX_QUEUE_DEPTH: usize = esp_config_int!(usize, "FOA_MESH_CONFIG_RX_QUEUE_DEPTH"); +pub(crate) const NET_TX_BUFFERS: usize = esp_config_int!(usize, "FOA_MESH_CONFIG_NET_TX_BUFFERS"); +pub(crate) const NET_RX_BUFFERS: usize = esp_config_int!(usize, "FOA_MESH_CONFIG_NET_RX_BUFFERS"); +pub(crate) const MAX_NUM_PEERS: usize = esp_config_int!(usize, "FOA_MESH_CONFIG_MAX_NUM_PEERS"); + +pub const MTU: usize = 1500; +pub type MeshNetDevice<'a> = NetDevice<'a, MTU>; + +#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] +/// Errors that can occur with the Mesh interface. +pub enum MeshError { + FailedToAcquireChannelLock, +} + +pub fn new_mesh_interface<'foa, 'vif, Rng: RngCore + Copy>( + resources: &'vif mut MeshResources<'foa>, + virtual_interface: &'vif mut VirtualInterface<'foa>, + channel: u8, + mesh_id: heapless::String<32>, + rng: Rng, +) -> ( + MeshControl<'foa, 'vif>, + MeshRunner<'foa, 'vif, Rng>, + MeshNetDevice<'vif>, +) { + virtual_interface.reset(); + + let (interface_control, interface_rx_queue_receiver) = virtual_interface.split(); + let (rx_router_input, [foreground_endpoint, background_endpoint]) = resources.rx_router.split(); + let (net_runner, net_device) = embassy_net_driver_channel::new( + &mut resources.net_state, + HardwareAddress::Ethernet(interface_control.get_factory_mac_for_interface()), + ); + ( + MeshControl { + interface_control, + rx_router_endpoint: foreground_endpoint, + common_resources: &resources.common_resources, + channel, + mac_address: MACAddress::new(interface_control.get_factory_mac_for_interface()), + mesh_id, + }, + MeshRunner::new( + net_runner, + background_endpoint, + rx_router_input, + interface_rx_queue_receiver, + interface_control, + &resources.common_resources, + rng.clone(), + ), + net_device, + ) +} diff --git a/foa_mesh/src/peer_state.rs b/foa_mesh/src/peer_state.rs new file mode 100644 index 0000000..2a535f3 --- /dev/null +++ b/foa_mesh/src/peer_state.rs @@ -0,0 +1,125 @@ +use core::ops::Index; + +use defmt_or_log::derive_format_or_debug; +use heapless::FnvIndexMap; +use ieee80211::{common::AssociationID, mac_parser::MACAddress}; + +use crate::{MAX_NUM_PEERS, state::MPMFSMState}; + +#[derive(Clone, PartialEq, Eq, Copy)] +#[derive_format_or_debug] +pub(crate) struct MeshPeerState { + pub(crate) mpm_state: MPMFSMState, +} + +impl Default for MeshPeerState { + fn default() -> Self { + Self { + mpm_state: MPMFSMState::Idle, + } + } +} + +pub(crate) struct PeerListFullError; + +pub(crate) trait MeshPeerList: + for<'a> Index<&'a MACAddress, Output = MeshPeerState> +{ + const UNINIT: Self; + + fn iter(&self) -> impl Iterator + '_; + fn retain(&mut self, pred: impl FnMut(&MACAddress, &mut MeshPeerState) -> bool); + fn get(&self, address: &MACAddress) -> Option<&MeshPeerState>; + fn get_mut(&mut self, address: &MACAddress) -> Option<&mut MeshPeerState>; + fn is_full(&self) -> bool; + fn insert( + &mut self, + address: MACAddress, + peer: MeshPeerState, + ) -> Result, (MACAddress, MeshPeerState)>; + fn clear(&mut self); + fn contains_key(&self, address: &MACAddress) -> bool; + + /// Modify the peer, or attempt to add it if it's not present. + /// + /// If the peer list is full a [PeerListFullError]. + fn modify_or_add_peer( + &mut self, + peer_address: &MACAddress, + mut modify: impl FnMut(&mut MeshPeerState), + add: impl FnOnce() -> Option, + ) -> Result { + Ok(match self.get_mut(peer_address) { + Some(peer) => { + (modify)(peer); + false + } + None => { + if self.is_full() { + return Err(PeerListFullError); + } else { + let Some(peer) = (add)() else { + return Ok(false); + }; + let _ = self.insert(*peer_address, peer); + true + } + } + }) + } + + /// Iterate over the mesh peers and execute the closure on them. + fn inspect_peers(&self, f: impl FnMut((&MACAddress, &MeshPeerState))) { + self.iter().for_each(f); + } + + fn get_or_create( + &mut self, + peer_address: &MACAddress, + ) -> Result { + Ok(match self.get(peer_address) { + Some(peer) => *peer, + None => { + if self.is_full() { + return Err(PeerListFullError); + } else { + let peer: MeshPeerState = Default::default(); + let _ = self.insert(*peer_address, peer); + peer + } + } + }) + } +} +pub type StaticMeshPeerList = FnvIndexMap; +impl MeshPeerList for StaticMeshPeerList { + const UNINIT: Self = Self::new(); + fn get(&self, peer_address: &MACAddress) -> Option<&MeshPeerState> { + self.get(peer_address) + } + fn get_mut(&mut self, peer_address: &MACAddress) -> Option<&mut MeshPeerState> { + self.get_mut(peer_address) + } + fn iter(&self) -> impl Iterator + '_ { + self.iter() + } + fn clear(&mut self) { + self.clear(); + } + fn retain(&mut self, pred: impl FnMut(&MACAddress, &mut MeshPeerState) -> bool) { + self.retain(pred); + } + fn insert( + &mut self, + peer_address: MACAddress, + peer: MeshPeerState, + ) -> Result, (MACAddress, MeshPeerState)> { + self.insert(peer_address, peer) + } + fn is_full(&self) -> bool { + self.capacity() == self.len() + } + fn contains_key(&self, peer_address: &MACAddress) -> bool { + self.contains_key(peer_address) + } +} diff --git a/foa_mesh/src/runner/management.rs b/foa_mesh/src/runner/management.rs new file mode 100644 index 0000000..f4a20cf --- /dev/null +++ b/foa_mesh/src/runner/management.rs @@ -0,0 +1,1105 @@ +use core::{marker::PhantomData, num}; + +use defmt::{println, warn}; +use defmt_or_log::debug; +use embassy_futures::select::{Either4, select4}; +use embassy_net_driver_channel::StateRunner as NetStateRunner; + +use foa::{ + LMacInterfaceControl, + esp_wifi_hal::{TxErrorBehaviour, TxParameters, WiFiRate}, +}; +use rand_core::RngCore; + +use crate::{ + peer_state::{MeshPeerList, MeshPeerState}, + rx_router::MeshRxRouterEndpoint, + state::{CommonResources, MPMFSMState, MPMFSMSubState}, +}; + +use embassy_time::{Duration, Instant, Ticker, Timer}; +use ieee80211::{ + common::{AssociationID, CapabilitiesInformation, IEEE80211Reason, TU}, + element_chain, + elements::{ + self, DSSSParameterSetElement, MeshIDElement, ReadElements, SSIDElement, + mesh::{ + MeshCapability, MeshConfigurationActivePathSelectionMetricIdentifier, + MeshConfigurationActivePathSelectionProtocolIdentifier, + MeshConfigurationAuthenticationProtocolIdentifier, + MeshConfigurationCongestionControlModeIdentifier, MeshConfigurationElement, + MeshConfigurationSynchronizationMethodIdentifier, MeshFormationInfo, + MeshPeeringManagement, MeshPeeringProtocolIdentifier, + }, + rates::{EncodedRate, ExtendedSupportedRatesElement, SupportedRatesElement}, + tim::{TIMBitmap, TIMElement}, + }, + extended_supported_rates, + mac_parser::{BROADCAST, MACAddress}, + match_frames, mesh_id, + mgmt_frame::{ + BeaconFrame, ManagementFrameHeader, ProbeRequestFrame, ProbeResponseFrame, + body::{ + BeaconBody, HasElements, ProbeResponseBody, + action::{ + MeshPeeringCloseBody, MeshPeeringCloseFrame, MeshPeeringConfirmBody, + MeshPeeringConfirmFrame, MeshPeeringOpenBody, MeshPeeringOpenFrame, + }, + }, + }, + scroll::Pwrite, + ssid, supported_rates, +}; + +const BEACON_INTERVAL_TU: u64 = 100; + +// TODO deduplicate this from foa_sta +const DEFAULT_SUPPORTED_RATES: SupportedRatesElement<[EncodedRate; 8]> = supported_rates![ + 1 B, + 2, + 5.5, + 11, + 6, + 9, + 12, + 18 +]; + +const DEFAULT_XRATES: ExtendedSupportedRatesElement<[EncodedRate; 4]> = + extended_supported_rates![24, 36, 48, 54]; + +// TODO make this settable from the consumer of this library +const MESH_ID: &str = "meshtest"; + +const DOT11_MESH_RETRY_TIMEOUT_MS: u32 = 40; +const DOT11_MESH_CONFIRM_TIMEOUT_MS: u32 = 40; +const DOT11_MESH_HOLDING_TIMEOUT_MS: u32 = 40; + +const DOT11_MESH_MAX_RETRIES: u32 = 2; + +pub struct MeshManagementRunner<'foa, 'vif, Rng: RngCore + Copy> { + pub(crate) interface_control: &'vif LMacInterfaceControl<'foa>, + pub(crate) rx_router_endpoint: MeshRxRouterEndpoint<'foa, 'vif>, + pub(crate) net_state_runner: NetStateRunner<'vif>, + pub(crate) common_resources: &'vif CommonResources, + pub(crate) rng: Rng, +} + +impl MeshManagementRunner<'_, '_, Rng> { + fn generate_own_mesh_configuration_element(&self) -> MeshConfigurationElement { + let num_peerings = self.common_resources.lock_peer_list(|peer_list| { + peer_list + .iter() + .map(|(_, state)| match state.mpm_state { + MPMFSMState::Estab { .. } => 1, + _ => 0, + }) + .sum() + }); + let accept_additional_peerings = self + .common_resources + .lock_peer_list(|peer_list| peer_list.capacity() - peer_list.len() > 0); + + MeshConfigurationElement { + active_path_selection_protocol_identifier: + MeshConfigurationActivePathSelectionProtocolIdentifier::HWMP, + active_path_selection_metric_identifier: + MeshConfigurationActivePathSelectionMetricIdentifier::AirtimeLinkMetric, + congestion_control_mode_identifier: + MeshConfigurationCongestionControlModeIdentifier::NotActivated, + syncronization_method_identifier: + MeshConfigurationSynchronizationMethodIdentifier::NeighborOffsetSynchronization, + authentication_protocol_identifier: + MeshConfigurationAuthenticationProtocolIdentifier::NoAuthentication, + mesh_formation_info: MeshFormationInfo::new() + .with_connected_to_mesh_gate(false) // TODO fill this in once we can actually connect to mesh gate + .with_num_peerings(num_peerings) + .with_connected_to_as(false), // 'Connected to authentication system' is always false in open / SAE mesh + mesh_capability: MeshCapability::new() + .with_accept_additional_mesh_peerings(accept_additional_peerings) + .with_forwarding(true), + } + } + + fn does_mesh_sta_configuration_match(&self, elements: ReadElements) -> bool { + // Check if mesh profile is equal + if (elements + .get_first_element::() + .map(|a| (a.ssid() != MESH_ID))) + .unwrap_or(true) + { + return false; + } + + let Some(peer_config_element) = elements.get_first_element::() + else { + debug!("no mesh configuration element"); + return false; + }; + let own_config_element = self.generate_own_mesh_configuration_element(); + if peer_config_element.active_path_selection_metric_identifier + != own_config_element.active_path_selection_metric_identifier + || peer_config_element.active_path_selection_protocol_identifier + != own_config_element.active_path_selection_protocol_identifier + || peer_config_element.authentication_protocol_identifier + != own_config_element.authentication_protocol_identifier + || peer_config_element.congestion_control_mode_identifier + != own_config_element.congestion_control_mode_identifier + || peer_config_element.syncronization_method_identifier + != own_config_element.syncronization_method_identifier + { + debug!("mesh configuration element mismatch"); + return false; + } + // TODO we should also check the peers EPD capability; but this is very uncommon on 2.4GHz or 5GHz + + // Check if all other fields of the mesh STA configuration matches + if (elements + .get_first_element::() + .map(|a| (a != DEFAULT_SUPPORTED_RATES))) + .unwrap_or(true) + { + debug!("default rates mismatch"); + return false; + } + if elements + .get_first_element::() + .map(|a| (a != DEFAULT_XRATES)) + .unwrap_or(true) + { + debug!("extended rates mismatch"); + return false; + } + + true + } + + pub async fn send_beacon_frame(&mut self, address: &MACAddress) { + let mut tx_buffer = self.interface_control.alloc_tx_buf().await; + + // TODO this is currently only for 802.11bg, but not N + // we could automatically adapt the contents of our beacon frames to other mesh stations + // so that we can peer with them (only permitted if mesh id, rates and MeshConfigurationElement match) + let beacon_frame = BeaconFrame { + header: ManagementFrameHeader { + receiver_address: BROADCAST, + transmitter_address: *address, + bssid: *address, + ..Default::default() + }, + body: BeaconBody { + timestamp: 0, // TODO let the hardware fill this in automatically + beacon_interval: BEACON_INTERVAL_TU as u16, + capabilities_info: CapabilitiesInformation::new(), + elements: element_chain! { + ssid!(""), // wildcard SSID + DEFAULT_SUPPORTED_RATES, + DSSSParameterSetElement { + current_channel: self.interface_control.home_channel().unwrap_or(1) + }, + TIMElement { + dtim_count: 1, // TODO oscillate this + dtim_period: 2, + bitmap: None::>, // TODO fill this in once we implement data traffic + _phantom: PhantomData + }, + DEFAULT_XRATES, + mesh_id!(MESH_ID), + self.generate_own_mesh_configuration_element() + + }, + _phantom: PhantomData, + }, + }; + + let written = tx_buffer.pwrite(beacon_frame, 0).unwrap(); + let _ = self + .interface_control + .transmit( + &mut tx_buffer[..written], + &TxParameters { + rate: WiFiRate::PhyRate12M, + override_seq_num: true, + tx_error_behaviour: TxErrorBehaviour::Drop, + ..Default::default() + }, + false, + ) + .await; + } + + pub async fn send_mesh_peering_confirm( + &mut self, + our_address: &MACAddress, + dst_address: &MACAddress, + aid: AssociationID, + local_link_id: u16, + peer_link_id: u16, + ) { + debug!("mesh peering confirm tx"); + let mut tx_buffer = self.interface_control.alloc_tx_buf().await; + let mesh_peering_confirm_frame = MeshPeeringConfirmFrame { + header: ManagementFrameHeader { + receiver_address: *dst_address, + transmitter_address: *our_address, + bssid: *our_address, + ..Default::default() + }, + body: MeshPeeringConfirmBody { + capabilities_info: CapabilitiesInformation::new(), + association_id: aid, + elements: element_chain! { + DEFAULT_SUPPORTED_RATES, + DEFAULT_XRATES, + mesh_id!(MESH_ID), + self.generate_own_mesh_configuration_element(), + MeshPeeringManagement::new_confirm( + MeshPeeringProtocolIdentifier::MeshPeeringManagementProtocol, + local_link_id, peer_link_id, + None) + }, + _phantom: PhantomData, + }, + }; + + let written = tx_buffer.pwrite(mesh_peering_confirm_frame, 0).unwrap(); + let _ = self + .interface_control + .transmit( + &mut tx_buffer[..written], + &TxParameters { + rate: WiFiRate::PhyRate12M, + override_seq_num: true, + tx_error_behaviour: TxErrorBehaviour::Drop, + ..Default::default() + }, + false, + ) + .await; + } + + pub async fn send_mesh_peering_open( + &mut self, + our_address: &MACAddress, + dst_address: &MACAddress, + local_link_id: u16, + ) { + debug!("mesh peering open tx"); + let mut tx_buffer = self.interface_control.alloc_tx_buf().await; + let mesh_peering_confirm_frame = MeshPeeringOpenFrame { + header: ManagementFrameHeader { + receiver_address: *dst_address, + transmitter_address: *our_address, + bssid: *our_address, + ..Default::default() + }, + body: MeshPeeringOpenBody { + capabilities_info: CapabilitiesInformation::new(), + elements: element_chain! { + DEFAULT_SUPPORTED_RATES, + DEFAULT_XRATES, + mesh_id!(MESH_ID), + self.generate_own_mesh_configuration_element(), + MeshPeeringManagement::new_open( + MeshPeeringProtocolIdentifier::MeshPeeringManagementProtocol, + local_link_id, + None) + }, + _phantom: PhantomData, + }, + }; + + let written = tx_buffer.pwrite(mesh_peering_confirm_frame, 0).unwrap(); + let _ = self + .interface_control + .transmit( + &mut tx_buffer[..written], + &TxParameters { + rate: WiFiRate::PhyRate12M, + override_seq_num: true, + tx_error_behaviour: TxErrorBehaviour::Drop, + ..Default::default() + }, + false, + ) + .await; + } + + pub async fn send_mesh_peering_close( + &mut self, + our_address: &MACAddress, + dst_address: &MACAddress, + local_link_id: u16, + peer_link_id: Option, + reason: IEEE80211Reason, + ) { + debug!("tx mesh peering close"); + let mut tx_buffer = self.interface_control.alloc_tx_buf().await; + let mesh_peering_close_frame = MeshPeeringCloseFrame { + header: ManagementFrameHeader { + receiver_address: *dst_address, + transmitter_address: *our_address, + bssid: *our_address, + ..Default::default() + }, + body: MeshPeeringCloseBody { + elements: element_chain! { + mesh_id!(MESH_ID), + MeshPeeringManagement::new_close( + MeshPeeringProtocolIdentifier::MeshPeeringManagementProtocol, + local_link_id, peer_link_id, + reason, + None) + }, + _phantom: PhantomData, + }, + }; + + let written = tx_buffer.pwrite(mesh_peering_close_frame, 0).unwrap(); + let _ = self + .interface_control + .transmit( + &mut tx_buffer[..written], + &TxParameters { + rate: WiFiRate::PhyRate12M, + override_seq_num: true, + tx_error_behaviour: TxErrorBehaviour::Drop, + ..Default::default() + }, + false, + ) + .await; + } + + pub fn generate_new_link_id(&self) -> u16 { + loop { + let candidate = u16::try_from(self.rng.clone().next_u32() & 0xFFFF).unwrap(); + // Check if there is a link in our peer list that already has that ID + if !self + .common_resources + .peer_list + .borrow() + .borrow() + .iter() + .map(|peer| match peer.1.mpm_state { + MPMFSMState::Idle => false, + MPMFSMState::Setup { + local_link_id, + peer_link_id, + .. + } => local_link_id == candidate || peer_link_id == candidate, + MPMFSMState::Estab { + local_link_id, + peer_link_id, + .. + } => local_link_id == candidate || peer_link_id == candidate, + MPMFSMState::Holding { + local_link_id, + peer_link_id, + .. + } => { + local_link_id == candidate + || peer_link_id.map(|id| id == candidate).unwrap_or(false) + } + }) + .fold(false, |acc, mk| acc || mk) + { + // This generated ID was not yet in use + return candidate; + } + } + } + + pub async fn process_mesh_peering_open( + &mut self, + mesh_peering_open_frame: &MeshPeeringOpenFrame<'_>, + our_address: &MACAddress, + ) -> Option<()> { + debug!("mesh peering open rxd"); + let addr = mesh_peering_open_frame.header.transmitter_address; + let packet_peer_link_id = mesh_peering_open_frame + .body + .elements + .get_first_element::()? + .parse_as_open()? + .local_link_id; + if self.does_mesh_sta_configuration_match(mesh_peering_open_frame.elements) { + // check that we still have space left for an extra association + let peer = { + self.common_resources + .lock_peer_list(|mut peer_list| peer_list.get_or_create(&addr)) + }; + let Ok(peer) = peer else { + self.send_mesh_peering_close( + our_address, + &addr, + packet_peer_link_id, + None, + IEEE80211Reason::Unspecified, // TODO correct error code + ) + .await; + return None; + }; + + match peer.mpm_state { + MPMFSMState::Idle => { + let local_link_id = self.generate_new_link_id(); + let local_aid = self.common_resources.new_association_id(); + self.common_resources.lock_peer_list(|mut peer_list| { + let _ = peer_list.modify_or_add_peer( + &addr, + |peer| { + peer.mpm_state = MPMFSMState::Setup { + mac_addr: addr, + local_link_id: local_link_id, + peer_link_id: packet_peer_link_id, + substate: MPMFSMSubState::OpnRcvd, + local_aid: local_aid, + remote_aid: None, + retry_timer_expiration: Instant::now() + + Duration::from_millis(DOT11_MESH_RETRY_TIMEOUT_MS.into()), + retry_counter: DOT11_MESH_MAX_RETRIES as u8, + confirm_timer_expiration: Instant::MAX, + } + }, + || None, + ); + }); + + self.send_mesh_peering_confirm( + our_address, + &addr, + local_aid, + local_link_id, + packet_peer_link_id, + ) + .await; + self.send_mesh_peering_open(our_address, &addr, local_link_id) + .await; + } + MPMFSMState::Setup { + mac_addr, + local_link_id, + peer_link_id, + substate, + local_aid, + remote_aid, + retry_timer_expiration, + retry_counter, + confirm_timer_expiration, + } => match substate { + MPMFSMSubState::OpnSnt => { + self.common_resources.lock_peer_list(|mut peer_list| { + let _ = peer_list.modify_or_add_peer( + &addr, + |peer| { + peer.mpm_state = MPMFSMState::Setup { + mac_addr, + local_link_id, + peer_link_id: packet_peer_link_id, + substate: MPMFSMSubState::OpnRcvd, + local_aid, + remote_aid, + retry_timer_expiration, + retry_counter, + confirm_timer_expiration, + } + }, + || None, + ); + }); + self.send_mesh_peering_confirm( + our_address, + &addr, + local_aid, + local_link_id, + packet_peer_link_id, + ) + .await + } + MPMFSMSubState::CnfRcvd => { + self.common_resources.lock_peer_list(|mut peer_list| { + let _ = peer_list.modify_or_add_peer( + &addr, + |peer| { + peer.mpm_state = MPMFSMState::Estab { + mac_addr, + local_link_id, + peer_link_id: packet_peer_link_id, + local_aid, + remote_aid: remote_aid.unwrap(), + } + }, + || None, + ); + }); + self.send_mesh_peering_confirm( + our_address, + &addr, + local_aid, + local_link_id, + packet_peer_link_id, + ) + .await; + } + MPMFSMSubState::OpnRcvd => { + self.send_mesh_peering_confirm( + our_address, + &addr, + local_aid, + local_link_id, + packet_peer_link_id, + ) + .await; + } + }, + MPMFSMState::Estab { + local_link_id, + peer_link_id, + local_aid, + .. + } => { + self.send_mesh_peering_confirm( + our_address, + &addr, + local_aid, + local_link_id, + packet_peer_link_id, + ) + .await; + } + MPMFSMState::Holding { + local_link_id, + peer_link_id, + .. + } => { + self.send_mesh_peering_close( + our_address, + &addr, + local_link_id, + peer_link_id, + IEEE80211Reason::Unspecified, // TODO correct error code + ) + .await; + } + }; + } else { + self.send_mesh_peering_close( + our_address, + &addr, + packet_peer_link_id, + None, + IEEE80211Reason::Unspecified, // TODO correct error code + ) + .await; + } + + None + } + + pub async fn process_mesh_peering_confirm( + &mut self, + mesh_peering_confirm_frame: &MeshPeeringConfirmFrame<'_>, + our_address: &MACAddress, + ) -> Option<()> { + debug!("mesh peering confirm"); + let addr = mesh_peering_confirm_frame.header.transmitter_address; + let mpm = mesh_peering_confirm_frame + .body + .elements + .get_first_element::()? + .parse_as_confirm()?; + let remote_aid = mesh_peering_confirm_frame.association_id; + if !self.does_mesh_sta_configuration_match(mesh_peering_confirm_frame.elements) { + self.send_mesh_peering_close( + our_address, + &addr, + mpm.peer_link_id.unwrap_or(0), + Some(mpm.local_link_id), + IEEE80211Reason::MeshInconsistentParameters, + ) + .await; + return None; + } + // mesh configuration matches + let peer = { + self.common_resources + .lock_peer_list(|mut peer_list| peer_list.get_or_create(&addr)) + }; + let Ok(peer) = peer else { + // Normally, we should be in a state where we know about the peer, so reject + self.send_mesh_peering_close( + our_address, + &addr, + mpm.peer_link_id.unwrap_or(0), + Some(mpm.local_link_id), + IEEE80211Reason::Unspecified, // TODO correct error code + ) + .await; + return None; + }; + + match peer.mpm_state { + MPMFSMState::Holding { .. } => { + self.send_mesh_peering_close( + our_address, + &addr, + mpm.peer_link_id.unwrap_or(0), + Some(mpm.local_link_id), + IEEE80211Reason::Unspecified, // TODO correct error code + ) + .await; + } + MPMFSMState::Idle | MPMFSMState::Estab { .. } => { + // Ignore + } + MPMFSMState::Setup { + mac_addr, + local_link_id: local_link_id_cached, + substate, + local_aid, + .. + } => match substate { + MPMFSMSubState::OpnSnt => { + self.common_resources.lock_peer_list(|mut peer_list| { + let _ = peer_list.modify_or_add_peer( + &addr, + |peer| { + peer.mpm_state = MPMFSMState::Setup { + mac_addr: mac_addr, + local_link_id: mpm.peer_link_id.unwrap_or(local_link_id_cached), + peer_link_id: mpm.local_link_id, + substate: MPMFSMSubState::CnfRcvd, + local_aid: local_aid, + remote_aid: Some(remote_aid), + retry_timer_expiration: Instant::MAX, + retry_counter: 0, + confirm_timer_expiration: Instant::now() + + Duration::from_millis( + DOT11_MESH_CONFIRM_TIMEOUT_MS.into(), + ), + }; + }, + || None, + ); + }); + } + MPMFSMSubState::OpnRcvd => { + self.common_resources.lock_peer_list(|mut peer_list| { + let _ = peer_list.modify_or_add_peer( + &addr, + |peer| { + peer.mpm_state = MPMFSMState::Estab { + mac_addr: mac_addr, + local_link_id: mpm.peer_link_id.unwrap_or(local_link_id_cached), + peer_link_id: mpm.local_link_id, + local_aid: local_aid, + remote_aid: remote_aid, + }; + }, + || None, + ); + }); + } + _ => { + // Ignored + } + }, + } + + None + } + + async fn process_mesh_peering_close( + &mut self, + mesh_peering_close_frame: &MeshPeeringCloseFrame<'_>, + our_address: &MACAddress, + ) -> Option<()> { + debug!("mesh peering close rxd"); + let addr = mesh_peering_close_frame.header.transmitter_address; + let mpm = mesh_peering_close_frame + .body + .elements + .get_first_element::()? + .parse_as_close()?; + if !self.does_mesh_sta_configuration_match(mesh_peering_close_frame.elements) { + // Let's not send a close frame, to avoid getting in an infinite loop + return None; + } + let peer = { + self.common_resources + .lock_peer_list(|peer_list| (peer_list.get(&addr).cloned())) + }; + let Some(peer) = peer else { + // We don't know about this peer; let's not send a close frame (to avoid getting into infinite loop) + return None; + }; + match peer.mpm_state { + MPMFSMState::Holding { mac_addr, .. } => { + // delete from peer list + self.common_resources.lock_peer_list(|mut peer_list| { + peer_list.remove(&mac_addr); + }); + } + MPMFSMState::Setup { + mac_addr, + local_link_id, + .. + } + | MPMFSMState::Estab { + mac_addr, + local_link_id, + .. + } => { + self.common_resources.lock_peer_list(|mut peer_list| { + let _ = peer_list.modify_or_add_peer( + &addr, + |peer| { + peer.mpm_state = MPMFSMState::Holding { + mac_addr: mac_addr, + local_link_id: mpm.peer_link_id.unwrap_or(local_link_id), + peer_link_id: Some(mpm.local_link_id), + holding_timer_expiration: Instant::now() + + Duration::from_millis(DOT11_MESH_HOLDING_TIMEOUT_MS.into()), + }; + }, + || None, + ); + }); + self.send_mesh_peering_close( + our_address, + &addr, + local_link_id, + Some(mpm.local_link_id), + IEEE80211Reason::Unspecified, // TODO correct error code + ) + .await; + } + MPMFSMState::Idle => { + // Should not happen normally + return None; + } + } + None + } + + async fn process_beacon_frame( + &mut self, + beacon_frame: &BeaconFrame<'_>, + our_address: &MACAddress, + ) -> Option<()> { + let peer_addr = beacon_frame.header.transmitter_address; + if !self.does_mesh_sta_configuration_match(beacon_frame.elements) { + return None; + } + debug!("rxd beacon"); + let (known, free_space) = self.common_resources.lock_peer_list(|peer_list| { + ( + peer_list.contains_key(&peer_addr), + peer_list.capacity() - peer_list.len() > 0, + ) + }); + if known || !free_space { + // We already know about this peer, currently no further actions need to be taken + return None; + } + let mesh_config_element = beacon_frame + .elements + .get_first_element::()?; + if !mesh_config_element + .mesh_capability + .accept_additional_mesh_peerings() + { + // Does not accept extra peerings, so also not ours + return None; + } + let local_link_id = self.generate_new_link_id(); + // We now know about a peer, that we can pair with, so let's try to + // We checked earlier that the peer list should have free space, so we can ignore the result + let _ = self.common_resources.lock_peer_list(|mut peer_list| { + peer_list.insert( + peer_addr, + MeshPeerState { + mpm_state: MPMFSMState::Setup { + mac_addr: peer_addr, + local_link_id: local_link_id, + peer_link_id: 0, + substate: MPMFSMSubState::OpnSnt, + local_aid: self.common_resources.new_association_id(), + remote_aid: None, + retry_timer_expiration: Instant::now() + + Duration::from_millis(DOT11_MESH_RETRY_TIMEOUT_MS.into()), + retry_counter: DOT11_MESH_MAX_RETRIES as u8, + confirm_timer_expiration: Instant::MAX, + }, + }, + ) + }); + self.send_mesh_peering_open(our_address, &peer_addr, local_link_id) + .await; + + return None; + } + + async fn process_probe_request( + &mut self, + probe_request: &ProbeRequestFrame<'_>, + our_address: &MACAddress, + ) -> Option<()> { + debug!("processing probe request"); + // Only process wildcard requests or mesh probe requests + if probe_request + .elements + .get_first_element::()? + .ssid() + != "" + { + return None; + } + + let mut tx_buffer = self.interface_control.alloc_tx_buf().await; + let probe_response = ProbeResponseFrame { + header: ManagementFrameHeader { + receiver_address: probe_request.header.transmitter_address, + transmitter_address: *our_address, + bssid: *our_address, + ..Default::default() + }, + body: ProbeResponseBody { + timestamp: 0, // TODO let the hardware fill this in automatically + beacon_interval: BEACON_INTERVAL_TU as u16, + capabilities_info: CapabilitiesInformation::new(), + elements: element_chain! { + ssid!(""), // wildcard SSID + DEFAULT_SUPPORTED_RATES, + DSSSParameterSetElement { + current_channel: self.interface_control.home_channel().unwrap_or(1) + }, + DEFAULT_XRATES, + mesh_id!(MESH_ID), + self.generate_own_mesh_configuration_element() + }, + _phantom: PhantomData, + }, + }; + + let written = tx_buffer.pwrite(probe_response, 0).unwrap(); + let _ = self + .interface_control + .transmit( + &mut tx_buffer[..written], + &TxParameters { + rate: WiFiRate::PhyRate12M, + override_seq_num: true, + tx_error_behaviour: TxErrorBehaviour::Drop, + ..Default::default() + }, + false, + ) + .await; + None + } + + async fn handle_timer_event(&mut self, our_address: &MACAddress) { + debug!("timer event!"); + enum TimerEvent { + TOR1 { + destination: MACAddress, + local_link_id: u16, + }, + TOR2 { + destination: MACAddress, + local_link_id: u16, + peer_link_id: Option, + }, + TOC { + destination: MACAddress, + local_link_id: u16, + peer_link_id: Option, + }, + TOH { + destination: MACAddress, + }, + }; + // A timer expired, so let's figure out which timers did in fact expire, and then set the next timer + let now = Instant::now(); + let event = self.common_resources.lock_peer_list(|mut peer_list| { + for (mac, peer) in peer_list.iter_mut() { + debug!("peer = {}", peer); + match peer.mpm_state { + MPMFSMState::Idle | MPMFSMState::Estab { .. } => (), + MPMFSMState::Setup { + ref mut retry_timer_expiration, + ref mut retry_counter, + ref mut confirm_timer_expiration, + local_link_id, + peer_link_id, + .. + } => { + if *retry_timer_expiration <= now { + debug!("retry {}", *retry_counter); + if *retry_counter == 0 { + peer.mpm_state = MPMFSMState::Holding { + mac_addr: *mac, + local_link_id: local_link_id, + peer_link_id: Some(peer_link_id), + holding_timer_expiration: now + + Duration::from_millis( + DOT11_MESH_HOLDING_TIMEOUT_MS.into(), + ), + }; + return Some(TimerEvent::TOR2 { + destination: *mac, + local_link_id, + peer_link_id: Some(peer_link_id), + }); + } else { + *retry_counter -= 1; + *retry_timer_expiration = + now + Duration::from_millis(DOT11_MESH_RETRY_TIMEOUT_MS.into()); + return Some(TimerEvent::TOR1 { + destination: *mac, + local_link_id, + }); + } + } + if *confirm_timer_expiration <= now { + debug!("confirm timer expiration"); + peer.mpm_state = MPMFSMState::Holding { + mac_addr: *mac, + local_link_id: local_link_id, + peer_link_id: Some(peer_link_id), + holding_timer_expiration: now + + Duration::from_millis(DOT11_MESH_HOLDING_TIMEOUT_MS.into()), + }; + return Some(TimerEvent::TOC { + destination: *mac, + local_link_id, + peer_link_id: Some(peer_link_id), + }); + } + } + MPMFSMState::Holding { + ref mut holding_timer_expiration, + .. + } => { + if *holding_timer_expiration <= now { + debug!("holding timer expiration"); + peer.mpm_state = MPMFSMState::Idle; + return Some(TimerEvent::TOH { destination: *mac }); + } + } + } + } + return None; + }); + let Some(event) = event else { + let timer = self + .common_resources + .next_peer_timer_event + .lock(|cell| cell.borrow().clone()); + warn!( + "timer expired, without timer event? {}ms (now={})", + timer.as_millis(), + Instant::now().as_millis() + ); + return; + }; + match event { + TimerEvent::TOR1 { + destination, + local_link_id, + } => { + debug!("TOR1"); + self.send_mesh_peering_open(our_address, &destination, local_link_id) + .await; + } + TimerEvent::TOR2 { + destination, + local_link_id, + peer_link_id, + } => { + debug!("TOR2"); + self.send_mesh_peering_close( + our_address, + &destination, + local_link_id, + peer_link_id, + IEEE80211Reason::MeshMaxRetries, + ) + .await; + } + TimerEvent::TOC { + destination, + local_link_id, + peer_link_id, + } => { + debug!("TOC"); + self.send_mesh_peering_close( + our_address, + &destination, + local_link_id, + peer_link_id, + IEEE80211Reason::MeshConfirmTimeout, + ) + .await; + } + TimerEvent::TOH { destination } => { + // Delete Idle from peer list to save space + debug!("TOH"); + self.common_resources + .lock_peer_list(|mut peer_list| peer_list.remove(&destination)); + } + } + } + + pub async fn run(&mut self, our_address: &MACAddress) -> ! { + let mut beacon_ticker = Ticker::every(Duration::from_micros( + BEACON_INTERVAL_TU * TU.as_micros() as u64, + )); + + loop { + match select4( + self.interface_control.wait_for_off_channel_request(), + self.rx_router_endpoint.receive(), + beacon_ticker.next(), + Timer::at( + self.common_resources + .next_peer_timer_event + .lock(|cell| cell.borrow().clone()), + ), + ) + .await + { + Either4::First(_off_channel_request) => {} + Either4::Second(buffer) => { + let _ = match_frames! { + buffer.mpdu_buffer(), + beacon_frame = BeaconFrame => { + self.process_beacon_frame(&beacon_frame, our_address).await; + } + mesh_peering_open_frame = MeshPeeringOpenFrame => { + self.process_mesh_peering_open(&mesh_peering_open_frame, our_address).await; + } + mesh_peering_confirm_frame = MeshPeeringConfirmFrame => { + self.process_mesh_peering_confirm(&mesh_peering_confirm_frame, our_address).await; + } + mesh_peering_close_frame = MeshPeeringCloseFrame => { + self.process_mesh_peering_close(&mesh_peering_close_frame, our_address).await; + } + probe_request = ProbeRequestFrame => { + self.process_probe_request(&probe_request, our_address).await; + } + }; + } + Either4::Third(_) => { + // Time to send a beacon frame + self.send_beacon_frame(our_address).await; + } + Either4::Fourth(_) => { + self.handle_timer_event(our_address).await; + } + } + } + } +} diff --git a/foa_mesh/src/runner/mod.rs b/foa_mesh/src/runner/mod.rs new file mode 100644 index 0000000..102d44d --- /dev/null +++ b/foa_mesh/src/runner/mod.rs @@ -0,0 +1,91 @@ +use defmt_or_log::debug; +use embassy_futures::select::select3; +use embassy_net_driver_channel::Runner as NetRunner; + +use foa::{LMacInterfaceControl, RxQueueReceiver}; +use management::MeshManagementRunner; +use rand_core::RngCore; +use rx::MeshRxRunner; +use tx::MeshTxRunner; + +use crate::{ + MTU, + rx_router::{MeshRxRouterEndpoint, MeshRxRouterInput}, + state::{CommonResources, MeshState}, +}; + +mod management; +mod rx; +mod tx; + +pub struct MeshRunner<'foa, 'vif, Rng: RngCore + Copy> { + pub(crate) management_runner: MeshManagementRunner<'foa, 'vif, Rng>, + pub(crate) tx_runner: MeshTxRunner<'foa, 'vif>, + pub(crate) rx_runner: MeshRxRunner<'foa, 'vif>, + pub(crate) common_resources: &'vif CommonResources, +} +impl<'foa, 'vif, Rng: RngCore + Copy> MeshRunner<'foa, 'vif, Rng> { + pub(crate) fn new( + net_runner: NetRunner<'vif, MTU>, + background_endpoint: MeshRxRouterEndpoint<'foa, 'vif>, + rx_router_input: MeshRxRouterInput<'foa, 'vif>, + interface_rx_queue_receiver: &'vif RxQueueReceiver<'foa>, + interface_control: &'vif LMacInterfaceControl<'foa>, + common_resources: &'vif CommonResources, + rng: Rng, + ) -> Self { + let (net_state_runner, net_rx_runner, net_tx_runner) = net_runner.split(); + Self { + management_runner: MeshManagementRunner { + interface_control, + rx_router_endpoint: background_endpoint, + net_state_runner, + common_resources, + rng: rng.clone(), + }, + tx_runner: MeshTxRunner { + interface_control, + net_tx_runner, + common_resources, + }, + rx_runner: MeshRxRunner { + rx_router_input, + interface_rx_queue_receiver, + net_rx_runner, + common_resources, + }, + common_resources, + } + } + pub async fn run(&mut self) -> ! { + debug!("Mesh runner active."); + let mut state = MeshState::Inactive; + + let our_address; + let channel; + let mesh_id; + loop { + let MeshState::Active { + our_address: our_address_, + channel: channel_, + mesh_id: mesh_id_, + } = state + else { + state = self.common_resources.state_signal.wait().await; + continue; + }; + our_address = our_address_; + channel = channel_; + mesh_id = mesh_id_; + break; + } + + let _ = select3( + self.management_runner.run(&our_address), + self.tx_runner.run(), + self.rx_runner.run(), + ) + .await; + unreachable!("a mesh task returned!") + } +} diff --git a/foa_mesh/src/runner/rx.rs b/foa_mesh/src/runner/rx.rs new file mode 100644 index 0000000..71a0c52 --- /dev/null +++ b/foa_mesh/src/runner/rx.rs @@ -0,0 +1,20 @@ +use embassy_net_driver_channel::RxRunner as NetRxRunner; +use foa::RxQueueReceiver; + +use crate::{MTU, rx_router::MeshRxRouterInput, state::CommonResources}; + +pub struct MeshRxRunner<'foa, 'vif> { + pub(crate) rx_router_input: MeshRxRouterInput<'foa, 'vif>, + pub(crate) interface_rx_queue_receiver: &'vif RxQueueReceiver<'foa>, + pub(crate) net_rx_runner: NetRxRunner<'vif, MTU>, + pub(crate) common_resources: &'vif CommonResources, +} +impl MeshRxRunner<'_, '_> { + pub async fn run(&mut self) -> ! { + loop { + let received_frame = self.interface_rx_queue_receiver.receive().await; + // Do some actual data RX handling here. + let _ = self.rx_router_input.route_frame(received_frame); + } + } +} diff --git a/foa_mesh/src/runner/tx.rs b/foa_mesh/src/runner/tx.rs new file mode 100644 index 0000000..7d63d13 --- /dev/null +++ b/foa_mesh/src/runner/tx.rs @@ -0,0 +1,21 @@ +use crate::{MTU, state::CommonResources}; +use defmt_or_log::debug; +use embassy_net_driver_channel::TxRunner as NetTxRunner; +use foa::LMacInterfaceControl; + +pub struct MeshTxRunner<'foa, 'vif> { + pub(crate) interface_control: &'vif LMacInterfaceControl<'foa>, + pub(crate) net_tx_runner: NetTxRunner<'vif, MTU>, + pub(crate) common_resources: &'vif CommonResources, +} +impl MeshTxRunner<'_, '_> { + pub async fn run(&mut self) -> ! { + loop { + debug!("Before TX"); + let _tx_buf = self.net_tx_runner.tx_buf().await; + debug!("after tx"); + self.net_tx_runner.tx_done(); + debug!("after tx done"); + } + } +} diff --git a/foa_mesh/src/rx_router.rs b/foa_mesh/src/rx_router.rs new file mode 100644 index 0000000..2438259 --- /dev/null +++ b/foa_mesh/src/rx_router.rs @@ -0,0 +1,30 @@ +use crate::RX_QUEUE_DEPTH; +use foa::util::rx_router::{ + HasScanOperation, RxRouter, RxRouterEndpoint, RxRouterInput, RxRouterOperation, +}; +use ieee80211::GenericFrame; +use ieee80211::common::{FrameType, ManagementFrameSubtype}; + +#[non_exhaustive] +#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] +pub enum MeshRxRouterOperation { + Scanning, +} +impl HasScanOperation for MeshRxRouterOperation { + const SCAN_OPERATION: Self = Self::Scanning; +} +impl RxRouterOperation for MeshRxRouterOperation { + fn frame_relevant_for_operation(&self, generic_frame: &GenericFrame<'_>) -> bool { + let frame_type = generic_frame.frame_control_field().frame_type(); + match self { + MeshRxRouterOperation::Scanning => matches!( + frame_type, + FrameType::Management(ManagementFrameSubtype::Beacon) + ), + } + } +} +pub type MeshRxRouter<'foa> = RxRouter<'foa, RX_QUEUE_DEPTH, MeshRxRouterOperation>; +pub type MeshRxRouterEndpoint<'foa, 'router> = + RxRouterEndpoint<'foa, 'router, MeshRxRouterOperation>; +pub type MeshRxRouterInput<'foa, 'router> = RxRouterInput<'foa, 'router, MeshRxRouterOperation>; diff --git a/foa_mesh/src/state.rs b/foa_mesh/src/state.rs new file mode 100644 index 0000000..7c5b017 --- /dev/null +++ b/foa_mesh/src/state.rs @@ -0,0 +1,202 @@ +use core::cell::{Cell, RefCell, RefMut}; +use core::cmp; + +use defmt_or_log::derive_format_or_debug; +use embassy_net_driver_channel::State as NetState; +use embassy_sync::blocking_mutex::NoopMutex; +use embassy_sync::{blocking_mutex::raw::NoopRawMutex, signal::Signal}; +use embassy_time::Instant; +use foa::util::rx_router::RxRouter; +use ieee80211::common::AssociationID; +use ieee80211::mac_parser::MACAddress; + +use crate::NET_TX_BUFFERS; +use crate::peer_state::{MeshPeerList, StaticMeshPeerList}; +use crate::rx_router::MeshRxRouter; +use crate::{MTU, NET_RX_BUFFERS}; + +#[derive(Clone, Debug, PartialEq, Eq, Hash)] +/// State of the mesh interface pushed to the runner. +pub(crate) enum MeshState { + Active { + our_address: MACAddress, + channel: u8, + mesh_id: heapless::String<32>, + }, + Inactive, +} + +/// States of the Mesh Peering Management (MPM) Finite State Machine +// See also Figure 14-2 'Finite state machine of the MPM protocol' in the 2020 edition of the 802.11 standard +// I recommend looking at the figure, it's a lot clearer than the text +#[derive(Clone, PartialEq, Eq, Hash, Copy)] +#[derive_format_or_debug] +pub enum MPMFSMSubState { + // Open sent, but nothing received ye + OpnSnt, + // Received Confirm, but no Open yet => so also no Confirm sent yet + CnfRcvd, + // Received Open, but not Confirm => we also sent Confirm on receiving the Open + OpnRcvd, +} + +#[derive(Clone, PartialEq, Eq, Default, Copy)] +#[derive_format_or_debug] +pub enum MPMFSMState { + #[default] + Idle, + Setup { + mac_addr: MACAddress, + local_link_id: u16, + peer_link_id: u16, + substate: MPMFSMSubState, + local_aid: AssociationID, + remote_aid: Option, + retry_timer_expiration: Instant, + retry_counter: u8, + confirm_timer_expiration: Instant, + }, + // Received Open and Confirm, also sent Open and Confirm + Estab { + mac_addr: MACAddress, + local_link_id: u16, + peer_link_id: u16, + local_aid: AssociationID, + remote_aid: AssociationID, + }, + // Closing the peering instance + Holding { + mac_addr: MACAddress, + local_link_id: u16, + peer_link_id: Option, + holding_timer_expiration: Instant, + }, +} + +impl MPMFSMState { + pub fn get_mac_address(self) -> Option { + match self { + Self::Idle => None, + Self::Estab { mac_addr, .. } => Some(mac_addr), + Self::Setup { mac_addr, .. } => Some(mac_addr), + Self::Holding { mac_addr, .. } => Some(mac_addr), + } + } +} + +/// Parameters that may change over the course of a session. +pub(crate) struct DynamicSessionParameters { + pub(crate) is_mesh_gate: Cell, +} + +impl DynamicSessionParameters { + pub fn new() -> Self { + Self { + is_mesh_gate: Cell::new(false), + } + } +} +pub(crate) type MeshPeerListImplementation = StaticMeshPeerList; + +pub struct CommonResources { + // State signaling + /// Indicates the current status of the interface to the runner. + pub(crate) state_signal: Signal, + + // State + /// Dynamically changing parameters. + pub(crate) dynamic_session_parameters: DynamicSessionParameters, + /// Stores all currently known peers. + pub(crate) peer_list: NoopMutex>, + + association_id_ctr: Cell, + + pub(crate) next_peer_timer_event: NoopMutex>, +} + +impl CommonResources { + pub fn new() -> Self { + Self { + state_signal: Signal::new(), + dynamic_session_parameters: DynamicSessionParameters::new(), + peer_list: NoopMutex::new(RefCell::new(MeshPeerListImplementation::UNINIT)), + association_id_ctr: Cell::new(1), + next_peer_timer_event: NoopMutex::new(RefCell::new(Instant::MAX)), + } + } + /// Initialize the parameters for a new session. + pub fn initialize_session_parameters(&self, _channel: u8, _address: MACAddress) { + // TODO use _channel and _address + } + /// Acquire mutable access to the peer list in the closure. Also updates the deadlines after. + pub fn lock_peer_list( + &self, + f: impl FnOnce(RefMut<'_, MeshPeerListImplementation>) -> O, + ) -> O { + let (result, first_deadline) = self.peer_list.lock(|peer_list| { + let result = (f)(peer_list.borrow_mut()); + // and recalculate timers + let mut first_deadline = Instant::MAX; + for (_, peer) in peer_list.borrow().iter() { + match peer.mpm_state { + MPMFSMState::Idle => {} + MPMFSMState::Estab { .. } => {} + MPMFSMState::Holding { + holding_timer_expiration, + .. + } => { + first_deadline = cmp::min(first_deadline, holding_timer_expiration); + } + MPMFSMState::Setup { + retry_timer_expiration, + confirm_timer_expiration, + .. + } => { + first_deadline = cmp::min( + first_deadline, + cmp::min(retry_timer_expiration, confirm_timer_expiration), + ) + } + } + } + + (result, first_deadline) + }); + self.next_peer_timer_event + .lock(|cell| cell.replace(first_deadline)); + + result + } + + pub fn new_association_id(&self) -> AssociationID { + self.association_id_ctr.update(|counter| { + return (counter + 1 % AssociationID::MAX_AID) + .clamp(AssociationID::MIN_AID, AssociationID::MAX_AID); + }); + + AssociationID::new_checked(self.association_id_ctr.get()).unwrap() + } +} + +/// Resources for the Mesh interface. +pub struct MeshResources<'foa> { + /// Resources common to all components. + pub common_resources: CommonResources, + /// Resources for embassy_net_driver_channel. + pub net_state: NetState, + pub rx_router: MeshRxRouter<'foa>, +} +impl MeshResources<'_> { + pub fn new() -> Self { + Self { + rx_router: RxRouter::new(), + common_resources: CommonResources::new(), + net_state: NetState::new(), + } + } +} +impl Default for MeshResources<'_> { + fn default() -> Self { + Self::new() + } +} diff --git a/foa_sta/Cargo.lock b/foa_sta/Cargo.lock index 3125deb..92bfc45 100644 --- a/foa_sta/Cargo.lock +++ b/foa_sta/Cargo.lock @@ -24,15 +24,15 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.98" +version = "1.0.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" +checksum = "b0674a1ddeecb70197781e945de4b3b8ffb61fa939a5597bcf48503737663100" [[package]] name = "autocfg" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "basic-toml" @@ -82,9 +82,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.9.1" +version = "2.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" +checksum = "6a65b545ab31d687cff52899d4890855fec459eb6afe0da6417b8a18da87aa29" [[package]] name = "block-buffer" @@ -97,9 +97,9 @@ dependencies = [ [[package]] name = "bytemuck" -version = "1.23.1" +version = "1.23.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c76a5792e44e4abe34d3abf15636779261d45a7450612059293d1d2cfc63422" +checksum = "3995eaeebcdf32f91f980d360f78732ddc061097ab4e39991ae7a6ace9194677" [[package]] name = "byteorder" @@ -140,9 +140,9 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.4.2" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" dependencies = [ "cfg-if", ] @@ -169,8 +169,18 @@ version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" dependencies = [ - "darling_core", - "darling_macro", + "darling_core 0.20.11", + "darling_macro 0.20.11", +] + +[[package]] +name = "darling" +version = "0.21.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08440b3dd222c3d0433e63e097463969485f112baff337dfdaca043a0d760570" +dependencies = [ + "darling_core 0.21.2", + "darling_macro 0.21.2", ] [[package]] @@ -187,13 +197,37 @@ dependencies = [ "syn", ] +[[package]] +name = "darling_core" +version = "0.21.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25b7912bc28a04ab1b7715a68ea03aaa15662b43a1a4b2c480531fd19f8bf7e" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "darling_macro" version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ - "darling_core", + "darling_core 0.20.11", + "quote", + "syn", +] + +[[package]] +name = "darling_macro" +version = "0.21.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce154b9bea7fb0c8e8326e62d00354000c36e79770ff21b8c84e3aa267d9d531" +dependencies = [ + "darling_core 0.21.2", "quote", "syn", ] @@ -269,9 +303,9 @@ dependencies = [ [[package]] name = "delegate" -version = "0.13.3" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9b6483c2bbed26f97861cf57651d4f2b731964a28cd2257f934a4b452480d21" +checksum = "6178a82cf56c836a3ba61a7935cdb1c49bfaa6fa4327cd5bf554a503087de26b" dependencies = [ "proc-macro2", "quote", @@ -300,10 +334,11 @@ dependencies = [ [[package]] name = "embassy-embedded-hal" -version = "0.3.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fea5ef5bed4d3468dfd44f5c9fa4cda8f54c86d4fb4ae683eacf9d39e2ea12" +checksum = "8c62a3bf127e03832fb97d8b01a058775e617653bc89e2a12c256485a7fb54c1" dependencies = [ + "embassy-embedded-hal 0.4.0", "embassy-futures", "embassy-sync 0.6.2", "embassy-time", @@ -315,12 +350,38 @@ dependencies = [ "nb 1.1.0", ] +[[package]] +name = "embassy-embedded-hal" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1611b7a7ab5d1fbed84c338df26d56fd9bded58006ebb029075112ed2c5e039" +dependencies = [ + "embassy-futures", + "embassy-hal-internal", + "embassy-sync 0.7.1", + "embedded-hal 0.2.7", + "embedded-hal 1.0.0", + "embedded-hal-async", + "embedded-storage", + "embedded-storage-async", + "nb 1.1.0", +] + [[package]] name = "embassy-futures" version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f878075b9794c1e4ac788c95b728f26aa6366d32eeb10c7051389f898f7d067" +[[package]] +name = "embassy-hal-internal" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95285007a91b619dc9f26ea8f55452aa6c60f7115a4edc05085cd2bd3127cd7a" +dependencies = [ + "num-traits", +] + [[package]] name = "embassy-net" version = "0.7.0" @@ -346,13 +407,13 @@ checksum = "524eb3c489760508f71360112bca70f6e53173e6fe48fc5f0efd0f5ab217751d" [[package]] name = "embassy-net-driver-channel" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4818c32afec43e3cae234f324bad9a976c9aa7501022d26ff60a4017a1a006b7" +checksum = "25a567ab50319d866ad5e6c583ed665ba9b07865389644d3d82e45bf1497c934" dependencies = [ "embassy-futures", "embassy-net-driver", - "embassy-sync 0.6.2", + "embassy-sync 0.7.1", ] [[package]] @@ -371,15 +432,15 @@ dependencies = [ [[package]] name = "embassy-sync" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cef1a8a1ea892f9b656de0295532ac5d8067e9830d49ec75076291fd6066b136" +checksum = "03c372c90d3525a648684fa1c131decaf7d9ff181030db09c876fad6043443b9" dependencies = [ "cfg-if", "critical-section", "embedded-io-async", + "futures-core", "futures-sink", - "futures-util", "heapless", ] @@ -410,9 +471,12 @@ dependencies = [ [[package]] name = "embassy-usb-driver" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fc247028eae04174b6635104a35b1ed336aabef4654f5e87a8f32327d231970" +checksum = "340c5ce591ef58c6449e43f51d2c53efe1bf0bb6a40cbf80afa0d259c7d52c76" +dependencies = [ + "embedded-io-async", +] [[package]] name = "embassy-usb-synopsys-otg" @@ -510,20 +574,20 @@ dependencies = [ [[package]] name = "enumset" -version = "1.1.6" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11a6b7c3d347de0a9f7bfd2f853be43fe32fa6fac30c70f6d6d67a1e936b87ee" +checksum = "41326c68a68a5d2235daf392dc0da9f342a6579284b1a12ce1e6fed6c95fe19e" dependencies = [ "enumset_derive", ] [[package]] name = "enumset_derive" -version = "0.11.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6da3ea9e1d1a3b1593e15781f930120e72aa7501610b2f82e5b6739c72e8eac5" +checksum = "86b0b3dd7a4444d18c9331b659b5f309577448a2e47f0c125fed64407bc0a82c" dependencies = [ - "darling", + "darling 0.21.2", "proc-macro2", "quote", "syn", @@ -566,14 +630,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3887eda2917deef3d99e7a5c324f9190714e99055361ad36890dffd0a995b49" dependencies = [ "bitfield", - "bitflags 2.9.1", + "bitflags 2.9.2", "bytemuck", "cfg-if", "critical-section", "delegate", "digest", "document-features", - "embassy-embedded-hal", + "embassy-embedded-hal 0.3.2", "embassy-futures", "embassy-sync 0.6.2", "embassy-usb-driver", @@ -689,9 +753,9 @@ dependencies = [ [[package]] name = "esp-wifi-hal" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d04d71be50d44402e9245a939250bccabe80c890769de1ac618ffab00f6dbb36" +checksum = "e6bea2e1ce476a20f260e3474da0506b0583ac86effd4861f5144a2ca515aa73" dependencies = [ "bitfield-struct", "cfg-if", @@ -699,7 +763,7 @@ dependencies = [ "defmt", "defmt-or-log", "embassy-futures", - "embassy-sync 0.7.0", + "embassy-sync 0.7.1", "embassy-time", "esp-hal", "esp-wifi-sys", @@ -829,7 +893,7 @@ dependencies = [ "defmt", "defmt-or-log", "embassy-futures", - "embassy-sync 0.7.0", + "embassy-sync 0.7.1", "embassy-time", "esp-config 0.5.0", "esp-hal", @@ -849,7 +913,7 @@ dependencies = [ "embassy-futures", "embassy-net", "embassy-net-driver-channel", - "embassy-sync 0.7.0", + "embassy-sync 0.7.1", "embassy-time", "esp-config 0.4.0", "ethernet", @@ -927,9 +991,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.4" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" [[package]] name = "heapless" @@ -964,9 +1028,9 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "ieee80211" -version = "0.5.7" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c708bbeae0b32ebeb6847424a9561a1a10855b9357309427c884dc93c181e7d" +checksum = "7418f9be3522922d6e87647eacd5275641f6c225cf4a444a64c31e366ac37559" dependencies = [ "aes-kw", "bitfield-struct", @@ -988,9 +1052,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.9.0" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" +checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" dependencies = [ "equivalent", "hashbrown", @@ -1014,11 +1078,11 @@ dependencies = [ [[package]] name = "instability" -version = "0.3.7" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf9fed6d91cfb734e7476a06bde8300a1b94e217e1b523b6f0cd1a01998c71d" +checksum = "435d80800b936787d62688c927b6490e887c7ef5ff9ce922c6c6050fca75eb9a" dependencies = [ - "darling", + "darling 0.20.11", "indoc", "proc-macro2", "quote", @@ -1033,15 +1097,15 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "libc" -version = "0.2.173" +version = "0.2.175" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8cfeafaffdbc32176b64fb251369d52ea9f0a8fbc6f8759edffef7b525d64bb" +checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" [[package]] name = "litrs" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5" +checksum = "f5e54036fe321fd421e10d732f155734c4e4afd610dd556d9a82833ab3ee0bed" dependencies = [ "proc-macro2", ] @@ -1257,9 +1321,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.95" +version = "1.0.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +checksum = "d61789d7719defeb74ea5fe81f2fdfdbd28a803847077cecce2ff14e1472f6f1" dependencies = [ "unicode-ident", ] @@ -1338,12 +1402,6 @@ dependencies = [ "syn", ] -[[package]] -name = "rustversion" -version = "1.0.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" - [[package]] name = "ryu" version = "1.0.20" @@ -1392,9 +1450,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.140" +version = "1.0.142" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +checksum = "030fedb782600dcbd6f02d479bf0d817ac3bb40d644745b769d6a96bc3afc5a7" dependencies = [ "itoa", "memchr", @@ -1473,23 +1531,22 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "strum" -version = "0.27.1" +version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f64def088c51c9510a8579e3c5d67c65349dcf755e5479ad3d010aa6454e2c32" +checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" dependencies = [ "strum_macros", ] [[package]] name = "strum_macros" -version = "0.27.1" +version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c77a8c5abcaf0f9ce05d62342b7d298c346515365c36b673df4ebe3ced01fde8" +checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" dependencies = [ "heck", "proc-macro2", "quote", - "rustversion", "syn", ] @@ -1501,9 +1558,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "2.0.103" +version = "2.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4307e30089d6fd6aff212f2da3a1f9e32f3223b1f010fb09b7c95f90f3ca1e8" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" dependencies = [ "proc-macro2", "quote", @@ -1521,18 +1578,18 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.12" +version = "2.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +checksum = "0b0949c3a6c842cbde3f1686d6eea5a010516deb7085f79db747562d4102f41e" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "2.0.12" +version = "2.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +checksum = "cc5b44b4ab9c2fdd0e0512e6bece8388e214c0749f5862b114cc5b7a25daf227" dependencies = [ "proc-macro2", "quote", @@ -1703,9 +1760,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "winnow" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74c7b26e3480b707944fc872477815d29a8e429d2f93a1ce000f5fa84a15cbcd" +checksum = "f3edebf492c8125044983378ecb5766203ad3b4c2f7a922bd7dd207f6d443e95" dependencies = [ "memchr", ] diff --git a/foa_sta/Cargo.toml b/foa_sta/Cargo.toml index abe1843..9c02db9 100644 --- a/foa_sta/Cargo.toml +++ b/foa_sta/Cargo.toml @@ -26,7 +26,7 @@ heapless = "0.8.0" llc-rs = "0.1.1" rand_core = "0.9.3" portable-atomic = "1.11.1" -ieee80211 = "0.5.7" +ieee80211 = "0.5.9" [build-dependencies] esp-config = { version = "0.4.0", features = ["build"] }