mirror of
https://github.com/Astatin3/unshell.git
synced 2026-06-08 22:38:01 -06:00
Reformat lines.
This commit is contained in:
+10
-13
@@ -1,9 +1,6 @@
|
|||||||
//! Framed packet encoding and decoding.
|
//! Framed packet encoding and decoding.
|
||||||
use core::{fmt, mem};
|
use core::{fmt, mem};
|
||||||
use rkyv::{
|
use rkyv::{Serialize, access, deserialize, rancor::Error, to_bytes, util::AlignedVec};
|
||||||
Serialize, access, deserialize, rancor::Error, to_bytes,
|
|
||||||
util::AlignedVec,
|
|
||||||
};
|
|
||||||
|
|
||||||
use super::types::{
|
use super::types::{
|
||||||
ArchivedCallMessage, ArchivedDataMessage, ArchivedFaultMessage, ArchivedPacketHeader,
|
ArchivedCallMessage, ArchivedDataMessage, ArchivedFaultMessage, ArchivedPacketHeader,
|
||||||
@@ -84,18 +81,13 @@ impl<'a> ParsedFrame<'a> {
|
|||||||
pub fn encode_packet<P>(header: &PacketHeader, payload: &P) -> Result<FrameBytes, FrameError>
|
pub fn encode_packet<P>(header: &PacketHeader, payload: &P) -> Result<FrameBytes, FrameError>
|
||||||
where
|
where
|
||||||
P: for<'a> Serialize<
|
P: for<'a> Serialize<
|
||||||
rkyv::api::high::HighSerializer<
|
rkyv::api::high::HighSerializer<AlignedVec, rkyv::ser::allocator::ArenaHandle<'a>, Error>,
|
||||||
AlignedVec,
|
|
||||||
rkyv::ser::allocator::ArenaHandle<'a>,
|
|
||||||
Error,
|
|
||||||
>,
|
|
||||||
>,
|
>,
|
||||||
{
|
{
|
||||||
let header_bytes: FrameBytes = to_bytes::<Error>(header).map_err(FrameError::Serialize)?;
|
let header_bytes: FrameBytes = to_bytes::<Error>(header).map_err(FrameError::Serialize)?;
|
||||||
let payload_bytes: FrameBytes = to_bytes::<Error>(payload).map_err(FrameError::Serialize)?;
|
let payload_bytes: FrameBytes = to_bytes::<Error>(payload).map_err(FrameError::Serialize)?;
|
||||||
let header_len = u32::try_from(header_bytes.len()).map_err(|_| FrameError::LengthOverflow)?;
|
let header_len = u32::try_from(header_bytes.len()).map_err(|_| FrameError::LengthOverflow)?;
|
||||||
let payload_len =
|
let payload_len = u32::try_from(payload_bytes.len()).map_err(|_| FrameError::LengthOverflow)?;
|
||||||
u32::try_from(payload_bytes.len()).map_err(|_| FrameError::LengthOverflow)?;
|
|
||||||
|
|
||||||
let header_start = 8usize;
|
let header_start = 8usize;
|
||||||
let payload_start = align_up(header_start + header_bytes.len(), SECTION_ALIGN);
|
let payload_start = align_up(header_start + header_bytes.len(), SECTION_ALIGN);
|
||||||
@@ -105,7 +97,10 @@ where
|
|||||||
frame.extend_from_slice(&header_len.to_be_bytes());
|
frame.extend_from_slice(&header_len.to_be_bytes());
|
||||||
frame.extend_from_slice(&payload_len.to_be_bytes());
|
frame.extend_from_slice(&payload_len.to_be_bytes());
|
||||||
frame.extend_from_slice(&header_bytes);
|
frame.extend_from_slice(&header_bytes);
|
||||||
append_padding(&mut frame, payload_start - (header_start + header_bytes.len()));
|
append_padding(
|
||||||
|
&mut frame,
|
||||||
|
payload_start - (header_start + header_bytes.len()),
|
||||||
|
);
|
||||||
frame.extend_from_slice(&payload_bytes);
|
frame.extend_from_slice(&payload_bytes);
|
||||||
Ok(frame)
|
Ok(frame)
|
||||||
}
|
}
|
||||||
@@ -131,7 +126,9 @@ pub fn decode_frame(bytes: &[u8]) -> Result<ParsedFrame<'_>, FrameError> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let header = deserialize_section::<ArchivedPacketHeader, PacketHeader>(
|
let header = deserialize_section::<ArchivedPacketHeader, PacketHeader>(
|
||||||
bytes.get(header_start..header_end).ok_or(FrameError::Truncated)?,
|
bytes
|
||||||
|
.get(header_start..header_end)
|
||||||
|
.ok_or(FrameError::Truncated)?,
|
||||||
FrameError::InvalidHeader,
|
FrameError::InvalidHeader,
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
|
|||||||
+1
-2
@@ -14,8 +14,7 @@ pub use codec::{
|
|||||||
encode_packet,
|
encode_packet,
|
||||||
};
|
};
|
||||||
pub use introspection::{
|
pub use introspection::{
|
||||||
EndpointIntrospection, INTROSPECTION_PROCEDURE_ID, LeafIntrospection,
|
EndpointIntrospection, INTROSPECTION_PROCEDURE_ID, LeafIntrospection, LeafIntrospectionSummary,
|
||||||
LeafIntrospectionSummary,
|
|
||||||
};
|
};
|
||||||
pub use types::{
|
pub use types::{
|
||||||
CallMessage, DataMessage, FaultMessage, HookTarget, PacketHeader, PacketType, ProtocolFault,
|
CallMessage, DataMessage, FaultMessage, HookTarget, PacketHeader, PacketType, ProtocolFault,
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ use alloc::{borrow::ToOwned, string::String, vec, vec::Vec};
|
|||||||
|
|
||||||
use crate::protocol::{
|
use crate::protocol::{
|
||||||
CallMessage, FaultMessage, FrameError, HookTarget, PacketHeader, PacketType, ProtocolFault,
|
CallMessage, FaultMessage, FrameError, HookTarget, PacketHeader, PacketType, ProtocolFault,
|
||||||
ValidationError, SECTION_ALIGN, decode_frame, encode_packet, validate_call, validate_header,
|
SECTION_ALIGN, ValidationError, decode_frame, encode_packet, validate_call, validate_header,
|
||||||
validate_procedure_id,
|
validate_procedure_id,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -34,7 +34,10 @@ fn packet_framing_roundtrip_preserves_header_and_payload() {
|
|||||||
|
|
||||||
assert_eq!(parsed.header(), &header);
|
assert_eq!(parsed.header(), &header);
|
||||||
assert_eq!(parsed.packet_type(), PacketType::Call);
|
assert_eq!(parsed.packet_type(), PacketType::Call);
|
||||||
assert_eq!(parsed.deserialize_call().expect("call should deserialize"), call);
|
assert_eq!(
|
||||||
|
parsed.deserialize_call().expect("call should deserialize"),
|
||||||
|
call
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@@ -99,5 +102,8 @@ fn truncated_frames_are_rejected() {
|
|||||||
let frame = encode_packet(&header, &message).expect("frame should encode");
|
let frame = encode_packet(&header, &message).expect("frame should encode");
|
||||||
let truncated = &frame[..frame.len() - 1];
|
let truncated = &frame[..frame.len() - 1];
|
||||||
|
|
||||||
assert!(matches!(decode_frame(truncated), Err(FrameError::Truncated)));
|
assert!(matches!(
|
||||||
|
decode_frame(truncated),
|
||||||
|
Err(FrameError::Truncated)
|
||||||
|
));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -243,7 +243,10 @@ fn pending_hook_fault_is_delivered_before_activation() {
|
|||||||
.expect("pending hook should insert");
|
.expect("pending hook should insert");
|
||||||
|
|
||||||
let outcome = endpoint
|
let outcome = endpoint
|
||||||
.handle_introspection(&header, Some(crate::protocol::tree::HookKey::new(path(&["client"]), 11)))
|
.handle_introspection(
|
||||||
|
&header,
|
||||||
|
Some(crate::protocol::tree::HookKey::new(path(&["client"]), 11)),
|
||||||
|
)
|
||||||
.expect("introspection should handle pending hook");
|
.expect("introspection should handle pending hook");
|
||||||
|
|
||||||
assert!(outcome.forward.is_some() || outcome.event.is_some());
|
assert!(outcome.forward.is_some() || outcome.event.is_some());
|
||||||
|
|||||||
@@ -167,7 +167,10 @@ impl ProtocolEndpoint {
|
|||||||
|
|
||||||
match self.decide_route(&header.dst_path) {
|
match self.decide_route(&header.dst_path) {
|
||||||
RouteDecision::Local => self.handle_local_call(header, call),
|
RouteDecision::Local => self.handle_local_call(header, call),
|
||||||
route => Ok(EndpointOutcome::forward(route, encode_packet(&header, &call)?)),
|
route => Ok(EndpointOutcome::forward(
|
||||||
|
route,
|
||||||
|
encode_packet(&header, &call)?,
|
||||||
|
)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -179,7 +182,8 @@ impl ProtocolEndpoint {
|
|||||||
data: Vec<u8>,
|
data: Vec<u8>,
|
||||||
end_hook: bool,
|
end_hook: bool,
|
||||||
) -> Result<FrameBytes, EndpointError> {
|
) -> Result<FrameBytes, EndpointError> {
|
||||||
let (header, message) = self.prepare_data(dst_path, hook_id, procedure_id, data, end_hook)?;
|
let (header, message) =
|
||||||
|
self.prepare_data(dst_path, hook_id, procedure_id, data, end_hook)?;
|
||||||
Ok(encode_packet(&header, &message)?)
|
Ok(encode_packet(&header, &message)?)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -191,7 +195,8 @@ impl ProtocolEndpoint {
|
|||||||
data: Vec<u8>,
|
data: Vec<u8>,
|
||||||
end_hook: bool,
|
end_hook: bool,
|
||||||
) -> Result<EndpointOutcome, EndpointError> {
|
) -> Result<EndpointOutcome, EndpointError> {
|
||||||
let (header, message) = self.prepare_data(dst_path, hook_id, procedure_id, data, end_hook)?;
|
let (header, message) =
|
||||||
|
self.prepare_data(dst_path, hook_id, procedure_id, data, end_hook)?;
|
||||||
|
|
||||||
if end_hook {
|
if end_hook {
|
||||||
let sender_key = self
|
let sender_key = self
|
||||||
@@ -205,7 +210,10 @@ impl ProtocolEndpoint {
|
|||||||
|
|
||||||
match self.decide_route(&header.dst_path) {
|
match self.decide_route(&header.dst_path) {
|
||||||
RouteDecision::Local => self.handle_local_data(header, message),
|
RouteDecision::Local => self.handle_local_data(header, message),
|
||||||
route => Ok(EndpointOutcome::forward(route, encode_packet(&header, &message)?)),
|
route => Ok(EndpointOutcome::forward(
|
||||||
|
route,
|
||||||
|
encode_packet(&header, &message)?,
|
||||||
|
)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,8 +32,14 @@ impl ProtocolEndpoint {
|
|||||||
let message = FaultMessage { fault };
|
let message = FaultMessage { fault };
|
||||||
|
|
||||||
match self.decide_route(&key.return_path) {
|
match self.decide_route(&key.return_path) {
|
||||||
RouteDecision::Local => Ok(EndpointOutcome::event(LocalEvent::Fault { header, message })),
|
RouteDecision::Local => Ok(EndpointOutcome::event(LocalEvent::Fault {
|
||||||
route => Ok(EndpointOutcome::forward(route, encode_packet(&header, &message)?)),
|
header,
|
||||||
|
message,
|
||||||
|
})),
|
||||||
|
route => Ok(EndpointOutcome::forward(
|
||||||
|
route,
|
||||||
|
encode_packet(&header, &message)?,
|
||||||
|
)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -87,9 +93,15 @@ impl ProtocolEndpoint {
|
|||||||
message: FaultMessage,
|
message: FaultMessage,
|
||||||
) -> Result<EndpointOutcome, EndpointError> {
|
) -> Result<EndpointOutcome, EndpointError> {
|
||||||
let hook_id = header.hook_id.expect("validated");
|
let hook_id = header.hook_id.expect("validated");
|
||||||
if let Some(key) = self.hooks.resolve_active_key(&self.path, hook_id, &header.src_path) {
|
if let Some(key) = self
|
||||||
|
.hooks
|
||||||
|
.resolve_active_key(&self.path, hook_id, &header.src_path)
|
||||||
|
{
|
||||||
self.hooks.remove_active(&key);
|
self.hooks.remove_active(&key);
|
||||||
return Ok(EndpointOutcome::event(LocalEvent::Fault { header, message }));
|
return Ok(EndpointOutcome::event(LocalEvent::Fault {
|
||||||
|
header,
|
||||||
|
message,
|
||||||
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
let pending_key = HookKey::new(self.path.clone(), hook_id);
|
let pending_key = HookKey::new(self.path.clone(), hook_id);
|
||||||
@@ -99,7 +111,10 @@ impl ProtocolEndpoint {
|
|||||||
.is_some_and(|pending| pending.caller_src_path == header.src_path)
|
.is_some_and(|pending| pending.caller_src_path == header.src_path)
|
||||||
{
|
{
|
||||||
self.hooks.remove_pending(&pending_key);
|
self.hooks.remove_pending(&pending_key);
|
||||||
return Ok(EndpointOutcome::event(LocalEvent::Fault { header, message }));
|
return Ok(EndpointOutcome::event(LocalEvent::Fault {
|
||||||
|
header,
|
||||||
|
message,
|
||||||
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(EndpointOutcome::dropped())
|
Ok(EndpointOutcome::dropped())
|
||||||
|
|||||||
@@ -70,13 +70,16 @@ impl ProtocolEndpoint {
|
|||||||
}
|
}
|
||||||
|
|
||||||
match self.decide_route(&key.return_path) {
|
match self.decide_route(&key.return_path) {
|
||||||
super::super::RouteDecision::Local => Ok(EndpointOutcome::event(
|
super::super::RouteDecision::Local => {
|
||||||
super::core::LocalEvent::Data {
|
Ok(EndpointOutcome::event(super::core::LocalEvent::Data {
|
||||||
header: response_header,
|
header: response_header,
|
||||||
message: response,
|
message: response,
|
||||||
},
|
}))
|
||||||
|
}
|
||||||
|
route => Ok(EndpointOutcome::forward(
|
||||||
|
route,
|
||||||
|
encode_packet(&response_header, &response)?,
|
||||||
)),
|
)),
|
||||||
route => Ok(EndpointOutcome::forward(route, encode_packet(&response_header, &response)?)),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -49,7 +49,11 @@ impl ProtocolEndpoint {
|
|||||||
Some(leaf_name) => self
|
Some(leaf_name) => self
|
||||||
.leaves
|
.leaves
|
||||||
.get(leaf_name)
|
.get(leaf_name)
|
||||||
.map(|leaf| leaf.procedures.iter().any(|procedure| procedure == &message.procedure_id))
|
.map(|leaf| {
|
||||||
|
leaf.procedures
|
||||||
|
.iter()
|
||||||
|
.any(|procedure| procedure == &message.procedure_id)
|
||||||
|
})
|
||||||
.unwrap_or(false),
|
.unwrap_or(false),
|
||||||
None => self.endpoint_procedures.contains(&message.procedure_id),
|
None => self.endpoint_procedures.contains(&message.procedure_id),
|
||||||
};
|
};
|
||||||
@@ -105,12 +109,15 @@ impl Endpoint for ProtocolEndpoint {
|
|||||||
RouteDecision::Child(index) => {
|
RouteDecision::Child(index) => {
|
||||||
Ok(EndpointOutcome::forward(RouteDecision::Child(index), frame))
|
Ok(EndpointOutcome::forward(RouteDecision::Child(index), frame))
|
||||||
}
|
}
|
||||||
RouteDecision::Parent => Ok(EndpointOutcome::forward(RouteDecision::Parent, frame)),
|
RouteDecision::Parent => {
|
||||||
|
Ok(EndpointOutcome::forward(RouteDecision::Parent, frame))
|
||||||
|
}
|
||||||
RouteDecision::Drop => Ok(EndpointOutcome::dropped()),
|
RouteDecision::Drop => Ok(EndpointOutcome::dropped()),
|
||||||
RouteDecision::Local => {
|
RouteDecision::Local => {
|
||||||
let (header, payload) = parsed.into_parts();
|
let (header, payload) = parsed.into_parts();
|
||||||
let message =
|
let message = deserialize_archived_bytes::<ArchivedCallMessage, CallMessage>(
|
||||||
deserialize_archived_bytes::<ArchivedCallMessage, CallMessage>(payload)?;
|
payload,
|
||||||
|
)?;
|
||||||
validate_call(&header, &message)?;
|
validate_call(&header, &message)?;
|
||||||
self.handle_local_call(header, message)
|
self.handle_local_call(header, message)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,9 @@ use alloc::{collections::BTreeMap, string::String, vec, vec::Vec};
|
|||||||
/// Explicit test tree declaration used for configuration.
|
/// Explicit test tree declaration used for configuration.
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub enum TreeNode {
|
pub enum TreeNode {
|
||||||
Root { children: Vec<Self> },
|
Root {
|
||||||
|
children: Vec<Self>,
|
||||||
|
},
|
||||||
Endpoint {
|
Endpoint {
|
||||||
segment: String,
|
segment: String,
|
||||||
leaves: Vec<LeafNode>,
|
leaves: Vec<LeafNode>,
|
||||||
|
|||||||
Reference in New Issue
Block a user