• A
    seg6: fool-proof the processing of SRv6 behavior attributes · 300a0fd8
    Andrea Mayer 提交于
    The set of required attributes for a given SRv6 behavior is identified
    using a bitmap stored in an unsigned long, since the initial design of SRv6
    networking in Linux. Recently the same approach has been used for
    identifying the optional attributes.
    
    However, the number of attributes supported by SRv6 behaviors depends on
    the size of the unsigned long type which changes with the architecture.
    Indeed, on a 64-bit architecture, an SRv6 behavior can support up to 64
    attributes while on a 32-bit architecture it can support at most 32
    attributes.
    
    To fool-proof the processing of SRv6 behaviors we verify, at compile time,
    that the set of all supported SRv6 attributes can be encoded into a bitmap
    stored in an unsigned long. Otherwise, kernel build fails forcing
    developers to reconsider adding a new attribute or extend the total
    number of supported attributes by the SRv6 behaviors.
    
    Moreover, we replace all patterns (1 << i) with the macro SEG6_F_ATTR(i) in
    order to address potential overflow issues caused by 32-bit signed
    arithmetic.
    
    Thanks to Colin Ian King for catching the overflow problem, providing a
    solution and inspiring this patch.
    Thanks to Jakub Kicinski for his useful suggestions during the design of
    this patch.
    
    v2:
     - remove the SEG6_LOCAL_MAX_SUPP which is not strictly needed: it can
       be derived from the unsigned long type. Thanks to David Ahern for
       pointing it out.
    Signed-off-by: NAndrea Mayer <andrea.mayer@uniroma2.it>
    Reviewed-by: NDavid Ahern <dsahern@kernel.org>
    Link: https://lore.kernel.org/r/20210206170934.5982-1-andrea.mayer@uniroma2.itSigned-off-by: NJakub Kicinski <kuba@kernel.org>
    300a0fd8
seg6_local.c 39.0 KB