summaryrefslogtreecommitdiff
path: root/nest/rt-table.c
diff options
context:
space:
mode:
authorMaria Matejka <mq@ucw.cz>2022-09-21 18:43:44 +0200
committerMaria Matejka <mq@ucw.cz>2022-09-21 18:47:43 +0200
commitb1ade5efa1164e42ff62cb0f242774cc9b47886d (patch)
tree3c7ec96748e1a1f1df056214d2cb21d2538b69c2 /nest/rt-table.c
parentf51837ace6bfa357f45c6bb5f573fd61a3f1f039 (diff)
Fixed the export settle timer to be actually a settle timer
Diffstat (limited to 'nest/rt-table.c')
-rw-r--r--nest/rt-table.c36
1 files changed, 16 insertions, 20 deletions
diff --git a/nest/rt-table.c b/nest/rt-table.c
index b8dc6866..051bc949 100644
--- a/nest/rt-table.c
+++ b/nest/rt-table.c
@@ -1423,9 +1423,9 @@ rt_send_export_event(struct rt_export_hook *hook)
}
static void
-rt_announce_exports(timer *tm)
+rt_announce_exports(struct settle *s)
{
- RT_LOCKED((rtable *) tm->data, tab)
+ RT_LOCKED(RT_PUB(SKIP_BACK(struct rtable_private, export_settle, s)), tab)
if (!EMPTY_LIST(tab->exporter.pending))
{
struct rt_export_hook *c; node *n;
@@ -1440,13 +1440,6 @@ rt_announce_exports(timer *tm)
}
static void
-rt_kick_announce_exports(struct rtable_private *tab)
-{
- if (!tm_active(tab->export_timer))
- tm_start_in(tab->export_timer, tab->config->export_settle_time, tab->loop);
-}
-
-static void
rt_import_announce_exports(void *_hook)
{
struct rt_import_hook *hook = _hook;
@@ -2521,7 +2514,7 @@ rt_flag_handler(struct birdloop_flag_handler *fh, u32 flags)
rt_next_hop_update(tab);
if (flags & RTF_EXPORT)
- rt_kick_announce_exports(tab);
+ settle_kick(&tab->export_settle, tab->loop);
if (flags & RTF_CLEANUP)
{
@@ -2789,10 +2782,11 @@ rt_setup(pool *pp, struct rtable_config *cf)
t->fh = (struct birdloop_flag_handler) { .hook = rt_flag_handler, };
t->nhu_uncork_event = ev_new_init(p, rt_nhu_uncork, t);
- t->export_timer = tm_new_init(p, rt_announce_exports, t, 0, 0);
t->prune_timer = tm_new_init(p, rt_prune_timer, t, 0, 0);
t->last_rt_change = t->gc_time = current_time();
+ t->export_settle = SETTLE_INIT(&cf->export_settle, rt_announce_exports, NULL);
+
t->exporter = (struct rt_table_exporter) {
.e = {
.class = &rt_table_exporter_class,
@@ -2944,8 +2938,7 @@ again:
FIB_ITERATE_END;
rt_trace(tab, D_EVENTS, "Prune done, scheduling export timer");
- if (!tm_active(tab->export_timer))
- tm_start_in(tab->export_timer, tab->config->export_settle_time, tab->loop);
+ settle_kick(&tab->export_settle, tab->loop);
#ifdef DEBUGGING
fib_check(&tab->fib);
@@ -3172,7 +3165,7 @@ done:;
birdloop_flag(tab->loop, RTF_CLEANUP);
if (EMPTY_LIST(tab->exporter.pending))
- tm_stop(tab->export_timer);
+ settle_cancel(&tab->export_settle);
}
static void
@@ -3806,9 +3799,8 @@ rt_next_hop_update(struct rtable_private *tab)
{
rt_trace(tab, D_STATES, "Next hop updater corked");
if ((tab->nhu_state & NHU_RUNNING)
- && !EMPTY_LIST(tab->exporter.pending)
- && !tm_active(tab->export_timer))
- tm_start_in(tab->export_timer, tab->config->export_settle_time, tab->loop);
+ && !EMPTY_LIST(tab->exporter.pending))
+ settle_kick(&tab->export_settle, tab->loop);
tab->nhu_corked = tab->nhu_state;
tab->nhu_state = 0;
@@ -3846,9 +3838,7 @@ rt_next_hop_update(struct rtable_private *tab)
/* Finished NHU, cleanup */
rt_trace(tab, D_EVENTS, "NHU done, scheduling export timer");
-
- if (!tm_active(tab->export_timer))
- tm_start_in(tab->export_timer, tab->config->export_settle_time, tab->loop);
+ settle_kick(&tab->export_settle, tab->loop);
/* State change:
* NHU_DIRTY -> NHU_SCHEDULED
@@ -3900,6 +3890,10 @@ rt_new_table(struct symbol *s, uint addr_type)
c->gc_period = (uint) -1; /* set in rt_postconfig() */
c->cork_threshold.low = 128;
c->cork_threshold.high = 512;
+ c->export_settle = (struct settle_config) {
+ .min = 1 MS,
+ .max = 100 MS,
+ };
c->debug = new_config->table_debug;
add_tail(&new_config->tables, &c->n);
@@ -4011,6 +4005,8 @@ rt_reconfigure(struct rtable_private *tab, struct rtable_config *new, struct rta
tab->name = new->name;
tab->config = new;
+ tab->export_settle.cf = new->export_settle;
+
if (tab->hostcache)
tab->hostcache->req.trace_routes = new->debug;