From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) by lore.proxmox.com (Postfix) with ESMTPS id 997F71FF136 for ; Mon, 04 May 2026 18:33:14 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id E408BC1E3; Mon, 4 May 2026 18:32:41 +0200 (CEST) From: Stefan Hanreich To: pve-devel@lists.proxmox.com Subject: [PATCH proxmox-ve-rs 5/9] ve-config: ospf: generate redistribute config Date: Mon, 4 May 2026 18:31:50 +0200 Message-ID: <20260504163157.429628-6-s.hanreich@proxmox.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260504163157.429628-1-s.hanreich@proxmox.com> References: <20260504163157.429628-1-s.hanreich@proxmox.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1777912219812 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.656 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 Message-ID-Hash: DISYO4RD4VEVTJP4JL7CCSMZHE5PV6JQ X-Message-ID-Hash: DISYO4RD4VEVTJP4JL7CCSMZHE5PV6JQ X-MailFrom: s.hanreich@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: 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 --- 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, } +#[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 for FrrOspfRedistribution { + fn from(value: OspfRedistribution) -> Self { + Self { + source: value.source.into(), + metric: value.metric, + route_map: value.route_map.into(), + } + } + } + + impl From 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