From: Geliang Tang <tanggeliang@kylinos.cn>
Add an offset parameter for mptcp_recv_skb and make it more like
tcp_recv_skb.
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
net/mptcp/protocol.c | 22 +++++++++++++++++-----
1 file changed, 17 insertions(+), 5 deletions(-)
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
index 33bf5bc26d36..701295f6ae1b 100644
--- a/net/mptcp/protocol.c
+++ b/net/mptcp/protocol.c
@@ -4019,11 +4019,23 @@ static __poll_t mptcp_poll(struct file *file, struct socket *sock,
return mask;
}
-static struct sk_buff *mptcp_recv_skb(struct sock *sk)
+static struct sk_buff *mptcp_recv_skb(struct sock *sk, u32 *off)
{
+ struct sk_buff *skb;
+ u32 offset;
+
if (skb_queue_empty(&sk->sk_receive_queue))
__mptcp_move_skbs(sk);
- return skb_peek(&sk->sk_receive_queue);
+
+ while ((skb = skb_peek(&sk->sk_receive_queue)) != NULL) {
+ offset = MPTCP_SKB_CB(skb)->offset;
+ if (offset < skb->len) {
+ *off = offset;
+ return skb;
+ }
+ mptcp_eat_recv_skb(sk, skb);
+ }
+ return NULL;
}
/*
@@ -4037,11 +4049,11 @@ static int mptcp_read_sock(struct sock *sk, read_descriptor_t *desc,
size_t len = sk->sk_rcvbuf;
struct sk_buff *skb;
int copied = 0;
+ u32 offset;
if (sk->sk_state == TCP_LISTEN)
return -ENOTCONN;
- while ((skb = mptcp_recv_skb(sk)) != NULL) {
- u32 offset = MPTCP_SKB_CB(skb)->offset;
+ while ((skb = mptcp_recv_skb(sk, &offset)) != NULL) {
u32 data_len = skb->len - offset;
u32 size = min_t(size_t, len - copied, data_len);
int count;
@@ -4072,7 +4084,7 @@ static int mptcp_read_sock(struct sock *sk, read_descriptor_t *desc,
mptcp_rcv_space_adjust(msk, copied);
if (copied > 0) {
- mptcp_recv_skb(sk);
+ mptcp_recv_skb(sk, &offset);
mptcp_cleanup_rbuf(msk, copied);
}
--
2.48.1