ergot_base/
lib.rs

1#![doc = include_str!("../README.md")]
2
3pub mod address;
4pub mod interface_manager;
5pub mod net_stack;
6pub mod socket;
7
8pub use address::Address;
9use interface_manager::InterfaceSendError;
10use log::warn;
11pub use net_stack::{NetStack, NetStackSendError};
12use serde::{Deserialize, Serialize};
13
14#[derive(Debug, Clone, Copy, PartialEq)]
15pub struct FrameKind(pub u8);
16
17#[derive(Debug, Clone, Copy, PartialEq)]
18pub struct Key(pub [u8; 8]);
19
20#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
21pub struct ProtocolError(pub u16);
22
23#[derive(Debug, Clone)]
24pub struct Header {
25    pub src: Address,
26    pub dst: Address,
27    pub key: Option<Key>,
28    pub seq_no: Option<u16>,
29    pub kind: FrameKind,
30    pub ttl: u8,
31}
32
33#[derive(Debug, Clone)]
34pub struct HeaderSeq {
35    pub src: Address,
36    pub dst: Address,
37    pub key: Option<Key>,
38    pub seq_no: u16,
39    pub kind: FrameKind,
40    pub ttl: u8,
41}
42
43impl FrameKind {
44    pub const RESERVED: Self = Self(0);
45    pub const ENDPOINT_REQ: Self = Self(1);
46    pub const ENDPOINT_RESP: Self = Self(2);
47    pub const TOPIC_MSG: Self = Self(3);
48    pub const PROTOCOL_ERROR: Self = Self(u8::MAX);
49}
50
51impl ProtocolError {
52    pub const RESERVED: Self = Self(0);
53    // 1..11: SocketSendError
54    pub const SSE_NO_SPACE: Self = Self(1);
55    pub const SSE_DESER_FAILED: Self = Self(2);
56    pub const SSE_TYPE_MISMATCH: Self = Self(3);
57    pub const SSE_WHAT_THE_HELL: Self = Self(4);
58    // 11..21: InterfaceSendError
59    pub const ISE_DESTINATION_LOCAL: Self = Self(11);
60    pub const ISE_NO_ROUTE_TO_DEST: Self = Self(12);
61    pub const ISE_INTERFACE_FULL: Self = Self(13);
62    pub const ISE_PLACEHOLDER_OH_NO: Self = Self(14);
63    pub const ISE_ANY_PORT_MISSING_KEY: Self = Self(15);
64    pub const ISE_TTL_EXPIRED: Self = Self(16);
65    // 21..31: NetStackSendError
66    pub const NSSE_NO_ROUTE: Self = Self(21);
67    pub const NSSE_ANY_PORT_MISSING_KEY: Self = Self(22);
68    pub const NSSE_WRONG_PORT_KIND: Self = Self(23);
69    pub const NSSE_ANY_PORT_NOT_UNIQUE: Self = Self(24);
70    pub const NSSE_ALL_PORT_MISSING_KEY: Self = Self(25);
71}
72
73impl Header {
74    #[inline]
75    pub fn with_seq(self, seq_no: u16) -> HeaderSeq {
76        let Self {
77            src,
78            dst,
79            key,
80            seq_no: _,
81            kind,
82            ttl,
83        } = self;
84        HeaderSeq {
85            src,
86            dst,
87            key,
88            seq_no,
89            kind,
90            ttl,
91        }
92    }
93
94    #[inline]
95    pub fn to_headerseq_or_with_seq<F: FnOnce() -> u16>(&self, f: F) -> HeaderSeq {
96        HeaderSeq {
97            src: self.src,
98            dst: self.dst,
99            key: self.key,
100            seq_no: self.seq_no.unwrap_or_else(f),
101            kind: self.kind,
102            ttl: self.ttl,
103        }
104    }
105
106    #[inline]
107    pub fn decrement_ttl(&mut self) -> Result<(), InterfaceSendError> {
108        self.ttl = self.ttl.checked_sub(1).ok_or_else(|| {
109            warn!("Header TTL expired: {self:?}");
110            InterfaceSendError::TtlExpired
111        })?;
112        Ok(())
113    }
114}
115
116impl From<HeaderSeq> for Header {
117    fn from(val: HeaderSeq) -> Self {
118        Self {
119            src: val.src,
120            dst: val.dst,
121            key: val.key,
122            seq_no: Some(val.seq_no),
123            kind: val.kind,
124            ttl: val.ttl,
125        }
126    }
127}
128
129pub const DEFAULT_TTL: u8 = 16;