static void
send_igmp_details (unix_shared_memory_queue_t * q, igmp_main_t * im,
- igmp_config_t * config, igmp_sg_t * sg, u32 context)
+ igmp_config_t * config, igmp_group_t * group,
+ igmp_src_t * src, u32 context)
{
vl_api_igmp_details_t *mp;
mp->_vl_msg_id = htons (VL_API_IGMP_DETAILS + im->msg_id_base);
mp->context = context;
mp->sw_if_index = htonl (config->sw_if_index);
- clib_memcpy (mp->saddr, &sg->saddr.ip4, sizeof (u8) * 4);
- clib_memcpy (mp->gaddr, &sg->gaddr.ip4, sizeof (u8) * 4);
+ clib_memcpy (mp->saddr, &src->addr.ip4, sizeof (u8) * 4);
+ clib_memcpy (mp->gaddr, &group->addr.ip4, sizeof (u8) * 4);
vl_msg_api_send_shmem (q, (u8 *) & mp);
}
{
igmp_main_t *im = &igmp_main;
igmp_config_t *config;
- igmp_sg_t *sg;
+ igmp_group_t *group;
+ igmp_src_t *src;
unix_shared_memory_queue_t *q =
vl_api_client_index_to_input_queue (mp->client_index);
/* *INDENT-OFF* */
pool_foreach (config, im->configs, (
{
- pool_foreach (sg, config->sg, (
+ pool_foreach (group, config->groups, (
{
- send_igmp_details (q, im, config, sg, mp->context);
+ pool_foreach (src, group->srcs, (
+ {
+ send_igmp_details (q, im, config, group, src, mp->context);
+ }));
}));
}));
/* *INDENT-ON* */
if (config)
{
/* *INDENT-OFF* */
- pool_foreach (sg, config->sg, (
+ pool_foreach (group, config->groups, (
{
- send_igmp_details (q, im, config, sg, mp->context);
+ pool_foreach (src, group->srcs, (
+ {
+ send_igmp_details (q, im, config, group, src, mp->context);
+ }));
}));
/* *INDENT-ON* */
}
vl_msg_api_send_shmem (q, (u8 *) & rmp);
}
+/** \brief igmp group lookup
+ @param im - igmp main
+ @param client_index - client index
+*/
+static vpe_client_registration_t *
+igmp_api_client_lookup (igmp_main_t * im, u32 client_index)
+{
+ uword *p;
+ vpe_client_registration_t *api_client = NULL;
+
+ p = hash_get_mem (im->igmp_api_client_by_client_index, &client_index);
+ if (p)
+ api_client = vec_elt_at_index (im->api_clients, p[0]);
+
+ return api_client;
+}
+
static void
vl_api_want_igmp_events_t_handler (vl_api_want_igmp_events_t * mp)
{
igmp_main_t *im = &igmp_main;
- igmp_api_client_t *api_client;
+ vpe_client_registration_t *api_client;
vl_api_want_igmp_events_reply_t *rmp;
int rv = 0;
if (mp->enable)
{
pool_get (im->api_clients, api_client);
- memset (api_client, 0, sizeof (igmp_api_client_t));
+ memset (api_client, 0, sizeof (vpe_client_registration_t));
api_client->client_index = mp->client_index;
- api_client->pid = mp->pid;
+ api_client->client_pid = mp->pid;
hash_set_mem (im->igmp_api_client_by_client_index,
&mp->client_index, api_client - im->api_clients);
goto done;
vl_msg_api_send_shmem (q, (u8 *) & rmp);
}
+static clib_error_t *
+want_igmp_events_reaper (u32 client_index)
+{
+ igmp_main_t *im = &igmp_main;
+ vpe_client_registration_t *api_client;
+ uword *p;
+
+ p = hash_get_mem (im->igmp_api_client_by_client_index, &client_index);
+
+ if (p)
+ {
+ api_client = pool_elt_at_index (im->api_clients, p[0]);
+ pool_put (im->api_clients, api_client);
+ hash_unset_mem (im->igmp_api_client_by_client_index, &client_index);
+ }
+ return (NULL);
+}
+
+VL_MSG_API_REAPER_FUNCTION (want_igmp_events_reaper);
+
void
send_igmp_event (unix_shared_memory_queue_t * q, u32 context,
- igmp_main_t * im, igmp_config_t * config, igmp_sg_t * sg)
+ igmp_main_t * im, igmp_config_t * config,
+ igmp_group_t * group, igmp_src_t * src)
{
vl_api_igmp_event_t *mp = vl_msg_api_alloc (sizeof (*mp));
memset (mp, 0, sizeof (*mp));
mp->_vl_msg_id = ntohs ((VL_API_IGMP_EVENT) + im->msg_id_base);
mp->context = context;
mp->sw_if_index = htonl (config->sw_if_index);
- clib_memcpy (&mp->saddr, &sg->saddr.ip4, sizeof (ip4_address_t));
- clib_memcpy (&mp->gaddr, &sg->gaddr.ip4, sizeof (ip4_address_t));
+ clib_memcpy (&mp->saddr, &src->addr.ip4, sizeof (ip4_address_t));
+ clib_memcpy (&mp->gaddr, &group->addr.ip4, sizeof (ip4_address_t));
mp->is_join =
- (sg->group_type == IGMP_MEMBERSHIP_GROUP_mode_is_filter_include) ? 1 : 0;
+ (group->type == IGMP_MEMBERSHIP_GROUP_mode_is_filter_include) ? 1 : 0;
vl_msg_api_send_shmem (q, (u8 *) & mp);
}
void
-igmp_event (igmp_main_t * im, igmp_config_t * config, igmp_sg_t * sg)
+igmp_event (igmp_main_t * im, igmp_config_t * config, igmp_group_t * group,
+ igmp_src_t * src)
{
- igmp_api_client_t *api_client;
+ vpe_client_registration_t *api_client;
unix_shared_memory_queue_t *q;
/* *INDENT-OFF* */
pool_foreach (api_client, im->api_clients,
({
q = vl_api_client_index_to_input_queue (api_client->client_index);
if (q)
- send_igmp_event (q, 0, im, config, sg);
+ send_igmp_event (q, 0, im, config, group, src);
}));
/* *INDENT-ON* */
- if (sg->group_type == IGMP_MEMBERSHIP_GROUP_block_old_sources)
+ if (group->type == IGMP_MEMBERSHIP_GROUP_block_old_sources)
{
- hash_unset_mem (config->igmp_sg_by_key, sg->key);
- clib_mem_free (sg->key);
- pool_put (config->sg, sg);
- if (pool_elts (config->sg) == 0)
+ igmp_clear_group (config, group);
+ if (pool_elts (config->groups) == 0)
{
hash_unset_mem (im->igmp_config_by_sw_if_index,
&config->sw_if_index);