public inbox for pve-devel@lists.proxmox.com
 help / color / mirror / Atom feed
From: Stefan Hanreich <s.hanreich@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: [PATCH proxmox-ve-rs 3/9] ve-config: add redistribute setting to ospf section config
Date: Mon,  4 May 2026 18:31:48 +0200	[thread overview]
Message-ID: <20260504163157.429628-4-s.hanreich@proxmox.com> (raw)
In-Reply-To: <20260504163157.429628-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 c4cf10c..a30b346 100644
--- a/proxmox-ve-config/src/sdn/fabric/mod.rs
+++ b/proxmox-ve-config/src/sdn/fabric/mod.rs
@@ -845,7 +845,12 @@ impl FabricConfig {
                 let FabricSectionUpdater::<OspfPropertiesUpdater, OspfDeletableProperties> {
                     ip_prefix,
                     ip6_prefix,
-                    properties: OspfPropertiesUpdater { area, route_filter },
+                    properties:
+                        OspfPropertiesUpdater {
+                            area,
+                            route_filter,
+                            redistribute,
+                        },
                     delete,
                 } = updater;
 
@@ -865,6 +870,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 => {
@@ -878,6 +887,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 793e536..8f0b57c 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





  parent reply	other threads:[~2026-05-04 16:33 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-05-04 16:31 [PATCH manager/network/proxmox-ve-rs 0/9] Implement route redistribution for OSPF Stefan Hanreich
2026-05-04 16:31 ` [PATCH proxmox-ve-rs 1/9] frr: ospf: add redistribute setting Stefan Hanreich
2026-05-04 16:31 ` [PATCH proxmox-ve-rs 2/9] frr-templates: render " Stefan Hanreich
2026-05-04 16:31 ` Stefan Hanreich [this message]
2026-05-04 16:31 ` [PATCH proxmox-ve-rs 4/9] ve-config: use constructor instead of instantiating struct Stefan Hanreich
2026-05-04 16:31 ` [PATCH proxmox-ve-rs 5/9] ve-config: ospf: generate redistribute config Stefan Hanreich
2026-05-04 16:31 ` [PATCH pve-network 6/9] fabrics: ospf: add redistribute to api types Stefan Hanreich
2026-05-04 16:31 ` [PATCH pve-manager 7/9] ui: sdn: fabrics: add redistribution grid component Stefan Hanreich
2026-05-04 16:31 ` [PATCH pve-manager 8/9] ui: sdn: fabric edit: allow defining multiple tabs Stefan Hanreich
2026-05-04 16:31 ` [PATCH pve-manager 9/9] ui: sdn: ospf fabric: add redistribution grid to ospf fabric Stefan Hanreich

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=20260504163157.429628-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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal