udp, bpf: Ignore connections in reuseport group after BPF sk lookup
authorJakub Sitnicki <jakub@cloudflare.com>
Sun, 26 Jul 2020 12:02:28 +0000 (14:02 +0200)
committerDaniel Borkmann <daniel@iogearbox.net>
Fri, 31 Jul 2020 00:00:48 +0000 (02:00 +0200)
When BPF sk lookup invokes reuseport handling for the selected socket, it
should ignore the fact that reuseport group can contain connected UDP
sockets. With BPF sk lookup this is not relevant as we are not scoring
sockets to find the best match, which might be a connected UDP socket.

Fix it by unconditionally accepting the socket selected by reuseport.

This fixes the following two failures reported by test_progs.

  # ./test_progs -t sk_lookup
  ...
  #73/14 UDP IPv4 redir and reuseport with conns:FAIL
  ...
  #73/20 UDP IPv6 redir and reuseport with conns:FAIL
  ...

Fixes: a57066b1a019 ("Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net")
Reported-by: Alexei Starovoitov <alexei.starovoitov@gmail.com>
Signed-off-by: Jakub Sitnicki <jakub@cloudflare.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Link: https://lore.kernel.org/bpf/20200726120228.1414348-1-jakub@cloudflare.com
net/ipv4/udp.c
net/ipv6/udp.c

index 7ce31beccfc2d5557c8b7106d5ad07812c1fc2c4..e88efba07551a613e761615149ce4e0517673cf1 100644 (file)
@@ -473,7 +473,7 @@ static struct sock *udp4_lookup_run_bpf(struct net *net,
                return sk;
 
        reuse_sk = lookup_reuseport(net, sk, skb, saddr, sport, daddr, hnum);
-       if (reuse_sk && !reuseport_has_conns(sk, false))
+       if (reuse_sk)
                sk = reuse_sk;
        return sk;
 }
index c394e674f48604facc6f5b121483b13180d82934..29d9691359b9c49ccb56a11f79e3658b1a76700d 100644 (file)
@@ -208,7 +208,7 @@ static inline struct sock *udp6_lookup_run_bpf(struct net *net,
                return sk;
 
        reuse_sk = lookup_reuseport(net, sk, skb, saddr, sport, daddr, hnum);
-       if (reuse_sk && !reuseport_has_conns(sk, false))
+       if (reuse_sk)
                sk = reuse_sk;
        return sk;
 }