+ REPLY_MACRO (IGMP_MSG_ID (VL_API_IGMP_CLEAR_INTERFACE_REPLY));
+}
+
+static vl_api_group_prefix_type_t
+igmp_group_type_int_to_api (igmp_group_prefix_type_t t)
+{
+ switch (t)
+ {
+ case IGMP_GROUP_PREFIX_TYPE_ASM:
+ return (htonl (ASM));
+ case IGMP_GROUP_PREFIX_TYPE_SSM:
+ return (htonl (SSM));
+ }
+
+ return (SSM);
+}
+
+static igmp_group_prefix_type_t
+igmp_group_type_api_to_int (vl_api_group_prefix_type_t t)
+{
+ switch (htonl (t))
+ {
+ case ASM:
+ return (IGMP_GROUP_PREFIX_TYPE_ASM);
+ case SSM:
+ return (IGMP_GROUP_PREFIX_TYPE_SSM);
+ }
+
+ return (IGMP_GROUP_PREFIX_TYPE_SSM);
+}
+
+static void
+vl_api_igmp_group_prefix_set_t_handler (vl_api_igmp_group_prefix_set_t * mp)
+{
+ vl_api_igmp_group_prefix_set_reply_t *rmp;
+ fib_prefix_t pfx;
+ int rv = 0;
+
+ ip_prefix_decode (&mp->gp.prefix, &pfx);
+ igmp_group_prefix_set (&pfx, igmp_group_type_api_to_int (mp->gp.type));
+
+ REPLY_MACRO (IGMP_MSG_ID (VL_API_IGMP_GROUP_PREFIX_SET_REPLY));
+}
+
+typedef struct igmp_ssm_range_walk_ctx_t_
+{
+ unix_shared_memory_queue_t *q;
+ u32 context;
+} igmp_ssm_range_walk_ctx_t;
+
+static walk_rc_t
+igmp_ssm_range_walk_dump (const fib_prefix_t * pfx,
+ igmp_group_prefix_type_t type, void *args)
+{
+ igmp_ssm_range_walk_ctx_t *ctx = args;
+ vl_api_igmp_group_prefix_details_t *mp;
+
+ mp = vl_msg_api_alloc (sizeof (*mp));
+ clib_memset (mp, 0, sizeof (*mp));
+
+ mp->_vl_msg_id = htons (IGMP_MSG_ID (VL_API_IGMP_DETAILS));
+ mp->context = ctx->context;
+ mp->gp.type = igmp_group_type_int_to_api (type);
+ ip_prefix_encode (pfx, &mp->gp.prefix);
+
+ vl_msg_api_send_shmem (ctx->q, (u8 *) & mp);
+
+ return (WALK_CONTINUE);
+}
+
+static void
+vl_api_igmp_group_prefix_dump_t_handler (vl_api_igmp_dump_t * mp)
+{
+ unix_shared_memory_queue_t *q;
+
+ q = vl_api_client_index_to_input_queue (mp->client_index);