• M
    bpf: Change bpf_sk_release and bpf_sk_*cgroup_id to accept ARG_PTR_TO_BTF_ID_SOCK_COMMON · a5fa25ad
    Martin KaFai Lau 提交于
    The previous patch allows the networking bpf prog to use the
    bpf_skc_to_*() helpers to get a PTR_TO_BTF_ID socket pointer,
    e.g. "struct tcp_sock *".  It allows the bpf prog to read all the
    fields of the tcp_sock.
    
    This patch changes the bpf_sk_release() and bpf_sk_*cgroup_id()
    to take ARG_PTR_TO_BTF_ID_SOCK_COMMON such that they will
    work with the pointer returned by the bpf_skc_to_*() helpers
    also.  For example, the following will work:
    
    	sk = bpf_skc_lookup_tcp(skb, tuple, tuplen, BPF_F_CURRENT_NETNS, 0);
    	if (!sk)
    		return;
    	tp = bpf_skc_to_tcp_sock(sk);
    	if (!tp) {
    		bpf_sk_release(sk);
    		return;
    	}
    	lsndtime = tp->lsndtime;
    	/* Pass tp to bpf_sk_release() will also work */
    	bpf_sk_release(tp);
    
    Since PTR_TO_BTF_ID could be NULL, the helper taking
    ARG_PTR_TO_BTF_ID_SOCK_COMMON has to check for NULL at runtime.
    
    A btf_id of "struct sock" may not always mean a fullsock.  Regardless
    the helper's running context may get a non-fullsock or not,
    considering fullsock check/handling is pretty cheap, it is better to
    keep the same verifier expectation on helper that takes ARG_PTR_TO_BTF_ID*
    will be able to handle the minisock situation.  In the bpf_sk_*cgroup_id()
    case,  it will try to get a fullsock by using sk_to_full_sk() as its
    skb variant bpf_sk"b"_*cgroup_id() has already been doing.
    
    bpf_sk_release can already handle minisock, so nothing special has to
    be done.
    Signed-off-by: NMartin KaFai Lau <kafai@fb.com>
    Signed-off-by: NAlexei Starovoitov <ast@kernel.org>
    Link: https://lore.kernel.org/bpf/20200925000356.3856047-1-kafai@fb.com
    a5fa25ad
bpf.h 176.5 KB