• Sebastian Andrzej Siewior's avatar
    hsr: Synchronize sequence number updates. · 5c7aa132
    Sebastian Andrzej Siewior authored
    hsr_register_frame_out() compares new sequence_nr vs the old one
    recorded in hsr_node::seq_out and if the new sequence_nr is higher then
    it will be written to hsr_node::seq_out as the new value.
    
    This operation isn't locked so it is possible that two frames with the
    same sequence number arrive (via the two slave devices) and are fed to
    hsr_register_frame_out() at the same time. Both will pass the check and
    update the sequence counter later to the same value. As a result the
    content of the same packet is fed into the stack twice.
    
    This was noticed by running ping and observing DUP being reported from
    time to time.
    
    Instead of using the hsr_priv::seqnr_lock for the whole receive path (as
    it is for sending in the master node) add an additional lock that is only
    used for sequence number checks and updates.
    
    Add a per-node lock that is used during sequence number reads and
    updates.
    
    Fixes: f421436a ("net/hsr: Add support for the High-availability Seamless Redundancy protocol (HSRv0)")
    Signed-off-by: default avatarSebastian Andrzej Siewior <bigeasy@linutronix.de>
    Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    5c7aa132
hsr_framereg.c 17.4 KB