#include "hash.h"
#include "vrf.h"
+#include "lib_errors.h"
#include "pimd.h"
#include "pim_ssm.h"
static void pim_instance_terminate(struct pim_instance *pim)
{
- /* Traverse and cleanup rpf_hash */
- if (pim->rpf_hash) {
- hash_clean(pim->rpf_hash, (void *)pim_rp_list_hash_clean);
- hash_free(pim->rpf_hash);
- pim->rpf_hash = NULL;
- }
-
if (pim->ssm_info) {
pim_ssm_terminate(pim->ssm_info);
pim->ssm_info = NULL;
}
if (pim->static_routes)
- list_delete_and_null(&pim->static_routes);
-
- pim_rp_free(pim);
+ list_delete(&pim->static_routes);
pim_upstream_terminate(pim);
- pim_oil_terminate(pim);
+ pim_rp_free(pim);
+
+ /* Traverse and cleanup rpf_hash */
+ if (pim->rpf_hash) {
+ hash_clean(pim->rpf_hash, (void *)pim_rp_list_hash_clean);
+ hash_free(pim->rpf_hash);
+ pim->rpf_hash = NULL;
+ }
pim_if_terminate(pim);
+ pim_oil_terminate(pim);
+
pim_msdp_exit(pim);
XFREE(MTYPE_PIM_PIM_INSTANCE, pim);
char hash_name[64];
pim = XCALLOC(MTYPE_PIM_PIM_INSTANCE, sizeof(struct pim_instance));
- if (!pim)
- return NULL;
pim_if_init(pim);
pim->keep_alive_time = PIM_KEEPALIVE_PERIOD;
pim->rp_keep_alive_time = PIM_RP_KEEPALIVE_PERIOD;
+ pim->ecmp_enable = false;
+ pim->ecmp_rebalance_enable = false;
pim->vrf_id = vrf->vrf_id;
pim->vrf = vrf;
zlog_debug("%s: NHT rpf hash init ", __PRETTY_FUNCTION__);
pim->ssm_info = pim_ssm_init();
- if (!pim->ssm_info) {
- pim_instance_terminate(pim);
- return NULL;
- }
pim->static_routes = list_new();
- if (!pim->static_routes) {
- zlog_err("%s %s: failure: static_routes=list_new()", __FILE__,
- __PRETTY_FUNCTION__);
- pim_instance_terminate(pim);
- return NULL;
- }
pim->static_routes->del = (void (*)(void *))pim_static_route_free;
pim->send_v6_secondary = 1;
pim_upstream_init(pim);
+ pim->last_route_change_time = -1;
return pim;
}
struct pim_instance *pim = pim_instance_init(vrf);
zlog_debug("VRF Created: %s(%u)", vrf->name, vrf->vrf_id);
- if (pim == NULL) {
- zlog_err("%s %s: pim class init failure ", __FILE__,
- __PRETTY_FUNCTION__);
- /*
- * We will crash and burn otherwise
- */
- exit(1);
- }
vrf->info = (void *)pim;
pim_global_config_write_worker(pim, vty);
if (vrf->vrf_id != VRF_DEFAULT)
- vty_endframe(vty, "!\n");
+ vty_endframe(vty, " exit-vrf\n!\n");
}
return 0;
void pim_vrf_init(void)
{
- vrf_init(pim_vrf_new, pim_vrf_enable, pim_vrf_disable, pim_vrf_delete);
+ vrf_init(pim_vrf_new, pim_vrf_enable, pim_vrf_disable,
+ pim_vrf_delete, NULL);
vrf_cmd_init(pim_vrf_config_write, &pimd_privs);
}