From nobody Fri Mar 29 02:34:01 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp690116jap; Thu, 16 Dec 2021 14:24:15 -0800 (PST) X-Google-Smtp-Source: ABdhPJwoqA9zU/gKAV9JqlNBnrfxeIVkoWha5oCdtd6oetLjAfx6aOJs3Xr5/juRWiqUPOvaK7ji X-Received: by 2002:a05:622a:494:: with SMTP id p20mr87253qtx.83.1639693455681; Thu, 16 Dec 2021 14:24:15 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1639693455; cv=none; d=google.com; s=arc-20160816; b=UAiHy4Nc/m+eE5BmqhZriiVR0dP1uBEYVShWRzgdTliAGUBmelsIFV413mZjpaYKyX L6n2b2S4y2j8JHn3E0w2WD7KcT+nyNLptVqAq3WzrPOC4YB/HWDIcXgB6/iiy4EaOy89 ArFn3aMZyyLaw1e9BqMF6G408AvmpWzuGrX8ekWaxaymv3GNayHbhWLsDfiDeiUlpwYD 5kWO4VTynAHlIxgEr7rgE9zxI5uS733aWlzOz2jiwKVUwqCgAwvCKIjwvaiVdZZ/V6dA TtlwGItFJmGXuO4N6TS6TMPp7hhG21qzDW8eTcsXfzMt1Z8XadpmZqTOxDgQrqCT5cxL OW8Q== 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=PyGeo8NalnCip7GUJElG4qxeINLj6hbRRmIpm3jbT10=; b=xo+eVdQlsjzWTQmLbwnrikyNhsaAaHMuDi0Pdm4Wsxepzzj75kZQoU9jhNrX6+3deq FOUvOls/ahokVgQy2QnQtyNfl2OXbC330PqqcHGswt3UTtuKhUg6PK20dF7H2iuKhP6r LJjEFz4MTQN+k2XYJCLYeDxI1VOJ4DiCIwAfMm9SPhPJa6jWExqqxF2i9IKg8opvqKO9 VPNZPMzw3pZ0rgm/iTLUXuJkLuMYKjxNPQDJRCHKXSZ0IX5CME3AZqv18hIZS2J6eniH UYnkf7ueFsu7I72RXVQhKDHHTDq2kT5JcA1Py7Gxdvewjh+1VelVwSJp3SeFVkkoU/I+ sHVw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=mJZ5Wmgv; spf=pass (google.com: domain of mptcp+bounces-2795-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-2795-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. [147.75.197.195]) by mx.google.com with ESMTPS id jk7si3519907qvb.460.2021.12.16.14.24.15 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 16 Dec 2021 14:24:15 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2795-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) client-ip=147.75.197.195; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=mJZ5Wmgv; spf=pass (google.com: domain of mptcp+bounces-2795-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-2795-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 7C8711C0B3F for ; Thu, 16 Dec 2021 22:24:15 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 553962CBD; Thu, 16 Dec 2021 22:24:14 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) (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 E1EEF2CB5 for ; Thu, 16 Dec 2021 22:24:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1639693451; x=1671229451; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=RqFkuGksiI6R0XGEF4afMW+j7YKqqFmAYKoc85fXM8U=; b=mJZ5WmgvnvGkiP8RQ14fa0a8vXLdF6fbFHA7xopeqFwni7OQkLkwyhWv UZLViOsqd77DH6AmfzdDL0+1p0ZBujJKR4/NqyPtw2AEWYS04Vbx545si yTf4fhmN4LfZms1M6d+2wxlToNBEU+YShT1hQ/o3p3u9nUX5Ds7fV5FCV nN+8S/FvOslmk+42WaQRPCTV4JLkGyLU0tRYeM5HYp/oM84RCgmpR36mg Osn4dfwuLxa9tutwP4cVuWzYpOL0NT9StZ/6r/Jxdk4Xycp6s7btxJqD1 PZzDS6TqcWzINT4qhq0zDWUzWoI1tnbamPivuvS8tYrMZ7HR78isaAEm1 w==; X-IronPort-AV: E=McAfee;i="6200,9189,10200"; a="300393155" X-IronPort-AV: E=Sophos;i="5.88,212,1635231600"; d="scan'208";a="300393155" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Dec 2021 14:24:10 -0800 X-IronPort-AV: E=Sophos;i="5.88,212,1635231600"; d="scan'208";a="519461223" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Dec 2021 14:24:10 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next 01/21] mptcp: do not restrict subflows with non-kernel PMs Date: Thu, 16 Dec 2021 17:22:54 -0500 Message-Id: <20211216222314.1244708-2-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20211216222314.1244708-1-kishen.maloor@intel.com> References: <20211216222314.1244708-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" All numerical restrictions on # of addresses/subflows currently apply only to in-kernel PM managed connections. Thus this change removes limitations on adding new subflows by non-kernel (e.g. userspace) PMs. Signed-off-by: Kishen Maloor --- net/mptcp/pm.c | 7 +++++++ net/mptcp/subflow.c | 3 ++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c index 1f8878cc29e3..5f35fe8a5e82 100644 --- a/net/mptcp/pm.c +++ b/net/mptcp/pm.c @@ -87,6 +87,13 @@ bool mptcp_pm_allow_new_subflow(struct mptcp_sock *msk) unsigned int subflows_max; int ret =3D 0; =20 + if (READ_ONCE(pm->pm_type) !=3D MPTCP_PM_TYPE_KERNEL) { + spin_lock_bh(&msk->pm.lock); + ++pm->subflows; + spin_unlock_bh(&msk->pm.lock); + return true; + } + subflows_max =3D mptcp_pm_get_subflows_max(msk); =20 pr_debug("msk=3D%p subflows=3D%d max=3D%d allow=3D%d", msk, pm->subflows, diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c index fd5fdb639088..b009d0f7fb77 100644 --- a/net/mptcp/subflow.c +++ b/net/mptcp/subflow.c @@ -62,7 +62,8 @@ static void subflow_generate_hmac(u64 key1, u64 key2, u32= nonce1, u32 nonce2, static bool mptcp_can_accept_new_subflow(const struct mptcp_sock *msk) { return mptcp_is_fully_established((void *)msk) && - READ_ONCE(msk->pm.accept_subflow); + ((READ_ONCE(msk->pm.pm_type) !=3D MPTCP_PM_TYPE_KERNEL) || + READ_ONCE(msk->pm.accept_subflow)); } =20 /* validate received token and create truncated hmac and nonce for SYN-ACK= */ --=20 2.31.1 From nobody Fri Mar 29 02:34:01 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp690112jap; Thu, 16 Dec 2021 14:24:15 -0800 (PST) X-Google-Smtp-Source: ABdhPJwyrhukgOIbHb1kzoTc7g+qZYbTEu2ERWIeroKKABoLyjktNPgBkrNAfeAFR7D/uNEMIEEw X-Received: by 2002:a05:622a:164b:: with SMTP id y11mr87031qtj.87.1639693455062; Thu, 16 Dec 2021 14:24:15 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1639693455; cv=none; d=google.com; s=arc-20160816; b=D3i12qEswReJEn0WghPuABBLmqTzMWoz97bYZ+36dNZlrzfqrnPwaZ4rowP8xJTxt9 DEKIawJ+ZBQchTSiVLuxOKK5i/92Bov7xCP3iZWFV0mlAMlBM3kHmIt+Xt0vp83tDTfk jflPVFFyY5Bmg+qxrhXt6mA4HimWKhH01kxXynRj/bQIQEYJNC5S6MlBc8Pa14ZbpOIg gB7748gLlnhYERBeH8efpVlgayJg32iTiLCaVE64qgmqKqDrurCXNu5R7zTRS4fNKFeP 9QuXANR6EtzuUcLFoUtLES7kfcOErjin6QskxqCp6rQCIAMemjQMryOwT5QKZOjhEwJ0 N4bA== 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=WEqmMOBzuYFoFCjVWQODiAN/+LotZ1sX3ZGr++xmRgc=; b=KwfbFnAFYIrj8xLhhkqpEtmrRy9el97L2wOoi6Gk84UlvHWt5t6OVuxlN7CcE0lFxg 2hNXq9bx15nU5H7UIxruPK8mW44B4Wm8CYn1Nrm/3N9kO3Qgq/Q/GRSOl66/bFfDrqua sZ7qVP2a4fNBkalVh6Rcwrpxhx3MtsBTmOSoOB5G5Z10mX5LF879506FENh3fS66eWRo ihPtQkg789JvSihmmIiLzlEnH4OocJx0CcRunfB2MeHyGGx95Fk4Zl1VAWbhM65FKs0W PV660hh4bAMFDCuy6Zix3A2ukU+xfBhXpeVmmw5V3JUUJ6E4halOP0TXU1lNGcnoVlft e8Mg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=JUXsLOSA; spf=pass (google.com: domain of mptcp+bounces-2794-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2794-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 eo5si2753032qvb.39.2021.12.16.14.24.14 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 16 Dec 2021 14:24:15 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2794-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=JUXsLOSA; spf=pass (google.com: domain of mptcp+bounces-2794-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2794-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 5E52D1C0A95 for ; Thu, 16 Dec 2021 22:24:14 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 2318E2CBB; Thu, 16 Dec 2021 22:24:13 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) (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 633FB2CA7 for ; Thu, 16 Dec 2021 22:24:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1639693451; x=1671229451; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=g3HjRxAW2nKK2T0as/ELLt/oJ+EohLEJGBuBJ9Xk7D0=; b=JUXsLOSA0e7hySPXWhwjZnk11NGTz4IF/mUKTD9rbmk4D4UzY52kHcgF fdZJs8HlhMj0FcHoAyS7dclzRXdRZO47c1hSq0xqrvz5nLMit3N2H/e3k sJGxEYLWoRNK5An8cD1TJTd7/Xbkqqrl+3lJG1tM8VpPODssoiKUVa0x9 K39wR+Lo5pDG/tOUazg48VdfkelQqxCuJlz/y/E4CcCmfPHFpA2ZDvloL NsTVXyTrFKR4rke0C+fU8+vnJUvvj0lxbG2oYMwBKrZ9VILVz5NluzcZf +LsInoZY7TRaVJuqWFJlt+Atr+hI5nuEu/bU3uvo8fKaJniGguWxgGyRY g==; X-IronPort-AV: E=McAfee;i="6200,9189,10200"; a="300393157" X-IronPort-AV: E=Sophos;i="5.88,212,1635231600"; d="scan'208";a="300393157" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Dec 2021 14:24:10 -0800 X-IronPort-AV: E=Sophos;i="5.88,212,1635231600"; d="scan'208";a="519461226" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Dec 2021 14:24:10 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next 02/21] mptcp: store remote id from MP_JOIN SYN/ACK in local ctx Date: Thu, 16 Dec 2021 17:22:55 -0500 Message-Id: <20211216222314.1244708-3-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20211216222314.1244708-1-kishen.maloor@intel.com> References: <20211216222314.1244708-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 reads the addr id assigned to the remote endpoint of a subflow from the MP_JOIN SYN/ACK message and stores it in the related subflow context. The remote id was not being captured prior to this change, and will now provide a consistent view of remote endpoints and their ids as seen through netlink events. Signed-off-by: Kishen Maloor --- net/mptcp/subflow.c | 1 + 1 file changed, 1 insertion(+) diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c index b009d0f7fb77..b75b7b186d34 100644 --- a/net/mptcp/subflow.c +++ b/net/mptcp/subflow.c @@ -444,6 +444,7 @@ static void subflow_finish_connect(struct sock *sk, con= st struct sk_buff *skb) subflow->backup =3D mp_opt.backup; subflow->thmac =3D mp_opt.thmac; subflow->remote_nonce =3D mp_opt.nonce; + subflow->remote_id =3D mp_opt.join_id; pr_debug("subflow=3D%p, thmac=3D%llu, remote_nonce=3D%u backup=3D%d", subflow, subflow->thmac, subflow->remote_nonce, subflow->backup); --=20 2.31.1 From nobody Fri Mar 29 02:34:01 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp690151jap; Thu, 16 Dec 2021 14:24:18 -0800 (PST) X-Google-Smtp-Source: ABdhPJxzi67OXZ78QG2PDE5g3kqwLGz/Ewf4KnX1gUKmbSe4oxfKS6ZpaueDqciBz0yy7TkzloYY X-Received: by 2002:a05:6214:984:: with SMTP id dt4mr18151328qvb.120.1639693458027; Thu, 16 Dec 2021 14:24:18 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1639693458; cv=none; d=google.com; s=arc-20160816; b=uXBPVUVNJ3bjEL+GeYEpyle4KDh4uXizWDsK6cXnlifPDPDQY+NG9J76CQMudWQnAs nsyD2C+4iYOrJHtcFqkWQFlZR8XpNNY4IT0PSkvigT7p3j791KHu2dfbig8t/YjaVezz qFuyLwyv9jH+dyFYHh6dfkiluxDVwKjsRU+AqVIR0T4nM6+StGKPdX55mxf5CXMuUEFs ZAOS5SvR/0+9VeA/7y0jRbq+LJeObgeXLbOBQ5HLnRw+1GENU1HUUCLze81/C36te/zc acgdOIryE5n9vP6td6d3j3pQk/oSoAQ7viE5nQUNPAmHt4VtD7ZGkRO13kJ9ures3tLR LpWA== 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=JDsfPJA/xni+6/nmOw4c5ElQRtRQuhdflcNWOw58stM=; b=HuJO4P3yBsCUQA7IdqRkOJwifZXN+m3vXBBx5tXwx4zCEJeprq7vKVbPSCFYMqasmr eBj7WyeddiI9Dqt3o4BTgRyn4fN3w+6hHvhKkuGs1gXJWozcxWwFwE7LZGm1yQ6aTEjm nn/o7SLAJAV3Wrt96544mltyVmZkus/iYRpWu/XyspuQtxZOwTeUQ0P8h0fJvtPpW+GC Riq+HG/PifV65IE6Tygr0r2TX/b5v4XqR8jNkgUaMgTI2xIGLOy/oZqtsHiTcKAtZdZK AWhcOyrHUcSJVhLgDd6gkv2bCgOASOli5XdTn6Jn11QItcjBFcM08wQiNxkvLHV+bd3A 06zA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=A8aag903; spf=pass (google.com: domain of mptcp+bounces-2797-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-2797-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. [147.75.197.195]) by mx.google.com with ESMTPS id h11si2901695qko.146.2021.12.16.14.24.17 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 16 Dec 2021 14:24:18 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2797-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) client-ip=147.75.197.195; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=A8aag903; spf=pass (google.com: domain of mptcp+bounces-2797-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-2797-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 BF77C1C0CC2 for ; Thu, 16 Dec 2021 22:24:17 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 9D6862CBB; Thu, 16 Dec 2021 22:24:15 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) (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 B8FB42CBC for ; Thu, 16 Dec 2021 22:24:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1639693453; x=1671229453; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=nRVymqImLVZUnWJH/FWCAR9ITX7opML5AleHBZilvmc=; b=A8aag903iSRL79Vn/lX2sPj3G8Pmpq6qeAgFkdyozvyxCKbE6SZIh/pg aAdrIx3dOD41Hx1eksMYEKEv2OV0Lg4MLA3toKjluI8nzKFYoBcObu0dG OIvc+Q3yup09Ywqtyqro6EGExdoMhndjAjAGPlWv29o1XRewYbggpRqDb D2Tyb7D/K9LtRw3zFExTyzAUWejxWdzdDWY9lEJSNFpdkZDlROEblD9f9 Az9Fsr3y7334fjU77oTbdRcvoyA1L8BKJObuCI3c11JsZGMgbHlQd5VQ/ 62a7bQuNm43wvnHhFYn6tA99D2NTVo/Sis8+lr7VvHA6JMoldnxLkGHrj Q==; X-IronPort-AV: E=McAfee;i="6200,9189,10200"; a="300393158" X-IronPort-AV: E=Sophos;i="5.88,212,1635231600"; d="scan'208";a="300393158" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Dec 2021 14:24:10 -0800 X-IronPort-AV: E=Sophos;i="5.88,212,1635231600"; d="scan'208";a="519461228" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Dec 2021 14:24:10 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next 03/21] mptcp: reflect remote port (not 0) in ANNOUNCED events Date: Thu, 16 Dec 2021 17:22:56 -0500 Message-Id: <20211216222314.1244708-4-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20211216222314.1244708-1-kishen.maloor@intel.com> References: <20211216222314.1244708-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" Per RFC 8684, if no port is specified in an ADD_ADDR message, MPTCP SHOULD attempt to connect to the specified address on the same port as the port that is already in use by the subflow on which the ADD_ADDR signal was sent. To facilitate that, this change reflects the specific remote port in use by that subflow in MPTCP_EVENT_ANNOUNCED events. Signed-off-by: Kishen Maloor --- net/mptcp/options.c | 2 +- net/mptcp/pm.c | 5 +++-- net/mptcp/pm_netlink.c | 8 ++++++-- net/mptcp/protocol.h | 6 ++++-- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/net/mptcp/options.c b/net/mptcp/options.c index 7a6a39b71633..cceba8c7806d 100644 --- a/net/mptcp/options.c +++ b/net/mptcp/options.c @@ -1123,7 +1123,7 @@ bool mptcp_incoming_options(struct sock *sk, struct s= k_buff *skb) if ((mp_opt.suboptions & OPTION_MPTCP_ADD_ADDR) && add_addr_hmac_valid(msk, &mp_opt)) { if (!mp_opt.echo) { - mptcp_pm_add_addr_received(msk, &mp_opt.addr); + mptcp_pm_add_addr_received(msk, &mp_opt.addr, sk); MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_ADDADDR); } else { mptcp_pm_add_addr_echoed(msk, &mp_opt.addr); diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c index 5f35fe8a5e82..db889ff60326 100644 --- a/net/mptcp/pm.c +++ b/net/mptcp/pm.c @@ -204,14 +204,15 @@ void mptcp_pm_subflow_check_next(struct mptcp_sock *m= sk, const struct sock *ssk, } =20 void mptcp_pm_add_addr_received(struct mptcp_sock *msk, - const struct mptcp_addr_info *addr) + const struct mptcp_addr_info *addr, + const struct sock *ssk) { struct mptcp_pm_data *pm =3D &msk->pm; =20 pr_debug("msk=3D%p remote_id=3D%d accept=3D%d", msk, addr->id, READ_ONCE(pm->accept_addr)); =20 - mptcp_event_addr_announced(msk, addr); + mptcp_event_addr_announced(msk, addr, ssk); =20 spin_lock_bh(&pm->lock); =20 diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index f12effa71942..fc07ab9a53ba 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -1933,7 +1933,8 @@ void mptcp_event_addr_removed(const struct mptcp_sock= *msk, uint8_t id) } =20 void mptcp_event_addr_announced(const struct mptcp_sock *msk, - const struct mptcp_addr_info *info) + const struct mptcp_addr_info *info, + const struct sock *ssk) { struct net *net =3D sock_net((const struct sock *)msk); struct nlmsghdr *nlh; @@ -1957,7 +1958,10 @@ void mptcp_event_addr_announced(const struct mptcp_s= ock *msk, if (nla_put_u8(skb, MPTCP_ATTR_REM_ID, info->id)) goto nla_put_failure; =20 - if (nla_put_be16(skb, MPTCP_ATTR_DPORT, info->port)) + if (nla_put_be16(skb, MPTCP_ATTR_DPORT, + info->port =3D=3D 0 ? + ((struct inet_sock *)inet_sk(ssk))->inet_dport : + info->port)) goto nla_put_failure; =20 switch (info->family) { diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index d1b46c0d8c40..e2a67d3469f6 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -752,7 +752,8 @@ bool mptcp_pm_nl_check_work_pending(struct mptcp_sock *= msk); void mptcp_pm_subflow_check_next(struct mptcp_sock *msk, const struct sock= *ssk, const struct mptcp_subflow_context *subflow); void mptcp_pm_add_addr_received(struct mptcp_sock *msk, - const struct mptcp_addr_info *addr); + const struct mptcp_addr_info *addr, + const struct sock *ssk); void mptcp_pm_add_addr_echoed(struct mptcp_sock *msk, struct mptcp_addr_info *addr); void mptcp_pm_add_addr_send_ack(struct mptcp_sock *msk); @@ -780,7 +781,8 @@ int mptcp_pm_remove_subflow(struct mptcp_sock *msk, con= st struct mptcp_rm_list * =20 void mptcp_event(enum mptcp_event_type type, const struct mptcp_sock *msk, const struct sock *ssk, gfp_t gfp); -void mptcp_event_addr_announced(const struct mptcp_sock *msk, const struct= mptcp_addr_info *info); +void mptcp_event_addr_announced(const struct mptcp_sock *msk, const struct= mptcp_addr_info *info, + const struct sock *ssk); void mptcp_event_addr_removed(const struct mptcp_sock *msk, u8 id); =20 static inline bool mptcp_pm_should_add_signal(struct mptcp_sock *msk) --=20 2.31.1 From nobody Fri Mar 29 02:34:01 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp690166jap; Thu, 16 Dec 2021 14:24:19 -0800 (PST) X-Google-Smtp-Source: ABdhPJyoUms5NVQiSg+EsefIpSYFzv8vleNjK0zutlI5492BZ3Hw8XJ5973nW9/lRxFENkiw8pNj X-Received: by 2002:a05:620a:148a:: with SMTP id w10mr112738qkj.277.1639693459207; Thu, 16 Dec 2021 14:24:19 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1639693459; cv=none; d=google.com; s=arc-20160816; b=FG9aUiNuliTjnVBdqV6jM1mjV3ZBvmJtNKrKOn7+fqHJ/tIbsoJ6VH4mAX7v/dxytt QI9gfLe4f+vOoW5iRvuHT+a8Y4Fsjho2/neP84+iQQ/GxEtI+gJGxz+UWfpcfMJy8vVD CXmudIpCkSa3e98nb0teCQIPV6gn/IrxoF+mj2kNR8LUwLqVLxIvUmP+d6/MZXY1cGvT 8WbJAbacATQ0dJ7fcKaf7bAa8u50BNaH2dI6AvsDMR0VjQPG04zIXT25ZdQHZrAg22vy S9U69+qRdWS173sbCWrhIhAQXERgaiExwsDPNOp3EUHLmSTXC/2S/RSWGEs+aRApk9Pb 8aow== 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=T++lmI+jAgKo3cMNp4OP6DPo3ZI0DcDn6sR8dtLHJO0=; b=J4LfNDzN+oQFLYwSfAadlE607Wif9DvFBD3QqolvVQmAWBD9PHXCg9ZOOz6UGDFoAr C/tuuCzIv11TScS1GgdSsX6mQU/VSTRq/qqLRuX7B/u/FFp+rMqOCKVt5LENl8h9Q4vQ cC1h8VDWpxQ84HnlLvXtp1i/z+Pl2ECy0IMiTDE3vlA606LDZ3gzFfbFOqH6YVKjSL+1 mcY5b6kbGSTxtqMYVN4712tekb26bi25J/qVIZlqQZYPAXk9sYyzDCQeTY/QU41RL1sH +0ugvINg7yFPJ+284SL/87dUA2CkFtObcdryXcCJQPygX785VNPQs6RH07Y4R7rVwj57 cXew== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=RuqrBTzb; spf=pass (google.com: domain of mptcp+bounces-2798-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-2798-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. [147.75.197.195]) by mx.google.com with ESMTPS id l16si3232313qtx.512.2021.12.16.14.24.19 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 16 Dec 2021 14:24:19 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2798-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) client-ip=147.75.197.195; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=RuqrBTzb; spf=pass (google.com: domain of mptcp+bounces-2798-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-2798-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 E366F1C0BF7 for ; Thu, 16 Dec 2021 22:24:18 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id B1ADC2CBC; Thu, 16 Dec 2021 22:24:15 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) (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 7E1742CA7 for ; Thu, 16 Dec 2021 22:24:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1639693454; x=1671229454; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=aEwIQ8vPLJ/R6VD0AWYzWBRGIQKZiSeVS5swWA/ksAU=; b=RuqrBTzbcCfbtgqu9e9kqsxUmdaMlXstq/st4+f7UsaF2kQZbVna4a6l +arzRzJ1JJt6lMEbRmQFU1POYh5Eetdlcyll0bBNn+yhfueMZY3Q/0HeO 2omq4/uGijDHqZFGMR/Hg+k6zBcn+b9fZtBFeOCMhzhtZuWAg5b/+Z/Zd MTkdF/Z23NaJxgtk41PFxKQFwXi17RiMpQieOnRzTKKX6jeDkwtMKTdmk 0EjLbgEsQoFshct5nP3rYLT1Ckiwu3PBZ0rEUdaujwn11RarKaUiszgx+ i/iW09sNXlqIfO70tqJdASl88u/Sm0gAGuqvx7l1nVebzZw2GsNIRy/rg Q==; X-IronPort-AV: E=McAfee;i="6200,9189,10200"; a="300393159" X-IronPort-AV: E=Sophos;i="5.88,212,1635231600"; d="scan'208";a="300393159" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Dec 2021 14:24:10 -0800 X-IronPort-AV: E=Sophos;i="5.88,212,1635231600"; d="scan'208";a="519461232" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Dec 2021 14:24:10 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next 04/21] mptcp: establish subflows from either end of connection Date: Thu, 16 Dec 2021 17:22:57 -0500 Message-Id: <20211216222314.1244708-5-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20211216222314.1244708-1-kishen.maloor@intel.com> References: <20211216222314.1244708-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 updates internal logic to permit subflows to be established from either the client or server ends of MPTCP connections. This symmetry and added flexibility may be harnessed by PM implementations running on either end in creating new subflows. The essence of this change lies in not relying on the "server_side" flag (which continues to be available if needed). Signed-off-by: Kishen Maloor --- net/mptcp/options.c | 3 +-- net/mptcp/protocol.c | 5 +---- net/mptcp/protocol.h | 2 -- 3 files changed, 2 insertions(+), 8 deletions(-) diff --git a/net/mptcp/options.c b/net/mptcp/options.c index cceba8c7806d..ee13bb46dc38 100644 --- a/net/mptcp/options.c +++ b/net/mptcp/options.c @@ -920,8 +920,7 @@ static bool check_fully_established(struct mptcp_sock *= msk, struct sock *ssk, */ if (TCP_SKB_CB(skb)->seq =3D=3D subflow->ssn_offset + 1 && TCP_SKB_CB(skb)->end_seq =3D=3D TCP_SKB_CB(skb)->seq && - subflow->mp_join && (mp_opt->suboptions & OPTIONS_MPTCP_MPJ) && - READ_ONCE(msk->pm.server_side)) + subflow->mp_join && (mp_opt->suboptions & OPTIONS_MPTCP_MPJ)) tcp_send_ack(ssk); goto fully_established; } diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 4012f844eec1..408a05bff633 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -3248,15 +3248,12 @@ bool mptcp_finish_join(struct sock *ssk) return false; } =20 - if (!msk->pm.server_side) + if (!list_empty(&subflow->node)) goto out; =20 if (!mptcp_pm_allow_new_subflow(msk)) goto err_prohibited; =20 - if (WARN_ON_ONCE(!list_empty(&subflow->node))) - goto err_prohibited; - /* active connections are already on conn_list. * If we can't acquire msk socket lock here, let the release callback * handle it diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index e2a67d3469f6..c50247673c7e 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -908,10 +908,8 @@ static inline bool mptcp_check_infinite_map(struct sk_= buff *skb) static inline bool subflow_simultaneous_connect(struct sock *sk) { struct mptcp_subflow_context *subflow =3D mptcp_subflow_ctx(sk); - struct sock *parent =3D subflow->conn; =20 return sk->sk_state =3D=3D TCP_ESTABLISHED && - !mptcp_sk(parent)->pm.server_side && !subflow->conn_finished; } =20 --=20 2.31.1 From nobody Fri Mar 29 02:34:01 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp690196jap; Thu, 16 Dec 2021 14:24:20 -0800 (PST) X-Google-Smtp-Source: ABdhPJzUwF3IQqhxY2Si4b1IoT9Hl5nKnN9ajCgr2cQzE0xERyamS/eNrcFEHTeYnpGL9VmyN2Ma X-Received: by 2002:a63:6b89:: with SMTP id g131mr220214pgc.129.1639693460506; Thu, 16 Dec 2021 14:24:20 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1639693460; cv=none; d=google.com; s=arc-20160816; b=K4G19RqD9WNjg+QgqLf1+Q+6nBaJJHt3TppG8CAKN8Fh5sMrLDEsiq3CfusMAzsbF8 9yLC0uX4P0mnl+2ElpVXnvZk7HxRE7YPp7ZUnLXzZlTfYKQboF6CPSvM66u06t05/Bhy NGTBXSNzh8cd1unR2kZ/v0xOBskf7Xo9MjViNcJuQlWWblRycUc8fP33pWlbhK/SPZhu /JbdsMEpAN82uWN6JZePuKGsr9KJusmK1kCq53Wqderwi070C1L+ityckGbcudN2qmNe KBaEjAbLf2ojzDbBEx9FelYe8QYQF7odJNF9zlGfH8pD1b/Vbv9DGmzHEKbzNoNgASqM Spuw== 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=x/jahi69IhzawWSJYy0xtc6qAVBS2yuZYLQvCtyz/nU=; b=AOWCnsPj179za6dlRsT9ut9hrBmsSDYYCRRh3hPuA6+ncCVU58+RsB+mDqNHKoeo8W pm2ztj66SpVa2w7dsgcYXSnmwfg89X/6j12cIo2O4o8UPB2EdmVKqC/PdwcEPY55oNcS bAzF1DloQf9Q0uUs3GStaU27eyb4mSFezy2hWCedHS/eJ2m+8lLBtXHuyvHNVScCd8VR bQrQqSdLPVTLdqITAOIYbCK1NTXP7XfMI07XQlbceyEFzoVFm83WdszZ8HW0d2EUY/st kqiQ+WjzkscJijLZTc02zDGCJ3JC5P2uT4GXDejtekZIMg5wfo5L1/TsMZWcTczuvMcf aZSA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=a8cqEr2q; spf=pass (google.com: domain of mptcp+bounces-2799-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-2799-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. [147.75.69.165]) by mx.google.com with ESMTPS id b10si4020907plz.326.2021.12.16.14.24.20 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 16 Dec 2021 14:24:20 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2799-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) client-ip=147.75.69.165; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=a8cqEr2q; spf=pass (google.com: domain of mptcp+bounces-2799-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-2799-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 B22753E0F67 for ; Thu, 16 Dec 2021 22:24:19 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id A54452CBD; Thu, 16 Dec 2021 22:24:16 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) (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 9AD372CBE for ; Thu, 16 Dec 2021 22:24:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1639693454; x=1671229454; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=BiMKOQpjd4aJ3vbxKta/yaUxKLJyZvdCR7dgy7Ykx5o=; b=a8cqEr2q09vbop4YY//AQyas2/xkzUQB5KLqP2ZddWyPSueiOTd2mtZF Qtq62nWNSwAKTIKyHc+A7uchS/qZRPL4/enMVEk0IaxAPFhvCooe/SI9p 1B9yeLrK5Qz1AVohSApa7VAk0eDaEFQoJR0B/P+FfGQ/EHod0guh4IpTP h0tn327FdHU6+gtL334TnwX1cgjGFFgZxgF9AE5T7i9KPCCZdkqnETEaX 7XsjCecG6CDITsr/pvM7KECtXGkujrCaMyk6I3xJnpjZI03aDWCAxJu2w FoMcxCKte/AQe/b3Bw/O+ITcPuRmAjm8k9ABvruj9roO5dpV/sT0//f1R A==; X-IronPort-AV: E=McAfee;i="6200,9189,10200"; a="300393160" X-IronPort-AV: E=Sophos;i="5.88,212,1635231600"; d="scan'208";a="300393160" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Dec 2021 14:24:10 -0800 X-IronPort-AV: E=Sophos;i="5.88,212,1635231600"; d="scan'208";a="519461235" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Dec 2021 14:24:10 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next 05/21] mptcp: netlink: store per namespace list of refcounted listen socks Date: Thu, 16 Dec 2021 17:22:58 -0500 Message-Id: <20211216222314.1244708-6-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20211216222314.1244708-1-kishen.maloor@intel.com> References: <20211216222314.1244708-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 maintains listening sockets bound to announced addresses via the ADD_ADDR option to be able to receive MP_JOIN requests. Path managers may choose to advertise the same address over multiple MPTCP connections. So this change provides a simple framework to manage a list of all distinct listning sockets created in a namespace by encapsulating it in a structure that is ref counted and can be shared across multiple connections. The sockets (and their enclosing structure) are released when there are no more references. Signed-off-by: Kishen Maloor --- 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 fc07ab9a53ba..0cb03d78e22b 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; @@ -2098,12 +2172,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 From nobody Fri Mar 29 02:34:01 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp690230jap; Thu, 16 Dec 2021 14:24:22 -0800 (PST) X-Google-Smtp-Source: ABdhPJzJI0r5HZO3L0HD6fwfmVrIbAkoO8DMr9D7jRpuz+Vn8Ha8HiLRPZbLhuLobSgsJdwDGHuT X-Received: by 2002:a63:8441:: with SMTP id k62mr251579pgd.152.1639693462434; Thu, 16 Dec 2021 14:24:22 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1639693462; cv=none; d=google.com; s=arc-20160816; b=okV8aZ4wshsdt4QDj5pivAa2ODrnjpKgtvYNOfUW9FYq7di+EmMpTon5v9PsklVzyG 1GhHCormSU58WsIaYICmrV6qs25jwEsOMs7Sv22F9/MIhNxGlA6Dpo8vkwLUnlXSkMm7 NC3GYAkK7W4m5IXkhZ+jcbf/yr2B/I9lRyHg7O9CJZ8FORNillJbNcGMFV/gJjFQ2rLF sZeCB8XLvdKxdRm0k+Te3gk1WOigYqrD/rjCkCHIJlpJH/D+zZ4oA6JvxFiQFfVdszu6 eI9L5jLDqlwtsR9gFDqzLHtorG7Tce9JnssAsGC1iG1SHSwHofsJ4Yrwo+GHGHcMa6LH yaxA== 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=GfABm51SZfA8A4pK/OOBi2tIlNgUiC1Zob/OoGrS5J0=; b=xMdhjwcycMD0cwbOtZojWK6cVFMijL7tw/rHrGM0mixVotlqDOI39iYUtns6/LH2Hb eCyNEpaxayIs5Sq1iaVqYPSIVNOz8/yRHSe9m2LQF3iTUStuKxp07OFr0RBQWlZ1TilJ 0XUFDYrChwm7wbqpuHFK6gdRirMk/JDq72otVnVHkLClS6iUQL4a7QxASzrJOs94rOdI pemb0cM43yHb1MqWWIwUg7UBXjF/KMec50YHCzzi1Ir7LX8rqyP6GMleYJAa6/3uHVTQ MByNqTUv80v9OKd6vLLRNyFNu7uoxm4P3eyIc4VOAQqgjIs7IHwObSzpCVOFAaALNOQi USUA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=ZY3Fga8h; spf=pass (google.com: domain of mptcp+bounces-2801-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2801-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 t14si5242277plg.17.2021.12.16.14.24.22 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 16 Dec 2021 14:24:22 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2801-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=ZY3Fga8h; spf=pass (google.com: domain of mptcp+bounces-2801-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2801-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 D15FE3E0E77 for ; Thu, 16 Dec 2021 22:24:21 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 28EA93FC0; Thu, 16 Dec 2021 22:24:18 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) (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 C7A902CA7 for ; Thu, 16 Dec 2021 22:24:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1639693456; x=1671229456; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=u7ln60s7R4d1FomcW5RgcqIW5uF6tc/aywzy3OXklOw=; b=ZY3Fga8hMI5J2CCMLzgSB9r/rHpASC4eBo5p9Qzp8XEp28Lj9vbtP2dB 9GaMAKRL9rrXtJXpKLSMK+RuVCBspVaRgv1md5OGTXW6Mbn562ercVlWD ieJ0nv0w6BYFuh22KV2oBt16gxKbTVjqgBVwWab7if5C2ImD5Njl1rM4i FAcuOK2gWB1ThXQPvrPQeL96JZLEW/ibwH05XtY6+sXXaknB0jcSApP0R iuQOhUVB2IX3bvPfkSQTV3UYrja0wknDZwpq3B6GKs9tgs/z6ZOuu5Zvs ps80Yaw3QX5EmCMdPX+4JA0Sk1E1vC/Iu+f6cyRHMfjJ1vQiy8GpxkvwX Q==; X-IronPort-AV: E=McAfee;i="6200,9189,10200"; a="300393161" X-IronPort-AV: E=Sophos;i="5.88,212,1635231600"; d="scan'208";a="300393161" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Dec 2021 14:24:10 -0800 X-IronPort-AV: E=Sophos;i="5.88,212,1635231600"; d="scan'208";a="519461238" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Dec 2021 14:24:10 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next 06/21] mptcp: netlink: store lsk ref in mptcp_pm_addr_entry Date: Thu, 16 Dec 2021 17:22:59 -0500 Message-Id: <20211216222314.1244708-7-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20211216222314.1244708-1-kishen.maloor@intel.com> References: <20211216222314.1244708-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 updates struct mptcp_pm_addr_entry to store a listening socket (lsk) reference, i.e. a pointer to a reference counted structure containing the lsk (struct socket *) instead of the lsk itself. Code blocks that directly operated on the lsk in struct mptcp_pm_addr_entry have been updated to work with the lsk ref instead, utilizing the new helper functions that operate on lsk refs. Signed-off-by: Kishen Maloor --- net/mptcp/pm_netlink.c | 62 ++++++++++++++++++++++++++++-------------- 1 file changed, 41 insertions(+), 21 deletions(-) diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index 0cb03d78e22b..29f6d01ace2d 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -35,7 +35,7 @@ struct mptcp_pm_addr_entry { struct mptcp_addr_info addr; u8 flags; int ifindex; - struct socket *lsk; + struct mptcp_local_lsk *lsk_ref; }; =20 struct mptcp_pm_add_entry { @@ -983,7 +983,8 @@ static int mptcp_pm_nl_append_new_local_addr(struct pm_= nl_pernet *pernet, } =20 static int mptcp_pm_nl_create_listen_socket(struct sock *sk, - struct mptcp_pm_addr_entry *entry) + struct mptcp_pm_addr_entry *entry, + struct socket **lsk) { struct sockaddr_storage addr; struct mptcp_sock *msk; @@ -992,11 +993,11 @@ static int mptcp_pm_nl_create_listen_socket(struct so= ck *sk, int err; =20 err =3D sock_create_kern(sock_net(sk), entry->addr.family, - SOCK_STREAM, IPPROTO_MPTCP, &entry->lsk); + SOCK_STREAM, IPPROTO_MPTCP, lsk); if (err) return err; =20 - msk =3D mptcp_sk(entry->lsk->sk); + msk =3D mptcp_sk((*lsk)->sk); if (!msk) { err =3D -EINVAL; goto out; @@ -1025,7 +1026,8 @@ static int mptcp_pm_nl_create_listen_socket(struct so= ck *sk, return 0; =20 out: - sock_release(entry->lsk); + sock_release(*lsk); + *lsk =3D NULL; return err; } =20 @@ -1074,7 +1076,7 @@ int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk, = struct sock_common *skc) entry->addr.port =3D 0; entry->ifindex =3D 0; entry->flags =3D 0; - entry->lsk =3D NULL; + entry->lsk_ref =3D NULL; ret =3D mptcp_pm_nl_append_new_local_addr(pernet, entry); if (ret < 0) kfree(entry); @@ -1270,6 +1272,7 @@ static int mptcp_nl_cmd_add_addr(struct sk_buff *skb,= struct genl_info *info) struct nlattr *attr =3D info->attrs[MPTCP_PM_ATTR_ADDR]; struct pm_nl_pernet *pernet =3D genl_info_pm_nl(info); struct mptcp_pm_addr_entry addr, *entry; + struct socket *lsk; int ret; =20 ret =3D mptcp_pm_parse_addr(attr, info, true, &addr); @@ -1284,18 +1287,34 @@ static int mptcp_nl_cmd_add_addr(struct sk_buff *sk= b, struct genl_info *info) =20 *entry =3D addr; if (entry->addr.port) { - ret =3D mptcp_pm_nl_create_listen_socket(skb->sk, entry); - if (ret) { - GENL_SET_ERR_MSG(info, "create listen socket error"); - kfree(entry); - return ret; + entry->lsk_ref =3D lsk_list_find(pernet, &entry->addr); + + if (!entry->lsk_ref) { + ret =3D mptcp_pm_nl_create_listen_socket(skb->sk, entry, &lsk); + + if (ret) { + GENL_SET_ERR_MSG(info, "create listen socket error"); + kfree(entry); + return ret; + } + + entry->lsk_ref =3D lsk_list_add(pernet, &entry->addr, lsk); + + if (!entry->lsk_ref) { + GENL_SET_ERR_MSG(info, "can't allocate lsk ref"); + sock_release(lsk); + kfree(entry); + return -ENOMEM; + } } } + ret =3D mptcp_pm_nl_append_new_local_addr(pernet, entry); + if (ret < 0) { GENL_SET_ERR_MSG(info, "too many addresses or duplicate one"); - if (entry->lsk) - sock_release(entry->lsk); + if (entry->lsk_ref) + lsk_list_release(pernet, entry->lsk_ref); kfree(entry); return ret; } @@ -1398,10 +1417,11 @@ static int mptcp_nl_remove_subflow_and_signal_addr(= struct net *net, } =20 /* caller must ensure the RCU grace period is already elapsed */ -static void __mptcp_pm_release_addr_entry(struct mptcp_pm_addr_entry *entr= y) +static void __mptcp_pm_release_addr_entry(struct pm_nl_pernet *pernet, + struct mptcp_pm_addr_entry *entry) { - if (entry->lsk) - sock_release(entry->lsk); + if (entry->lsk_ref) + lsk_list_release(pernet, entry->lsk_ref); kfree(entry); } =20 @@ -1483,7 +1503,7 @@ static int mptcp_nl_cmd_del_addr(struct sk_buff *skb,= struct genl_info *info) =20 mptcp_nl_remove_subflow_and_signal_addr(sock_net(skb->sk), &entry->addr); synchronize_rcu(); - __mptcp_pm_release_addr_entry(entry); + __mptcp_pm_release_addr_entry(pernet, entry); =20 return ret; } @@ -1539,7 +1559,7 @@ static void mptcp_nl_remove_addrs_list(struct net *ne= t, } =20 /* caller must ensure the RCU grace period is already elapsed */ -static void __flush_addrs(struct list_head *list) +static void __flush_addrs(struct pm_nl_pernet *pernet, struct list_head *l= ist) { while (!list_empty(list)) { struct mptcp_pm_addr_entry *cur; @@ -1547,7 +1567,7 @@ static void __flush_addrs(struct list_head *list) cur =3D list_entry(list->next, struct mptcp_pm_addr_entry, list); list_del_rcu(&cur->list); - __mptcp_pm_release_addr_entry(cur); + __mptcp_pm_release_addr_entry(pernet, cur); } } =20 @@ -1572,7 +1592,7 @@ static int mptcp_nl_cmd_flush_addrs(struct sk_buff *s= kb, struct genl_info *info) spin_unlock_bh(&pernet->lock); mptcp_nl_remove_addrs_list(sock_net(skb->sk), &free_list); synchronize_rcu(); - __flush_addrs(&free_list); + __flush_addrs(pernet, &free_list); return 0; } =20 @@ -2199,7 +2219,7 @@ static void __net_exit pm_nl_exit_net(struct list_hea= d *net_list) * other modifiers, also netns core already waited for a * RCU grace period. */ - __flush_addrs(&pernet->local_addr_list); + __flush_addrs(pernet, &pernet->local_addr_list); } } =20 --=20 2.31.1 From nobody Fri Mar 29 02:34:01 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp690216jap; Thu, 16 Dec 2021 14:24:21 -0800 (PST) X-Google-Smtp-Source: ABdhPJwqTw2YEK9nmlMfnKsZMAgpxBtRVNz+fCvCVhespSITHY5QzUrHWhZ2V8dYWqn4W/nJz8lQ X-Received: by 2002:ad4:5943:: with SMTP id eo3mr7893521qvb.124.1639693461427; Thu, 16 Dec 2021 14:24:21 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1639693461; cv=none; d=google.com; s=arc-20160816; b=crSRdAnEjIv3BQ1gXBPml9vGjwLx9pMkcjsbzDbbZJvf172FnQ6jgHTWy5+yauNgeX ktS2qG9VrAk8uLuNJ3LD56OBSoFWRD2MGZv9La+mxCQU9r52uItHV69T4HZxLI8H6taW S+UDc23PUXvtXx6bM8YhMDItPCC8fjVWZKdJY9+oGeVhfUxKpcxQscUaDEytBpWAuPXk j31hGyTORNApQefJlM3J2efSfN3cQy+jhHIAZbJEThSARN/yFBjjMok066ls1NA/55n7 bUiF2HzO3oliE/KZHPjeEE+FfN7wAifNKVzYmL2V7KKxJ3DW8FjWmjZrlIlL5Md1NiBB R5SQ== 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=CIp3IQkzZnmTHoUvFX0KKhJP6QZPalZY8rLdpFcvbc4=; b=nzApMhThuTjdBBymAW0RogGZfpZrMQVfrL++72v2iL89h0kpFX/LfA3J+Oqjhnl7x8 7wxRBgahhU6Tb1vwXgEFxMhB1tlbUIku67/2G1wox1Y+gLgbrMDZgbogd+34PHkKiYPg 1OeBTX4is9nEzjX66H6EHIe1pvfwMR4ULy7vR+qCvy0iBEFsrbdm7dfAJkyKAf+cxOvr aSi3ejpjcxG1ABJAdBwd6+TfQ5SpSgizLHVaJpCr/YXDuk1KrILyndzAk2C/9EhJPJTK u6FPho7ymDizQOs0ar/Uk3evGeWi7m+s5sT9kbmSIPTOsl13Z7SZ7KrHA5c366Z5L5wo IETg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=Win4jj5m; spf=pass (google.com: domain of mptcp+bounces-2800-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-2800-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. [147.75.197.195]) by mx.google.com with ESMTPS id w4si2835342qkb.529.2021.12.16.14.24.21 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 16 Dec 2021 14:24:21 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2800-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) client-ip=147.75.197.195; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=Win4jj5m; spf=pass (google.com: domain of mptcp+bounces-2800-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-2800-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 1C3631C0D42 for ; Thu, 16 Dec 2021 22:24:21 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 5BA052CB5; Thu, 16 Dec 2021 22:24:17 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) (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 DC2AC2CBF for ; Thu, 16 Dec 2021 22:24:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1639693456; x=1671229456; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=G096dBDKezzmhXrBs+6LJLlyoiZne8ro/k4R5bPmM88=; b=Win4jj5mRCRZg1WfdbPcet1dykDpjEAqHwTIiz+mhdlngwBqvL2PtLMO +fjt/G7GLxD6ktLUjDjtaULdDi+EIE2fDhQmx+aTKvzKtUmPNQshv5qF7 CoHD8h21T8VJU0sRzij05xXVGrmwDhLtr51As5aiDy79faBwkCt00f3TT lEZ1Fb4i4Z7VBay+nPjf3e5hihQtx915i+imZyw/qDbhhWZMxrJggYCnN irdDC0QkpmmutuWZifU/2Vhgr597wYY4ZUWfFwN4OmNi1Iy2cRTDnmVwF wJW+66xqdAy/GsFoMwrgK7c3ECxTTwaRx4eJ/SNbKvBITe9cnk6Rmpbpm A==; X-IronPort-AV: E=McAfee;i="6200,9189,10200"; a="300393162" X-IronPort-AV: E=Sophos;i="5.88,212,1635231600"; d="scan'208";a="300393162" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Dec 2021 14:24:10 -0800 X-IronPort-AV: E=Sophos;i="5.88,212,1635231600"; d="scan'208";a="519461243" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Dec 2021 14:24:10 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next 07/21] mptcp: netlink: process IPv6 addrs in creating listening sockets Date: Thu, 16 Dec 2021 17:23:00 -0500 Message-Id: <20211216222314.1244708-8-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20211216222314.1244708-1-kishen.maloor@intel.com> References: <20211216222314.1244708-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 updates mptcp_pm_nl_create_listen_socket() to create listening sockets bound to IPv6 addresses (where IPv6 is supported). Signed-off-by: Kishen Maloor --- net/mptcp/pm_netlink.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index 29f6d01ace2d..7adc8c73ec48 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -986,6 +986,7 @@ static int mptcp_pm_nl_create_listen_socket(struct sock= *sk, struct mptcp_pm_addr_entry *entry, struct socket **lsk) { + int addrlen =3D sizeof(struct sockaddr_in); struct sockaddr_storage addr; struct mptcp_sock *msk; struct socket *ssock; @@ -1010,8 +1011,11 @@ static int mptcp_pm_nl_create_listen_socket(struct s= ock *sk, } =20 mptcp_info2sockaddr(&entry->addr, &addr, entry->addr.family); - err =3D kernel_bind(ssock, (struct sockaddr *)&addr, - sizeof(struct sockaddr_in)); +#if IS_ENABLED(CONFIG_MPTCP_IPV6) + if (entry->addr.family =3D=3D AF_INET6) + addrlen =3D sizeof(struct sockaddr_in6); +#endif + err =3D kernel_bind(ssock, (struct sockaddr *)&addr, addrlen); if (err) { pr_warn("kernel_bind error, err=3D%d", err); goto out; --=20 2.31.1 From nobody Fri Mar 29 02:34:01 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp690259jap; Thu, 16 Dec 2021 14:24:25 -0800 (PST) X-Google-Smtp-Source: ABdhPJzdt0gLAacZYu1zZ2bJtorE/4y77X/9pVY10PKkAJZ1xmExGYAiZX7yNs6TG2oeI3DYW3P3 X-Received: by 2002:a37:a693:: with SMTP id p141mr114329qke.269.1639693464919; Thu, 16 Dec 2021 14:24:24 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1639693464; cv=none; d=google.com; s=arc-20160816; b=eIOSPKpRd/koUlBW759vl0aZ/MrnnhIeiurUQyHQMNe7UjvgvzE5iIWBIRNAfBJdtH jcczfthpDSDxzd2sb0o2X7UYkktB7dCTjN8cJtTNkwQeOWq7WcbzFPKU9zRPR7lkMaND caLa4nexLhPHURvn8hpIlDi3ELwuaQJGjUhZL2dJQ41QUgjWI4N5gWDI19N9T4ziq9y/ 41EgkmJ9De9C3jNZvddYVni2N3A/aOLx2aEWDGOOZIB9fm3MtpvtdQ9ucaQzCsiQmHV6 HFFrPJsNvhPuP/63fcG/oUV7ObuEMAIMjqImXY9fclqfduKXC1gjZpnS5mNKfo7Pwb0/ dOtA== 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=ED2yz42WY4DX65BgFatfrNuMRiJw5r9vc0aFlu8qyqc=; b=Vibq5mqheWeBuoKaMuYWsflLTuK0dm0C0f2iRrAtWp3arLGsZMv+XoCMR2DD6kQ4QC 3H1yAkunYhY/68VYNR8f80FOsX1DB8SgmJdSacFAveoatbvHLvDdxk1sdBWeshWPDVNl nhBGtCE7SilCpomrOs6CZweK7EVmWkxy8UReNfFLqcri9uJW2xQV2n0oVD1vckyajOxk qJabb/8+q1qzkcHwDxT2WWMrNAbskcbNHEp7fq8hOH8jPw1q6RWYEfXAyLAuMaay7ABQ HWDK03zfltVJwt7X1G56qpc+flkf8neIcZpZaceu8JqLucU/yM0sfpWeUpP19hgaA6Mw eQgA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=TN140EGE; spf=pass (google.com: domain of mptcp+bounces-2803-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2803-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 t6si3609675qkp.429.2021.12.16.14.24.24 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 16 Dec 2021 14:24:24 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2803-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=TN140EGE; spf=pass (google.com: domain of mptcp+bounces-2803-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2803-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 96B141C0D95 for ; Thu, 16 Dec 2021 22:24:24 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 751933FF1; Thu, 16 Dec 2021 22:24:19 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) (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 CE2262CBE for ; Thu, 16 Dec 2021 22:24:16 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1639693456; x=1671229456; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=zmxeKbyc+XekvfKnvnfIwEzyQNmbKeVDRHRjaBRUvf0=; b=TN140EGEzETBbuiUglKs39UKWgTGu7fUBSUixDlrG3HBOvaoLF4wTZmj xlDUrIgUH+ABNU0oaeptefmLh6AIiDEdqAIEmJtmri22J5YRJdlATkqZj 2g9bZl0Y1lanEHN52DG4haykJTqYJGIrHBhTGSEMRKL0lNuIgbMYUvCHH LIazIfO1xOOk6/lpp3TNGacyxmLSmchmKg+pt+E3HnLwwyGqO5x4tkPzN EpqVnRW9/1c/Nmu9r86Djd5scIvBgTGtO8N6tXkA9KNTn1SU22tnb80cy bo2/QSvKAUNOXZoDuY6Dp1pPZ1VT+94qNJji6xGi67/4n5+grJQoJEw3J A==; X-IronPort-AV: E=McAfee;i="6200,9189,10200"; a="300393164" X-IronPort-AV: E=Sophos;i="5.88,212,1635231600"; d="scan'208";a="300393164" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Dec 2021 14:24:10 -0800 X-IronPort-AV: E=Sophos;i="5.88,212,1635231600"; d="scan'208";a="519461247" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Dec 2021 14:24:10 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next 08/21] mptcp: attempt to add listening sockets for announced addrs Date: Thu, 16 Dec 2021 17:23:01 -0500 Message-Id: <20211216222314.1244708-9-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20211216222314.1244708-1-kishen.maloor@intel.com> References: <20211216222314.1244708-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" When ADD_ADDR announcements use the port associated with an active subflow, this change ensures that a listening socket is bound to the announced address and port for subsequently receiving MP_JOINs from the remote end. In case there's a recorded lsk bound to that address+port, it is reused. But if a listening socket for this address is already held by the application then no further action is taken. When a listening socket is created, it is stored in struct mptcp_pm_add_entry and released accordingly. Signed-off-by: Kishen Maloor --- net/mptcp/pm_netlink.c | 56 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 54 insertions(+), 2 deletions(-) diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index 7adc8c73ec48..d57e2f825728 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -43,6 +43,7 @@ struct mptcp_pm_add_entry { struct mptcp_addr_info addr; struct timer_list add_timer; struct mptcp_sock *sock; + struct mptcp_local_lsk *lsk_ref; u8 retrans_times; }; =20 @@ -66,6 +67,10 @@ struct pm_nl_pernet { #define MPTCP_PM_ADDR_MAX 8 #define ADD_ADDR_RETRANS_MAX 3 =20 +static int mptcp_pm_nl_create_listen_socket(struct sock *sk, + struct mptcp_pm_addr_entry *entry, + struct socket **lsk); + static bool addresses_equal(const struct mptcp_addr_info *a, const struct mptcp_addr_info *b, bool use_port) { @@ -438,7 +443,8 @@ mptcp_pm_del_add_timer(struct mptcp_sock *msk, } =20 static bool mptcp_pm_alloc_anno_list(struct mptcp_sock *msk, - struct mptcp_pm_addr_entry *entry) + struct mptcp_pm_addr_entry *entry, + struct mptcp_local_lsk *lsk_ref) { struct mptcp_pm_add_entry *add_entry =3D NULL; struct sock *sk =3D (struct sock *)msk; @@ -458,6 +464,10 @@ static bool mptcp_pm_alloc_anno_list(struct mptcp_sock= *msk, add_entry->addr =3D entry->addr; add_entry->sock =3D msk; add_entry->retrans_times =3D 0; + add_entry->lsk_ref =3D lsk_ref; + + if (lsk_ref) + lsk_list_add_ref(lsk_ref); =20 timer_setup(&add_entry->add_timer, mptcp_pm_add_timer, 0); sk_reset_timer(sk, &add_entry->add_timer, @@ -470,8 +480,11 @@ void mptcp_pm_free_anno_list(struct mptcp_sock *msk) { struct mptcp_pm_add_entry *entry, *tmp; struct sock *sk =3D (struct sock *)msk; + struct pm_nl_pernet *pernet; LIST_HEAD(free_list); =20 + pernet =3D net_generic(sock_net(sk), pm_nl_pernet_id); + pr_debug("msk=3D%p", msk); =20 spin_lock_bh(&msk->pm.lock); @@ -480,6 +493,8 @@ void mptcp_pm_free_anno_list(struct mptcp_sock *msk) =20 list_for_each_entry_safe(entry, tmp, &free_list, list) { sk_stop_timer_sync(sk, &entry->add_timer); + if (entry->lsk_ref) + lsk_list_release(pernet, entry->lsk_ref); kfree(entry); } } @@ -570,13 +585,16 @@ lookup_id_by_addr(struct pm_nl_pernet *pernet, const = struct mptcp_addr_info *add } =20 static void mptcp_pm_create_subflow_or_signal_addr(struct mptcp_sock *msk) + __must_hold(&msk->pm.lock) { + struct mptcp_local_lsk *lsk_ref =3D NULL; struct sock *sk =3D (struct sock *)msk; struct mptcp_pm_addr_entry *local; unsigned int add_addr_signal_max; unsigned int local_addr_max; struct pm_nl_pernet *pernet; unsigned int subflows_max; + struct socket *lsk; =20 pernet =3D net_generic(sock_net(sk), pm_nl_pernet_id); =20 @@ -607,12 +625,39 @@ static void mptcp_pm_create_subflow_or_signal_addr(st= ruct mptcp_sock *msk) local =3D select_signal_address(pernet, msk); =20 if (local) { - if (mptcp_pm_alloc_anno_list(msk, local)) { + if (!local->addr.port) { + local->addr.port =3D + ((struct inet_sock *)inet_sk + ((struct sock *)msk))->inet_sport; + + lsk_ref =3D lsk_list_find(pernet, &local->addr); + + if (!lsk_ref) { + spin_unlock_bh(&msk->pm.lock); + + mptcp_pm_nl_create_listen_socket(sk, local, &lsk); + + spin_lock_bh(&msk->pm.lock); + + if (lsk) + lsk_ref =3D lsk_list_add(pernet, &local->addr, lsk); + + if (lsk && !lsk_ref) + sock_release(lsk); + } + + local->addr.port =3D 0; + } + + if (mptcp_pm_alloc_anno_list(msk, local, lsk_ref)) { __clear_bit(local->addr.id, msk->pm.id_avail_bitmap); msk->pm.add_addr_signaled++; mptcp_pm_announce_addr(msk, &local->addr, false); mptcp_pm_nl_addr_send_ack(msk); } + + if (lsk_ref) + lsk_list_release(pernet, lsk_ref); } } =20 @@ -704,6 +749,7 @@ static unsigned int fill_local_addresses_vec(struct mpt= cp_sock *msk, } =20 static void mptcp_pm_nl_add_addr_received(struct mptcp_sock *msk) + __must_hold(&msk->pm.lock) { struct mptcp_addr_info addrs[MPTCP_PM_ADDR_MAX]; struct sock *sk =3D (struct sock *)msk; @@ -1352,11 +1398,17 @@ int mptcp_pm_get_flags_and_ifindex_by_id(struct net= *net, unsigned int id, static bool remove_anno_list_by_saddr(struct mptcp_sock *msk, struct mptcp_addr_info *addr) { + struct sock *sk =3D (struct sock *)msk; struct mptcp_pm_add_entry *entry; + struct pm_nl_pernet *pernet; + + pernet =3D net_generic(sock_net(sk), pm_nl_pernet_id); =20 entry =3D mptcp_pm_del_add_timer(msk, addr, false); if (entry) { list_del(&entry->list); + if (entry->lsk_ref) + lsk_list_release(pernet, entry->lsk_ref); kfree(entry); return true; } --=20 2.31.1 From nobody Fri Mar 29 02:34:01 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp690273jap; Thu, 16 Dec 2021 14:24:26 -0800 (PST) X-Google-Smtp-Source: ABdhPJz2A10+pxGAcY/CeIJEwcoTAQOwp32v37obU0syEnOBcDfonz14Deh87xr6NYFIOjdQ8w71 X-Received: by 2002:a05:622a:44a:: with SMTP id o10mr114198qtx.212.1639693463779; Thu, 16 Dec 2021 14:24:23 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1639693463; cv=none; d=google.com; s=arc-20160816; b=xACPqh5KXcIh4586M9o23schX4hfOav6LE83einOu2l2FVFgn25et4dB1ATMYxYdkR 8jIGs2QdOo81Z5KEib8ft/ct75SuwFMH5xmhRywl1RHGCrviwJs40h5oI7qr/msJ42Nx seShKEdqmeSw5Ssg1dtA4G+u9FEVaR834C73T7zOUcZlAHZAAXU4il4+LZlgdPmQY81b OjSOeAW9fruW23JhaxTWQRtnL3H/dqMgpXB1u5O7HayXLnZW4YVzXxDraBiCWNXWAd2d zsmtzu3S1Ht5x8Dy4ZfVWo8v9fpbHly+33FexdVKitGQTpEVH7VYrqqCIkOea+x1YeuX UdUg== 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=5Pilr6pAU5iI/kE+cwqcW+vTLbQMvjrZFMJbg2OMRyk=; b=Sn1H6uoZsKgXEmzy/x8M+dsvR1esO5sGdTG8UegL7xd7tErZc1J17B5gHPYLXhKgtC Ys2Xx2wK629N2zP0LbBYa8o+M1hpN/qg2W6DQWwJW9cLeVe0PWd/rD6QFZfC+Oex5WAr 3QmRTrK3DG5ayqri/9zsrpW5MF8Wmcd0VTMEgdSM1DRzuUmcHjL6Poy5iHhyN8z/eJy4 Jf9RreB+Q4OANgzKMAmHqOjKZGEbuSyuVpm6TaEgWfzzfNEWp5ZAXlFk/pnCYGG8yiMc Y4wgnY70438RuAjR1jdOlqAG9F1zDnbqPzQnW2COSP0u8ZIKNPtbny7xYVO0Qor5Ep0L fo2w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=eOZW+kOb; spf=pass (google.com: domain of mptcp+bounces-2802-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2802-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 k11si27408qvc.334.2021.12.16.14.24.23 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 16 Dec 2021 14:24:23 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2802-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=eOZW+kOb; spf=pass (google.com: domain of mptcp+bounces-2802-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2802-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 7A4621C0A8E for ; Thu, 16 Dec 2021 22:24:23 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id A76743FED; Thu, 16 Dec 2021 22:24:18 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) (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 9059A2CBF for ; Thu, 16 Dec 2021 22:24:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1639693457; x=1671229457; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=U42LR8NHdNAF6mxUIwJ8FQ3rN7WLYItwAMPPCPoAaGg=; b=eOZW+kObMnCOLTnCOaRRYkadwIvunujnshYzQepVRU/FaaMteKzUrDrN y2h2636xpq6d2KfPLSWcAlsljsczsgNNC/Oz09PqUCxsQRYWLRfn8YIIQ YsgtXvqE/KyBn/aEf87tbkEMF2y6C5+58vWwMOrjRRKdP4HyWhDjiB6Jl 3SykdKKP1eqsqz2VA5IdE+x8JKeHtCwLmC7qPoIf++aER4nGN80q/BCFz e5AS8ij1TtlIlbo18hH9KmizBB5XupU4EUXocH8Te/vSrI0LYdlhcSrye 6rae+tAmzti5C+hT7Z4lhgducEpudV7Ctez/UwTeIt+wIFb53OCdB8/2t Q==; X-IronPort-AV: E=McAfee;i="6200,9189,10200"; a="300393165" X-IronPort-AV: E=Sophos;i="5.88,212,1635231600"; d="scan'208";a="300393165" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Dec 2021 14:24:10 -0800 X-IronPort-AV: E=Sophos;i="5.88,212,1635231600"; d="scan'208";a="519461250" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Dec 2021 14:24:10 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next 09/21] mptcp: allow ADD_ADDR reissuance by userspace PMs Date: Thu, 16 Dec 2021 17:23:02 -0500 Message-Id: <20211216222314.1244708-10-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20211216222314.1244708-1-kishen.maloor@intel.com> References: <20211216222314.1244708-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 allows userspace PM implementations to reissue ADD_ADDR announcements (if necessary) based on their chosen policy. Signed-off-by: Kishen Maloor --- net/mptcp/pm_netlink.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index d57e2f825728..1adaf5d14f87 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -452,8 +452,16 @@ static bool mptcp_pm_alloc_anno_list(struct mptcp_sock= *msk, =20 lockdep_assert_held(&msk->pm.lock); =20 - if (mptcp_lookup_anno_list_by_saddr(msk, &entry->addr)) - return false; + add_entry =3D mptcp_lookup_anno_list_by_saddr(msk, &entry->addr); + + if (add_entry) { + if (READ_ONCE(msk->pm.pm_type) =3D=3D MPTCP_PM_TYPE_KERNEL) + return false; + + sk_reset_timer(sk, &add_entry->add_timer, + jiffies + mptcp_get_add_addr_timeout(net)); + return true; + } =20 add_entry =3D kmalloc(sizeof(*add_entry), GFP_ATOMIC); if (!add_entry) --=20 2.31.1 From nobody Fri Mar 29 02:34:01 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp690270jap; Thu, 16 Dec 2021 14:24:26 -0800 (PST) X-Google-Smtp-Source: ABdhPJzt4UfLuONFfMHwWde6yeuMAhU/H7c/YiO/0le7U75RR0GZmhkv3UXvr/p8ittrRsnsg3il X-Received: by 2002:a17:90b:4f83:: with SMTP id qe3mr8540062pjb.56.1639693465764; Thu, 16 Dec 2021 14:24:25 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1639693465; cv=none; d=google.com; s=arc-20160816; b=ih20JT+j6qUihvRosu5TkHxWTfu5r3ZtEn5HJ5CAlmfmpMgD/nJW1LB0wfMIdD9yE5 wGZ7y7aqM+Z3Nn1JKOu/FwxnMxIDvKMlbhsZzEVRW813rP0eAqENT4XkLhe8tGKIgXR4 DwAIb2K1fndsRaS6ZurbPWRWKmwt03ck2OT787CW+apJt2SCWwFQyD5wiSplDBZeRj5d A9/w7eXqbEHLDsleYvWTO2EAWVfkzeNC1/0/kQOPhMEm3+0a6mygYODxxTZjT6F3rsSC sGgPW121bC3/4hWJfkWZoEaTEoPs8CZxhUIf1XtwTcojLKHAPWZE1B5BPLP7VJys+lLB qWIQ== 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=Zp5gMHhFBWQ0CFbuyWPVPQJyoF+aZaup3q/jZtAwv5g=; b=JcBgNWwzQ5YAQgxnwBOLxQjpifjprLBzdbuMMXUxUgt6aW4Fvl8zy8ZRMTSkFqUTjO MEWAdN3orSR12pHg3fwlQ9WxTp0P9v5MxUFFdDKH0JM39W2RKiutV4Uey2kcm81z/vjG ix0Uf1RPhfj1e32aVZ9mbGEu4K/2gi9Eeo4AlPuQB4zOOjsTs/61tHLYnYXUMs6YcpWH qLGnRdV9iqjGVRJJpHnFAFRCvGlVLNTSkiHJLXGkonOrpDKe+OHlpk+qjumdrakDQc/Y 2aVx7FCmjtJS03uAeeWzXNfeQql3MkCKZU2j8V/6lwimuezBfQQBcmzDlXv8GW4PyOZR zfoQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=RH8VDXsr; spf=pass (google.com: domain of mptcp+bounces-2804-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2804-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 h13si2232719pjt.6.2021.12.16.14.24.25 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 16 Dec 2021 14:24:25 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2804-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=RH8VDXsr; spf=pass (google.com: domain of mptcp+bounces-2804-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2804-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 5BD6C3E0FAE for ; Thu, 16 Dec 2021 22:24:25 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id DC2013FF4; Thu, 16 Dec 2021 22:24:19 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) (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 6A27E3FEC for ; Thu, 16 Dec 2021 22:24: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=1639693458; x=1671229458; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=VAYdDhDZo93XddCeoPWvwaJxysO/Jsh/kbPziYNmZek=; b=RH8VDXsr5nATw+dcynfUUOyPc6mjn4XKtynmu8mHl1ZjTatRGIDbkPq7 3k1Tx87RMwAy8Kg2irCehcZD1+7wQJZnJluBT/IzDYli+Ryo1LFgD8seU neCA+u5dnBmgkQmQnmDqOZVw9W9sK1HnBaNBDd1xzLomqGVsRp3kKDI5I 8M3icmLzB3trnN5i3i9CsTl4dQM1Xxrp+PufSW4qXtBgD128PPioUOV29 btx67iG9pV9UlvZm2Yv3qneFglLSlyTBwfrhRP7wpOa+oeI1ZdbTsbX9R H8Uf6yKRWD1jI4j7z0XmlQklL71aHGzPtrKjKRMvZQYGCctvGyXe/JiuC Q==; X-IronPort-AV: E=McAfee;i="6200,9189,10200"; a="300393167" X-IronPort-AV: E=Sophos;i="5.88,212,1635231600"; d="scan'208";a="300393167" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Dec 2021 14:24:10 -0800 X-IronPort-AV: E=Sophos;i="5.88,212,1635231600"; d="scan'208";a="519461253" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Dec 2021 14:24:10 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next 10/21] mptcp: handle local addrs announced by userspace PMs Date: Thu, 16 Dec 2021 17:23:03 -0500 Message-Id: <20211216222314.1244708-11-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20211216222314.1244708-1-kishen.maloor@intel.com> References: <20211216222314.1244708-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 adds a new internal function to store/retrieve local addrs announced by userspace PM implementations from the kernel context. The function does not stipulate any limitation on the # of addrs, and handles the requirements of three scenarios: 1) ADD_ADDR announcements (which require that a local id be provided), 2) retrieving the local id associated with an address, also where one may need to be assigned, and 3) reissuance of ADD_ADDRs when there's a successful match of addr/id. The list of all stored local addr entries is held under the MPTCP sock structure. This list, if not released by the REMOVE_ADDR flow is freed while the sock is destructed. Signed-off-by: Kishen Maloor --- net/mptcp/pm_netlink.c | 79 ++++++++++++++++++++++++++++++++++++++++++ net/mptcp/protocol.c | 2 ++ net/mptcp/protocol.h | 2 ++ 3 files changed, 83 insertions(+) diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index 1adaf5d14f87..d65633f4d954 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -484,6 +484,31 @@ static bool mptcp_pm_alloc_anno_list(struct mptcp_sock= *msk, return true; } =20 +void mptcp_free_local_addr_list(struct mptcp_sock *msk) +{ + struct mptcp_pm_addr_entry *entry, *tmp; + struct sock *sk =3D (struct sock *)msk; + struct pm_nl_pernet *pernet; + LIST_HEAD(free_list); + + if (READ_ONCE(msk->pm.pm_type) =3D=3D MPTCP_PM_TYPE_KERNEL) + return; + + pernet =3D net_generic(sock_net(sk), pm_nl_pernet_id); + + pr_debug("msk=3D%p", msk); + + mptcp_data_lock(sk); + list_splice_init(&msk->local_addr_list, &free_list); + mptcp_data_unlock(sk); + + list_for_each_entry_safe(entry, tmp, &free_list, list) { + if (entry->lsk_ref) + lsk_list_release(pernet, entry->lsk_ref); + kfree(entry); + } +} + void mptcp_pm_free_anno_list(struct mptcp_sock *msk) { struct mptcp_pm_add_entry *entry, *tmp; @@ -972,6 +997,60 @@ static bool address_use_port(struct mptcp_pm_addr_entr= y *entry) MPTCP_PM_ADDR_FLAG_SIGNAL; } =20 +static int mptcp_userspace_pm_append_new_local_addr(struct mptcp_sock *msk, + struct mptcp_pm_addr_entry *entry) +{ + DECLARE_BITMAP(id_bitmap, MPTCP_PM_MAX_ADDR_ID + 1); + struct mptcp_pm_addr_entry *match =3D NULL; + struct sock *sk =3D (struct sock *)msk; + struct mptcp_pm_addr_entry *e; + bool addr_match =3D false; + bool id_match =3D false; + int ret =3D -EINVAL; + + bitmap_zero(id_bitmap, MPTCP_PM_MAX_ADDR_ID + 1); + + mptcp_data_lock(sk); + list_for_each_entry(e, &msk->local_addr_list, list) { + addr_match =3D addresses_equal(&e->addr, &entry->addr, true); + if (addr_match && entry->addr.id =3D=3D 0) + entry->addr.id =3D e->addr.id; + id_match =3D (e->addr.id =3D=3D entry->addr.id); + if (addr_match && id_match) { + match =3D e; + break; + } else if (addr_match || id_match) { + break; + } + __set_bit(e->addr.id, id_bitmap); + } + + if (!match && !addr_match && !id_match) { + e =3D kmalloc(sizeof(*e), GFP_ATOMIC); + if (!e) { + mptcp_data_unlock(sk); + return -ENOMEM; + } + + *e =3D *entry; + if (!e->addr.id) + e->addr.id =3D find_next_zero_bit(id_bitmap, + MPTCP_PM_MAX_ADDR_ID + 1, + 1); + list_add_tail_rcu(&e->list, &msk->local_addr_list); + ret =3D e->addr.id; + + if (e->lsk_ref && e->addr.port) + lsk_list_add_ref(e->lsk_ref); + } else if (match) { + ret =3D entry->addr.id; + } + + mptcp_data_unlock(sk); + + return ret; +} + static int mptcp_pm_nl_append_new_local_addr(struct pm_nl_pernet *pernet, struct mptcp_pm_addr_entry *entry) { diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 408a05bff633..331c1080396d 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -2531,6 +2531,7 @@ static int __mptcp_init_sock(struct sock *sk) INIT_LIST_HEAD(&msk->conn_list); INIT_LIST_HEAD(&msk->join_list); INIT_LIST_HEAD(&msk->rtx_queue); + INIT_LIST_HEAD(&msk->local_addr_list); INIT_WORK(&msk->work, mptcp_worker); __skb_queue_head_init(&msk->receive_queue); msk->out_of_order_queue =3D RB_ROOT; @@ -3027,6 +3028,7 @@ void mptcp_destroy_common(struct mptcp_sock *msk) msk->rmem_fwd_alloc =3D 0; mptcp_token_destroy(msk); mptcp_pm_free_anno_list(msk); + mptcp_free_local_addr_list(msk); } =20 static void mptcp_destroy(struct sock *sk) diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index c50247673c7e..63b4ea850d07 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -281,6 +281,7 @@ struct mptcp_sock { struct sk_buff_head receive_queue; struct list_head conn_list; struct list_head rtx_queue; + struct list_head local_addr_list; struct mptcp_data_frag *first_pending; struct list_head join_list; struct socket *subflow; /* outgoing connect/listener/!mp_capable */ @@ -733,6 +734,7 @@ struct mptcp_sock *mptcp_token_get_sock(struct net *net= , u32 token); struct mptcp_sock *mptcp_token_iter_next(const struct net *net, long *s_sl= ot, long *s_num); void mptcp_token_destroy(struct mptcp_sock *msk); +void mptcp_free_local_addr_list(struct mptcp_sock *msk); =20 void mptcp_crypto_key_sha(u64 key, u32 *token, u64 *idsn); =20 --=20 2.31.1 From nobody Fri Mar 29 02:34:01 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp690297jap; Thu, 16 Dec 2021 14:24:27 -0800 (PST) X-Google-Smtp-Source: ABdhPJzVwWiGnAvIVf35uHHiTOlDSZ/6eAhtWyJ9YlAZYow5TO6vDK9Qvl7C/NqmhpVdrFLWzW3Y X-Received: by 2002:a17:902:9896:b0:148:add6:520f with SMTP id s22-20020a170902989600b00148add6520fmr279606plp.90.1639693467183; Thu, 16 Dec 2021 14:24:27 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1639693467; cv=none; d=google.com; s=arc-20160816; b=ffYojdff04ijrCsm+om/nEQcTTDvwL2I4WNhop6mJKxCAiZ2U5bt8M5Mf28DTxjfTG 19wIMl4EyKEPXkEEVwjNY407e+dwIyV7iX0xEiF+w03O4pJis71GkXGpEfYE0AoIpy5K bu3uG30N9SKtSwUiDHvfirI2V7n5vb7jYRQou7fL5jrOm+p+GERSdL0RxUMBNn8ivpdy ZTmpWyEXWWkEz8oJQJvoqkX4ff7tL31r5oivYQcuDMqv8vHcyzsMrt765UzlZZVI/3Ha pEIvCFDFCiAwZ4ZvDqx1d3W+Kaew4q1Y99PUFIiUTTM0+3rNnu9Vys7uxpa1djQbLZJU n+2A== 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=y2w+9CY9SslyHo9pAe7NbQVvRnJyjBNCIACjJnr5Oaw=; b=bpk4DzvJNE8m1+wEmg+Kq5HTJzKC88Sg14218fbWyS4m37Y1b+3ysvNlQOVNqRLZhr 7UCzXrtPhYAF1LSOtkH/2dQ7OO7O+bK/KVNVHqts/bY+tswPmWlSEIuYIwKKB6AA1wrF MYTjwEhy0aG0l8LT9V/6g8J30yxTxHv5Vg5SldTpSia6+wNRKvYEhBAHyuUriJpWa4/e WUCXNueE5QJUMiwpWeoxQFMXVg5mhtFT26Xox0s1bYRYkg1DMMfkOJzfa2awAHn5uTLw CUuFjuZQvDSgZ7UQ+h07BEw2hjgjRn5fJgpj1rDiU3c66xJv61TkV90uRDtP+IPWCA+a C+Xw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=EgNUcKlF; spf=pass (google.com: domain of mptcp+bounces-2805-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-2805-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. [147.75.69.165]) by mx.google.com with ESMTPS id i6si6617120pfd.31.2021.12.16.14.24.26 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 16 Dec 2021 14:24:27 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2805-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) client-ip=147.75.69.165; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=EgNUcKlF; spf=pass (google.com: domain of mptcp+bounces-2805-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-2805-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 6F1A53E0F69 for ; Thu, 16 Dec 2021 22:24:26 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id DA5F03FF9; Thu, 16 Dec 2021 22:24:20 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) (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 DFAE53FEF for ; Thu, 16 Dec 2021 22:24: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=1639693459; x=1671229459; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=vgoGmDiXCI5NUsdQ+z+uTewbSJxtNYyqrHtqHDtSwnk=; b=EgNUcKlFDXeqgfNybrHrPnLiDX3UQACca1XpuXiFrUuLg/ksuIOiCc1c 2S+etGnMegg/GK8NvIdANbjk6RbFEH8AIe0NHwEEir5alO1aqbMpi/0VK m9h6L73ixChnCckqBqOYT7u7gukRVNlH3e2utd9XJbEktOw/PPwKiOgLD XzIlIGbaoEKqnX9b0ZiQFWLoEfywqR/cRNRNYYPBIThx8Cl0Nppvd7Tuy vPFI71Fl+2HwZ5f146/ufII9T+qCDqacM7JGEDzhFG1McDXK/yeaoQtS7 kvsZuozp8p5K8GsfRq/1u9pl9bO0KLLvEscDu47ScPYXqXbPSDJ6DVWM/ w==; X-IronPort-AV: E=McAfee;i="6200,9189,10200"; a="300393168" X-IronPort-AV: E=Sophos;i="5.88,212,1635231600"; d="scan'208";a="300393168" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Dec 2021 14:24:10 -0800 X-IronPort-AV: E=Sophos;i="5.88,212,1635231600"; d="scan'208";a="519461257" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Dec 2021 14:24:10 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next 11/21] mptcp: read attributes of addr entries managed by userspace PMs Date: Thu, 16 Dec 2021 17:23:04 -0500 Message-Id: <20211216222314.1244708-12-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20211216222314.1244708-1-kishen.maloor@intel.com> References: <20211216222314.1244708-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 d65633f4d954..a70458317b2c 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -1175,6 +1175,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; @@ -1192,31 +1193,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; } @@ -1461,22 +1481,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 63b4ea850d07..c6f7c22d0e11 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -772,7 +772,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 b75b7b186d34..29e51986c985 100644 --- a/net/mptcp/subflow.c +++ b/net/mptcp/subflow.c @@ -1419,7 +1419,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 From nobody Fri Mar 29 02:34:01 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp690354jap; Thu, 16 Dec 2021 14:24:32 -0800 (PST) X-Google-Smtp-Source: ABdhPJxswwnDqdz9qpihJPXbRNxOAGeJwZSf/BhoqxSjydxYwVI9mH+PsvIx5VmQU9RgDLzoO+0r X-Received: by 2002:a17:902:b08f:b0:148:b5d3:96d9 with SMTP id p15-20020a170902b08f00b00148b5d396d9mr274329plr.66.1639693471859; Thu, 16 Dec 2021 14:24:31 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1639693471; cv=none; d=google.com; s=arc-20160816; b=UtjQc9EHvZYQzs9tX77bb/1IuvoFfAF+5t0EQKKm7/HShByRDI0VKs+jCr8wR5/rvM uIydl8v8x8oETetDvYAtEpjmMhDYenkz3eRjlZCkaB+guu3bjoui91zG9flkHDhX1gaR Quoj/l10RPjxsRefylVkHxvt/VcMSnet9qoY2jVQ4/hfx+k9g0PCiTcf3kuBIdjAHdiL hxeA4NIoiV8F4qWwHnjc2wiEqmGw1IcWp5ahiL8fYIktSMq28hKrKceO9IsTO6dtb6ar cUdHPvNDRgmUK88ZRY9SndMGnbXEVccd493KWNrInSPTrKAJ0ZkQDssenB6HMvArhbGy /nLQ== 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:cc:to:from:dkim-signature; bh=KsMPCWWYP3+929Ppge2nLT/3gkp3dyfA2yAIFInm5i8=; b=y1A8nFmLZYeujyJbQB5MBWo7iVMx5qrH8VS2DfjJw+nH6VUgG3F/1o40HM4iKDLU3j owe/0lcVBhwCGl9moK5ax1DPJwi2NdHT3IQSdNfzX+LxlMBF6zwaY13Eek2r9nr53oip tpAOM88RZhzB5XoKWvl0u3bt1vSBe7SRyCrahf6ddmYizGGn3U4bZmsmtlju0pvzdDId BQrgxBvBjhu0mx5bvhaaXGpwl79frLG/eJFdc/SLqSWia/J7yp8bolTbmGNI0ytiojB9 unuK7TLZlNfJUx6XkuVVaUcEA4Vbcgr2YQL50Ff3C2IPmojnJ2PaEf08kO3SHO8TiYKO 1vRg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=U3Ubj59o; spf=pass (google.com: domain of mptcp+bounces-2809-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2809-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 l16si5115198plg.78.2021.12.16.14.24.31 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 16 Dec 2021 14:24:31 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2809-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=U3Ubj59o; spf=pass (google.com: domain of mptcp+bounces-2809-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2809-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 4311C3E1014 for ; Thu, 16 Dec 2021 22:24:31 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 9FB216D13; Thu, 16 Dec 2021 22:24:22 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) (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 7294A3FEC for ; Thu, 16 Dec 2021 22:24:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1639693461; x=1671229461; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=cf0q8kHx93MuudsrnVemfhfClIUK04+eSC41lM9pveg=; b=U3Ubj59oaASdTMFvaa7Mi9gX164xao8G74SJG57qU0iIhmDd3XhUKlcL cyISfjw3YwdFxMxwCmP0S0557fFa9+kSFVXtGX+fsfugbALsPnVL1rIj1 KBBhTGE367UFtoaPnsLUl/WlMbhEYBlmoaHprioURsVZHX4zgTKDbW32n nLiTLb6OcmRThqi0YUJ54cDLFmMos4jBafFXDec79Ysyghl6j4n/r9viW 7gTh/B1OnquSUSulHIEEASRgFbH7tG6y3OwtHiWkYyenJcKlK1Wb0t/i5 zdOOEhJ73novSsg8ipmdGVqy2POleQYWBbAH0Q2sV+86BrhV7REamCxh4 w==; X-IronPort-AV: E=McAfee;i="6200,9189,10200"; a="300393171" X-IronPort-AV: E=Sophos;i="5.88,212,1635231600"; d="scan'208";a="300393171" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Dec 2021 14:24:10 -0800 X-IronPort-AV: E=Sophos;i="5.88,212,1635231600"; d="scan'208";a="519461260" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Dec 2021 14:24:10 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Cc: Florian Westphal Subject: [PATCH mptcp-next 12/21] mptcp: netlink: split mptcp_pm_parse_addr into two functions Date: Thu, 16 Dec 2021 17:23:05 -0500 Message-Id: <20211216222314.1244708-13-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20211216222314.1244708-1-kishen.maloor@intel.com> References: <20211216222314.1244708-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" From: Florian Westphal Next patch will need to parse MPTCP_PM_ATTR_ADDR attributes and fill an mptcp_addr_info structure from a different genl command callback. To avoid copy-paste, split the existing function to a helper that does the common part and then call the helper from the (renamed)mptcp_pm_parse_entry function. Signed-off-by: Florian Westphal --- net/mptcp/pm_netlink.c | 60 +++++++++++++++++++++++++++--------------- 1 file changed, 39 insertions(+), 21 deletions(-) diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index a70458317b2c..067a74ad7c5c 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -1316,11 +1316,12 @@ static int mptcp_pm_family_to_addr(int family) return MPTCP_PM_ADDR_ATTR_ADDR4; } =20 -static int mptcp_pm_parse_addr(struct nlattr *attr, struct genl_info *info, - bool require_family, - struct mptcp_pm_addr_entry *entry) +static int mptcp_pm_parse_pm_addr_attr(struct nlattr *tb[], + const struct nlattr *attr, + struct genl_info *info, + struct mptcp_addr_info *addr, + bool require_family) { - struct nlattr *tb[MPTCP_PM_ADDR_ATTR_MAX + 1]; int err, addr_addr; =20 if (!attr) { @@ -1334,27 +1335,29 @@ static int mptcp_pm_parse_addr(struct nlattr *attr,= struct genl_info *info, if (err) return err; =20 - memset(entry, 0, sizeof(*entry)); + if (tb[MPTCP_PM_ADDR_ATTR_ID]) + addr->id =3D nla_get_u8(tb[MPTCP_PM_ADDR_ATTR_ID]); + if (!tb[MPTCP_PM_ADDR_ATTR_FAMILY]) { if (!require_family) - goto skip_family; + return err; =20 NL_SET_ERR_MSG_ATTR(info->extack, attr, "missing family"); return -EINVAL; } =20 - entry->addr.family =3D nla_get_u16(tb[MPTCP_PM_ADDR_ATTR_FAMILY]); - if (entry->addr.family !=3D AF_INET + addr->family =3D nla_get_u16(tb[MPTCP_PM_ADDR_ATTR_FAMILY]); + if (addr->family !=3D AF_INET #if IS_ENABLED(CONFIG_MPTCP_IPV6) - && entry->addr.family !=3D AF_INET6 + && addr->family !=3D AF_INET6 #endif ) { NL_SET_ERR_MSG_ATTR(info->extack, attr, "unknown address family"); return -EINVAL; } - addr_addr =3D mptcp_pm_family_to_addr(entry->addr.family); + addr_addr =3D mptcp_pm_family_to_addr(addr->family); if (!tb[addr_addr]) { NL_SET_ERR_MSG_ATTR(info->extack, attr, "missing address data"); @@ -1362,22 +1365,37 @@ static int mptcp_pm_parse_addr(struct nlattr *attr,= struct genl_info *info, } =20 #if IS_ENABLED(CONFIG_MPTCP_IPV6) - if (entry->addr.family =3D=3D AF_INET6) - entry->addr.addr6 =3D nla_get_in6_addr(tb[addr_addr]); + if (addr->family =3D=3D AF_INET6) + addr->addr6 =3D nla_get_in6_addr(tb[addr_addr]); else #endif - entry->addr.addr.s_addr =3D nla_get_in_addr(tb[addr_addr]); + addr->addr.s_addr =3D nla_get_in_addr(tb[addr_addr]); + + if (tb[MPTCP_PM_ADDR_ATTR_PORT]) + addr->port =3D htons(nla_get_u16(tb[MPTCP_PM_ADDR_ATTR_PORT])); + + return err; +} + +static int mptcp_pm_parse_entry(struct nlattr *attr, struct genl_info *inf= o, + bool require_family, + struct mptcp_pm_addr_entry *entry) +{ + struct nlattr *tb[MPTCP_PM_ADDR_ATTR_MAX + 1]; + int err; + + memset(entry, 0, sizeof(*entry)); + + err =3D mptcp_pm_parse_pm_addr_attr(tb, attr, info, &entry->addr, require= _family); + if (err) + return err; =20 -skip_family: if (tb[MPTCP_PM_ADDR_ATTR_IF_IDX]) { u32 val =3D nla_get_s32(tb[MPTCP_PM_ADDR_ATTR_IF_IDX]); =20 entry->ifindex =3D val; } =20 - if (tb[MPTCP_PM_ADDR_ATTR_ID]) - entry->addr.id =3D nla_get_u8(tb[MPTCP_PM_ADDR_ATTR_ID]); - if (tb[MPTCP_PM_ADDR_ATTR_FLAGS]) entry->flags =3D nla_get_u32(tb[MPTCP_PM_ADDR_ATTR_FLAGS]); =20 @@ -1432,7 +1450,7 @@ static int mptcp_nl_cmd_add_addr(struct sk_buff *skb,= struct genl_info *info) struct socket *lsk; int ret; =20 - ret =3D mptcp_pm_parse_addr(attr, info, true, &addr); + ret =3D mptcp_pm_parse_entry(attr, info, true, &addr); if (ret < 0) return ret; =20 @@ -1648,7 +1666,7 @@ static int mptcp_nl_cmd_del_addr(struct sk_buff *skb,= struct genl_info *info) unsigned int addr_max; int ret; =20 - ret =3D mptcp_pm_parse_addr(attr, info, false, &addr); + ret =3D mptcp_pm_parse_entry(attr, info, false, &addr); if (ret < 0) return ret; =20 @@ -1824,7 +1842,7 @@ static int mptcp_nl_cmd_get_addr(struct sk_buff *skb,= struct genl_info *info) void *reply; int ret; =20 - ret =3D mptcp_pm_parse_addr(attr, info, false, &addr); + ret =3D mptcp_pm_parse_entry(attr, info, false, &addr); if (ret < 0) return ret; =20 @@ -2019,7 +2037,7 @@ static int mptcp_nl_cmd_set_flags(struct sk_buff *skb= , struct genl_info *info) u8 bkup =3D 0, lookup_by_id =3D 0; int ret; =20 - ret =3D mptcp_pm_parse_addr(attr, info, false, &addr); + ret =3D mptcp_pm_parse_entry(attr, info, false, &addr); if (ret < 0) return ret; =20 --=20 2.31.1 From nobody Fri Mar 29 02:34:01 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp690328jap; Thu, 16 Dec 2021 14:24:29 -0800 (PST) X-Google-Smtp-Source: ABdhPJxESwMau96LMxnDbdlrlwm+fLPNALIdF6xP5zS0DNTQFY0tib7J4fhJJhOJZ3CSQKhTbkk8 X-Received: by 2002:a05:622a:1816:: with SMTP id t22mr99898qtc.506.1639693469450; Thu, 16 Dec 2021 14:24:29 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1639693469; cv=none; d=google.com; s=arc-20160816; b=X9EUPsWRWtamVOfaCGVmUMFMpw7nHHfEnjonYRY2JQx0TkMaSs5WX5IZ8Zzwvs7lXw EDlglHJBTlWmYjYrQJQxI385ArNuSUjOiwOg0fOdL50QlC69tOo+uzVyabCO+vz1ygp0 iZhjl1RqqNeWbdhuChHD0lyqBrvQ866frLWdrbun8K/4uYQIuYufHInzWaSaE6nCMhYU VYa3kHbtKVdyV1ojrXB4n2qyjE82SAJPG1sNfvG8qCz6lxbWTtRl4LcaT8Gl2k+AY4H8 mshQIu7eX0YfegcN0z82P64V+quk47ztlqUPZdjc6bZW7cud9hirk42mjeRXcrf0UW8M ljbA== 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=uLnTT8QNODWdxGrzCSjSFsN/qHBtF3vr7+Mcnx5n8OM=; b=i6O+loq0DX6KdHiTKEtBgSq+q7I4Z7HWUvXHCr1QIc6ZdgvYPa9xh8fYh9sHuZhM/j 9iO5lSrKLX4y6Wsghrn20Ydi/USCZQadtt9xMqUe6uF93XUrDrd2JfJiaOX1LARDk3N2 oGDv4wPoxThq5s9Rz6mGz+p6hUrL1KLVS54B4KDhhtNaLGIeP7gOyVaj/2tXe6z2ROxG /9hhnpbIZbTKV0McaKfdGDW5668V0Sanj+aBiTgCeSdL+7tL9SqRG9VP2GELEFEkP2Lh ZnT2FBWX4JOQ0PFF336VKsX8qs34TjHrlRGygRFJXi4p9KoQ+/n9VcK+wDVEE8mQ4EPR +5SQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=UR9xeDL6; spf=pass (google.com: domain of mptcp+bounces-2807-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-2807-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. [147.75.197.195]) by mx.google.com with ESMTPS id bl18si3535375qkb.282.2021.12.16.14.24.29 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 16 Dec 2021 14:24:29 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2807-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) client-ip=147.75.197.195; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=UR9xeDL6; spf=pass (google.com: domain of mptcp+bounces-2807-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-2807-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 22AA31C0F1D for ; Thu, 16 Dec 2021 22:24:29 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 6D6083FF5; Thu, 16 Dec 2021 22:24:21 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) (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 E7A063FEC for ; Thu, 16 Dec 2021 22:24:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1639693460; x=1671229460; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=KkAuwrF0nBkoanEMVoneMM0anhi7gGvevIIY19vd7Pc=; b=UR9xeDL6IRc6JajCbd1keDbdSKmUzYuhAzTYzX3oF/hXS3zhKOzXkZ1z dwyXhMr2RgAKrE1P0FISgtUZRsmGKWKNPlbDqwiM0uZ6D7mjAUZKq/j8e mSFWhnsm9fGD6EsiSA3Ca4ydz/Hhdg17AAT15UnZMhLaCoWILy7iUpTBd 7867GEJXgfWJo4hi001+Eh4fuzo1vYSH5vO5Razpj/uhMu37TwjnxlL93 rzuHRRNNiafaj1LFGtmrRVIGlbk0GMvElHeyE8rL8wTnUd8/NBQXLzbbW bpKoj19C+Zn++28oTIEOsg5ZUIJ1qqpboevC2d2evxeml4GwBA+QeHYiu Q==; X-IronPort-AV: E=McAfee;i="6200,9189,10200"; a="300393169" X-IronPort-AV: E=Sophos;i="5.88,212,1635231600"; d="scan'208";a="300393169" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Dec 2021 14:24:10 -0800 X-IronPort-AV: E=Sophos;i="5.88,212,1635231600"; d="scan'208";a="519461263" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Dec 2021 14:24:10 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next 13/21] mptcp: netlink: Add MPTCP_PM_CMD_ANNOUNCE Date: Thu, 16 Dec 2021 17:23:06 -0500 Message-Id: <20211216222314.1244708-14-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20211216222314.1244708-1-kishen.maloor@intel.com> References: <20211216222314.1244708-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 adds a MPTCP netlink interface for issuing ADD_ADDR advertisements over the chosen MPTCP connection from a userspace path manager. The command requires the following parameters: { token, { loc_id, family, daddr4 | daddr6 [, dport] } [, if_idx], flags/signal }. Signed-off-by: Kishen Maloor --- include/uapi/linux/mptcp.h | 2 + net/mptcp/pm_netlink.c | 111 +++++++++++++++++++++++++++++++++++++ 2 files changed, 113 insertions(+) diff --git a/include/uapi/linux/mptcp.h b/include/uapi/linux/mptcp.h index f106a3941cdf..40380be396c8 100644 --- a/include/uapi/linux/mptcp.h +++ b/include/uapi/linux/mptcp.h @@ -55,6 +55,7 @@ enum { MPTCP_PM_ATTR_ADDR, /* nested address */ MPTCP_PM_ATTR_RCV_ADD_ADDRS, /* u32 */ MPTCP_PM_ATTR_SUBFLOWS, /* u32 */ + MPTCP_PM_ATTR_TOKEN, /* u32 */ =20 __MPTCP_PM_ATTR_MAX }; @@ -92,6 +93,7 @@ enum { MPTCP_PM_CMD_SET_LIMITS, MPTCP_PM_CMD_GET_LIMITS, MPTCP_PM_CMD_SET_FLAGS, + MPTCP_PM_CMD_ANNOUNCE, =20 __MPTCP_PM_CMD_AFTER_LAST }; diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index 067a74ad7c5c..2e9ca5730b10 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -1268,6 +1268,7 @@ static const struct nla_policy mptcp_pm_policy[MPTCP_= PM_ATTR_MAX + 1] =3D { NLA_POLICY_NESTED(mptcp_pm_addr_policy), [MPTCP_PM_ATTR_RCV_ADD_ADDRS] =3D { .type =3D NLA_U32, }, [MPTCP_PM_ATTR_SUBFLOWS] =3D { .type =3D NLA_U32, }, + [MPTCP_PM_ATTR_TOKEN] =3D { .type =3D NLA_U32, }, }; =20 void mptcp_pm_nl_subflow_chk_stale(const struct mptcp_sock *msk, struct so= ck *ssk) @@ -2028,6 +2029,111 @@ static int mptcp_nl_addr_backup(struct net *net, return ret; } =20 +static int mptcp_nl_cmd_announce(struct sk_buff *skb, struct genl_info *in= fo) +{ + struct nlattr *token =3D info->attrs[MPTCP_PM_ATTR_TOKEN]; + struct nlattr *addr =3D info->attrs[MPTCP_PM_ATTR_ADDR]; + struct pm_nl_pernet *pernet =3D genl_info_pm_nl(info); + struct mptcp_pm_addr_entry addr_val; + struct mptcp_local_lsk *lsk_ref; + bool reuse_port =3D false; + struct mptcp_sock *msk; + struct socket *lsk; + u32 token_val; + int err; + + if (!addr || !token) { + GENL_SET_ERR_MSG(info, "missing required inputs"); + return -EINVAL; + } + + token_val =3D nla_get_u32(token); + + msk =3D mptcp_token_get_sock(sock_net(skb->sk), token_val); + if (!msk) { + NL_SET_ERR_MSG_ATTR(info->extack, token, "invalid token"); + return -EINVAL; + } + + if (READ_ONCE(msk->pm.pm_type) !=3D MPTCP_PM_TYPE_USERSPACE) { + GENL_SET_ERR_MSG(info, "invalid request; userspace PM not selected"); + return -EINVAL; + } + + err =3D mptcp_pm_parse_entry(addr, info, true, &addr_val); + if (err < 0) { + GENL_SET_ERR_MSG(info, "error parsing local address"); + return err; + } + + if (addr_val.addr.id =3D=3D 0 || !(addr_val.flags & MPTCP_PM_ADDR_FLAG_SI= GNAL)) { + GENL_SET_ERR_MSG(info, "invalid addr id or flags"); + return -EINVAL; + } + + if (!addr_val.addr.port) { + addr_val.addr.port =3D + ((struct inet_sock *)inet_sk + ((struct sock *)msk))->inet_sport; + + reuse_port =3D true; + } + + lsk_ref =3D lsk_list_find(pernet, &addr_val.addr); + + if (!lsk_ref) { + err =3D mptcp_pm_nl_create_listen_socket(skb->sk, &addr_val, &lsk); + if ((err && !reuse_port) || (err && (err !=3D -EADDRINUSE) && reuse_port= )) { + GENL_SET_ERR_MSG(info, "error creating listen socket"); + return err; + } + + if (lsk) { + lsk_ref =3D lsk_list_add(pernet, &addr_val.addr, lsk); + if (!lsk_ref) { + GENL_SET_ERR_MSG(info, "can't allocate lsk ref"); + sock_release(lsk); + return -ENOMEM; + } + } + } + + if (!reuse_port) { + addr_val.lsk_ref =3D lsk_ref; + lsk_ref =3D NULL; + } else { + addr_val.addr.port =3D 0; + } + + err =3D mptcp_userspace_pm_append_new_local_addr(msk, &addr_val); + if (err < 0) { + if (addr_val.lsk_ref) + lsk_list_release(pernet, addr_val.lsk_ref); + else if (lsk_ref) + lsk_list_release(pernet, lsk_ref); + GENL_SET_ERR_MSG(info, "did not match address and id"); + return err; + } + + lock_sock((struct sock *)msk); + spin_lock_bh(&msk->pm.lock); + + if (mptcp_pm_alloc_anno_list(msk, &addr_val, lsk_ref)) { + mptcp_pm_announce_addr(msk, &addr_val.addr, false); + mptcp_pm_nl_addr_send_ack(msk); + } + + spin_unlock_bh(&msk->pm.lock); + release_sock((struct sock *)msk); + + if (addr_val.lsk_ref) + lsk_list_release(pernet, addr_val.lsk_ref); + else if (lsk_ref) + lsk_list_release(pernet, lsk_ref); + + return 0; +} + static int mptcp_nl_cmd_set_flags(struct sk_buff *skb, struct genl_info *i= nfo) { struct mptcp_pm_addr_entry addr =3D { .addr =3D { .family =3D AF_UNSPEC }= , }, *entry; @@ -2370,6 +2476,11 @@ static const struct genl_small_ops mptcp_pm_ops[] = =3D { .doit =3D mptcp_nl_cmd_set_flags, .flags =3D GENL_ADMIN_PERM, }, + { + .cmd =3D MPTCP_PM_CMD_ANNOUNCE, + .doit =3D mptcp_nl_cmd_announce, + .flags =3D GENL_ADMIN_PERM, + }, }; =20 static struct genl_family mptcp_genl_family __ro_after_init =3D { --=20 2.31.1 From nobody Fri Mar 29 02:34:01 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp690304jap; Thu, 16 Dec 2021 14:24:28 -0800 (PST) X-Google-Smtp-Source: ABdhPJydRg42AcI6vCxGitqfIfzxoxGCEm9+vYCnv8uPhH+Td/psrmjfn3WTvZIVvz1x11ToqAOw X-Received: by 2002:a17:90b:903:: with SMTP id bo3mr8524495pjb.11.1639693468061; Thu, 16 Dec 2021 14:24:28 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1639693468; cv=none; d=google.com; s=arc-20160816; b=Amo4n+SM1GfB7R/XE3jkGZ/U6U8y61C3/WHogFroKbcRlT7fGiWlcgJ/TxAklTqRga VjAIhZdBq+4y6FXO9ZfClzbpnw2Ps4PHL/SaognkLIDAu0duN/MzAkJihz+m7w1Htnyh lHlYSx2//LIUbkVAUhASEEpCBNHlLVKtSLu5pOZEiSue5sz8DtAM8SQ+ue6TY79lPsAu 3+IMWXH4bAJCLibBZvWUkwfmSBtWOnZKwVmH3l27ZpMaUUeWwn8qJnBidllbPwOUmop8 9x26u5z+uhNFv6yCOvRjB6jxzSBoqxeRG2a64gHGM9tm1kcvmrrd0DkSpmciFT6o+abY QnUw== 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=EpQxrWc4jiLOzQJTXldVlA43SbhNhX7c88Y76Ma74d4=; b=gF9GxlKWeTYynCHZcEP4If/cqu76ezuR9Q0V67FHBYzw4pFgfd4ENCzj/ehC1ASd/n nAaP/BZPhxuIR0ApmCeaGtDz+OjaXTzKdycjHDugmjM0nrh0bt+NnHIdLOABd5pK0yg9 YSRQZqcWekTu3IRHcXYnztuHlss+3QOMPqRuotRiMMGvKMTj3ght8zzCVNPP1rPl2kzz MOst4viCbvtqa6z8HWNcsFmMZlSaXi/OmhAKxdvDA0eSWWIagLkqbExjzzxto5+LIxbG YqYPFTt5nByijSaGiRQw9oIV0kVPGVFtSpemNQCTMaomI4rDO80l/QK8pw8EQF7X81o5 gnsA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=bZrS0bMZ; spf=pass (google.com: domain of mptcp+bounces-2806-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2806-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 28si9923902pjc.148.2021.12.16.14.24.27 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 16 Dec 2021 14:24:28 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2806-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=bZrS0bMZ; spf=pass (google.com: domain of mptcp+bounces-2806-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2806-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 9A1BD3E0F60 for ; Thu, 16 Dec 2021 22:24:27 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 4B1AF3FFA; Thu, 16 Dec 2021 22:24:21 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) (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 0409B3FF5 for ; Thu, 16 Dec 2021 22:24:19 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1639693460; x=1671229460; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=0PKIoAWBG01b+R+jq+AHrVNak7XFUEjF6B66uXs43o8=; b=bZrS0bMZYmmcjQ5/J9hK8jP9oNUOwO8bWWVLcqcUEDOA6sjJT8V0Vx7s XPvDsqLyBnIxYCIMGT8kS0VA3tHRsPgnN4oZGLALp2SApO5xJaGtoivgo tnY/g/eLyOcNJWCT5iArTPFrrPs0TLf3A73Z8tceax5O8qOyd/PCuJLgz on/L3EpKen10T4q5UpKyMHGa9qX3F4TjzGH6savzRKIar7DbK69HCywYn dGy6ojbOQBkntc+4WbFoxQmfAlponGqiSO7Z0pihiXEvVBI3/d8CEt38W jgxYxVqNhdGzDu2sWUpBThLhut0xFc02NyfAfaOXvzB7Buagv48GMH+vI g==; X-IronPort-AV: E=McAfee;i="6200,9189,10200"; a="300393170" X-IronPort-AV: E=Sophos;i="5.88,212,1635231600"; d="scan'208";a="300393170" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Dec 2021 14:24:10 -0800 X-IronPort-AV: E=Sophos;i="5.88,212,1635231600"; d="scan'208";a="519461268" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Dec 2021 14:24:10 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next 14/21] mptcp: selftests: support MPTCP_PM_CMD_ANNOUNCE Date: Thu, 16 Dec 2021 17:23:07 -0500 Message-Id: <20211216222314.1244708-15-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20211216222314.1244708-1-kishen.maloor@intel.com> References: <20211216222314.1244708-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 updates the "pm_nl_ctl" testing sample with an "ann" (announce) option to support the newly added netlink interface command MPTCP_PM_CMD_ANNOUNCE to issue ADD_ADDR advertisements over the chosen MPTCP connection. E.g. ./pm_nl_ctl ann 192.168.122.75 token 823274047 id 25 dev enp1s0 Signed-off-by: Kishen Maloor --- tools/testing/selftests/net/mptcp/pm_nl_ctl.c | 130 ++++++++++++++++++ 1 file changed, 130 insertions(+) diff --git a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c b/tools/testing/= selftests/net/mptcp/pm_nl_ctl.c index 354784512748..76dfb5a8984a 100644 --- a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c +++ b/tools/testing/selftests/net/mptcp/pm_nl_ctl.c @@ -6,6 +6,7 @@ #include #include #include +#include =20 #include #include @@ -26,6 +27,7 @@ static void syntax(char *argv[]) { fprintf(stderr, "%s add|get|set|del|flush|dump|accept []\n", argv[0= ]); fprintf(stderr, "\tadd [flags signal|subflow|backup|fullmesh] [id ] [= dev ] \n"); + fprintf(stderr, "\tann id token [port ] [dev ]\n"); fprintf(stderr, "\tdel []\n"); fprintf(stderr, "\tget \n"); fprintf(stderr, "\tset [flags backup|nobackup]\n"); @@ -170,6 +172,132 @@ static int resolve_mptcp_pm_netlink(int fd) return genl_parse_getfamily((void *)data); } =20 +int announce_addr(int fd, int pm_family, int argc, char *argv[]) +{ + char data[NLMSG_ALIGN(sizeof(struct nlmsghdr)) + + NLMSG_ALIGN(sizeof(struct genlmsghdr)) + + 1024]; + u_int32_t flags =3D MPTCP_PM_ADDR_FLAG_SIGNAL; + u_int32_t token =3D UINT_MAX; + struct rtattr *rta, *addr; + u_int32_t id =3D UINT_MAX; + struct nlmsghdr *nh; + u_int16_t family; + int addr_start; + int off =3D 0; + int arg; + + memset(data, 0, sizeof(data)); + nh =3D (void *)data; + off =3D init_genl_req(data, pm_family, MPTCP_PM_CMD_ANNOUNCE, + MPTCP_PM_VER); + + if (argc < 7) + syntax(argv); + + /* local-ip header */ + addr_start =3D off; + addr =3D (void *)(data + off); + addr->rta_type =3D NLA_F_NESTED | MPTCP_PM_ATTR_ADDR; + addr->rta_len =3D RTA_LENGTH(0); + off +=3D NLMSG_ALIGN(addr->rta_len); + + /* local-ip data */ + /* record addr type */ + rta =3D (void *)(data + off); + if (inet_pton(AF_INET, argv[2], RTA_DATA(rta))) { + family =3D AF_INET; + rta->rta_type =3D MPTCP_PM_ADDR_ATTR_ADDR4; + rta->rta_len =3D RTA_LENGTH(4); + } else if (inet_pton(AF_INET6, argv[2], RTA_DATA(rta))) { + family =3D AF_INET6; + rta->rta_type =3D MPTCP_PM_ADDR_ATTR_ADDR6; + rta->rta_len =3D RTA_LENGTH(16); + } else + error(1, errno, "can't parse ip %s", argv[2]); + off +=3D NLMSG_ALIGN(rta->rta_len); + + /* addr family */ + rta =3D (void *)(data + off); + rta->rta_type =3D MPTCP_PM_ADDR_ATTR_FAMILY; + rta->rta_len =3D RTA_LENGTH(2); + memcpy(RTA_DATA(rta), &family, 2); + off +=3D NLMSG_ALIGN(rta->rta_len); + + /* addr flags (..SIGNAL) */ + rta =3D (void *)(data + off); + rta->rta_type =3D MPTCP_PM_ADDR_ATTR_FLAGS; + rta->rta_len =3D RTA_LENGTH(4); + memcpy(RTA_DATA(rta), &flags, 4); + off +=3D NLMSG_ALIGN(rta->rta_len); + + for (arg =3D 3; arg < argc; arg++) { + if (!strcmp(argv[arg], "id")) { + /* local-id */ + if (++arg >=3D argc) + error(1, 0, " missing id value"); + + id =3D atoi(argv[arg]); + rta =3D (void *)(data + off); + rta->rta_type =3D MPTCP_PM_ADDR_ATTR_ID; + rta->rta_len =3D RTA_LENGTH(1); + memcpy(RTA_DATA(rta), &id, 1); + off +=3D NLMSG_ALIGN(rta->rta_len); + } else if (!strcmp(argv[arg], "dev")) { + /* for the if_index */ + int32_t ifindex; + + if (++arg >=3D argc) + error(1, 0, " missing dev name"); + + ifindex =3D if_nametoindex(argv[arg]); + if (!ifindex) + error(1, errno, "unknown device %s", argv[arg]); + + rta =3D (void *)(data + off); + rta->rta_type =3D MPTCP_PM_ADDR_ATTR_IF_IDX; + rta->rta_len =3D RTA_LENGTH(4); + memcpy(RTA_DATA(rta), &ifindex, 4); + off +=3D NLMSG_ALIGN(rta->rta_len); + } else if (!strcmp(argv[arg], "port")) { + /* local-port (optional) */ + u_int16_t port; + + if (++arg >=3D argc) + error(1, 0, " missing port value"); + + port =3D atoi(argv[arg]); + rta =3D (void *)(data + off); + rta->rta_type =3D MPTCP_PM_ADDR_ATTR_PORT; + rta->rta_len =3D RTA_LENGTH(2); + memcpy(RTA_DATA(rta), &port, 2); + off +=3D NLMSG_ALIGN(rta->rta_len); + } else if (!strcmp(argv[arg], "token")) { + /* MPTCP connection token */ + if (++arg >=3D argc) + error(1, 0, " missing token value"); + + token =3D atoi(argv[arg]); + } else + error(1, 0, "unknown keyword %s", argv[arg]); + } + addr->rta_len =3D off - addr_start; + + if (id =3D=3D UINT_MAX || token =3D=3D UINT_MAX) + error(1, 0, " missing mandatory inputs"); + + /* token */ + rta =3D (void *)(data + off); + rta->rta_type =3D MPTCP_PM_ATTR_TOKEN; + rta->rta_len =3D RTA_LENGTH(4); + memcpy(RTA_DATA(rta), &token, 4); + off +=3D NLMSG_ALIGN(rta->rta_len); + + do_nl_req(fd, nh, off, 0); + + return 0; +} + int add_addr(int fd, int pm_family, int argc, char *argv[]) { char data[NLMSG_ALIGN(sizeof(struct nlmsghdr)) + @@ -744,6 +872,8 @@ int main(int argc, char *argv[]) =20 if (!strcmp(argv[1], "add")) return add_addr(fd, pm_family, argc, argv); + else if (!strcmp(argv[1], "ann")) + return announce_addr(fd, pm_family, argc, argv); else if (!strcmp(argv[1], "del")) return del_addr(fd, pm_family, argc, argv); else if (!strcmp(argv[1], "flush")) --=20 2.31.1 From nobody Fri Mar 29 02:34:01 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp690371jap; Thu, 16 Dec 2021 14:24:33 -0800 (PST) X-Google-Smtp-Source: ABdhPJwRI31x87fzithZz0XznApm4B6bOSoNBkmmPanbuTZsROXetPgqarAupv3bfeGj4VbuIJGD X-Received: by 2002:a37:27c9:: with SMTP id n192mr102663qkn.517.1639693472941; Thu, 16 Dec 2021 14:24:32 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1639693472; cv=none; d=google.com; s=arc-20160816; b=Kpheq4rCUSP6HGSQiekVD0txvWjFAa3JoHlzp+wDP7eRtWCzQsPhDvTMlnZjQo0qaw gWtmVfDQoe7NZWwJBJC9TgqN7VGBbofwNHeX4E5zM8qsIkfOhlw2nIU8NDFjHOz8DATI ydydT3sKofeFkf7jcyNUrG3iENqnYzyp2NHrxFdz6WiE6tiFqk4lTxCoDPq+//YfX3sp /fOhhB7oqSyHgv2cRwli/7ay1EAj2nZnj9EKDCrN0xIjoL8tFYpmi1x3MvSzexNQ0jDd gTdBVm9IM74vIx5JabJXPgni3E4mpdThDdZS1M7cnARFB8UW4b6gyHHD+JcxK/EOl9Zj eHfg== 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=LXsK2a/jb6xP10h/kWiMh3MR4iQ6N6EHq5N52ijOx4M=; b=bNasleTVQ70FzcrLsbSAJzNfypKoGD4rKpcGKsJW4GRA89FViHU13vyJ36Zt/w88ns udjJKrdTGIMFHDvb1b/KQijNPnkY7KVuycDi/FNFUWYP3tBarQ8a9vCaexV2nyB3fTFH blAO3IE6oX2Osp5OtpyDbKrIW7aTpCdCyf9ZAD12XFOEUltSqdJzwdq5osDBErBh0n0s ANMtu5ET8WL61j+wFucEMT5NE+MJACNuQ49/10MqfhTCPKxkb6JoLD7OEPm4//Aeh+ym yQz2p632xezvtZ/XtI0jmqWY845Kuam3pnqqTnNbrUbsiuAFpHxWySBz6J0EKyENo04d pvNg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=fhHrfm5O; spf=pass (google.com: domain of mptcp+bounces-2810-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-2810-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. [147.75.197.195]) by mx.google.com with ESMTPS id u20si3051150qtw.682.2021.12.16.14.24.32 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 16 Dec 2021 14:24:32 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2810-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) client-ip=147.75.197.195; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=fhHrfm5O; spf=pass (google.com: domain of mptcp+bounces-2810-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-2810-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 BCEB91C0BDE for ; Thu, 16 Dec 2021 22:24:32 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id B73EC6D18; Thu, 16 Dec 2021 22:24:22 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) (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 842EB3FFB for ; Thu, 16 Dec 2021 22:24:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1639693461; x=1671229461; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=0m9IZ8Sn61grdD31UBb+b0qJnn02HsmyoaV1kfpOkHU=; b=fhHrfm5OP1aBPkMAKgi9x0V2mUyIMGtY6QmVbNIreH1yMkBaH7nqDvi4 AqhigRFjCkppsw5q0wDPxG0FEcmOar7FuuDCu4w0GUolA4dQ2gF3YhEu/ PLDodtF7cAoIp41tlBlumlfuwnlRZ8+QRhlLyIXk1dnUYULT29KvBQVwu kCqKf24cE9Xalx+lJp5ZlcZpGsz8GxrmfymDh4uLEUWooM//Yxznxp8Sj uh7jnuL7Bo+xWI5pCDPBj9zbduamvQbh+0EzKUsgtwHN0ieKOTL5faCIZ PaKqrVR4lLTgNe6CHq+VJk/UY5QbFo/h+gzGAc/B3TI6SI8UAX1sWaZNb w==; X-IronPort-AV: E=McAfee;i="6200,9189,10200"; a="300393172" X-IronPort-AV: E=Sophos;i="5.88,212,1635231600"; d="scan'208";a="300393172" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Dec 2021 14:24:10 -0800 X-IronPort-AV: E=Sophos;i="5.88,212,1635231600"; d="scan'208";a="519461271" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Dec 2021 14:24:10 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next 15/21] mptcp: netlink: Add MPTCP_PM_CMD_REMOVE Date: Thu, 16 Dec 2021 17:23:08 -0500 Message-Id: <20211216222314.1244708-16-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20211216222314.1244708-1-kishen.maloor@intel.com> References: <20211216222314.1244708-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 adds a MPTCP netlink command for issuing REMOVE_ADDR signals for a specific address over the chosen MPTCP connection from a userspace path manager. The command requires the following parameters: {token, loc_id}. Signed-off-by: Kishen Maloor --- include/uapi/linux/mptcp.h | 2 ++ net/mptcp/pm_netlink.c | 67 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+) diff --git a/include/uapi/linux/mptcp.h b/include/uapi/linux/mptcp.h index 40380be396c8..ec63f9382dbe 100644 --- a/include/uapi/linux/mptcp.h +++ b/include/uapi/linux/mptcp.h @@ -56,6 +56,7 @@ enum { MPTCP_PM_ATTR_RCV_ADD_ADDRS, /* u32 */ MPTCP_PM_ATTR_SUBFLOWS, /* u32 */ MPTCP_PM_ATTR_TOKEN, /* u32 */ + MPTCP_PM_ATTR_LOC_ID, /* u8 */ =20 __MPTCP_PM_ATTR_MAX }; @@ -94,6 +95,7 @@ enum { MPTCP_PM_CMD_GET_LIMITS, MPTCP_PM_CMD_SET_FLAGS, MPTCP_PM_CMD_ANNOUNCE, + MPTCP_PM_CMD_REMOVE, =20 __MPTCP_PM_CMD_AFTER_LAST }; diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index 2e9ca5730b10..66462ac706f2 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -1269,6 +1269,7 @@ static const struct nla_policy mptcp_pm_policy[MPTCP_= PM_ATTR_MAX + 1] =3D { [MPTCP_PM_ATTR_RCV_ADD_ADDRS] =3D { .type =3D NLA_U32, }, [MPTCP_PM_ATTR_SUBFLOWS] =3D { .type =3D NLA_U32, }, [MPTCP_PM_ATTR_TOKEN] =3D { .type =3D NLA_U32, }, + [MPTCP_PM_ATTR_LOC_ID] =3D { .type =3D NLA_U8, }, }; =20 void mptcp_pm_nl_subflow_chk_stale(const struct mptcp_sock *msk, struct so= ck *ssk) @@ -1719,6 +1720,7 @@ static void mptcp_pm_remove_addrs_and_subflows(struct= mptcp_sock *msk, slist.nr < MPTCP_RM_IDS_MAX) { alist.ids[alist.nr++] =3D entry->addr.id; slist.ids[slist.nr++] =3D entry->addr.id; + remove_anno_list_by_saddr(msk, &entry->addr); } else if (remove_anno_list_by_saddr(msk, &entry->addr) && alist.nr < MPTCP_RM_IDS_MAX) { alist.ids[alist.nr++] =3D entry->addr.id; @@ -2330,6 +2332,66 @@ void mptcp_event_addr_removed(const struct mptcp_soc= k *msk, uint8_t id) kfree_skb(skb); } =20 +static int mptcp_nl_cmd_remove(struct sk_buff *skb, struct genl_info *info) +{ + struct nlattr *token =3D info->attrs[MPTCP_PM_ATTR_TOKEN]; + struct nlattr *id =3D info->attrs[MPTCP_PM_ATTR_LOC_ID]; + struct pm_nl_pernet *pernet =3D genl_info_pm_nl(info); + struct mptcp_pm_addr_entry *match =3D NULL; + struct mptcp_pm_addr_entry *entry; + struct mptcp_sock *msk; + LIST_HEAD(free_list); + u32 token_val; + u8 id_val; + + if (!id || !token) { + GENL_SET_ERR_MSG(info, "missing required inputs"); + return -EINVAL; + } + + id_val =3D nla_get_u8(id); + token_val =3D nla_get_u32(token); + + msk =3D mptcp_token_get_sock(sock_net(skb->sk), token_val); + if (!msk) { + NL_SET_ERR_MSG_ATTR(info->extack, token, "invalid token"); + return -EINVAL; + } + + if (READ_ONCE(msk->pm.pm_type) !=3D MPTCP_PM_TYPE_USERSPACE) { + GENL_SET_ERR_MSG(info, "invalid request; userspace PM not selected"); + return -EINVAL; + } + + lock_sock((struct sock *)msk); + + list_for_each_entry(entry, &msk->local_addr_list, list) { + if (entry->addr.id =3D=3D id_val) { + match =3D entry; + break; + } + } + + if (!match) { + GENL_SET_ERR_MSG(info, "address with specified id not found"); + release_sock((struct sock *)msk); + return -EINVAL; + } + + list_move(&match->list, &free_list); + + mptcp_pm_remove_addrs_and_subflows(msk, &free_list); + + release_sock((struct sock *)msk); + + list_for_each_entry_safe(match, entry, &free_list, list) { + if (match->lsk_ref) + lsk_list_release(pernet, match->lsk_ref); + kfree(match); + } + return 0; +} + void mptcp_event_addr_announced(const struct mptcp_sock *msk, const struct mptcp_addr_info *info, const struct sock *ssk) @@ -2481,6 +2543,11 @@ static const struct genl_small_ops mptcp_pm_ops[] = =3D { .doit =3D mptcp_nl_cmd_announce, .flags =3D GENL_ADMIN_PERM, }, + { + .cmd =3D MPTCP_PM_CMD_REMOVE, + .doit =3D mptcp_nl_cmd_remove, + .flags =3D GENL_ADMIN_PERM, + }, }; =20 static struct genl_family mptcp_genl_family __ro_after_init =3D { --=20 2.31.1 From nobody Fri Mar 29 02:34:01 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp690343jap; Thu, 16 Dec 2021 14:24:30 -0800 (PST) X-Google-Smtp-Source: ABdhPJzDpOwYSb/9VS+dwCeKpUtFkaKDmUFLEi/HP33AI6TUN4bKIMQINjfv/Li5xx5irxHoYgBz X-Received: by 2002:a05:622a:2d5:: with SMTP id a21mr55613qtx.509.1639693470754; Thu, 16 Dec 2021 14:24:30 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1639693470; cv=none; d=google.com; s=arc-20160816; b=Auz+nY40jg6wi6WhG33WeNeLrhq6R/BrYRKnfrCplDaOsSmV7hkp9n2axCXLcTNd69 hJ/QMJGR4eA82sFKnZHJspWkVbCP0AkgP5zJDATdDJtwhFWJRsh2iFR7aAB9aYSU8IBq 3rMNrtFVg6Ix34btIUoyFEIPNexKUt1jRjOD2yNAMpgocMNAMfvcYvf1eE3ayy4XvX8Y aPIrOjDNRVpqK6XlWBY493x6TJIC60wtxdYA8q5TdQhBpzcLFr4PkbbwS7zv2Ce7AxJc PCJUkbuSV5m3DSimAOgB28JDgPT70pg4HZqGpl8Q7wj+CcKJD6wXScW2PcObtXqQPYU6 3fHQ== 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=WMW0VEj/YxMn7Vw1S/C05nep5DNx2fwYQLsbCzVhO/E=; b=yL+c26H00y0AFKk/Kk3Xp6YQAQ3sf5dQKk6IXEPqePFHfqp5HsI/0p9W1wNh2aW8qv 2kViFDszjXzvJdfvMO9OYASXxQqkf+qGDkR0yCb8hVQtq8xj+p9vttnDUIpo3wEIP87f CF3oWSUesWVnfPZZ9pCc6/kCfQl7HkpxpWBIdUH5jmaAVEInSsRQbmoZtWPHLxqn/o19 jkV9cCzIEqxnYW2qAksxRFMC9HzXZ35Lr5WgJOdSh/Y1FnUouxou18vesse+4BrUb8vO Ofv5zLoFFrL9BbwFoxsGcEjqqxXPOKDYOK3qLimGhaCCXTzmDmhhp/1mqhXxs+/9cqrI Gp8Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=G65K0pex; spf=pass (google.com: domain of mptcp+bounces-2808-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-2808-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. [147.75.197.195]) by mx.google.com with ESMTPS id bl18si3535375qkb.282.2021.12.16.14.24.30 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 16 Dec 2021 14:24:30 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2808-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) client-ip=147.75.197.195; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=G65K0pex; spf=pass (google.com: domain of mptcp+bounces-2808-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-2808-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 3CA121C0F14 for ; Thu, 16 Dec 2021 22:24:30 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id F11EA3FFF; Thu, 16 Dec 2021 22:24:21 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) (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 EF2463FEF for ; Thu, 16 Dec 2021 22:24:20 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1639693461; x=1671229461; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=C2VI5SqdOWAektSC7DHL1vhcCvIC6JSahI3lmtl6KNM=; b=G65K0pex+A3wv7YzpnN7AzBGyEar+zl50BR7nzSrrjChvZyMRo/TdBoE xmaJd8Ha3d9UZXkH/PDFne1GclL3cc02VnZ06oxpeF9NqNM6wQ7TURFw8 WqKno1AAVQaTV0nv/0VKmzPiszgJiYtKYpdVNG4lMUKutMqTvlAxnwNO7 Lekx9Nbv5BJxil+XJ0hDFdO4Yi2G2DppVgWAqydcGSDixNIGbdIqkl3YJ q+bqFj78b7g6mniTl8gNAR7yaD5qjRJeeW0fM64CLBXShdRwT6ut7//I4 LFmgC7gkPra+fXuRaVVBm2mfJg0BAlKIxBTMG63YSGBnHkb/Ut/1aP8yL A==; X-IronPort-AV: E=McAfee;i="6200,9189,10200"; a="300393173" X-IronPort-AV: E=Sophos;i="5.88,212,1635231600"; d="scan'208";a="300393173" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Dec 2021 14:24:10 -0800 X-IronPort-AV: E=Sophos;i="5.88,212,1635231600"; d="scan'208";a="519461274" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Dec 2021 14:24:10 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next 16/21] mptcp: selftests: support MPTCP_PM_CMD_REMOVE Date: Thu, 16 Dec 2021 17:23:09 -0500 Message-Id: <20211216222314.1244708-17-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20211216222314.1244708-1-kishen.maloor@intel.com> References: <20211216222314.1244708-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 updates the "pm_nl_ctl" testing sample with a "rem" (remove) option to support the newly added netlink interface command MPTCP_PM_CMD_REMOVE to issue REMOVE_ADDR signals over the chosen MPTCP connection. E.g. ./pm_nl_ctl rem token 823274047 id 23 Signed-off-by: Kishen Maloor --- tools/testing/selftests/net/mptcp/pm_nl_ctl.c | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c b/tools/testing/= selftests/net/mptcp/pm_nl_ctl.c index 76dfb5a8984a..8892bf16693a 100644 --- a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c +++ b/tools/testing/selftests/net/mptcp/pm_nl_ctl.c @@ -28,6 +28,7 @@ static void syntax(char *argv[]) fprintf(stderr, "%s add|get|set|del|flush|dump|accept []\n", argv[0= ]); fprintf(stderr, "\tadd [flags signal|subflow|backup|fullmesh] [id ] [= dev ] \n"); fprintf(stderr, "\tann id token [port ] [dev ]\n"); + fprintf(stderr, "\trem id token \n"); fprintf(stderr, "\tdel []\n"); fprintf(stderr, "\tget \n"); fprintf(stderr, "\tset [flags backup|nobackup]\n"); @@ -172,6 +173,55 @@ static int resolve_mptcp_pm_netlink(int fd) return genl_parse_getfamily((void *)data); } =20 +int remove_addr(int fd, int pm_family, int argc, char *argv[]) +{ + char data[NLMSG_ALIGN(sizeof(struct nlmsghdr)) + + NLMSG_ALIGN(sizeof(struct genlmsghdr)) + + 1024]; + struct nlmsghdr *nh; + struct rtattr *rta; + u_int32_t token; + u_int8_t id; + int off =3D 0; + int arg; + + memset(data, 0, sizeof(data)); + nh =3D (void *)data; + off =3D init_genl_req(data, pm_family, MPTCP_PM_CMD_REMOVE, + MPTCP_PM_VER); + + if (argc < 6) + syntax(argv); + + for (arg =3D 2; arg < argc; arg++) { + if (!strcmp(argv[arg], "id")) { + if (++arg >=3D argc) + error(1, 0, " missing id value"); + + id =3D atoi(argv[arg]); + rta =3D (void *)(data + off); + rta->rta_type =3D MPTCP_PM_ATTR_LOC_ID; + rta->rta_len =3D RTA_LENGTH(1); + memcpy(RTA_DATA(rta), &id, 1); + off +=3D NLMSG_ALIGN(rta->rta_len); + } else if (!strcmp(argv[arg], "token")) { + if (++arg >=3D argc) + error(1, 0, " missing token value"); + + token =3D atoi(argv[arg]); + rta =3D (void *)(data + off); + rta->rta_type =3D MPTCP_PM_ATTR_TOKEN; + rta->rta_len =3D RTA_LENGTH(4); + memcpy(RTA_DATA(rta), &token, 4); + off +=3D NLMSG_ALIGN(rta->rta_len); + } else + error(1, 0, "unknown keyword %s", argv[arg]); + } + + do_nl_req(fd, nh, off, 0); + return 0; +} + int announce_addr(int fd, int pm_family, int argc, char *argv[]) { char data[NLMSG_ALIGN(sizeof(struct nlmsghdr)) + @@ -874,6 +924,8 @@ int main(int argc, char *argv[]) return add_addr(fd, pm_family, argc, argv); else if (!strcmp(argv[1], "ann")) return announce_addr(fd, pm_family, argc, argv); + else if (!strcmp(argv[1], "rem")) + return remove_addr(fd, pm_family, argc, argv); else if (!strcmp(argv[1], "del")) return del_addr(fd, pm_family, argc, argv); else if (!strcmp(argv[1], "flush")) --=20 2.31.1 From nobody Fri Mar 29 02:34:01 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp690441jap; Thu, 16 Dec 2021 14:24:37 -0800 (PST) X-Google-Smtp-Source: ABdhPJxKodDw9TgVKyhtoMQTYHvJKkCSwlD3YC20orV2A9VSDQOZGKuElnXbhp6YFF1gAhAkMfEI X-Received: by 2002:ac8:5c0d:: with SMTP id i13mr119926qti.90.1639693477499; Thu, 16 Dec 2021 14:24:37 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1639693477; cv=none; d=google.com; s=arc-20160816; b=RHhLKBpu1lfukjWLIJVeUjclKrCi3Zgdm2avrdGY7+s2N3QQP72jz00fpAfYkgVjok YVMMGQ+jVhXGlseAmdOsTmhxl4Pl4eOaoLZTpunetUrvCtK7SxLhqQ2VAdi3VSXiaw1Q cMEU03ATfjER5gkfFE6vA9lZEN1Y2Oh6k56AwAbs4OEbSYQrVzvc8DShFlxczxO52e2I myLH7grQyIzHlRRWN15MORH+Qpqj+rrG3km2yZRCElE2MWT5p7m6UZSS+1xhJdJeUA4o 1rCigPlosgDvOH07Cc7AkvyI5ZHrjLyL34awB02O+PPU98RWASsbp9oISKT50wtfkZ3V hB0Q== 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:cc:to:from:dkim-signature; bh=c5dtJ779ORnvBfs85okjtZ6XmUYxmtN15fmgar7Xs34=; b=LoZthvana6tNCMWTFBLJZWTLj/83SgVbyzq/V0EqRPm/xZgo5xZeWs0Ye6UVdjaoWj NUbYnM1+VDwt8U6ZoonRt/QlB1noHdcjaOBCbdgjw8HYz9zVLjD7nZfhXbePEknZqCDa 9q1vDQIC6Dz5XfHEV+Z17I6Kp+I6ODOVA0CZUO/QNx7PfkC8oFdNY8kkQ6Qw66CEzFYD SY5SPQ4r6n4T6cPfOkz2NZtnDv8/fsjliB2yVIQufCptsa+dhGDFFDayEpY/C2Zccl5i 04sFXt4RZo2DMG7dC78CdQlwzk1C7tc4Q8XMwjqB9WzkgxlxuQPAgTood7bWc/3efaA4 NqKA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=gUoofe3Q; spf=pass (google.com: domain of mptcp+bounces-2814-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-2814-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. [147.75.197.195]) by mx.google.com with ESMTPS id w4si2835342qkb.529.2021.12.16.14.24.37 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 16 Dec 2021 14:24:37 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2814-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) client-ip=147.75.197.195; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=gUoofe3Q; spf=pass (google.com: domain of mptcp+bounces-2814-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-2814-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 504E91C0F34 for ; Thu, 16 Dec 2021 22:24:37 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id F3A1E6D19; Thu, 16 Dec 2021 22:24:24 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) (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 A26B36D22 for ; Thu, 16 Dec 2021 22:24:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1639693463; x=1671229463; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=yjdBvFQLTZk4/b8N1MrOsaOCkSy+Ir8CIyDwrn/ur0g=; b=gUoofe3Qw1OBddU7nllPOn1PYcFAn34zDrf2T+Q6E7V9vWHLr96c0puY 9fOHGFpqbd1eB82qGmj6lriTZGS6CMJPCXcBhCdHY+Uey3J+o9kO0iuyS aS1msE7uS/IgtWDmnYBjVZudO5x6yz1QgpMcoZgazKovW9+JuW19FSoB2 g5ebHzrkmDoTXOu9DbiIiIgvtP0J7Ytdlxd0ePOz8rPlROBKfk7Bkad2i glxY44MumBG9Xxx36dA7eTlAPKjm+kMvh6Zb2TEUCBvk5Z8QqxzlN7RHO 5MEFsBLygXvwONC652UN8ri5dgcor0Zat8KoM9fL108noqIX4m2DUcYgq A==; X-IronPort-AV: E=McAfee;i="6200,9189,10200"; a="300393176" X-IronPort-AV: E=Sophos;i="5.88,212,1635231600"; d="scan'208";a="300393176" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Dec 2021 14:24:11 -0800 X-IronPort-AV: E=Sophos;i="5.88,212,1635231600"; d="scan'208";a="519461278" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Dec 2021 14:24:10 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Cc: Florian Westphal Subject: [PATCH mptcp-next 17/21] mptcp: netlink: allow userspace-driven subflow establishment Date: Thu, 16 Dec 2021 17:23:10 -0500 Message-Id: <20211216222314.1244708-18-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20211216222314.1244708-1-kishen.maloor@intel.com> References: <20211216222314.1244708-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" From: Florian Westphal This allows userspace to tell kernel to add a new subflow to an existing mptcp connection. Userspace provides the token to identify the mptcp-level connection that needs a change in active subflows and the local and remote addresses of the new or the to-be-removed subflow. MPTCP_PM_CMD_SUBFLOW_CREATE requires the following parameters: { token, { loc_id, family, loc_addr4 | loc_addr6 }, { family, rem_addr4 | rem_addr6, rem_port } MPTCP_PM_CMD_SUBFLOW_DESTROY requires the following parameters: { token, { family, loc_addr4 | loc_addr6, loc_port }, { family, rem_addr4 | rem_addr6, rem_port } Signed-off-by: Florian Westphal Co-developed-by: Kishen Maloor Signed-off-by: Kishen Maloor Reported-by: kernel test robot --- include/uapi/linux/mptcp.h | 3 + net/mptcp/pm_netlink.c | 204 +++++++++++++++++++++++++++++++++++++ 2 files changed, 207 insertions(+) diff --git a/include/uapi/linux/mptcp.h b/include/uapi/linux/mptcp.h index ec63f9382dbe..25fd6c679bfa 100644 --- a/include/uapi/linux/mptcp.h +++ b/include/uapi/linux/mptcp.h @@ -57,6 +57,7 @@ enum { MPTCP_PM_ATTR_SUBFLOWS, /* u32 */ MPTCP_PM_ATTR_TOKEN, /* u32 */ MPTCP_PM_ATTR_LOC_ID, /* u8 */ + MPTCP_PM_ATTR_ADDR_REMOTE, /* nested address */ =20 __MPTCP_PM_ATTR_MAX }; @@ -96,6 +97,8 @@ enum { MPTCP_PM_CMD_SET_FLAGS, MPTCP_PM_CMD_ANNOUNCE, MPTCP_PM_CMD_REMOVE, + MPTCP_PM_CMD_SUBFLOW_CREATE, + MPTCP_PM_CMD_SUBFLOW_DESTROY, =20 __MPTCP_PM_CMD_AFTER_LAST }; diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index 66462ac706f2..26392a6699cd 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -1270,6 +1270,8 @@ static const struct nla_policy mptcp_pm_policy[MPTCP_= PM_ATTR_MAX + 1] =3D { [MPTCP_PM_ATTR_SUBFLOWS] =3D { .type =3D NLA_U32, }, [MPTCP_PM_ATTR_TOKEN] =3D { .type =3D NLA_U32, }, [MPTCP_PM_ATTR_LOC_ID] =3D { .type =3D NLA_U8, }, + [MPTCP_PM_ATTR_ADDR_REMOTE] =3D + NLA_POLICY_NESTED(mptcp_pm_addr_policy), }; =20 void mptcp_pm_nl_subflow_chk_stale(const struct mptcp_sock *msk, struct so= ck *ssk) @@ -1379,6 +1381,16 @@ static int mptcp_pm_parse_pm_addr_attr(struct nlattr= *tb[], return err; } =20 +static int mptcp_pm_parse_addr(struct nlattr *attr, struct genl_info *info, + struct mptcp_addr_info *addr) +{ + struct nlattr *tb[MPTCP_PM_ADDR_ATTR_MAX + 1]; + + memset(addr, 0, sizeof(*addr)); + + return mptcp_pm_parse_pm_addr_attr(tb, attr, info, addr, true); +} + static int mptcp_pm_parse_entry(struct nlattr *attr, struct genl_info *inf= o, bool require_family, struct mptcp_pm_addr_entry *entry) @@ -2503,6 +2515,188 @@ void mptcp_event(enum mptcp_event_type type, const = struct mptcp_sock *msk, kfree_skb(skb); } =20 +static int mptcp_nl_cmd_sf_create(struct sk_buff *skb, struct genl_info *i= nfo) +{ + struct nlattr *raddr =3D info->attrs[MPTCP_PM_ATTR_ADDR_REMOTE]; + struct nlattr *token =3D info->attrs[MPTCP_PM_ATTR_TOKEN]; + struct nlattr *laddr =3D info->attrs[MPTCP_PM_ATTR_ADDR]; + struct mptcp_addr_info addr_r; + struct mptcp_addr_info addr_l; + struct mptcp_sock *msk; + struct sock *sk; + u32 token_val; + int ret; + + if (!laddr || !raddr || !token) { + GENL_SET_ERR_MSG(info, "missing required inputs"); + return -EINVAL; + } + + token_val =3D nla_get_u32(token); + + msk =3D mptcp_token_get_sock(genl_info_net(info), token_val); + if (!msk) { + NL_SET_ERR_MSG_ATTR(info->extack, token, "invalid token"); + return -EINVAL; + } + + if (READ_ONCE(msk->pm.pm_type) !=3D MPTCP_PM_TYPE_USERSPACE) { + GENL_SET_ERR_MSG(info, "invalid request; userspace PM not selected"); + return -EINVAL; + } + + ret =3D mptcp_pm_parse_addr(laddr, info, &addr_l); + if (ret < 0) { + NL_SET_ERR_MSG_ATTR(info->extack, laddr, "error parsing local addr"); + return -EINVAL; + } + + if (addr_l.id =3D=3D 0) { + NL_SET_ERR_MSG_ATTR(info->extack, laddr, "missing local addr id"); + return -EINVAL; + } + + ret =3D mptcp_pm_parse_addr(raddr, info, &addr_r); + if (ret < 0) { + NL_SET_ERR_MSG_ATTR(info->extack, raddr, "error parsing remote addr"); + return -EINVAL; + } + + sk =3D &msk->sk.icsk_inet.sk; + lock_sock(sk); + + ret =3D __mptcp_subflow_connect(sk, &addr_l, &addr_r); + + spin_lock_bh(&msk->pm.lock); + if (ret =3D=3D 0) + msk->pm.local_addr_used++; + spin_unlock_bh(&msk->pm.lock); + + release_sock(sk); + + return ret; +} + +static struct sock *mptcp_nl_find_ssk(struct mptcp_sock *msk, + const struct mptcp_addr_info *local, + const struct mptcp_addr_info *remote) +{ + struct sock *sk =3D &msk->sk.icsk_inet.sk; + struct mptcp_subflow_context *subflow; + struct sock *found =3D NULL; + + if (local->family !=3D remote->family) + return NULL; + + lock_sock(sk); + + mptcp_for_each_subflow(msk, subflow) { + const struct ipv6_pinfo *pinfo; + const struct inet_sock *issk; + struct sock *ssk; + + ssk =3D mptcp_subflow_tcp_sock(subflow); + + if (local->family !=3D ssk->sk_family) + continue; + + issk =3D inet_sk(ssk); + + switch (ssk->sk_family) { + case AF_INET: + if (issk->inet_saddr !=3D local->addr.s_addr || + issk->inet_daddr !=3D remote->addr.s_addr) + continue; + break; + case AF_INET6: + pinfo =3D inet6_sk(ssk); + if (!ipv6_addr_equal(&local->addr6, &pinfo->saddr) || + !ipv6_addr_equal(&remote->addr6, &ssk->sk_v6_daddr)) + continue; + break; + default: + continue; + } + + if (issk->inet_sport =3D=3D local->port && + issk->inet_dport =3D=3D remote->port) { + found =3D ssk; + goto found; + } + } + +found: + release_sock(sk); + + return found; +} + +static int mptcp_nl_cmd_sf_destroy(struct sk_buff *skb, struct genl_info *= info) +{ + struct nlattr *raddr =3D info->attrs[MPTCP_PM_ATTR_ADDR_REMOTE]; + struct nlattr *token =3D info->attrs[MPTCP_PM_ATTR_TOKEN]; + struct nlattr *laddr =3D info->attrs[MPTCP_PM_ATTR_ADDR]; + struct mptcp_addr_info addr_l; + struct mptcp_addr_info addr_r; + struct mptcp_sock *msk; + struct sock *sk, *ssk; + u32 token_val; + int ret; + + if (!laddr || !raddr || !token) { + GENL_SET_ERR_MSG(info, "missing required inputs"); + return -EINVAL; + } + + token_val =3D nla_get_u32(token); + + msk =3D mptcp_token_get_sock(genl_info_net(info), token_val); + if (!msk) { + NL_SET_ERR_MSG_ATTR(info->extack, token, "invalid token"); + return -EINVAL; + } + + if (READ_ONCE(msk->pm.pm_type) !=3D MPTCP_PM_TYPE_USERSPACE) { + GENL_SET_ERR_MSG(info, "invalid request; userspace PM not selected"); + return -EINVAL; + } + + ret =3D mptcp_pm_parse_addr(laddr, info, &addr_l); + if (ret < 0) { + NL_SET_ERR_MSG_ATTR(info->extack, laddr, "error parsing local addr"); + return ret; + } + + ret =3D mptcp_pm_parse_addr(raddr, info, &addr_r); + if (ret < 0) { + NL_SET_ERR_MSG_ATTR(info->extack, raddr, "error parsing remote addr"); + return ret; + } + + if (addr_l.family !=3D addr_r.family) { + GENL_SET_ERR_MSG(info, "address families do not match"); + return -EINVAL; + } + + if (!addr_l.port || !addr_r.port) { + GENL_SET_ERR_MSG(info, "missing local or remote port"); + return -EINVAL; + } + + sk =3D &msk->sk.icsk_inet.sk; + ssk =3D mptcp_nl_find_ssk(msk, &addr_l, &addr_r); + if (ssk) { + struct mptcp_subflow_context *subflow =3D mptcp_subflow_ctx(ssk); + + mptcp_subflow_shutdown(sk, ssk, RCV_SHUTDOWN | SEND_SHUTDOWN); + mptcp_close_ssk(sk, ssk, subflow); + } else { + ret =3D -ESRCH; + } + + return ret; +} + static const struct genl_small_ops mptcp_pm_ops[] =3D { { .cmd =3D MPTCP_PM_CMD_ADD_ADDR, @@ -2548,6 +2742,16 @@ static const struct genl_small_ops mptcp_pm_ops[] = =3D { .doit =3D mptcp_nl_cmd_remove, .flags =3D GENL_ADMIN_PERM, }, + { + .cmd =3D MPTCP_PM_CMD_SUBFLOW_CREATE, + .doit =3D mptcp_nl_cmd_sf_create, + .flags =3D GENL_ADMIN_PERM, + }, + { + .cmd =3D MPTCP_PM_CMD_SUBFLOW_DESTROY, + .doit =3D mptcp_nl_cmd_sf_destroy, + .flags =3D GENL_ADMIN_PERM, + }, }; =20 static struct genl_family mptcp_genl_family __ro_after_init =3D { --=20 2.31.1 From nobody Fri Mar 29 02:34:01 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp690389jap; Thu, 16 Dec 2021 14:24:34 -0800 (PST) X-Google-Smtp-Source: ABdhPJzIh5/XBGzpGKKrousFp6Mm+utc1BJHKn50v2wXatJq7WqnS8k5eau4A0X1UYyGk2e0u9uA X-Received: by 2002:a17:90b:1e4f:: with SMTP id pi15mr8538216pjb.181.1639693474017; Thu, 16 Dec 2021 14:24:34 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1639693474; cv=none; d=google.com; s=arc-20160816; b=nwPZmgarb7cQJ9CtJYPiYvuNBpvxCEwNdwHMbF1hruTP2V0NxzBLXZ40lG46YzxrbY lj/dsRh+1Q57jp1LyZMTBPbnASWa5OCH+vOmjHyWQFi2IWjLKgwXj3cyXAWggbYoSkuh MFUku/Z1HV9KPoYhfB3xXh4vTlmmCuBjrAH5Q1dwfxBwN6X3spWYVlaFYycXjHaid+UW aVUl1X21K1sJXVufJzzvuzV/kMCqUpyFYEc1BGA5WqQ54QeQ8r+08xWUwlPJ0+jyvhhK 2NcepbP+Ufb8gHVZlW6JMfKP8o6L5gJPyWCND8lFvuwQQrmL8C1ayLAa/RTg8pkFtxTE Rfpw== 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=aaF28Y6kRHgml4YSjiTWTx4Qov3d84Cygc6WaArZPWY=; b=tcro0LXXDoQFSx3RRJEyaYrCGpUTQKcKspDYsRxT26ScmqaHjCAX+RZgyM0TSloASU Ga83aPIsyzWdUoIxwzwGIqd2OIF6ZXbNhoIQy1YZclCkTi73M+y9FuHsfIUI/Q5iROdw JTC9IvEcXpPDRXvOMb49IMRMqW1JfKJ54njdC3j1pTwgzcMUFZZQSGNONWArxnrGvxfb Y4ZJ1pD729IGEchO5ss60EmiuxuF6dVGGZUESb61JK/6pPqTS8cwC4/OmB+/MZK1dMlJ poD6n4z4YtV4Fh52DdZs5kZ3F0ow/M9f2nLF5B1ZucKAlvPiXkWscQ+tLHB0wHXzTGfG ob9g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=Dcs4NyRa; spf=pass (google.com: domain of mptcp+bounces-2811-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2811-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 u20si3599349plc.582.2021.12.16.14.24.33 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 16 Dec 2021 14:24:34 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2811-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=Dcs4NyRa; spf=pass (google.com: domain of mptcp+bounces-2811-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2811-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 86E793E1016 for ; Thu, 16 Dec 2021 22:24:33 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 79ED06D1B; Thu, 16 Dec 2021 22:24:23 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) (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 110813FEF for ; Thu, 16 Dec 2021 22:24:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1639693462; x=1671229462; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=Ss88/Z8cZv+ydYrIK8WiMimZ5J5bKagfo/OUsPdr2NA=; b=Dcs4NyRa61/uJLkA/Y+a/46hmbpoTi1d3gVMdu8cjbM1LCp0Jpl47Nv/ TjXLAiRueaFewPxlgHoOmHHfZnZLHd8/0pqwVfWK2obxSrSJ0bPOkUt6D yK0yX2kxTEgSBkgdKbZndjGLuAhM/8fp12HtJoMbgrHlmjOdfepSKoXg2 gcwxbG//ESl2ufms1uP+RFI7joxjUi8qlf0MhH5U4QLtkEn57sx+Brv4d bhCiIyb1RwM2Ar5soTXP8RJLIkYBGKLD7W/uxvyNXUAsSh7W8rnws5AEC sZ+FNWNkJKEVCTUELAatxQb6VCyQE2tTU6sBoHy1ogLncDQL6cEyrsw4w w==; X-IronPort-AV: E=McAfee;i="6200,9189,10200"; a="300393174" X-IronPort-AV: E=Sophos;i="5.88,212,1635231600"; d="scan'208";a="300393174" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Dec 2021 14:24:10 -0800 X-IronPort-AV: E=Sophos;i="5.88,212,1635231600"; d="scan'208";a="519461280" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Dec 2021 14:24:10 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next 18/21] mptcp: selftests: support MPTCP_PM_CMD_SUBFLOW_CREATE Date: Thu, 16 Dec 2021 17:23:11 -0500 Message-Id: <20211216222314.1244708-19-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20211216222314.1244708-1-kishen.maloor@intel.com> References: <20211216222314.1244708-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 updates the "pm_nl_ctl" testing sample with a "csf" (create subflow) option to support the newly added netlink interface command MPTCP_PM_CMD_SUBFLOW_CREATE over the chosen MPTCP connection. E.g. ./pm_nl_ctl csf lip 10.0.2.1 lid 23 rip 10.0.2.2 rport 56789 token 823274047 Signed-off-by: Kishen Maloor --- tools/testing/selftests/net/mptcp/pm_nl_ctl.c | 129 ++++++++++++++++++ 1 file changed, 129 insertions(+) diff --git a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c b/tools/testing/= selftests/net/mptcp/pm_nl_ctl.c index 8892bf16693a..e3ae1d851a39 100644 --- a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c +++ b/tools/testing/selftests/net/mptcp/pm_nl_ctl.c @@ -29,6 +29,7 @@ static void syntax(char *argv[]) fprintf(stderr, "\tadd [flags signal|subflow|backup|fullmesh] [id ] [= dev ] \n"); fprintf(stderr, "\tann id token [port ] [dev ]\n"); fprintf(stderr, "\trem id token \n"); + fprintf(stderr, "\tcsf lip lid rip rpor= t token \n"); fprintf(stderr, "\tdel []\n"); fprintf(stderr, "\tget \n"); fprintf(stderr, "\tset [flags backup|nobackup]\n"); @@ -173,6 +174,132 @@ static int resolve_mptcp_pm_netlink(int fd) return genl_parse_getfamily((void *)data); } =20 +int csf(int fd, int pm_family, int argc, char *argv[]) +{ + char data[NLMSG_ALIGN(sizeof(struct nlmsghdr)) + + NLMSG_ALIGN(sizeof(struct genlmsghdr)) + + 1024]; + const char *params[5]; + struct nlmsghdr *nh; + struct rtattr *addr; + struct rtattr *rta; + u_int16_t family; + u_int32_t token; + u_int16_t port; + int addr_start; + u_int8_t id; + int off =3D 0; + int arg; + + memset(params, 0, 5 * sizeof(const char *)); + + memset(data, 0, sizeof(data)); + nh =3D (void *)data; + off =3D init_genl_req(data, pm_family, MPTCP_PM_CMD_SUBFLOW_CREATE, + MPTCP_PM_VER); + + if (argc < 12) + syntax(argv); + + /* Params recorded in this order: + * , , , , + */ + for (arg =3D 2; arg < argc; arg++) { + if (!strcmp(argv[arg], "lip")) { + if (++arg >=3D argc) + error(1, 0, " missing local IP"); + + params[0] =3D argv[arg]; + } else if (!strcmp(argv[arg], "lid")) { + if (++arg >=3D argc) + error(1, 0, " missing local id"); + + params[1] =3D argv[arg]; + } else if (!strcmp(argv[arg], "rip")) { + if (++arg >=3D argc) + error(1, 0, " missing remote ip"); + + params[2] =3D argv[arg]; + } else if (!strcmp(argv[arg], "rport")) { + if (++arg >=3D argc) + error(1, 0, " missing remote port"); + + params[3] =3D argv[arg]; + } else if (!strcmp(argv[arg], "token")) { + if (++arg >=3D argc) + error(1, 0, " missing token"); + + params[4] =3D argv[arg]; + } else + error(1, 0, "unknown param %s", argv[arg]); + } + + for (arg =3D 0; arg < 4; arg =3D arg + 2) { + /* addr header */ + addr_start =3D off; + addr =3D (void *)(data + off); + addr->rta_type =3D NLA_F_NESTED | + ((arg =3D=3D 0) ? MPTCP_PM_ATTR_ADDR : MPTCP_PM_ATTR_ADDR_REMOTE); + addr->rta_len =3D RTA_LENGTH(0); + off +=3D NLMSG_ALIGN(addr->rta_len); + + /* addr data */ + rta =3D (void *)(data + off); + if (inet_pton(AF_INET, params[arg], RTA_DATA(rta))) { + family =3D AF_INET; + rta->rta_type =3D MPTCP_PM_ADDR_ATTR_ADDR4; + rta->rta_len =3D RTA_LENGTH(4); + } else if (inet_pton(AF_INET6, params[arg], RTA_DATA(rta))) { + family =3D AF_INET6; + rta->rta_type =3D MPTCP_PM_ADDR_ATTR_ADDR6; + rta->rta_len =3D RTA_LENGTH(16); + } else + error(1, errno, "can't parse ip %s", params[arg]); + off +=3D NLMSG_ALIGN(rta->rta_len); + + /* family */ + rta =3D (void *)(data + off); + rta->rta_type =3D MPTCP_PM_ADDR_ATTR_FAMILY; + rta->rta_len =3D RTA_LENGTH(2); + memcpy(RTA_DATA(rta), &family, 2); + off +=3D NLMSG_ALIGN(rta->rta_len); + + if (arg =3D=3D 2) { + /* port */ + port =3D atoi(params[arg + 1]); + rta =3D (void *)(data + off); + rta->rta_type =3D MPTCP_PM_ADDR_ATTR_PORT; + rta->rta_len =3D RTA_LENGTH(2); + memcpy(RTA_DATA(rta), &port, 2); + off +=3D NLMSG_ALIGN(rta->rta_len); + } + + if (arg =3D=3D 0) { + /* id */ + id =3D atoi(params[arg + 1]); + rta =3D (void *)(data + off); + rta->rta_type =3D MPTCP_PM_ADDR_ATTR_ID; + rta->rta_len =3D RTA_LENGTH(1); + memcpy(RTA_DATA(rta), &id, 1); + off +=3D NLMSG_ALIGN(rta->rta_len); + } + + addr->rta_len =3D off - addr_start; + } + + /* token */ + token =3D atoi(params[4]); + rta =3D (void *)(data + off); + rta->rta_type =3D MPTCP_PM_ATTR_TOKEN; + rta->rta_len =3D RTA_LENGTH(4); + memcpy(RTA_DATA(rta), &token, 4); + off +=3D NLMSG_ALIGN(rta->rta_len); + + do_nl_req(fd, nh, off, 0); + + return 0; +} + int remove_addr(int fd, int pm_family, int argc, char *argv[]) { char data[NLMSG_ALIGN(sizeof(struct nlmsghdr)) + @@ -926,6 +1053,8 @@ int main(int argc, char *argv[]) return announce_addr(fd, pm_family, argc, argv); else if (!strcmp(argv[1], "rem")) return remove_addr(fd, pm_family, argc, argv); + else if (!strcmp(argv[1], "csf")) + return csf(fd, pm_family, argc, argv); else if (!strcmp(argv[1], "del")) return del_addr(fd, pm_family, argc, argv); else if (!strcmp(argv[1], "flush")) --=20 2.31.1 From nobody Fri Mar 29 02:34:01 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp690402jap; Thu, 16 Dec 2021 14:24:35 -0800 (PST) X-Google-Smtp-Source: ABdhPJxjCr/UjHIfG8jwfPDODeiwVZ3VbkhwHkywXwZH2tpkVYYIEkuFKEqlCrvMgp+BW19ZM3Fp X-Received: by 2002:ad4:5f88:: with SMTP id jp8mr17995355qvb.57.1639693475123; Thu, 16 Dec 2021 14:24:35 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1639693475; cv=none; d=google.com; s=arc-20160816; b=vfW0FVmbt46qIY8Bd6teWbYahkNzw4RmhkDWr/6+ZtfU5JJQX9q+x1wdE+lUj0MpnX 8IJg0NdDkzuwG0QWEgogb8VNuGZELco7SjOk4DhHMrFIZv3mkU896i9ORUKhEFguUmd5 5vWq/B1N6FCTuq73rEW5IMmS/BLacoudTisEHO5KYFSEr5H2H0O2L8BpZgV54x4rbrdX /81fFRD4qCEQPIpOpl0pOxpagYlQLhnfAnBGFLcIVR6QLe3YsyFqdmV1V7ee5TeHFOjY m4oiNnbIIZvOGqIBqZGklV6LUfZfswoYvDwhLRboBsmIZV0Ul2yK4UdBsRH+LdlYMgz6 sqqQ== 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=Om8UMeADGqSJI03ceuPlAEuzwDxt6YSGnmTV/+H+GJY=; b=qlftTzc3kqG4qBNrTsC7ZIHzgEz56F0g/Sx2Uc2/w8GnO/EKCIEXLq7mp9xIURxwvx KckYFuhhvojNBx86npW3QcDDjep7DsjFOi+tIsNWNWBpEVkRsj7aHqsTXPiIXyVFhj7q 9kR0Q4eZBwv5k9bxsuARHn8Ww8Q3JvMHW+LpRiUzkSyYyCi8EhU2Au2LKXJEktyRlI3F VcR1ZfmwjdgqkR/CQcCOzkGyjc3HLNCHmelEX3WhTx+uIJaY3hIGqArJOsIJ/pBNk6EQ Inyb8a+8OuyU0klo2ZpSeBCXYdkCuD8augCNHNE7nLwKlUAao04CzB9XBXcJKlkbZM/E opwg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b="WZx/83pd"; spf=pass (google.com: domain of mptcp+bounces-2812-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-2812-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. [147.75.197.195]) by mx.google.com with ESMTPS id u20si3051150qtw.682.2021.12.16.14.24.35 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 16 Dec 2021 14:24:35 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2812-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) client-ip=147.75.197.195; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b="WZx/83pd"; spf=pass (google.com: domain of mptcp+bounces-2812-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-2812-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 BFFC61C0F28 for ; Thu, 16 Dec 2021 22:24:34 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 29A336D24; Thu, 16 Dec 2021 22:24:24 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) (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 A52B66D17 for ; Thu, 16 Dec 2021 22:24:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1639693462; x=1671229462; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=5IRYVf+yP3lJeyrB8sJznCtfheJgIQEIASvT93RX78M=; b=WZx/83pdDnqXY+FnSMK6BEdaA074nYuR11MzHpEivr2nErD2yWRxIV0q xk2ImL4zsQfo/wFcQz3+vxmKqqzQVaNSQmt280LbbvpNLX3yZpRyTsEwC 8Ce0i7zqWsfXn8bsHBjrYgRZbVUhdnpruaGj7KgYgczBP/PzPu1FDLh4u J8c71fA8ivCRvSvzXq9kZRVIJb4vQ98qJGNmEh9aNw+aVmERo5RYAvrrB Ul58DHONeV4C4v4nSh8E9EfiG6Ss4jFomaY72zt2P/R49987Z36//ARi5 7T+/U4QKUupyCAo39aBKjUahQidQosOQNV0MJr0s1mJCEuXwyNxBMg5AD g==; X-IronPort-AV: E=McAfee;i="6200,9189,10200"; a="300393175" X-IronPort-AV: E=Sophos;i="5.88,212,1635231600"; d="scan'208";a="300393175" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Dec 2021 14:24:11 -0800 X-IronPort-AV: E=Sophos;i="5.88,212,1635231600"; d="scan'208";a="519461283" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Dec 2021 14:24:10 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next 19/21] mptcp: selftests: support MPTCP_PM_CMD_SUBFLOW_DESTROY Date: Thu, 16 Dec 2021 17:23:12 -0500 Message-Id: <20211216222314.1244708-20-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20211216222314.1244708-1-kishen.maloor@intel.com> References: <20211216222314.1244708-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 updates the "pm_nl_ctl" testing sample with a "dsf" (destroy subflow) option to support the newly added netlink interface command MPTCP_PM_CMD_SUBFLOW_DESTROY over the chosen MPTCP connection. E.g. ./pm_nl_ctl dsf lip 10.0.2.1 lport 44567 rip 10.0.2.2 rport 56789 token 823274047 Signed-off-by: Kishen Maloor --- tools/testing/selftests/net/mptcp/pm_nl_ctl.c | 115 ++++++++++++++++++ 1 file changed, 115 insertions(+) diff --git a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c b/tools/testing/= selftests/net/mptcp/pm_nl_ctl.c index e3ae1d851a39..f28d80895a9c 100644 --- a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c +++ b/tools/testing/selftests/net/mptcp/pm_nl_ctl.c @@ -30,6 +30,7 @@ static void syntax(char *argv[]) fprintf(stderr, "\tann id token [port ] [dev ]\n"); fprintf(stderr, "\trem id token \n"); fprintf(stderr, "\tcsf lip lid rip rpor= t token \n"); + fprintf(stderr, "\tdsf lip lport rip = rport token \n"); fprintf(stderr, "\tdel []\n"); fprintf(stderr, "\tget \n"); fprintf(stderr, "\tset [flags backup|nobackup]\n"); @@ -174,6 +175,118 @@ static int resolve_mptcp_pm_netlink(int fd) return genl_parse_getfamily((void *)data); } =20 +int dsf(int fd, int pm_family, int argc, char *argv[]) +{ + char data[NLMSG_ALIGN(sizeof(struct nlmsghdr)) + + NLMSG_ALIGN(sizeof(struct genlmsghdr)) + + 1024]; + struct rtattr *rta, *addr; + u_int16_t family, port; + struct nlmsghdr *nh; + u_int32_t token; + int addr_start; + int off =3D 0; + int arg; + + const char *params[5]; + + memset(params, 0, 5 * sizeof(const char *)); + + memset(data, 0, sizeof(data)); + nh =3D (void *)data; + off =3D init_genl_req(data, pm_family, MPTCP_PM_CMD_SUBFLOW_DESTROY, + MPTCP_PM_VER); + + if (argc < 12) + syntax(argv); + + /* Params recorded in this order: + * , , , , + */ + for (arg =3D 2; arg < argc; arg++) { + if (!strcmp(argv[arg], "lip")) { + if (++arg >=3D argc) + error(1, 0, " missing local IP"); + + params[0] =3D argv[arg]; + } else if (!strcmp(argv[arg], "lport")) { + if (++arg >=3D argc) + error(1, 0, " missing local port"); + + params[1] =3D argv[arg]; + } else if (!strcmp(argv[arg], "rip")) { + if (++arg >=3D argc) + error(1, 0, " missing remote IP"); + + params[2] =3D argv[arg]; + } else if (!strcmp(argv[arg], "rport")) { + if (++arg >=3D argc) + error(1, 0, " missing remote port"); + + params[3] =3D argv[arg]; + } else if (!strcmp(argv[arg], "token")) { + if (++arg >=3D argc) + error(1, 0, " missing token"); + + params[4] =3D argv[arg]; + } else + error(1, 0, "unknown keyword %s", argv[arg]); + } + + for (arg =3D 0; arg < 4; arg =3D arg + 2) { + /* addr header */ + addr_start =3D off; + addr =3D (void *)(data + off); + addr->rta_type =3D NLA_F_NESTED | + ((arg =3D=3D 0) ? MPTCP_PM_ATTR_ADDR : MPTCP_PM_ATTR_ADDR_REMOTE); + addr->rta_len =3D RTA_LENGTH(0); + off +=3D NLMSG_ALIGN(addr->rta_len); + + /* addr data */ + rta =3D (void *)(data + off); + if (inet_pton(AF_INET, params[arg], RTA_DATA(rta))) { + family =3D AF_INET; + rta->rta_type =3D MPTCP_PM_ADDR_ATTR_ADDR4; + rta->rta_len =3D RTA_LENGTH(4); + } else if (inet_pton(AF_INET6, params[arg], RTA_DATA(rta))) { + family =3D AF_INET6; + rta->rta_type =3D MPTCP_PM_ADDR_ATTR_ADDR6; + rta->rta_len =3D RTA_LENGTH(16); + } else + error(1, errno, "can't parse ip %s", params[arg]); + off +=3D NLMSG_ALIGN(rta->rta_len); + + /* family */ + rta =3D (void *)(data + off); + rta->rta_type =3D MPTCP_PM_ADDR_ATTR_FAMILY; + rta->rta_len =3D RTA_LENGTH(2); + memcpy(RTA_DATA(rta), &family, 2); + off +=3D NLMSG_ALIGN(rta->rta_len); + + /* port */ + port =3D atoi(params[arg + 1]); + rta =3D (void *)(data + off); + rta->rta_type =3D MPTCP_PM_ADDR_ATTR_PORT; + rta->rta_len =3D RTA_LENGTH(2); + memcpy(RTA_DATA(rta), &port, 2); + off +=3D NLMSG_ALIGN(rta->rta_len); + + addr->rta_len =3D off - addr_start; + } + + /* token */ + token =3D atoi(params[4]); + rta =3D (void *)(data + off); + rta->rta_type =3D MPTCP_PM_ATTR_TOKEN; + rta->rta_len =3D RTA_LENGTH(4); + memcpy(RTA_DATA(rta), &token, 4); + off +=3D NLMSG_ALIGN(rta->rta_len); + + do_nl_req(fd, nh, off, 0); + + return 0; +} + int csf(int fd, int pm_family, int argc, char *argv[]) { char data[NLMSG_ALIGN(sizeof(struct nlmsghdr)) + @@ -1055,6 +1168,8 @@ int main(int argc, char *argv[]) return remove_addr(fd, pm_family, argc, argv); else if (!strcmp(argv[1], "csf")) return csf(fd, pm_family, argc, argv); + else if (!strcmp(argv[1], "dsf")) + return dsf(fd, pm_family, argc, argv); else if (!strcmp(argv[1], "del")) return del_addr(fd, pm_family, argc, argv); else if (!strcmp(argv[1], "flush")) --=20 2.31.1 From nobody Fri Mar 29 02:34:01 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp690415jap; Thu, 16 Dec 2021 14:24:36 -0800 (PST) X-Google-Smtp-Source: ABdhPJwBGn9u6X9onKOR9ykpNriVGvF8zI2TXbPlB7IjedEZ3CG8GEGdP3caE3Pix+nVbUn8vnKH X-Received: by 2002:a63:5007:: with SMTP id e7mr213397pgb.295.1639693476175; Thu, 16 Dec 2021 14:24:36 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1639693476; cv=none; d=google.com; s=arc-20160816; b=R5EE2YqaGd+D55s0lRCwIwpA8b0QebOP3NufYrXYF71B0zO283DP6PYYdkfgJwiG6o lgAoYGAsEpiFdWkO41A76bhgKMeVBFSQkRGRbhXpAKIMMoqFnjSYUwIow+tCvSJiWatd UESvoUM1/A9ZuLFeOafitgd0J886JZERbfdaVpq9DjfQeQKHdFRd7sx2yvT7rGAr9G0X +wPEytUIDGH4vO12MGhk5OD3GOC8886He2BpJvq6lK9LBi/HWW/Zt89KYM/4Hi5t2dPE IaR85HQ5qRIOkGteHpReyhonHiVy2yqFxYEc/2eTyEcjiicvkEsU4FAbDS3OPYpKfEBP VQ5g== 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=4IfFAxZjJ+k03XW9tVSVdEjyTvlVrxPHTzYXQvNaQQo=; b=pQwIdQm/KsB2bRpHRVh8JKFW0ZhdslQSj3gY0WDX4BisCDECmqduafgKhaRlSsjTOH 4c9UutSMlkL4hXjiTq2nacKgy+fJgjpqtVqZyT8n18a0XOoXjjH8bENyRIYGb1ZTvG8h 9btrHwmFot4VJwrYpDznZ+lc8Pr8+8SNHSAMGHftrS3jsWecC2z0oJ7KQQys+31fJ4df 8u6iDnAstg7gsZM4ZDewNhZR21AUBY0r1vFbKH/jiSnS4Pf/EBaNZkx9tW9lYCWD+ehV 6EQJXdFWimPAVBu9SM5BZUd5utdlpj+M0Owp5zmLMzzw2NnBIS3dT3B1wksLYgfdyWa2 sMSw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=DxaFjkuw; spf=pass (google.com: domain of mptcp+bounces-2813-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2813-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 k12si6340066pgj.869.2021.12.16.14.24.36 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 16 Dec 2021 14:24:36 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2813-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=DxaFjkuw; spf=pass (google.com: domain of mptcp+bounces-2813-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-2813-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 8BDA63E0F66 for ; Thu, 16 Dec 2021 22:24:35 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 94B976D38; Thu, 16 Dec 2021 22:24:24 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) (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 043B96D19 for ; Thu, 16 Dec 2021 22:24:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1639693463; x=1671229463; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=SpQSoRkJ6B9AFRZXa1jjD1SxMeiy+knK/KaJ3iCYi+8=; b=DxaFjkuwhyJAfzWtBbgnAm6zWbJq8vSpComW0pXebMOpXymEgxOh0hA8 soBhEn/2/4BTRhjPcHcmCHpzu0FwU9AOanbmlYtkPlyjRVhK2w6kzfLvp T4js/7flEEyuVvalVKYAre/1Ujw6wrWAyYdBL4O33GJbj4A7P8Aym7SO9 WOb2bFrBInqMw9ivMz0ib5Vl24aydaLjKVmzt/BjnmmCeb6P5KuJm/ckv gYzZLIHkONxGfeQulLJQMxZifjg8zNsYPIMDYY4EPNxB20RR55Bp19HUA l/gBHCIiGXFkyiTpB55o8LlT6qVVnjh1kqUU/Xo6+F1Q/CEf8zn9RgfJI g==; X-IronPort-AV: E=McAfee;i="6200,9189,10200"; a="300393177" X-IronPort-AV: E=Sophos;i="5.88,212,1635231600"; d="scan'208";a="300393177" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Dec 2021 14:24:11 -0800 X-IronPort-AV: E=Sophos;i="5.88,212,1635231600"; d="scan'208";a="519461287" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Dec 2021 14:24:11 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next 20/21] mptcp: selftests: capture netlink events Date: Thu, 16 Dec 2021 17:23:13 -0500 Message-Id: <20211216222314.1244708-21-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20211216222314.1244708-1-kishen.maloor@intel.com> References: <20211216222314.1244708-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 adds to self-testing support for the MPTCP netlink interface by capturing various MPTCP netlink events (and all their metadata) associated with connections, subflows and local address announcements. It can be incorporated into self-test scripts that exercise the MPTCP netlink commands to then precisely validate those operations through the dispatched MPTCP netlink events in response to those commands. Signed-off-by: Kishen Maloor --- tools/testing/selftests/net/mptcp/pm_nl_ctl.c | 161 +++++++++++++++++- 1 file changed, 154 insertions(+), 7 deletions(-) diff --git a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c b/tools/testing/= selftests/net/mptcp/pm_nl_ctl.c index f28d80895a9c..e770df9b0e2a 100644 --- a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c +++ b/tools/testing/selftests/net/mptcp/pm_nl_ctl.c @@ -22,6 +22,9 @@ #ifndef MPTCP_PM_NAME #define MPTCP_PM_NAME "mptcp_pm" #endif +#ifndef MPTCP_PM_EVENTS +#define MPTCP_PM_EVENTS "mptcp_pm_events" +#endif =20 static void syntax(char *argv[]) { @@ -37,6 +40,7 @@ static void syntax(char *argv[]) fprintf(stderr, "\tflush\n"); fprintf(stderr, "\tdump\n"); fprintf(stderr, "\tlimits [ ]\n"); + fprintf(stderr, "\tevents\n"); exit(0); } =20 @@ -88,6 +92,105 @@ static void nl_error(struct nlmsghdr *nh) } } =20 +static int capture_events(int fd, int event_group) +{ + u_int8_t buffer[NLMSG_ALIGN(sizeof(struct nlmsghdr)) + + NLMSG_ALIGN(sizeof(struct genlmsghdr)) + 1024]; + struct genlmsghdr *ghdr; + struct rtattr *attrs; + struct nlmsghdr *nh; + int ret =3D 0; + int res_len; + int msg_len; + fd_set rfds; + + if (setsockopt(fd, SOL_NETLINK, NETLINK_ADD_MEMBERSHIP, + &event_group, sizeof(event_group)) < 0) + error(1, errno, "could not join the " MPTCP_PM_EVENTS " mcast group"); + + do { + FD_ZERO(&rfds); + FD_SET(fd, &rfds); + res_len =3D NLMSG_ALIGN(sizeof(struct nlmsghdr)) + + NLMSG_ALIGN(sizeof(struct genlmsghdr)) + 1024; + + ret =3D select(FD_SETSIZE, &rfds, NULL, NULL, NULL); + + if (ret < 0) + error(1, ret, "error in select() on NL socket"); + + res_len =3D recv(fd, buffer, res_len, 0); + if (res_len < 0) + error(1, res_len, "error on recv() from NL socket"); + + nh =3D (struct nlmsghdr *)buffer; + + for (; NLMSG_OK(nh, res_len); nh =3D NLMSG_NEXT(nh, res_len)) { + if (nh->nlmsg_type =3D=3D NLMSG_ERROR) + error(1, NLMSG_ERROR, "received invalid NL message"); + + ghdr =3D (struct genlmsghdr *)NLMSG_DATA(nh); + + if (ghdr->cmd =3D=3D 0) + continue; + + fprintf(stderr, "type:%d", ghdr->cmd); + + msg_len =3D nh->nlmsg_len - NLMSG_LENGTH(GENL_HDRLEN); + + attrs =3D (struct rtattr *) ((char *) ghdr + GENL_HDRLEN); + while (RTA_OK(attrs, msg_len)) { + if (attrs->rta_type =3D=3D MPTCP_ATTR_TOKEN) + fprintf(stderr, ",token:%u", *(__u32 *)RTA_DATA(attrs)); + else if (attrs->rta_type =3D=3D MPTCP_ATTR_FAMILY) + fprintf(stderr, ",family:%u", *(__u16 *)RTA_DATA(attrs)); + else if (attrs->rta_type =3D=3D MPTCP_ATTR_LOC_ID) + fprintf(stderr, ",loc_id:%u", *(__u8 *)RTA_DATA(attrs)); + else if (attrs->rta_type =3D=3D MPTCP_ATTR_REM_ID) + fprintf(stderr, ",rem_id:%u", *(__u8 *)RTA_DATA(attrs)); + else if (attrs->rta_type =3D=3D MPTCP_ATTR_SADDR4) { + u_int32_t saddr4 =3D ntohl(*(__u32 *)RTA_DATA(attrs)); + + fprintf(stderr, ",saddr4:%u.%u.%u.%u", saddr4 >> 24, + (saddr4 >> 16) & 0xFF, (saddr4 >> 8) & 0xFF, + (saddr4 & 0xFF)); + } else if (attrs->rta_type =3D=3D MPTCP_ATTR_SADDR6) { + char buf[INET6_ADDRSTRLEN]; + + if (inet_ntop(AF_INET6, RTA_DATA(attrs), buf, + sizeof(buf)) !=3D NULL) + fprintf(stderr, ",saddr6:%s", buf); + } else if (attrs->rta_type =3D=3D MPTCP_ATTR_DADDR4) { + u_int32_t daddr4 =3D ntohl(*(__u32 *)RTA_DATA(attrs)); + + fprintf(stderr, ",daddr4:%u.%u.%u.%u", daddr4 >> 24, + (daddr4 >> 16) & 0xFF, (daddr4 >> 8) & 0xFF, + (daddr4 & 0xFF)); + } else if (attrs->rta_type =3D=3D MPTCP_ATTR_DADDR6) { + char buf[INET6_ADDRSTRLEN]; + + if (inet_ntop(AF_INET6, RTA_DATA(attrs), buf, + sizeof(buf)) !=3D NULL) + fprintf(stderr, ",daddr6:%s", buf); + } else if (attrs->rta_type =3D=3D MPTCP_ATTR_SPORT) + fprintf(stderr, ",sport:%u", + ntohs(*(__u16 *)RTA_DATA(attrs))); + else if (attrs->rta_type =3D=3D MPTCP_ATTR_DPORT) + fprintf(stderr, ",dport:%u", + ntohs(*(__u16 *)RTA_DATA(attrs))); + else if (attrs->rta_type =3D=3D MPTCP_ATTR_BACKUP) + fprintf(stderr, ",backup:%u", *(__u8 *)RTA_DATA(attrs)); + else if (attrs->rta_type =3D=3D MPTCP_ATTR_ERROR) + fprintf(stderr, ",error:%u", *(__u8 *)RTA_DATA(attrs)); + attrs =3D RTA_NEXT(attrs, msg_len); + } + } + fprintf(stderr, "\n"); + } while (1); + + return 0; +} + /* do a netlink command and, if max > 0, fetch the reply */ static int do_nl_req(int fd, struct nlmsghdr *nh, int len, int max) { @@ -121,11 +224,18 @@ static int do_nl_req(int fd, struct nlmsghdr *nh, int= len, int max) return ret; } =20 -static int genl_parse_getfamily(struct nlmsghdr *nlh) +static int genl_parse_getfamily(struct nlmsghdr *nlh, int *pm_family, + int *events_mcast_grp) { struct genlmsghdr *ghdr =3D NLMSG_DATA(nlh); int len =3D nlh->nlmsg_len; struct rtattr *attrs; + struct rtattr *grps; + struct rtattr *grp; + int got_events_grp; + int got_family; + int grps_len; + int grp_len; =20 if (nlh->nlmsg_type !=3D GENL_ID_CTRL) error(1, errno, "Not a controller message, len=3D%d type=3D0x%x\n", @@ -140,9 +250,42 @@ static int genl_parse_getfamily(struct nlmsghdr *nlh) error(1, errno, "Unknown controller command %d\n", ghdr->cmd); =20 attrs =3D (struct rtattr *) ((char *) ghdr + GENL_HDRLEN); + got_family =3D 0; + got_events_grp =3D 0; + while (RTA_OK(attrs, len)) { - if (attrs->rta_type =3D=3D CTRL_ATTR_FAMILY_ID) - return *(__u16 *)RTA_DATA(attrs); + if (attrs->rta_type =3D=3D CTRL_ATTR_FAMILY_ID) { + *pm_family =3D *(__u16 *)RTA_DATA(attrs); + got_family =3D 1; + } else if (attrs->rta_type =3D=3D CTRL_ATTR_MCAST_GROUPS) { + grps =3D RTA_DATA(attrs); + grps_len =3D RTA_PAYLOAD(attrs); + + while (RTA_OK(grps, grps_len)) { + grp =3D RTA_DATA(grps); + grp_len =3D RTA_PAYLOAD(grps); + got_events_grp =3D 0; + + while (RTA_OK(grp, grp_len)) { + if (grp->rta_type =3D=3D CTRL_ATTR_MCAST_GRP_ID) + *events_mcast_grp =3D *(__u32 *)RTA_DATA(grp); + else if (grp->rta_type =3D=3D CTRL_ATTR_MCAST_GRP_NAME && + !strcmp(RTA_DATA(grp), MPTCP_PM_EVENTS)) + got_events_grp =3D 1; + + grp =3D RTA_NEXT(grp, grp_len); + } + + if (got_events_grp) + break; + + grps =3D RTA_NEXT(grps, grps_len); + } + } + + if (got_family && got_events_grp) + return 0; + attrs =3D RTA_NEXT(attrs, len); } =20 @@ -150,7 +293,7 @@ static int genl_parse_getfamily(struct nlmsghdr *nlh) return -1; } =20 -static int resolve_mptcp_pm_netlink(int fd) +static int resolve_mptcp_pm_netlink(int fd, int *pm_family, int *events_mc= ast_grp) { char data[NLMSG_ALIGN(sizeof(struct nlmsghdr)) + NLMSG_ALIGN(sizeof(struct genlmsghdr)) + @@ -172,7 +315,7 @@ static int resolve_mptcp_pm_netlink(int fd) off +=3D NLMSG_ALIGN(rta->rta_len); =20 do_nl_req(fd, nh, off, sizeof(data)); - return genl_parse_getfamily((void *)data); + return genl_parse_getfamily((void *)data, pm_family, events_mcast_grp); } =20 int dsf(int fd, int pm_family, int argc, char *argv[]) @@ -1149,7 +1292,9 @@ int set_flags(int fd, int pm_family, int argc, char *= argv[]) =20 int main(int argc, char *argv[]) { - int fd, pm_family; + int events_mcast_grp; + int pm_family; + int fd; =20 if (argc < 2) syntax(argv); @@ -1158,7 +1303,7 @@ int main(int argc, char *argv[]) if (fd =3D=3D -1) error(1, errno, "socket netlink"); =20 - pm_family =3D resolve_mptcp_pm_netlink(fd); + resolve_mptcp_pm_netlink(fd, &pm_family, &events_mcast_grp); =20 if (!strcmp(argv[1], "add")) return add_addr(fd, pm_family, argc, argv); @@ -1182,6 +1327,8 @@ int main(int argc, char *argv[]) return get_set_limits(fd, pm_family, argc, argv); else if (!strcmp(argv[1], "set")) return set_flags(fd, pm_family, argc, argv); + else if (!strcmp(argv[1], "events")) + return capture_events(fd, events_mcast_grp); =20 fprintf(stderr, "unknown sub-command: %s", argv[1]); syntax(argv); --=20 2.31.1 From nobody Fri Mar 29 02:34:01 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:cbb9:0:0:0:0:0 with SMTP id v25csp690462jap; Thu, 16 Dec 2021 14:24:38 -0800 (PST) X-Google-Smtp-Source: ABdhPJzALi7jhYgITkHvaJqWH9aE+gBMGg7nLjETCimP8WvlBLn9gc/U/ycvAHFSIzSiC6us1ukd X-Received: by 2002:a37:9d8b:: with SMTP id g133mr137830qke.180.1639693478690; Thu, 16 Dec 2021 14:24:38 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1639693478; cv=none; d=google.com; s=arc-20160816; b=m5z2fcNJsAhD/RXKRADbxt9TfQj6cGZKl/LpGPy3ok4LIzBKZe9abHUWd2fFkdLHhE Po1+nCJtwrW7xGq+GeXsknBKaOx/OHxra4/pix7Lbl7kmL97sWRtu8j8VuxXx2nH+t54 I7F2pWRhIWxNUty246od6nR0fRajFkIVyLRNorpkzYkHtiHiSbAV+NVxyhC/btUigBxd IH+iahmp5mYSsiLcbQsyk60Au9/4kY1T5AcwfLhTeEzNK6mpMZZHl9uUukmBhXx8P0ZY MLP9ugvdr7/JTf+dd/QC+n+MN772ausx2g2UHUTBRVUzH4pVz+MjjbOE7mwfAY4CaLev W9Sg== 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=JXhLQTm9+5gjv18W2Hl6sguvP0lkHxRr1rtjgAEIzYw=; b=sH32Jhp3Y7wNVx5fecGBpisMI9Xp0s1QD6T4YIKh4DgwDgQuNtKy/j1fCxWnMqlxoq gIKqACCLsGJBeXS9ssI0TuQMgkMdXU/Ppti2PzR7t8r+m9BhaNWfqrBofftt5a7UbzfB +6C3gWeNC0nAHA1tzO7hBHhc1f4rAVkad1Hi282OFUfR7IXlQZyn6+jouXDZPAJcV+jW mx17SYH+v8LLh6Jw6Ct9qjejeWqAA1rBPrfj75RdYZk3VJLStlQuMFBTVLLzGYYujGVq lVxeh/ePXfJi3/y9lAbrksbx6npCK2iXAhlFR5V8T+HWK5YsXNm24GWslJf8CP2/S1wG r2dA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=Rai6jNWR; spf=pass (google.com: domain of mptcp+bounces-2815-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-2815-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. [147.75.197.195]) by mx.google.com with ESMTPS id w4si2835342qkb.529.2021.12.16.14.24.38 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 16 Dec 2021 14:24:38 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-2815-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) client-ip=147.75.197.195; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=Rai6jNWR; spf=pass (google.com: domain of mptcp+bounces-2815-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-2815-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 6CC411C0D42 for ; Thu, 16 Dec 2021 22:24:38 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 695906D22; Thu, 16 Dec 2021 22:24:26 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) (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 6108A6D17 for ; Thu, 16 Dec 2021 22:24:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1639693464; x=1671229464; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=Q7CmIqaenr8RLcmT26cLNGN4xPMGG9oaDiIKoem23Kk=; b=Rai6jNWRlL7p7gVr9fS0vkPPHTlyWlrGd+5eXbxXqjNIMk0HG8UVKBHZ KCLKGPit7Akuc+Y2OPrF29wpLRyREVvQGYY2geLo+2Bi9kx8b53u11yp5 fQ4NI8Km2XF2N5ZyitOXRjRuywMfy8WI7DaZcGe2bpmRiKNIeFYQbICAZ ZXDMBTD6Fk5WkpQ9htDKNWftfdk50OWwCURKkzskM/siCcbEFGf+XIm6v vLmD1ATYxKjUiu3VG8rKZsJviFT9JIOXTlzJICZn/mGOnUeXc8hxJxDOS 8mWl8PJkWEih1EIHIJNb9jCZbRmm2SyolbzRAkaT+cquEnYf/bPdrIol4 Q==; X-IronPort-AV: E=McAfee;i="6200,9189,10200"; a="300393178" X-IronPort-AV: E=Sophos;i="5.88,212,1635231600"; d="scan'208";a="300393178" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Dec 2021 14:24:11 -0800 X-IronPort-AV: E=Sophos;i="5.88,212,1635231600"; d="scan'208";a="519461289" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Dec 2021 14:24:11 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next 21/21] selftests: mptcp: functional tests for the userspace PM type Date: Thu, 16 Dec 2021 17:23:14 -0500 Message-Id: <20211216222314.1244708-22-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20211216222314.1244708-1-kishen.maloor@intel.com> References: <20211216222314.1244708-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 adds a selftest script that performs a comprehensive behavioral/functional test of all userspace PM capabilities by exercising all the newly added APIs and changes to support said capabilities. Signed-off-by: Kishen Maloor --- .../selftests/net/mptcp/userspace_pm.sh | 561 ++++++++++++++++++ 1 file changed, 561 insertions(+) create mode 100755 tools/testing/selftests/net/mptcp/userspace_pm.sh diff --git a/tools/testing/selftests/net/mptcp/userspace_pm.sh b/tools/test= ing/selftests/net/mptcp/userspace_pm.sh new file mode 100755 index 000000000000..4149bb0f7cfe --- /dev/null +++ b/tools/testing/selftests/net/mptcp/userspace_pm.sh @@ -0,0 +1,561 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0 + +ip -Version > /dev/null 2>&1 +if [ $? -ne 0 ];then + echo "SKIP: Cannot not run test without ip tool" + exit 1 +fi + +ANNOUNCED=3D6 # MPTCP_EVENT_ANNOUNCED +REMOVED=3D7 # MPTCP_EVENT_REMOVED +SUB_ESTABLISHED=3D10 # MPTCP_EVENT_SUB_ESTABLISHED +SUB_CLOSED=3D11 # MPTCP_EVENT_SUB_CLOSED + +AF_INET=3D2 +AF_INET6=3D10 + +evts_pid=3D0 +client4_pid=3D0 +server4_pid=3D0 +client6_pid=3D0 +server6_pid=3D0 +client4_token=3D"" +server4_token=3D"" +client6_token=3D"" +server6_token=3D"" +client4_port=3D0; +client6_port=3D0; +app4_port=3D50002 +new4_port=3D50003 +app6_port=3D50004 +client_addr_id=3D${RANDOM:0:2} +server_addr_id=3D${RANDOM:0:2} + +sec=3D$(date +%s) +rndh=3D$(printf %x $sec)-$(mktemp -u XXXXXX) +ns1=3D"ns1-$rndh" +ns2=3D"ns2-$rndh" + +cleanup() +{ + echo "cleanup" + + # Terminate the MPTCP connection and related processes + kill -SIGUSR1 $client4_pid > /dev/null 2>&1 + kill $server4_pid > /dev/null 2>&1 + kill -SIGUSR1 $client6_pid > /dev/null 2>&1 + kill $server6_pid > /dev/null 2>&1 + + kill $evts_pid > /dev/null 2>&1 + + local netns + for netns in "$ns1" "$ns2" ;do + ip netns del $netns + done +} + +trap cleanup EXIT + +for i in "$ns1" "$ns2" ;do + ip netns add $i || exit 1 + ip -net $i link set lo up + ip netns exec $i sysctl -q net.mptcp.enabled=3D1 + ip netns exec $i sysctl -q net.mptcp.pm_type=3D1 +done + +# "$ns1" ns2 +# ns1eth2 ns2eth1 + +ip link add ns1eth2 netns "$ns1" type veth peer name ns2eth1 netns "$ns2" + +ip -net "$ns1" addr add 10.0.1.1/24 dev ns1eth2 +ip -net "$ns1" addr add 10.0.2.1/24 dev ns1eth2 +ip -net "$ns1" addr add dead:beef:1::1/64 dev ns1eth2 nodad +ip -net "$ns1" addr add dead:beef:2::1/64 dev ns1eth2 nodad +ip -net "$ns1" link set ns1eth2 up + +ip -net "$ns2" addr add 10.0.1.2/24 dev ns2eth1 +ip -net "$ns2" addr add 10.0.2.2/24 dev ns2eth1 +ip -net "$ns2" addr add dead:beef:1::2/64 dev ns2eth1 nodad +ip -net "$ns2" addr add dead:beef:2::2/64 dev ns2eth1 nodad +ip -net "$ns2" link set ns2eth1 up + +printf "Created network namespaces ns1, ns2 \t\t\t[OK]\n" + +make_file() +{ + local name=3D$1 + local who=3D$2 + local ksize=3D1 + + dd if=3D/dev/urandom of=3D"$name" bs=3D1024 count=3D$ksize 2> /dev/null + echo -e "\nMPTCP_TEST_FILE_END_MARKER" >> "$name" +} + +make_connection() +{ + local file=3D$(mktemp) + make_file "$file" "client" + + local is_v6=3D$1 + local app_port=3D$app4_port + local connect_addr=3D"10.0.1.1" + local listen_addr=3D"0.0.0.0" + if [ "$is_v6" =3D "v6" ] + then + connect_addr=3D"dead:beef:1::1" + listen_addr=3D"::" + app_port=3D$app6_port + else + is_v6=3D"v4" + fi + + local client_evts=3D$(mktemp) + :>"$client_evts" + ip netns exec $ns2 ./pm_nl_ctl events >> "$client_evts" 2>&1 & + local client_evts_pid=3D$! + local server_evts=3D$(mktemp) + :>"$server_evts" + ip netns exec $ns1 ./pm_nl_ctl events >> "$server_evts" 2>&1 & + local server_evts_pid=3D$! + sleep 0.1 + + # Run the server + ip netns exec $ns1 \ + ./mptcp_connect -s MPTCP -w 300 -p $app_port -l $listen_addr 2>&1 > /de= v/null & + local server_pid=3D$! + sleep 0.1 + + # Run the client, transfer $file and stay connected to the server + # to conduct tests + ip netns exec $ns2 \ + ./mptcp_connect -s MPTCP -w 300 -m sendfile -p $app_port $connect_addr = 2>&1 > /dev/null < $file & + local client_pid=3D$! + sleep 0.1 + + kill $client_evts_pid + local client_token=3D$(sed -n 's/.*\(token:\)\([[:digit:]]*\).*$/\2/p;q' = "$client_evts") + local client_port=3D$(sed -n 's/.*\(sport:\)\([[:digit:]]*\).*$/\2/p;q' "= $client_evts") + + kill $server_evts_pid + local server_token=3D$(sed -n 's/.*\(token:\)\([[:digit:]]*\).*$/\2/p;q' = "$server_evts") + rm -f "$client_evts" "$server_evts" "$file" + + if [ $client_token !=3D "" ] && [ $server_token !=3D "" ] + then + printf "Established IP%s MPTCP Connection ns2 =3D> ns1 \t\t[OK]\n" $i= s_v6 + else + exit 1 + fi + + if [ "$is_v6" =3D "v6" ] + then + client6_token=3D$client_token + server6_token=3D$server_token + client6_port=3D$client_port + client6_pid=3D$client_pid + server6_pid=3D$server_pid + else + client4_token=3D$client_token + server4_token=3D$server_token + client4_port=3D$client_port + client4_pid=3D$client_pid + server4_pid=3D$server_pid + fi +} + +verify_announce_event() +{ + local evt=3D$1 + local e_type=3D$2 + local e_token=3D$3 + local e_addr=3D$4 + local e_id=3D$5 + local e_dport=3D$6 + local e_af=3D$7 + + local type=3D$(sed -n 's/.*\(type:\)\([[:digit:]]*\).*$/\2/p;q' "$evt") + local token=3D$(sed -n 's/.*\(token:\)\([[:digit:]]*\).*$/\2/p;q' "$evt") + local addr=3D"" + if [ "$e_af" =3D "v6" ] + then + addr=3D$(sed -n 's/.*\(daddr6:\)\([0-9a-f:.]*\).*$/\2/p;q' "$evt") + else + addr=3D$(sed -n 's/.*\(daddr4:\)\([0-9.]*\).*$/\2/p;q' "$evt") + fi + local dport=3D$(sed -n 's/.*\(dport:\)\([[:digit:]]*\).*$/\2/p;q' "$evt") + local id=3D$(sed -n 's/.*\(rem_id:\)\([[:digit:]]*\).*$/\2/p;q' "$evt") + if [ "$type" =3D "$e_type" ] && [ "$token" =3D "$e_token" ] && [ "= $addr" =3D "$e_addr" ] && [ "$dport" =3D "$e_dport" ] && [ "$id" =3D "$e_id= " ] + then + printf "[OK]\n" + return 0 + fi + printf "[FAIL]\n" + exit 1 +} + +test_announce() +{ + local evts=3D$(mktemp) + :>"$evts" + ip netns exec $ns1 ./pm_nl_ctl events >> "$evts" 2>&1 & + evts_pid=3D$! + sleep 0.1 + + local invalid_token=3D$(( $client4_token - 1)) + ip netns exec $ns2 ./pm_nl_ctl ann 10.0.2.2 token $invalid_token id $clie= nt_addr_id dev ns2eth1 2>&1 > /dev/null + local type=3D$(sed -n 's/.*\(type:\)\([[:digit:]]*\).*$/\2/p;q' "$evts") + printf "ADD_ADDR 10.0.2.2 (ns2) =3D> ns1, invalid token \t\t" + if [ "$type" =3D "" ] + then + printf "[OK]\n" + else + printf "[FAIL]\n" + exit 1 + fi + + :>"$evts" + ip netns exec $ns2 ./pm_nl_ctl ann 10.0.2.2 token $client4_token id $clie= nt_addr_id dev ns2eth1 2>&1 > /dev/null + printf "ADD_ADDR id:%d 10.0.2.2 (ns2) =3D> ns1, reuse port \t\t" $client_= addr_id + sleep 0.1 + verify_announce_event "$evts" "$ANNOUNCED" "$server4_token" "10.0.2.2" "$= client_addr_id" "$client4_port" + + :>"$evts" + ip netns exec $ns2 ./pm_nl_ctl ann dead:beef:2::2 token $client6_token id= $client_addr_id dev ns2eth1 2>&1 > /dev/null + printf "ADD_ADDR6 id:%d dead:beef:2::2 (ns2) =3D> ns1, reuse port\t\t" $c= lient_addr_id + sleep 0.1 + verify_announce_event "$evts" "$ANNOUNCED" "$server6_token" "dead:beef:2:= :2" "$client_addr_id" "$client6_port" "v6" + + :>"$evts" + client_addr_id=3D$((client_addr_id+1)) + ip netns exec $ns2 ./pm_nl_ctl ann 10.0.2.2 token $client4_token id $clie= nt_addr_id dev ns2eth1 port $new4_port 2>&1 > /dev/null + printf "ADD_ADDR id:%d 10.0.2.2 (ns2) =3D> ns1, new port \t\t\t" $client_= addr_id + sleep 0.1 + verify_announce_event "$evts" "$ANNOUNCED" "$server4_token" "10.0.2.2" "$= client_addr_id" "$new4_port" + + kill $evts_pid + + :>"$evts" + ip netns exec $ns2 ./pm_nl_ctl events >> "$evts" 2>&1 & + evts_pid=3D$! + sleep 0.1 + + ip netns exec $ns1 ./pm_nl_ctl ann 10.0.2.1 token $server4_token id $serv= er_addr_id dev ns1eth2 2>&1 > /dev/null + printf "ADD_ADDR id:%d 10.0.2.1 (ns1) =3D> ns2, reuse port \t\t" $server_= addr_id + sleep 0.1 + verify_announce_event "$evts" "$ANNOUNCED" "$client4_token" "10.0.2.1" "$= server_addr_id" "$app4_port" + + :>"$evts" + ip netns exec $ns1 ./pm_nl_ctl ann dead:beef:2::1 token $server6_token id= $server_addr_id dev ns1eth2 2>&1 > /dev/null + printf "ADD_ADDR6 id:%d dead:beef:2::1 (ns1) =3D> ns2, reuse port\t\t" $s= erver_addr_id + sleep 0.1 + verify_announce_event "$evts" "$ANNOUNCED" "$client6_token" "dead:beef:2:= :1" "$server_addr_id" "$app6_port" "v6" + + :>"$evts" + server_addr_id=3D$((server_addr_id+1)) + ip netns exec $ns1 ./pm_nl_ctl ann 10.0.2.1 token $server4_token id $serv= er_addr_id dev ns1eth2 port $new4_port 2>&1 > /dev/null + printf "ADD_ADDR id:%d 10.0.2.1 (ns1) =3D> ns2, new port \t\t\t" $server_= addr_id + sleep 0.1 + verify_announce_event "$evts" "$ANNOUNCED" "$client4_token" "10.0.2.1" "$= server_addr_id" "$new4_port" + + kill $evts_pid + rm -f "$evts" +} + +verify_remove_event() +{ + local evt=3D$1 + local e_type=3D$2 + local e_token=3D$3 + local e_id=3D$4 + + local type=3D$(sed -n 's/.*\(type:\)\([[:digit:]]*\).*$/\2/p;q' "$evt") + local token=3D$(sed -n 's/.*\(token:\)\([[:digit:]]*\).*$/\2/p;q' "$evt") + local id=3D$(sed -n 's/.*\(rem_id:\)\([[:digit:]]*\).*$/\2/p;q' "$evt") + if [ "$type" =3D "$e_type" ] && [ "$token" =3D "$e_token" ] && [ "= $id" =3D "$e_id" ] + then + printf "[OK]\n" + return 0 + fi + printf "[FAIL]\n" + exit 1 +} + +test_remove() +{ + local evts=3D$(mktemp) + :>"$evts" + ip netns exec $ns1 ./pm_nl_ctl events >> "$evts" 2>&1 & + evts_pid=3D$! + sleep 0.1 + + local invalid_token=3D$(( $client4_token - 1 )) + ip netns exec $ns2 ./pm_nl_ctl rem token $invalid_token id $client_addr_i= d 2>&1 > /dev/null + printf "RM_ADDR id:%d ns2 =3D> ns1, invalid token \t" = $client_addr_id + local type=3D$(sed -n 's/.*\(type:\)\([[:digit:]]*\).*$/\2/p;q' "$evts") + if [ "$type" =3D "" ] + then + printf "[OK]\n" + else + printf "[FAIL]\n" + fi + + local invalid_id=3D$(( $client_addr_id + 1 )) + ip netns exec $ns2 ./pm_nl_ctl rem token $client4_token id $invalid_id 2>= &1 > /dev/null + printf "RM_ADDR id:%d ns2 =3D> ns1, invalid id \t" $in= valid_id + type=3D$(sed -n 's/.*\(type:\)\([[:digit:]]*\).*$/\2/p;q' "$evts") + if [ "$type" =3D "" ] + then + printf "[OK]\n" + else + printf "[FAIL]\n" + fi + + :>"$evts" + ip netns exec $ns2 ./pm_nl_ctl rem token $client4_token id $client_addr_i= d 2>&1 > /dev/null + printf "RM_ADDR id:%d ns2 =3D> ns1 \t" $cl= ient_addr_id + sleep 0.1 + verify_remove_event "$evts" "$REMOVED" "$server4_token" "$client_addr_id" + + :>"$evts" + client_addr_id=3D$(( $client_addr_id - 1 )) + ip netns exec $ns2 ./pm_nl_ctl rem token $client4_token id $client_addr_i= d 2>&1 > /dev/null + printf "RM_ADDR id:%d ns2 =3D> ns1 \t" $cl= ient_addr_id + sleep 0.1 + verify_remove_event "$evts" "$REMOVED" "$server4_token" "$client_addr_id" + + :>"$evts" + ip netns exec $ns2 ./pm_nl_ctl rem token $client6_token id $client_addr_i= d 2>&1 > /dev/null + printf "RM_ADDR6 id:%d ns2 =3D> ns1 \t" $cl= ient_addr_id + sleep 0.1 + verify_remove_event "$evts" "$REMOVED" "$server6_token" "$client_addr_id" + + kill $evts_pid + + :>"$evts" + ip netns exec $ns2 ./pm_nl_ctl events >> "$evts" 2>&1 & + evts_pid=3D$! + sleep 0.1 + + ip netns exec $ns1 ./pm_nl_ctl rem token $server4_token id $server_addr_i= d 2>&1 > /dev/null + printf "RM_ADDR id:%d ns1 =3D> ns2 \t" $se= rver_addr_id + sleep 0.1 + verify_remove_event "$evts" "$REMOVED" "$client4_token" "$server_addr_id" + + :>"$evts" + server_addr_id=3D$(( $server_addr_id - 1 )) + ip netns exec $ns1 ./pm_nl_ctl rem token $server4_token id $server_addr_i= d 2>&1 > /dev/null + printf "RM_ADDR id:%d ns1 =3D> ns2 \t" $se= rver_addr_id + sleep 0.1 + verify_remove_event "$evts" "$REMOVED" "$client4_token" "$server_addr_id" + + :>"$evts" + ip netns exec $ns1 ./pm_nl_ctl rem token $server6_token id $server_addr_i= d 2>&1 > /dev/null + printf "RM_ADDR6 id:%d ns1 =3D> ns2 \t" $se= rver_addr_id + sleep 0.1 + verify_remove_event "$evts" "$REMOVED" "$client6_token" "$server_addr_id" + + kill $evts_pid + rm -f "$evts" +} + +verify_subflow_events() +{ + local evt=3D$1 + local e_type=3D$2 + local e_token=3D$3 + local e_family=3D$4 + local e_saddr=3D$5 + local e_daddr=3D$6 + local e_dport=3D$7 + local e_locid=3D$8 + local e_remid=3D$9 + shift 2 + local e_from=3D$8 + local e_to=3D$9 + + if [ "$e_type" =3D "$SUB_ESTABLISHED" ] + then + if [ "$e_family" =3D "$AF_INET6" ] + then + printf "CREATE_SUBFLOW6 %s (%s) =3D> %s (%s) " $e_saddr $e_from $e_d= addr $e_to + else + printf "CREATE_SUBFLOW %s (%s) =3D> %s (%s) \t" $e_saddr $e_fro= m $e_daddr $e_to + fi + else + if [ "$e_family" =3D "$AF_INET6" ] + then + printf "DESTROY_SUBFLOW6 %s (%s) =3D> %s (%s) " $e_saddr $e_from $e_d= addr $e_to + else + printf "DESTROY_SUBFLOW %s (%s) =3D> %s (%s) \t" $e_saddr $e_fr= om $e_daddr $e_to + fi + fi + + local type=3D$(sed -n 's/.*\(type:\)\([[:digit:]]*\).*$/\2/p;q' "$evt") + local token=3D$(sed -n 's/.*\(token:\)\([[:digit:]]*\).*$/\2/p;q' "$evt") + local family=3D$(sed -n 's/.*\(family:\)\([[:digit:]]*\).*$/\2/p;q' "$evt= ") + local dport=3D$(sed -n 's/.*\(dport:\)\([[:digit:]]*\).*$/\2/p;q' "$evt") + local locid=3D$(sed -n 's/.*\(loc_id:\)\([[:digit:]]*\).*$/\2/p;q' "$evt") + local remid=3D$(sed -n 's/.*\(rem_id:\)\([[:digit:]]*\).*$/\2/p;q' "$evt") + local saddr=3D"" + local daddr=3D"" + if [ "$family" =3D "$AF_INET6" ] + then + saddr=3D$(sed -n 's/.*\(saddr6:\)\([0-9a-f:.]*\).*$/\2/p;q' "$evt") + daddr=3D$(sed -n 's/.*\(daddr6:\)\([0-9a-f:.]*\).*$/\2/p;q' "$evt") + else + saddr=3D$(sed -n 's/.*\(saddr4:\)\([0-9.]*\).*$/\2/p;q' "$evt") + daddr=3D$(sed -n 's/.*\(daddr4:\)\([0-9.]*\).*$/\2/p;q' "$evt") + fi + + if [ "$type" =3D "$e_type" ] && [ "$token" =3D "$e_token" ] && [ "= $daddr" =3D "$e_daddr" ] && [ "$e_dport" =3D "$dport" ] && [ "$family" =3D = "$e_family" ] && [ "$saddr" =3D "$e_saddr" ] && [ "$e_locid" =3D "$locid" ]= && [ "$e_remid" =3D "$remid" ] + then + printf "[OK]\n" + return 0 + fi + printf "[FAIL]\n" + exit 1 +} + +test_subflows() +{ + local evts=3D$(mktemp) + :>"$evts" + ip netns exec $ns1 ./pm_nl_ctl events >> "$evts" 2>&1 & + evts_pid=3D$! + sleep 0.1 + + ip netns exec $ns2 ./pm_nl_ctl ann 10.0.2.2 token $client4_token id $clie= nt_addr_id 2>&1 > /dev/null + sleep 0.1 + printf "ADD_ADDR 10.0.2.2 (ns2) =3D> ns1, reuse port \t[OK]\= n" + + :>"$evts" + ip netns exec $ns1 ./pm_nl_ctl csf lip 10.0.2.1 lid 23 rip 10.0.2.2 rport= $client4_port token $server4_token 2>&1 > /dev/null + sleep 0.1 + verify_subflow_events "$evts" "$SUB_ESTABLISHED" "$server4_token" "$AF_IN= ET" "10.0.2.1" "10.0.2.2" "$client4_port" "23" "$client_addr_id" "ns1" "ns2" + + local sport=3D$(sed -n 's/.*\(sport:\)\([[:digit:]]*\).*$/\2/p;q' "$evts") + + :>"$evts" + ip netns exec $ns1 ./pm_nl_ctl dsf lip 10.0.2.1 lport $sport rip 10.0.2.2= rport $client4_port token $server4_token 2>&1 > /dev/null + sleep 0.1 + verify_subflow_events "$evts" "$SUB_CLOSED" "$server4_token" "$AF_INET" "= 10.0.2.1" "10.0.2.2" "$client4_port" "23" "$client_addr_id" "ns1" "ns2" + + ip netns exec $ns2 ./pm_nl_ctl rem id $client_addr_id token $client4_toke= n 2>&1 > /dev/null + sleep 0.1 + + :>"$evts" + ip netns exec $ns2 ./pm_nl_ctl ann dead:beef:2::2 token $client6_token id= $client_addr_id 2>&1 > /dev/null + sleep 0.1 + printf "ADD_ADDR6 dead:beef:2::2 (ns2) =3D> ns1, reuse port = \t[OK]\n" + + :>"$evts" + ip netns exec $ns1 ./pm_nl_ctl csf lip dead:beef:2::1 lid 23 rip dead:bee= f:2::2 rport $client6_port token $server6_token 2>&1 > /dev/null + sleep 0.1 + verify_subflow_events "$evts" "$SUB_ESTABLISHED" "$server6_token" "$AF_IN= ET6" "dead:beef:2::1" "dead:beef:2::2" "$client6_port" "23" "$client_addr_i= d" "ns1" "ns2" + + local sport=3D$(sed -n 's/.*\(sport:\)\([[:digit:]]*\).*$/\2/p;q' "$evts") + + :>"$evts" + ip netns exec $ns1 ./pm_nl_ctl dsf lip dead:beef:2::1 lport $sport rip de= ad:beef:2::2 rport $client6_port token $server6_token 2>&1 > /dev/null + sleep 0.1 + verify_subflow_events "$evts" "$SUB_CLOSED" "$server6_token" "$AF_INET6" = "dead:beef:2::1" "dead:beef:2::2" "$client6_port" "23" "$client_addr_id" "n= s1" "ns2" + + ip netns exec $ns2 ./pm_nl_ctl rem id $client_addr_id token $client6_toke= n 2>&1 > /dev/null + sleep 0.1 + + :>"$evts" + ip netns exec $ns2 ./pm_nl_ctl ann 10.0.2.2 token $client4_token id $clie= nt_addr_id port $new4_port 2>&1 > /dev/null + sleep 0.1 + printf "ADD_ADDR 10.0.2.2 (ns2) =3D> ns1, new port \t[OK]\= n" + + :>"$evts" + ip netns exec $ns1 ./pm_nl_ctl csf lip 10.0.2.1 lid 23 rip 10.0.2.2 rport= $new4_port token $server4_token 2>&1 > /dev/null + sleep 0.1 + verify_subflow_events "$evts" "$SUB_ESTABLISHED" "$server4_token" "$AF_IN= ET" "10.0.2.1" "10.0.2.2" "$new4_port" "23" "$client_addr_id" "ns1" "ns2" + + sport=3D$(sed -n 's/.*\(sport:\)\([[:digit:]]*\).*$/\2/p;q' "$evts= ") + + :>"$evts" + ip netns exec $ns1 ./pm_nl_ctl dsf lip 10.0.2.1 lport $sport rip 10.0.2.2= rport $new4_port token $server4_token 2>&1 > /dev/null + sleep 0.1 + verify_subflow_events "$evts" "$SUB_CLOSED" "$server4_token" "$AF_INET" "= 10.0.2.1" "10.0.2.2" "$new4_port" "23" "$client_addr_id" "ns1" "ns2" + + ip netns exec $ns2 ./pm_nl_ctl rem id $client_addr_id token $client4_toke= n 2>&1 > /dev/null + + kill $evts_pid + + :>"$evts" + ip netns exec $ns2 ./pm_nl_ctl events >> "$evts" 2>&1 & + evts_pid=3D$! + sleep 0.1 + + ip netns exec $ns1 ./pm_nl_ctl ann 10.0.2.1 token $server4_token id $serv= er_addr_id 2>&1 > /dev/null + sleep 0.1 + printf "ADD_ADDR 10.0.2.1 (ns1) =3D> ns2, reuse port \t[OK]\= n" + + :>"$evts" + ip netns exec $ns2 ./pm_nl_ctl csf lip 10.0.2.2 lid 23 rip 10.0.2.1 rport= $app4_port token $client4_token 2>&1 > /dev/null + sleep 0.1 + verify_subflow_events "$evts" "$SUB_ESTABLISHED" "$client4_token" "$AF_IN= ET" "10.0.2.2" "10.0.2.1" "$app4_port" "23" "$server_addr_id" "ns2" "ns1" + + sport=3D$(sed -n 's/.*\(sport:\)\([[:digit:]]*\).*$/\2/p;q' "$evts= ") + + :>"$evts" + ip netns exec $ns2 ./pm_nl_ctl dsf lip 10.0.2.2 lport $sport rip 10.0.2.1= rport $app4_port token $client4_token 2>&1 > /dev/null + sleep 0.1 + verify_subflow_events "$evts" "$SUB_CLOSED" "$client4_token" "$AF_INET" "= 10.0.2.2" "10.0.2.1" "$app4_port" "23" "$server_addr_id" "ns2" "ns1" + + ip netns exec $ns1 ./pm_nl_ctl rem id $server_addr_id token $server4_toke= n 2>&1 > /dev/null + sleep 0.1 + + :>"$evts" + ip netns exec $ns1 ./pm_nl_ctl ann dead:beef:2::1 token $server6_token id= $server_addr_id 2>&1 > /dev/null + sleep 0.1 + printf "ADD_ADDR6 dead:beef:2::1 (ns1) =3D> ns2, reuse port = \t[OK]\n" + + :>"$evts" + ip netns exec $ns2 ./pm_nl_ctl csf lip dead:beef:2::2 lid 23 rip dead:bee= f:2::1 rport $app6_port token $client6_token 2>&1 > /dev/null + sleep 0.1 + verify_subflow_events "$evts" "$SUB_ESTABLISHED" "$client6_token" "$AF_IN= ET6" "dead:beef:2::2" "dead:beef:2::1" "$app6_port" "23" "$server_addr_id" = "ns2" "ns1" + + local sport=3D$(sed -n 's/.*\(sport:\)\([[:digit:]]*\).*$/\2/p;q' "$evts") + + :>"$evts" + ip netns exec $ns2 ./pm_nl_ctl dsf lip dead:beef:2::2 lport $sport rip de= ad:beef:2::1 rport $app6_port token $client6_token 2>&1 > /dev/null + sleep 0.1 + verify_subflow_events "$evts" "$SUB_CLOSED" "$client6_token" "$AF_INET6" = "dead:beef:2::2" "dead:beef:2::1" "$app6_port" "23" "$server_addr_id" "ns2"= "ns1" + + ip netns exec $ns1 ./pm_nl_ctl rem id $server_addr_id token $server6_toke= n 2>&1 > /dev/null + sleep 0.1 + + :>"$evts" + ip netns exec $ns1 ./pm_nl_ctl ann 10.0.2.1 token $server4_token id $serv= er_addr_id port $new4_port 2>&1 > /dev/null + sleep 0.1 + printf "ADD_ADDR 10.0.2.1 (ns1) =3D> ns2, new port \t[OK]\= n" + + :>"$evts" + ip netns exec $ns2 ./pm_nl_ctl csf lip 10.0.2.2 lid 23 rip 10.0.2.1 rport= $new4_port token $client4_token 2>&1 > /dev/null + sleep 0.1 + verify_subflow_events "$evts" "$SUB_ESTABLISHED" "$client4_token" "$AF_IN= ET" "10.0.2.2" "10.0.2.1" "$new4_port" "23" "$server_addr_id" "ns2" "ns1" + + sport=3D$(sed -n 's/.*\(sport:\)\([[:digit:]]*\).*$/\2/p;q' "$evts= ") + + :>"$evts" + ip netns exec $ns2 ./pm_nl_ctl dsf lip 10.0.2.2 lport $sport rip 10.0.2.1= rport $new4_port token $client4_token 2>&1 > /dev/null + sleep 0.1 + verify_subflow_events "$evts" "$SUB_CLOSED" "$client4_token" "$AF_INET" "= 10.0.2.2" "10.0.2.1" "$new4_port" "23" "$server_addr_id" "ns2" "ns1" + + ip netns exec $ns1 ./pm_nl_ctl rem id $server_addr_id token $server4_toke= n 2>&1 > /dev/null + + kill $evts_pid + rm -f "$evts" +} + +make_connection +make_connection "v6" +test_announce +test_remove +test_subflows +exit 0 --=20 2.31.1