diff options
| author | Quentin Young <qlyoung@cumulusnetworks.com> | 2019-04-22 18:04:56 +0000 |
|---|---|---|
| committer | Quentin Young <qlyoung@cumulusnetworks.com> | 2019-05-17 00:27:08 +0000 |
| commit | f1175ba9314200821a47dcffab1fd01c18ee701f (patch) | |
| tree | a3389494784d3d1dbdbd799e666ebb4a6d36c8bb | |
| parent | 4f576e7575f9c1f4b017374a990906130d00dfdd (diff) | |
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>
| -rw-r--r-- | vrrpd/vrrp.c | 18 | ||||
| -rw-r--r-- | vrrpd/vrrp.h | 8 | ||||
| -rw-r--r-- | vrrpd/vrrp_main.c | 4 |
3 files changed, 29 insertions, 1 deletions
diff --git a/vrrpd/vrrp.c b/vrrpd/vrrp.c index f98b230c62..7b66492c11 100644 --- a/vrrpd/vrrp.c +++ b/vrrpd/vrrp.c @@ -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); +} diff --git a/vrrpd/vrrp.h b/vrrpd/vrrp.h index ee2a8249a5..fd4901fe22 100644 --- a/vrrpd/vrrp.h +++ b/vrrpd/vrrp.h @@ -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 ------------------------------------------------ */ diff --git a/vrrpd/vrrp_main.c b/vrrpd/vrrp_main.c index d6a43be8e8..98b907d013 100644 --- a/vrrpd/vrrp_main.c +++ b/vrrpd/vrrp_main.c @@ -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); } |
