• Martin KaFai Lau's avatar
    bpf: Add bpf_get_listener_sock(struct bpf_sock *sk) helper · dbafd7dd
    Martin KaFai Lau authored
    Add a new helper "struct bpf_sock *bpf_get_listener_sock(struct bpf_sock *sk)"
    which returns a bpf_sock in TCP_LISTEN state.  It will trace back to
    the listener sk from a request_sock if possible.  It returns NULL
    for all other cases.
    
    No reference is taken because the helper ensures the sk is
    in SOCK_RCU_FREE (where the TCP_LISTEN sock should be in).
    Hence, bpf_sk_release() is unnecessary and the verifier does not
    allow bpf_sk_release(listen_sk) to be called either.
    
    The following is also allowed because the bpf_prog is run under
    rcu_read_lock():
    
    	sk = bpf_sk_lookup_tcp();
    	/* if (!sk) { ... } */
    	listen_sk = bpf_get_listener_sock(sk);
    	/* if (!listen_sk) { ... } */
    	bpf_sk_release(sk);
    	src_port = listen_sk->src_port; /* Allowed */
    Signed-off-by: default avatarMartin KaFai Lau <kafai@fb.com>
    Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    dbafd7dd
filter.c 221 KB