• Petr Machata's avatar
    net: ipv4: Add a sysctl to set multipath hash seed · 4ee2a8ca
    Petr Machata authored
    When calculating hashes for the purpose of multipath forwarding, both IPv4
    and IPv6 code currently fall back on flow_hash_from_keys(). That uses a
    randomly-generated seed. That's a fine choice by default, but unfortunately
    some deployments may need a tighter control over the seed used.
    
    In this patch, make the seed configurable by adding a new sysctl key,
    net.ipv4.fib_multipath_hash_seed to control the seed. This seed is used
    specifically for multipath forwarding and not for the other concerns that
    flow_hash_from_keys() is used for, such as queue selection. Expose the knob
    as sysctl because other such settings, such as headers to hash, are also
    handled that way. Like those, the multipath hash seed is a per-netns
    variable.
    
    Despite being placed in the net.ipv4 namespace, the multipath seed sysctl
    is used for both IPv4 and IPv6, similarly to e.g. a number of TCP
    variables.
    
    The seed used by flow_hash_from_keys() is a 128-bit quantity. However it
    seems that usually the seed is a much more modest value. 32 bits seem
    typical (Cisco, Cumulus), some systems go even lower. For that reason, and
    to decouple the user interface from implementation details, go with a
    32-bit quantity, which is then quadruplicated to form the siphash key.
    Signed-off-by: default avatarPetr Machata <petrm@nvidia.com>
    Reviewed-by: default avatarIdo Schimmel <idosch@nvidia.com>
    Reviewed-by: default avatarNikolay Aleksandrov <razor@blackwall.org>
    Reviewed-by: default avatarDavid Ahern <dsahern@kernel.org>
    Link: https://lore.kernel.org/r/20240607151357.421181-3-petrm@nvidia.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    4ee2a8ca
sysctl_net_ipv4.c 42.1 KB