From f2c6a54060a4f2bf0638c8649726626b972cd130 Mon Sep 17 00:00:00 2001 From: Michael Mikovsky <77305074+Astatin3@users.noreply.github.com> Date: Sat, 25 Apr 2026 20:41:02 -0600 Subject: [PATCH] Optimize framed packet encoding --- src/protocol/codec.rs | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/src/protocol/codec.rs b/src/protocol/codec.rs index 764d226..11f32dd 100644 --- a/src/protocol/codec.rs +++ b/src/protocol/codec.rs @@ -1,6 +1,6 @@ //! Framed packet encoding and decoding. use core::{fmt, mem}; -use rkyv::{Serialize, access, deserialize, rancor::Error, to_bytes, util::AlignedVec}; +use rkyv::{Serialize, access, api::high::to_bytes_in, deserialize, rancor::Error, util::AlignedVec}; use super::types::{ ArchivedCallMessage, ArchivedDataMessage, ArchivedFaultMessage, ArchivedPacketHeader, @@ -84,24 +84,21 @@ where rkyv::api::high::HighSerializer, Error>, >, { - let header_bytes: FrameBytes = to_bytes::(header).map_err(FrameError::Serialize)?; - let payload_bytes: FrameBytes = to_bytes::(payload).map_err(FrameError::Serialize)?; - let header_len = u32::try_from(header_bytes.len()).map_err(|_| FrameError::LengthOverflow)?; - let payload_len = u32::try_from(payload_bytes.len()).map_err(|_| FrameError::LengthOverflow)?; - let header_start = align_up(8usize, SECTION_ALIGN); - let payload_start = align_up(header_start + header_bytes.len(), SECTION_ALIGN); - let total_len = payload_start + payload_bytes.len(); - - let header_end = header_start + header_bytes.len(); - let payload_end = payload_start + payload_bytes.len(); - let mut frame = FrameBytes::new(); - frame.resize(total_len, 0); + frame.resize(header_start, 0); + frame = to_bytes_in::<_, Error>(header, frame).map_err(FrameError::Serialize)?; + let header_len = u32::try_from(frame.len() - header_start) + .map_err(|_| FrameError::LengthOverflow)?; + + let payload_start = align_up(frame.len(), SECTION_ALIGN); + frame.resize(payload_start, 0); + frame = to_bytes_in::<_, Error>(payload, frame).map_err(FrameError::Serialize)?; + let payload_len = u32::try_from(frame.len() - payload_start) + .map_err(|_| FrameError::LengthOverflow)?; + frame[0..4].copy_from_slice(&header_len.to_be_bytes()); frame[4..8].copy_from_slice(&payload_len.to_be_bytes()); - frame[header_start..header_end].copy_from_slice(&header_bytes); - frame[payload_start..payload_end].copy_from_slice(&payload_bytes); Ok(frame) }