Skip to content

Commit 6174a30

Browse files
lxindavem330
authored andcommitted
route: check sysctl_fib_multipath_use_neigh earlier than hash
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: a6db449 ("net: ipv4: Consider failed nexthops in multipath routes") Reported-by: Jianlin Shi <[email protected]> Signed-off-by: Xin Long <[email protected]> Acked-by: David Ahern <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 781492a commit 6174a30

File tree

1 file changed

+11
-9
lines changed

1 file changed

+11
-9
lines changed

net/ipv4/fib_semantics.c

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1746,18 +1746,20 @@ void fib_select_multipath(struct fib_result *res, int hash)
17461746
bool first = false;
17471747

17481748
for_nexthops(fi) {
1749+
if (net->ipv4.sysctl_fib_multipath_use_neigh) {
1750+
if (!fib_good_nh(nh))
1751+
continue;
1752+
if (!first) {
1753+
res->nh_sel = nhsel;
1754+
first = true;
1755+
}
1756+
}
1757+
17491758
if (hash > atomic_read(&nh->nh_upper_bound))
17501759
continue;
17511760

1752-
if (!net->ipv4.sysctl_fib_multipath_use_neigh ||
1753-
fib_good_nh(nh)) {
1754-
res->nh_sel = nhsel;
1755-
return;
1756-
}
1757-
if (!first) {
1758-
res->nh_sel = nhsel;
1759-
first = true;
1760-
}
1761+
res->nh_sel = nhsel;
1762+
return;
17611763
} endfor_nexthops(fi);
17621764
}
17631765
#endif

0 commit comments

Comments
 (0)