1010#include <net/inet_common.h>
1111#include <net/tls.h>
1212
13- int __tcp_bpf_recvmsg (struct sock * sk , struct sk_psock * psock ,
14- struct msghdr * msg , int len , int flags )
15- {
16- struct iov_iter * iter = & msg -> msg_iter ;
17- int peek = flags & MSG_PEEK ;
18- struct sk_msg * msg_rx ;
19- int i , copied = 0 ;
20-
21- msg_rx = sk_psock_peek_msg (psock );
22- while (copied != len ) {
23- struct scatterlist * sge ;
24-
25- if (unlikely (!msg_rx ))
26- break ;
27-
28- i = msg_rx -> sg .start ;
29- do {
30- struct page * page ;
31- int copy ;
32-
33- sge = sk_msg_elem (msg_rx , i );
34- copy = sge -> length ;
35- page = sg_page (sge );
36- if (copied + copy > len )
37- copy = len - copied ;
38- copy = copy_page_to_iter (page , sge -> offset , copy , iter );
39- if (!copy )
40- return copied ? copied : - EFAULT ;
41-
42- copied += copy ;
43- if (likely (!peek )) {
44- sge -> offset += copy ;
45- sge -> length -= copy ;
46- if (!msg_rx -> skb )
47- sk_mem_uncharge (sk , copy );
48- msg_rx -> sg .size -= copy ;
49-
50- if (!sge -> length ) {
51- sk_msg_iter_var_next (i );
52- if (!msg_rx -> skb )
53- put_page (page );
54- }
55- } else {
56- /* Lets not optimize peek case if copy_page_to_iter
57- * didn't copy the entire length lets just break.
58- */
59- if (copy != sge -> length )
60- return copied ;
61- sk_msg_iter_var_next (i );
62- }
63-
64- if (copied == len )
65- break ;
66- } while (i != msg_rx -> sg .end );
67-
68- if (unlikely (peek )) {
69- msg_rx = sk_psock_next_msg (psock , msg_rx );
70- if (!msg_rx )
71- break ;
72- continue ;
73- }
74-
75- msg_rx -> sg .start = i ;
76- if (!sge -> length && msg_rx -> sg .start == msg_rx -> sg .end ) {
77- msg_rx = sk_psock_dequeue_msg (psock );
78- kfree_sk_msg (msg_rx );
79- }
80- msg_rx = sk_psock_peek_msg (psock );
81- }
82-
83- return copied ;
84- }
85- EXPORT_SYMBOL_GPL (__tcp_bpf_recvmsg );
86-
8713static int bpf_tcp_ingress (struct sock * sk , struct sk_psock * psock ,
8814 struct sk_msg * msg , u32 apply_bytes , int flags )
8915{
@@ -237,28 +163,6 @@ static bool tcp_bpf_stream_read(const struct sock *sk)
237163 return !empty ;
238164}
239165
240- static int tcp_bpf_wait_data (struct sock * sk , struct sk_psock * psock ,
241- int flags , long timeo , int * err )
242- {
243- DEFINE_WAIT_FUNC (wait , woken_wake_function );
244- int ret = 0 ;
245-
246- if (sk -> sk_shutdown & RCV_SHUTDOWN )
247- return 1 ;
248-
249- if (!timeo )
250- return ret ;
251-
252- add_wait_queue (sk_sleep (sk ), & wait );
253- sk_set_bit (SOCKWQ_ASYNC_WAITDATA , sk );
254- ret = sk_wait_event (sk , & timeo ,
255- !list_empty (& psock -> ingress_msg ) ||
256- !skb_queue_empty (& sk -> sk_receive_queue ), & wait );
257- sk_clear_bit (SOCKWQ_ASYNC_WAITDATA , sk );
258- remove_wait_queue (sk_sleep (sk ), & wait );
259- return ret ;
260- }
261-
262166static int tcp_bpf_recvmsg (struct sock * sk , struct msghdr * msg , size_t len ,
263167 int nonblock , int flags , int * addr_len )
264168{
@@ -278,13 +182,13 @@ static int tcp_bpf_recvmsg(struct sock *sk, struct msghdr *msg, size_t len,
278182 }
279183 lock_sock (sk );
280184msg_bytes_ready :
281- copied = __tcp_bpf_recvmsg (sk , psock , msg , len , flags );
185+ copied = sk_msg_recvmsg (sk , psock , msg , len , flags );
282186 if (!copied ) {
283187 int data , err = 0 ;
284188 long timeo ;
285189
286190 timeo = sock_rcvtimeo (sk , nonblock );
287- data = tcp_bpf_wait_data (sk , psock , flags , timeo , & err );
191+ data = sk_msg_wait_data (sk , psock , flags , timeo , & err );
288192 if (data ) {
289193 if (!sk_psock_queue_empty (psock ))
290194 goto msg_bytes_ready ;
0 commit comments