public inbox for pve-devel@lists.proxmox.com
 help / color / mirror / Atom feed
From: Wolfgang Bumiller <w.bumiller@proxmox.com>
To: Stefan Hanreich <s.hanreich@proxmox.com>
Cc: pve-devel@lists.proxmox.com
Subject: Re: [PATCH proxmox-ve-rs v2 05/34] sdn-types: add common route-map helper types
Date: Thu, 2 Apr 2026 15:36:02 +0200	[thread overview]
Message-ID: <dngzmwe3ary6onqxrcvq2notwmnafmq6xfs4efwip6lnjgyuf2@j2uvn7reugu6> (raw)
In-Reply-To: <20260401143957.386809-6-s.hanreich@proxmox.com>

On Wed, Apr 01, 2026 at 04:39:14PM +0200, Stefan Hanreich wrote:
> The reason for including those types here is that they are used in
> proxmox-frr for generating the FRR configuration as well as
> proxmox-ve-config for utilizing them in the section config types.
> 
> For some values in route maps FRR supports specifying either an
> absolute value or a value relative to the existing value. When
> modifying the metric of a  route via a route map, '123' would set the
> value to 123, whereas '+/-123' would add/subtract 123 from the
> existing value. IntegerWithSign can be used to represent such a value
> in the section config.
> 
> A custom deserializer is implemented, so primitive numerical values
> can be used in addition to strings that contain the respective signs.
> They deserialize into absolute values.
> 
> Signed-off-by: Stefan Hanreich <s.hanreich@proxmox.com>
> ---
>  proxmox-sdn-types/src/bgp.rs |  62 ++++++++++++
>  proxmox-sdn-types/src/lib.rs | 179 +++++++++++++++++++++++++++++++++++
>  2 files changed, 241 insertions(+)
>  create mode 100644 proxmox-sdn-types/src/bgp.rs
> 
> diff --git a/proxmox-sdn-types/src/bgp.rs b/proxmox-sdn-types/src/bgp.rs
> new file mode 100644
> index 0000000..6df3022
> --- /dev/null
> +++ b/proxmox-sdn-types/src/bgp.rs
> @@ -0,0 +1,62 @@
> +use serde::{Deserialize, Serialize};
> +
> +use crate::IntegerWithSign;
> +
> +/// Represents a BGP metric value, as used in FRR.
> +///
> +/// A metric can either be a numeric value, or certain 'magic' values. For more information see the
> +/// respective enum variants.
> +#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq)]
> +pub enum SetMetricValue {
> +    /// Set the metric to the round-trip-time.
> +    #[serde(rename = "rtt")]
> +    Rtt,
> +    /// Add the round-trip-time to the metric.
> +    #[serde(rename = "+rtt")]
> +    AddRtt,
> +    /// Subtract the round-trip-time from the metric.
> +    #[serde(rename = "-rtt")]
> +    SubtractRtt,
> +    /// Use the IGP value when importing from another IGP.
> +    #[serde(rename = "igp")]
> +    Igp,
> +    /// Use the accumulated IGP value when importing from another IGP.
> +    #[serde(rename = "aigp")]
> +    Aigp,
> +    /// Set the metric to a fixed numeric value.
> +    #[serde(untagged)]
> +    Numeric(IntegerWithSign),
> +}
> +
> +impl<T: Into<IntegerWithSign>> From<T> for SetMetricValue {
> +    fn from(value: T) -> Self {
> +        Self::Numeric(value.into())
> +    }
> +}
> +
> +/// An EVPN route-type, as used in the FRR route maps.
> +#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq)]
> +#[serde(rename_all = "lowercase")]
> +pub enum EvpnRouteType {
> +    Ead,
> +    MacIp,
> +    Multicast,
> +    #[serde(rename = "es")]
> +    EthernetSegment,
> +    Prefix,
> +}
> +
> +/// An tag value, as used in the FRR route maps.
> +#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq)]
> +#[serde(rename_all = "lowercase")]
> +pub enum SetTagValue {
> +    Untagged,
> +    #[serde(untagged)]
> +    Numeric(#[serde(deserialize_with = "proxmox_serde::perl::deserialize_u32")] u32),
> +}
> +
> +impl SetTagValue {
> +    pub fn new(value: u32) -> Self {
> +        SetTagValue::Numeric(value)
> +    }
> +}
> diff --git a/proxmox-sdn-types/src/lib.rs b/proxmox-sdn-types/src/lib.rs
> index 1656f1d..9795857 100644
> --- a/proxmox-sdn-types/src/lib.rs
> +++ b/proxmox-sdn-types/src/lib.rs
> @@ -1,3 +1,182 @@
>  pub mod area;
> +pub mod bgp;
>  pub mod net;
>  pub mod openfabric;
> +
> +use serde::de::{Error, Visitor};
> +use serde::{Deserialize, Serialize};
> +
> +use proxmox_schema::api;
> +
> +/// Enum for representing signedness of Integer in [`IntegerWithSign`].
> +#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq)]
> +pub enum Sign {
> +    #[serde(rename = "-")]
> +    Negative,
> +    #[serde(rename = "+")]
> +    Positive,
> +}
> +
> +proxmox_serde::forward_display_to_serialize!(Sign);
> +proxmox_serde::forward_from_str_to_deserialize!(Sign);
> +
> +/// An Integer with an optional [`Sign`].
> +///
> +/// This is used for representing certain keys in the FRR route maps (e.g. metric). They can be set
> +/// to either a static value (no sign) or to a value relative to the existing value (with sign).
> +/// For instance, a value of 50 would set the metric to 50, but a value of +50 would add 50 to the
> +/// existing metric value.
> +#[derive(Debug, Clone, Eq, PartialEq)]
> +pub struct IntegerWithSign {
> +    pub(crate) sign: Option<Sign>,
> +    pub(crate) n: u32,
> +}
> +

Summary of a short off-list discussion:
- I found the name somewhat arbitrary (and the `Sign` part is optional)
- It's supposed to say "Set to X" or "Modify *by* X", so it's probably
  nicer to have an `enum ModifyNumber { Absolute(u32), Relative(i32) }`
  (name and exact types to be determined) so the name and content
  actually reflect the description found in the doc comment.

Also, since this comes from the API and flows through perl
(integer/string confusion) and the leading plus sign is significant
here, it should be an only-string type (which means the `Deserialize`
impl can be forwarded to `FromStr` and the serde `Visitor` boiler plate
can be dropped).




  reply	other threads:[~2026-04-02 13:36 UTC|newest]

Thread overview: 37+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-04-01 14:39 [PATCH access-control/cluster/network/proxmox{-ve-rs,-perl-rs} v2 00/34] Add support for route maps / prefix lists to SDN Stefan Hanreich
2026-04-01 14:39 ` [PATCH pve-cluster v2 01/34] cfs: add 'sdn/route-maps.cfg' to observed files Stefan Hanreich
2026-04-01 14:39 ` [PATCH pve-cluster v2 02/34] cfs: add 'sdn/prefix-lists.cfg' " Stefan Hanreich
2026-04-01 14:39 ` [PATCH pve-access-control v2 03/34] permissions: add ACL path for prefix-lists and route-maps Stefan Hanreich
2026-04-01 14:39 ` [PATCH proxmox-ve-rs v2 04/34] frr: add constructor to prefix list name Stefan Hanreich
2026-04-01 14:39 ` [PATCH proxmox-ve-rs v2 05/34] sdn-types: add common route-map helper types Stefan Hanreich
2026-04-02 13:36   ` Wolfgang Bumiller [this message]
2026-04-01 14:39 ` [PATCH proxmox-ve-rs v2 06/34] frr: change order type to u16 Stefan Hanreich
2026-04-01 14:39 ` [PATCH proxmox-ve-rs v2 07/34] frr: implement routemap match/set statements via adjacent tagging Stefan Hanreich
2026-04-01 14:39 ` [PATCH proxmox-ve-rs v2 08/34] frr: implement support for call and exit action Stefan Hanreich
2026-04-01 14:39 ` [PATCH proxmox-ve-rs v2 09/34] frr-templates: change route maps template to adapt to new frr types Stefan Hanreich
2026-04-01 14:39 ` [PATCH proxmox-ve-rs v2 10/34] ve-config: fabrics: adapt frr config generation Stefan Hanreich
2026-04-01 14:39 ` [PATCH proxmox-ve-rs v2 11/34] ve-config: add prefix list section config Stefan Hanreich
2026-04-01 14:39 ` [PATCH proxmox-ve-rs v2 12/34] ve-config: frr: implement frr config generation for prefix lists Stefan Hanreich
2026-04-03  7:42   ` Wolfgang Bumiller
2026-04-01 14:39 ` [PATCH proxmox-ve-rs v2 13/34] ve-config: add route map section config Stefan Hanreich
2026-04-01 14:39 ` [PATCH proxmox-ve-rs v2 14/34] ve-config: frr: implement frr config generation for route maps Stefan Hanreich
2026-04-01 14:39 ` [PATCH proxmox-ve-rs v2 15/34] ve-config: add prefix lists integration tests Stefan Hanreich
2026-04-01 14:39 ` [PATCH proxmox-ve-rs v2 16/34] ve-config: add route maps " Stefan Hanreich
2026-04-01 14:39 ` [PATCH proxmox-perl-rs v2 17/34] pve-rs: sdn: add route maps module Stefan Hanreich
2026-04-01 14:39 ` [PATCH proxmox-perl-rs v2 18/34] pve-rs: sdn: add prefix lists module Stefan Hanreich
2026-04-01 14:39 ` [PATCH proxmox-perl-rs v2 19/34] sdn: add prefix list / route maps to frr config generation helper Stefan Hanreich
2026-04-01 14:39 ` [PATCH pve-network v2 20/34] controller: bgp: evpn: adapt to new match / set frr config syntax Stefan Hanreich
2026-04-01 14:39 ` [PATCH pve-network v2 21/34] sdn: add prefix lists module Stefan Hanreich
2026-04-01 14:39 ` [PATCH pve-network v2 22/34] api2: add prefix list module Stefan Hanreich
2026-04-01 14:39 ` [PATCH pve-network v2 23/34] sdn: add route map module Stefan Hanreich
2026-04-01 14:39 ` [PATCH pve-network v2 24/34] api2: add route maps api module Stefan Hanreich
2026-04-01 14:39 ` [PATCH pve-network v2 25/34] api2: add route map module Stefan Hanreich
2026-04-01 14:39 ` [PATCH pve-network v2 26/34] api2: add route map entry module Stefan Hanreich
2026-04-01 14:39 ` [PATCH pve-network v2 27/34] evpn controller: add route_map_{in,out} parameter Stefan Hanreich
2026-04-01 14:39 ` [PATCH pve-network v2 28/34] bgp controller: allow configuring custom route maps Stefan Hanreich
2026-04-01 14:39 ` [PATCH pve-network v2 29/34] sdn: change detection for route maps / prefix lists Stefan Hanreich
2026-04-01 14:39 ` [PATCH pve-network v2 30/34] sdn: generate route map / prefix list configuration on sdn apply Stefan Hanreich
2026-04-01 14:39 ` [PATCH pve-network v2 31/34] tests: add simple route map test case Stefan Hanreich
2026-04-01 14:39 ` [PATCH pve-network v2 32/34] tests: add bgp evpn route map/prefix list testcase Stefan Hanreich
2026-04-01 14:39 ` [PATCH pve-network v2 33/34] tests: add route map with prefix " Stefan Hanreich
2026-04-01 14:39 ` [PATCH pve-network v2 34/34] tests: add exit node with custom route map testcase 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=dngzmwe3ary6onqxrcvq2notwmnafmq6xfs4efwip6lnjgyuf2@j2uvn7reugu6 \
    --to=w.bumiller@proxmox.com \
    --cc=pve-devel@lists.proxmox.com \
    --cc=s.hanreich@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