diff options
author | Matthias Schiffer <mschiffer@universe-factory.net> | 2012-10-05 04:26:02 +0200 |
---|---|---|
committer | Matthias Schiffer <mschiffer@universe-factory.net> | 2012-10-05 04:26:02 +0200 |
commit | bb7392551ed8578171941b81cf3ed2cfc4ad2b1b (patch) | |
tree | 3b0573ddba0befc829c460ee56e905f0ba2d64f2 /ffd/announce.c | |
parent | b760b28c21515265f8d09c46011290a9a22b871e (diff) | |
download | ffd-bb7392551ed8578171941b81cf3ed2cfc4ad2b1b.tar ffd-bb7392551ed8578171941b81cf3ed2cfc4ad2b1b.zip |
Lots of update handling
Diffstat (limited to 'ffd/announce.c')
-rw-r--r-- | ffd/announce.c | 42 |
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; |