Commit 725721a6 authored by Viet Hoang Tran's avatar Viet Hoang Tran Committed by Alexei Starovoitov

bpf: allow clearing all sock_ops callback flags

The helper function bpf_sock_ops_cb_flags_set() can be used to both
set and clear the sock_ops callback flags. However, its current
behavior is not consistent. BPF program may clear a flag if more than
one were set, or replace a flag with another one, but cannot clear all
flags.

This patch also updates the documentation to clarify the ability to
clear flags of this helper function.
Signed-off-by: default avatarHoang Tran <hoang.tran@uclouvain.be>
Acked-by: default avatarMartin KaFai Lau <kafai@fb.com>
Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
parent 809041e7
...@@ -1737,12 +1737,19 @@ union bpf_attr { ...@@ -1737,12 +1737,19 @@ union bpf_attr {
* error if an eBPF program tries to set a callback that is not * error if an eBPF program tries to set a callback that is not
* supported in the current kernel. * supported in the current kernel.
* *
* The supported callback values that *argval* can combine are: * *argval* is a flag array which can combine these flags:
* *
* * **BPF_SOCK_OPS_RTO_CB_FLAG** (retransmission time out) * * **BPF_SOCK_OPS_RTO_CB_FLAG** (retransmission time out)
* * **BPF_SOCK_OPS_RETRANS_CB_FLAG** (retransmission) * * **BPF_SOCK_OPS_RETRANS_CB_FLAG** (retransmission)
* * **BPF_SOCK_OPS_STATE_CB_FLAG** (TCP state change) * * **BPF_SOCK_OPS_STATE_CB_FLAG** (TCP state change)
* *
* Therefore, this function can be used to clear a callback flag by
* setting the appropriate bit to zero. e.g. to disable the RTO
* callback:
*
* **bpf_sock_ops_cb_flags_set(bpf_sock,**
* **bpf_sock->bpf_sock_ops_cb_flags & ~BPF_SOCK_OPS_RTO_CB_FLAG)**
*
* Here are some examples of where one could call such eBPF * Here are some examples of where one could call such eBPF
* program: * program:
* *
......
...@@ -4437,7 +4437,6 @@ BPF_CALL_2(bpf_sock_ops_cb_flags_set, struct bpf_sock_ops_kern *, bpf_sock, ...@@ -4437,7 +4437,6 @@ BPF_CALL_2(bpf_sock_ops_cb_flags_set, struct bpf_sock_ops_kern *, bpf_sock,
if (!IS_ENABLED(CONFIG_INET) || !sk_fullsock(sk)) if (!IS_ENABLED(CONFIG_INET) || !sk_fullsock(sk))
return -EINVAL; return -EINVAL;
if (val)
tcp_sk(sk)->bpf_sock_ops_cb_flags = val; tcp_sk(sk)->bpf_sock_ops_cb_flags = val;
return argval & (~BPF_SOCK_OPS_ALL_CB_FLAGS); return argval & (~BPF_SOCK_OPS_ALL_CB_FLAGS);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment