From nobody Mon Feb 9 07:05:29 2026 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6638:2248:0:0:0:0 with SMTP id m8csp375914jas; Thu, 27 Jan 2022 16:39:02 -0800 (PST) X-Google-Smtp-Source: ABdhPJx4Q23jicXiwBpQR6SyrB3MgZQGyEBQUqaaWraoKFLJjIiLI4HIeaWX5s/6NDWQryqvS0b2 X-Received: by 2002:a05:6a00:1992:: with SMTP id d18mr5250086pfl.85.1643330342083; Thu, 27 Jan 2022 16:39:02 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1643330342; cv=none; d=google.com; s=arc-20160816; b=tAMtpqWV1J4ZORj5sK/+Zpr8GJWEx88iSYkve6vwc4m25uICm3gQUhFPxsTvWWftQO 8TuTnA92g0/sLx7wuB9np/wjcDtH4ahy0Q5pjqylv5ciSyvdHZpoirWCYW6TdyHkzKWh g4jA3GhnMa1IzomLZFoKI2NEKXHjk5mbXzG5zQPMWs7P03leCg2ucm/USjHdS+XKEgiU 93NjhfuyQG+j2VA8BVVIKkGDd0Bj1uexKlOc1EI1JLmaPph9xTiJH5yFLlMxVOupv+vy t2nksApoAUhFNjiSngJIMJdyCve/DIKL3oLZr98R3skq9pP4ebFjQTXu3tWF/74VmRuK 3A8Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:to:from:dkim-signature; bh=pG0dYi9piSiCDaoez2MdQnI5UQOrwA/24Y+T+MuEga4=; b=wRiqxvmDL3A/KWYwcP9XPytXvb556OURW4hK1CL5Ez8tetymD753eWeIVSdXw2gdNH UDTpPUSFBS/iVeZPejVLDBmOjark87y9EVrzcfvZ4bg+7WE5xUIA+oqxS9qfW8DdWX7I J7a6Pb9KW8IBQgsxr55Y9xk6fsJeShQNIPZuLyttbt9dKjEoIjIJMLqjJlgjwLONxDaY RgRcsafrSP1ymc/vy5XEMxaCCz/8sC9S5baYoAXH0Kius+lDaGc6oXKByo99Kw3rBrPT CWfeokx6EbqgKe94eoPlw5qaVdserdP12flWm1VSnIdAQ2814r7iQCq39KMrOrM3rtxa nwCA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=RMpicrjc; spf=pass (google.com: domain of mptcp+bounces-3350-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3350-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from ewr.edge.kernel.org (ewr.edge.kernel.org. [2604:1380:1:3600::1]) by mx.google.com with ESMTPS id c9si3973699plg.216.2022.01.27.16.39.01 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 27 Jan 2022 16:39:02 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-3350-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) client-ip=2604:1380:1:3600::1; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=RMpicrjc; spf=pass (google.com: domain of mptcp+bounces-3350-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3350-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ewr.edge.kernel.org (Postfix) with ESMTPS id AE8F21C0F53 for ; Fri, 28 Jan 2022 00:39:00 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 222533FD6; Fri, 28 Jan 2022 00:38:50 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AC5922FAF for ; Fri, 28 Jan 2022 00:38:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1643330327; x=1674866327; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=Ayp/hzhQU68tkVeBfdFTzrbIXUw/r8fnChYm0kqtJ+k=; b=RMpicrjcnoH4NkGE2c3z+PFZGc5fHNs4YGHT9MQIS3fxA7ZD1mlGM+mm WXlB0XR1X0xaacEUZuB51yi8GWHQB/OP9m/qEA50au8WPyQB1UaKOhZQA gK+H8gf2Lv+Cv0eZsIQz/NaonLc6WCu4B4nsHHqruwdevxVhuiVNTWdup lJn0K4hZW8etQ6/NEtlhqgPWYd2tUTliSchew4wMEaGSxeFVPVZLsC2ZM Ti22ffq2mxfr5ZXXAtMOxyfCraEubd3P4AwGoaKGzEsgXZ4sS4MKF/FBU 9gtqFvaA3RxmEKA2s4DaPs+GOpPBcCyNR8gCaCjSSem84u+zExSr/lfNy A==; X-IronPort-AV: E=McAfee;i="6200,9189,10239"; a="333358333" X-IronPort-AV: E=Sophos;i="5.88,322,1635231600"; d="scan'208";a="333358333" Received: from orsmga006.jf.intel.com ([10.7.209.51]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Jan 2022 16:38:42 -0800 X-IronPort-AV: E=Sophos;i="5.88,322,1635231600"; d="scan'208";a="480527115" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga006-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Jan 2022 16:38:41 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v3 04/14] mptcp: read attributes of addr entries managed by userspace PMs Date: Thu, 27 Jan 2022 19:38:26 -0500 Message-Id: <20220128003836.2732694-5-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220128003836.2732694-1-kishen.maloor@intel.com> References: <20220128003836.2732694-1-kishen.maloor@intel.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This change introduces a parallel path in the kernel for retrieving the local id, flags, if_index for an addr entry in the context of an MPTCP connection that's being managed by a userspace PM. The userspace and in-kernel PM modes deviate in their procedures for obtaining this information. Signed-off-by: Kishen Maloor --- net/mptcp/pm_netlink.c | 101 ++++++++++++++++++++++++++++------------- net/mptcp/protocol.h | 2 +- net/mptcp/subflow.c | 2 +- 3 files changed, 71 insertions(+), 34 deletions(-) diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index ebec3610bb38..6ead218a20de 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -1219,6 +1219,7 @@ int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk, = struct sock_common *skc) struct mptcp_addr_info msk_local; struct pm_nl_pernet *pernet; int ret =3D -1; + int pm_type; =20 if (WARN_ON_ONCE(!msk)) return -1; @@ -1236,31 +1237,50 @@ int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk= , struct sock_common *skc) =20 pernet =3D net_generic(sock_net((struct sock *)msk), pm_nl_pernet_id); =20 - rcu_read_lock(); - list_for_each_entry_rcu(entry, &pernet->local_addr_list, list) { - if (addresses_equal(&entry->addr, &skc_local, entry->addr.port)) { - ret =3D entry->addr.id; - break; - } - } - rcu_read_unlock(); - if (ret >=3D 0) - return ret; - /* address not found, add to local list */ - entry =3D kmalloc(sizeof(*entry), GFP_ATOMIC); - if (!entry) - return -ENOMEM; - - entry->addr =3D skc_local; - entry->addr.id =3D 0; - entry->addr.port =3D 0; - entry->ifindex =3D 0; - entry->flags =3D 0; - entry->lsk_ref =3D NULL; - ret =3D mptcp_pm_nl_append_new_local_addr(pernet, entry); - if (ret < 0) - kfree(entry); + + pm_type =3D READ_ONCE(msk->pm.pm_type); + + if (pm_type =3D=3D MPTCP_PM_TYPE_KERNEL) { + rcu_read_lock(); + list_for_each_entry_rcu(entry, &pernet->local_addr_list, list) { + if (addresses_equal(&entry->addr, &skc_local, entry->addr.port)) { + ret =3D entry->addr.id; + break; + } + } + rcu_read_unlock(); + + if (ret >=3D 0) + return ret; + + entry =3D kmalloc(sizeof(*entry), GFP_ATOMIC); + if (!entry) + return -ENOMEM; + + entry->addr =3D skc_local; + entry->addr.id =3D 0; + entry->addr.port =3D 0; + entry->ifindex =3D 0; + entry->flags =3D 0; + entry->lsk_ref =3D NULL; + ret =3D mptcp_pm_nl_append_new_local_addr(pernet, entry); + if (ret < 0) + kfree(entry); + } else if (pm_type =3D=3D MPTCP_PM_TYPE_USERSPACE) { + struct mptcp_pm_addr_entry new_entry; + __be16 msk_sport =3D ((struct inet_sock *) + inet_sk((struct sock *)msk))->inet_sport; + + memset(&new_entry, 0, sizeof(struct mptcp_pm_addr_entry)); + new_entry.addr =3D skc_local; + new_entry.addr.id =3D 0; + + if (new_entry.addr.port =3D=3D msk_sport) + new_entry.addr.port =3D 0; + + ret =3D mptcp_userspace_pm_append_new_local_addr(msk, &new_entry); + } =20 return ret; } @@ -1491,22 +1511,39 @@ static int mptcp_nl_cmd_add_addr(struct sk_buff *sk= b, struct genl_info *info) return 0; } =20 -int mptcp_pm_get_flags_and_ifindex_by_id(struct net *net, unsigned int id, +int mptcp_pm_get_flags_and_ifindex_by_id(struct mptcp_sock *msk, unsigned = int id, u8 *flags, int *ifindex) { - struct mptcp_pm_addr_entry *entry; + struct mptcp_pm_addr_entry *entry, *match =3D NULL; + struct sock *sk =3D (struct sock *)msk; + struct net *net =3D sock_net(sk); =20 *flags =3D 0; *ifindex =3D 0; =20 if (id) { - rcu_read_lock(); - entry =3D __lookup_addr_by_id(net_generic(net, pm_nl_pernet_id), id); - if (entry) { - *flags =3D entry->flags; - *ifindex =3D entry->ifindex; + if (READ_ONCE(msk->pm.pm_type) =3D=3D MPTCP_PM_TYPE_KERNEL) { + rcu_read_lock(); + entry =3D __lookup_addr_by_id(net_generic(net, pm_nl_pernet_id), id); + if (entry) { + *flags =3D entry->flags; + *ifindex =3D entry->ifindex; + } + rcu_read_unlock(); + } else { + mptcp_data_lock(sk); + list_for_each_entry(entry, &msk->local_addr_list, list) { + if (id =3D=3D entry->addr.id) { + match =3D entry; + break; + } + } + mptcp_data_unlock(sk); + if (match) { + *flags =3D match->flags; + *ifindex =3D match->ifindex; + } } - rcu_read_unlock(); } =20 return 0; diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index dbf0c134e923..fbcd378115f7 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -773,7 +773,7 @@ mptcp_pm_del_add_timer(struct mptcp_sock *msk, struct mptcp_pm_add_entry * mptcp_lookup_anno_list_by_saddr(struct mptcp_sock *msk, struct mptcp_addr_info *addr); -int mptcp_pm_get_flags_and_ifindex_by_id(struct net *net, unsigned int id, +int mptcp_pm_get_flags_and_ifindex_by_id(struct mptcp_sock *msk, unsigned = int id, u8 *flags, int *ifindex); =20 int mptcp_pm_announce_addr(struct mptcp_sock *msk, diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c index 479a4f53bbdd..e5f2df4b92a8 100644 --- a/net/mptcp/subflow.c +++ b/net/mptcp/subflow.c @@ -1416,7 +1416,7 @@ int __mptcp_subflow_connect(struct sock *sk, const st= ruct mptcp_addr_info *loc, local_id =3D err; } =20 - mptcp_pm_get_flags_and_ifindex_by_id(sock_net(sk), local_id, + mptcp_pm_get_flags_and_ifindex_by_id(msk, local_id, &flags, &ifindex); subflow->remote_key =3D msk->remote_key; subflow->local_key =3D msk->local_key; --=20 2.31.1