[PATCH proxmox-ve-rs 5/9] ve-config: ospf: generate redistribute config

Stefan Hanreich
2026-05-04T16:33:14Z

Implements conversion from the section config types to the proxmox-frr
types and use the conversion trait to generate the required FRR
configuration for distributing routes.

Signed-off-by: Stefan Hanreich <s.hanreich@proxmox.com>
---
proxmox-ve-config/src/sdn/fabric/frr.rs | 14 ++++++--
.../fabric/section_config/protocol/ospf.rs | 32 +++++++++++++++++++
2 files changed, 44 insertions(+), 2 deletions(-)

diff --git a/proxmox-ve-config/src/sdn/fabric/frr.rs b/proxmox-ve-config/src/sdn/fabric/frr.rs
index fd99c3c..40e346f 100644
--- a/proxmox-ve-config/src/sdn/fabric/frr.rs
+++ b/proxmox-ve-config/src/sdn/fabric/frr.rs
@@ -3,7 +3,7 @@ use std::net::{IpAddr, Ipv4Addr};
use tracing;

use proxmox_frr::ser::openfabric::{OpenfabricInterface, OpenfabricRouter, OpenfabricRouterName};
-use proxmox_frr::ser::ospf::{self, OspfInterface, OspfRouter};
+use proxmox_frr::ser::ospf::{self, OspfInterface, OspfRedistribution, OspfRouter};
use proxmox_frr::ser::route_map::{AccessListName, RouteMapEntry, RouteMapMatch, RouteMapSet};
use proxmox_frr::ser::{self, FrrConfig, FrrProtocol, FrrWord, Interface, InterfaceName};
use proxmox_network_types::ip_address::Cidr;
@@ -202,7 +202,17 @@ pub fn build_fabric(
let frr_area = ser::ospf::Area::new(frr_word_area)?;

if frr_config.ospf.router.is_none() {
- frr_config.ospf.router = Some(build_ospf_router(*router_id)?);
+ let mut ospf_router = build_ospf_router(*router_id)?;
+
+ ospf_router.redistribute = fabric
+ .properties()
+ .redistributions()
+ .into_iter()
+ .cloned()
+ .map(OspfRedistribution::from)
+ .collect();
+
+ frr_config.ospf.router = Some(ospf_router);
}

// Add dummy interface
diff --git a/proxmox-ve-config/src/sdn/fabric/section_config/protocol/ospf.rs b/proxmox-ve-config/src/sdn/fabric/section_config/protocol/ospf.rs
index 8f0b57c..2a6ba6b 100644
--- a/proxmox-ve-config/src/sdn/fabric/section_config/protocol/ospf.rs
+++ b/proxmox-ve-config/src/sdn/fabric/section_config/protocol/ospf.rs
@@ -49,6 +49,38 @@ pub struct OspfRedistribution {
pub(crate) route_map: Option<String>,
}

+#[cfg(feature = "frr")]
+mod frr {
+ use proxmox_frr::ser::ospf::OspfRedistribution as FrrOspfRedistribution;
+ use proxmox_frr::ser::ospf::OspfRedistributionSource as FrrOspfRedistributionSource;
+
+ use super::*;
+
+ impl From<OspfRedistribution> for FrrOspfRedistribution {
+ fn from(value: OspfRedistribution) -> Self {
+ Self {
+ source: value.source.into(),
+ metric: value.metric,
+ route_map: value.route_map.into(),
+ }
+ }
+ }
+
+ impl From<OspfRedistributionSource> for FrrOspfRedistributionSource {
+ fn from(value: OspfRedistributionSource) -> Self {
+ match value {
+ OspfRedistributionSource::Bgp => FrrOspfRedistributionSource::Bgp,
+ OspfRedistributionSource::Connected => FrrOspfRedistributionSource::Connected,
+ OspfRedistributionSource::Isis => FrrOspfRedistributionSource::Isis,
+ OspfRedistributionSource::Kernel => FrrOspfRedistributionSource::Kernel,
+ OspfRedistributionSource::Openfabric => FrrOspfRedistributionSource::Openfabric,
+ OspfRedistributionSource::Ospf => FrrOspfRedistributionSource::Ospf,
+ OspfRedistributionSource::Static => FrrOspfRedistributionSource::Static,
+ }
+ }
+ }
+}
+
#[api(
properties: {
redistribute: {
--
2.47.3