-void
-igmp_clear_group (igmp_config_t * config, igmp_group_t * group)
-{
- igmp_src_t *src;
-
- ASSERT (config);
- ASSERT (group);
-
- IGMP_DBG ("group_type %u, sw_if_index %d", group->type,
- config->sw_if_index);
-
- /* *INDENT-OFF* */
- pool_foreach (src, group->srcs, (
- {
- clib_mem_free (src->key);
- }));
- /* *INDENT-ON* */
- pool_free (group->srcs);
- hash_free (group->igmp_src_by_key);
-
- hash_unset_mem (config->igmp_group_by_key, group->key);
- clib_mem_free (group->key);
- pool_put (config->groups, group);
-}
-
-void
-igmp_clear_config (igmp_config_t * config)
-{
- igmp_main_t *im = &igmp_main;
- igmp_group_t *group;
-
- ASSERT (config);
- /* *INDENT-OFF* */
- pool_foreach (group, config->groups, (
- {
- igmp_clear_group (config, group);
- }));
- /* *INDENT-ON* */
- pool_free (config->groups);
- hash_free (config->igmp_group_by_key);
-
- hash_unset_mem (im->igmp_config_by_sw_if_index, &config->sw_if_index);
- pool_put (im->configs, config);
-}
-
-/** \brief igmp timer compare
- @param _a - igmp timer
- @param _b - igmp timer
-
- Compare function for igmp_timer_t sorting.
-*/
-int
-igmp_timer_compare (const void *_a, const void *_b)
-{
- const igmp_timer_t *a = _a;
- const igmp_timer_t *b = _b;
- f64 dt = b->exp_time - a->exp_time;
- return dt < 0 ? -1 : (dt > 0 ? +1 : 0);
-}
-
-void
-igmp_sort_timers (igmp_timer_t * timers)
-{
- vlib_main_t *vm = vlib_get_main ();
-
- qsort (timers, vec_len (timers), sizeof (igmp_timer_t), igmp_timer_compare);
-
- vlib_process_signal_event (vm, igmp_timer_process_node.index,
- IGMP_PROCESS_EVENT_UPDATE_TIMER, 0);
-}
-
-void
-igmp_create_int_timer (f64 time, u32 sw_if_index,
- igmp_timer_function_t * func)
-{
- igmp_main_t *im = &igmp_main;
- igmp_timer_t *timer;
-
- pool_get (im->timers, timer);
- memset (timer, 0, sizeof (igmp_timer_t));
- timer->func = func;
- timer->exp_time = time;
- timer->sw_if_index = sw_if_index;
-
- igmp_sort_timers (im->timers);
-}
-
-void
-igmp_create_group_timer (f64 time, u32 sw_if_index, igmp_key_t * gkey,
- igmp_timer_function_t * func)
-{
- igmp_main_t *im = &igmp_main;
- igmp_timer_t *timer;
-
- pool_get (im->timers, timer);
- memset (timer, 0, sizeof (igmp_timer_t));
- timer->func = func;
- timer->exp_time = time;
- timer->sw_if_index = sw_if_index;
-
-
- ASSERT (gkey);
- /* duplicate keys, to prevent segmentation fault if (S,G) is removed */
- timer->data = clib_mem_alloc (sizeof (igmp_key_t));
- clib_memcpy (&((igmp_key_t *) timer->data)[0], gkey, sizeof (igmp_key_t));