]> git.puffer.fish Git - mirror/frr.git/commitdiff
pimd: IGMP Querier election is not correct in LAN scenario 12028/head
authorMobashshera Rasool <mrasool@vmware.com>
Tue, 27 Sep 2022 11:49:34 +0000 (04:49 -0700)
committerMobashshera Rasool <mrasool@vmware.com>
Tue, 27 Sep 2022 12:04:24 +0000 (05:04 -0700)
When more than 2 routers are present in LAN and the querier
goes down, the other routers will wait for other querier
present timer to expire to elect a new querier.
This issue will be seen when the router having next lower ip
address expires the other querier present timer first and it
starts sending the query message. Now on the other non-querier
routers it will receive this query and reset its other
querier present timer but the querier is still the old one
and since it is lowest ip, it never gets updated to the newly
elected querier.

Reset the other querier timer only if query is received from
the previously elected querier or a better new querier
This will make sure that non-querier elects the new querier
whose ip address is higher than the old querier
when the old querier goes down via other querier querier
timer expiry

Issue: #12027

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

index 57ae15079b7b23be7c564c3f03a250043dd12359..308cba0697f1624e19ac14088666acae6d217998 100644 (file)
@@ -610,10 +610,17 @@ static int igmp_recv_query(struct gm_sock *igmp, int query_version,
                                ntohl(igmp->ifaddr.s_addr), from_str,
                                ntohl(from.s_addr));
                }
-               if (ntohl(from.s_addr) < ntohl(igmp->querier_addr.s_addr))
+               /* Reset the other querier timer only if query is received from
+                * the previously elected querier or a better new querier
+                * This will make sure that non-querier elects the new querier
+                * whose ip address is higher than the old querier
+                * in case the old querier goes down via other querier present
+                * timer expiry
+                */
+               if (ntohl(from.s_addr) <= ntohl(igmp->querier_addr.s_addr)) {
                        igmp->querier_addr.s_addr = from.s_addr;
-
-               pim_igmp_other_querier_timer_on(igmp);
+                       pim_igmp_other_querier_timer_on(igmp);
+               }
        }
 
        /* IGMP version 3 is the only one where we process the RXed query */