From 5282ddbde381fac95b2976ab0c323c1358e74174 Mon Sep 17 00:00:00 2001 From: Maria Matejka Date: Fri, 10 May 2024 16:52:27 +0200 Subject: [PATCH] Now fix linker, hopefully only --- nest/protocol.h | 16 -------- proto/rip/rip.c | 8 ++-- proto/static/static.c | 12 +++--- sysdep/unix/krt.c | 92 ++++++++++++++++++++++++++----------------- 4 files changed, 65 insertions(+), 63 deletions(-) diff --git a/nest/protocol.h b/nest/protocol.h index 7eb8f1a1..ce1ddc99 100644 --- a/nest/protocol.h +++ b/nest/protocol.h @@ -676,22 +676,6 @@ static inline void channel_init(struct channel *c) { channel_set_state(c, CS_STA static inline void channel_open(struct channel *c) { channel_set_state(c, CS_UP); } static inline void channel_close(struct channel *c) { channel_set_state(c, CS_STOP); } -#if 0 -void channel_request_feeding(struct channel *c, struct channel_feeding_request *); -void channel_request_feeding_dynamic(struct channel *c); - -static inline int channel_net_is_refeeding(struct channel *c, const net_addr *n) -{ - /* Refeeding if matching any request */ - for (struct channel_feeding_request *cfr = c->refeeding; cfr; cfr = cfr->next) - if (!cfr->trie || trie_match_net(cfr->trie, n)) - return 1; - - /* Not matching any request */ - return 0; -} -#endif - void channel_request_reload(struct channel *c, struct rt_feeding_request *cir); void channel_request_full_refeed(struct channel *c); diff --git a/proto/rip/rip.c b/proto/rip/rip.c index 8c748123..1d4e6cf5 100644 --- a/proto/rip/rip.c +++ b/proto/rip/rip.c @@ -1109,13 +1109,13 @@ rip_trigger_update(struct rip_proto *p) */ static int -rip_reload_routes(struct channel *C, struct channel_import_request *cir) +rip_reload_routes(struct channel *C, struct rt_feeding_request *rfr) { struct rip_proto *p = (struct rip_proto *) C->proto; /* Always reload full */ - if (cir) - CALL(cir->done, cir); + if (rfr) + CALL(rfr->done, rfr); if (p->rt_reload) return 1; @@ -1169,8 +1169,6 @@ rip_init(struct proto_config *CF) P->iface_sub.neigh_notify = rip_neigh_notify; P->reload_routes = rip_reload_routes; P->sources.class = &rip_rte_owner_class; - P->feed_begin = rip_feed_begin; - P->feed_end = rip_feed_end; return P; } diff --git a/proto/static/static.c b/proto/static/static.c index aa3f7bac..f8106b20 100644 --- a/proto/static/static.c +++ b/proto/static/static.c @@ -190,13 +190,13 @@ static_mark_all(struct static_proto *p) } static void -static_mark_partial(struct static_proto *p, struct channel_import_request *cir) +static_mark_partial(struct static_proto *p, struct rt_feeding_request *rfr) { struct static_config *cf = (void *) p->p.cf; struct static_route *r; WALK_LIST(r, cf->routes) - if (r->state == SRS_CLEAN && trie_match_net(cir->trie, r->net)) + if (r->state == SRS_CLEAN && (!rfr || rt_prefilter_net(&rfr->prefilter, r->net))) { r->state = SRS_DIRTY; BUFFER_PUSH(p->marked) = r; @@ -205,7 +205,7 @@ static_mark_partial(struct static_proto *p, struct channel_import_request *cir) if (!ev_active(p->event)) ev_schedule(p->event); - cir->done(cir); + rfr->done(rfr); } @@ -432,14 +432,14 @@ static_bfd_notify(struct bfd_request *req) } static int -static_reload_routes(struct channel *C, struct channel_import_request *cir) +static_reload_routes(struct channel *C, struct rt_feeding_request *rfr) { struct static_proto *p = (void *) C->proto; TRACE(D_EVENTS, "Scheduling route reload"); - if (cir->trie) - static_mark_partial(p, cir); + if (rfr) + static_mark_partial(p, rfr); else static_mark_all(p); diff --git a/sysdep/unix/krt.c b/sysdep/unix/krt.c index 9264cdc9..0672ae09 100644 --- a/sysdep/unix/krt.c +++ b/sysdep/unix/krt.c @@ -466,6 +466,27 @@ krt_init_scan(struct krt_proto *p) case KPS_FLUSHING: bug("Can't scan, flushing"); } + + bug("Bad kernel sync state"); +} + +struct krt_export_refeed_request { + struct rt_feeding_request rfr; + struct krt_proto *p; +}; + +static void +krt_pruning_fed(struct rt_feeding_request *rfr) +{ + SKIP_BACK_DECLARE(struct krt_export_refeed_request, kerr, rfr, rfr); + struct krt_proto *p = kerr->p; + + ASSERT_DIE(p->sync_state == KPS_PRUNING); + + KRT_TRACE(p, D_EVENTS, "Table %s pruned", p->p.main_channel->table->name); + p->sync_state = KPS_IDLE; + + mb_free(kerr); } static void @@ -480,7 +501,13 @@ krt_prune(struct krt_proto *p) p->sync_state = KPS_PRUNING; KRT_TRACE(p, D_EVENTS, "Pruning table %s", p->p.main_channel->table->name); rt_refresh_end(&p->p.main_channel->in_req); - channel_request_feeding_dynamic(p->p.main_channel, CFRT_DIRECT); + + struct krt_export_refeed_request *kerr = mb_alloc(p->p.pool, sizeof *kerr); + *kerr = (struct krt_export_refeed_request) { + .rfr.done = krt_pruning_fed, + .p = p, + }; + rt_export_refeed(&p->p.main_channel->out_req, &kerr->rfr); return; case KPS_PRUNING: @@ -716,60 +743,33 @@ krt_if_notify(struct proto *P, uint flags, struct iface *iface UNUSED) } static int -krt_reload_routes(struct channel *C, struct channel_import_request *cir) +krt_reload_routes(struct channel *C, struct rt_feeding_request *rfr) { struct krt_proto *p = (void *) C->proto; - - if (cir->trie) - { - cir->done(cir); - return 0; - } - - /* Although we keep learned routes in krt_table, we rather schedule a scan */ - if (KRT_CF->learn) { p->reload = 1; krt_scan_timer_kick(p); } - cir->done(cir); + if (rfr) + CALL(rfr->done, rfr); + return 1; } static void krt_cleanup(struct krt_proto *p); static void -krt_feed_end(struct channel *C) +krt_export_fed(struct channel *C) { struct krt_proto *p = (void *) C->proto; - if (C->refeeding && C->refeed_req.hook) - return; - p->ready = 1; p->initialized = 1; - switch (p->sync_state) - { - case KPS_PRUNING: - KRT_TRACE(p, D_EVENTS, "Table %s pruned", C->table->name); - p->sync_state = KPS_IDLE; - return; - - case KPS_IDLE: - case KPS_SCANNING: - krt_scan_timer_kick(p); - return; - - case KPS_FLUSHING: - krt_do_scan(p); - krt_cleanup(p); - proto_notify_state(&p->p, PS_DOWN); - return; - } + krt_scan_timer_kick(p); } static int @@ -837,7 +837,7 @@ krt_init(struct proto_config *CF) p->p.rt_notify = krt_rt_notify; p->p.iface_sub.if_notify = krt_if_notify; p->p.reload_routes = krt_reload_routes; - p->p.feed_end = krt_feed_end; + p->p.export_fed = krt_export_fed; p->p.sources.class = &krt_rte_owner_class; @@ -879,6 +879,20 @@ krt_start(struct proto *P) return PS_UP; } +static void +krt_flushing_done(struct rt_feeding_request *rfr) +{ + SKIP_BACK_DECLARE(struct krt_export_refeed_request, kerr, rfr, rfr); + struct krt_proto *p = kerr->p; + mb_free(kerr); + + ASSERT_DIE(p->sync_state == KPS_FLUSHING); + + krt_do_scan(p); + krt_cleanup(p); + proto_notify_state(&p->p, PS_DOWN); +} + static int krt_shutdown(struct proto *P) { @@ -893,7 +907,13 @@ krt_shutdown(struct proto *P) if (p->initialized && !KRT_CF->persist && (P->down_code != PDC_CMD_GR_DOWN)) { p->sync_state = KPS_FLUSHING; - channel_request_feeding_dynamic(p->p.main_channel, CFRT_AUXILIARY); + + struct krt_export_refeed_request *kerr = mb_alloc(p->p.pool, sizeof *kerr); + *kerr = (struct krt_export_refeed_request) { + .rfr.done = krt_flushing_done, + .p = p, + }; + rt_export_refeed(&p->p.main_channel->out_req, &kerr->rfr); /* Keeping the protocol UP until the feed-to-flush is done */ return PS_UP;