Babel: Fix hello timeout for short hello intervals

This commit is contained in:
Ondrej Zajicek (work) 2017-10-25 17:59:57 +02:00
parent b47eaefe12
commit 738a57b69b

View file

@ -355,21 +355,25 @@ babel_expire_ihu(struct babel_proto *p, struct babel_neighbor *nbr)
} }
static void static void
babel_expire_hello(struct babel_proto *p, struct babel_neighbor *nbr) babel_expire_hello(struct babel_proto *p, struct babel_neighbor *nbr, btime now_)
{ {
again:
nbr->hello_map <<= 1; nbr->hello_map <<= 1;
if (nbr->hello_cnt < 16) if (nbr->hello_cnt < 16)
nbr->hello_cnt++; nbr->hello_cnt++;
nbr->hello_expiry += nbr->last_hello_int;
/* We may expire multiple hellos if last_hello_int is too short */
if (nbr->hello_map && nbr->hello_expiry <= now_)
goto again;
TRACE(D_EVENTS, "Hello from nbr %I on %s expired, %d left", TRACE(D_EVENTS, "Hello from nbr %I on %s expired, %d left",
nbr->addr, nbr->ifa->iface->name, u32_popcount(nbr->hello_map)); nbr->addr, nbr->ifa->iface->name, u32_popcount(nbr->hello_map));
if (nbr->hello_map) if (nbr->hello_map)
{
nbr->hello_expiry += nbr->last_hello_int;
babel_update_cost(nbr); babel_update_cost(nbr);
}
else else
babel_flush_neighbor(p, nbr); babel_flush_neighbor(p, nbr);
} }
@ -389,7 +393,7 @@ babel_expire_neighbors(struct babel_proto *p)
babel_expire_ihu(p, nbr); babel_expire_ihu(p, nbr);
if (nbr->hello_expiry && nbr->hello_expiry <= now_) if (nbr->hello_expiry && nbr->hello_expiry <= now_)
babel_expire_hello(p, nbr); babel_expire_hello(p, nbr, now_);
} }
} }
} }