On 2/6/21 10:09 AM, Andrea Mayer wrote: > 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: Andrea Mayer <andrea.ma...@uniroma2.it> > --- > net/ipv6/seg6_local.c | 67 +++++++++++++++++++++++++------------------ > 1 file changed, 39 insertions(+), 28 deletions(-) >
Reviewed-by: David Ahern <dsah...@kernel.org>