summaryrefslogtreecommitdiffstats
path: root/ffd/ffd.c
diff options
context:
space:
mode:
Diffstat (limited to 'ffd/ffd.c')
-rw-r--r--ffd/ffd.c56
1 files changed, 40 insertions, 16 deletions
diff --git a/ffd/ffd.c b/ffd/ffd.c
index ee1e3ea..7cc3d3f 100644
--- a/ffd/ffd.c
+++ b/ffd/ffd.c
@@ -320,6 +320,8 @@ static ffd_nexthop_t* new_nexthop(ffd_announce_t *announce, ffd_neigh_t *neigh)
nexthop->next = announce->nexthop_list;
announce->nexthop_list = nexthop;
+ neigh->nexthop_refs++;
+
return nexthop;
}
@@ -475,8 +477,19 @@ static void send_updates(void) {
static void maintenance(void) {
ffd_iface_t *iface;
for (iface = iface_list; iface; iface = iface->next) {
- ffd_neigh_t *neigh;
- for (neigh = iface->neigh_list; neigh; neigh = neigh->next) {
+ ffd_neigh_t **cur, **next;
+ for (cur = &iface->neigh_list; *cur; cur = next) {
+ ffd_neigh_t *neigh = *cur;
+ next = &neigh->next;
+
+ if (ffd_neigh_get_rxcost(neigh) == 0xffff && ffd_neigh_get_txcost(neigh) == 0xffff && !neigh->nexthop_refs) {
+ *cur = *next;
+ next = cur;
+ free(neigh);
+
+ continue;
+ }
+
fprintf(stderr, "debug: maintenance: %02x:%02x:%02x:%02x:%02x:%02x[%s]: %u (rx %u/tx %u)\n",
neigh->addr.d[0], neigh->addr.d[1], neigh->addr.d[2],
neigh->addr.d[3], neigh->addr.d[4], neigh->addr.d[5],
@@ -484,28 +497,39 @@ static void maintenance(void) {
}
}
- ffd_announce_t *announce;
- for (announce = announce_list; announce; announce = announce->next) {
+ ffd_announce_t **cur, **next;
+ for (cur = &announce_list; *cur; cur = next) {
+ ffd_announce_t *announce = *cur;
+ next = &announce->next;
+
ffd_announce_update(announce);
- fprintf(stderr, "debug: maintenance: node %04x%04x, type %04x, announce %04x: ", ntohl(*(uint32_t*)announce->node.id), ntohl(*(uint32_t*)(announce->node.id+4)), announce->type, announce->key);
+ if (!announce->nexthop_list) {
+ *cur = *next;
+ next = cur;
+ free(announce);
- if (!announce->selected) {
- fprintf(stderr, "nexthop: none\n");
continue;
}
- ffd_neigh_t *neigh = announce->selected->neigh;
+ fprintf(stderr, "debug: node %04x%04x, type %04x, announce %04x (%u, seqno=%04x):\n",
+ ntohl(*(uint32_t*)announce->node.id), ntohl(*(uint32_t*)(announce->node.id+4)), announce->type, announce->key, announce->metric.metric, announce->metric.seqno);
- if (!neigh) {
- fprintf(stderr, "local\n");
- continue;
- }
+ ffd_nexthop_t *nexthop;
+ for (nexthop = announce->nexthop_list; nexthop; nexthop = nexthop->next) {
+ ffd_neigh_t *neigh = nexthop->neigh;
+
+ if (!neigh) {
+ fprintf(stderr, "\tlocal\n");
+ continue;
+ }
- fprintf(stderr, "nexthop: %02x:%02x:%02x:%02x:%02x:%02x (%u, seqno=%04x)\n",
- neigh->addr.d[0], neigh->addr.d[1], neigh->addr.d[2],
- neigh->addr.d[3], neigh->addr.d[4], neigh->addr.d[5],
- announce->metric.metric, announce->metric.seqno);
+ fprintf(stderr, "\tnexthop: %02x:%02x:%02x:%02x:%02x:%02x (%u, seqno=%04x, cost=%u%s)\n",
+ neigh->addr.d[0], neigh->addr.d[1], neigh->addr.d[2],
+ neigh->addr.d[3], neigh->addr.d[4], neigh->addr.d[5],
+ nexthop->metric_seqno.metric, nexthop->metric_seqno.seqno, ffd_neigh_get_cost(neigh),
+ (nexthop == announce->selected) ? ", selected" : "");
+ }
}
}