summaryrefslogtreecommitdiffstats
path: root/ffd/ffd.c
diff options
context:
space:
mode:
Diffstat (limited to 'ffd/ffd.c')
-rw-r--r--ffd/ffd.c44
1 files changed, 14 insertions, 30 deletions
diff --git a/ffd/ffd.c b/ffd/ffd.c
index 5e967f3..7af9b29 100644
--- a/ffd/ffd.c
+++ b/ffd/ffd.c
@@ -284,28 +284,6 @@ static void handle_tlv_node_id(const ffd_tlv_node_id_t *tlv_node_id, size_t len,
arg->node_id = tlv_node_id->id;
}
-static ffd_nexthop_t* find_nexthop(const ffd_announce_t *announce, ffd_neigh_t *neigh) {
- ffd_nexthop_t *nexthop;
- for (nexthop = announce->nexthop_list; nexthop; nexthop = nexthop->next) {
- if (nexthop->neigh == neigh)
- return nexthop;
- }
-
- return NULL;
-}
-
-static ffd_nexthop_t* new_nexthop(ffd_announce_t *announce, ffd_neigh_t *neigh) {
- ffd_nexthop_t *nexthop = calloc(1, sizeof(ffd_nexthop_t));
- nexthop->neigh = neigh;
-
- nexthop->next = announce->nexthop_list;
- announce->nexthop_list = nexthop;
-
- ffd_neigh_ref(neigh);
-
- return nexthop;
-}
-
static void handle_tlv_update(const ffd_tlv_update_t *tlv_update, size_t len, handle_tlv_arg_t *arg) {
if (len < sizeof(ffd_tlv_update_t)) {
fprintf(stderr, "warn: received short update TLV.\n");
@@ -329,11 +307,11 @@ static void handle_tlv_update(const ffd_tlv_update_t *tlv_update, size_t len, ha
bool feasible = ffd_is_feasible(announce, ms);
ffd_neigh_t *neigh = get_tlv_neigh(arg);
- ffd_nexthop_t *nexthop = find_nexthop(announce, neigh);
+ ffd_nexthop_t *nexthop = ffd_announce_nexthop_find(announce, neigh);
if (!nexthop) {
if (feasible && tlv_update->metric != 0xffff /* no need to ntohs */)
- nexthop = new_nexthop(announce, neigh);
+ nexthop = ffd_announce_nexthop_new(announce, neigh);
}
else {
if (!feasible && nexthop == announce->selected) {
@@ -397,8 +375,6 @@ static void handle_tlv_seqno_req(const ffd_tlv_seqno_req_t *tlv_req, size_t len,
return;
}
- fprintf(stderr, "debug: received seqno request\n");
-
ffd_announce_t *announce = ffd_announce_find(&tlv_req->node, ntohs(tlv_req->type), ntohs(tlv_req->key));
if (!announce) {
@@ -416,21 +392,28 @@ static void handle_tlv_seqno_req(const ffd_tlv_seqno_req_t *tlv_req, size_t len,
if (announce->selected->neigh == neigh)
return;
- if ((int16_t)(ntohs(tlv_req->seqno)-announce->selected->metric_seqno.seqno) <= 0) {
+ uint16_t seqno = ntohs(tlv_req->seqno);
+
+ if ((int16_t)(seqno-announce->selected->metric_seqno.seqno) <= 0) {
fprintf(stderr, "debug: received seqno request, seqno already ok\n");
ffd_send_update(NULL, neigh, announce, false);
return;
}
if (!announce->selected->neigh) {
- fprintf(stderr, "debug: incrementing seqno\n");
+ fprintf(stderr, "debug: received seqno request, incrementing seqno\n");
announce->selected->metric_seqno.seqno++;
ffd_send_update(NULL, neigh, announce, false);
return;
}
- fprintf(stderr, "debug: received seqno request, forwarding\n");
- ffd_send_seqno_request(announce->selected->neigh, announce, ntohs(tlv_req->seqno));
+ if (ffd_announce_seqno_request(announce, neigh, seqno)) {
+ fprintf(stderr, "debug: received seqno request, forwarding\n");
+ ffd_send_seqno_request(announce->selected->neigh, announce, seqno);
+ }
+ else {
+ fprintf(stderr, "debug: received seqno request, not forwarding again\n");
+ }
}
static void handle_tlv(ffd_tlv_type_t type, const void *data, size_t len, void *arg) {
@@ -547,6 +530,7 @@ static void maintenance(void) {
if (!announce->nexthop_list) {
*cur = *next;
next = cur;
+ ffd_announce_seqno_request_free_list(announce);
free(announce);
continue;