From nobody Wed May 8 20:34:35 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:1788:b0:4ac:5e5b:1ad1 with SMTP id y8csp475062piq; Thu, 7 Apr 2022 16:40:42 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxQTXmsPdu3Acd/rL+tg7jL7dbvcBkyjc4FFYpvAnKl5VaeIZ6vJLY4V1TJr256od4Z8gln X-Received: by 2002:a17:902:a70a:b0:157:831:fb46 with SMTP id w10-20020a170902a70a00b001570831fb46mr5464256plq.49.1649374841916; Thu, 07 Apr 2022 16:40:41 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1649374841; cv=none; d=google.com; s=arc-20160816; b=FxKHoU0TraSvdCEvYScKEL7xZwg22KLjd6TnEonMySGU47rwK5ZXt23XCGP8hB+XbW KjLWO86aoEPeulguDW2gxnuY+BS+dAfFNWNgoG3R497ZlnQZinb8zPcZLB0fBxSXoua+ lj7q3SoqXcdjS1Mj6F7AGOfH6Rz1VV0cJo679fKN4cgLpGQTvjs40rU92gepn+rWE6L5 +Ud9tW8NyKdrmE1MXIXgpeLqDN156CLLgcTurKC0/FKE4/7vMykcsFvZ6W8zoduc8CFT NnkRunU1Bpl0kwWZFFH1vCcoStgdsH57jU28hcErWOosCdKED0LyUJlRD5Qkk1wLqaUK +32g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:to:from:dkim-signature; bh=hHu0eZL8esBbr2Tbv/3xJeIDB24jR0afNwWAg9Lyxo0=; b=z0hmPyqHzQbKsDgh9sfSOSACYRKTsYTpW8hxp89/HjbP1nWMHApj6bupNGEIrW9Mkq kPkoPWi1ZYf+1jrtRiks5AhNdgcmnz2Fy+p9X3WTmmcld3HFEI/tfadFgMiPJ2kKYwu/ MNAm+mMovED1sFI3WBLxFsx6P8n6f/be7Q5OMvOZ3sMQIS3yZCudf6v3xOikLO+S2qxX Kia06eDdTZCEA0Wgucl2wBWLSWgHmubABR2RJt94YlcfG5TpHP+nsuYDTD+1siU1NzW9 xN+e5Yb3TD+m8Iwbz6Xk13gxtJf4wQbnRbx/N+t/zDqV/m7WIjIr2l16S66WmHoGPcW6 7Z3Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=ZPiumsIi; spf=pass (google.com: domain of mptcp+bounces-4652-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-4652-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from sjc.edge.kernel.org (sjc.edge.kernel.org. [147.75.69.165]) by mx.google.com with ESMTPS id z15-20020a056a001d8f00b004faa233cdf6si19359499pfw.148.2022.04.07.16.40.41 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 07 Apr 2022 16:40:41 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-4652-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) client-ip=147.75.69.165; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=ZPiumsIi; spf=pass (google.com: domain of mptcp+bounces-4652-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-4652-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sjc.edge.kernel.org (Postfix) with ESMTPS id 4E5F23E0F55 for ; Thu, 7 Apr 2022 23:40:41 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 9ECDF3D79; Thu, 7 Apr 2022 23:40:39 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) (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 ADAC23D75 for ; Thu, 7 Apr 2022 23:40:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1649374837; x=1680910837; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=sKHGYS4wSoiHYtJWAVjOUe7mFJkoa0zCDSkyK1QyfBM=; b=ZPiumsIi/s+U+LAoXkjFEnaDtELydxkTX4jy7wbJpMVrPvBOXO8kbg0u BpIPc3RIg7N2BEVLiZ0OgLsCr7nJEbtFub++WTOF+LZIYex11cPHyztpv TrUPS85xOzinbM2xbgITKuj3UBqUmXZNhW87PRYqFYwDek3WRjPHZL+cQ +3BRkZ7KTj8Iqj5fByCf8mxvR21yihFbbudp+Pp0LhUVgFfzNBlEvUkpS HZSSk4591kZR6Np/cIv6VMxFk4dcJxZAB8oibBk5FZn24hpi7+1DyRNXY qr/NLbsxWjthrfk1xSA5xLlkYC9TJmJ1QCiwMgmJhqdyF9uzTO5yZrskK A==; X-IronPort-AV: E=McAfee;i="6400,9594,10310"; a="259062008" X-IronPort-AV: E=Sophos;i="5.90,242,1643702400"; d="scan'208";a="259062008" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 Apr 2022 16:40:36 -0700 X-IronPort-AV: E=Sophos;i="5.90,242,1643702400"; d="scan'208";a="571270938" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 Apr 2022 16:40:35 -0700 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v8 01/14] mptcp: allow ADD_ADDR reissuance by userspace PMs Date: Thu, 7 Apr 2022 19:40:16 -0400 Message-Id: <20220407234029.1774481-2-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220407234029.1774481-1-kishen.maloor@intel.com> References: <20220407234029.1774481-1-kishen.maloor@intel.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This change allows userspace PM implementations to reissue ADD_ADDR announcements (if necessary) based on their chosen policy. Signed-off-by: Kishen Maloor Reviewed-by: Mat Martineau --- net/mptcp/pm_netlink.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index a4430c576ce9..98b205c2c101 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -369,8 +369,16 @@ static bool mptcp_pm_alloc_anno_list(struct mptcp_sock= *msk, =20 lockdep_assert_held(&msk->pm.lock); =20 - if (mptcp_lookup_anno_list_by_saddr(msk, &entry->addr)) - return false; + add_entry =3D mptcp_lookup_anno_list_by_saddr(msk, &entry->addr); + + if (add_entry) { + if (mptcp_pm_is_kernel(msk)) + return false; + + sk_reset_timer(sk, &add_entry->add_timer, + jiffies + mptcp_get_add_addr_timeout(net)); + return true; + } =20 add_entry =3D kmalloc(sizeof(*add_entry), GFP_ATOMIC); if (!add_entry) --=20 2.31.1 From nobody Wed May 8 20:34:35 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:1788:b0:4ac:5e5b:1ad1 with SMTP id y8csp475069piq; Thu, 7 Apr 2022 16:40:42 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzE7TljAI8otl0RpmMmIGQBl7hQhofbpTglmVqaHbRXtkNcSAGL/JfskobNGQ7v0G4CnoWG X-Received: by 2002:a05:6a00:1946:b0:4fe:309f:d612 with SMTP id s6-20020a056a00194600b004fe309fd612mr16991433pfk.10.1649374842663; Thu, 07 Apr 2022 16:40:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1649374842; cv=none; d=google.com; s=arc-20160816; b=nwcE+uCH04BE+eywnon/zLR9PErDnvSZoD+KpqzQlWHL61KOhznIdS8yEOTgaSMMNP 7z7+NEIxttSxTgIW5FDNB+U9jTv1MRobeWPkkjw8y+Ptb3ikOXZsj2mn7ZGprjI1rCtt BQN3p1bbuGjp23i4cGorjxWb7lY4MJJ2RnV7tQr3wqYfTFktDkCNxR05EHb1RSf4tp3k KufEPFmmPsr6Dhmtz27YkzXsGmExXVM59E+unz/0RY8sVqs3q31XfNQSy3BSy/IjpGjk w5Mcn5d101wbgg4Zw1Qz/orCAYMUGpNkv8LTVsj1tApqp3zPMlDJIwS1h+2Ii79f43MG JxSw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:to:from:dkim-signature; bh=G9VO18t07J/EL7WTip9KGjEz/7ogFOfvLXqcEA5ewos=; b=Er2cOwJKcQL3nPWfvuQyCSoUmeBc373U4uppDg+oUCQi3HHnhxzXeYUM1j+CH8VhUK 1JcQlG3h0LPBC09rgXSjdHgaYu4okRIDneT06YfMkTS4t4CkTQ9ENgprbXhDWbY8jcT5 mS1nOMI7PKVluJeAKmw14/Gxy0jpQf7Y7VFKMcOjrO998moAxlGioJReiIMlrqkSTEWt KpvOA1qe6cXF2dCNguAG48xqfxah6UU6zqkXyX8XPET2p1iXwtky4ki4v1dI4Gbwegcf AOgpZXoaSrOSpqAq+8yI0NTvpYjtsAQ/IC9mqHx8TZOJPs3hitc1RMLSN57U9wKmKbYz /kOw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=lw2zOsfW; spf=pass (google.com: domain of mptcp+bounces-4653-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-4653-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from sjc.edge.kernel.org (sjc.edge.kernel.org. [147.75.69.165]) by mx.google.com with ESMTPS id a1-20020a656401000000b003816043ee32si20067009pgv.39.2022.04.07.16.40.42 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 07 Apr 2022 16:40:42 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-4653-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) client-ip=147.75.69.165; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=lw2zOsfW; spf=pass (google.com: domain of mptcp+bounces-4653-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-4653-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sjc.edge.kernel.org (Postfix) with ESMTPS id 6FDAC3E0F52 for ; Thu, 7 Apr 2022 23:40:42 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id E28813D7B; Thu, 7 Apr 2022 23:40:39 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) (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 1A9883D77 for ; Thu, 7 Apr 2022 23:40:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1649374838; x=1680910838; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=lHYmzC0QosL9S+s+n7LoGDxHz6NQ05t2eXXemjOqBeY=; b=lw2zOsfWsEVB0fem7a6wqBDkFcQMATboQFf9afk0pOvf03sfhfjYX507 lZT6MWGbUFvpSLwwAKEeVeWXsGlD3phxA45EQ9Z+CQl1UOERHJf7V7bXF 75T1qgOBWZXq32sGYcfhhd38DoaCdAtlS0CU1sYz3gDi+trgTD31SqUXl eFLRqVOaan5cqEeC/2AUebO9U427klDQOe4KG2SZDdSTe64SUImRw6OFj DcKfTsd2YQ7sQ8fIk1kjdWHgDwdnPxRTCbY9rxrAfJVc8CpWCKazn4K++ DlEcALX9sxH/J2giMIny7VKq8srCRs/741YZPNXLJuNBEQPVKnt6IKi5R g==; X-IronPort-AV: E=McAfee;i="6400,9594,10310"; a="259062011" X-IronPort-AV: E=Sophos;i="5.90,242,1643702400"; d="scan'208";a="259062011" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 Apr 2022 16:40:36 -0700 X-IronPort-AV: E=Sophos;i="5.90,242,1643702400"; d="scan'208";a="571270941" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 Apr 2022 16:40:35 -0700 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v8 02/14] mptcp: handle local addrs announced by userspace PMs Date: Thu, 7 Apr 2022 19:40:17 -0400 Message-Id: <20220407234029.1774481-3-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220407234029.1774481-1-kishen.maloor@intel.com> References: <20220407234029.1774481-1-kishen.maloor@intel.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This change adds 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. Signed-off-by: Kishen Maloor Reviewed-by: Mat Martineau --- v6: -Move local_addr_list into struct mptcp_pm_data. -Replace mptcp_data_lock() with the pm spinlock. -Move mptcp_userspace_pm_append_new_local_addr() and mptcp_free_local_addr_list() into a new pm_userspace.c. -Make addresses_equal() helper non-static and rename to mptcp_addresses_equal(). v8: -Add copyright notice to pm_userspace.c. --- net/mptcp/Makefile | 2 +- net/mptcp/pm.c | 1 + net/mptcp/pm_netlink.c | 34 +++++++++--------- net/mptcp/pm_userspace.c | 78 ++++++++++++++++++++++++++++++++++++++++ net/mptcp/protocol.c | 1 + net/mptcp/protocol.h | 7 ++++ 6 files changed, 105 insertions(+), 18 deletions(-) create mode 100644 net/mptcp/pm_userspace.c diff --git a/net/mptcp/Makefile b/net/mptcp/Makefile index 168c55d1c917..4004347db47e 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..92d47e8e8983 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -66,8 +66,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 +131,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 +149,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 +269,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 +286,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 +421,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 +457,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 +490,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 +505,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 +739,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 +909,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 +1038,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 +1416,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 b2c654992de0..b016822f44dc 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -3103,6 +3103,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..40dabf9462a8 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 @@ -601,6 +602,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 +783,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.31.1 From nobody Wed May 8 20:34:35 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:1788:b0:4ac:5e5b:1ad1 with SMTP id y8csp475098piq; Thu, 7 Apr 2022 16:40:46 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyFdSjwgFt6QCayDLgS1+LB7WpUC3m8rw5IGyypsl+E/uRmSYbUrk7cgYHeL6xZRLazalfx X-Received: by 2002:a63:af06:0:b0:378:3582:a49f with SMTP id w6-20020a63af06000000b003783582a49fmr13258575pge.125.1649374845994; Thu, 07 Apr 2022 16:40:45 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1649374845; cv=none; d=google.com; s=arc-20160816; b=mzZLItcwvbtfaQ8sKddjgnKzo3gto/tJ/+v+YBcGe9VBz8hdaM0rubK+q4N/TX0sbm iT8Wm+e7a7bdLVNkjxB/oKf+5JBpQs8YubUsn4bTVrcswUYLaioZDcwbSPJsPOCL2osu FdD/fa/My/mqHXiEx0+GYTnQoAKD3KePFRx6vaPrqqtvgZNIs/LtXEqUqpJWLX5JVqZU r/7Q5luRy48tzuf5h9C+u5rsXPi72i1+d4hvhmhmZIzpQbJUGqG5g2iaIew1osQUeHDd SjeuKgEdw3WcH5UMPwLJlVwE1Qq5uYRYNwLCjamJqWfxr291SAzXtg0iN9vhhM0xpqVh YHOA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:to:from:dkim-signature; bh=29eW/2YxdHA+k8xEut6bX7hPcEDyC1dZJ2h92557aqo=; b=0zal4310jWit40b0bJz0Jdy0f6V7zyHYagymwC9dahq5uyMoUlsTz48BI2fKTBphy+ IrFxo7vQcNSbuLCcI44f+WBV88Z7LvvJ0CWTDlnp5UumUAAxi2eg172RPuGq6lWvCy3l 7CrxjREvq4tAY1Sb4OkuheB98X43HgL6OhGeLZHHS/jHSUlhQlbd+DFlL/oAJVGixIqM WJpAyFPn3SKFxweGLfb712C7pB4tj9995n0V/CzcNWxFb696/MoLHdJSdpRKC2+4f5kM fUtTlDjYFBLmRiS16mRcDCSP+uSRDA1AsR1RPjRP3edX6Ef1kC0gBw/niviTmR+M/ORh GXFw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=AWfG+pe3; spf=pass (google.com: domain of mptcp+bounces-4655-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-4655-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from sjc.edge.kernel.org (sjc.edge.kernel.org. [2604:1380:1000:8100::1]) by mx.google.com with ESMTPS id lx11-20020a17090b4b0b00b001ca14079c7fsi3405729pjb.70.2022.04.07.16.40.45 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 07 Apr 2022 16:40:45 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-4655-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) client-ip=2604:1380:1000:8100::1; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=AWfG+pe3; spf=pass (google.com: domain of mptcp+bounces-4655-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-4655-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sjc.edge.kernel.org (Postfix) with ESMTPS id 100ED3E0F79 for ; Thu, 7 Apr 2022 23:40:45 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 2D2F13D73; Thu, 7 Apr 2022 23:40:41 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) (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 A8E833D75 for ; Thu, 7 Apr 2022 23:40:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1649374839; x=1680910839; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=cU4mDnfUAvkiTsCreg+MNcMQDY9hjXXA42yZUnVxXGw=; b=AWfG+pe3UF8fL+ZmZ7j97LQ2tEnQc+ELSxvWbtnlbPTWnRb67hYbnWlH Fy3c3czVAP2biznwL6u0fjQcVioI8F+aN6OlPVZoPRGxPFs27W4ElEDp1 yHJu+J+esFWHipi4QZCjvWwu40bFoMUdlfHGzh4sSsDwopMVceyaOVzb4 hKdIQROvd+LSx2hT4u+T2iU3Zn8OCbGseORMbqhQH9ajQpYJoalAnKY9k P/hvwQ+LdijQIJ/Fk+KowJKgLate3/hswQ8DtNMRsjLPr4EsOnDcWlMox yRoSPxjKv4vI1YUVUeL9m4C4Jp6tgGWmR+iqgpqvIfuVdfyql7zlBFy7y Q==; X-IronPort-AV: E=McAfee;i="6400,9594,10310"; a="259062013" X-IronPort-AV: E=Sophos;i="5.90,242,1643702400"; d="scan'208";a="259062013" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 Apr 2022 16:40:36 -0700 X-IronPort-AV: E=Sophos;i="5.90,242,1643702400"; d="scan'208";a="571270944" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 Apr 2022 16:40:35 -0700 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v8 03/14] mptcp: read attributes of addr entries managed by userspace PMs Date: Thu, 7 Apr 2022 19:40:18 -0400 Message-Id: <20220407234029.1774481-4-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220407234029.1774481-1-kishen.maloor@intel.com> References: <20220407234029.1774481-1-kishen.maloor@intel.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This change introduces a parallel path in the kernel for retrieving the local id, flags, if_index for an addr entry in the context of an MPTCP connection that's being managed by a userspace PM. The userspace and in-kernel PM modes deviate in their procedures for obtaining this information. Signed-off-by: Kishen Maloor Reviewed-by: Mat Martineau --- v7: -Move userspace PM specific handling into mptcp_userspace_pm_get_local_id() and mptcp_userspace_pm_get_flags_and_ifindex_by_id(). --- 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 92d47e8e8983..ceb1c310d0c6 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -1041,6 +1041,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(); @@ -1305,15 +1308,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 40dabf9462a8..a6ee811e5d02 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -775,8 +775,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, @@ -854,6 +858,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.31.1 From nobody Wed May 8 20:34:35 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:1788:b0:4ac:5e5b:1ad1 with SMTP id y8csp475119piq; Thu, 7 Apr 2022 16:40:49 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz+/jN2v/8h4Mvtx1DHUWbj4XhnLmhWp4di1PRWl+uypfjO7IKkpxUsNoNWV2ZSjzcWvjOi X-Received: by 2002:a17:902:7006:b0:156:3cbe:6b04 with SMTP id y6-20020a170902700600b001563cbe6b04mr16075188plk.68.1649374849341; Thu, 07 Apr 2022 16:40:49 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1649374849; cv=none; d=google.com; s=arc-20160816; b=P8rqgTW9ygtBrb4zB6vm0zV596Bj3cZh5iKcMNPoOZoyOIBMUvXYHluespES+/tmID R60GBPE5kMvlHKJwUn1vrtDSA+4IYlJnASwta3Yl089DwRuNcDQ4kds6ZTIZOMAH59Ym XM2rfzkqqqVIPgPbFC4w9ARKLEYFxAUFYYTjEOxUvGArP2fVjLuH3Aec5Mob2TXxaixe oYlDQtaHecWSndjxdYkbpLHqHcRXzxcX6BvJactNF2fxiI9Y1qwXwGY87+BDibQ3VqTB MY++T3wVK391X9d/gmdtg6iJ7DF47RKM1x/hPtyfHtZL4b9rwq3L6GsXeiCrupjmYxDJ 9e6A== 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=iE5GasUvIy2jGMATCwJLRXmWe0vMs8GyLiS7V8GCuu8=; b=BuzjsHu9+nTDeikwYuzmqtblUg4IrsjJkYZ3bGF7RBfF/KHpb9G+BGHzkt/6vcI8RW N6HBwFi4vsLIPXhg0yZRCt+L/v+GiarAbvVU01zrZHbWU+J5nBJVWTI9pWSKhtE7ML0s rI3MOgEpOKNUv9sbif667S0+QE4rXY4WSJhF3ZnbQU74sI8cfjnHeu14UG8l+Y/2LJZB wPANKGGKYU6pP5OqxAkUsP8R46EhI/F74cspfJmaA0CeryB1ZjEoE+C40MOk+RrHk+th nZj0sZ9VXhu7XQnDvzIpRXykiMgXQGVmH0zooeWBtbXVGv0e5eHuK/R/EsURhf6EJDdo IvVw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=B9QuEHF4; spf=pass (google.com: domain of mptcp+bounces-4658-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-4658-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from sjc.edge.kernel.org (sjc.edge.kernel.org. [2604:1380:1000:8100::1]) by mx.google.com with ESMTPS id 64-20020a630243000000b0038273ec0f54si20127409pgc.586.2022.04.07.16.40.49 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 07 Apr 2022 16:40:49 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-4658-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) client-ip=2604:1380:1000:8100::1; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=B9QuEHF4; spf=pass (google.com: domain of mptcp+bounces-4658-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-4658-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sjc.edge.kernel.org (Postfix) with ESMTPS id A6EB73E0FA3 for ; Thu, 7 Apr 2022 23:40:48 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 6FBFB3D79; Thu, 7 Apr 2022 23:40:42 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) (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 373343D75 for ; Thu, 7 Apr 2022 23:40:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1649374841; x=1680910841; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=J9jdnFEOjdcVMxcGtEt9EtlvExU+dCPgZUx+8RRX+8c=; b=B9QuEHF4lrrYe5MMGNQ9wC2gHHxpbUuwNEPuX2RsdzoDB/sWaSo5WRrM ynmfNAXmE6RKkJwL1+PrSsVupihACv8Hk6M+/XvrYhpTr4Xkj4D/5lqb3 YPDPaDibdrA1lJs94UCDXOERaMmdsErK61fO9ZrtXRWC1i2cMSxYf1I22 BWx/rcSDvEpcYAgJcJ1+8IYmQ9H//juT9OM934YQvrdRgc/FT73OKm2sU 5jfFdV8CzxI6GlZgjftiwyfNTNes1ME1/ctkd7BFHEStGx6yHAYmFog8A 00Td7I9o2yT+XX+a3Orbzf1w0Er3hxbnd79cMPNdhr7AEcI6uKruwaQPx Q==; X-IronPort-AV: E=McAfee;i="6400,9594,10310"; a="259062017" X-IronPort-AV: E=Sophos;i="5.90,242,1643702400"; d="scan'208";a="259062017" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 Apr 2022 16:40:36 -0700 X-IronPort-AV: E=Sophos;i="5.90,242,1643702400"; d="scan'208";a="571270947" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 Apr 2022 16:40:35 -0700 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Cc: Florian Westphal Subject: [PATCH mptcp-next v8 04/14] mptcp: netlink: split mptcp_pm_parse_addr into two functions Date: Thu, 7 Apr 2022 19:40:19 -0400 Message-Id: <20220407234029.1774481-5-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220407234029.1774481-1-kishen.maloor@intel.com> References: <20220407234029.1774481-1-kishen.maloor@intel.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Florian Westphal Next patch will need to parse MPTCP_PM_ATTR_ADDR attributes and fill an mptcp_addr_info structure from a different genl command callback. To avoid copy-paste, split the existing function to a helper that does the common part and then call the helper from the (renamed)mptcp_pm_parse_entry function. Signed-off-by: Florian Westphal Reviewed-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 ceb1c310d0c6..ece0158519e2 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -1150,11 +1150,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) { @@ -1168,27 +1169,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"); @@ -1196,22 +1199,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 @@ -1259,7 +1277,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 @@ -1453,7 +1471,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 @@ -1627,7 +1645,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 @@ -1838,7 +1856,7 @@ static int mptcp_nl_cmd_set_flags(struct sk_buff *skb= , struct genl_info *info) u8 bkup =3D 0, lookup_by_id =3D 0; int ret; =20 - ret =3D mptcp_pm_parse_addr(attr, info, false, &addr); + ret =3D mptcp_pm_parse_entry(attr, info, false, &addr); if (ret < 0) return ret; =20 --=20 2.31.1 From nobody Wed May 8 20:34:35 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:1788:b0:4ac:5e5b:1ad1 with SMTP id y8csp475112piq; Thu, 7 Apr 2022 16:40:48 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzmhaiTIWwfQuGmjKLNsXWhsoigjxSB+4PDzubc1jC5u1K8v+RKJhvIFjeNHbGIPgW4Mwgd X-Received: by 2002:a17:906:9b89:b0:6da:ac6b:e785 with SMTP id dd9-20020a1709069b8900b006daac6be785mr15943505ejc.295.1649374848242; Thu, 07 Apr 2022 16:40:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1649374848; cv=none; d=google.com; s=arc-20160816; b=BXK6IIzCp0UDwOfrFnoysepupcXxXo2CIZVdx89aPj/hJugqQmggMzo74eo6533TzP Zsy3oRt3kuPLoBnqXakitq8oyRa+/Xz9n9ajm9TYQ/TxUnvYc5OjPN/p5b+LIKz5ougG Wo2VyddsD3AhFuYJej+iJ+1n/tCDythM9/VKr0IdUJp1Wog3KaBdyuC6PczHxfatHuDv O3EF0EudHrOzIjahoJ6PT4isIKqAjaYvI8jOq6eCXwyHEKmQwj3LNwL8gpXD5ejXlsPE nMYR4MNQl0Eg0+T5ZBMlJev5x6Vc1f/Xnn4nId/hMxuuQvSsWICa5nw289K6ZjCFahRW 9p2A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:to:from:dkim-signature; bh=c1tJgEZY5LIpogn3Ujy8uj3d/d6wU2WgBrYmlxg9U24=; b=gxxHjSy+bxq2p0heNXU8COPCwfodBj2UqaPrvNZS10l2pN9f0tel4ECJhjRajrNWGq /v17SmWA/gXJfhc1aCl3tYTm6QvztInLu7cV5ggvRU57s+lDiYcWoiWgmW6P6HBabZDW OkAiwQ1CxZomXUC1sdiY1/i+ukpLN74jWxkNNhD7eyYQs+hK5DW40RjwRk/oJKrEViVh jUUa06K10InW8U8fG5ZmtSDpIpWbxI1HqJlkCqSCEsWIeAb7gapPUXCYrBRdOwqqtFRi 3pGH/IpXMJpghTjoMu60rVxmyarRW2EaiMVDo5O9CbwIKXi6xwzTmfaZWZZi3uba5Hh9 XLsA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=hhToUVcR; spf=pass (google.com: domain of mptcp+bounces-4656-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-4656-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from ewr.edge.kernel.org (ewr.edge.kernel.org. [147.75.197.195]) by mx.google.com with ESMTPS id f9-20020a50e089000000b00418f9b49b63si14358277edl.475.2022.04.07.16.40.47 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 07 Apr 2022 16:40:48 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-4656-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) client-ip=147.75.197.195; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=hhToUVcR; spf=pass (google.com: domain of mptcp+bounces-4656-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-4656-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ewr.edge.kernel.org (Postfix) with ESMTPS id 84CE01C0D2B for ; Thu, 7 Apr 2022 23:40:46 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 69F983D78; Thu, 7 Apr 2022 23:40:41 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) (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 EA0513D77 for ; Thu, 7 Apr 2022 23:40:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1649374839; x=1680910839; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=qCv67Ai64zt15CvwOhaIw3G8/pLQ65RGfcCs1qi/48A=; b=hhToUVcRZ460IXH9Ea1hR1kLzwuPaXvxEIATPpASddv8bHTAmpjkSuu8 Y/9Cauk7ujiCzWNe0Q2cLIwUuocLiFKvxlIWP/atBtsQ1Ee691vUTmZTE 9rTNjo3Rq+2xKLQPBjJTvfUEdaD8m0zwFwFIr5cH2VKnrYwN25fkkXtnS 8XOuFVJ5qMfc5l2XEdv/rWxsDLXmbsu3LCxEh9EIPrQkvOyQRa1V93Lqy RXLYNEfiuMp1Ug4d7ViR84rmYqFvP1KK2LVHsK4PBjBBe/iNSDe92T+jb gMZwzBynChhwPConw/bSR0oAUC8YIUqM2Wfuo8mfSfXYt9sbrZfoY/JC6 A==; X-IronPort-AV: E=McAfee;i="6400,9594,10310"; a="259062014" X-IronPort-AV: E=Sophos;i="5.90,242,1643702400"; d="scan'208";a="259062014" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 Apr 2022 16:40:36 -0700 X-IronPort-AV: E=Sophos;i="5.90,242,1643702400"; d="scan'208";a="571270949" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 Apr 2022 16:40:35 -0700 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v8 05/14] mptcp: netlink: Add MPTCP_PM_CMD_ANNOUNCE Date: Thu, 7 Apr 2022 19:40:20 -0400 Message-Id: <20220407234029.1774481-6-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220407234029.1774481-1-kishen.maloor@intel.com> References: <20220407234029.1774481-1-kishen.maloor@intel.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This change adds a MPTCP netlink interface for issuing ADD_ADDR advertisements over the chosen MPTCP connection from a userspace path manager. The command requires the following parameters: { token, { loc_id, family, daddr4 | daddr6 [, dport] } [, if_idx], flags[signal] }. Signed-off-by: Kishen Maloor Reviewed-by: Mat Martineau --- v6: -Move struct mptcp_pm_addr_entry into protocol.h. -Make mptcp_pm_alloc_anno_list() and mptcp_pm_parse_entry() non-static. -Move mptcp_nl_cmd_announce() into pm_userspace.c. --- include/uapi/linux/mptcp.h | 2 ++ net/mptcp/pm_netlink.c | 24 ++++++++-------- net/mptcp/pm_userspace.c | 58 ++++++++++++++++++++++++++++++++++++++ net/mptcp/protocol.h | 17 +++++++++++ 4 files changed, 88 insertions(+), 13 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 ece0158519e2..dbe5ccd95ac5 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; @@ -360,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; @@ -1102,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) @@ -1211,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; @@ -2206,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..86d1c83a3f9f 100644 --- a/net/mptcp/pm_userspace.c +++ b/net/mptcp/pm_userspace.c @@ -119,3 +119,61 @@ 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; + u32 token_val; + int err; + + if (!addr || !token) { + GENL_SET_ERR_MSG(info, "missing required inputs"); + return -EINVAL; + } + + token_val =3D nla_get_u32(token); + + msk =3D mptcp_token_get_sock(sock_net(skb->sk), token_val); + if (!msk) { + NL_SET_ERR_MSG_ATTR(info->extack, token, "invalid token"); + return -EINVAL; + } + + if (!mptcp_pm_is_userspace(msk)) { + GENL_SET_ERR_MSG(info, "invalid request; userspace PM not selected"); + return -EINVAL; + } + + err =3D mptcp_pm_parse_entry(addr, info, true, &addr_val); + if (err < 0) { + GENL_SET_ERR_MSG(info, "error parsing local address"); + return err; + } + + if (addr_val.addr.id =3D=3D 0 || !(addr_val.flags & MPTCP_PM_ADDR_FLAG_SI= GNAL)) { + GENL_SET_ERR_MSG(info, "invalid addr id or flags"); + return -EINVAL; + } + + 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"); + return 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); + + return 0; +} diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index a6ee811e5d02..2abf98e66074 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 @@ -747,6 +748,19 @@ u16 __mptcp_make_csum(u64 data_seq, u32 subflow_seq, u= 16 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); + +struct mptcp_pm_addr_entry { + struct list_head list; + struct mptcp_addr_info addr; + u8 flags; + int ifindex; + struct socket *lsk; +}; + +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); @@ -767,6 +781,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 * @@ -790,6 +806,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.31.1 From nobody Wed May 8 20:34:35 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:1788:b0:4ac:5e5b:1ad1 with SMTP id y8csp475115piq; Thu, 7 Apr 2022 16:40:48 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzu64vCKR/Zsr/fabBBxQ1kHOpSA3iTjMfmHXMlLmimPnBBj+9VIqA6xSmYy494Mq0OV6W4 X-Received: by 2002:a17:907:3d8c:b0:6df:4bdc:a282 with SMTP id he12-20020a1709073d8c00b006df4bdca282mr15492088ejc.464.1649374848750; Thu, 07 Apr 2022 16:40:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1649374848; cv=none; d=google.com; s=arc-20160816; b=FKkzbL7xPHTIpXXC0HdOPJMXFoHAUowqfNpc9OgIt32cf3XvKD798abQGnU5T6Bb79 aR5zDaPlBWwfa+Oixqw9pbRAU/zyESGwkBJ1wFuUmjsPsBiYt9s5MPWmcItEurGk9ZUl 6diFhtTl07KWeadW2FZ+NxgJhA9H+WlL6DYFIe4LRyzhaIMR91tj2PNfzzGhgfyhmZ1m p3oKsJwb/uJ2cLJQm7WZuY3P8uOnfFaG7m2pCTThdzXKCl6OYC95gl9QLDppSTxtVZzB vjQZ1oH4zZ2NIPqLqMoGpsrs0oTA3Knl6rDiN+Cid3MiVYRTVIq3lqAf7HCQRMT2SJ9F ybyQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:to:from:dkim-signature; bh=qk1jQEnzidhDzaw06g43rlLWXEKWBHg2i8pidDp0dw4=; b=fTfULIWl+tJ1F+SUMIGItx0aMFP6a4c/Q64YostiXoRxehI9hQDMQOmVUeivlPasq/ uDt5MnTw+MvGh2qR0Xr8CmNgnKFd+Afz17kkss2zGxVSnbPFIMHfqtSr1Fd1liOFyHjp 8Q7L88g4h3u+YPDUMON04f387A64WoXG+ov16SF9G87A4+teu5N2HP/pAU3ZImnhasX6 6Pc3fJ7a8V/GxQomD9TnSs4esuQzMH46UJYGBuQB+qFoMIM/XfcPU4qw26f5ezLKj51H PNoOLQLTyrxeZSjKQU4ZEzGk918rKnc0x8UP9LWH+dXCOW9bD1EtEPvfoWq06bQM3DPe 0HCw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=HVl6PmkG; spf=pass (google.com: domain of mptcp+bounces-4657-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-4657-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from ewr.edge.kernel.org (ewr.edge.kernel.org. [147.75.197.195]) by mx.google.com with ESMTPS id e5-20020a50e005000000b00418c2b5bd4asi3330322edl.44.2022.04.07.16.40.48 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 07 Apr 2022 16:40:48 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-4657-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) client-ip=147.75.197.195; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=HVl6PmkG; spf=pass (google.com: domain of mptcp+bounces-4657-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-4657-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ewr.edge.kernel.org (Postfix) with ESMTPS id C90A11C0CC4 for ; Thu, 7 Apr 2022 23:40:47 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 47B463D7F; Thu, 7 Apr 2022 23:40:42 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) (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 384973D76 for ; Thu, 7 Apr 2022 23:40:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1649374840; x=1680910840; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=UhUPMksKwrGyZiZFoGBkKb8Lil20ZzQprtFN2H/4J28=; b=HVl6PmkG58cqj3+rIgkSxGuE34tPWU9FRy99QMMcqdyIZPGNW5s2lr9y VKjHaEwSMbKT4aByizreS63sgdeJEc9hL81Kwi54AvogibzGLa4yVt4a6 dC3ZfQDUY/zALKx+2UeOJCW+c+CWt3PSK2Q38gz6m3OArUmXQ8N2QLamh jOQ4ElZ4t3UmVLUgMHOgrhkwzzSvXGBkFrzXEKrnnJcNHHOYBeALgBmqy mXJFq87BNDv/lcazULpGUC+kG6TRLZBmbEQznHlMREzI9GvcDm/P1ESSD DRmRfcGRFz5vuciKcA0TTTIYTBBnqpE4HHMWFf4YjRlFTuL6+uC49Wa0w Q==; X-IronPort-AV: E=McAfee;i="6400,9594,10310"; a="259062016" X-IronPort-AV: E=Sophos;i="5.90,242,1643702400"; d="scan'208";a="259062016" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 Apr 2022 16:40:36 -0700 X-IronPort-AV: E=Sophos;i="5.90,242,1643702400"; d="scan'208";a="571270953" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 Apr 2022 16:40:35 -0700 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v8 06/14] selftests: mptcp: support MPTCP_PM_CMD_ANNOUNCE Date: Thu, 7 Apr 2022 19:40:21 -0400 Message-Id: <20220407234029.1774481-7-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220407234029.1774481-1-kishen.maloor@intel.com> References: <20220407234029.1774481-1-kishen.maloor@intel.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This change updates the "pm_nl_ctl" testing sample with an "ann" (announce) option to support the newly added netlink interface command MPTCP_PM_CMD_ANNOUNCE to issue ADD_ADDR advertisements over the chosen MPTCP connection. E.g. ./pm_nl_ctl ann 192.168.122.75 token 823274047 id 25 dev enp1s0 Signed-off-by: Kishen Maloor Reviewed-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.31.1 From nobody Wed May 8 20:34:35 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:1788:b0:4ac:5e5b:1ad1 with SMTP id y8csp475134piq; Thu, 7 Apr 2022 16:40:51 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxHdHr08oddirpDslnlzdM14AHMfjLp4odt66QEdxzRkFHMb9TJ9ATUAEhtpeeaW7uGjfb4 X-Received: by 2002:a17:902:e547:b0:156:c4e4:c0c7 with SMTP id n7-20020a170902e54700b00156c4e4c0c7mr16212326plf.61.1649374851732; Thu, 07 Apr 2022 16:40:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1649374851; cv=none; d=google.com; s=arc-20160816; b=BFMF0M/5WvQ88TISL5MDubI4qZTfhrkJLN80H+464bt+fWDCvKrH0XxJbovGAA17pL iVQcm6+K9YZDz/tEukR7TaVOMiUic6UboP0m0Go4SirxFQYBKv/W8CbHTPAMiXoUgCIP rZplVNJJ5/SDBOUlNWbgVkVpaur3jIJUuL8l6rTmdctc87bzGwdaoOfxkH4K4GEuhn0q wVoQKDslgvtVH/4H7a46nRkNzNxl3g4nAc+uihcOUzKQ1RsMYKpIXS9QHhUqQGoGLWbj /YMlc2AJPRRUidWmwvktvoBPHtPd/e8nWCzyLtXMMk8Mvy7k77c7LcjnSgSaMyd2MOf7 J6XA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:to:from:dkim-signature; bh=CAkz+GETnC4IzuROiJB07eiC1ivSqhvSTzyZk4qWgBM=; b=utF4mpqeTn1yz9ppBJhBpC9PghqinMnR4V9fngW/1Q7KudDGn7cHlTZMmyi/fH/zAH yeRf3EJ+QB44iGXILNi6mgqKMdjFbafI02fSuMac4QjhEwW/7SdO3GITk0X3Wf5a3X/e gIUnfydTyk3eOGXXhcOOzXnQ//Mg1F/pF9QQaWH5GnxvPu8nA+glr/WdQPfl3u+A+Hf4 tNt97fONueSCK34nXHVXZ7ROE7Dfpu7MG7V39L0hBqAOnXf/8pMEVW0Pcq5idIEQ4SD2 B+TbTwO5fuUg0qYnLD9NUO6wp9Eu7ZUgdoIhJ2KKrNYoHg8HapBHel3Mcu9Dv7fWICKi RIsA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=VGTmLv8O; spf=pass (google.com: domain of mptcp+bounces-4660-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-4660-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from sjc.edge.kernel.org (sjc.edge.kernel.org. [147.75.69.165]) by mx.google.com with ESMTPS id n19-20020a170902969300b00153b2d1643dsi997097plp.69.2022.04.07.16.40.51 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 07 Apr 2022 16:40:51 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-4660-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) client-ip=147.75.69.165; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=VGTmLv8O; spf=pass (google.com: domain of mptcp+bounces-4660-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-4660-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sjc.edge.kernel.org (Postfix) with ESMTPS id 02F8E3E1004 for ; Thu, 7 Apr 2022 23:40:51 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id D3C043D77; Thu, 7 Apr 2022 23:40:42 +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 B68AD3D7A for ; Thu, 7 Apr 2022 23:40:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1649374839; x=1680910839; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=7C5KAhVtcu+VPueF2/d4JZakThKNv51AxsFa/zNUUzA=; b=VGTmLv8Ok8//XmRovaTcPEPcI/smVgeylznlUTOwK9L/YvUWFpYEfZIE +P8fVvr3K/3/n4ksR2GGa+10HBBVZulkTlBrDJ+rCoYkVWQxtceeImd6M eugnNoA7OEzWRMDo5++pbv4KlNn+Q/ByRDMRWeG4vleoxX6WtWqpq/9UN Zhu3Oks90qH4uMSjay2lMSLWaKpFSfJfd7tZKEGppLw4G/Ui/feBTcqhD Ksfocxwy3z4pQ/TTnXwCo3RPJ9F9eGTdU1E10ymie+vtUyjfTGgsfz6OZ mPPfl9NOD2jC65CV3meG7E/VZVH3HfL1VQDunvJkn5VRjguvf8FB5Y0us Q==; X-IronPort-AV: E=McAfee;i="6400,9594,10310"; a="248994260" X-IronPort-AV: E=Sophos;i="5.90,242,1643702400"; d="scan'208";a="248994260" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 Apr 2022 16:40:37 -0700 X-IronPort-AV: E=Sophos;i="5.90,242,1643702400"; d="scan'208";a="571270956" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 Apr 2022 16:40:35 -0700 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v8 07/14] mptcp: netlink: Add MPTCP_PM_CMD_REMOVE Date: Thu, 7 Apr 2022 19:40:22 -0400 Message-Id: <20220407234029.1774481-8-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220407234029.1774481-1-kishen.maloor@intel.com> References: <20220407234029.1774481-1-kishen.maloor@intel.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This change adds a MPTCP netlink command for issuing 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}. Signed-off-by: Kishen Maloor Reviewed-by: Mat Martineau --- v6: -Make mptcp_pm_remove_addrs_and_subflows() non-static. -Move mptcp_nl_cmd_remove() into pm_userspace.c. --- include/uapi/linux/mptcp.h | 2 ++ net/mptcp/pm_netlink.c | 10 +++++-- net/mptcp/pm_userspace.c | 57 ++++++++++++++++++++++++++++++++++++++ net/mptcp/protocol.h | 4 +++ 4 files changed, 71 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 86d1c83a3f9f..b388c095e73d 100644 --- a/net/mptcp/pm_userspace.c +++ b/net/mptcp/pm_userspace.c @@ -177,3 +177,60 @@ int mptcp_nl_cmd_announce(struct sk_buff *skb, struct = genl_info *info) =20 return 0; } + +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); + u32 token_val; + u8 id_val; + + if (!id || !token) { + GENL_SET_ERR_MSG(info, "missing required inputs"); + return -EINVAL; + } + + id_val =3D nla_get_u8(id); + token_val =3D nla_get_u32(token); + + msk =3D mptcp_token_get_sock(sock_net(skb->sk), token_val); + if (!msk) { + NL_SET_ERR_MSG_ATTR(info->extack, token, "invalid token"); + return -EINVAL; + } + + if (!mptcp_pm_is_userspace(msk)) { + GENL_SET_ERR_MSG(info, "invalid request; userspace PM not selected"); + return -EINVAL; + } + + lock_sock((struct sock *)msk); + + list_for_each_entry(entry, &msk->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); + return -EINVAL; + } + + list_move(&match->list, &free_list); + + mptcp_pm_remove_addrs_and_subflows(msk, &free_list); + + release_sock((struct sock *)msk); + + list_for_each_entry_safe(match, entry, &free_list, list) { + sock_kfree_s((struct sock *)msk, match, sizeof(*match)); + } + return 0; +} diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index 2abf98e66074..bf499ca81445 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -803,10 +803,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.31.1 From nobody Wed May 8 20:34:35 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:1788:b0:4ac:5e5b:1ad1 with SMTP id y8csp475047piq; Thu, 7 Apr 2022 16:40:40 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyTSPNsTacCljwAXaqW/F6rS8mjjoFt8YMlUYfiz/YvFjpW6Nt8Hz9wwEt+kMJAUJzLQv9W X-Received: by 2002:a17:90b:3504:b0:1c6:8569:c28d with SMTP id ls4-20020a17090b350400b001c68569c28dmr18346444pjb.92.1649374840360; Thu, 07 Apr 2022 16:40:40 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1649374840; cv=none; d=google.com; s=arc-20160816; b=OJvDO5dXDRTvk7xjkvCxcojToRq+xhqF+Yluiy6EhWsQ/kXdZulWJxFKPV5VWnW/6U F5lhxN+6evFeHdxGgO5RPlacC1nde1NUhEvqpAusGNrL2I8awGEwvqeK9FjTOUa1qc0D SREcFrGBV3EUXZNC/e9VjeBZTWwgLhqrc52Jo2ZT7WefE2faCWhiCpNbjFyA31vjW5iS OSmGk5CO8TJByUm+El8GqsI+jXToG0/z3NhxY+5U5EOadTDNaOdfqE04QlHr6FV/n/2T 8vECbLMPJNvhqbiHBBUAFfhVaxlD7YZIU1fjYzNFnTH6UIQKpsKAT064Hrm19j1Kfy8e qdEg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:to:from:dkim-signature; bh=fw8Pkk7FsoXal6qTEgfyW7yvlnTAlkxjWf/YOWAEp+M=; b=nxDAUkMUyeksHirQq8A0O21KNugHipN4/lGqo3RZMQq1yRU4Mr0XWN6NWEJUppLIU8 TyB6oabDIm21hx46JTY/Vz8DKbCzb3VhdjUP8bfmvEZPu/wkpxvaLTzN3zmINg2oKI9q 9wjCCxqyfHjUJ32a9KK4lEIfoka6PcLuQpkYTGlWz+F2rp1AN+LpAJfBp72IZdDuNpWU Pkzad9AFJ7NFl/kjRNtj7inYgiq0GSEIAN68ORr08+fmWb0agNXJM/Mo5H2/ny/JRoyZ engaPex0eOnSTOOkSBGRhcHV9pH/rnR1UBrs1LVpAxkrJLmlFtdTOrYKV9LWh3Uv5gzk wOKw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=Biby9uxR; spf=pass (google.com: domain of mptcp+bounces-4651-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-4651-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from sjc.edge.kernel.org (sjc.edge.kernel.org. [2604:1380:1000:8100::1]) by mx.google.com with ESMTPS id p2-20020a17090ab90200b001c7bfb058absi2857268pjr.99.2022.04.07.16.40.40 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 07 Apr 2022 16:40:40 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-4651-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) client-ip=2604:1380:1000:8100::1; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=Biby9uxR; spf=pass (google.com: domain of mptcp+bounces-4651-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-4651-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sjc.edge.kernel.org (Postfix) with ESMTPS id 1B7273E0A18 for ; Thu, 7 Apr 2022 23:40:40 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 68A0F3D78; Thu, 7 Apr 2022 23:40:39 +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 A7A6D3D73 for ; Thu, 7 Apr 2022 23:40:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1649374837; x=1680910837; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=RAhrEvJmyKeoBz/vW0WCe2KrNVdwr/PvsJn+yTOk/F0=; b=Biby9uxRSk9iuWovPpm3dkoSBUid5XHLzOzCkHSWhysJSXsbViEOOhPy MQ7IuFkc1FHw7vFvNeK3b1RSOkk1PNW9xu3vIz/K/q27a5UI/qeZdN5kq 3ak/3JgCa4Sh602ud9WAuydZiBo7A/+RliuAaSEx3YwDtKlOJCrmLlsR0 IoE1mh0G9MssEH6L/80kN0oz6tn/XRtpS29vzc/0VgsNWTOSTpHBqitBw 8/OshS+kwBIvAUtZ6n8GxuNn8RWugDT2u9H4cjMLc4rKnjGanPgZ75jCi mkmbhKVvH80D7zoTkBwY6iUbw4CiruroOOE4dGrU+LOT8mRWcOTCatS0z Q==; X-IronPort-AV: E=McAfee;i="6400,9594,10310"; a="248994261" X-IronPort-AV: E=Sophos;i="5.90,242,1643702400"; d="scan'208";a="248994261" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 Apr 2022 16:40:37 -0700 X-IronPort-AV: E=Sophos;i="5.90,242,1643702400"; d="scan'208";a="571270959" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 Apr 2022 16:40:35 -0700 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v8 08/14] selftests: mptcp: support MPTCP_PM_CMD_REMOVE Date: Thu, 7 Apr 2022 19:40:23 -0400 Message-Id: <20220407234029.1774481-9-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220407234029.1774481-1-kishen.maloor@intel.com> References: <20220407234029.1774481-1-kishen.maloor@intel.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This change updates the "pm_nl_ctl" testing sample with a "rem" (remove) option to support the newly added netlink interface command MPTCP_PM_CMD_REMOVE to issue a REMOVE_ADDR signal over the chosen MPTCP connection. E.g. ./pm_nl_ctl rem token 823274047 id 23 Signed-off-by: Kishen Maloor Reviewed-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.31.1 From nobody Wed May 8 20:34:35 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:1788:b0:4ac:5e5b:1ad1 with SMTP id y8csp475147piq; Thu, 7 Apr 2022 16:40:53 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwSk88ZAGold1oJ6wZZr9OxdYfwIiE70Z5rgpIoeQNCYIq+Zh4+LyST+xkszDhHmc136KXT X-Received: by 2002:a17:902:9b94:b0:156:2c08:14a5 with SMTP id y20-20020a1709029b9400b001562c0814a5mr16394827plp.60.1649374852955; Thu, 07 Apr 2022 16:40:52 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1649374852; cv=none; d=google.com; s=arc-20160816; b=HqHeY25DdlzFvFwXJHp3YfJumyLzvO05voRi/IJliiUhSMZqngZED7nJNQHcb0Lwd9 9/TsHjtcHhANu8jftLdI1FBAkzTZx/r71382ZidS0Hw3bskV1QRpHEP9OxdVD433sBmP +oRiHLPSjSNI6ttQGKWW5428/GZptTOY50Cy250lBCZa3g5tpNB1hLjq2FVvsaQ7EWxo jix491T67n3WWDgFyKqFv9PawPNwBL0mnZ12qpP5HJr5PhkkVOZ2Zr2Zs9Us6DCfJq4Y lFy/BXho1EMoJ58MANKNzFV8ecXBO/tF/aXDzV8xphOx7oVEfJ91jXwqZB43C+zFu6XN pUUw== 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=0G1ul44TdPR6vqXGeWw72lvFG+NzM+TtiZbXhYKiP3k=; b=EEX5P5zfNyQyUmUWlKQPA7T+xaymv8UGwL+rNOSYGY6DRkjpg1SxZFumgGCrgZkBbz Th3prt4jnq5vcz0aP9QH8iwGUAPBEdZpNeLX6kdLK5b3ytmudU6FwTRMQicP+tspRR78 TgeMvmhGoBR3D7Uv2x5CiibqUtJmtioa0OU4ZQ7cIgyYht3B2+Jwn5Az1ZPViWwYchtC vgYUnuX0eADzqAMkKabTYpNy9PIVS0Nh2SyMBnsGYl2fMwLgSbThHjeElq18nuOfnB/z EguxBkNflqvtAnCQT6qzqdIb8zH1G2G3tNYoO57IEHOriEIEKCw8A0B7G2sTtwqyvpPp QVdg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=Wvq2YWcx; spf=pass (google.com: domain of mptcp+bounces-4661-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-4661-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from sjc.edge.kernel.org (sjc.edge.kernel.org. [2604:1380:1000:8100::1]) by mx.google.com with ESMTPS id e21-20020a17090a9a9500b001cb1653a8c4si2613848pjp.17.2022.04.07.16.40.52 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 07 Apr 2022 16:40:52 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-4661-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) client-ip=2604:1380:1000:8100::1; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=Wvq2YWcx; spf=pass (google.com: domain of mptcp+bounces-4661-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-4661-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sjc.edge.kernel.org (Postfix) with ESMTPS id 458A43E1020 for ; Thu, 7 Apr 2022 23:40:52 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 0A0913D80; Thu, 7 Apr 2022 23:40:43 +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 7CC773D7D for ; Thu, 7 Apr 2022 23:40:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1649374841; x=1680910841; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=WFz9lBARG0qMx8hD/kc3qoR/DlrbBBAwddPK3EEv23U=; b=Wvq2YWcx1bdMSXjPaXdOiU4m4lvwycpDVFcCwyWTGZedpMGihrVkNABz OEgZ4tnZd3rBnvM9cLuZCe5oKgx0Hm2nlk/mfWOjE6A8BpIToXX2ZRT8J 6mI7Jcm6LTiRy4XNNtrYEPYmVZINtT9Qxv/Eg6sMIQkyVMH3NpOM3As2r sceDOudHyCAX1UroIvp5kLV6mP4kewG6bswE9xcNYFr/HqIdbxfBwY0+O XqfKH84K28vbpiAbt2uwcXcbQE9HPUt81Kiov6iBGmCORArjgbMEJtssx Hj+hQv+6BZy9icmB5vP04xIMWKCRwIeV7Pl9CIEndG0Sk7rFs0kmzYEPX g==; X-IronPort-AV: E=McAfee;i="6400,9594,10310"; a="248994263" X-IronPort-AV: E=Sophos;i="5.90,242,1643702400"; d="scan'208";a="248994263" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 Apr 2022 16:40:37 -0700 X-IronPort-AV: E=Sophos;i="5.90,242,1643702400"; d="scan'208";a="571270961" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 Apr 2022 16:40:35 -0700 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Cc: Florian Westphal Subject: [PATCH mptcp-next v8 09/14] mptcp: netlink: allow userspace-driven subflow establishment Date: Thu, 7 Apr 2022 19:40:24 -0400 Message-Id: <20220407234029.1774481-10-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220407234029.1774481-1-kishen.maloor@intel.com> References: <20220407234029.1774481-1-kishen.maloor@intel.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Florian Westphal This allows userspace to tell kernel to add a new subflow to an existing mptcp connection. Userspace provides the token to identify the mptcp-level connection that needs a change in active subflows and the local and remote addresses of the new or the to-be-removed subflow. MPTCP_PM_CMD_SUBFLOW_CREATE requires the following parameters: { token, { loc_id, family, loc_addr4 | loc_addr6 }, { family, rem_addr4 | rem_addr6, rem_port } MPTCP_PM_CMD_SUBFLOW_DESTROY requires the following parameters: { token, { family, loc_addr4 | loc_addr6, loc_port }, { family, rem_addr4 | rem_addr6, rem_port } Signed-off-by: Florian Westphal Co-developed-by: Kishen Maloor Signed-off-by: Kishen Maloor Reviewed-by: Mat Martineau --- v6: -Make mptcp_pm_parse_addr() non-static. -Move mptcp_nl_cmd_sf_create(), mptcp_nl_find_ssk() and mptcp_nl_cmd_sf_destroy() into pm_userspace.c. --- include/uapi/linux/mptcp.h | 3 + net/mptcp/pm_netlink.c | 22 +++++ net/mptcp/pm_userspace.c | 179 +++++++++++++++++++++++++++++++++++++ net/mptcp/protocol.h | 4 + 4 files changed, 208 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 b388c095e73d..735ff7ff71af 100644 --- a/net/mptcp/pm_userspace.c +++ b/net/mptcp/pm_userspace.c @@ -234,3 +234,182 @@ int mptcp_nl_cmd_remove(struct sk_buff *skb, struct g= enl_info *info) } return 0; } + +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; + struct sock *sk; + u32 token_val; + int ret; + + if (!laddr || !raddr || !token) { + GENL_SET_ERR_MSG(info, "missing required inputs"); + return -EINVAL; + } + + token_val =3D nla_get_u32(token); + + msk =3D mptcp_token_get_sock(genl_info_net(info), token_val); + if (!msk) { + NL_SET_ERR_MSG_ATTR(info->extack, token, "invalid token"); + return -EINVAL; + } + + if (!mptcp_pm_is_userspace(msk)) { + GENL_SET_ERR_MSG(info, "invalid request; userspace PM not selected"); + return -EINVAL; + } + + ret =3D mptcp_pm_parse_addr(laddr, info, &addr_l); + if (ret < 0) { + NL_SET_ERR_MSG_ATTR(info->extack, laddr, "error parsing local addr"); + return -EINVAL; + } + + if (addr_l.id =3D=3D 0) { + NL_SET_ERR_MSG_ATTR(info->extack, laddr, "missing local addr id"); + return -EINVAL; + } + + ret =3D mptcp_pm_parse_addr(raddr, info, &addr_r); + if (ret < 0) { + NL_SET_ERR_MSG_ATTR(info->extack, raddr, "error parsing remote addr"); + return -EINVAL; + } + + sk =3D &msk->sk.icsk_inet.sk; + lock_sock(sk); + + ret =3D __mptcp_subflow_connect(sk, &addr_l, &addr_r); + + release_sock(sk); + + return ret; +} + +static struct sock *mptcp_nl_find_ssk(struct mptcp_sock *msk, + const struct mptcp_addr_info *local, + const struct mptcp_addr_info *remote) +{ + struct sock *sk =3D &msk->sk.icsk_inet.sk; + struct mptcp_subflow_context *subflow; + struct sock *found =3D NULL; + + if (local->family !=3D remote->family) + return NULL; + + lock_sock(sk); + + mptcp_for_each_subflow(msk, subflow) { + const struct ipv6_pinfo *pinfo; + const struct inet_sock *issk; + struct sock *ssk; + + ssk =3D mptcp_subflow_tcp_sock(subflow); + + if (local->family !=3D ssk->sk_family) + continue; + + issk =3D inet_sk(ssk); + + switch (ssk->sk_family) { + case AF_INET: + if (issk->inet_saddr !=3D local->addr.s_addr || + issk->inet_daddr !=3D remote->addr.s_addr) + continue; + break; +#if IS_ENABLED(CONFIG_MPTCP_IPV6) + case AF_INET6: + pinfo =3D inet6_sk(ssk); + if (!ipv6_addr_equal(&local->addr6, &pinfo->saddr) || + !ipv6_addr_equal(&remote->addr6, &ssk->sk_v6_daddr)) + continue; + break; +#endif + default: + continue; + } + + if (issk->inet_sport =3D=3D local->port && + issk->inet_dport =3D=3D remote->port) { + found =3D ssk; + goto found; + } + } + +found: + release_sock(sk); + + return found; +} + +int mptcp_nl_cmd_sf_destroy(struct sk_buff *skb, struct genl_info *info) +{ + struct nlattr *raddr =3D info->attrs[MPTCP_PM_ATTR_ADDR_REMOTE]; + struct nlattr *token =3D info->attrs[MPTCP_PM_ATTR_TOKEN]; + struct nlattr *laddr =3D info->attrs[MPTCP_PM_ATTR_ADDR]; + struct mptcp_addr_info addr_l; + struct mptcp_addr_info addr_r; + struct mptcp_sock *msk; + struct sock *sk, *ssk; + u32 token_val; + int ret; + + if (!laddr || !raddr || !token) { + GENL_SET_ERR_MSG(info, "missing required inputs"); + return -EINVAL; + } + + token_val =3D nla_get_u32(token); + + msk =3D mptcp_token_get_sock(genl_info_net(info), token_val); + if (!msk) { + NL_SET_ERR_MSG_ATTR(info->extack, token, "invalid token"); + return -EINVAL; + } + + if (!mptcp_pm_is_userspace(msk)) { + GENL_SET_ERR_MSG(info, "invalid request; userspace PM not selected"); + return -EINVAL; + } + + ret =3D mptcp_pm_parse_addr(laddr, info, &addr_l); + if (ret < 0) { + NL_SET_ERR_MSG_ATTR(info->extack, laddr, "error parsing local addr"); + return ret; + } + + ret =3D mptcp_pm_parse_addr(raddr, info, &addr_r); + if (ret < 0) { + NL_SET_ERR_MSG_ATTR(info->extack, raddr, "error parsing remote addr"); + return ret; + } + + if (addr_l.family !=3D addr_r.family) { + GENL_SET_ERR_MSG(info, "address families do not match"); + return -EINVAL; + } + + if (!addr_l.port || !addr_r.port) { + GENL_SET_ERR_MSG(info, "missing local or remote port"); + return -EINVAL; + } + + sk =3D &msk->sk.icsk_inet.sk; + ssk =3D mptcp_nl_find_ssk(msk, &addr_l, &addr_r); + if (ssk) { + struct mptcp_subflow_context *subflow =3D mptcp_subflow_ctx(ssk); + + mptcp_subflow_shutdown(sk, ssk, RCV_SHUTDOWN | SEND_SHUTDOWN); + mptcp_close_ssk(sk, ssk, subflow); + } else { + ret =3D -ESRCH; + } + + return ret; +} diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index bf499ca81445..c799b253998a 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -757,6 +757,8 @@ struct mptcp_pm_addr_entry { struct socket *lsk; }; =20 +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); @@ -811,6 +813,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.31.1 From nobody Wed May 8 20:34:35 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:1788:b0:4ac:5e5b:1ad1 with SMTP id y8csp475131piq; Thu, 7 Apr 2022 16:40:50 -0700 (PDT) X-Google-Smtp-Source: ABdhPJy1sq/tiGpIQ+BBfv0dOAZqAu7i7XZ2UdNnISDon3EYTVrFejkp/Rfv+do/LJ3eXc1e2gsK X-Received: by 2002:a17:902:db03:b0:155:cb6a:7c8e with SMTP id m3-20020a170902db0300b00155cb6a7c8emr16871804plx.125.1649374850534; Thu, 07 Apr 2022 16:40:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1649374850; cv=none; d=google.com; s=arc-20160816; b=P47Y1NhyWsr32rxrk6HL/8bHhdIL7hTkhfZL0xMTpBz4HojneXQotJlkbMETh2Vg8x uVZs8yHdjms+ABwIyubf7b7GqLwmrWtlFmMQpfQpcEMMNBsbv/Jdvi3Cf1wjGqGsBJlq XOj/dEsRMTwB2SqVZ4LWcWHXA2c0MThgBl+101jPluQmWJSafqNtEpWVvdKhAqGNl0Nw D9pRdrdS72IHyU/Ybz+a3SPfptPOt53gtyPxlHEVax2QS48oPLDmOnNjDbOPxvpkKWmP q6agiwOpO5ILhqMOlgcAssjnHkVh2aQ3do0hrXdz2FLFH+CjoyCcfRXCWLi2u2UPKr0R o0tQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:to:from:dkim-signature; bh=3eFoSMV5Dpxo7b1GHEFMm0aVXqrRwWEqFpmkj2ERS7g=; b=wiJDNL0KJEyTj/YSHk9D3nGTI2P7cPxIxbXVUsacsWziYsoPVwjWTlkrEuByYOSam8 yQF2yX9Sh5uKeaDMlRdS3DPyJ9GGfdTu+BsJ4HOWHra5jtHOkgtNHQEJtyJo7w0EM5dW 471Fni3PiIrfggkhcYUqj2s7yUe7jAd08GnvmpGaNTuQi11dZgDh+jAvrpqXnPQJb1bT z+LBLvkrg0BUQuqRuuMFGvDpVPvuUOnkfvubWv3spCRejTqXdrUycxnA1vd+paXqaMOs PTAz7IXJ2b11slMiYYWssZUx4J1Ea/zdnM7PnUvaTcv6tGM0wQAh3neJSo59iUFVpVKn UR0Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=O8ZyXKTT; spf=pass (google.com: domain of mptcp+bounces-4659-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-4659-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from sjc.edge.kernel.org (sjc.edge.kernel.org. [2604:1380:1000:8100::1]) by mx.google.com with ESMTPS id 64-20020a630243000000b0038273ec0f54si20127409pgc.586.2022.04.07.16.40.50 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 07 Apr 2022 16:40:50 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-4659-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) client-ip=2604:1380:1000:8100::1; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=O8ZyXKTT; spf=pass (google.com: domain of mptcp+bounces-4659-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-4659-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sjc.edge.kernel.org (Postfix) with ESMTPS id EE0953E0FEE for ; Thu, 7 Apr 2022 23:40:49 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 9E8913D75; Thu, 7 Apr 2022 23:40:42 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) (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 782B43D77 for ; Thu, 7 Apr 2022 23:40:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1649374841; x=1680910841; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=+rECdyQd8y0br4SUS01z9OTNvgvoP6peEX2mLurHiq0=; b=O8ZyXKTTfSb+tKt7KH2UJ3/c85piyTBEBfjwitICtr6q69xAe7QVLqm5 q1feHAqUy8T9pUUVvH4G59QbwNGSXzEKTmWSk0CLoNu/QJPIR+x8+b5ig zizKgTgiDPJiLo09K96GF20zAMICzxm4xJUGv025SGbgW/PU6bYDIp+HL 10U4G4+ZhQW/VOt0Gnx6V3in54hNvvb2jnaE+Uu+3W5AKOYdxReq3fmMs JXGvQJRtycdnl7ELW3hOsgEZ4zlBKltk+KBsdZ7VtkZeOv2M9Z4zupq8U Lg5zvkxlt1N2DdAYmCGRfPylUxIZojOsj4UjTQhPKDMmZNVQ9u3mYCxL8 g==; X-IronPort-AV: E=McAfee;i="6400,9594,10310"; a="259062020" X-IronPort-AV: E=Sophos;i="5.90,242,1643702400"; d="scan'208";a="259062020" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 Apr 2022 16:40:37 -0700 X-IronPort-AV: E=Sophos;i="5.90,242,1643702400"; d="scan'208";a="571270966" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 Apr 2022 16:40:36 -0700 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v8 10/14] selftests: mptcp: support MPTCP_PM_CMD_SUBFLOW_CREATE Date: Thu, 7 Apr 2022 19:40:25 -0400 Message-Id: <20220407234029.1774481-11-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220407234029.1774481-1-kishen.maloor@intel.com> References: <20220407234029.1774481-1-kishen.maloor@intel.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This change updates the "pm_nl_ctl" testing sample with a "csf" (create subflow) option to support the newly added netlink interface command MPTCP_PM_CMD_SUBFLOW_CREATE over the chosen MPTCP connection. E.g. ./pm_nl_ctl csf lip 10.0.2.1 lid 23 rip 10.0.2.2 rport 56789 token 823274047 Signed-off-by: Kishen Maloor Reviewed-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.31.1 From nobody Wed May 8 20:34:35 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:1788:b0:4ac:5e5b:1ad1 with SMTP id y8csp475080piq; Thu, 7 Apr 2022 16:40:44 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyDKpwI9yLN7rGGgOK98wPazkyNUIWiquDEBnPRtFIuOJeb3KL92Sd6vcDRpbnnWiXbF1Gi X-Received: by 2002:a05:6a00:1a4f:b0:4fa:bc8f:a42d with SMTP id h15-20020a056a001a4f00b004fabc8fa42dmr16681134pfv.50.1649374844146; Thu, 07 Apr 2022 16:40:44 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1649374844; cv=none; d=google.com; s=arc-20160816; b=JfhlYFj2U4bIYDdMv6WXFa9AuCdxihP3PbfKs2SL4Ca+NEEfClrACSG7+QLOZvQC/Z nl4xS2TikEshwxx1MnbRWSdIF/oCUPGZpz8RVL/4s4TYGp9Hlj6suAFqCeLkPZE2REyP lBoE1zaNS3CwNiXww7Z24ljbUfFqW+9vkBuIs8aaZqUZjnDzho+PaQ8h+Et46UqCVsSa 8H0gTgtARmCsFomfFcpgKj2w1ONaoCANP8YsDb4TJxsZ7KN0W9pvz0T135gc+Zm0xBtz CzZx2qn8jGHeNbU2td0ukVijdcMQupPCrHeXKPLuo5/0FeNmQJTEda28ItixBAdmOf0e fAdA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:to:from:dkim-signature; bh=v0iWcl70HsDBQ7DCdXGkkMSal5nZ+PN3vfJ6jZPtrIg=; b=hl+wckVtadx/xS+kwsBpP+G6ofr8mxjFmz/L2EqHN4XzeyA6LuFVqj0463UsjSf4jr Mt1qQUCNEengSaKgkqVTzpmu+SJEXOthcse4ap6N+Jwlx5o9CdPSSdhBKTuwLYEHLeTP 3eh4Dndnx6EjwjXr/p7H5P7WVcUQ8RezBQIU2cQz+xyUJ8Bnlca1HET8+tbKKS9niQky CKrmN6v8ggFexu8pa8VgfChrW7hubpZb0EH4xcounC3nOSeoT3R0pWM5J7IFerW5bP7p LHFvnUhzUyy5/k6OJUQXEALjcvj6bztNuDqylW4Zpq0WNvQVSkr0a9Vmgas/xP7USdO9 VmBA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=FfA7KgJC; spf=pass (google.com: domain of mptcp+bounces-4654-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-4654-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from sjc.edge.kernel.org (sjc.edge.kernel.org. [147.75.69.165]) by mx.google.com with ESMTPS id n2-20020a170902d2c200b001571cc04889si1113319plc.106.2022.04.07.16.40.44 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 07 Apr 2022 16:40:44 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-4654-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) client-ip=147.75.69.165; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=FfA7KgJC; spf=pass (google.com: domain of mptcp+bounces-4654-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-4654-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sjc.edge.kernel.org (Postfix) with ESMTPS id BDA933E0E65 for ; Thu, 7 Apr 2022 23:40:43 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id ED1343D7C; Thu, 7 Apr 2022 23:40:40 +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 6E0013D73 for ; Thu, 7 Apr 2022 23:40:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1649374839; x=1680910839; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=+o04xQLPfR6ph1mrN9TOLw9IIeTZ0vtmCqoGxs1NsH0=; b=FfA7KgJCYbSQROj2uSbR7lGAzp4xsPIgjR/GzTCldKTGPFvHg9FjAv/5 aQgtXsv1YiFOxhPgxgbvlppXSXVvkUlNZpnwMlV6M1XH4WAIzfz+UrXOb uyhuPq+V1HWFandDg6v/NCYBQFep9eqmhpDcUdroqCe7cy1h8mC+yjKXQ na1hX4PthFd4riLaztsIC/CadWxeFpYK2MFwpJXxHXjXo5gSpRiRVnyd4 HLLMcSJWm39kFUsg+l4XzNml5egDWK2/2IAzTPhj3adtWLuV6n2oPRuvy GB2OrO/qJuLba7DK8VbvXIb3PlqWdkmylkfBo7DFdPG98hKQ7D5jgg20E g==; X-IronPort-AV: E=McAfee;i="6400,9594,10310"; a="248994262" X-IronPort-AV: E=Sophos;i="5.90,242,1643702400"; d="scan'208";a="248994262" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 Apr 2022 16:40:37 -0700 X-IronPort-AV: E=Sophos;i="5.90,242,1643702400"; d="scan'208";a="571270968" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 Apr 2022 16:40:36 -0700 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v8 11/14] selftests: mptcp: support MPTCP_PM_CMD_SUBFLOW_DESTROY Date: Thu, 7 Apr 2022 19:40:26 -0400 Message-Id: <20220407234029.1774481-12-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220407234029.1774481-1-kishen.maloor@intel.com> References: <20220407234029.1774481-1-kishen.maloor@intel.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This change updates the "pm_nl_ctl" testing sample with a "dsf" (destroy subflow) option to support the newly added netlink interface command MPTCP_PM_CMD_SUBFLOW_DESTROY over the chosen MPTCP connection. E.g. ./pm_nl_ctl dsf lip 10.0.2.1 lport 44567 rip 10.0.2.2 rport 56789 token 823274047 Signed-off-by: Kishen Maloor Reviewed-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.31.1 From nobody Wed May 8 20:34:35 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:1788:b0:4ac:5e5b:1ad1 with SMTP id y8csp475185piq; Thu, 7 Apr 2022 16:40:57 -0700 (PDT) X-Google-Smtp-Source: ABdhPJx8PCyNZ+++WUahIQ9KBmLOSpFeGkfimAQLbMCPQ9bNdBbjed/IzUKKHhcHSrLUfeMVgGF6 X-Received: by 2002:a17:907:3f09:b0:6e8:4725:8247 with SMTP id hq9-20020a1709073f0900b006e847258247mr1487285ejc.605.1649374857319; Thu, 07 Apr 2022 16:40:57 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1649374857; cv=none; d=google.com; s=arc-20160816; b=CF+xlng8e6AMGYBaFzbOPXJkjCBDYeh8LqFUoXce7PY0FB4MlZg7bLYz15olGJ99mn OdIzHwuobSe9aaFYcx6MTS6AbJqFF0WiWyuhXG+zWjPeEJckMt5GAHYlEggsurW7qDHP kvLe/5HQQ9ApqQ834x7x0VGSjLCVFpop0BpbDDPlY0ai489NHxccNsVoQPZcjYeW+S18 /rQ5CnT0817hzaTH3cW/2p+xQbIyYAiB00+cqisxUkaXWQF5HjR2ec2nrN39Vz8z+SDK FYvZGrwBZd8q5YaGKhQSBzsnwmceBP08ZM2ebx4R62tKkKrUGfe1Ohk1LZXuh1gwce1I hhYA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:to:from:dkim-signature; bh=ro06X8pgCB9pHF7f9HJ/zruOR6wqtOTW7EqS9rAp+O8=; b=isK3ccKOYpQrRMEsqlwLTvZvOlg72BGJZxcgHx6rQjxoK9RNpBKu9NkRaDJErPOBpf XoibUFPmAahKi2lvzfejlb7qld5G1IkuBNUDruzHaF6AWpPvo76Ag/OhtXofmNfFlvKv mYR8F/onUkVhslB5C/eLlshIn9nyMlvULlQDBCsjRtz7Vlm6ALfBornQK/06D5V2x92b 2zbpRy/H8n04IuCD/dsSPZ4iJSuONlko+k3/2ujbgT+eKlQM2d5KfSV6xF25QpGGVlpG pRy/SQp4FZDpj0/NjdduP096A17VSG1ww6QJpQCnKHOJu8JUDNEqmBQTF3wuDLrDewPe sksw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=QoXKW++7; spf=pass (google.com: domain of mptcp+bounces-4664-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-4664-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from ewr.edge.kernel.org (ewr.edge.kernel.org. [147.75.197.195]) by mx.google.com with ESMTPS id a7-20020a50da47000000b00418c2b5bd68si14277550edk.74.2022.04.07.16.40.57 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 07 Apr 2022 16:40:57 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-4664-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) client-ip=147.75.197.195; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=QoXKW++7; spf=pass (google.com: domain of mptcp+bounces-4664-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-4664-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ewr.edge.kernel.org (Postfix) with ESMTPS id 53CD31C0F13 for ; Thu, 7 Apr 2022 23:40:56 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 178053D7A; Thu, 7 Apr 2022 23:40:45 +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 BD2613D7E for ; Thu, 7 Apr 2022 23:40:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1649374841; x=1680910841; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=XfrMc4C9KslLyFbMwlZ3zV5PCfirWg7R8gW3MiTD9Fo=; b=QoXKW++7OSuJGiTvCtDskEfbveQ3JMLstohOQoaVr7hIz4tsuV3iuRUJ cF89EUfHhcufm51TNHHR+ptj+3gCQhAWDbQiFfnGCQ1hbwAMMPVtgsE2X V9Qf/weXt9357OyPifavPZ+4QSNiXp2I08AIpsrs0OsWS4LrlcoJSjxPF /FcpZwk9+R+8HuP99/565csbxgHAzSC7Cg+uy0mrOffRu3oRaQzseqksc kqlUHU8MpO3QAoCE2JxMvcK30+nOUpbBgG9vA2oR1S5vmjD/D4oaqTYEO L1YwXphg8h4YdyVTa6yxo8cs1Ef06iftetuP7lkozEJcAk9V1LRRuEYtX g==; X-IronPort-AV: E=McAfee;i="6400,9594,10310"; a="248994264" X-IronPort-AV: E=Sophos;i="5.90,242,1643702400"; d="scan'208";a="248994264" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 Apr 2022 16:40:37 -0700 X-IronPort-AV: E=Sophos;i="5.90,242,1643702400"; d="scan'208";a="571270972" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 Apr 2022 16:40:36 -0700 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v8 12/14] selftests: mptcp: capture netlink events Date: Thu, 7 Apr 2022 19:40:27 -0400 Message-Id: <20220407234029.1774481-13-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220407234029.1774481-1-kishen.maloor@intel.com> References: <20220407234029.1774481-1-kishen.maloor@intel.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This change adds to self-testing support for the MPTCP netlink interface by capturing various MPTCP netlink events (and all their metadata) associated with connections, subflows and 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. Signed-off-by: Kishen Maloor Reviewed-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.31.1 From nobody Wed May 8 20:34:35 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:1788:b0:4ac:5e5b:1ad1 with SMTP id y8csp475159piq; Thu, 7 Apr 2022 16:40:54 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwVts99XRS3Cpea8HqxglG2QsBbdnrT1X0IroiriVgwN3/Rq2sn+0jJRcVqRthh54JznYlh X-Received: by 2002:a17:903:1d1:b0:154:61ec:749b with SMTP id e17-20020a17090301d100b0015461ec749bmr16383871plh.52.1649374853904; Thu, 07 Apr 2022 16:40:53 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1649374853; cv=none; d=google.com; s=arc-20160816; b=DbUseVx2Cl5naGCLq+oYj/4QsuL9X6vsFNZUxWAR+fR4/e2WjYRGeFe8JtlYDFJ4UY EUJI3BW44e7wr/2HCZH63qsp8ZR8pYpmENWUCcc8c06crgTf3fdc3kIlYCN9NtOENdug jrUWuBc9v2ytKXE9WKxQZ9WuMz+tEr6SjgEoXT7DcvpAIUCGlJ4r6DEBbXBoK6eltTlk bR/3LzImHloaTgORiYozXh63A8UpDc6hvpJwpS8YMRczz/qot/RWvH8EBwzLB0p51DmO AxQzh83G3Qo48Xs5/p+rBKaBC7Ea0L44Sx+pBFI+/K43lG1O/vfUrv0kdDrEGDd3Ami+ 64rA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:to:from:dkim-signature; bh=G8jTCYSvmTaRB6yRTu6+S7h7wjY91OImblbHHsvJO1g=; b=O5UnKbKG21PoWGFJx15P7QTyFV1sSBgPt5wkxyPj/fXWjijru/pFdy/YtIXLWyS+B0 5cLXqe57bUDjKysjf3zEOUFIkmOLHbAgcMCNHaGV3dJvq3DmLajEd6NpIJtU3AoWfb+E MgmmfbK6dgJdY3i8EpOURsIOj70BO7oj0zYI54lXTDtq8jyfXBqW289l2QakCuXUGkqn IfWNQs5cKlPDFxvjEvj85hU9sIXJ/YwNDkcCmQw3mUConE59MexEEU6jqVWOsHLdnJvQ W7KgpVYq64/lW65egsUQmgfXIV4wQqonTbpvXNXz4BYkAhCHRYWrV+3Uw9XMmH6oruaF Baig== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=NVBg7gVT; spf=pass (google.com: domain of mptcp+bounces-4662-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-4662-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from sjc.edge.kernel.org (sjc.edge.kernel.org. [147.75.69.165]) by mx.google.com with ESMTPS id rm13-20020a17090b3ecd00b001cabb2abf33si3331915pjb.72.2022.04.07.16.40.53 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 07 Apr 2022 16:40:53 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-4662-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) client-ip=147.75.69.165; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=NVBg7gVT; spf=pass (google.com: domain of mptcp+bounces-4662-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-4662-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sjc.edge.kernel.org (Postfix) with ESMTPS id 7B90C3E0EC7 for ; Thu, 7 Apr 2022 23:40:53 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id A885E3D7D; Thu, 7 Apr 2022 23:40:43 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) (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 545583D76 for ; Thu, 7 Apr 2022 23:40:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1649374842; x=1680910842; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=tfzehsJBmGdChZMPc0RL5lKqpr+R150YHyu/cK7Z6gI=; b=NVBg7gVTnsP3/lkfG7d15V3oLwtvJng9TiFaSAc1zP1Y7Bn/4ethpTim RPG2r/ZShVRn5aaGjmhjAfXm0+XksSzF4tiTvicTfGKJAwLk6FLeZv0z0 urnI403KxjUPWAD6VZYJ8qQOL17BYcrLHyOXCIwr7kjIFgLCkGxsfoCVC czFpeHDmQvRU1FEAuqmW34BqUTXCgz0pzYvT1S3VZVl2sR4962HT9EcrE 3WJTz4ZUECy+pEavAX3v0vstbmLuAtRDcEvDNLzZG3a2I9UXe4DWiPpIH sI1eZOF/MNCu57L9oVWpWATIePxA3fssH7ZrB+uM6FZiZEfmRuZmymrOF g==; X-IronPort-AV: E=McAfee;i="6400,9594,10310"; a="259062021" X-IronPort-AV: E=Sophos;i="5.90,242,1643702400"; d="scan'208";a="259062021" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 Apr 2022 16:40:37 -0700 X-IronPort-AV: E=Sophos;i="5.90,242,1643702400"; d="scan'208";a="571270974" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 Apr 2022 16:40:36 -0700 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v8 13/14] selftests: mptcp: create listeners to receive MPJs Date: Thu, 7 Apr 2022 19:40:28 -0400 Message-Id: <20220407234029.1774481-14-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220407234029.1774481-1-kishen.maloor@intel.com> References: <20220407234029.1774481-1-kishen.maloor@intel.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This change updates the "pm_nl_ctl" testing sample with a "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. Signed-off-by: Kishen Maloor Reviewed-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.31.1 From nobody Wed May 8 20:34:35 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:1788:b0:4ac:5e5b:1ad1 with SMTP id y8csp475163piq; Thu, 7 Apr 2022 16:40:55 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyyXA/LL7QgpI+zmDQDbjB4WXaFeyMYYJEjyo4FE9AtV5rRvTixyP6R+ZgUTtc7kTczvwgM X-Received: by 2002:a17:902:ab0f:b0:156:7ed7:a02b with SMTP id ik15-20020a170902ab0f00b001567ed7a02bmr16467987plb.54.1649374855068; Thu, 07 Apr 2022 16:40:55 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1649374855; cv=none; d=google.com; s=arc-20160816; b=PGi/TIV7D8AvSSo3AyaDmJU8KAi8v7Wcetik1dvtd5Vxj+lXBJgX+gkks8osAmEUY1 V8zd7ZAfH3VWk+NDlQCYCaVcIAx1yfb2iDlJ0REc9GvBAI7Ek2uFgj7nJWA+0N7ItCQH USPrEMDx3MiJU5u8KEvT03pQz0elaIydKPzBlwSuCBlHX3DdznQ+Tt2Vcj3BA6SDOfKC fTtx2jmZkUKcQZ7Ueu63M5vS3ARFo4t8PQo66UYXpv/7WQj+qKWyaoZPM737lgc/25W5 0+yGZ5AWHlQQ/7nYuq0LQaP8ZiSzyOyrTXjnJjZofmKc7DfObD5q3MLewd9pJCvCJ0WM oIxQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:to:from:dkim-signature; bh=6DMd0s1uVjdG6GB3LPiY+lWLWTreyp4e4BzNecchB9A=; b=fBfs4qYNGk7aLPnkJY3kzyqRHSdnliy7WTQT6G/0lTaIXNLxapeKoPjDBmN392yMK9 JGqntEjUZpuxsHGef+nKCxgT4qjnP6NQyVGFcijgTWlrKtl/dJyOvmuvHeDSQKUMxEe0 rmGMdOiZqGSIVmc/gDCqEWTDRFs81Ptlx0Q70kjUGb9ARtnNjDJGQg/8xbiH2fpvJdf1 9xFTVh2Bj1I1BMqNJawtiNbJ3F/cjVvjz9nax4Qt9w5TJ6qsAHlf7VHTTuOUCvRiPvnd Z8wXEvbRIpJg1xO45awOdXBY8loLGl9eOMGi35npujJyEI3V+xdBb770jyBA64ve+30V CRzg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=MzsbQJ40; spf=pass (google.com: domain of mptcp+bounces-4663-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-4663-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from sjc.edge.kernel.org (sjc.edge.kernel.org. [147.75.69.165]) by mx.google.com with ESMTPS id o7-20020a637307000000b0038226cca535si19629259pgc.793.2022.04.07.16.40.54 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 07 Apr 2022 16:40:55 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-4663-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) client-ip=147.75.69.165; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=MzsbQJ40; spf=pass (google.com: domain of mptcp+bounces-4663-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-4663-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by sjc.edge.kernel.org (Postfix) with ESMTPS id 9D91D3E1027 for ; Thu, 7 Apr 2022 23:40:54 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id DCB1B3D76; Thu, 7 Apr 2022 23:40:44 +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 DA48F3D7A for ; Thu, 7 Apr 2022 23:40:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1649374842; x=1680910842; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=xixavrOsJ6p/bpiJ3v73HbDTSkgWLluBSstFIZyzxFM=; b=MzsbQJ40PuIssYrBmOMY3fy0xfAdX5KwE4Kb3POGlVhFaUbIHonELJC3 SCZAuDWpTpDYJlDwmsSyfNCNvNDVUIs7dSIY4kMoPdQcj/CG75xut6tlP LvtYZ8Hmwgr+398g6FIHkdDXnbcJV0MQC+2qDX+us7puWDnoWO273u9v9 jhVDrL5/bQajlxQJmYURkuT/4XI/l6TRMapWIpixYE5p+DRJuhcDFvCif tojxLCe6bm6jZAGb6ElzibSpLllBYX4DL2ojTIJTtm6xCZ4sjvQLBbT2P ew+tBY7G5yV3iSJxsEeXtqC9zgTLmcVeHV0kAroZu+yMA/fxcyaH7RFRH w==; X-IronPort-AV: E=McAfee;i="6400,9594,10310"; a="248994265" X-IronPort-AV: E=Sophos;i="5.90,242,1643702400"; d="scan'208";a="248994265" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 Apr 2022 16:40:37 -0700 X-IronPort-AV: E=Sophos;i="5.90,242,1643702400"; d="scan'208";a="571270977" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 Apr 2022 16:40:36 -0700 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v8 14/14] selftests: mptcp: functional tests for the userspace PM type Date: Thu, 7 Apr 2022 19:40:29 -0400 Message-Id: <20220407234029.1774481-15-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220407234029.1774481-1-kishen.maloor@intel.com> References: <20220407234029.1774481-1-kishen.maloor@intel.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This change adds a selftest script that performs a comprehensive behavioral/functional test of all userspace PM capabilities by exercising all the newly added APIs and changes to support said capabilities. Signed-off-by: Kishen Maloor Reviewed-by: Mat Martineau --- .../selftests/net/mptcp/userspace_pm.sh | 771 ++++++++++++++++++ 1 file changed, 771 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..4f5057ac99bc --- /dev/null +++ b/tools/testing/selftests/net/mptcp/userspace_pm.sh @@ -0,0 +1,771 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0 + +ip -Version > /dev/null 2>&1 +if [ $? -ne 0 ];then + echo "SKIP: Cannot not run test without ip tool" + exit 1 +fi + +ANNOUNCED=3D6 # MPTCP_EVENT_ANNOUNCED +REMOVED=3D7 # MPTCP_EVENT_REMOVED +SUB_ESTABLISHED=3D10 # MPTCP_EVENT_SUB_ESTABLISHED +SUB_CLOSED=3D11 # MPTCP_EVENT_SUB_CLOSED + +AF_INET=3D2 +AF_INET6=3D10 + +evts_pid=3D0 +client4_pid=3D0 +server4_pid=3D0 +client6_pid=3D0 +server6_pid=3D0 +client4_token=3D"" +server4_token=3D"" +client6_token=3D"" +server6_token=3D"" +client4_port=3D0; +client6_port=3D0; +app4_port=3D50002 +new4_port=3D50003 +app6_port=3D50004 +client_addr_id=3D${RANDOM:0:2} +server_addr_id=3D${RANDOM:0:2} + +sec=3D$(date +%s) +rndh=3D$(printf %x "$sec")-$(mktemp -u XXXXXX) +ns1=3D"ns1-$rndh" +ns2=3D"ns2-$rndh" + +cleanup() +{ + echo "cleanup" + + # Terminate the MPTCP connection and related processes + kill -SIGUSR1 $client4_pid > /dev/null 2>&1 + kill $server4_pid > /dev/null 2>&1 + kill -SIGUSR1 $client6_pid > /dev/null 2>&1 + kill $server6_pid > /dev/null 2>&1 + + kill $evts_pid > /dev/null 2>&1 + + local netns + for netns in "$ns1" "$ns2" ;do + ip netns del "$netns" + done +} + +trap cleanup EXIT + +# Create and configure network namespaces for testing +for i in "$ns1" "$ns2" ;do + ip netns add "$i" || exit 1 + ip -net "$i" link set lo up + ip netns exec "$i" sysctl -q net.mptcp.enabled=3D1 + ip netns exec "$i" sysctl -q net.mptcp.pm_type=3D1 +done + +# "$ns1" ns2 +# ns1eth2 ns2eth1 + +ip link add ns1eth2 netns "$ns1" type veth peer name ns2eth1 netns "$ns2" + +# Add IPv4/v6 addresses to the namespaces +ip -net "$ns1" addr add 10.0.1.1/24 dev ns1eth2 +ip -net "$ns1" addr add 10.0.2.1/24 dev ns1eth2 +ip -net "$ns1" addr add dead:beef:1::1/64 dev ns1eth2 nodad +ip -net "$ns1" addr add dead:beef:2::1/64 dev ns1eth2 nodad +ip -net "$ns1" link set ns1eth2 up + +ip -net "$ns2" addr add 10.0.1.2/24 dev ns2eth1 +ip -net "$ns2" addr add 10.0.2.2/24 dev ns2eth1 +ip -net "$ns2" addr add dead:beef:1::2/64 dev ns2eth1 nodad +ip -net "$ns2" addr add dead:beef:2::2/64 dev ns2eth1 nodad +ip -net "$ns2" link set ns2eth1 up + +printf "Created network namespaces ns1, ns2 \t\t\t[OK]\n" + +make_file() +{ + # Store a chunk of data in a file to transmit over an MPTCP connection + local name=3D$1 + local ksize=3D1 + + dd if=3D/dev/urandom of=3D"$name" bs=3D1024 count=3D$ksize 2> /dev/null + echo -e "\nMPTCP_TEST_FILE_END_MARKER" >> "$name" +} + +make_connection() +{ + local file + 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.1 + + # 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.1 + + # Run the client, transfer $file and stay connected to the server + # to conduct tests + ip netns exec "$ns2" \ + ./mptcp_connect -s MPTCP -w 300 -m sendfile -p $app_port $connect_addr\ + 2>&1 > /dev/null < "$file" & + local client_pid=3D$! + sleep 0.1 + + # Capture client/server attributes from MPTCP connection netlink events + kill $client_evts_pid + + local client_token + local client_port + local client_serverside + local server_token + local server_serverside + + client_token=3D$(sed -n 's/.*\(token:\)\([[:digit:]]*\).*$/\2/p;q' "$clie= nt_evts") + client_port=3D$(sed -n 's/.*\(sport:\)\([[:digit:]]*\).*$/\2/p;q' "$clien= t_evts") + client_serverside=3D$(sed -n 's/.*\(server_side:\)\([[:digit:]]*\).*$/\2/= p;q'\ + "$client_evts") + + kill $server_evts_pid + server_token=3D$(sed -n 's/.*\(token:\)\([[:digit:]]*\).*$/\2/p;q' "$serv= er_evts") + server_serverside=3D$(sed -n 's/.*\(server_side:\)\([[:digit:]]*\).*$/\2/= p;q'\ + "$server_evts") + + rm -f "$client_evts" "$server_evts" "$file" + + if [ "$client_token" !=3D "" ] && [ "$server_token" !=3D "" ] && [ "$clie= nt_serverside" =3D 0 ] && + [ "$server_serverside" =3D 1 ] + then + printf "Established IP%s MPTCP Connection ns2 =3D> ns1 \t\t[OK]\n" $i= s_v6 + else + exit 1 + fi + + if [ "$is_v6" =3D "v6" ] + then + client6_token=3D$client_token + server6_token=3D$server_token + client6_port=3D$client_port + client6_pid=3D$client_pid + server6_pid=3D$server_pid + else + client4_token=3D$client_token + server4_token=3D$server_token + client4_port=3D$client_port + client4_pid=3D$client_pid + server4_pid=3D$server_pid + fi +} + +verify_announce_event() +{ + local evt=3D$1 + local e_type=3D$2 + local e_token=3D$3 + local e_addr=3D$4 + local e_id=3D$5 + local e_dport=3D$6 + local e_af=3D$7 + local type + local token + local addr + local dport + local id + + type=3D$(sed -n 's/.*\(type:\)\([[:digit:]]*\).*$/\2/p;q' "$evt") + token=3D$(sed -n 's/.*\(token:\)\([[:digit:]]*\).*$/\2/p;q' "$evt") + if [ "$e_af" =3D "v6" ] + then + addr=3D$(sed -n 's/.*\(daddr6:\)\([0-9a-f:.]*\).*$/\2/p;q' "$evt") + else + addr=3D$(sed -n 's/.*\(daddr4:\)\([0-9.]*\).*$/\2/p;q' "$evt") + fi + dport=3D$(sed -n 's/.*\(dport:\)\([[:digit:]]*\).*$/\2/p;q' "$evt") + id=3D$(sed -n 's/.*\(rem_id:\)\([[:digit:]]*\).*$/\2/p;q' "$evt") + if [ "$type" =3D "$e_type" ] && [ "$token" =3D "$e_token" ] && + [ "$addr" =3D "$e_addr" ] && [ "$dport" =3D "$e_dport" ] && + [ "$id" =3D "$e_id" ] + then + printf "[OK]\n" + return 0 + fi + printf "[FAIL]\n" + exit 1 +} + +test_announce() +{ + local evts + evts=3D$(mktemp) + # Capture events on the network namespace running the server + :>"$evts" + ip netns exec "$ns1" ./pm_nl_ctl events >> "$evts" 2>&1 & + evts_pid=3D$! + sleep 0.1 + + # ADD_ADDR using an invalid token should result in no action + local invalid_token=3D$(( client4_token - 1)) + ip netns exec "$ns2" ./pm_nl_ctl ann 10.0.2.2 token $invalid_token id\ + $client_addr_id dev ns2eth1 > /dev/null 2>&1 + + local type + type=3D$(sed -n 's/.*\(type:\)\([[:digit:]]*\).*$/\2/p;q' "$evts") + printf "ADD_ADDR 10.0.2.2 (ns2) =3D> ns1, invalid token \t\t" + if [ "$type" =3D "" ] + then + printf "[OK]\n" + else + printf "[FAIL]\n" + exit 1 + fi + + # ADD_ADDR from the client to server machine reusing the subflow port + :>"$evts" + ip netns exec "$ns2"\ + ./pm_nl_ctl ann 10.0.2.2 token "$client4_token" id $client_addr_id dev\ + ns2eth1 > /dev/null 2>&1 + printf "ADD_ADDR id:%d 10.0.2.2 (ns2) =3D> ns1, reuse port \t\t" $client_= addr_id + sleep 0.1 + verify_announce_event "$evts" "$ANNOUNCED" "$server4_token" "10.0.2.2" "$= client_addr_id"\ + "$client4_port" + + # ADD_ADDR6 from the client to server machine reusing the subflow port + :>"$evts" + ip netns exec "$ns2" ./pm_nl_ctl ann\ + dead:beef:2::2 token "$client6_token" id $client_addr_id dev ns2eth1 >= /dev/null 2>&1 + printf "ADD_ADDR6 id:%d dead:beef:2::2 (ns2) =3D> ns1, reuse port\t\t" $c= lient_addr_id + sleep 0.1 + verify_announce_event "$evts" "$ANNOUNCED" "$server6_token" "dead:beef:2:= :2"\ + "$client_addr_id" "$client6_port" "v6" + + # ADD_ADDR from the client to server machine using a new port + :>"$evts" + client_addr_id=3D$((client_addr_id+1)) + ip netns exec "$ns2" ./pm_nl_ctl ann 10.0.2.2 token "$client4_token" id\ + $client_addr_id dev ns2eth1 port $new4_port > /dev/null 2>&1 + printf "ADD_ADDR id:%d 10.0.2.2 (ns2) =3D> ns1, new port \t\t\t" $client_= addr_id + sleep 0.1 + verify_announce_event "$evts" "$ANNOUNCED" "$server4_token" "10.0.2.2"\ + "$client_addr_id" "$new4_port" + + kill $evts_pid + + # Capture events on the network namespace running the client + :>"$evts" + ip netns exec "$ns2" ./pm_nl_ctl events >> "$evts" 2>&1 & + evts_pid=3D$! + sleep 0.1 + + # ADD_ADDR from the server to client machine reusing the subflow port + ip netns exec "$ns1" ./pm_nl_ctl ann 10.0.2.1 token "$server4_token" id\ + $server_addr_id dev ns1eth2 > /dev/null 2>&1 + printf "ADD_ADDR id:%d 10.0.2.1 (ns1) =3D> ns2, reuse port \t\t" $server_= addr_id + sleep 0.1 + verify_announce_event "$evts" "$ANNOUNCED" "$client4_token" "10.0.2.1"\ + "$server_addr_id" "$app4_port" + + # ADD_ADDR6 from the server to client machine reusing the subflow port + :>"$evts" + ip netns exec "$ns1" ./pm_nl_ctl ann dead:beef:2::1 token "$server6_token= " id\ + $server_addr_id dev ns1eth2 > /dev/null 2>&1 + printf "ADD_ADDR6 id:%d dead:beef:2::1 (ns1) =3D> ns2, reuse port\t\t" $s= erver_addr_id + sleep 0.1 + verify_announce_event "$evts" "$ANNOUNCED" "$client6_token" "dead:beef:2:= :1"\ + "$server_addr_id" "$app6_port" "v6" + + # ADD_ADDR from the server to client machine using a new port + :>"$evts" + server_addr_id=3D$((server_addr_id+1)) + ip netns exec "$ns1" ./pm_nl_ctl ann 10.0.2.1 token "$server4_token" id\ + $server_addr_id dev ns1eth2 port $new4_port > /dev/null 2>&1 + printf "ADD_ADDR id:%d 10.0.2.1 (ns1) =3D> ns2, new port \t\t\t" $server_= addr_id + sleep 0.1 + verify_announce_event "$evts" "$ANNOUNCED" "$client4_token" "10.0.2.1"\ + "$server_addr_id" "$new4_port" + + kill $evts_pid + rm -f "$evts" +} + +verify_remove_event() +{ + local evt=3D$1 + local e_type=3D$2 + local e_token=3D$3 + local e_id=3D$4 + local type + local token + local id + + type=3D$(sed -n 's/.*\(type:\)\([[:digit:]]*\).*$/\2/p;q' "$evt") + token=3D$(sed -n 's/.*\(token:\)\([[:digit:]]*\).*$/\2/p;q' "$evt") + id=3D$(sed -n 's/.*\(rem_id:\)\([[:digit:]]*\).*$/\2/p;q' "$evt") + if [ "$type" =3D "$e_type" ] && [ "$token" =3D "$e_token" ] && + [ "$id" =3D "$e_id" ] + then + printf "[OK]\n" + return 0 + fi + printf "[FAIL]\n" + exit 1 +} + +test_remove() +{ + local evts + evts=3D$(mktemp) + + # Capture events on the network namespace running the server + :>"$evts" + ip netns exec "$ns1" ./pm_nl_ctl events >> "$evts" 2>&1 & + evts_pid=3D$! + sleep 0.1 + + # RM_ADDR using an invalid token should result in no action + local invalid_token=3D$(( client4_token - 1 )) + ip netns exec "$ns2" ./pm_nl_ctl rem token $invalid_token id\ + $client_addr_id > /dev/null 2>&1 + printf "RM_ADDR id:%d ns2 =3D> ns1, invalid token \t"\ + $client_addr_id + local type + type=3D$(sed -n 's/.*\(type:\)\([[:digit:]]*\).*$/\2/p;q' "$evts") + if [ "$type" =3D "" ] + then + printf "[OK]\n" + else + printf "[FAIL]\n" + fi + + # RM_ADDR using an invalid addr id should result in no action + local invalid_id=3D$(( client_addr_id + 1 )) + ip netns exec "$ns2" ./pm_nl_ctl rem token "$client4_token" id\ + $invalid_id > /dev/null 2>&1 + printf "RM_ADDR id:%d ns2 =3D> ns1, invalid id \t"\ + $invalid_id + type=3D$(sed -n 's/.*\(type:\)\([[:digit:]]*\).*$/\2/p;q' "$evts") + if [ "$type" =3D "" ] + then + printf "[OK]\n" + else + printf "[FAIL]\n" + fi + + # RM_ADDR from the client to server machine + :>"$evts" + ip netns exec "$ns2" ./pm_nl_ctl rem token "$client4_token" id\ + $client_addr_id > /dev/null 2>&1 + printf "RM_ADDR id:%d ns2 =3D> ns1 \t"\ + $client_addr_id + sleep 0.1 + verify_remove_event "$evts" "$REMOVED" "$server4_token" "$client_addr_id" + + # RM_ADDR from the client to server machine + :>"$evts" + client_addr_id=3D$(( client_addr_id - 1 )) + ip netns exec "$ns2" ./pm_nl_ctl rem token "$client4_token" id\ + $client_addr_id > /dev/null 2>&1 + printf "RM_ADDR id:%d ns2 =3D> ns1 \t"\ + $client_addr_id + sleep 0.1 + verify_remove_event "$evts" "$REMOVED" "$server4_token" "$client_addr_id" + + # RM_ADDR6 from the client to server machine + :>"$evts" + ip netns exec "$ns2" ./pm_nl_ctl rem token "$client6_token" id\ + $client_addr_id > /dev/null 2>&1 + printf "RM_ADDR6 id:%d ns2 =3D> ns1 \t"\ + $client_addr_id + sleep 0.1 + verify_remove_event "$evts" "$REMOVED" "$server6_token" "$client_addr_id" + + kill $evts_pid + + # Capture events on the network namespace running the client + :>"$evts" + ip netns exec "$ns2" ./pm_nl_ctl events >> "$evts" 2>&1 & + evts_pid=3D$! + sleep 0.1 + + # RM_ADDR from the server to client machine + ip netns exec "$ns1" ./pm_nl_ctl rem token "$server4_token" id\ + $server_addr_id > /dev/null 2>&1 + printf "RM_ADDR id:%d ns1 =3D> ns2 \t"\ + $server_addr_id + sleep 0.1 + verify_remove_event "$evts" "$REMOVED" "$client4_token" "$server_addr_id" + + # RM_ADDR from the server to client machine + :>"$evts" + server_addr_id=3D$(( server_addr_id - 1 )) + ip netns exec "$ns1" ./pm_nl_ctl rem token "$server4_token" id\ + $server_addr_id > /dev/null 2>&1 + printf "RM_ADDR id:%d ns1 =3D> ns2 \t" $se= rver_addr_id + sleep 0.1 + verify_remove_event "$evts" "$REMOVED" "$client4_token" "$server_addr_id" + + # RM_ADDR6 from the server to client machine + :>"$evts" + ip netns exec "$ns1" ./pm_nl_ctl rem token "$server6_token" id\ + $server_addr_id > /dev/null 2>&1 + printf "RM_ADDR6 id:%d ns1 =3D> ns2 \t" $se= rver_addr_id + sleep 0.1 + verify_remove_event "$evts" "$REMOVED" "$client6_token" "$server_addr_id" + + kill $evts_pid + rm -f "$evts" +} + +verify_subflow_events() +{ + local evt=3D$1 + local e_type=3D$2 + local e_token=3D$3 + local e_family=3D$4 + local e_saddr=3D$5 + local e_daddr=3D$6 + local e_dport=3D$7 + local e_locid=3D$8 + local e_remid=3D$9 + shift 2 + local e_from=3D$8 + local e_to=3D$9 + 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 + printf "CREATE_SUBFLOW6 %s (%s) =3D> %s (%s) "\ + "$e_saddr" "$e_from" "$e_daddr" "$e_to" + else + printf "CREATE_SUBFLOW %s (%s) =3D> %s (%s) \t"\ + "$e_saddr" "$e_from" "$e_daddr" "$e_to" + fi + else + if [ "$e_family" =3D "$AF_INET6" ] + then + printf "DESTROY_SUBFLOW6 %s (%s) =3D> %s (%s) "\ + "$e_saddr" "$e_from" "$e_daddr" "$e_to" + else + printf "DESTROY_SUBFLOW %s (%s) =3D> %s (%s) \t"\ + "$e_saddr" "$e_from" "$e_daddr" "$e_to" + fi + fi + + type=3D$(sed -n 's/.*\(type:\)\([[:digit:]]*\).*$/\2/p;q' "$evt") + token=3D$(sed -n 's/.*\(token:\)\([[:digit:]]*\).*$/\2/p;q' "$evt") + family=3D$(sed -n 's/.*\(family:\)\([[:digit:]]*\).*$/\2/p;q' "$evt") + dport=3D$(sed -n 's/.*\(dport:\)\([[:digit:]]*\).*$/\2/p;q' "$evt") + locid=3D$(sed -n 's/.*\(loc_id:\)\([[:digit:]]*\).*$/\2/p;q' "$evt") + remid=3D$(sed -n 's/.*\(rem_id:\)\([[:digit:]]*\).*$/\2/p;q' "$evt") + if [ "$family" =3D "$AF_INET6" ] + then + saddr=3D$(sed -n 's/.*\(saddr6:\)\([0-9a-f:.]*\).*$/\2/p;q' "$evt") + daddr=3D$(sed -n 's/.*\(daddr6:\)\([0-9a-f:.]*\).*$/\2/p;q' "$evt") + else + saddr=3D$(sed -n 's/.*\(saddr4:\)\([0-9.]*\).*$/\2/p;q' "$evt") + daddr=3D$(sed -n 's/.*\(daddr4:\)\([0-9.]*\).*$/\2/p;q' "$evt") + fi + + if [ "$type" =3D "$e_type" ] && [ "$token" =3D "$e_token" ] && + [ "$daddr" =3D "$e_daddr" ] && [ "$e_dport" =3D "$dport" ] && + [ "$family" =3D "$e_family" ] && [ "$saddr" =3D "$e_saddr" ] && + [ "$e_locid" =3D "$locid" ] && [ "$e_remid" =3D "$remid" ] + then + printf "[OK]\n" + return 0 + fi + printf "[FAIL]\n" + exit 1 +} + +test_subflows() +{ + local evts + evts=3D$(mktemp) + # Capture events on the network namespace running the server + :>"$evts" + ip netns exec "$ns1" ./pm_nl_ctl events >> "$evts" 2>&1 & + evts_pid=3D$! + sleep 0.1 + + # 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.1 + + # CREATE_SUBFLOW from server to client machine + :>"$evts" + ip netns exec "$ns1" ./pm_nl_ctl csf lip 10.0.2.1 lid 23 rip 10.0.2.2\ + rport "$client4_port" token "$server4_token" > /dev/null 2>&1 + sleep 0.1 + verify_subflow_events "$evts" "$SUB_ESTABLISHED" "$server4_token" "$AF_IN= ET" "10.0.2.1"\ + "10.0.2.2" "$client4_port" "23" "$client_addr_id" "ns1" "ns2" + + # Delete the listener from the client ns, if one was created + kill $listener_pid > /dev/null 2>&1 + + local sport + sport=3D$(sed -n 's/.*\(sport:\)\([[:digit:]]*\).*$/\2/p;q' "$evts") + + # DESTROY_SUBFLOW from server to client machine + :>"$evts" + ip netns exec "$ns1" ./pm_nl_ctl dsf lip 10.0.2.1 lport "$sport" rip 10.0= .2.2 rport\ + "$client4_port" token "$server4_token" > /dev/null 2>&1 + sleep 0.1 + verify_subflow_events "$evts" "$SUB_CLOSED" "$server4_token" "$AF_INET" "= 10.0.2.1"\ + "10.0.2.2" "$client4_port" "23" "$client_addr_id" "ns1" "ns2" + + # RM_ADDR from client to server machine + ip netns exec "$ns2" ./pm_nl_ctl rem id $client_addr_id token\ + "$client4_token" > /dev/null 2>&1 + sleep 0.1 + + # 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.1 + + # CREATE_SUBFLOW6 from server to client machine + :>"$evts" + ip netns exec "$ns1" ./pm_nl_ctl csf lip dead:beef:2::1 lid 23 rip\ + dead:beef:2::2 rport "$client6_port" token "$server6_token" > /dev/nul= l 2>&1 + sleep 0.1 + verify_subflow_events "$evts" "$SUB_ESTABLISHED" "$server6_token" "$AF_IN= ET6"\ + "dead:beef:2::1" "dead:beef:2::2" "$client6_port" "23"\ + "$client_addr_id" "ns1" "ns2" + + # Delete the listener from the client ns, if one was created + kill $listener_pid > /dev/null 2>&1 + + sport=3D$(sed -n 's/.*\(sport:\)\([[:digit:]]*\).*$/\2/p;q' "$evts") + + # DESTROY_SUBFLOW6 from server to client machine + :>"$evts" + ip netns exec "$ns1" ./pm_nl_ctl dsf lip dead:beef:2::1 lport "$sport" ri= p\ + dead:beef:2::2 rport "$client6_port" token "$server6_token" > /dev/nul= l 2>&1 + sleep 0.1 + verify_subflow_events "$evts" "$SUB_CLOSED" "$server6_token" "$AF_INET6"\ + "dead:beef:2::1" "dead:beef:2::2" "$client6_port" "23"\ + "$client_addr_id" "ns1" "ns2" + + # RM_ADDR from client to server machine + ip netns exec "$ns2" ./pm_nl_ctl rem id $client_addr_id token\ + "$client6_token" > /dev/null 2>&1 + sleep 0.1 + + # 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.1 + + # CREATE_SUBFLOW from server to client machine + :>"$evts" + ip netns exec "$ns1" ./pm_nl_ctl csf lip 10.0.2.1 lid 23 rip 10.0.2.2 rpo= rt\ + $new4_port token "$server4_token" > /dev/null 2>&1 + sleep 0.1 + verify_subflow_events "$evts" "$SUB_ESTABLISHED" "$server4_token" "$AF_IN= ET"\ + "10.0.2.1" "10.0.2.2" "$new4_port" "23"\ + "$client_addr_id" "ns1" "ns2" + + # Delete the listener from the client ns, if one was created + kill $listener_pid > /dev/null 2>&1 + + sport=3D$(sed -n 's/.*\(sport:\)\([[:digit:]]*\).*$/\2/p;q' "$evts") + + # DESTROY_SUBFLOW from server to client machine + :>"$evts" + ip netns exec "$ns1" ./pm_nl_ctl dsf lip 10.0.2.1 lport "$sport" rip 10.0= .2.2 rport\ + $new4_port token "$server4_token" > /dev/null 2>&1 + sleep 0.1 + verify_subflow_events "$evts" "$SUB_CLOSED" "$server4_token" "$AF_INET" "= 10.0.2.1"\ + "10.0.2.2" "$new4_port" "23" "$client_addr_id" "ns1" "ns2" + + # RM_ADDR from client to server machine + ip netns exec "$ns2" ./pm_nl_ctl rem id $client_addr_id token\ + "$client4_token" > /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.1 + + # 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.1 + + # CREATE_SUBFLOW from client to server machine + :>"$evts" + ip netns exec "$ns2" ./pm_nl_ctl csf lip 10.0.2.2 lid 23 rip 10.0.2.1 rpo= rt\ + $app4_port token "$client4_token" > /dev/null 2>&1 + sleep 0.1 + verify_subflow_events "$evts" "$SUB_ESTABLISHED" "$client4_token" "$AF_IN= ET" "10.0.2.2"\ + "10.0.2.1" "$app4_port" "23" "$server_addr_id" "ns2" "ns1" + + # Delete the listener from the server ns, if one was created + kill $listener_pid> /dev/null 2>&1 + + sport=3D$(sed -n 's/.*\(sport:\)\([[:digit:]]*\).*$/\2/p;q' "$evts") + + # DESTROY_SUBFLOW from client to server machine + :>"$evts" + ip netns exec "$ns2" ./pm_nl_ctl dsf lip 10.0.2.2 lport "$sport" rip 10.0= .2.1 rport\ + $app4_port token "$client4_token" > /dev/null 2>&1 + sleep 0.1 + verify_subflow_events "$evts" "$SUB_CLOSED" "$client4_token" "$AF_INET" "= 10.0.2.2"\ + "10.0.2.1" "$app4_port" "23" "$server_addr_id" "ns2" "ns1" + + # RM_ADDR from server to client machine + ip netns exec "$ns1" ./pm_nl_ctl rem id $server_addr_id token\ + "$server4_token" > /dev/null 2>&1 + sleep 0.1 + + # 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.1 + + # CREATE_SUBFLOW6 from client to server machine + :>"$evts" + ip netns exec "$ns2" ./pm_nl_ctl csf lip dead:beef:2::2 lid 23 rip\ + dead:beef:2::1 rport $app6_port token "$client6_token" > /dev/null 2>&1 + sleep 0.1 + 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 -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.1 + verify_subflow_events "$evts" "$SUB_CLOSED" "$client6_token" "$AF_INET6" = "dead:beef:2::2"\ + "dead:beef:2::1" "$app6_port" "23" "$server_addr_id" "ns2" "ns1" + + # RM_ADDR6 from server to client machine + ip netns exec "$ns1" ./pm_nl_ctl rem id $server_addr_id token\ + "$server6_token" > /dev/null 2>&1 + sleep 0.1 + + # 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.1 + + # CREATE_SUBFLOW from client to server machine + :>"$evts" + ip netns exec "$ns2" ./pm_nl_ctl csf lip 10.0.2.2 lid 23 rip 10.0.2.1 rpo= rt\ + $new4_port token "$client4_token" > /dev/null 2>&1 + sleep 0.1 + verify_subflow_events "$evts" "$SUB_ESTABLISHED" "$client4_token" "$AF_IN= ET"\ + "10.0.2.2" "10.0.2.1" "$new4_port" "23" "$server_addr_id" "ns2" "= ns1" + + # Delete the listener from the server ns, if one was created + kill $listener_pid > /dev/null 2>&1 + + sport=3D$(sed -n 's/.*\(sport:\)\([[:digit:]]*\).*$/\2/p;q' "$evts") + + # DESTROY_SUBFLOW from client to server machine + :>"$evts" + ip netns exec "$ns2" ./pm_nl_ctl dsf lip 10.0.2.2 lport "$sport" rip 10.0= .2.1 rport\ + $new4_port token "$client4_token" > /dev/null 2>&1 + sleep 0.1 + verify_subflow_events "$evts" "$SUB_CLOSED" "$client4_token" "$AF_INET" "= 10.0.2.2"\ + "10.0.2.1" "$new4_port" "23" "$server_addr_id" "ns2" "ns1" + + # RM_ADDR from server to client machine + ip netns exec "$ns1" ./pm_nl_ctl rem id $server_addr_id token\ + "$server4_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.31.1