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 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 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 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;