93 lines
3.2 KiB
C
93 lines
3.2 KiB
C
/*
|
|
Copyright (c) 2013, Matthias Schiffer <mschiffer@universe-factory.net>
|
|
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 "babel.h"
|
|
#include "neigh.h"
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
gp_babel_announce_t* gp_babel_announce_new(gmrf_t *gmrf, gmrf_context_t *ctx) {
|
|
gp_babel_announce_t *a = calloc(1, sizeof(gp_babel_announce_t));
|
|
|
|
a->metric.metric = a->feasibility_distance.metric = a->last_metric = 0xffff;
|
|
|
|
a->next = ctx->announces;
|
|
ctx->announces = a;
|
|
|
|
return a;
|
|
}
|
|
|
|
gp_babel_announce_t* gp_babel_announce_find(gmrf_t *gmrf, gmrf_context_t *ctx, const gp_babel_node_id_t *node, uint16_t type, uint16_t key) {
|
|
gp_babel_announce_t *announce;
|
|
for (announce = ctx->announces; announce; announce = announce->next) {
|
|
if (gp_babel_node_id_equal(&announce->node, node)
|
|
&& announce->type == type
|
|
&& announce->key == key)
|
|
return announce;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
gp_babel_announce_t* gp_babel_announce_get(gmrf_t *gmrf, gmrf_context_t *ctx, const gp_babel_node_id_t *node, uint16_t type, uint16_t key) {
|
|
gp_babel_announce_t *announce = gp_babel_announce_find(gmrf, ctx, node, type, key);
|
|
|
|
if (!announce) {
|
|
announce = gp_babel_announce_new(gmrf, ctx);
|
|
announce->node = *node;
|
|
announce->type = type;
|
|
announce->key = key;
|
|
}
|
|
|
|
return announce;
|
|
}
|
|
|
|
void gp_babel_announce_free(gmrf_t *gmrf, gmrf_context_t *ctx, gp_babel_announce_t *announce) {
|
|
free(announce);
|
|
}
|
|
|
|
gp_babel_nexthop_t* gp_babel_announce_nexthop_find(const gp_babel_announce_t *announce, gp_babel_neigh_t *neigh) {
|
|
gp_babel_nexthop_t *nexthop;
|
|
for (nexthop = announce->nexthops; nexthop; nexthop = nexthop->next) {
|
|
if (nexthop->neigh == neigh)
|
|
return nexthop;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
gp_babel_nexthop_t* gp_babel_announce_nexthop_new(gp_babel_announce_t *announce, gp_babel_neigh_t *neigh) {
|
|
gp_babel_nexthop_t *nexthop = calloc(1, sizeof(gp_babel_nexthop_t));
|
|
nexthop->neigh = neigh;
|
|
|
|
nexthop->next = announce->nexthops;
|
|
announce->nexthops = nexthop;
|
|
|
|
gp_babel_neigh_ref(neigh);
|
|
|
|
return nexthop;
|
|
}
|