-typedef void (igmp_timer_function_t) (vlib_main_t * vm,
- vlib_node_runtime_t * rt,
- igmp_main_t * im, igmp_timer_t * timer);
-
-typedef struct igmp_timer_t_
-{
- f64 exp_time;
- igmp_timer_function_t *func;
-
- u32 sw_if_index;
- void *data;
-} igmp_timer_t;
-
-extern vlib_node_registration_t igmp_timer_process_node;
-extern vlib_node_registration_t igmp_input_node;
-extern vlib_node_registration_t igmp_parse_query_node;
-extern vlib_node_registration_t igmp_parse_report_node;
-
-int igmp_listen (vlib_main_t * vm, u8 enable, u32 sw_if_index,
- ip46_address_t saddr, ip46_address_t gaddr,
- u8 cli_api_configured);
-
-void igmp_clear_config (igmp_config_t * config);
-
-void igmp_sort_timers (igmp_timer_t * timers);
-
-void igmp_create_int_timer (f64 time, u32 sw_if_index,
- igmp_timer_function_t * func);
-void igmp_create_sg_timer (f64 time, u32 sw_if_index, igmp_sg_key_t * key,
- igmp_timer_function_t * func);
-
-void igmp_send_query (vlib_main_t * vm, vlib_node_runtime_t * rt,
- igmp_main_t * im, igmp_timer_t * timer);
-void igmp_query_resp_exp (vlib_main_t * vm, vlib_node_runtime_t * rt,
- igmp_main_t * im, igmp_timer_t * timer);
-void igmp_send_report (vlib_main_t * vm, vlib_node_runtime_t * rt,
- igmp_main_t * im, igmp_timer_t * timer);
-void igmp_send_state_changed (vlib_main_t * vm, vlib_node_runtime_t * rt,
- igmp_main_t * im, igmp_timer_t * timer);
-void igmp_sg_exp (vlib_main_t * vm, vlib_node_runtime_t * rt,
- igmp_main_t * im, igmp_timer_t * timer);
-
-static inline igmp_type_info_t *
-igmp_get_type_info (igmp_main_t * im, u32 type)
-{
- uword *p;
-
- p = hash_get (im->type_info_by_type, type);
- return p ? vec_elt_at_index (im->type_infos, p[0]) : 0;
-}
-
-static inline igmp_report_type_info_t *
-igmp_get_report_type_info (igmp_main_t * im, u8 report_type)
-{
- uword *p;
-
- p = hash_get (im->report_type_info_by_report_type, report_type);
- return p ? vec_elt_at_index (im->report_type_infos, p[0]) : 0;
-}
-
-void igmp_event (igmp_main_t * im, igmp_config_t * config, igmp_sg_t * sg);
-
-typedef enum
-{
- IGMP_NEXT_IP4_REWRITE_MCAST_NODE,
- IGMP_NEXT_IP6_REWRITE_MCAST_NODE,
- IGMP_N_NEXT,
-} igmp_next_t;
-
-
-always_inline igmp_config_t *
-igmp_config_lookup (igmp_main_t * im, u32 sw_if_index)
-{
- uword *p;
- igmp_config_t *config = NULL;
-
- p = hash_get_mem (im->igmp_config_by_sw_if_index, &sw_if_index);
- if (p)
- config = vec_elt_at_index (im->configs, p[0]);
-
- return config;
-}
-
-always_inline igmp_sg_t *
-igmp_sg_lookup (igmp_config_t * config, igmp_sg_key_t * key)
-{
- uword *p;
- igmp_sg_t *sg = NULL;
- if (!config)
- return NULL;
-
- p = hash_get_mem (config->igmp_sg_by_key, key);
- if (p)
- sg = vec_elt_at_index (config->sg, p[0]);
-
- return sg;
-}
-
-always_inline igmp_api_client_t *
-igmp_api_client_lookup (igmp_main_t * im, u32 client_index)
-{
- uword *p;
- igmp_api_client_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;
-}
+/**
+ * @brief IGMP interface enable/disable
+ * @param sw_if_index - Interface
+ * @param enable - enable/disable
+ * @param mode - Host or router
+ */
+int igmp_enable_disable (u32 sw_if_index, u8 enable, igmp_mode_t mode);
+
+/**
+ * @brief igmp listen
+ * Called by a host to request reception of multicast packets
+ * @param vm - vlib main
+ * @param filter - Filter mode
+ * @param sw_if_index - interface sw_if_index
+ * @param saddr - source address
+ * @param gaddr - group address
+ *
+ * Add/del (S,G) on an interface.
+ * send a status change report from the interface.
+ */
+int igmp_listen (vlib_main_t * vm,
+ igmp_filter_mode_t filter,
+ u32 sw_if_index,
+ const ip46_address_t * saddr, const ip46_address_t * gaddr);
+
+/**
+ * @brief Send an IGMP event to listening parties
+ * @param filter mode
+ * @param sw_if_index
+ * @param saddr
+ * @param gaddr
+ */
+void igmp_event (igmp_filter_mode_t filter,
+ u32 sw_if_index,
+ const ip46_address_t * saddr, const ip46_address_t * gaddr);