diff options
Diffstat (limited to 'proto/babel/babel.c')
-rw-r--r-- | proto/babel/babel.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/proto/babel/babel.c b/proto/babel/babel.c index 07c82d91..2009c0d0 100644 --- a/proto/babel/babel.c +++ b/proto/babel/babel.c @@ -355,21 +355,25 @@ babel_expire_ihu(struct babel_proto *p, struct babel_neighbor *nbr) } 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; if (nbr->hello_cnt < 16) 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", nbr->addr, nbr->ifa->iface->name, u32_popcount(nbr->hello_map)); if (nbr->hello_map) - { - nbr->hello_expiry += nbr->last_hello_int; babel_update_cost(nbr); - } else babel_flush_neighbor(p, nbr); } @@ -389,7 +393,7 @@ babel_expire_neighbors(struct babel_proto *p) babel_expire_ihu(p, nbr); if (nbr->hello_expiry && nbr->hello_expiry <= now_) - babel_expire_hello(p, nbr); + babel_expire_hello(p, nbr, now_); } } } |