Merge pull request #4841 from rtrlib/2019-08-16-bugfix-master

bgpd: rpki fixes (master)
This commit is contained in:
Donald Sharp 2019-08-19 09:57:18 -04:00 committed by GitHub
commit 604321440e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 11 additions and 29 deletions

View File

@ -142,7 +142,6 @@ static struct rtr_mgr_config *rtr_config;
static struct list *cache_list;
static int rtr_is_running;
static int rtr_is_stopping;
static int rtr_is_starting;
static _Atomic int rtr_update_overflow;
static int rpki_debug;
static unsigned int polling_period;
@ -478,7 +477,7 @@ static void rpki_update_cb_sync_rtr(struct pfx_table *p __attribute__((unused)),
const struct pfx_record rec,
const bool added __attribute__((unused)))
{
if (rtr_is_stopping || rtr_is_starting
if (rtr_is_stopping
|| atomic_load_explicit(&rtr_update_overflow, memory_order_seq_cst))
return;
@ -570,11 +569,9 @@ static int bgp_rpki_module_init(void)
static int start(void)
{
unsigned int waiting_time = 0;
int ret;
rtr_is_stopping = 0;
rtr_is_starting = 1;
rtr_update_overflow = 0;
if (list_isempty(cache_list)) {
@ -603,23 +600,6 @@ static int start(void)
return ERROR;
}
rtr_is_running = 1;
RPKI_DEBUG("Waiting for rtr connection to synchronize.");
while (waiting_time++ <= initial_synchronisation_timeout) {
if (rtr_mgr_conf_in_sync(rtr_config))
break;
sleep(1);
}
if (rtr_mgr_conf_in_sync(rtr_config)) {
RPKI_DEBUG("Got synchronisation with at least one RPKI cache!");
RPKI_DEBUG("Forcing revalidation.");
rtr_is_starting = 0;
revalidate_all_routes();
} else {
RPKI_DEBUG(
"Timeout expired! Proceeding without RPKI validation data.");
rtr_is_starting = 0;
}
XFREE(MTYPE_BGP_RPKI_CACHE_GROUP, groups);

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 *matched = NULL;
while (node && node->p.prefixlen <= p->prefixlen
&& prefix_match(&node->p, p)) {
if (node == NULL)
return;
while (node->p.prefixlen <= p->prefixlen && prefix_match(&node->p, p)) {
if (bgp_node_has_bgp_path_info_data(node)
&& node->p.prefixlen == p->prefixlen) {
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)]);
}
if (node == NULL)
return;
if ((matched == NULL && node->p.prefixlen > maxlen) || !node->parent)
if (matched == NULL && node->p.prefixlen <= maxlen
&& prefix_match(p, &node->p) && node->parent == NULL)
matched = node;
else if ((matched == NULL && node->p.prefixlen > maxlen) || !node->parent)
return;
else if (matched == NULL)
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, "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.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):
program = './test_bgp_table'
for i in range(6):
for i in range(9):
TestTable.onesimple('Checks successfull')