[pve-devel] [PATCH proxmox-ve-rs 07/17] frr: add openfabric types
Gabriel Goller
g.goller at proxmox.com
Fri Mar 28 18:12:56 CET 2025
Implement OpenFabric-specific variants of common enums that encapsulate
protocol properties defined in proxmox-network-types. The primary addition
is OpenFabricInterface, which stores protocol-specific timing parameters:
HelloInterval (neighbor discovery frequency), CsnpInterval (database
synchronization frequency), and HelloMultiplier (neighbor failure detection).
Added `is_ipv6` flag to support FRR's command prefixing requirements during
serialization for IPv6-specific commands (we need to add a 'ipv6' prefix
to some commands).
Signed-off-by: Gabriel Goller <g.goller at proxmox.com>
---
proxmox-frr/src/lib.rs | 1 +
proxmox-frr/src/openfabric.rs | 93 +++++++++++++++++++++++++++++++++++
2 files changed, 94 insertions(+)
create mode 100644 proxmox-frr/src/openfabric.rs
diff --git a/proxmox-frr/src/lib.rs b/proxmox-frr/src/lib.rs
index 926ca42917a9..d54f83127501 100644
--- a/proxmox-frr/src/lib.rs
+++ b/proxmox-frr/src/lib.rs
@@ -1,3 +1,4 @@
+pub mod openfabric;
use std::{collections::BTreeMap, fmt::Display, str::FromStr};
use serde::{Deserialize, Serialize};
diff --git a/proxmox-frr/src/openfabric.rs b/proxmox-frr/src/openfabric.rs
new file mode 100644
index 000000000000..f814a82af006
--- /dev/null
+++ b/proxmox-frr/src/openfabric.rs
@@ -0,0 +1,93 @@
+use std::fmt::Debug;
+use std::fmt::Display;
+
+use proxmox_network_types::net::Net;
+use serde::{Deserialize, Serialize};
+use serde_with::SerializeDisplay;
+
+use thiserror::Error;
+
+use crate::FrrWord;
+use crate::FrrWordError;
+use crate::RouterNameError;
+
+#[derive(Clone, Debug, PartialEq, Eq, Hash, Deserialize, SerializeDisplay, PartialOrd, Ord)]
+pub struct OpenFabricRouterName(FrrWord);
+
+impl From<FrrWord> for OpenFabricRouterName {
+ fn from(value: FrrWord) -> Self {
+ Self(value)
+ }
+}
+
+impl OpenFabricRouterName {
+ pub fn new(name: FrrWord) -> Self {
+ Self(name)
+ }
+}
+
+impl Display for OpenFabricRouterName {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ write!(f, "openfabric {}", self.0)
+ }
+}
+
+#[derive(Clone, Debug, PartialEq, Eq, Hash, Deserialize, Serialize, PartialOrd, Ord)]
+pub struct OpenFabricRouter {
+ pub net: Net,
+}
+
+impl OpenFabricRouter {
+ pub fn new(net: Net) -> Self {
+ Self { net }
+ }
+
+ pub fn net(&self) -> &Net {
+ &self.net
+ }
+}
+
+#[derive(Clone, Debug, PartialEq, Eq, Hash, Deserialize, Serialize, PartialOrd, Ord)]
+pub struct OpenFabricInterface {
+ // Note: an interface can only be a part of a single fabric (so no vec needed here)
+ pub fabric_id: OpenFabricRouterName,
+ pub passive: Option<bool>,
+ pub hello_interval: Option<proxmox_network_types::openfabric::HelloInterval>,
+ pub csnp_interval: Option<proxmox_network_types::openfabric::CsnpInterval>,
+ pub hello_multiplier: Option<proxmox_network_types::openfabric::HelloMultiplier>,
+ pub is_ipv6: bool,
+}
+
+impl OpenFabricInterface {
+ pub fn fabric_id(&self) -> &OpenFabricRouterName {
+ &self.fabric_id
+ }
+ pub fn passive(&self) -> Option<bool> {
+ self.passive
+ }
+ pub fn hello_interval(&self) -> Option<proxmox_network_types::openfabric::HelloInterval> {
+ self.hello_interval
+ }
+ pub fn csnp_interval(&self) -> Option<proxmox_network_types::openfabric::CsnpInterval> {
+ self.csnp_interval
+ }
+ pub fn hello_multiplier(&self) -> Option<proxmox_network_types::openfabric::HelloMultiplier> {
+ self.hello_multiplier
+ }
+ pub fn set_hello_interval(
+ &mut self,
+ interval: impl Into<Option<proxmox_network_types::openfabric::HelloInterval>>,
+ ) {
+ self.hello_interval = interval.into();
+ }
+}
+
+#[derive(Error, Debug)]
+pub enum OpenFabricInterfaceError {
+ #[error("Unknown error converting to OpenFabricInterface")]
+ UnknownError,
+ #[error("Error converting router name")]
+ RouterNameError(#[from] RouterNameError),
+ #[error("Error parsing frr word")]
+ FrrWordParse(#[from] FrrWordError),
+}
--
2.39.5
More information about the pve-devel
mailing list