/* Daemon stop sequence */ static void stop_vrrp(void) { signal_handler_destroy(); if (!(debug & 8)) shutdown_vrrp_instances(); /* Clear static entries */ netlink_rtlist(vrrp_data->static_routes, IPROUTE_DEL); netlink_iplist(vrrp_data->static_addresses, IPADDRESS_DEL, NULL); #ifdef _WITH_SNMP_ if (snmp) vrrp_snmp_agent_close(); #endif /* Stop daemon */ pidfile_rm(vrrp_pidfile); #ifdef _WITH_LVS_ if (vrrp_ipvs_needed()) { /* Clean ipvs related */ ipvs_stop(); } #endif /* Clean data */ free_global_data(global_data); vrrp_dispatcher_release(vrrp_data); free_vrrp_data(vrrp_data); free_vrrp_buffer(); free_interface_queue(); kernel_netlink_close(); thread_destroy_master(master); gratuitous_arp_close(); ndisc_close(); #ifdef _DEBUG_ keepalived_free_final("VRRP Child process"); #endif /* * Reached when terminate signal catched. * finally return to parent process. */ closelog(); exit(0); }
/* Daemon stop sequence */ static void stop_vrrp(void) { /* Ensure any interfaces are in backup mode, * sending a priority 0 vrrp message */ restore_vrrp_interfaces(); #ifdef _HAVE_LIBIPTC_ iptables_fini(); #endif /* Clear static entries */ netlink_rtlist(vrrp_data->static_routes, IPROUTE_DEL); netlink_rulelist(vrrp_data->static_rules, IPRULE_DEL); netlink_iplist(vrrp_data->static_addresses, IPADDRESS_DEL); #ifdef _WITH_SNMP_ if (global_data->enable_snmp_keepalived || global_data->enable_snmp_rfc) vrrp_snmp_agent_close(); #endif /* Stop daemon */ pidfile_rm(vrrp_pidfile); #ifdef _WITH_LVS_ if (vrrp_ipvs_needed()) { /* Clean ipvs related */ ipvs_stop(); } #endif /* Clean data */ free_global_data(global_data); vrrp_dispatcher_release(vrrp_data); /* This is not nice, but it significantly increases the chances * of an IGMP leave group being sent for some reason. * Since we are about to exit, it doesn't affect anything else * running. */ sleep ( 1 ); if (!__test_bit(DONT_RELEASE_VRRP_BIT, &debug)) shutdown_vrrp_instances(); free_vrrp_data(vrrp_data); free_vrrp_buffer(); free_interface_queue(); kernel_netlink_close(); thread_destroy_master(master); gratuitous_arp_close(); ndisc_close(); signal_handler_destroy(); #ifdef _DEBUG_ keepalived_free_final("VRRP Child process"); #endif /* * Reached when terminate signal catched. * finally return to parent process. */ closelog(); exit(0); }