From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [IPv6:2a01:7e0:0:424::9]) by lore.proxmox.com (Postfix) with ESMTPS id 1E7C31FF141 for ; Tue, 05 May 2026 11:14:34 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 08F05209EE; Tue, 5 May 2026 11:14:31 +0200 (CEST) From: Gabriel Goller To: pve-devel@lists.proxmox.com Subject: [PATCH proxmox-ve-rs v2 1/3] fabrics: ospf: expose network-type interface property Date: Tue, 5 May 2026 11:13:36 +0200 Message-ID: <20260505091342.106949-2-g.goller@proxmox.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260505091342.106949-1-g.goller@proxmox.com> References: <20260505091342.106949-1-g.goller@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1777972321060 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.029 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record URIBL_BLOCKED 0.001 ADMINISTRATOR NOTICE: The query to URIBL was blocked. See http://wiki.apache.org/spamassassin/DnsBlocklists#dnsbl-block for more information. [ospf.rs,lib.rs,frr.rs,area.rs] Message-ID-Hash: 3G2OZYLZADG5VGYRCN3CSIZ5VENLXVJE X-Message-ID-Hash: 3G2OZYLZADG5VGYRCN3CSIZ5VENLXVJE X-MailFrom: g.goller@proxmox.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list List-Id: Proxmox VE development discussion List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: 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. Rename the existing area module to ospf while at it, as it now contains more OSPF-specific types than just the Area type. Signed-off-by: Gabriel Goller --- proxmox-frr/src/ser/ospf.rs | 20 +-------------- proxmox-sdn-types/src/lib.rs | 2 +- proxmox-sdn-types/src/{area.rs => ospf.rs} | 25 +++++++++++++++++++ proxmox-ve-config/src/sdn/fabric/frr.rs | 13 +++++++--- .../fabric/section_config/protocol/ospf.rs | 8 +++++- 5 files changed, 43 insertions(+), 25 deletions(-) rename proxmox-sdn-types/src/{area.rs => ospf.rs} (65%) diff --git a/proxmox-frr/src/ser/ospf.rs b/proxmox-frr/src/ser/ospf.rs index c18725e08f25..bd8113da125d 100644 --- a/proxmox-frr/src/ser/ospf.rs +++ b/proxmox-frr/src/ser/ospf.rs @@ -1,6 +1,7 @@ use std::fmt::Debug; use std::net::Ipv4Addr; +use proxmox_sdn_types::ospf::NetworkType; use serde::{Deserialize, Serialize}; use thiserror::Error; @@ -107,25 +108,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. -#[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 ` diff --git a/proxmox-sdn-types/src/lib.rs b/proxmox-sdn-types/src/lib.rs index cff44917739e..efd9b8d2a00b 100644 --- a/proxmox-sdn-types/src/lib.rs +++ b/proxmox-sdn-types/src/lib.rs @@ -1,7 +1,7 @@ -pub mod area; pub mod bgp; pub mod net; pub mod openfabric; +pub mod ospf; pub mod wireguard; use serde::{Deserialize, Serialize}; diff --git a/proxmox-sdn-types/src/area.rs b/proxmox-sdn-types/src/ospf.rs similarity index 65% rename from proxmox-sdn-types/src/area.rs rename to proxmox-sdn-types/src/ospf.rs index 3eba3b1b2545..42833587c204 100644 --- a/proxmox-sdn-types/src/area.rs +++ b/proxmox-sdn-types/src/ospf.rs @@ -1,3 +1,5 @@ +use proxmox_schema::api; +use serde::{Deserialize, Serialize}; use std::{fmt::Display, net::Ipv4Addr}; use anyhow::Error; @@ -61,3 +63,26 @@ impl Area { } } } + +/// 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. +#[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 1ef840cf1cd4..d9e211e89c2c 100644 --- a/proxmox-ve-config/src/sdn/fabric/frr.rs +++ b/proxmox-ve-config/src/sdn/fabric/frr.rs @@ -555,10 +555,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 17bf88079f0b..0bf9ca721356 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 @@ -1,7 +1,7 @@ use std::ops::{Deref, DerefMut}; use proxmox_network_types::ip_address::Ipv4Cidr; -use proxmox_sdn_types::area::Area; +use proxmox_sdn_types::ospf::Area; use serde::{Deserialize, Serialize}; use proxmox_schema::{api, property_string::PropertyString, ApiStringFormat, Updater}; @@ -228,6 +228,12 @@ pub struct OspfInterfaceProperties { /// OSPF area #[serde(skip_serializing_if = "Option::is_none")] pub(crate) area: Option, + + /// 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, } impl OspfInterfaceProperties { -- 2.47.3