mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-08-15 03:27:25 +00:00
Merge pull request #4841 from rtrlib/2019-08-16-bugfix-master
bgpd: rpki fixes (master)
This commit is contained in:
commit
604321440e
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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')
|
||||
|
Loading…
Reference in New Issue
Block a user