bgpd: fix bgp_table range lookup

In case the topmost node has a larger prefix length than the lookup
prefix it never matches even if it was still lower than maxlen

This also alters a test case to check for this bug.

Signed-off-by: Marcel Röthke <marcel.roethke@haw-hamburg.de>
This commit is contained in:
Marcel Röthke 2019-08-16 16:20:05 +02:00
parent 8659448a01
commit 6641015796
3 changed files with 10 additions and 8 deletions

View File

@ -156,8 +156,10 @@ void bgp_table_range_lookup(const struct bgp_table *table, struct prefix *p,
struct bgp_node *node = bgp_node_from_rnode(table->route_table->top); struct bgp_node *node = bgp_node_from_rnode(table->route_table->top);
struct bgp_node *matched = NULL; struct bgp_node *matched = NULL;
while (node && node->p.prefixlen <= p->prefixlen if (node == NULL)
&& prefix_match(&node->p, p)) { return;
while (node->p.prefixlen <= p->prefixlen && prefix_match(&node->p, p)) {
if (bgp_node_has_bgp_path_info_data(node) if (bgp_node_has_bgp_path_info_data(node)
&& node->p.prefixlen == p->prefixlen) { && node->p.prefixlen == p->prefixlen) {
matched = node; matched = node;
@ -167,10 +169,10 @@ void bgp_table_range_lookup(const struct bgp_table *table, struct prefix *p,
&p->u.prefix, node->p.prefixlen)]); &p->u.prefix, node->p.prefixlen)]);
} }
if (node == NULL) if (matched == NULL && node->p.prefixlen <= maxlen
return; && prefix_match(p, &node->p) && node->parent == NULL)
matched = node;
if ((matched == NULL && node->p.prefixlen > maxlen) || !node->parent) else if ((matched == NULL && node->p.prefixlen > maxlen) || !node->parent)
return; return;
else if (matched == NULL) else if (matched == NULL)
matched = node = bgp_node_from_rnode(node->parent); matched = node = bgp_node_from_rnode(node->parent);

View File

@ -183,7 +183,7 @@ static void test_range_lookup(void)
do_test(table, "16.0.0.0/8", 16, "16.0.0.0/16", NULL); do_test(table, "16.0.0.0/8", 16, "16.0.0.0/16", NULL);
do_test(table, "0.0.0.0/3", 21, "1.16.0.0/16", "1.16.128.0/18", do_test(table, "0.0.0.0/2", 21, "1.16.0.0/16", "1.16.128.0/18",
"1.16.192.0/18", "1.16.64.0/19", "1.16.160.0/19", "1.16.192.0/18", "1.16.64.0/19", "1.16.160.0/19",
"1.16.32.0/20", "1.16.32.0/21", "16.0.0.0/16", NULL); "1.16.32.0/20", "1.16.32.0/21", "16.0.0.0/16", NULL);
} }

View File

@ -3,5 +3,5 @@ import frrtest
class TestTable(frrtest.TestMultiOut): class TestTable(frrtest.TestMultiOut):
program = './test_bgp_table' program = './test_bgp_table'
for i in range(6): for i in range(9):
TestTable.onesimple('Checks successfull') TestTable.onesimple('Checks successfull')