From nobody Thu Sep 18 11:14:37 2025 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:3b21:0:0:0:0:0 with SMTP id c33csp2129960jaa; Wed, 2 Feb 2022 23:25:23 -0800 (PST) X-Google-Smtp-Source: ABdhPJzb7ejCoENAK8mKQrkzxRgomCrXoA1g4Ki53XM4pyX+R0S4w73FLDgtTq/VDWFXL1UyUOeU X-Received: by 2002:a63:7882:: with SMTP id t124mr27129974pgc.406.1643873123045; Wed, 02 Feb 2022 23:25:23 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1643873123; cv=none; d=google.com; s=arc-20160816; b=sFbdtUtjR8lKFSFMSAU9WDB5TX+/46RYWBX+tvHCqDDSxkMSMkuMGrIummJpPjgWGP qtzzz4vpMwGWk9WuHsSfgMs7RZXNsf4e3ZPWpLYxpUKguTtJ7QCsi0ZAI8PjkWgt2Lb/ V2Ba7mSeZdGOgpXPse1UinEBIiyN+yPIxz/d0FOeXh9gS+MPyO36nBx537AqlydVhs45 5oELO7xeQoKkly8NWQc+WLAttn29ss0OjtOi75U1EH8x9oR1aBhwFdzlaxegYXO7H+12 jatbX3VVNbBPupe9pU7PxHUhd7IIrBlMJ8hZwxXq+DynyjEwtRvB8dVN7vwC2IeEw407 uBDA== 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=j/Tn43ZqcFS/s3SwD29JI4pBjQ/pPU6OdJc/oGNZ0rE=; b=oauOCKnHXddPW3HpSWu1/WRKxcLOfOsx7it1W0t8prcK3DdG4RsOd8pNzJn6Lk8FFf YOezHIUCathzbhLdDBubXeDQaTYX9v7/GY5L8DBiCDtsJAvY8b7csA2Z5dND9tGQDf2d 75G3DEdhMnbZfy1tuxi/U5J9BXM1qnUyq/bDIMeKwpjrf7ir0YbXBKVWgBIKFevUdFHG bbYbcHkdVfT3CTPAfHcE/ctOKKms8CnlS95z/kzagVa4tf9rn1OeYOCrflgH7LCigh9L olCoWc+wxv3vUWNcUEneRKwipJtQMulXZN6+vJWGiNNiSrVF9SkfrqhW3EbiCi0KRWxe ze0g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=OObXnGMj; spf=pass (google.com: domain of mptcp+bounces-3446-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3446-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from sjc.edge.kernel.org (sjc.edge.kernel.org. [2604:1380:1000:8100::1]) by mx.google.com with ESMTPS id s207si2796361pgs.44.2022.02.02.23.25.22 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 02 Feb 2022 23:25:23 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-3446-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) client-ip=2604:1380:1000:8100::1; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=OObXnGMj; spf=pass (google.com: domain of mptcp+bounces-3446-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3446-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 sjc.edge.kernel.org (Postfix) with ESMTPS id B2C2A3E1041 for ; Thu, 3 Feb 2022 07:25:22 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 39A312CA2; Thu, 3 Feb 2022 07:25:20 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) (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 258112CA5 for ; Thu, 3 Feb 2022 07:25:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1643873118; x=1675409118; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=gxuX5nBfNjm3eDOIguVloVSnnpRcwqw5nK5LrBxglK0=; b=OObXnGMjhHdslNm3V83HkXKeYivrN7ZvBLE8hNiSFMAXr1FC5GMNSMGi MPqdxTjUzgJGKHTSLeLGnTyz0wyVMxBitd6k/l85m6AyfanKO1VW0+KRR oyxRfvYDmHggDB2DiddP1jhIUQK/vtlckxEpD3SUwvhBVp5H2L45NThQH aKbcK6R2Aj44bkd58XQ/DVh39dCtUQCyyqtqStvIY9Z4cVSNa0bbnFuq7 p3VkbmooLxdnFz4lUcbIXmI5qGTDB6RPlt5cu+x0pxWQGeIosdZ2lorWG oQzuG3AEL37W5AsXeonWCFI/AA9XBTTE0PAoeiDgfHuZMVpb8Nx1g2E/d A==; X-IronPort-AV: E=McAfee;i="6200,9189,10246"; a="272580774" X-IronPort-AV: E=Sophos;i="5.88,339,1635231600"; d="scan'208";a="272580774" Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Feb 2022 23:25:13 -0800 X-IronPort-AV: E=Sophos;i="5.88,339,1635231600"; d="scan'208";a="535118726" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by fmsmga007-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Feb 2022 23:25:13 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v5 5/8] mptcp: netlink: store per namespace list of refcounted listen socks Date: Thu, 3 Feb 2022 02:25:05 -0500 Message-Id: <20220203072508.3072309-6-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220203072508.3072309-1-kishen.maloor@intel.com> References: <20220203072508.3072309-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" The kernel can create listening sockets bound to announced addresses via the ADD_ADDR option for receiving MP_JOIN requests. Path managers may further choose to advertise the same addr+port over multiple MPTCP connections. So this change provides a simple framework to manage a list of all distinct listning sockets created in the kernel over a namespace by encapsulating the socket in a structure that is ref counted and can be shared across multiple connections. The sockets are released when there are no more references. Signed-off-by: Kishen Maloor --- v2: fixed formatting --- net/mptcp/pm_netlink.c | 76 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index ff13012178ae..3d6251baef26 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -22,6 +22,14 @@ static struct genl_family mptcp_genl_family; =20 static int pm_nl_pernet_id; =20 +struct mptcp_local_lsk { + struct list_head list; + struct mptcp_addr_info addr; + struct socket *lsk; + struct rcu_head rcu; + refcount_t refcount; +}; + struct mptcp_pm_addr_entry { struct list_head list; struct mptcp_addr_info addr; @@ -41,7 +49,10 @@ struct mptcp_pm_add_entry { struct pm_nl_pernet { /* protects pernet updates */ spinlock_t lock; + /* protects access to pernet lsk list */ + spinlock_t lsk_list_lock; struct list_head local_addr_list; + struct list_head lsk_list; unsigned int addrs; unsigned int stale_loss_cnt; unsigned int add_addr_signal_max; @@ -83,6 +94,69 @@ static bool addresses_equal(const struct mptcp_addr_info= *a, return a->port =3D=3D b->port; } =20 +static struct mptcp_local_lsk *lsk_list_find(struct pm_nl_pernet *pernet, + struct mptcp_addr_info *addr) +{ + struct mptcp_local_lsk *lsk_ref =3D NULL; + struct mptcp_local_lsk *i; + + rcu_read_lock(); + + list_for_each_entry_rcu(i, &pernet->lsk_list, list) { + if (addresses_equal(&i->addr, addr, true)) { + if (refcount_inc_not_zero(&i->refcount)) { + lsk_ref =3D i; + break; + } + } + } + + rcu_read_unlock(); + + return lsk_ref; +} + +static void lsk_list_add_ref(struct mptcp_local_lsk *lsk_ref) +{ + refcount_inc(&lsk_ref->refcount); +} + +static struct mptcp_local_lsk *lsk_list_add(struct pm_nl_pernet *pernet, + struct mptcp_addr_info *addr, + struct socket *lsk) +{ + struct mptcp_local_lsk *lsk_ref; + + lsk_ref =3D kmalloc(sizeof(*lsk_ref), GFP_ATOMIC); + + if (!lsk_ref) + return NULL; + + lsk_ref->lsk =3D lsk; + memcpy(&lsk_ref->addr, addr, sizeof(struct mptcp_addr_info)); + refcount_set(&lsk_ref->refcount, 1); + + spin_lock_bh(&pernet->lsk_list_lock); + list_add_rcu(&lsk_ref->list, &pernet->lsk_list); + spin_unlock_bh(&pernet->lsk_list_lock); + + return lsk_ref; +} + +static void lsk_list_release(struct pm_nl_pernet *pernet, + struct mptcp_local_lsk *lsk_ref) +{ + if (lsk_ref && refcount_dec_and_test(&lsk_ref->refcount)) { + sock_release(lsk_ref->lsk); + + spin_lock_bh(&pernet->lsk_list_lock); + list_del_rcu(&lsk_ref->list); + spin_unlock_bh(&pernet->lsk_list_lock); + + kfree_rcu(lsk_ref, rcu); + } +} + static bool address_zero(const struct mptcp_addr_info *addr) { struct mptcp_addr_info zero; @@ -2141,12 +2215,14 @@ static int __net_init pm_nl_init_net(struct net *ne= t) struct pm_nl_pernet *pernet =3D net_generic(net, pm_nl_pernet_id); =20 INIT_LIST_HEAD_RCU(&pernet->local_addr_list); + INIT_LIST_HEAD_RCU(&pernet->lsk_list); =20 /* Cit. 2 subflows ought to be enough for anybody. */ pernet->subflows_max =3D 2; pernet->next_id =3D 1; pernet->stale_loss_cnt =3D 4; spin_lock_init(&pernet->lock); + spin_lock_init(&pernet->lsk_list_lock); =20 /* No need to initialize other pernet fields, the struct is zeroed at * allocation time. --=20 2.31.1