• Linus Lüssing's avatar
    bridge: mcast: fix disabled snooping after long uptime · f5c3eb4b
    Linus Lüssing authored
    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: b00589af ("bridge: disable snooping if there is no querier")
    Signed-off-by: default avatarLinus Lüssing <linus.luessing@c0d3.blue>
    Acked-by: default avatarNikolay Aleksandrov <razor@blackwall.org>
    Link: https://lore.kernel.org/r/20240127175033.9640-1-linus.luessing@c0d3.blueSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    f5c3eb4b
br_multicast.c 136 KB