summaryrefslogtreecommitdiffstats
path: root/ffd/announce.c
diff options
context:
space:
mode:
Diffstat (limited to 'ffd/announce.c')
-rw-r--r--ffd/announce.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/ffd/announce.c b/ffd/announce.c
index ae0a406..0d7b1bc 100644
--- a/ffd/announce.c
+++ b/ffd/announce.c
@@ -115,6 +115,15 @@ void ffd_announce_update(ffd_announce_t *announce) {
announce->selected = select_nexthop(announce);
announce->metric = get_metric(announce);
+
+ /* triggered updates */
+ int diff = announce->metric.metric - announce->last_metric;
+
+ if (((announce->last_metric == 0xffff) != (announce->metric.metric == 0xffff))
+ || diff <= -1024 || diff >= 384) {
+ fprintf(stderr, "info: announce metric has changed significantly, sending updates\n");
+ ffd_send_update(NULL, NULL, announce, false);
+ }
}
void ffd_announce_update_nexthop(ffd_announce_t *announce, ffd_nexthop_t *nexthop, ffd_metric_seqno_t ms, uint16_t interval) {
@@ -131,7 +140,7 @@ void ffd_announce_update_nexthop(ffd_announce_t *announce, ffd_nexthop_t *nextho
ffd_announce_t* ffd_announce_new(void) {
ffd_announce_t *a = calloc(1, sizeof(ffd_announce_t));
- a->metric.metric = a->feasibility_distance.metric = 0xffff;
+ a->metric.metric = a->feasibility_distance.metric = a->last_metric = 0xffff;
a->next = announce_list;
announce_list = a;