From nobody Thu May 2 23:51:03 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:3b21:0:0:0:0:0 with SMTP id c33csp2012711jaa; Wed, 2 Feb 2022 19:14:12 -0800 (PST) X-Google-Smtp-Source: ABdhPJyliyMlSeBgi34wti1hSJ3ghIH+eJQ40s6dhCJJgqzn5CHU6ywx2RTWRDqHFLjNkWX00pst X-Received: by 2002:a05:620a:f13:: with SMTP id v19mr22377477qkl.84.1643858052691; Wed, 02 Feb 2022 19:14:12 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1643858052; cv=none; d=google.com; s=arc-20160816; b=z31HGrjLuFOObvZO7t1ijEQS45upa6LeJMWtUwohTP2b71xEVApdSeFjqzkiUP5Pa3 VMWrvBFMjPGH7q6eB2hki0pKm6n1Vh8SB7/rKqZRYC9XWYt0bkcTbTP63UdNn46A1kXV k7mWOtiCGPp5lEeYstHvRquvIrtaLYxNR8wFY5vW9xGnBfIzUJJAPne6Yke5yJOIEk4F E/585NTeXAuAG525orgIA9EIlWzDFVOQ8gZThWvYoNgokZUQ0FHx57A+0twpQouejYr+ PGFBmNFyXt2qOMdlIJfUkBjVU6tcgh8Xvj6znDvRc1t6a4Y0QC/WDgDJWmvld9MD0taG FQmw== 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=z4LP0k2tIdBx7ZruKuf4iKgG9VL/PKPxBtTg23W7cFM=; b=mhjP36gOJ3la7kb55pVZmgNLqapJGbNxHrf6K84yueVT1RojYjXqB8ySb7XH6tEZYP sBXW/BSb4L33/2fYaCP0bcXmxG2DUDcywsIJRVGgizyYlB3nuJTQgetzSMxykmX78lhO rLgCwzWNk1Oba4TnQViTcIpQW+IBsFxEjIhAIDsu/Fgcxq9p2c5kDT9M2ko/qglL7XYS g4HfrL/ZQ1LlaDJDQR9XGpp4f8s0x6UwZchRG2Qmv1oZk0/ADZwpfRCC+lTn8wtm4cbo jzxvmj7rPWhpRK/9ia9/Qcnyw19H4C+PhPOC3blGTcyS752UTXPzNIow8xz2NmnDwz3c rUTA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=Xke8hy1z; spf=pass (google.com: domain of mptcp+bounces-3426-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-3426-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 q73si15297361qka.371.2022.02.02.19.14.12 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 02 Feb 2022 19:14:12 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-3426-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=Xke8hy1z; spf=pass (google.com: domain of mptcp+bounces-3426-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-3426-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 6A6281C0ECA for ; Thu, 3 Feb 2022 03:14:12 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 3820A2C9C; Thu, 3 Feb 2022 03:14:11 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) (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 40CC22F24 for ; Thu, 3 Feb 2022 03:14:10 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1643858050; x=1675394050; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=1X14BbzEj484Unv+nU1kG2NAa6//q818jcEpI98ktqw=; b=Xke8hy1z+KMhlecpufdkDwKfGnznWRIPmQPOOEqeBTiZe8a6rGAoWWQ/ jbb23+8jqec8GjLR7W1jj4ZEErRD+REoSgkVLzQdLVXiMccwzaOOd8ekm dC4EvMns1VVFQ5ilEkXKOLLEpXQZNHOH5YErFNZ4p2LM/L+tDKvxcy5Ai zDJkAX9aJSx0FJnzsLiFWVcPLSW4vjYT6lzS1ro7rHXBlWDP1zIFqNc6P hVD/hPTsQyh7VzZw7TfLb7pvh2ryIu8JNws5KSyG15l0frhkJrLIE2HYL RWQwE6+QpCbyWe73UTZS1KTpWgCVAMc4U96fYryanv8b0wtUiGW0aQ8VU A==; X-IronPort-AV: E=McAfee;i="6200,9189,10246"; a="235467496" X-IronPort-AV: E=Sophos;i="5.88,338,1635231600"; d="scan'208";a="235467496" Received: from orsmga004.jf.intel.com ([10.7.209.38]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Feb 2022 19:14:09 -0800 X-IronPort-AV: E=Sophos;i="5.88,338,1635231600"; d="scan'208";a="631204618" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Feb 2022 19:14:09 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v4 01/13] mptcp: allow ADD_ADDR reissuance by userspace PMs Date: Wed, 2 Feb 2022 22:13:51 -0500 Message-Id: <20220203031403.2996549-2-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220203031403.2996549-1-kishen.maloor@intel.com> References: <20220203031403.2996549-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 eaa1a5a21192..2a3c10194d05 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -479,8 +479,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 (mptcp_pm_is_kernel(msk)) + 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 Thu May 2 23:51:03 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:3b21:0:0:0:0:0 with SMTP id c33csp2012747jaa; Wed, 2 Feb 2022 19:14:16 -0800 (PST) X-Google-Smtp-Source: ABdhPJynxYZfyVoNY35bxftc+QwZQ4io3PrX8uHqj86LFOOG4oy8A23UFJlb1RmipwHreKJDRq6Q X-Received: by 2002:a65:5c84:: with SMTP id a4mr25973201pgt.258.1643858056183; Wed, 02 Feb 2022 19:14:16 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1643858056; cv=none; d=google.com; s=arc-20160816; b=OdYetMNVSSisgI9S8gMaOK1TvgLEUd70lVUDkhDsX9JBRv6mG22cFQxlaUsC/PktOM 94fhJn92/kd4gSq7oBJJLOae22XbKCUvZF7xLGWa4jIg7g7ihwCZTFrj+/aeEFVNze2X MDHJkypE/xDnU27HKOK9FeXUARLpWtbIfd9svlaRqLa/ybRek4nGSWUm5yNds4UgEjCW OA80gHoW6Nb7bXBr4wi73Qdeo1b/hIlLSkKTxg4XO0ozFU5GPdKqE9Wd5oM07i9Z3Qtd LmefvCPFLoXC3C+Bt91rhrESE2VkGHd22OWUzbRKejZRF8h9DPr8A4GH9AiBGdQdLbSJ tMDQ== 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=wpYk9hUl34HeZhKThkB8gVtZ7gIN4y/9bxG1jLbni54=; b=UrYmuFRFoVpmdZAIvflO0WWMPtbV7lY5PJRrG0Ag3IReqrVEHvyTCTNuX/lhtVAGv5 bH7btLkrwnoiOSia3ZWvLbx0+h8p+BBLl/omcnVKlKFPnwm7uucYXMtsmQv2XlDIHCVT UycPdmgdQXfJCar5tcuizzhT+hTyiaB/M3Iu4u7Mc8faOnGQUIGOk/3gXFTxs24VVxQW t395+rMAe4dogTfP5uQWwv1j+y3LzQhEOhIUZo1SFAWHltmp3NdvIIcY5c55Qh4fUwwF 8kWqWrFBQdBOQMrUTfiYz+TbfPUIP2v/Zf/wbT/jFQBl2LZs4qk8BO1Cc08aWP/ij8N0 Mv7g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=naELr2R6; spf=pass (google.com: domain of mptcp+bounces-3429-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3429-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 f127si20235675pgc.335.2022.02.02.19.14.16 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 02 Feb 2022 19:14:16 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-3429-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=naELr2R6; spf=pass (google.com: domain of mptcp+bounces-3429-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3429-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 59B6D3E107F for ; Thu, 3 Feb 2022 03:14:15 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 3764B2C9C; Thu, 3 Feb 2022 03:14:13 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) (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 254A92CA2 for ; Thu, 3 Feb 2022 03:14: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=1643858052; x=1675394052; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=k+4XqxMIvO34Lb3ry8eXXbAKxyE/G1bxl0Gzzk62aRs=; b=naELr2R6hcR6GGVoklT7ikaXPHu+XO+jhFZWOjbAdiuO1yPTQqrO8v3h ObV1dXs3toq83KtudTqUtB89wcz+TKUiyzm1cHJtpreX9EQa3O3FuCbB8 /fVzEB32u0Ln5yi4BpJWX72m0iu8vBmqX8456Kv9WKZ1cwb0CCZiEHeUy TOr36yfydqp7GRXpKWjDs8GbqhaKyh7Yc9eYAK+nkTQrN2XvvDAVh4uNB 9jFYpINUtV1f2cGP50WJjCB+mFTXBy6v76eOPVoV0b3wzn9RK3tKtLkqX sz6uMm1kv1OH7+IPKjn8Z22WZcek7O7f/ERQbn5W+oFaBQMGHcBop5BDD g==; X-IronPort-AV: E=McAfee;i="6200,9189,10246"; a="235467497" X-IronPort-AV: E=Sophos;i="5.88,338,1635231600"; d="scan'208";a="235467497" Received: from orsmga004.jf.intel.com ([10.7.209.38]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Feb 2022 19:14:09 -0800 X-IronPort-AV: E=Sophos;i="5.88,338,1635231600"; d="scan'208";a="631204621" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Feb 2022 19:14:09 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v4 02/13] mptcp: handle local addrs announced by userspace PMs Date: Wed, 2 Feb 2022 22:13:52 -0500 Message-Id: <20220203031403.2996549-3-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220203031403.2996549-1-kishen.maloor@intel.com> References: <20220203031403.2996549-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 to/from its kernel context. The function captures 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 --- v4: use the sock option memory buffer to store/limit local addrs populated by userspace PMs --- 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 2a3c10194d05..ac5d152fbb77 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -511,6 +511,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 (mptcp_pm_is_kernel(msk)) + 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); + sock_kfree_s(sk, entry, sizeof(*entry)); + } +} + void mptcp_pm_free_anno_list(struct mptcp_sock *msk) { struct mptcp_pm_add_entry *entry, *tmp; @@ -1010,6 +1035,60 @@ static bool address_use_port(struct mptcp_pm_addr_en= try *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 sock_kmalloc(sk, 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 6142b4b25769..ddb07a9ee098 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -2539,6 +2539,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; @@ -3035,6 +3036,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 1a8d09796627..6b7e51a2bd09 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 */ @@ -732,6 +733,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 Thu May 2 23:51:03 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:3b21:0:0:0:0:0 with SMTP id c33csp2012732jaa; Wed, 2 Feb 2022 19:14:15 -0800 (PST) X-Google-Smtp-Source: ABdhPJzAWnpCB7tfldJgMuhmPHqgDOrfTW+xEywqGD/6H8PYJbs/1zXYdPdtZNkm3HUuoxSPAn0x X-Received: by 2002:a17:90b:240a:: with SMTP id nr10mr11444740pjb.110.1643858054884; Wed, 02 Feb 2022 19:14:14 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1643858054; cv=none; d=google.com; s=arc-20160816; b=E6zotTFpWt+tXvfWWxJeK4zXJkCCRGrLBa4bCIRWe5mibQwNmw/Ym++6wumdCW7SbR J328ONz8/Z6+l+Mw7HhxF4nxY8xlHvZ2Nm5diIFcdbLEVDBMP4v1OFrG4S1ly6iZ/461 wtfPNFU+I/h//iGEjLH7dDhE7e1qU1esc+eGJUEKjb3yfRAtPWUuc1SaQ9xfRfT+v72g dMve57+gbbpQY4sz43KZSqFLBjLAVkWvFhomMLwdz5NHDYBvRSRz19P/roHpkkV/DZbj nWFnYeiqf+j6hOb9t1DlQ78Iyh3crHUA9d8eNAoXxDC4lEI1nKamEVkdEXmbJFuC9PGr 1d5w== 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=V240/8L6Arr4PghkV25w6nOpfKXsBOXWCuSaIiHfzHQ=; b=KkOPCwYxBNmbo4WCavA8udRjCCN+I7qKfJqWkPLyoRnJFsJEzkR/Tgrs+lgZFn73TC 3nM0zs9jGfw5qlAQ1Zt/up1lAPQECpGcd593emTJUyMr3p5lL7fC/aU9rPBOSK7os7yK 2gV2lBT+XuDcW2YhkaW2lb8NUbsPoqKzovw+Q4GXazO02qGgE6VGqiAXkXd6drGfgeqV J61xdx+HQHP//9g8u4+RdEXb+imd6US1kP1raAx6T0ckJKSShHw49BzLZHZPH+4bEhN/ WUWuQwLJgU1PJ+AZd7wNUACp98VTJaDOHYGUpplBvw4CwOeu7OBTUPxb4gIk2vIXQZ9d 0f9A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=SZVAbfe2; spf=pass (google.com: domain of mptcp+bounces-3428-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-3428-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 b1si6395281pje.2.2022.02.02.19.14.14 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 02 Feb 2022 19:14:14 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-3428-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=SZVAbfe2; spf=pass (google.com: domain of mptcp+bounces-3428-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-3428-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 557E83E1064 for ; Thu, 3 Feb 2022 03:14:14 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 8DA642C9D; Thu, 3 Feb 2022 03:14:12 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) (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 4ECA62CA1 for ; Thu, 3 Feb 2022 03:14: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=1643858051; x=1675394051; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=nCFbXJvRXu4v7kZJGSu1BKj2zC6DwwvUDEjIpEjsWKw=; b=SZVAbfe27DQNYOr03t5m0c37QH/xlE+9EkwGk2SV2FCnZL+l9E0RkmeI tjTgbKoQxbPzdk5RnOxkjaxQnaROuupc8UEhSY8pezJU/qGeC/91f4WdN goRRMy83wSZEJgWXU0guibtCgG001oL2D5HfCeWbhyhV32LVnuOTDRiek kIMsZZ4AAZ+6Yv5gW2Dq5U+AIhpbirev5HiARYlzV3kaxGTC8XXfFfXw4 i6bVxSMgOe9smOfQlCXCkp3KA5GGtlGeGOwmKppMmHGkh/sQWADc+IdY4 SrdD94pgxGoivL3/zPmy/hMH5wBexr5G5OCHFX05DxG1pFSOS6ppiMn79 w==; X-IronPort-AV: E=McAfee;i="6200,9189,10246"; a="235467498" X-IronPort-AV: E=Sophos;i="5.88,338,1635231600"; d="scan'208";a="235467498" Received: from orsmga004.jf.intel.com ([10.7.209.38]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Feb 2022 19:14:09 -0800 X-IronPort-AV: E=Sophos;i="5.88,338,1635231600"; d="scan'208";a="631204624" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Feb 2022 19:14:09 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v4 03/13] mptcp: read attributes of addr entries managed by userspace PMs Date: Wed, 2 Feb 2022 22:13:53 -0500 Message-Id: <20220203031403.2996549-4-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220203031403.2996549-1-kishen.maloor@intel.com> References: <20220203031403.2996549-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 | 97 ++++++++++++++++++++++++++++-------------- net/mptcp/protocol.h | 2 +- net/mptcp/subflow.c | 2 +- 3 files changed, 67 insertions(+), 34 deletions(-) diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index ac5d152fbb77..7058d55e3a0a 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -1230,31 +1230,47 @@ 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); + if (mptcp_pm_is_kernel(msk)) { + 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 (mptcp_pm_is_userspace(msk)) { + 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; } @@ -1488,22 +1504,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 (mptcp_pm_is_kernel(msk)) { + 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 6b7e51a2bd09..b6af57d5ff5b 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -771,7 +771,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 d3691b95401a..19df5293334f 100644 --- a/net/mptcp/subflow.c +++ b/net/mptcp/subflow.c @@ -1416,7 +1416,7 @@ int __mptcp_subflow_connect(struct sock *sk, const st= ruct mptcp_addr_info *loc, local_id =3D err; } =20 - mptcp_pm_get_flags_and_ifindex_by_id(sock_net(sk), local_id, + mptcp_pm_get_flags_and_ifindex_by_id(msk, local_id, &flags, &ifindex); subflow->remote_key =3D msk->remote_key; subflow->local_key =3D msk->local_key; --=20 2.31.1 From nobody Thu May 2 23:51:03 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:3b21:0:0:0:0:0 with SMTP id c33csp2012814jaa; Wed, 2 Feb 2022 19:14:22 -0800 (PST) X-Google-Smtp-Source: ABdhPJz37fJlsw0gfNCtqwzoUldNrkNKF4+GrInUMaldHWq38HM6FnmqytbGU35yjo4G3ipf5v0V X-Received: by 2002:a63:d2:: with SMTP id 201mr1753181pga.51.1643858062473; Wed, 02 Feb 2022 19:14:22 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1643858062; cv=none; d=google.com; s=arc-20160816; b=k0VnLAmgHjCBIGA0tGehrkHOHO+KsZWqkEKVXjgRNUmsCrYwfuZx4PcIppWC277ilI NbewIGpBFHjr4kN9SBaH9SYzu++qY7/4sGmiSCEW/8cexweDI5uI0OjUVlh5uP4Gs3Gk eRTSUTDB4NrifM9seKnqPcZTJSD8E3kkNKMR9A/TaWwcgBimMK1gdUxBcSOsJOiUfwzK 94OXiL0FaP9/gGcQ17tFtqf57rcA99/ed4C9t7RQOsJsFmPgMvlB9Hsw+X/mEjxevmKD iU63Ao+0wyJtMlqCailtFk4wo9FfJ+1j2J2po3J84jzSZJoA9I9rQ/1Z2q1NqZqz0bSi 8zpw== 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=uqeuUfwKn+rKSlnmmuRFIhy5s/IPz7MMSiWc7mKOFec=; b=lv7oKCWMS6UytPb/idvzQ7TxL5BC9Gzftcfxg7PfFuCAs28csX3dBp0YMs3NUW65mU mjCbp7QvocwRPjl9z47PAdy4tMXJpMd1TUBJR69+N4CDuD+BG3mc6rLNAxfbmvMcXZiU 2kXOTXXs3qGA9JfARVQjwYK5dLle93fLhry8SuPnxU7SymdsTjOIqt7V/rgWmxGN4rj+ lJv1SXq9ssRw3m4MOenb1j03lM7yqBzc8IqOa2yl7vrigQlAYZRmRemmoPytD+3rVX2f GVUmj+yRUukoXiHcFeh4u3QLkwb/RPj60Q/CfV3vC+IeOEflOvl8xo8tb2fkW3ahf6jG mPGw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b="HIyTjx1/"; spf=pass (google.com: domain of mptcp+bounces-3435-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3435-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 em13si6359307pjb.175.2022.02.02.19.14.22 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 02 Feb 2022 19:14:22 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-3435-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="HIyTjx1/"; spf=pass (google.com: domain of mptcp+bounces-3435-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3435-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 0DA663E10A3 for ; Thu, 3 Feb 2022 03:14:22 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 7DF0E2F2D; Thu, 3 Feb 2022 03:14:15 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) (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 69F552CA9 for ; Thu, 3 Feb 2022 03:14: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=1643858054; x=1675394054; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=jVvPsInZ2WgRm5R9Yva2p4UnlfbaQfYIf1IVgaWaBbE=; b=HIyTjx1/BQ2SaMx9qdKGE8OmgrGylb10BoaF+aD0N58KXomgeM3CCm3o lu8l2T5crHblZmns3K77CVbNZxtc3FxwmXCmvx5Piw0ozfZgG+7UVcCAN /QVp4+0j0q1FSBAgF/rYL2dJDYokv3E6GzRpMR47tMJxFK/yTzwh4j8UC iKkP3taLqgNPbciHy1pTclWfL4yL+4AY1tGFnU+SVczCuRbaeFO5dAxgK Ee607bL0hbPsk77Wsk/dCHIdEQe1fFtKV3XCtVYWwH21CyRYfPWrjN3ge WD+E4VWlDSprQNp1aJY9In+Uvjwydvf7VeQ+sUIjyFy/Jl4mFSIRA/mlH g==; X-IronPort-AV: E=McAfee;i="6200,9189,10246"; a="235467502" X-IronPort-AV: E=Sophos;i="5.88,338,1635231600"; d="scan'208";a="235467502" Received: from orsmga004.jf.intel.com ([10.7.209.38]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Feb 2022 19:14:09 -0800 X-IronPort-AV: E=Sophos;i="5.88,338,1635231600"; d="scan'208";a="631204631" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Feb 2022 19:14:09 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Cc: Florian Westphal Subject: [PATCH mptcp-next v4 04/13] mptcp: netlink: split mptcp_pm_parse_addr into two functions Date: Wed, 2 Feb 2022 22:13:54 -0500 Message-Id: <20220203031403.2996549-5-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220203031403.2996549-1-kishen.maloor@intel.com> References: <20220203031403.2996549-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 7058d55e3a0a..4430e4ef8058 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -1350,11 +1350,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) { @@ -1368,27 +1369,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"); @@ -1396,22 +1399,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 @@ -1459,7 +1477,7 @@ static int mptcp_nl_cmd_add_addr(struct sk_buff *skb,= struct genl_info *info) struct mptcp_pm_addr_entry addr, *entry; 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 @@ -1671,7 +1689,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 @@ -1847,7 +1865,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 @@ -2058,7 +2076,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 Thu May 2 23:51:03 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:3b21:0:0:0:0:0 with SMTP id c33csp2012760jaa; Wed, 2 Feb 2022 19:14:17 -0800 (PST) X-Google-Smtp-Source: ABdhPJwASjLLWNVshvUrSeKNXKnRLZ71NcEMQn/psJ3rERMrwhR2lwh7AnOXfhzEDKnSoczdz/ib X-Received: by 2002:ae9:df41:: with SMTP id t62mr22404024qkf.214.1643858057357; Wed, 02 Feb 2022 19:14:17 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1643858057; cv=none; d=google.com; s=arc-20160816; b=Nz0NXYJxCmbkSi1HGVBX55MtROTb6yxhaxQLoZ504KVa83mtsfH5SOaojf5UaksWC0 y9cIT/P5+7XjaRKnjUc13HyEGSOhOPCTdqR5dcSGAWYoLuhcNMM5X2nmzuWdKLv/TsYD trLKhxKAujGuWDIQPRnKbWecyHCBdwiQ4k2kHV1X2TA9NArxXbqRqZjqJ1DHbvfI32we 4muqXRZznFs4/87DE/M3Of8xtScxlvMPxtvz7BI+LUYAguTvBbKR6f8J5AyJQbqsmgC4 OZIvcJmSfL0ApVJ8FqFylamm4VMTVmgKiQnlfezls1N9Z7QIcGpJN1RuA7w3rt4UxjYW khbg== 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=QKMaHHBZ/Of0cGHZFLUO59yFCJAeyZk8AEDcmy+f6Ug=; b=zAVbVW9APKQHwG0wIhZZZwOe08sz2g1NBYRVWO5R5LSY3Hyizqo3W5rXuY/HxgVh/W 7MRnzoGA0gKbxbI1d4TLO6SlcB/U7Nakpjbhut5j1zz1xwGGVNpFdtCUC5Zp3/PjkSHV B1l0pEVnluIu0GH3xxS9rSbeQZ2aPdUJcT8u70Tl4a4U+kcxb63IvN1lAOj0suAKwiVY BeAPlkuO4kRO/f1Rd63pclIhEP6Vmcp8ID4pGLOB+p0Sw5nzNmoPIh+8K8eLuZfCDWEX mJJqrkMX9iEasjrF0hdR5haw+BcH6YOLQzkC3yep+c21SOpP6/TYq7CH41ZKDCk1J7lI LuYg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=L6fedDr9; spf=pass (google.com: domain of mptcp+bounces-3430-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3430-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 i7si6783816qkp.171.2022.02.02.19.14.17 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 02 Feb 2022 19:14:17 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-3430-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=L6fedDr9; spf=pass (google.com: domain of mptcp+bounces-3430-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3430-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 D50221C0F2B for ; Thu, 3 Feb 2022 03:14:16 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 9754A2CA7; Thu, 3 Feb 2022 03:14:13 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) (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 910B02CA1 for ; Thu, 3 Feb 2022 03:14: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=1643858052; x=1675394052; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=VStxquV6zMaX54HG9zynuf0cuP+D8wfM/I4lygM+qH4=; b=L6fedDr9vISrmMeK+CdjIwQPv2TJGYA8VYOm9X+j/MQimS9FqsLm318c ezy6Q4tyAsMzqR7YTRg+MSbGZDEUx506ruqkKdMda9OH6lv+VB5+dAbQO AK4VpdTmDjnGLV1dNVMoDcRhOQgzlxN/j8Shfs9Vy3VccBponQv9qX9fu 2DO2xt9kRxxnEvCgtbOXvK0xnMrBJGahjULKfxWFyOJ0w+Jfs8Z9owovV HdwRIm/3yh4WisgAkhMgEQlKPSjkXiC7/mm+aAewj2CFsdQOg5kpU7Sr2 woA+5615tZMZ3GNiMhgLuPrqGSI69EVGKAkOKHeuCkEUjGWcySzwPm5Np w==; X-IronPort-AV: E=McAfee;i="6200,9189,10246"; a="235467499" X-IronPort-AV: E=Sophos;i="5.88,338,1635231600"; d="scan'208";a="235467499" Received: from orsmga004.jf.intel.com ([10.7.209.38]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Feb 2022 19:14:09 -0800 X-IronPort-AV: E=Sophos;i="5.88,338,1635231600"; d="scan'208";a="631204629" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Feb 2022 19:14:09 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v4 05/13] mptcp: netlink: Add MPTCP_PM_CMD_ANNOUNCE Date: Wed, 2 Feb 2022 22:13:55 -0500 Message-Id: <20220203031403.2996549-6-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220203031403.2996549-1-kishen.maloor@intel.com> References: <20220203031403.2996549-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|skiplsk] }. Signed-off-by: Kishen Maloor --- v3: use MPTCP_PM_ADDR_FLAG_NO_LISTEN to skip creating a listening socket in the kernel for an announced address, use the new helper lsk_list_find_or_create() v4: call lsk_list_find() after a failed lsk_list_find_or_create() for a chance to retrieve a recently created lsk by a simultaneous call --- include/uapi/linux/mptcp.h | 2 + net/mptcp/pm_netlink.c | 104 +++++++++++++++++++++++++++++++++++++ 2 files changed, 106 insertions(+) diff --git a/include/uapi/linux/mptcp.h b/include/uapi/linux/mptcp.h index 0df44a116a31..088bdfbf442c 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 }; @@ -93,6 +94,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 4430e4ef8058..b2de0da026b2 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -1302,6 +1302,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) @@ -2065,6 +2066,104 @@ static int mptcp_nl_set_flags(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_local_lsk *lsk_ref =3D NULL; + struct mptcp_pm_addr_entry addr_val; + bool reuse_port =3D false; + struct mptcp_sock *msk; + 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 (!mptcp_pm_is_userspace(msk)) { + 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.flags & MPTCP_PM_ADDR_FLAG_NO_LISTEN)) { + 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_or_create(sock_net(skb->sk), pernet, &addr_val= , &err); + + if (!lsk_ref) + lsk_ref =3D lsk_list_find(pernet, &addr_val.addr); + + if ((!lsk_ref && !reuse_port) || (!lsk_ref && (err !=3D -EADDRINUSE) && = reuse_port)) { + GENL_SET_ERR_MSG(info, "error creating listen socket"); + err =3D (err =3D=3D 0) ? -ENOMEM : err; + return err; + } + + 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; @@ -2419,6 +2518,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 Thu May 2 23:51:03 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:3b21:0:0:0:0:0 with SMTP id c33csp2012768jaa; Wed, 2 Feb 2022 19:14:18 -0800 (PST) X-Google-Smtp-Source: ABdhPJzcXC6aLTrdMptFRBEWNe3FL/NW/FgufDLlH/27g3djjuZ7PFBBIKTBBFHbshsImiat4iAQ X-Received: by 2002:a05:6214:c8f:: with SMTP id r15mr29508776qvr.109.1643858058297; Wed, 02 Feb 2022 19:14:18 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1643858058; cv=none; d=google.com; s=arc-20160816; b=QF9xbbFAgOhQGHVPIo6fR/FaDaJBssPW0MCCIFJhCG8Rles/hveyRZcBXD+FJwL53+ cj+5G6mgjpqfadOUJ7bJccqQ9m6PL+WTBFaAlR3b9CjaQDu+qVBeHAOzGpiw8zH4rf2m Is1fFcQI2wT6bc4vRAP0j4uPAQf7OL0W16t97QxCAwF4SgtFEkR35oQrdcvtBBQvYzHn k2RGhKOt0DLmxzbPEQxBkAjKWyBterhMxnbhuGavLElLrPCeJPcFApeyFOFXCCu1OmkR 8IgOnQf5GZ+xGIIuSMg+XJgItjTuVjgHRNvXXe0RB79KynDSGXjpz1+D8+H+9Ne/yIpx q7Qw== 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=+6xpBUPtJTRzLEjuMR9AdYti/Yw9sJXwxb3QHTF5Xvc=; b=A491io1iweDhLxbtS/WI4pK8LpDgRFda3/9cInJy4x7YPo1tD6ck34c932XYrskBqF /q0t4zveCJQp2Pu4EhvTyBMACWtCX44ELbdr8NlyfC3IAYmIsbO5QVs54UYUCeS/mBfb 2bqYv3ykESiF7hJWbRyU6+16LbWQENBI7VNZ/cFgtRcXTe/PXqufuu/GfF0Bz5QQ5/Ss N3JznPalTasXqlFS1+qPQPuUCI3/4UVJo5LyWCA/0FNsPoSWzmjHNaRX9aQcKDI4Ohwu jcFKGmdKO1JXehIXlMT5RGhzqzYTfqQtIQwmvrlzzELtJPH6KRnZ5dbPxEbmP92V+kVe 98vg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=cCOo1CR2; spf=pass (google.com: domain of mptcp+bounces-3431-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3431-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 i7si6783816qkp.171.2022.02.02.19.14.18 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 02 Feb 2022 19:14:18 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-3431-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=cCOo1CR2; spf=pass (google.com: domain of mptcp+bounces-3431-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3431-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 121571C0F0D for ; Thu, 3 Feb 2022 03:14:18 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 476272CA1; Thu, 3 Feb 2022 03:14:14 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) (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 A3C522CA5 for ; Thu, 3 Feb 2022 03:14: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=1643858052; x=1675394052; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=dkQKXKI5PP/plD7z39+ZsHRyeYf2sAZ4SoCudTN/0Uw=; b=cCOo1CR2stAR2W9xTD8cGQNxXR62313xW4arib6eoWW4jfX66O573hDx KTzySV2lOG5cYD5ouyBTicy84mqvt8TuF6RltVTsT+b88U9akSAd56VPU OepK1HNaT9OzfQX8zb9jEVNiR4oraqGOMezYgtCF/vFwZ0XyAEhVhKZKV Klr/jV9q9Zsrz7aP0/sOv7t/4fr8ISkuVJNF1p78ogZi+XeOMV2JEgOop vkxgqHOUgMe9Z/zOEUxnIsxJXFHjykhqhZ9ZX29yYZODOcmhybIq9rW2A 6NT+OGwiBlTxjvKTJh+QnGxELex5pDR5sF/X5AwZSU75kJX9bovAUmJus g==; X-IronPort-AV: E=McAfee;i="6200,9189,10246"; a="235467500" X-IronPort-AV: E=Sophos;i="5.88,338,1635231600"; d="scan'208";a="235467500" Received: from orsmga004.jf.intel.com ([10.7.209.38]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Feb 2022 19:14:09 -0800 X-IronPort-AV: E=Sophos;i="5.88,338,1635231600"; d="scan'208";a="631204634" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Feb 2022 19:14:09 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v4 06/13] mptcp: selftests: support MPTCP_PM_CMD_ANNOUNCE Date: Wed, 2 Feb 2022 22:13:56 -0500 Message-Id: <20220203031403.2996549-7-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220203031403.2996549-1-kishen.maloor@intel.com> References: <20220203031403.2996549-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 --- v3: support MPTCP_PM_ADDR_FLAG_NO_LISTEN in both the in-kernel PM's add_addr and userspace PM's amnounce_addr implementations --- tools/testing/selftests/net/mptcp/pm_nl_ctl.c | 138 +++++++++++++++++- 1 file changed, 137 insertions(+), 1 deletion(-) diff --git a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c b/tools/testing/= selftests/net/mptcp/pm_nl_ctl.c index 22a5ec1e128e..0044fdc461ff 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 @@ -25,7 +26,8 @@ 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, "\tadd [flags signal|subflow|backup|fullmesh|nolisten] [i= d ] [dev ] \n"); + fprintf(stderr, "\tann id token [port ] [dev ] [nolisten]\n"); fprintf(stderr, "\tdel []\n"); fprintf(stderr, "\tget \n"); fprintf(stderr, "\tset [] [id ] flags [no]backup|[no]fullmesh [po= rt ]\n"); @@ -170,6 +172,136 @@ 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); + + for (arg =3D 3; arg < argc; arg++) { + if (!strcmp(argv[arg], "nolisten")) { + /* nolisten */ + flags |=3D MPTCP_PM_ADDR_FLAG_NO_LISTEN; + } else 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 flags */ + 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); + + 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)) + @@ -238,6 +370,8 @@ int add_addr(int fd, int pm_family, int argc, char *arg= v[]) flags |=3D MPTCP_PM_ADDR_FLAG_BACKUP; else if (!strcmp(tok, "fullmesh")) flags |=3D MPTCP_PM_ADDR_FLAG_FULLMESH; + else if (!strcmp(tok, "nolisten")) + flags |=3D MPTCP_PM_ADDR_FLAG_NO_LISTEN; else error(1, errno, "unknown flag %s", argv[arg]); @@ -779,6 +913,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 Thu May 2 23:51:03 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:3b21:0:0:0:0:0 with SMTP id c33csp2012778jaa; Wed, 2 Feb 2022 19:14:19 -0800 (PST) X-Google-Smtp-Source: ABdhPJzrByoM585+DaKui1oAemBrDTakZFf0I9RqjQWbPBXWaxwFztO1xYs3frYfc1ZsHTbF1cBN X-Received: by 2002:a65:538e:: with SMTP id x14mr26330272pgq.58.1643858059059; Wed, 02 Feb 2022 19:14:19 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1643858059; cv=none; d=google.com; s=arc-20160816; b=he7O/sLKHe52uru0ngbAy66JRrzb0mwxLAfoBOZrv2a3IwVSyOr8hW/3cEM+a1/CGe a9SNOxwfrPiqdSt5EKc46ztTAfBQtAUi0UqessEf7W2JQkeQh/Vhcdr8OaMFgXOWGek5 LKx5y6ITbLWLOiYLbGxZfu40cD9l1K0fN+ska0YgtBwCzZLUG/pk4LPPRWD1e2EMJgRi 6Xu2BjhFcs3m8kV6VEjeSQeU2wkPiKvcjbt3amuPI0EsGJcrrCGOT2c4Hlrhm5rs6tWH o2QtIAObqPK/knC1SBKW469yBKTNI2VXeiXsY6k6WEMSzC97kc9BI6TW5TRHRsD08RDU jlcw== 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=yDACw7s0MNqv6U+tRt+s8E5G41A2c2+HIpZuka0DEPM=; b=fMJIkzIEb9iZOcT9KWtfzCE9YG3a3u75gTP09fgitEfyjJXMPrrTM3Z/pIqJ90pkLD 15oJfwt89ut7/A5wVjdEP/TpJrMcbo+zwSQROicA4AIOYyN++MQPavyiQucvpELW6q0E f87no8/DjwU7PYBDGV3bcZTMTdPQtf40CF7OrxGHBCVEnNopdLcrYwdThX2/7Pi6W79F m7LiUKEYkSTjoVupMcg+3pVSWd/ZuJHEgQtuizPMtaRgXc7yrmefZxieJB4+BN+ssWZc b886TZ1nZWTSs+jFEz81UETkADlsVoErI9UKtXPwcgTMEyLemMo1DB4lfzeS/+gvm+hU jAkA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=i+w54vC+; spf=pass (google.com: domain of mptcp+bounces-3432-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-3432-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 i70si13964011pge.776.2022.02.02.19.14.18 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 02 Feb 2022 19:14:19 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-3432-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=i+w54vC+; spf=pass (google.com: domain of mptcp+bounces-3432-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-3432-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 CE0503E1046 for ; Thu, 3 Feb 2022 03:14:18 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 67D6C2CA5; Thu, 3 Feb 2022 03:14:14 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) (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 39CCB2CA2 for ; Thu, 3 Feb 2022 03:14: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=1643858053; x=1675394053; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=clBNGdcU5euv0TZK7HQgy0mL8XVWEovt06EL6t+QJp8=; b=i+w54vC+Q7qQmaODDs19q2YyacGlfHba5F5am4wRd3QxqDmx4GHEzUMp XihW0ISHAXwSGOWEN+4v+L+cCPVQMbBPz5yIFpGbNtlvjdtVPSFgpFNfq 4qIy0uOSXSGdnqxA2nfbKUqH23CNH2k1k7MH9DIIUB2GZo2h7QDa1jxRu nic7Q333zszeCavDhrQystdZKgIs0qRDjfiBXWAIcKNVt8psRJqdTZ6Mj V4YVSfUelXwNqGmObf+yKVpSrArY46qRoShHPXeDSsPqYom9ThsWwyWIF hSkjKbggV68DKiyO6ogo+/qNNgi2FG2SmkuKH217NkpRP/dZU+bb1zwDZ g==; X-IronPort-AV: E=McAfee;i="6200,9189,10246"; a="235467501" X-IronPort-AV: E=Sophos;i="5.88,338,1635231600"; d="scan'208";a="235467501" Received: from orsmga004.jf.intel.com ([10.7.209.38]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Feb 2022 19:14:09 -0800 X-IronPort-AV: E=Sophos;i="5.88,338,1635231600"; d="scan'208";a="631204637" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Feb 2022 19:14:09 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v4 07/13] mptcp: netlink: Add MPTCP_PM_CMD_REMOVE Date: Wed, 2 Feb 2022 22:13:57 -0500 Message-Id: <20220203031403.2996549-8-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220203031403.2996549-1-kishen.maloor@intel.com> References: <20220203031403.2996549-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 088bdfbf442c..c2d7d3cefd02 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 }; @@ -95,6 +96,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 b2de0da026b2..9f69b3d46cd5 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -1303,6 +1303,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) @@ -1742,6 +1743,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; @@ -2371,6 +2373,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 (!mptcp_pm_is_userspace(msk)) { + 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); + sock_kfree_s((struct sock *)msk, match, sizeof(*match)); + } + return 0; +} + void mptcp_event_addr_announced(const struct sock *ssk, const struct mptcp_addr_info *info) { @@ -2523,6 +2585,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 Thu May 2 23:51:03 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:3b21:0:0:0:0:0 with SMTP id c33csp2012794jaa; Wed, 2 Feb 2022 19:14:20 -0800 (PST) X-Google-Smtp-Source: ABdhPJyjsa06xOu/eentyF2MKXdRvNHV7t2TN9k3yDMUo3AVqxU/mLWWf2KaWgyYTtjJKvtdzMmX X-Received: by 2002:a05:620a:103c:: with SMTP id a28mr22079038qkk.413.1643858060556; Wed, 02 Feb 2022 19:14:20 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1643858060; cv=none; d=google.com; s=arc-20160816; b=Ob4nH3Y+DAgx5+5oHUueft1FZDz1xIUhzM02oZtZv19GdSDFnG+4DfBJC7+OPhpywn +ANEaWY+XMBJHhP8r3Pvgll5CSDLVW61nBcMBUYML91pYQZyLtgyLdxISJrnBf9v4Dvx u3rXB/aeG70e3E2mC5vwBqe9owXRsM2LlddneOShGbFK0iIN+bKlSOQjjJoPj3MQdgvZ k3icvHMO/bvuYpjdI2CrlUiWfcAh+WHmbotc05XpE/lRwH4+KaDz+iHYaz7ocIMRMdwT Is069X/HpP4jihwTSSTCgjTjCZUpE85X8eEh7MJj1/ziMCmsV4vE/KR47TP5zgeGOLHf gCcQ== 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=x7LaLW+AaOc0XgzIhE/UGr7uTZuS2xWr3TxsJ979n6U=; b=v3TTk4o6jGKRXjmqUhTqCfyL53kCTCogKrz5ie3uAGlwVrNUk2kialiS+34/wmLMxy u4Zd2o7/r/Iwq2IpCOP211Y2w8XjNBkHSmODIX5Dfd0dxC2a6aaxKRQisz98a/2HIPIZ qRujBc5y4+JAH/54tKqAXYu5Wbi0Z9yjnoe6M4Bb3sR+mHZigB2+KeonJZ5WHeHGaWAE Dpv8xY5MyA8nDwjJPoMMD1/oMJGN+nQhYDtoPym1IfraClycB/5YAsL/8SOiugMYAKLS wQNObM108nXTcO6J8VmzWksdPsLrKuP06kwjDUHs/IBx9NXIQg6Q76Duvd5ugThKX3b4 Wq7w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=WWGKUjbF; spf=pass (google.com: domain of mptcp+bounces-3433-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3433-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 14si9333946qvr.308.2022.02.02.19.14.20 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 02 Feb 2022 19:14:20 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-3433-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=WWGKUjbF; spf=pass (google.com: domain of mptcp+bounces-3433-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3433-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 466211C0F2B for ; Thu, 3 Feb 2022 03:14:20 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 8AF6C2CA2; Thu, 3 Feb 2022 03:14:14 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) (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 972282CA6 for ; Thu, 3 Feb 2022 03:14: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=1643858053; x=1675394053; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=C4l3p6tFPmwIdITMHYdRnSwVY78HGRvYQSgg/UPc39c=; b=WWGKUjbFYRz6bSfwGlz8M/jfDB/15blO2dPcz69MUKJ9szq2LQWydxpJ MwbyePzdoLpxoWlIXlVxTmGEdXTnzvK29gfRbJ0UPXHzR3PKXoJZwTIvE WA1LKtJR0ByKTMczwg57WzJsXZY45v/UPAJeRmQCPcyWYErMCxiw5VmhL RJsrCu0fXBWoATbwbGVH/T+Eyuvj7tvIrIJnzQJkY4Nk5ELgWUwAB9wwO imPlEe+c+RtZRsTkcxVYjZLm4nTY2Pnn+o2WLhjEyTARtAEvxX+iQWEru jBSayaMxZppw8ISefHY1BsvD2i7rAXeMEy9EwHSZKI4qZZY/axUWC84YF w==; X-IronPort-AV: E=McAfee;i="6200,9189,10246"; a="235467503" X-IronPort-AV: E=Sophos;i="5.88,338,1635231600"; d="scan'208";a="235467503" Received: from orsmga004.jf.intel.com ([10.7.209.38]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Feb 2022 19:14:09 -0800 X-IronPort-AV: E=Sophos;i="5.88,338,1635231600"; d="scan'208";a="631204639" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Feb 2022 19:14:09 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v4 08/13] mptcp: selftests: support MPTCP_PM_CMD_REMOVE Date: Wed, 2 Feb 2022 22:13:58 -0500 Message-Id: <20220203031403.2996549-9-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220203031403.2996549-1-kishen.maloor@intel.com> References: <20220203031403.2996549-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 0044fdc461ff..56759d9883c9 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|nolisten] [i= d ] [dev ] \n"); fprintf(stderr, "\tann id token [port ] [dev ] [nolisten]\n"); + fprintf(stderr, "\trem id token \n"); fprintf(stderr, "\tdel []\n"); fprintf(stderr, "\tget \n"); fprintf(stderr, "\tset [] [id ] flags [no]backup|[no]fullmesh [po= rt ]\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)) + @@ -915,6 +965,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 Thu May 2 23:51:03 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:3b21:0:0:0:0:0 with SMTP id c33csp2012866jaa; Wed, 2 Feb 2022 19:14:27 -0800 (PST) X-Google-Smtp-Source: ABdhPJz4jK0ZvZS8/N/Uq8m/Sqyk4fUZaJ7IkkD990PbirqvYS0K1t3Iq5W04pATscuLNzEuTZWB X-Received: by 2002:a17:90b:1bc3:: with SMTP id oa3mr11540845pjb.172.1643858067144; Wed, 02 Feb 2022 19:14:27 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1643858067; cv=none; d=google.com; s=arc-20160816; b=KFCQODWig5pOQ1mmyZF27Cu3uq3YJl9orAGVjdv0YHlEXS1uhFZbM7vHZqrXYzKUGW A7wDacy91cV4yoHDdQyiOlpbRgAcNMHpL4rdQIPq1c96+4tAkZDRbAQhtVH2pQDwsSh5 FkZdMZXLFne+qW4PqirvCHWpkpgH/Lm1AZJOHnVZVl1bu9TeJTevsHzlKGyrNpeCNPqH Tipf9LQ6NprW20ZEXwJv/aptwjK5/euLhXEkr2nKvvzdraB9ndzAzb6u6HvXW5cbuoby 1HzV2zL16qTNU78wjGCsJ3VruLnC+Pc0qA1rqDZxGfrvj+4Us4FcB5XmPnecI6Um7hOZ 7wxQ== 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=EbUF6QoUo/FaKca036mQmnGpQbxUgGnsAXofnvTcCLI=; b=WlwphlPc2oNVurTtewzjxLeutKg8CPUGtvf6mxvnY31x5GFtrIX93iGF2FVR2sEixk K1uJTMjE1OnyBtY+b1xkgRn4lWzewF+wug8zRY1Uq6v906B7uH8Y9DLbixQ+7GrffWqh DqtzuMuEhQDQCKXS6Ct7+tZwxgW/c6xZlUU4A49R1KL9K2KXUzzTZaLOTlj/5r7c6CtO LwVa8WSt0WiLVUne7JQF4nden/m+MUa8BtsPJ/LScou2Hjeq3Ur9tEWn3lXhXnFiwK+S 6hvQTSF5zpT0rYzCMgq7ljFqM/eOFCpUw0fEa3EgJ3YjtDnqT9LwcDVJr94m8Pag6/+6 8R4g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b="UUpnJE/i"; spf=pass (google.com: domain of mptcp+bounces-3439-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3439-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 ms1si6333711pjb.186.2022.02.02.19.14.27 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 02 Feb 2022 19:14:27 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-3439-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="UUpnJE/i"; spf=pass (google.com: domain of mptcp+bounces-3439-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3439-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 B43CE3E1096 for ; Thu, 3 Feb 2022 03:14:26 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 523622F31; Thu, 3 Feb 2022 03:14:17 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) (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 7F4672F2E for ; Thu, 3 Feb 2022 03:14: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=1643858055; x=1675394055; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=WvFP3AHH5B3UdC5m54W00HNdPUwZkhpZTwV8+fWG8/A=; b=UUpnJE/iXTUg2Fly6SbIIqbvU+/nxirStPFzX4y1RHIdM8yKJUBODDFd y/uwQrqEDXRzVICGoeX8J0T/ixKezUYbh4IKs3GSG8GRH+mebOzKwJEaZ L78zCphw+BVAogcc3N/QDzCjugJ40eYYJVm1PIhMn+DnY98H8/sAMWTej qWaaWptmybT14hx5fuCjI5y3PuD69EEhu9sWOM8VUWgLB042c1Mt1l7ym AA0y/nx0cKSIN9QAeXpkaHbfK0YKb0u1El6hFYUYkghOBqyqOM6aZQQzI I0ptN4GbxGeZT6dGSFdCWvYczsjlddjwHRnVZBDW2A6ANL4L+v03SW31m g==; X-IronPort-AV: E=McAfee;i="6200,9189,10246"; a="235467507" X-IronPort-AV: E=Sophos;i="5.88,338,1635231600"; d="scan'208";a="235467507" Received: from orsmga004.jf.intel.com ([10.7.209.38]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Feb 2022 19:14:10 -0800 X-IronPort-AV: E=Sophos;i="5.88,338,1635231600"; d="scan'208";a="631204647" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Feb 2022 19:14:09 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Cc: Florian Westphal Subject: [PATCH mptcp-next v4 09/13] mptcp: netlink: allow userspace-driven subflow establishment Date: Wed, 2 Feb 2022 22:13:59 -0500 Message-Id: <20220203031403.2996549-10-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220203031403.2996549-1-kishen.maloor@intel.com> References: <20220203031403.2996549-1-kishen.maloor@intel.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Florian Westphal This allows userspace to tell kernel to add a new subflow to an existing mptcp connection. Userspace provides the token to identify the mptcp-level connection that needs a change in active subflows and the local and remote addresses of the new or the to-be-removed subflow. MPTCP_PM_CMD_SUBFLOW_CREATE requires the following parameters: { token, { loc_id, family, loc_addr4 | loc_addr6 }, { family, rem_addr4 | rem_addr6, rem_port } MPTCP_PM_CMD_SUBFLOW_DESTROY requires the following parameters: { token, { family, loc_addr4 | loc_addr6, loc_port }, { family, rem_addr4 | rem_addr6, rem_port } Signed-off-by: Florian Westphal Co-developed-by: Kishen Maloor Signed-off-by: Kishen Maloor --- v2: fix build error when IPv6 is not enabled --- include/uapi/linux/mptcp.h | 3 + net/mptcp/pm_netlink.c | 201 +++++++++++++++++++++++++++++++++++++ 2 files changed, 204 insertions(+) diff --git a/include/uapi/linux/mptcp.h b/include/uapi/linux/mptcp.h index c2d7d3cefd02..b0b1cc7cddbe 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 }; @@ -97,6 +98,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 9f69b3d46cd5..0fd000b623bb 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -1304,6 +1304,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) @@ -1413,6 +1415,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) @@ -2545,6 +2557,185 @@ 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 (!mptcp_pm_is_userspace(msk)) { + 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); + + 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 (!mptcp_pm_is_userspace(msk)) { + 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, @@ -2590,6 +2781,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 Thu May 2 23:51:03 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:3b21:0:0:0:0:0 with SMTP id c33csp2012805jaa; Wed, 2 Feb 2022 19:14:21 -0800 (PST) X-Google-Smtp-Source: ABdhPJwKUQHVF1Nui9VTuof8hBlE9hw667oM6rIkJwUPmdDII4FY+aPDmVmCcQgGQeeKPK5c13Fc X-Received: by 2002:a63:6807:: with SMTP id d7mr26977235pgc.391.1643858061738; Wed, 02 Feb 2022 19:14:21 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1643858061; cv=none; d=google.com; s=arc-20160816; b=NtvPTWb0KHsY/f4ynAgp3W48RqD35znM/xunxeRokJrhqV2SnBGsZnTFUeLpmjjlac /zw07cWo2GhNzG+FFKk3IgZ0zj9ymlEHRmxf+7isv9BlYz1x0NTuS9av8UuLHIRVxO/N qH/x7MuzQrmzXpMWygNV0cTRCwIksudPI8hiD2WWenQEZQl7ENkXDgWlRB/kNabWx7Ba lb0ij/J1WtNxAmpDNljK5AsFZyuTu6acKuyEBBlr2l8irRquPDg7Qt0dJ8Cc6eFhVrTL 3D3wde+1HFO32wf0U/VFN7QRGSm4Xr45gS+i6j0DcbJ7fbqCQRibxvSXCaevHWQxKFE/ AIQg== 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=0VddO/HozXQ1VBDIMPmP8VNv+shCnptk45FiKqQNsVk=; b=jF0BQ/ZdGtnW7io4XX72ZjQU1qE1Z/Q/iiMZPBZ17R0Pu7STAUSQokbvJDZnvUETOf 7R0xygR5MUonJ8MVLiOUJM8/K981EVJdar23FHudtEmHJSuiW74X567ycy9uEPkvI2K2 7qHPSMUgS2vEf5+J0+8bMeGTFFEPSj+adAmuR89JkxEiVR34a4XnhtzswbmOzjzC1khd mcbxEWZjr4Zktzua6H4Y9aZynbXrdaYxbv5BLmaXCLMKT6PoWz9VEyePCtbdzTPwMOS9 8/9PtoNRSOsVBPJvFfAG/g5WyRu6mAQPmHwc1Nzd4DE9C7Cyenwq4PnNQ8Flkcc039aE RVDQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=RMQIkQIA; spf=pass (google.com: domain of mptcp+bounces-3434-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-3434-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 u10si25866307plg.209.2022.02.02.19.14.21 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 02 Feb 2022 19:14:21 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-3434-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=RMQIkQIA; spf=pass (google.com: domain of mptcp+bounces-3434-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-3434-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 F33783E10A9 for ; Thu, 3 Feb 2022 03:14:20 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 69D5C2F24; Thu, 3 Feb 2022 03:14:15 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) (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 5B66C2CA4 for ; Thu, 3 Feb 2022 03:14: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=1643858054; x=1675394054; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=WVdD0cMLaVPBiTxftpjGGmMgTXdoyYTo9pvBf2TxGCY=; b=RMQIkQIAB4vgdq8fam/ptMOBJaSt4ZRS5w89/1VnXWIsHbNjK/Yi2lr9 Y9XbYWNV9xNkZgra/6MVrUuoAdMUE1nIUf+LE+N5rhwpwqjxumaZKAcuo m7mSmHqbFLvCphloHjsO4m5HFjXUS8Ipcr2od/v5mGAGd60pWjzwg/bOv pjI/KVfktXIpfQ4VtG3lO9ZnM7N7NwOK7Bd0vKxTegzaVWcULlOoIwmBz +M1XjQL1HK8S7t90TYJeN34X+EECd4Wu9B/GVXeXUGlfw0EPHDAaU8cPV lSjuK9C87X55cwm3aLhM9RgU66eNyekwOurcOGAszyCjyidA7g8HV4H9D A==; X-IronPort-AV: E=McAfee;i="6200,9189,10246"; a="235467504" X-IronPort-AV: E=Sophos;i="5.88,338,1635231600"; d="scan'208";a="235467504" Received: from orsmga004.jf.intel.com ([10.7.209.38]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Feb 2022 19:14:10 -0800 X-IronPort-AV: E=Sophos;i="5.88,338,1635231600"; d="scan'208";a="631204644" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Feb 2022 19:14:09 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v4 10/13] mptcp: selftests: support MPTCP_PM_CMD_SUBFLOW_CREATE Date: Wed, 2 Feb 2022 22:14:00 -0500 Message-Id: <20220203031403.2996549-11-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220203031403.2996549-1-kishen.maloor@intel.com> References: <20220203031403.2996549-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 56759d9883c9..6acda574e05f 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|nolisten] [i= d ] [dev ] \n"); fprintf(stderr, "\tann id token [port ] [dev ] [nolisten]\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 [] [id ] flags [no]backup|[no]fullmesh [po= rt ]\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)) + @@ -967,6 +1094,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 Thu May 2 23:51:03 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:3b21:0:0:0:0:0 with SMTP id c33csp2012829jaa; Wed, 2 Feb 2022 19:14:23 -0800 (PST) X-Google-Smtp-Source: ABdhPJzVtCQfXsLh5pe0UROWW8+XpHP4Nio5yjYEbJd9Ss5xhPLh0zdXLLrXgFY/ec6eSkqjk9MT X-Received: by 2002:a17:903:2288:: with SMTP id b8mr33413484plh.36.1643858063706; Wed, 02 Feb 2022 19:14:23 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1643858063; cv=none; d=google.com; s=arc-20160816; b=WjMbXwxXQ47ImvcL+ZAkGbeekrX54orArfSmaRFNQY9zEU/ic7Hf6Blk34KpeHUoun g1DQBbxxTibW2EHo6rUaldBmw6TDw1eHM++QCIbcfuUasDGoex9aKv9r8RfgYWWnha3y QUuiG88oGZv1sbAvZwsuABHj8WyNxGLh/BvoFGQ4+YgvDSjlRCII+DoEkeHJoqsvKX4i HV2TwcyU4Jfa7PeeEA2/Nka5Muomc9CFdhfdlujikkklN8uAtb6Z9PLMMyYurmy/iSno Dp3UDNTVfE296ocvHtGi5sHVZ9WillB5XCpmk+Kzd0TyU2o5lshymWehxYuukgpKcDLC 8G+A== 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=6g0D26VDXTwZd+Sy4vdUG9preWBqfD8JaQO9TQyoSMU=; b=tYtMpHqXqd3h4xxYg2/tqKDAZUGcJEMdCVfPBjpzxybiPDtrfnBLkClaNlvDYqPL/F bsStve06p6mrgzHVwfscCPzIzjIuUJF+Ye0ftFJ9xvEzV9h1BP8vpr/mUu/zVdrv6v1D OuJWUcol8PFQNSOFrpk0qR1ri6cIyXuHq+msXcAt0AHow9ceK6qKgd4Txr7r2n9txm/K xMwQdfODO/37XmECerNds/tE2pQeLAxX3clfJin0wh0m/MNzliW/AyCHxa2V71uNj7L8 aHZJxdb8rYom90wy36HFL399UcEm1JqzoXIWTNHB3EC2htmpPVxXAhTaMfhwjIkafXwu inbA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=RQf0lm6H; spf=pass (google.com: domain of mptcp+bounces-3436-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-3436-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 bj10si11695214plb.129.2022.02.02.19.14.23 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 02 Feb 2022 19:14:23 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-3436-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=RQf0lm6H; spf=pass (google.com: domain of mptcp+bounces-3436-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-3436-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 2737B3E10C5 for ; Thu, 3 Feb 2022 03:14:23 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 8AB102F2F; Thu, 3 Feb 2022 03:14:15 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) (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 8D2172CAB for ; Thu, 3 Feb 2022 03:14: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=1643858054; x=1675394054; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=7sm5nwHvk1/rMetyqB0oNAGMDKv5EqPBmwRjB54AoL8=; b=RQf0lm6H8cmSHTSitxy7lBaGI1oIIrEju4GmDCigaIwPyZX+q2Om+QKV VE+/JTwB+soTTPADKr9i+lKOveuGxdU174QzjQeMn4vlDOwK/TXwTsLla O7XZLL4C9PzR6bBS10vg0tc8PxSCFPi6UrhZCJXjWoY3vI2b3PjiNIvI2 0eUBzp6CBZ2BpjYkwuIP3qs5pOKBE6ddlvLwe7zOUxpi5SqsaaXP29ucj vydBWiqPSrbTbXmaHhneiNt45j05zFpYWuZzGvlDzwrgT3fSGqii7XicC t47HriX4rbMNmgkiwA92Q2s4uHcBA1Qrl8rh3j1hoxa/BO4smqZPRO8u5 g==; X-IronPort-AV: E=McAfee;i="6200,9189,10246"; a="235467505" X-IronPort-AV: E=Sophos;i="5.88,338,1635231600"; d="scan'208";a="235467505" Received: from orsmga004.jf.intel.com ([10.7.209.38]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Feb 2022 19:14:10 -0800 X-IronPort-AV: E=Sophos;i="5.88,338,1635231600"; d="scan'208";a="631204650" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Feb 2022 19:14:09 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v4 11/13] mptcp: selftests: support MPTCP_PM_CMD_SUBFLOW_DESTROY Date: Wed, 2 Feb 2022 22:14:01 -0500 Message-Id: <20220203031403.2996549-12-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220203031403.2996549-1-kishen.maloor@intel.com> References: <20220203031403.2996549-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 6acda574e05f..62fcdec3473d 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 ] [nolisten]\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 [] [id ] flags [no]backup|[no]fullmesh [po= rt ]\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)) + @@ -1096,6 +1209,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 Thu May 2 23:51:03 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:3b21:0:0:0:0:0 with SMTP id c33csp2012838jaa; Wed, 2 Feb 2022 19:14:24 -0800 (PST) X-Google-Smtp-Source: ABdhPJzi4VYZIxhaDN6dLxDqPayat3BE1wKaPOdLhHakC0Xzqw2zINlpxOgTrWcc2Bt0G084BYut X-Received: by 2002:a17:90b:1d11:: with SMTP id on17mr11767888pjb.202.1643858064805; Wed, 02 Feb 2022 19:14:24 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1643858064; cv=none; d=google.com; s=arc-20160816; b=yRqGqyD0ZveDjE7xgXhNrs5Mii4oWMsBoRpCtwjVTinvON2qYRh4ej9dCR6JPmtM+N S4ChxBkpDMsLUPog5t8igw09UIhK91vsZgC1sTAa1DDLfzSt/3A3GLDgWkCokR7Y3OB3 2+TU8DLxW6bCk0o+AKKogUJjgHhPqZQwZPF4gCHLHKfiuShy4RPDiwXH2NRsSsQG9AcI AGZU5b2hvrhK1OKywKrPNt+oOW5HjL3k/cZZqWQzV4QNWETEav4Fh2uTDRSwqHpvZ9q/ LHXpWyABjBMt+fFAuHOoxHw/6DxVooyUkrEAQZVlZeUf88BkYR1MbPRxT4hdjJBFyt3+ Korg== 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=P+G6hWyFBtTO4WCkITcX6rFqInImcZo3+sPHcZWK57o=; b=ruBuIysV05yGdp0XtCqctRmHRCEnWNpRsQCY0MONNCs8bIqV+24x9IO6aqksAF87jt U4Ugq5MWZE3HqmrOHccwmTsz9I3jHsJF6DRuOVOIoOiYL+5czuJBx8fB8McsAnyNP48N ptQ8vRiTf6CKs37j8tHYft0gYEYpvRo3im1GS2BjCHHk2VoXlXwx09urZebkZ0f4wy/F H7Z4NJW+QZ/pRcdIL6kMui/0TKO/M5jfdr3AQmsP38tH8uq0vgAigaitDaksdE9a70bK ckVMVH0UyPIZ4/hC6LC0BIjJIP6Nbe2sPjnzsRUB8JPhk9z/lZTD2JnjKRoDGrIoKxrW 0jIA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=APZzmQ4Y; spf=pass (google.com: domain of mptcp+bounces-3437-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-3437-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 u10si25866307plg.209.2022.02.02.19.14.24 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 02 Feb 2022 19:14:24 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-3437-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=APZzmQ4Y; spf=pass (google.com: domain of mptcp+bounces-3437-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-3437-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 4BD973E1096 for ; Thu, 3 Feb 2022 03:14:24 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 8D78C2F33; Thu, 3 Feb 2022 03:14:16 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) (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 693692CA6 for ; Thu, 3 Feb 2022 03:14: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=1643858055; x=1675394055; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=q6t7tmWiHCCjD+elGb9Q7zLg1xeflsWb9mD87oMCu/w=; b=APZzmQ4Yi+FLAYDf3eHkTjfHAhel9mGwm4MtxEhbyL2NkgEHz7FQLT/v nJ6Ji+nlZ89s0l7xor8wlHcs6TW4MEcNxwdVaqp8Kx71TijLZ6LerQcdU S1kVmLir4M4jgWyFI9CDozF6j+i7s2QWp7rI/0PM/bMnKividHcrP6Gnc DcaXjet9EgRXZf1RGojY93h5kKnZbu0HmvudQkUPeDeyb9yUW5hA0lb+i gstU5t5FQ5WZ1tbrm4y3PcTfmTNX2Ssc0GWVCisEUj1CpwCav6eQRYt8S GJf3zLF2ooUYULrnBfrawbbur86dANqU0vfws7dDtZZtJ2pPoF4fLymCR A==; X-IronPort-AV: E=McAfee;i="6200,9189,10246"; a="235467506" X-IronPort-AV: E=Sophos;i="5.88,338,1635231600"; d="scan'208";a="235467506" Received: from orsmga004.jf.intel.com ([10.7.209.38]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Feb 2022 19:14:10 -0800 X-IronPort-AV: E=Sophos;i="5.88,338,1635231600"; d="scan'208";a="631204653" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Feb 2022 19:14:09 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v4 12/13] mptcp: selftests: capture netlink events Date: Wed, 2 Feb 2022 22:14:02 -0500 Message-Id: <20220203031403.2996549-13-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220203031403.2996549-1-kishen.maloor@intel.com> References: <20220203031403.2996549-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 --- v3: support reading the new server_side attribute from the CREATED and ESTABLISHED netlink events --- tools/testing/selftests/net/mptcp/pm_nl_ctl.c | 164 +++++++++++++++++- 1 file changed, 157 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 62fcdec3473d..546d9593dc52 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,108 @@ 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)); + else if (attrs->rta_type =3D=3D MPTCP_ATTR_SERVER_SIDE) + fprintf(stderr, ",server_side:%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 +227,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 +253,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 +296,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 +318,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[]) @@ -1190,7 +1336,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); @@ -1199,7 +1347,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); @@ -1223,6 +1371,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 Thu May 2 23:51:03 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a02:3b21:0:0:0:0:0 with SMTP id c33csp2012854jaa; Wed, 2 Feb 2022 19:14:26 -0800 (PST) X-Google-Smtp-Source: ABdhPJyHYeuJMxtv7MkD07Bdd9P/eiqdLUZxPGBq+78dYarFSWY7BLfYufZOUseK/N0Eze7gruTL X-Received: by 2002:a05:622a:296:: with SMTP id z22mr14730139qtw.13.1643858066257; Wed, 02 Feb 2022 19:14:26 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1643858066; cv=none; d=google.com; s=arc-20160816; b=Xx/An8EyX5dwpy0wVssIUL6Zgd8wA+klI0UftEa3E6g+ly6y3ShAfIDxKTvq5pTvur +TxRRcFZ6fIzGas8JPwnS1DnrvPjLRbHfZGyCM2+0KquJ0C9x5niWvdMKhfUI2wGizv9 MP9SlM4yWDgCxXKL3v0Nia/xVBRJO8VkNE+8LE3AThIhwvV7ychkLL5Sv20BRK+NRq4Y tym1PADLlEnEYzENMw13sh8RSRdtEnQ5YJyuqzqAYtyP+W9T+YAzVnlJtzgYZp3UkWe0 Z3HNrugXYv3W84iCnygi71PQ4lD4T6EgQbJoSeV6M2xdN04izP0ocH/CCh18JDUu8jpR M5Zg== 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=rMbHg7apQJan1dVFQCdyeosWMlR//Lgz+lrzlxKI8wA=; b=w+lLzuYovfhxPRadYtvKoCslQp9nZV7OMPsXpLB8nrFe1QQVcYasmcaK41LPL25XS4 4lJa33AmEZPjALce9/hUlVs8fkhbs1hCDdpjsDQkNJthS/jV4jcHBRgQeCC+lOTwoSpp v/PTSXlurhfYh1YRQGGTQYnbSTc7UV4EpZ61YEieEOdfHofRYDmC98eqrVH9nG55ygY7 znekU0mIVxUCnQy4YnPDdNP8gAyb/hLsQT2/XkLlRHnb2P9bulVwW0YEGVRzZHfRyn+f ig20VO/dE+9nHZzRNReANub9OlKz/BZDh+IgsENMDkQTIRZe2EY3GZ0IjtHm9hiYPZMk hrcw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=YdnBPfBV; spf=pass (google.com: domain of mptcp+bounces-3438-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-3438-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 u6si9343543qvc.405.2022.02.02.19.14.26 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 02 Feb 2022 19:14:26 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-3438-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=YdnBPfBV; spf=pass (google.com: domain of mptcp+bounces-3438-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-3438-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 DA6651C0F49 for ; Thu, 3 Feb 2022 03:14:25 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 24FB02F35; Thu, 3 Feb 2022 03:14:17 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) (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 8C0922F31 for ; Thu, 3 Feb 2022 03:14: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=1643858055; x=1675394055; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=wBYQa0CehXcr7xxMpuPpCB6dsOMEnCCUuUb0k5l2RJ0=; b=YdnBPfBVFTPO6g4/s5evt0AV7LJC17LwlVN5Lrj01n8IadEhbNL2YK07 C3ahEJvyTcR++h5JlXlVBUenNBCvE6O5SGt9VyhWfQEp0hcEQVNoyf5pn RASeOx3DFi9IPx1CR6W++IRmrokty0NUPrK+atBOWZwjL+auWbvXmUO3i lZxmDUm9p4JaHFoToFVQLsx/snMlD5bqY3bW2HTLSsm+qiSCbhEpWjtdy hNh1BWgStNAofwmDzNteIb4Uh8maEFQywbYtLHpbFnwpe3gffwOuZ7bh2 oYOoceuO3L+NGjWDwCDDguXHCUqMM42lXuLptJVqcVfFbbH2cJQCJaV0v w==; X-IronPort-AV: E=McAfee;i="6200,9189,10246"; a="235467508" X-IronPort-AV: E=Sophos;i="5.88,338,1635231600"; d="scan'208";a="235467508" Received: from orsmga004.jf.intel.com ([10.7.209.38]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Feb 2022 19:14:10 -0800 X-IronPort-AV: E=Sophos;i="5.88,338,1635231600"; d="scan'208";a="631204655" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Feb 2022 19:14:09 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v4 13/13] selftests: mptcp: functional tests for the userspace PM type Date: Wed, 2 Feb 2022 22:14:03 -0500 Message-Id: <20220203031403.2996549-14-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220203031403.2996549-1-kishen.maloor@intel.com> References: <20220203031403.2996549-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 --- v3: read and verify the new "server_side" attribute from netlink events upon connection establishment, added descriptive remarks throughout script v4: removed whitespace, reduced line lengths --- .../selftests/net/mptcp/userspace_pm.sh | 687 ++++++++++++++++++ 1 file changed, 687 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..31a43c0a1f2b --- /dev/null +++ b/tools/testing/selftests/net/mptcp/userspace_pm.sh @@ -0,0 +1,687 @@ +#!/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 + +# Create and configure network namespaces for testing +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" + +# Add IPv4/v6 addresses to the namespaces +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() +{ + # Store a chunk of data in a file to transmit over an MPTCP connection + 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 + + # Capture netlink events over the two network namespaces running + # the MPTCP client and server + 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 > /d= ev/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 + + # Capture client/server attributes from MPTCP connection netlink events + 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") + local client_serverside=3D$(sed -n 's/.*\(server_side:\)\([[:digit:]]*\).= *$/\2/p;q'\ + "$client_evts") + + kill $server_evts_pid + local server_token=3D$(sed -n 's/.*\(token:\)\([[:digit:]]*\).*$/\2/p;q' = "$server_evts") + local server_serverside=3D$(sed -n 's/.*\(server_side:\)\([[:digit:]]*\).= *$/\2/p;q'\ + "$server_evts") + + rm -f "$client_evts" "$server_evts" "$file" + + if [ $client_token !=3D "" ] && [ $server_token !=3D "" ] && [ $client_se= rverside =3D 0 ] && + [ $server_serverside =3D 1 ] + 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) + # Capture events on the network namespace running the server + :>"$evts" + ip netns exec $ns1 ./pm_nl_ctl events >> "$evts" 2>&1 & + evts_pid=3D$! + sleep 0.1 + + # ADD_ADDR using an invalid token should result in no action + local invalid_token=3D$(( $client4_token - 1)) + ip netns exec $ns2 ./pm_nl_ctl ann 10.0.2.2 token $invalid_token id\ + $client_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 + + # ADD_ADDR from the client to server machine reusing the subflow port + :>"$evts" + ip netns exec $ns2\ + ./pm_nl_ctl ann 10.0.2.2 token $client4_token id $client_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" + + # ADD_ADDR6 from the client to server machine reusing the subflow 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" + + # ADD_ADDR from the client to server machine using a new port + :>"$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\ + $client_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 + + # Capture events on the network namespace running the client + :>"$evts" + ip netns exec $ns2 ./pm_nl_ctl events >> "$evts" 2>&1 & + evts_pid=3D$! + sleep 0.1 + + # ADD_ADDR from the server to client machine reusing the subflow port + ip netns exec $ns1 ./pm_nl_ctl ann 10.0.2.1 token $server4_token id\ + $server_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" + + # ADD_ADDR6 from the server to client machine reusing the subflow 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" + + # ADD_ADDR from the server to client machine using a new port + :>"$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\ + $server_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) + + # Capture events on the network namespace running the server + :>"$evts" + ip netns exec $ns1 ./pm_nl_ctl events >> "$evts" 2>&1 & + evts_pid=3D$! + sleep 0.1 + + # RM_ADDR using an invalid token should result in no action + local invalid_token=3D$(( $client4_token - 1 )) + ip netns exec $ns2 ./pm_nl_ctl rem token $invalid_token id\ + $client_addr_id 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 + + # RM_ADDR using an invalid addr id should result in no action + 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"\ + $invalid_id + type=3D$(sed -n 's/.*\(type:\)\([[:digit:]]*\).*$/\2/p;q' "$evts") + if [ "$type" =3D "" ] + then + printf "[OK]\n" + else + printf "[FAIL]\n" + fi + + # RM_ADDR from the client to server machine + :>"$evts" + ip netns exec $ns2 ./pm_nl_ctl rem token $client4_token id\ + $client_addr_id 2>&1 > /dev/null + printf "RM_ADDR id:%d ns2 =3D> ns1 \t"\ + $client_addr_id + sleep 0.1 + verify_remove_event "$evts" "$REMOVED" "$server4_token" "$client_addr_id" + + # RM_ADDR from the client to server machine + :>"$evts" + client_addr_id=3D$(( $client_addr_id - 1 )) + ip netns exec $ns2 ./pm_nl_ctl rem token $client4_token id\ + $client_addr_id 2>&1 > /dev/null + printf "RM_ADDR id:%d ns2 =3D> ns1 \t"\ + $client_addr_id + sleep 0.1 + verify_remove_event "$evts" "$REMOVED" "$server4_token" "$client_addr_id" + + # RM_ADDR6 from the client to server machine + :>"$evts" + ip netns exec $ns2 ./pm_nl_ctl rem token $client6_token id\ + $client_addr_id 2>&1 > /dev/null + printf "RM_ADDR6 id:%d ns2 =3D> ns1 \t"\ + $client_addr_id + sleep 0.1 + verify_remove_event "$evts" "$REMOVED" "$server6_token" "$client_addr_id" + + kill $evts_pid + + # Capture events on the network namespace running the client + :>"$evts" + ip netns exec $ns2 ./pm_nl_ctl events >> "$evts" 2>&1 & + evts_pid=3D$! + sleep 0.1 + + # RM_ADDR from the server to client machine + ip netns exec $ns1 ./pm_nl_ctl rem token $server4_token id\ + $server_addr_id 2>&1 > /dev/null + printf "RM_ADDR id:%d ns1 =3D> ns2 \t"\ + $server_addr_id + sleep 0.1 + verify_remove_event "$evts" "$REMOVED" "$client4_token" "$server_addr_id" + + # RM_ADDR from the server to client machine + :>"$evts" + server_addr_id=3D$(( $server_addr_id - 1 )) + ip netns exec $ns1 ./pm_nl_ctl rem token $server4_token id\ + $server_addr_id 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" + + # RM_ADDR6 from the server to client machine + :>"$evts" + ip netns exec $ns1 ./pm_nl_ctl rem token $server6_token id\ + $server_addr_id 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_daddr $e_to + else + printf "CREATE_SUBFLOW %s (%s) =3D> %s (%s) \t"\ + $e_saddr $e_from $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_daddr $e_to + else + printf "DESTROY_SUBFLOW %s (%s) =3D> %s (%s) \t"\ + $e_saddr $e_from $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) + # Capture events on the network namespace running the server + :>"$evts" + ip netns exec $ns1 ./pm_nl_ctl events >> "$evts" 2>&1 & + evts_pid=3D$! + sleep 0.1 + + # ADD_ADDR from client to server machine reusing the subflow port + ip netns exec $ns2 ./pm_nl_ctl ann 10.0.2.2 token $client4_token id\ + $client_addr_id 2>&1 > /dev/null + sleep 0.1 + + # CREATE_SUBFLOW from server to client machine + :>"$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") + + # DESTROY_SUBFLOW from server to client machine + :>"$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" + + # RM_ADDR from client to server machine + ip netns exec $ns2 ./pm_nl_ctl rem id $client_addr_id token $client4_toke= n 2>&1 > /dev/null + sleep 0.1 + + # ADD_ADDR6 from client to server machine reusing the subflow port + :>"$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 + + # CREATE_SUBFLOW6 from server to client machine + :>"$evts" + ip netns exec $ns1 ./pm_nl_ctl csf lip dead:beef:2::1 lid 23 rip\ + dead:beef:2::2 rport $client6_port token $server6_token 2>&1 > /dev/nu= ll + 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_id" "ns1" "ns2" + + local sport=3D$(sed -n 's/.*\(sport:\)\([[:digit:]]*\).*$/\2/p;q' "$evts") + + # DESTROY_SUBFLOW6 from server to client machine + :>"$evts" + ip netns exec $ns1 ./pm_nl_ctl dsf lip dead:beef:2::1 lport $sport rip\ + dead:beef:2::2 rport $client6_port token $server6_token 2>&1 > /dev/nu= ll + 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" "ns1" "ns2" + + # RM_ADDR from client to server machine + ip netns exec $ns2 ./pm_nl_ctl rem id $client_addr_id token $client6_toke= n 2>&1 > /dev/null + sleep 0.1 + + # ADD_ADDR from client to server machine using a new port + :>"$evts" + ip netns exec $ns2 ./pm_nl_ctl ann 10.0.2.2 token $client4_token id\ + $client_addr_id port $new4_port 2>&1 > /dev/null + sleep 0.1 + + # CREATE_SUBFLOW from server to client machine + :>"$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") + + # DESTROY_SUBFLOW from server to client machine + :>"$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" + + # RM_ADDR from client to server machine + ip netns exec $ns2 ./pm_nl_ctl rem id $client_addr_id token\ + $client4_token 2>&1 > /dev/null + + kill $evts_pid + + # Capture events on the network namespace running the client + :>"$evts" + ip netns exec $ns2 ./pm_nl_ctl events >> "$evts" 2>&1 & + evts_pid=3D$! + sleep 0.1 + + # ADD_ADDR from server to client machine reusing the subflow port + ip netns exec $ns1 ./pm_nl_ctl ann 10.0.2.1 token $server4_token id\ + $server_addr_id 2>&1 > /dev/null + sleep 0.1 + + # CREATE_SUBFLOW from client to server machine + :>"$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") + + # DESTROY_SUBFLOW from client to server machine + :>"$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" + + # RM_ADDR from server to client machine + ip netns exec $ns1 ./pm_nl_ctl rem id $server_addr_id token $server4_toke= n 2>&1 > /dev/null + sleep 0.1 + + # ADD_ADDR6 from server to client machine reusing the subflow port + :>"$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 + + # CREATE_SUBFLOW6 from client to server machine + :>"$evts" + ip netns exec $ns2 ./pm_nl_ctl csf lip dead:beef:2::2 lid 23 rip\ + dead:beef: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") + + # DESTROY_SUBFLOW6 from client to server machine + :>"$evts" + ip netns exec $ns2 ./pm_nl_ctl dsf lip dead:beef:2::2 lport $sport rip\ + dead: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" + + # RM_ADDR6 from server to client machine + ip netns exec $ns1 ./pm_nl_ctl rem id $server_addr_id token $server6_toke= n 2>&1 > /dev/null + sleep 0.1 + + # ADD_ADDR from client to server machine using a new port + :>"$evts" + ip netns exec $ns1 ./pm_nl_ctl ann 10.0.2.1 token $server4_token id\ + $server_addr_id port $new4_port 2>&1 > /dev/null + sleep 0.1 + + # CREATE_SUBFLOW from client to server machine + :>"$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") + + # DESTROY_SUBFLOW from client to server machine + :>"$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" + + # RM_ADDR from server to client machine + 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