From 4a4482017978e360a0ae1ca7645e5e9e084c92b4 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Tue, 2 Oct 2012 23:13:00 +0200 Subject: Add data structures to store announcements and partly implement updates --- ffd/announce.c | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 ffd/announce.c (limited to 'ffd/announce.c') diff --git a/ffd/announce.c b/ffd/announce.c new file mode 100644 index 0000000..eade2f1 --- /dev/null +++ b/ffd/announce.c @@ -0,0 +1,83 @@ +/* + Copyright (c) 2012, Matthias Schiffer + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#include "ffd.h" + + +static bool is_feasable(const ffd_announce_t *announce, const ffd_nexthop_t *nexthop) { + if (FFD_IS_INFINITY(announce->feasability_distance)) + return true; + + int16_t seqno_diff = nexthop->metric_seqno.seqno - announce->feasability_distance.seqno; + + if (seqno_diff < 0) + return true; + if (seqno_diff == 0 && nexthop->metric_seqno.metric < announce->feasability_distance.metric) + return true; + + return false; +} + +static ffd_nexthop_t* select_nexthop(const ffd_announce_t *announce) { + ffd_nexthop_t *ret = NULL; + + ffd_nexthop_t *nexthop; + for (nexthop = announce->nexthop_list->next; nexthop; nexthop = nexthop->next) { + if (is_feasable(announce, nexthop)) + continue; + + int16_t seqno_diff = nexthop->metric_seqno.seqno - ret->metric_seqno.seqno; + + if (nexthop->metric_seqno.metric < ret->metric_seqno.metric + || (nexthop->metric_seqno.metric == ret->metric_seqno.metric && seqno_diff < 0)) { + ret = nexthop; + } + } + + return ret; +} + +ffd_metric_seqno_t ffd_announce_get_metric(const ffd_announce_t *announce) { + ffd_nexthop_t *nexthop = select_nexthop(announce); + + if (nexthop) + return nexthop->metric_seqno; + else + return (ffd_metric_seqno_t){0xffff, 0}; +} + + +ffd_announce_t* ffd_announce_new(size_t len) { + ffd_announce_t *a = calloc(1, sizeof(ffd_announce_t)+len); + + a->len = len; + a->feasability_distance = (ffd_metric_seqno_t){0xffff, 0}; + + a->next = announce_list; + announce_list = a; + + return a; +} -- cgit v1.2.3