From: zmw12306 Date: Sat, 5 Apr 2025 18:26:32 +0000 (-0400) Subject: babeld: Fix starvation handling on route loss per RFC 8966 §3.8.2.1 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=8a8c43c891b73a07c2580662b0268169ee6e55f4;p=matthieu%2Ffrr.git babeld: Fix starvation handling on route loss per RFC 8966 §3.8.2.1 When all feasible routes to a destination are lost, but unexpired unfeasible routes exist, the node MUST send a seqno request to prevent starvation. Signed-off-by: zmw12306 --- diff --git a/babeld/route.c b/babeld/route.c index 466f41383c..eefc5c94df 100644 --- a/babeld/route.c +++ b/babeld/route.c @@ -1078,17 +1078,26 @@ route_lost(struct source *src, unsigned oldmetric) new_route = find_best_route(src->prefix, src->plen, 1, NULL); if(new_route) { consider_route(new_route); - } else if(oldmetric < INFINITY) { - /* Avoid creating a blackhole. */ - send_update_resend(NULL, src->prefix, src->plen); - /* If the route was usable enough, try to get an alternate one. - If it was not, we could be dealing with oscillations around - the value of INFINITY. */ - if(oldmetric <= INFINITY / 2) + } else { + struct babel_route *unfeasible = find_best_route(src->prefix, src->plen, 0, NULL); + + if(unfeasible && !route_expired(unfeasible)) { + /* MUST send seqno request when we have unexpired unfeasible routes */ send_request_resend(NULL, src->prefix, src->plen, - src->metric >= INFINITY ? - src->seqno : seqno_plus(src->seqno, 1), + seqno_plus(src->seqno, 1), src->id); + } else if(oldmetric < INFINITY) { + /* Avoid creating a blackhole. */ + send_update_resend(NULL, src->prefix, src->plen); + /* If the route was usable enough, try to get an alternate one. + If it was not, we could be dealing with oscillations around + the value of INFINITY. */ + if(oldmetric <= INFINITY / 2) + send_request_resend(NULL, src->prefix, src->plen, + src->metric >= INFINITY ? + src->seqno : seqno_plus(src->seqno, 1), + src->id); + } } }