return pm_nl_get_pernet(genl_info_net(info));
 }
 
-static int mptcp_nl_add_subflow_or_signal_addr(struct net *net)
+static int mptcp_nl_add_subflow_or_signal_addr(struct net *net,
+                                              struct mptcp_addr_info *addr)
 {
        struct mptcp_sock *msk;
        long s_slot = 0, s_num = 0;
 
        while ((msk = mptcp_token_iter_next(net, &s_slot, &s_num)) != NULL) {
                struct sock *sk = (struct sock *)msk;
+               struct mptcp_addr_info mpc_addr;
 
                if (!READ_ONCE(msk->fully_established) ||
                    mptcp_pm_is_userspace(msk))
                        goto next;
 
+               /* if the endp linked to the init sf is re-added with a != ID */
+               mptcp_local_address((struct sock_common *)msk, &mpc_addr);
+
                lock_sock(sk);
                spin_lock_bh(&msk->pm.lock);
+               if (mptcp_addresses_equal(addr, &mpc_addr, addr->port))
+                       msk->mpc_endpoint_id = addr->id;
                mptcp_pm_create_subflow_or_signal_addr(msk);
                spin_unlock_bh(&msk->pm.lock);
                release_sock(sk);
                goto out_free;
        }
 
-       mptcp_nl_add_subflow_or_signal_addr(sock_net(skb->sk));
+       mptcp_nl_add_subflow_or_signal_addr(sock_net(skb->sk), &entry->addr);
        return 0;
 
 out_free:
                        spin_unlock_bh(&msk->pm.lock);
                }
 
+               if (msk->mpc_endpoint_id == entry->addr.id)
+                       msk->mpc_endpoint_id = 0;
                release_sock(sk);
 
 next: