From nobody Mon Feb 9 23:14:47 2026 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6638:2248:0:0:0:0 with SMTP id m8csp375658jas; Thu, 27 Jan 2022 16:38:45 -0800 (PST) X-Google-Smtp-Source: ABdhPJyGzmzMiD53u3+bnl7WY1QFZPFK+FZ4VKZFlhFiIWWtanZEulIll2qT4cInbTvrGQW7+hff X-Received: by 2002:a17:902:f683:: with SMTP id l3mr6089169plg.39.1643330325512; Thu, 27 Jan 2022 16:38:45 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1643330325; cv=none; d=google.com; s=arc-20160816; b=p+3sDzzDLqGMvPm0Q2sbOP1PUf6nv0YDKfkvLP0N35R1CoPhUANzh4beDcBsAouuVW 4Ji6KX9luFfoFSnClEbtOha78rbfiuZBkuJTrt5dqsuwH97GfoHpbmaFmfCoYHgYwcAL PqXu7IL4a1JamNnkM4rs7R38rBr2DA6ire4sQpG6lveYxpUJ6ivFB5WXbyU0nu9TmzhR snmJhn5QnZqDS7kM09WEGORRLDlc+0XDTt1riwwti30yqepD9+1izFnunCoKa+xhuMLY YyPvZcDBaE95ats7I8aB6pjtTEad8NNXdUrFn1UPLt7BKK+NcdfqbcOig0zag+p6i1dl qGVw== 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=zRSmGfgnG0IAWKrqLjC7lAbUXMDI5Tw//Yc7nrj6eaY=; b=pvOx9zLqbYCFa79se3Etok8MNiXQOIiDLLKB9gQoPCCHGpPeUDvFVkbJwyGMVGlBLs N7NZgxQa4YIaqpa99Z17Ul2r9DOedpvAUbbpj81tpP1mSDySjm4NX99IEkuUt0DJWOjJ fmpN1EMlhxTa+wkcrcAcsH73r5oVju/eQODVSmpUf+qnIUSq4dombudZtKdYsTNkdn6+ 62lm3Jxrv7moTiXxfXzIuez/CEJ5UYO9ib2LNRrpQV8CE9GK7ms46iwUWamTCzUBB4U7 A5dVbH1iV/iMuwlVCeHXt/EQVx14SeWGwbh/kzWDeLt4AubRnCYLg7FAYZtUc9cpHzvt 3jyA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=Cbe61ZTn; spf=pass (google.com: domain of mptcp+bounces-3337-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3337-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 i62si2401582pge.369.2022.01.27.16.38.45 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 27 Jan 2022 16:38:45 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-3337-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=Cbe61ZTn; spf=pass (google.com: domain of mptcp+bounces-3337-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3337-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 EECE83E0F66 for ; Fri, 28 Jan 2022 00:38:44 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 643742C9D; Fri, 28 Jan 2022 00:38:42 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) (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 62C132CAA for ; Fri, 28 Jan 2022 00:38:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1643330321; x=1674866321; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=Gr13AAUhe5eTCkooVg6zrYFWSbdk1t9Q+M9BsCv7uS4=; b=Cbe61ZTn8PH2HcJrfDvvcslHnfzyaUtQGygQXOxLU4UGP98dQIAUTEJY aTUnQ/l3IZY0zsubUfEgPW2L0UPrQED4dNl2GH1la8NSCPSIE01yQumQx 6n+Lu8ov+Xw1cWJyj+gyiBTYxafEy4LeUT1LIuvozo03vzos5kxi2eS+J oLDKL3obOC2AAnatvanFUzCiOLbkeRDFEIqtF359Yx/Xn83sE+bExqvXl 0jI7QhjcJ6jbq0SnaVAFkRshknB3Yi+4ERCL4e2w6re7mCLg6CqDBieG7 2gOdavswTXHrJIKJ1yY6EYBQNrDVd7L+v8JnT3yzDEEkN4YIZO7wjU3RV w==; X-IronPort-AV: E=McAfee;i="6200,9189,10239"; a="245846917" X-IronPort-AV: E=Sophos;i="5.88,322,1635231600"; d="scan'208";a="245846917" Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Jan 2022 16:38:25 -0800 X-IronPort-AV: E=Sophos;i="5.88,322,1635231600"; d="scan'208";a="564001002" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga001-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Jan 2022 16:38:20 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v3 5/8] mptcp: netlink: store per namespace list of refcounted listen socks Date: Thu, 27 Jan 2022 19:38:09 -0500 Message-Id: <20220128003812.2732609-6-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220128003812.2732609-1-kishen.maloor@intel.com> References: <20220128003812.2732609-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 f90e77c3775d..aac9438dbf6c 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; @@ -2137,12 +2211,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