On 2026-03-10 13:09, Gabriel Goller wrote:
> The structured frr config can be deserialized by rust and rendered using
> the templates (isis and bgp) in proxmox-frr.
>
> Co-authored-by: Stefan Hanreich <[email protected]>
> Signed-off-by: Gabriel Goller <[email protected]>
> ---
[..]
> diff --git a/src/PVE/Network/SDN/Controllers/EvpnPlugin.pm
> b/src/PVE/Network/SDN/Controllers/EvpnPlugin.pm
> index cc217126607f..e3091c63ac8d 100644
> --- a/src/PVE/Network/SDN/Controllers/EvpnPlugin.pm
> +++ b/src/PVE/Network/SDN/Controllers/EvpnPlugin.pm
> @@ -55,15 +55,15 @@ sub generate_frr_config {
> my $local_node = PVE::INotify::nodename();
>
> my @peers;
> - my $asn = $plugin_config->{asn};
> + my $asn = int($plugin_config->{asn});
> my $ebgp = undef;
> my $loopback = undef;
> my $autortas = undef;
> my $ifaceip = undef;
> my $routerid = undef;
>
> - my $bgprouter = find_bgp_controller($local_node, $controller_cfg);
> - my $isisrouter = find_isis_controller($local_node, $controller_cfg);
> + my $bgp_controller = find_bgp_controller($local_node, $controller_cfg);
> + my $isis_controller = find_isis_controller($local_node, $controller_cfg);
>
> if ($plugin_config->{'fabric'}) {
> my $config = PVE::Network::SDN::Fabrics::config(1);
> @@ -102,10 +102,10 @@ sub generate_frr_config {
> } elsif ($plugin_config->{'peers'}) {
> @peers = PVE::Tools::split_list($plugin_config->{'peers'});
>
> - if ($bgprouter) {
> - $loopback = $bgprouter->{loopback} if $bgprouter->{loopback};
> - } elsif ($isisrouter) {
> - $loopback = $isisrouter->{loopback} if $isisrouter->{loopback};
> + if ($bgp_controller) {
> + $loopback = $bgp_controller->{loopback} if
> $bgp_controller->{loopback};
> + } elsif ($isis_controller) {
> + $loopback = $isis_controller->{loopback} if
> $isis_controller->{loopback};
> }
>
> ($ifaceip, my $interface) =
> @@ -116,58 +116,60 @@ sub generate_frr_config {
> return;
> }
>
> - if ($bgprouter) {
> - $ebgp = 1 if $plugin_config->{'asn'} ne $bgprouter->{asn};
> - $asn = $bgprouter->{asn} if $bgprouter->{asn};
> + if ($bgp_controller) {
> + $ebgp = 1 if $plugin_config->{'asn'} ne $bgp_controller->{asn};
> + $asn = $bgp_controller->{asn} if $bgp_controller->{asn};
missing `int(..)`, so the var is flagged correctly
> $autortas = $plugin_config->{'asn'} if $ebgp;
> }
>
> return if !$asn || !$routerid;
> - my $bgp = $config->{frr}->{router}->{"bgp $asn"} //= {};
> -
> - my $remoteas = $ebgp ? "external" : $asn;
> -
> - #global options
> - my @controller_config = (
> - "bgp router-id $routerid",
> - "no bgp hard-administrative-reset",
> - "no bgp default ipv4-unicast",
> - "coalesce-time 1000",
> - "no bgp graceful-restart notification",
> - );
> -
> - push(@{ $bgp->{""} }, @controller_config) if keys %{$bgp} == 0;
>
[..]