use serde::{Deserialize, Serialize};
use std::path::PathBuf;
#[allow(unused_imports)]
use super::defaults::*;
use super::peer::PeerConfig;
use super::peer_cleanup::PeerCleanupConfig;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct Config {
pub node: NodeConfig,
#[serde(default)]
pub interface: InterfaceConfig,
#[serde(default)]
pub discovery: DiscoveryConfig,
#[serde(default)]
pub mesh: MeshConfig,
#[serde(default)]
pub transport: TransportConfig,
#[serde(default)]
pub routing: RoutingConfig,
#[serde(default)]
pub gateway: GatewayConfig,
#[serde(default)]
pub relay: RelayConfig,
#[serde(default)]
pub security: SecurityConfig,
#[serde(default)]
pub wifi_direct: WifiDirectConfig,
#[serde(default)]
pub bluetooth: BluetoothConfig,
#[serde(default)]
pub bluetooth_rfcomm: BluetoothRfcommConfig,
#[serde(default)]
pub messaging: MessagingConfig,
#[serde(default)]
pub peers: Vec<PeerConfig>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct NodeConfig {
pub name: String,
#[serde(default = "default_data_dir")]
pub data_dir: PathBuf,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct InterfaceConfig {
#[serde(default = "default_interface_name")]
pub name: String,
#[serde(default = "default_mtu")]
pub mtu: u32,
#[serde(default = "default_mesh_ip")]
pub mesh_ip: String,
#[serde(default)]
pub mesh_ipv6: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct DiscoveryConfig {
#[serde(default = "default_discovery_enabled")]
pub enabled: bool,
#[serde(default = "default_discovery_port")]
pub port: u16,
#[serde(default = "default_broadcast_interval_ms")]
pub broadcast_interval_ms: u64,
#[serde(default = "default_peer_timeout_ms")]
pub peer_timeout_ms: u64,
#[serde(default = "default_connect_relays")]
pub connect_relays: bool,
#[serde(default = "default_connect_gateways")]
pub connect_gateways: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Default)]
#[serde(rename_all = "snake_case")]
pub enum MeshMode {
#[default]
Open,
Private,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
pub struct MeshConfig {
#[serde(default)]
pub mode: MeshMode,
#[serde(default)]
pub passphrase: Option<String>,
#[serde(default)]
pub mesh_id: Option<String>,
#[serde(default)]
pub kdf: MeshKdfConfig,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
pub struct MeshKdfConfig {
#[serde(default = "default_mesh_kdf_m_cost_kib")]
pub m_cost_kib: u32,
#[serde(default = "default_mesh_kdf_t_cost")]
pub t_cost: u32,
#[serde(default = "default_mesh_kdf_p_cost")]
pub p_cost: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
pub struct RelayConfig {
#[serde(default)]
pub enabled: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct TransportConfig {
#[serde(default = "default_transport_type")]
pub r#type: String,
#[serde(default = "default_listen_port")]
pub listen_port: u16,
#[serde(default = "default_max_reconnect_attempts")]
pub max_reconnect_attempts: u32,
#[serde(default = "default_connect_timeout_ms")]
pub connect_timeout_ms: u64,
#[serde(default = "PeerCleanupConfig::ephemeral_default")]
pub peer_cleanup: PeerCleanupConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct RoutingConfig {
#[serde(default = "default_max_hops")]
pub max_hops: u8,
#[serde(default = "default_route_algorithm")]
pub algorithm: String,
#[serde(default = "default_route_expiry_s")]
pub route_expiry_s: u64,
#[serde(default = "default_dns_servers")]
pub dns_servers: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct GatewayConfig {
#[serde(default)]
pub enabled: bool,
#[serde(default = "default_nat_interface")]
pub nat_interface: String,
#[serde(default = "default_max_connections")]
pub max_connections: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct SecurityConfig {
#[serde(default = "default_key_file")]
pub key_file: PathBuf,
#[serde(default = "default_require_encryption")]
pub require_encryption: bool,
#[serde(default)]
pub authorization_policy: AuthorizationPolicy,
#[serde(default)]
pub authorized_peers: Vec<crate::NodeId>,
#[serde(default = "default_trust_store_file")]
pub trust_store_file: PathBuf,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Default)]
#[serde(rename_all = "snake_case")]
pub enum AuthorizationPolicy {
#[default]
AllowAll,
AllowList,
TrustOnFirstUse,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct WifiDirectConfig {
#[serde(default)]
pub enabled: bool,
#[serde(default = "default_wfd_interface")]
pub interface: String,
#[serde(default = "default_wfd_go_intent")]
pub go_intent: u8,
#[serde(default = "default_wfd_listen_channel")]
pub listen_channel: u8,
#[serde(default = "default_wfd_op_channel")]
pub op_channel: u8,
#[serde(default = "default_wfd_connect_method")]
pub connect_method: String,
#[serde(default = "PeerCleanupConfig::bluetooth_default")]
pub peer_cleanup: PeerCleanupConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct BluetoothConfig {
#[serde(default)]
pub enabled: bool,
#[serde(default = "default_bluetooth_interface")]
pub interface: String,
#[serde(default = "default_bluetooth_radio_discovery_enabled")]
pub radio_discovery_enabled: bool,
#[serde(default = "default_bluetooth_device_name_prefix")]
pub device_name_prefix: String,
#[serde(default)]
pub local_alias: String,
#[serde(default = "default_bluetooth_connect_pan")]
pub connect_pan: bool,
#[serde(default)]
pub serve_nap: bool,
#[serde(default = "default_bluetooth_nap_bridge")]
pub nap_bridge: String,
#[serde(default = "default_bluetooth_nap_bridge_addr")]
pub nap_bridge_addr: String,
#[serde(default = "default_bluetooth_dhcp_enabled")]
pub dhcp_enabled: bool,
#[serde(default)]
pub dhcp_range: Option<String>,
#[serde(default = "default_bluetooth_dhcp_lease_time")]
pub dhcp_lease_time: String,
#[serde(default)]
pub dhcp_dns: Option<String>,
#[serde(default = "default_bluetooth_request_dhcp")]
pub request_dhcp: bool,
#[serde(default = "default_bluetooth_auto_discover_peers")]
pub auto_discover_peers: bool,
#[serde(default = "default_bluetooth_poll_interval_ms")]
pub poll_interval_ms: u64,
#[serde(default = "default_bluetooth_scan_interval_ms")]
pub scan_interval_ms: u64,
#[serde(default = "default_bluetooth_peer_discovery_interval_ms")]
pub peer_discovery_interval_ms: u64,
#[serde(default = "default_bluetoothctl_timeout_s")]
pub bluetoothctl_timeout_s: u64,
#[serde(default = "default_bluetooth_discoverable_timeout_s")]
pub discoverable_timeout_s: u64,
#[serde(default = "default_bluetooth_startup_timeout_ms")]
pub startup_timeout_ms: u64,
#[serde(default = "PeerCleanupConfig::bluetooth_default")]
pub peer_cleanup: PeerCleanupConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct BluetoothRfcommConfig {
#[serde(default)]
pub enabled: bool,
#[serde(default = "default_bluetooth_rfcomm_channel")]
pub channel: u8,
#[serde(default = "default_bluetooth_device_name_prefix")]
pub device_name_prefix: String,
#[serde(default = "default_bluetooth_rfcomm_outbound_enabled")]
pub outbound_enabled: bool,
#[serde(default = "default_bluetooth_rfcomm_poll_interval_ms")]
pub poll_interval_ms: u64,
#[serde(default = "default_bluetooth_rfcomm_bridge_to_tcp")]
pub bridge_to_tcp: bool,
#[serde(default = "PeerCleanupConfig::bluetooth_default")]
pub peer_cleanup: PeerCleanupConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct MessagingConfig {
#[serde(default)]
pub broadcast: BroadcastConfig,
#[serde(default = "PeerCleanupConfig::mesh_identity_default")]
pub peer_cleanup: PeerCleanupConfig,
}
impl Default for MessagingConfig {
fn default() -> Self {
Self {
broadcast: BroadcastConfig::default(),
peer_cleanup: PeerCleanupConfig::mesh_identity_default(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct BroadcastConfig {
#[serde(default)]
pub outgoing_interval_s: Option<u64>,
#[serde(default = "default_broadcast_watch_incoming")]
pub watch_incoming: bool,
#[serde(default = "default_broadcast_min_peer_interval_s")]
pub min_peer_interval_s: u64,
#[serde(default = "PeerCleanupConfig::ephemeral_default")]
pub peer_cleanup: PeerCleanupConfig,
}
impl Default for BroadcastConfig {
fn default() -> Self {
Self {
outgoing_interval_s: None,
watch_incoming: default_broadcast_watch_incoming(),
min_peer_interval_s: default_broadcast_min_peer_interval_s(),
peer_cleanup: PeerCleanupConfig::ephemeral_default(),
}
}
}
impl BroadcastConfig {
pub const MIN_OUTGOING_INTERVAL_S: u64 = 30;
}
fn default_broadcast_watch_incoming() -> bool {
true
}
fn default_broadcast_min_peer_interval_s() -> u64 {
60
}
fn default_data_dir() -> PathBuf {
PathBuf::from("~/.pim")
}
fn default_interface_name() -> String {
"pim0".into()
}
fn default_mtu() -> u32 {
1400
}
fn default_mesh_ip() -> String {
"auto".into()
}
fn default_discovery_enabled() -> bool {
true
}
fn default_discovery_port() -> u16 {
9101
}
fn default_broadcast_interval_ms() -> u64 {
5000
}
fn default_peer_timeout_ms() -> u64 {
30000
}
fn default_connect_relays() -> bool {
true
}
fn default_connect_gateways() -> bool {
true
}
fn default_transport_type() -> String {
"tcp".into()
}
fn default_listen_port() -> u16 {
9100
}
fn default_max_reconnect_attempts() -> u32 {
20
}
fn default_connect_timeout_ms() -> u64 {
3_000
}
fn default_max_hops() -> u8 {
10
}
fn default_route_algorithm() -> String {
"distance-vector".into()
}
fn default_route_expiry_s() -> u64 {
300
}
fn default_dns_servers() -> Vec<String> {
vec!["1.1.1.1".into(), "1.0.0.1".into(), "8.8.8.8".into()]
}
fn default_nat_interface() -> String {
"eth0".into()
}
fn default_max_connections() -> u32 {
200
}
fn default_key_file() -> PathBuf {
PathBuf::from("~/.pim/node.key")
}
fn default_require_encryption() -> bool {
true
}
fn default_trust_store_file() -> PathBuf {
PathBuf::from("~/.pim/trusted-peers.toml")
}
fn default_wfd_interface() -> String {
"wlan0".into()
}
fn default_wfd_go_intent() -> u8 {
7
}
fn default_wfd_listen_channel() -> u8 {
6
}
fn default_wfd_op_channel() -> u8 {
6
}
fn default_wfd_connect_method() -> String {
"pbc".into()
}
fn default_bluetooth_interface() -> String {
#[cfg(target_os = "macos")]
{
"bridge0".into()
}
#[cfg(not(target_os = "macos"))]
{
"auto".into()
}
}
fn default_bluetooth_radio_discovery_enabled() -> bool {
true
}
fn default_bluetooth_device_name_prefix() -> String {
"PIM-".into()
}
fn default_bluetooth_connect_pan() -> bool {
true
}
fn default_bluetooth_nap_bridge() -> String {
"br-bt".into()
}
fn default_bluetooth_nap_bridge_addr() -> String {
"192.168.44.1/24".into()
}
fn default_bluetooth_dhcp_enabled() -> bool {
true
}
fn default_bluetooth_dhcp_lease_time() -> String {
"12h".into()
}
fn default_bluetooth_request_dhcp() -> bool {
true
}
fn default_bluetooth_auto_discover_peers() -> bool {
true
}
fn default_bluetooth_poll_interval_ms() -> u64 {
2_000
}
fn default_bluetooth_scan_interval_ms() -> u64 {
5_000
}
fn default_bluetooth_peer_discovery_interval_ms() -> u64 {
2_000
}
fn default_bluetoothctl_timeout_s() -> u64 {
15
}
fn default_bluetooth_discoverable_timeout_s() -> u64 {
180
}
fn default_bluetooth_startup_timeout_ms() -> u64 {
15_000
}
fn default_bluetooth_rfcomm_channel() -> u8 {
22
}
fn default_bluetooth_rfcomm_outbound_enabled() -> bool {
true
}
fn default_bluetooth_rfcomm_poll_interval_ms() -> u64 {
30_000
}
fn default_bluetooth_rfcomm_bridge_to_tcp() -> bool {
true
}
impl Default for InterfaceConfig {
fn default() -> Self {
Self {
name: default_interface_name(),
mtu: default_mtu(),
mesh_ip: default_mesh_ip(),
mesh_ipv6: None,
}
}
}
impl Default for DiscoveryConfig {
fn default() -> Self {
Self {
enabled: default_discovery_enabled(),
port: default_discovery_port(),
broadcast_interval_ms: default_broadcast_interval_ms(),
peer_timeout_ms: default_peer_timeout_ms(),
connect_relays: default_connect_relays(),
connect_gateways: default_connect_gateways(),
}
}
}
impl Default for MeshKdfConfig {
fn default() -> Self {
Self {
m_cost_kib: default_mesh_kdf_m_cost_kib(),
t_cost: default_mesh_kdf_t_cost(),
p_cost: default_mesh_kdf_p_cost(),
}
}
}
fn default_mesh_kdf_m_cost_kib() -> u32 {
65536
}
fn default_mesh_kdf_t_cost() -> u32 {
3
}
fn default_mesh_kdf_p_cost() -> u32 {
1
}
impl Default for TransportConfig {
fn default() -> Self {
Self {
r#type: default_transport_type(),
listen_port: default_listen_port(),
max_reconnect_attempts: default_max_reconnect_attempts(),
connect_timeout_ms: default_connect_timeout_ms(),
peer_cleanup: PeerCleanupConfig::ephemeral_default(),
}
}
}
impl Default for RoutingConfig {
fn default() -> Self {
Self {
max_hops: default_max_hops(),
algorithm: default_route_algorithm(),
route_expiry_s: default_route_expiry_s(),
dns_servers: default_dns_servers(),
}
}
}
impl Default for GatewayConfig {
fn default() -> Self {
Self {
enabled: false,
nat_interface: default_nat_interface(),
max_connections: default_max_connections(),
}
}
}
impl Default for WifiDirectConfig {
fn default() -> Self {
Self {
enabled: false,
interface: default_wfd_interface(),
go_intent: default_wfd_go_intent(),
listen_channel: default_wfd_listen_channel(),
op_channel: default_wfd_op_channel(),
connect_method: default_wfd_connect_method(),
peer_cleanup: PeerCleanupConfig::bluetooth_default(),
}
}
}
impl Default for BluetoothConfig {
fn default() -> Self {
Self {
enabled: false,
interface: default_bluetooth_interface(),
radio_discovery_enabled: default_bluetooth_radio_discovery_enabled(),
device_name_prefix: default_bluetooth_device_name_prefix(),
local_alias: String::new(),
connect_pan: default_bluetooth_connect_pan(),
serve_nap: false,
nap_bridge: default_bluetooth_nap_bridge(),
nap_bridge_addr: default_bluetooth_nap_bridge_addr(),
dhcp_enabled: default_bluetooth_dhcp_enabled(),
dhcp_range: None,
dhcp_lease_time: default_bluetooth_dhcp_lease_time(),
dhcp_dns: None,
request_dhcp: default_bluetooth_request_dhcp(),
auto_discover_peers: default_bluetooth_auto_discover_peers(),
poll_interval_ms: default_bluetooth_poll_interval_ms(),
scan_interval_ms: default_bluetooth_scan_interval_ms(),
peer_discovery_interval_ms: default_bluetooth_peer_discovery_interval_ms(),
bluetoothctl_timeout_s: default_bluetoothctl_timeout_s(),
discoverable_timeout_s: default_bluetooth_discoverable_timeout_s(),
startup_timeout_ms: default_bluetooth_startup_timeout_ms(),
peer_cleanup: PeerCleanupConfig::bluetooth_default(),
}
}
}
impl Default for BluetoothRfcommConfig {
fn default() -> Self {
Self {
enabled: false,
channel: default_bluetooth_rfcomm_channel(),
device_name_prefix: default_bluetooth_device_name_prefix(),
outbound_enabled: default_bluetooth_rfcomm_outbound_enabled(),
poll_interval_ms: default_bluetooth_rfcomm_poll_interval_ms(),
bridge_to_tcp: default_bluetooth_rfcomm_bridge_to_tcp(),
peer_cleanup: PeerCleanupConfig::bluetooth_default(),
}
}
}
impl Default for SecurityConfig {
fn default() -> Self {
Self {
key_file: default_key_file(),
require_encryption: default_require_encryption(),
authorization_policy: AuthorizationPolicy::default(),
authorized_peers: Vec::new(),
trust_store_file: default_trust_store_file(),
}
}
}