From: Stefan Hanreich <s.hanreich@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: [PATCH proxmox-ve-rs v2 3/9] ve-config: add redistribute setting to ospf section config
Date: Wed, 13 May 2026 17:13:53 +0200 [thread overview]
Message-ID: <20260513151411.383388-4-s.hanreich@proxmox.com> (raw)
In-Reply-To: <20260513151411.383388-1-s.hanreich@proxmox.com>
The settings are global to the fabric, which means that every node
participating in the fabric will have the same redistribution
settings. For now this seems sufficient, but if the need arises it is
always possible to implement a node-level override.
Signed-off-by: Stefan Hanreich <s.hanreich@proxmox.com>
---
proxmox-ve-config/src/sdn/fabric/mod.rs | 14 ++++-
.../fabric/section_config/protocol/ospf.rs | 59 +++++++++++++++++++
2 files changed, 72 insertions(+), 1 deletion(-)
diff --git a/proxmox-ve-config/src/sdn/fabric/mod.rs b/proxmox-ve-config/src/sdn/fabric/mod.rs
index 2fdcc6c..146563e 100644
--- a/proxmox-ve-config/src/sdn/fabric/mod.rs
+++ b/proxmox-ve-config/src/sdn/fabric/mod.rs
@@ -896,7 +896,12 @@ impl FabricConfig {
let FabricSectionUpdater::<OspfPropertiesUpdater, OspfDeletableProperties> {
ip_prefix,
ip6_prefix,
- properties: OspfPropertiesUpdater { area, route_filter },
+ properties:
+ OspfPropertiesUpdater {
+ area,
+ route_filter,
+ redistribute,
+ },
delete,
} = updater;
@@ -916,6 +921,10 @@ impl FabricConfig {
fabric_section.properties.route_filter = Some(route_filter);
}
+ if let Some(redistribute) = redistribute {
+ fabric_section.properties.redistribute = redistribute;
+ }
+
for property in delete {
match property {
FabricDeletableProperties::IpPrefix => {
@@ -929,6 +938,9 @@ impl FabricConfig {
) => {
fabric_section.properties.route_filter = None;
}
+ FabricDeletableProperties::Protocol(
+ OspfDeletableProperties::Redistribute,
+ ) => fabric_section.properties.redistribute = Vec::new(),
}
}
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 66f17dd..f61e754 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
@@ -14,6 +14,54 @@ use crate::sdn::fabric::FabricConfigError;
use crate::sdn::prefix_list::PrefixListId;
#[api]
+#[derive(Debug, Clone, Serialize, Deserialize, Hash, Copy)]
+#[serde(rename_all = "lowercase")]
+/// OSPF redistribution source protocols
+pub enum OspfRedistributionSource {
+ /// redistribute BGP routes
+ Bgp,
+ /// redistribute connected routes
+ Connected,
+ /// redistribute IS-IS routes
+ Isis,
+ /// redistribute kernel routes
+ Kernel,
+ /// redistribute Openfabric routes
+ Openfabric,
+ /// redistribute OSPF routes
+ Ospf,
+ /// redistribute static routes
+ Static,
+}
+
+#[api]
+#[derive(Debug, Clone, Serialize, Deserialize, Hash)]
+#[serde(rename_all = "kebab-case")]
+/// An OSPF redistribution
+pub struct OspfRedistribution {
+ /// The source protocol for this redistribution
+ pub(crate) source: OspfRedistributionSource,
+ /// The metric that should be applied to redistributed routes
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub(crate) metric: Option<u32>,
+ /// The name of the route map used for filtering redistributed routes
+ #[serde(skip_serializing_if = "Option::is_none")]
+ pub(crate) route_map: Option<String>,
+}
+
+#[api(
+ properties: {
+ redistribute: {
+ type: Array,
+ optional: true,
+ items: {
+ type: String,
+ description: "An OSPF redistribution source.",
+ format: &ApiStringFormat::PropertyString(&OspfRedistribution::API_SCHEMA),
+ }
+ }
+ }
+)]
#[derive(Debug, Clone, Serialize, Deserialize, Updater, Hash)]
/// Properties for an Ospf fabric.
pub struct OspfProperties {
@@ -25,15 +73,25 @@ pub struct OspfProperties {
/// besides the configured IP prefix.
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) route_filter: Option<PrefixListId>,
+
+ /// Redistribution configuration
+ #[serde(default, skip_serializing_if = "Vec::is_empty")]
+ #[updater(serde(skip_serializing_if = "Option::is_none"))]
+ pub(crate) redistribute: Vec<PropertyString<OspfRedistribution>>,
}
impl OspfProperties {
pub fn set_area(&mut self, value: Area) {
self.area = value;
}
+
pub fn area(&self) -> &Area {
&self.area
}
+
+ pub fn redistributions(&self) -> impl IntoIterator<Item = &OspfRedistribution> {
+ self.redistribute.iter().map(Deref::deref)
+ }
}
impl Validatable for FabricSection<OspfProperties> {
@@ -60,6 +118,7 @@ impl Validatable for FabricSection<OspfProperties> {
#[serde(rename_all = "snake_case")]
pub enum OspfDeletableProperties {
RouteFilter,
+ Redistribute,
}
#[api(
--
2.47.3
next prev parent reply other threads:[~2026-05-13 15:15 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-13 15:13 [PATCH manager/network/proxmox-ve-rs v2 0/9] Implement route redistribution for OSPF Stefan Hanreich
2026-05-13 15:13 ` [PATCH proxmox-ve-rs v2 1/9] frr: ospf: add redistribute setting Stefan Hanreich
2026-05-13 15:13 ` [PATCH proxmox-ve-rs v2 2/9] frr-templates: render " Stefan Hanreich
2026-05-13 15:13 ` Stefan Hanreich [this message]
2026-05-13 15:13 ` [PATCH proxmox-ve-rs v2 4/9] ve-config: use constructor instead of instantiating struct Stefan Hanreich
2026-05-13 15:13 ` [PATCH proxmox-ve-rs v2 5/9] ve-config: ospf: generate redistribute config Stefan Hanreich
2026-05-13 15:13 ` [PATCH pve-network v2 6/9] fabrics: ospf: add redistribute to api types Stefan Hanreich
2026-05-13 15:13 ` [PATCH pve-manager v2 7/9] ui: sdn: fabrics: add redistribution grid component Stefan Hanreich
2026-05-13 15:13 ` [PATCH pve-manager v2 8/9] ui: sdn: fabric edit: allow defining multiple tabs Stefan Hanreich
2026-05-13 15:13 ` [PATCH pve-manager v2 9/9] ui: sdn: ospf fabric: add redistribution grid to ospf fabric Stefan Hanreich
2026-05-15 5:00 ` applied: [PATCH manager/network/proxmox-ve-rs v2 0/9] Implement route redistribution for OSPF Thomas Lamprecht
2026-05-15 5:04 ` Thomas Lamprecht
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260513151411.383388-4-s.hanreich@proxmox.com \
--to=s.hanreich@proxmox.com \
--cc=pve-devel@lists.proxmox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.