Some subflow socket errors need to be reported to the MPTCP socket: the
initial subflow connect (MP_CAPABLE), and the ones from the fallback
sockets. The others are not propagated.

The issue is that sock_error() was used to retrieve the error, which was
also resetting the sk_err field. Because of that, when notifying the
userspace about subflow close events later on from the MPTCP worker, the
ssk->sk_err field was always 0.

Now, the error (sk_err) is only reset when propagating it to the msk.

Fixes: 15cc10453398 ("mptcp: deliver ssk errors to msk")
Cc: [email protected]
Reviewed-by: Geliang Tang <[email protected]>
Signed-off-by: Matthieu Baerts (NGI0) <[email protected]>
---
 net/mptcp/protocol.c | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
index e32ae594b4ef..8d3233667418 100644
--- a/net/mptcp/protocol.c
+++ b/net/mptcp/protocol.c
@@ -821,11 +821,8 @@ static bool __mptcp_ofo_queue(struct mptcp_sock *msk)
 
 static bool __mptcp_subflow_error_report(struct sock *sk, struct sock *ssk)
 {
-       int err = sock_error(ssk);
        int ssk_state;
-
-       if (!err)
-               return false;
+       int err;
 
        /* only propagate errors on fallen-back sockets or
         * on MPC connect
@@ -833,6 +830,10 @@ static bool __mptcp_subflow_error_report(struct sock *sk, 
struct sock *ssk)
        if (sk->sk_state != TCP_SYN_SENT && 
!__mptcp_check_fallback(mptcp_sk(sk)))
                return false;
 
+       err = sock_error(ssk);
+       if (!err)
+               return false;
+
        /* We need to propagate only transition to CLOSE state.
         * Orphaned socket will see such state change via
         * subflow_sched_work_if_closed() and that path will properly

-- 
2.51.0


Reply via email to