summaryrefslogtreecommitdiffstats
path: root/ffd/announce.c
diff options
context:
space:
mode:
Diffstat (limited to 'ffd/announce.c')
-rw-r--r--ffd/announce.c42
1 files changed, 24 insertions, 18 deletions
diff --git a/ffd/announce.c b/ffd/announce.c
index eade2f1..4e8e07a 100644
--- a/ffd/announce.c
+++ b/ffd/announce.c
@@ -25,35 +25,37 @@
#include "ffd.h"
+#include "neigh.h"
-static bool is_feasable(const ffd_announce_t *announce, const ffd_nexthop_t *nexthop) {
- if (FFD_IS_INFINITY(announce->feasability_distance))
+bool ffd_is_feasable(const ffd_announce_t *announce, ffd_metric_seqno_t ms) {
+ if (FFD_IS_INFINITY(ms) || FFD_IS_INFINITY(announce->feasability_distance))
return true;
- int16_t seqno_diff = nexthop->metric_seqno.seqno - announce->feasability_distance.seqno;
+ int16_t seqno_diff = ms.seqno - announce->feasability_distance.seqno;
if (seqno_diff < 0)
return true;
- if (seqno_diff == 0 && nexthop->metric_seqno.metric < announce->feasability_distance.metric)
+ if (seqno_diff == 0 && ms.metric < announce->feasability_distance.metric)
return true;
return false;
}
static ffd_nexthop_t* select_nexthop(const ffd_announce_t *announce) {
+ uint16_t ret_metric = 0xffff;
ffd_nexthop_t *ret = NULL;
ffd_nexthop_t *nexthop;
- for (nexthop = announce->nexthop_list->next; nexthop; nexthop = nexthop->next) {
- if (is_feasable(announce, nexthop))
+ for (nexthop = announce->nexthop_list; nexthop; nexthop = nexthop->next) {
+ if (!ffd_is_feasable(announce, nexthop->metric_seqno))
continue;
- int16_t seqno_diff = nexthop->metric_seqno.seqno - ret->metric_seqno.seqno;
+ uint32_t metric = nexthop->metric_seqno.metric + ffd_neigh_get_cost(nexthop->neigh);
- if (nexthop->metric_seqno.metric < ret->metric_seqno.metric
- || (nexthop->metric_seqno.metric == ret->metric_seqno.metric && seqno_diff < 0)) {
+ if (metric < ret_metric) {
ret = nexthop;
+ ret_metric = metric;
}
}
@@ -61,20 +63,24 @@ static ffd_nexthop_t* select_nexthop(const ffd_announce_t *announce) {
}
ffd_metric_seqno_t ffd_announce_get_metric(const ffd_announce_t *announce) {
- ffd_nexthop_t *nexthop = select_nexthop(announce);
+ if (announce->selected) {
+ uint32_t metric = announce->selected->metric_seqno.metric + ffd_neigh_get_cost(announce->selected->neigh);
- if (nexthop)
- return nexthop->metric_seqno;
- else
- return (ffd_metric_seqno_t){0xffff, 0};
+ if (metric < 0xffff)
+ return (ffd_metric_seqno_t){metric, announce->selected->metric_seqno.seqno};
+ }
+
+ return (ffd_metric_seqno_t){0xffff, 0};
}
+void ffd_announce_update_nexthop(ffd_announce_t *announce) {
+ announce->selected = select_nexthop(announce);
+}
-ffd_announce_t* ffd_announce_new(size_t len) {
- ffd_announce_t *a = calloc(1, sizeof(ffd_announce_t)+len);
+ffd_announce_t* ffd_announce_new(void) {
+ ffd_announce_t *a = calloc(1, sizeof(ffd_announce_t));
- a->len = len;
- a->feasability_distance = (ffd_metric_seqno_t){0xffff, 0};
+ a->feasability_distance.metric = 0xffff;
a->next = announce_list;
announce_list = a;