bpf: tcp: Do not limit cb_flags when creating child sk from listen sk
The commit0813a84156
("bpf: tcp: Allow bpf prog to write and parse TCP header option") unnecessarily introduced bpf_skops_init_child() which limited the child sk from inheriting all bpf_sock_ops_cb_flags of the listen sk. That breaks existing user expectation. This patch removes the bpf_skops_init_child() and just allows sock_copy() to do its job to copy everything from listen sk to the child sk. Fixes:0813a84156
("bpf: tcp: Allow bpf prog to write and parse TCP header option") Reported-by: Stanislav Fomichev <sdf@google.com> Signed-off-by: Martin KaFai Lau <kafai@fb.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org> Link: https://lore.kernel.org/bpf/20201002013448.2542025-1-kafai@fb.com
This commit is contained in:
committed by
Alexei Starovoitov
parent
48ca6243c6
commit
82f45c6c4a
@ -2228,34 +2228,6 @@ int __tcp_bpf_recvmsg(struct sock *sk, struct sk_psock *psock,
|
|||||||
#endif /* CONFIG_NET_SOCK_MSG */
|
#endif /* CONFIG_NET_SOCK_MSG */
|
||||||
|
|
||||||
#ifdef CONFIG_CGROUP_BPF
|
#ifdef CONFIG_CGROUP_BPF
|
||||||
/* Copy the listen sk's HDR_OPT_CB flags to its child.
|
|
||||||
*
|
|
||||||
* During 3-Way-HandShake, the synack is usually sent from
|
|
||||||
* the listen sk with the HDR_OPT_CB flags set so that
|
|
||||||
* bpf-prog will be called to write the BPF hdr option.
|
|
||||||
*
|
|
||||||
* In fastopen, the child sk is used to send synack instead
|
|
||||||
* of the listen sk. Thus, inheriting the HDR_OPT_CB flags
|
|
||||||
* from the listen sk gives the bpf-prog a chance to write
|
|
||||||
* BPF hdr option in the synack pkt during fastopen.
|
|
||||||
*
|
|
||||||
* Both fastopen and non-fastopen child will inherit the
|
|
||||||
* HDR_OPT_CB flags to keep the bpf-prog having a consistent
|
|
||||||
* behavior when deciding to clear this cb flags (or not)
|
|
||||||
* during the PASSIVE_ESTABLISHED_CB.
|
|
||||||
*
|
|
||||||
* In the future, other cb flags could be inherited here also.
|
|
||||||
*/
|
|
||||||
static inline void bpf_skops_init_child(const struct sock *sk,
|
|
||||||
struct sock *child)
|
|
||||||
{
|
|
||||||
tcp_sk(child)->bpf_sock_ops_cb_flags =
|
|
||||||
tcp_sk(sk)->bpf_sock_ops_cb_flags &
|
|
||||||
(BPF_SOCK_OPS_PARSE_ALL_HDR_OPT_CB_FLAG |
|
|
||||||
BPF_SOCK_OPS_PARSE_UNKNOWN_HDR_OPT_CB_FLAG |
|
|
||||||
BPF_SOCK_OPS_WRITE_HDR_OPT_CB_FLAG);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void bpf_skops_init_skb(struct bpf_sock_ops_kern *skops,
|
static inline void bpf_skops_init_skb(struct bpf_sock_ops_kern *skops,
|
||||||
struct sk_buff *skb,
|
struct sk_buff *skb,
|
||||||
unsigned int end_offset)
|
unsigned int end_offset)
|
||||||
@ -2264,11 +2236,6 @@ static inline void bpf_skops_init_skb(struct bpf_sock_ops_kern *skops,
|
|||||||
skops->skb_data_end = skb->data + end_offset;
|
skops->skb_data_end = skb->data + end_offset;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
static inline void bpf_skops_init_child(const struct sock *sk,
|
|
||||||
struct sock *child)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void bpf_skops_init_skb(struct bpf_sock_ops_kern *skops,
|
static inline void bpf_skops_init_skb(struct bpf_sock_ops_kern *skops,
|
||||||
struct sk_buff *skb,
|
struct sk_buff *skb,
|
||||||
unsigned int end_offset)
|
unsigned int end_offset)
|
||||||
|
@ -548,7 +548,6 @@ struct sock *tcp_create_openreq_child(const struct sock *sk,
|
|||||||
newtp->fastopen_req = NULL;
|
newtp->fastopen_req = NULL;
|
||||||
RCU_INIT_POINTER(newtp->fastopen_rsk, NULL);
|
RCU_INIT_POINTER(newtp->fastopen_rsk, NULL);
|
||||||
|
|
||||||
bpf_skops_init_child(sk, newsk);
|
|
||||||
tcp_bpf_clone(sk, newsk);
|
tcp_bpf_clone(sk, newsk);
|
||||||
|
|
||||||
__TCP_INC_STATS(sock_net(sk), TCP_MIB_PASSIVEOPENS);
|
__TCP_INC_STATS(sock_net(sk), TCP_MIB_PASSIVEOPENS);
|
||||||
|
Reference in New Issue
Block a user