From 030044b2f693179e348844d01366e1bcd4e90dc2 Mon Sep 17 00:00:00 2001 From: Maria Matejka Date: Fri, 10 May 2024 16:14:54 +0200 Subject: [PATCH] OSPF partial reload never worked properly, running full reload always --- proto/ospf/ospf.c | 5 +++-- proto/ospf/ospf.h | 1 - proto/ospf/rt.c | 15 +-------------- 3 files changed, 4 insertions(+), 17 deletions(-) diff --git a/proto/ospf/ospf.c b/proto/ospf/ospf.c index ea6739da..77ff3f5f 100644 --- a/proto/ospf/ospf.c +++ b/proto/ospf/ospf.c @@ -436,8 +436,9 @@ static int ospf_reload_routes(struct channel *C, struct channel_import_request *cir) { struct ospf_proto *p = (struct ospf_proto *) C->proto; - cir->next = p->cir; - p->cir = cir; + + if (cir) + CALL(cir->done, cir); if (p->calcrt == 2) return 1; diff --git a/proto/ospf/ospf.h b/proto/ospf/ospf.h index 9314b4d3..91204667 100644 --- a/proto/ospf/ospf.h +++ b/proto/ospf/ospf.h @@ -219,7 +219,6 @@ struct ospf_proto slist lsal; /* List of all LSA's */ int calcrt; /* Routing table calculation scheduled? 0=no, 1=normal, 2=forced reload */ - struct channel_import_request *cir; /* Struct with trie for partial reload */ list iface_list; /* List of OSPF interfaces (struct ospf_iface) */ list area_list; /* List of OSPF areas (struct ospf_area) */ int areano; /* Number of area I belong to */ diff --git a/proto/ospf/rt.c b/proto/ospf/rt.c index 27564cfe..40c30b81 100644 --- a/proto/ospf/rt.c +++ b/proto/ospf/rt.c @@ -1696,8 +1696,7 @@ ospf_rt_spf(struct ospf_proto *p) rt_sync(p); lp_flush(p->nhpool); - if (p->cir == NULL) /* If there is no more cir waiting for reload */ - p->calcrt = 0; + p->calcrt = 0; } @@ -2017,16 +2016,11 @@ rt_sync(struct ospf_proto *p) OSPF_TRACE(D_EVENTS, "Starting routing table synchronization"); - struct channel_import_request *cir = p->cir; - p->cir = NULL; - DBG("Now syncing my rt table with nest's\n"); FIB_ITERATE_INIT(&fit, fib); again1: FIB_ITERATE_START(fib, &fit, ort, nf) { - if (cir && !channel_import_request_prefilter(cir, nf->fn.addr)) - continue; /* Sanity check of next-hop addresses, failure should not happen */ if (nf->n.type && nf->n.nhs) { @@ -2126,13 +2120,6 @@ again1: } FIB_ITERATE_END; - while(cir) - { - struct channel_import_request *next = cir->next; - cir->done(cir); - cir = next; - } - WALK_LIST(oa, p->area_list) { /* Cleanup ASBR hash tables */