X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fplugins%2Figmp%2Figmp_group.c;h=eec4c9b8f8190cfbc547137b3e1e47dcbadb549f;hb=refs%2Fchanges%2F43%2F26543%2F2;hp=fe023a46167ed743821e63704b0b31c9c68698a3;hpb=947ea6222dad1ef04595c34273e9231395aef443;p=vpp.git diff --git a/src/plugins/igmp/igmp_group.c b/src/plugins/igmp/igmp_group.c index fe023a46167..eec4c9b8f81 100644 --- a/src/plugins/igmp/igmp_group.c +++ b/src/plugins/igmp/igmp_group.c @@ -65,30 +65,39 @@ igmp_group_src_update (igmp_group_t * group, } void -igmp_group_clear (igmp_group_t * group) +igmp_group_clear (igmp_group_t ** group) { igmp_config_t *config; u32 ii; - ASSERT (group); + ASSERT (*group); - config = igmp_config_get (group->config); + config = igmp_config_get ((*group)->config); + + /* If interface is in ROUTER mode and IGMP proxy is enabled + * remove mfib path. + */ + if (config->mode == IGMP_MODE_ROUTER) + { + igmp_proxy_device_mfib_path_add_del (*group, /* add */ 0); + } IGMP_DBG ("clear-group: %U %U", - format_igmp_key, group->key, + format_igmp_key, (*group)->key, format_vnet_sw_if_index_name, vnet_get_main (), config->sw_if_index); - igmp_group_free_all_srcs (group); + igmp_group_free_all_srcs (*group); for (ii = 0; ii < IGMP_GROUP_N_TIMERS; ii++) { - igmp_timer_retire (&group->timers[ii]); + igmp_timer_retire (&(*group)->timers[ii]); } - hash_unset_mem (config->igmp_group_by_key, group->key); - clib_mem_free (group->key); - pool_put (igmp_main.groups, group); + hash_unset_mem (config->igmp_group_by_key, (*group)->key); + clib_mem_free ((*group)->key); + pool_put (igmp_main.groups, *group); + *group = 0; } igmp_group_t * @@ -101,7 +110,7 @@ igmp_group_alloc (igmp_config_t * config, IGMP_DBG ("new-group: %U", format_igmp_key, gkey); pool_get (im->groups, group); - memset (group, 0, sizeof (igmp_group_t)); + clib_memset (group, 0, sizeof (igmp_group_t)); group->key = clib_mem_alloc (sizeof (igmp_key_t)); clib_memcpy (group->key, gkey, sizeof (igmp_key_t)); group->igmp_src_by_key[IGMP_FILTER_MODE_INCLUDE] = @@ -116,6 +125,15 @@ igmp_group_alloc (igmp_config_t * config, group->timers[ii] = IGMP_TIMER_ID_INVALID; hash_set_mem (config->igmp_group_by_key, group->key, group - im->groups); + + /* If interface is in ROUTER mode and IGMP proxy is enabled + * add mfib path. + */ + if (config->mode == IGMP_MODE_ROUTER) + { + igmp_proxy_device_mfib_path_add_del (group, /* add */ 1); + } + return (group); } @@ -263,6 +281,46 @@ igmp_group_get (u32 index) return (pool_elt_at_index (igmp_main.groups, index)); } +u8 * +format_igmp_group_timer_type (u8 * s, va_list * args) +{ + igmp_group_timer_type_t type = va_arg (*args, igmp_group_timer_type_t); + + switch (type) + { +#define _(v,t) case IGMP_GROUP_TIMER_##v: return (format (s, "%s", t)); + foreach_igmp_group_timer +#undef _ + } + return (s); +} + +u8 * +format_igmp_group (u8 * s, va_list * args) +{ + igmp_group_t *group = va_arg (*args, igmp_group_t *); + u32 indent = va_arg (*args, u32); + igmp_src_t *src; + u32 ii; + + s = format (s, "%U%U", + format_white_space, indent, format_igmp_key, group->key); + + for (ii = 0; ii < IGMP_GROUP_N_TIMERS; ii++) + s = format (s, "\n%U %U:%U", format_white_space, indent, + format_igmp_group_timer_type, ii, + format_igmp_timer_id, group->timers[ii]); + + /* *INDENT-OFF* */ + FOR_EACH_SRC (src, group, IGMP_FILTER_MODE_INCLUDE, + ({ + s = format (s, "\n%U", format_igmp_src, src, indent+4); + })); + /* *INDENT-ON* */ + + return (s); +} + /* * fd.io coding-style-patch-verification: ON *