• Xin Long's avatar
    route: check sysctl_fib_multipath_use_neigh earlier than hash · 6174a30d
    Xin Long authored
    Prior to this patch, when one packet is hashed into path [1]
    (hash <= nh_upper_bound) and it's neigh is dead, it will try
    path [2]. However, if path [2]'s neigh is alive but it's
    hash > nh_upper_bound, it will not return this alive path.
    This packet will never be sent even if path [2] is alive.
    
     3.3.3.1/24:
      nexthop via 1.1.1.254 dev eth1 weight 1 <--[1] (dead neigh)
      nexthop via 2.2.2.254 dev eth2 weight 1 <--[2]
    
    With sysctl_fib_multipath_use_neigh set is supposed to find an
    available path respecting to the l3/l4 hash. But if there is
    no available route with this hash, it should at least return
    an alive route even with other hash.
    
    This patch is to fix it by processing fib_multipath_use_neigh
    earlier than the hash check, so that it will at least return
    an alive route if there is when fib_multipath_use_neigh is
    enabled. It's also compatible with before when there are alive
    routes with the l3/l4 hash.
    
    Fixes: a6db4494 ("net: ipv4: Consider failed nexthops in multipath routes")
    Reported-by: default avatarJianlin Shi <jishi@redhat.com>
    Signed-off-by: default avatarXin Long <lucien.xin@gmail.com>
    Acked-by: default avatarDavid Ahern <dsa@cumulusnetworks.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    6174a30d
fib_semantics.c 42.1 KB