bpf, tcp: Make tcp_bpf_recvmsg static
After commit f747632b608f ("bpf: sockmap: Move generic sockmap hooks from BPF TCP"), tcp_bpf_recvmsg() is not used out of tcp_bpf.c, so make it static and remove it from tcp.h. Also move it to BPF_STREAM_PARSER #ifdef to fix unused function warnings. Fixes: f747632b608f ("bpf: sockmap: Move generic sockmap hooks from BPF TCP") Signed-off-by: YueHaibing <yuehaibing@huawei.com> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Acked-by: Yonghong Song <yhs@fb.com> Link: https://lore.kernel.org/bpf/20200320023426.60684-3-yuehaibing@huawei.com
This commit is contained in:
parent
a26527981a
commit
c0fd336ea4
@ -2207,8 +2207,6 @@ static inline void tcp_bpf_clone(const struct sock *sk, struct sock *newsk)
|
|||||||
#ifdef CONFIG_NET_SOCK_MSG
|
#ifdef CONFIG_NET_SOCK_MSG
|
||||||
int tcp_bpf_sendmsg_redir(struct sock *sk, struct sk_msg *msg, u32 bytes,
|
int tcp_bpf_sendmsg_redir(struct sock *sk, struct sk_msg *msg, u32 bytes,
|
||||||
int flags);
|
int flags);
|
||||||
int tcp_bpf_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
|
||||||
int nonblock, int flags, int *addr_len);
|
|
||||||
int __tcp_bpf_recvmsg(struct sock *sk, struct sk_psock *psock,
|
int __tcp_bpf_recvmsg(struct sock *sk, struct sk_psock *psock,
|
||||||
struct msghdr *msg, int len, int flags);
|
struct msghdr *msg, int len, int flags);
|
||||||
#endif /* CONFIG_NET_SOCK_MSG */
|
#endif /* CONFIG_NET_SOCK_MSG */
|
||||||
|
@ -10,25 +10,6 @@
|
|||||||
#include <net/inet_common.h>
|
#include <net/inet_common.h>
|
||||||
#include <net/tls.h>
|
#include <net/tls.h>
|
||||||
|
|
||||||
static int tcp_bpf_wait_data(struct sock *sk, struct sk_psock *psock,
|
|
||||||
int flags, long timeo, int *err)
|
|
||||||
{
|
|
||||||
DEFINE_WAIT_FUNC(wait, woken_wake_function);
|
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
if (!timeo)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
add_wait_queue(sk_sleep(sk), &wait);
|
|
||||||
sk_set_bit(SOCKWQ_ASYNC_WAITDATA, sk);
|
|
||||||
ret = sk_wait_event(sk, &timeo,
|
|
||||||
!list_empty(&psock->ingress_msg) ||
|
|
||||||
!skb_queue_empty(&sk->sk_receive_queue), &wait);
|
|
||||||
sk_clear_bit(SOCKWQ_ASYNC_WAITDATA, sk);
|
|
||||||
remove_wait_queue(sk_sleep(sk), &wait);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
int __tcp_bpf_recvmsg(struct sock *sk, struct sk_psock *psock,
|
int __tcp_bpf_recvmsg(struct sock *sk, struct sk_psock *psock,
|
||||||
struct msghdr *msg, int len, int flags)
|
struct msghdr *msg, int len, int flags)
|
||||||
{
|
{
|
||||||
@ -102,49 +83,6 @@ int __tcp_bpf_recvmsg(struct sock *sk, struct sk_psock *psock,
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(__tcp_bpf_recvmsg);
|
EXPORT_SYMBOL_GPL(__tcp_bpf_recvmsg);
|
||||||
|
|
||||||
int tcp_bpf_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
|
||||||
int nonblock, int flags, int *addr_len)
|
|
||||||
{
|
|
||||||
struct sk_psock *psock;
|
|
||||||
int copied, ret;
|
|
||||||
|
|
||||||
psock = sk_psock_get(sk);
|
|
||||||
if (unlikely(!psock))
|
|
||||||
return tcp_recvmsg(sk, msg, len, nonblock, flags, addr_len);
|
|
||||||
if (unlikely(flags & MSG_ERRQUEUE))
|
|
||||||
return inet_recv_error(sk, msg, len, addr_len);
|
|
||||||
if (!skb_queue_empty(&sk->sk_receive_queue) &&
|
|
||||||
sk_psock_queue_empty(psock))
|
|
||||||
return tcp_recvmsg(sk, msg, len, nonblock, flags, addr_len);
|
|
||||||
lock_sock(sk);
|
|
||||||
msg_bytes_ready:
|
|
||||||
copied = __tcp_bpf_recvmsg(sk, psock, msg, len, flags);
|
|
||||||
if (!copied) {
|
|
||||||
int data, err = 0;
|
|
||||||
long timeo;
|
|
||||||
|
|
||||||
timeo = sock_rcvtimeo(sk, nonblock);
|
|
||||||
data = tcp_bpf_wait_data(sk, psock, flags, timeo, &err);
|
|
||||||
if (data) {
|
|
||||||
if (!sk_psock_queue_empty(psock))
|
|
||||||
goto msg_bytes_ready;
|
|
||||||
release_sock(sk);
|
|
||||||
sk_psock_put(sk, psock);
|
|
||||||
return tcp_recvmsg(sk, msg, len, nonblock, flags, addr_len);
|
|
||||||
}
|
|
||||||
if (err) {
|
|
||||||
ret = err;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
copied = -EAGAIN;
|
|
||||||
}
|
|
||||||
ret = copied;
|
|
||||||
out:
|
|
||||||
release_sock(sk);
|
|
||||||
sk_psock_put(sk, psock);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int bpf_tcp_ingress(struct sock *sk, struct sk_psock *psock,
|
static int bpf_tcp_ingress(struct sock *sk, struct sk_psock *psock,
|
||||||
struct sk_msg *msg, u32 apply_bytes, int flags)
|
struct sk_msg *msg, u32 apply_bytes, int flags)
|
||||||
{
|
{
|
||||||
@ -299,6 +237,68 @@ static bool tcp_bpf_stream_read(const struct sock *sk)
|
|||||||
return !empty;
|
return !empty;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int tcp_bpf_wait_data(struct sock *sk, struct sk_psock *psock,
|
||||||
|
int flags, long timeo, int *err)
|
||||||
|
{
|
||||||
|
DEFINE_WAIT_FUNC(wait, woken_wake_function);
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
|
if (!timeo)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
add_wait_queue(sk_sleep(sk), &wait);
|
||||||
|
sk_set_bit(SOCKWQ_ASYNC_WAITDATA, sk);
|
||||||
|
ret = sk_wait_event(sk, &timeo,
|
||||||
|
!list_empty(&psock->ingress_msg) ||
|
||||||
|
!skb_queue_empty(&sk->sk_receive_queue), &wait);
|
||||||
|
sk_clear_bit(SOCKWQ_ASYNC_WAITDATA, sk);
|
||||||
|
remove_wait_queue(sk_sleep(sk), &wait);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int tcp_bpf_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
|
||||||
|
int nonblock, int flags, int *addr_len)
|
||||||
|
{
|
||||||
|
struct sk_psock *psock;
|
||||||
|
int copied, ret;
|
||||||
|
|
||||||
|
psock = sk_psock_get(sk);
|
||||||
|
if (unlikely(!psock))
|
||||||
|
return tcp_recvmsg(sk, msg, len, nonblock, flags, addr_len);
|
||||||
|
if (unlikely(flags & MSG_ERRQUEUE))
|
||||||
|
return inet_recv_error(sk, msg, len, addr_len);
|
||||||
|
if (!skb_queue_empty(&sk->sk_receive_queue) &&
|
||||||
|
sk_psock_queue_empty(psock))
|
||||||
|
return tcp_recvmsg(sk, msg, len, nonblock, flags, addr_len);
|
||||||
|
lock_sock(sk);
|
||||||
|
msg_bytes_ready:
|
||||||
|
copied = __tcp_bpf_recvmsg(sk, psock, msg, len, flags);
|
||||||
|
if (!copied) {
|
||||||
|
int data, err = 0;
|
||||||
|
long timeo;
|
||||||
|
|
||||||
|
timeo = sock_rcvtimeo(sk, nonblock);
|
||||||
|
data = tcp_bpf_wait_data(sk, psock, flags, timeo, &err);
|
||||||
|
if (data) {
|
||||||
|
if (!sk_psock_queue_empty(psock))
|
||||||
|
goto msg_bytes_ready;
|
||||||
|
release_sock(sk);
|
||||||
|
sk_psock_put(sk, psock);
|
||||||
|
return tcp_recvmsg(sk, msg, len, nonblock, flags, addr_len);
|
||||||
|
}
|
||||||
|
if (err) {
|
||||||
|
ret = err;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
copied = -EAGAIN;
|
||||||
|
}
|
||||||
|
ret = copied;
|
||||||
|
out:
|
||||||
|
release_sock(sk);
|
||||||
|
sk_psock_put(sk, psock);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static int tcp_bpf_send_verdict(struct sock *sk, struct sk_psock *psock,
|
static int tcp_bpf_send_verdict(struct sock *sk, struct sk_psock *psock,
|
||||||
struct sk_msg *msg, int *copied, int flags)
|
struct sk_msg *msg, int *copied, int flags)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user