bpf, tcp: Make tcp_bpf_recvmsg static
authorYueHaibing <yuehaibing@huawei.com>
Fri, 20 Mar 2020 02:34:26 +0000 (10:34 +0800)
committerDaniel Borkmann <daniel@iogearbox.net>
Fri, 20 Mar 2020 14:56:55 +0000 (15:56 +0100)
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
include/net/tcp.h
net/ipv4/tcp_bpf.c

index 43fa07a..5fa9eac 100644 (file)
@@ -2207,8 +2207,6 @@ static inline void tcp_bpf_clone(const struct sock *sk, struct sock *newsk)
 #ifdef CONFIG_NET_SOCK_MSG
 int tcp_bpf_sendmsg_redir(struct sock *sk, struct sk_msg *msg, u32 bytes,
                          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,
                      struct msghdr *msg, int len, int flags);
 #endif /* CONFIG_NET_SOCK_MSG */
index 37c91f2..5a05327 100644 (file)
 #include <net/inet_common.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,
                      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);
 
-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,
                           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;
 }
 
+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,
                                struct sk_msg *msg, int *copied, int flags)
 {