[pve-devel] [PATCH proxmox-ve-rs 10/17] frr: add generic types over openfabric and ospf
Gabriel Goller
g.goller at proxmox.com
Fri Mar 28 18:12:59 CET 2025
Add generic FRR types that contain openfabric and ospf variants. Also
add the FrrConfig, which holds the whole FRR configuration in a single
struct, which will then be serialized.
Signed-off-by: Gabriel Goller <g.goller at proxmox.com>
---
proxmox-frr/src/lib.rs | 79 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 79 insertions(+)
diff --git a/proxmox-frr/src/lib.rs b/proxmox-frr/src/lib.rs
index 1a657c087ff0..08abdd371653 100644
--- a/proxmox-frr/src/lib.rs
+++ b/proxmox-frr/src/lib.rs
@@ -16,6 +16,46 @@ pub enum RouterNameError {
FrrWordError(#[from] FrrWordError),
}
+/// Generic FRR router.
+///
+/// This generic FRR router contains all the variants that are allowed.
+#[derive(Clone, Debug, PartialEq, Eq, Hash, Deserialize, Serialize, PartialOrd, Ord)]
+pub enum Router {
+ OpenFabric(openfabric::OpenFabricRouter),
+ Ospf(ospf::OspfRouter),
+}
+
+impl From<openfabric::OpenFabricRouter> for Router {
+ fn from(value: openfabric::OpenFabricRouter) -> Self {
+ Router::OpenFabric(value)
+ }
+}
+
+/// Generic FRR routername.
+///
+/// Can vary between different router-types. Some have `router <protocol> <name>`, others have
+/// `router <protocol> <process-id>`.
+#[derive(Clone, Debug, PartialEq, Eq, Hash, SerializeDisplay, PartialOrd, Ord)]
+pub enum RouterName {
+ OpenFabric(openfabric::OpenFabricRouterName),
+ Ospf(ospf::OspfRouterName),
+}
+
+impl From<openfabric::OpenFabricRouterName> for RouterName {
+ fn from(value: openfabric::OpenFabricRouterName) -> Self {
+ Self::OpenFabric(value)
+ }
+}
+
+impl Display for RouterName {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ match self {
+ Self::OpenFabric(r) => r.fmt(f),
+ Self::Ospf(r) => r.fmt(f),
+ }
+ }
+}
+
/// The interface name is the same on ospf and openfabric, but it is an enum so we can have two
/// different entries in the hashmap. This allows us to have an interface in an ospf and openfabric
/// fabric.
@@ -135,3 +175,42 @@ impl Display for CommonInterfaceName {
self.0.fmt(f)
}
}
+
+/// Main FRR config.
+///
+/// Contains the two main frr building blocks: routers and interfaces. To ease construction use the
+/// [`FrrConfigBuilder`], which converts the intermediate representation to the FRR-specific
+/// representation here. Eventually we can add different control options here, such as: `line vty`.
+#[derive(Clone, Debug, PartialEq, Eq, Default)]
+pub struct FrrConfig {
+ pub router: BTreeMap<RouterName, Router>,
+ pub interfaces: BTreeMap<InterfaceName, Interface>,
+ pub access_lists: BTreeMap<AccessListName, AccessList>,
+ pub routemaps: Vec<RouteMap>,
+ pub protocol_routemaps: Vec<ProtocolRouteMap>,
+}
+
+impl FrrConfig {
+ pub fn new() -> Self {
+ Self::default()
+ }
+
+ pub fn router(&self) -> impl Iterator<Item = (&RouterName, &Router)> + '_ {
+ self.router.iter()
+ }
+
+ pub fn interfaces(&self) -> impl Iterator<Item = (&InterfaceName, &Interface)> + '_ {
+ self.interfaces.iter()
+ }
+
+ pub fn access_lists(&self) -> impl Iterator<Item = (&AccessListName, &AccessList)> + '_ {
+ self.access_lists.iter()
+ }
+ pub fn routemaps(&self) -> impl Iterator<Item = &RouteMap> + '_ {
+ self.routemaps.iter()
+ }
+
+ pub fn protocol_routemaps(&self) -> impl Iterator<Item = &ProtocolRouteMap> + '_ {
+ self.protocol_routemaps.iter()
+ }
+}
--
2.39.5
More information about the pve-devel
mailing list