@@ -3956,6 +3956,58 @@ static __poll_t mptcp_poll(struct file *file, struct socket *sock,
39563956 return mask ;
39573957}
39583958
3959+ static int mptcp_read_sock (struct sock * sk , read_descriptor_t * desc ,
3960+ sk_read_actor_t recv_actor )
3961+ {
3962+ struct mptcp_sock * msk = mptcp_sk (sk );
3963+ struct scm_timestamping_internal tss ;
3964+ struct sk_buff * skb , * tmp ;
3965+ size_t len = INT_MAX ;
3966+ int copied = 0 ;
3967+
3968+ skb_queue_walk_safe (& sk -> sk_receive_queue , skb , tmp ) {
3969+ u32 offset = MPTCP_SKB_CB (skb )-> offset ;
3970+ u32 data_len = skb -> len - offset ;
3971+ u32 count = min_t (size_t , len - copied , data_len );
3972+ int used ;
3973+
3974+ used = recv_actor (desc , skb , offset , count );
3975+ if (used <= 0 ) {
3976+ if (!copied )
3977+ copied = used ;
3978+ break ;
3979+ }
3980+
3981+ if (MPTCP_SKB_CB (skb )-> has_rxtstamp )
3982+ tcp_update_recv_tstamps (skb , & tss );
3983+
3984+ copied += used ;
3985+
3986+ if (used < data_len ) {
3987+ MPTCP_SKB_CB (skb )-> offset += used ;
3988+ MPTCP_SKB_CB (skb )-> map_seq += used ;
3989+ msk -> bytes_consumed += used ;
3990+ break ;
3991+ }
3992+
3993+ skb -> destructor = NULL ;
3994+ atomic_sub (skb -> truesize , & sk -> sk_rmem_alloc );
3995+ sk_mem_uncharge (sk , skb -> truesize );
3996+ sk_eat_skb (sk , skb );
3997+ msk -> bytes_consumed += used ;
3998+
3999+ if (copied >= len )
4000+ break ;
4001+ }
4002+
4003+ mptcp_rcv_space_adjust (msk , copied );
4004+
4005+ if (copied > 0 )
4006+ mptcp_cleanup_rbuf (msk , copied );
4007+
4008+ return copied ;
4009+ }
4010+
39594011static const struct proto_ops mptcp_stream_ops = {
39604012 .family = PF_INET ,
39614013 .owner = THIS_MODULE ,
@@ -3976,6 +4028,7 @@ static const struct proto_ops mptcp_stream_ops = {
39764028 .recvmsg = inet_recvmsg ,
39774029 .mmap = sock_no_mmap ,
39784030 .set_rcvlowat = mptcp_set_rcvlowat ,
4031+ .read_sock = mptcp_read_sock ,
39794032};
39804033
39814034static struct inet_protosw mptcp_protosw = {
@@ -4080,6 +4133,7 @@ static const struct proto_ops mptcp_v6_stream_ops = {
40804133 .compat_ioctl = inet6_compat_ioctl ,
40814134#endif
40824135 .set_rcvlowat = mptcp_set_rcvlowat ,
4136+ .read_sock = mptcp_read_sock ,
40834137};
40844138
40854139static struct proto mptcp_v6_prot ;
0 commit comments