vrrpd: gracefully shutdown on SIGTERM / SIGINT

Handle kill signals by gracefully destroying all of our VRRP instances.
If any of them are in Master state, send an advert with 0 priority to
notify Backup routers we are going down.

Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
This commit is contained in:
Quentin Young 2019-04-22 18:04:56 +00:00
parent 4f576e7575
commit f1175ba931
3 changed files with 29 additions and 1 deletions

View File

@ -2354,3 +2354,21 @@ void vrrp_init(void)
"VRRP virtual router hash");
vrf_init(NULL, NULL, NULL, NULL, NULL);
}
void vrrp_fini(void)
{
/* Destroy all instances */
struct list *vrs = hash_to_list(vrrp_vrouters_hash);
struct listnode *ln;
struct vrrp_vrouter *vr;
for (ALL_LIST_ELEMENTS_RO(vrs, ln, vr)) {
vrrp_vrouter_destroy(vr);
}
list_delete(&vrs);
hash_clean(vrrp_vrouters_hash, NULL);
hash_free(vrrp_vrouters_hash);
}

View File

@ -265,6 +265,14 @@ struct vrrp_vrouter {
*/
void vrrp_init(void);
/*
* Destroy all VRRP instances and gracefully shutdown.
*
* For instances in Master state, VRRP advertisements with 0 priority will be
* sent if possible to notify Backup routers that we are going away.
*/
void vrrp_fini(void);
/* Creation and destruction ------------------------------------------------ */

View File

@ -69,10 +69,12 @@ static void sighup(void)
}
/* SIGINT / SIGTERM handler. */
static void sigint(void)
static void __attribute__((noreturn)) sigint(void)
{
zlog_notice("Terminating on signal");
vrrp_fini();
exit(0);
}