bpf: Add helper to retrieve socket in BPF
This patch adds new BPF helper functions, bpf_sk_lookup_tcp() and
bpf_sk_lookup_udp() which allows BPF programs to find out if there is a
socket listening on this host, and returns a socket pointer which the
BPF program can then access to determine, for instance, whether to
forward or drop traffic. bpf_sk_lookup_xxx() may take a reference on the
socket, so when a BPF program makes use of this function, it must
subsequently pass the returned pointer into the newly added sk_release()
to return the reference.
By way of example, the following pseudocode would filter inbound
connections at XDP if there is no corresponding service listening for
the traffic:
struct bpf_sock_tuple tuple;
struct bpf_sock_ops *sk;
populate_tuple(ctx, &tuple); // Extract the 5tuple from the packet
sk = bpf_sk_lookup_tcp(ctx, &tuple, sizeof tuple, netns, 0);
if (!sk) {
// Couldn't find a socket listening for this traffic. Drop.
return TC_ACT_SHOT;
}
bpf_sk_release(sk, 0);
return TC_ACT_OK;
Signed-off-by: Joe Stringer <joe@wand.net.nz>
Acked-by: Alexei Starovoitov <ast@kernel.org>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
This commit is contained in:
committed by
Daniel Borkmann
parent
fd978bf7fd
commit
6acc9b432e
@@ -153,6 +153,12 @@ static const struct bpf_verifier_ops * const bpf_verifier_ops[] = {
|
||||
* PTR_TO_MAP_VALUE, PTR_TO_SOCKET_OR_NULL becomes PTR_TO_SOCKET when the type
|
||||
* passes through a NULL-check conditional. For the branch wherein the state is
|
||||
* changed to CONST_IMM, the verifier releases the reference.
|
||||
*
|
||||
* For each helper function that allocates a reference, such as
|
||||
* bpf_sk_lookup_tcp(), there is a corresponding release function, such as
|
||||
* bpf_sk_release(). When a reference type passes into the release function,
|
||||
* the verifier also releases the reference. If any unchecked or unreleased
|
||||
* reference remains at the end of the program, the verifier rejects it.
|
||||
*/
|
||||
|
||||
/* verifier_state + insn_idx are pushed to stack when branch is encountered */
|
||||
@@ -300,7 +306,7 @@ static bool arg_type_is_refcounted(enum bpf_arg_type type)
|
||||
*/
|
||||
static bool is_release_function(enum bpf_func_id func_id)
|
||||
{
|
||||
return false;
|
||||
return func_id == BPF_FUNC_sk_release;
|
||||
}
|
||||
|
||||
/* string representation of 'enum bpf_reg_type' */
|
||||
|
||||
Reference in New Issue
Block a user