]> git.puffer.fish Git - matthieu/frr.git/commitdiff
pimd: Querier to non-querier transistion to be ignored in a case
authorMobashshera Rasool <mrasool@vmware.com>
Mon, 7 Feb 2022 07:23:21 +0000 (23:23 -0800)
committerMobashshera Rasool <mrasool@vmware.com>
Mon, 7 Feb 2022 09:46:19 +0000 (01:46 -0800)
As per RFC 2236 section 3, when the leave message is received at a querier,
it starts sending Query messages for "last Member Query Interval*query count"
During this time there should not be any querier to non-querier
transition and the same router needs to send the remaning queries.

Fixes: #10422
Signed-off-by: Mobashshera Rasool <mrasool@vmware.com>
pimd/pim_igmp.c

index cf7613f4e4b925b5e16c0f8f28e41147c84f1dc6..512384d6422a3fe2bc6d0e414ee29bd40836a799 100644 (file)
@@ -377,6 +377,30 @@ static int igmp_recv_query(struct gm_sock *igmp, int query_version,
         */
        if (ntohl(from.s_addr) < ntohl(igmp->ifaddr.s_addr)) {
 
+               /* As per RFC 2236 section 3:
+                * When a Querier receives a Leave Group message for a group
+                * that has group members on the reception interface, it sends
+                * [Last Member Query Count] Group-Specific Queries every [Last
+                * Member Query Interval] to the group being left.  These
+                * Group-Specific Queries have their Max Response time set to
+                * [Last Member Query Interval].  If no Reports are received
+                * after the response time of the last query expires, the
+                * routers assume that the group has no local members, as above.
+                * Any Querier to non-Querier transition is ignored during this
+                * time; the same router keeps sending the Group-Specific
+                * Queries.
+                */
+               struct gm_group *group;
+
+               group = find_group_by_addr(igmp, group_addr);
+               if (group && group->t_group_query_retransmit_timer) {
+                       if (PIM_DEBUG_IGMP_TRACE)
+                               zlog_debug(
+                                       "%s: lower address query packet from %s is ignored when last member query interval timer is running",
+                                       ifp->name, from_str);
+                       return 0;
+               }
+
                if (PIM_DEBUG_IGMP_TRACE) {
                        char ifaddr_str[INET_ADDRSTRLEN];
                        pim_inet4_dump("<ifaddr?>", igmp->ifaddr, ifaddr_str,