]> git.puffer.fish Git - matthieu/frr.git/commitdiff
vrrpd: handle rescheduling Adver_Timer, Shutdown
authorQuentin Young <qlyoung@cumulusnetworks.com>
Sat, 8 Dec 2018 00:49:35 +0000 (00:49 +0000)
committerQuentin Young <qlyoung@cumulusnetworks.com>
Fri, 17 May 2019 00:27:08 +0000 (00:27 +0000)
* Reschedule Adver_Timer when necessary
* Handle Shutdown event appropriately for all states

Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
vrrpd/vrrp.c

index 73493fc15bc96087c0834a8bbff33bffbbd2aaea..0fd5e254818722922a2e2b0aef92f7ac3207e32b 100644 (file)
@@ -356,14 +356,20 @@ static int vrrp_adver_timer_expire(struct thread *thread)
 
        zlog_info(VRRP_LOGPFX VRRP_LOGPFX_VRID "Adver_Timer expired", vr->vrid);
 
-       if (vr->fsm.state == VRRP_STATE_BACKUP) {
+       if (vr->fsm.state == VRRP_STATE_MASTER) {
+               /* Send an ADVERTISEMENT */
                vrrp_send_advertisement(vr);
-               /* FIXME: vrrp_send_gratuitous_arp(vr); */
-       } else if (vr->fsm.state == VRRP_STATE_MASTER) {
 
-       } else if (vr->fsm.state == VRRP_STATE_INITIALIZE) {
-               assert(!"FUCK");
+               /* Reset the Adver_Timer to Advertisement_Interval */
+               thread_add_timer_msec(master, vrrp_adver_timer_expire, vr,
+                                     vr->advertisement_interval * 10,
+                                     &vr->t_adver_timer);
+       } else {
+               zlog_warn(VRRP_LOGPFX VRRP_LOGPFX_VRID
+                         "Adver_Timer expired in state '%s'; this is a bug",
+                         vr->vrid, vrrp_state_names[vr->fsm.state]);
        }
+
        return 0;
 }
 
@@ -443,13 +449,34 @@ static int vrrp_startup(struct vrrp_vrouter *vr)
  */
 static int vrrp_shutdown(struct vrrp_vrouter *vr)
 {
+       switch (vr->fsm.state) {
+               case VRRP_STATE_MASTER:
+                       /* Cancel the Adver_Timer */
+                       THREAD_OFF(vr->t_adver_timer);
+                       /* Send an ADVERTISEMENT with Priority = 0 */
+                       uint8_t saved_prio = vr->priority;
+                       vr->priority = 0;
+                       vrrp_send_advertisement(vr);
+                       vr->priority = saved_prio;
+                       break;
+               case VRRP_STATE_BACKUP:
+                       /* Cancel the Master_Down_Timer */
+                       THREAD_OFF(vr->t_master_down_timer);
+                       break;
+               case VRRP_STATE_INITIALIZE:
+                       zlog_info(VRRP_LOGPFX VRRP_LOGPFX_VRID
+                                 "Received '%s' event in '%s' state; ignoring",
+                                 vr->vrid,
+                                 vrrp_event_names[VRRP_EVENT_SHUTDOWN],
+                                 vrrp_state_names[VRRP_STATE_INITIALIZE]);
+                       break;
+       }
+
        /* close socket */
        if (vr->sock >= 0)
                close(vr->sock);
 
-       /* cancel all threads */
-       /* ... */
-
+       /* Transition to the Initialize state */
        vrrp_change_state(vr, VRRP_STATE_INITIALIZE);
 
        return 0;