pimd: IGMP Querier election is not correct in LAN scenario

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>
This commit is contained in:
Mobashshera Rasool 2022-09-27 04:49:34 -07:00
parent 031561497c
commit a0625bb356

View File

@ -610,11 +610,18 @@ 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);
}
}
/* IGMP version 3 is the only one where we process the RXed query */
if (query_version == 3) {