From: Donald Sharp Date: Wed, 10 May 2017 12:50:16 +0000 (-0400) Subject: pimd: Save pim instance on vrf pointer X-Git-Tag: frr-4.0-dev~468^2~148 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=e07fe9e6585f508d4af0ace192d267e7a383c32d;p=mirror%2Ffrr.git pimd: Save pim instance on vrf pointer This commit does these things: 1) Saves the pim instance created on the vrf pointer 2) Moves some initialization to the proper spot. 3) Remove vrf_id from 'struct pim_ssm' it is not needed 4) Removes some checks to prevent non-default vrf's from being created. 5) When creating the pim instance, save default vrf in pimg to allow backwards compatibility Signed-off-by: Donald Sharp --- diff --git a/pimd/pim_ssm.c b/pimd/pim_ssm.c index 604f00457b..b11b498aa6 100644 --- a/pimd/pim_ssm.c +++ b/pimd/pim_ssm.c @@ -130,12 +130,11 @@ int pim_ssm_range_set(vrf_id_t vrf_id, const char *plist_name) return PIM_SSM_ERR_NONE; } -void *pim_ssm_init(vrf_id_t vrf_id) +void *pim_ssm_init(void) { struct pim_ssm *ssm; ssm = XCALLOC(MTYPE_PIM_SSM_INFO, sizeof(*ssm)); - ssm->vrf_id = vrf_id; return ssm; } diff --git a/pimd/pim_ssm.h b/pimd/pim_ssm.h index 9e89d0c80c..85f7c5de28 100644 --- a/pimd/pim_ssm.h +++ b/pimd/pim_ssm.h @@ -29,13 +29,12 @@ enum pim_ssm_err { }; struct pim_ssm { - vrf_id_t vrf_id; char *plist_name; /* prefix list of group ranges */ }; void pim_ssm_prefix_list_update(struct prefix_list *plist); int pim_is_grp_ssm(struct in_addr group_addr); int pim_ssm_range_set(vrf_id_t vrf_id, const char *plist_name); -void *pim_ssm_init(vrf_id_t vrf_id); +void *pim_ssm_init(void); void pim_ssm_terminate(struct pim_ssm *ssm); #endif diff --git a/pimd/pimd.c b/pimd/pimd.c index 0d086de077..4c43d916bd 100644 --- a/pimd/pimd.c +++ b/pimd/pimd.c @@ -76,8 +76,8 @@ struct pim_instance *pimg = NULL; int32_t qpim_register_suppress_time = PIM_REGISTER_SUPPRESSION_TIME_DEFAULT; int32_t qpim_register_probe_time = PIM_REGISTER_PROBE_TIME_DEFAULT; -static struct pim_instance *pim_instance_init(vrf_id_t vrf_id, afi_t afi); -static void pim_instance_terminate(void); +static struct pim_instance *pim_instance_init(struct vrf *vrf); +static void pim_instance_terminate(struct pim_instance *pim); static int pim_vrf_new(struct vrf *vrf) { @@ -93,35 +93,29 @@ static int pim_vrf_delete(struct vrf *vrf) static int pim_vrf_enable(struct vrf *vrf) { + struct pim_instance *pim; - if (!vrf) // unexpected - return -1; + pim = pim_instance_init(vrf); + if (pim == NULL) { + zlog_err("%s %s: pim class init failure ", __FILE__, + __PRETTY_FUNCTION__); + /* + * We will crash and burn otherwise + */ + exit(1); + } - if (vrf->vrf_id == VRF_DEFAULT) { - pimg = pim_instance_init(VRF_DEFAULT, AFI_IP); - if (pimg == NULL) { - zlog_err("%s %s: pim class init failure ", __FILE__, - __PRETTY_FUNCTION__); - /* - * We will crash and burn otherwise - */ - exit(1); - } + vrf->info = (void *)pim; - pimg->mroute_socket = -1; + if (vrf->vrf_id == VRF_DEFAULT) + pimg = pim; - pimg->send_v6_secondary = 1; - } return 0; } static int pim_vrf_disable(struct vrf *vrf) { - if (vrf->vrf_id == VRF_DEFAULT) - return 0; - - if (vrf->vrf_id == VRF_DEFAULT) - pim_instance_terminate(); + pim_instance_terminate((struct pim_instance *)vrf->info); /* Note: This is a callback, the VRF will be deleted by the caller. */ return 0; @@ -175,18 +169,18 @@ void pim_prefix_list_update(struct prefix_list *plist) pim_upstream_spt_prefix_list_update(plist); } -static void pim_instance_terminate(void) +static void pim_instance_terminate(struct pim_instance *pim) { /* Traverse and cleanup rpf_hash */ - if (pimg->rpf_hash) { - hash_clean(pimg->rpf_hash, (void *)pim_rp_list_hash_clean); - hash_free(pimg->rpf_hash); - pimg->rpf_hash = NULL; + 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 (pimg->ssm_info) { - pim_ssm_terminate(pimg->ssm_info); - pimg->ssm_info = NULL; + if (pim->ssm_info) { + pim_ssm_terminate(pim->ssm_info); + pim->ssm_info = NULL; } XFREE(MTYPE_PIM_PIM_INSTANCE, pimg); @@ -213,7 +207,7 @@ static void pim_free() zprivs_terminate(&pimd_privs); } -static struct pim_instance *pim_instance_init(vrf_id_t vrf_id, afi_t afi) +static struct pim_instance *pim_instance_init(struct vrf *vrf) { struct pim_instance *pim; @@ -221,8 +215,8 @@ static struct pim_instance *pim_instance_init(vrf_id_t vrf_id, afi_t afi) if (!pim) return NULL; - pim->vrf_id = vrf_id; - pim->afi = afi; + pim->vrf_id = vrf->vrf_id; + pim->vrf = vrf; pim->spt.switchover = PIM_SPT_IMMEDIATE; pim->spt.plist = NULL; @@ -233,12 +227,15 @@ static struct pim_instance *pim_instance_init(vrf_id_t vrf_id, afi_t afi) if (PIM_DEBUG_ZEBRA) zlog_debug("%s: NHT rpf hash init ", __PRETTY_FUNCTION__); - pim->ssm_info = pim_ssm_init(vrf_id); + pim->ssm_info = pim_ssm_init(); if (!pim->ssm_info) { - pim_instance_terminate(); + pim_instance_terminate(pim); return NULL; } + pim->mroute_socket = -1; + pim->send_v6_secondary = 1; + return pim; } diff --git a/pimd/pimd.h b/pimd/pimd.h index c2868105da..88151b0e94 100644 --- a/pimd/pimd.h +++ b/pimd/pimd.h @@ -237,8 +237,8 @@ enum pim_spt_switchover { /* Per VRF PIM DB */ struct pim_instance { - afi_t afi; vrf_id_t vrf_id; + struct vrf *vrf; struct { enum pim_spt_switchover switchover;