[PATCH pve-network v5 23/46] controller: bgp: evpn: adapt to new match / set frr config syntax

Stefan Hanreich
2026-05-05T15:44:28Z

proxmox-frr has changed the representation of match / set statements
in its structs. It has changed to generic key / value fields, where
the exact keys / values are specified, instead of having to specify
the types and subsequent types explicitly. Adapt the controllers to
use the new fields so the configuration gets generated properly.

Support for specifying relative metric values has been added to
proxmox-frr as well, which necessitates a change from integer to
string in the datatype for the metric.

Signed-off-by: Stefan Hanreich <s.hanreich@proxmox.com>
---
src/PVE/Network/SDN/Controllers/BgpPlugin.pm | 7 +++---
src/PVE/Network/SDN/Controllers/EvpnPlugin.pm | 24 ++++++++-----------
2 files changed, 13 insertions(+), 18 deletions(-)

diff --git a/src/PVE/Network/SDN/Controllers/BgpPlugin.pm b/src/PVE/Network/SDN/Controllers/BgpPlugin.pm
index 8891541..d54c9ec 100644
--- a/src/PVE/Network/SDN/Controllers/BgpPlugin.pm
+++ b/src/PVE/Network/SDN/Controllers/BgpPlugin.pm
@@ -136,13 +136,12 @@ sub generate_frr_config {
$config->{frr}->{protocol_routemaps}->{bgp}->{v4} = "correct_src";

my $routemap_config = {
- protocol_type => 'ip',
- match_type => 'address',
- value => { list_type => 'prefixlist', list_name => 'loopbacks_ips' },
+ key => 'ip address prefix-list',
+ value => 'loopbacks_ips',
};
my $routemap = {
matches => [$routemap_config],
- sets => [{ set_type => 'src', value => $ifaceip }],
+ sets => [{ key => 'src', value => $ifaceip }],
action => "permit",
seq => 1,
};
diff --git a/src/PVE/Network/SDN/Controllers/EvpnPlugin.pm b/src/PVE/Network/SDN/Controllers/EvpnPlugin.pm
index d2825f5..54a2227 100644
--- a/src/PVE/Network/SDN/Controllers/EvpnPlugin.pm
+++ b/src/PVE/Network/SDN/Controllers/EvpnPlugin.pm
@@ -329,9 +329,8 @@ sub generate_zone_frr_config {
if (!$exitnodes_primary || $exitnodes_primary eq $local_node) {
# Filter default route coming from other exit nodes on primary node
my $routemap_config_v6 = {
- protocol_type => 'ipv6',
- match_type => 'address',
- value => { list_type => 'prefixlist', list_name => 'only_default_v6' },
+ key => 'ipv6 address prefix-list',
+ value => 'only_default_v6',
};
my $routemap_v6 = { seq => 1, matches => [$routemap_config_v6], action => "deny" };
unshift(
@@ -339,23 +338,21 @@ sub generate_zone_frr_config {
);

my $routemap_config = {
- protocol_type => 'ip',
- match_type => 'address',
- value => { list_type => 'prefixlist', list_name => 'only_default' },
+ key => 'ip address prefix-list',
+ value => 'only_default',
};
my $routemap = { seq => 1, matches => [$routemap_config], action => "deny" };
unshift(@{ $config->{frr}->{routemaps}->{'MAP_VTEP_IN'} }, $routemap);

} elsif ($exitnodes_primary ne $local_node) {
my $routemap_config_v6 = {
- protocol_type => 'ipv6',
- match_type => 'address',
- value => { list_type => 'prefixlist', list_name => 'only_default_v6' },
+ key => 'ipv6 address prefix-list',
+ value => 'only_default_v6',
};
my $routemap_v6 = {
seq => 1,
matches => [$routemap_config_v6],
- sets => [{ set_type => 'metric', value => 200 }],
+ sets => [{ key => 'metric', value => "200" }],
action => "permit",
};
unshift(
@@ -363,14 +360,13 @@ sub generate_zone_frr_config {
);

my $routemap_config = {
- protocol_type => 'ip',
- match_type => 'address',
- value => { list_type => 'prefixlist', list_name => 'only_default' },
+ key => 'ip address prefix-list',
+ value => 'only_default',
};
my $routemap = {
seq => 1,
matches => [$routemap_config],
- sets => [{ set_type => 'metric', value => 200 }],
+ sets => [{ key => 'metric', value => "200" }],
action => "permit",
};
unshift(@{ $config->{frr}->{routemaps}->{'MAP_VTEP_OUT'} }, $routemap);
--
2.47.3