diff options
Diffstat (limited to 'pimd/pim_ssm.c')
| -rw-r--r-- | pimd/pim_ssm.c | 190 |
1 files changed, 90 insertions, 100 deletions
diff --git a/pimd/pim_ssm.c b/pimd/pim_ssm.c index 41bf1e5668..e02bdfa215 100644 --- a/pimd/pim_ssm.c +++ b/pimd/pim_ssm.c @@ -30,129 +30,119 @@ #include "pim_ssm.h" #include "pim_zebra.h" -static void -pim_ssm_range_reevaluate (void) +static void pim_ssm_range_reevaluate(void) { - /* 1. Setup register state for (S,G) entries if G has changed from SSM to - * ASM. - * 2. check existing (*,G) IGMP registrations to see if they are - * still ASM. if they are now SSM delete them. - * 3. Allow channel setup for IGMP (*,G) members if G is now ASM - * 4. I could tear down all (*,G), (S,G,rpt) states. But that is an - * unnecessary sladge hammer and may not be particularly useful as it is - * likely the SPT switchover has already happened for flows along such RPTs. - * As for the RPT states it seems that the best thing to do is let them age - * out gracefully. As long as the FHR and LHR do the right thing RPTs will - * disappear in time for SSM groups. - */ - pim_upstream_register_reevaluate (); - igmp_source_forward_reevaluate_all (); + /* 1. Setup register state for (S,G) entries if G has changed from SSM + * to + * ASM. + * 2. check existing (*,G) IGMP registrations to see if they are + * still ASM. if they are now SSM delete them. + * 3. Allow channel setup for IGMP (*,G) members if G is now ASM + * 4. I could tear down all (*,G), (S,G,rpt) states. But that is an + * unnecessary sladge hammer and may not be particularly useful as it is + * likely the SPT switchover has already happened for flows along such + * RPTs. + * As for the RPT states it seems that the best thing to do is let them + * age + * out gracefully. As long as the FHR and LHR do the right thing RPTs + * will + * disappear in time for SSM groups. + */ + pim_upstream_register_reevaluate(); + igmp_source_forward_reevaluate_all(); } -void -pim_ssm_prefix_list_update (struct prefix_list *plist) +void pim_ssm_prefix_list_update(struct prefix_list *plist) { - struct pim_ssm *ssm = pimg->ssm_info; + struct pim_ssm *ssm = pimg->ssm_info; - if (!ssm->plist_name || strcmp (ssm->plist_name, prefix_list_name (plist))) - { - /* not ours */ - return; - } + if (!ssm->plist_name + || strcmp(ssm->plist_name, prefix_list_name(plist))) { + /* not ours */ + return; + } - pim_ssm_range_reevaluate (); + pim_ssm_range_reevaluate(); } -static int -pim_is_grp_standard_ssm (struct prefix *group) +static int pim_is_grp_standard_ssm(struct prefix *group) { - static int first = 1; - static struct prefix group_ssm; + static int first = 1; + static struct prefix group_ssm; - if (first) - { - str2prefix (PIM_SSM_STANDARD_RANGE, &group_ssm); - first = 0; - } + if (first) { + str2prefix(PIM_SSM_STANDARD_RANGE, &group_ssm); + first = 0; + } - return prefix_match (&group_ssm, group); + return prefix_match(&group_ssm, group); } -int -pim_is_grp_ssm (struct in_addr group_addr) +int pim_is_grp_ssm(struct in_addr group_addr) { - struct pim_ssm *ssm; - struct prefix group; - struct prefix_list *plist; - - memset (&group, 0, sizeof (group)); - group.family = AF_INET; - group.u.prefix4 = group_addr; - group.prefixlen = 32; - - ssm = pimg->ssm_info; - if (!ssm->plist_name) - { - return pim_is_grp_standard_ssm (&group); - } - - plist = prefix_list_lookup (AFI_IP, ssm->plist_name); - if (!plist) - return 0; - - return (prefix_list_apply (plist, &group) == PREFIX_PERMIT); + struct pim_ssm *ssm; + struct prefix group; + struct prefix_list *plist; + + memset(&group, 0, sizeof(group)); + group.family = AF_INET; + group.u.prefix4 = group_addr; + group.prefixlen = 32; + + ssm = pimg->ssm_info; + if (!ssm->plist_name) { + return pim_is_grp_standard_ssm(&group); + } + + plist = prefix_list_lookup(AFI_IP, ssm->plist_name); + if (!plist) + return 0; + + return (prefix_list_apply(plist, &group) == PREFIX_PERMIT); } -int -pim_ssm_range_set (vrf_id_t vrf_id, const char *plist_name) +int pim_ssm_range_set(vrf_id_t vrf_id, const char *plist_name) { - struct pim_ssm *ssm; - int change = 0; - - if (vrf_id != VRF_DEFAULT) - return PIM_SSM_ERR_NO_VRF; - - ssm = pimg->ssm_info; - if (plist_name) - { - if (ssm->plist_name) - { - if (!strcmp (ssm->plist_name, plist_name)) - return PIM_SSM_ERR_DUP; - XFREE (MTYPE_PIM_FILTER_NAME, ssm->plist_name); - } - ssm->plist_name = XSTRDUP (MTYPE_PIM_FILTER_NAME, plist_name); - change = 1; - } - else - { - if (ssm->plist_name) - { - change = 1; - XFREE (MTYPE_PIM_FILTER_NAME, ssm->plist_name); - } - } - - if (change) - pim_ssm_range_reevaluate (); - - return PIM_SSM_ERR_NONE; + struct pim_ssm *ssm; + int change = 0; + + if (vrf_id != VRF_DEFAULT) + return PIM_SSM_ERR_NO_VRF; + + ssm = pimg->ssm_info; + if (plist_name) { + if (ssm->plist_name) { + if (!strcmp(ssm->plist_name, plist_name)) + return PIM_SSM_ERR_DUP; + XFREE(MTYPE_PIM_FILTER_NAME, ssm->plist_name); + } + ssm->plist_name = XSTRDUP(MTYPE_PIM_FILTER_NAME, plist_name); + change = 1; + } else { + if (ssm->plist_name) { + change = 1; + XFREE(MTYPE_PIM_FILTER_NAME, ssm->plist_name); + } + } + + if (change) + pim_ssm_range_reevaluate(); + + return PIM_SSM_ERR_NONE; } -void * -pim_ssm_init (vrf_id_t vrf_id) +void *pim_ssm_init(vrf_id_t vrf_id) { - struct pim_ssm *ssm; + struct pim_ssm *ssm; - ssm = XCALLOC (MTYPE_PIM_SSM_INFO, sizeof (*ssm)); - ssm->vrf_id = vrf_id; + ssm = XCALLOC(MTYPE_PIM_SSM_INFO, sizeof(*ssm)); + ssm->vrf_id = vrf_id; - return ssm; + return ssm; } -void -pim_ssm_terminate (struct pim_ssm *ssm) +void pim_ssm_terminate(struct pim_ssm *ssm) { - if (ssm && ssm->plist_name) - XFREE (MTYPE_PIM_FILTER_NAME, ssm->plist_name); + if (ssm && ssm->plist_name) + XFREE(MTYPE_PIM_FILTER_NAME, ssm->plist_name); } |
