Skip to content

Commit 54b29ba

Browse files
committed
reticulating bgp unnumbered
1 parent ad340c9 commit 54b29ba

File tree

15 files changed

+934
-184
lines changed

15 files changed

+934
-184
lines changed

Cargo.lock

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,19 @@ members = [
5454
]
5555

5656
[workspace.dependencies]
57+
# Local
58+
mg-api = { path = "mg-api" }
59+
mg-common = { path = "mg-common" }
60+
rdb-types = { path = "rdb-types" }
61+
ndp = { path = "ndp" }
62+
bgp = { path = "bgp" }
63+
bfd = { path = "bfd" }
64+
mg-admin-client = { path = "mg-admin-client" }
65+
rdb = { path = "rdb", features = ["clap"] }
66+
ddm-api = { path = "ddm-api" }
67+
ddm-types = { path = "ddm-types" }
68+
69+
# External
5770
slog = { version = "2.7.0", features = ["max_level_trace", "release_max_level_debug"] }
5871
slog-term = "2.9"
5972
slog-envlogger = "2.2"
@@ -97,9 +110,6 @@ http-body-util = "0.1"
97110
humantime = "2.1"
98111
rand = "0.8.5"
99112
backoff = "0.4"
100-
mg-api = { path = "mg-api" }
101-
mg-common = { path = "mg-common" }
102-
rdb-types = { path = "rdb-types" }
103113
chrono = { version = "0.4.42", features = ["serde"] }
104114
oxide-tokio-rt = "0.1.2"
105115
oximeter = { git = "https://github.com/oxidecomputer/omicron", branch = "main"}
@@ -114,11 +124,10 @@ rhai = { version = "1", features = ["metadata", "sync"] }
114124
semver = "1.0"
115125
proptest = "1.4"
116126
serial_test = "3.2"
117-
ddm-api = { path = "ddm-api" }
118-
ddm-types = { path = "ddm-types" }
119127
internet-checksum = "0.2.1"
120128
network-interface = { git = "https://github.com/oxidecomputer/network-interface", branch = "illumos" }
121129

130+
122131
[workspace.dependencies.opte-ioctl]
123132
git = "https://github.com/oxidecomputer/opte"
124133
rev = "0f048374110d75ae61743ae3ec0de96960a2848d"

bgp/src/params.rs

Lines changed: 120 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use rdb::{ImportExportPolicy, PolicyAction, Prefix4, Prefix6};
88
use schemars::JsonSchema;
99
use serde::{Deserialize, Serialize};
1010
use std::collections::HashMap;
11+
use std::net::SocketAddrV6;
1112
use std::time::Duration;
1213
use std::{
1314
collections::BTreeMap,
@@ -40,38 +41,33 @@ pub enum NeighborResetOp {
4041
pub struct Neighbor {
4142
pub asn: u32,
4243
pub name: String,
44+
pub group: String,
4345
pub host: SocketAddr,
44-
pub hold_time: u64,
45-
pub idle_hold_time: u64,
46-
pub delay_open: u64,
47-
pub connect_retry: u64,
48-
pub keepalive: u64,
49-
pub resolution: u64,
46+
#[serde(flatten)]
47+
pub parameters: BgpPeerParameters,
48+
}
49+
50+
#[derive(Debug, Deserialize, Serialize, JsonSchema, Clone, PartialEq)]
51+
pub struct UnnumberedNeighbor {
52+
pub asn: u32,
53+
pub name: String,
5054
pub group: String,
51-
pub passive: bool,
52-
pub remote_asn: Option<u32>,
53-
pub min_ttl: Option<u8>,
54-
pub md5_auth_key: Option<String>,
55-
pub multi_exit_discriminator: Option<u32>,
56-
pub communities: Vec<u32>,
57-
pub local_pref: Option<u32>,
58-
pub enforce_first_as: bool,
59-
pub allow_import: ImportExportPolicy,
60-
pub allow_export: ImportExportPolicy,
61-
pub vlan_id: Option<u16>,
55+
pub interface: String,
56+
#[serde(flatten)]
57+
pub parameters: BgpPeerParameters,
6258
}
6359

6460
impl From<Neighbor> for PeerConfig {
6561
fn from(rq: Neighbor) -> Self {
6662
Self {
6763
name: rq.name.clone(),
6864
host: rq.host,
69-
hold_time: rq.hold_time,
70-
idle_hold_time: rq.idle_hold_time,
71-
delay_open: rq.delay_open,
72-
connect_retry: rq.connect_retry,
73-
keepalive: rq.keepalive,
74-
resolution: rq.resolution,
65+
hold_time: rq.parameters.hold_time,
66+
idle_hold_time: rq.parameters.idle_hold_time,
67+
delay_open: rq.parameters.delay_open,
68+
connect_retry: rq.parameters.connect_retry,
69+
keepalive: rq.parameters.keepalive,
70+
resolution: rq.parameters.resolution,
7571
}
7672
}
7773
}
@@ -84,52 +80,102 @@ impl Neighbor {
8480
) -> Self {
8581
Self {
8682
asn,
87-
remote_asn: rq.remote_asn,
88-
min_ttl: rq.min_ttl,
89-
name: rq.name.clone(),
90-
host: rq.host,
91-
hold_time: rq.hold_time,
92-
idle_hold_time: rq.idle_hold_time,
93-
delay_open: rq.delay_open,
94-
connect_retry: rq.connect_retry,
95-
keepalive: rq.keepalive,
96-
resolution: rq.resolution,
97-
passive: rq.passive,
9883
group: group.clone(),
99-
md5_auth_key: rq.md5_auth_key,
100-
multi_exit_discriminator: rq.multi_exit_discriminator,
101-
communities: rq.communities,
102-
local_pref: rq.local_pref,
103-
enforce_first_as: rq.enforce_first_as,
104-
allow_import: rq.allow_import,
105-
allow_export: rq.allow_export,
106-
vlan_id: rq.vlan_id,
84+
host: rq.host,
85+
name: rq.name.clone(),
86+
parameters: rq.parameters.clone(),
10787
}
10888
}
10989

11090
pub fn from_rdb_neighbor_info(asn: u32, rq: &rdb::BgpNeighborInfo) -> Self {
11191
Self {
11292
asn,
113-
remote_asn: rq.remote_asn,
114-
min_ttl: rq.min_ttl,
93+
group: rq.group.clone(),
11594
name: rq.name.clone(),
11695
host: rq.host,
117-
hold_time: rq.hold_time,
118-
idle_hold_time: rq.idle_hold_time,
119-
delay_open: rq.delay_open,
120-
connect_retry: rq.connect_retry,
121-
keepalive: rq.keepalive,
122-
resolution: rq.resolution,
123-
passive: rq.passive,
96+
parameters: BgpPeerParameters {
97+
remote_asn: rq.parameters.remote_asn,
98+
min_ttl: rq.parameters.min_ttl,
99+
hold_time: rq.parameters.hold_time,
100+
idle_hold_time: rq.parameters.idle_hold_time,
101+
delay_open: rq.parameters.delay_open,
102+
connect_retry: rq.parameters.connect_retry,
103+
keepalive: rq.parameters.keepalive,
104+
resolution: rq.parameters.resolution,
105+
passive: rq.parameters.passive,
106+
md5_auth_key: rq.parameters.md5_auth_key.clone(),
107+
multi_exit_discriminator: rq
108+
.parameters
109+
.multi_exit_discriminator,
110+
communities: rq.parameters.communities.clone(),
111+
local_pref: rq.parameters.local_pref,
112+
enforce_first_as: rq.parameters.enforce_first_as,
113+
allow_import: rq.parameters.allow_import.clone(),
114+
allow_export: rq.parameters.allow_export.clone(),
115+
vlan_id: rq.parameters.vlan_id,
116+
},
117+
}
118+
}
119+
}
120+
121+
impl UnnumberedNeighbor {
122+
pub fn from_bgp_peer_config(
123+
asn: u32,
124+
group: String,
125+
rq: UnnumberedBgpPeerConfig,
126+
) -> Self {
127+
Self {
128+
asn,
129+
group: group.clone(),
130+
interface: rq.interface.clone(),
131+
name: rq.name.clone(),
132+
parameters: rq.parameters.clone(),
133+
}
134+
}
135+
136+
pub fn to_peer_config(&self, addr: SocketAddrV6) -> PeerConfig {
137+
PeerConfig {
138+
name: self.name.clone(),
139+
host: addr.into(),
140+
hold_time: self.parameters.hold_time,
141+
idle_hold_time: self.parameters.idle_hold_time,
142+
delay_open: self.parameters.delay_open,
143+
connect_retry: self.parameters.connect_retry,
144+
keepalive: self.parameters.keepalive,
145+
resolution: self.parameters.resolution,
146+
}
147+
}
148+
149+
pub fn from_rdb_neighbor_info(
150+
asn: u32,
151+
rq: &rdb::BgpUnnumberedNeighborInfo,
152+
) -> Self {
153+
Self {
154+
asn,
124155
group: rq.group.clone(),
125-
md5_auth_key: rq.md5_auth_key.clone(),
126-
multi_exit_discriminator: rq.multi_exit_discriminator,
127-
communities: rq.communities.clone(),
128-
local_pref: rq.local_pref,
129-
enforce_first_as: rq.enforce_first_as,
130-
allow_import: rq.allow_import.clone(),
131-
allow_export: rq.allow_export.clone(),
132-
vlan_id: rq.vlan_id,
156+
name: rq.name.clone(),
157+
interface: rq.interface.clone(),
158+
parameters: BgpPeerParameters {
159+
remote_asn: rq.parameters.remote_asn,
160+
min_ttl: rq.parameters.min_ttl,
161+
hold_time: rq.parameters.hold_time,
162+
idle_hold_time: rq.parameters.idle_hold_time,
163+
delay_open: rq.parameters.delay_open,
164+
connect_retry: rq.parameters.connect_retry,
165+
keepalive: rq.parameters.keepalive,
166+
resolution: rq.parameters.resolution,
167+
passive: rq.parameters.passive,
168+
md5_auth_key: rq.parameters.md5_auth_key.clone(),
169+
multi_exit_discriminator: rq
170+
.parameters
171+
.multi_exit_discriminator,
172+
communities: rq.parameters.communities.clone(),
173+
local_pref: rq.parameters.local_pref,
174+
enforce_first_as: rq.parameters.enforce_first_as,
175+
allow_import: rq.parameters.allow_import.clone(),
176+
allow_export: rq.parameters.allow_export.clone(),
177+
vlan_id: rq.parameters.vlan_id,
178+
},
133179
}
134180
}
135181
}
@@ -268,10 +314,24 @@ pub struct ApplyRequest {
268314
pub peers: HashMap<String, Vec<BgpPeerConfig>>,
269315
}
270316

271-
#[derive(Debug, Deserialize, Serialize, JsonSchema, Clone)]
317+
#[derive(Debug, Deserialize, Serialize, JsonSchema, Clone, PartialEq)]
272318
pub struct BgpPeerConfig {
273319
pub host: SocketAddr,
274320
pub name: String,
321+
#[serde(flatten)]
322+
pub parameters: BgpPeerParameters,
323+
}
324+
325+
#[derive(Debug, Deserialize, Serialize, JsonSchema, Clone, PartialEq)]
326+
pub struct UnnumberedBgpPeerConfig {
327+
pub interface: String,
328+
pub name: String,
329+
#[serde(flatten)]
330+
pub parameters: BgpPeerParameters,
331+
}
332+
333+
#[derive(Debug, Deserialize, Serialize, JsonSchema, Clone, PartialEq)]
334+
pub struct BgpPeerParameters {
275335
pub hold_time: u64,
276336
pub idle_hold_time: u64,
277337
pub delay_open: u64,

bgp/src/session.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ use crate::{
1717
OpenMessage, PathAttributeValue, RouteRefreshMessage, Safi,
1818
UpdateMessage,
1919
},
20+
params::BgpPeerParameters,
2021
policy::{CheckerResult, ShaperResult},
2122
recv_event_loop, recv_event_return,
2223
router::Router,
@@ -594,6 +595,35 @@ impl SessionInfo {
594595
}
595596
}
596597

598+
impl From<&BgpPeerParameters> for SessionInfo {
599+
fn from(value: &BgpPeerParameters) -> Self {
600+
SessionInfo {
601+
passive_tcp_establishment: value.passive,
602+
remote_asn: value.remote_asn,
603+
min_ttl: value.min_ttl,
604+
md5_auth_key: value.md5_auth_key.clone(),
605+
multi_exit_discriminator: value.multi_exit_discriminator,
606+
communities: value.communities.clone().into_iter().collect(),
607+
local_pref: value.local_pref,
608+
enforce_first_as: value.enforce_first_as,
609+
allow_import: value.allow_import.clone(),
610+
allow_export: value.allow_export.clone(),
611+
vlan_id: value.vlan_id,
612+
remote_id: None,
613+
bind_addr: None,
614+
connect_retry_time: Duration::from_secs(value.connect_retry),
615+
keepalive_time: Duration::from_secs(value.keepalive),
616+
hold_time: Duration::from_secs(value.hold_time),
617+
idle_hold_time: Duration::from_secs(value.idle_hold_time),
618+
delay_open_time: Duration::from_secs(value.delay_open),
619+
resolution: Duration::from_millis(value.resolution),
620+
idle_hold_jitter: Some((0.75, 1.0)),
621+
connect_retry_jitter: None,
622+
deterministic_collision_resolution: false,
623+
}
624+
}
625+
}
626+
597627
/// Information about a neighbor (peer).
598628
#[derive(Debug, Clone)]
599629
pub struct NeighborInfo {

0 commit comments

Comments
 (0)