mirror of
https://git.proxmox.com/git/mirror_frr
synced 2025-05-28 12:10:24 +00:00
vrrpd: handle rescheduling Adver_Timer, Shutdown
* Reschedule Adver_Timer when necessary * Handle Shutdown event appropriately for all states Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
This commit is contained in:
parent
4ec944086b
commit
3e7a4043ff
43
vrrpd/vrrp.c
43
vrrpd/vrrp.c
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user