Redundant subflows are not supported in __mptcp_subflow_push_pending()
yet. This patch adds a placeholder in mptcp_sched_get_send() to pick the
first subflow for the redundant subflows case.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
net/mptcp/protocol.c | 8 +++++---
net/mptcp/sched.c | 15 +++++++++++++++
2 files changed, 20 insertions(+), 3 deletions(-)
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
index 8bf48387f9d8..bcaf91562e2b 100644
--- a/net/mptcp/protocol.c
+++ b/net/mptcp/protocol.c
@@ -1629,13 +1629,13 @@ static void __mptcp_subflow_push_pending(struct sock *sk, struct sock *ssk)
info.limit = dfrag->data_len;
len = dfrag->data_len - dfrag->already_sent;
while (len > 0) {
- int ret = 0;
+ int ret = 0, err = 0;
/* the caller already invoked the packet scheduler,
* check for a different subflow usage only after
* spooling the first chunk of data
*/
- xmit_ssk = first ? ssk : mptcp_subflow_get_send(mptcp_sk(sk));
+ xmit_ssk = first ? ssk : mptcp_sched_get_send(mptcp_sk(sk), &err);
if (!xmit_ssk)
goto out;
if (xmit_ssk != ssk) {
@@ -3109,11 +3109,13 @@ void __mptcp_data_acked(struct sock *sk)
void __mptcp_check_push(struct sock *sk, struct sock *ssk)
{
+ int err = 0;
+
if (!mptcp_send_head(sk))
return;
if (!sock_owned_by_user(sk)) {
- struct sock *xmit_ssk = mptcp_subflow_get_send(mptcp_sk(sk));
+ struct sock *xmit_ssk = mptcp_sched_get_send(mptcp_sk(sk), &err);
if (xmit_ssk == ssk)
__mptcp_subflow_push_pending(sk, ssk);
diff --git a/net/mptcp/sched.c b/net/mptcp/sched.c
index a0585182a2b1..527ea07982c5 100644
--- a/net/mptcp/sched.c
+++ b/net/mptcp/sched.c
@@ -119,6 +119,7 @@ static int mptcp_sched_data_init(struct mptcp_sock *msk, bool reinject,
struct sock *mptcp_sched_get_send(struct mptcp_sock *msk, int *err)
{
+ struct mptcp_subflow_context *subflow;
struct mptcp_sched_data data;
struct sock *ssk = NULL;
@@ -147,5 +148,19 @@ struct sock *mptcp_sched_get_send(struct mptcp_sock *msk, int *err)
mptcp_sched_data_init(msk, false, &data);
msk->sched->get_subflow(msk, &data);
+ mptcp_for_each_subflow(msk, subflow) {
+ if (READ_ONCE(subflow->scheduled)) {
+ /*
+ * TODO: Redundant subflows are not supported in
+ * __mptcp_subflow_push_pending() yet. Here's a
+ * placeholder to pick the first subflow for the
+ * redundant subflows case.
+ */
+ ssk = subflow->tcp_sock;
+ *err = 0;
+ break;
+ }
+ }
+
return ssk;
}
--
2.34.1