1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
mod file;
pub use file::AdvertiseSource;
use std::collections::HashSet;
use std::io::Result;
use std::net::{IpAddr, SocketAddr};
use std::sync::Arc;
use ipnetwork::IpNetwork;
use crate::api::rpc::{FlowSpec, RouteSpec};
use crate::rib::Family;
pub fn from_file(path: &str) -> Result<ServerConfig> {
let spec = file::ServerConfigSpec::from_file(path)?;
Ok(ServerConfig::from_spec(spec))
}
#[derive(Debug)]
pub struct ServerConfig {
pub router_id: IpAddr,
pub default_as: u32,
pub bgp_socket: SocketAddr,
pub api_socket: SocketAddr,
pub poll_interval: u16,
pub peers: Vec<Arc<PeerConfig>>,
}
#[derive(Debug)]
pub struct PeerConfig {
pub remote_ip: IpNetwork,
pub remote_as: u32,
pub local_as: u32,
pub local_router_id: IpAddr,
pub enabled: bool,
pub passive: bool,
pub hold_timer: u16,
pub dest_port: u16,
pub families: Vec<Family>,
pub advertise_sources: HashSet<AdvertiseSource>,
pub static_routes: Vec<RouteSpec>,
pub static_flows: Vec<FlowSpec>,
}
impl PeerConfig {
pub fn is_ebgp(&self) -> bool {
self.remote_as != self.local_as
}
}
impl ServerConfig {
fn from_spec(spec: file::ServerConfigSpec) -> Self {
let peers: Vec<_> = spec
.peers
.iter()
.map(|p| {
Arc::new(PeerConfig {
remote_ip: p.remote_ip,
remote_as: p.remote_as,
local_as: p.local_as.unwrap_or(spec.default_as),
local_router_id: p.local_router_id.unwrap_or(spec.router_id),
enabled: p.enabled,
passive: p.passive,
hold_timer: p.hold_timer,
dest_port: p.dest_port,
families: p.families.clone(),
advertise_sources: p.advertise_sources.clone().into_iter().collect(),
static_routes: p.static_routes.clone().into_iter().collect(),
static_flows: p.static_flows.clone().into_iter().collect(),
})
})
.collect();
Self {
router_id: spec.router_id,
default_as: spec.default_as,
bgp_socket: spec.bgp_socket,
api_socket: spec.api_socket,
poll_interval: spec.poll_interval,
peers,
}
}
}