DMSCFrame

Struct DMSCFrame 

Source
pub struct DMSCFrame {
    pub header: DMSCFrameHeader,
    pub payload: Vec<u8>,
}
Expand description

Complete protocol frame combining header and payload data.

A DMSCFrame represents the fundamental unit of data transmission in the DMSC protocol. Each frame consists of a fixed 32-byte header containing protocol metadata and a variable-length payload containing the actual application data. Frames are serialized for network transmission and deserialized upon receipt using CRC32 checksums for integrity verification.

§Frame Structure

+------------------+-------------------+
|   Header (32B)   |  Payload (VAR)    |
+------------------+-------------------+
| magic | type | v | flags | len | seq |
|      timestamp     |    checksum     |
+------------------+-------------------+

§Frame Lifecycle

  1. Creation: Construct a frame using new() or one of the convenience constructors (data_frame(), control_frame(), etc.)
  2. Serialization: Convert to bytes using to_bytes() for transmission
  3. Transmission: Send bytes over the network connection
  4. Reception: Receive bytes and add to frame parser buffer
  5. Deserialization: Parse bytes back to frame using from_bytes()
  6. Processing: Handle the frame based on its type

§Frame Validity

A frame is considered valid when:

  • The magic number matches the DMSC protocol identifier
  • The protocol version is supported
  • The CRC32 checksum matches the computed checksum
  • The payload length matches the actual payload size

Use the is_valid() method for quick validation checking.

§Python Bindings

When compiled with the pyo3 feature, this struct provides Python bindings:

from dmsc import DMSCFrame, DMSCFrameType

# Create a data frame
frame = DMSCFrame.data_frame(
    data=b"Hello, DMSC Protocol!",
    sequence_number=1
)

# Serialize for transmission
frame_bytes = frame.to_bytes()
print(f"Frame size: {len(frame_bytes)} bytes")

# Access frame properties
print(f"Frame type: {frame.frame_type()}")
print(f"Sequence: {frame.sequence_number()}")
print(f"Timestamp: {frame.timestamp()}")
print(f"Valid: {frame.is_valid()}")

# Deserialize received frame
received = DMSCFrame.from_bytes(frame_bytes)
assert received.payload == b"Hello, DMSC Protocol!"

§Examples

Creating and serializing a data frame:

use dmsc::protocol::frames::{DMSCFrame, DMSCFrameType};

let frame = DMSCFrame::data_frame(
    b"Hello, World!".to_vec(),
    42
).expect("Failed to create frame");

let bytes = frame.to_bytes().expect("Failed to serialize frame");
println!("Frame serialized to {} bytes", bytes.len());

assert!(frame.is_valid());
assert_eq!(frame.sequence_number(), 42);

Creating different frame types:

use dmsc::protocol::frames::{DMSCFrame, DMSCFrameType};

// Control frame with command data
let control = DMSCFrame::control_frame(
    vec![0x01, 0x02, 0x03],
    1
).expect("Failed to create control frame");

// Authentication frame with credentials
let auth = DMSCFrame::auth_frame(
    b"token=abc123".to_vec(),
    2
).expect("Failed to create auth frame");

// Keep-alive frame (no payload)
let keepalive = DMSCFrame::keepalive_frame(3)
    .expect("Failed to create keepalive frame");

// Error frame with code and message
let error = DMSCFrame::error_frame(
    0x0401,
    "Connection timeout".to_string(),
    4
).expect("Failed to create error frame");

Receiving and deserializing frames:

use dmsc::protocol::frames::{DMSCFrame, DMSCFrameType};

let original = DMSCFrame::data_frame(
    b"Received data".to_vec(),
    100
).expect("Failed to create frame");

let bytes = original.to_bytes().expect("Failed to serialize");

// Simulate network transmission
let received = DMSCFrame::from_bytes(&bytes)
    .expect("Failed to deserialize frame");

assert_eq!(received.sequence_number(), 100);
assert_eq!(received.payload, b"Received data");
assert!(received.is_valid());

Fields§

§header: DMSCFrameHeader

Frame header containing protocol metadata.

The header provides essential information for frame processing including the frame type, sequence number, timestamp, and integrity checksum. It is always exactly 32 bytes in size and uses big-endian byte ordering.

§payload: Vec<u8>

Frame payload containing application data.

The payload contains the actual data being transmitted. Its meaning depends on the frame type:

  • Control: Protocol management commands
  • Data: Application-level message data
  • Auth: Authentication credentials or tokens
  • KeepAlive: Empty (no payload)
  • Error: Error code + error message
  • Encrypted: Pre-encrypted application data

Implementations§

Source§

impl DMSCFrame

Source

pub fn new( frame_type: DMSCFrameType, payload: Vec<u8>, sequence_number: u32, ) -> DMSCResult<Self>

Create a new frame

Source

pub fn control_frame( control_data: Vec<u8>, sequence_number: u32, ) -> DMSCResult<Self>

Create a control frame

Source

pub fn data_frame(data: Vec<u8>, sequence_number: u32) -> DMSCResult<Self>

Create a data frame

Source

pub fn auth_frame(auth_data: Vec<u8>, sequence_number: u32) -> DMSCResult<Self>

Create an authentication frame

Source

pub fn keepalive_frame(sequence_number: u32) -> DMSCResult<Self>

Create a keep-alive frame

Source

pub fn error_frame( error_code: u32, error_message: String, sequence_number: u32, ) -> DMSCResult<Self>

Create an error frame

Source

pub fn to_bytes(&self) -> DMSCResult<Vec<u8>>

Serialize frame to bytes

Source

pub fn from_bytes(bytes: &[u8]) -> DMSCResult<Self>

Deserialize frame from bytes

Source

pub fn frame_type(&self) -> Option<DMSCFrameType>

Get frame type

Source

pub fn sequence_number(&self) -> u32

Get sequence number

Source

pub fn timestamp(&self) -> u64

Get timestamp

Source

pub fn is_valid(&self) -> bool

Check if frame is valid

Trait Implementations§

Source§

impl Clone for DMSCFrame

Source§

fn clone(&self) -> DMSCFrame

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for DMSCFrame

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<'py> IntoPyObject<'py> for DMSCFrame

Source§

type Target = DMSCFrame

The Python output type
Source§

type Output = Bound<'py, <DMSCFrame as IntoPyObject<'py>>::Target>

The smart pointer type to use. Read more
Source§

type Error = PyErr

The type returned in the event of a conversion error.
Source§

fn into_pyobject( self, py: Python<'py>, ) -> Result<<Self as IntoPyObject<'_>>::Output, <Self as IntoPyObject<'_>>::Error>

Performs the conversion.
Source§

impl PyClass for DMSCFrame

Source§

type Frozen = False

Whether the pyclass is frozen. Read more
Source§

impl PyClassImpl for DMSCFrame

Source§

const IS_BASETYPE: bool = false

#[pyclass(subclass)]
Source§

const IS_SUBCLASS: bool = false

#[pyclass(extends=…)]
Source§

const IS_MAPPING: bool = false

#[pyclass(mapping)]
Source§

const IS_SEQUENCE: bool = false

#[pyclass(sequence)]
Source§

const IS_IMMUTABLE_TYPE: bool = false

#[pyclass(immutable_type)]
Source§

const RAW_DOC: &'static CStr = /// ```

Docstring for the class provided on the struct or enum. Read more
Source§

const DOC: &'static CStr

Fully rendered class doc, including the text_signature if a constructor is defined. Read more
Source§

type BaseType = PyAny

Base class
Source§

type ThreadChecker = SendablePyClass<DMSCFrame>

This handles following two situations: Read more
Source§

type PyClassMutability = <<PyAny as PyClassBaseType>::PyClassMutability as PyClassMutability>::MutableChild

Immutable or mutable
Source§

type Dict = PyClassDummySlot

Specify this class has #[pyclass(dict)] or not.
Source§

type WeakRef = PyClassDummySlot

Specify this class has #[pyclass(weakref)] or not.
Source§

type BaseNativeType = PyAny

The closest native ancestor. This is PyAny by default, and when you declare #[pyclass(extends=PyDict)], it’s PyDict.
Source§

fn items_iter() -> PyClassItemsIter

Source§

fn lazy_type_object() -> &'static LazyTypeObject<Self>

§

fn dict_offset() -> Option<isize>

§

fn weaklist_offset() -> Option<isize>

Source§

impl PyTypeInfo for DMSCFrame

Source§

const NAME: &'static str = "DMSCFrame"

Class name.
Source§

const MODULE: Option<&'static str> = ::core::option::Option::None

Module name, if any.
Source§

fn type_object_raw(py: Python<'_>) -> *mut PyTypeObject

Returns the PyTypeObject instance for this type.
§

fn type_object(py: Python<'_>) -> Bound<'_, PyType>

Returns the safe abstraction over the type object.
§

fn is_type_of(object: &Bound<'_, PyAny>) -> bool

Checks if object is an instance of this type or a subclass of this type.
§

fn is_exact_type_of(object: &Bound<'_, PyAny>) -> bool

Checks if object is an instance of this type.
Source§

impl DerefToPyAny for DMSCFrame

Source§

impl ExtractPyClassWithClone for DMSCFrame

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<'a, T, E> AsTaggedExplicit<'a, E> for T
where T: 'a,

§

fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E>

§

impl<'a, T, E> AsTaggedImplicit<'a, E> for T
where T: 'a,

§

fn implicit( self, class: Class, constructed: bool, tag: u32, ) -> TaggedParser<'a, Implicit, Self, E>

Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<'a, 'py, T> FromPyObject<'a, 'py> for T
where T: PyClass + Clone + ExtractPyClassWithClone,

§

type Error = PyClassGuardError<'a, 'py>

The type returned in the event of a conversion error. Read more
§

fn extract( obj: Borrowed<'a, 'py, PyAny>, ) -> Result<T, <T as FromPyObject<'a, 'py>>::Error>

Extracts Self from the bound smart pointer obj. Read more
§

impl<T> FromRef<T> for T
where T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
§

impl<T> FromRef<T> for T
where T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
§

impl<'py, T> IntoPyObjectExt<'py> for T
where T: IntoPyObject<'py>,

§

fn into_bound_py_any(self, py: Python<'py>) -> Result<Bound<'py, PyAny>, PyErr>

Converts self into an owned Python object, dropping type information.
§

fn into_py_any(self, py: Python<'py>) -> Result<Py<PyAny>, PyErr>

Converts self into an owned Python object, dropping type information and unbinding it from the 'py lifetime.
§

fn into_pyobject_or_pyerr(self, py: Python<'py>) -> Result<Self::Output, PyErr>

Converts self into a Python object. Read more
Source§

impl<T> IntoRequest<T> for T

Source§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
Source§

impl<T> IntoRequest<T> for T

Source§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
§

impl<T> Pointable for T

§

const ALIGN: usize

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
§

impl<T> PyErrArguments for T
where T: for<'py> IntoPyObject<'py> + Send + Sync,

§

fn arguments(self, py: Python<'_>) -> Py<PyAny>

Arguments for exception
§

impl<T> PyTypeCheck for T
where T: PyTypeInfo,

§

const NAME: &'static str = T::NAME

👎Deprecated since 0.27.0: Use ::classinfo_object() instead and format the type name at runtime. Note that using built-in cast features is often better than manual PyTypeCheck usage.
Name of self. This is used in error messages, for example.
§

fn type_check(object: &Bound<'_, PyAny>) -> bool

Checks if object is an instance of Self, which may include a subtype. Read more
§

fn classinfo_object(py: Python<'_>) -> Bound<'_, PyAny>

Returns the expected type as a possible argument for the isinstance and issubclass function. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

impl<'py, T> FromPyObjectOwned<'py> for T
where T: for<'a> FromPyObject<'a, 'py>,

§

impl<T> Ungil for T
where T: Send,