From nobody Fri Mar 29 12:23:26 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:869:b0:4b8:7781:bd2f with SMTP id d41csp239564pis; Tue, 3 May 2022 19:39:15 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwpra5maUJ52negax7ucsBM8dP+eRoaZFiV3dJaSaVQNqDmZCHswHo/sbkPbVVUsIwPkWNz X-Received: by 2002:a17:907:97cc:b0:6df:83bc:314c with SMTP id js12-20020a17090797cc00b006df83bc314cmr18346818ejc.587.1651631955457; Tue, 03 May 2022 19:39:15 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1651631955; cv=none; d=google.com; s=arc-20160816; b=uzKJp8/hpEpjxivlOCvOzdByYOEHz+kpf1T5koBAUeh+dOqYPfsrYWz/RESw39dVas MZUocST4gLUSlLni8EMvYirqFysSfjGvYslaTGAfBQpozAXFZdG5DU7mwMB1ppn1xnFs kX70V1SqD4SHO5YeBV8jGQJDweO2VqLx1ZYzfV8WYL9lwRa4QjZNe7c5zMLAomd1XfTb +XT+JRm4+7ltyt35oG+e1uLvx0rXtQy6rFHz5GlTTYq7bX+CTugte75zMTN5vMzlpygk pcOTZKtvFs/GaQuyPSTG+tyHuxW1lZIrf55YD0I3qIKZ3AKW+288HjDpLuB0q6ByMDBo CnYA== 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=jEx0s3dGyHwNbPx4j17Zv8fQUSmLRlXChYQ+Ljeyq78=; b=adc8gvHMrQ5nDSwrYDdGd5494L5EtNKnl2It7QMATHQAvzGEVUkOi2+O4zj4FIpBCw +sVviFGItrq90RNOrs8AJI7w9JE4EwsKwEQJd0MPbmHOU6jCCVKkR0g+R1UKzm9U42+n xlqhlzCrTkX0NyTzsWPCGhPpDO3JFv/EahOZck+vb47KJhsQdWsc8U3LJRWTPqZTOS6u QFYW1PobrlcDjlApXWTqkPjhCO9cCSZEqKoiZQ3q02WCeJqV/Q+hf6XZ/6pcnRvQ02rC nWocXNqeUX4ovxhXG6MxQnN0s+tTQEKXev7QgEeMmiTYQl4FlX+oXWvtPa69dPeQgjnR dTJw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=UMyJ3nz+; spf=pass (google.com: domain of mptcp+bounces-5077-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:4040:4f00::1 as permitted sender) smtp.mailfrom="mptcp+bounces-5077-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from da.mirrors.kernel.org (da.mirrors.kernel.org. [2604:1380:4040:4f00::1]) by mx.google.com with ESMTPS id kl12-20020a170907994c00b006f3e70bb598si13281319ejc.441.2022.05.03.19.39.15 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Tue, 03 May 2022 19:39:15 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-5077-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:4040:4f00::1 as permitted sender) client-ip=2604:1380:4040:4f00::1; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=UMyJ3nz+; spf=pass (google.com: domain of mptcp+bounces-5077-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:4040:4f00::1 as permitted sender) smtp.mailfrom="mptcp+bounces-5077-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 da.mirrors.kernel.org (Postfix) with ESMTPS id BF7EC2E09D2 for ; Wed, 4 May 2022 02:39:14 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 0D81620F0; Wed, 4 May 2022 02:39:11 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1448A20EA for ; Wed, 4 May 2022 02:39:08 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1651631949; x=1683167949; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=uZh7V70FCyAhmyUmFTQZPD0EKxtB3WrHK+TkxGRAlM0=; b=UMyJ3nz+puZBe6kU77saTIE9VhILVCQILZTkOS9Dhr+NsDBFOzfvqHUC H5CLEv2W7kC/hRj64VYLs1UqnTQEe+v7/rdovpbBFcohU2/G1GrpFyW+D TTfM/ZwaEZ4ieMWkwvHIYg+Md6XWvccpzj7nDuzizj2dXbVsnPZFHUWN/ WJGYHBGXDPQQflDksUu3s3EpIr8isyZqEoEIauTwJ3G4llVFTxj1yqb4x umzEki4T+fGMCEBjL5/m2xjh644yeBzk8EsDF4De/a87hwyv4V4Pfshvy q7L5Su1zAcWkmBOMOWZ+FIFBnN8k836c5737oVTjvu/qQGU2NECnNATvW w==; X-IronPort-AV: E=McAfee;i="6400,9594,10336"; a="266488754" X-IronPort-AV: E=Sophos;i="5.91,196,1647327600"; d="scan'208";a="266488754" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 May 2022 19:39:07 -0700 X-IronPort-AV: E=Sophos;i="5.91,196,1647327600"; d="scan'208";a="584493366" Received: from mjmartin-desk2.amr.corp.intel.com (HELO mjmartin-desk2.intel.com) ([10.251.20.240]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 May 2022 19:39:07 -0700 From: Mat Martineau To: netdev@vger.kernel.org Cc: Kishen Maloor , davem@davemloft.net, kuba@kernel.org, pabeni@redhat.com, edumazet@google.com, matthieu.baerts@tessares.net, mptcp@lists.linux.dev, Mat Martineau Subject: [PATCH net-next 01/13] mptcp: handle local addrs announced by userspace PMs Date: Tue, 3 May 2022 19:38:49 -0700 Message-Id: <20220504023901.277012-2-mathew.j.martineau@linux.intel.com> X-Mailer: git-send-email 2.36.0 In-Reply-To: <20220504023901.277012-1-mathew.j.martineau@linux.intel.com> References: <20220504023901.277012-1-mathew.j.martineau@linux.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: Kishen Maloor This change adds an internal function to store/retrieve local addrs announced by userspace PM implementations to/from its kernel context. The function addresses 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, and 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. Memory for these entries is allocated from the sock option buffer, so the list of addrs is bounded by optmem_max. The list if not released via REMOVE_ADDR signals is ultimately freed when the sock is destructed. Acked-by: Paolo Abeni Signed-off-by: Kishen Maloor Signed-off-by: Mat Martineau --- net/mptcp/Makefile | 2 +- net/mptcp/pm.c | 1 + net/mptcp/pm_netlink.c | 42 +++++++++------------- net/mptcp/pm_userspace.c | 78 ++++++++++++++++++++++++++++++++++++++++ net/mptcp/protocol.c | 1 + net/mptcp/protocol.h | 15 ++++++++ 6 files changed, 113 insertions(+), 26 deletions(-) create mode 100644 net/mptcp/pm_userspace.c diff --git a/net/mptcp/Makefile b/net/mptcp/Makefile index e54daceac58b..cb7f53f6ab22 100644 --- a/net/mptcp/Makefile +++ b/net/mptcp/Makefile @@ -2,7 +2,7 @@ obj-$(CONFIG_MPTCP) +=3D mptcp.o =20 mptcp-y :=3D protocol.o subflow.o options.o token.o crypto.o ctrl.o pm.o d= iag.o \ - mib.o pm_netlink.o sockopt.o + mib.o pm_netlink.o sockopt.o pm_userspace.o =20 obj-$(CONFIG_SYN_COOKIES) +=3D syncookies.o obj-$(CONFIG_INET_MPTCP_DIAG) +=3D mptcp_diag.o diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c index 5d6832c4d9f2..cdc2d79071f8 100644 --- a/net/mptcp/pm.c +++ b/net/mptcp/pm.c @@ -469,6 +469,7 @@ void mptcp_pm_data_init(struct mptcp_sock *msk) { spin_lock_init(&msk->pm.lock); INIT_LIST_HEAD(&msk->pm.anno_list); + INIT_LIST_HEAD(&msk->pm.userspace_pm_local_addr_list); mptcp_pm_data_reset(msk); } =20 diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index 98b205c2c101..9d515c3e0b16 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -22,14 +22,6 @@ static struct genl_family mptcp_genl_family; =20 static int pm_nl_pernet_id; =20 -struct mptcp_pm_addr_entry { - struct list_head list; - struct mptcp_addr_info addr; - u8 flags; - int ifindex; - struct socket *lsk; -}; - struct mptcp_pm_add_entry { struct list_head list; struct mptcp_addr_info addr; @@ -66,8 +58,8 @@ pm_nl_get_pernet_from_msk(const struct mptcp_sock *msk) return pm_nl_get_pernet(sock_net((struct sock *)msk)); } =20 -static bool addresses_equal(const struct mptcp_addr_info *a, - const struct mptcp_addr_info *b, bool use_port) +bool mptcp_addresses_equal(const struct mptcp_addr_info *a, + const struct mptcp_addr_info *b, bool use_port) { bool addr_equals =3D false; =20 @@ -131,7 +123,7 @@ static bool lookup_subflow_by_saddr(const struct list_h= ead *list, skc =3D (struct sock_common *)mptcp_subflow_tcp_sock(subflow); =20 local_address(skc, &cur); - if (addresses_equal(&cur, saddr, saddr->port)) + if (mptcp_addresses_equal(&cur, saddr, saddr->port)) return true; } =20 @@ -149,7 +141,7 @@ static bool lookup_subflow_by_daddr(const struct list_h= ead *list, skc =3D (struct sock_common *)mptcp_subflow_tcp_sock(subflow); =20 remote_address(skc, &cur); - if (addresses_equal(&cur, daddr, daddr->port)) + if (mptcp_addresses_equal(&cur, daddr, daddr->port)) return true; } =20 @@ -269,7 +261,7 @@ mptcp_lookup_anno_list_by_saddr(const struct mptcp_sock= *msk, lockdep_assert_held(&msk->pm.lock); =20 list_for_each_entry(entry, &msk->pm.anno_list, list) { - if (addresses_equal(&entry->addr, addr, true)) + if (mptcp_addresses_equal(&entry->addr, addr, true)) return entry; } =20 @@ -286,7 +278,7 @@ bool mptcp_pm_sport_in_anno_list(struct mptcp_sock *msk= , const struct sock *sk) =20 spin_lock_bh(&msk->pm.lock); list_for_each_entry(entry, &msk->pm.anno_list, list) { - if (addresses_equal(&entry->addr, &saddr, true)) { + if (mptcp_addresses_equal(&entry->addr, &saddr, true)) { ret =3D true; goto out; } @@ -421,7 +413,7 @@ static bool lookup_address_in_vec(const struct mptcp_ad= dr_info *addrs, unsigned int i; =20 for (i =3D 0; i < nr; i++) { - if (addresses_equal(&addrs[i], addr, addr->port)) + if (mptcp_addresses_equal(&addrs[i], addr, addr->port)) return true; } =20 @@ -457,7 +449,7 @@ static unsigned int fill_remote_addresses_vec(struct mp= tcp_sock *msk, bool fullm mptcp_for_each_subflow(msk, subflow) { ssk =3D mptcp_subflow_tcp_sock(subflow); remote_address((struct sock_common *)ssk, &addrs[i]); - if (deny_id0 && addresses_equal(&addrs[i], &remote, false)) + if (deny_id0 && mptcp_addresses_equal(&addrs[i], &remote, false)) continue; =20 if (!lookup_address_in_vec(addrs, i, &addrs[i]) && @@ -490,7 +482,7 @@ __lookup_addr(struct pm_nl_pernet *pernet, const struct= mptcp_addr_info *info, struct mptcp_pm_addr_entry *entry; =20 list_for_each_entry(entry, &pernet->local_addr_list, list) { - if ((!lookup_by_id && addresses_equal(&entry->addr, info, true)) || + if ((!lookup_by_id && mptcp_addresses_equal(&entry->addr, info, true)) || (lookup_by_id && entry->addr.id =3D=3D info->id)) return entry; } @@ -505,7 +497,7 @@ lookup_id_by_addr(const struct pm_nl_pernet *pernet, co= nst struct mptcp_addr_inf =20 rcu_read_lock(); list_for_each_entry(entry, &pernet->local_addr_list, list) { - if (addresses_equal(&entry->addr, addr, entry->addr.port)) { + if (mptcp_addresses_equal(&entry->addr, addr, entry->addr.port)) { ret =3D entry->addr.id; break; } @@ -739,7 +731,7 @@ static int mptcp_pm_nl_mp_prio_send_ack(struct mptcp_so= ck *msk, struct mptcp_addr_info local; =20 local_address((struct sock_common *)ssk, &local); - if (!addresses_equal(&local, addr, addr->port)) + if (!mptcp_addresses_equal(&local, addr, addr->port)) continue; =20 if (subflow->backup !=3D bkup) @@ -909,9 +901,9 @@ static int mptcp_pm_nl_append_new_local_addr(struct pm_= nl_pernet *pernet, * singled addresses */ list_for_each_entry(cur, &pernet->local_addr_list, list) { - if (addresses_equal(&cur->addr, &entry->addr, - address_use_port(entry) && - address_use_port(cur))) { + if (mptcp_addresses_equal(&cur->addr, &entry->addr, + address_use_port(entry) && + address_use_port(cur))) { /* allow replacing the exiting endpoint only if such * endpoint is an implicit one and the user-space * did not provide an endpoint id @@ -1038,14 +1030,14 @@ int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk= , struct sock_common *skc) */ local_address((struct sock_common *)msk, &msk_local); local_address((struct sock_common *)skc, &skc_local); - if (addresses_equal(&msk_local, &skc_local, false)) + if (mptcp_addresses_equal(&msk_local, &skc_local, false)) return 0; =20 pernet =3D pm_nl_get_pernet_from_msk(msk); =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)) { + if (mptcp_addresses_equal(&entry->addr, &skc_local, entry->addr.port)) { ret =3D entry->addr.id; break; } @@ -1416,7 +1408,7 @@ static int mptcp_nl_remove_id_zero_address(struct net= *net, goto next; =20 local_address((struct sock_common *)msk, &msk_local); - if (!addresses_equal(&msk_local, addr, addr->port)) + if (!mptcp_addresses_equal(&msk_local, addr, addr->port)) goto next; =20 lock_sock(sk); diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c new file mode 100644 index 000000000000..c50f8900ffba --- /dev/null +++ b/net/mptcp/pm_userspace.c @@ -0,0 +1,78 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Multipath TCP + * + * Copyright (c) 2022, Intel Corporation. + */ + +#include "protocol.h" + +void mptcp_free_local_addr_list(struct mptcp_sock *msk) +{ + struct mptcp_pm_addr_entry *entry, *tmp; + struct sock *sk =3D (struct sock *)msk; + LIST_HEAD(free_list); + + if (!mptcp_pm_is_userspace(msk)) + return; + + spin_lock_bh(&msk->pm.lock); + list_splice_init(&msk->pm.userspace_pm_local_addr_list, &free_list); + spin_unlock_bh(&msk->pm.lock); + + list_for_each_entry_safe(entry, tmp, &free_list, list) { + sock_kfree_s(sk, entry, sizeof(*entry)); + } +} + +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); + + spin_lock_bh(&msk->pm.lock); + list_for_each_entry(e, &msk->pm.userspace_pm_local_addr_list, list) { + addr_match =3D mptcp_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) { + /* Memory for the entry is allocated from the + * sock option buffer. + */ + e =3D sock_kmalloc(sk, sizeof(*e), GFP_ATOMIC); + if (!e) { + spin_unlock_bh(&msk->pm.lock); + 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->pm.userspace_pm_local_addr_list); + ret =3D e->addr.id; + } else if (match) { + ret =3D entry->addr.id; + } + + spin_unlock_bh(&msk->pm.lock); + return ret; +} diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 5d529143ad77..52ed2c0ac901 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -3097,6 +3097,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 187c932deef0..f41089e54555 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -208,6 +208,7 @@ struct mptcp_pm_data { struct mptcp_addr_info local; struct mptcp_addr_info remote; struct list_head anno_list; + struct list_head userspace_pm_local_addr_list; =20 spinlock_t lock; /*protects the whole PM data */ =20 @@ -228,6 +229,14 @@ struct mptcp_pm_data { struct mptcp_rm_list rm_list_rx; }; =20 +struct mptcp_pm_addr_entry { + struct list_head list; + struct mptcp_addr_info addr; + u8 flags; + int ifindex; + struct socket *lsk; +}; + struct mptcp_data_frag { struct list_head list; u64 data_seq; @@ -601,6 +610,9 @@ void mptcp_subflow_reset(struct sock *ssk); void mptcp_sock_graft(struct sock *sk, struct socket *parent); struct socket *__mptcp_nmpc_socket(const struct mptcp_sock *msk); =20 +bool mptcp_addresses_equal(const struct mptcp_addr_info *a, + const struct mptcp_addr_info *b, bool use_port); + /* called with sk socket lock held */ int __mptcp_subflow_connect(struct sock *sk, const struct mptcp_addr_info = *loc, const struct mptcp_addr_info *remote); @@ -779,6 +791,9 @@ int mptcp_pm_announce_addr(struct mptcp_sock *msk, bool echo); int mptcp_pm_remove_addr(struct mptcp_sock *msk, const struct mptcp_rm_lis= t *rm_list); int mptcp_pm_remove_subflow(struct mptcp_sock *msk, const struct mptcp_rm_= list *rm_list); +int mptcp_userspace_pm_append_new_local_addr(struct mptcp_sock *msk, + struct mptcp_pm_addr_entry *entry); +void mptcp_free_local_addr_list(struct mptcp_sock *msk); =20 void mptcp_event(enum mptcp_event_type type, const struct mptcp_sock *msk, const struct sock *ssk, gfp_t gfp); --=20 2.36.0 From nobody Fri Mar 29 12:23:26 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:869:b0:4b8:7781:bd2f with SMTP id d41csp239557pis; Tue, 3 May 2022 19:39:13 -0700 (PDT) X-Google-Smtp-Source: ABdhPJypZ1gI/VS00mwygRf3kPmEszOfiL+L5smLXda8+FVgkX+xqyze69GfanfUxsuRxgs1sfpi X-Received: by 2002:a17:902:6a84:b0:15e:c50f:41c2 with SMTP id n4-20020a1709026a8400b0015ec50f41c2mr1364718plk.27.1651631953514; Tue, 03 May 2022 19:39:13 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1651631953; cv=none; d=google.com; s=arc-20160816; b=CZTuPDWyoCtrXx7rpFloi923bw45JATdlRUKfeqHb7EDxLNlp+vIplAT6akx9On6re r4U7WeXuGxSD1tsrEJF2mhF83p1o8AJmWZHmObw2xvNWhTlrhSzql77hgOu+AemApGxw +0YBNYvaUjcZIRiYxfQLDy2GDdzDwMVLPHefRls2phRiyhBIHJ1yxwARrOnvxQK496IZ UvovIfrOR9+ONBvlprfxmkQP9fAPpDA8pxpYhY0CUUB2XIvF33fniVc/dpNdDUtR1Mg3 u8SdvOteTQobURB4EUdoUVT/HRvc1q0iJTDDYhKNlnw4mH09xOtrPQ+5fjmJQVU3ZTnz S+yw== 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=/XxJBM5YAoO3u9NRXA/BRdqVYoyT380FLZTYIcpr4OI=; b=p5WomleY/8ycDXG7Slv9c75NwYe+/n+UFBljH241JG1pRVE9UVe6+3bj/M5FM15dDx QrHC354nHH+mwMv+5Y1vCeN58ZR5yo8GFe5fVDFUkWRBIdYGhuPb7Kv6LfmBeJjXY6+n W4rN6bYLFgsTIqD9x4+zSkrrDeUoplel3+dXOaUCKi8tYIJT96vopzHWDqmqGRyMf7bi bTnkZfoXWeBbdcO2wVXtkZzrguCsAciZnHgfr4SuZ4ok5Wa7y5ZVqkVVkmW1DG0OXHt7 6gTwGIUFrLW1yvkJv5uyYo3en7SZ/atlQRkIhH64eMlLIZEJcYP8YM8/jxweYCx7bYWd TzcA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=hElFR6ro; spf=pass (google.com: domain of mptcp+bounces-5076-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="mptcp+bounces-5076-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [2604:1380:45e3:2400::1]) by mx.google.com with ESMTPS id n15-20020a170903110f00b00153b2d16616si13888497plh.542.2022.05.03.19.39.13 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Tue, 03 May 2022 19:39:13 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-5076-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:45e3:2400::1 as permitted sender) client-ip=2604:1380:45e3:2400::1; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=hElFR6ro; spf=pass (google.com: domain of mptcp+bounces-5076-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="mptcp+bounces-5076-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 sv.mirrors.kernel.org (Postfix) with ESMTPS id 3AD8E2809AA for ; Wed, 4 May 2022 02:39:13 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id C4F5120EF; Wed, 4 May 2022 02:39:10 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8F6C420EC for ; Wed, 4 May 2022 02:39:09 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1651631949; x=1683167949; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=op3ufkMsUw3X5mNCgmwsCaCzkYqkwQ6qdR+SQOk/NSM=; b=hElFR6ro5M/mtMS8yjA67TjUq64+WHbZMrMeHweBnoipNDfYguOFP8AA 7JWw8ESa7pu6qWTg1AIGg1X3GGbyKi7QSFMbAgBM5/ZQinN9HdtZOChtw y+FdSIAkqy5uhs1r26I68M2YnDjbTKgT5R9cOlMTpTBEEXmCWgCeffou5 gOkmdRxUiBGE05K+Evd+JnWNsJlrzQVVZnvorxjypIGoW/KtVtvyM2y7r XQ39vZv8TVuDGqkXkkYktHNeShH8yhMzbrUzihsnbAXU3wjbj7AOlH0O4 H0i9ynUBZjw41vB+oy8ibOtUcTuRxZEIR24J5Q4htUK4pAUo4lLc569II Q==; X-IronPort-AV: E=McAfee;i="6400,9594,10336"; a="266488756" X-IronPort-AV: E=Sophos;i="5.91,196,1647327600"; d="scan'208";a="266488756" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 May 2022 19:39:07 -0700 X-IronPort-AV: E=Sophos;i="5.91,196,1647327600"; d="scan'208";a="584493370" Received: from mjmartin-desk2.amr.corp.intel.com (HELO mjmartin-desk2.intel.com) ([10.251.20.240]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 May 2022 19:39:07 -0700 From: Mat Martineau To: netdev@vger.kernel.org Cc: Kishen Maloor , davem@davemloft.net, kuba@kernel.org, pabeni@redhat.com, edumazet@google.com, matthieu.baerts@tessares.net, mptcp@lists.linux.dev, Mat Martineau Subject: [PATCH net-next 02/13] mptcp: read attributes of addr entries managed by userspace PMs Date: Tue, 3 May 2022 19:38:50 -0700 Message-Id: <20220504023901.277012-3-mathew.j.martineau@linux.intel.com> X-Mailer: git-send-email 2.36.0 In-Reply-To: <20220504023901.277012-1-mathew.j.martineau@linux.intel.com> References: <20220504023901.277012-1-mathew.j.martineau@linux.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: Kishen Maloor 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. Acked-by: Paolo Abeni Signed-off-by: Kishen Maloor Signed-off-by: Mat Martineau --- net/mptcp/pm_netlink.c | 13 +++++++++++- net/mptcp/pm_userspace.c | 43 ++++++++++++++++++++++++++++++++++++++++ net/mptcp/protocol.h | 7 ++++++- net/mptcp/subflow.c | 2 +- 4 files changed, 62 insertions(+), 3 deletions(-) diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index 9d515c3e0b16..79f5e7197a06 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -1033,6 +1033,9 @@ int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk, = struct sock_common *skc) if (mptcp_addresses_equal(&msk_local, &skc_local, false)) return 0; =20 + if (mptcp_pm_is_userspace(msk)) + return mptcp_userspace_pm_get_local_id(msk, &skc_local); + pernet =3D pm_nl_get_pernet_from_msk(msk); =20 rcu_read_lock(); @@ -1297,15 +1300,23 @@ 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 sock *sk =3D (struct sock *)msk; + struct net *net =3D sock_net(sk); =20 *flags =3D 0; *ifindex =3D 0; =20 if (id) { + if (mptcp_pm_is_userspace(msk)) + return mptcp_userspace_pm_get_flags_and_ifindex_by_id(msk, + id, + flags, + ifindex); + rcu_read_lock(); entry =3D __lookup_addr_by_id(pm_nl_get_pernet(net), id); if (entry) { diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c index c50f8900ffba..910116b0f5b9 100644 --- a/net/mptcp/pm_userspace.c +++ b/net/mptcp/pm_userspace.c @@ -76,3 +76,46 @@ int mptcp_userspace_pm_append_new_local_addr(struct mptc= p_sock *msk, spin_unlock_bh(&msk->pm.lock); return ret; } + +int mptcp_userspace_pm_get_flags_and_ifindex_by_id(struct mptcp_sock *msk, + unsigned int id, + u8 *flags, int *ifindex) +{ + struct mptcp_pm_addr_entry *entry, *match =3D NULL; + + *flags =3D 0; + *ifindex =3D 0; + + spin_lock_bh(&msk->pm.lock); + list_for_each_entry(entry, &msk->pm.userspace_pm_local_addr_list, list) { + if (id =3D=3D entry->addr.id) { + match =3D entry; + break; + } + } + spin_unlock_bh(&msk->pm.lock); + if (match) { + *flags =3D match->flags; + *ifindex =3D match->ifindex; + } + + return 0; +} + +int mptcp_userspace_pm_get_local_id(struct mptcp_sock *msk, + struct mptcp_addr_info *skc) +{ + 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; + new_entry.addr.id =3D 0; + new_entry.flags =3D MPTCP_PM_ADDR_FLAG_IMPLICIT; + + if (new_entry.addr.port =3D=3D msk_sport) + new_entry.addr.port =3D 0; + + return mptcp_userspace_pm_append_new_local_addr(msk, &new_entry); +} diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index f41089e54555..7257dc7aed43 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -783,8 +783,12 @@ mptcp_pm_del_add_timer(struct mptcp_sock *msk, struct mptcp_pm_add_entry * mptcp_lookup_anno_list_by_saddr(const struct mptcp_sock *msk, const 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); +int mptcp_userspace_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, const struct mptcp_addr_info *addr, @@ -862,6 +866,7 @@ bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, c= onst struct sk_buff *skb, bool mptcp_pm_rm_addr_signal(struct mptcp_sock *msk, unsigned int remainin= g, struct mptcp_rm_list *rm_list); int mptcp_pm_get_local_id(struct mptcp_sock *msk, struct sock_common *skc); +int mptcp_userspace_pm_get_local_id(struct mptcp_sock *msk, struct mptcp_a= ddr_info *skc); =20 void __init mptcp_pm_nl_init(void); void mptcp_pm_nl_work(struct mptcp_sock *msk); diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c index a0e7af33fb26..6d59336a8e1e 100644 --- a/net/mptcp/subflow.c +++ b/net/mptcp/subflow.c @@ -1468,7 +1468,7 @@ int __mptcp_subflow_connect(struct sock *sk, const st= ruct mptcp_addr_info *loc, if (local_id) subflow_set_local_id(subflow, local_id); =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.36.0 From nobody Fri Mar 29 12:23:26 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:869:b0:4b8:7781:bd2f with SMTP id d41csp239588pis; Tue, 3 May 2022 19:39:19 -0700 (PDT) X-Google-Smtp-Source: ABdhPJx6g7YgLKOd8YDjoGvD3znzinHOw2ZYREQX3GIonGNWBE8OooHK5CTT6tNmXK0+SuysAmOY X-Received: by 2002:a17:906:314b:b0:6d6:da31:e545 with SMTP id e11-20020a170906314b00b006d6da31e545mr18944098eje.125.1651631959217; Tue, 03 May 2022 19:39:19 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1651631959; cv=none; d=google.com; s=arc-20160816; b=qMjZ1tl7+8sBjOolYJxI9rL1W80m17t9PhWGrqpUp752DAwxWtpmLr6Sn33wBHOIdY qzyK9VNOGduyZd2kOFZ+Bm7vKG0WAlFNtz2USMw9KnLEgpEOsEl435kDk3cbDYe8HtY2 x0wsijGaqbCrY8rVlg3pofvzrmNjr2/pIjLSyd5NVs2zKb6CBGYaqX6SwiWoweA6gmI9 Pb52TGp0gU2jeP7Jg+fEhRPmpyXTMlAhPLvD1fO4Jg7nrdzOvvHN//1nvluIKceE/6yt K3EQfnCyH6bauYq7n5toi4RXcHRDZeNBy7C1Z0KvFR1FfbddF1ao6No0hCe8NeV5qtkG f/iw== 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=fiL/w9fGUAl6POsabPYc4PKW2uSZq7FCUO2jNCZ3HRE=; b=Cgj5bZa3o0GiRiVCghkalUtvS20j9/Bo8C79b45v3LeAj1LRM9rtBb+ncR4YtjENp0 L1L5aq/n0uvWwp9IyzR/PUFxPGIRcU6qPGqAhcF5bSfSM3/cJs9cH/IJhIPqDYYYaE70 djLbQUAZqz8Rcawrj5U31Uy7U+X6djLW7t8virV0oz7YjiHDXQQbDrmlryv1wEX13x/c 78aaRVMkvHPntotiZigC2TubnWRmC1wE4emIRlGPiCym4uoxsp2++RR62O7akager5iD G+gVRmAu52BYo97H+Lo+2wNOmsUXFnUd86RG/EJlsVmM2gudW5XxCFt2Ozb9rHKHDwuA BC3g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=hf7tbklD; spf=pass (google.com: domain of mptcp+bounces-5080-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:4040:4f00::1 as permitted sender) smtp.mailfrom="mptcp+bounces-5080-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from da.mirrors.kernel.org (da.mirrors.kernel.org. [2604:1380:4040:4f00::1]) by mx.google.com with ESMTPS id b21-20020a50e795000000b00425d5112cacsi15117665edn.390.2022.05.03.19.39.18 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Tue, 03 May 2022 19:39:19 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-5080-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:4040:4f00::1 as permitted sender) client-ip=2604:1380:4040:4f00::1; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=hf7tbklD; spf=pass (google.com: domain of mptcp+bounces-5080-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:4040:4f00::1 as permitted sender) smtp.mailfrom="mptcp+bounces-5080-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 da.mirrors.kernel.org (Postfix) with ESMTPS id 24F8A2E02EF for ; Wed, 4 May 2022 02:39:18 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 2A8C120EB; Wed, 4 May 2022 02:39:12 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D190320EC for ; Wed, 4 May 2022 02:39: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=1651631950; x=1683167950; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=mKsIE68GbBhuzYCRN1lC3xNvECjStEdhe9VlJFA8TM0=; b=hf7tbklD6KXOOUuECeUrOxMyNg232V10RxDwwFpeHLTb/qdmuEdm5S0c gQxi2+pNVujwizaiYuYTd4lDGxKdKXPJqkiyCk9lrRhb9v6fCKlQNJXKr Zjhz1//vTzQtGoVGRYZcLuQeNfBqN2G1De+XbQ+FwwNaO0WZlp6Dyy3a2 maknIdSuYpP6jw59XKSfP/2AFgFpZ9NGq6Bl9gpzB9TTzuxRv7y0AZfm9 ST1a764Tbzqixhmh5bIedlSEuZqn3eVJ5limEHTFLTKfmkQxgVbnHf9Cr WR1wQdSsxGMBhnZqmm9/tWsKqScQfOfAGp7GFmGfU4jHMUB0RrWr1B41M A==; X-IronPort-AV: E=McAfee;i="6400,9594,10336"; a="266488758" X-IronPort-AV: E=Sophos;i="5.91,196,1647327600"; d="scan'208";a="266488758" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 May 2022 19:39:07 -0700 X-IronPort-AV: E=Sophos;i="5.91,196,1647327600"; d="scan'208";a="584493371" Received: from mjmartin-desk2.amr.corp.intel.com (HELO mjmartin-desk2.intel.com) ([10.251.20.240]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 May 2022 19:39:07 -0700 From: Mat Martineau To: netdev@vger.kernel.org Cc: Florian Westphal , davem@davemloft.net, kuba@kernel.org, pabeni@redhat.com, edumazet@google.com, matthieu.baerts@tessares.net, mptcp@lists.linux.dev, Mat Martineau Subject: [PATCH net-next 03/13] mptcp: netlink: split mptcp_pm_parse_addr into two functions Date: Tue, 3 May 2022 19:38:51 -0700 Message-Id: <20220504023901.277012-4-mathew.j.martineau@linux.intel.com> X-Mailer: git-send-email 2.36.0 In-Reply-To: <20220504023901.277012-1-mathew.j.martineau@linux.intel.com> References: <20220504023901.277012-1-mathew.j.martineau@linux.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. Acked-by: Paolo Abeni Signed-off-by: Florian Westphal Signed-off-by: Mat Martineau --- 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 79f5e7197a06..7d9bed536966 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -1142,11 +1142,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) { @@ -1160,27 +1161,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"); @@ -1188,22 +1191,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 @@ -1251,7 +1269,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 @@ -1445,7 +1463,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 @@ -1619,7 +1637,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 @@ -1830,7 +1848,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.36.0 From nobody Fri Mar 29 12:23:26 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:869:b0:4b8:7781:bd2f with SMTP id d41csp239594pis; Tue, 3 May 2022 19:39:20 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyqlye2u/7TPuum6CxFP+R96D3ncKCRB5LsaVbAUvs6E6TI6MeLk8wRZRfZDPWbR0SfwBFu X-Received: by 2002:a17:906:d296:b0:6f4:318d:7ee3 with SMTP id ay22-20020a170906d29600b006f4318d7ee3mr14014041ejb.575.1651631960796; Tue, 03 May 2022 19:39:20 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1651631960; cv=none; d=google.com; s=arc-20160816; b=kzMGT6xS1xCj5B+4IQJod8lOSQ4HW7nZHV+Gx3BBnbChmefyYGxbs9Gh7YVwCDVaDN +yyc/4i99ReuZptQkps6Qc8NGPsK5m/P53cDbNbUDfpFIym2Fg/0gtO9h6oRmWS9n6ni dQjHETZg6GQ2FVcFwt2YIGDm4kcJCtCT9+2z8k6UGbjC27DXB4+++Ck17HlRvOOBS4Zk k5uMt4NVo91h26qsMyDt45iiHowN5n8s+ygaijXmYHwyfJbImZqjlF08S9aU42+4GAyw mDwefXP/Li0HrIatNuLrew4H3GGJQusGlEDyR0OjWv7EsN82jejdZi/IG40npuGLhQHR LuAw== 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=XGPVPOkzKTGIZ6iIKsDEiXcEUXPVkxV4r86WJkJsKeA=; b=QOrlhWT4bGRhx9yxJAVnQF674w+PZRHSdnyqIb34r/6P5IAhQ7XV+kJLy+gqQ+T44/ viz3/7GeD0BR9lpJDUnUQIwvZTs/8F549px2WRyY0OaQqQqRFhQDhIHjEsEEize0cNs4 d6tNBYGQi9W9HyCCy05cjLnAP5lSfCGUlLZekOU5JCETMIok82kcxX2kvIB3U2NOPNdy A+HRdlUhaPRAqZcGaub0cG+EABo5EcPpc/x5+Ib6QzscJ7iPOmE2u8akJY+qlldlmvTG 9QCzNCo8IhzSJP/hjhGZR7sTSmW9C7FRifjplpUOskcd0JdY0D6HEdsZcbFZi6vEG0OB 70DA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=oGXHMf97; spf=pass (google.com: domain of mptcp+bounces-5081-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.84.19 as permitted sender) smtp.mailfrom="mptcp+bounces-5081-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from da.mirrors.kernel.org (da.mirrors.kernel.org. [139.178.84.19]) by mx.google.com with ESMTPS id j19-20020a05640211d300b00427d799d5f3si5911253edw.133.2022.05.03.19.39.20 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Tue, 03 May 2022 19:39:20 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-5081-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.84.19 as permitted sender) client-ip=139.178.84.19; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=oGXHMf97; spf=pass (google.com: domain of mptcp+bounces-5081-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.84.19 as permitted sender) smtp.mailfrom="mptcp+bounces-5081-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 da.mirrors.kernel.org (Postfix) with ESMTPS id 693582E09B1 for ; Wed, 4 May 2022 02:39:19 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 85CCE20EE; Wed, 4 May 2022 02:39:12 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 19B0E20EA for ; Wed, 4 May 2022 02:39: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=1651631951; x=1683167951; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=1ddyKnkf+iGRfpWf9YNzEch91XJ2FQwqn6hbUF3WEUg=; b=oGXHMf97wpPw3UMB0azg5rqH23QzNgRySg/MIRkasi1CAed9jDAbdnjm xna5HaglpQ6ionWi5F4VYCRCzWLLIZT2IwYoc1Awmc1dQqBj+mqx1St+0 1sF+GH7kbkMLFy/A6uVNbt2A2f9mFQpho2eXiD1Z8Ur0R597wKl7OtEMl oWfut/zaCj0JFDbyKVm7n146rBd7DTOak1hlz7Fk9teMIHOU5L3Pe10uD vJwBq7peIapBcfSAPNrRhaddeA1OM0P2wjxoSu8ijE5Yju1v1uYZsn/6P YRogFRd7fCfj1OYWqXCDDnBg6vIH0mOT4EbEgyRy4i83FAJzsoI2BQddD Q==; X-IronPort-AV: E=McAfee;i="6400,9594,10336"; a="266488761" X-IronPort-AV: E=Sophos;i="5.91,196,1647327600"; d="scan'208";a="266488761" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 May 2022 19:39:07 -0700 X-IronPort-AV: E=Sophos;i="5.91,196,1647327600"; d="scan'208";a="584493375" Received: from mjmartin-desk2.amr.corp.intel.com (HELO mjmartin-desk2.intel.com) ([10.251.20.240]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 May 2022 19:39:07 -0700 From: Mat Martineau To: netdev@vger.kernel.org Cc: Kishen Maloor , davem@davemloft.net, kuba@kernel.org, pabeni@redhat.com, edumazet@google.com, matthieu.baerts@tessares.net, mptcp@lists.linux.dev, Mat Martineau Subject: [PATCH net-next 04/13] mptcp: netlink: Add MPTCP_PM_CMD_ANNOUNCE Date: Tue, 3 May 2022 19:38:52 -0700 Message-Id: <20220504023901.277012-5-mathew.j.martineau@linux.intel.com> X-Mailer: git-send-email 2.36.0 In-Reply-To: <20220504023901.277012-1-mathew.j.martineau@linux.intel.com> References: <20220504023901.277012-1-mathew.j.martineau@linux.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: Kishen Maloor 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] }. Acked-by: Paolo Abeni Signed-off-by: Kishen Maloor Signed-off-by: Mat Martineau --- include/uapi/linux/mptcp.h | 2 ++ net/mptcp/pm_netlink.c | 16 ++++++---- net/mptcp/pm_userspace.c | 61 ++++++++++++++++++++++++++++++++++++++ net/mptcp/protocol.h | 7 +++++ 4 files changed, 81 insertions(+), 5 deletions(-) diff --git a/include/uapi/linux/mptcp.h b/include/uapi/linux/mptcp.h index e41ea01a94bb..ac66c1263f02 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 7d9bed536966..dbe5ccd95ac5 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -352,8 +352,8 @@ mptcp_pm_del_add_timer(struct mptcp_sock *msk, return entry; } =20 -static bool mptcp_pm_alloc_anno_list(struct mptcp_sock *msk, - const struct mptcp_pm_addr_entry *entry) +bool mptcp_pm_alloc_anno_list(struct mptcp_sock *msk, + const struct mptcp_pm_addr_entry *entry) { struct mptcp_pm_add_entry *add_entry =3D NULL; struct sock *sk =3D (struct sock *)msk; @@ -1094,6 +1094,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) @@ -1203,9 +1204,9 @@ static int mptcp_pm_parse_pm_addr_attr(struct nlattr = *tb[], return err; } =20 -static int mptcp_pm_parse_entry(struct nlattr *attr, struct genl_info *inf= o, - bool require_family, - struct mptcp_pm_addr_entry *entry) +int mptcp_pm_parse_entry(struct nlattr *attr, struct genl_info *info, + bool require_family, + struct mptcp_pm_addr_entry *entry) { struct nlattr *tb[MPTCP_PM_ADDR_ATTR_MAX + 1]; int err; @@ -2198,6 +2199,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 { diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c index 910116b0f5b9..347184a9157b 100644 --- a/net/mptcp/pm_userspace.c +++ b/net/mptcp/pm_userspace.c @@ -119,3 +119,64 @@ int mptcp_userspace_pm_get_local_id(struct mptcp_sock = *msk, =20 return mptcp_userspace_pm_append_new_local_addr(msk, &new_entry); } + +int mptcp_nl_cmd_announce(struct sk_buff *skb, struct genl_info *info) +{ + struct nlattr *token =3D info->attrs[MPTCP_PM_ATTR_TOKEN]; + struct nlattr *addr =3D info->attrs[MPTCP_PM_ATTR_ADDR]; + struct mptcp_pm_addr_entry addr_val; + struct mptcp_sock *msk; + int err =3D -EINVAL; + u32 token_val; + + if (!addr || !token) { + GENL_SET_ERR_MSG(info, "missing required inputs"); + return err; + } + + 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 err; + } + + if (!mptcp_pm_is_userspace(msk)) { + GENL_SET_ERR_MSG(info, "invalid request; userspace PM not selected"); + goto announce_err; + } + + err =3D mptcp_pm_parse_entry(addr, info, true, &addr_val); + if (err < 0) { + GENL_SET_ERR_MSG(info, "error parsing local address"); + goto announce_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"); + goto announce_err; + } + + err =3D mptcp_userspace_pm_append_new_local_addr(msk, &addr_val); + if (err < 0) { + GENL_SET_ERR_MSG(info, "did not match address and id"); + goto announce_err; + } + + lock_sock((struct sock *)msk); + spin_lock_bh(&msk->pm.lock); + + if (mptcp_pm_alloc_anno_list(msk, &addr_val)) { + 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); + + err =3D 0; + announce_err: + sock_put((struct sock *)msk); + return err; +} diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index 7257dc7aed43..de645efbc806 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -11,6 +11,7 @@ #include #include #include +#include =20 #define MPTCP_SUPPORTED_VERSION 1 =20 @@ -755,6 +756,9 @@ u16 __mptcp_make_csum(u64 data_seq, u32 subflow_seq, u1= 6 data_len, __wsum sum); void __init mptcp_pm_init(void); void mptcp_pm_data_init(struct mptcp_sock *msk); void mptcp_pm_data_reset(struct mptcp_sock *msk); +int mptcp_pm_parse_entry(struct nlattr *attr, struct genl_info *info, + bool require_family, + struct mptcp_pm_addr_entry *entry); void mptcp_pm_subflow_chk_stale(const struct mptcp_sock *msk, struct sock = *ssk); void mptcp_pm_nl_subflow_chk_stale(const struct mptcp_sock *msk, struct so= ck *ssk); void mptcp_pm_new_connection(struct mptcp_sock *msk, const struct sock *ss= k, int server_side); @@ -775,6 +779,8 @@ void mptcp_pm_rm_addr_received(struct mptcp_sock *msk, const struct mptcp_rm_list *rm_list); void mptcp_pm_mp_prio_received(struct sock *sk, u8 bkup); void mptcp_pm_mp_fail_received(struct sock *sk, u64 fail_seq); +bool mptcp_pm_alloc_anno_list(struct mptcp_sock *msk, + const struct mptcp_pm_addr_entry *entry); void mptcp_pm_free_anno_list(struct mptcp_sock *msk); bool mptcp_pm_sport_in_anno_list(struct mptcp_sock *msk, const struct sock= *sk); struct mptcp_pm_add_entry * @@ -798,6 +804,7 @@ int mptcp_pm_remove_subflow(struct mptcp_sock *msk, con= st struct mptcp_rm_list * int mptcp_userspace_pm_append_new_local_addr(struct mptcp_sock *msk, struct mptcp_pm_addr_entry *entry); void mptcp_free_local_addr_list(struct mptcp_sock *msk); +int mptcp_nl_cmd_announce(struct sk_buff *skb, struct genl_info *info); =20 void mptcp_event(enum mptcp_event_type type, const struct mptcp_sock *msk, const struct sock *ssk, gfp_t gfp); --=20 2.36.0 From nobody Fri Mar 29 12:23:26 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:869:b0:4b8:7781:bd2f with SMTP id d41csp239595pis; Tue, 3 May 2022 19:39:21 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwOq1hrFeSq2kXfbbHKLMYE9LSVdThJ/EMsbGI2KXs6bcrPAjtHEk8SJ2YoMXbusVVNQgA0 X-Received: by 2002:a17:902:f54a:b0:15e:a95a:c0a7 with SMTP id h10-20020a170902f54a00b0015ea95ac0a7mr11336322plf.134.1651631960777; Tue, 03 May 2022 19:39:20 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1651631960; cv=none; d=google.com; s=arc-20160816; b=I7r3exm9NuufEl8tZ1xDep59vGpx9hK/58E17X4iKt99QqVyPGlJFLLiLB+ds/Gzzc yPItJFmduVRMSU8Zh4VCnlD5d5HndTBT/2YZjYi6ngIrtipJMca/RBXVVzo5N74pzqom fSOoI4fxvLLDAS0uEU3DFTshdrdRGPpGRvVlQkcaxknPTnH2YYrrDQOJXEtEBpCNGa9m LlTt8IxOBPNYhdkOUgV4jl1EJCUKjO8SobJNZccnI7DsdTPgETduA/STKA4sGBzkMKfd p+JKf/w5DgK3a8fRtL99vP+xgKMd+v1cF5evLi2idLrehlicqIluKaL0PtN4uuu4v8kB HIGw== 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=Y0XPXqq4Tn2IG1dzfVeXoH6aISNLsJvLq+Aq0qxiTm8=; b=BHHidJbgOzrPY+XtGbxCBznkcFIeuZRP5G6NeJxR3eq2SUsJFx68Wr2gy/mxtNtAoa dw1J/wg1U3PHLIcCR7LQk400//wkkK7qBYt7fYNrGdJR1/j09kOsnZAsW47/IdOPwv1Y Y0XFRtcWpHX5uS/Stb7u6wd+LRD8iujia7hV9y3A8Dsy+cpCmjmfva9Dab31arY/V2sI Hv2uWw2Na3LdH9ODdk2Omx8LP4uEesPxeRKGJTxRYQB+JBwo1YG+VKCMxggeXlWrPajn 99D0zSBJDclibQffmsNF24FC7hju0AC4rabjSpNocS2nBhGZvGQVjSe7FB3gj9TqTIt/ J3HA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=LYeEdyc9; spf=pass (google.com: domain of mptcp+bounces-5082-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="mptcp+bounces-5082-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [2604:1380:45e3:2400::1]) by mx.google.com with ESMTPS id p2-20020a17090ab90200b001dc1bd7d5afsi3369782pjr.61.2022.05.03.19.39.20 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Tue, 03 May 2022 19:39:20 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-5082-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:45e3:2400::1 as permitted sender) client-ip=2604:1380:45e3:2400::1; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=LYeEdyc9; spf=pass (google.com: domain of mptcp+bounces-5082-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:45e3:2400::1 as permitted sender) smtp.mailfrom="mptcp+bounces-5082-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 sv.mirrors.kernel.org (Postfix) with ESMTPS id 3FD44280AA0 for ; Wed, 4 May 2022 02:39:20 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id D200620F4; Wed, 4 May 2022 02:39:12 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6CAFA20F1 for ; Wed, 4 May 2022 02:39: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=1651631951; x=1683167951; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=6E80Hv12hRGPIBPTXwt26s/R2OTUyBVRk2P4nNTUbjg=; b=LYeEdyc9ZoyHgx4syGl9Og5L7LRGVo9mrFBiqLvWvTF7AXIz0Q7++9gq 1g9DLttupo5WlAH2ihM35CwKndlLsQvAbB4bU2sSx1u5x2aEPMxY9NWcz cE6UQdbHioyfcrLekA+8AU12CY1Rk98lMxBzxkj36W/g3skPbCCpJjaoo 97gOeGOyOn1KJcP4eUmTvYmSlrf7c+TRcs6G35EIuD3IpWjnuuAT/EFxI 90/+iQRcfWQqq3rbhG8opuECqX4kHd3AYb36/LmO1w1ZglQjNlvOK/5NE Id7MOaPsksATyMFSiqKYZ4siOSCcuGShnEHe1iAjDQVzl32JA00qRVBTx A==; X-IronPort-AV: E=McAfee;i="6400,9594,10336"; a="266488764" X-IronPort-AV: E=Sophos;i="5.91,196,1647327600"; d="scan'208";a="266488764" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 May 2022 19:39:07 -0700 X-IronPort-AV: E=Sophos;i="5.91,196,1647327600"; d="scan'208";a="584493378" Received: from mjmartin-desk2.amr.corp.intel.com (HELO mjmartin-desk2.intel.com) ([10.251.20.240]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 May 2022 19:39:07 -0700 From: Mat Martineau To: netdev@vger.kernel.org Cc: Kishen Maloor , davem@davemloft.net, kuba@kernel.org, pabeni@redhat.com, edumazet@google.com, matthieu.baerts@tessares.net, mptcp@lists.linux.dev, Mat Martineau Subject: [PATCH net-next 05/13] selftests: mptcp: support MPTCP_PM_CMD_ANNOUNCE Date: Tue, 3 May 2022 19:38:53 -0700 Message-Id: <20220504023901.277012-6-mathew.j.martineau@linux.intel.com> X-Mailer: git-send-email 2.36.0 In-Reply-To: <20220504023901.277012-1-mathew.j.martineau@linux.intel.com> References: <20220504023901.277012-1-mathew.j.martineau@linux.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: Kishen Maloor 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 Acked-by: Paolo Abeni Signed-off-by: Kishen Maloor Signed-off-by: Mat Martineau --- tools/testing/selftests/net/mptcp/pm_nl_ctl.c | 131 ++++++++++++++++++ 1 file changed, 131 insertions(+) diff --git a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c b/tools/testing/= selftests/net/mptcp/pm_nl_ctl.c index a75a68ad652e..0ef35c3f6419 100644 --- a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c +++ b/tools/testing/selftests/net/mptcp/pm_nl_ctl.c @@ -6,6 +6,7 @@ #include #include #include +#include =20 #include #include @@ -26,6 +27,7 @@ static void syntax(char *argv[]) { fprintf(stderr, "%s add|get|set|del|flush|dump|accept []\n", argv[0= ]); fprintf(stderr, "\tadd [flags signal|subflow|backup|fullmesh] [id ] [= dev ] \n"); + fprintf(stderr, "\tann id token [port ] [dev ]\n"); fprintf(stderr, "\tdel []\n"); fprintf(stderr, "\tget \n"); fprintf(stderr, "\tset [] [id ] flags [no]backup|[no]fullmesh [po= rt ]\n"); @@ -170,6 +172,133 @@ 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], "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)) + @@ -786,6 +915,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.36.0 From nobody Fri Mar 29 12:23:26 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:869:b0:4b8:7781:bd2f with SMTP id d41csp239603pis; Tue, 3 May 2022 19:39:21 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzkoZZdFrwde9tOY9BFAG7okbDMI9m57KLoC3BOH2/wjKamXHrYBv6DS6ojadsJATaBV9mN X-Received: by 2002:a63:cc51:0:b0:3c2:4b63:214 with SMTP id q17-20020a63cc51000000b003c24b630214mr8083876pgi.163.1651631961657; Tue, 03 May 2022 19:39:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1651631961; cv=none; d=google.com; s=arc-20160816; b=mFzoCaRo6a1wNy8pHtA95g/AVS2utcwIisZIYtCOFQJ76hZ366Yq7AlqrSxZpgURtS hP4FvEbmb6eOpYH3McrxJrt5uUf/zLsLqI1lx0k+XN7GrvNWj5DG+st4RXKO74GBQm6s QRwUESY05xpNc2gdaBLsvOpnxsRvaMUCqmRW0Av8Xm4TcBlIuiX1dChl8h10BCcTBirs wVPPhoCF+uu25DRL8L3iyQ4L+oiOAMPSTtbrGmkF8eLXDUdmV34mlJ55WWhxi5HLvgel gFaHpIIxm2WGIlgfXbGYJzJsqlB7oJPggZc4GATymLxBw17eH/0lkTDQ/4GUvPBrk5wN CTTw== 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=/7RATiIPmiF6cWeE7/wgpoiHvii7sf2n0uyTqUfJoOA=; b=woEUnKRSVTqxH6dD2mVQ+0d7kybKcktcYM7F7T1KQi3b4oOJQlvf6Hj7eiqyFwm9+V 1bzI72BghIIKDRo6tjS1fKgnQ/CPAW3HWWMoofGIWFT0Pze/QB+vBBIh8m7lio8XpzRE gXUuZPaoTA0mIRq+uUuN+6P4RPpRcWBEk3HDdPkitMf0Baejjhgo+2LO919IXmXjGBFM zFXXAy0m3QuNBDrnVfA8Zt5dQWiRMcT1m18L2sIH3bDu21gSIcaBftTU3v5WMlAn6Mjv YonrS2DmfryteySl5FjWiAP7u6DX3pBTPrEaWokKzXT3SOr55vgtk1zi0NHeKZD/RgX8 7qdw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=X6U0JSuT; spf=pass (google.com: domain of mptcp+bounces-5083-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.88.99 as permitted sender) smtp.mailfrom="mptcp+bounces-5083-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [139.178.88.99]) by mx.google.com with ESMTPS id q23-20020a656a97000000b003c22771658dsi8116827pgu.482.2022.05.03.19.39.21 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Tue, 03 May 2022 19:39:21 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-5083-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.88.99 as permitted sender) client-ip=139.178.88.99; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=X6U0JSuT; spf=pass (google.com: domain of mptcp+bounces-5083-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.88.99 as permitted sender) smtp.mailfrom="mptcp+bounces-5083-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 sv.mirrors.kernel.org (Postfix) with ESMTPS id 67019280A95 for ; Wed, 4 May 2022 02:39:21 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 9578F20ED; Wed, 4 May 2022 02:39:13 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 38E2B20EC for ; Wed, 4 May 2022 02:39: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=1651631952; x=1683167952; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=3ouXDUaXPlJuTvaTvTUptwOEPyKqWY9g1+x4mHYfDWY=; b=X6U0JSuTxf0B7JCdQFZtu+fGr2s+/c69ZarXp+eQSjRtpqSyBUvWHb1N lyGASfXeU3zlKVMsU3tAwVpsaNSSQjqcWui5uHaILDQx/dDfvEwqrZWz+ MGB9imd2YQB/TJ6z8f9yh3VB8uR9jMX8FP99/OJHHK9093UKj6FBbuAH2 8T3f6rQwktK/fJ74i4s9LJmQ5dqpEndlzEtNS/mQMpWq+7RiukKBvtblW Oujx2hIleVphc/kU5Ges1b0J25j93rT8hwcr6cXcqlWBnf78/6YE0FGxz GojJRFA/bJGBoBVi86rD6tMiARmr/i8ELl1pG3g0UdRqI8UCbqA/8wi7D g==; X-IronPort-AV: E=McAfee;i="6400,9594,10336"; a="266488766" X-IronPort-AV: E=Sophos;i="5.91,196,1647327600"; d="scan'208";a="266488766" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 May 2022 19:39:08 -0700 X-IronPort-AV: E=Sophos;i="5.91,196,1647327600"; d="scan'208";a="584493382" Received: from mjmartin-desk2.amr.corp.intel.com (HELO mjmartin-desk2.intel.com) ([10.251.20.240]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 May 2022 19:39:07 -0700 From: Mat Martineau To: netdev@vger.kernel.org Cc: Kishen Maloor , davem@davemloft.net, kuba@kernel.org, pabeni@redhat.com, edumazet@google.com, matthieu.baerts@tessares.net, mptcp@lists.linux.dev, Mat Martineau Subject: [PATCH net-next 06/13] mptcp: netlink: Add MPTCP_PM_CMD_REMOVE Date: Tue, 3 May 2022 19:38:54 -0700 Message-Id: <20220504023901.277012-7-mathew.j.martineau@linux.intel.com> X-Mailer: git-send-email 2.36.0 In-Reply-To: <20220504023901.277012-1-mathew.j.martineau@linux.intel.com> References: <20220504023901.277012-1-mathew.j.martineau@linux.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: Kishen Maloor This change adds a MPTCP netlink command for issuing a REMOVE_ADDR signal for an address over the chosen MPTCP connection from a userspace path manager. The command requires the following parameters: {token, loc_id}. Acked-by: Paolo Abeni Signed-off-by: Kishen Maloor Signed-off-by: Mat Martineau --- include/uapi/linux/mptcp.h | 2 ++ net/mptcp/pm_netlink.c | 10 ++++-- net/mptcp/pm_userspace.c | 62 ++++++++++++++++++++++++++++++++++++++ net/mptcp/protocol.h | 4 +++ 4 files changed, 76 insertions(+), 2 deletions(-) diff --git a/include/uapi/linux/mptcp.h b/include/uapi/linux/mptcp.h index ac66c1263f02..11f9fa001a3c 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 dbe5ccd95ac5..a26750f19f65 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -1095,6 +1095,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) @@ -1504,8 +1505,8 @@ static int mptcp_nl_cmd_del_addr(struct sk_buff *skb,= struct genl_info *info) return ret; } =20 -static void mptcp_pm_remove_addrs_and_subflows(struct mptcp_sock *msk, - struct list_head *rm_list) +void mptcp_pm_remove_addrs_and_subflows(struct mptcp_sock *msk, + struct list_head *rm_list) { struct mptcp_rm_list alist =3D { .nr =3D 0 }, slist =3D { .nr =3D 0 }; struct mptcp_pm_addr_entry *entry; @@ -2204,6 +2205,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 { diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c index 347184a9157b..3a42c9e66126 100644 --- a/net/mptcp/pm_userspace.c +++ b/net/mptcp/pm_userspace.c @@ -180,3 +180,65 @@ int mptcp_nl_cmd_announce(struct sk_buff *skb, struct = genl_info *info) sock_put((struct sock *)msk); return err; } + +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 mptcp_pm_addr_entry *match =3D NULL; + struct mptcp_pm_addr_entry *entry; + struct mptcp_sock *msk; + LIST_HEAD(free_list); + int err =3D -EINVAL; + u32 token_val; + u8 id_val; + + if (!id || !token) { + GENL_SET_ERR_MSG(info, "missing required inputs"); + return err; + } + + 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 err; + } + + if (!mptcp_pm_is_userspace(msk)) { + GENL_SET_ERR_MSG(info, "invalid request; userspace PM not selected"); + goto remove_err; + } + + lock_sock((struct sock *)msk); + + list_for_each_entry(entry, &msk->pm.userspace_pm_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); + goto remove_err; + } + + 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) { + sock_kfree_s((struct sock *)msk, match, sizeof(*match)); + } + + err =3D 0; + remove_err: + sock_put((struct sock *)msk); + return err; +} diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index de645efbc806..4026aa3df7f4 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -801,10 +801,14 @@ int mptcp_pm_announce_addr(struct mptcp_sock *msk, bool echo); int mptcp_pm_remove_addr(struct mptcp_sock *msk, const struct mptcp_rm_lis= t *rm_list); int mptcp_pm_remove_subflow(struct mptcp_sock *msk, const struct mptcp_rm_= list *rm_list); +void mptcp_pm_remove_addrs_and_subflows(struct mptcp_sock *msk, + struct list_head *rm_list); + int mptcp_userspace_pm_append_new_local_addr(struct mptcp_sock *msk, struct mptcp_pm_addr_entry *entry); void mptcp_free_local_addr_list(struct mptcp_sock *msk); int mptcp_nl_cmd_announce(struct sk_buff *skb, struct genl_info *info); +int mptcp_nl_cmd_remove(struct sk_buff *skb, struct genl_info *info); =20 void mptcp_event(enum mptcp_event_type type, const struct mptcp_sock *msk, const struct sock *ssk, gfp_t gfp); --=20 2.36.0 From nobody Fri Mar 29 12:23:26 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:869:b0:4b8:7781:bd2f with SMTP id d41csp239620pis; Tue, 3 May 2022 19:39:24 -0700 (PDT) X-Google-Smtp-Source: ABdhPJx+Sa1P+l/F3nLwJj7OFFTMd5n0CUF3dHv1GfTT30gIvjAJwIJaQJZNBPlSzq0MUzJaXXC1 X-Received: by 2002:a17:90b:3944:b0:1dc:1ddb:e25c with SMTP id oe4-20020a17090b394400b001dc1ddbe25cmr7980415pjb.124.1651631963969; Tue, 03 May 2022 19:39:23 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1651631963; cv=none; d=google.com; s=arc-20160816; b=IPfx82hEzo2Ty9B6p758ylPRRePWZxJTotYo7k+CD0S4WxHTgEbMplORXY64XI4mvA SvESDOW61pNdcGCMUmIgfbx4VCGYX6id+SjZhK1DM4MZazjnTO21OrLzMfjtna/dfmkw 7v95LZXkIjqXYJ2QWYggHpdBLvViebRpjf3iWywphevwoQ5RGMzWSU2bvJgYQrU+7k/Q DvmDD11UbWPt5W+j2CwgXSLh2O/+GX4TsO6w16GDp+xoS5ydySXRZ/9uZ99l1/A5jOG6 n8z4s7qAPqXrgVFynUkK0ZFb8HMfWLk3EXyFa6tumVXnho9YqkUE5GZugmL85M33qCqW 2FYg== 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=caL/wBqJng8KMW7RDfZ8R085NJ/Ir+mi6CvD/XuTnr8=; b=oPDAwDS/mMg0UAo32JfEnTGxpjTE3zYwla3TG6pyI38nkFQMhajiED3gC3t8kMAKQK hmZwNQMVKcB7gTxDVBPA/6IQ51y8tRBXIOm6llU2fXJ4vwPInaPtYGG0d3PyYFS8av+i IOqneAVY7X0u7OpE9kG4lC+ILacUeeeo1f6vq2idHITNCcdFVgE1MvQrd8oxsVr66LjO sTKi7zWwNciFLuNPUNQsXc4mFJo1O3NsY558YWYbbOeHgDvZd4DShOaSx7Nu3ELaEgn9 1kWIG//yx7xURWuQnL57fcQFktTMpQo/yd8oO69EptQuMWemDZkbb7hmdky+7Ns1yEyj FVEA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=O5XxNdzj; spf=pass (google.com: domain of mptcp+bounces-5085-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.88.99 as permitted sender) smtp.mailfrom="mptcp+bounces-5085-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [139.178.88.99]) by mx.google.com with ESMTPS id q23-20020a656a97000000b003c22771658dsi8116827pgu.482.2022.05.03.19.39.23 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Tue, 03 May 2022 19:39:23 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-5085-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.88.99 as permitted sender) client-ip=139.178.88.99; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=O5XxNdzj; spf=pass (google.com: domain of mptcp+bounces-5085-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.88.99 as permitted sender) smtp.mailfrom="mptcp+bounces-5085-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 sv.mirrors.kernel.org (Postfix) with ESMTPS id C81BB280A92 for ; Wed, 4 May 2022 02:39:23 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 52AEC20EF; Wed, 4 May 2022 02:39:14 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9B82920EA for ; Wed, 4 May 2022 02:39: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=1651631952; x=1683167952; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=BTuJLvhT2HSc1fn6mxDRYIMI8004r4543DADFIHv6G8=; b=O5XxNdzjKAPw+Tw32xLOHEbb1jX3EDMCCCAH0e3nrKzXwuZKaFPtGY1g lwW1o3kq/pez9PvEPWpBbc7z8humZ1lvBg8IYqhP2S798w6WS8lg1Wo1Y fVP09ljJCZHi9d5tmiTiBIXT1/sNRsKhvFJHUVnbgWIb5clOkbPIoUw1N 07CXCTqZ+kUPxxCw39WNPCq7X1L9gTmpVRTkxdGddOfvCzZf8rbzaIL4m 9NvkwfJ2xYfA7BefqBIGoUt6nmhb44tuafkPyMC0SlTVz4dJEPVHSXrJX Hqkjvnoa859pRmzzelcqhYSC6N/R/5E8cKiWPpoRZFHYzJGPrHXu/EQSH Q==; X-IronPort-AV: E=McAfee;i="6400,9594,10336"; a="266488768" X-IronPort-AV: E=Sophos;i="5.91,196,1647327600"; d="scan'208";a="266488768" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 May 2022 19:39:08 -0700 X-IronPort-AV: E=Sophos;i="5.91,196,1647327600"; d="scan'208";a="584493386" Received: from mjmartin-desk2.amr.corp.intel.com (HELO mjmartin-desk2.intel.com) ([10.251.20.240]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 May 2022 19:39:07 -0700 From: Mat Martineau To: netdev@vger.kernel.org Cc: Kishen Maloor , davem@davemloft.net, kuba@kernel.org, pabeni@redhat.com, edumazet@google.com, matthieu.baerts@tessares.net, mptcp@lists.linux.dev, Mat Martineau Subject: [PATCH net-next 07/13] selftests: mptcp: support MPTCP_PM_CMD_REMOVE Date: Tue, 3 May 2022 19:38:55 -0700 Message-Id: <20220504023901.277012-8-mathew.j.martineau@linux.intel.com> X-Mailer: git-send-email 2.36.0 In-Reply-To: <20220504023901.277012-1-mathew.j.martineau@linux.intel.com> References: <20220504023901.277012-1-mathew.j.martineau@linux.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: Kishen Maloor 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 a REMOVE_ADDR signal over the chosen MPTCP connection. E.g. ./pm_nl_ctl rem token 823274047 id 23 Acked-by: Paolo Abeni Signed-off-by: Kishen Maloor Signed-off-by: Mat Martineau --- 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 0ef35c3f6419..3506b0416c41 100644 --- a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c +++ b/tools/testing/selftests/net/mptcp/pm_nl_ctl.c @@ -28,6 +28,7 @@ static void syntax(char *argv[]) fprintf(stderr, "%s add|get|set|del|flush|dump|accept []\n", argv[0= ]); fprintf(stderr, "\tadd [flags signal|subflow|backup|fullmesh] [id ] [= dev ] \n"); fprintf(stderr, "\tann id token [port ] [dev ]\n"); + fprintf(stderr, "\trem id token \n"); fprintf(stderr, "\tdel []\n"); fprintf(stderr, "\tget \n"); fprintf(stderr, "\tset [] [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)) + @@ -917,6 +967,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.36.0 From nobody Fri Mar 29 12:23:26 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:869:b0:4b8:7781:bd2f with SMTP id d41csp239629pis; Tue, 3 May 2022 19:39:26 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwVIaZOKlvWtGOGGadxyQNbS/Q0K8Ao8J5oXLTse1BjUgSVzxTOHjnDQ20UPmaSOVtftpjp X-Received: by 2002:a05:6402:51cf:b0:424:494:e240 with SMTP id r15-20020a05640251cf00b004240494e240mr21049642edd.135.1651631966110; Tue, 03 May 2022 19:39:26 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1651631966; cv=none; d=google.com; s=arc-20160816; b=gMbZFYVmxb52sxC9V+K7+JRx5dvj25QT4PqY3O/kgF+moLNckW53pDGXCl58OSFaIj 23reh9tv6cv2VbDUn54vaGnX+rE9JWf9tIglMb5r+Jf30ZK/+wLlG75nIU698FUAgkK1 n1qcAmTo97oZ/Hj6ofaYoDruVTszbbU4mpy1ao6GdN5CzaeirivlA64P9Eb/pW54QPhs Og3vgNdpDqNMvmEhuBhHsiVlHWkJlMnuoR3zIWWkLtplIBEA3gjZYXzUskRIFUJwVHGA LOLg1Is0DZhs4lY8YsIhHsLgP5vv432w9mdKtbGsDEg59XzR8B03cz4M+q6gMt6WRrlq 4JmQ== 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=dPy0LipgkDy9oG7sjsSNjluIQrkAvHLJR45053by3b8=; b=Z5FmVdSOIbvkEw3vjCoN3QBoRF3Gterr6iqZsTyNLH5P7aMhd2syX6oci+71S8VcGi Nw3GgI0Or2rFMq35uqeoDs54gLbxKHFLXx/CBl+i3BZ3+8S6Wm4ByVduYeVJ6JX9+WJb R6uU9AOlp2b1nwGR+7bvLpHXKbaE0ud+RIfhzHbtABMk4vLMqO0tVOvvj4u29bijXowb q7b13Gc5DP9klrFRC+2AKvcddFA6qIegtfNd+y33fflr/ksm1SyM33K4xE0yQpvkFrvR ca1/BL0+/Oo8CzZ6wMjTBX9RuWmYA+TH5eKhO3sEBbtWFdG9MkU9tzeOrWGo+I3D2qwZ NhDw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=F1FjHXgj; spf=pass (google.com: domain of mptcp+bounces-5086-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:4040:4f00::1 as permitted sender) smtp.mailfrom="mptcp+bounces-5086-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from da.mirrors.kernel.org (da.mirrors.kernel.org. [2604:1380:4040:4f00::1]) by mx.google.com with ESMTPS id w15-20020a50c44f000000b00426024720bdsi15029541edf.577.2022.05.03.19.39.25 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Tue, 03 May 2022 19:39:26 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-5086-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:4040:4f00::1 as permitted sender) client-ip=2604:1380:4040:4f00::1; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=F1FjHXgj; spf=pass (google.com: domain of mptcp+bounces-5086-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:4040:4f00::1 as permitted sender) smtp.mailfrom="mptcp+bounces-5086-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 da.mirrors.kernel.org (Postfix) with ESMTPS id 57B1F2E09BC for ; Wed, 4 May 2022 02:39:25 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id A767A20EA; Wed, 4 May 2022 02:39:14 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DF0AC20F1 for ; Wed, 4 May 2022 02:39: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=1651631952; x=1683167952; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=0aroYytyngXIMB8Yt7q+wNPFeHzHcQa3q5lptV09EWE=; b=F1FjHXgjWX2JAMePZQWyE09vJnNCLTSk9XjOEYiJLlauFOimHT/3lWKr ToZpYM/igvgHEyWfXOpLLbft6qrePbAA7plPsdhHD4IhdWVgANRRdB3dP Q7deEZYrAbzWguN8UF376T2+J3so1+CELtkFxirushUOO+lXvrU3X/n0A shS3KQHglPYqT71pcMCzwXfzwo6NSKR62zyqMrq4R6DzwLXDbb3EB2+e0 efjNIGA28Nbc4/EWljQNWsuGMn8mSS6J2fBVh7nP/GZAX/zBAZm6gMPhp 5LahxZ3Q7IZXXU5kFbgjFQNBmFAArLZCn2C5oeCFBFbJyAG1q43rKuMf9 g==; X-IronPort-AV: E=McAfee;i="6400,9594,10336"; a="266488770" X-IronPort-AV: E=Sophos;i="5.91,196,1647327600"; d="scan'208";a="266488770" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 May 2022 19:39:08 -0700 X-IronPort-AV: E=Sophos;i="5.91,196,1647327600"; d="scan'208";a="584493390" Received: from mjmartin-desk2.amr.corp.intel.com (HELO mjmartin-desk2.intel.com) ([10.251.20.240]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 May 2022 19:39:08 -0700 From: Mat Martineau To: netdev@vger.kernel.org Cc: Florian Westphal , davem@davemloft.net, kuba@kernel.org, pabeni@redhat.com, edumazet@google.com, matthieu.baerts@tessares.net, mptcp@lists.linux.dev, Kishen Maloor , Mat Martineau Subject: [PATCH net-next 08/13] mptcp: netlink: allow userspace-driven subflow establishment Date: Tue, 3 May 2022 19:38:56 -0700 Message-Id: <20220504023901.277012-9-mathew.j.martineau@linux.intel.com> X-Mailer: git-send-email 2.36.0 In-Reply-To: <20220504023901.277012-1-mathew.j.martineau@linux.intel.com> References: <20220504023901.277012-1-mathew.j.martineau@linux.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 } Acked-by: Paolo Abeni Co-developed-by: Kishen Maloor Signed-off-by: Kishen Maloor Signed-off-by: Florian Westphal Signed-off-by: Mat Martineau --- include/uapi/linux/mptcp.h | 3 + net/mptcp/pm_netlink.c | 22 +++++ net/mptcp/pm_userspace.c | 185 +++++++++++++++++++++++++++++++++++++ net/mptcp/protocol.h | 4 + 4 files changed, 214 insertions(+) diff --git a/include/uapi/linux/mptcp.h b/include/uapi/linux/mptcp.h index 11f9fa001a3c..921963589904 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 a26750f19f65..e099f2a12504 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -1096,6 +1096,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) @@ -1205,6 +1207,16 @@ static int mptcp_pm_parse_pm_addr_attr(struct nlattr= *tb[], return err; } =20 +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); +} + int mptcp_pm_parse_entry(struct nlattr *attr, struct genl_info *info, bool require_family, struct mptcp_pm_addr_entry *entry) @@ -2210,6 +2222,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 { diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c index 3a42c9e66126..f56378e4f597 100644 --- a/net/mptcp/pm_userspace.c +++ b/net/mptcp/pm_userspace.c @@ -242,3 +242,188 @@ int mptcp_nl_cmd_remove(struct sk_buff *skb, struct g= enl_info *info) sock_put((struct sock *)msk); return err; } + +int mptcp_nl_cmd_sf_create(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_r; + struct mptcp_addr_info addr_l; + struct mptcp_sock *msk; + int err =3D -EINVAL; + struct sock *sk; + u32 token_val; + + if (!laddr || !raddr || !token) { + GENL_SET_ERR_MSG(info, "missing required inputs"); + return err; + } + + 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 err; + } + + if (!mptcp_pm_is_userspace(msk)) { + GENL_SET_ERR_MSG(info, "invalid request; userspace PM not selected"); + goto create_err; + } + + err =3D mptcp_pm_parse_addr(laddr, info, &addr_l); + if (err < 0) { + NL_SET_ERR_MSG_ATTR(info->extack, laddr, "error parsing local addr"); + goto create_err; + } + + if (addr_l.id =3D=3D 0) { + NL_SET_ERR_MSG_ATTR(info->extack, laddr, "missing local addr id"); + goto create_err; + } + + err =3D mptcp_pm_parse_addr(raddr, info, &addr_r); + if (err < 0) { + NL_SET_ERR_MSG_ATTR(info->extack, raddr, "error parsing remote addr"); + goto create_err; + } + + sk =3D &msk->sk.icsk_inet.sk; + lock_sock(sk); + + err =3D __mptcp_subflow_connect(sk, &addr_l, &addr_r); + + release_sock(sk); + + create_err: + sock_put((struct sock *)msk); + return err; +} + +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 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: { + const struct ipv6_pinfo *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; +} + +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; + int err =3D -EINVAL; + u32 token_val; + + if (!laddr || !raddr || !token) { + GENL_SET_ERR_MSG(info, "missing required inputs"); + return err; + } + + 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 err; + } + + if (!mptcp_pm_is_userspace(msk)) { + GENL_SET_ERR_MSG(info, "invalid request; userspace PM not selected"); + goto destroy_err; + } + + err =3D mptcp_pm_parse_addr(laddr, info, &addr_l); + if (err < 0) { + NL_SET_ERR_MSG_ATTR(info->extack, laddr, "error parsing local addr"); + goto destroy_err; + } + + err =3D mptcp_pm_parse_addr(raddr, info, &addr_r); + if (err < 0) { + NL_SET_ERR_MSG_ATTR(info->extack, raddr, "error parsing remote addr"); + goto destroy_err; + } + + if (addr_l.family !=3D addr_r.family) { + GENL_SET_ERR_MSG(info, "address families do not match"); + goto destroy_err; + } + + if (!addr_l.port || !addr_r.port) { + GENL_SET_ERR_MSG(info, "missing local or remote port"); + goto destroy_err; + } + + 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); + err =3D 0; + } else { + err =3D -ESRCH; + } + + destroy_err: + sock_put((struct sock *)msk); + return err; +} diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index 4026aa3df7f4..f542aeaa5b09 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -756,6 +756,8 @@ u16 __mptcp_make_csum(u64 data_seq, u32 subflow_seq, u1= 6 data_len, __wsum sum); void __init mptcp_pm_init(void); void mptcp_pm_data_init(struct mptcp_sock *msk); void mptcp_pm_data_reset(struct mptcp_sock *msk); +int mptcp_pm_parse_addr(struct nlattr *attr, struct genl_info *info, + struct mptcp_addr_info *addr); int mptcp_pm_parse_entry(struct nlattr *attr, struct genl_info *info, bool require_family, struct mptcp_pm_addr_entry *entry); @@ -809,6 +811,8 @@ int mptcp_userspace_pm_append_new_local_addr(struct mpt= cp_sock *msk, void mptcp_free_local_addr_list(struct mptcp_sock *msk); int mptcp_nl_cmd_announce(struct sk_buff *skb, struct genl_info *info); int mptcp_nl_cmd_remove(struct sk_buff *skb, struct genl_info *info); +int mptcp_nl_cmd_sf_create(struct sk_buff *skb, struct genl_info *info); +int mptcp_nl_cmd_sf_destroy(struct sk_buff *skb, struct genl_info *info); =20 void mptcp_event(enum mptcp_event_type type, const struct mptcp_sock *msk, const struct sock *ssk, gfp_t gfp); --=20 2.36.0 From nobody Fri Mar 29 12:23:26 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:869:b0:4b8:7781:bd2f with SMTP id d41csp239647pis; Tue, 3 May 2022 19:39:28 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyGlMc1pbEJEz5A6wn87/l0k2QKRgE2moCWEBFNfIJNLF0VETzc3/Z7Wjel/E3VXqf+jIid X-Received: by 2002:a17:907:3f16:b0:6f4:c54:2700 with SMTP id hq22-20020a1709073f1600b006f40c542700mr18596614ejc.615.1651631968422; Tue, 03 May 2022 19:39:28 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1651631968; cv=none; d=google.com; s=arc-20160816; b=DXnXeXYSrHulKlkqnd8A9Mv35Fk5D3Rk2PcJlAyzQKpwjjK9mx5l5EVgKe1Zv1bLaP EAsIngVtNlQCAMpJqOD0f4JrBbvQifT1+g9smxi4KcGW7H+WpvpTa7MXFQzHY9VRcIa2 XVTQW+aTa23ScdQW1YfyQSdX/SdWHw2K20SOfVHz6z66yM/eDMoAdu514v7OPOW+wwwp fnzkN33ZroqRzmKIsTBWbTfpdSNnuWLzqR3yJlaKqB+H/oseUZLJkwLp2jcKyQQJ2B8N grlfKGVp15L3tDmc0aoqNHqV6xllWLyHB5fUCe01+SQx79CbPCXH7IeT8g98fUz/hyRU p5Kg== 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=VOm0PKFeGnFbLeBOPO2BigRapqD88s9PrxiIUXiJ17Y=; b=NsV/ciEaaLLxlzBxEpi526E7jFcIZ/RQ7k4tWpAH+ubwsie3t+T/QmL3mq9tg0/GcW Xn8s4xwLw0TXkSoohZg7dVd49rS5XGa2rrVidg4ult4s4TquBVG28Ehu2TseJD+RuYMG ejiktWwIB8QjM1v5B99juRv892jWLsSzLZES9HqzyDUo3rUs0BWwAcP8nteyNTQ++Tmf o9duawrCrsY0Re50mGnWBBDeleBmno078AVQMO+f4VITxtYsjSdt5fSk3LAq3gWXdYhI 9jUt0XnYKTq3bKVaPrlxnziQow9GUBzGHPtYSL7wb8k18VtKa3uWwGXvK+rkCbcAHOE5 91yw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=aeb+qo0V; spf=pass (google.com: domain of mptcp+bounces-5087-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:4040:4f00::1 as permitted sender) smtp.mailfrom="mptcp+bounces-5087-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from da.mirrors.kernel.org (da.mirrors.kernel.org. [2604:1380:4040:4f00::1]) by mx.google.com with ESMTPS id f7-20020a50ee87000000b00423e3b84928si14733599edr.568.2022.05.03.19.39.28 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Tue, 03 May 2022 19:39:28 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-5087-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:4040:4f00::1 as permitted sender) client-ip=2604:1380:4040:4f00::1; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=aeb+qo0V; spf=pass (google.com: domain of mptcp+bounces-5087-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:4040:4f00::1 as permitted sender) smtp.mailfrom="mptcp+bounces-5087-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 da.mirrors.kernel.org (Postfix) with ESMTPS id 9152A2E09EF for ; Wed, 4 May 2022 02:39:26 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id B6BEE20F1; Wed, 4 May 2022 02:39:14 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9C33020EC for ; Wed, 4 May 2022 02:39: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=1651631953; x=1683167953; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=T5xudkTKsji2a3B8PwGdmyEVMiXPAnvn3ha+3QnNmE0=; b=aeb+qo0VdAhAI6lCFkWwHqeOh4wSS0f35/r4JZ6qYDxZeS+fUCrJJKos oFUd+1pQ0xkW9Luo/H+gts9nCHqYNsI9s1fq9P4wFOkrGx+AeI7EKnE5N A/sNcNJSh48CJyGW5eDmv1Gt8/WjTnB59bnprflqRkAL0NLnoilMtLAyN z/fDrbUyxhA8jGVxTbiU5H8+3Jy357KlhTUN59kCqEaZQZ8PfY9/W3Hj/ yexI2uPlgwoODYwdZDV9Yb7bvgL1plTG5sWEd7FVrl1/7m2uHGGRwvIBd CTPwxI/jcuLxDazHDlyhjw1vfDJ7QOJlE9lg1UfDWbvi7n0yhCdeitkHf g==; X-IronPort-AV: E=McAfee;i="6400,9594,10336"; a="266488772" X-IronPort-AV: E=Sophos;i="5.91,196,1647327600"; d="scan'208";a="266488772" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 May 2022 19:39:08 -0700 X-IronPort-AV: E=Sophos;i="5.91,196,1647327600"; d="scan'208";a="584493394" Received: from mjmartin-desk2.amr.corp.intel.com (HELO mjmartin-desk2.intel.com) ([10.251.20.240]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 May 2022 19:39:08 -0700 From: Mat Martineau To: netdev@vger.kernel.org Cc: Kishen Maloor , davem@davemloft.net, kuba@kernel.org, pabeni@redhat.com, edumazet@google.com, matthieu.baerts@tessares.net, mptcp@lists.linux.dev, Mat Martineau Subject: [PATCH net-next 09/13] selftests: mptcp: support MPTCP_PM_CMD_SUBFLOW_CREATE Date: Tue, 3 May 2022 19:38:57 -0700 Message-Id: <20220504023901.277012-10-mathew.j.martineau@linux.intel.com> X-Mailer: git-send-email 2.36.0 In-Reply-To: <20220504023901.277012-1-mathew.j.martineau@linux.intel.com> References: <20220504023901.277012-1-mathew.j.martineau@linux.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: Kishen Maloor 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 Acked-by: Paolo Abeni Signed-off-by: Kishen Maloor Signed-off-by: Mat Martineau --- 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 3506b0416c41..e2437bacd133 100644 --- a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c +++ b/tools/testing/selftests/net/mptcp/pm_nl_ctl.c @@ -29,6 +29,7 @@ static void syntax(char *argv[]) fprintf(stderr, "\tadd [flags signal|subflow|backup|fullmesh] [id ] [= dev ] \n"); fprintf(stderr, "\tann id token [port ] [dev ]\n"); fprintf(stderr, "\trem id token \n"); + fprintf(stderr, "\tcsf lip lid rip rpor= t token \n"); fprintf(stderr, "\tdel []\n"); fprintf(stderr, "\tget \n"); fprintf(stderr, "\tset [] [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)) + @@ -969,6 +1096,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.36.0 From nobody Fri Mar 29 12:23:26 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:869:b0:4b8:7781:bd2f with SMTP id d41csp239548pis; Tue, 3 May 2022 19:39:12 -0700 (PDT) X-Google-Smtp-Source: ABdhPJy9t+mGLMEJQZc9mvagKon3hhSq0Sb4s/7qMxi+CHH8B7psdrtKCIO22V5s+ehXTSfAHiqu X-Received: by 2002:a63:6ac9:0:b0:3bc:321e:6d56 with SMTP id f192-20020a636ac9000000b003bc321e6d56mr16154984pgc.490.1651631952133; Tue, 03 May 2022 19:39:12 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1651631952; cv=none; d=google.com; s=arc-20160816; b=ytblRQwgNsZKlMX7b6LVijVesBiZlxKLSLUOYlvNRYhYCGYF+mJ+zpr5rO/K09cT62 8hRlxYixVAL/tIoncFuvidGvuqvdqAs7Pxnd+vpUb7xhJYQs0bROSgvtKDteEknaTRU3 cwYBS297IKfgdakqKnyuk1aLEwsXrnRdfnZvrAzYrPEHGX20oS90Dmfq7AG2JHjpL6mL fjEWrSoPEi9oR75dSd52h/jhWQ5bq40U//V9llDZxBaUyRg1566oq9lKFxczXNHV5+Iw jX3aGx6kB0GfXOjojIsztHPFhQqqz6NNYXxF6HXOLs2SEH3pASMLw+I+p4Rr4dKbMxv6 KRgg== 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=iARmCzjyoFJTJCzRSM7t1OOd/OUjF2BdY9W6mopSApc=; b=zjponlBAw0XM/lVkYMvaj0oK0d4jHfSKLUlBR5sStdgRrTws7WtEnoJpzh/HA23Pjo 938qi7ImthGOgecVDDzhQmlpEuki3RXtrxZ+ONR6s3U/Ph3ETBDOPromHvPGeE2praSK JeAobJXqWHYXWS2COdBWJbdmiXDwClBPOY5+hkf7RN4+Zrr1xRWaH3XSA0aVBZ+jZQ0H oGrncTCff9l542mlWy2UHmtC4TVl+FsBxybM2hVt2TIjpAzC5g2nJ94D0HVYwdkKbm27 R09fgwoRj/xX4zojnKrJgPtmb7urWFrCASZE+0V/on44twve6FC1ZtGclTQcc8idtmOK 8wOg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=BzZLPCOz; spf=pass (google.com: domain of mptcp+bounces-5075-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.88.99 as permitted sender) smtp.mailfrom="mptcp+bounces-5075-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [139.178.88.99]) by mx.google.com with ESMTPS id s6-20020a170902ea0600b0015d0062ecc6si8879163plg.228.2022.05.03.19.39.12 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Tue, 03 May 2022 19:39:12 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-5075-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.88.99 as permitted sender) client-ip=139.178.88.99; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=BzZLPCOz; spf=pass (google.com: domain of mptcp+bounces-5075-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.88.99 as permitted sender) smtp.mailfrom="mptcp+bounces-5075-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 sv.mirrors.kernel.org (Postfix) with ESMTPS id F2CE92808FD for ; Wed, 4 May 2022 02:39:11 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 2C50120ED; Wed, 4 May 2022 02:39:10 +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 001AE20E8 for ; Wed, 4 May 2022 02:39:08 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1651631948; x=1683167948; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=2BkymHnE1Mt2kivWlHUEWIz6yV1Ia0s1YJXsf02tjIk=; b=BzZLPCOzy5d++RjkYzWI1yPiRDuUSo0a6VUZzMzhYHW+oJH9oiQT7y6M DklVksUrbU4gYYsK1pLRYYg53Tk4Hh6YzmdbtDSDoDH6Hj5tRZbf/a/yR alXXN8evfZer6e5soyAzuYTBZp2wNyoU6Rri0tyzv4THKZ3OaHongjo41 +JynYd2JvLOj+4urI8CbtGGvWFXC0UhUGZxu4yOp+r1aohe/nZJdooMxM 6yM9Rn2ln+m7nPlumHrq7Ixh9MOqx43gfD3XwozdOLMv9TH4BeAVK8UGn GfB9ExS3AvsNTmFbB0xhx4OFnN3KXiXkcmGPN+JVn50qe8wCROX2aVzOZ Q==; X-IronPort-AV: E=McAfee;i="6400,9594,10336"; a="255109475" X-IronPort-AV: E=Sophos;i="5.91,196,1647327600"; d="scan'208";a="255109475" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 May 2022 19:39:08 -0700 X-IronPort-AV: E=Sophos;i="5.91,196,1647327600"; d="scan'208";a="584493397" Received: from mjmartin-desk2.amr.corp.intel.com (HELO mjmartin-desk2.intel.com) ([10.251.20.240]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 May 2022 19:39:08 -0700 From: Mat Martineau To: netdev@vger.kernel.org Cc: Kishen Maloor , davem@davemloft.net, kuba@kernel.org, pabeni@redhat.com, edumazet@google.com, matthieu.baerts@tessares.net, mptcp@lists.linux.dev, Mat Martineau Subject: [PATCH net-next 10/13] selftests: mptcp: support MPTCP_PM_CMD_SUBFLOW_DESTROY Date: Tue, 3 May 2022 19:38:58 -0700 Message-Id: <20220504023901.277012-11-mathew.j.martineau@linux.intel.com> X-Mailer: git-send-email 2.36.0 In-Reply-To: <20220504023901.277012-1-mathew.j.martineau@linux.intel.com> References: <20220504023901.277012-1-mathew.j.martineau@linux.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: Kishen Maloor 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 Acked-by: Paolo Abeni Signed-off-by: Kishen Maloor Signed-off-by: Mat Martineau --- 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 e2437bacd133..8d74fcb04929 100644 --- a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c +++ b/tools/testing/selftests/net/mptcp/pm_nl_ctl.c @@ -30,6 +30,7 @@ static void syntax(char *argv[]) fprintf(stderr, "\tann id token [port ] [dev ]\n"); fprintf(stderr, "\trem id token \n"); fprintf(stderr, "\tcsf lip lid rip rpor= t token \n"); + fprintf(stderr, "\tdsf lip lport rip = rport token \n"); fprintf(stderr, "\tdel []\n"); fprintf(stderr, "\tget \n"); fprintf(stderr, "\tset [] [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)) + @@ -1098,6 +1211,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.36.0 From nobody Fri Mar 29 12:23:26 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:869:b0:4b8:7781:bd2f with SMTP id d41csp239567pis; Tue, 3 May 2022 19:39:16 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwqf6W9gE8XoNfo7DJ0mYdUiO5YPMgcZHV3faOKf+BclWQfN35tShLjo3ZgeFxwc8cr0MNm X-Received: by 2002:a17:902:da85:b0:15e:8e05:6963 with SMTP id j5-20020a170902da8500b0015e8e056963mr18451409plx.94.1651631956150; Tue, 03 May 2022 19:39:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1651631956; cv=none; d=google.com; s=arc-20160816; b=pkV4tcWW7W3CTifyqTfpZSDWt40UpeZRiCda8PB3xVe8yirNXsVTaceyT+FeyV/wz+ DsFY/6bRrkDy+fQ97Xx5MPV2fnFTFR8RC192oLcMZxDYxnBYBmqOUZ7eb+jquNxCI/xh 9oUT+BEONbaAFFj8fRfgVX/hMcTMxiylCCER+i8V7A2RvJz/Zvy/WeNW3Oj8wwkR6nEp Vc+BMYh+fHT13Q/GHqaaCMl8bkW89a83y3WeoYWcnr/nxL2pHI1V2EgwvdslRGuUwzRO 8bGchj5DSxmHka2zk5e3npkfNlpAK7+OMcFxtmxCKXyhtS1Pb4VwO15d2Ey/nLDpeELv 3diQ== 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=5Y/l6vGjIdmEUDF7rCzxeaT7TyETbmamOSOilPqpWvE=; b=CNTQJ0FQ7DxN+3OUu/b37xDiwPBr4HpsdSO5N7G5etxAmP0WicK4lENQtAvWEaH1Sq GSFyrSqe5DLfd/f5Wtj0ZkuALuYq5uaVaxwHKSaNsp+9hRHAYeFgaF1B1LaMx9tYs4v2 xwb9zZ8LRcu/nsQdbbQfmONL93VsC7h/3uUvjCtiv99PIUZFxxzAU0Mmh0Q0dyM/eH0N KQwapAILVbsYe6gHN1KdCDXeRlgJPma24rLy2OC8yrX2i1PU14AzVNHrZTTrYYjCNED1 A0uqtyZaBQPWum3Xo49EPklDAYpDvLlKQYx0noflw9A2K5PeepuM+PQGn92iHlqnOpSZ LF0Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=nklDFGjK; spf=pass (google.com: domain of mptcp+bounces-5078-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.88.99 as permitted sender) smtp.mailfrom="mptcp+bounces-5078-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [139.178.88.99]) by mx.google.com with ESMTPS id t12-20020a65408c000000b003a9f9703091si14193700pgp.338.2022.05.03.19.39.16 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Tue, 03 May 2022 19:39:16 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-5078-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.88.99 as permitted sender) client-ip=139.178.88.99; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=nklDFGjK; spf=pass (google.com: domain of mptcp+bounces-5078-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.88.99 as permitted sender) smtp.mailfrom="mptcp+bounces-5078-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 sv.mirrors.kernel.org (Postfix) with ESMTPS id 7A327280A8C for ; Wed, 4 May 2022 02:39:15 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id AAC2820F2; Wed, 4 May 2022 02:39: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 361FB20E8 for ; Wed, 4 May 2022 02:39: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=1651631950; x=1683167950; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=WJx6/mM/n8l2odAclTKk/cB9A+sCzYiB91++g7gQTLE=; b=nklDFGjKAajBZcX71OjQSIS7+OdagqgTEjMmxfBF6XEVYf7gult8RDuX ZeyKaAAds8HQSIa9qPDfSF+QSBVvBAWs/KQdjvr/JLqM+QEJu8/sz6WPn lsHrHgKhe8MEJEyUMv21omfHC3MPmkWruhVF4Sx+OtZbiNLpfrXRjeUu2 YYZzXyNtzsP1fMw/3pcQ5K1M88wDCdj6WQOddTotktbVN8U2fyyOmbnsr eWxuQS1xg5pNGnmFbkdh0qJjFI82juv/KulgWYJ74Mzi7jKtftTTRtxyi czVl1i0H+dO7PwwugYg491A76FzwIfkSb2gpkEmR0KNibph07+eieY6LP A==; X-IronPort-AV: E=McAfee;i="6400,9594,10336"; a="255109476" X-IronPort-AV: E=Sophos;i="5.91,196,1647327600"; d="scan'208";a="255109476" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 May 2022 19:39:08 -0700 X-IronPort-AV: E=Sophos;i="5.91,196,1647327600"; d="scan'208";a="584493401" Received: from mjmartin-desk2.amr.corp.intel.com (HELO mjmartin-desk2.intel.com) ([10.251.20.240]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 May 2022 19:39:08 -0700 From: Mat Martineau To: netdev@vger.kernel.org Cc: Kishen Maloor , davem@davemloft.net, kuba@kernel.org, pabeni@redhat.com, edumazet@google.com, matthieu.baerts@tessares.net, mptcp@lists.linux.dev, Mat Martineau Subject: [PATCH net-next 11/13] selftests: mptcp: capture netlink events Date: Tue, 3 May 2022 19:38:59 -0700 Message-Id: <20220504023901.277012-12-mathew.j.martineau@linux.intel.com> X-Mailer: git-send-email 2.36.0 In-Reply-To: <20220504023901.277012-1-mathew.j.martineau@linux.intel.com> References: <20220504023901.277012-1-mathew.j.martineau@linux.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: Kishen Maloor 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 address announcements. It is used in self-testing scripts that exercise MPTCP netlink commands to precisely validate those operations by examining the dispatched MPTCP netlink events in response to those commands. Acked-by: Paolo Abeni Signed-off-by: Kishen Maloor Signed-off-by: Mat Martineau --- 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 8d74fcb04929..f881d8548153 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[]) @@ -1192,7 +1338,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); @@ -1201,7 +1349,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); @@ -1225,6 +1373,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.36.0 From nobody Fri Mar 29 12:23:26 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:869:b0:4b8:7781:bd2f with SMTP id d41csp239586pis; Tue, 3 May 2022 19:39:19 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwnfB/QoD0bYeK92geEhoGBxHkYsy04M+Xb7UNtijwp6eEW7XSYv41OB0zfdg14FqC/jRJ7 X-Received: by 2002:a17:906:cc8b:b0:6f3:a107:b21b with SMTP id oq11-20020a170906cc8b00b006f3a107b21bmr18377212ejb.337.1651631958968; Tue, 03 May 2022 19:39:18 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1651631958; cv=none; d=google.com; s=arc-20160816; b=CoRvlC5sQjMAImrYdYcL/lvty9CIezMeMjcggkCJXQ4C7cirCwRAZTiffaqVhOuTAO sv0yMxROq1bXekAUsbP928YrDK3GQyoPXbcnN0RoYifJ4WHH2MzqXeuyYwZrcOG7v20q HS6hW8/7xqrhsfhhEnOPdTcYCxP8zIf/R5jXo1If4nWNecyHb5WroOe/ChAqyfzte1bB B9dHtTpfpBzGjdYlYAYPJNzPVyO9Kb2mHsZHRuLedr5IPoskSNmvrTm/S0B2aNcmVZmA pPNbf+WEwP5hx7VOvYm4RLQEFvRfZRevGvREd4p60YaGqRrISo4ZmiX8m+lL7Vt7bw4s 7JWg== 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=wRezcm6aN2ws60krSBFIlANKxm25tTEj0vwdP/yAIps=; b=CgOgtETIE6TVrM3MUnBUydf5m3nJu6qajdv2JV/rStl39symVP2q2q2oASuA9DhUBn +zmQ1pUIVVEB9U4f1VzIFec2h1oaEGB1N4QFuexxsm2rDe0cJxkpw6Sp0ne04ugynW0I zpORA71MsHS0H/rwsFo3RtC/evARzkXdpFlRBEl4gwtn1Tzu7DFiLJV2hXdFWJefHiHh Gdb4u/mher5KLJu5flqiXXyPOyREk6cAiKgYaw2bWnugH6XK3PToY335ot3N0QVmqfoV WoTeLcNx6hVRNoRYki6OThn/k3k3U4/7aa8YU+RkhXALSsNdLJB0vbsziemiyqY9X+Mw nnAg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b="hnYuClM/"; spf=pass (google.com: domain of mptcp+bounces-5079-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:4040:4f00::1 as permitted sender) smtp.mailfrom="mptcp+bounces-5079-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from da.mirrors.kernel.org (da.mirrors.kernel.org. [2604:1380:4040:4f00::1]) by mx.google.com with ESMTPS id e17-20020a17090724d100b006e86e278dcesi14882402ejn.766.2022.05.03.19.39.18 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Tue, 03 May 2022 19:39:18 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-5079-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:4040:4f00::1 as permitted sender) client-ip=2604:1380:4040:4f00::1; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b="hnYuClM/"; spf=pass (google.com: domain of mptcp+bounces-5079-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:4040:4f00::1 as permitted sender) smtp.mailfrom="mptcp+bounces-5079-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 da.mirrors.kernel.org (Postfix) with ESMTPS id 0CBEA2E09BE for ; Wed, 4 May 2022 02:39:17 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id DC13E20E8; Wed, 4 May 2022 02:39: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 678B820EE for ; Wed, 4 May 2022 02:39: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=1651631950; x=1683167950; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=sW7hf1a4QtQVlP6hNueUerYRWH19zVXDJGN2cz//nbQ=; b=hnYuClM/YS4lS8p+QatkQqotGbeZeY1tQDaPBfLu8lIvoVbE/cQ91F5Z n4uBtSE1UrIveq7fNSvw60hWJ4WrEwZh3M5JuMp8tuZuy0PEVqfxyaMy8 Ck3gX5oWvOqkjQ1HZFZS34Hu8lFuE9mwyfDedTqu2wEBssGgJRdrRTTZC BAgc1Oqmx9yUlx3bYzxddJhFXmfhgv8gR/eQi/Ppu6RJTTXC2l3ew2NOS ctJespZ4sYzqlcb5qSZ0qhpsgtSQCUPUE+ACmRu28tyeCoXV76OKsemoF Gmy6Rb7//haCw6IXDgNrbEt+bX82BO/116XWRHisKDdzYi76U7jJW2nAK Q==; X-IronPort-AV: E=McAfee;i="6400,9594,10336"; a="255109477" X-IronPort-AV: E=Sophos;i="5.91,196,1647327600"; d="scan'208";a="255109477" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 May 2022 19:39:08 -0700 X-IronPort-AV: E=Sophos;i="5.91,196,1647327600"; d="scan'208";a="584493405" Received: from mjmartin-desk2.amr.corp.intel.com (HELO mjmartin-desk2.intel.com) ([10.251.20.240]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 May 2022 19:39:08 -0700 From: Mat Martineau To: netdev@vger.kernel.org Cc: Kishen Maloor , davem@davemloft.net, kuba@kernel.org, pabeni@redhat.com, edumazet@google.com, matthieu.baerts@tessares.net, mptcp@lists.linux.dev, Mat Martineau Subject: [PATCH net-next 12/13] selftests: mptcp: create listeners to receive MPJs Date: Tue, 3 May 2022 19:39:00 -0700 Message-Id: <20220504023901.277012-13-mathew.j.martineau@linux.intel.com> X-Mailer: git-send-email 2.36.0 In-Reply-To: <20220504023901.277012-1-mathew.j.martineau@linux.intel.com> References: <20220504023901.277012-1-mathew.j.martineau@linux.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: Kishen Maloor This change updates the "pm_nl_ctl" testing sample with a "listen" option to bind a MPTCP listening socket to the provided addr+port. This option is exercised in testing subflow initiation scenarios in conjunction with userspace path managers where the MPTCP application does not hold an active listener to accept requests for new subflows. Acked-by: Paolo Abeni Signed-off-by: Kishen Maloor Signed-off-by: Mat Martineau --- tools/testing/selftests/net/mptcp/pm_nl_ctl.c | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c b/tools/testing/= selftests/net/mptcp/pm_nl_ctl.c index f881d8548153..6a2f4b981e1d 100644 --- a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c +++ b/tools/testing/selftests/net/mptcp/pm_nl_ctl.c @@ -25,6 +25,9 @@ #ifndef MPTCP_PM_EVENTS #define MPTCP_PM_EVENTS "mptcp_pm_events" #endif +#ifndef IPPROTO_MPTCP +#define IPPROTO_MPTCP 262 +#endif =20 static void syntax(char *argv[]) { @@ -41,6 +44,7 @@ static void syntax(char *argv[]) fprintf(stderr, "\tdump\n"); fprintf(stderr, "\tlimits [ ]\n"); fprintf(stderr, "\tevents\n"); + fprintf(stderr, "\tlisten \n"); exit(0); } =20 @@ -1219,6 +1223,54 @@ int get_set_limits(int fd, int pm_family, int argc, = char *argv[]) return 0; } =20 +int add_listener(int argc, char *argv[]) +{ + struct sockaddr_storage addr; + struct sockaddr_in6 *a6; + struct sockaddr_in *a4; + u_int16_t family; + int enable =3D 1; + int sock; + int err; + + if (argc < 4) + syntax(argv); + + memset(&addr, 0, sizeof(struct sockaddr_storage)); + a4 =3D (struct sockaddr_in *)&addr; + a6 =3D (struct sockaddr_in6 *)&addr; + + if (inet_pton(AF_INET, argv[2], &a4->sin_addr)) { + family =3D AF_INET; + a4->sin_family =3D family; + a4->sin_port =3D htons(atoi(argv[3])); + } else if (inet_pton(AF_INET6, argv[2], &a6->sin6_addr)) { + family =3D AF_INET6; + a6->sin6_family =3D family; + a6->sin6_port =3D htons(atoi(argv[3])); + } else + error(1, errno, "can't parse ip %s", argv[2]); + + sock =3D socket(family, SOCK_STREAM, IPPROTO_MPTCP); + if (sock < 0) + error(1, errno, "can't create listener sock\n"); + + if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &enable, sizeof(enable))) { + close(sock); + error(1, errno, "can't set SO_REUSEADDR on listener sock\n"); + } + + err =3D bind(sock, (struct sockaddr *)&addr, + ((family =3D=3D AF_INET) ? sizeof(struct sockaddr_in) : + sizeof(struct sockaddr_in6))); + + if (err =3D=3D 0 && listen(sock, 30) =3D=3D 0) + pause(); + + close(sock); + return 0; +} + int set_flags(int fd, int pm_family, int argc, char *argv[]) { char data[NLMSG_ALIGN(sizeof(struct nlmsghdr)) + @@ -1375,6 +1427,8 @@ int main(int argc, char *argv[]) return set_flags(fd, pm_family, argc, argv); else if (!strcmp(argv[1], "events")) return capture_events(fd, events_mcast_grp); + else if (!strcmp(argv[1], "listen")) + return add_listener(argc, argv); =20 fprintf(stderr, "unknown sub-command: %s", argv[1]); syntax(argv); --=20 2.36.0 From nobody Fri Mar 29 12:23:26 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:869:b0:4b8:7781:bd2f with SMTP id d41csp239614pis; Tue, 3 May 2022 19:39:23 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyhwJ5Tx8cr5hbQJKq+45MpsJrikEIUaabNHhSU20lX6XYLX0NrU1lksXfwHva2EkPDeSD2 X-Received: by 2002:a17:90b:224f:b0:1dc:76e9:e963 with SMTP id hk15-20020a17090b224f00b001dc76e9e963mr8119934pjb.16.1651631963028; Tue, 03 May 2022 19:39:23 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1651631963; cv=none; d=google.com; s=arc-20160816; b=sCv2r9KSv2HI08JAitpibaxcsfww0+Or97jeg+qO/FSHi7CDGjTTBfZrzZ47vR+RFv CXILHH26qLAoFuMH+M4HVi1uKY7RO64azL/w4JVB3SYB1ferhux+H0YBlJHMWEvy/Y53 MR05c0rCwK6W873oiQ7GLN4r5/4kNMUyJnFR7TurDC9tbo4u8qS4NG0fqh0p6lohsSW/ NxL7fk61Bb4Zvm26z7cn9lQ+tp2FENr2sz/hNEBdadX5NJfQW3Kx5+Ni1Ntxb7/gm6tB YcNoX0GzV9ggCa1sfcdubcFrMO5vRrFWkYYhQxbL/AIqe3ccLrVmTa9+aisXsMzynDZF cwvg== 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=i0WngRgZiDtyq1aCnUAXa4fTNzDiPGN0rpCUeqWTbM0=; b=vp1OXuzA86ndEOXo7ewaK704xW5o9H8VMdg4FPnak3pNvmvypbFU0lvh11/EuqTOo6 YB+XmkRf0jdAQ5p6qNUoCdKPWwXmkvyTkkxL3iUCT38S/X7hX766MCR0/OK/OB0Bmuu4 nlRhHg97Wi01uiBDSw1/80m/AKqOcBO7hs+3NV4SirH4w++BfkKkT/kuFMQNZgQYNRg6 zsFgB8KBM5916BAN4epYvHAExpGgGMdluOIRSIloY+qu2ImMz/VnJ+PfzyjMcSUrRvip ltw6s1T1bkOT47ZAXwlWUvpLDYVv5hXfZRvTuoefv5429/Wx35LTWyu4SCNOa6ZFg3xk JuDA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=LQJ7vGBD; spf=pass (google.com: domain of mptcp+bounces-5084-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.88.99 as permitted sender) smtp.mailfrom="mptcp+bounces-5084-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from sv.mirrors.kernel.org (sv.mirrors.kernel.org. [139.178.88.99]) by mx.google.com with ESMTPS id q23-20020a656a97000000b003c22771658dsi8116827pgu.482.2022.05.03.19.39.22 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Tue, 03 May 2022 19:39:23 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-5084-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.88.99 as permitted sender) client-ip=139.178.88.99; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=LQJ7vGBD; spf=pass (google.com: domain of mptcp+bounces-5084-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 139.178.88.99 as permitted sender) smtp.mailfrom="mptcp+bounces-5084-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 sv.mirrors.kernel.org (Postfix) with ESMTPS id 8FC56280A96 for ; Wed, 4 May 2022 02:39:22 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id B6D9620F5; Wed, 4 May 2022 02:39: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 AD24E20F3 for ; Wed, 4 May 2022 02:39: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=1651631951; x=1683167951; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=6T5kxpV9gkAgzVeqvrmavOZQo/2/ng+PI1D2I8XBR9Y=; b=LQJ7vGBDRPlINEvnFeLOi7SA1DaHa5diXNBR+YbPeWPOhoy5IpApFbu1 ouJIEc2uTw6JP4Pm+BdFPlczElMsdv38M+2DLxEVEZOdsCc15RJ+hrvfy xxxM1069TcG/pucgfdb3tPn2w+kBNRf8CYYshAsqhZqF4RxeniWXBcFyi K6gZaNFPJx6LDByGvWzekt9J1dUesoDlsmF4SRa4D3mx85rkImws2JdbR y6ipfRn9rc/F3Nu/bD1ldfh3aGx/+qg1BsCyXFg71yI1C6DbCBmw7M0O2 7ocK56naY20xrAd9ZBwmrgDiUGWEyLZCg5i8moqP6YcSSUVsgAeCh/500 A==; X-IronPort-AV: E=McAfee;i="6400,9594,10336"; a="255109478" X-IronPort-AV: E=Sophos;i="5.91,196,1647327600"; d="scan'208";a="255109478" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 May 2022 19:39:08 -0700 X-IronPort-AV: E=Sophos;i="5.91,196,1647327600"; d="scan'208";a="584493408" Received: from mjmartin-desk2.amr.corp.intel.com (HELO mjmartin-desk2.intel.com) ([10.251.20.240]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 May 2022 19:39:08 -0700 From: Mat Martineau To: netdev@vger.kernel.org Cc: Kishen Maloor , davem@davemloft.net, kuba@kernel.org, pabeni@redhat.com, edumazet@google.com, matthieu.baerts@tessares.net, mptcp@lists.linux.dev, Mat Martineau Subject: [PATCH net-next 13/13] selftests: mptcp: functional tests for the userspace PM type Date: Tue, 3 May 2022 19:39:01 -0700 Message-Id: <20220504023901.277012-14-mathew.j.martineau@linux.intel.com> X-Mailer: git-send-email 2.36.0 In-Reply-To: <20220504023901.277012-1-mathew.j.martineau@linux.intel.com> References: <20220504023901.277012-1-mathew.j.martineau@linux.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: Kishen Maloor 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. Acked-by: Paolo Abeni Signed-off-by: Kishen Maloor Signed-off-by: Mat Martineau --- .../selftests/net/mptcp/userspace_pm.sh | 779 ++++++++++++++++++ 1 file changed, 779 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..78d0bb640b11 --- /dev/null +++ b/tools/testing/selftests/net/mptcp/userspace_pm.sh @@ -0,0 +1,779 @@ +#!/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$(stdbuf -o0 -e0 printf %x "$sec")-$(mktemp -u XXXXXX) +ns1=3D"ns1-$rndh" +ns2=3D"ns2-$rndh" + +cleanup() +{ + echo "cleanup" + + rm -rf $file + + # Terminate the MPTCP connection and related processes + if [ $client4_pid -ne 0 ]; then + kill -SIGUSR1 $client4_pid > /dev/null 2>&1 + fi + if [ $server4_pid -ne 0 ]; then + kill $server4_pid > /dev/null 2>&1 + fi + if [ $client6_pid -ne 0 ]; then + kill -SIGUSR1 $client6_pid > /dev/null 2>&1 + fi + if [ $server6_pid -ne 0 ]; then + kill $server6_pid > /dev/null 2>&1 + fi + if [ $evts_pid -ne 0 ]; then + kill $evts_pid > /dev/null 2>&1 + fi + 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 + +stdbuf -o0 -e0 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 ksize=3D1 + + dd if=3D/dev/urandom of=3D"$name" bs=3D2 count=3D$ksize 2> /dev/null + echo -e "\nMPTCP_TEST_FILE_END_MARKER" >> "$name" +} + +make_connection() +{ + local file + 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 + 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 + 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.5 + + # Run the server + ip netns exec "$ns1" \ + ./mptcp_connect -s MPTCP -w 300 -p $app_port -l $listen_addr > /dev/nu= ll 2>&1 & + local server_pid=3D$! + sleep 0.5 + + # 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 1 + + # Capture client/server attributes from MPTCP connection netlink events + kill $client_evts_pid + + local client_token + local client_port + local client_serverside + local server_token + local server_serverside + + client_token=3D$(sed --unbuffered -n 's/.*\(token:\)\([[:digit:]]*\).*$/\= 2/p;q' "$client_evts") + client_port=3D$(sed --unbuffered -n 's/.*\(sport:\)\([[:digit:]]*\).*$/\2= /p;q' "$client_evts") + client_serverside=3D$(sed --unbuffered -n 's/.*\(server_side:\)\([[:digit= :]]*\).*$/\2/p;q'\ + "$client_evts") + kill $server_evts_pid + server_token=3D$(sed --unbuffered -n 's/.*\(token:\)\([[:digit:]]*\).*$/\= 2/p;q' "$server_evts") + server_serverside=3D$(sed --unbuffered -n 's/.*\(server_side:\)\([[:digit= :]]*\).*$/\2/p;q'\ + "$server_evts") + rm -f "$client_evts" "$server_evts" "$file" + + if [ "$client_token" !=3D "" ] && [ "$server_token" !=3D "" ] && [ "$clie= nt_serverside" =3D 0 ] && + [ "$server_serverside" =3D 1 ] + then + stdbuf -o0 -e0 printf "Established IP%s MPTCP Connection ns2 =3D> ns1 = \t\t[OK]\n" $is_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 + local token + local addr + local dport + local id + + type=3D$(sed --unbuffered -n 's/.*\(type:\)\([[:digit:]]*\).*$/\2/p;q' "$= evt") + token=3D$(sed --unbuffered -n 's/.*\(token:\)\([[:digit:]]*\).*$/\2/p;q' = "$evt") + if [ "$e_af" =3D "v6" ] + then + addr=3D$(sed --unbuffered -n 's/.*\(daddr6:\)\([0-9a-f:.]*\).*$/\2/p;q' = "$evt") + else + addr=3D$(sed --unbuffered -n 's/.*\(daddr4:\)\([0-9.]*\).*$/\2/p;q' "$ev= t") + fi + dport=3D$(sed --unbuffered -n 's/.*\(dport:\)\([[:digit:]]*\).*$/\2/p;q' = "$evt") + id=3D$(sed --unbuffered -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 + stdbuf -o0 -e0 printf "[OK]\n" + return 0 + fi + stdbuf -o0 -e0 printf "[FAIL]\n" + exit 1 +} + +test_announce() +{ + local evts + 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.5 + + # 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 > /dev/null 2>&1 + + local type + type=3D$(sed --unbuffered -n 's/.*\(type:\)\([[:digit:]]*\).*$/\2/p;q' "$= evts") + stdbuf -o0 -e0 printf "ADD_ADDR 10.0.2.2 (ns2) =3D> ns1, invalid token = \t\t" + if [ "$type" =3D "" ] + then + stdbuf -o0 -e0 printf "[OK]\n" + else + stdbuf -o0 -e0 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 > /dev/null 2>&1 + stdbuf -o0 -e0 printf "ADD_ADDR id:%d 10.0.2.2 (ns2) =3D> ns1, reuse port= \t\t" $client_addr_id + sleep 0.5 + 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 >= /dev/null 2>&1 + stdbuf -o0 -e0 printf "ADD_ADDR6 id:%d dead:beef:2::2 (ns2) =3D> ns1, reu= se port\t\t" $client_addr_id + sleep 0.5 + 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 > /dev/null 2>&1 + stdbuf -o0 -e0 printf "ADD_ADDR id:%d 10.0.2.2 (ns2) =3D> ns1, new port \= t\t\t" $client_addr_id + sleep 0.5 + 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.5 + + # 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 > /dev/null 2>&1 + stdbuf -o0 -e0 printf "ADD_ADDR id:%d 10.0.2.1 (ns1) =3D> ns2, reuse port= \t\t" $server_addr_id + sleep 0.5 + 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 > /dev/null 2>&1 + stdbuf -o0 -e0 printf "ADD_ADDR6 id:%d dead:beef:2::1 (ns1) =3D> ns2, reu= se port\t\t" $server_addr_id + sleep 0.5 + 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 > /dev/null 2>&1 + stdbuf -o0 -e0 printf "ADD_ADDR id:%d 10.0.2.1 (ns1) =3D> ns2, new port \= t\t\t" $server_addr_id + sleep 0.5 + 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 + local token + local id + + type=3D$(sed --unbuffered -n 's/.*\(type:\)\([[:digit:]]*\).*$/\2/p;q' "$= evt") + token=3D$(sed --unbuffered -n 's/.*\(token:\)\([[:digit:]]*\).*$/\2/p;q' = "$evt") + id=3D$(sed --unbuffered -n 's/.*\(rem_id:\)\([[:digit:]]*\).*$/\2/p;q' "$= evt") + if [ "$type" =3D "$e_type" ] && [ "$token" =3D "$e_token" ] && + [ "$id" =3D "$e_id" ] + then + stdbuf -o0 -e0 printf "[OK]\n" + return 0 + fi + stdbuf -o0 -e0 printf "[FAIL]\n" + exit 1 +} + +test_remove() +{ + local evts + 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.5 + + # 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 > /dev/null 2>&1 + stdbuf -o0 -e0 printf "RM_ADDR id:%d ns2 =3D> ns1, invalid token = \t"\ + $client_addr_id + local type + type=3D$(sed --unbuffered -n 's/.*\(type:\)\([[:digit:]]*\).*$/\2/p;q' "$= evts") + if [ "$type" =3D "" ] + then + stdbuf -o0 -e0 printf "[OK]\n" + else + stdbuf -o0 -e0 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 > /dev/null 2>&1 + stdbuf -o0 -e0 printf "RM_ADDR id:%d ns2 =3D> ns1, invalid id = \t"\ + $invalid_id + type=3D$(sed --unbuffered -n 's/.*\(type:\)\([[:digit:]]*\).*$/\2/p;q' "$= evts") + if [ "$type" =3D "" ] + then + stdbuf -o0 -e0 printf "[OK]\n" + else + stdbuf -o0 -e0 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 > /dev/null 2>&1 + stdbuf -o0 -e0 printf "RM_ADDR id:%d ns2 =3D> ns1 = \t"\ + $client_addr_id + sleep 0.5 + 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 > /dev/null 2>&1 + stdbuf -o0 -e0 printf "RM_ADDR id:%d ns2 =3D> ns1 = \t"\ + $client_addr_id + sleep 0.5 + 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 > /dev/null 2>&1 + stdbuf -o0 -e0 printf "RM_ADDR6 id:%d ns2 =3D> ns1 = \t"\ + $client_addr_id + sleep 0.5 + 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.5 + + # RM_ADDR from the server to client machine + ip netns exec "$ns1" ./pm_nl_ctl rem token "$server4_token" id\ + $server_addr_id > /dev/null 2>&1 + stdbuf -o0 -e0 printf "RM_ADDR id:%d ns1 =3D> ns2 = \t"\ + $server_addr_id + sleep 0.5 + 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 > /dev/null 2>&1 + stdbuf -o0 -e0 printf "RM_ADDR id:%d ns1 =3D> ns2 = \t" $server_addr_id + sleep 0.5 + 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 > /dev/null 2>&1 + stdbuf -o0 -e0 printf "RM_ADDR6 id:%d ns1 =3D> ns2 = \t" $server_addr_id + sleep 0.5 + 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 + local type + local token + local family + local saddr + local daddr + local dport + local locid + local remid + + if [ "$e_type" =3D "$SUB_ESTABLISHED" ] + then + if [ "$e_family" =3D "$AF_INET6" ] + then + stdbuf -o0 -e0 printf "CREATE_SUBFLOW6 %s (%s) =3D> %s (%s) "\ + "$e_saddr" "$e_from" "$e_daddr" "$e_to" + else + stdbuf -o0 -e0 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 + stdbuf -o0 -e0 printf "DESTROY_SUBFLOW6 %s (%s) =3D> %s (%s) "\ + "$e_saddr" "$e_from" "$e_daddr" "$e_to" + else + stdbuf -o0 -e0 printf "DESTROY_SUBFLOW %s (%s) =3D> %s (%s) \t"\ + "$e_saddr" "$e_from" "$e_daddr" "$e_to" + fi + fi + + type=3D$(sed --unbuffered -n 's/.*\(type:\)\([[:digit:]]*\).*$/\2/p;q' "$= evt") + token=3D$(sed --unbuffered -n 's/.*\(token:\)\([[:digit:]]*\).*$/\2/p;q' = "$evt") + family=3D$(sed --unbuffered -n 's/.*\(family:\)\([[:digit:]]*\).*$/\2/p;q= ' "$evt") + dport=3D$(sed --unbuffered -n 's/.*\(dport:\)\([[:digit:]]*\).*$/\2/p;q' = "$evt") + locid=3D$(sed --unbuffered -n 's/.*\(loc_id:\)\([[:digit:]]*\).*$/\2/p;q'= "$evt") + remid=3D$(sed --unbuffered -n 's/.*\(rem_id:\)\([[:digit:]]*\).*$/\2/p;q'= "$evt") + if [ "$family" =3D "$AF_INET6" ] + then + saddr=3D$(sed --unbuffered -n 's/.*\(saddr6:\)\([0-9a-f:.]*\).*$/\2/p;q'= "$evt") + daddr=3D$(sed --unbuffered -n 's/.*\(daddr6:\)\([0-9a-f:.]*\).*$/\2/p;q'= "$evt") + else + saddr=3D$(sed --unbuffered -n 's/.*\(saddr4:\)\([0-9.]*\).*$/\2/p;q' "$e= vt") + daddr=3D$(sed --unbuffered -n 's/.*\(daddr4:\)\([0-9.]*\).*$/\2/p;q' "$e= vt") + 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 + stdbuf -o0 -e0 printf "[OK]\n" + return 0 + fi + stdbuf -o0 -e0 printf "[FAIL]\n" + exit 1 +} + +test_subflows() +{ + local evts + 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.5 + + # Attempt to add a listener at 10.0.2.2: + ip netns exec "$ns2" ./pm_nl_ctl listen 10.0.2.2\ + "$client4_port" > /dev/null 2>&1 & + local listener_pid=3D$! + + # 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 > /dev/null 2>&1 + sleep 0.5 + + # 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" > /dev/null 2>&1 + sleep 0.5 + 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" + + # Delete the listener from the client ns, if one was created + kill $listener_pid > /dev/null 2>&1 + + local sport + sport=3D$(sed --unbuffered -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" > /dev/null 2>&1 + sleep 0.5 + 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_token" > /dev/null 2>&1 + sleep 0.5 + + # Attempt to add a listener at dead:beef:2::2: + ip netns exec "$ns2" ./pm_nl_ctl listen dead:beef:2::2\ + "$client6_port" > /dev/null 2>&1 & + listener_pid=3D$! + + # 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 > /dev/null 2>&1 + sleep 0.5 + + # 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" > /dev/nul= l 2>&1 + sleep 0.5 + 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" + + # Delete the listener from the client ns, if one was created + kill $listener_pid > /dev/null 2>&1 + + sport=3D$(sed --unbuffered -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" ri= p\ + dead:beef:2::2 rport "$client6_port" token "$server6_token" > /dev/nul= l 2>&1 + sleep 0.5 + 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_token" > /dev/null 2>&1 + sleep 0.5 + + # Attempt to add a listener at 10.0.2.2: + ip netns exec "$ns2" ./pm_nl_ctl listen 10.0.2.2\ + $new4_port > /dev/null 2>&1 & + listener_pid=3D$! + + # 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 > /dev/null 2>&1 + sleep 0.5 + + # 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 rpo= rt\ + $new4_port token "$server4_token" > /dev/null 2>&1 + sleep 0.5 + 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" + + # Delete the listener from the client ns, if one was created + kill $listener_pid > /dev/null 2>&1 + + sport=3D$(sed --unbuffered -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" > /dev/null 2>&1 + sleep 0.5 + 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" > /dev/null 2>&1 + + 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.5 + + # Attempt to add a listener at 10.0.2.1: + ip netns exec "$ns1" ./pm_nl_ctl listen 10.0.2.1\ + $app4_port > /dev/null 2>&1 & + listener_pid=3D$! + + # 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 > /dev/null 2>&1 + sleep 0.5 + + # 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 rpo= rt\ + $app4_port token "$client4_token" > /dev/null 2>&1 + sleep 0.5 + 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" + + # Delete the listener from the server ns, if one was created + kill $listener_pid> /dev/null 2>&1 + + sport=3D$(sed --unbuffered -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" > /dev/null 2>&1 + sleep 0.5 + 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_token" > /dev/null 2>&1 + sleep 0.5 + + # Attempt to add a listener at dead:beef:2::1: + ip netns exec "$ns1" ./pm_nl_ctl listen dead:beef:2::1\ + $app6_port > /dev/null 2>&1 & + listener_pid=3D$! + + # 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 > /dev/null 2>&1 + sleep 0.5 + + # 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" > /dev/null 2>&1 + sleep 0.5 + verify_subflow_events "$evts" "$SUB_ESTABLISHED" "$client6_token"\ + "$AF_INET6" "dead:beef:2::2"\ + "dead:beef:2::1" "$app6_port" "23"\ + "$server_addr_id" "ns2" "ns1" + + # Delete the listener from the server ns, if one was created + kill $listener_pid > /dev/null 2>&1 + + sport=3D$(sed --unbuffered -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" ri= p\ + dead:beef:2::1 rport $app6_port token "$client6_token" > /dev/null 2>&1 + sleep 0.5 + 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_token" > /dev/null 2>&1 + sleep 0.5 + + # Attempt to add a listener at 10.0.2.1: + ip netns exec "$ns1" ./pm_nl_ctl listen 10.0.2.1\ + $new4_port > /dev/null 2>&1 & + listener_pid=3D$! + + # ADD_ADDR from server to client 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 > /dev/null 2>&1 + sleep 0.5 + + # 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 rpo= rt\ + $new4_port token "$client4_token" > /dev/null 2>&1 + sleep 0.5 + 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" + + # Delete the listener from the server ns, if one was created + kill $listener_pid > /dev/null 2>&1 + + sport=3D$(sed --unbuffered -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" > /dev/null 2>&1 + sleep 0.5 + 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_token" > /dev/null 2>&1 + + kill $evts_pid + rm -f "$evts" +} + +make_connection +make_connection "v6" +test_announce +test_remove +test_subflows + +exit 0 --=20 2.36.0