Improve update handling
This commit is contained in:
parent
39df74a428
commit
cebdfe45e9
3 changed files with 23 additions and 21 deletions
|
@ -73,10 +73,20 @@ ffd_metric_seqno_t ffd_announce_get_metric(const ffd_announce_t *announce) {
|
||||||
return (ffd_metric_seqno_t){0xffff, 0};
|
return (ffd_metric_seqno_t){0xffff, 0};
|
||||||
}
|
}
|
||||||
|
|
||||||
void ffd_announce_update_nexthop(ffd_announce_t *announce) {
|
static inline void update_selected(ffd_announce_t *announce) {
|
||||||
announce->selected = select_nexthop(announce);
|
announce->selected = select_nexthop(announce);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ffd_announce_update(ffd_announce_t *announce, ffd_nexthop_t *nexthop, ffd_metric_seqno_t ms, uint16_t interval) {
|
||||||
|
nexthop->metric_seqno = ms;
|
||||||
|
nexthop->interval = interval;
|
||||||
|
|
||||||
|
if (ms.metric != 0xffff)
|
||||||
|
nexthop->last_update = now;
|
||||||
|
|
||||||
|
update_selected(announce);
|
||||||
|
}
|
||||||
|
|
||||||
ffd_announce_t* ffd_announce_new(void) {
|
ffd_announce_t* ffd_announce_new(void) {
|
||||||
ffd_announce_t *a = calloc(1, sizeof(ffd_announce_t));
|
ffd_announce_t *a = calloc(1, sizeof(ffd_announce_t));
|
||||||
|
|
||||||
|
|
30
ffd/ffd.c
30
ffd/ffd.c
|
@ -347,28 +347,14 @@ static void handle_tlv_update(const ffd_tlv_update_t *tlv_update, size_t len, ha
|
||||||
ffd_nexthop_t *nexthop = find_nexthop(announce, neigh);
|
ffd_nexthop_t *nexthop = find_nexthop(announce, neigh);
|
||||||
|
|
||||||
if (!nexthop) {
|
if (!nexthop) {
|
||||||
if (!feasible || tlv_update->metric == 0xffff /* no need to ntohs */)
|
if (feasible && tlv_update->metric != 0xffff /* no need to ntohs */)
|
||||||
return;
|
nexthop = new_nexthop(announce, neigh);
|
||||||
|
|
||||||
nexthop = new_nexthop(announce, neigh);
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (!feasible && nexthop == announce->selected)
|
if (!feasible && nexthop == announce->selected)
|
||||||
return;
|
nexthop = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
nexthop->metric_seqno.metric = ntohs(tlv_update->metric);
|
|
||||||
nexthop->metric_seqno.seqno = ntohs(tlv_update->seqno);
|
|
||||||
nexthop->interval = ntohs(tlv_update->interval);
|
|
||||||
|
|
||||||
fprintf(stderr, "debug: the update was accepted.\n");
|
|
||||||
|
|
||||||
if (nexthop->metric_seqno.metric == 0xffff)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* only update the timestamp for finite metrics */
|
|
||||||
nexthop->last_update = now;
|
|
||||||
|
|
||||||
if ((tlv_update->flags & FFD_UPDATE_WITH_DATA) && !announce->data) {
|
if ((tlv_update->flags & FFD_UPDATE_WITH_DATA) && !announce->data) {
|
||||||
if (len > sizeof(ffd_tlv_update_t)) {
|
if (len > sizeof(ffd_tlv_update_t)) {
|
||||||
announce->len = len - sizeof(ffd_tlv_update_t);
|
announce->len = len - sizeof(ffd_tlv_update_t);
|
||||||
|
@ -379,11 +365,17 @@ static void handle_tlv_update(const ffd_tlv_update_t *tlv_update, size_t len, ha
|
||||||
announce->len = 0xff;
|
announce->len = 0xff;
|
||||||
|
|
||||||
/* request data */
|
/* request data */
|
||||||
ffd_send_announce_request(arg->iface, neigh, announce->node, announce->type, announce->key, true);
|
if (nexthop)
|
||||||
|
ffd_send_announce_request(arg->iface, neigh, announce->node, announce->type, announce->key, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ffd_announce_update_nexthop(announce);
|
if (!nexthop)
|
||||||
|
return;
|
||||||
|
|
||||||
|
fprintf(stderr, "debug: the update was accepted.\n");
|
||||||
|
|
||||||
|
ffd_announce_update(announce, nexthop, ms, ntohs(tlv_update->interval));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void handle_tlv_announce_req(const ffd_tlv_announce_req_t *tlv_req, size_t len, handle_tlv_arg_t *arg) {
|
static void handle_tlv_announce_req(const ffd_tlv_announce_req_t *tlv_req, size_t len, handle_tlv_arg_t *arg) {
|
||||||
|
|
|
@ -149,7 +149,7 @@ extern struct timespec now;
|
||||||
|
|
||||||
bool ffd_is_feasible(const ffd_announce_t *announce, ffd_metric_seqno_t ms);
|
bool ffd_is_feasible(const ffd_announce_t *announce, ffd_metric_seqno_t ms);
|
||||||
ffd_metric_seqno_t ffd_announce_get_metric(const ffd_announce_t *announce);
|
ffd_metric_seqno_t ffd_announce_get_metric(const ffd_announce_t *announce);
|
||||||
void ffd_announce_update_nexthop(ffd_announce_t *announce);
|
void ffd_announce_update(ffd_announce_t *announce, ffd_nexthop_t *nexthop, ffd_metric_seqno_t ms, uint16_t interval);
|
||||||
ffd_announce_t* ffd_announce_new(void);
|
ffd_announce_t* ffd_announce_new(void);
|
||||||
|
|
||||||
void ffd_send_ack(ffd_iface_t *iface, ffd_neigh_t *neigh, uint16_t nonce);
|
void ffd_send_ack(ffd_iface_t *iface, ffd_neigh_t *neigh, uint16_t nonce);
|
||||||
|
|
Reference in a new issue