Commit 82f45c6c authored by Martin KaFai Lau's avatar Martin KaFai Lau Committed by Alexei Starovoitov
Browse files

bpf: tcp: Do not limit cb_flags when creating child sk from listen sk



The commit 0813a841 ("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: 0813a841 ("bpf: tcp: Allow bpf prog to write and parse TCP header option")
Reported-by: default avatarStanislav Fomichev <sdf@google.com>
Signed-off-by: default avatarMartin KaFai Lau <kafai@fb.com>
Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
Link: https://lore.kernel.org/bpf/20201002013448.2542025-1-kafai@fb.com
parent 48ca6243
Loading
Loading
Loading
Loading
+0 −33
Original line number Diff line number Diff line
@@ -2228,34 +2228,6 @@ int __tcp_bpf_recvmsg(struct sock *sk, struct sk_psock *psock,
#endif /* CONFIG_NET_SOCK_MSG */

#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,
				      struct sk_buff *skb,
				      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;
}
#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,
				      struct sk_buff *skb,
				      unsigned int end_offset)
+0 −1
Original line number Diff line number Diff line
@@ -548,7 +548,6 @@ struct sock *tcp_create_openreq_child(const struct sock *sk,
	newtp->fastopen_req = NULL;
	RCU_INIT_POINTER(newtp->fastopen_rsk, NULL);

	bpf_skops_init_child(sk, newsk);
	tcp_bpf_clone(sk, newsk);

	__TCP_INC_STATS(sock_net(sk), TCP_MIB_PASSIVEOPENS);