Re: [PATCH net v2] bridge: mcast: fix disabled snooping after long uptime

From: Nikolay Aleksandrov
Date: Sat Jan 27 2024 - 14:32:44 EST


On 27/01/2024 19:50, Linus Lüssing wrote:
> The original idea of the delay_time check was to not apply multicast
> snooping too early when an MLD querier appears. And to instead wait at
> least for MLD reports to arrive before switching from flooding to group
> based, MLD snooped forwarding, to avoid temporary packet loss.
>
> However in a batman-adv mesh network it was noticed that after 248 days of
> uptime 32bit MIPS based devices would start to signal that they had
> stopped applying multicast snooping due to missing queriers - even though
> they were the elected querier and still sending MLD queries themselves.
>
> While time_is_before_jiffies() generally is safe against jiffies
> wrap-arounds, like the code comments in jiffies.h explain, it won't
> be able to track a difference larger than ULONG_MAX/2. With a 32bit
> large jiffies and one jiffies tick every 10ms (CONFIG_HZ=100) on these MIPS
> devices running OpenWrt this would result in a difference larger than
> ULONG_MAX/2 after 248 (= 2^32/100/60/60/24/2) days and
> time_is_before_jiffies() would then start to return false instead of
> true. Leading to multicast snooping not being applied to multicast
> packets anymore.
>
> Fix this issue by using a proper timer_list object which won't have this
> ULONG_MAX/2 difference limitation.
>
> Fixes: b00589af3b04 ("bridge: disable snooping if there is no querier")
> Signed-off-by: Linus Lüssing <linus.luessing@xxxxxxxxx>
> ---
> Changelog v2:
> * removed "inline" from br_multicast_query_delay_expired()
>
> net/bridge/br_multicast.c | 20 +++++++++++++++-----
> net/bridge/br_private.h | 4 ++--
> 2 files changed, 17 insertions(+), 7 deletions(-)
>

Acked-by: Nikolay Aleksandrov <razor@xxxxxxxxxxxxx>