From nobody Fri Apr 26 19:46:39 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:b119:0:0:0:0:0 with SMTP id r25csp1107719jah; Wed, 12 Jan 2022 14:16:12 -0800 (PST) X-Google-Smtp-Source: ABdhPJyOOwuOV8SF6H8eg8UiI9WdLvGD0DftDniXPQ79cp5pfxUF04n2uzjCg7/xiJl56aqUJuri X-Received: by 2002:a63:f5a:: with SMTP id 26mr1492303pgp.613.1642025772587; Wed, 12 Jan 2022 14:16:12 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1642025772; cv=none; d=google.com; s=arc-20160816; b=QoyWK4eLEymDL6cwDbJ6M/bCm6O2pCkUS8YJrJ0sdjtYj+xF6IBUYnAkOWs5mUo2ks 6OhPzAdvRut+jAdA/dgao54XWUaEAuJHJaOS627yZEZQNj0T2n0voTFZT25CIHL92wOl 6/PlhQkYrr8Up2GiVuuYOieoG2ThJwsE6QXarc7KYRz73Xm3gcOPRgLhjpxsptO3j1AN nNt1sWiFSeu9ijwI3HR7GzsVqgFMtugWyl1n9NieV76ffsDgf4Oa7tbzhY7vfcNP9gHm k6osWKPluNwXN4X2SH5TU0kxL2t7lxmELIxCS69b05GTihNujJ9Aup76+WWg1LJKsSx4 dYTg== 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=Q6BUhTaKvA5mxq9GuEuTzcE70gdFgFcT8muMBeJLC+YgvUARM4y2v1+fu7n0otzbxQ cHByP6WT34CcIgxzkvktLOozwNtsYRZZtsKJtaCFFMn+iZm+l8mO/Rxn3dT4LWzX/slb NTzUIOBxoCWZAZc6nn3lUQDGe9Sl0zy83K58utHhab+q+ijKRw8U4CJLoGNbUNeWSD0R xpk8ZgoVrLlEN95Twz/GJj96XX7clACDBt1DRzm1JyYp/4dDwkerPiQxF9BmZ3mMe62y bB/BA7YTijY2xbIiHfgpJxGT7brNY7vW3jPpHMwK9WKiMWCZgo1tcT7LTOxKDxg+jd+j /4uw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=SzikfJ66; spf=pass (google.com: domain of mptcp+bounces-3074-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3074-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 z22si1131313pgu.280.2022.01.12.14.16.12 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 12 Jan 2022 14:16:12 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-3074-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=SzikfJ66; spf=pass (google.com: domain of mptcp+bounces-3074-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3074-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 28A613E0F48 for ; Wed, 12 Jan 2022 22:16:12 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 65D8F2CA4; Wed, 12 Jan 2022 22:16:11 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) (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 04A3E2CA1 for ; Wed, 12 Jan 2022 22:16:09 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1642025769; x=1673561769; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=RqFkuGksiI6R0XGEF4afMW+j7YKqqFmAYKoc85fXM8U=; b=SzikfJ66KRI1BpEfspMdWysylzbQ7eWcD469xpFSDn8rzXJ55W+ljo/B NctRh1wkpvSJ8v8LrGPVtC7ESg7JVByqk3kiCJ1yykHU/1zacljYp0UR/ Ot0AFie+psM1PBCIPsmUpkQLw+wUFXrQLUsho8hHP8njkiD/Zx/P6o3zh 2zmYPIqkO67cpz4h6s/1D+BmDvZ1dw8dJBeFHZWEqZKolzTciz7lWOLkg vf0fV3/5pgaaVy8YWWZUiJjFNinrShzYkY+VukGIe4fF1nsTJYJ8Qwtto IhKmDThLSVj+2oXOqLb2AZohQ34nmIoNZmBEJG1kTzEYFVotwnQdkVvHF Q==; X-IronPort-AV: E=McAfee;i="6200,9189,10225"; a="307213928" X-IronPort-AV: E=Sophos;i="5.88,284,1635231600"; d="scan'208";a="307213928" Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jan 2022 14:16:07 -0800 X-IronPort-AV: E=Sophos;i="5.88,284,1635231600"; d="scan'208";a="490907330" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga002-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jan 2022 14:16:07 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v2 01/21] mptcp: do not restrict subflows with non-kernel PMs Date: Wed, 12 Jan 2022 17:15:03 -0500 Message-Id: <20220112221523.1829397-2-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112221523.1829397-1-kishen.maloor@intel.com> References: <20220112221523.1829397-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 Apr 26 19:46:39 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:b119:0:0:0:0:0 with SMTP id r25csp1107706jah; Wed, 12 Jan 2022 14:16:11 -0800 (PST) X-Google-Smtp-Source: ABdhPJzJ7ihaWuDlLFaepN9Ypd8W9OpebKVPlQwbW11+kRAUWxAcSdrPsLJe4mZB344X3v7E7JBw X-Received: by 2002:a63:474b:: with SMTP id w11mr1463280pgk.618.1642025771667; Wed, 12 Jan 2022 14:16:11 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1642025771; cv=none; d=google.com; s=arc-20160816; b=wzE50y6Icfsdm4rDKVaIf+rYH0oisHLfFVPmlWdosuf3c3+cviX2WNxQEZte6FjCdE dxebCipUWvNXqDHEZfR50WEcRsZ7YZOPQ3jmR7J3BPnMMCzgW2pG1jqPdEbeUgeJm1RN 3Fq+b9+zh5H4fjgVxK1DbRi/DKdKeoUXjyw87s+Akn5BLk6GRs3KUNgqnORrtjoU4eVV 5Mmr8XQ9cFMATKo9uoBGfOedQ9PxJnNRyZB+teNV2HmiXUe8eNZUTzusSKaj9K8qYE3m Y9JyGWZU/jF4GcwxYtCOKXTkEmAy5XAFxH3GeN+fABoYr1JXm2YlWJalVHkPBickPLku wcMA== 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=0EAx59kH9UJCz+hn4jC2asNqHOcXnkK4SqnZh6og3l4/TX1Z27CTofBrcSib+04kPW +VSorpsufkh7tQtzaYtt1kshP1zP4TNpbN43IJAi6ZnWmEvYT0M0qFLmFHduhHu7WFDt gIYnTxV4d342JcH40Ht18xXAjD1UCLy04v9T8GUWTY9YVVVYec5DnVPAvFtYjE22I54L pWDlT3a+C4t7K1nXA/8oRJ3aQ+h2+PBdSLtqaImuvuyAcW4zAerCQfbMoSNl1+h5YrIx AVI0bLt9Eu8dNxMsM1nn3ljm2nxFbQn3QClGg9EF1ZOceyWIFOtkAp1m5FmkBxGJ7HhL /ilA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=bLeWKLqE; spf=pass (google.com: domain of mptcp+bounces-3073-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-3073-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 d4si1147255pgj.757.2022.01.12.14.16.11 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 12 Jan 2022 14:16:11 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-3073-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=bLeWKLqE; spf=pass (google.com: domain of mptcp+bounces-3073-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-3073-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 1E73E3E0F05 for ; Wed, 12 Jan 2022 22:16:11 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id F3FF32C9C; Wed, 12 Jan 2022 22:16:09 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) (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 08F82173 for ; Wed, 12 Jan 2022 22:16:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1642025768; x=1673561768; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=g3HjRxAW2nKK2T0as/ELLt/oJ+EohLEJGBuBJ9Xk7D0=; b=bLeWKLqEz5kFxiVtk64HR5MUOpBDl34WAATFlJCGuTCroXbYbp75dH7I ShRoLv7AmvusYzP4wp7EpIcoO5pYOFXQzfhF9Y0Y54kL0bIn2RqaatoDK ScQIHDtRMGzCfHf/MrT468n2oRdvL+6eOkj8A8JCC66TAw0QQgepNut9U 1FnlJgROY7OIEs8bBLGnBx6FhK8dxbXSdiXPSwHfU4PLLFVaCEVp6dwWG N9S+SlxSqiVDpapNZea0iN5mv/35zVTTu0A29Gwmjf6yRuW/mndUpgE5a 32gkslQqBj4LToypg6BzCx295wIbXpIMBzG4B39GL8y2OCgGeK6uwsGcw Q==; X-IronPort-AV: E=McAfee;i="6200,9189,10225"; a="307213929" X-IronPort-AV: E=Sophos;i="5.88,284,1635231600"; d="scan'208";a="307213929" Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jan 2022 14:16:07 -0800 X-IronPort-AV: E=Sophos;i="5.88,284,1635231600"; d="scan'208";a="490907332" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga002-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jan 2022 14:16:07 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v2 02/21] mptcp: store remote id from MP_JOIN SYN/ACK in local ctx Date: Wed, 12 Jan 2022 17:15:04 -0500 Message-Id: <20220112221523.1829397-3-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112221523.1829397-1-kishen.maloor@intel.com> References: <20220112221523.1829397-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 Apr 26 19:46:39 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:b119:0:0:0:0:0 with SMTP id r25csp1107773jah; Wed, 12 Jan 2022 14:16:16 -0800 (PST) X-Google-Smtp-Source: ABdhPJz57M9He6F8LohviY9dMrRVWYHvZ9+KV6Ipxy28j3Rk7zHBMu7GVOkuMehZtayvkPL48PGw X-Received: by 2002:a37:6354:: with SMTP id x81mr1425066qkb.499.1642025776290; Wed, 12 Jan 2022 14:16:16 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1642025776; cv=none; d=google.com; s=arc-20160816; b=vmmwL+mk0DfNNUN1gbKDmfLXx7w0sFcdanf1tasg7VeFdq33fIGLJISzPL6zLECbG6 H4ZEe+Krm7CQKz3GeAxOX6jeCEvcARfPTxw3j2lwaKojCSCa1Y+Z1v+UlMqvxbfnt9Ua s/ilsAVYchu/mW3pmoMS2lGErzd1Uqz5cCUFsoW4Dk7x+ksH0k/5zvCRwvRlB00MbIT7 WTSkXzOgX0CHKD3oV2nr8bNa85IHMZMJVWl1s/2RWAYxWmBiQf3h3KUb3huWiY5fx0t+ I/6WEGGeW3+XOziFHG7cAEXtxru7ABywtRdfygWv25j7tbQxUlmzunYttPA2yoQ18NmS AR7A== 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=RCCvvyNYIz8uGgST/5lFofggOaZ7PXRnskSfmoRPqgam2KA2Hr+qje04zMMCeSqvTF moTFpIn6KZ5S2vmcU/h8/FxYPukgdSgRtC/DCaaJp0/YO9mZfBjqhHVTdxuqzwqo0q8F i9O96ySH3Bs1OeGa8IUMrtD3nXNuK3Q0rTa3VNHS50Dw9ngZ7ZM3OnvfzBfVzZ5izLmq n8hzzioNkogllpc6r0KjOr8WRIb0lz7HbuwOXKfJqxsbaNkGR3vX5WMZNDiztFVx+kca tl+nqLnZR50YCYc7Ont1mumRA7CFn+wOzJ9CEJZ4bgENZaRFt8Qhghbbyy8FURoGsCNn LfHg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b="d86+UgV/"; spf=pass (google.com: domain of mptcp+bounces-3077-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3077-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 m16si483165qtw.731.2022.01.12.14.16.16 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 12 Jan 2022 14:16:16 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-3077-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="d86+UgV/"; spf=pass (google.com: domain of mptcp+bounces-3077-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3077-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 E9C6D1C0BFC for ; Wed, 12 Jan 2022 22:16:15 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id D8B472CA7; Wed, 12 Jan 2022 22:16:12 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) (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 6AEB52CA1 for ; Wed, 12 Jan 2022 22:16: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=1642025771; x=1673561771; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=nRVymqImLVZUnWJH/FWCAR9ITX7opML5AleHBZilvmc=; b=d86+UgV/J7AQ/FBDbvJSyrvufHLCuC1j0JykVj5M+eMc5oY7WxfqJPaf vlmJ1s+xy/Je3rg2ZHL/PU7UsrAc/P9faIae3s46//Mc/ccYID6dFNtoI f5YoqVf5xqvdQu5TMIZuSFLRmlAi9XPMwd9dLuQ/ZFfp59VZtaSaq/leP Sbyp40EyUl5GlFOkJfWFMvPb4/l8ALv5xlmP/jzDgVJ5t1JFNcOr46C7Z y954I7syeCpbAm6u5mlmjN17YVIhQNowCxxx2gGMTE7WOunZz3cH8UqyR JCom1vlrIu/MiXXXbyjb6KBzYWruTVKILl98kZ3gsmskAhjHzYrb0xWeP g==; X-IronPort-AV: E=McAfee;i="6200,9189,10225"; a="307213930" X-IronPort-AV: E=Sophos;i="5.88,284,1635231600"; d="scan'208";a="307213930" Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jan 2022 14:16:07 -0800 X-IronPort-AV: E=Sophos;i="5.88,284,1635231600"; d="scan'208";a="490907336" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga002-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jan 2022 14:16:07 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v2 03/21] mptcp: reflect remote port (not 0) in ANNOUNCED events Date: Wed, 12 Jan 2022 17:15:05 -0500 Message-Id: <20220112221523.1829397-4-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112221523.1829397-1-kishen.maloor@intel.com> References: <20220112221523.1829397-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 Apr 26 19:46:39 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:b119:0:0:0:0:0 with SMTP id r25csp1107757jah; Wed, 12 Jan 2022 14:16:15 -0800 (PST) X-Google-Smtp-Source: ABdhPJxfZE0uEt0hpLXVAsjRWH1Gec+PSVHYLXVdt5bZx7u/4zofsxwqFkZIAOSu4jWAsnK45bxy X-Received: by 2002:a05:622a:14c8:: with SMTP id u8mr1442448qtx.267.1642025775327; Wed, 12 Jan 2022 14:16:15 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1642025775; cv=none; d=google.com; s=arc-20160816; b=CCRyq9vsmC7t8HCvwAsRkviBNpO0Wzvzs6u/e3/TmdyWFpHQVTxfC3lNCYmRHnYjGj LByVGNbhSd7COzGXHBQ73FCCcRyQKE3KqT7KlpnwekxrAtF9AjoxDAPYS06pi/snYWTF DqAf6GpQzf3hiD7b/f/oRqCB0YJU+VcOeymSR1QRkhrnCa7cePWfBwjpGuJEfmd/9GC2 kWiuTeokZiQ1cfUhoYcMcUknQpwLFoxJ7LiFPxkxSGYLVmV3E79BCGU+TQNfGROZfrcg Az3CeYSBHAQQkK+PD4VtmY9ZvntCFpcCL5yyhmXKX1WzHn88m5TXxQ2bT6LXjtt3Osq2 Q/sA== 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=l/IfxvvIt6+EdP8rl2d+UG7L7bBMFXNd3VLt53PbbxQ=; b=RpHUGa9epDzWyb4xu2YCDbcnL9RQytCCskDBWB5QIl+20Vs4iNzT76QrUKMDcdABwq M0fviF5tBy3yDu/euEr/gNQMIsMqG2Pn5R0C2rPG64ttpJlefh8WCMldUSmIGVX6xD+p aDYVsAoVNfjPy7eCusAjGPL+8+ZJefVj2gUaL7EnLeeO0pnjdKeZFx6nGa5pL/hUi+jw +rO9qOBs4xJsZVeHHNMDOkzlNrVWPOGvDik5wzaEl06f7sEOWSpFlvQWe0GVoiG/v0Jb W5Vi2+EwHtKFIxbwz8OxPpkFCcIgsZjjC6kQ8OxCKIonKQO+RzMyLTlYUHF4d/MF2CVg yv6A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=WQT1JFih; spf=pass (google.com: domain of mptcp+bounces-3076-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3076-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 s3si477885qtw.734.2022.01.12.14.16.15 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 12 Jan 2022 14:16:15 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-3076-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=WQT1JFih; spf=pass (google.com: domain of mptcp+bounces-3076-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3076-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 EFE971C0C61 for ; Wed, 12 Jan 2022 22:16:14 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 944F12C9C; Wed, 12 Jan 2022 22:16:12 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) (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 74B7E2CA5 for ; Wed, 12 Jan 2022 22:16: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=1642025771; x=1673561771; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=S0AsE2RcH/TKnANLPBUSz/kAluumjiVVGKrw50vnyG4=; b=WQT1JFihLmwUvtEx71l5vxDcvgyKhOFB2+O9bUByyQX/HsHFDurlaL33 oILCGK0PQFbbB2CcWwnUrqWZVUV8lpXlDQvec5RW3EWknJqRIrVfVqmqv ancXj7cR2aWQr696qMmBuDExVtYcCb7zopvnyUiY5mXEXdSh6jXnF68tQ /ir9DWafyOHasWrVgeH6Vbui2M0EuwWLkWHSpV1QnECCSVgtFbDywC75I nbFOIcjaFkPvb0nnwjtw98fOwxyOm3SLgDh3rZp+7gwlaiSVv1aJfY4/O 7PDA/JlG/HyOJk6ZolhqUjgMc2bihqFKjFzg/rlv9ZKFmmwmF2Vl7ATgC A==; X-IronPort-AV: E=McAfee;i="6200,9189,10225"; a="307213931" X-IronPort-AV: E=Sophos;i="5.88,284,1635231600"; d="scan'208";a="307213931" Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jan 2022 14:16:07 -0800 X-IronPort-AV: E=Sophos;i="5.88,284,1635231600"; d="scan'208";a="490907339" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga002-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jan 2022 14:16:07 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v2 04/21] mptcp: establish subflows from either end of connection Date: Wed, 12 Jan 2022 17:15:06 -0500 Message-Id: <20220112221523.1829397-5-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112221523.1829397-1-kishen.maloor@intel.com> References: <20220112221523.1829397-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). v2: check for 3rd ACK retransmission only on passive side of the MPJ handshake Signed-off-by: Kishen Maloor --- net/mptcp/options.c | 2 +- net/mptcp/protocol.c | 5 +---- net/mptcp/protocol.h | 2 -- 3 files changed, 2 insertions(+), 7 deletions(-) diff --git a/net/mptcp/options.c b/net/mptcp/options.c index cceba8c7806d..89808816db06 100644 --- a/net/mptcp/options.c +++ b/net/mptcp/options.c @@ -921,7 +921,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->request_join) 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 Apr 26 19:46:39 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:b119:0:0:0:0:0 with SMTP id r25csp1107785jah; Wed, 12 Jan 2022 14:16:17 -0800 (PST) X-Google-Smtp-Source: ABdhPJzT4gWSxaKGkr1zBM4wyE7LFgFN3WcaQRY8JWwvDXi8ZQz2PoRBmYlGKHF3aqGEB2BFA3lZ X-Received: by 2002:a63:914a:: with SMTP id l71mr1499811pge.206.1642025777288; Wed, 12 Jan 2022 14:16:17 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1642025777; cv=none; d=google.com; s=arc-20160816; b=qee1qI8tqY0et4cRLXPdabwaOHpJJW6w5dGo7S/P2+E1B1PiVobHLfCmcQUIoojfRy mTuKaGiWkbu2Pr4fgtv9XSg3OjbNWXW1qPFtEw9drpvFI2xLE+tECwKvVlbcPI3mFTPR m67lczA9TyK38evbKgJbxP4rxjnSSO3iVi4Y1fWpF4RGxFAs/NhwneeiEfMpGpVSV8Gf VG+YD9G+CFuRRlSz70UAayLbaDkTczcqmeY4GEZ3ZVBarg9Xo3O38vg8E2wa/Qdu43W3 tpW5LGwMVNaQuafqWtm+QvJFB8odoIIcNlh7FO7E1JaQPsgH9M6dhMc05cLTPQyyryoa nn9Q== 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=IYx3C3K0Weuzc4hRIjFHnooF1w1RfEr7BmiaQKsTZ5E=; b=BmLWiCAJfnCQeCgOWpwtuOYvjGAYXaflfjrOqbk3w4f+y8SGzuqyYmE1GTXp1xBG4U tH4BY/coD0SVIDZmEcMGTuSVBp3djF9X0CZLDd2exLbURoht6hMzXbC5MB7jk8cOji/k I+Ov4KSIFy1VvAX8f9/1SaZ6f8N1JAliyTh5QItwnMKNCPfCqz8v2JrPNwfGbmRwD3Ft WqkRmUNE8qiiUBew7rgtrqnHa9sm4tVViPR5wI1Bvllhg2hdFxLT4K7FY3/VAex6jWcR qtCr93aKqkY2/+DMGIo9Wo3H22+GBUoDPz7vQ16KAZPSqr2FAqFyuXv61PfoTozXgBmq EroQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=H6BGgR8+; spf=pass (google.com: domain of mptcp+bounces-3078-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3078-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 f20si6179192pjq.9.2022.01.12.14.16.17 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 12 Jan 2022 14:16:17 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-3078-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=H6BGgR8+; spf=pass (google.com: domain of mptcp+bounces-3078-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3078-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 D0A373E0F9A for ; Wed, 12 Jan 2022 22:16:16 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id A2CCC2CA4; Wed, 12 Jan 2022 22:16:13 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) (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 881742CA3 for ; Wed, 12 Jan 2022 22:16: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=1642025771; x=1673561771; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=0yonfpVIz44Immw5RoBY96P22Q6fLpYTWAMiV6tCawQ=; b=H6BGgR8+lP5LQm2jR7IoRxTHBQEdDxfUOdmAtAevn4G8kUJ+tofX/bhU yOkNje1Zj7fAMT3wjEoSbbwBL48sjcpRU11wid5KDEXTqhST0teB9jsxk k568Xq2tVKHApbMe0g3oO11qAlZxmrvlnPfuSvnenOtdKC2MVj08ibDcZ DZOC7w87i906tc5Nh68Re/GY7d4n8oyMOfbRT/sLqtH7T0xTJJ65o+RkX HBbh7gpH7NyGoWykAjDzYMROBCZGNzm3vJFKOrgGFDMdDS9bVZvh6dokr xkUxBxsTk1ADwQMqtvkXioz9sF7KXmsSAFcNp6JNunhFJduXLfYuqNpKj A==; X-IronPort-AV: E=McAfee;i="6200,9189,10225"; a="307213932" X-IronPort-AV: E=Sophos;i="5.88,284,1635231600"; d="scan'208";a="307213932" Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jan 2022 14:16:07 -0800 X-IronPort-AV: E=Sophos;i="5.88,284,1635231600"; d="scan'208";a="490907342" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga002-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jan 2022 14:16:07 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v2 05/21] mptcp: netlink: store per namespace list of refcounted listen socks Date: Wed, 12 Jan 2022 17:15:07 -0500 Message-Id: <20220112221523.1829397-6-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112221523.1829397-1-kishen.maloor@intel.com> References: <20220112221523.1829397-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. v2: fixed formatting 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..4ad43310d50d 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 Apr 26 19:46:39 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:b119:0:0:0:0:0 with SMTP id r25csp1107814jah; Wed, 12 Jan 2022 14:16:19 -0800 (PST) X-Google-Smtp-Source: ABdhPJyooM4Se9DMks8vL/0Vaip2OFJbplPeVBFLSidnMiS/GEN/Qv88+nC0+XevzaSCM4y1mZo9 X-Received: by 2002:a05:6214:2484:: with SMTP id gi4mr1732662qvb.36.1642025779787; Wed, 12 Jan 2022 14:16:19 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1642025779; cv=none; d=google.com; s=arc-20160816; b=Gat7LNe/bBy2Zt85Lan+Z0sLR+Ru+nc+Q8/jujIN/qEAhCFdXoMYOv3GL6wCQxbOnz sI1wYiAB+3RcrB5aq2JQooxvKkHqpeAY7QQcP59Me/v/zWzb25jvxMAquPtYn7IRvaLI e5g859ieoSWloJUDBHU6EHSm36YpKpzB8Ynj2bgByHNqBXsmuXwiOAM/0a9hoFwlDEHe LvpkEQuWy2PKghhHKc4om9ezcHgrrDJt+UCvJC4Bw2O47SbW2dzEhZLLTIo3JrBSGxUb 2fr0cI0gF1cHBCtWC24I0OIb2UCTdPYZWrsyEd/8gbN9kfe4L6XKCnYViWBM4BZ7OvWF h6Wg== 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=wchLrJjyj7uHHpBo5TDtUvlm2Ik+LMsQUUlHtsVNkAk=; b=pugCFlFngce87wz7kWtz2UIlM1sDqtUqWi+o69+koxd7QwHYS9tsgvoH6oLpzE/5AS Fzmgv0wVaM47ww3QZPpLZ5Sq1y+xP5JA7AerK/sN8+IJaeRspGXcxEzH+lcdKowayTOn 0D9dVRPb8cdbyGEoKckH4975cYpswF2uOqc4K+dWdXy12DUEqSY8BAnGu6r9OQz45VF6 fwtDmQtyV86aNRBBsfn7dESB7TBsFItj7UhjMigR1QEnChaXc9ytcxhJOspC3CkBqOvy hdsY0ApEFSnUKffw2irdY3P9xJBjXci7K0sGq5D6dNtNM661P4bOfjsjfKa1K478UkUN hqVw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=UdRJpfgn; spf=pass (google.com: domain of mptcp+bounces-3080-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3080-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 g8si407497qke.346.2022.01.12.14.16.19 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 12 Jan 2022 14:16:19 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-3080-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=UdRJpfgn; spf=pass (google.com: domain of mptcp+bounces-3080-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3080-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 97C0E1C0726 for ; Wed, 12 Jan 2022 22:16:19 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 137D42CA9; Wed, 12 Jan 2022 22:16:14 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) (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 A0EAB2CA5 for ; Wed, 12 Jan 2022 22:16:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1642025772; x=1673561772; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=r4GMc6LKC2K42+FKNenk3il7PVutlelI2qbyAddfPCU=; b=UdRJpfgntvbmElw4l24uq3yC4lWAJq5WTA1taUipJzs1rTey9s8GHsbH 1QvDAopmYCggY7sQ0tPbl3hfHZtv3Q+I+aeqpFafamd8plht3kd/3agLc cF1g5CLChufLGrndvATzUZQZrXTHCpDNfVQDCqEfImV5xrZgJ+VYSEchc Z9Pw2QmDrCwR8CorP6m8njEWCH7ZLvH+lNRUkJA8o5R+vu9KIwme1EykP x84PJaMeGD8ZBm+4tKWipHiDLKKhppipat7LzkIpRfhMiZvzz4iRo5X7B grsaFYHQrvk71FGdlOXYSMs8JrtSEF+CE9C9kmNm3p5aBmw++9Scg9KLx A==; X-IronPort-AV: E=McAfee;i="6200,9189,10225"; a="307213933" X-IronPort-AV: E=Sophos;i="5.88,284,1635231600"; d="scan'208";a="307213933" Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jan 2022 14:16:07 -0800 X-IronPort-AV: E=Sophos;i="5.88,284,1635231600"; d="scan'208";a="490907345" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga002-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jan 2022 14:16:07 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v2 06/21] mptcp: netlink: store lsk ref in mptcp_pm_addr_entry Date: Wed, 12 Jan 2022 17:15:08 -0500 Message-Id: <20220112221523.1829397-7-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112221523.1829397-1-kishen.maloor@intel.com> References: <20220112221523.1829397-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. v2: fixed formatting 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 4ad43310d50d..4c1895dbc2a5 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 Apr 26 19:46:39 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:b119:0:0:0:0:0 with SMTP id r25csp1107801jah; Wed, 12 Jan 2022 14:16:18 -0800 (PST) X-Google-Smtp-Source: ABdhPJxsTMUDBJruCwqLKURBktOPfHfos9KfQlm/+2YCS+2VNLwnzPKiob7tkgeab0zwsuaqwo+1 X-Received: by 2002:a37:6144:: with SMTP id v65mr1350606qkb.528.1642025778618; Wed, 12 Jan 2022 14:16:18 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1642025778; cv=none; d=google.com; s=arc-20160816; b=ptfH7oHKASOHm2Bqq80AOH9DDefqbDizuA7FNkdONRYqUwepylaKGPVB+8+o+o1edz wFN4Gl+ZTudOKaG3LawZe7doRocoDIii4yLySB/xVKVp6TdxrX9df23CmLNlAGfN+6VH dnCvyhQdtLYuOb8D2okaCRO2e/7fZtPsypcsfymTnV4hipUD8um6eGULGrJT5x8gIH+i m34DcbF9KCoGAIwDFW1mC9/BTbHs+oE+1kE47QMTfPJq8xGWvBLE5T8ycGTzN+7h+KF7 K//4QZW4J3B2XPVI8K69k5whfqeSeWWvI0f86+OQaPCdQHncPxGVBMUujaQntZK1mgmt g1hg== 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=sPX3O4VY6PCjDzxLkH5SS3i1TaQhM5CTYc1ZDk93O8U=; b=b9q5PuVBf6Xs/ARj23lnDzyzZFkS3rEF98YOb5emVEAzWm0pm45ZgckhrjEoHuF+OE Mtj2m5aoa00tBAbQwgML03xTLqa9Jb7HFmWSxdsOj+AzsIGwekgq9xAAMrmnAvCA444P iWx0VpR6Z2xd1H6wcezoinssoobxOcpILBf4ifYXniY21PYGbc+fq229oTPjo2TnjnPI DOhlrZrxy7bJjnV048TzxVrWQFN3wSo00sIdLb/RM7lpvX2wLng+4IKhxi1BSwoBxO+W vHBXiFHcopQ3eMY44/P7FOYKOKnM4DlJey8A0D77kitlWqWsWwgw6Os6D0P+Fe4I5cl+ /ZdA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=MRmXkN3S; spf=pass (google.com: domain of mptcp+bounces-3079-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3079-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 x4si479006qko.524.2022.01.12.14.16.18 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 12 Jan 2022 14:16:18 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-3079-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=MRmXkN3S; spf=pass (google.com: domain of mptcp+bounces-3079-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3079-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 687781C08E8 for ; Wed, 12 Jan 2022 22:16:18 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 032D02CA8; Wed, 12 Jan 2022 22:16:14 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) (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 F02762CA1 for ; Wed, 12 Jan 2022 22:16:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1642025772; x=1673561772; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=+uWiNDauEPfD6qygBmc4NIRCchONURGA14EtKbvKIjs=; b=MRmXkN3SUYQxGClCghlFrEcIUKliAanAmjYEIIhyJwza5XXnkgDJA2h3 Vcm2uBUTaCdQJTJr6pZyGuMunE4RzOj7TjiZrodMTOXJzUUse70C4maI0 CQwbf1DkVhjitjTAfSdNBmp7ekhBnCdyVEHtJF5I6HnZGdd5E1Osxm4nf DmiZJmy2rlmtq9f6A2L2cvFvCEeolMGPwkysd/iZkwEor7lHTGe/sDv/Y mI5ERfuvdGiVcQ1j/RSzLJ+awfomPnaQIv4LP9aL/A8fH1GdIwMdAZ5Vq fcfhTfaUaW2arm6TR8rxaqAVJvZlkVn4C/9OSqPXpn0tsx158Jkj7YaXT Q==; X-IronPort-AV: E=McAfee;i="6200,9189,10225"; a="307213935" X-IronPort-AV: E=Sophos;i="5.88,284,1635231600"; d="scan'208";a="307213935" Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jan 2022 14:16:07 -0800 X-IronPort-AV: E=Sophos;i="5.88,284,1635231600"; d="scan'208";a="490907348" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga002-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jan 2022 14:16:07 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v2 07/21] mptcp: netlink: process IPv6 addrs in creating listening sockets Date: Wed, 12 Jan 2022 17:15:09 -0500 Message-Id: <20220112221523.1829397-8-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112221523.1829397-1-kishen.maloor@intel.com> References: <20220112221523.1829397-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 4c1895dbc2a5..779ec9d375f0 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 Apr 26 19:46:39 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:b119:0:0:0:0:0 with SMTP id r25csp1107820jah; Wed, 12 Jan 2022 14:16:21 -0800 (PST) X-Google-Smtp-Source: ABdhPJyHf79kNEQcR59AQzg+pxnI370SRx8DT2EoQ+rd6KSdgGFsxVUkE/3i9zf26XiVBNUboMCS X-Received: by 2002:a17:902:d484:b0:14a:59cc:308e with SMTP id c4-20020a170902d48400b0014a59cc308emr1697438plg.137.1642025781100; Wed, 12 Jan 2022 14:16:21 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1642025781; cv=none; d=google.com; s=arc-20160816; b=aNbeOsd+eZwhyjhHDQkOQxgUWt+HLIFzh/Q8jQLIabCJthKhY5SVve40oxkLukziqj cEUUYnH/2wV7sWd/lbLM+s8H1hYGrkDQUH6Pax5IZQc/gtMNqUJLf1V+GUtc0yx72gQG aDD3yuIU1kXR+0pmoEdknkQx062IIVJvaP1oGoNIntAWd8WwPo4RxjGE3h82yvuwpbFZ 3wjAHgR1TkdY8ya6cWvNC42xN9+XsyPkhT5ELWta3z+c6oqdAG7swsGITwbvmjITyYM8 QgwtzQX9DHyl5p+GlPUzSArez3k3xvwTfTlZTFDEfE0kzJyvSNKRzwFghekEj0MfkZxd PoSA== 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=iAn3tz7yFxFqCHPCiMxn+eUPHrdm53TDfeeK+4n5awE=; b=shD4E4WKPnydmD2a5XcYdJ79cicXShMCmA6i+dsG/GVwevsIa7TZEsJDmkCzaMLOFU OYerlhjG0r9GkgJKT4gCAw04NfaZyOSFPcE/bK2dv0D+PG3MqK11WmPWP3uqYfoE72hW ZBL7TrDBtfjLEej7W+Gh6QbjXvUXAZRsFJurachf+5a/xb79ddGXI693KjGRV7MvjoVs 14ghjd+D0FEEQw1oBMEXT+4GLgv8mcdX7arzdZiNpMAy9/jKBHLyAOVH+LacWA/dkZbA KqL3FbTws6ajt3NB81U3LvQm7tsQf5qXY7d9qoI+742PU4dNWcBv2QctiGsNDd/O1Vqm uD+w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=au3YupcQ; spf=pass (google.com: domain of mptcp+bounces-3081-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3081-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 pg12si1207384pjb.29.2022.01.12.14.16.20 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 12 Jan 2022 14:16:21 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-3081-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=au3YupcQ; spf=pass (google.com: domain of mptcp+bounces-3081-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3081-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 887303E0F84 for ; Wed, 12 Jan 2022 22:16:20 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id AB2FD2CA5; Wed, 12 Jan 2022 22:16:14 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) (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 A5C232CA3 for ; Wed, 12 Jan 2022 22:16: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=1642025773; x=1673561773; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=+SCOcRKlIRGNRsZw9Gv0iFFymUvaM1ywAOywIEPOCSI=; b=au3YupcQB6LXKBAtM1UVqbWB7fJDaBV2GEFuJ9daQyY0XWbupJtoHBGS bJA1JcQJEPWE1/X5zh5tfy3ZbuaEMeGNKdZUFwTMsnyDovpff+bjwMCOu NE5k2nR3O55yNfZxbCHFpCLGlQ7LqZZUdaOs9IQbbKOuNhhm/22vyhQ45 SnAvbMzIC8wBwTuyYRyQjF+CCRIVkifwx277OUxEkqsqPI7zAZFYXzmRa C5tSUrcFH+R3EaoskbVHuEH5Bwm+tXcTgGT77yB2Iyu8na8TZou+F4Os3 ZTXps/8I2D7cqb6P/dguPj6+lFNY1IXr5GOEpISKkCg/pf2S+MPIYisrp Q==; X-IronPort-AV: E=McAfee;i="6200,9189,10225"; a="307213936" X-IronPort-AV: E=Sophos;i="5.88,284,1635231600"; d="scan'208";a="307213936" Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jan 2022 14:16:07 -0800 X-IronPort-AV: E=Sophos;i="5.88,284,1635231600"; d="scan'208";a="490907352" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga002-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jan 2022 14:16:07 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v2 08/21] mptcp: attempt to add listening sockets for announced addrs Date: Wed, 12 Jan 2022 17:15:10 -0500 Message-Id: <20220112221523.1829397-9-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112221523.1829397-1-kishen.maloor@intel.com> References: <20220112221523.1829397-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. Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/203 v2: fixed formatting 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 779ec9d375f0..e2211f3b8c8c 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 Apr 26 19:46:39 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:b119:0:0:0:0:0 with SMTP id r25csp1107829jah; Wed, 12 Jan 2022 14:16:22 -0800 (PST) X-Google-Smtp-Source: ABdhPJwo7m9uMtoQVzThc3lLc3baZgHR5AUcLIlqukqqacRYz+GKQcK8vjp9aM+/U6nJKvsZvhXu X-Received: by 2002:a17:902:6a8b:b0:149:82bb:560a with SMTP id n11-20020a1709026a8b00b0014982bb560amr1820173plk.158.1642025781964; Wed, 12 Jan 2022 14:16:21 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1642025781; cv=none; d=google.com; s=arc-20160816; b=hANnvYk009W5f1bPlUu0l6jKV3pcS3qvQaQ1g/aKgDf+cfYYj5phV+svLNWnY9k+F4 z8Wo39OyT/2xbGL7LCh+izzFms/xTMlJKJpD7V0LyE3pfyNWPzcpH17DSnA2XznNZYO1 qkMnPZYsJRTpxlTGQbFjU3n+BYzb+vrX1LF+5v6bY59yochs4n+XxxqY7aVgSzmPjT90 2/5OJjLws12Sq/ip4jQnY8bYVfVK4NGnPUm0SkInbE0VClSfgYOeIGPmHzjPF5X5byov G87v7052vj49PIDzuSuMpDuBTycMtn0FkZDEY2amXImXkBti0Xb3Kmr4HY07N+w4M66m gyLw== 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=o87dJffBdaugA1rfF861UyaCvSHEiF1kBecom9NmXso=; b=JhblhbJsZ09x89f39hLB/MfcIfqOA+gs33G2kfc/QgaDrVGvYdycs7TFu9XBQDMwXi eizoRmSYjRbBuDSyjR7PWl6sqORF45b2ohBGNnHLBM35h8dspArStuUlb8yFO34phRnJ wFazoPFctRWI3e7gMTWQuKcpnz6v54BJ6x7ZcwDd3jTdDCdCdg5Aq7cqsdkp+aq8IbuQ uo1/3rJdDP3OyHCDjuAcfco7n+hwrxovKmsZzcfhOnjJNADmgfKTAp9GeYSObv9kXH5f ZQRWco3gOf+GEEjMhTcZCz5zlIKIHfBqRthkZlBCCd9ARGXFNSeyMaDQ2/RI/RFPVdNL c0MQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b="I3Nk/H5a"; spf=pass (google.com: domain of mptcp+bounces-3082-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3082-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 s17si981745plq.235.2022.01.12.14.16.21 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 12 Jan 2022 14:16:21 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-3082-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="I3Nk/H5a"; spf=pass (google.com: domain of mptcp+bounces-3082-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3082-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 8BDF23E0FE8 for ; Wed, 12 Jan 2022 22:16:21 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 33B4D2CA6; Wed, 12 Jan 2022 22:16:15 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) (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 070552CA1 for ; Wed, 12 Jan 2022 22:16: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=1642025773; x=1673561773; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=Z5n23T2UVI+k7SO8+HolS8Wh5rW2dyUaMxqQnnY3ixw=; b=I3Nk/H5akzaKUX8E5ZuM82qBnosTEFEoE9s953JJCo4wuyZFdkJwleiY RhsEXBuP/w7G4c1mBLLwJeF3gHGi8eqhP+UTf8o1Yf2MTNPpqq9uzyE47 9szrGATG56Z+3Bn5TE+EyKpxbmHYpL9mr5Usn7zTYfuD4qhuvNsNG6xmj gbDxG21tRgMfKoAXJ4fbO8IQTCqcNJGWrEJFWGqw5lOnQ0UAhM38GX7sP jA3oRlSlKkeBm3AGdbh0D+WbaXQf05D92FpQPT+DN2/3nPDUVkATN/vIr b1uPiwm8N/wWJMkhXwy0fcrb16h60K1APWFGdkme3JJ/GUnoM3S3zEh9E Q==; X-IronPort-AV: E=McAfee;i="6200,9189,10225"; a="307213937" X-IronPort-AV: E=Sophos;i="5.88,284,1635231600"; d="scan'208";a="307213937" Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jan 2022 14:16:07 -0800 X-IronPort-AV: E=Sophos;i="5.88,284,1635231600"; d="scan'208";a="490907355" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga002-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jan 2022 14:16:07 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v2 09/21] mptcp: allow ADD_ADDR reissuance by userspace PMs Date: Wed, 12 Jan 2022 17:15:11 -0500 Message-Id: <20220112221523.1829397-10-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112221523.1829397-1-kishen.maloor@intel.com> References: <20220112221523.1829397-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 e2211f3b8c8c..a8c9a89ee1c5 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 Apr 26 19:46:39 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:b119:0:0:0:0:0 with SMTP id r25csp1107848jah; Wed, 12 Jan 2022 14:16:23 -0800 (PST) X-Google-Smtp-Source: ABdhPJzmQJuWNsuHB9uiq8VM+QywmpoX8nv6YoVUm2yfv+84Nz/eE/2wpNRO0SRgqhXc7wZUvpEY X-Received: by 2002:a17:90a:a403:: with SMTP id y3mr11357153pjp.80.1642025783532; Wed, 12 Jan 2022 14:16:23 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1642025783; cv=none; d=google.com; s=arc-20160816; b=zBzcIk/8gv5XvJ7LCtWn862WaLkqpQN4UopOGTxA/NAb74nnOyOXxBnQczrRlZOQew z7gcm5h9Ji/bJfTs38n2ys8tl5tOt1v5Zj+dG6iJEjgugVoNHgR/agzRxNN0su2jHMYV +tOR0xrYhEssI9FAaVQTS9fpDBI6GMo+f4XlphTIl+hVZBp6DT5z6YdR7bFxO/DKpj3B hIV/9Swj4d6L4O9+Fmc1ZT2usZVxyJYoyzi7knj0D7SMum8RTizqQXVh0Tg4RQMVJJkw xfiZuJ0PFfANjVMwx2yszfc5izl6afgzK1qJEn74QSajzH4LPQOWKWerUxKAXRC0s2Vo AK7Q== 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=QI0ylkwPgjXuMyRDjmBWdYzp/LJYvaO/fM/T2JNog8w=; b=lq6hIxZe5jgji2ZwgLrbzMbCwobaMaf+AjDFskdKoeqj2cRpIcZvqhOQKi6qKM8A7Q EvcsJFl3d6sp+PSI4gKqChgW9hqfaF1UZH5MdH0WjJumP0ZryRJxcN8EQFASakzBmaE/ fyAHWA4G/vfGIMPanqyWMnDbPHvEbRRD1fcCb3ormBjLKJqpDeNRqj8142pK4ivNRegF +DI7pElsvH15hMlTfkTDu8HDtCBcPbhAaDpQ9nKWKhP62sXhriCgI1rgmSLjW2mLEK3X HTSeOFkGF/E5SdAS6nRzipWM32P35I2ri5Vk+7zLItAk88ESw2EX9KosT06x83kEsY/h LcSQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=CF4eoyxd; spf=pass (google.com: domain of mptcp+bounces-3083-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3083-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 o12si1416697pgu.714.2022.01.12.14.16.23 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 12 Jan 2022 14:16:23 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-3083-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=CF4eoyxd; spf=pass (google.com: domain of mptcp+bounces-3083-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3083-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 A5C243E0F67 for ; Wed, 12 Jan 2022 22:16:22 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 4AED12CA1; Wed, 12 Jan 2022 22:16:15 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) (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 1901F2CAA for ; Wed, 12 Jan 2022 22:16: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=1642025774; x=1673561774; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=lBMtBBIaLYyptLinYA2sRrNd7xM53N1L9UuK6nFZQpc=; b=CF4eoyxdLFrYSVm7/kzNZe3ioS5JbHsP0k+lBUHX/BNnLL733I6lJ/Fe ClFgc6XCmoARCgdTKRE88Mglf0UlOJfX5p0y1s2Ck3bvnsNSSGu+olKgz cwztUbt0OYJCc40JRlxaaSHk1iGlbHgonFI/GT9xFR5AUAU7CrvrEY5LV jkwtU4eUm1ReHyEpiwuvU6zN2Z8yuJPWmL4ybXlfhhr0kDWl0FTyD9QTm piZ2/k5c+IqvijtGzGGhfBXZwitNzMm5YIjohPw1ILbBN2ndVu2xd1ORK ivtFRZbs2XLf4l3NrW0E/shQSS1dZygnFx2KRhEgrgU3U+bMl7Y9MZs4t w==; X-IronPort-AV: E=McAfee;i="6200,9189,10225"; a="307213938" X-IronPort-AV: E=Sophos;i="5.88,284,1635231600"; d="scan'208";a="307213938" Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jan 2022 14:16:07 -0800 X-IronPort-AV: E=Sophos;i="5.88,284,1635231600"; d="scan'208";a="490907358" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga002-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jan 2022 14:16:07 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v2 10/21] mptcp: handle local addrs announced by userspace PMs Date: Wed, 12 Jan 2022 17:15:12 -0500 Message-Id: <20220112221523.1829397-11-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112221523.1829397-1-kishen.maloor@intel.com> References: <20220112221523.1829397-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 a8c9a89ee1c5..052a803a7f71 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 Apr 26 19:46:39 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:b119:0:0:0:0:0 with SMTP id r25csp1107851jah; Wed, 12 Jan 2022 14:16:24 -0800 (PST) X-Google-Smtp-Source: ABdhPJynT8en4wtyZV8A9u4QDKvuPDlT3nLgBKK+fM0wUoDcZ1PcDX+FcwzQeC+1+32i0x1Ypyzz X-Received: by 2002:a17:90a:5b04:: with SMTP id o4mr1956934pji.20.1642025783873; Wed, 12 Jan 2022 14:16:23 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1642025783; cv=none; d=google.com; s=arc-20160816; b=UOKD2TvUUiQvpI1Jea2h9KwR6B4sC3uN1RLMnhpZHjBg+hQmRCzQE60OIBiJktzxPs 5W2t7NBBFN6QE34BLRE44iUrMSWTlLo7VEKlYq12KTeplqhL/17rByi7C6MzoG9wA16d e9f+xfFtsFiuxBYmT/cmYURKy6RUWy7qSXyF3LuYv8Sg3tN58/EpfasDwEKZ3E4/7imO ma13erUY7RVb2VC3KLQwdSJyxXDiE/vV3qpz/GggScrFtJstSoorwhEqcO+grqVpx4VL vg6iZGxav8Tk9u7V67wRAG7ZM74TNa187OF4SepW6/e5H8hOpQqhx3n1LWRh59ThM8ug TnPA== 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=+F/uDcYCwP8ScYvfcAQxgZzhECYnOJvlkEiYSLtsYR0=; b=wq7R3RpHPb4Dh2i2qM4RtUYzBmTYrFyZl3VaflXExvpYDZRVg3jZI4w9PssWryU2jF J+krEB6h0lb+HVQnPQOh9NdOcowsHatAeNm+MBwurtExO1+PqA5GrINW1HhGVjArr8ZC mTnnG4ktYkDig0PHLHtpilNmGg2d8t8yfheKAsh+hJMy0yZvzWiNvM3sYL5yHkILrysV 8VkTahN7ftZgDQ0Em5WOwpN7jC0Ha3dGnGvJP9mRAz0Vlp4rq010hJai8Erf0/vnPHuw yuojEf/Eeu2JkWR6vKPKmbz3wrCb/NKO27ujjC45lWvwYiSm0ZhntPJzDQOuvB3IvsoL 8JEg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=TDWRvqd4; spf=pass (google.com: domain of mptcp+bounces-3084-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3084-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 t21si917084plo.38.2022.01.12.14.16.23 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 12 Jan 2022 14:16:23 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-3084-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=TDWRvqd4; spf=pass (google.com: domain of mptcp+bounces-3084-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3084-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 A102E3E1008 for ; Wed, 12 Jan 2022 22:16:23 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id B82C72C9C; Wed, 12 Jan 2022 22:16:15 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) (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 B02E42CA3 for ; Wed, 12 Jan 2022 22:16: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=1642025774; x=1673561774; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=Os1olhoABT+f4KyuwprcHhMuPQjSCE5mLtE/+Pl2+1A=; b=TDWRvqd43x7D4kg3nqpir70LfJslOdkO4ImvLPmjzUYgnpghz10+Gcge mWHmcy9uAHMZJTRA1I+d6l6bwksbR456iKpNJb6ANm/JVSPxhuAYG56Xi THy6IAZVTAFqKAk0qQ8pj0Th0MIIXXdWDxJZp2b4okUCf/SuFg0XN0ghD lv/UCdnp0GUbZwKYd0z1CfE3HEsaJYTKYqlOrW+4icdukM1CqAw40Zlvi XJkJapZZYT7kcLAb+7V1hRiESR7B401w9PUXRDCEJErasoZ/A+pOIOsOF 0RVhidWhMaAObo01QccWIOgyNZw9ZkjVdAUxH1PsPOCf/gDLsZB2IzKfY Q==; X-IronPort-AV: E=McAfee;i="6200,9189,10225"; a="307213940" X-IronPort-AV: E=Sophos;i="5.88,284,1635231600"; d="scan'208";a="307213940" Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jan 2022 14:16:07 -0800 X-IronPort-AV: E=Sophos;i="5.88,284,1635231600"; d="scan'208";a="490907361" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga002-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jan 2022 14:16:07 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v2 11/21] mptcp: read attributes of addr entries managed by userspace PMs Date: Wed, 12 Jan 2022 17:15:13 -0500 Message-Id: <20220112221523.1829397-12-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112221523.1829397-1-kishen.maloor@intel.com> References: <20220112221523.1829397-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 052a803a7f71..40c41a0498fc 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 Apr 26 19:46:39 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:b119:0:0:0:0:0 with SMTP id r25csp1107920jah; Wed, 12 Jan 2022 14:16:30 -0800 (PST) X-Google-Smtp-Source: ABdhPJx+le0MOX/drlxohlQKoOwEaAcc1wRVguGcnxTLqVVy0SlLH7Bf/sTilq1HDYlnmTHhU3l9 X-Received: by 2002:ad4:5c67:: with SMTP id i7mr1555006qvh.51.1642025790219; Wed, 12 Jan 2022 14:16:30 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1642025790; cv=none; d=google.com; s=arc-20160816; b=UtLJwr/p7YhWjpkIyb3lMzmNEuZm2JquiC1hSn+M7HHGTobaADiuerOEq/sn4F8YIR r4DhIvTdQYVPXZkKk2Qs9U+B18NptVqtxqBdWKj4uB6r+xFvMirGyFY676glJGik+LyB W5tXnBJRFJVM1kTUH2XxqgfRBEWdYKKR5Vrs0A0ADj2i8RFYHkgwl7v++027j8s+qCA1 97zpR5z4KHgu7v2vD5nwp6Zg+3h030C8eLDlhxp589swSLRSLb/IkQ2Mf00MEIoT/JEo fp++/3W9knEorbyK1pMaZZko33gyapU7BW3sMSWDM51Ri+SHeOc7SKunxjXtBK/4wSrG v3mA== 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=HD2n2QbfI4mbRsM7nutR8/sqbw7Oa9ZT7YcvHJf+71Y=; b=Bhp5/oBJf3W5PBCm5KgZ3qwTiRqUe/NA8QaEUY7jX/pH/pUtxM4NrtMbL+2mPgcV8m VasODx51R2d/BzSPRl0o1ZV91lH3QWMGH3kYcoAW/GbTUZCiFrr0qBHirDCMbcPk1wTA DbwEa3/DAaM1WSkhVw+oMVdkvOA8P39LYsESUs9TZHX0tHyuK7COj1TiB/DWiTA9RQQQ th8CWP5hU4er+R88l5BqmAQ3OTOv1T7PJbXgBmBYmZispK+3vaWpK6LQBp6a9w7pGrey HQ3n67baj/dRv9Ln75tUXirFgjteOQVMP73zcOu/FTx5zgaNsjQF5G1sxkuJ2b7KNjjj Nj2g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=FDQeNYkf; spf=pass (google.com: domain of mptcp+bounces-3089-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-3089-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 b7si445429qtx.489.2022.01.12.14.16.30 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 12 Jan 2022 14:16:30 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-3089-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=FDQeNYkf; spf=pass (google.com: domain of mptcp+bounces-3089-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-3089-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 D03871C0A40 for ; Wed, 12 Jan 2022 22:16:29 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id C945D2CAF; Wed, 12 Jan 2022 22:16:17 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) (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 A31B72CAE for ; Wed, 12 Jan 2022 22:16: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=1642025776; x=1673561776; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=uoShDJYOgKUYuU2iNBikIWah0ou0hpOa9LnLcZTVGRI=; b=FDQeNYkfz29Ql/zbCeauDAeQl86ekr70W3sX62gRdjyZYCBWub/mZrXC Xk240U2OPMYsUAxubtbOg65VvZakb7y1UL2ScVcVfL4VstiN3npE5KOr7 Ok1JDHf31Y0UGE4oOgz9Im/Iy5nqV+nrjUevxuheqoEELzqj6Ia4jX7xY Xvdb1JsNj6AwyiEHmXOv25CeifapC5+Hg8EFtx9R573JKr4bXCR1ZfH11 yIwgLX4GPYHx4SB/f2QMBixAQ1qsvPukfX+aDPUP1cKoQJO3uvB99LlRR dWzQMDB4js13Eo8Ghhy7sbX4xqe0R1Zyv9SJhIoxzHD7oHPpmBWCreAen Q==; X-IronPort-AV: E=McAfee;i="6200,9189,10225"; a="307213946" X-IronPort-AV: E=Sophos;i="5.88,284,1635231600"; d="scan'208";a="307213946" Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jan 2022 14:16:07 -0800 X-IronPort-AV: E=Sophos;i="5.88,284,1635231600"; d="scan'208";a="490907367" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga002-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jan 2022 14:16:07 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Cc: Florian Westphal Subject: [PATCH mptcp-next v2 12/21] mptcp: netlink: split mptcp_pm_parse_addr into two functions Date: Wed, 12 Jan 2022 17:15:14 -0500 Message-Id: <20220112221523.1829397-13-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112221523.1829397-1-kishen.maloor@intel.com> References: <20220112221523.1829397-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 40c41a0498fc..07536abab3e5 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 Apr 26 19:46:39 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:b119:0:0:0:0:0 with SMTP id r25csp1107884jah; Wed, 12 Jan 2022 14:16:26 -0800 (PST) X-Google-Smtp-Source: ABdhPJw1/nxTtSo0EOF5OAxXhmvVcGnzJiMDtWLjovmTGygKZsO242JQBhFXC5WjVGCzpdSIcRLr X-Received: by 2002:a05:6214:767:: with SMTP id f7mr1851658qvz.129.1642025786779; Wed, 12 Jan 2022 14:16:26 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1642025786; cv=none; d=google.com; s=arc-20160816; b=X+h99bN2SYORPYIRsGHNrWqY13ZUZnpPAeTC7DFUAfyXnLCfpzqRxV1ZYWdXKRKXpH mym+QG2Zh/ktc7VKK9xVrnV1ZGbXgnq+LCGdWDVkQ+0FjPmE/YuQtFuPthwbOoQ2k8kB 0opD56nLy6Iu5wUEbmHtlR/F6ushMwuPvCs6ArRQyR+MTf1OcZdvRcwp14+KbJO839tK +Trtr3v0Gx60FG5gXF6EL9enP3r88i109yv0vpxyjgrs8jc/BYOWeKLkvAWyWJsd4X+o a6cBPIrKq0PKPDyp6b8GV8cQ4iYDrEKF5S7jatQJ4UXcjx2ZLpy8o8t9vh0Tw/K1CCVq kGoQ== 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=Ag8wisg1zQwrLPmav3LR7ZlbyOKYYF2Zk6NMhnmH0UU=; b=h5yQN70yudGSUP9JItWXCfVFaqEYgDxn4tP5pP5nB9M25vRYNiXtA26DAUAL2xeWzh hOBtk6LZbyyWuEe/ecQnNxhWGC6T3B2DUdMPxkVxuXzasjw+VeQf0BJp5LA1lAcMRpKc /f+TvdDAbTfictAyPLixzuPim77Qv5++2d0Dt+/u+R19B0iU+POHsmZ3CLQAqeqNpLeK rIf2VfinwBzuWXtKtrFmeI94x8de43jr1dJSWT8Sx4kAGWkhgCTMuZc/+pyeoxLTpTBr ku4vHvMHWCkrMYfDv7NbN+OW9E5VAMdJoGHOmjukibJIQGsIUdzVTag4vI5mRfaUTNUU 4dlQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=VJcWwhKF; spf=pass (google.com: domain of mptcp+bounces-3086-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3086-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 q20si462819qkl.486.2022.01.12.14.16.26 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 12 Jan 2022 14:16:26 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-3086-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=VJcWwhKF; spf=pass (google.com: domain of mptcp+bounces-3086-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3086-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 554E61C0F05 for ; Wed, 12 Jan 2022 22:16:26 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id A1E002CAB; Wed, 12 Jan 2022 22:16:16 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) (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 4F10D2CAA for ; Wed, 12 Jan 2022 22:16: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=1642025775; x=1673561775; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=0+h/iXIh6mNTcFnZd/G+FlbuuiNS/D5duyzulb8bbEk=; b=VJcWwhKFlPB4Gcl3aIFoNq9PHC+07EuVVs/9fPtPQoM2vGPv4wu5y5Bc NQL5q6K2rie3ol/ESloFpEUYeiSZKNwNXj6gPC+nc/k6PdXMCaCYPFoGg pNg/Frc6EN8k0g9nTho2MHUZFxGk7yz/nKGesK06rWrbasQlSBKfoHKss WIffP3KZAbMajo0+wDMJV4RuPChPEL8VlGN7/2XBE11/7YUrVvia0Buuw 22avlw1H9rJTVLr3EdUQjSL+Axvkh10bZbeQAlgtXc8wsD9zLvk9Tb9ci 7JRrqrwHnPLCKENhtEoPV877atz+nEMez/IB4hea+rvmqrH9jDw2frOv4 A==; X-IronPort-AV: E=McAfee;i="6200,9189,10225"; a="307213942" X-IronPort-AV: E=Sophos;i="5.88,284,1635231600"; d="scan'208";a="307213942" Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jan 2022 14:16:07 -0800 X-IronPort-AV: E=Sophos;i="5.88,284,1635231600"; d="scan'208";a="490907365" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga002-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jan 2022 14:16:07 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v2 13/21] mptcp: netlink: Add MPTCP_PM_CMD_ANNOUNCE Date: Wed, 12 Jan 2022 17:15:15 -0500 Message-Id: <20220112221523.1829397-14-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112221523.1829397-1-kishen.maloor@intel.com> References: <20220112221523.1829397-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 07536abab3e5..18228b2dfa2d 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 Apr 26 19:46:39 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:b119:0:0:0:0:0 with SMTP id r25csp1107865jah; Wed, 12 Jan 2022 14:16:25 -0800 (PST) X-Google-Smtp-Source: ABdhPJxUUDGpnKMhnMQd3BzFr/77TWNBs8u//FRxk8ATwSkw0x3WzpAWPH45FCH0ESQKYyaMIEsW X-Received: by 2002:a05:620a:4108:: with SMTP id j8mr1447863qko.410.1642025785444; Wed, 12 Jan 2022 14:16:25 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1642025785; cv=none; d=google.com; s=arc-20160816; b=owL+bGf32pBg4AeAtt74to0tHxviuVonROJF75GH/IMYuWjrRjkLo5KnakG4QBTtqx LnS6PmFS1U7AHPqJNssgCNR1g9eQ+WHLjl+cOB/DqPS8XLi5hY+6vCIyYqCVz9ZQEeuB bXwc9M3CWJmwU/C/8W3ZCWBJqyOBw4lCrkjNHKdn5IPnoEPbEbosFMHGY6M2VI9XFjTR /Ow5ylKMymJz/zUINi3cHKKyeHl5cUsNQwAxbosKL0tnP4nhLzmB+Jrt9LQ1BCprVzlO xJvkcDxbNHOOB1slNVamC8wwRs0PzXsTm+TiwYox/5Qecw1oeeMmIEELMpfUSzyp3Gbz AYpA== 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=mbkiS6QDuVcT9IhWDtsm5aB/vCgb9BOcD07K6bLnQGI1WsXKgfoXaPu1jSo6C+m5WF KwPFMenHRgH3HqMzf9oiePyTWMaRLq4BGp10dhEtkb401rM7MvFnVuvMApXmYVhRmpfc 4hi4EgNZ3lY16OukRy62L9NqIIJgvzdkhA/e/Rgj0lcQIFtXkRtHDYdX8EOQlq9Ovlsl gQtlPLqLppFz5v82iKrHXYxgfNka+MFy4OCVl3qGOr2jBCC5UJ5/2Ws9xLHw6I6Zk46D 8CFJ4Ns8HxM2E9ugSwpBAKYUH3mq7QQrJzZkDPA9hCc9j90kb6yBKN7qUPijmSApvg81 T1Xg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=IqZrlJUa; spf=pass (google.com: domain of mptcp+bounces-3085-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3085-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 u36si572424qtc.32.2022.01.12.14.16.25 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 12 Jan 2022 14:16:25 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-3085-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=IqZrlJUa; spf=pass (google.com: domain of mptcp+bounces-3085-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3085-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 442CA1C0C62 for ; Wed, 12 Jan 2022 22:16:25 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 41F172CAC; Wed, 12 Jan 2022 22:16:16 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) (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 369AA2CAB for ; Wed, 12 Jan 2022 22:16: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=1642025775; x=1673561775; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=0PKIoAWBG01b+R+jq+AHrVNak7XFUEjF6B66uXs43o8=; b=IqZrlJUaw47+dNjrI+fVxML9CjOy9FKX2963AJLEmeFFs1TyETqpvA8p AkHbHWZvjo9WKlWcRVzcKgQ+LQxPdVNNT95/IVKBIcBJmOAdb5oEzAkjI iNI95H2cqub6uF/4QZ2doMY51NLuTCs+P8r80S+Ollu2H22qSety2Rukc pPpbFmBL0ncmRsfmyr6MgrPqg2l4yLR52Zsfalqm/KRWGjOH1+lrWuRtD 8Q+zHN2yrlKR/rtqWDoEBZRKhCS6z72YbO/xWtmKZP+KRAy3LaLToe9jx 0c7RWfNgrcuxh7kh5+rFjLY0PEw6PHB7cRz7fRIsdnaebFxIWUh6Q3SDE Q==; X-IronPort-AV: E=McAfee;i="6200,9189,10225"; a="307213944" X-IronPort-AV: E=Sophos;i="5.88,284,1635231600"; d="scan'208";a="307213944" Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jan 2022 14:16:07 -0800 X-IronPort-AV: E=Sophos;i="5.88,284,1635231600"; d="scan'208";a="490907370" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga002-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jan 2022 14:16:07 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v2 14/21] mptcp: selftests: support MPTCP_PM_CMD_ANNOUNCE Date: Wed, 12 Jan 2022 17:15:16 -0500 Message-Id: <20220112221523.1829397-15-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112221523.1829397-1-kishen.maloor@intel.com> References: <20220112221523.1829397-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 Apr 26 19:46:39 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:b119:0:0:0:0:0 with SMTP id r25csp1107892jah; Wed, 12 Jan 2022 14:16:27 -0800 (PST) X-Google-Smtp-Source: ABdhPJxRqAM9E3hNMyBqlsI3oCqyJ+zM0m1wkEflKPFx+BHjgVYT7BWNDuFo784ijL2iKuWyPwGT X-Received: by 2002:ac8:5890:: with SMTP id t16mr1481220qta.177.1642025787847; Wed, 12 Jan 2022 14:16:27 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1642025787; cv=none; d=google.com; s=arc-20160816; b=eAohPgx7RHHB+rInACDuTqNhrZNJslKqEJmBXnSV1WhLyhfQXvikOtGsFu+OqBxo3x Jc395zTAVml73MM2cguRHz2lRbsNbyEvikn86CWyfH5M+ch4v6Nh63OQj3A1/VG6Bn96 2r3VWo63U/PgVrgr7Ee/A0m0/cmjDa7yfpE+cM42z9+SgQmsETA1sljjKDJWq+NyXXaQ a7vMwzMYK+fkZnDn9BxeksZzrmZsgITw7oWPjU7dz1G9f16G5IvSDUiQGGhPCgOHnwl6 t7h4QdoG+vuavHaZ5+btUMilv526aeuqFKw6tGxfN7or361Rdy7Lhrey3AOp/ihvsAza tW9g== 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=w0wR/MP6Kx6DMqXQJOOqmmFc4S+aNO9pELZh7RIJ9ck=; b=PL8tmIl2Y6txXnUaGUBc7+UafIB25s8moNu+gyFCB+2ki3njMAnu0+h/nHhGlO2w7J ccNTEaJwh8vFAHB5XiJRdd+zgWYJGNZVTC88SDQp1WPWTm08TvDICm20s8pGwbziytrx VJT28TIT+yzAnvG1P90Vk9bxCB4DSzgXbdhq0lSuDyCc3DYjthV/f1pV11NndWCrEHUB kdU60MlcpjIq8rFYks1nRI1L6hvwXCCrNbhE/YTCBb7NewuHgpFzlG8JcMeA9dWZjThf 7QU9tsFiSy6pbVnRvgefFBI4HEyrWSeDC7tSNutbD5pgsCgEL1bC8ugwmz9eOGOzrNbO Em8w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=S3TL0Qqp; spf=pass (google.com: domain of mptcp+bounces-3087-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-3087-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 l16si514343qkp.165.2022.01.12.14.16.27 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 12 Jan 2022 14:16:27 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-3087-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=S3TL0Qqp; spf=pass (google.com: domain of mptcp+bounces-3087-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-3087-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 8E5FF1C0C62 for ; Wed, 12 Jan 2022 22:16:27 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 003AA2CA7; Wed, 12 Jan 2022 22:16:17 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) (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 BC2BD2CA3 for ; Wed, 12 Jan 2022 22:16: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=1642025775; x=1673561775; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=gmvUV2eLl4VmHm5SsVMrkJdr5G+PdFvIrQsxt3Rbk34=; b=S3TL0Qqp5TRnRy8PAUYfVES9cnLOT0vVPJ52ftk4b2taH33xtJgQv4kI Nzi85M9J3aEsn4tLw7YJqcZsBn7ZfuSLWRvIfHNP9xsbhv4bYFUvlTiyK EIOSsR6ed9gKNM/iXBaJqE9Z8fHthqs6frNgcbf+N3iaOyfgVsKcbpbmr OIxTyT+J7ZBAyeBtVHneaiIP9sY+yTUg/L2MwbZe3veDiwT/FhxCB8wON EGWUYmxjxUIySrXLi3EFywPHHfXbFwBKXVqVzDRui5e1TBfwNu/P0K5f1 elUNF5uJEVb4u9q+QjCfJU/ZIimm0ph+JO/bnOAruaIYOGrUvIzs2Zb/n w==; X-IronPort-AV: E=McAfee;i="6200,9189,10225"; a="307213945" X-IronPort-AV: E=Sophos;i="5.88,284,1635231600"; d="scan'208";a="307213945" Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jan 2022 14:16:07 -0800 X-IronPort-AV: E=Sophos;i="5.88,284,1635231600"; d="scan'208";a="490907373" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga002-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jan 2022 14:16:07 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v2 15/21] mptcp: netlink: Add MPTCP_PM_CMD_REMOVE Date: Wed, 12 Jan 2022 17:15:17 -0500 Message-Id: <20220112221523.1829397-16-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112221523.1829397-1-kishen.maloor@intel.com> References: <20220112221523.1829397-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 18228b2dfa2d..bec45560060a 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 Apr 26 19:46:39 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:b119:0:0:0:0:0 with SMTP id r25csp1107908jah; Wed, 12 Jan 2022 14:16:29 -0800 (PST) X-Google-Smtp-Source: ABdhPJzRZXhClKJSCxVWlem4+EfRsVTV6144h2xBDVWYRVX8KN3cgazFu4r+Dgs2Y1hrWT0RgDpW X-Received: by 2002:a05:620a:244c:: with SMTP id h12mr1364581qkn.381.1642025789081; Wed, 12 Jan 2022 14:16:29 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1642025789; cv=none; d=google.com; s=arc-20160816; b=HHWxkHXeX/M8adDepTOExjvCVDZWVYT1VdG9ktV5R70eUWrgZeL9XWL8iLKEcojVEm nlsNQlrPCZGKxj2qS4Cxm7WUEe9PRADZ0uvxieG+TTV39scpTfviz8Naq0/dnOhR1N3H 52h+JPHg1KFQdbWHd/piIjjYNDm8vmm3sv66TnNBcpc/GVCYceWUso8EqERvYRiRhqbx 8Z7oimBkPx7RyeBUSdY8jWls/wV3j7X7tWxj0uFCbmBa0psZR7kBpuQYhajBvL9k9C6K Oi2Ksi+iHCom/Je3kVQ7eseiXLJ3SUNHgczdiu93asnCrRR2tWhxvulLO21ytyuF0Ed6 hLGg== 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=FqGue3c7Q+d5eM0JUBt0QCnwr444z8UFPVbpoCHbd8JCv0qpRUSMQKMYlQcOZPxd11 e8oFiRoaI/s9q9JqO88to8BIXzKhVJIsxbPk1g6PpKY/9vWsHbuXf5CDuf6Fj3aXiNAs zT5sz0Dahr5h7Zgk28NykwgsIZtKBXpM0Xc9tCQpe/HY9KjejdxU7xIcxbBeOTFZuAjb pD7wwR4No8OWo1AvQSxfDNGa6bgymdWll0HaC+wGlVrbZYEGhfTGr7dsTmAuQ1V+2Gvw cYKGON/iHmRNVWNmrqc7zT9yb0AyxMw3WzqQ2OWm77loYBTzFduCl1XbTvgaZhpbUxpf q6vw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=PtpeG9tz; spf=pass (google.com: domain of mptcp+bounces-3088-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-3088-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 g4si613491qko.191.2022.01.12.14.16.28 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 12 Jan 2022 14:16:29 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-3088-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=PtpeG9tz; spf=pass (google.com: domain of mptcp+bounces-3088-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-3088-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 C0D7F1C0F0C for ; Wed, 12 Jan 2022 22:16:28 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 427022CAA; Wed, 12 Jan 2022 22:16:17 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) (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 43E322CAD for ; Wed, 12 Jan 2022 22:16: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=1642025776; x=1673561776; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=C2VI5SqdOWAektSC7DHL1vhcCvIC6JSahI3lmtl6KNM=; b=PtpeG9tzHRKmuEJlE2tHfE+6dJTDB4SeMxKme7Of5vDkpQ08RbnhrzAx tUShFUzLV5u3iLZc4zX5lTh1tseE/2MVx1Fhsk2o82zz3Tl6O7bYQGOvz 6o8SXyQaoBXnIuCNi67dAA33o4hjlIHIg8Mg1npB+Bdk+WViOln4zQFj0 TRqRgqeRHrMu5g0ixfZpUdKi3MxioP21F+yA2rHcxIM+FF90Ve6udIHZg JNM470v0EAhkfEqBd+iJdSMzH51vnJAWoMoIeLwIn7+z6JorS3To959mo R40mgliJwJVh7OeT1k3S0CXxJMROW9qL3DO/gF4V42bEsdgPvq49xdGD0 g==; X-IronPort-AV: E=McAfee;i="6200,9189,10225"; a="307213947" X-IronPort-AV: E=Sophos;i="5.88,284,1635231600"; d="scan'208";a="307213947" Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jan 2022 14:16:08 -0800 X-IronPort-AV: E=Sophos;i="5.88,284,1635231600"; d="scan'208";a="490907375" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga002-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jan 2022 14:16:07 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v2 16/21] mptcp: selftests: support MPTCP_PM_CMD_REMOVE Date: Wed, 12 Jan 2022 17:15:18 -0500 Message-Id: <20220112221523.1829397-17-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112221523.1829397-1-kishen.maloor@intel.com> References: <20220112221523.1829397-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 Apr 26 19:46:39 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:b119:0:0:0:0:0 with SMTP id r25csp1107950jah; Wed, 12 Jan 2022 14:16:33 -0800 (PST) X-Google-Smtp-Source: ABdhPJwQ/rOJa7jXdnHokUANAGDg3bfcu06Wcqk0cVQ8jS9lba2G4JC0ykCDe4iCAtX4qsVQNjRg X-Received: by 2002:a37:a7c1:: with SMTP id q184mr1438182qke.382.1642025793651; Wed, 12 Jan 2022 14:16:33 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1642025793; cv=none; d=google.com; s=arc-20160816; b=ydihh3GePkxXH7XDDqoZvqIeReLGWoVE2HNl/KgDoarF0jwHTeq8VPR61l1WFE2fEE tNfb/Jg5A1JiKrtkVfwUaR67FKoUfWOIGWezlKuMw/DGdQrMfmxjG84jWrKBHI2UBsBe Adpyco1yg7aevQCIH+24prcIzNH6DWBaSz93vajRLX488beQJIFDpwnpj2xs71QlBX5B VPa1uowGSDqJxImcegT8E5nB6pdvk8S94ekyqAwMr5ZjuCi2hsY2y+uStz71T1j82yMo Yqb1QzjcDYDa1Ha7iVj3rkreemRcSYLyzq1TJrFm6Lu32Qa/MQfflUq84kUizu/dXNQa TD2A== 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=m1EP/yhR/5KCkjdxyF0bwFMRXnfjW8vkIBFwF6C54Ss=; b=oPWudFs45IrvMkcpliLYH67+DYuJUcFefatN08KnFCIJJF83aELKaBtoyIGRriCdY7 Ykccr56VMe0FTq343OnmLdF2QDFhG4DwCtuOtItwZI5cRhQYbd3hCxvzlNBNF8yO81Pm PVDVKlhBBdhEV3Wwmw1Bz9Nq7MM0SHCZVPR3dwB5DWM2CviqaxpjfQn+mY2dRRApSlVq OD5zCLtWSOfr2jnqRRbplP6XvyC0YVOYKA4D5CNujj46ukxhYuiCHilmWhHZ+8SjdVN5 Y5RWcNgZafxcVN1HdR6FmNP/+U8MZu7Ltwb8foIjHVuG+8sqZ5jW0oRsQtyohvvF7PwA Vu2g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=hfSsIHAd; spf=pass (google.com: domain of mptcp+bounces-3092-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3092-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 bp18si533387qkb.244.2022.01.12.14.16.33 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 12 Jan 2022 14:16:33 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-3092-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=hfSsIHAd; spf=pass (google.com: domain of mptcp+bounces-3092-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3092-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 4A8361C0F05 for ; Wed, 12 Jan 2022 22:16:33 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 311842CA8; Wed, 12 Jan 2022 22:16:19 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) (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 CCB2D2CAE for ; Wed, 12 Jan 2022 22:16: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=1642025777; x=1673561777; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=178c9096rlc4KEO56Zl58LnuBziRF0ls+RHQR+BCnLs=; b=hfSsIHAdxRv5WcNRUsNBka4P9fynnKVvUsKiRGxBpDbRo7mCS4k9lb+N rBQ5XC92hbu+4bvdKoxoqApFtWkvO0QMilbDk3UBDk8Ch06AWQBHYulu3 j7SZvaw95E8ApAaPhqCbjUO1azbx3r0dHFmas2yvERSPbFGYfLX1gXqBt ZfeE+SJ9nY+E/io/ZfXajLcI3R8dOQDejUow3arFzDG3ftUqwJwVzbBAD 2bKmwInLPn5eMDLgG8mEZPvN9+L2NlgnOjt7hOXSEsf43qYiCFp+OiV5s psao+Zj4/fVGHaJytH/UJgyDJZnItJLh3hO+hp9zHgeNUjAQUV+rAkmwS g==; X-IronPort-AV: E=McAfee;i="6200,9189,10225"; a="307213951" X-IronPort-AV: E=Sophos;i="5.88,284,1635231600"; d="scan'208";a="307213951" Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jan 2022 14:16:08 -0800 X-IronPort-AV: E=Sophos;i="5.88,284,1635231600"; d="scan'208";a="490907383" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga002-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jan 2022 14:16:07 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Cc: Florian Westphal Subject: [PATCH mptcp-next v2 17/21] mptcp: netlink: allow userspace-driven subflow establishment Date: Wed, 12 Jan 2022 17:15:19 -0500 Message-Id: <20220112221523.1829397-18-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112221523.1829397-1-kishen.maloor@intel.com> References: <20220112221523.1829397-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 } v2: fix build error when IPv6 is not enabled Signed-off-by: Florian Westphal Co-developed-by: Kishen Maloor Signed-off-by: Kishen Maloor --- include/uapi/linux/mptcp.h | 3 + net/mptcp/pm_netlink.c | 206 +++++++++++++++++++++++++++++++++++++ 2 files changed, 209 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 bec45560060a..c5cb0630af47 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,190 @@ 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; +#if IS_ENABLED(CONFIG_MPTCP_IPV6) + 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; +#endif + 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 +2744,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 Apr 26 19:46:39 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:b119:0:0:0:0:0 with SMTP id r25csp1107928jah; Wed, 12 Jan 2022 14:16:31 -0800 (PST) X-Google-Smtp-Source: ABdhPJzNRp9HyP98hDhZKuWftbXUf4Ig7so6DbLWdSeybLR8HXZNMy+YyDeXmx6owo3i3JmyPHlF X-Received: by 2002:a63:cf04:: with SMTP id j4mr1468474pgg.278.1642025791188; Wed, 12 Jan 2022 14:16:31 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1642025791; cv=none; d=google.com; s=arc-20160816; b=yPkQQVAy/THyza31paHnTh6/DT0e2TishF7wWx7yobhi6UpcH3B05PA5CfritsjG3a mX+/j/TfzbkeNUE+aEZVG3SI9XtyNr9t66fQYmCaK1OuaMGwkjvAHDGNryAwOF4Gjy2W SHBovctTrHpTxwl8vpxPN65vAU82s+FpapluF5oiPvXBtzQYABXS2r/v/DZ2u35NIj9J V8VcS7agY7UBsMVrTCtkVnwRfshUJ8G5QfyuKdNP0Votz1f3QSEwSS7rZBwAv848ThmW xwllyFK+19IocJoDgfCKeK7bjQw6oPThC4f72fppgoOrp04y0n8HcGOmnWyo5Q4kNyAQ UQnA== 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=cSv5MADRY2MX76sUlf4X3+iDlzxLW8jbKsDf4uFk8+p0603moU8Z0Z52v9dBFUH3w4 +DPUeUhrUKzUCtCvnKu+S49nuMI9bqo34IOWtLPj5yJSsfp03wvH6bzvygBrfrsw9BFk xG5YVzqcfBtkhrCtPPbmegTKzxocXz2b9WYumJi48N/QN2MNAfikHEmrlwlLwcwes1gp 8o0VFFjUVsvli7Y1Q1CaSzDpmYkH3G+00qDPi45PxLiK5uPi/ARgzAW45ijW2P66qIeG XUhjhRatUCUHNLGd7yJxYuVWm0ADyjEJ8vbgT/jA/J0dSIXf1ckNwktiUBk6hdr+4CWw DCSg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b="O4BAJ/He"; spf=pass (google.com: domain of mptcp+bounces-3090-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3090-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 c18si5964463pjr.142.2022.01.12.14.16.31 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 12 Jan 2022 14:16:31 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-3090-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="O4BAJ/He"; spf=pass (google.com: domain of mptcp+bounces-3090-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3090-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 B71D73E0F67 for ; Wed, 12 Jan 2022 22:16:30 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 0E0A52CA4; Wed, 12 Jan 2022 22:16:18 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) (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 055262CA3 for ; Wed, 12 Jan 2022 22:16: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=1642025776; x=1673561776; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=Ss88/Z8cZv+ydYrIK8WiMimZ5J5bKagfo/OUsPdr2NA=; b=O4BAJ/HeXievmtsKhhEXo14/HvdihK7ktVJm4cCedatb5LaxY/g+8B3i zPe1+fOWpQHOw+rw7Z0w1tqPgngj28tmzhyoMQt0Y7yPaNpN1NQSlmj5D g9qTXoP8j0jvVffu4qKlTAH6phh9MJnwHQf08/+VYmF5Fph7CP1pc9UVO AUFjT7MKYTT4OVAtNvgKjmyVYXGbBg5rPL/3UVt3oPKv+ccVMjn1STGha 42c8qSM2q3hyGUe/KQeKJ2A88FMTY3CjGKDbrytYQnfIrr/XFghyx7Z6l Rox9VU9ae5DvOKTPvQ+xRp4VC1KAB3VAdD0dCh0jDLE1Zujrt/oo8qdua A==; X-IronPort-AV: E=McAfee;i="6200,9189,10225"; a="307213948" X-IronPort-AV: E=Sophos;i="5.88,284,1635231600"; d="scan'208";a="307213948" Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jan 2022 14:16:08 -0800 X-IronPort-AV: E=Sophos;i="5.88,284,1635231600"; d="scan'208";a="490907380" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga002-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jan 2022 14:16:07 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v2 18/21] mptcp: selftests: support MPTCP_PM_CMD_SUBFLOW_CREATE Date: Wed, 12 Jan 2022 17:15:20 -0500 Message-Id: <20220112221523.1829397-19-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112221523.1829397-1-kishen.maloor@intel.com> References: <20220112221523.1829397-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 Apr 26 19:46:39 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:b119:0:0:0:0:0 with SMTP id r25csp1107938jah; Wed, 12 Jan 2022 14:16:32 -0800 (PST) X-Google-Smtp-Source: ABdhPJymVvr7rVC8bPdxbqTeN+k//Zd+h+kP3NUdaFVsTm9genrd0dOrVL1jyQb11WrFIy290Zl5 X-Received: by 2002:a05:622a:48f:: with SMTP id p15mr1537519qtx.262.1642025792525; Wed, 12 Jan 2022 14:16:32 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1642025792; cv=none; d=google.com; s=arc-20160816; b=YU4tloT7vD4mZx+hnROUN/dd22SYBqphJ5xBq1i+Lk89SQHxDpmRGROsucKDhbybuy Ycc/WuICwqlBcVoBVRdjfF2+u3PGK+HFLof3LSi8XhjlqqdW9CnDAJy32J/grhQtrjwx 9cgOii6+q5bS22k8Nu6i8lJ0X/Kq7J+n/6U1hNWarqL/hNtRmTwDorYjUcqe4NZW62Jj i2TRpVtBqxxfp23z42kaHLclzebkwW2YMgKoqOZ8yExlhjFMkRtAfVHshvz/ZY+JqkPN 5/katbgsB5lncjbCRQGAW2Z/MVptwML4LBE5zfO9eDEaDb2HqVQZPY0ts6Z3bkA2gens QRng== 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=U1h/OkuGG6Jbln4lAWpgyPX9PMAEw7brDc45v6gHkvu/OrjpV0aq7gpSElS3jh3gy4 afwSt+0Hr2zLZoCeYpIiqaztKuGvqbW2mug9TMGgGTEfbWJmdRhuI2w5RmVuutbzTsHA 9p7sWJkmDwcatx4R3KK+ce4fQOtJ7l7dK31SddDWRxKTHJLw3OzR0NQsWVGODGylTGi2 dbTj0UWiaEx+ysct98lWPDYukQizc1BLgBxVo2Y+NDlR0vEdSd475Zv2CAUAWzncAsmK LLUs8yjTSk4hqOwRNut5cVUfxvqX4gsNiWJpRG/6cHXMPhY3cQpzIVic1OtrNh38FAEw m+IA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b="g0dGrN0/"; spf=pass (google.com: domain of mptcp+bounces-3091-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-3091-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 u15si533153qko.270.2022.01.12.14.16.32 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 12 Jan 2022 14:16:32 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-3091-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="g0dGrN0/"; spf=pass (google.com: domain of mptcp+bounces-3091-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-3091-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 408D21C0F17 for ; Wed, 12 Jan 2022 22:16:32 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 6E3982CB0; Wed, 12 Jan 2022 22:16:18 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) (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 46F302CAD for ; Wed, 12 Jan 2022 22:16: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=1642025777; x=1673561777; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=5IRYVf+yP3lJeyrB8sJznCtfheJgIQEIASvT93RX78M=; b=g0dGrN0/MZhRdcZXn3R0YHRq0fplhBwPDXSvlwEDarYGWJzBeVmxNYMk 4hVH0T65tcypWJRl/Tkl7QwGBBiCct4eK/RTxkeDZsIp7KkDUgZUwEDbh gtPjg2zwFoDOxFHMoHJsx2se8JprjUWiLU0akz3OBSyi0nbgMtYTdkUzx VkIS86Ce/uX6mGwIi6nBN2jKqLNJ7wq+sjSL3wgOp+6SgljZ3M3er6RZu S9ltSRX0UD9gu571KaGxdnH4jiZBgpKgeNVOdgwHraDWt7XJDZE7+teDc 3EJYMtmLFfD2fMUdJ/eNmfWlIJ+8acbUeqx6eTUVWajQOmVIbIvqrrBQ+ g==; X-IronPort-AV: E=McAfee;i="6200,9189,10225"; a="307213949" X-IronPort-AV: E=Sophos;i="5.88,284,1635231600"; d="scan'208";a="307213949" Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jan 2022 14:16:08 -0800 X-IronPort-AV: E=Sophos;i="5.88,284,1635231600"; d="scan'208";a="490907385" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga002-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jan 2022 14:16:07 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v2 19/21] mptcp: selftests: support MPTCP_PM_CMD_SUBFLOW_DESTROY Date: Wed, 12 Jan 2022 17:15:21 -0500 Message-Id: <20220112221523.1829397-20-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112221523.1829397-1-kishen.maloor@intel.com> References: <20220112221523.1829397-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 Apr 26 19:46:39 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:b119:0:0:0:0:0 with SMTP id r25csp1107965jah; Wed, 12 Jan 2022 14:16:35 -0800 (PST) X-Google-Smtp-Source: ABdhPJxJ5ztoJ6kNJcDPzmF+dxPj0+NzgwaDvs/44L+zaC86QkHsjx+E57h6wuE/DrZ38tq1F8xK X-Received: by 2002:a05:620a:2942:: with SMTP id n2mr1419606qkp.340.1642025794922; Wed, 12 Jan 2022 14:16:34 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1642025794; cv=none; d=google.com; s=arc-20160816; b=elziWtpH8d4t1+CRJY+TV2DZCE4xjYhIxQs4HDAlj6gsP3hfbmKcW9cbVtDcIkMcoH 8QZ1kJRFNM3N8EXKGgNgkIbhrITZNbV7baWz0uHRPi4Zq3W2onEfd0K/SZPDOv9ISmJW 0Hj4IY16t5AdmeQNurTHQ0FODMWKLcReOCiRtkJ/4fPf0bcx3q4a5T6Bdm4DO04+PbF4 qOf4hj7dtfdIgaoHcgozJ71fAwnE3zGLuk6Iwl9TaKOom+cESLwlEOHxgRrXL8T3w2ny rIWa8usRaE9poFCe825Dq3h5LHDApu8ElC++ndSU35Ec2gegLl4u6ilVDhiS9ZfVVMJx UnWw== 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=cZf8QwxLKctp0NHY06qHgfcL7RM1v2Dtu4zP1UbIlj7rEStCZddMYL4i/eDfc94WBh f9Hryg/NnZXBvHJbL2ilw7CLEZ7d4t/l2KwpAYxBCv4gEWQCfgmH8FvN0J3e1gPcX1kO QDxUWN+W2zIeCH0u6/xz1tSorwbwl9Hl7ZO23603VK8dUI5s8rrtEiqBn1VYYVccFJFA c5fauGUXXk67vciFfnLFXkeH3SLLdO2MNIsey/cvruuNgp3ftALOTYkLuT7gXWeyD09N /rwQK0ySOD/OmJwveN5mbLxMTegzxT9hi0U7SwpKa/W/PIx+cfxyDLnU6xK4ZO9kLI0P 1q4A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=j6H5adKO; spf=pass (google.com: domain of mptcp+bounces-3093-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-3093-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 j17si656885qko.444.2022.01.12.14.16.34 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 12 Jan 2022 14:16:34 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-3093-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=j6H5adKO; spf=pass (google.com: domain of mptcp+bounces-3093-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-3093-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 938231C0F15 for ; Wed, 12 Jan 2022 22:16:34 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 5F4402CAE; Wed, 12 Jan 2022 22:16:19 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) (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 11EB82CA3 for ; Wed, 12 Jan 2022 22:16: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=1642025778; x=1673561778; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=SpQSoRkJ6B9AFRZXa1jjD1SxMeiy+knK/KaJ3iCYi+8=; b=j6H5adKO02VEm/MO+wfFoxczAr/2Dtzkq1znEIkcUa+2YLVjMp7mjVn+ Pb3u4pdOo9VybpSzGH2CVY1xRQnEDfWXBiOPwYY0zR4uYj/B1+a5MKD2x ii55BS2jEi/9Ejr+aKpLeZ0I14aMv+qkk/dlYpUrP0ir3tE/faQ3d/Ut6 n53x3MDsqwyo1BFFb5bbxuLHazBKmsSb3QHQln7Gdp+NoItfEzNKe7ZKh F7bYZfUZO9MUWrtmIOL6beCpswdCrJeGSh7SVTn/D8Xr0dPN0bQRJmzkJ 678T7Ow/F9DzfFz65uyWviGKrOWuc7+nuzC7XAL+8+iNtZG1ucO7ZyAgS A==; X-IronPort-AV: E=McAfee;i="6200,9189,10225"; a="307213952" X-IronPort-AV: E=Sophos;i="5.88,284,1635231600"; d="scan'208";a="307213952" Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jan 2022 14:16:08 -0800 X-IronPort-AV: E=Sophos;i="5.88,284,1635231600"; d="scan'208";a="490907391" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga002-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jan 2022 14:16:07 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v2 20/21] mptcp: selftests: capture netlink events Date: Wed, 12 Jan 2022 17:15:22 -0500 Message-Id: <20220112221523.1829397-21-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112221523.1829397-1-kishen.maloor@intel.com> References: <20220112221523.1829397-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 Apr 26 19:46:39 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:b119:0:0:0:0:0 with SMTP id r25csp1107974jah; Wed, 12 Jan 2022 14:16:36 -0800 (PST) X-Google-Smtp-Source: ABdhPJy084gZ9Sevgrmy0B7t2xuGK1mtfN5gccheQNeLGcvqE8EDq0z6hks8pvmrX6rS4GzmG2JL X-Received: by 2002:a05:6214:d64:: with SMTP id 4mr1799798qvs.44.1642025796034; Wed, 12 Jan 2022 14:16:36 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1642025796; cv=none; d=google.com; s=arc-20160816; b=yzBwwqL2sK30BQ1n9EUfstMGQqkBU+DklV9fKk8qpiZonnn0O7zO/eSrh+5sYXh+Xm LUa5MdmhpTVHe47D1zvAHNZHjgHvyyvgAOHzP522yLkbZQZYRQZTeLsJi3LGPWweAXJJ VNDNNW2xU061JISJ0HmmpP9mzEqYp6IXPBxr5qffnNXLYfkQYzG1AJ90kIaVDft+88GM yoXZrxohuEQrfsURVGs9pPzdMf0Az7IdqdEQb1z4jYWXux2M0hs1uAqx/5oLivkKqiK0 1y6t+Vjzc8MuGRns/+Fh9xzJFALdTmGez28UHp7w5UOfrNi4s5DBnUnl0UHZywGL4qkp afZg== 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=zcE5NKBiF3b6bQ2mzxVt4W2ci0Cc5nZK59pgOaf/wKedC5wD5vow7T/bQrKKGCC34t pv2BZooeBHBrL1OrBwKwK+0Vr5Wb8y6wWljRGzc21Yx1WCIvI5houWszIRDhGpDLMHbf eEG1etVIda8D07AY+xR8q36HfvttvQAdUgXNWib5L+rO1aLt6i7U//YsWNKPdIGDfzVV fixUkCKogU9iM3T9ieNBkiNW4kssPmZPkG+t6yc5PJPHjeNaD29ruLdVohuSywciZiUl trJiVY1sLkEojZ4HAcwAEHxmJq/H7IuIbaQVYHfLTUdQOt40XZE1oNbgeLEKLvK/2QGu m1ig== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b="je/Y/6s4"; spf=pass (google.com: domain of mptcp+bounces-3094-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3094-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 bp18si533387qkb.244.2022.01.12.14.16.35 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 12 Jan 2022 14:16:36 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-3094-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="je/Y/6s4"; spf=pass (google.com: domain of mptcp+bounces-3094-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3094-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 C35001C0F1F for ; Wed, 12 Jan 2022 22:16:35 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 01E592CA3; Wed, 12 Jan 2022 22:16:20 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) (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 7370D2CAD for ; Wed, 12 Jan 2022 22:16: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=1642025778; x=1673561778; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=Q7CmIqaenr8RLcmT26cLNGN4xPMGG9oaDiIKoem23Kk=; b=je/Y/6s48DnAgdQd8QVSaHGMPSHD1AZguduwoMSTdlmgG9suWhzHEZYz /s0OnVAdkmXRB8nANp9noztCnUcsrudOYETGXUg6ROaQt4jDeSAAOghOT lhda6mBm9D8KqcJ3rjRq9230LXAxHDDJRx4B1+MCbnO6nKbSgJ+MnzjmS /GU0qp/xVzTTlPeabBmKHhsXbKUjVl58JMLkTuXM1xCp/2NLm+RSkoFdc ts3xJDysqNVIaVhNzHz6gEFnhSQfSRYnfasCnfoenfeilAw4MQzd865QD 6wXBUuDyj1VWVbnh6qCGXmCitiAc4XlGvrorms9+Wrg1q1ms2LvcGHkTw Q==; X-IronPort-AV: E=McAfee;i="6200,9189,10225"; a="307213953" X-IronPort-AV: E=Sophos;i="5.88,284,1635231600"; d="scan'208";a="307213953" Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jan 2022 14:16:08 -0800 X-IronPort-AV: E=Sophos;i="5.88,284,1635231600"; d="scan'208";a="490907393" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga002-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jan 2022 14:16:07 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v2 21/21] selftests: mptcp: functional tests for the userspace PM type Date: Wed, 12 Jan 2022 17:15:23 -0500 Message-Id: <20220112221523.1829397-22-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220112221523.1829397-1-kishen.maloor@intel.com> References: <20220112221523.1829397-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