mptcp: Make kernel path manager check for userspace-managed sockets
authorMat Martineau <mathew.j.martineau@linux.intel.com>
Wed, 27 Apr 2022 22:50:00 +0000 (15:50 -0700)
committerJakub Kicinski <kuba@kernel.org>
Sat, 30 Apr 2022 00:25:14 +0000 (17:25 -0700)
Userspace-managed sockets should not have their subflows or
advertisements changed by the kernel path manager.

v3: Use helper function for PM mode (Paolo Abeni)

Acked-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/mptcp/pm_netlink.c

index bbbbfb4..473e5aa 100644 (file)
@@ -1220,7 +1220,8 @@ static int mptcp_nl_add_subflow_or_signal_addr(struct net *net)
        while ((msk = mptcp_token_iter_next(net, &s_slot, &s_num)) != NULL) {
                struct sock *sk = (struct sock *)msk;
 
-               if (!READ_ONCE(msk->fully_established))
+               if (!READ_ONCE(msk->fully_established) ||
+                   mptcp_pm_is_userspace(msk))
                        goto next;
 
                lock_sock(sk);
@@ -1363,6 +1364,9 @@ static int mptcp_nl_remove_subflow_and_signal_addr(struct net *net,
                struct sock *sk = (struct sock *)msk;
                bool remove_subflow;
 
+               if (mptcp_pm_is_userspace(msk))
+                       goto next;
+
                if (list_empty(&msk->conn_list)) {
                        mptcp_pm_remove_anno_addr(msk, addr, false);
                        goto next;
@@ -1397,7 +1401,7 @@ static int mptcp_nl_remove_id_zero_address(struct net *net,
                struct sock *sk = (struct sock *)msk;
                struct mptcp_addr_info msk_local;
 
-               if (list_empty(&msk->conn_list))
+               if (list_empty(&msk->conn_list) || mptcp_pm_is_userspace(msk))
                        goto next;
 
                local_address((struct sock_common *)msk, &msk_local);
@@ -1504,9 +1508,11 @@ static void mptcp_nl_remove_addrs_list(struct net *net,
        while ((msk = mptcp_token_iter_next(net, &s_slot, &s_num)) != NULL) {
                struct sock *sk = (struct sock *)msk;
 
-               lock_sock(sk);
-               mptcp_pm_remove_addrs_and_subflows(msk, rm_list);
-               release_sock(sk);
+               if (!mptcp_pm_is_userspace(msk)) {
+                       lock_sock(sk);
+                       mptcp_pm_remove_addrs_and_subflows(msk, rm_list);
+                       release_sock(sk);
+               }
 
                sock_put(sk);
                cond_resched();
@@ -1779,7 +1785,7 @@ static int mptcp_nl_set_flags(struct net *net,
        while ((msk = mptcp_token_iter_next(net, &s_slot, &s_num)) != NULL) {
                struct sock *sk = (struct sock *)msk;
 
-               if (list_empty(&msk->conn_list))
+               if (list_empty(&msk->conn_list) || mptcp_pm_is_userspace(msk))
                        goto next;
 
                lock_sock(sk);