-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 (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));
-
- igmp_sort_timers (im->timers);
-}
-
-void
-igmp_create_src_timer (f64 time, u32 sw_if_index, igmp_key_t * gkey,
- igmp_key_t * skey, 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);
- ASSERT (skey);
- /* duplicate keys, to prevent segmentation fault if (S,G) is removed */
- timer->data = clib_mem_alloc (sizeof (igmp_key_t) * 2);
- clib_memcpy (&((igmp_key_t *) timer->data)[0], gkey, sizeof (igmp_key_t));
- clib_memcpy (&((igmp_key_t *) timer->data)[1], skey, sizeof (igmp_key_t));
-
- igmp_sort_timers (im->timers);
-}
-
-/** \brief igmp get next timer
- @param im - igmp main
-
- Get next timer.
-*/
-always_inline igmp_timer_t *
-igmp_get_next_timer (igmp_main_t * im)
-{
- if (pool_elts (im->timers) > 0)
- return vec_elt_at_index (im->timers, pool_elts (im->timers) - 1);
- return NULL;
-}
-
-/*
-static void
-igmp_create_report_v2 (vlib_buffer_t * b, igmp_config_t * config)
-{
- ip_csum_t sum;
- u16 csum;
- igmp_main_t *im = &igmp_main;
- igmp_sg_t *sg;
-
- sg = vec_elt_at_index (config->sg, im->next_index.sg_index);
-
- igmp_message_t *igmp = (igmp_message_t *) (vlib_buffer_get_current (b));
- memset (igmp, 0, sizeof (igmp_message_t));
-
- clib_memcpy (&igmp->dst, &sg->gaddr.ip4, sizeof (ip4_address_t));
- igmp->header.type =
- (sg->group_type == IGMP_MEMBERSHIP_GROUP_block_old_sources) ?
- IGMP_TYPE_leave_group_v2 : IGMP_TYPE_membership_report_v2;
- sum = ip_incremental_checksum (0, igmp, sizeof (igmp_message_t));
- csum = ~ip_csum_fold (sum);
- igmp->header.checksum = csum;