public inbox for pve-devel@lists.proxmox.com
 help / color / mirror / Atom feed
From: Gabriel Goller <g.goller@proxmox.com>
To: pve-devel@lists.proxmox.com
Subject: [PATCH proxmox-ve-rs 2/2] fabrics: ospf: expose network-type interface property
Date: Wed, 18 Feb 2026 16:11:43 +0100	[thread overview]
Message-ID: <20260218151153.381963-3-g.goller@proxmox.com> (raw)
In-Reply-To: <20260218151153.381963-1-g.goller@proxmox.com>

Expose the network-type interface property to the api. Previously it was
internal-only and could be changed from point-to-point to broadcast by
setting or not setting an ip on the interface. Now we expose all the
possible options in the ui. This is also a Option, so that we can 1)
stay backwards compatible and 2) can let FRR figure out the correct
mode (e.g. when adding an ip with an explicit `peer`).

Also move the NetworkType enum to proxmox-sdn-types because we need it
in both proxmox-frr and proxmox-ve-config and we don't want to add the
`frr` feature to the whole section-config module.

Signed-off-by: Gabriel Goller <g.goller@proxmox.com>
---
 proxmox-frr/src/ser/ospf.rs                   | 27 +---------------
 proxmox-sdn-types/src/lib.rs                  |  1 +
 proxmox-sdn-types/src/ospf.rs                 | 32 +++++++++++++++++++
 proxmox-ve-config/src/sdn/fabric/frr.rs       | 13 +++++---
 .../fabric/section_config/protocol/ospf.rs    |  6 ++++
 5 files changed, 49 insertions(+), 30 deletions(-)
 create mode 100644 proxmox-sdn-types/src/ospf.rs

diff --git a/proxmox-frr/src/ser/ospf.rs b/proxmox-frr/src/ser/ospf.rs
index 8b26f42e2e46..e83e8ab5a53c 100644
--- a/proxmox-frr/src/ser/ospf.rs
+++ b/proxmox-frr/src/ser/ospf.rs
@@ -2,6 +2,7 @@ use std::fmt::Debug;
 use std::net::Ipv4Addr;
 
 use bon::Builder;
+use proxmox_sdn_types::ospf::NetworkType;
 use serde::{Deserialize, Serialize};
 use thiserror::Error;
 
@@ -81,32 +82,6 @@ pub enum OspfInterfaceError {
     FrrWordParse(#[from] FrrWordError),
 }
 
-/// The NetworkType of the interface.
-///
-/// The most important options here are Broadcast (which is the default) and PointToPoint.
-/// When PointToPoint is set, then the interface has to have a /32 address and will be treated as
-/// unnumbered.
-///
-/// This roughly serializes to:
-/// ```text
-/// ip ospf network point-to-point
-/// ! or
-/// ip ospf network broadcast
-/// ```
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, Deserialize)]
-#[serde(rename_all = "kebab-case")]
-pub enum NetworkType {
-    Broadcast,
-    NonBroadcast,
-    /// If the interface is unnumbered (i.e. the router-id /32 ip-address is set on the interface).
-    ///
-    /// If OSPF is used in an unnumbered way, you don't need to configure peer-to-peer (e.g. /31)
-    /// addresses at every interface, but you just need to set the router-id at the interface
-    /// (/32). You also need to configure the `ip ospf network point-to-point` FRR option.
-    PointToPoint,
-    PointToMultipoint,
-}
-
 /// The OSPF interface properties.
 ///
 /// The interface gets tied to its fabric by the area property and the FRR `ip ospf area <area>`
diff --git a/proxmox-sdn-types/src/lib.rs b/proxmox-sdn-types/src/lib.rs
index 1656f1d44b95..29455a23e5c9 100644
--- a/proxmox-sdn-types/src/lib.rs
+++ b/proxmox-sdn-types/src/lib.rs
@@ -1,3 +1,4 @@
 pub mod area;
 pub mod net;
 pub mod openfabric;
+pub mod ospf;
diff --git a/proxmox-sdn-types/src/ospf.rs b/proxmox-sdn-types/src/ospf.rs
new file mode 100644
index 000000000000..43497def7ff2
--- /dev/null
+++ b/proxmox-sdn-types/src/ospf.rs
@@ -0,0 +1,32 @@
+use proxmox_schema::api;
+use serde::{Deserialize, Serialize};
+
+/// The NetworkType of the interface.
+///
+/// The most important options here are Broadcast (which is the default) and PointToPoint.
+/// When PointToPoint is set, then the interface has to have a /32 address and will be treated as
+/// unnumbered.
+///
+/// This roughly serializes to:
+/// ```text
+/// ip ospf network point-to-point
+/// ! or
+/// ip ospf network broadcast
+/// ```
+#[api]
+#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord, Serialize, Deserialize)]
+#[serde(rename_all = "kebab-case")]
+pub enum NetworkType {
+    /// Broadcast
+    Broadcast,
+    /// Non-Broadcast
+    NonBroadcast,
+    /// If the interface is unnumbered (i.e. the router-id /32 ip-address is set on the interface).
+    ///
+    /// If OSPF is used in an unnumbered way, you don't need to configure peer-to-peer (e.g. /31)
+    /// addresses at every interface, but you just need to set the router-id at the interface
+    /// (/32). You also need to configure the `ip ospf network point-to-point` FRR option.
+    PointToPoint,
+    /// Point-to-Multipoint
+    PointToMultipoint,
+}
diff --git a/proxmox-ve-config/src/sdn/fabric/frr.rs b/proxmox-ve-config/src/sdn/fabric/frr.rs
index ac5e88e905a3..291371052fbe 100644
--- a/proxmox-ve-config/src/sdn/fabric/frr.rs
+++ b/proxmox-ve-config/src/sdn/fabric/frr.rs
@@ -309,10 +309,15 @@ fn build_ospf_interface(
         area,
         // Interfaces are always non-passive
         passive: None,
-        network_type: if interface.ip.is_some() {
-            None
-        } else {
-            Some(ser::ospf::NetworkType::PointToPoint)
+        network_type: match interface.network_type {
+            None => {
+                if interface.ip.is_some() {
+                    None
+                } else {
+                    Some(proxmox_sdn_types::ospf::NetworkType::PointToPoint)
+                }
+            }
+            Some(network_type) => Some(network_type),
         },
     };
 
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 df0be9591a76..d195546447b2 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
@@ -124,6 +124,12 @@ pub struct OspfInterfaceProperties {
     /// If IP is unset, then this is an unnumbered interface
     #[serde(skip_serializing_if = "Option::is_none")]
     pub(crate) ip: Option<Ipv4Cidr>,
+
+    /// Network Type of the interface. Contains all the NetworkTypes from FRR, but also includes a
+    /// `None` variant which enables us to decide the network-type automatically depending on if a
+    /// ip is given or not. (This also enables this change to be backwards-compatible).
+    #[serde(default, skip_serializing_if = "Option::is_none")]
+    pub(crate) network_type: Option<proxmox_sdn_types::ospf::NetworkType>,
 }
 
 impl OspfInterfaceProperties {
-- 
2.47.3





  parent reply	other threads:[~2026-02-18 15:11 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-02-18 15:11 [PATCH manager/network/proxmox-ve-rs 0/4] Expose OSPF Network-Type option Gabriel Goller
2026-02-18 15:11 ` [PATCH proxmox-ve-rs 1/2] cargo: bump proxmox-network-types Gabriel Goller
2026-02-18 15:11 ` Gabriel Goller [this message]
2026-02-18 15:11 ` [PATCH pve-network 1/1] fabrics: add ospf network_type property to interfaces Gabriel Goller
2026-02-18 15:11 ` [PATCH pve-manager 1/1] fabrics: ospf: add network-type property in interface panel Gabriel Goller

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=20260218151153.381963-3-g.goller@proxmox.com \
    --to=g.goller@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