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;
9pub use net_stack::{NetStack, NetStackSendError};
10
11#[derive(Debug, Clone, Copy, PartialEq)]
12pub struct FrameKind(pub u8);
13
14#[derive(Debug, Clone, Copy, PartialEq)]
15pub struct Key(pub [u8; 8]);
16
17#[derive(Debug, Clone)]
18pub struct Header {
19 pub src: Address,
20 pub dst: Address,
21 pub key: Option<Key>,
22 pub seq_no: Option<u16>,
23 pub kind: FrameKind,
24}
25
26#[derive(Debug, Clone)]
27pub struct HeaderSeq {
28 pub src: Address,
29 pub dst: Address,
30 pub key: Option<Key>,
31 pub seq_no: u16,
32 pub kind: FrameKind,
33}
34
35impl FrameKind {
36 pub const RESERVED: Self = Self(0);
37 pub const ENDPOINT_REQ: Self = Self(1);
38 pub const ENDPOINT_RESP: Self = Self(2);
39 pub const TOPIC_MSG: Self = Self(3);
40}
41
42impl Header {
43 #[inline]
44 pub fn to_headerseq_or_with_seq<F: FnOnce() -> u16>(&self, f: F) -> HeaderSeq {
45 HeaderSeq {
46 src: self.src,
47 dst: self.dst,
48 key: self.key,
49 seq_no: self.seq_no.unwrap_or_else(f),
50 kind: self.kind,
51 }
52 }
53}
54
55impl From<HeaderSeq> for Header {
56 fn from(val: HeaderSeq) -> Self {
57 Self {
58 src: val.src,
59 dst: val.dst,
60 key: val.key,
61 seq_no: Some(val.seq_no),
62 kind: val.kind,
63 }
64 }
65}