net/frr: add BGP maximum-paths support for ECMP

This commit is contained in:
Max Allison 2026-03-20 22:53:00 -05:00
parent 8788b22a16
commit bf424afb33
No known key found for this signature in database
5 changed files with 35 additions and 1 deletions

View file

@ -1,5 +1,5 @@
PLUGIN_NAME= frr
PLUGIN_VERSION= 1.51
PLUGIN_VERSION= 1.52
PLUGIN_COMMENT= The FRRouting Protocol Suite
PLUGIN_DEPENDS= frr10-pythontools
PLUGIN_MAINTAINER= ad@opnsense.org

View file

@ -12,6 +12,10 @@ WWW: https://frrouting.org/
Plugin Changelog
================
1.52
* Add BGP maximum-paths support for ECMP multipath (contributed by maxfield-allison) (opnsense/plugins#4878)
1.51
* Add per-neighbor local-as option for BGP (contributed by danohn) (opnsense/plugins/pull/5308)

View file

@ -67,4 +67,18 @@
<type>checkbox</type>
<help>Enable extended logging of BGP neighbor changes.</help>
</field>
<field>
<id>bgp.maximumpaths</id>
<label>Maximum Paths</label>
<type>text</type>
<advanced>true</advanced>
<help>Maximum number of equal-cost paths for EBGP multipath (ECMP). Leave empty to use FRR default (1).</help>
</field>
<field>
<id>bgp.maximumpathsibgp</id>
<label>Maximum Paths (IBGP)</label>
<type>text</type>
<advanced>true</advanced>
<help>Maximum number of equal-cost paths for IBGP multipath (ECMP). Leave empty to use FRR default (1).</help>
</field>
</form>

View file

@ -48,6 +48,16 @@
</OptionValues>
<Multiple>Y</Multiple>
</bestpath>
<maximumpaths type="IntegerField">
<MinimumValue>1</MinimumValue>
<MaximumValue>128</MaximumValue>
<ValidationMessage>The value shall be between 1 and 128 or left empty to use the default.</ValidationMessage>
</maximumpaths>
<maximumpathsibgp type="IntegerField">
<MinimumValue>1</MinimumValue>
<MaximumValue>128</MaximumValue>
<ValidationMessage>The value shall be between 1 and 128 or left empty to use the default.</ValidationMessage>
</maximumpathsibgp>
<neighbors>
<neighbor type="ArrayField">
<enabled type="BooleanField">

View file

@ -170,6 +170,12 @@ router bgp {{ OPNsense.quagga.bgp.asnumber }}
{% for addressFamily in addressFamilies %}
address-family {{ addressFamily }} unicast
{% if helpers.exists('OPNsense.quagga.bgp.maximumpaths') and OPNsense.quagga.bgp.maximumpaths != '' %}
maximum-paths {{ OPNsense.quagga.bgp.maximumpaths }}
{% endif %}
{% if helpers.exists('OPNsense.quagga.bgp.maximumpathsibgp') and OPNsense.quagga.bgp.maximumpathsibgp != '' %}
maximum-paths ibgp {{ OPNsense.quagga.bgp.maximumpathsibgp }}
{% endif %}
{% for redistribution in helpers.toList('OPNsense.quagga.bgp.redistributions.redistribution') %}
{% if redistribution.enabled == '1' %}
redistribute {{ redistribution.redistribute }}{% if redistribution.linkedRoutemap %} route-map {{ helpers.getUUID(redistribution.linkedRoutemap).name }}{% endif +%}