]> git.baikalelectronics.ru Git - kernel.git/commitdiff
ipv4: Initialize flowi4_multipath_hash in data path
authorDavid Ahern <dsahern@gmail.com>
Sun, 13 Sep 2020 18:43:39 +0000 (12:43 -0600)
committerDavid S. Miller <davem@davemloft.net>
Mon, 14 Sep 2020 21:54:56 +0000 (14:54 -0700)
flowi4_multipath_hash was added by the commit referenced below for
tunnels. Unfortunately, the patch did not initialize the new field
for several fast path lookups that do not initialize the entire flow
struct to 0. Fix those locations. Currently, flowi4_multipath_hash
is random garbage and affects the hash value computed by
fib_multipath_hash for multipath selection.

Fixes: 7f7e38416114 ("route: Add multipath_hash in flowi_common to make user-define hash")
Signed-off-by: David Ahern <dsahern@gmail.com>
Cc: wenxu <wenxu@ucloud.cn>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/flow.h
net/core/filter.c
net/ipv4/fib_frontend.c
net/ipv4/route.c

index 929d3ca614d06d5205ad0ee0db3123cd21e30901..b2531df3f65f1958a3fc603a598ee05253b491aa 100644 (file)
@@ -116,6 +116,7 @@ static inline void flowi4_init_output(struct flowi4 *fl4, int oif,
        fl4->saddr = saddr;
        fl4->fl4_dport = dport;
        fl4->fl4_sport = sport;
+       fl4->flowi4_multipath_hash = 0;
 }
 
 /* Reset some input parameters after previous lookup */
index 1f647ab986b614d719555b402ed00757fe268095..1b168371ba96054d098b71a04b7f4667dd98f767 100644 (file)
@@ -4838,6 +4838,7 @@ static int bpf_ipv4_fib_lookup(struct net *net, struct bpf_fib_lookup *params,
        fl4.saddr = params->ipv4_src;
        fl4.fl4_sport = params->sport;
        fl4.fl4_dport = params->dport;
+       fl4.flowi4_multipath_hash = 0;
 
        if (flags & BPF_FIB_LOOKUP_DIRECT) {
                u32 tbid = l3mdev_fib_table_rcu(dev) ? : RT_TABLE_MAIN;
index 41079490a118162e992e44e272b72f3b688093c9..86a23e4a6a50ffce36e5ac1849361f4dd91e6eac 100644 (file)
@@ -362,6 +362,7 @@ static int __fib_validate_source(struct sk_buff *skb, __be32 src, __be32 dst,
        fl4.flowi4_tun_key.tun_id = 0;
        fl4.flowi4_flags = 0;
        fl4.flowi4_uid = sock_net_uid(net, NULL);
+       fl4.flowi4_multipath_hash = 0;
 
        no_addr = idev->ifa_list == NULL;
 
index 8ca6bcab7b03d9204fc0de3adca2cdd0c8e0672d..e5f210d00851909436de7951f873259f189912aa 100644 (file)
@@ -2147,6 +2147,7 @@ static int ip_route_input_slow(struct sk_buff *skb, __be32 daddr, __be32 saddr,
        fl4.daddr = daddr;
        fl4.saddr = saddr;
        fl4.flowi4_uid = sock_net_uid(net, NULL);
+       fl4.flowi4_multipath_hash = 0;
 
        if (fib4_rules_early_flow_dissect(net, skb, &fl4, &_flkeys)) {
                flkeys = &_flkeys;