Files
Felix Maurer 6ccbf975c6 hsr: Implement more robust duplicate discard for HSR
JIRA: https://issues.redhat.com/browse/RHEL-40917
JIRA: https://issues.redhat.com/browse/RHEL-146811

commit aae9d6b616b5e4ad8bbb82aa3661baa1522684d2
Author: Felix Maurer <fmaurer@redhat.com>
Date:   Thu Feb 5 14:57:33 2026 +0100

    hsr: Implement more robust duplicate discard for HSR

    The HSR duplicate discard algorithm had even more basic problems than the
    described for PRP in the previous patch. It relied only on the last
    received sequence number to decide if a new frame should be forwarded to
    any port. This does not work correctly in any case where frames are
    received out of order. The linked bug report claims that this can even
    happen with perfectly fine links due to the order in which incoming frames
    are processed (which can be unexpected on multi-core systems). The issue
    also occasionally shows up in the HSR selftests. The main reason is that
    the sequence number that was last forwarded to the master port may have
    skipped a number which will in turn never be delivered to the host.

    As the problem (we accidentally skip over a sequence number that has not
    been received but will be received in the future) is similar to PRP, we can
    apply a similar solution. The duplicate discard algorithm based on the
    "sparse bitmap" works well for HSR if it is extended to track one bitmap
    for each port (A, B, master, interlink). To do this, change the sequence
    number blocks to contain a flexible array member as the last member that
    can keep chunks for as many bitmaps as we need. This design makes it easy
    to reuse the same algorithm in a potential PRP RedBox implementation.

    The duplicate discard algorithm functions are modified to deal with
    sequence number blocks of different sizes and to correctly use the array of
    bitmap chunks. There is a notable speciality for HSR: the port type has a
    special port type NONE with value 0. This leads to the number of port types
    being 5 instead of actually 4. To save memory, remove the NONE port from
    the bitmap (by subtracting 1) when setting up the block buffer and when
    accessing the bitmap chunks in the array.

    Removing the old algorithm allows us to get rid of a few fields that are
    not needed any more: time_out and seq_out for each port. We can also remove
    some functions that were only necessary for the previous duplicate discard
    algorithm.

    The removal of seq_out is possible despite its previous usage in
    hsr_register_frame_in: it was used to prevent updates to time_in when
    "invalid" sequence numbers were received. With the new duplicate discard
    algorithm, time_in has no relevance for the expiry of sequence numbers
    anymore. They will expire based on the timestamps in the sequence number
    blocks after at most 400ms. There is no need that a node "re-registers" to
    "resume communication": after 400ms, all sequence numbers are accepted
    again. Also, according to the IEC 62439-3:2021, all nodes are supposed to
    send no traffic for 500ms after boot to lead exactly to this expiry of seen
    sequence numbers. time_in is still used for pruning nodes from the node
    table after no traffic has been received for 60sec. Pruning is only needed
    if the node is really gone and has not been sending any traffic for that
    period.

    seq_out was also used to report the last incoming sequence number from a
    node through netlink. I am not sure how useful this value is to userspace
    at all, but added getting it from the sequence number blocks. This number
    can be outdated after node merging until a new block has been added.

    Update the KUnit test for the PRP duplicate discard so that the node
    allocation matches and expectations on the removed fields are removed.

    Reported-by: Yoann Congal <yoann.congal@smile.fr>
    Closes: https://lore.kernel.org/netdev/7d221a07-8358-4c0b-a09c-3b029c052245@smile.fr/
    Signed-off-by: Felix Maurer <fmaurer@redhat.com>
    Reviewed-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
    Link: https://patch.msgid.link/36dc3bc5bdb7e68b70bb5ef86f53ca95a3f35418.1770299429.git.fmaurer@redhat.com
    Signed-off-by: Paolo Abeni <pabeni@redhat.com>

Signed-off-by: Felix Maurer <fmaurer@redhat.com>
2026-02-10 14:51:48 +01:00
..
2025-12-24 00:11:07 +01:00
2025-12-24 00:11:07 +01:00