diff --git a/pimd/pim_igmpv3.c b/pimd/pim_igmpv3.c index d198ec92be..0a6b6b3795 100644 --- a/pimd/pim_igmpv3.c +++ b/pimd/pim_igmpv3.c @@ -543,6 +543,7 @@ static void allow(struct igmp_sock *igmp, struct in_addr from, struct in_addr group_addr, int num_sources, struct in_addr *sources) { + struct igmp_source *source; struct igmp_group *group; int i; @@ -554,7 +555,6 @@ static void allow(struct igmp_sock *igmp, struct in_addr from, /* scan received sources */ for (i = 0; i < num_sources; ++i) { - struct igmp_source *source; struct in_addr *src_addr; src_addr = sources + i; @@ -577,6 +577,17 @@ static void allow(struct igmp_sock *igmp, struct in_addr from, igmp_source_reset_gmi(igmp, group, source); } /* scan received sources */ + + if ((num_sources == 0) && + (group->group_filtermode_isexcl) && + (listcount (group->group_source_list) == 1)) + { + struct in_addr star = { .s_addr = INADDR_ANY }; + + source = igmp_find_source_by_addr (group, star); + if (source) + igmp_source_reset_gmi (igmp, group, source); + } } void igmpv3_report_isin(struct igmp_sock *igmp, struct in_addr from,