use bitflags::*;
use bytes::Bytes;
use num_derive::*;
bitflags! {
#[derive(Default, Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub(crate) struct ContactHeaderFlags : u8 {
const CAN_TLS = 0x01;
}
}
#[derive(Debug, FromPrimitive)]
#[repr(u8)]
pub(crate) enum MessageType {
XferSegment = 0x01,
XferAck = 0x02,
XferRefuse = 0x03,
Keepalive = 0x04,
SessTerm = 0x05,
MsgReject = 0x06,
SessInit = 0x07,
}
bitflags! {
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub(crate) struct SessionExtensionItemFlags : u8 {
const CRITICAL = 0x01;
}
}
#[derive(FromPrimitive, Clone, Copy, PartialEq, Eq)]
#[repr(u8)]
pub(crate) enum MsgRejectReasonCode {
TypeUnknown = 0x01,
Unsupported = 0x02,
Unexpected = 0x03,
}
impl std::fmt::Debug for MsgRejectReasonCode {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
match self {
Self::TypeUnknown => write!(f, "TypeUnknown"),
Self::Unsupported => write!(f, "Unsupported"),
Self::Unexpected => write!(f, "Unexpected"),
}
}
}
bitflags! {
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub(crate) struct XferSegmentFlags : u8 {
const END = 0x01;
const START = 0x02;
}
}
#[derive(Debug, FromPrimitive, Clone, Copy, PartialEq, Eq)]
#[repr(u8)]
pub(crate) enum XferRefuseReasonCode {
Unknown = 0,
Completed = 0x01,
NoResources = 0x02,
Retransmit = 0x03,
NotAcceptable = 0x04,
ExtensionFailure = 0x05,
}
bitflags! {
#[derive(Default, Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub(crate) struct TransferExtensionItemFlags : u8 {
const CRITICAL = 0x01;
}
}
#[derive(Debug, PartialEq, Eq, Clone)]
pub(crate) struct TransferExtensionItem {
pub flags: TransferExtensionItemFlags,
pub item_type: TransferExtensionItemType,
pub data: Bytes,
}
#[derive(Debug, PartialEq, Eq, FromPrimitive, Clone, Copy)]
#[repr(u16)]
pub(crate) enum TransferExtensionItemType {
BundleID = 0x01,
}
bitflags! {
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
pub(crate) struct SessTermFlags : u8 {
const REPLY = 0x01;
}
}
#[derive(Debug, FromPrimitive, Clone, Copy, PartialEq, Eq)]
#[repr(u8)]
pub(crate) enum SessTermReasonCode {
Unknown = 0,
IdleTimeout = 0x01,
VersionMismatch = 0x02,
Busy = 0x03,
ContactFailure = 0x04,
ResourceExhaustion = 0x05,
}
#[derive(Debug, Default, Clone, PartialEq, Eq)]
pub(crate) struct SessInitData {
pub keepalive: u16,
pub segment_mru: u64,
pub transfer_mru: u64,
pub node_id: String,
}
#[derive(Debug, PartialEq, Eq, Clone)]
pub(crate) struct XferSegData {
pub flags: XferSegmentFlags,
pub tid: u64,
pub len: u64,
pub buf: Bytes,
pub extensions: Vec<TransferExtensionItem>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) struct XferAckData {
pub flags: XferSegmentFlags,
pub tid: u64,
pub len: u64,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) struct XferRefuseData {
pub reason: XferRefuseReasonCode,
pub tid: u64,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) struct SessTermData {
pub flags: SessTermFlags,
pub reason: SessTermReasonCode,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) struct MsgRejectData {
pub reason: MsgRejectReasonCode,
pub header: u8,
}