mirror of
https://github.com/jmcorgan/fips.git
synced 2026-08-09 00:04:54 +00:00
Rework top-level README: add badges, status/roadmap section, config search path docs, minimal two-node example with transports, DNS setup instructions with systemd-resolved and resolv.conf examples, and connectivity test walkthrough. Replace ASCII document-relationship diagram with SVG in design docs. Change DNS resolver default from disabled to enabled (port 5354). Update config merge to allow higher-priority configs to disable it.
102 lines
2.6 KiB
Rust
102 lines
2.6 KiB
Rust
//! Upper layer configuration types.
|
|
//!
|
|
//! Configuration for the IPv6 adaptation layer components: TUN interface
|
|
//! and DNS responder.
|
|
|
|
use serde::{Deserialize, Serialize};
|
|
|
|
/// Default TUN device name.
|
|
const DEFAULT_TUN_NAME: &str = "fips0";
|
|
|
|
/// Default TUN MTU (IPv6 minimum).
|
|
const DEFAULT_TUN_MTU: u16 = 1280;
|
|
|
|
/// Default DNS responder bind address.
|
|
const DEFAULT_DNS_BIND_ADDR: &str = "127.0.0.1";
|
|
|
|
/// Default DNS responder port.
|
|
const DEFAULT_DNS_PORT: u16 = 5354;
|
|
|
|
/// Default DNS record TTL in seconds (5 minutes).
|
|
const DEFAULT_DNS_TTL: u32 = 300;
|
|
|
|
fn default_true() -> bool {
|
|
true
|
|
}
|
|
|
|
/// DNS responder configuration (`dns.*`).
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
pub struct DnsConfig {
|
|
/// Enable DNS responder (`dns.enabled`, default: true).
|
|
#[serde(default = "default_true")]
|
|
pub enabled: bool,
|
|
|
|
/// Bind address (`dns.bind_addr`).
|
|
#[serde(default, skip_serializing_if = "Option::is_none")]
|
|
pub bind_addr: Option<String>,
|
|
|
|
/// Port (`dns.port`).
|
|
#[serde(default, skip_serializing_if = "Option::is_none")]
|
|
pub port: Option<u16>,
|
|
|
|
/// Record TTL in seconds (`dns.ttl`).
|
|
#[serde(default, skip_serializing_if = "Option::is_none")]
|
|
pub ttl: Option<u32>,
|
|
}
|
|
|
|
impl Default for DnsConfig {
|
|
fn default() -> Self {
|
|
Self {
|
|
enabled: true,
|
|
bind_addr: None,
|
|
port: None,
|
|
ttl: None,
|
|
}
|
|
}
|
|
}
|
|
|
|
impl DnsConfig {
|
|
/// Get the bind address (default: 127.0.0.1).
|
|
pub fn bind_addr(&self) -> &str {
|
|
self.bind_addr.as_deref().unwrap_or(DEFAULT_DNS_BIND_ADDR)
|
|
}
|
|
|
|
/// Get the port (default: 5354).
|
|
pub fn port(&self) -> u16 {
|
|
self.port.unwrap_or(DEFAULT_DNS_PORT)
|
|
}
|
|
|
|
/// Get the TTL in seconds (default: 300).
|
|
pub fn ttl(&self) -> u32 {
|
|
self.ttl.unwrap_or(DEFAULT_DNS_TTL)
|
|
}
|
|
}
|
|
|
|
/// TUN interface configuration (`tun.*`).
|
|
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
|
|
pub struct TunConfig {
|
|
/// Enable TUN interface (`tun.enabled`).
|
|
#[serde(default, skip_serializing_if = "std::ops::Not::not")]
|
|
pub enabled: bool,
|
|
|
|
/// Device name (`tun.name`).
|
|
#[serde(default, skip_serializing_if = "Option::is_none")]
|
|
pub name: Option<String>,
|
|
|
|
/// MTU (`tun.mtu`).
|
|
#[serde(default, skip_serializing_if = "Option::is_none")]
|
|
pub mtu: Option<u16>,
|
|
}
|
|
|
|
impl TunConfig {
|
|
/// Get the device name (default: "fips0").
|
|
pub fn name(&self) -> &str {
|
|
self.name.as_deref().unwrap_or(DEFAULT_TUN_NAME)
|
|
}
|
|
|
|
/// Get the MTU (default: 1280).
|
|
pub fn mtu(&self) -> u16 {
|
|
self.mtu.unwrap_or(DEFAULT_TUN_MTU)
|
|
}
|
|
}
|