Skip to content

lib, bgpd: add "unique mode" for route tables, supporting direct lookup only - #20589

Merged
riw777 merged 2 commits into
FRRouting:masterfrom
mjstapp:route_table_unique
Feb 24, 2026
Merged

lib, bgpd: add "unique mode" for route tables, supporting direct lookup only#20589
riw777 merged 2 commits into
FRRouting:masterfrom
mjstapp:route_table_unique

Conversation

@mjstapp

@mjstapp mjstapp commented Jan 23, 2026

Copy link
Copy Markdown
Contributor

The existing route-table library was designed to support ip prefixes, where there's a hierarchy of prefixes with parents and children. Some of our route tables don't have this property - the items in the table don't have a hierarchy in the same way as ip prefixes. In those cases, the internal hierarchy of route-node objects just occupies memory without providing value.
This PR adds a "unique" mode that doesn't create any internal hierarchy - it uses just direct lookups.

Here's a before and after comparison, with 50000 static routes redistributed into an evpn l3vni in the bgp_evpn_rt5 topotest. I added a temporary "show bgp tables" command that shows the count of route-nodes in some of the interesting bgp route-tables.

With the current table scheme, both the EVPN and unicast tables consume 100K nodes to hold the 50K entries, with the corresponding memory footprint:

r1# do sho bgp tables 
BGP instance VRF default VRF id 0
Router Id 192.168.0.1
 AFI/SAFI IPv4/unicast count: 0
 AFI/SAFI l2vpn/evpn count: 11
  RD 65000:1: count 100003
  RD 65000:2: count 3
  RD 65000:3: count 3
  RD 65000:4: count 3
  RD 192.168.0.1:2: count 0
  RD 192.168.0.1:4: count 0

BGP instance VRF vrf-101 VRF id 2
Router Id 10.0.101.1
  L3VNI 101, L3VNI-SVI bridge-101, Router MAC 52:54:00:00:01:65
 AFI/SAFI IPv4/unicast count: 100003
 AFI/SAFI l2vpn/evpn count: 0

BGP instance VRF vrf-102 VRF id 1
Router Id 10.0.102.1
  L3VNI 102, L3VNI-SVI bridge-102, Router MAC 52:54:00:00:01:66
 AFI/SAFI IPv4/unicast count: 3
 AFI/SAFI l2vpn/evpn count: 0
r1#
[...]
--- qmem libfrr ---
Type                          : Current#   Size       Total     Max#  MaxBytes
[...]

Stream FIFO                   :        8     80         704        8       704
Route table                   :      240     80       21120      240     21120
Route node                    :   200048    152    30407360   200048  30407360
[...]
--- qmem bgpd ---
Type                          : Current#   Size       Total     Max#  MaxBytes
[...]
BGP table                     :      225     80       19816      225     19832
BGP node                      :   100032    152    15204880   100032  15204880
BGP route                     :   100016    160    16802688   100016  16802688
BGP ancillary route info      :    50012     72     3601040    50012   3601040
BGP extra info for EVPN       :    50008     40     2000544    50008   2000544
BGP extra info for vrf leaking:        4     80         352        4       352

The after version with bgp EVPN tables using the new unique-mode in this PR; the EVPN table only requires 50K nodes for the 50K RT5s.

r1# do sho bgp tables 
BGP instance VRF default VRF id 0
Router Id 192.168.0.1
 AFI/SAFI IPv4/unicast count: 0
 AFI/SAFI l2vpn/evpn count: 6
  RD 65000:1: count 50002
  RD 65000:2: count 2
  RD 65000:3: count 2
  RD 65000:4: count 2
  RD 192.168.0.1:3: count 0
  RD 192.168.0.1:4: count 0

BGP instance VRF vrf-101 VRF id 2
Router Id 10.0.101.1
  L3VNI 101, L3VNI-SVI bridge-101, Router MAC 52:54:00:00:01:65
 AFI/SAFI IPv4/unicast count: 100003
 AFI/SAFI l2vpn/evpn count: 0

BGP instance VRF vrf-102 VRF id 1
Router Id 10.0.102.1
  L3VNI 102, L3VNI-SVI bridge-102, Router MAC 52:54:00:00:01:66
 AFI/SAFI IPv4/unicast count: 3
 AFI/SAFI l2vpn/evpn count: 0
r1#
Type                          : Current#   Size       Total     Max#  MaxBytes
[...]
Stream FIFO                   :        8     80         704        8       704
Route table                   :      240     80       21136      240     21136
Route node                    :   150039    152    22805976   150039  22805976
[...]

--- qmem bgpd ---
Type                          : Current#   Size       Total     Max#  MaxBytes
BGP EVPN instance information :        3     96         312        3       312
[...]
BGP aspath                    :        1     48          56        1        56
BGP aspath str                :        1      1          24        2        48
BGP table                     :      225     80       19832      225     19832
BGP node                      :   100032    152    15204896   100032  15204896
BGP route                     :   100016    160    16802720   100016  16802720
BGP ancillary route info      :    50012     72     3600880    50012   3600880
BGP extra info for EVPN       :    50008     40     2000640    50008   2000640
BGP extra info for vrf leaking:        4     80         352        4       352

@ton31337

Copy link
Copy Markdown
Member

What is the performance gain here? As I understand, this should be relevant to all VPN tables, not only EVPN? Or did I miss something?

@mjstapp

mjstapp commented Jan 26, 2026

Copy link
Copy Markdown
Contributor Author

yes, you're quite right - there should be a benefit for any of the tables that don't use IP prefixes. I haven't got memory numbers yet - that's the real benefit, I think, saving the memory that the interior/internal route-nodes use.

What is the performance gain here? As I understand, this should be relevant to all VPN tables, not only EVPN? Or did I miss something?

@mjstapp
mjstapp force-pushed the route_table_unique branch from 384a5fb to 866409b Compare January 26, 2026 13:45
@mjstapp

mjstapp commented Jan 26, 2026

Copy link
Copy Markdown
Contributor Author

pushed an update to fix the checkpatch warning

@mjstapp
mjstapp force-pushed the route_table_unique branch from 866409b to b7ff14b Compare January 26, 2026 14:28
@mjstapp

mjstapp commented Jan 26, 2026

Copy link
Copy Markdown
Contributor Author

and another fixup

@eqvinox

eqvinox commented Jan 27, 2026

Copy link
Copy Markdown
Contributor

I maaaaaaay (no promises) actually have some numbers for the RB-tree part due to having tried this before; I was tempted to replace the LPM lookup in general with RB-tree search-next operations (if you do the sort order right, you can do that…) but it kinda turned out a mixed bag for that use case. I didn't think about a flag to switch a table into "unique mode" there…

@riw777
riw777 self-requested a review January 27, 2026 16:32
@mjstapp
mjstapp force-pushed the route_table_unique branch from b7ff14b to baf4574 Compare February 4, 2026 20:14
@donaldsharp

Copy link
Copy Markdown
Member

I'm personally convinced that this is ready to go.

@mjstapp
mjstapp marked this pull request as ready for review February 9, 2026 16:30
@mjstapp

mjstapp commented Feb 9, 2026

Copy link
Copy Markdown
Contributor Author

Clearing the 'draft' status

@greptile-apps

greptile-apps Bot commented Feb 9, 2026

Copy link
Copy Markdown

Greptile Overview

Greptile Summary

This PR introduces a new unique_mode for lib/table route tables, intended for non-hierarchical keys (e.g., EVPN) by using direct lookups instead of building/maintaining the prefix-trie hierarchy. Implementation adds an rbtree (rn_tree) alongside the existing hash to support ordered iteration for unique-mode, and enables this mode for SAFI_EVPN tables in bgp_table_init().

The main integration risk is that several existing code paths in bgpd/lib still assume trie semantics (route_table->top, route_node->link[], route_node->parent) and do not guard against unique-mode tables. As a result, EVPN tables can now be created in a mode where trie-backed operations (subtree lookup, bulk free) will not work correctly, leading to incorrect results and/or assertions during teardown.

Confidence Score: 2/5

  • This PR is not safe to merge as-is due to functional breakage in unique-mode table teardown and trie-dependent BGP helpers now used with EVPN tables.
  • Score reflects two concrete correctness regressions introduced by enabling unique_mode for EVPN: (1) route_table_free() only frees trie-backed nodes and asserts count==0, so finishing a non-empty unique-mode table will fail/leak; (2) bgp_table_subtree_lookup() still assumes trie traversal and will not work on EVPN unique-mode tables. These are deterministic in the scenarios described and need fixes before merge.
  • lib/table.c and bgpd/bgp_table.c (review any other trie-dependent helpers for EVPN tables)

Important Files Changed

Filename Overview
bgpd/bgp_table.c Enables route-table unique_mode for SAFI_EVPN tables. This breaks any code paths that still assume trie-backed tables (e.g., subtree lookup uses route_table->top/link).
lib/table.c Adds unique_mode support via hash + rbtree and adjusts match/get/delete/iteration. However, table teardown still only frees trie nodes via rt->top traversal, so unique_mode tables can’t be finished safely when non-empty.
lib/table.h Adds unique_mode flag, rbtree head to route_table, and rbitem to route_node; exposes route_table_set_unique_mode(). API changes require all trie-dependent consumers to avoid using parent/link/top in unique_mode tables.

Sequence Diagram

sequenceDiagram
    autonumber
    participant BGP as bgpd/bgp_table.c
    participant RT as lib/table.c
    participant HASH as rn_hash_node
    participant TREE as rn_tree

    BGP->>RT: route_table_init_with_delegate()
    RT->>HASH: rn_hash_node_init()
    RT->>TREE: rn_tree_init()

    opt SAFI_EVPN
        BGP->>RT: route_table_set_unique_mode()
        note over RT: unique_mode=true
    end

    BGP->>RT: route_node_get(prefix)
    alt unique_mode
        RT->>HASH: rn_hash_node_find(prefix)
        alt not found
            RT->>HASH: rn_hash_node_add(new_node)
            RT->>TREE: rn_tree_add(new_node)
        end
    else prefix-trie mode
        RT->>RT: walk/extend trie
        RT->>HASH: rn_hash_node_add(new_node)
    end

    BGP->>RT: route_top()/route_next()
    alt unique_mode
        RT->>TREE: rn_tree_first()/rn_tree_next()
    else trie mode
        RT->>RT: traverse via link/parent
    end

    BGP->>RT: route_table_finish()
    RT->>RT: route_table_free()
    note over RT: free currently uses rt->top traversal
    RT->>HASH: rn_hash_node_fini()
    RT->>TREE: rn_tree_fini()
Loading

3 similar comments
@greptile-apps

greptile-apps Bot commented Feb 9, 2026

Copy link
Copy Markdown

Greptile Overview

Greptile Summary

This PR introduces a new unique_mode for lib/table route tables, intended for non-hierarchical keys (e.g., EVPN) by using direct lookups instead of building/maintaining the prefix-trie hierarchy. Implementation adds an rbtree (rn_tree) alongside the existing hash to support ordered iteration for unique-mode, and enables this mode for SAFI_EVPN tables in bgp_table_init().

The main integration risk is that several existing code paths in bgpd/lib still assume trie semantics (route_table->top, route_node->link[], route_node->parent) and do not guard against unique-mode tables. As a result, EVPN tables can now be created in a mode where trie-backed operations (subtree lookup, bulk free) will not work correctly, leading to incorrect results and/or assertions during teardown.

Confidence Score: 2/5

  • This PR is not safe to merge as-is due to functional breakage in unique-mode table teardown and trie-dependent BGP helpers now used with EVPN tables.
  • Score reflects two concrete correctness regressions introduced by enabling unique_mode for EVPN: (1) route_table_free() only frees trie-backed nodes and asserts count==0, so finishing a non-empty unique-mode table will fail/leak; (2) bgp_table_subtree_lookup() still assumes trie traversal and will not work on EVPN unique-mode tables. These are deterministic in the scenarios described and need fixes before merge.
  • lib/table.c and bgpd/bgp_table.c (review any other trie-dependent helpers for EVPN tables)

Important Files Changed

Filename Overview
bgpd/bgp_table.c Enables route-table unique_mode for SAFI_EVPN tables. This breaks any code paths that still assume trie-backed tables (e.g., subtree lookup uses route_table->top/link).
lib/table.c Adds unique_mode support via hash + rbtree and adjusts match/get/delete/iteration. However, table teardown still only frees trie nodes via rt->top traversal, so unique_mode tables can’t be finished safely when non-empty.
lib/table.h Adds unique_mode flag, rbtree head to route_table, and rbitem to route_node; exposes route_table_set_unique_mode(). API changes require all trie-dependent consumers to avoid using parent/link/top in unique_mode tables.

Sequence Diagram

sequenceDiagram
    autonumber
    participant BGP as bgpd/bgp_table.c
    participant RT as lib/table.c
    participant HASH as rn_hash_node
    participant TREE as rn_tree

    BGP->>RT: route_table_init_with_delegate()
    RT->>HASH: rn_hash_node_init()
    RT->>TREE: rn_tree_init()

    opt SAFI_EVPN
        BGP->>RT: route_table_set_unique_mode()
        note over RT: unique_mode=true
    end

    BGP->>RT: route_node_get(prefix)
    alt unique_mode
        RT->>HASH: rn_hash_node_find(prefix)
        alt not found
            RT->>HASH: rn_hash_node_add(new_node)
            RT->>TREE: rn_tree_add(new_node)
        end
    else prefix-trie mode
        RT->>RT: walk/extend trie
        RT->>HASH: rn_hash_node_add(new_node)
    end

    BGP->>RT: route_top()/route_next()
    alt unique_mode
        RT->>TREE: rn_tree_first()/rn_tree_next()
    else trie mode
        RT->>RT: traverse via link/parent
    end

    BGP->>RT: route_table_finish()
    RT->>RT: route_table_free()
    note over RT: free currently uses rt->top traversal
    RT->>HASH: rn_hash_node_fini()
    RT->>TREE: rn_tree_fini()
Loading

@greptile-apps

greptile-apps Bot commented Feb 9, 2026

Copy link
Copy Markdown

Greptile Overview

Greptile Summary

This PR introduces a new unique_mode for lib/table route tables, intended for non-hierarchical keys (e.g., EVPN) by using direct lookups instead of building/maintaining the prefix-trie hierarchy. Implementation adds an rbtree (rn_tree) alongside the existing hash to support ordered iteration for unique-mode, and enables this mode for SAFI_EVPN tables in bgp_table_init().

The main integration risk is that several existing code paths in bgpd/lib still assume trie semantics (route_table->top, route_node->link[], route_node->parent) and do not guard against unique-mode tables. As a result, EVPN tables can now be created in a mode where trie-backed operations (subtree lookup, bulk free) will not work correctly, leading to incorrect results and/or assertions during teardown.

Confidence Score: 2/5

  • This PR is not safe to merge as-is due to functional breakage in unique-mode table teardown and trie-dependent BGP helpers now used with EVPN tables.
  • Score reflects two concrete correctness regressions introduced by enabling unique_mode for EVPN: (1) route_table_free() only frees trie-backed nodes and asserts count==0, so finishing a non-empty unique-mode table will fail/leak; (2) bgp_table_subtree_lookup() still assumes trie traversal and will not work on EVPN unique-mode tables. These are deterministic in the scenarios described and need fixes before merge.
  • lib/table.c and bgpd/bgp_table.c (review any other trie-dependent helpers for EVPN tables)

Important Files Changed

Filename Overview
bgpd/bgp_table.c Enables route-table unique_mode for SAFI_EVPN tables. This breaks any code paths that still assume trie-backed tables (e.g., subtree lookup uses route_table->top/link).
lib/table.c Adds unique_mode support via hash + rbtree and adjusts match/get/delete/iteration. However, table teardown still only frees trie nodes via rt->top traversal, so unique_mode tables can’t be finished safely when non-empty.
lib/table.h Adds unique_mode flag, rbtree head to route_table, and rbitem to route_node; exposes route_table_set_unique_mode(). API changes require all trie-dependent consumers to avoid using parent/link/top in unique_mode tables.

Sequence Diagram

sequenceDiagram
    autonumber
    participant BGP as bgpd/bgp_table.c
    participant RT as lib/table.c
    participant HASH as rn_hash_node
    participant TREE as rn_tree

    BGP->>RT: route_table_init_with_delegate()
    RT->>HASH: rn_hash_node_init()
    RT->>TREE: rn_tree_init()

    opt SAFI_EVPN
        BGP->>RT: route_table_set_unique_mode()
        note over RT: unique_mode=true
    end

    BGP->>RT: route_node_get(prefix)
    alt unique_mode
        RT->>HASH: rn_hash_node_find(prefix)
        alt not found
            RT->>HASH: rn_hash_node_add(new_node)
            RT->>TREE: rn_tree_add(new_node)
        end
    else prefix-trie mode
        RT->>RT: walk/extend trie
        RT->>HASH: rn_hash_node_add(new_node)
    end

    BGP->>RT: route_top()/route_next()
    alt unique_mode
        RT->>TREE: rn_tree_first()/rn_tree_next()
    else trie mode
        RT->>RT: traverse via link/parent
    end

    BGP->>RT: route_table_finish()
    RT->>RT: route_table_free()
    note over RT: free currently uses rt->top traversal
    RT->>HASH: rn_hash_node_fini()
    RT->>TREE: rn_tree_fini()
Loading

@greptile-apps

greptile-apps Bot commented Feb 9, 2026

Copy link
Copy Markdown

Greptile Overview

Greptile Summary

This PR introduces a new unique_mode for lib/table route tables, intended for non-hierarchical keys (e.g., EVPN) by using direct lookups instead of building/maintaining the prefix-trie hierarchy. Implementation adds an rbtree (rn_tree) alongside the existing hash to support ordered iteration for unique-mode, and enables this mode for SAFI_EVPN tables in bgp_table_init().

The main integration risk is that several existing code paths in bgpd/lib still assume trie semantics (route_table->top, route_node->link[], route_node->parent) and do not guard against unique-mode tables. As a result, EVPN tables can now be created in a mode where trie-backed operations (subtree lookup, bulk free) will not work correctly, leading to incorrect results and/or assertions during teardown.

Confidence Score: 2/5

  • This PR is not safe to merge as-is due to functional breakage in unique-mode table teardown and trie-dependent BGP helpers now used with EVPN tables.
  • Score reflects two concrete correctness regressions introduced by enabling unique_mode for EVPN: (1) route_table_free() only frees trie-backed nodes and asserts count==0, so finishing a non-empty unique-mode table will fail/leak; (2) bgp_table_subtree_lookup() still assumes trie traversal and will not work on EVPN unique-mode tables. These are deterministic in the scenarios described and need fixes before merge.
  • lib/table.c and bgpd/bgp_table.c (review any other trie-dependent helpers for EVPN tables)

Important Files Changed

Filename Overview
bgpd/bgp_table.c Enables route-table unique_mode for SAFI_EVPN tables. This breaks any code paths that still assume trie-backed tables (e.g., subtree lookup uses route_table->top/link).
lib/table.c Adds unique_mode support via hash + rbtree and adjusts match/get/delete/iteration. However, table teardown still only frees trie nodes via rt->top traversal, so unique_mode tables can’t be finished safely when non-empty.
lib/table.h Adds unique_mode flag, rbtree head to route_table, and rbitem to route_node; exposes route_table_set_unique_mode(). API changes require all trie-dependent consumers to avoid using parent/link/top in unique_mode tables.

Sequence Diagram

sequenceDiagram
    autonumber
    participant BGP as bgpd/bgp_table.c
    participant RT as lib/table.c
    participant HASH as rn_hash_node
    participant TREE as rn_tree

    BGP->>RT: route_table_init_with_delegate()
    RT->>HASH: rn_hash_node_init()
    RT->>TREE: rn_tree_init()

    opt SAFI_EVPN
        BGP->>RT: route_table_set_unique_mode()
        note over RT: unique_mode=true
    end

    BGP->>RT: route_node_get(prefix)
    alt unique_mode
        RT->>HASH: rn_hash_node_find(prefix)
        alt not found
            RT->>HASH: rn_hash_node_add(new_node)
            RT->>TREE: rn_tree_add(new_node)
        end
    else prefix-trie mode
        RT->>RT: walk/extend trie
        RT->>HASH: rn_hash_node_add(new_node)
    end

    BGP->>RT: route_top()/route_next()
    alt unique_mode
        RT->>TREE: rn_tree_first()/rn_tree_next()
    else trie mode
        RT->>RT: traverse via link/parent
    end

    BGP->>RT: route_table_finish()
    RT->>RT: route_table_free()
    note over RT: free currently uses rt->top traversal
    RT->>HASH: rn_hash_node_fini()
    RT->>TREE: rn_tree_fini()
Loading

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

3 files reviewed, 2 comments

Edit Code Review Agent Settings | Greptile

@greptile-apps

greptile-apps Bot commented Feb 9, 2026

Copy link
Copy Markdown
Additional Comments (2)

lib/table.c
Unique-mode tables never freed

route_table_free() (lib/table.c:108+) only walks rt->top/parent/l_left/l_right to bulk-delete nodes. In unique_mode, rt->top is never populated and nodes are instead stored in rt->tree, so the loop never runs and the assert(rt->count == 0) will fire if the table is finished with live nodes (and even if count were forced to 0, nodes would leak via the hash unless explicitly walked). This needs a unique-mode free path that iterates the rbtree (or otherwise deletes all hash/tree entries) before finalizing.

Prompt To Fix With AI
This is a comment left during a code review.
Path: lib/table.c
Line: 108:112

Comment:
**Unique-mode tables never freed**

`route_table_free()` (lib/table.c:108+) only walks `rt->top`/`parent`/`l_left`/`l_right` to bulk-delete nodes. In `unique_mode`, `rt->top` is never populated and nodes are instead stored in `rt->tree`, so the loop never runs and the `assert(rt->count == 0)` will fire if the table is finished with live nodes (and even if `count` were forced to 0, nodes would leak via the hash unless explicitly walked). This needs a unique-mode free path that iterates the rbtree (or otherwise deletes all hash/tree entries) before finalizing.

How can I resolve this? If you propose a fix, please make it concise.

bgpd/bgp_table.c
EVPN subtree lookup broken

bgp_table_subtree_lookup() (bgpd/bgp_table.c:214+) directly traverses table->route_table->top and node->link[...] assuming a prefix-trie. For SAFI_EVPN tables you now enable unique_mode in bgp_table_init() (bgpd/bgp_table.c:160-162), where top/link/parent aren’t maintained, so this function will always return NULL (because top stays NULL) or behave incorrectly if it ever did get called on an EVPN table. Callers need to be prevented from using this on EVPN/unique-mode tables, or the implementation needs a unique-mode equivalent.

Prompt To Fix With AI
This is a comment left during a code review.
Path: bgpd/bgp_table.c
Line: 214:218

Comment:
**EVPN subtree lookup broken**

`bgp_table_subtree_lookup()` (bgpd/bgp_table.c:214+) directly traverses `table->route_table->top` and `node->link[...]` assuming a prefix-trie. For SAFI_EVPN tables you now enable `unique_mode` in `bgp_table_init()` (bgpd/bgp_table.c:160-162), where `top/link/parent` aren’t maintained, so this function will always return NULL (because `top` stays NULL) or behave incorrectly if it ever did get called on an EVPN table. Callers need to be prevented from using this on EVPN/unique-mode tables, or the implementation needs a unique-mode equivalent.

How can I resolve this? If you propose a fix, please make it concise.

@riw777 riw777 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

looks good

@mjstapp

mjstapp commented Feb 10, 2026

Copy link
Copy Markdown
Contributor Author

greptile has a valid question, I think, so let's not merge this just yet

@github-actions github-actions Bot added the rebase PR needs rebase label Feb 10, 2026
@mjstapp

mjstapp commented Feb 10, 2026

Copy link
Copy Markdown
Contributor Author

resolved comments and rebased

@mjstapp

mjstapp commented Feb 10, 2026

Copy link
Copy Markdown
Contributor Author

CI:rerun

@riw777

riw777 commented Feb 14, 2026

Copy link
Copy Markdown
Member

I don't think the lint errors are worth worrying about here (?)

@github-actions

Copy link
Copy Markdown

This pull request has conflicts, please resolve those before we can evaluate the pull request.

Mark Stapp added 2 commits February 17, 2026 16:26
Add a mode for route tables that do not use LPM prefix
matching - such as EVPN tables.

Signed-off-by: Mark Stapp <mjs@cisco.com>
Use the new unique, non-prefix mode for evpn route tables.

Signed-off-by: Mark Stapp <mjs@cisco.com>
@mjstapp

mjstapp commented Feb 17, 2026

Copy link
Copy Markdown
Contributor Author

rebased and resolved conflicts

@mjstapp

mjstapp commented Feb 17, 2026

Copy link
Copy Markdown
Contributor Author

I don't think the lint errors are worth worrying about here (?)

no, they're about super-wide lines... optional

@riw777 riw777 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

looks good

@riw777
riw777 merged commit 49f9db2 into FRRouting:master Feb 24, 2026
19 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants