From nobody Mon May 6 03:15:49 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6638:2248:0:0:0:0 with SMTP id m8csp375943jas; Thu, 27 Jan 2022 16:39:04 -0800 (PST) X-Google-Smtp-Source: ABdhPJx9MXDtFAVbxD1M7Gsd5QoXecotHLlW3p+uGi9UeL93kJiq3xJWSz17FD0gfZXmYjsqe1BS X-Received: by 2002:a62:15c3:: with SMTP id 186mr5380858pfv.59.1643330344026; Thu, 27 Jan 2022 16:39:04 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1643330344; cv=none; d=google.com; s=arc-20160816; b=mM86CjrSb18248DBzSaGEAW7o7urZ8/Ac4YKa0CVuDqywhARhPztyC71+20jBaaka3 KRD3ZHM1B5U6tmqDrRckntB2CDJ5lU/j4tJWmPnL1sYmCC9CxnhrW+pqKxnLYHp/c86l FPwZ+WHELF/1zhf/Wq0sG6E5Gf0uIdvlrvSjLoucNtoR+XcBvFiXZjpkkjwfoT1X8ZRc 7pzOddZLQ6GiFFQ1ZxUmpp4tQauIwOiilEM4ByfwAKkVCPvYRnWBoTeIuc4sdckqv6zr Z8XZfwUWIbdBRJvGssgVi8sjgkB6cTmK/Bwpyd3i/SGAD6+xXV60nbRiV+WvN1UNfaPK pO2Q== 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=Drt2bVlFgfDXtG012i+6gGwY+3DNVWsWB7RvsUFEEjo=; b=O8MSQNu9gfgpiK7HBbXaRs78537o7dzcfHZKtuoqKaCzVDp5OlkLfEoAhxDDjuFBUb u+548pXQx23gHoQM8sOB3bG8mM+IMbLuUsGm2TktezARvsPLQGSAI22t7+8c6m+SFarM 3p6I1ub8rf0GcxvUfJU9uZorCcYfQxbAKMX0bpO7NCmCipXqtVX33LWJQFc77EsYd8+I Dhb5znw/luTaJG0byNp05NeRTnsze4uGIj7uwYfB/AfvDFmL60PYtGaQoLs2YM0LfDf6 ckFA6dQawXC7q7bjKWV0MCFPq21492YED/2/poWSrXPA+5Gn4zgfZ1yK6QGbC3dyGtcp 6nRQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=dbXqHBba; spf=pass (google.com: domain of mptcp+bounces-3353-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3353-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 q82si3837015pgq.208.2022.01.27.16.39.03 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 27 Jan 2022 16:39:04 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-3353-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=dbXqHBba; spf=pass (google.com: domain of mptcp+bounces-3353-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3353-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 AF56A3E103B for ; Fri, 28 Jan 2022 00:39:03 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id B7FD93FE3; Fri, 28 Jan 2022 00:38:51 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) (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 A72113FCE for ; Fri, 28 Jan 2022 00:38:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1643330330; x=1674866330; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=N4Wtfs10/xwhz7JQbfBy4TpK6nNT1cDJBUbKdZvQ4zw=; b=dbXqHBbasMrpmXmePzAnxQqi0PGMCHWBw/CnmKzhMUlXJzR70yXtNUpo ah5TJfessOULI9jHSRx4ajOUM2l7lgBDn1okQeOX+0MbP0R5mIAAyd+Ak 7PH5a4yTzBdBSlPFkGHZCrCyKplDNAGK1dIgZ3oPC+odBCTBHU4XyL6Ed XncgascN7VuCuSN8bX1HYQOalG04d1Sx7Ac8fPyYT58J+Wr6N1QDjiF5q N1uLh0tGZNGevLDH2rfagbyQe/POLAdy1GTUUK1Tm02Gee2cNYO42quJa Aen/T6KjtKrSnoqMfB05k8xOz0G1PlDe5/YpJf9U8u32AfVFabpUv2nEY Q==; X-IronPort-AV: E=McAfee;i="6200,9189,10239"; a="333358330" X-IronPort-AV: E=Sophos;i="5.88,322,1635231600"; d="scan'208";a="333358330" Received: from orsmga006.jf.intel.com ([10.7.209.51]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Jan 2022 16:38:42 -0800 X-IronPort-AV: E=Sophos;i="5.88,322,1635231600"; d="scan'208";a="480527106" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga006-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Jan 2022 16:38:41 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v3 01/14] mptcp: add sysctl param to limit userspace PM activity Date: Thu, 27 Jan 2022 19:38:23 -0500 Message-Id: <20220128003836.2732694-2-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220128003836.2732694-1-kishen.maloor@intel.com> References: <20220128003836.2732694-1-kishen.maloor@intel.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This change adds a new configurable param userspace_pm_local_addr_max to set a limit on the number of local addresses that may be recorded by a userspace path manager in the context of any MPTCP connection. Consequently, it also limits the # of subflows, i.e. to as many that could be established via the bounded set of local addresses. The patch also ensures that other stats inside struct mptcp_pm_data that are updated along kernel code paths exercised by userspace PMs remain untouched for userspace PM managed sockets. Signed-off-by: Kishen Maloor --- net/mptcp/ctrl.c | 17 +++++++++++++++++ net/mptcp/pm.c | 4 +++- net/mptcp/pm_netlink.c | 3 +++ net/mptcp/protocol.h | 1 + 4 files changed, 24 insertions(+), 1 deletion(-) diff --git a/net/mptcp/ctrl.c b/net/mptcp/ctrl.c index ae20b7d92e28..dffc2da6d713 100644 --- a/net/mptcp/ctrl.c +++ b/net/mptcp/ctrl.c @@ -19,6 +19,7 @@ static int mptcp_pernet_id; =20 #ifdef CONFIG_SYSCTL static int mptcp_pm_type_max =3D __MPTCP_PM_TYPE_MAX; +static int mptcp_max_addrs =3D MPTCP_PM_MAX_ADDR_ID; #endif =20 struct mptcp_pernet { @@ -32,6 +33,7 @@ struct mptcp_pernet { u8 checksum_enabled; u8 allow_join_initial_addr_port; u8 pm_type; + u8 userspace_pm_local_addr_max; }; =20 static struct mptcp_pernet *mptcp_get_pernet(const struct net *net) @@ -69,6 +71,11 @@ int mptcp_get_pm_type(const struct net *net) return mptcp_get_pernet(net)->pm_type; } =20 +unsigned int mptcp_get_userspace_pm_local_addr_max(const struct net *net) +{ + return mptcp_get_pernet(net)->userspace_pm_local_addr_max; +} + static void mptcp_pernet_set_defaults(struct mptcp_pernet *pernet) { pernet->mptcp_enabled =3D 1; @@ -77,6 +84,7 @@ static void mptcp_pernet_set_defaults(struct mptcp_pernet= *pernet) pernet->allow_join_initial_addr_port =3D 1; pernet->stale_loss_cnt =3D 4; pernet->pm_type =3D MPTCP_PM_TYPE_KERNEL; + pernet->userspace_pm_local_addr_max =3D 10; } =20 #ifdef CONFIG_SYSCTL @@ -128,6 +136,14 @@ static struct ctl_table mptcp_sysctl_table[] =3D { .extra1 =3D SYSCTL_ZERO, .extra2 =3D &mptcp_pm_type_max }, + { + .procname =3D "userspace_pm_local_addr_max", + .maxlen =3D sizeof(u8), + .mode =3D 0644, + .proc_handler =3D proc_dou8vec_minmax, + .extra1 =3D SYSCTL_ONE, + .extra2 =3D &mptcp_max_addrs + }, {} }; =20 @@ -149,6 +165,7 @@ static int mptcp_pernet_new_table(struct net *net, stru= ct mptcp_pernet *pernet) table[3].data =3D &pernet->allow_join_initial_addr_port; table[4].data =3D &pernet->stale_loss_cnt; table[5].data =3D &pernet->pm_type; + table[6].data =3D &pernet->userspace_pm_local_addr_max; =20 hdr =3D register_net_sysctl(net, MPTCP_SYSCTL_PATH, table); if (!hdr) diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c index e5d5cb847209..24839cd7025c 100644 --- a/net/mptcp/pm.c +++ b/net/mptcp/pm.c @@ -182,7 +182,9 @@ void mptcp_pm_subflow_check_next(struct mptcp_sock *msk= , const struct sock *ssk, bool update_subflows; =20 update_subflows =3D (ssk->sk_state =3D=3D TCP_CLOSE) && - (subflow->request_join || subflow->mp_join); + (subflow->request_join || subflow->mp_join) && + READ_ONCE(pm->pm_type) =3D=3D MPTCP_PM_TYPE_KERNEL; + if (!READ_ONCE(pm->work_pending) && !update_subflows) return; =20 diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index 126cc961a4fd..882988e43d76 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -933,6 +933,9 @@ static void mptcp_pm_nl_rm_addr_or_subflow(struct mptcp= _sock *msk, if (!removed) continue; =20 + if (READ_ONCE(msk->pm.pm_type) !=3D MPTCP_PM_TYPE_KERNEL) + continue; + if (rm_type =3D=3D MPTCP_MIB_RMADDR) { msk->pm.add_addr_accepted--; WRITE_ONCE(msk->pm.accept_addr, true); diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index 30006735afb7..6cfa8ec26482 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -852,6 +852,7 @@ unsigned int mptcp_pm_get_add_addr_signal_max(struct mp= tcp_sock *msk); unsigned int mptcp_pm_get_add_addr_accept_max(struct mptcp_sock *msk); unsigned int mptcp_pm_get_subflows_max(struct mptcp_sock *msk); unsigned int mptcp_pm_get_local_addr_max(struct mptcp_sock *msk); +unsigned int mptcp_get_userspace_pm_local_addr_max(const struct net *net); =20 void mptcp_sockopt_sync(struct mptcp_sock *msk, struct sock *ssk); void mptcp_sockopt_sync_locked(struct mptcp_sock *msk, struct sock *ssk); --=20 2.31.1 From nobody Mon May 6 03:15:49 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6638:2248:0:0:0:0 with SMTP id m8csp375667jas; Thu, 27 Jan 2022 16:38:46 -0800 (PST) X-Google-Smtp-Source: ABdhPJwiZAvXumOyoOaonFJCnQItdijMZ4tjm/wKzIj+gdCREgZJT51drRbn2Uri7rqyDGrmmJWe X-Received: by 2002:a17:90a:d913:: with SMTP id c19mr16810171pjv.72.1643330326472; Thu, 27 Jan 2022 16:38:46 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1643330326; cv=none; d=google.com; s=arc-20160816; b=BJxNEm9P6I0UCM3XWySmicGqNxy+h3C46j4h62XBF3CkbV3kJXfRoxdbAkWQt5eT+t 2gp/TPodZHWQP/fELNS5Pm4h/8ksDb2ph0qUwszOWDUMKdoeiCUZgeyD4Gw6xqvB6ilm PR8cuVycnIPgVs5EK7eREQJlKbhP99Iwt4kLyWtrmZMW/NTc7w0zaMr6UfbdEheRh883 w+S2wjkRMJRzv2QEnXNF3+hU6OgqeUFRjgsRXEfqL9XW+FKCFBdPOMB46Yvqmzdi16d7 /sdUrI8T/HR3tr2M69hXkkEvES9YOd7DRUDO+JsTv/U9wgG2hakw5EI2E26PCpWHR/bi 3cDw== 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=+SMdW8XVUoOjzqF07XQ64KJ/C1zRJY9AqRxh4vImz08=; b=EcDwOmyFpUH5qM0q9POb/KG3yXCoV9VVEirOFretYYdkAD7IxWWGnUwcYLJmA04pyu Jo2CquOMhjv7t+sVCM8dFZYSW8VviORvub1LV++Cnu7eCPf0DCW5VsgTwLdZLU6gjGt2 6F/Yl5tfmdxYMFjifzSFtGm1oCzN72ZMDljYu33/jJlXwXtA7qVjlGb+qMLL6Zt5hzwF 24IT6rNUk1FG1mkYshsfzErXGJblU+G4+Gb/eEhlpDkqO3wfV7xirQ9tLznKOsVNYbEE Z70mvFAzF6ZsaA0S2iocd87XjseLhH9jUnORHNzl0n19J6iqpuczB8xEQqHo+kJ4JBqO PFmg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=IcRIh2GM; spf=pass (google.com: domain of mptcp+bounces-3338-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3338-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 o9si3363199plc.371.2022.01.27.16.38.46 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 27 Jan 2022 16:38:46 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-3338-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=IcRIh2GM; spf=pass (google.com: domain of mptcp+bounces-3338-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3338-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 0EDB13E0F66 for ; Fri, 28 Jan 2022 00:38:46 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 5B5492CA6; Fri, 28 Jan 2022 00:38:45 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) (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 3684A2CAE for ; Fri, 28 Jan 2022 00:38:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1643330324; x=1674866324; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=mnR7vfPK4ZYgF4Wcirh0yNyrgesX9MuVyrdIUYpbiLI=; b=IcRIh2GMWUruITrtOF6PMXyd6DJPZEAGEu/JM4K6rcrERUwNRNU/+YHx YyJOW9Oqi5DqWnFpeWJg1V4dAAfI6mowf5LgBn/YoenAaCU0nlxa9Ykaw so5THHOET2YxY9+RUi5T1Fs1KkVeH43WFRXQF/Y7NwWRvEKQiD7o9YEW0 I+r1NXnCh1jLvt/sdwxl3mPHkrYefY/6qBXE/nztv5iOp/4TvuDVz/kGi cWdzxA5jRfiNJM5RtlBoBNxccTjVezzR8SlxA0D8sW7maZgQWWIJaqGMQ WC3s94LOLj4b6vTgiroW25XQpbjwt3c20YgVvr3qEOp2j7UBM6bH3tLBL A==; X-IronPort-AV: E=McAfee;i="6200,9189,10239"; a="333358331" X-IronPort-AV: E=Sophos;i="5.88,322,1635231600"; d="scan'208";a="333358331" Received: from orsmga006.jf.intel.com ([10.7.209.51]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Jan 2022 16:38:42 -0800 X-IronPort-AV: E=Sophos;i="5.88,322,1635231600"; d="scan'208";a="480527108" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga006-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Jan 2022 16:38:41 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v3 02/14] mptcp: allow ADD_ADDR reissuance by userspace PMs Date: Thu, 27 Jan 2022 19:38:24 -0500 Message-Id: <20220128003836.2732694-3-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220128003836.2732694-1-kishen.maloor@intel.com> References: <20220128003836.2732694-1-kishen.maloor@intel.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This change allows userspace PM implementations to reissue ADD_ADDR announcements (if necessary) based on their chosen policy. Signed-off-by: Kishen Maloor --- net/mptcp/pm_netlink.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index 882988e43d76..726dc0a56fca 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -479,8 +479,16 @@ static bool mptcp_pm_alloc_anno_list(struct mptcp_sock= *msk, =20 lockdep_assert_held(&msk->pm.lock); =20 - if (mptcp_lookup_anno_list_by_saddr(msk, &entry->addr)) - return false; + add_entry =3D mptcp_lookup_anno_list_by_saddr(msk, &entry->addr); + + if (add_entry) { + if (READ_ONCE(msk->pm.pm_type) =3D=3D MPTCP_PM_TYPE_KERNEL) + return false; + + sk_reset_timer(sk, &add_entry->add_timer, + jiffies + mptcp_get_add_addr_timeout(net)); + return true; + } =20 add_entry =3D kmalloc(sizeof(*add_entry), GFP_ATOMIC); if (!add_entry) --=20 2.31.1 From nobody Mon May 6 03:15:49 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6638:2248:0:0:0:0 with SMTP id m8csp375749jas; Thu, 27 Jan 2022 16:38:53 -0800 (PST) X-Google-Smtp-Source: ABdhPJyZYbdh6SrfRk9EeEiTMOuuGoTxKiM+zltUDqqirfQAgmy2aG9WarWKeBMYiCk2hXEh78hp X-Received: by 2002:a65:45cf:: with SMTP id m15mr4633766pgr.84.1643330332937; Thu, 27 Jan 2022 16:38:52 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1643330332; cv=none; d=google.com; s=arc-20160816; b=KZLqK/LaxvtI3Pv0awQGRgi/F7UQUFnTOJxYfbcl00BU92Eo9g7aYT9ctluHEWa2YB nR1Dzo9e5LiVG549jr/3UemvE3TT4uz+zT8xPcrJoplSzBvZmg3I2PY8oMc0K6tva7Vu La8s2AEGXwrkfjdHGcWgZZUnbH2NsPowZBBshedp8m7tfzdHeZDV5X3Yk0zz+RmpJTsz V4EoHiUTrX3lJlI0A1fhs3lEjstSP9oQ3lQvsqMe9YZHvArKYQwCIQGDm5lENYR4d819 ASPCL8yVJSDPHRTtzquC/BKkdHvuMbnT8e/vOS2SqdlEUDz1RobhbsT5jdajG1QqRJiU f57Q== 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=CGCaQ8+WCHNfd86VyPppEBAy0kHKus+TT3/aYoSZ77Y=; b=L0G6cASpEns/4gOQVB1ahZL0jtARxTnVtW+qznlgZwEZg4IHmWhmhIFqtBLviEXV1p j5EVuUU1sZuJ3YbG4FcjENqDTt091UtvTqtYBXT1lrkpGbhTLyRHr4Ij5I3eWFiUlp2g bs0/176oh2CS7lYCKwrSb6WjS5c8XkuwAsXWQn4JNmDHseVA09rW2CUcgk2MrxfjV+z1 i5Z+voTlzjuJhnuMMJTJsnL90OauZJn/8zhzJE3vhgxoK1HsJ/M1xjUrdsAjjeF2QPP5 OfQJNNVnnHRY7yzwLIRPvh0UDZ+pcuweYzIc+sKsnahG+V6IXHTeX7i6bFpBBlXaS+BD nesw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=EGERoqDC; spf=pass (google.com: domain of mptcp+bounces-3343-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3343-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from ewr.edge.kernel.org (ewr.edge.kernel.org. [2604:1380:1:3600::1]) by mx.google.com with ESMTPS id 11si3523250pgx.754.2022.01.27.16.38.52 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 27 Jan 2022 16:38:52 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-3343-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) client-ip=2604:1380:1:3600::1; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=EGERoqDC; spf=pass (google.com: domain of mptcp+bounces-3343-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3343-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 5DC931C0F21 for ; Fri, 28 Jan 2022 00:38:52 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 337F32CA6; Fri, 28 Jan 2022 00:38:47 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) (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 8FFA02CAE for ; Fri, 28 Jan 2022 00:38:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1643330325; x=1674866325; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=nGeG430NBJeF9Y+vsoUaxacWf29cVhQeW2t6F+8m2pc=; b=EGERoqDCJvTaLE9i+La5rQ91CgRhcfleJOYgYI+pXkKZ1rbBWKsAGWlq S0DbxZuvdFxrkuX0noUEQs0Agm3mNHPsPfn6aX1C+BkUwHPNi1ekmq+YO pvTm6zQ3tRUxyc5BrALjsbw8nxsi6dO5rqqabnacPYR83bEKKih6TQRCR T+3l7lIqJLLXS722KuRJJ5JA52E8g0oykP0fRujQ5Eh9xNDiqfQtm7QM1 yuXW2yu8n5qBK+l4hSfoSPNpChpakwAuBukQHKkTx7/VNnyP2eMS7U+AJ ExxkA/QLloXad8TQuio0J4pmp91iOZt3wim1mhRLzUkHAWTZ9IBm4uu1i Q==; X-IronPort-AV: E=McAfee;i="6200,9189,10239"; a="333358332" X-IronPort-AV: E=Sophos;i="5.88,322,1635231600"; d="scan'208";a="333358332" Received: from orsmga006.jf.intel.com ([10.7.209.51]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Jan 2022 16:38:42 -0800 X-IronPort-AV: E=Sophos;i="5.88,322,1635231600"; d="scan'208";a="480527112" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga006-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Jan 2022 16:38:41 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v3 03/14] mptcp: handle local addrs announced by userspace PMs Date: Thu, 27 Jan 2022 19:38:25 -0500 Message-Id: <20220128003836.2732694-4-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220128003836.2732694-1-kishen.maloor@intel.com> References: <20220128003836.2732694-1-kishen.maloor@intel.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This change adds a new internal function to store/retrieve local addrs announced by userspace PM implementations to/from its kernel context. The function captures the requirements of three scenarios: 1) ADD_ADDR announcements (which require that a local id be provided), 2) retrieving the local id associated with an address, also where one may need to be assigned, and 3) reissuance of ADD_ADDRs when there's a successful match of addr/id. The list of all stored local addr entries is held under the MPTCP sock structure. This list, if not released by the REMOVE_ADDR flow is freed while the sock is destructed. Additionally, this function enforces the kernel imposed limit on the number of local addresses that may be used over a connection. Signed-off-by: Kishen Maloor --- v3: incorporate the new sysctl configurable limit on the # of local addresses that may be populated by userspace PMs --- net/mptcp/pm_netlink.c | 88 ++++++++++++++++++++++++++++++++++++++++++ net/mptcp/protocol.c | 2 + net/mptcp/protocol.h | 2 + 3 files changed, 92 insertions(+) diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index 726dc0a56fca..ebec3610bb38 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -511,6 +511,34 @@ static bool mptcp_pm_alloc_anno_list(struct mptcp_sock= *msk, return true; } =20 +void mptcp_free_local_addr_list(struct mptcp_sock *msk) +{ + struct mptcp_pm_addr_entry *entry, *tmp; + struct sock *sk =3D (struct sock *)msk; + struct pm_nl_pernet *pernet; + LIST_HEAD(free_list); + + if (READ_ONCE(msk->pm.pm_type) =3D=3D MPTCP_PM_TYPE_KERNEL) + return; + + pernet =3D net_generic(sock_net(sk), pm_nl_pernet_id); + + pr_debug("msk=3D%p", msk); + + mptcp_data_lock(sk); + list_splice_init(&msk->local_addr_list, &free_list); + spin_lock_bh(&msk->pm.lock); + msk->pm.local_addr_used =3D 0; + spin_unlock_bh(&msk->pm.lock); + mptcp_data_unlock(sk); + + list_for_each_entry_safe(entry, tmp, &free_list, list) { + if (entry->lsk_ref) + lsk_list_release(pernet, entry->lsk_ref); + kfree(entry); + } +} + void mptcp_pm_free_anno_list(struct mptcp_sock *msk) { struct mptcp_pm_add_entry *entry, *tmp; @@ -1007,6 +1035,66 @@ static bool address_use_port(struct mptcp_pm_addr_en= try *entry) MPTCP_PM_ADDR_FLAG_SIGNAL; } =20 +static int mptcp_userspace_pm_append_new_local_addr(struct mptcp_sock *msk, + struct mptcp_pm_addr_entry *entry) +{ + DECLARE_BITMAP(id_bitmap, MPTCP_PM_MAX_ADDR_ID + 1); + struct mptcp_pm_addr_entry *match =3D NULL; + struct sock *sk =3D (struct sock *)msk; + struct mptcp_pm_addr_entry *e; + bool addr_match =3D false; + bool id_match =3D false; + int ret =3D -EINVAL; + + bitmap_zero(id_bitmap, MPTCP_PM_MAX_ADDR_ID + 1); + + mptcp_data_lock(sk); + list_for_each_entry(e, &msk->local_addr_list, list) { + addr_match =3D addresses_equal(&e->addr, &entry->addr, true); + if (addr_match && entry->addr.id =3D=3D 0) + entry->addr.id =3D e->addr.id; + id_match =3D (e->addr.id =3D=3D entry->addr.id); + if (addr_match && id_match) { + match =3D e; + break; + } else if (addr_match || id_match) { + break; + } + __set_bit(e->addr.id, id_bitmap); + } + + if (!match && !addr_match && !id_match) { + spin_lock_bh(&msk->pm.lock); + if (msk->pm.local_addr_used < + mptcp_get_userspace_pm_local_addr_max(sock_net(sk))) { + e =3D kmalloc(sizeof(*e), GFP_ATOMIC); + if (!e) { + mptcp_data_unlock(sk); + return -ENOMEM; + } + + *e =3D *entry; + if (!e->addr.id) + e->addr.id =3D find_next_zero_bit(id_bitmap, + MPTCP_PM_MAX_ADDR_ID + 1, + 1); + list_add_tail_rcu(&e->list, &msk->local_addr_list); + ++msk->pm.local_addr_used; + ret =3D e->addr.id; + + if (e->lsk_ref && e->addr.port) + lsk_list_add_ref(e->lsk_ref); + } + spin_unlock_bh(&msk->pm.lock); + } else if (match) { + ret =3D entry->addr.id; + } + + mptcp_data_unlock(sk); + + return ret; +} + static int mptcp_pm_nl_append_new_local_addr(struct pm_nl_pernet *pernet, struct mptcp_pm_addr_entry *entry) { diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 7c591177c3e8..82b4f9b76f42 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -2540,6 +2540,7 @@ static int __mptcp_init_sock(struct sock *sk) INIT_LIST_HEAD(&msk->conn_list); INIT_LIST_HEAD(&msk->join_list); INIT_LIST_HEAD(&msk->rtx_queue); + INIT_LIST_HEAD(&msk->local_addr_list); INIT_WORK(&msk->work, mptcp_worker); __skb_queue_head_init(&msk->receive_queue); msk->out_of_order_queue =3D RB_ROOT; @@ -3036,6 +3037,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 6cfa8ec26482..dbf0c134e923 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -281,6 +281,7 @@ struct mptcp_sock { struct sk_buff_head receive_queue; struct list_head conn_list; struct list_head rtx_queue; + struct list_head local_addr_list; struct mptcp_data_frag *first_pending; struct list_head join_list; struct socket *subflow; /* outgoing connect/listener/!mp_capable */ @@ -733,6 +734,7 @@ struct mptcp_sock *mptcp_token_get_sock(struct net *net= , u32 token); struct mptcp_sock *mptcp_token_iter_next(const struct net *net, long *s_sl= ot, long *s_num); void mptcp_token_destroy(struct mptcp_sock *msk); +void mptcp_free_local_addr_list(struct mptcp_sock *msk); =20 void mptcp_crypto_key_sha(u64 key, u32 *token, u64 *idsn); =20 --=20 2.31.1 From nobody Mon May 6 03:15:49 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6638:2248:0:0:0:0 with SMTP id m8csp375914jas; Thu, 27 Jan 2022 16:39:02 -0800 (PST) X-Google-Smtp-Source: ABdhPJx4Q23jicXiwBpQR6SyrB3MgZQGyEBQUqaaWraoKFLJjIiLI4HIeaWX5s/6NDWQryqvS0b2 X-Received: by 2002:a05:6a00:1992:: with SMTP id d18mr5250086pfl.85.1643330342083; Thu, 27 Jan 2022 16:39:02 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1643330342; cv=none; d=google.com; s=arc-20160816; b=tAMtpqWV1J4ZORj5sK/+Zpr8GJWEx88iSYkve6vwc4m25uICm3gQUhFPxsTvWWftQO 8TuTnA92g0/sLx7wuB9np/wjcDtH4ahy0Q5pjqylv5ciSyvdHZpoirWCYW6TdyHkzKWh g4jA3GhnMa1IzomLZFoKI2NEKXHjk5mbXzG5zQPMWs7P03leCg2ucm/USjHdS+XKEgiU 93NjhfuyQG+j2VA8BVVIKkGDd0Bj1uexKlOc1EI1JLmaPph9xTiJH5yFLlMxVOupv+vy t2nksApoAUhFNjiSngJIMJdyCve/DIKL3oLZr98R3skq9pP4ebFjQTXu3tWF/74VmRuK 3A8Q== 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=pG0dYi9piSiCDaoez2MdQnI5UQOrwA/24Y+T+MuEga4=; b=wRiqxvmDL3A/KWYwcP9XPytXvb556OURW4hK1CL5Ez8tetymD753eWeIVSdXw2gdNH UDTpPUSFBS/iVeZPejVLDBmOjark87y9EVrzcfvZ4bg+7WE5xUIA+oqxS9qfW8DdWX7I J7a6Pb9KW8IBQgsxr55Y9xk6fsJeShQNIPZuLyttbt9dKjEoIjIJMLqjJlgjwLONxDaY RgRcsafrSP1ymc/vy5XEMxaCCz/8sC9S5baYoAXH0Kius+lDaGc6oXKByo99Kw3rBrPT CWfeokx6EbqgKe94eoPlw5qaVdserdP12flWm1VSnIdAQ2814r7iQCq39KMrOrM3rtxa nwCA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=RMpicrjc; spf=pass (google.com: domain of mptcp+bounces-3350-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3350-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from ewr.edge.kernel.org (ewr.edge.kernel.org. [2604:1380:1:3600::1]) by mx.google.com with ESMTPS id c9si3973699plg.216.2022.01.27.16.39.01 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 27 Jan 2022 16:39:02 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-3350-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) client-ip=2604:1380:1:3600::1; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=RMpicrjc; spf=pass (google.com: domain of mptcp+bounces-3350-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3350-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 AE8F21C0F53 for ; Fri, 28 Jan 2022 00:39:00 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 222533FD6; Fri, 28 Jan 2022 00:38:50 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) (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 AC5922FAF for ; Fri, 28 Jan 2022 00:38:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1643330327; x=1674866327; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=Ayp/hzhQU68tkVeBfdFTzrbIXUw/r8fnChYm0kqtJ+k=; b=RMpicrjcnoH4NkGE2c3z+PFZGc5fHNs4YGHT9MQIS3fxA7ZD1mlGM+mm WXlB0XR1X0xaacEUZuB51yi8GWHQB/OP9m/qEA50au8WPyQB1UaKOhZQA gK+H8gf2Lv+Cv0eZsIQz/NaonLc6WCu4B4nsHHqruwdevxVhuiVNTWdup lJn0K4hZW8etQ6/NEtlhqgPWYd2tUTliSchew4wMEaGSxeFVPVZLsC2ZM Ti22ffq2mxfr5ZXXAtMOxyfCraEubd3P4AwGoaKGzEsgXZ4sS4MKF/FBU 9gtqFvaA3RxmEKA2s4DaPs+GOpPBcCyNR8gCaCjSSem84u+zExSr/lfNy A==; X-IronPort-AV: E=McAfee;i="6200,9189,10239"; a="333358333" X-IronPort-AV: E=Sophos;i="5.88,322,1635231600"; d="scan'208";a="333358333" Received: from orsmga006.jf.intel.com ([10.7.209.51]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Jan 2022 16:38:42 -0800 X-IronPort-AV: E=Sophos;i="5.88,322,1635231600"; d="scan'208";a="480527115" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga006-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Jan 2022 16:38:41 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v3 04/14] mptcp: read attributes of addr entries managed by userspace PMs Date: Thu, 27 Jan 2022 19:38:26 -0500 Message-Id: <20220128003836.2732694-5-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220128003836.2732694-1-kishen.maloor@intel.com> References: <20220128003836.2732694-1-kishen.maloor@intel.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This change introduces a parallel path in the kernel for retrieving the local id, flags, if_index for an addr entry in the context of an MPTCP connection that's being managed by a userspace PM. The userspace and in-kernel PM modes deviate in their procedures for obtaining this information. Signed-off-by: Kishen Maloor --- net/mptcp/pm_netlink.c | 101 ++++++++++++++++++++++++++++------------- net/mptcp/protocol.h | 2 +- net/mptcp/subflow.c | 2 +- 3 files changed, 71 insertions(+), 34 deletions(-) diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index ebec3610bb38..6ead218a20de 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -1219,6 +1219,7 @@ int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk, = struct sock_common *skc) struct mptcp_addr_info msk_local; struct pm_nl_pernet *pernet; int ret =3D -1; + int pm_type; =20 if (WARN_ON_ONCE(!msk)) return -1; @@ -1236,31 +1237,50 @@ int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk= , struct sock_common *skc) =20 pernet =3D net_generic(sock_net((struct sock *)msk), pm_nl_pernet_id); =20 - rcu_read_lock(); - list_for_each_entry_rcu(entry, &pernet->local_addr_list, list) { - if (addresses_equal(&entry->addr, &skc_local, entry->addr.port)) { - ret =3D entry->addr.id; - break; - } - } - rcu_read_unlock(); - if (ret >=3D 0) - return ret; - /* address not found, add to local list */ - entry =3D kmalloc(sizeof(*entry), GFP_ATOMIC); - if (!entry) - return -ENOMEM; - - entry->addr =3D skc_local; - entry->addr.id =3D 0; - entry->addr.port =3D 0; - entry->ifindex =3D 0; - entry->flags =3D 0; - entry->lsk_ref =3D NULL; - ret =3D mptcp_pm_nl_append_new_local_addr(pernet, entry); - if (ret < 0) - kfree(entry); + + pm_type =3D READ_ONCE(msk->pm.pm_type); + + if (pm_type =3D=3D MPTCP_PM_TYPE_KERNEL) { + rcu_read_lock(); + list_for_each_entry_rcu(entry, &pernet->local_addr_list, list) { + if (addresses_equal(&entry->addr, &skc_local, entry->addr.port)) { + ret =3D entry->addr.id; + break; + } + } + rcu_read_unlock(); + + if (ret >=3D 0) + return ret; + + entry =3D kmalloc(sizeof(*entry), GFP_ATOMIC); + if (!entry) + return -ENOMEM; + + entry->addr =3D skc_local; + entry->addr.id =3D 0; + entry->addr.port =3D 0; + entry->ifindex =3D 0; + entry->flags =3D 0; + entry->lsk_ref =3D NULL; + ret =3D mptcp_pm_nl_append_new_local_addr(pernet, entry); + if (ret < 0) + kfree(entry); + } else if (pm_type =3D=3D MPTCP_PM_TYPE_USERSPACE) { + struct mptcp_pm_addr_entry new_entry; + __be16 msk_sport =3D ((struct inet_sock *) + inet_sk((struct sock *)msk))->inet_sport; + + memset(&new_entry, 0, sizeof(struct mptcp_pm_addr_entry)); + new_entry.addr =3D skc_local; + new_entry.addr.id =3D 0; + + if (new_entry.addr.port =3D=3D msk_sport) + new_entry.addr.port =3D 0; + + ret =3D mptcp_userspace_pm_append_new_local_addr(msk, &new_entry); + } =20 return ret; } @@ -1491,22 +1511,39 @@ static int mptcp_nl_cmd_add_addr(struct sk_buff *sk= b, struct genl_info *info) return 0; } =20 -int mptcp_pm_get_flags_and_ifindex_by_id(struct net *net, unsigned int id, +int mptcp_pm_get_flags_and_ifindex_by_id(struct mptcp_sock *msk, unsigned = int id, u8 *flags, int *ifindex) { - struct mptcp_pm_addr_entry *entry; + struct mptcp_pm_addr_entry *entry, *match =3D NULL; + struct sock *sk =3D (struct sock *)msk; + struct net *net =3D sock_net(sk); =20 *flags =3D 0; *ifindex =3D 0; =20 if (id) { - rcu_read_lock(); - entry =3D __lookup_addr_by_id(net_generic(net, pm_nl_pernet_id), id); - if (entry) { - *flags =3D entry->flags; - *ifindex =3D entry->ifindex; + if (READ_ONCE(msk->pm.pm_type) =3D=3D MPTCP_PM_TYPE_KERNEL) { + rcu_read_lock(); + entry =3D __lookup_addr_by_id(net_generic(net, pm_nl_pernet_id), id); + if (entry) { + *flags =3D entry->flags; + *ifindex =3D entry->ifindex; + } + rcu_read_unlock(); + } else { + mptcp_data_lock(sk); + list_for_each_entry(entry, &msk->local_addr_list, list) { + if (id =3D=3D entry->addr.id) { + match =3D entry; + break; + } + } + mptcp_data_unlock(sk); + if (match) { + *flags =3D match->flags; + *ifindex =3D match->ifindex; + } } - rcu_read_unlock(); } =20 return 0; diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index dbf0c134e923..fbcd378115f7 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -773,7 +773,7 @@ mptcp_pm_del_add_timer(struct mptcp_sock *msk, struct mptcp_pm_add_entry * mptcp_lookup_anno_list_by_saddr(struct mptcp_sock *msk, struct mptcp_addr_info *addr); -int mptcp_pm_get_flags_and_ifindex_by_id(struct net *net, unsigned int id, +int mptcp_pm_get_flags_and_ifindex_by_id(struct mptcp_sock *msk, unsigned = int id, u8 *flags, int *ifindex); =20 int mptcp_pm_announce_addr(struct mptcp_sock *msk, diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c index 479a4f53bbdd..e5f2df4b92a8 100644 --- a/net/mptcp/subflow.c +++ b/net/mptcp/subflow.c @@ -1416,7 +1416,7 @@ int __mptcp_subflow_connect(struct sock *sk, const st= ruct mptcp_addr_info *loc, local_id =3D err; } =20 - mptcp_pm_get_flags_and_ifindex_by_id(sock_net(sk), local_id, + mptcp_pm_get_flags_and_ifindex_by_id(msk, local_id, &flags, &ifindex); subflow->remote_key =3D msk->remote_key; subflow->local_key =3D msk->local_key; --=20 2.31.1 From nobody Mon May 6 03:15:49 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6638:2248:0:0:0:0 with SMTP id m8csp375877jas; Thu, 27 Jan 2022 16:38:59 -0800 (PST) X-Google-Smtp-Source: ABdhPJyDv6zM/yhvVnlg94Ql4IPGUoQKRijPL6GKebNYEwUNuIEcq+OI6IWXoOLDi+zvhpraD0Z2 X-Received: by 2002:a05:6a00:1a86:: with SMTP id e6mr5510059pfv.2.1643330339661; Thu, 27 Jan 2022 16:38:59 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1643330339; cv=none; d=google.com; s=arc-20160816; b=z50OTy1lvuwPcwxr5U6FmgQmi7BmuAtsxHzmZLnwzONJyDID3W/MCSLF1mnXewwuz+ fgjUNMITMhr+kH6WF6voqUsNxvEX4x9+mqOWen2h8Ao7W/P8NYZAVOFqNlmtA+mUt2Zf A7ufyoHbS1GI0Og2exERg6S3aq1/zcq0pubXjrsLHBjmhsdmMicXZIOAU+u5ye0Bhc2u rMOTAff7nc50hsCoJhpYI+rXKEHHWN969yorXpmvepMR1sjfrdO46x6U1GhvOfypU0Zu T6S3ICVAn7aWaHH3mHtsgO6DwMjwlIKmNvkKWRKGNNjNb/2Q5ZB7aq4Hed9ZuYCqpxYz wDJQ== 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=ghpVLzRYZMMb+YgpHWIdX7hqscBEw/cBMKwVRFVODTg=; b=k9p/uEgCEIhirZEyyuRs0Qnapyy5raTfPv84wFbUgAttRx+783OnuXdvWmGkcvItem jXAZwPWvycDLQqdWom5/vhatcLHVvS26glnpGkYTP+EVZZKcRQTJBN4ModS26EzWr1uf IbsmlnpJDmwKzuAYrq9KKA90k0tASOKQjaW420U6qqhzQZhWb4vr4mEW/VMwqWELemhE FPs8aYxP2h02cAoTlm1RofeYU3+dt2t89U4CHvi1XdubVN4an0izaPV10vVbVbJAiYqb 2KVeBFHZGRaAaDEyIotGLiTzU/cfn38Qe4v2Uq3wRJ/SMiJOLl72m3IB/XyMTZRLIM43 VQuw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b="eJa2bD/s"; spf=pass (google.com: domain of mptcp+bounces-3349-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-3349-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 h24si3293113plr.265.2022.01.27.16.38.59 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 27 Jan 2022 16:38:59 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-3349-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="eJa2bD/s"; spf=pass (google.com: domain of mptcp+bounces-3349-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-3349-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 4F6463E0F20 for ; Fri, 28 Jan 2022 00:38:59 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 52A6C3FD5; Fri, 28 Jan 2022 00:38:49 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) (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 4F0963FCE for ; Fri, 28 Jan 2022 00:38:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1643330328; x=1674866328; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=g/t67gieiBvLRcblnAhWvhjv9l3aZqSdXP4PciHn5Fc=; b=eJa2bD/svaweKr+7bjaYjbkQ4fL/5/gjAJitMOod0LLisQgReE04ZWER a28xdL5oERE/ERhBjBl5MNYTNtsfEHagwUO02B0kXR8+R7q2Qwo3tDzvD RlL/55J6PZfNFWeL+jPWTRwbtrzv4mZXAuYaDS0sbk4Byvm3gUBfw/EmY 99P2ZnPBd2iathCBUFLrBKDUi6lXuDIjoBhkeYAKwqUPrQKlS3Y0ZPkMk eUuUeNr3rDpBwATLIlQAUjQwCCmPuVjy0a/5GlxfgDw7wEncTAQiSdfBO JEhbg2vKi8qEl6fhVve9In5G2rrruD51QjLuWiisoDL7J+wrUS9the40R g==; X-IronPort-AV: E=McAfee;i="6200,9189,10239"; a="333358338" X-IronPort-AV: E=Sophos;i="5.88,322,1635231600"; d="scan'208";a="333358338" Received: from orsmga006.jf.intel.com ([10.7.209.51]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Jan 2022 16:38:43 -0800 X-IronPort-AV: E=Sophos;i="5.88,322,1635231600"; d="scan'208";a="480527121" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga006-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Jan 2022 16:38:41 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Cc: Florian Westphal Subject: [PATCH mptcp-next v3 05/14] mptcp: netlink: split mptcp_pm_parse_addr into two functions Date: Thu, 27 Jan 2022 19:38:27 -0500 Message-Id: <20220128003836.2732694-6-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220128003836.2732694-1-kishen.maloor@intel.com> References: <20220128003836.2732694-1-kishen.maloor@intel.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Florian Westphal Next patch will need to parse MPTCP_PM_ATTR_ADDR attributes and fill an mptcp_addr_info structure from a different genl command callback. To avoid copy-paste, split the existing function to a helper that does the common part and then call the helper from the (renamed)mptcp_pm_parse_entry function. Signed-off-by: Florian Westphal --- net/mptcp/pm_netlink.c | 60 +++++++++++++++++++++++++++--------------- 1 file changed, 39 insertions(+), 21 deletions(-) diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index 6ead218a20de..829e20a6d0dd 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -1360,11 +1360,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) { @@ -1378,27 +1379,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"); @@ -1406,22 +1409,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 @@ -1469,7 +1487,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 @@ -1678,7 +1696,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 @@ -1854,7 +1872,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 @@ -2065,7 +2083,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 Mon May 6 03:15:49 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6638:2248:0:0:0:0 with SMTP id m8csp375861jas; Thu, 27 Jan 2022 16:38:59 -0800 (PST) X-Google-Smtp-Source: ABdhPJwuRQCZ9qFYBCGusEAA1FT9jCaaqwJR31p5ih+rfhyZtPeQINDSi+aHEhTy+ex9OKusnkQ7 X-Received: by 2002:a63:82c1:: with SMTP id w184mr4651593pgd.272.1643330339010; Thu, 27 Jan 2022 16:38:59 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1643330339; cv=none; d=google.com; s=arc-20160816; b=PRYKwmf4XZnPPnJWn3osNJFsfrV/eH0qmFWkXHUyz1uRKugb6ZT7pcj1ZVRug5BHRH ysNn8QSoZ5g5AtTw+axVUDPDm8K0ABe2tOyv/KlaRA/5Nj+RZFsRmhPX4QUQcCmEGsGE UCUiRp8o0H/5DkZQHaUt4IQy4Wc8MUADWCMoaUIZaG5eaUqvuHdebYkmEgN/XhpBmoma MBd15gjSPBqKdc33zy1VDBkX/jKs+dUFCbs8iVFSmkKSzdVn/CSKvhPwFFLldsgrXihg BaNO0L8cJo4pGIXXwcWbHrctzL56eEP7CgHwaMoZc771m0eei/4RZd99qk4O7TxJgbst vltA== 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=8oZgi0wLDlzZYWFYfUjNvwV+PMoN8/jQ92MFvmhz6g4=; b=UpzChk+4wgkV2l9eiZW7vblegiaQ3a0m7JOpdR2TrVkUP4CzXg1Ra3wi3jo+St4qfk Sh+1Abbt1u7Ong/z1JhT3d5Q5LipDNBqx67c4qHkDjCiX4m1DgqbXRXP88s708RNfuPK rD77F+xVFVp8LEkCfDtuIPLRFx2Ytqm5FlRhjhg6t65uLABA2cZJQWGmXhNH24W1eXnv 3g2gKMxKoCDLU8CUSmzICfn93TBhuzmpJ0IzubQX1RnULA4QnIKsOItsbRnRQhGiKOBP PvMhzxDtUKS4PTpXgN/7MIUer4Whgh1JX2dNeofwgEaGYVmopO2Dv5zX+H7i5YsF3pMH Mz3w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=FXXFlmuE; spf=pass (google.com: domain of mptcp+bounces-3347-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-3347-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 p13si3636741plo.272.2022.01.27.16.38.58 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 27 Jan 2022 16:38:58 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-3347-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=FXXFlmuE; spf=pass (google.com: domain of mptcp+bounces-3347-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-3347-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 348991C0F42 for ; Fri, 28 Jan 2022 00:38:57 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 475FD3FC7; Fri, 28 Jan 2022 00:38:48 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) (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 B24D72CAA for ; Fri, 28 Jan 2022 00:38:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1643330326; x=1674866326; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=sZGkn2tE9zaUpJvQ/5gUaYWEglRQGcKa2DMg+7i0Kis=; b=FXXFlmuENlAEoapoG5ImiEAXHSB6yFmivIGbKpTKZiMAUuqk9lqCH4+e xA1D7E+4stxoXdhK+66n4x/U+qFqKTQuodpcCNVHlblsBUSloYKXNmHZB 1UO/aNXrmGCU7yWV/RlLnYPZuuqFmaW2XYbHUbPt4YF+325SkgDCpy8yY 4LPr7iVUtaSgMTRZgSWzqZGNEtAkfWPiWn6xQhWLTsG/3pjfVCLeRrz0L WyHfQK3r2edsRVO90Iw1iz6/ttY+0or9DqcD3ZES4VXDXjHTqyMUQlebX 0DoCWrpMabh/MazU5wyH32k6lg8B8tkISLVIcNMb8CEltxYRKsZjsBZoU g==; X-IronPort-AV: E=McAfee;i="6200,9189,10239"; a="333358334" X-IronPort-AV: E=Sophos;i="5.88,322,1635231600"; d="scan'208";a="333358334" Received: from orsmga006.jf.intel.com ([10.7.209.51]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Jan 2022 16:38:42 -0800 X-IronPort-AV: E=Sophos;i="5.88,322,1635231600"; d="scan'208";a="480527119" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga006-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Jan 2022 16:38:41 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v3 06/14] mptcp: netlink: Add MPTCP_PM_CMD_ANNOUNCE Date: Thu, 27 Jan 2022 19:38:28 -0500 Message-Id: <20220128003836.2732694-7-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220128003836.2732694-1-kishen.maloor@intel.com> References: <20220128003836.2732694-1-kishen.maloor@intel.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This change adds a MPTCP netlink interface for issuing ADD_ADDR advertisements over the chosen MPTCP connection from a userspace path manager. The command requires the following parameters: { token, { loc_id, family, daddr4 | daddr6 [, dport] } [, if_idx], flags[signal|skiplsk] }. Signed-off-by: Kishen Maloor --- v3: use MPTCP_PM_ADDR_FLAG_NO_LISTEN to skip creating a listening socket in the kernel for an announced address, use the new helper lsk_list_find_or_create() --- include/uapi/linux/mptcp.h | 2 + net/mptcp/pm_netlink.c | 101 +++++++++++++++++++++++++++++++++++++ 2 files changed, 103 insertions(+) diff --git a/include/uapi/linux/mptcp.h b/include/uapi/linux/mptcp.h index 0df44a116a31..088bdfbf442c 100644 --- a/include/uapi/linux/mptcp.h +++ b/include/uapi/linux/mptcp.h @@ -55,6 +55,7 @@ enum { MPTCP_PM_ATTR_ADDR, /* nested address */ MPTCP_PM_ATTR_RCV_ADD_ADDRS, /* u32 */ MPTCP_PM_ATTR_SUBFLOWS, /* u32 */ + MPTCP_PM_ATTR_TOKEN, /* u32 */ =20 __MPTCP_PM_ATTR_MAX }; @@ -93,6 +94,7 @@ enum { MPTCP_PM_CMD_SET_LIMITS, MPTCP_PM_CMD_GET_LIMITS, MPTCP_PM_CMD_SET_FLAGS, + MPTCP_PM_CMD_ANNOUNCE, =20 __MPTCP_PM_CMD_AFTER_LAST }; diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index 829e20a6d0dd..e880177742d3 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -1312,6 +1312,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) @@ -2072,6 +2073,101 @@ static int mptcp_nl_set_flags(struct net *net, return ret; } =20 +static int mptcp_nl_cmd_announce(struct sk_buff *skb, struct genl_info *in= fo) +{ + struct nlattr *token =3D info->attrs[MPTCP_PM_ATTR_TOKEN]; + struct nlattr *addr =3D info->attrs[MPTCP_PM_ATTR_ADDR]; + struct pm_nl_pernet *pernet =3D genl_info_pm_nl(info); + struct mptcp_local_lsk *lsk_ref =3D NULL; + struct mptcp_pm_addr_entry addr_val; + bool reuse_port =3D false; + struct mptcp_sock *msk; + u32 token_val; + int err; + + if (!addr || !token) { + GENL_SET_ERR_MSG(info, "missing required inputs"); + return -EINVAL; + } + + token_val =3D nla_get_u32(token); + + msk =3D mptcp_token_get_sock(sock_net(skb->sk), token_val); + if (!msk) { + NL_SET_ERR_MSG_ATTR(info->extack, token, "invalid token"); + return -EINVAL; + } + + if (READ_ONCE(msk->pm.pm_type) !=3D MPTCP_PM_TYPE_USERSPACE) { + GENL_SET_ERR_MSG(info, "invalid request; userspace PM not selected"); + return -EINVAL; + } + + err =3D mptcp_pm_parse_entry(addr, info, true, &addr_val); + if (err < 0) { + GENL_SET_ERR_MSG(info, "error parsing local address"); + return err; + } + + if (addr_val.addr.id =3D=3D 0 || !(addr_val.flags & MPTCP_PM_ADDR_FLAG_SI= GNAL)) { + GENL_SET_ERR_MSG(info, "invalid addr id or flags"); + return -EINVAL; + } + + if (!(addr_val.flags & MPTCP_PM_ADDR_FLAG_NO_LISTEN)) { + if (!addr_val.addr.port) { + addr_val.addr.port =3D + ((struct inet_sock *)inet_sk + ((struct sock *)msk))->inet_sport; + + reuse_port =3D true; + } + + lsk_ref =3D lsk_list_find_or_create(sock_net(skb->sk), pernet, &addr_val= , &err); + + if ((!lsk_ref && !reuse_port) || (!lsk_ref && (err !=3D -EADDRINUSE) && = reuse_port)) { + GENL_SET_ERR_MSG(info, "error creating listen socket"); + err =3D (err =3D=3D 0) ? -ENOMEM : err; + return err; + } + + if (!reuse_port) { + addr_val.lsk_ref =3D lsk_ref; + lsk_ref =3D NULL; + } else { + addr_val.addr.port =3D 0; + } + } + + err =3D mptcp_userspace_pm_append_new_local_addr(msk, &addr_val); + if (err < 0) { + if (addr_val.lsk_ref) + lsk_list_release(pernet, addr_val.lsk_ref); + else if (lsk_ref) + lsk_list_release(pernet, lsk_ref); + GENL_SET_ERR_MSG(info, "did not match address and id"); + return err; + } + + lock_sock((struct sock *)msk); + spin_lock_bh(&msk->pm.lock); + + if (mptcp_pm_alloc_anno_list(msk, &addr_val, lsk_ref)) { + mptcp_pm_announce_addr(msk, &addr_val.addr, false); + mptcp_pm_nl_addr_send_ack(msk); + } + + spin_unlock_bh(&msk->pm.lock); + release_sock((struct sock *)msk); + + if (addr_val.lsk_ref) + lsk_list_release(pernet, addr_val.lsk_ref); + else if (lsk_ref) + lsk_list_release(pernet, lsk_ref); + + return 0; +} + static int mptcp_nl_cmd_set_flags(struct sk_buff *skb, struct genl_info *i= nfo) { struct mptcp_pm_addr_entry addr =3D { .addr =3D { .family =3D AF_UNSPEC }= , }, *entry; @@ -2425,6 +2521,11 @@ static const struct genl_small_ops mptcp_pm_ops[] = =3D { .doit =3D mptcp_nl_cmd_set_flags, .flags =3D GENL_ADMIN_PERM, }, + { + .cmd =3D MPTCP_PM_CMD_ANNOUNCE, + .doit =3D mptcp_nl_cmd_announce, + .flags =3D GENL_ADMIN_PERM, + }, }; =20 static struct genl_family mptcp_genl_family __ro_after_init =3D { --=20 2.31.1 From nobody Mon May 6 03:15:49 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6638:2248:0:0:0:0 with SMTP id m8csp375809jas; Thu, 27 Jan 2022 16:38:56 -0800 (PST) X-Google-Smtp-Source: ABdhPJwFC7789hpNYOskDZKC5meuZcg0UkXNDiKxDISybOJUPokYahM/CYGu0OtAlHR1B/ztQbfu X-Received: by 2002:a17:902:da81:: with SMTP id j1mr6420284plx.14.1643330336202; Thu, 27 Jan 2022 16:38:56 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1643330336; cv=none; d=google.com; s=arc-20160816; b=L1BrzLgVJRWrjmik59cZTChy5wOMqV5ytChdremc5y6Ela7VITizIiFpCpb4BLh6Yv Bl/ebAQyIb8Ke6isDhRkntm+xYQLr58Hg5qB5ZSoEkJ1R3PHboRfpdIOrX4Oj2D9pW2D xAdE/H7fqEBYpmIM+mbbtR+ycZhf+TH/XBFYFJzngKuemnhtreDYyxQjppcEs4V2knov F3g6lSn5nXQxKiZGXANtp9tkkqPR+I9eokHyb2/VZtgXxDwrCV9YakYXvwEBO4OVG4Mp ku1T3OhO8AF0ZQj8/OAYyo9862kslbxAfcc5m2WNvxemNeeKAgynXag/uPLe8CRYJdCS dplA== 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=K0xN5uuDh6n3h93pNYmfLr83PViQje5L8BMinWyPP6k=; b=XrZqCxQ2fe7HFnITi9QHAE6GbcAErzj2JqS6lDD99DaF32lKNVuDdgjLrUEtfSWkFg zwMRTTQeqFnzBwGw6XSQquRJRyPLmPr0oLvje06DTWaWdxXgm9thqPIRZE0Y9v1YXmRK wSlovkDpVPIZNpQbjJDkL4mDiOgrGO9nmPhH17jSK4X2ayPGOrETBdA3AXHnVFE0YoQS 1Jdo+1p+OSHBZlwqgrynqYUyBqE+4Mnx1SvBwgtYJtifnA8BcapMboFwmX/DRFD5yFB7 43ybpC2J0uIvTE0iEjirPg+r+GpWNmt3MM/ZOLyDTsBlkrAtq7L3xGPpdVD9ajoR5OiV qSgw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=TEce700P; spf=pass (google.com: domain of mptcp+bounces-3346-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3346-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 br2si846451pjb.6.2022.01.27.16.38.56 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 27 Jan 2022 16:38:56 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-3346-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=TEce700P; spf=pass (google.com: domain of mptcp+bounces-3346-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3346-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 9B39F3E0E72 for ; Fri, 28 Jan 2022 00:38:55 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id A6B392CAC; Fri, 28 Jan 2022 00:38:47 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) (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 822112CAF for ; Fri, 28 Jan 2022 00:38:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1643330326; x=1674866326; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=4HrynTY+4E4yp+PvFb17juKJjv8FNCE+Rw4h3/DTYWw=; b=TEce700PFudcI8AEy/fC65naRss9/ZmsBgVKgrJE3IfWe8fmkPbCnkg6 EbyOlXv0zafbDcDaxfOXvzRJUuQprSuTGD8lTCn1FT20oJXF0GmrZffi2 17TVHlyHi+p0kTu+J26g4QfiuIoeOdQbRzfXsWQUs4F4Nyc+OhuUlCkjh 5v7jBvEPkP441rVt/TbNEkan0F7kfC+jgHgLHPbdrqag2UT8bcUlbt3jq r8b4FlqXx9krsqHez4eCr1VeL144f5j2lVQL669WUBcuV/7gguh1L1B5T k2HGGbIVAmQfVhEPel7jzW7Gz1DYwRmbZ56fbDUXNqWTRMG+JpPLQ5X2M w==; X-IronPort-AV: E=McAfee;i="6200,9189,10239"; a="333358336" X-IronPort-AV: E=Sophos;i="5.88,322,1635231600"; d="scan'208";a="333358336" Received: from orsmga006.jf.intel.com ([10.7.209.51]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Jan 2022 16:38:43 -0800 X-IronPort-AV: E=Sophos;i="5.88,322,1635231600"; d="scan'208";a="480527124" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga006-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Jan 2022 16:38:41 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v3 07/14] mptcp: selftests: support MPTCP_PM_CMD_ANNOUNCE Date: Thu, 27 Jan 2022 19:38:29 -0500 Message-Id: <20220128003836.2732694-8-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220128003836.2732694-1-kishen.maloor@intel.com> References: <20220128003836.2732694-1-kishen.maloor@intel.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This change updates the "pm_nl_ctl" testing sample with an "ann" (announce) option to support the newly added netlink interface command MPTCP_PM_CMD_ANNOUNCE to issue ADD_ADDR advertisements over the chosen MPTCP connection. E.g. ./pm_nl_ctl ann 192.168.122.75 token 823274047 id 25 dev enp1s0 Signed-off-by: Kishen Maloor --- v3: support MPTCP_PM_ADDR_FLAG_NO_LISTEN in both the in-kernel PM's add_addr and userspace PM's amnounce_addr implementations --- tools/testing/selftests/net/mptcp/pm_nl_ctl.c | 138 +++++++++++++++++- 1 file changed, 137 insertions(+), 1 deletion(-) diff --git a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c b/tools/testing/= selftests/net/mptcp/pm_nl_ctl.c index 2a57462764d0..a8c6a53ef8d1 100644 --- a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c +++ b/tools/testing/selftests/net/mptcp/pm_nl_ctl.c @@ -6,6 +6,7 @@ #include #include #include +#include =20 #include #include @@ -25,7 +26,8 @@ static void syntax(char *argv[]) { fprintf(stderr, "%s add|get|set|del|flush|dump|accept []\n", argv[0= ]); - fprintf(stderr, "\tadd [flags signal|subflow|backup|fullmesh] [id ] [= dev ] \n"); + fprintf(stderr, "\tadd [flags signal|subflow|backup|fullmesh|nolisten] [i= d ] [dev ] \n"); + fprintf(stderr, "\tann id token [port ] [dev ] [nolisten]\n"); fprintf(stderr, "\tdel []\n"); fprintf(stderr, "\tget \n"); fprintf(stderr, "\tset [flags backup|nobackup|fullmesh|nofullmesh] [= port ]\n"); @@ -170,6 +172,136 @@ static int resolve_mptcp_pm_netlink(int fd) return genl_parse_getfamily((void *)data); } =20 +int announce_addr(int fd, int pm_family, int argc, char *argv[]) +{ + char data[NLMSG_ALIGN(sizeof(struct nlmsghdr)) + + NLMSG_ALIGN(sizeof(struct genlmsghdr)) + + 1024]; + u_int32_t flags =3D MPTCP_PM_ADDR_FLAG_SIGNAL; + u_int32_t token =3D UINT_MAX; + struct rtattr *rta, *addr; + u_int32_t id =3D UINT_MAX; + struct nlmsghdr *nh; + u_int16_t family; + int addr_start; + int off =3D 0; + int arg; + + memset(data, 0, sizeof(data)); + nh =3D (void *)data; + off =3D init_genl_req(data, pm_family, MPTCP_PM_CMD_ANNOUNCE, + MPTCP_PM_VER); + + if (argc < 7) + syntax(argv); + + /* local-ip header */ + addr_start =3D off; + addr =3D (void *)(data + off); + addr->rta_type =3D NLA_F_NESTED | MPTCP_PM_ATTR_ADDR; + addr->rta_len =3D RTA_LENGTH(0); + off +=3D NLMSG_ALIGN(addr->rta_len); + + /* local-ip data */ + /* record addr type */ + rta =3D (void *)(data + off); + if (inet_pton(AF_INET, argv[2], RTA_DATA(rta))) { + family =3D AF_INET; + rta->rta_type =3D MPTCP_PM_ADDR_ATTR_ADDR4; + rta->rta_len =3D RTA_LENGTH(4); + } else if (inet_pton(AF_INET6, argv[2], RTA_DATA(rta))) { + family =3D AF_INET6; + rta->rta_type =3D MPTCP_PM_ADDR_ATTR_ADDR6; + rta->rta_len =3D RTA_LENGTH(16); + } else + error(1, errno, "can't parse ip %s", argv[2]); + off +=3D NLMSG_ALIGN(rta->rta_len); + + /* addr family */ + rta =3D (void *)(data + off); + rta->rta_type =3D MPTCP_PM_ADDR_ATTR_FAMILY; + rta->rta_len =3D RTA_LENGTH(2); + memcpy(RTA_DATA(rta), &family, 2); + off +=3D NLMSG_ALIGN(rta->rta_len); + + for (arg =3D 3; arg < argc; arg++) { + if (!strcmp(argv[arg], "nolisten")) { + /* nolisten */ + flags |=3D MPTCP_PM_ADDR_FLAG_NO_LISTEN; + } else if (!strcmp(argv[arg], "id")) { + /* local-id */ + if (++arg >=3D argc) + error(1, 0, " missing id value"); + + id =3D atoi(argv[arg]); + rta =3D (void *)(data + off); + rta->rta_type =3D MPTCP_PM_ADDR_ATTR_ID; + rta->rta_len =3D RTA_LENGTH(1); + memcpy(RTA_DATA(rta), &id, 1); + off +=3D NLMSG_ALIGN(rta->rta_len); + } else if (!strcmp(argv[arg], "dev")) { + /* for the if_index */ + int32_t ifindex; + + if (++arg >=3D argc) + error(1, 0, " missing dev name"); + + ifindex =3D if_nametoindex(argv[arg]); + if (!ifindex) + error(1, errno, "unknown device %s", argv[arg]); + + rta =3D (void *)(data + off); + rta->rta_type =3D MPTCP_PM_ADDR_ATTR_IF_IDX; + rta->rta_len =3D RTA_LENGTH(4); + memcpy(RTA_DATA(rta), &ifindex, 4); + off +=3D NLMSG_ALIGN(rta->rta_len); + } else if (!strcmp(argv[arg], "port")) { + /* local-port (optional) */ + u_int16_t port; + + if (++arg >=3D argc) + error(1, 0, " missing port value"); + + port =3D atoi(argv[arg]); + rta =3D (void *)(data + off); + rta->rta_type =3D MPTCP_PM_ADDR_ATTR_PORT; + rta->rta_len =3D RTA_LENGTH(2); + memcpy(RTA_DATA(rta), &port, 2); + off +=3D NLMSG_ALIGN(rta->rta_len); + } else if (!strcmp(argv[arg], "token")) { + /* MPTCP connection token */ + if (++arg >=3D argc) + error(1, 0, " missing token value"); + + token =3D atoi(argv[arg]); + } else + error(1, 0, "unknown keyword %s", argv[arg]); + } + + /* addr flags */ + rta =3D (void *)(data + off); + rta->rta_type =3D MPTCP_PM_ADDR_ATTR_FLAGS; + rta->rta_len =3D RTA_LENGTH(4); + memcpy(RTA_DATA(rta), &flags, 4); + off +=3D NLMSG_ALIGN(rta->rta_len); + + addr->rta_len =3D off - addr_start; + + if (id =3D=3D UINT_MAX || token =3D=3D UINT_MAX) + error(1, 0, " missing mandatory inputs"); + + /* token */ + rta =3D (void *)(data + off); + rta->rta_type =3D MPTCP_PM_ATTR_TOKEN; + rta->rta_len =3D RTA_LENGTH(4); + memcpy(RTA_DATA(rta), &token, 4); + off +=3D NLMSG_ALIGN(rta->rta_len); + + do_nl_req(fd, nh, off, 0); + + return 0; +} + int add_addr(int fd, int pm_family, int argc, char *argv[]) { char data[NLMSG_ALIGN(sizeof(struct nlmsghdr)) + @@ -238,6 +370,8 @@ int add_addr(int fd, int pm_family, int argc, char *arg= v[]) flags |=3D MPTCP_PM_ADDR_FLAG_BACKUP; else if (!strcmp(tok, "fullmesh")) flags |=3D MPTCP_PM_ADDR_FLAG_FULLMESH; + else if (!strcmp(tok, "nolisten")) + flags |=3D MPTCP_PM_ADDR_FLAG_NO_LISTEN; else error(1, errno, "unknown flag %s", argv[arg]); @@ -758,6 +892,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 Mon May 6 03:15:49 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6638:2248:0:0:0:0 with SMTP id m8csp376032jas; Thu, 27 Jan 2022 16:39:10 -0800 (PST) X-Google-Smtp-Source: ABdhPJzsKjRYyMhECfE1/MpS1AiexdSEbyXtnb6QbDfRe0sFdqcW4Gs41jLXVNF12dioNX44YG5t X-Received: by 2002:a17:90a:fe93:: with SMTP id co19mr6965325pjb.147.1643330349948; Thu, 27 Jan 2022 16:39:09 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1643330349; cv=none; d=google.com; s=arc-20160816; b=UFljvgDyB6eglDvO9679wQctemARRaWm9VvcAKlrYiZshxxvqQgcm52yMy96QViohm uJ/nKrtg8i+NFHK/12St8pggQ3xzqO/MfffP20IkDxttVkCLJQwXdCBXSNlfeyo0Fgjs Gyu3jQMguQKCtP04ZtTtyKSVGv4bavImEoYAq+zY4fxHaT+8dyjb9GW9jKbR93csTVfS zmidaIYqL0ouG0UrhXgyYDjzkO8+sMQmR/+3JKfOLBrEq0WHMk2lS87pS+bwL9kkeVrB WIONXs6j+jV2BT9bqTYlVGMDWzq0SfcUsWWT9NIJCaGLKb1RqFR0HgMGIzjIS45h/oz5 qL7g== 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=CtbSfF/RYKEyv0JGOPTwd191KW5dLeNibyLp/XFiZBI=; b=WZBzNiF/fqhR0KXYL91e49I/mQDE3YAzXp1yERK96u44P5xenjgxANgQdP2jLBEl9L oSSVfePZ0sGQGoS4IILc/mQSvvWMTWiavFBV8Z71ictUOAxxcw2Xj2/MPWUknnuPcG0h XNn1IZ8FbwB720pGegW5inwz8RlMeJf0qqGvitgdqp03P1oiV4rbVi+bs7NJrxoEM/kB /Q+kIUdYX+eE8GHppAt/8YQ4xIxNoX7zq2TMD809GBA9mPIUkDjfhX1zbaLi4BhT4HZT lIsw26Nh0MxsyEwNPIsM0e8a5VSgENMwoFxzceWdHhLSGsUN29L+LafQRHR+pOqTEp3j X/qw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=C+A5c89A; spf=pass (google.com: domain of mptcp+bounces-3357-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-3357-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 g13si3800197pfc.270.2022.01.27.16.39.09 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 27 Jan 2022 16:39:09 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-3357-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=C+A5c89A; spf=pass (google.com: domain of mptcp+bounces-3357-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-3357-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 AAD2B1C0F77 for ; Fri, 28 Jan 2022 00:39:08 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 2E4763FE5; Fri, 28 Jan 2022 00:38:53 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) (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 BC32C3FCE for ; Fri, 28 Jan 2022 00:38:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1643330331; x=1674866331; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=bfIIcJvKnUi2VCo2XgqqZ0zQxdjz2lNFmjK3KSgD0tg=; b=C+A5c89AsSvMhhhV2kWipm7s3mxAA36mSgasnDlXNRtyk/cFprbybShi cp7rpCe5E789u3FWq2/1DYD6nzV++gLTBNYrfrW7Qof8EOp9fmL5/G8XW iGj0ZmAom43QRPvvc33FZo3pA3pjIgJ0V9fkNO8uTT/hkUlLj6VOFtlgW Yyhfp+5pkjAtv7x1jGDqpkAwYEb8PqlUZkVaAyUkfUFghy0/G5QcgnU7B rGBxr8oAgeP0YHvWJHM1Nu3fE9d8BObLvhyoMPfNySQqwhC787zG8E9ac kyg9xY0HDrPtwgLGoANzckSrDawkodg5kkJFK153SOAZkRsRQu5xJAsIb g==; X-IronPort-AV: E=McAfee;i="6200,9189,10239"; a="333358337" X-IronPort-AV: E=Sophos;i="5.88,322,1635231600"; d="scan'208";a="333358337" Received: from orsmga006.jf.intel.com ([10.7.209.51]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Jan 2022 16:38:43 -0800 X-IronPort-AV: E=Sophos;i="5.88,322,1635231600"; d="scan'208";a="480527128" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga006-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Jan 2022 16:38:41 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v3 08/14] mptcp: netlink: Add MPTCP_PM_CMD_REMOVE Date: Thu, 27 Jan 2022 19:38:30 -0500 Message-Id: <20220128003836.2732694-9-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220128003836.2732694-1-kishen.maloor@intel.com> References: <20220128003836.2732694-1-kishen.maloor@intel.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This change adds a MPTCP netlink command for issuing REMOVE_ADDR signals for a specific address over the chosen MPTCP connection from a userspace path manager. The command requires the following parameters: {token, loc_id}. Signed-off-by: Kishen Maloor --- v3: update the per-msk count of local addresses populated by the userspace PM; this is the value that needs to stay within the new sysctl configurable limit --- include/uapi/linux/mptcp.h | 2 ++ net/mptcp/pm_netlink.c | 71 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) diff --git a/include/uapi/linux/mptcp.h b/include/uapi/linux/mptcp.h index 088bdfbf442c..c2d7d3cefd02 100644 --- a/include/uapi/linux/mptcp.h +++ b/include/uapi/linux/mptcp.h @@ -56,6 +56,7 @@ enum { MPTCP_PM_ATTR_RCV_ADD_ADDRS, /* u32 */ MPTCP_PM_ATTR_SUBFLOWS, /* u32 */ MPTCP_PM_ATTR_TOKEN, /* u32 */ + MPTCP_PM_ATTR_LOC_ID, /* u8 */ =20 __MPTCP_PM_ATTR_MAX }; @@ -95,6 +96,7 @@ enum { MPTCP_PM_CMD_GET_LIMITS, MPTCP_PM_CMD_SET_FLAGS, MPTCP_PM_CMD_ANNOUNCE, + MPTCP_PM_CMD_REMOVE, =20 __MPTCP_PM_CMD_AFTER_LAST }; diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index e880177742d3..f2130374c5fc 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -1313,6 +1313,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) @@ -1749,6 +1750,7 @@ static void mptcp_pm_remove_addrs_and_subflows(struct= mptcp_sock *msk, slist.nr < MPTCP_RM_IDS_MAX) { alist.ids[alist.nr++] =3D entry->addr.id; slist.ids[slist.nr++] =3D entry->addr.id; + remove_anno_list_by_saddr(msk, &entry->addr); } else if (remove_anno_list_by_saddr(msk, &entry->addr) && alist.nr < MPTCP_RM_IDS_MAX) { alist.ids[alist.nr++] =3D entry->addr.id; @@ -2375,6 +2377,70 @@ void mptcp_event_addr_removed(const struct mptcp_soc= k *msk, uint8_t id) kfree_skb(skb); } =20 +static int mptcp_nl_cmd_remove(struct sk_buff *skb, struct genl_info *info) +{ + struct nlattr *token =3D info->attrs[MPTCP_PM_ATTR_TOKEN]; + struct nlattr *id =3D info->attrs[MPTCP_PM_ATTR_LOC_ID]; + struct pm_nl_pernet *pernet =3D genl_info_pm_nl(info); + struct mptcp_pm_addr_entry *match =3D NULL; + struct mptcp_pm_addr_entry *entry; + struct mptcp_sock *msk; + LIST_HEAD(free_list); + u32 token_val; + u8 id_val; + + if (!id || !token) { + GENL_SET_ERR_MSG(info, "missing required inputs"); + return -EINVAL; + } + + id_val =3D nla_get_u8(id); + token_val =3D nla_get_u32(token); + + msk =3D mptcp_token_get_sock(sock_net(skb->sk), token_val); + if (!msk) { + NL_SET_ERR_MSG_ATTR(info->extack, token, "invalid token"); + return -EINVAL; + } + + if (READ_ONCE(msk->pm.pm_type) !=3D MPTCP_PM_TYPE_USERSPACE) { + GENL_SET_ERR_MSG(info, "invalid request; userspace PM not selected"); + return -EINVAL; + } + + lock_sock((struct sock *)msk); + + list_for_each_entry(entry, &msk->local_addr_list, list) { + if (entry->addr.id =3D=3D id_val) { + match =3D entry; + break; + } + } + + if (!match) { + GENL_SET_ERR_MSG(info, "address with specified id not found"); + release_sock((struct sock *)msk); + return -EINVAL; + } + + list_move(&match->list, &free_list); + + mptcp_pm_remove_addrs_and_subflows(msk, &free_list); + + release_sock((struct sock *)msk); + + spin_lock_bh(&msk->pm.lock); + --msk->pm.local_addr_used; + spin_unlock_bh(&msk->pm.lock); + + list_for_each_entry_safe(match, entry, &free_list, list) { + if (match->lsk_ref) + lsk_list_release(pernet, match->lsk_ref); + kfree(match); + } + return 0; +} + void mptcp_event_addr_announced(const struct mptcp_sock *msk, const struct mptcp_addr_info *info, const struct sock *ssk) @@ -2526,6 +2592,11 @@ static const struct genl_small_ops mptcp_pm_ops[] = =3D { .doit =3D mptcp_nl_cmd_announce, .flags =3D GENL_ADMIN_PERM, }, + { + .cmd =3D MPTCP_PM_CMD_REMOVE, + .doit =3D mptcp_nl_cmd_remove, + .flags =3D GENL_ADMIN_PERM, + }, }; =20 static struct genl_family mptcp_genl_family __ro_after_init =3D { --=20 2.31.1 From nobody Mon May 6 03:15:49 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6638:2248:0:0:0:0 with SMTP id m8csp375855jas; Thu, 27 Jan 2022 16:38:58 -0800 (PST) X-Google-Smtp-Source: ABdhPJwyAgGcuwlVrUx9NsrtHStuBBIOMb6IJHDgVkULEA7yNSUp+aS+k5kHkrKAR1hwAvSiLHvY X-Received: by 2002:a17:90b:2252:: with SMTP id hk18mr7039779pjb.83.1643330338572; Thu, 27 Jan 2022 16:38:58 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1643330338; cv=none; d=google.com; s=arc-20160816; b=boNHfsFb8JmVN5W3vZbNLr3MMPh6kOsouG9hPGbSe9hGQX7k2S//7xAPLSAoz5p/v8 qPqClUJnpPiqpGTXvb2SNql3dw3LhuQjc5uyN3D1Ctc4VDoAfR+tmYovk8GV2LNCTbCt ghJJaIVO/nMJ6flqJHwyl3Nofm8FQlqFOmqhxh4ibNzBpWw+Xgppv9w/NqoAUu3NXiO8 fp23bfi98uFr4856T4aadSQ38mn9FNUhiBi8pOLEL35JINt5fvMgVb87uCaTV87yCkRg qCQjnv8YXdhgBj2ETN8//7CGbIo9n4c8i4KGOdnBebCmMf3SlMdkqBGc3D4wJkBeWh5t N9Dw== 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=G2YeD6jGeTPVmA9FEgmI2uvSjDmFMViy4U0LTD/OKaI=; b=R2lwG39Pxl2mBFRaq4nY8R0q3z8ABm5heOFHwrrMHokmyB76eSb9Sgs45VoBWr9MbG TcnulWOXdC4luk6yroXYl7+F+J98GqD+m824XqlPTu4M6BUtZSoEP4bNUjWug7c0LQ8H RvCLrP1UBkU6WJJu8xFAlQeT7fqyHaSFqYFmHldTDjliAvSDqQTR6uYrgXkAXrH4u5FH x8lnxcsG9zG7yucQZC19bzZ/4amQ+R454T12HrD6B8S86Q6JihuAv/bNMQg2tloVTMUf SK4/zVw4rI8E93IOQ3C4md8hi0va6Se2injmuAmFAquUDfxy+L5b4HxE49kgxxeDe7yk QNPg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b="UWFPd9//"; spf=pass (google.com: domain of mptcp+bounces-3348-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-3348-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 y5si863581pji.145.2022.01.27.16.38.58 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 27 Jan 2022 16:38:58 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-3348-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="UWFPd9//"; spf=pass (google.com: domain of mptcp+bounces-3348-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-3348-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 092143E100B for ; Fri, 28 Jan 2022 00:38:58 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id E608D3FCF; Fri, 28 Jan 2022 00:38:48 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) (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 A9D172CAF for ; Fri, 28 Jan 2022 00:38:47 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1643330327; x=1674866327; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=RFLT/FAxb8erX35X3wz1xMslfQgg89/0rs5dWm3FQOM=; b=UWFPd9//LrWP0Xc2F3586z9seGdOFGWQZ5KzmvS5piHBHkNf28ZXeh8B Uc3fLecObdsxYI5RyXWjlLEfroq7P1P8bBkcMV7bZ/Bs9Tk+QQERMqr6I 5pPwbMe7qFLJ9/2SJGdEzvyMxfJyR113CsAnfPaXvv0cpXSco4sh1Df3k klxuUl4Tyj6DxS9pWSFzKL7GTCDkEUQbv7DfAo38l9r+oMJhl6OVZUCgc Uwd0wNxlK1GKtDpbVdAWxeJ/u1mFix3uhzbeKyEdg83awKvP9YZvpd3pV gVmAHt0HnFjvVNygRAHE3gV7eghoYcszlEeW+y5CPKvsw85fSSgQn2r23 Q==; X-IronPort-AV: E=McAfee;i="6200,9189,10239"; a="333358339" X-IronPort-AV: E=Sophos;i="5.88,322,1635231600"; d="scan'208";a="333358339" Received: from orsmga006.jf.intel.com ([10.7.209.51]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Jan 2022 16:38:43 -0800 X-IronPort-AV: E=Sophos;i="5.88,322,1635231600"; d="scan'208";a="480527131" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga006-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Jan 2022 16:38:41 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v3 09/14] mptcp: selftests: support MPTCP_PM_CMD_REMOVE Date: Thu, 27 Jan 2022 19:38:31 -0500 Message-Id: <20220128003836.2732694-10-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220128003836.2732694-1-kishen.maloor@intel.com> References: <20220128003836.2732694-1-kishen.maloor@intel.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This change updates the "pm_nl_ctl" testing sample with a "rem" (remove) option to support the newly added netlink interface command MPTCP_PM_CMD_REMOVE to issue REMOVE_ADDR signals over the chosen MPTCP connection. E.g. ./pm_nl_ctl rem token 823274047 id 23 Signed-off-by: Kishen Maloor --- tools/testing/selftests/net/mptcp/pm_nl_ctl.c | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c b/tools/testing/= selftests/net/mptcp/pm_nl_ctl.c index a8c6a53ef8d1..8cde5053f082 100644 --- a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c +++ b/tools/testing/selftests/net/mptcp/pm_nl_ctl.c @@ -28,6 +28,7 @@ static void syntax(char *argv[]) fprintf(stderr, "%s add|get|set|del|flush|dump|accept []\n", argv[0= ]); fprintf(stderr, "\tadd [flags signal|subflow|backup|fullmesh|nolisten] [i= d ] [dev ] \n"); fprintf(stderr, "\tann id token [port ] [dev ] [nolisten]\n"); + fprintf(stderr, "\trem id token \n"); fprintf(stderr, "\tdel []\n"); fprintf(stderr, "\tget \n"); fprintf(stderr, "\tset [flags backup|nobackup|fullmesh|nofullmesh] [= port ]\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)) + @@ -894,6 +944,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 Mon May 6 03:15:49 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6638:2248:0:0:0:0 with SMTP id m8csp375913jas; Thu, 27 Jan 2022 16:39:02 -0800 (PST) X-Google-Smtp-Source: ABdhPJzBWFg9ZRuI66uf2VQY1KyDmkNEg/5S/Jl7T3hOasQo5H8qTC6a9rR336DLWkif2fo79nve X-Received: by 2002:a63:5f4f:: with SMTP id t76mr4519338pgb.328.1643330342062; Thu, 27 Jan 2022 16:39:02 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1643330342; cv=none; d=google.com; s=arc-20160816; b=N6BgeAVuWBd5Bat6V255cLnLs+m5JqKrIAl6U0oxBQm8cCii9mDSCssJa2yh9g8qoU 1l4GgMmWR8DiHt3nwh2Ms6pwTtYsCaNDD5Bio/iUuU4RTU/FEhKXfAmNxQ+yeuOy84Oq H86w5oMbJv9eX3OJe6WxnKxG89QbkXM03NT7ImqZ2AwkVOKpCkrHY0g5oZPMdVmUyMuj eLnGHeQ/u+blieelE2lFJkVcE2+hU23QWp4VR6Tw0olSkd5fJwfGrPTjAANGp4FtlE3k QXK9ysew+ryEGw8mFoJuetVQ1GyePDTRR2VfcI1zsfT1nIuAu7jX+ki90fWgOcSreEm2 U0zg== 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=yzpmkW0Ia0K0PpYzNrF0nkHAW2R1Ze6RmYJljNOFAGI=; b=K+fTxMTV2InjO/xxDUfuWnWnCuCtRRm0VjgaHNw6Rn41qSYjrFt0SCPCFk/813yZu5 77urmwYuEICaRce5VnwJqM8hkU7LIycNndEvMakmdRGiiGceuX4tMWyxcqaV6qVgr8q1 vOsz5r7jML+kvu1m6OfNGF2BLkNL6on5aw/bRZ1Jl9sQ3vqEGLPUkDMQAGjb3T0W4VgO 2X3h8JfJbHng+7rSdf8+iEPZ5y7UGvTsslYTow2cw08Lt4sc/58Wov9AhzwW+uAoMP0p 4EynzqsnBCd8tDOzdoMMbtGe/EUxT61c4+BjazMDqA8jTjSHf9GzP4/pJX3+ZLMtZbUB jrWw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=HFXt4Ei3; spf=pass (google.com: domain of mptcp+bounces-3351-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-3351-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 x9si2716849pll.619.2022.01.27.16.39.01 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 27 Jan 2022 16:39:02 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-3351-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=HFXt4Ei3; spf=pass (google.com: domain of mptcp+bounces-3351-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-3351-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 70E743E102C for ; Fri, 28 Jan 2022 00:39:01 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 9E1033FE0; Fri, 28 Jan 2022 00:38:50 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) (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 5B4343FCE for ; Fri, 28 Jan 2022 00:38:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1643330329; x=1674866329; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=zZ6+wJj7H7mfapWJABoH0drm3QdC+cEV5371LYb4HsU=; b=HFXt4Ei36qGSquKGyZ0NtXfvOIF/EUFIYEoASkrqZ2nKQHDcIrc2lLGQ mKPTnMFnBzmFvjZ6WkVSQNPmjzBAEixEG7C0YjxKq7q8riF3la/0dwR/u etvyn9haPwXx5mvWFedgslLQumCuBWbJ+s9okjwaS0uRXlJJorOXqvSZc 68y28dz+zx5IH5n26jcj15Dps0hQ2MqPhqrCFSxMpquWHnkA1ag3EUMUA M23iVI+1HQ3tR5qIwYoPhDpO5az71EQijWSccCaxPsHgebXsRJ1sjxtwA sWvNRz75wczN0tJBExV7epsSHq9XLXhQl18zwsCWuh3z3LGQYpIL1rbkn A==; X-IronPort-AV: E=McAfee;i="6200,9189,10239"; a="333358345" X-IronPort-AV: E=Sophos;i="5.88,322,1635231600"; d="scan'208";a="333358345" Received: from orsmga006.jf.intel.com ([10.7.209.51]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Jan 2022 16:38:43 -0800 X-IronPort-AV: E=Sophos;i="5.88,322,1635231600"; d="scan'208";a="480527139" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga006-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Jan 2022 16:38:41 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Cc: Florian Westphal Subject: [PATCH mptcp-next v3 10/14] mptcp: netlink: allow userspace-driven subflow establishment Date: Thu, 27 Jan 2022 19:38:32 -0500 Message-Id: <20220128003836.2732694-11-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220128003836.2732694-1-kishen.maloor@intel.com> References: <20220128003836.2732694-1-kishen.maloor@intel.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Florian Westphal This allows userspace to tell kernel to add a new subflow to an existing mptcp connection. Userspace provides the token to identify the mptcp-level connection that needs a change in active subflows and the local and remote addresses of the new or the to-be-removed subflow. MPTCP_PM_CMD_SUBFLOW_CREATE requires the following parameters: { token, { loc_id, family, loc_addr4 | loc_addr6 }, { family, rem_addr4 | rem_addr6, rem_port } MPTCP_PM_CMD_SUBFLOW_DESTROY requires the following parameters: { token, { family, loc_addr4 | loc_addr6, loc_port }, { family, rem_addr4 | rem_addr6, rem_port } Signed-off-by: Florian Westphal Co-developed-by: Kishen Maloor Signed-off-by: Kishen Maloor --- v2: fix build error when IPv6 is not enabled --- include/uapi/linux/mptcp.h | 3 + net/mptcp/pm_netlink.c | 201 +++++++++++++++++++++++++++++++++++++ 2 files changed, 204 insertions(+) diff --git a/include/uapi/linux/mptcp.h b/include/uapi/linux/mptcp.h index c2d7d3cefd02..b0b1cc7cddbe 100644 --- a/include/uapi/linux/mptcp.h +++ b/include/uapi/linux/mptcp.h @@ -57,6 +57,7 @@ enum { MPTCP_PM_ATTR_SUBFLOWS, /* u32 */ MPTCP_PM_ATTR_TOKEN, /* u32 */ MPTCP_PM_ATTR_LOC_ID, /* u8 */ + MPTCP_PM_ATTR_ADDR_REMOTE, /* nested address */ =20 __MPTCP_PM_ATTR_MAX }; @@ -97,6 +98,8 @@ enum { MPTCP_PM_CMD_SET_FLAGS, MPTCP_PM_CMD_ANNOUNCE, MPTCP_PM_CMD_REMOVE, + MPTCP_PM_CMD_SUBFLOW_CREATE, + MPTCP_PM_CMD_SUBFLOW_DESTROY, =20 __MPTCP_PM_CMD_AFTER_LAST }; diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index f2130374c5fc..056534761036 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -1314,6 +1314,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) @@ -1423,6 +1425,16 @@ static int mptcp_pm_parse_pm_addr_attr(struct nlattr= *tb[], return err; } =20 +static int mptcp_pm_parse_addr(struct nlattr *attr, struct genl_info *info, + struct mptcp_addr_info *addr) +{ + struct nlattr *tb[MPTCP_PM_ADDR_ATTR_MAX + 1]; + + memset(addr, 0, sizeof(*addr)); + + return mptcp_pm_parse_pm_addr_attr(tb, attr, info, addr, true); +} + static int mptcp_pm_parse_entry(struct nlattr *attr, struct genl_info *inf= o, bool require_family, struct mptcp_pm_addr_entry *entry) @@ -2552,6 +2564,185 @@ void mptcp_event(enum mptcp_event_type type, const = struct mptcp_sock *msk, kfree_skb(skb); } =20 +static int mptcp_nl_cmd_sf_create(struct sk_buff *skb, struct genl_info *i= nfo) +{ + struct nlattr *raddr =3D info->attrs[MPTCP_PM_ATTR_ADDR_REMOTE]; + struct nlattr *token =3D info->attrs[MPTCP_PM_ATTR_TOKEN]; + struct nlattr *laddr =3D info->attrs[MPTCP_PM_ATTR_ADDR]; + struct mptcp_addr_info addr_r; + struct mptcp_addr_info addr_l; + struct mptcp_sock *msk; + struct sock *sk; + u32 token_val; + int ret; + + if (!laddr || !raddr || !token) { + GENL_SET_ERR_MSG(info, "missing required inputs"); + return -EINVAL; + } + + token_val =3D nla_get_u32(token); + + msk =3D mptcp_token_get_sock(genl_info_net(info), token_val); + if (!msk) { + NL_SET_ERR_MSG_ATTR(info->extack, token, "invalid token"); + return -EINVAL; + } + + if (READ_ONCE(msk->pm.pm_type) !=3D MPTCP_PM_TYPE_USERSPACE) { + GENL_SET_ERR_MSG(info, "invalid request; userspace PM not selected"); + return -EINVAL; + } + + ret =3D mptcp_pm_parse_addr(laddr, info, &addr_l); + if (ret < 0) { + NL_SET_ERR_MSG_ATTR(info->extack, laddr, "error parsing local addr"); + return -EINVAL; + } + + if (addr_l.id =3D=3D 0) { + NL_SET_ERR_MSG_ATTR(info->extack, laddr, "missing local addr id"); + return -EINVAL; + } + + ret =3D mptcp_pm_parse_addr(raddr, info, &addr_r); + if (ret < 0) { + NL_SET_ERR_MSG_ATTR(info->extack, raddr, "error parsing remote addr"); + return -EINVAL; + } + + sk =3D &msk->sk.icsk_inet.sk; + lock_sock(sk); + + ret =3D __mptcp_subflow_connect(sk, &addr_l, &addr_r); + + release_sock(sk); + + return ret; +} + +static struct sock *mptcp_nl_find_ssk(struct mptcp_sock *msk, + const struct mptcp_addr_info *local, + const struct mptcp_addr_info *remote) +{ + struct sock *sk =3D &msk->sk.icsk_inet.sk; + struct mptcp_subflow_context *subflow; + struct sock *found =3D NULL; + + if (local->family !=3D remote->family) + return NULL; + + lock_sock(sk); + + mptcp_for_each_subflow(msk, subflow) { + const struct ipv6_pinfo *pinfo; + const struct inet_sock *issk; + struct sock *ssk; + + ssk =3D mptcp_subflow_tcp_sock(subflow); + + if (local->family !=3D ssk->sk_family) + continue; + + issk =3D inet_sk(ssk); + + switch (ssk->sk_family) { + case AF_INET: + if (issk->inet_saddr !=3D local->addr.s_addr || + issk->inet_daddr !=3D remote->addr.s_addr) + continue; + break; +#if IS_ENABLED(CONFIG_MPTCP_IPV6) + case AF_INET6: + pinfo =3D inet6_sk(ssk); + if (!ipv6_addr_equal(&local->addr6, &pinfo->saddr) || + !ipv6_addr_equal(&remote->addr6, &ssk->sk_v6_daddr)) + continue; + break; +#endif + default: + continue; + } + + if (issk->inet_sport =3D=3D local->port && + issk->inet_dport =3D=3D remote->port) { + found =3D ssk; + goto found; + } + } + +found: + release_sock(sk); + + return found; +} + +static int mptcp_nl_cmd_sf_destroy(struct sk_buff *skb, struct genl_info *= info) +{ + struct nlattr *raddr =3D info->attrs[MPTCP_PM_ATTR_ADDR_REMOTE]; + struct nlattr *token =3D info->attrs[MPTCP_PM_ATTR_TOKEN]; + struct nlattr *laddr =3D info->attrs[MPTCP_PM_ATTR_ADDR]; + struct mptcp_addr_info addr_l; + struct mptcp_addr_info addr_r; + struct mptcp_sock *msk; + struct sock *sk, *ssk; + u32 token_val; + int ret; + + if (!laddr || !raddr || !token) { + GENL_SET_ERR_MSG(info, "missing required inputs"); + return -EINVAL; + } + + token_val =3D nla_get_u32(token); + + msk =3D mptcp_token_get_sock(genl_info_net(info), token_val); + if (!msk) { + NL_SET_ERR_MSG_ATTR(info->extack, token, "invalid token"); + return -EINVAL; + } + + if (READ_ONCE(msk->pm.pm_type) !=3D MPTCP_PM_TYPE_USERSPACE) { + GENL_SET_ERR_MSG(info, "invalid request; userspace PM not selected"); + return -EINVAL; + } + + ret =3D mptcp_pm_parse_addr(laddr, info, &addr_l); + if (ret < 0) { + NL_SET_ERR_MSG_ATTR(info->extack, laddr, "error parsing local addr"); + return ret; + } + + ret =3D mptcp_pm_parse_addr(raddr, info, &addr_r); + if (ret < 0) { + NL_SET_ERR_MSG_ATTR(info->extack, raddr, "error parsing remote addr"); + return ret; + } + + if (addr_l.family !=3D addr_r.family) { + GENL_SET_ERR_MSG(info, "address families do not match"); + return -EINVAL; + } + + if (!addr_l.port || !addr_r.port) { + GENL_SET_ERR_MSG(info, "missing local or remote port"); + return -EINVAL; + } + + sk =3D &msk->sk.icsk_inet.sk; + ssk =3D mptcp_nl_find_ssk(msk, &addr_l, &addr_r); + if (ssk) { + struct mptcp_subflow_context *subflow =3D mptcp_subflow_ctx(ssk); + + mptcp_subflow_shutdown(sk, ssk, RCV_SHUTDOWN | SEND_SHUTDOWN); + mptcp_close_ssk(sk, ssk, subflow); + } else { + ret =3D -ESRCH; + } + + return ret; +} + static const struct genl_small_ops mptcp_pm_ops[] =3D { { .cmd =3D MPTCP_PM_CMD_ADD_ADDR, @@ -2597,6 +2788,16 @@ static const struct genl_small_ops mptcp_pm_ops[] = =3D { .doit =3D mptcp_nl_cmd_remove, .flags =3D GENL_ADMIN_PERM, }, + { + .cmd =3D MPTCP_PM_CMD_SUBFLOW_CREATE, + .doit =3D mptcp_nl_cmd_sf_create, + .flags =3D GENL_ADMIN_PERM, + }, + { + .cmd =3D MPTCP_PM_CMD_SUBFLOW_DESTROY, + .doit =3D mptcp_nl_cmd_sf_destroy, + .flags =3D GENL_ADMIN_PERM, + }, }; =20 static struct genl_family mptcp_genl_family __ro_after_init =3D { --=20 2.31.1 From nobody Mon May 6 03:15:49 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6638:2248:0:0:0:0 with SMTP id m8csp375920jas; Thu, 27 Jan 2022 16:39:03 -0800 (PST) X-Google-Smtp-Source: ABdhPJz6uhGGVopFsTn3WDyKx3GLkTtspodxq/BHPv1ah2s4eLoCYVP4ffMZc39ViiCihzIgl1Sg X-Received: by 2002:a17:902:9689:: with SMTP id n9mr6049142plp.33.1643330342831; Thu, 27 Jan 2022 16:39:02 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1643330342; cv=none; d=google.com; s=arc-20160816; b=CZuTxVh688w2btaDkp+/+q5cUG/ljixiH33WkO5z8lxxcQ7rt6SsVfnE12JlQlrGcz Z8+wGdpKTnGetz2sU6zeff3r0/NsbWoCtF8EG7gFX3EH7OgkWdhq/D1GXSgpXIiXEdSy w9QDsO4l5nBLyh8lCefqADM/YxCSMnzOxnefnfiIkQqcH46N4r6H12mYFWblAmYFGP6N HumYmRfcjCClTq2IOKLBwR3AyNINc9ZfOCbyUHzQh+5ID4ftLe3N6Y2r9ZtbR1Sv2dHV ZMw8OJ6h8+Nue1QlqjHO87WO9QPm+Ba/bl7unWykShZ9sPPRADr0S5U7BiPKRawAjlR8 D8cA== 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=UMccZNnYA4LkMA8Tt0o+UMWHehFnmS2QIyG6WnEX8b4=; b=WzXkycFmFCjKUv2Spue7yg6oGXFGSETjhFIyWkC75l0LAYdzwmsmKtabPVsksc40Vh /MB/uorxNQfX8a5LeUY8jL75Ess3fyfLtHvnj+G5qNglE7h04VdDdVkF4NrsWtlyh/VD ZgZQ4ygJZGol0saCNx3XC86U8Q0ini+6m71ejz/R1MAMpoNJH2b0GJo2zNJhFS6B37j+ vMHC/S8EeAxBRspPnPwDJGWfz9/ijA9yiNw1mqa0xjf7NtFxcFczSd70N85PDElBxtRv VuQqSSs8Gc9wUJut/QKae0oNaHlzbOE0XsCo+3Xsn6c+w8kQeaIlqb8MQ6EcdkCG2itD H08Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b="jet3P/59"; spf=pass (google.com: domain of mptcp+bounces-3352-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-3352-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 f131si3690169pgc.849.2022.01.27.16.39.02 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 27 Jan 2022 16:39:02 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-3352-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="jet3P/59"; spf=pass (google.com: domain of mptcp+bounces-3352-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-3352-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 7D7813E100A for ; Fri, 28 Jan 2022 00:39:02 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 288EA3FE1; Fri, 28 Jan 2022 00:38:51 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) (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 EC8BF3FD3 for ; Fri, 28 Jan 2022 00:38:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1643330328; x=1674866328; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=0HXyDVI27mEJQ7Adv2q/PmSgPxiI9YqnMzQa+oavOlk=; b=jet3P/59RPNICDa3/3DZ45lRD068ynbjFbMgKpzOZGzkNTLr67QWNCgP nRjq0vaR/SpBQf/C0mBCBZhkeDJO5PfKt/5/EXSU0wV+11gCQBE/zeXng FuOWH/bJjCTGM224aU9O4aY9pOQt9h7Pm0Kr5JWjAzn8WBlIUV3xY0eyG Am+YEodXL+KkAM7usTlLdfSpq0Pwl17XkVsNSMpB2zed/titXe+nR7xUS GtlfYq3Ofaw4P04Rr7P8nyuFmS2ly9Wx4fXsoCT8iIBt5+pzfUFgrz4rU Ec4sGnfL0+BZsSDLtZGkWOqt7eO7CGwibE+xYNlMOn2pwA1AyZzrFG8HU g==; X-IronPort-AV: E=McAfee;i="6200,9189,10239"; a="333358341" X-IronPort-AV: E=Sophos;i="5.88,322,1635231600"; d="scan'208";a="333358341" Received: from orsmga006.jf.intel.com ([10.7.209.51]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Jan 2022 16:38:43 -0800 X-IronPort-AV: E=Sophos;i="5.88,322,1635231600"; d="scan'208";a="480527135" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga006-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Jan 2022 16:38:41 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v3 11/14] mptcp: selftests: support MPTCP_PM_CMD_SUBFLOW_CREATE Date: Thu, 27 Jan 2022 19:38:33 -0500 Message-Id: <20220128003836.2732694-12-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220128003836.2732694-1-kishen.maloor@intel.com> References: <20220128003836.2732694-1-kishen.maloor@intel.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This change updates the "pm_nl_ctl" testing sample with a "csf" (create subflow) option to support the newly added netlink interface command MPTCP_PM_CMD_SUBFLOW_CREATE over the chosen MPTCP connection. E.g. ./pm_nl_ctl csf lip 10.0.2.1 lid 23 rip 10.0.2.2 rport 56789 token 823274047 Signed-off-by: Kishen Maloor --- tools/testing/selftests/net/mptcp/pm_nl_ctl.c | 129 ++++++++++++++++++ 1 file changed, 129 insertions(+) diff --git a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c b/tools/testing/= selftests/net/mptcp/pm_nl_ctl.c index 8cde5053f082..0ba357ab6e4e 100644 --- a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c +++ b/tools/testing/selftests/net/mptcp/pm_nl_ctl.c @@ -29,6 +29,7 @@ static void syntax(char *argv[]) fprintf(stderr, "\tadd [flags signal|subflow|backup|fullmesh|nolisten] [i= d ] [dev ] \n"); fprintf(stderr, "\tann id token [port ] [dev ] [nolisten]\n"); fprintf(stderr, "\trem id token \n"); + fprintf(stderr, "\tcsf lip lid rip rpor= t token \n"); fprintf(stderr, "\tdel []\n"); fprintf(stderr, "\tget \n"); fprintf(stderr, "\tset [flags backup|nobackup|fullmesh|nofullmesh] [= port ]\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)) + @@ -946,6 +1073,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 Mon May 6 03:15:49 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6638:2248:0:0:0:0 with SMTP id m8csp375974jas; Thu, 27 Jan 2022 16:39:06 -0800 (PST) X-Google-Smtp-Source: ABdhPJzV1E3iHg7q+3r1LXMmW5KrxChd2tlDFme7DZpl0zjTxyWS6XurPaw+eILWp2isevAv+RwI X-Received: by 2002:a17:90b:146:: with SMTP id em6mr16904576pjb.214.1643330346584; Thu, 27 Jan 2022 16:39:06 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1643330346; cv=none; d=google.com; s=arc-20160816; b=pcBGYQQnWoTFbwZsLhTWDdGZbYJeiWtQoQi91WdEk4T/Lx9FDz0Pe7OLkwLGaeTu3S zac+jGSd/7qBYbfB+e97j03LoJ8WMkI3SjfRkW8dgw6x2FDcVQoGqlXHzMSFgObdXSM5 R/TrLzwSbywyFiUutDRh4ubtxEU1RfKBOXLgDg7CsyqSQBZcMy8uHYdJT4nc71al8aom RZW+Dkk7P+OANKlr5tYWKwyQ7s2L9KUg43fBFXx8PciwuswGslSS/q/6E5exKz5B/EzH wXyMFgOM1Qy1GqedQZmF1CvuXIrO2hRRoNn5LiB47IdHKYhVQIvW0OlweI3keM0prGYh zk6g== 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=Xa+IYZow9Bvpgd/qWmGROxjP0otLa758oYe/Fx8WRZs=; b=xuB/SMAISxSwd91aTT8M8FIoVK+lAKBJTMyd3MgUv9Kt4uiZ8EUzW6bb7o1GRZPA/7 PVGIzK5jQ+buQ8FNh3Z6WmBMn+HSCkmrtTBY1zEu4CdjsPsb2G5v6EdLEXzflrWAWZFr 6zXjog207ld49KJlLCFrzax9YfMCPviwRC3syxXROjewDF+f0yQQ7lPIr0If8KhMLneQ UIfTQIMusQfCWEwIGQpyxUUSZiDa12KCbvSsP1NcZRGjB1cRACnhu0i9oUxiW3vCRjqd TwBlknsubow9D5/PoMUkWcbRDagx07ETKSymhN0v+nbeWtCDfSyryOCw0p8m0BE2kMhf Ufyg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=lCgEqahQ; spf=pass (google.com: domain of mptcp+bounces-3355-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3355-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 j17si3994123pfj.170.2022.01.27.16.39.06 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 27 Jan 2022 16:39:06 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-3355-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=lCgEqahQ; spf=pass (google.com: domain of mptcp+bounces-3355-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3355-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 398AF3E103C for ; Fri, 28 Jan 2022 00:39:06 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 34A4B3FDA; Fri, 28 Jan 2022 00:38:52 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) (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 2EF5A3FD3 for ; Fri, 28 Jan 2022 00:38:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1643330331; x=1674866331; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=IBulqfuSBFLGNFY77emSb/EM9M+rD8qDo+li1p7GaAI=; b=lCgEqahQxGWwbW3RoU+x4t06UE2K+3eLOcBxqZqvk+4GuYWuYYueLljJ RCnRlAEANgKIgDvrC7LowPHXwsxlMcYY42ucp4ZulGQWlyz2NfjR29nwv hMRIyVVDsBimMdJzkyIBSZz7Y11Jz4S7Kmm0mA1iXvyIminPazF7bwcnu uUTkpmcc2WScHpd7ufUBSUlS+gp81ZRrd47f/vmIC+SZrh0vm4OqNUjzk Zsrl4Fy1ggAWhXMzrAQ3fQqUkKirUR3Skn7qFMIqNo0+OjTUlDtntd550 Hq6InlTNtZwickNTpjKe7R/6YnZjM6CKGecWuQ/7b1k570721Cxuy25sD A==; X-IronPort-AV: E=McAfee;i="6200,9189,10239"; a="333358342" X-IronPort-AV: E=Sophos;i="5.88,322,1635231600"; d="scan'208";a="333358342" Received: from orsmga006.jf.intel.com ([10.7.209.51]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Jan 2022 16:38:43 -0800 X-IronPort-AV: E=Sophos;i="5.88,322,1635231600"; d="scan'208";a="480527142" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga006-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Jan 2022 16:38:41 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v3 12/14] mptcp: selftests: support MPTCP_PM_CMD_SUBFLOW_DESTROY Date: Thu, 27 Jan 2022 19:38:34 -0500 Message-Id: <20220128003836.2732694-13-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220128003836.2732694-1-kishen.maloor@intel.com> References: <20220128003836.2732694-1-kishen.maloor@intel.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This change updates the "pm_nl_ctl" testing sample with a "dsf" (destroy subflow) option to support the newly added netlink interface command MPTCP_PM_CMD_SUBFLOW_DESTROY over the chosen MPTCP connection. E.g. ./pm_nl_ctl dsf lip 10.0.2.1 lport 44567 rip 10.0.2.2 rport 56789 token 823274047 Signed-off-by: Kishen Maloor --- tools/testing/selftests/net/mptcp/pm_nl_ctl.c | 115 ++++++++++++++++++ 1 file changed, 115 insertions(+) diff --git a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c b/tools/testing/= selftests/net/mptcp/pm_nl_ctl.c index 0ba357ab6e4e..8d595b653b11 100644 --- a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c +++ b/tools/testing/selftests/net/mptcp/pm_nl_ctl.c @@ -30,6 +30,7 @@ static void syntax(char *argv[]) fprintf(stderr, "\tann id token [port ] [dev ] [nolisten]\n"); fprintf(stderr, "\trem id token \n"); fprintf(stderr, "\tcsf lip lid rip rpor= t token \n"); + fprintf(stderr, "\tdsf lip lport rip = rport token \n"); fprintf(stderr, "\tdel []\n"); fprintf(stderr, "\tget \n"); fprintf(stderr, "\tset [flags backup|nobackup|fullmesh|nofullmesh] [= port ]\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)) + @@ -1075,6 +1188,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 Mon May 6 03:15:49 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6638:2248:0:0:0:0 with SMTP id m8csp375992jas; Thu, 27 Jan 2022 16:39:08 -0800 (PST) X-Google-Smtp-Source: ABdhPJxYKTA/rgYACT1TCbd1rJwQfM3t8nBtu3KZAT+V5MNHK8bJZiyeCSuWQg9nnMuybxTz8YBz X-Received: by 2002:a17:902:6943:: with SMTP id k3mr5443700plt.127.1643330347867; Thu, 27 Jan 2022 16:39:07 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1643330347; cv=none; d=google.com; s=arc-20160816; b=TZsvvvRWz2X5G1ey4/n+dKuPL4HK1oTd0fd1/ZaMetwGlX7oxMSCq23NTyh3LwcZRV yUDLw9sh1BIx4+Yzu1jQKbLtURK0BRmwy8m/Pj8jBJGkng1HhOkit4fWcDSVMgLF9588 DqvGhlxZSjzfy4KnDLFJcBbrseNuoy6pDTw936El+Sq1OPw0tytGTF0lYJBg8WB6f473 j+TANsUl2daUX5n642ITY6aVKa4RWEclqthpMt+aLB+ananFIEztieLOmbGMVpvYFNR/ 1E9HuEPyPrO5KAz6WdPX+KR5cS4enHU67zYhfHt/iEF9GljZNlXKMqL5ZEM3XY+Vm2uv fmTQ== 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=I7e0emGKWBwbAyLsmec3+GQDWbxHu5IYOnA8+LGw2/s=; b=ei+HPzPIWfiM+4x3Z4AgSEjcYhk3T7KOrRIKhKJfsZinTTAq/dhOjE71rJGIXq1c/z x6FUgUlJ5pjRZmZz7hIgYZZuyzo1dxmovr64GKpEslfsmJ4zE4yO8i3mJ2mGoiyNfEyh 3/LiN8aDqQojCxtuizicVzH6ZnQsbjNP3+sYNjxWI3gY1obNIT4kO6JG5MbY9SzTHJd2 ZEEvUO8htJwYtEOqahw9pGQHzkYWIpZWmSTvNfYowFzSTUyEnISUgXo/hAwNh1yAuzeY 994Bz5dfsdfhbYH4+7soz4P1rr97KkNui0ZSaj2GZrBf0AvfgpJYzd7t4Qapw9Tf6oy+ ANVg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=bqgFa6gY; spf=pass (google.com: domain of mptcp+bounces-3356-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3356-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 q3si3623002pgc.457.2022.01.27.16.39.07 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 27 Jan 2022 16:39:07 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-3356-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=bqgFa6gY; spf=pass (google.com: domain of mptcp+bounces-3356-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3356-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 4DB563E1048 for ; Fri, 28 Jan 2022 00:39:07 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 0A53A3FD3; Fri, 28 Jan 2022 00:38:53 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) (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 DCFA43FE5 for ; Fri, 28 Jan 2022 00:38:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1643330331; x=1674866331; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=Id613LNbacVE4tcWTbpsOGvuCJZxhB3b8Jtip0hewM4=; b=bqgFa6gY21WYgs0wHOxzQqVU+KWzuqgd1J56NK+o8OnKYbIOTeQnEBq+ xrkhbZbWED5FKgFN3EtQEiXoKFIDiBWRLs8rtscbse3iryQPrXYA0/wp7 +YAYOp0eG0BnoEUp6TBtPgqBzTfWXEs/r6gZk4313C2NBysK7MLEIbMK9 SsaXU+qtz01tPWiP1IZOVQzJYn8pUTSoCcXBd4pLUrajE/kCNJeOgWtgt kFeKOQIgzWr3OVdo7WTVSYphSsHRVikZqYNxh5PzWN0nWNsV60aLuCFlm p3kO3vPwFZpz7wRsf5VoADRBuRqjBXYYD5iIaRUSfSyRIRM3mAQwjwHUT A==; X-IronPort-AV: E=McAfee;i="6200,9189,10239"; a="333358346" X-IronPort-AV: E=Sophos;i="5.88,322,1635231600"; d="scan'208";a="333358346" Received: from orsmga006.jf.intel.com ([10.7.209.51]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Jan 2022 16:38:43 -0800 X-IronPort-AV: E=Sophos;i="5.88,322,1635231600"; d="scan'208";a="480527145" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga006-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Jan 2022 16:38:41 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v3 13/14] mptcp: selftests: capture netlink events Date: Thu, 27 Jan 2022 19:38:35 -0500 Message-Id: <20220128003836.2732694-14-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220128003836.2732694-1-kishen.maloor@intel.com> References: <20220128003836.2732694-1-kishen.maloor@intel.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This change adds to self-testing support for the MPTCP netlink interface by capturing various MPTCP netlink events (and all their metadata) associated with connections, subflows and local address announcements. It can be incorporated into self-test scripts that exercise the MPTCP netlink commands to then precisely validate those operations through the dispatched MPTCP netlink events in response to those commands. Signed-off-by: Kishen Maloor --- v3: support reading the new server_side attribute from the CREATED and ESTABLISHED netlink events --- tools/testing/selftests/net/mptcp/pm_nl_ctl.c | 164 +++++++++++++++++- 1 file changed, 157 insertions(+), 7 deletions(-) diff --git a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c b/tools/testing/= selftests/net/mptcp/pm_nl_ctl.c index 8d595b653b11..b1cd06c88cd7 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[]) @@ -1169,7 +1315,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); @@ -1178,7 +1326,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); @@ -1202,6 +1350,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 Mon May 6 03:15:49 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6638:2248:0:0:0:0 with SMTP id m8csp375985jas; Thu, 27 Jan 2022 16:39:07 -0800 (PST) X-Google-Smtp-Source: ABdhPJwYF0Fpc5OTzgT10AmLbvykOeOSgQ01ewEiHUCPrqUrF1Ep9ZNY4wR7QI7iWGdCpvdYlkGQ X-Received: by 2002:a05:6a00:23ce:: with SMTP id g14mr5472732pfc.13.1643330347030; Thu, 27 Jan 2022 16:39:07 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1643330347; cv=none; d=google.com; s=arc-20160816; b=eQ6bnMnZLLyMmEMqU8hpA0AmP9kiSy7pi0ZzC/vskU8cDVYzM5bck6Br5YUjWfhQpL B48hjZS24WSlvQOKGk6M3OaenvuXiegukkzE3/QyzzXNGU+HJXmzwt41DPO7myLZOPti 6lMp0QlVyWV8ubK3CyqtVyZUAsibEoIJ716vkWO5uuWYRtJF5cY2+NO79u0NH3pCCjk0 hF7QxsUVtMd7WzXq0PkBXuGzx1ZFb81MNqoL1reUo4djrHGzKV89vYdlZR7XL5l8UZHw XrhcrzT6ZZB2/X4uDRMnVreOyglF9BpepRuHjHe8CwC6Ogo7If9QKJV4Vyq6JJXRXBl/ 9vmQ== 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=4QiPRqfGhMb++DJ/eSuGoCx2Abx93yw/Figg7+6Hjgs=; b=ii7kbkaj6qCVrl9DNzQfaYN9GyHDOWepYKbVqcjD8mJFM7hZ9DBkZWxy6REUJ++sGm JMAI9XRC6d9FN64PB6dTlMQ5usdpQ9BUnzKAI8NU/4CBQ5jDVqr5uEgO7o1BiFntVMmi 37jqeCuztZ4gv61boj6K3pBu5Fh71x0SO+DJqe5JhlRQ4QgKDzRHu/UjL4Pm7g1dDpz4 KfQgzlZTJQK5C3qK3Ir1G+tEEpS5XoNZfOr3kOq5KTuA9ylLItQk0g4QKpz1vcU3n1Yr u2DyF9REAzcv3bnD4IoigWhee8NfyemXFLif9KeQKbc3MpTmvdL/b4di19I8iZhrff/k f7Sw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=ZdApkBCE; spf=pass (google.com: domain of mptcp+bounces-3354-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-3354-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 p2si3531111pgm.260.2022.01.27.16.39.06 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 27 Jan 2022 16:39:07 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-3354-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=ZdApkBCE; spf=pass (google.com: domain of mptcp+bounces-3354-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-3354-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 4DB111C0F4E for ; Fri, 28 Jan 2022 00:39:05 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id D51113FE4; Fri, 28 Jan 2022 00:38:51 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) (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 2B0683FDA for ; Fri, 28 Jan 2022 00:38:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1643330330; x=1674866330; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=ELbiYrgmIgR3TzghP7HHJr+pKKAcG67pb6iJuxvvxjw=; b=ZdApkBCExfTNa+9Tl3kPugYLyFUBPnej3YzJLLwdldzlMEH+9mha+bUc yMgOMWqof8kbujDT/IgPEzBfrXMMxhnj6GsKy3og0N0iEJuzd3DaPcfWg jxeRnJvq2euU7fKEQQHT04gGl5FcObUIejCxy528UbsFkaye9AB033Hsc lqPXrUGhSrQxDb3mHPoMO7/XDfEg8kenPh1gY86dF1bL4MTSYqry0BM2V VBLZeDZoLLbtEhKBYGZt+ETkPEtY7g4vGa8JyjVZKzlGXI+Mcm9AdBAfv 83yTnNch7fcEmk+BJPyEO7QAKhcEmhOkNB7vR7X9BmhJKMljZFgyK39Xz A==; X-IronPort-AV: E=McAfee;i="6200,9189,10239"; a="333358348" X-IronPort-AV: E=Sophos;i="5.88,322,1635231600"; d="scan'208";a="333358348" Received: from orsmga006.jf.intel.com ([10.7.209.51]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Jan 2022 16:38:43 -0800 X-IronPort-AV: E=Sophos;i="5.88,322,1635231600"; d="scan'208";a="480527147" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga006-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Jan 2022 16:38:41 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v3 14/14] selftests: mptcp: functional tests for the userspace PM type Date: Thu, 27 Jan 2022 19:38:36 -0500 Message-Id: <20220128003836.2732694-15-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220128003836.2732694-1-kishen.maloor@intel.com> References: <20220128003836.2732694-1-kishen.maloor@intel.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This change adds a selftest script that performs a comprehensive behavioral/functional test of all userspace PM capabilities by exercising all the newly added APIs and changes to support said capabilities. Signed-off-by: Kishen Maloor --- v3: configure net.mptcp.userspace_pm_local_addr_max via sysctl on the namespaces established for testing, read and verify the new "server_side" attribute from netlink events upon connection establishment, new test case for sysctl configured local_addr limit, added descriptive remarks throughout script --- .../selftests/net/mptcp/userspace_pm.sh | 656 ++++++++++++++++++ 1 file changed, 656 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..cc6c03626c21 --- /dev/null +++ b/tools/testing/selftests/net/mptcp/userspace_pm.sh @@ -0,0 +1,656 @@ +#!/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 + ip netns exec $i sysctl -q net.mptcp.userspace_pm_local_addr_max=3D2 +done + +# "$ns1" ns2 +# ns1eth2 ns2eth1 + +ip link add ns1eth2 netns "$ns1" type veth peer name ns2eth1 netns "$ns2" + +# Add IPv4/v6 addresses to the namespaces +ip -net "$ns1" addr add 10.0.1.1/24 dev ns1eth2 +ip -net "$ns1" addr add 10.0.2.1/24 dev ns1eth2 +ip -net "$ns1" addr add dead:beef:1::1/64 dev ns1eth2 nodad +ip -net "$ns1" addr add dead:beef:2::1/64 dev ns1eth2 nodad +ip -net "$ns1" link set ns1eth2 up + +ip -net "$ns2" addr add 10.0.1.2/24 dev ns2eth1 +ip -net "$ns2" addr add 10.0.2.2/24 dev ns2eth1 +ip -net "$ns2" addr add dead:beef:1::2/64 dev ns2eth1 nodad +ip -net "$ns2" addr add dead:beef:2::2/64 dev ns2eth1 nodad +ip -net "$ns2" link set ns2eth1 up + +printf "Created network namespaces ns1, ns2 \t\t\t[OK]\n" + +make_file() +{ + # Store a chunk of data in a file to transmit over an MPTCP connection + local name=3D$1 + local who=3D$2 + local ksize=3D1 + + dd if=3D/dev/urandom of=3D"$name" bs=3D1024 count=3D$ksize 2> /dev/null + echo -e "\nMPTCP_TEST_FILE_END_MARKER" >> "$name" +} + +make_connection() +{ + local file=3D$(mktemp) + make_file "$file" "client" + + local is_v6=3D$1 + local app_port=3D$app4_port + local connect_addr=3D"10.0.1.1" + local listen_addr=3D"0.0.0.0" + if [ "$is_v6" =3D "v6" ] + then + connect_addr=3D"dead:beef:1::1" + listen_addr=3D"::" + app_port=3D$app6_port + else + is_v6=3D"v4" + fi + + # Capture netlink events over the two network namespaces running + # the MPTCP client and server + local client_evts=3D$(mktemp) + :>"$client_evts" + ip netns exec $ns2 ./pm_nl_ctl events >> "$client_evts" 2>&1 & + local client_evts_pid=3D$! + local server_evts=3D$(mktemp) + :>"$server_evts" + ip netns exec $ns1 ./pm_nl_ctl events >> "$server_evts" 2>&1 & + local server_evts_pid=3D$! + sleep 0.1 + + # Run the server + ip netns exec $ns1 \ + ./mptcp_connect -s MPTCP -w 300 -p $app_port -l $listen_addr 2>&1 > /de= v/null & + local server_pid=3D$! + sleep 0.1 + + # Run the client, transfer $file and stay connected to the server + # to conduct tests + ip netns exec $ns2 \ + ./mptcp_connect -s MPTCP -w 300 -m sendfile -p $app_port $connect_addr = 2>&1 > /dev/null < $file & + local client_pid=3D$! + sleep 0.1 + + # Capture client/server attributes from MPTCP connection netlink events + kill $client_evts_pid + local client_token=3D$(sed -n 's/.*\(token:\)\([[:digit:]]*\).*$/\2/p;q' = "$client_evts") + local client_port=3D$(sed -n 's/.*\(sport:\)\([[:digit:]]*\).*$/\2/p;q' "= $client_evts") + local client_serverside=3D$(sed -n 's/.*\(server_side:\)\([[:digit:]]*\).= *$/\2/p;q' "$client_evts") + + kill $server_evts_pid + local server_token=3D$(sed -n 's/.*\(token:\)\([[:digit:]]*\).*$/\2/p;q' = "$server_evts") + local server_serverside=3D$(sed -n 's/.*\(server_side:\)\([[:digit:]]*\).= *$/\2/p;q' "$server_evts") + + rm -f "$client_evts" "$server_evts" "$file" + + if [ $client_token !=3D "" ] && [ $server_token !=3D "" ] && [ $client_se= rverside =3D 0 ] && [ $server_serverside =3D 1 ] + then + printf "Established IP%s MPTCP Connection ns2 =3D> ns1 \t\t[OK]\n" $i= s_v6 + else + exit 1 + fi + + if [ "$is_v6" =3D "v6" ] + then + client6_token=3D$client_token + server6_token=3D$server_token + client6_port=3D$client_port + client6_pid=3D$client_pid + server6_pid=3D$server_pid + else + client4_token=3D$client_token + server4_token=3D$server_token + client4_port=3D$client_port + client4_pid=3D$client_pid + server4_pid=3D$server_pid + fi +} + +verify_announce_event() +{ + local evt=3D$1 + local e_type=3D$2 + local e_token=3D$3 + local e_addr=3D$4 + local e_id=3D$5 + local e_dport=3D$6 + local e_af=3D$7 + + local type=3D$(sed -n 's/.*\(type:\)\([[:digit:]]*\).*$/\2/p;q' "$evt") + local token=3D$(sed -n 's/.*\(token:\)\([[:digit:]]*\).*$/\2/p;q' "$evt") + local addr=3D"" + if [ "$e_af" =3D "v6" ] + then + addr=3D$(sed -n 's/.*\(daddr6:\)\([0-9a-f:.]*\).*$/\2/p;q' "$evt") + else + addr=3D$(sed -n 's/.*\(daddr4:\)\([0-9.]*\).*$/\2/p;q' "$evt") + fi + local dport=3D$(sed -n 's/.*\(dport:\)\([[:digit:]]*\).*$/\2/p;q' "$evt") + local id=3D$(sed -n 's/.*\(rem_id:\)\([[:digit:]]*\).*$/\2/p;q' "$evt") + if [ "$type" =3D "$e_type" ] && [ "$token" =3D "$e_token" ] && [ "= $addr" =3D "$e_addr" ] && [ "$dport" =3D "$e_dport" ] && [ "$id" =3D "$e_id= " ] + then + printf "[OK]\n" + return 0 + fi + printf "[FAIL]\n" + exit 1 +} + +test_announce() +{ + local evts=3D$(mktemp) + # Capture events on the network namespace running the server + :>"$evts" + ip netns exec $ns1 ./pm_nl_ctl events >> "$evts" 2>&1 & + evts_pid=3D$! + sleep 0.1 + + # ADD_ADDR using an invalid token should result in no action + local invalid_token=3D$(( $client4_token - 1)) + ip netns exec $ns2 ./pm_nl_ctl ann 10.0.2.2 token $invalid_token id $clie= nt_addr_id dev ns2eth1 2>&1 > /dev/null + local type=3D$(sed -n 's/.*\(type:\)\([[:digit:]]*\).*$/\2/p;q' "$evts") + printf "ADD_ADDR 10.0.2.2 (ns2) =3D> ns1, invalid token \t\t" + if [ "$type" =3D "" ] + then + printf "[OK]\n" + else + printf "[FAIL]\n" + exit 1 + fi + + # 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 $clie= nt_addr_id dev ns2eth1 2>&1 > /dev/null + printf "ADD_ADDR id:%d 10.0.2.2 (ns2) =3D> ns1, reuse port \t\t" $client_= addr_id + sleep 0.1 + verify_announce_event "$evts" "$ANNOUNCED" "$server4_token" "10.0.2.2" "$= client_addr_id" "$client4_port" + + # ADD_ADDR6 from the client to server machine reusing the subflow port + :>"$evts" + ip netns exec $ns2 ./pm_nl_ctl ann dead:beef:2::2 token $client6_token id= $client_addr_id dev ns2eth1 2>&1 > /dev/null + printf "ADD_ADDR6 id:%d dead:beef:2::2 (ns2) =3D> ns1, reuse port\t\t" $c= lient_addr_id + sleep 0.1 + verify_announce_event "$evts" "$ANNOUNCED" "$server6_token" "dead:beef:2:= :2" "$client_addr_id" "$client6_port" "v6" + + # ADD_ADDR from the client to server machine using a new port + :>"$evts" + client_addr_id=3D$((client_addr_id+1)) + ip netns exec $ns2 ./pm_nl_ctl ann 10.0.2.2 token $client4_token id $clie= nt_addr_id dev ns2eth1 port $new4_port 2>&1 > /dev/null + printf "ADD_ADDR id:%d 10.0.2.2 (ns2) =3D> ns1, new port \t\t\t" $client_= addr_id + sleep 0.1 + verify_announce_event "$evts" "$ANNOUNCED" "$server4_token" "10.0.2.2" "$= client_addr_id" "$new4_port" + + kill $evts_pid + + # 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 $serv= er_addr_id dev ns1eth2 2>&1 > /dev/null + printf "ADD_ADDR id:%d 10.0.2.1 (ns1) =3D> ns2, reuse port \t\t" $server_= addr_id + sleep 0.1 + verify_announce_event "$evts" "$ANNOUNCED" "$client4_token" "10.0.2.1" "$= server_addr_id" "$app4_port" + + # ADD_ADDR6 from the server to client machine reusing the subflow port + :>"$evts" + ip netns exec $ns1 ./pm_nl_ctl ann dead:beef:2::1 token $server6_token id= $server_addr_id dev ns1eth2 2>&1 > /dev/null + printf "ADD_ADDR6 id:%d dead:beef:2::1 (ns1) =3D> ns2, reuse port\t\t" $s= erver_addr_id + sleep 0.1 + verify_announce_event "$evts" "$ANNOUNCED" "$client6_token" "dead:beef:2:= :1" "$server_addr_id" "$app6_port" "v6" + + # ADD_ADDR from the server to client machine using a new port + :>"$evts" + server_addr_id=3D$((server_addr_id+1)) + ip netns exec $ns1 ./pm_nl_ctl ann 10.0.2.1 token $server4_token id $serv= er_addr_id dev ns1eth2 port $new4_port 2>&1 > /dev/null + printf "ADD_ADDR id:%d 10.0.2.1 (ns1) =3D> ns2, new port \t\t\t" $server_= addr_id + sleep 0.1 + verify_announce_event "$evts" "$ANNOUNCED" "$client4_token" "10.0.2.1" "$= server_addr_id" "$new4_port" + + kill $evts_pid + rm -f "$evts" +} + +verify_remove_event() +{ + local evt=3D$1 + local e_type=3D$2 + local e_token=3D$3 + local e_id=3D$4 + + local type=3D$(sed -n 's/.*\(type:\)\([[:digit:]]*\).*$/\2/p;q' "$evt") + local token=3D$(sed -n 's/.*\(token:\)\([[:digit:]]*\).*$/\2/p;q' "$evt") + local id=3D$(sed -n 's/.*\(rem_id:\)\([[:digit:]]*\).*$/\2/p;q' "$evt") + if [ "$type" =3D "$e_type" ] && [ "$token" =3D "$e_token" ] && [ "= $id" =3D "$e_id" ] + then + printf "[OK]\n" + return 0 + fi + printf "[FAIL]\n" + exit 1 +} + +test_remove() +{ + local evts=3D$(mktemp) + + # 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_i= d 2>&1 > /dev/null + printf "RM_ADDR id:%d ns2 =3D> ns1, invalid token \t" = $client_addr_id + local type=3D$(sed -n 's/.*\(type:\)\([[:digit:]]*\).*$/\2/p;q' "$evts") + if [ "$type" =3D "" ] + then + printf "[OK]\n" + else + printf "[FAIL]\n" + fi + + # RM_ADDR using an invalid addr id should result in no action + local invalid_id=3D$(( $client_addr_id + 1 )) + ip netns exec $ns2 ./pm_nl_ctl rem token $client4_token id $invalid_id 2>= &1 > /dev/null + printf "RM_ADDR id:%d ns2 =3D> ns1, invalid id \t" $in= valid_id + type=3D$(sed -n 's/.*\(type:\)\([[:digit:]]*\).*$/\2/p;q' "$evts") + if [ "$type" =3D "" ] + then + printf "[OK]\n" + else + printf "[FAIL]\n" + fi + + # RM_ADDR from the client to server machine + :>"$evts" + ip netns exec $ns2 ./pm_nl_ctl rem token $client4_token id $client_addr_i= d 2>&1 > /dev/null + printf "RM_ADDR id:%d ns2 =3D> ns1 \t" $cl= ient_addr_id + sleep 0.1 + verify_remove_event "$evts" "$REMOVED" "$server4_token" "$client_addr_id" + + # 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_i= d 2>&1 > /dev/null + printf "RM_ADDR id:%d ns2 =3D> ns1 \t" $cl= ient_addr_id + sleep 0.1 + verify_remove_event "$evts" "$REMOVED" "$server4_token" "$client_addr_id" + + # RM_ADDR6 from the client to server machine + :>"$evts" + ip netns exec $ns2 ./pm_nl_ctl rem token $client6_token id $client_addr_i= d 2>&1 > /dev/null + printf "RM_ADDR6 id:%d ns2 =3D> ns1 \t" $cl= ient_addr_id + sleep 0.1 + verify_remove_event "$evts" "$REMOVED" "$server6_token" "$client_addr_id" + + kill $evts_pid + + # 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_i= d 2>&1 > /dev/null + printf "RM_ADDR id:%d ns1 =3D> ns2 \t" $se= rver_addr_id + sleep 0.1 + verify_remove_event "$evts" "$REMOVED" "$client4_token" "$server_addr_id" + + # 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_i= d 2>&1 > /dev/null + printf "RM_ADDR id:%d ns1 =3D> ns2 \t" $se= rver_addr_id + sleep 0.1 + verify_remove_event "$evts" "$REMOVED" "$client4_token" "$server_addr_id" + + # RM_ADDR6 from the server to client machine + :>"$evts" + ip netns exec $ns1 ./pm_nl_ctl rem token $server6_token id $server_addr_i= d 2>&1 > /dev/null + printf "RM_ADDR6 id:%d ns1 =3D> ns2 \t" $se= rver_addr_id + sleep 0.1 + verify_remove_event "$evts" "$REMOVED" "$client6_token" "$server_addr_id" + + kill $evts_pid + rm -f "$evts" +} + +verify_subflow_events() +{ + local evt=3D$1 + local e_type=3D$2 + local e_token=3D$3 + local e_family=3D$4 + local e_saddr=3D$5 + local e_daddr=3D$6 + local e_dport=3D$7 + local e_locid=3D$8 + local e_remid=3D$9 + shift 2 + local e_from=3D$8 + local e_to=3D$9 + + if [ "$e_type" =3D "$SUB_ESTABLISHED" ] + then + if [ "$e_family" =3D "$AF_INET6" ] + then + printf "CREATE_SUBFLOW6 %s (%s) =3D> %s (%s) " $e_saddr $e_from $e_d= addr $e_to + else + printf "CREATE_SUBFLOW %s (%s) =3D> %s (%s) \t" $e_saddr $e_fro= m $e_daddr $e_to + fi + else + if [ "$e_family" =3D "$AF_INET6" ] + then + printf "DESTROY_SUBFLOW6 %s (%s) =3D> %s (%s) " $e_saddr $e_from $e_d= addr $e_to + else + printf "DESTROY_SUBFLOW %s (%s) =3D> %s (%s) \t" $e_saddr $e_fr= om $e_daddr $e_to + fi + fi + + local type=3D$(sed -n 's/.*\(type:\)\([[:digit:]]*\).*$/\2/p;q' "$evt") + local token=3D$(sed -n 's/.*\(token:\)\([[:digit:]]*\).*$/\2/p;q' "$evt") + local family=3D$(sed -n 's/.*\(family:\)\([[:digit:]]*\).*$/\2/p;q' "$evt= ") + local dport=3D$(sed -n 's/.*\(dport:\)\([[:digit:]]*\).*$/\2/p;q' "$evt") + local locid=3D$(sed -n 's/.*\(loc_id:\)\([[:digit:]]*\).*$/\2/p;q' "$evt") + local remid=3D$(sed -n 's/.*\(rem_id:\)\([[:digit:]]*\).*$/\2/p;q' "$evt") + local saddr=3D"" + local daddr=3D"" + if [ "$family" =3D "$AF_INET6" ] + then + saddr=3D$(sed -n 's/.*\(saddr6:\)\([0-9a-f:.]*\).*$/\2/p;q' "$evt") + daddr=3D$(sed -n 's/.*\(daddr6:\)\([0-9a-f:.]*\).*$/\2/p;q' "$evt") + else + saddr=3D$(sed -n 's/.*\(saddr4:\)\([0-9.]*\).*$/\2/p;q' "$evt") + daddr=3D$(sed -n 's/.*\(daddr4:\)\([0-9.]*\).*$/\2/p;q' "$evt") + fi + + if [ "$type" =3D "$e_type" ] && [ "$token" =3D "$e_token" ] && [ "= $daddr" =3D "$e_daddr" ] && [ "$e_dport" =3D "$dport" ] && [ "$family" =3D = "$e_family" ] && [ "$saddr" =3D "$e_saddr" ] && [ "$e_locid" =3D "$locid" ]= && [ "$e_remid" =3D "$remid" ] + then + printf "[OK]\n" + return 0 + fi + printf "[FAIL]\n" + exit 1 +} + +test_subflows() +{ + local evts=3D$(mktemp) + # Capture events on the network namespace running the server + :>"$evts" + ip netns exec $ns1 ./pm_nl_ctl events >> "$evts" 2>&1 & + evts_pid=3D$! + sleep 0.1 + + # ADD_ADDR from client to server machine reusing the subflow port + ip netns exec $ns2 ./pm_nl_ctl ann 10.0.2.2 token $client4_token id $clie= nt_addr_id 2>&1 > /dev/null + sleep 0.1 + + # CREATE_SUBFLOW from server to client machine + :>"$evts" + ip netns exec $ns1 ./pm_nl_ctl csf lip 10.0.2.1 lid 23 rip 10.0.2.2 rport= $client4_port token $server4_token 2>&1 > /dev/null + sleep 0.1 + verify_subflow_events "$evts" "$SUB_ESTABLISHED" "$server4_token" "$AF_IN= ET" "10.0.2.1" "10.0.2.2" "$client4_port" "23" "$client_addr_id" "ns1" "ns2" + + local sport=3D$(sed -n 's/.*\(sport:\)\([[:digit:]]*\).*$/\2/p;q' "$evts") + + # DESTROY_SUBFLOW from server to client machine + :>"$evts" + ip netns exec $ns1 ./pm_nl_ctl dsf lip 10.0.2.1 lport $sport rip 10.0.2.2= rport $client4_port token $server4_token 2>&1 > /dev/null + sleep 0.1 + verify_subflow_events "$evts" "$SUB_CLOSED" "$server4_token" "$AF_INET" "= 10.0.2.1" "10.0.2.2" "$client4_port" "23" "$client_addr_id" "ns1" "ns2" + + # RM_ADDR from client to server machine + ip netns exec $ns2 ./pm_nl_ctl rem id $client_addr_id token $client4_toke= n 2>&1 > /dev/null + sleep 0.1 + + # ADD_ADDR6 from client to server machine reusing the subflow port + :>"$evts" + ip netns exec $ns2 ./pm_nl_ctl ann dead:beef:2::2 token $client6_token id= $client_addr_id 2>&1 > /dev/null + sleep 0.1 + + # CREATE_SUBFLOW6 from server to client machine + :>"$evts" + ip netns exec $ns1 ./pm_nl_ctl csf lip dead:beef:2::1 lid 23 rip dead:bee= f:2::2 rport $client6_port token $server6_token 2>&1 > /dev/null + sleep 0.1 + verify_subflow_events "$evts" "$SUB_ESTABLISHED" "$server6_token" "$AF_IN= ET6" "dead:beef:2::1" "dead:beef:2::2" "$client6_port" "23" "$client_addr_i= d" "ns1" "ns2" + + local sport=3D$(sed -n 's/.*\(sport:\)\([[:digit:]]*\).*$/\2/p;q' "$evts") + + # DESTROY_SUBFLOW6 from server to client machine + :>"$evts" + ip netns exec $ns1 ./pm_nl_ctl dsf lip dead:beef:2::1 lport $sport rip de= ad:beef:2::2 rport $client6_port token $server6_token 2>&1 > /dev/null + sleep 0.1 + verify_subflow_events "$evts" "$SUB_CLOSED" "$server6_token" "$AF_INET6" = "dead:beef:2::1" "dead:beef:2::2" "$client6_port" "23" "$client_addr_id" "n= s1" "ns2" + + # RM_ADDR from client to server machine + ip netns exec $ns2 ./pm_nl_ctl rem id $client_addr_id token $client6_toke= n 2>&1 > /dev/null + sleep 0.1 + + # ADD_ADDR from client to server machine using a new port + :>"$evts" + ip netns exec $ns2 ./pm_nl_ctl ann 10.0.2.2 token $client4_token id $clie= nt_addr_id port $new4_port 2>&1 > /dev/null + sleep 0.1 + + # CREATE_SUBFLOW from server to client machine + :>"$evts" + ip netns exec $ns1 ./pm_nl_ctl csf lip 10.0.2.1 lid 23 rip 10.0.2.2 rport= $new4_port token $server4_token 2>&1 > /dev/null + sleep 0.1 + verify_subflow_events "$evts" "$SUB_ESTABLISHED" "$server4_token" "$AF_IN= ET" "10.0.2.1" "10.0.2.2" "$new4_port" "23" "$client_addr_id" "ns1" "ns2" + + sport=3D$(sed -n 's/.*\(sport:\)\([[:digit:]]*\).*$/\2/p;q' "$evts= ") + + # DESTROY_SUBFLOW from server to client machine + :>"$evts" + ip netns exec $ns1 ./pm_nl_ctl dsf lip 10.0.2.1 lport $sport rip 10.0.2.2= rport $new4_port token $server4_token 2>&1 > /dev/null + sleep 0.1 + verify_subflow_events "$evts" "$SUB_CLOSED" "$server4_token" "$AF_INET" "= 10.0.2.1" "10.0.2.2" "$new4_port" "23" "$client_addr_id" "ns1" "ns2" + + # RM_ADDR from client to server machine + ip netns exec $ns2 ./pm_nl_ctl rem id $client_addr_id token $client4_toke= n 2>&1 > /dev/null + + kill $evts_pid + + # Capture events on the network namespace running the client + :>"$evts" + ip netns exec $ns2 ./pm_nl_ctl events >> "$evts" 2>&1 & + evts_pid=3D$! + sleep 0.1 + + # ADD_ADDR from server to client machine reusing the subflow port + ip netns exec $ns1 ./pm_nl_ctl ann 10.0.2.1 token $server4_token id $serv= er_addr_id 2>&1 > /dev/null + sleep 0.1 + + # CREATE_SUBFLOW from client to server machine + :>"$evts" + ip netns exec $ns2 ./pm_nl_ctl csf lip 10.0.2.2 lid 23 rip 10.0.2.1 rport= $app4_port token $client4_token 2>&1 > /dev/null + sleep 0.1 + verify_subflow_events "$evts" "$SUB_ESTABLISHED" "$client4_token" "$AF_IN= ET" "10.0.2.2" "10.0.2.1" "$app4_port" "23" "$server_addr_id" "ns2" "ns1" + + sport=3D$(sed -n 's/.*\(sport:\)\([[:digit:]]*\).*$/\2/p;q' "$evts= ") + + # DESTROY_SUBFLOW from client to server machine + :>"$evts" + ip netns exec $ns2 ./pm_nl_ctl dsf lip 10.0.2.2 lport $sport rip 10.0.2.1= rport $app4_port token $client4_token 2>&1 > /dev/null + sleep 0.1 + verify_subflow_events "$evts" "$SUB_CLOSED" "$client4_token" "$AF_INET" "= 10.0.2.2" "10.0.2.1" "$app4_port" "23" "$server_addr_id" "ns2" "ns1" + + # RM_ADDR from server to client machine + ip netns exec $ns1 ./pm_nl_ctl rem id $server_addr_id token $server4_toke= n 2>&1 > /dev/null + sleep 0.1 + + # ADD_ADDR6 from server to client machine reusing the subflow port + :>"$evts" + ip netns exec $ns1 ./pm_nl_ctl ann dead:beef:2::1 token $server6_token id= $server_addr_id 2>&1 > /dev/null + sleep 0.1 + + # CREATE_SUBFLOW6 from client to server machine + :>"$evts" + ip netns exec $ns2 ./pm_nl_ctl csf lip dead:beef:2::2 lid 23 rip dead:bee= f:2::1 rport $app6_port token $client6_token 2>&1 > /dev/null + sleep 0.1 + verify_subflow_events "$evts" "$SUB_ESTABLISHED" "$client6_token" "$AF_IN= ET6" "dead:beef:2::2" "dead:beef:2::1" "$app6_port" "23" "$server_addr_id" = "ns2" "ns1" + + local sport=3D$(sed -n 's/.*\(sport:\)\([[:digit:]]*\).*$/\2/p;q' "$evts") + + # DESTROY_SUBFLOW6 from client to server machine + :>"$evts" + ip netns exec $ns2 ./pm_nl_ctl dsf lip dead:beef:2::2 lport $sport rip de= ad:beef:2::1 rport $app6_port token $client6_token 2>&1 > /dev/null + sleep 0.1 + verify_subflow_events "$evts" "$SUB_CLOSED" "$client6_token" "$AF_INET6" = "dead:beef:2::2" "dead:beef:2::1" "$app6_port" "23" "$server_addr_id" "ns2"= "ns1" + + # RM_ADDR6 from server to client machine + ip netns exec $ns1 ./pm_nl_ctl rem id $server_addr_id token $server6_toke= n 2>&1 > /dev/null + sleep 0.1 + + # ADD_ADDR from client to server machine using a new port + :>"$evts" + ip netns exec $ns1 ./pm_nl_ctl ann 10.0.2.1 token $server4_token id $serv= er_addr_id port $new4_port 2>&1 > /dev/null + sleep 0.1 + + # CREATE_SUBFLOW from client to server machine + :>"$evts" + ip netns exec $ns2 ./pm_nl_ctl csf lip 10.0.2.2 lid 23 rip 10.0.2.1 rport= $new4_port token $client4_token 2>&1 > /dev/null + sleep 0.1 + verify_subflow_events "$evts" "$SUB_ESTABLISHED" "$client4_token" "$AF_IN= ET" "10.0.2.2" "10.0.2.1" "$new4_port" "23" "$server_addr_id" "ns2" "ns1" + + sport=3D$(sed -n 's/.*\(sport:\)\([[:digit:]]*\).*$/\2/p;q' "$evts= ") + + # DESTROY_SUBFLOW from client to server machine + :>"$evts" + ip netns exec $ns2 ./pm_nl_ctl dsf lip 10.0.2.2 lport $sport rip 10.0.2.1= rport $new4_port token $client4_token 2>&1 > /dev/null + sleep 0.1 + verify_subflow_events "$evts" "$SUB_CLOSED" "$client4_token" "$AF_INET" "= 10.0.2.2" "10.0.2.1" "$new4_port" "23" "$server_addr_id" "ns2" "ns1" + + # RM_ADDR from server to client machine + ip netns exec $ns1 ./pm_nl_ctl rem id $server_addr_id token $server4_toke= n 2>&1 > /dev/null + + kill $evts_pid + rm -f "$evts" +} + +test_local_addr_limit() +{ + printf "Test sysctl: net.mptcp.userspace_pm_local_addr_max=3D1\t\t" + # Limit the # of local addrs for both namespaces to 1 + for i in "$ns1" "$ns2" ;do + ip netns exec $i sysctl -q net.mptcp.userspace_pm_local_addr_max=3D1 + done + + local evts=3D$(mktemp) + # Capture events from the network namespace running the server + :>"$evts" + ip netns exec $ns1 ./pm_nl_ctl events >> "$evts" 2>&1 & + evts_pid=3D$! + sleep 0.1 + + :>"$evts" + # ADD_ADDR from the client to server machine -> success + ip netns exec $ns2 ./pm_nl_ctl ann 10.0.2.2 token $client4_token id $clie= nt_addr_id dev ns2eth1 2>&1 > /dev/nulls + sleep 0.1 + local type=3D$(sed -n 's/.*\(type:\)\([[:digit:]]*\).*$/\2/p;q' "$evts") + if [ "$type" =3D "" ] + then + printf "[FAIL]\n" + exit 1 + fi + + :>"$evts" + # ADD_ADDR from the client to server machine -> fail (limit already met) + client_addr_id=3D$((client_addr_id+1)) + ip netns exec $ns2 ./pm_nl_ctl ann 10.0.2.2 token $client4_token id $clie= nt_addr_id dev ns2eth1 port $new4_port 2>&1 > /dev/null + sleep 0.1 + type=3D$(sed -n 's/.*\(type:\)\([[:digit:]]*\).*$/\2/p;q' "$evts") + if [ "$type" =3D "" ] + then + printf "[OK]\n" + else + printf "[FAIL]\n" + exit 1 + fi + + kill $evts_pid + rm -f "$evts" +} + +make_connection +make_connection "v6" +test_announce +test_remove +test_subflows +test_local_addr_limit +exit 0 --=20 2.31.1