Skip to main content

prns_config/reference/
types.rs

1use std::collections::BTreeMap;
2
3use prns_core::identity::IdentityHash;
4use prns_core::interface_discovery::StampCost;
5
6pub use crate::configobj::Value as ReferenceValue;
7
8#[derive(Debug, Clone, Copy, PartialEq, Eq)]
9pub enum ReferenceMode {
10    Full,
11    AccessPoint,
12    PointToPoint,
13    Roaming,
14    Boundary,
15    Gateway,
16    Internal,
17}
18
19#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
20pub struct RNodeRadio {
21    pub frequency: Option<u64>,
22    pub bandwidth: Option<u32>,
23    pub spreadingfactor: Option<u8>,
24    pub codingrate: Option<u8>,
25    pub txpower: Option<i16>,
26}
27
28#[derive(Debug, Clone, PartialEq)]
29pub struct RNodeSubinterface {
30    pub name: String,
31    pub vport: Option<u8>,
32    pub radio: RNodeRadio,
33    pub flow_control: Option<bool>,
34    pub outgoing: Option<bool>,
35    pub airtime_limit_short: Option<f64>,
36    pub airtime_limit_long: Option<f64>,
37    pub extra: BTreeMap<String, ReferenceValue>,
38}
39
40#[derive(Debug, Clone, PartialEq, Default)]
41pub struct ReferenceDiscoveryConfig {
42    pub discover_interfaces: Option<bool>,
43    pub required_stamp_cost: Option<StampCost>,
44    pub interface_sources: Vec<IdentityHash>,
45    pub auto_connect_limit: Option<usize>,
46    pub auto_connect_gravity: Option<i64>,
47    pub auto_connect_announces_to_internal: Option<bool>,
48}
49
50#[derive(Debug, Clone, PartialEq, Default)]
51pub struct ReferenceBlackholeExchange {
52    pub publish: Option<bool>,
53    pub sources: Vec<IdentityHash>,
54    pub update_interval_minutes: Option<f64>,
55}
56
57#[derive(Debug, Clone, PartialEq, Eq, Default)]
58pub enum ReferenceRemoteManagement {
59    #[default]
60    Disabled,
61    Enabled {
62        allowed: Vec<IdentityHash>,
63    },
64}
65
66#[derive(Debug, Clone, PartialEq, Default)]
67pub struct ReferenceInterfaceDiscovery {
68    pub discoverable: Option<bool>,
69    pub announce_interval_minutes: Option<i64>,
70    pub stamp_cost: Option<StampCost>,
71    pub name: Option<String>,
72    pub encrypt: Option<bool>,
73    pub reachable_on: Option<String>,
74    pub reachable_port: Option<u16>,
75    pub publish_ifac: Option<bool>,
76    pub latitude: Option<f64>,
77    pub longitude: Option<f64>,
78    pub height: Option<f64>,
79    pub frequency_hz: Option<u64>,
80    pub bandwidth_hz: Option<u32>,
81    pub modulation: Option<String>,
82}
83
84#[derive(Debug, Clone, PartialEq)]
85pub enum ReferenceConfigParams {
86    Auto {
87        group_id: Option<String>,
88        discovery_scope: Option<String>,
89        discovery_port: Option<u16>,
90        data_port: Option<u16>,
91        devices: Option<Vec<String>>,
92        ignored_devices: Option<Vec<String>>,
93        multicast_address_type: Option<String>,
94    },
95    TcpClient {
96        target_host: Option<String>,
97        target_port: Option<u16>,
98        kiss_framing: Option<bool>,
99        i2p_tunneled: Option<bool>,
100        connect_timeout: Option<u64>,
101        max_reconnect_tries: Option<u32>,
102        fixed_mtu: Option<usize>,
103    },
104    TcpServer {
105        listen_ip: Option<String>,
106        listen_port: Option<u16>,
107        device: Option<String>,
108        port: Option<u16>,
109        prefer_ipv6: Option<bool>,
110        i2p_tunneled: Option<bool>,
111        kiss_framing: Option<bool>,
112        fixed_mtu: Option<usize>,
113    },
114    Udp {
115        listen_ip: Option<String>,
116        listen_port: Option<u16>,
117        forward_ip: Option<String>,
118        forward_port: Option<u16>,
119        device: Option<String>,
120        port: Option<u16>,
121    },
122    Serial {
123        port: Option<String>,
124        speed: Option<u32>,
125        databits: Option<u8>,
126        parity: Option<String>,
127        stopbits: Option<u8>,
128    },
129    Rnode {
130        port: Option<String>,
131        radio: RNodeRadio,
132        flow_control: Option<bool>,
133        id_callsign: Option<String>,
134        id_interval: Option<u64>,
135        airtime_limit_short: Option<f64>,
136        airtime_limit_long: Option<f64>,
137    },
138    RnodeMulti {
139        port: Option<String>,
140        id_callsign: Option<String>,
141        id_interval: Option<u64>,
142        subinterfaces: Vec<RNodeSubinterface>,
143    },
144    Kiss {
145        port: Option<String>,
146        speed: Option<u32>,
147        databits: Option<u8>,
148        parity: Option<String>,
149        stopbits: Option<u8>,
150        flow_control: Option<bool>,
151        preamble: Option<u32>,
152        txtail: Option<u32>,
153        persistence: Option<u32>,
154        slottime: Option<u32>,
155        id_callsign: Option<String>,
156        id_interval: Option<u64>,
157    },
158    Ax25Kiss {
159        port: Option<String>,
160        speed: Option<u32>,
161        databits: Option<u8>,
162        parity: Option<String>,
163        stopbits: Option<u8>,
164        flow_control: Option<bool>,
165        preamble: Option<u32>,
166        txtail: Option<u32>,
167        persistence: Option<u32>,
168        slottime: Option<u32>,
169        callsign: Option<String>,
170        ssid: Option<u8>,
171    },
172    Pipe {
173        command: Option<String>,
174        respawn_delay: Option<f64>,
175    },
176    I2p {
177        peers: Option<Vec<String>>,
178        connectable: Option<bool>,
179    },
180    Backbone {
181        listen_ip: Option<String>,
182        listen_port: Option<u16>,
183        target_host: Option<String>,
184        target_port: Option<u16>,
185        port: Option<u16>,
186        device: Option<String>,
187        prefer_ipv6: Option<bool>,
188        i2p_tunneled: Option<bool>,
189        connect_timeout: Option<u64>,
190        max_reconnect_tries: Option<u32>,
191    },
192    Weave {
193        port: Option<String>,
194    },
195    PrnsUsbAuto,
196    PrnsBluetoothAuto,
197    PrnsWebSocketClient {
198        target: Option<String>,
199    },
200    PrnsWebSocketServer {
201        listen_ip: Option<String>,
202        listen_port: Option<u16>,
203        device: Option<String>,
204        port: Option<u16>,
205        prefer_ipv6: Option<bool>,
206    },
207    Unknown,
208}
209
210#[derive(Debug, Clone, Copy, PartialEq, Eq)]
211pub enum ReferenceAnnounceRateTarget {
212    Off,
213    Seconds(core::num::NonZeroU64),
214}
215
216#[derive(Debug, Clone, PartialEq)]
217pub struct ReferenceInterface {
218    pub name: String,
219    pub type_name: String,
220    pub enabled: Option<bool>,
221    pub mode: Option<ReferenceMode>,
222    pub outgoing: Option<bool>,
223    pub bootstrap_only: Option<bool>,
224    pub bitrate: Option<u64>,
225    pub gravity: Option<i64>,
226    pub announce_cap: Option<f64>,
227    pub announce_rate_target: Option<ReferenceAnnounceRateTarget>,
228    pub announce_rate_grace: Option<u64>,
229    pub announce_rate_penalty: Option<u64>,
230    pub ingress_control: Option<bool>,
231    pub egress_control: Option<bool>,
232    pub recursive_prs: Option<bool>,
233    pub announces_from_internal: Option<bool>,
234    pub announces_to_internal: Option<bool>,
235    pub ic_max_held_announces: Option<i64>,
236    pub ic_new_time: Option<f64>,
237    pub ic_burst_hold: Option<f64>,
238    pub ic_burst_freq_new: Option<f64>,
239    pub ic_burst_freq: Option<f64>,
240    pub ic_pr_burst_freq_new: Option<f64>,
241    pub ic_pr_burst_freq: Option<f64>,
242    pub ic_burst_penalty: Option<f64>,
243    pub ic_held_release_interval: Option<f64>,
244    pub ec_pr_freq: Option<f64>,
245    pub network_name: Option<String>,
246    pub passphrase: Option<String>,
247    pub ifac_size_bits: Option<u32>,
248    pub discovery: ReferenceInterfaceDiscovery,
249    pub params: ReferenceConfigParams,
250    pub extra: BTreeMap<String, ReferenceValue>,
251}
252
253impl ReferenceInterface {
254    pub fn enabled(
255        name: impl Into<String>,
256        type_name: impl Into<String>,
257        params: ReferenceConfigParams,
258    ) -> Self {
259        Self {
260            name: name.into(),
261            type_name: type_name.into(),
262            enabled: Some(true),
263            mode: None,
264            outgoing: None,
265            bootstrap_only: None,
266            bitrate: None,
267            gravity: None,
268            announce_cap: None,
269            announce_rate_target: None,
270            announce_rate_grace: None,
271            announce_rate_penalty: None,
272            ingress_control: None,
273            egress_control: None,
274            recursive_prs: None,
275            announces_from_internal: None,
276            announces_to_internal: None,
277            ic_max_held_announces: None,
278            ic_new_time: None,
279            ic_burst_hold: None,
280            ic_burst_freq_new: None,
281            ic_burst_freq: None,
282            ic_pr_burst_freq_new: None,
283            ic_pr_burst_freq: None,
284            ic_burst_penalty: None,
285            ic_held_release_interval: None,
286            ec_pr_freq: None,
287            network_name: None,
288            passphrase: None,
289            ifac_size_bits: None,
290            discovery: ReferenceInterfaceDiscovery::default(),
291            params,
292            extra: BTreeMap::new(),
293        }
294    }
295
296    pub fn is_known(&self) -> bool {
297        !matches!(self.params, ReferenceConfigParams::Unknown)
298    }
299}
300
301#[derive(Debug, Clone, PartialEq, Default)]
302pub struct ReferenceConfig {
303    pub interfaces: Vec<ReferenceInterface>,
304    pub globals: BTreeMap<String, ReferenceValue>,
305    pub network_identity_path: Option<String>,
306    pub discovery: ReferenceDiscoveryConfig,
307    pub blackhole_exchange: ReferenceBlackholeExchange,
308    pub remote_management: ReferenceRemoteManagement,
309    pub other_sections: BTreeMap<String, BTreeMap<String, ReferenceValue>>,
310}