mptcp: set data_ready status bit in subflow_check_data_avail()
authorPaolo Abeni <pabeni@redhat.com>
Mon, 14 Sep 2020 08:01:08 +0000 (10:01 +0200)
committerDavid S. Miller <davem@davemloft.net>
Mon, 14 Sep 2020 20:28:02 +0000 (13:28 -0700)
This simplify mptcp_subflow_data_available() and will
made follow-up patches simpler.

Additionally remove the unneeded checks on subflow copied_seq:
we always whole skbs out of subflows.

Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Reviewed-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/mptcp/subflow.c

index 7ae1d36040478ce2f7889a4070cbf2dbcac07e98..53b455c3c22951732f9cae2b048b7f104df77279 100644 (file)
@@ -825,6 +825,8 @@ static bool subflow_check_data_avail(struct sock *ssk)
 
        pr_debug("msk=%p ssk=%p data_avail=%d skb=%p", subflow->conn, ssk,
                 subflow->data_avail, skb_peek(&ssk->sk_receive_queue));
+       if (!skb_peek(&ssk->sk_receive_queue))
+               subflow->data_avail = 0;
        if (subflow->data_avail)
                return true;
 
@@ -849,6 +851,7 @@ static bool subflow_check_data_avail(struct sock *ssk)
                        subflow->map_data_len = skb->len;
                        subflow->map_subflow_seq = tcp_sk(ssk)->copied_seq -
                                                   subflow->ssn_offset;
+                       subflow->data_avail = 1;
                        return true;
                }
 
@@ -876,8 +879,10 @@ static bool subflow_check_data_avail(struct sock *ssk)
                ack_seq = mptcp_subflow_get_mapped_dsn(subflow);
                pr_debug("msk ack_seq=%llx subflow ack_seq=%llx", old_ack,
                         ack_seq);
-               if (ack_seq == old_ack)
+               if (ack_seq == old_ack) {
+                       subflow->data_avail = 1;
                        break;
+               }
 
                /* only accept in-sequence mapping. Old values are spurious
                 * retransmission; we can hit "future" values on active backup
@@ -922,13 +927,13 @@ fatal:
        ssk->sk_error_report(ssk);
        tcp_set_state(ssk, TCP_CLOSE);
        tcp_send_active_reset(ssk, GFP_ATOMIC);
+       subflow->data_avail = 0;
        return false;
 }
 
 bool mptcp_subflow_data_available(struct sock *sk)
 {
        struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
-       struct sk_buff *skb;
 
        /* check if current mapping is still valid */
        if (subflow->map_valid &&
@@ -941,15 +946,7 @@ bool mptcp_subflow_data_available(struct sock *sk)
                         subflow->map_data_len);
        }
 
-       if (!subflow_check_data_avail(sk)) {
-               subflow->data_avail = 0;
-               return false;
-       }
-
-       skb = skb_peek(&sk->sk_receive_queue);
-       subflow->data_avail = skb &&
-                      before(tcp_sk(sk)->copied_seq, TCP_SKB_CB(skb)->end_seq);
-       return subflow->data_avail;
+       return subflow_check_data_avail(sk);
 }
 
 /* If ssk has an mptcp parent socket, use the mptcp rcvbuf occupancy,