From deaeb3569721097d5379c2f530896cd0530476b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Onur=20=C3=96zkan?= Date: Sat, 30 May 2026 15:40:57 +0300 Subject: [PATCH 1/6] migrate bindgen to use crc-fast MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Onur Özkan --- Cargo.toml | 2 +- mavlink-bindgen/Cargo.toml | 2 +- mavlink-bindgen/src/parser.rs | 44 +++++++++++++++++++---------------- 3 files changed, 26 insertions(+), 22 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 7b114f75caf..1554f88adf9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,7 +3,7 @@ members = ["mavlink", "mavlink-bindgen", "mavlink-core"] resolver = "1" [workspace.dependencies] -crc-any = { version = "2.3.5", default-features = false } +crc-fast = { version = "1.10", default-features = false } num-traits = { version = "0.2", default-features = false } num-derive = "0.4" bitflags = { version = "2.9.1", default-features = false } diff --git a/mavlink-bindgen/Cargo.toml b/mavlink-bindgen/Cargo.toml index f485ca1c548..a56acc47748 100644 --- a/mavlink-bindgen/Cargo.toml +++ b/mavlink-bindgen/Cargo.toml @@ -20,7 +20,7 @@ arbitrary = { version = "1.4", optional = true, features = ["derive"] } clap = { version = "~4.6.0", optional = true, default-features =false, features = ["derive", "help", "usage", "error-context"] } clap_builder = { version = "4.3.24", optional = true} clap_lex = { version = "1.0.0", optional = true } -crc-any = { workspace = true, default-features = false } +crc-fast = { workspace = true, default-features = false } proc-macro2 = "1.0.43" quick-xml = "0.40" quote = "1" diff --git a/mavlink-bindgen/src/parser.rs b/mavlink-bindgen/src/parser.rs index f315ec59453..87f32357c8f 100644 --- a/mavlink-bindgen/src/parser.rs +++ b/mavlink-bindgen/src/parser.rs @@ -1,4 +1,4 @@ -use crc_any::CRCu16; +use crc_fast::{CrcAlgorithm, Digest as CrcDigest}; use std::cmp::Ordering; use std::collections::btree_map::Entry; use std::collections::{BTreeMap, HashSet}; @@ -2099,32 +2099,36 @@ pub fn generate( /// needed for generating sensible rust code), but for calculating crc function we have to /// use the original name "type" pub fn extra_crc(msg: &MavMessage) -> u8 { - // calculate a 8-bit checksum of the key fields of a message, so we - // can detect incompatible XML changes - let mut crc = CRCu16::crc16mcrf4cc(); - - crc.digest(msg.name.as_bytes()); - crc.digest(b" "); - - let mut f = msg.fields.clone(); - // only mavlink 1 fields should be part of the extra_crc - f.retain(|f| !f.is_extension); - f.sort_by(|a, b| a.mavtype.compare(&b.mavtype)); - for field in &f { - crc.digest(field.mavtype.primitive_type().as_bytes()); - crc.digest(b" "); + let mut crc = CrcDigest::new(CrcAlgorithm::Crc16Mcrf4xx); + + crc.update(msg.name.as_bytes()); + crc.update(b" "); + + let mut fields = msg.fields.clone(); + + // Mavlink 2 extension fields are not part of CRC_EXTRA. + fields.retain(|field| !field.is_extension); + + fields.sort_by(|left, right| left.mavtype.compare(&right.mavtype)); + + for field in &fields { + crc.update(field.mavtype.primitive_type().as_bytes()); + crc.update(b" "); + if field.name == "mavtype" { - crc.digest(b"type"); + crc.update(b"type"); } else { - crc.digest(field.name.as_bytes()); + crc.update(field.name.as_bytes()); } - crc.digest(b" "); + + crc.update(b" "); + if let MavType::Array(_, size) | MavType::CharArray(size) = field.mavtype { - crc.digest(&[size as u8]); + crc.update(&[size as u8]); } } - let crcval = crc.get_crc(); + let crcval = crc.finalize() as u16; ((crcval & 0xFF) ^ (crcval >> 8)) as u8 } From c95476fcb49890f2a33e95e3c84d02b2f52ae7b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Onur=20=C3=96zkan?= Date: Sat, 30 May 2026 15:41:14 +0300 Subject: [PATCH 2/6] move core to use crc-fast MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Onur Özkan --- mavlink-core/Cargo.toml | 6 +++--- mavlink-core/src/lib.rs | 13 ++++++------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/mavlink-core/Cargo.toml b/mavlink-core/Cargo.toml index 2d709239812..cd406f2c661 100644 --- a/mavlink-core/Cargo.toml +++ b/mavlink-core/Cargo.toml @@ -22,7 +22,7 @@ categories.workspace = true arbitrary = { version = "1.4", optional = true, features = ["derive"] } async-trait = { version = "0.1.18", optional = true } byteorder = { workspace = true, default-features = false } -crc-any = { workspace = true, default-features = false } +crc-fast = { workspace = true, default-features = false } embedded-io = { version = "0.7", optional = true } embedded-io-async = { version = "0.7", optional = true } futures = { version = "0.3", default-features = false, optional = true } @@ -43,11 +43,11 @@ default = [ "serde", ] -std = ["byteorder/std"] +std = ["byteorder/std", "crc-fast/std"] transport-udp = [] transport-tcp = [] transport-direct-serial = ["serialport"] -embedded = ["dep:embedded-io", "dep:embedded-io-async"] +embedded = ["dep:embedded-io", "dep:embedded-io-async", "crc-fast/panic-handler"] serde = ["dep:serde", "dep:serde_arrays"] tokio = [ "dep:tokio", diff --git a/mavlink-core/src/lib.rs b/mavlink-core/src/lib.rs index 6619ef252c5..9aacad40ecf 100644 --- a/mavlink-core/src/lib.rs +++ b/mavlink-core/src/lib.rs @@ -104,7 +104,7 @@ use crate::{ error::{MessageReadError, MessageWriteError, ParserError}, }; -use crc_any::CRCu16; +use crc_fast::{CrcAlgorithm, Digest as CrcDigest}; #[doc(hidden)] pub mod bytes; @@ -139,7 +139,7 @@ mod signing; #[cfg(feature = "mav2-message-signing")] pub use self::signing::{SigningConfig, SigningData}; #[cfg(feature = "mav2-message-signing")] -use sha2::{Digest, Sha256}; +use sha2::{Digest as Sha256Digest, Sha256}; #[cfg(feature = "arbitrary")] use arbitrary::Arbitrary; @@ -401,11 +401,10 @@ impl MavFrame { /// Calculates the [CRC checksum](https://mavlink.io/en/guide/serialization.html#checksum) of a messages header, payload and the CRC_EXTRA byte. pub fn calculate_crc(data: &[u8], extra_crc: u8) -> u16 { - let mut crc_calculator = CRCu16::crc16mcrf4cc(); - crc_calculator.digest(data); - - crc_calculator.digest(&[extra_crc]); - crc_calculator.get_crc() + let mut crc_calculator = CrcDigest::new(CrcAlgorithm::Crc16Mcrf4xx); + crc_calculator.update(data); + crc_calculator.update(&[extra_crc]); + crc_calculator.finalize() as u16 } #[derive(Debug, Clone, Copy, PartialEq, Eq)] From 0a4102c503bed2efc2be48eaf8fb876008f7bdbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Onur=20=C3=96zkan?= Date: Sat, 30 May 2026 17:23:24 +0300 Subject: [PATCH 3/6] bump MSRV to 1.89 (as crc-fast requires) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Onur Özkan --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 1554f88adf9..c703c04cba6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,7 +11,7 @@ byteorder = { version = "1.3.4", default-features = false } [workspace.package] edition = "2024" -rust-version = "1.85.0" +rust-version = "1.89.0" keywords = ["mavlink", "parser", "protocol", "embedded"] categories = ["aerospace", "aerospace::protocols", "parsing", "embedded"] From 35657e0ed7a0536efd5ae36b41b95308ae59b8ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Onur=20=C3=96zkan?= Date: Sat, 30 May 2026 17:31:50 +0300 Subject: [PATCH 4/6] bless clippy MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Onur Özkan --- mavlink-bindgen/src/parser.rs | 5 ++--- mavlink-core/src/connection/udp/async.rs | 8 ++++---- mavlink-core/src/connection/udp/sync.rs | 8 ++++---- mavlink-core/src/lib.rs | 16 ++++++++-------- mavlink/build/main.rs | 11 +++++------ 5 files changed, 23 insertions(+), 25 deletions(-) diff --git a/mavlink-bindgen/src/parser.rs b/mavlink-bindgen/src/parser.rs index 87f32357c8f..bcfbd3ff3d3 100644 --- a/mavlink-bindgen/src/parser.rs +++ b/mavlink-bindgen/src/parser.rs @@ -1801,10 +1801,9 @@ pub fn parse_profile( // Update field display if enum is a bitmask if let Some(e) = profile.enums.get(field.enumtype.as_ref().unwrap()) + && e.bitmask { - if e.bitmask { - field.display = Some("bitmask".to_string()); - } + field.display = Some("bitmask".to_string()); } } b"display" => { diff --git a/mavlink-core/src/connection/udp/async.rs b/mavlink-core/src/connection/udp/async.rs index 8daf5b2626b..a6000f62dca 100644 --- a/mavlink-core/src/connection/udp/async.rs +++ b/mavlink-core/src/connection/udp/async.rs @@ -106,10 +106,10 @@ impl AsyncUdpConnection { } async fn update_reply_destination(&self, reader: &mut AsyncPeekReader) { - if self.server { - if let addr @ Some(_) = reader.reader_ref().last_recv_address { - self.writer.lock().await.dest = addr; - } + if self.server + && let addr @ Some(_) = reader.reader_ref().last_recv_address + { + self.writer.lock().await.dest = addr; } } } diff --git a/mavlink-core/src/connection/udp/sync.rs b/mavlink-core/src/connection/udp/sync.rs index 7b0146c0e86..657c6de03eb 100644 --- a/mavlink-core/src/connection/udp/sync.rs +++ b/mavlink-core/src/connection/udp/sync.rs @@ -75,10 +75,10 @@ impl UdpConnection { } fn update_reply_destination(&self, reader: &PeekReader) { - if self.server { - if let addr @ Some(_) = reader.reader_ref().last_recv_address { - self.writer.lock().unwrap().dest = addr; - } + if self.server + && let addr @ Some(_) = reader.reader_ref().last_recv_address + { + self.writer.lock().unwrap().dest = addr; } } } diff --git a/mavlink-core/src/lib.rs b/mavlink-core/src/lib.rs index 9aacad40ecf..410068a1ac4 100644 --- a/mavlink-core/src/lib.rs +++ b/mavlink-core/src/lib.rs @@ -1368,10 +1368,10 @@ fn try_decode_v2( } #[cfg(feature = "mav2-message-signing")] - if let Some(signing_data) = signing_data { - if !signing_data.verify_signature(&message) { - return Ok(None); - } + if let Some(signing_data) = signing_data + && !signing_data.verify_signature(&message) + { + return Ok(None); } Ok(Some(message)) @@ -1411,10 +1411,10 @@ async fn try_decode_v2_async( } #[cfg(feature = "mav2-message-signing")] - if let Some(signing_data) = signing_data { - if !signing_data.verify_signature(&message) { - return Ok(None); - } + if let Some(signing_data) = signing_data + && !signing_data.verify_signature(&message) + { + return Ok(None); } Ok(Some(message)) diff --git a/mavlink/build/main.rs b/mavlink/build/main.rs index 93bdddbd5ab..43e97259bcf 100644 --- a/mavlink/build/main.rs +++ b/mavlink/build/main.rs @@ -18,17 +18,16 @@ fn main() -> ExitCode { .unwrap_or(true); let is_submodule = mavlink_dir.join(".git").exists() || is_mavlink_empty; - if is_submodule { - if let Err(error) = Command::new("git") + if is_submodule + && let Err(error) = Command::new("git") .arg("submodule") .arg("update") .arg("--init") .current_dir(src_dir) .status() - { - eprintln!("Failed to update MAVLink definitions submodule: {error}"); - return ExitCode::FAILURE; - } + { + eprintln!("Failed to update MAVLink definitions submodule: {error}"); + return ExitCode::FAILURE; } // find & apply patches to XML definitions to avoid crashes From 5c15de1373ea1f5538072109b7ee77f583d35e08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Onur=20=C3=96zkan?= Date: Fri, 5 Jun 2026 20:07:27 +0300 Subject: [PATCH 5/6] use v2 resolver in workspace MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Keeps build-dependency features separate from embedded target features. Signed-off-by: Onur Özkan --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index c703c04cba6..3e3e6260893 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [workspace] members = ["mavlink", "mavlink-bindgen", "mavlink-core"] -resolver = "1" +resolver = "2" [workspace.dependencies] crc-fast = { version = "1.10", default-features = false } From c346d76391ba363061e708f15cb29518640dd974 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Onur=20=C3=96zkan?= Date: Fri, 5 Jun 2026 20:08:09 +0300 Subject: [PATCH 6/6] bindgen: enable std for crc-fast MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bindgen runs on the host while generating MAVLink code where std is always available. Signed-off-by: Onur Özkan --- mavlink-bindgen/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mavlink-bindgen/Cargo.toml b/mavlink-bindgen/Cargo.toml index a56acc47748..d19d51f983b 100644 --- a/mavlink-bindgen/Cargo.toml +++ b/mavlink-bindgen/Cargo.toml @@ -20,7 +20,7 @@ arbitrary = { version = "1.4", optional = true, features = ["derive"] } clap = { version = "~4.6.0", optional = true, default-features =false, features = ["derive", "help", "usage", "error-context"] } clap_builder = { version = "4.3.24", optional = true} clap_lex = { version = "1.0.0", optional = true } -crc-fast = { workspace = true, default-features = false } +crc-fast = { workspace = true, default-features = false, features = ["std"] } proc-macro2 = "1.0.43" quick-xml = "0.40" quote = "1"