pub mod flags;
pub use flags::Flags;
use super::{PacketNumber, PacketType};
use crate::core::{
ChannelId, MessageFlags, MessageId,
message::{
CHANNEL_ID_LEN, FRAGMENT_FLAGS_LEN, FRAGMENT_OFFSET_LEN, MESSAGE_ID_LEN, MESSAGE_LEN_LEN,
},
};
pub(crate) const PACKET_TYPE_LEN: usize = core::mem::size_of::<u8>();
pub(crate) const PACKET_FLAGS_LEN: usize = core::mem::size_of::<u8>();
pub(crate) const PACKET_NUMBER_LEN: usize = core::mem::size_of::<u32>();
pub(crate) const PACKET_HEADER_LEN: usize = PACKET_TYPE_LEN
+ PACKET_FLAGS_LEN
+ PACKET_NUMBER_LEN
+ CHANNEL_ID_LEN
+ MESSAGE_ID_LEN
+ MESSAGE_LEN_LEN
+ FRAGMENT_OFFSET_LEN
+ FRAGMENT_FLAGS_LEN;
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct PacketHeader {
pub packet_type: PacketType,
pub packet_number: PacketNumber,
pub flags: Flags,
pub channel_id: ChannelId,
pub message_id: MessageId,
pub message_len: usize,
pub fragment_offset: usize,
pub fragment_flags: MessageFlags,
}
impl PacketHeader {
#[must_use]
pub const fn data(
packet_number: PacketNumber,
flags: Flags,
channel_id: ChannelId,
message_id: MessageId,
message_len: usize,
fragment_offset: usize,
fragment_flags: MessageFlags,
) -> Self {
Self {
packet_type: PacketType::Data,
packet_number,
flags,
channel_id,
message_id,
message_len,
fragment_offset,
fragment_flags,
}
}
#[must_use]
pub const fn ack(packet_number: PacketNumber) -> Self {
Self {
packet_type: PacketType::Ack,
packet_number,
flags: Flags::EMPTY,
channel_id: ChannelId::DEFAULT,
message_id: MessageId::ZERO,
message_len: 0,
fragment_offset: 0,
fragment_flags: MessageFlags::EMPTY,
}
}
#[must_use]
pub const fn ping(packet_number: PacketNumber, message_id: MessageId) -> Self {
Self::liveness(PacketType::Ping, packet_number, message_id)
}
#[must_use]
pub const fn pong(packet_number: PacketNumber, message_id: MessageId) -> Self {
Self::liveness(PacketType::Pong, packet_number, message_id)
}
#[must_use]
pub const fn is_ack_eliciting(self) -> bool {
self.flags.contains(Flags::ACK_ELICITING)
}
const fn liveness(
packet_type: PacketType,
packet_number: PacketNumber,
message_id: MessageId,
) -> Self {
Self {
packet_type,
packet_number,
flags: Flags::EMPTY,
channel_id: ChannelId::LIVENESS,
message_id,
message_len: 0,
fragment_offset: 0,
fragment_flags: MessageFlags::EMPTY,
}
}
}