+static void
+igmp_handle_group_update (igmp_config_t * config,
+ const igmp_membership_group_v3_t * igmp_group)
+{
+ ip46_address_t *src, *srcs;
+ igmp_group_t *group;
+ ip46_address_t key = {
+ .ip4 = igmp_group->group_address,
+ };
+
+ /*
+ * treat a TO_INC({}) as a (*,G) leave
+ */
+ if (0 == clib_net_to_host_u16 (igmp_group->n_src_addresses))
+ {
+ return (igmp_handle_group_block (config, igmp_group));
+ }
+
+ srcs = igmp_group_mk_source_list (igmp_group);
+ group = igmp_group_lookup (config, &key);
+
+ IGMP_DBG (" ..group-update: %U (%U, %U)",
+ format_vnet_sw_if_index_name,
+ vnet_get_main (), config->sw_if_index,
+ format_igmp_key, &key, format_igmp_src_addr_list, srcs);
+
+ if (NULL == group)
+ {
+ group = igmp_group_alloc (config, &key, IGMP_FILTER_MODE_INCLUDE);
+ }
+
+ /* create or update all sources */
+ vec_foreach (src, srcs)
+ {
+ igmp_group_src_update (group, src, IGMP_MODE_ROUTER);
+ }
+
+ vec_free (srcs);
+}
+