From e10b15d3956d4b98c88d77b5a1dd18efb5030cb0 Mon Sep 17 00:00:00 2001 From: Maria Matejka Date: Tue, 7 May 2024 00:04:01 +0200 Subject: [PATCH] TMP --- nest/rt-table.c | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/nest/rt-table.c b/nest/rt-table.c index 4707c2a5..32709fb7 100644 --- a/nest/rt-table.c +++ b/nest/rt-table.c @@ -948,43 +948,47 @@ channel_notify_accepted(void *_channel) rte * rt_export_merged(struct channel *c, const struct rt_export_feed *feed, linpool *pool, int silent) { - _Thread_local static rte rloc; - - int refeeding = !silent && channel_net_is_refeeding(c, n); - - if (refeeding) - channel_net_mark_refed(c, n); + _Bool feeding = !silent && rt_net_is_feeding(&c->out_req, feed->ni->addr); // struct proto *p = c->proto; struct nexthop_adata *nhs = NULL; - const rte *best0 = feed[0]; + rte *best0 = feed->block[0]; rte *best = NULL; + /* First route is obsolete */ + if (best0->flags & REF_OBSOLETE) + return NULL; + + /* First route is invalid */ if (!rte_is_valid(best0)) return NULL; /* Already rejected, no need to re-run the filter */ - if (!refeeding && bmap_test(&c->export_reject_map, best0->id)) + if (!feeding && bmap_test(&c->export_reject_map, best0->id)) return NULL; - rloc = *best0; - best = export_filter(c, &rloc, silent); + best = export_filter(c, best0, silent); + /* Best route doesn't pass the filter */ if (!best) - /* Best route doesn't pass the filter */ return NULL; + /* Unreachable routes can't be merged */ if (!rte_is_reachable(best)) - /* Unreachable routes can't be merged */ return best; - for (uint i = 1; i < count; i++) + for (uint i = 1; i < feed->count_routes; i++) { - if (!rte_mergable(best0, feed[i])) + rte *r = &feed->block[i]; + + /* Obsolete routes can't be merged */ + if (r->flags & REF_OBSOLETE) + break; + + if (!rte_mergable(best0, r)) continue; - rte tmp0 = *feed[i]; - rte *tmp = export_filter(c, &tmp0, !refeeding); + rte *tmp = export_filter(c, r, !refeeding); if (!tmp || !rte_is_reachable(tmp)) continue;