On 11/17/21 5:30 PM, Mat Martineau wrote:
> When a MPTCP connection is managed by a userspace PM, bypass the kernel
> PM for incoming advertisements and subflow events. Netlink events are
> still sent to userspace.
>
> Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
> ---
> net/mptcp/pm.c | 6 +++++-
> 1 file changed, 5 insertions(+), 1 deletion(-)
>
> diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
> index 3a3800771aca..7f96a888e2d5 100644
> --- a/net/mptcp/pm.c
> +++ b/net/mptcp/pm.c
> @@ -189,7 +189,8 @@ void mptcp_pm_add_addr_received(struct mptcp_sock *msk,
>
> spin_lock_bh(&pm->lock);
>
> - if (!READ_ONCE(pm->accept_addr)) {
> + if (!READ_ONCE(pm->accept_addr) ||
> + READ_ONCE(pm->pm_type) != MPTCP_PM_TYPE_KERNEL) {
> mptcp_pm_announce_addr(msk, addr, true);
> mptcp_pm_add_addr_send_ack(msk);
> } else if (mptcp_pm_schedule_work(msk, MPTCP_PM_ADD_ADDR_RECEIVED)) {
> @@ -233,6 +234,9 @@ void mptcp_pm_rm_addr_received(struct mptcp_sock *msk,
> for (i = 0; i < rm_list->nr; i++)
> mptcp_event_addr_removed(msk, rm_list->ids[i]);
>
> + if (READ_ONCE(pm->pm_type) != MPTCP_PM_TYPE_KERNEL)
> + return;
> +
The flow which ensues from MPTCP_PM_RM_ADDR_RECEIVED can be fully utilized with userspace PMs, so the above check for pm_type can be removed.
> spin_lock_bh(&pm->lock);
> mptcp_pm_schedule_work(msk, MPTCP_PM_RM_ADDR_RECEIVED);
> pm->rm_list_rx = *rm_list;
>