diff --git a/Cargo.lock b/Cargo.lock index 45fae501..54033d96 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -756,7 +756,7 @@ dependencies = [ "tokio-stream", "tokio-util", "uuid", - "zerocopy 0.6.6", + "zerocopy 0.8.25", ] [[package]] @@ -936,7 +936,7 @@ dependencies = [ "static_assertions", "strum_macros", "uuid", - "zerocopy 0.6.6", + "zerocopy 0.8.25", ] [[package]] @@ -3654,6 +3654,15 @@ dependencies = [ "zerocopy-derive 0.7.32", ] +[[package]] +name = "zerocopy" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" +dependencies = [ + "zerocopy-derive 0.8.25", +] + [[package]] name = "zerocopy-derive" version = "0.6.6" @@ -3676,6 +3685,17 @@ dependencies = [ "syn 2.0.87", ] +[[package]] +name = "zerocopy-derive" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "zeroize" version = "1.8.1" diff --git a/Cargo.toml b/Cargo.toml index c46f7448..b0ecf1d5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -60,7 +60,7 @@ tokio-util = { version = "0.7", features = ["compat"] } usdt = "0.5.0" uuid = { version = "1.16", default-features = false } version_check = "0.9.5" -zerocopy = "0.6.6" +zerocopy = "0.8.25" zip = { version = "0.6.6", default-features = false, features = ["deflate", "bzip2"] } gateway-messages.path = "gateway-messages" diff --git a/faux-mgs/src/main.rs b/faux-mgs/src/main.rs index b7fe11aa..4b152a16 100644 --- a/faux-mgs/src/main.rs +++ b/faux-mgs/src/main.rs @@ -60,7 +60,7 @@ use std::sync::Arc; use std::time::Duration; use tokio::net::UdpSocket; use uuid::Uuid; -use zerocopy::AsBytes; +use zerocopy::IntoBytes; mod picocom_map; mod usart; diff --git a/gateway-messages/Cargo.toml b/gateway-messages/Cargo.toml index dcd41894..2bb21d31 100644 --- a/gateway-messages/Cargo.toml +++ b/gateway-messages/Cargo.toml @@ -14,7 +14,7 @@ smoltcp = { workspace = true, optional = true } static_assertions.workspace = true strum_macros.workspace = true uuid.workspace = true -zerocopy.workspace = true +zerocopy = { workspace = true, features = ["derive"] } [dev-dependencies] serde_json.workspace = true diff --git a/gateway-messages/src/mgs_to_sp.rs b/gateway-messages/src/mgs_to_sp.rs index 85612e6e..6bd27d95 100644 --- a/gateway-messages/src/mgs_to_sp.rs +++ b/gateway-messages/src/mgs_to_sp.rs @@ -343,7 +343,9 @@ pub enum UnlockChallenge { PartialEq, Eq, Debug, - zerocopy::AsBytes, + zerocopy::IntoBytes, + zerocopy::KnownLayout, + zerocopy::Immutable, )] #[repr(C)] pub struct EcdsaSha2Nistp256Challenge { diff --git a/gateway-messages/src/tlv.rs b/gateway-messages/src/tlv.rs index 041295bd..2d7e24b8 100644 --- a/gateway-messages/src/tlv.rs +++ b/gateway-messages/src/tlv.rs @@ -10,8 +10,10 @@ use core::iter; use core::mem; use zerocopy::byteorder::LittleEndian; use zerocopy::byteorder::U32; -use zerocopy::AsBytes; use zerocopy::FromBytes; +use zerocopy::Immutable; +use zerocopy::IntoBytes; +use zerocopy::KnownLayout; #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum EncodeError { @@ -42,11 +44,31 @@ impl fmt::Display for DecodeError { #[cfg(feature = "std")] impl std::error::Error for DecodeError {} -#[derive(Debug, Clone, Copy, PartialEq, Eq, AsBytes, FromBytes)] +#[derive( + Debug, + Clone, + Copy, + PartialEq, + Eq, + IntoBytes, + FromBytes, + Immutable, + KnownLayout, +)] #[repr(C)] pub struct Tag(pub [u8; 4]); -#[derive(Debug, Clone, Copy, PartialEq, Eq, AsBytes, FromBytes)] +#[derive( + Debug, + Clone, + Copy, + PartialEq, + Eq, + IntoBytes, + FromBytes, + Immutable, + KnownLayout, +)] #[repr(C)] struct Header { tag: Tag, @@ -103,9 +125,8 @@ where /// returns `(Tag, value, rest_of_buf)`. pub fn decode(buf: &[u8]) -> Result<(Tag, &[u8], &[u8]), DecodeError> { // Peel header off the front. - let header = - Header::read_from_prefix(buf).ok_or(DecodeError::BufferTooSmall)?; - let buf = &buf[mem::size_of::
()..]; + let (header, buf) = Header::read_from_prefix(buf) + .map_err(|_| DecodeError::BufferTooSmall)?; // Split remaining buffer at the end of our value. let length = header.length.get() as usize;