/* Reload thread */ static int reload_vrrp_thread(thread_t * thread) { /* set the reloading flag */ SET_RELOAD; /* Destroy master thread */ vrrp_dispatcher_release(vrrp_data); kernel_netlink_close(); thread_cleanup_master(master); #ifdef _HAVE_IPVS_SYNCD_ /* TODO - Note: this didn't work if we found ipvs_syndc on vrrp before on old_vrrp */ if (global_data->lvs_syncd_if) ipvs_syncd_cmd(IPVS_STOPDAEMON, NULL, (global_data->lvs_syncd_vrrp->state == VRRP_STATE_MAST) ? IPVS_MASTER: IPVS_BACKUP, global_data->lvs_syncd_syncid, false); #endif free_global_data(global_data); free_vrrp_buffer(); gratuitous_arp_close(); ndisc_close(); #ifdef _WITH_LVS_ if (vrrp_ipvs_needed()) { /* Clean ipvs related */ ipvs_stop(); } #endif /* Save previous conf data */ old_vrrp_data = vrrp_data; vrrp_data = NULL; reset_interface_queue(); /* Reload the conf */ #ifdef _DEBUG_ mem_allocated = 0; #endif start_vrrp(); #ifdef _HAVE_IPVS_SYNCD_ if (global_data->lvs_syncd_if) ipvs_syncd_cmd(IPVS_STARTDAEMON, NULL, (global_data->lvs_syncd_vrrp->state == VRRP_STATE_MAST) ? IPVS_MASTER: IPVS_BACKUP, global_data->lvs_syncd_syncid, false); #endif /* free backup data */ free_vrrp_data(old_vrrp_data); free_old_interface_queue(); UNSET_RELOAD; return 0; }
void ipvs_syncd_backup(char *ifname, int syncid) { ipvs_syncd_cmd(IPVS_STOPDAEMON, ifname, IPVS_MASTER, syncid); ipvs_syncd_cmd(IPVS_STARTDAEMON, ifname, IPVS_BACKUP, syncid); }
/* * Initialize state handling * --rfc2338.6.4.1 */ static void vrrp_init_state(list l) { vrrp_t *vrrp; vrrp_sgroup_t *vgroup; element e; for (e = LIST_HEAD(l); e; ELEMENT_NEXT(e)) { vrrp = ELEMENT_DATA(e); /* In case of VRRP SYNC, we have to carefully check that we are * not running floating priorities on any VRRP instance. */ if (vrrp->sync && !vrrp->sync->global_tracking) { element e2; tracked_sc_t *sc; tracked_if_t *tip; int warning = 0; if (!LIST_ISEMPTY(vrrp->track_ifp)) { for (e2 = LIST_HEAD(vrrp->track_ifp); e2; ELEMENT_NEXT(e2)) { tip = ELEMENT_DATA(e2); if (tip->weight) { tip->weight = 0; warning++; } } } if (!LIST_ISEMPTY(vrrp->track_script)) { for (e2 = LIST_HEAD(vrrp->track_script); e2; ELEMENT_NEXT(e2)) { sc = ELEMENT_DATA(e2); if (sc->weight) { sc->scr->inuse--; warning++; } } } if (warning > 0) { log_message(LOG_INFO, "VRRP_Instance(%s) : ignoring " "tracked script with weights due to SYNC group", vrrp->iname); } } else { /* Register new priority update thread */ thread_add_timer(master, vrrp_update_priority, vrrp, vrrp->adver_int); } if (vrrp->base_priority == VRRP_PRIO_OWNER || vrrp->wantstate == VRRP_STATE_MAST) { #ifdef _HAVE_IPVS_SYNCD_ /* Check if sync daemon handling is needed */ if (vrrp->lvs_syncd_if) ipvs_syncd_cmd(IPVS_STARTDAEMON, vrrp->lvs_syncd_if, IPVS_MASTER, vrrp->vrid); #endif vrrp->state = VRRP_STATE_GOTO_MASTER; } else { vrrp->ms_down_timer = 3 * vrrp->adver_int + VRRP_TIMER_SKEW(vrrp); #ifdef _HAVE_IPVS_SYNCD_ /* Check if sync daemon handling is needed */ if (vrrp->lvs_syncd_if) ipvs_syncd_cmd(IPVS_STARTDAEMON, vrrp->lvs_syncd_if, IPVS_BACKUP, vrrp->vrid); #endif log_message(LOG_INFO, "VRRP_Instance(%s) Entering BACKUP STATE", vrrp->iname); /* Set BACKUP state */ vrrp_restore_interface(vrrp, 0); vrrp->state = VRRP_STATE_BACK; vrrp_smtp_notifier(vrrp); notify_instance_exec(vrrp, VRRP_STATE_BACK); #ifdef _WITH_SNMP_ vrrp_snmp_instance_trap(vrrp); #endif /* Init group if needed */ if ((vgroup = vrrp->sync)) { if (GROUP_STATE(vgroup) != VRRP_STATE_BACK) { vgroup->state = VRRP_STATE_BACK; vrrp_sync_smtp_notifier(vgroup); notify_group_exec(vgroup, VRRP_STATE_BACK); #ifdef _WITH_SNMP_ vrrp_snmp_group_trap(vgroup); #endif } } } } }
/* Daemon init sequence */ static void start_vrrp(void) { /* Initialize sub-system */ init_interface_queue(); kernel_netlink_init(); gratuitous_arp_init(); ndisc_init(); global_data = alloc_global_data(); #ifdef _HAVE_LIBIPTC_ iptables_init(); #endif /* Parse configuration file */ vrrp_data = alloc_vrrp_data(); init_data(conf_file, vrrp_init_keywords); if (!vrrp_data) { stop_vrrp(); return; } init_global_data(global_data); /* Set the process priority and non swappable if configured */ if (global_data->vrrp_process_priority) set_process_priority(global_data->vrrp_process_priority); if (global_data->vrrp_no_swap) set_process_dont_swap(4096); /* guess a stack size to reserve */ #ifdef _WITH_SNMP_ if (!reload && (global_data->enable_snmp_keepalived || global_data->enable_snmp_rfcv2 || global_data->enable_snmp_rfcv3)) { vrrp_snmp_agent_init(global_data->snmp_socket); #ifdef _WITH_SNMP_RFC_ vrrp_start_time = timer_now(); #endif } #endif #ifdef _WITH_LVS_ if (vrrp_ipvs_needed()) { /* Initialize ipvs related */ if (ipvs_start() != IPVS_SUCCESS) { stop_vrrp(); return; } #ifdef _HAVE_IPVS_SYNCD_ /* If we are managing the sync daemon, then stop any * instances of it that may have been running if * we terminated abnormally */ ipvs_syncd_cmd(IPVS_STOPDAEMON, NULL, IPVS_MASTER, 0, true); ipvs_syncd_cmd(IPVS_STOPDAEMON, NULL, IPVS_BACKUP, 0, true); #endif } #endif if (reload) { clear_diff_saddresses(); #ifdef _HAVE_FIB_ROUTING_ clear_diff_srules(); clear_diff_sroutes(); #endif clear_diff_vrrp(); clear_diff_script(); } else { /* Clear leftover static entries */ netlink_iplist(vrrp_data->static_addresses, IPADDRESS_DEL); #ifdef _HAVE_FIB_ROUTING_ netlink_rtlist(vrrp_data->static_routes, IPROUTE_DEL); netlink_error_ignore = ENOENT; netlink_rulelist(vrrp_data->static_rules, IPRULE_DEL, true); netlink_error_ignore = 0; #endif } /* Complete VRRP initialization */ if (!vrrp_complete_init()) { if (vrrp_ipvs_needed()) { stop_vrrp(); } return; } #ifdef _HAVE_LIBIPTC_ iptables_startup(); #endif /* Post initializations */ #ifdef _DEBUG_ log_message(LOG_INFO, "Configuration is using : %lu Bytes", mem_allocated); #endif /* Set static entries */ netlink_iplist(vrrp_data->static_addresses, IPADDRESS_ADD); #ifdef _HAVE_FIB_ROUTING_ netlink_rtlist(vrrp_data->static_routes, IPROUTE_ADD); netlink_rulelist(vrrp_data->static_rules, IPRULE_ADD, false); #endif /* Dump configuration */ if (__test_bit(DUMP_CONF_BIT, &debug)) { list ifl; dump_global_data(global_data); dump_vrrp_data(vrrp_data); ifl = get_if_list(); if (!LIST_ISEMPTY(ifl)) dump_list(ifl); } /* Initialize linkbeat */ init_interface_linkbeat(); /* Init & start the VRRP packet dispatcher */ thread_add_event(master, vrrp_dispatcher_init, NULL, VRRP_DISPATCHER); }