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);  }  | 
