bpf: Allow bpf_map_lookup_elem for SOCKMAP and SOCKHASH
authorJakub Sitnicki <jakub@cloudflare.com>
Wed, 29 Apr 2020 18:11:52 +0000 (20:11 +0200)
committerDaniel Borkmann <daniel@iogearbox.net>
Wed, 29 Apr 2020 21:30:59 +0000 (23:30 +0200)
commit64d85290d79c0677edb5a8ee2295b36c022fa5df
treeb8bc403085811e0d4358be3d4d57ae24a6ff1e2f
parent0b3b9ca3d154486baa08a41cbc62fde67ba8c6c3
bpf: Allow bpf_map_lookup_elem for SOCKMAP and SOCKHASH

White-list map lookup for SOCKMAP/SOCKHASH from BPF. Lookup returns a
pointer to a full socket and acquires a reference if necessary.

To support it we need to extend the verifier to know that:

 (1) register storing the lookup result holds a pointer to socket, if
     lookup was done on SOCKMAP/SOCKHASH, and that

 (2) map lookup on SOCKMAP/SOCKHASH is a reference acquiring operation,
     which needs a corresponding reference release with bpf_sk_release.

On sock_map side, lookup handlers exposed via bpf_map_ops now bump
sk_refcnt if socket is reference counted. In turn, bpf_sk_select_reuseport,
the only in-kernel user of SOCKMAP/SOCKHASH ops->map_lookup_elem, was
updated to release the reference.

Sockets fetched from a map can be used in the same way as ones returned by
BPF socket lookup helpers, such as bpf_sk_lookup_tcp. In particular, they
can be used with bpf_sk_assign to direct packets toward a socket on TC
ingress path.

Suggested-by: Lorenz Bauer <lmb@cloudflare.com>
Signed-off-by: Jakub Sitnicki <jakub@cloudflare.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: John Fastabend <john.fastabend@gmail.com>
Link: https://lore.kernel.org/bpf/20200429181154.479310-2-jakub@cloudflare.com
kernel/bpf/verifier.c
net/core/filter.c
net/core/sock_map.c