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}