• Benjamin Poirier's avatar
    nexthop: Do not return invalid nexthop object during multipath selection · 75f5f04c
    Benjamin Poirier authored
    With legacy nexthops, when net.ipv4.fib_multipath_use_neigh is set,
    fib_select_multipath() will never set res->nhc to a nexthop that is not
    good (as per fib_good_nh()). OTOH, with nexthop objects,
    nexthop_select_path_hthr() may return a nexthop that failed the
    nexthop_is_good_nh() test even if there was one that passed. Refactor
    nexthop_select_path_hthr() to follow a selection logic more similar to
    fib_select_multipath().
    
    The issue can be demonstrated with the following sequence of commands. The
    first block shows that things work as expected with legacy nexthops. The
    last sequence of `ip rou get` in the second block shows the problem case -
    some routes still use the .2 nexthop.
    
    sysctl net.ipv4.fib_multipath_use_neigh=1
    ip link add dummy1 up type dummy
    ip rou add 198.51.100.0/24 nexthop via 192.0.2.1 dev dummy1 onlink nexthop via 192.0.2.2 dev dummy1 onlink
    for i in {10..19}; do ip -o rou get 198.51.100.$i; done
    ip neigh add 192.0.2.1 dev dummy1 nud failed
    echo ".1 failed:"  # results should not use .1
    for i in {10..19}; do ip -o rou get 198.51.100.$i; done
    ip neigh del 192.0.2.1 dev dummy1
    ip neigh add 192.0.2.2 dev dummy1 nud failed
    echo ".2 failed:"  # results should not use .2
    for i in {10..19}; do ip -o rou get 198.51.100.$i; done
    ip link del dummy1
    
    ip link add dummy1 up type dummy
    ip nexthop add id 1 via 192.0.2.1 dev dummy1 onlink
    ip nexthop add id 2 via 192.0.2.2 dev dummy1 onlink
    ip nexthop add id 1001 group 1/2
    ip rou add 198.51.100.0/24 nhid 1001
    for i in {10..19}; do ip -o rou get 198.51.100.$i; done
    ip neigh add 192.0.2.1 dev dummy1 nud failed
    echo ".1 failed:"  # results should not use .1
    for i in {10..19}; do ip -o rou get 198.51.100.$i; done
    ip neigh del 192.0.2.1 dev dummy1
    ip neigh add 192.0.2.2 dev dummy1 nud failed
    echo ".2 failed:"  # results should not use .2
    for i in {10..19}; do ip -o rou get 198.51.100.$i; done
    ip link del dummy1
    Signed-off-by: default avatarIdo Schimmel <idosch@nvidia.com>
    Signed-off-by: default avatarBenjamin Poirier <bpoirier@nvidia.com>
    Reviewed-by: default avatarDavid Ahern <dsahern@kernel.org>
    Link: https://lore.kernel.org/r/20230719-nh_select-v2-3-04383e89f868@nvidia.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    75f5f04c
nexthop.c 91.4 KB