Commit 47bebdf3 authored by Paolo Abeni's avatar Paolo Abeni Committed by David S. Miller

mptcp: set data_ready status bit in subflow_check_data_avail()

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: default avatarPaolo Abeni <pabeni@redhat.com>
Reviewed-by: default avatarMat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 63561a40
...@@ -825,6 +825,8 @@ static bool subflow_check_data_avail(struct sock *ssk) ...@@ -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, pr_debug("msk=%p ssk=%p data_avail=%d skb=%p", subflow->conn, ssk,
subflow->data_avail, skb_peek(&ssk->sk_receive_queue)); subflow->data_avail, skb_peek(&ssk->sk_receive_queue));
if (!skb_peek(&ssk->sk_receive_queue))
subflow->data_avail = 0;
if (subflow->data_avail) if (subflow->data_avail)
return true; return true;
...@@ -849,6 +851,7 @@ static bool subflow_check_data_avail(struct sock *ssk) ...@@ -849,6 +851,7 @@ static bool subflow_check_data_avail(struct sock *ssk)
subflow->map_data_len = skb->len; subflow->map_data_len = skb->len;
subflow->map_subflow_seq = tcp_sk(ssk)->copied_seq - subflow->map_subflow_seq = tcp_sk(ssk)->copied_seq -
subflow->ssn_offset; subflow->ssn_offset;
subflow->data_avail = 1;
return true; return true;
} }
...@@ -876,8 +879,10 @@ static bool subflow_check_data_avail(struct sock *ssk) ...@@ -876,8 +879,10 @@ static bool subflow_check_data_avail(struct sock *ssk)
ack_seq = mptcp_subflow_get_mapped_dsn(subflow); ack_seq = mptcp_subflow_get_mapped_dsn(subflow);
pr_debug("msk ack_seq=%llx subflow ack_seq=%llx", old_ack, pr_debug("msk ack_seq=%llx subflow ack_seq=%llx", old_ack,
ack_seq); ack_seq);
if (ack_seq == old_ack) if (ack_seq == old_ack) {
subflow->data_avail = 1;
break; break;
}
/* only accept in-sequence mapping. Old values are spurious /* only accept in-sequence mapping. Old values are spurious
* retransmission; we can hit "future" values on active backup * retransmission; we can hit "future" values on active backup
...@@ -922,13 +927,13 @@ static bool subflow_check_data_avail(struct sock *ssk) ...@@ -922,13 +927,13 @@ static bool subflow_check_data_avail(struct sock *ssk)
ssk->sk_error_report(ssk); ssk->sk_error_report(ssk);
tcp_set_state(ssk, TCP_CLOSE); tcp_set_state(ssk, TCP_CLOSE);
tcp_send_active_reset(ssk, GFP_ATOMIC); tcp_send_active_reset(ssk, GFP_ATOMIC);
subflow->data_avail = 0;
return false; return false;
} }
bool mptcp_subflow_data_available(struct sock *sk) bool mptcp_subflow_data_available(struct sock *sk)
{ {
struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk); struct mptcp_subflow_context *subflow = mptcp_subflow_ctx(sk);
struct sk_buff *skb;
/* check if current mapping is still valid */ /* check if current mapping is still valid */
if (subflow->map_valid && if (subflow->map_valid &&
...@@ -941,15 +946,7 @@ bool mptcp_subflow_data_available(struct sock *sk) ...@@ -941,15 +946,7 @@ bool mptcp_subflow_data_available(struct sock *sk)
subflow->map_data_len); subflow->map_data_len);
} }
if (!subflow_check_data_avail(sk)) { return 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;
} }
/* If ssk has an mptcp parent socket, use the mptcp rcvbuf occupancy, /* If ssk has an mptcp parent socket, use the mptcp rcvbuf occupancy,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment