From nobody Mon Apr 29 07:56:36 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a50:bae3:0:0:0:0:0 with SMTP id x90csp491605ede; Wed, 16 Mar 2022 16:16:49 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwaNZEJPV9HQhCt0VgqesHM98qoHRNt5YE1SDwpOuUKejoPq4yQorq3ryH6Ml2qDq5/QldG X-Received: by 2002:a62:f203:0:b0:4f6:f330:7e56 with SMTP id m3-20020a62f203000000b004f6f3307e56mr1944235pfh.49.1647472608771; Wed, 16 Mar 2022 16:16:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1647472608; cv=none; d=google.com; s=arc-20160816; b=nzPBUC3VAZQsKMr17vWHK1wree4T3SJc+YpK5ehjyacHv+Gd7Niwkc7gfw2wst7Fn+ 6hvURRhKJmxhWWajnkvOgjp10Pjz4Hi6Z609UiRiCdqBvvr3gfy9dfbKRDRTfd5iB41J x7Nqw5Oj2aAANHKhhlbb8yyEzPHkqmYtJGwiVU8bJw2NpccGvoeKWPr0SFZrGL+IOwsB 91erqKz4I46IoqEuFcu6w8BCjBqGOZDdOb43ZQcIn9zte51l0nxAkK4mmWUxoe2CMQCx ixCMGCcXyQtaBMGXKTuMMaED7DOChHeLs43Zdidu1R3265GPlCWbBhvUE9kdwvL3UwbP CqXw== 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=Nqf0Lhyj4oN3Th1k/YRjS/kPT1MN1WNjeR0kN5xUTSg=; b=lRKj7QOtj+8t/hkh9P75M/qQTIDSI12N+wz3e/uN35TGzH+EAvMDEwBxTAvGlIkjDc dWZfcQXNGooK1wfGXf/mSRV+Mvu3mx+548wJLOIsOaj1d4v74lk8PtGxifVaR0As/SMj M3wbZRt3gC6jgy8P+YKSerIUmjpv4P8Sc06fCiGgAp56HEudavGw9LcoTlFWwmfdX8wO 77fiZr4+GSQo4j+Gsog60L7hRtAhyV1E/loWX+uaDjTnGsZTnvHoL8yfxdkmIEigqUYb u69on1w7RRkObtkBkqY5xYSzkY4oav2ZnfABRylf7xCWcymuAiHeKPloUsONk6dmYANO j4mQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=behTHmYE; spf=pass (google.com: domain of mptcp+bounces-4260-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-4260-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 r185-20020a632bc2000000b003816043f08asi442837pgr.639.2022.03.16.16.16.48 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 16 Mar 2022 16:16:48 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-4260-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=behTHmYE; spf=pass (google.com: domain of mptcp+bounces-4260-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-4260-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 0C7B93E0FDC for ; Wed, 16 Mar 2022 23:16:48 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 013823D74; Wed, 16 Mar 2022 23:16:46 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) (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 CE1843D6B for ; Wed, 16 Mar 2022 23:16: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=1647472604; x=1679008604; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=pKmhSmSgsGDyEXccKYgjKKGFzm/tsUwQ4w+2dOStpKg=; b=behTHmYEVeM8ooOJPxrN2liaBBmXfSBfWlghp7eiMzbb32jKsTeCd35n ONMFy0R3vwb45a24jgrFC2zwOp8USC1ZkUzZiLA/MPyUxtvMyTTgMkf7W 1K0tJBFUZeReIJRIBd9Ej1uVTCcBH0s0euTuFry7p4M2QNsdMxdLgUt+C zlPJaIh2xAwZhZBYlPPvm9iqDGl17p0hNVPhCsBF8bGMHHwmxnsd8dskK DrM5ZdV8xumVEiR6BUyR/gpgUT+MRsqOgVvcjZpAg7nrGZiPbf/w87Oya tZSNax0d+ZhgQYgnrI5a6yZcsbZcB55YnmnzEnqVqf1at6NAQ+sHyin1C Q==; X-IronPort-AV: E=McAfee;i="6200,9189,10288"; a="317453505" X-IronPort-AV: E=Sophos;i="5.90,187,1643702400"; d="scan'208";a="317453505" Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Mar 2022 16:16:42 -0700 X-IronPort-AV: E=Sophos;i="5.90,187,1643702400"; d="scan'208";a="613813294" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by fmsmga004-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Mar 2022 16:16:42 -0700 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v5 01/14] mptcp: allow ADD_ADDR reissuance by userspace PMs Date: Wed, 16 Mar 2022 19:16:23 -0400 Message-Id: <20220316231636.645625-2-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220316231636.645625-1-kishen.maloor@intel.com> References: <20220316231636.645625-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 6fb84f9c377f..98e59576415b 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -362,8 +362,16 @@ static bool mptcp_pm_alloc_anno_list(struct mptcp_sock= *msk, =20 lockdep_assert_held(&msk->pm.lock); =20 - if (mptcp_lookup_anno_list_by_saddr(msk, &entry->addr)) - return false; + add_entry =3D mptcp_lookup_anno_list_by_saddr(msk, &entry->addr); + + if (add_entry) { + if (mptcp_pm_is_kernel(msk)) + return false; + + sk_reset_timer(sk, &add_entry->add_timer, + jiffies + mptcp_get_add_addr_timeout(net)); + return true; + } =20 add_entry =3D kmalloc(sizeof(*add_entry), GFP_ATOMIC); if (!add_entry) --=20 2.31.1 From nobody Mon Apr 29 07:56:36 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a50:bae3:0:0:0:0:0 with SMTP id x90csp491673ede; Wed, 16 Mar 2022 16:16:57 -0700 (PDT) X-Google-Smtp-Source: ABdhPJys+xATGRPh1ACIISb1t0RowL4wCYBT/+WEftb7GX7lRNsKlVkg3l/e9Faj76l75VGNZgmA X-Received: by 2002:a05:6512:4d0:b0:448:96f1:f03 with SMTP id w16-20020a05651204d000b0044896f10f03mr1147342lfq.40.1647472617692; Wed, 16 Mar 2022 16:16:57 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1647472617; cv=none; d=google.com; s=arc-20160816; b=qNz5dsB4cnAGdpx9xm7Rdj4ErsngsiFeTXBA0ZXtMeZRX8zanM4bgV6jJe56RWlde7 9MwY0YSQ6L6IUL6Uz4P8x5a28cFVXsrWUZ2blV9OWF40dt0OX9QzKnWiP7smeykqz6C5 09MDe1anRX6apbHt8LakzQFw8vd47bmXaDGA7ssdH+T/rLb+VmAzf80JHdnhMzss8X+s cphrl5HG+pG9w4DNHZX3tv/aQvlNP1dE43e3hE/GdaNwz6dqrtfJ7fwRu61dDOjTj7um NbBJ1mgFX8ijEJFmsX08okvhCLnLyS0LDicTDyvp18EKYRd2Y9EduUL2Iz7fzO+7mtFa rqPA== 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=KvqDjBG10euaqJTVGp1j5xyNFgcq77NA0jiuYCWd86U=; b=gQkxt8Z/xqvN6re9IVxiQpc0776fQGvA8SvV13z9abBubUjKoQru5fhLcE0q9DYJ3s 4YTG+FSYjTq3Or+fmoBxTFA1azlMLINgTX00HEBb0z3D14+6anDxgk/Na4GqaqcvRMMe RNR/cAX7z9YScJQGlXvZZI8SHD0cCv/ShLPLL5uFJcjVikMeuF7QvculGQ2w2+iFtUiM GQBnzzF6jIlrbKI8cZyzGZVYQQ73kCddjaPbn0v2To/0bSgTTJPrXTQpDGr7qNkC/As7 t/1h4XNegY0OcquQ+yWLCm0EsO1iffDfZi8NRG4/evRDvVz/iO8c1wETZn6DhKqdcxE+ 0xOA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b="M/v7/4nS"; spf=pass (google.com: domain of mptcp+bounces-4267-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-4267-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 n1-20020a0565120ac100b004484bfa5b0dsi3120632lfu.46.2022.03.16.16.16.57 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 16 Mar 2022 16:16:57 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-4267-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="M/v7/4nS"; spf=pass (google.com: domain of mptcp+bounces-4267-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-4267-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 2F12F1C0F09 for ; Wed, 16 Mar 2022 23:16:57 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id D768D3D75; Wed, 16 Mar 2022 23:16:48 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) (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 1CABF3D72 for ; Wed, 16 Mar 2022 23:16: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=1647472605; x=1679008605; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=DsIKWieym3IxXmgF7ywPEEULzAtyHepoTDjtX91rZ/o=; b=M/v7/4nSRAqj+JV0rSzKn3dh2bAD6gVu4wEF7BTuv1lSzCCE1yRf/e4+ IC5OpX8G1xf7q4v8rgwwOshXanqZABCBlulrtsiVtxlDej0ebadqtt0iW GdJIno0nGZcJ84ENQ3I+Wnlwm7PBm7FIcWcoy519T8m3jdDK6i4MEHaaF 4HjmvNfGbZsB+q3afWr5WE2RiwkmiSQAz51PGloXIixw2a6T5M85r4hsb SX1/W/F1gPR0E7VPDrR2Luih17BdGPq0g5FF+KyUjN1yJFGRzLMCnf/+k UF9/kNTeZBxwgb60PHzoyNU7hgsfzxQ5dRXXkD6TGQ71LoBtO3kbLTRSr Q==; X-IronPort-AV: E=McAfee;i="6200,9189,10288"; a="317453506" X-IronPort-AV: E=Sophos;i="5.90,187,1643702400"; d="scan'208";a="317453506" Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Mar 2022 16:16:42 -0700 X-IronPort-AV: E=Sophos;i="5.90,187,1643702400"; d="scan'208";a="613813298" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by fmsmga004-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Mar 2022 16:16:42 -0700 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v5 02/14] mptcp: handle local addrs announced by userspace PMs Date: Wed, 16 Mar 2022 19:16:24 -0400 Message-Id: <20220316231636.645625-3-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220316231636.645625-1-kishen.maloor@intel.com> References: <20220316231636.645625-1-kishen.maloor@intel.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This change adds an internal function to store/retrieve local addrs announced by userspace PM implementations to/from its kernel context. The function addresses the requirements of three scenarios: 1) ADD_ADDR announcements (which require that a local id be provided), 2) retrieving the local id associated with an address, and also where one may need to be assigned, and 3) reissuance of ADD_ADDRs when there's a successful match of addr/id. The list of all stored local addr entries is held under the MPTCP sock structure. Memory for these entries is allocated from the sock option buffer, so the list of addrs is bounded by optmem_max. The list if not released via REMOVE_ADDR signals is ultimately freed when the sock is destructed. Signed-off-by: Kishen Maloor --- net/mptcp/pm_netlink.c | 72 ++++++++++++++++++++++++++++++++++++++++++ net/mptcp/protocol.c | 2 ++ net/mptcp/protocol.h | 2 ++ 3 files changed, 76 insertions(+) diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index 98e59576415b..d8825bf580b7 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -390,6 +390,24 @@ 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; + LIST_HEAD(free_list); + + if (!mptcp_pm_is_userspace(msk)) + return; + + mptcp_data_lock(sk); + list_splice_init(&msk->local_addr_list, &free_list); + mptcp_data_unlock(sk); + + list_for_each_entry_safe(entry, tmp, &free_list, list) { + sock_kfree_s(sk, entry, sizeof(*entry)); + } +} + void mptcp_pm_free_anno_list(struct mptcp_sock *msk) { struct mptcp_pm_add_entry *entry, *tmp; @@ -878,6 +896,60 @@ static void __mptcp_pm_release_addr_entry(struct mptcp= _pm_addr_entry *entry) kfree(entry); } =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) { + /* Memory for the entry is allocated from the + * sock option buffer. + */ + e =3D sock_kmalloc(sk, sizeof(*e), GFP_ATOMIC); + if (!e) { + mptcp_data_unlock(sk); + return -ENOMEM; + } + + *e =3D *entry; + if (!e->addr.id) + e->addr.id =3D find_next_zero_bit(id_bitmap, + MPTCP_PM_MAX_ADDR_ID + 1, + 1); + list_add_tail_rcu(&e->list, &msk->local_addr_list); + ret =3D e->addr.id; + } 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 97b0338fe96f..f7661083eee8 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -2547,6 +2547,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; @@ -3043,6 +3044,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 9b655d049b94..2d18d2e7ee0e 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 */ @@ -731,6 +732,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 Apr 29 07:56:36 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a50:bae3:0:0:0:0:0 with SMTP id x90csp491625ede; Wed, 16 Mar 2022 16:16:51 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyyXGxyjeFdE5c6jHcyJu8fv541AhJ4DBGyX117pbGqWVmMf65X6walzXbSsSCB+eM2vfJI X-Received: by 2002:a2e:2d11:0:b0:246:3c3e:d544 with SMTP id t17-20020a2e2d11000000b002463c3ed544mr1155857ljt.518.1647472611584; Wed, 16 Mar 2022 16:16:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1647472611; cv=none; d=google.com; s=arc-20160816; b=wD7jMatJ371uCSduni/C0Kvn34/8FzD7kgGeU8HCUdTqWX9I/moYKpkxaPS00fL40q rDcfA09ZVGC2M2fpnN1pIFq6M11kf8bUi31VHdKmBpIMHz1KJt4SQVgmEKeuN7rcTPRU dFV+YqN0clI5RfTiUeZy5zXEt/glbeuq71hFu30C+SY8itM6pkCDFthTYHDzgvy2onV7 GrlDmFTV5JQNj42yusKmoCGbeJPlGjcrRDIc+AehhlGDEOJ7OcRCbAaimEc6TJOmJ28d s5Dgz0x8dih10uWD6T2q/AjK9hEWWh0HLKe+5IQ/Mumizc+DIfcbwjGtiwt+4L+89ZCu C5ew== 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=+ra/O3CQDuxrEQO2B7yFIo0VxT9L7ApP814vm21i16o=; b=kywUUrKmhEatBtZdHBFvp6nKFUaccgXJFG3bKghD4o0psamM+d+ufXJm5WRjAC6iPu zKD+EIEzqCiHRp8gPYO3TIZnFpaO52Rz3MUI7KQN2cOMQVaMObFC+PRfeE35g7rAQbbY riupxYFHI8CND+KL2iB5Vxnvo6dznx5qriGWNN1e/n/p0TYZ6DHtnZtJiUeU4IzcPvtA 3ja1YSYS2cywvwH2xoUyBIyuthkS5uKORgDtMSjPixuCHe9FNILvokRKute/G6SdcrSX SNNh9d0ELQ9+59EpFEwRtpjv+UDT0naYj783lDfYtivsc4fUSrSm0drQ8F25INS+qzfb Qz5Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=QNKlOZaq; spf=pass (google.com: domain of mptcp+bounces-4262-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-4262-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 z13-20020a195e4d000000b00445be0ccd1bsi2613645lfi.526.2022.03.16.16.16.51 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 16 Mar 2022 16:16:51 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-4262-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=QNKlOZaq; spf=pass (google.com: domain of mptcp+bounces-4262-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-4262-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 16CF91C0E10 for ; Wed, 16 Mar 2022 23:16:51 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 7B2E63D71; Wed, 16 Mar 2022 23:16:47 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) (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 04C353D75 for ; Wed, 16 Mar 2022 23:16: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=1647472606; x=1679008606; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=ajmyumXsmta+AA8sihePEx0hoFIXrvP69Vv8wpOkbHE=; b=QNKlOZaqUfJj22fDsGvnSW0IE3IoFHQZgx6aY13kOyrf7GmmyMJ4Lv9n dkfsrl6oFWH4Tcu45MvkF6VB3oroIfQJvT6IAAk1WrnhiB/gs2tQZsBtB nm0GzDAdjgLsEtH83vts5lwBvFfVKJSZZrZtUNCR/RdXYfP3UVzHQeXjb 5ScJiStR5zguc1o80V5vVSd2b4M3FZmh6U5XR/qtK9U6WUpnq9GMGQXXN guzdyRr0RIchPuggPgiOW7WrRXEZVggdSiAHn3RXu7oQbcajst7C+2jR4 lvi/q4GIudS7zZLjUaTAzo8ISMv/uqAvf5kGX/GKJtSPQfrMSp/U42t68 A==; X-IronPort-AV: E=McAfee;i="6200,9189,10288"; a="317453507" X-IronPort-AV: E=Sophos;i="5.90,187,1643702400"; d="scan'208";a="317453507" Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Mar 2022 16:16:43 -0700 X-IronPort-AV: E=Sophos;i="5.90,187,1643702400"; d="scan'208";a="613813301" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by fmsmga004-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Mar 2022 16:16:42 -0700 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v5 03/14] mptcp: read attributes of addr entries managed by userspace PMs Date: Wed, 16 Mar 2022 19:16:25 -0400 Message-Id: <20220316231636.645625-4-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220316231636.645625-1-kishen.maloor@intel.com> References: <20220316231636.645625-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 | 95 ++++++++++++++++++++++++++++-------------- net/mptcp/protocol.h | 3 +- net/mptcp/subflow.c | 2 +- 3 files changed, 67 insertions(+), 33 deletions(-) diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index d8825bf580b7..b597e84affd5 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -1106,31 +1106,47 @@ int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk= , struct sock_common *skc) =20 pernet =3D net_generic(sock_net((struct sock *)msk), pm_nl_pernet_id); =20 - rcu_read_lock(); - list_for_each_entry_rcu(entry, &pernet->local_addr_list, list) { - if (addresses_equal(&entry->addr, &skc_local, entry->addr.port)) { - ret =3D entry->addr.id; - break; + if (mptcp_pm_is_kernel(msk)) { + rcu_read_lock(); + list_for_each_entry_rcu(entry, &pernet->local_addr_list, list) { + if (addresses_equal(&entry->addr, &skc_local, entry->addr.port)) { + ret =3D entry->addr.id; + break; + } } + rcu_read_unlock(); + if (ret >=3D 0) + return ret; + + /* 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 MPTCP_PM_ADDR_FLAG_IMPLICIT; + entry->lsk =3D NULL; + ret =3D mptcp_pm_nl_append_new_local_addr(pernet, entry); + if (ret < 0) + kfree(entry); + } else if (mptcp_pm_is_userspace(msk)) { + struct mptcp_pm_addr_entry new_entry; + __be16 msk_sport =3D ((struct inet_sock *) + inet_sk((struct sock *)msk))->inet_sport; + + memset(&new_entry, 0, sizeof(struct mptcp_pm_addr_entry)); + new_entry.addr =3D skc_local; + new_entry.addr.id =3D 0; + new_entry.flags =3D MPTCP_PM_ADDR_FLAG_IMPLICIT; + + 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); } - 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 MPTCP_PM_ADDR_FLAG_IMPLICIT; - entry->lsk =3D NULL; - ret =3D mptcp_pm_nl_append_new_local_addr(pernet, entry); - if (ret < 0) - kfree(entry); =20 return ret; } @@ -1368,22 +1384,39 @@ static int mptcp_nl_cmd_add_addr(struct sk_buff *sk= b, struct genl_info *info) return 0; } =20 -int mptcp_pm_get_flags_and_ifindex_by_id(struct net *net, unsigned int id, +int mptcp_pm_get_flags_and_ifindex_by_id(struct mptcp_sock *msk, unsigned = int id, u8 *flags, int *ifindex) { - struct mptcp_pm_addr_entry *entry; + struct mptcp_pm_addr_entry *entry, *match =3D NULL; + struct sock *sk =3D (struct sock *)msk; + struct net *net =3D sock_net(sk); =20 *flags =3D 0; *ifindex =3D 0; =20 if (id) { - rcu_read_lock(); - entry =3D __lookup_addr_by_id(net_generic(net, pm_nl_pernet_id), id); - if (entry) { - *flags =3D entry->flags; - *ifindex =3D entry->ifindex; + if (mptcp_pm_is_kernel(msk)) { + rcu_read_lock(); + entry =3D __lookup_addr_by_id(net_generic(net, pm_nl_pernet_id), id); + if (entry) { + *flags =3D entry->flags; + *ifindex =3D entry->ifindex; + } + rcu_read_unlock(); + } else { + mptcp_data_lock(sk); + list_for_each_entry(entry, &msk->local_addr_list, list) { + if (id =3D=3D entry->addr.id) { + match =3D entry; + break; + } + } + mptcp_data_unlock(sk); + if (match) { + *flags =3D match->flags; + *ifindex =3D match->ifindex; + } } - rcu_read_unlock(); } =20 return 0; diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index 2d18d2e7ee0e..870627304462 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -770,7 +770,8 @@ mptcp_pm_del_add_timer(struct mptcp_sock *msk, struct mptcp_pm_add_entry * mptcp_lookup_anno_list_by_saddr(const struct mptcp_sock *msk, const struct mptcp_addr_info *addr); -int mptcp_pm_get_flags_and_ifindex_by_id(struct net *net, unsigned int id, +int mptcp_pm_get_flags_and_ifindex_by_id(struct mptcp_sock *msk, + unsigned int id, u8 *flags, int *ifindex); =20 int mptcp_pm_announce_addr(struct mptcp_sock *msk, diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c index 59657b7e4788..ff12893e03ab 100644 --- a/net/mptcp/subflow.c +++ b/net/mptcp/subflow.c @@ -1455,7 +1455,7 @@ int __mptcp_subflow_connect(struct sock *sk, const st= ruct mptcp_addr_info *loc, if (local_id) subflow_set_local_id(subflow, local_id); =20 - mptcp_pm_get_flags_and_ifindex_by_id(sock_net(sk), local_id, + mptcp_pm_get_flags_and_ifindex_by_id(msk, local_id, &flags, &ifindex); subflow->remote_key =3D msk->remote_key; subflow->local_key =3D msk->local_key; --=20 2.31.1 From nobody Mon Apr 29 07:56:36 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a50:bae3:0:0:0:0:0 with SMTP id x90csp491654ede; Wed, 16 Mar 2022 16:16:56 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz0z8DFGYboIwOoLMX9rZq6xZDinp/fr8io3ntPu+sWyvMib8x0ZssRs4yLgo+jQL1Z31rv X-Received: by 2002:a2e:54e:0:b0:249:5ff2:69e7 with SMTP id 75-20020a2e054e000000b002495ff269e7mr382726ljf.183.1647472615868; Wed, 16 Mar 2022 16:16:55 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1647472615; cv=none; d=google.com; s=arc-20160816; b=oC7M+TX7QEY4ZiIskTPFKkBG9khexlBYNM7S7hJ8Ji7zoGRpFzzh7G5eQedE56TwAg TyXX9PrwIXX7lBfJXC/IMRb7GjFg1A/cOFfIkdPoZ0AcQxqoiC41/sMSDOggptW1MDva 2asmGh3mJ10CwncJoyySj3M/o1H2rxKOPYfegbsViih/n1UHDWIzLbFGQ1uTgomXpo2U eknB88O34KMEOuCyOD2hzswXbouXOPNHkzz7ojGCNIPxvrw/UlvGSjggmYwJepckqyCx yI7yF6LVe1lOowGq+zLiwg8p7s68aMZ94KNK3oT5l+dkRhqtfV806ER9SDyA87wzGOUs KblA== 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=vsx4uyQo6/89WZpDLKJAD3WlyyeHXQ4NaJ+HJnTuoTg=; b=XDxRPs9CHWIVjDuhSc8mlR+uM2t25+qfwpdlk4ofcYW1wf/hlQJEw4ekW0P+mAxN3z 6O5tusv+QGWx2pdUjCrFponY4u/Ra3qt9l0U5YVFRkWNQUKrAU1WeWDR2MSc4I9meaAD c1qYXg/FVRTM+q3WAjbe3UE5OzChB+7yn0IF++r1ZGB/alvokieDMWQS5c2DZJTX/ENI IL2V8R//6KRk+Xc0xyvKeohOus+Shw/RFce23L1Tc7DD5cUUam6YmEHLW3dKVfKCNScG /FH8GaAWv0ZLx2/xVpC/jsqdzEso25gO6CRbVy/3sZ6kKptjHATE0o31HKHtGCmZISkA FVOA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=FufJgaT5; spf=pass (google.com: domain of mptcp+bounces-4264-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-4264-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 w6-20020a0565120b0600b004481ee0cecfsi3227989lfu.308.2022.03.16.16.16.55 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 16 Mar 2022 16:16:55 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-4264-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=FufJgaT5; spf=pass (google.com: domain of mptcp+bounces-4264-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-4264-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 8A21E1C0C63 for ; Wed, 16 Mar 2022 23:16:53 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id B99F43D7A; Wed, 16 Mar 2022 23:16:47 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) (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 47EFC3D6F for ; Wed, 16 Mar 2022 23:16: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=1647472606; x=1679008606; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=UUBZExgln/7TB16A0Uec1YceubwGi+kV3b6xAyTVl94=; b=FufJgaT5zqSBF9XbCMKK2atP/0kGVzY5eN0aHRge0kBJFn3QFhJY6IGw KjE5T/pTJR0YaDYJdvwcEpDytCe+UD8NAVX+4IFS+UkSpjMDrRZJOwdnI bPbTlFJZeoJc4qZXcYrO1glnNDKqbmewZWogD29aJv3CgClfJBdn23vWB w11SQKVfbFpVegIRG0CAt0kqFboXG8n/JQ1gooG082mSPRKhRV4NNExHK AKhEXkaECy65wCQ9KuSLu5UKfBu2vu9sxnTCAYehvTXKNBd4oSNhlORJr 5vOFxmY5xaVIb8mrHS5NVIZzhe05QmuM9qFdmGmjMS6f5PWCSBUNH8UDz Q==; X-IronPort-AV: E=McAfee;i="6200,9189,10288"; a="317453508" X-IronPort-AV: E=Sophos;i="5.90,187,1643702400"; d="scan'208";a="317453508" Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Mar 2022 16:16:43 -0700 X-IronPort-AV: E=Sophos;i="5.90,187,1643702400"; d="scan'208";a="613813304" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by fmsmga004-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Mar 2022 16:16:42 -0700 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Cc: Florian Westphal Subject: [PATCH mptcp-next v5 04/14] mptcp: netlink: split mptcp_pm_parse_addr into two functions Date: Wed, 16 Mar 2022 19:16:26 -0400 Message-Id: <20220316231636.645625-5-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220316231636.645625-1-kishen.maloor@intel.com> References: <20220316231636.645625-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 b597e84affd5..aa1a9ae6b530 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -1226,11 +1226,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) { @@ -1244,27 +1245,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"); @@ -1272,22 +1275,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 @@ -1335,7 +1353,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 @@ -1538,7 +1556,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 @@ -1712,7 +1730,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 @@ -1923,7 +1941,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 Apr 29 07:56:36 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a50:bae3:0:0:0:0:0 with SMTP id x90csp491664ede; Wed, 16 Mar 2022 16:16:56 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxrNJAAAlVjQUcUQNQp9Xw7S90ENQGbXUWKk2DCrngnwqtHZFH2Pu4Zo+PJBmwjUqLewPXk X-Received: by 2002:a17:902:b406:b0:14f:bb35:95ab with SMTP id x6-20020a170902b40600b0014fbb3595abmr1913760plr.140.1647472616598; Wed, 16 Mar 2022 16:16:56 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1647472616; cv=none; d=google.com; s=arc-20160816; b=TA2J3R8+nWlPwFHFhMKlVLNr/BnsKL1xjxlpnP7iqgBu7ZEyUQjLkWHkre7VivxBuP QiFXV4Yxo75z8ny2B+eTe36daBiM7LNokz2gwoXbcX0ttztZf6AVCp66IUsDKnEExMfA Bf0/rLHB4/KyH8h9Zt3dBdEl7j0Jmnv1oE+q+7G8216GvnnYa7Nfrbic9BE1eKIKUgIz nzAzd2U6+krXSyNuRM49dUAV5kKg5Om37WEU+IbM+peH+yX5QsjUsIAM4olCjH8syb+o iMgIQ1eaPgFP/e+i5oEL7ONUanYsCxZXtr2KfoC+bDOYl02i++i1TQO5LGlilWTcDbq7 fluA== 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=K/484wQoSozPhrpfeXdaWZTSJ4oFpsAQqPA/+Y1+gzk=; b=BVqfKDU4I0zPpBxqW6IhZDbArtsvCZ0RfSAIM/QiGhowJh1WW9I4B52/LIADsdf0+k f27gKG02tbsyr2AiYoG2QMffVS1N4amkyP9TGFgX51/qwHcgloiV2npxF1HzIMSkKS1d X4OeOe6lVtIrUq76X1+tqIkiMQ/G+IQVloCH3g/IzgZkq8QnUtdaFtCJHwPcDPf1RHgS DvQn5heQ1NV9332DzQyt7ydnTMu5OI6ZdqevBihrM71y6cQFbOpI/iR9y2em4eB3ouoM r2qnoloewMQQbPvIh86YSjZpM0KloeKpVcbjJkMjR6/rHOcZocclYvBHJ+3V8usHwcfw 6FOw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=j4or4dqS; spf=pass (google.com: domain of mptcp+bounces-4266-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-4266-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 d8-20020a170902cec800b00151cae42dc1si3474888plg.417.2022.03.16.16.16.56 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 16 Mar 2022 16:16:56 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-4266-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=j4or4dqS; spf=pass (google.com: domain of mptcp+bounces-4266-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-4266-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 AE24E3E1028 for ; Wed, 16 Mar 2022 23:16:55 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id C64913D7B; Wed, 16 Mar 2022 23:16:48 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) (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 80D443D75 for ; Wed, 16 Mar 2022 23:16: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=1647472607; x=1679008607; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=Jh75afoUQCx7xbfDS/OJhrVyFt5z+gVeuWycK/MjvKM=; b=j4or4dqSIXxcwLin1F/1a5QfvBbkDQGaaisS2hvYxbp7rHXz0A8iRq09 HXV2E9yLMFORBxYme7ZnRlnLU8fyNSxKiUBvFdEQdc3REpNaAjvy30lkC cENYNahhGX4PUE3xiG35RjAmzxS4FtbXxr64dhoxn/Ys9wd91Web7i194 U9cA5hhm7v36LAjXDVs84rt2HBpj3wDDhyKq7LzoQYgeb4p3h1nT5hARe NDGP0Emwoy81KJC0wWyyVIJXHb2ejdJQvquVsIwGd5sA66PYdgjV5+EjQ GEnRFbupDm6YHnMtQKZlhEgnpte9gXGKmz1I3f9oR9+0AUdgoId93V+dW g==; X-IronPort-AV: E=McAfee;i="6200,9189,10288"; a="317453509" X-IronPort-AV: E=Sophos;i="5.90,187,1643702400"; d="scan'208";a="317453509" Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Mar 2022 16:16:43 -0700 X-IronPort-AV: E=Sophos;i="5.90,187,1643702400"; d="scan'208";a="613813307" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by fmsmga004-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Mar 2022 16:16:42 -0700 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v5 05/14] mptcp: netlink: Add MPTCP_PM_CMD_ANNOUNCE Date: Wed, 16 Mar 2022 19:16:27 -0400 Message-Id: <20220316231636.645625-6-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220316231636.645625-1-kishen.maloor@intel.com> References: <20220316231636.645625-1-kishen.maloor@intel.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This change adds a MPTCP netlink interface for issuing ADD_ADDR advertisements over the chosen MPTCP connection from a userspace path manager. The command requires the following parameters: { token, { loc_id, family, daddr4 | daddr6 [, dport] } [, if_idx], flags[signal] }. Signed-off-by: Kishen Maloor --- include/uapi/linux/mptcp.h | 2 ++ net/mptcp/pm_netlink.c | 64 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+) diff --git a/include/uapi/linux/mptcp.h b/include/uapi/linux/mptcp.h index e41ea01a94bb..ac66c1263f02 100644 --- a/include/uapi/linux/mptcp.h +++ b/include/uapi/linux/mptcp.h @@ -55,6 +55,7 @@ enum { MPTCP_PM_ATTR_ADDR, /* nested address */ MPTCP_PM_ATTR_RCV_ADD_ADDRS, /* u32 */ MPTCP_PM_ATTR_SUBFLOWS, /* u32 */ + MPTCP_PM_ATTR_TOKEN, /* u32 */ =20 __MPTCP_PM_ATTR_MAX }; @@ -93,6 +94,7 @@ enum { MPTCP_PM_CMD_SET_LIMITS, MPTCP_PM_CMD_GET_LIMITS, MPTCP_PM_CMD_SET_FLAGS, + MPTCP_PM_CMD_ANNOUNCE, =20 __MPTCP_PM_CMD_AFTER_LAST }; diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index aa1a9ae6b530..2b1d8b3b7891 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -1178,6 +1178,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) @@ -1930,6 +1931,64 @@ 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 mptcp_pm_addr_entry addr_val; + struct mptcp_sock *msk; + u32 token_val; + int err; + + if (!addr || !token) { + GENL_SET_ERR_MSG(info, "missing required inputs"); + return -EINVAL; + } + + token_val =3D nla_get_u32(token); + + msk =3D mptcp_token_get_sock(sock_net(skb->sk), token_val); + if (!msk) { + NL_SET_ERR_MSG_ATTR(info->extack, token, "invalid token"); + return -EINVAL; + } + + if (!mptcp_pm_is_userspace(msk)) { + GENL_SET_ERR_MSG(info, "invalid request; userspace PM not selected"); + return -EINVAL; + } + + err =3D mptcp_pm_parse_entry(addr, info, true, &addr_val); + if (err < 0) { + GENL_SET_ERR_MSG(info, "error parsing local address"); + return err; + } + + if (addr_val.addr.id =3D=3D 0 || !(addr_val.flags & MPTCP_PM_ADDR_FLAG_SI= GNAL)) { + GENL_SET_ERR_MSG(info, "invalid addr id or flags"); + return -EINVAL; + } + + err =3D mptcp_userspace_pm_append_new_local_addr(msk, &addr_val); + if (err < 0) { + GENL_SET_ERR_MSG(info, "did not match address and id"); + return err; + } + + lock_sock((struct sock *)msk); + spin_lock_bh(&msk->pm.lock); + + if (mptcp_pm_alloc_anno_list(msk, &addr_val)) { + mptcp_pm_announce_addr(msk, &addr_val.addr, false); + mptcp_pm_nl_addr_send_ack(msk); + } + + spin_unlock_bh(&msk->pm.lock); + release_sock((struct sock *)msk); + + return 0; +} + 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; @@ -2289,6 +2348,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 Apr 29 07:56:36 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a50:bae3:0:0:0:0:0 with SMTP id x90csp491631ede; Wed, 16 Mar 2022 16:16:52 -0700 (PDT) X-Google-Smtp-Source: ABdhPJy/So/lGh+Ws7+VUNvWBvM55z6IA5uFX0mbZlk0Tik+1/2BOozLnggc8Ct0JwsnLmvu0UH/ X-Received: by 2002:a2e:9c08:0:b0:247:e34f:71c2 with SMTP id s8-20020a2e9c08000000b00247e34f71c2mr1175959lji.392.1647472612763; Wed, 16 Mar 2022 16:16:52 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1647472612; cv=none; d=google.com; s=arc-20160816; b=IJFcz5JCJZamuUBzblgMrWxcBl+AdKOhaaSvsxD8unRNOFwVlBbRCTWPAbmMHCgvG7 Ieet696Djz6Ad8i8Zz3W1F24mg7naL+7e0whl2wI1IUxYvtz4NuMoDI6HAsVT/1htHSw P3i4UP+Qoqch2jvgs2d7nesZz2FFhJq20BLIpdu2tNdRwL0A6fJY6Lz0vhCTenPrZvJd ItolvDlBTyhNeXhPDDwveD6gETfqfr2jwWvvNhECb+TBv3dMYzEMofFuITrO5380qx4n DCP3SeZN5ByOgPmhERZFVVgGjj7nYWs4LO1HK9FizCzO0F1eWphy7b2qjS5N2lwjLC42 oSGg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:to:from:dkim-signature; bh=qk1jQEnzidhDzaw06g43rlLWXEKWBHg2i8pidDp0dw4=; b=ACv0aPEvLvM1/RgccRo6nxQq3PgGzFirGEMdsv1d9FT1DSiJDmk6jX6iDgIrFCyJLT 8E0dgh44M+Ro2ZOBgBV8DlD3A+PL92cviyzAG8Sa+Ba9UG2J/mYbD3y67GRrcVfxH65X fb1Su1KgwAKMW/uqIDvK92yy4M2vJrRECoCaur77eHQ4qmQsqj4VkJ8mKtePvVyZ7JDX TvlqCLMKwZFnaOkhA7OyHA00HNqjAnlFi2G1sLdUWleI7S1g1zOiJ0e+TYC1GsrqtAkX VIx5YImcmxsgN4D4Q3oS/8MNlJ0u65Vg8klZ9HaN821/kfKDyEIiHImJ/2lL1ynmCArR /Cpw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=NPeTRYJW; spf=pass (google.com: domain of mptcp+bounces-4263-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-4263-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 d15-20020a2e96cf000000b00247eae62d85si2943312ljj.317.2022.03.16.16.16.52 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 16 Mar 2022 16:16:52 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-4263-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=NPeTRYJW; spf=pass (google.com: domain of mptcp+bounces-4263-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-4263-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 4192B1C0C61 for ; Wed, 16 Mar 2022 23:16:52 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 99CCE3D79; Wed, 16 Mar 2022 23:16:47 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) (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 E3BE73D6E for ; Wed, 16 Mar 2022 23:16: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=1647472605; x=1679008605; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=UhUPMksKwrGyZiZFoGBkKb8Lil20ZzQprtFN2H/4J28=; b=NPeTRYJW8gnRvIhYgBzt5KOlvaczLiAGvS82OdM7OCdPchoLridoh92v /n7mBq8+LmBFRMLoI2fEEmwfZ1yeWsHTFQuhDHifG1zL7WbCWdYomYf1A R3eTKk1M9aWhXurxrW/HA677El+9E5sFeG6OQVTyNpYhP7+3SFR0zyMiv Saip43WEdxZPIXU+DP7EV0HTmyjycE61qUaMVpCGizd92B+lfYfwCTHy3 afODTp+aCRdvIfhtrDCY70oPFnRrD9XLDTYqmmtPmrFEWJ7I+pf7Eh8P9 NzvzYcaA6BOH7RrE7LdKMn7cEx5jKJQoIl2KX0k8bYlhfXOBWxwFyCgnj Q==; X-IronPort-AV: E=McAfee;i="6200,9189,10288"; a="236679330" X-IronPort-AV: E=Sophos;i="5.90,187,1643702400"; d="scan'208";a="236679330" Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Mar 2022 16:16:43 -0700 X-IronPort-AV: E=Sophos;i="5.90,187,1643702400"; d="scan'208";a="613813310" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by fmsmga004-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Mar 2022 16:16:42 -0700 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v5 06/14] selftests: mptcp: support MPTCP_PM_CMD_ANNOUNCE Date: Wed, 16 Mar 2022 19:16:28 -0400 Message-Id: <20220316231636.645625-7-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220316231636.645625-1-kishen.maloor@intel.com> References: <20220316231636.645625-1-kishen.maloor@intel.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This change updates the "pm_nl_ctl" testing sample with an "ann" (announce) option to support the newly added netlink interface command MPTCP_PM_CMD_ANNOUNCE to issue ADD_ADDR advertisements over the chosen MPTCP connection. E.g. ./pm_nl_ctl ann 192.168.122.75 token 823274047 id 25 dev enp1s0 Signed-off-by: Kishen Maloor --- tools/testing/selftests/net/mptcp/pm_nl_ctl.c | 131 ++++++++++++++++++ 1 file changed, 131 insertions(+) diff --git a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c b/tools/testing/= selftests/net/mptcp/pm_nl_ctl.c index a75a68ad652e..0ef35c3f6419 100644 --- a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c +++ b/tools/testing/selftests/net/mptcp/pm_nl_ctl.c @@ -6,6 +6,7 @@ #include #include #include +#include =20 #include #include @@ -26,6 +27,7 @@ static void syntax(char *argv[]) { fprintf(stderr, "%s add|get|set|del|flush|dump|accept []\n", argv[0= ]); fprintf(stderr, "\tadd [flags signal|subflow|backup|fullmesh] [id ] [= dev ] \n"); + fprintf(stderr, "\tann id token [port ] [dev ]\n"); fprintf(stderr, "\tdel []\n"); fprintf(stderr, "\tget \n"); fprintf(stderr, "\tset [] [id ] flags [no]backup|[no]fullmesh [po= rt ]\n"); @@ -170,6 +172,133 @@ static int resolve_mptcp_pm_netlink(int fd) return genl_parse_getfamily((void *)data); } =20 +int announce_addr(int fd, int pm_family, int argc, char *argv[]) +{ + char data[NLMSG_ALIGN(sizeof(struct nlmsghdr)) + + NLMSG_ALIGN(sizeof(struct genlmsghdr)) + + 1024]; + u_int32_t flags =3D MPTCP_PM_ADDR_FLAG_SIGNAL; + u_int32_t token =3D UINT_MAX; + struct rtattr *rta, *addr; + u_int32_t id =3D UINT_MAX; + struct nlmsghdr *nh; + u_int16_t family; + int addr_start; + int off =3D 0; + int arg; + + memset(data, 0, sizeof(data)); + nh =3D (void *)data; + off =3D init_genl_req(data, pm_family, MPTCP_PM_CMD_ANNOUNCE, + MPTCP_PM_VER); + + if (argc < 7) + syntax(argv); + + /* local-ip header */ + addr_start =3D off; + addr =3D (void *)(data + off); + addr->rta_type =3D NLA_F_NESTED | MPTCP_PM_ATTR_ADDR; + addr->rta_len =3D RTA_LENGTH(0); + off +=3D NLMSG_ALIGN(addr->rta_len); + + /* local-ip data */ + /* record addr type */ + rta =3D (void *)(data + off); + if (inet_pton(AF_INET, argv[2], RTA_DATA(rta))) { + family =3D AF_INET; + rta->rta_type =3D MPTCP_PM_ADDR_ATTR_ADDR4; + rta->rta_len =3D RTA_LENGTH(4); + } else if (inet_pton(AF_INET6, argv[2], RTA_DATA(rta))) { + family =3D AF_INET6; + rta->rta_type =3D MPTCP_PM_ADDR_ATTR_ADDR6; + rta->rta_len =3D RTA_LENGTH(16); + } else + error(1, errno, "can't parse ip %s", argv[2]); + off +=3D NLMSG_ALIGN(rta->rta_len); + + /* addr family */ + rta =3D (void *)(data + off); + rta->rta_type =3D MPTCP_PM_ADDR_ATTR_FAMILY; + rta->rta_len =3D RTA_LENGTH(2); + memcpy(RTA_DATA(rta), &family, 2); + off +=3D NLMSG_ALIGN(rta->rta_len); + + for (arg =3D 3; arg < argc; arg++) { + if (!strcmp(argv[arg], "id")) { + /* local-id */ + if (++arg >=3D argc) + error(1, 0, " missing id value"); + + id =3D atoi(argv[arg]); + rta =3D (void *)(data + off); + rta->rta_type =3D MPTCP_PM_ADDR_ATTR_ID; + rta->rta_len =3D RTA_LENGTH(1); + memcpy(RTA_DATA(rta), &id, 1); + off +=3D NLMSG_ALIGN(rta->rta_len); + } else if (!strcmp(argv[arg], "dev")) { + /* for the if_index */ + int32_t ifindex; + + if (++arg >=3D argc) + error(1, 0, " missing dev name"); + + ifindex =3D if_nametoindex(argv[arg]); + if (!ifindex) + error(1, errno, "unknown device %s", argv[arg]); + + rta =3D (void *)(data + off); + rta->rta_type =3D MPTCP_PM_ADDR_ATTR_IF_IDX; + rta->rta_len =3D RTA_LENGTH(4); + memcpy(RTA_DATA(rta), &ifindex, 4); + off +=3D NLMSG_ALIGN(rta->rta_len); + } else if (!strcmp(argv[arg], "port")) { + /* local-port (optional) */ + u_int16_t port; + + if (++arg >=3D argc) + error(1, 0, " missing port value"); + + port =3D atoi(argv[arg]); + rta =3D (void *)(data + off); + rta->rta_type =3D MPTCP_PM_ADDR_ATTR_PORT; + rta->rta_len =3D RTA_LENGTH(2); + memcpy(RTA_DATA(rta), &port, 2); + off +=3D NLMSG_ALIGN(rta->rta_len); + } else if (!strcmp(argv[arg], "token")) { + /* MPTCP connection token */ + if (++arg >=3D argc) + error(1, 0, " missing token value"); + + token =3D atoi(argv[arg]); + } else + error(1, 0, "unknown keyword %s", argv[arg]); + } + + /* addr flags */ + rta =3D (void *)(data + off); + rta->rta_type =3D MPTCP_PM_ADDR_ATTR_FLAGS; + rta->rta_len =3D RTA_LENGTH(4); + memcpy(RTA_DATA(rta), &flags, 4); + off +=3D NLMSG_ALIGN(rta->rta_len); + + addr->rta_len =3D off - addr_start; + + if (id =3D=3D UINT_MAX || token =3D=3D UINT_MAX) + error(1, 0, " missing mandatory inputs"); + + /* token */ + rta =3D (void *)(data + off); + rta->rta_type =3D MPTCP_PM_ATTR_TOKEN; + rta->rta_len =3D RTA_LENGTH(4); + memcpy(RTA_DATA(rta), &token, 4); + off +=3D NLMSG_ALIGN(rta->rta_len); + + do_nl_req(fd, nh, off, 0); + + return 0; +} + int add_addr(int fd, int pm_family, int argc, char *argv[]) { char data[NLMSG_ALIGN(sizeof(struct nlmsghdr)) + @@ -786,6 +915,8 @@ int main(int argc, char *argv[]) =20 if (!strcmp(argv[1], "add")) return add_addr(fd, pm_family, argc, argv); + else if (!strcmp(argv[1], "ann")) + return announce_addr(fd, pm_family, argc, argv); else if (!strcmp(argv[1], "del")) return del_addr(fd, pm_family, argc, argv); else if (!strcmp(argv[1], "flush")) --=20 2.31.1 From nobody Mon Apr 29 07:56:36 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a50:bae3:0:0:0:0:0 with SMTP id x90csp491686ede; Wed, 16 Mar 2022 16:16:59 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwXZCpVWvqROF88aUIgF6RTunp6tipKpNDTDkxrCcrFmlPazS6jgakZQMOInZ7DBlyxrIa/ X-Received: by 2002:a17:90a:31c8:b0:1bf:bb9c:df22 with SMTP id j8-20020a17090a31c800b001bfbb9cdf22mr2099011pjf.163.1647472619408; Wed, 16 Mar 2022 16:16:59 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1647472619; cv=none; d=google.com; s=arc-20160816; b=otsvZpKM/CiB3FJN+95iVIDRxeHuz5A1sD03TAhBY5UfpKcEZNR4zo6wIszjW1TtSp 3QC1pJc5pWyPWXk8ompNOyGwEnTJ9IkOABvIKpJZZZWCm1uUpIQEUWlRpgqCESgdwh2l KTvjkLCqNpPJGOUqRO4qRBh9vSNz1E985asVngGgFB9/EUkXEogdt+FLxnTRZ6Lf7HWv aeEr/Y5hRltEc2g6CpsrG14AbLLQhJDGz4paE440qphuSxRZnPQjoznO6H4HVyjA/5z6 hi2WBV4/mFyRx+OASIclczvCArH7g8Jr860YImj/DQgMzgGZRhRSDGfNa8ZVLCg3iDXd qCJA== 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=OFaiDjb6BQ/CD9efp3TAbpjJjtIbJA6LTMnIQ59XWQ0=; b=ljmGsK4KwcZE9AzQzzdH0Hqg0sYZy7sckpU7HZDQcJVGdaAY8z7adJGvTl3KiTrkD2 SlLd+IG2Ks8vR5w3sxh+B0ZFFqIC/GjEBhxg3x3hEylwz1rU5ushzrzSryc0nQ4F0zSE HxgMsE1gPTRC16gxRhq+oybYvmshoh2hd3ziXJt7xgdHvJrCbgSDOlo3IV7TRTj8vcT/ 1ZIfrMFtES8CaDLW4Pb5iLgZ3/FgwapagGo1bDCFSd395wMOMvqpFy+MjtuFtrVyG1dA fNTvGfkdGuYkh9EoXvAgPT03K+HbflzZRST/8s3mf03XEagkemM9Z9mpV4sauAi2YUMo gNzQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b="Lk05/Ftu"; spf=pass (google.com: domain of mptcp+bounces-4269-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-4269-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 t8-20020a170902e84800b00153ccb19bb9si2018337plg.401.2022.03.16.16.16.59 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 16 Mar 2022 16:16:59 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-4269-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="Lk05/Ftu"; spf=pass (google.com: domain of mptcp+bounces-4269-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-4269-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 0EF2C3E1036 for ; Wed, 16 Mar 2022 23:16:59 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 928923D6E; Wed, 16 Mar 2022 23:16:49 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) (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 64D5B3D78 for ; Wed, 16 Mar 2022 23:16: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=1647472606; x=1679008606; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=QhlBYidClViBOQLgwMZKjZFohlD39RrFPWB5OzeQDv8=; b=Lk05/Ftu21313N35eYb4ODMfa2iwGO/zj0QfKEDZ+ttcIamjqeN2O05H gIQjJ++roRuK5khZHXhD9G60OqOe8OMxK0INTNZGnhTdsT9IWMR59PN35 gCcPXEkH36PRKtC4w0HPi3zf0mjIN6h6lMFzDQrR7iShqLd6wXQOocXLr ROucWFi603OE4+tEZhQ1p2Mi6x7m0/yWVtwhXyuPMDpiwtsVpI58IMn0g vIecJ4FM5DFKytCmcf2jKkcdaQY/5TUjZLMZimXiRSsR5B2cODAs0IoTc QEM4UwZ72Bm3vGPD0Y2Q3LZ98oJ9VCPuve8HbkjM565cotLTkVHhenhNl Q==; X-IronPort-AV: E=McAfee;i="6200,9189,10288"; a="236679331" X-IronPort-AV: E=Sophos;i="5.90,187,1643702400"; d="scan'208";a="236679331" Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Mar 2022 16:16:43 -0700 X-IronPort-AV: E=Sophos;i="5.90,187,1643702400"; d="scan'208";a="613813313" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by fmsmga004-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Mar 2022 16:16:43 -0700 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v5 07/14] mptcp: netlink: Add MPTCP_PM_CMD_REMOVE Date: Wed, 16 Mar 2022 19:16:29 -0400 Message-Id: <20220316231636.645625-8-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220316231636.645625-1-kishen.maloor@intel.com> References: <20220316231636.645625-1-kishen.maloor@intel.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This change adds a MPTCP netlink command for issuing a REMOVE_ADDR signal for an address over the chosen MPTCP connection from a userspace path manager. The command requires the following parameters: {token, loc_id}. Signed-off-by: Kishen Maloor --- include/uapi/linux/mptcp.h | 2 ++ net/mptcp/pm_netlink.c | 63 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+) diff --git a/include/uapi/linux/mptcp.h b/include/uapi/linux/mptcp.h index ac66c1263f02..11f9fa001a3c 100644 --- a/include/uapi/linux/mptcp.h +++ b/include/uapi/linux/mptcp.h @@ -56,6 +56,7 @@ enum { MPTCP_PM_ATTR_RCV_ADD_ADDRS, /* u32 */ MPTCP_PM_ATTR_SUBFLOWS, /* u32 */ MPTCP_PM_ATTR_TOKEN, /* u32 */ + MPTCP_PM_ATTR_LOC_ID, /* u8 */ =20 __MPTCP_PM_ATTR_MAX }; @@ -95,6 +96,7 @@ enum { MPTCP_PM_CMD_GET_LIMITS, MPTCP_PM_CMD_SET_FLAGS, MPTCP_PM_CMD_ANNOUNCE, + MPTCP_PM_CMD_REMOVE, =20 __MPTCP_PM_CMD_AFTER_LAST }; diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index 2b1d8b3b7891..d260b2336247 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -1179,6 +1179,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) @@ -2201,6 +2202,63 @@ 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 mptcp_pm_addr_entry *match =3D NULL; + struct mptcp_pm_addr_entry *entry; + struct mptcp_sock *msk; + LIST_HEAD(free_list); + u32 token_val; + u8 id_val; + + if (!id || !token) { + GENL_SET_ERR_MSG(info, "missing required inputs"); + return -EINVAL; + } + + id_val =3D nla_get_u8(id); + token_val =3D nla_get_u32(token); + + msk =3D mptcp_token_get_sock(sock_net(skb->sk), token_val); + if (!msk) { + NL_SET_ERR_MSG_ATTR(info->extack, token, "invalid token"); + return -EINVAL; + } + + if (!mptcp_pm_is_userspace(msk)) { + GENL_SET_ERR_MSG(info, "invalid request; userspace PM not selected"); + return -EINVAL; + } + + lock_sock((struct sock *)msk); + + list_for_each_entry(entry, &msk->local_addr_list, list) { + if (entry->addr.id =3D=3D id_val) { + match =3D entry; + break; + } + } + + if (!match) { + GENL_SET_ERR_MSG(info, "address with specified id not found"); + release_sock((struct sock *)msk); + return -EINVAL; + } + + list_move(&match->list, &free_list); + + mptcp_pm_remove_addrs_and_subflows(msk, &free_list); + + release_sock((struct sock *)msk); + + list_for_each_entry_safe(match, entry, &free_list, list) { + sock_kfree_s((struct sock *)msk, match, sizeof(*match)); + } + return 0; +} + void mptcp_event_addr_announced(const struct sock *ssk, const struct mptcp_addr_info *info) { @@ -2353,6 +2411,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 Apr 29 07:56:36 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a50:bae3:0:0:0:0:0 with SMTP id x90csp491592ede; Wed, 16 Mar 2022 16:16:47 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxbPJ2FB/enVgypVzQKFwYnh4r/VoQEhOXngWZyhvJPqhTKr341RheXAGXnHN2zMcpaXhlv X-Received: by 2002:a17:902:7805:b0:151:b8ec:202b with SMTP id p5-20020a170902780500b00151b8ec202bmr2154794pll.111.1647472607489; Wed, 16 Mar 2022 16:16:47 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1647472607; cv=none; d=google.com; s=arc-20160816; b=jo6tuoDaSV2pUL6bOuku8fscOQqXdn+ZplKc8Ta4CKDZalHHMxPEgZJWfJSDDP4eLK 6tKjy0HkSmLPNsN/HzB4SLU7jHPbfgOTw9DZRGjX4qoMtfuYOtYQN3G77fKK5ytrH3kc cN2txPJShv4vTnM9dmIDvKYKFECGKtZY5nS77fICJnJGcFmR6jouwkuAePMc4U42qi4F NGXFfAS/YURKzJ/M+60X6aFLz2DJNUFxaGMMt/XrJz2Z15119w8svsPj4bOP6iu2aRpz fWl98eozuQyh7QRjxMPJwxtYQwwLAoFtLOvcDZjX3iligx6dX3w85+q2SUiHB4/RPukT 7spw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:to:from:dkim-signature; bh=fw8Pkk7FsoXal6qTEgfyW7yvlnTAlkxjWf/YOWAEp+M=; b=degO3+bPU0L49UgEiC70/eQ0DPVv97YFDmXbpqbf8LzudeqbALVWGuSrskSuJrCDNq dVJruUeUT38OPYSrRMruwKHIPxZGDJqRD99by/8xxcerSGKj5qSt4cg0sDldrw1+ic2P 2TvgzBms/gLooVnZbQJtE+SSpFR+CYKJ+cptPs8bvepjxcH8frGFOSBysKQen8q0/o6V m/waVn++0h87iMooTFMyq2tKLN2kOAbYS/NFJYBxCTMvZB9FMW0xFFZuLG9e/InfDyQC JgkdaSP0ef+rUlbO3p1vzjjuKW59zLb5id1Q56+a6FOfLWCTLyC4KkijAvxg5De9pgyF oUnw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=HDALLVwY; spf=pass (google.com: domain of mptcp+bounces-4259-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-4259-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 r185-20020a632bc2000000b003816043f08asi442837pgr.639.2022.03.16.16.16.47 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 16 Mar 2022 16:16:47 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-4259-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=HDALLVwY; spf=pass (google.com: domain of mptcp+bounces-4259-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-4259-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 DF4183E0F91 for ; Wed, 16 Mar 2022 23:16:46 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id D74613D73; Wed, 16 Mar 2022 23:16:45 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) (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 1DCF83D6E for ; Wed, 16 Mar 2022 23:16:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1647472604; x=1679008604; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=RAhrEvJmyKeoBz/vW0WCe2KrNVdwr/PvsJn+yTOk/F0=; b=HDALLVwYH2NCd4a4kjy/S9f42rCn3DsArqLqOAWhAFZ6f11lsaxT5ggy HSsF3OFwoBoyM7/XxZBVA/umXxTZhauMucT8KIvboFj1lUekEW/13Tmtd z58c/XIR6Ogw4YDqBxwCQ7hUtVPwPkpqozTkcX0ysiUwYzdwdvSKXgUXY yMWGFdpVe1/WWKUEwG+l63NmwdPDV1GqNslPCT07ejHKmSnrCEFTmd0vT nb0XjUYHhpXbxDwN8kKTQ5ScBXroXKZF3paT9rAjYzgX71sZaPhxrEcXa hP9sflXQAkXgKSBJdj92nPmzDjVqezrPzlEPdKO8D9p32zK7NqRCBwbXq w==; X-IronPort-AV: E=McAfee;i="6200,9189,10288"; a="236679332" X-IronPort-AV: E=Sophos;i="5.90,187,1643702400"; d="scan'208";a="236679332" Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Mar 2022 16:16:43 -0700 X-IronPort-AV: E=Sophos;i="5.90,187,1643702400"; d="scan'208";a="613813316" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by fmsmga004-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Mar 2022 16:16:43 -0700 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v5 08/14] selftests: mptcp: support MPTCP_PM_CMD_REMOVE Date: Wed, 16 Mar 2022 19:16:30 -0400 Message-Id: <20220316231636.645625-9-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220316231636.645625-1-kishen.maloor@intel.com> References: <20220316231636.645625-1-kishen.maloor@intel.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This change updates the "pm_nl_ctl" testing sample with a "rem" (remove) option to support the newly added netlink interface command MPTCP_PM_CMD_REMOVE to issue a REMOVE_ADDR signal over the chosen MPTCP connection. E.g. ./pm_nl_ctl rem token 823274047 id 23 Signed-off-by: Kishen Maloor --- tools/testing/selftests/net/mptcp/pm_nl_ctl.c | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c b/tools/testing/= selftests/net/mptcp/pm_nl_ctl.c index 0ef35c3f6419..3506b0416c41 100644 --- a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c +++ b/tools/testing/selftests/net/mptcp/pm_nl_ctl.c @@ -28,6 +28,7 @@ static void syntax(char *argv[]) fprintf(stderr, "%s add|get|set|del|flush|dump|accept []\n", argv[0= ]); fprintf(stderr, "\tadd [flags signal|subflow|backup|fullmesh] [id ] [= dev ] \n"); fprintf(stderr, "\tann id token [port ] [dev ]\n"); + fprintf(stderr, "\trem id token \n"); fprintf(stderr, "\tdel []\n"); fprintf(stderr, "\tget \n"); fprintf(stderr, "\tset [] [id ] flags [no]backup|[no]fullmesh [po= rt ]\n"); @@ -172,6 +173,55 @@ static int resolve_mptcp_pm_netlink(int fd) return genl_parse_getfamily((void *)data); } =20 +int remove_addr(int fd, int pm_family, int argc, char *argv[]) +{ + char data[NLMSG_ALIGN(sizeof(struct nlmsghdr)) + + NLMSG_ALIGN(sizeof(struct genlmsghdr)) + + 1024]; + struct nlmsghdr *nh; + struct rtattr *rta; + u_int32_t token; + u_int8_t id; + int off =3D 0; + int arg; + + memset(data, 0, sizeof(data)); + nh =3D (void *)data; + off =3D init_genl_req(data, pm_family, MPTCP_PM_CMD_REMOVE, + MPTCP_PM_VER); + + if (argc < 6) + syntax(argv); + + for (arg =3D 2; arg < argc; arg++) { + if (!strcmp(argv[arg], "id")) { + if (++arg >=3D argc) + error(1, 0, " missing id value"); + + id =3D atoi(argv[arg]); + rta =3D (void *)(data + off); + rta->rta_type =3D MPTCP_PM_ATTR_LOC_ID; + rta->rta_len =3D RTA_LENGTH(1); + memcpy(RTA_DATA(rta), &id, 1); + off +=3D NLMSG_ALIGN(rta->rta_len); + } else if (!strcmp(argv[arg], "token")) { + if (++arg >=3D argc) + error(1, 0, " missing token value"); + + token =3D atoi(argv[arg]); + rta =3D (void *)(data + off); + rta->rta_type =3D MPTCP_PM_ATTR_TOKEN; + rta->rta_len =3D RTA_LENGTH(4); + memcpy(RTA_DATA(rta), &token, 4); + off +=3D NLMSG_ALIGN(rta->rta_len); + } else + error(1, 0, "unknown keyword %s", argv[arg]); + } + + do_nl_req(fd, nh, off, 0); + return 0; +} + int announce_addr(int fd, int pm_family, int argc, char *argv[]) { char data[NLMSG_ALIGN(sizeof(struct nlmsghdr)) + @@ -917,6 +967,8 @@ int main(int argc, char *argv[]) return add_addr(fd, pm_family, argc, argv); else if (!strcmp(argv[1], "ann")) return announce_addr(fd, pm_family, argc, argv); + else if (!strcmp(argv[1], "rem")) + return remove_addr(fd, pm_family, argc, argv); else if (!strcmp(argv[1], "del")) return del_addr(fd, pm_family, argc, argv); else if (!strcmp(argv[1], "flush")) --=20 2.31.1 From nobody Mon Apr 29 07:56:36 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a50:bae3:0:0:0:0:0 with SMTP id x90csp491707ede; Wed, 16 Mar 2022 16:17:01 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyZqaFTrOTLF8ZHzslFBWjyK8QsGEqyTA7jlwA8Odqw5X+6qtEzk9YM6gXSGepabUj952kN X-Received: by 2002:a05:651c:b12:b0:247:e2b0:5495 with SMTP id b18-20020a05651c0b1200b00247e2b05495mr1141346ljr.433.1647472621835; Wed, 16 Mar 2022 16:17:01 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1647472621; cv=none; d=google.com; s=arc-20160816; b=HFjJqs7f+uLBe79YPIJDA30mwBi7jCOOq+XMhXyGSfTbxGY0bi5+RCY9F2/qRlSOy2 qt8gNeLwYBoavjCZd/AZaRr4yy1C+40dnSFXjs6cmRENGwTjaNzYmrhtk5T5RAhkr4Av YNovrC/q7Mggq8lpdxXGTnW2FXCBqFtQCQOYiTTc5fguC88fu5QjKhZMW7NLU+1NRI3c QbSqdytSFP6eRYMO1QkcoQqaPI9cfJGTJbovP8qJ7a1UNS0d+nZ3+GCMShFj7OzdF2N6 M3XZEaSZMJqb7gvMRsUww3sUQ2+yIa3+JN0a3AXmmqCYafe72/15+hWdRde/7eKBVHQx PR7w== 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=Q9pwjhWyHcSXIW0cMjyV6IAZ3AtK9EAjisWryZnnXGQ=; b=mhz1kBWrTJdv20mciJHV6R1Ej/IUdiO0iJQ5pYKrfsweuWOw/Bg3FVrvQX74l4jrBU eFPNLqZAvh5xvtIJxWyHymxZAlOrnEo5mG38MT1/d91Jwautoj43VF3SgcRXpS6eJpUl Vwl5sGkOYP1QMOk2X6TUo6XDDzBXIbEGlFHs4Jpy+LPC7HrmcS6lSDKRRU9jAYLAJJ2D laaTMRpOlx3p1PberD44sZPcPa6FLeImaGXk/Bc+5QlUNLvMYb+o5Ueu+NHQk7pnwZwu XdvCSQtmtXyn3ihlpV7q79IC6o2WjPspfak/zpzwytwYmKDLHdxEenAghuQwVPk5mW2u FpZg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=n9YabktV; spf=pass (google.com: domain of mptcp+bounces-4270-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-4270-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 f8-20020a19dc48000000b0041a3aefa298si2856495lfj.543.2022.03.16.16.17.01 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 16 Mar 2022 16:17:01 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-4270-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=n9YabktV; spf=pass (google.com: domain of mptcp+bounces-4270-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-4270-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 978B31C0F14 for ; Wed, 16 Mar 2022 23:17:00 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id B19043D74; Wed, 16 Mar 2022 23:16:49 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) (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 1F5783D6F for ; Wed, 16 Mar 2022 23:16: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=1647472608; x=1679008608; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=0Ep2o3jOXmCvzs/5J4TyUErcWQNUjewz2B0KddOStNA=; b=n9YabktVQKWmXtw1epUhPYNd3S6SIjJU4dXQz0VIeB8NIKE8kIHbAh68 tDXOfQpd40Vw5va3XdSfpQTHN1S6S7gAOvml4rrxkkeHNhrEpEz2ESbIz ZzIGwICqHRxc9GpCAA8giZV0ywtUjy9Pvqn/0a7yT8oZC/RVqOXLY2Lqf UgRO+uXWUqUFhDxVN/X9O1SiiJYeERjvI+pXcHIogGPvfPlj0G+9PHUkN krX27h+3QVpIqp26EDxCCqaltHcdm+xvx0J+QKaC1ROsWZQtPfNM3qDm9 PrV5Dbv6diNs3kLs1V6nLBHxs2LKv5yht2SbVTD++x/lKbf0enXeHsQjQ w==; X-IronPort-AV: E=McAfee;i="6200,9189,10288"; a="236679333" X-IronPort-AV: E=Sophos;i="5.90,187,1643702400"; d="scan'208";a="236679333" Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Mar 2022 16:16:43 -0700 X-IronPort-AV: E=Sophos;i="5.90,187,1643702400"; d="scan'208";a="613813319" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by fmsmga004-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Mar 2022 16:16:43 -0700 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Cc: Florian Westphal Subject: [PATCH mptcp-next v5 09/14] mptcp: netlink: allow userspace-driven subflow establishment Date: Wed, 16 Mar 2022 19:16:31 -0400 Message-Id: <20220316231636.645625-10-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220316231636.645625-1-kishen.maloor@intel.com> References: <20220316231636.645625-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 --- 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 11f9fa001a3c..921963589904 100644 --- a/include/uapi/linux/mptcp.h +++ b/include/uapi/linux/mptcp.h @@ -57,6 +57,7 @@ enum { MPTCP_PM_ATTR_SUBFLOWS, /* u32 */ MPTCP_PM_ATTR_TOKEN, /* u32 */ MPTCP_PM_ATTR_LOC_ID, /* u8 */ + MPTCP_PM_ATTR_ADDR_REMOTE, /* nested address */ =20 __MPTCP_PM_ATTR_MAX }; @@ -97,6 +98,8 @@ enum { MPTCP_PM_CMD_SET_FLAGS, MPTCP_PM_CMD_ANNOUNCE, MPTCP_PM_CMD_REMOVE, + MPTCP_PM_CMD_SUBFLOW_CREATE, + MPTCP_PM_CMD_SUBFLOW_DESTROY, =20 __MPTCP_PM_CMD_AFTER_LAST }; diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index d260b2336247..28ff141a327b 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -1180,6 +1180,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) @@ -1289,6 +1291,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) @@ -2371,6 +2383,185 @@ void mptcp_event(enum mptcp_event_type type, const = struct mptcp_sock *msk, kfree_skb(skb); } =20 +static int mptcp_nl_cmd_sf_create(struct sk_buff *skb, struct genl_info *i= nfo) +{ + struct nlattr *raddr =3D info->attrs[MPTCP_PM_ATTR_ADDR_REMOTE]; + struct nlattr *token =3D info->attrs[MPTCP_PM_ATTR_TOKEN]; + struct nlattr *laddr =3D info->attrs[MPTCP_PM_ATTR_ADDR]; + struct mptcp_addr_info addr_r; + struct mptcp_addr_info addr_l; + struct mptcp_sock *msk; + struct sock *sk; + u32 token_val; + int ret; + + if (!laddr || !raddr || !token) { + GENL_SET_ERR_MSG(info, "missing required inputs"); + return -EINVAL; + } + + token_val =3D nla_get_u32(token); + + msk =3D mptcp_token_get_sock(genl_info_net(info), token_val); + if (!msk) { + NL_SET_ERR_MSG_ATTR(info->extack, token, "invalid token"); + return -EINVAL; + } + + if (!mptcp_pm_is_userspace(msk)) { + GENL_SET_ERR_MSG(info, "invalid request; userspace PM not selected"); + return -EINVAL; + } + + ret =3D mptcp_pm_parse_addr(laddr, info, &addr_l); + if (ret < 0) { + NL_SET_ERR_MSG_ATTR(info->extack, laddr, "error parsing local addr"); + return -EINVAL; + } + + if (addr_l.id =3D=3D 0) { + NL_SET_ERR_MSG_ATTR(info->extack, laddr, "missing local addr id"); + return -EINVAL; + } + + ret =3D mptcp_pm_parse_addr(raddr, info, &addr_r); + if (ret < 0) { + NL_SET_ERR_MSG_ATTR(info->extack, raddr, "error parsing remote addr"); + return -EINVAL; + } + + sk =3D &msk->sk.icsk_inet.sk; + lock_sock(sk); + + ret =3D __mptcp_subflow_connect(sk, &addr_l, &addr_r); + + release_sock(sk); + + return ret; +} + +static struct sock *mptcp_nl_find_ssk(struct mptcp_sock *msk, + const struct mptcp_addr_info *local, + const struct mptcp_addr_info *remote) +{ + struct sock *sk =3D &msk->sk.icsk_inet.sk; + struct mptcp_subflow_context *subflow; + struct sock *found =3D NULL; + + if (local->family !=3D remote->family) + return NULL; + + lock_sock(sk); + + mptcp_for_each_subflow(msk, subflow) { + const struct ipv6_pinfo *pinfo; + const struct inet_sock *issk; + struct sock *ssk; + + ssk =3D mptcp_subflow_tcp_sock(subflow); + + if (local->family !=3D ssk->sk_family) + continue; + + issk =3D inet_sk(ssk); + + switch (ssk->sk_family) { + case AF_INET: + if (issk->inet_saddr !=3D local->addr.s_addr || + issk->inet_daddr !=3D remote->addr.s_addr) + continue; + break; +#if IS_ENABLED(CONFIG_MPTCP_IPV6) + case AF_INET6: + pinfo =3D inet6_sk(ssk); + if (!ipv6_addr_equal(&local->addr6, &pinfo->saddr) || + !ipv6_addr_equal(&remote->addr6, &ssk->sk_v6_daddr)) + continue; + break; +#endif + default: + continue; + } + + if (issk->inet_sport =3D=3D local->port && + issk->inet_dport =3D=3D remote->port) { + found =3D ssk; + goto found; + } + } + +found: + release_sock(sk); + + return found; +} + +static int mptcp_nl_cmd_sf_destroy(struct sk_buff *skb, struct genl_info *= info) +{ + struct nlattr *raddr =3D info->attrs[MPTCP_PM_ATTR_ADDR_REMOTE]; + struct nlattr *token =3D info->attrs[MPTCP_PM_ATTR_TOKEN]; + struct nlattr *laddr =3D info->attrs[MPTCP_PM_ATTR_ADDR]; + struct mptcp_addr_info addr_l; + struct mptcp_addr_info addr_r; + struct mptcp_sock *msk; + struct sock *sk, *ssk; + u32 token_val; + int ret; + + if (!laddr || !raddr || !token) { + GENL_SET_ERR_MSG(info, "missing required inputs"); + return -EINVAL; + } + + token_val =3D nla_get_u32(token); + + msk =3D mptcp_token_get_sock(genl_info_net(info), token_val); + if (!msk) { + NL_SET_ERR_MSG_ATTR(info->extack, token, "invalid token"); + return -EINVAL; + } + + if (!mptcp_pm_is_userspace(msk)) { + GENL_SET_ERR_MSG(info, "invalid request; userspace PM not selected"); + return -EINVAL; + } + + ret =3D mptcp_pm_parse_addr(laddr, info, &addr_l); + if (ret < 0) { + NL_SET_ERR_MSG_ATTR(info->extack, laddr, "error parsing local addr"); + return ret; + } + + ret =3D mptcp_pm_parse_addr(raddr, info, &addr_r); + if (ret < 0) { + NL_SET_ERR_MSG_ATTR(info->extack, raddr, "error parsing remote addr"); + return ret; + } + + if (addr_l.family !=3D addr_r.family) { + GENL_SET_ERR_MSG(info, "address families do not match"); + return -EINVAL; + } + + if (!addr_l.port || !addr_r.port) { + GENL_SET_ERR_MSG(info, "missing local or remote port"); + return -EINVAL; + } + + sk =3D &msk->sk.icsk_inet.sk; + ssk =3D mptcp_nl_find_ssk(msk, &addr_l, &addr_r); + if (ssk) { + struct mptcp_subflow_context *subflow =3D mptcp_subflow_ctx(ssk); + + mptcp_subflow_shutdown(sk, ssk, RCV_SHUTDOWN | SEND_SHUTDOWN); + mptcp_close_ssk(sk, ssk, subflow); + } else { + ret =3D -ESRCH; + } + + return ret; +} + static const struct genl_small_ops mptcp_pm_ops[] =3D { { .cmd =3D MPTCP_PM_CMD_ADD_ADDR, @@ -2416,6 +2607,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 Apr 29 07:56:36 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a50:bae3:0:0:0:0:0 with SMTP id x90csp491682ede; Wed, 16 Mar 2022 16:16:58 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxQvItHPVBRUdPl5lfGPmiU952t3TzBzTqC5nSZuK4VHiuGq54rmb1e015ZxSi+r4ObvdwJ X-Received: by 2002:a05:6512:ce:b0:448:5bfe:ee4d with SMTP id c14-20020a05651200ce00b004485bfeee4dmr1146564lfp.96.1647472618770; Wed, 16 Mar 2022 16:16:58 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1647472618; cv=none; d=google.com; s=arc-20160816; b=oafAeUXOS603rHN7rmBNFOytD2TerDxgCnU5ZyPcd5RuBWJU0s5artK70kvIIYO4+1 j+wvE9q2B91l7ReChx1pZuZHKzksBygL6lAO6Yq059Ow76YQdrWD+AOK3xQjC0KOzxLO n3Z9pWIfZJvXOhGlMFgNAHKMYF/K+VDoBghXLs18CyUr03bwDnemmHxiIYebv5tXSpHq fKB1FFAdddc8geaCgC8xQMjNa4a+rjChzv+k49UbjJ7pQFIOuG2hpr9Fp2KGLLRIF4LO i0UMuLnSTwCbwDO5YUCI+ufH/vzcjHYG1PcU7HcVslXbosFYQbQUdSgqHh+zg+jP4UA/ 7XXQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:to:from:dkim-signature; bh=3eFoSMV5Dpxo7b1GHEFMm0aVXqrRwWEqFpmkj2ERS7g=; b=bCfcwR1Dq5EzPuGRx7YrWVYlpXnFbiy9t3GUDTyTslc/v0HzIx3EMXclseuRytVsAS xGLoGaymFk2q7njdFKyAwiFghAFBRT744tIUik11MaXfAqvWZTjY0g/1mRcbfcaUjM6Y Zxl83h7vL/1O5jAiUsl18FzcK9173c6jKww0Uo55JUOjwje2+ICw/yYT3ViKleTOpFyj LiOZyZ1p2bUGdh/XIm6mOpXYBNncjrF5of19tSoNR6tIosif8HShbdUSSJXXxMBrSAwR dGSUPafemcURe3PfJ4zaoAXniCrpEuAHAheKJqL2UzAtMZgXZ+4QwBlH0ZQIWWBqi31i Ddow== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=U5guNjbg; spf=pass (google.com: domain of mptcp+bounces-4268-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-4268-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 s12-20020ac25fac000000b0044593e8f571si2653067lfe.281.2022.03.16.16.16.58 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 16 Mar 2022 16:16:58 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-4268-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=U5guNjbg; spf=pass (google.com: domain of mptcp+bounces-4268-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-4268-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 41A1D1C0C4E for ; Wed, 16 Mar 2022 23:16:58 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 232283D72; Wed, 16 Mar 2022 23:16:49 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) (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 A346C3D6E for ; Wed, 16 Mar 2022 23:16: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=1647472607; x=1679008607; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=+rECdyQd8y0br4SUS01z9OTNvgvoP6peEX2mLurHiq0=; b=U5guNjbgmweMzP7raWQBV4ZgfYFZ3e4blpXzqhZ2kVaz1gnNHlpCgzYM JH+ihtJY/VUBMftA4vzi7yIW+8KsB8k8MT96kyMCGFpDeN0GKvY3xkZNw 1kgxx0yldpD4Pbewv1WNwwsT+bqlX6SFsmFFdJpr+hwXPGFCexGK0I0LR YZtJrKT+WIiq6LgVipwZWKAj+fCD0VlnbbHwZSCamnMPAl7+8OeRfEZMx vJ4bQXNxj7KWFmwx7E3o4YXzVZY6y2+Ou4QIN/WQAcRHsIB9aS7UlwiIK 8NYInLQiP4zjqfBXbEZynCC6bbUhHijIE39AGEVvMypeihYHaP2qIEhAt g==; X-IronPort-AV: E=McAfee;i="6200,9189,10288"; a="236679334" X-IronPort-AV: E=Sophos;i="5.90,187,1643702400"; d="scan'208";a="236679334" Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Mar 2022 16:16:43 -0700 X-IronPort-AV: E=Sophos;i="5.90,187,1643702400"; d="scan'208";a="613813322" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by fmsmga004-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Mar 2022 16:16:43 -0700 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v5 10/14] selftests: mptcp: support MPTCP_PM_CMD_SUBFLOW_CREATE Date: Wed, 16 Mar 2022 19:16:32 -0400 Message-Id: <20220316231636.645625-11-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220316231636.645625-1-kishen.maloor@intel.com> References: <20220316231636.645625-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 3506b0416c41..e2437bacd133 100644 --- a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c +++ b/tools/testing/selftests/net/mptcp/pm_nl_ctl.c @@ -29,6 +29,7 @@ static void syntax(char *argv[]) fprintf(stderr, "\tadd [flags signal|subflow|backup|fullmesh] [id ] [= dev ] \n"); fprintf(stderr, "\tann id token [port ] [dev ]\n"); fprintf(stderr, "\trem id token \n"); + fprintf(stderr, "\tcsf lip lid rip rpor= t token \n"); fprintf(stderr, "\tdel []\n"); fprintf(stderr, "\tget \n"); fprintf(stderr, "\tset [] [id ] flags [no]backup|[no]fullmesh [po= rt ]\n"); @@ -173,6 +174,132 @@ static int resolve_mptcp_pm_netlink(int fd) return genl_parse_getfamily((void *)data); } =20 +int csf(int fd, int pm_family, int argc, char *argv[]) +{ + char data[NLMSG_ALIGN(sizeof(struct nlmsghdr)) + + NLMSG_ALIGN(sizeof(struct genlmsghdr)) + + 1024]; + const char *params[5]; + struct nlmsghdr *nh; + struct rtattr *addr; + struct rtattr *rta; + u_int16_t family; + u_int32_t token; + u_int16_t port; + int addr_start; + u_int8_t id; + int off =3D 0; + int arg; + + memset(params, 0, 5 * sizeof(const char *)); + + memset(data, 0, sizeof(data)); + nh =3D (void *)data; + off =3D init_genl_req(data, pm_family, MPTCP_PM_CMD_SUBFLOW_CREATE, + MPTCP_PM_VER); + + if (argc < 12) + syntax(argv); + + /* Params recorded in this order: + * , , , , + */ + for (arg =3D 2; arg < argc; arg++) { + if (!strcmp(argv[arg], "lip")) { + if (++arg >=3D argc) + error(1, 0, " missing local IP"); + + params[0] =3D argv[arg]; + } else if (!strcmp(argv[arg], "lid")) { + if (++arg >=3D argc) + error(1, 0, " missing local id"); + + params[1] =3D argv[arg]; + } else if (!strcmp(argv[arg], "rip")) { + if (++arg >=3D argc) + error(1, 0, " missing remote ip"); + + params[2] =3D argv[arg]; + } else if (!strcmp(argv[arg], "rport")) { + if (++arg >=3D argc) + error(1, 0, " missing remote port"); + + params[3] =3D argv[arg]; + } else if (!strcmp(argv[arg], "token")) { + if (++arg >=3D argc) + error(1, 0, " missing token"); + + params[4] =3D argv[arg]; + } else + error(1, 0, "unknown param %s", argv[arg]); + } + + for (arg =3D 0; arg < 4; arg =3D arg + 2) { + /* addr header */ + addr_start =3D off; + addr =3D (void *)(data + off); + addr->rta_type =3D NLA_F_NESTED | + ((arg =3D=3D 0) ? MPTCP_PM_ATTR_ADDR : MPTCP_PM_ATTR_ADDR_REMOTE); + addr->rta_len =3D RTA_LENGTH(0); + off +=3D NLMSG_ALIGN(addr->rta_len); + + /* addr data */ + rta =3D (void *)(data + off); + if (inet_pton(AF_INET, params[arg], RTA_DATA(rta))) { + family =3D AF_INET; + rta->rta_type =3D MPTCP_PM_ADDR_ATTR_ADDR4; + rta->rta_len =3D RTA_LENGTH(4); + } else if (inet_pton(AF_INET6, params[arg], RTA_DATA(rta))) { + family =3D AF_INET6; + rta->rta_type =3D MPTCP_PM_ADDR_ATTR_ADDR6; + rta->rta_len =3D RTA_LENGTH(16); + } else + error(1, errno, "can't parse ip %s", params[arg]); + off +=3D NLMSG_ALIGN(rta->rta_len); + + /* family */ + rta =3D (void *)(data + off); + rta->rta_type =3D MPTCP_PM_ADDR_ATTR_FAMILY; + rta->rta_len =3D RTA_LENGTH(2); + memcpy(RTA_DATA(rta), &family, 2); + off +=3D NLMSG_ALIGN(rta->rta_len); + + if (arg =3D=3D 2) { + /* port */ + port =3D atoi(params[arg + 1]); + rta =3D (void *)(data + off); + rta->rta_type =3D MPTCP_PM_ADDR_ATTR_PORT; + rta->rta_len =3D RTA_LENGTH(2); + memcpy(RTA_DATA(rta), &port, 2); + off +=3D NLMSG_ALIGN(rta->rta_len); + } + + if (arg =3D=3D 0) { + /* id */ + id =3D atoi(params[arg + 1]); + rta =3D (void *)(data + off); + rta->rta_type =3D MPTCP_PM_ADDR_ATTR_ID; + rta->rta_len =3D RTA_LENGTH(1); + memcpy(RTA_DATA(rta), &id, 1); + off +=3D NLMSG_ALIGN(rta->rta_len); + } + + addr->rta_len =3D off - addr_start; + } + + /* token */ + token =3D atoi(params[4]); + rta =3D (void *)(data + off); + rta->rta_type =3D MPTCP_PM_ATTR_TOKEN; + rta->rta_len =3D RTA_LENGTH(4); + memcpy(RTA_DATA(rta), &token, 4); + off +=3D NLMSG_ALIGN(rta->rta_len); + + do_nl_req(fd, nh, off, 0); + + return 0; +} + int remove_addr(int fd, int pm_family, int argc, char *argv[]) { char data[NLMSG_ALIGN(sizeof(struct nlmsghdr)) + @@ -969,6 +1096,8 @@ int main(int argc, char *argv[]) return announce_addr(fd, pm_family, argc, argv); else if (!strcmp(argv[1], "rem")) return remove_addr(fd, pm_family, argc, argv); + else if (!strcmp(argv[1], "csf")) + return csf(fd, pm_family, argc, argv); else if (!strcmp(argv[1], "del")) return del_addr(fd, pm_family, argc, argv); else if (!strcmp(argv[1], "flush")) --=20 2.31.1 From nobody Mon Apr 29 07:56:36 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a50:bae3:0:0:0:0:0 with SMTP id x90csp491610ede; Wed, 16 Mar 2022 16:16:50 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzwaXNX/yXvLXBG9JbsuzjLMqnEpG8NhxQ+ETIQYvScMblYeGLVXWVivImPE09bAkGqpfX+ X-Received: by 2002:a05:6512:12c8:b0:448:7c3f:60f8 with SMTP id p8-20020a05651212c800b004487c3f60f8mr1161429lfg.79.1647472610225; Wed, 16 Mar 2022 16:16:50 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1647472610; cv=none; d=google.com; s=arc-20160816; b=yeG0+eHK4kJ6lJbvqB0l9OIrXU3A9NWq8/0TsUwUGxpAzdcBV4QApWvl90RIC3Eiaa bigeDrJ7YLEuZpWleLoapHcSCcaKo6zVZSLmAGnkXfL1oi4fdXl6MU21R+Z5UFu+fKGM m0ponTj+MfkkjOwoggvh2btkx5IVg7/LdiFIWM/ik7jqasYlZc0sKJtsdMnET24LsW3A gcB5LS+LN4AX38JuQJtS0FnxsU4cNfh/z+2OWDn/iTX7lwW6rvRMETUsZ5+1T19APCSG Ric2Gxdkf1CS9+QMl8Io0jlD/km4zscZW4UWzvruuUhxm5zF7XdX90IZ4uOwK5+ragaS xErg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:to:from:dkim-signature; bh=v0iWcl70HsDBQ7DCdXGkkMSal5nZ+PN3vfJ6jZPtrIg=; b=rqPfipCIzht40AdhI71lIAy7/0jz+JxBMXIRjmaqOyfRH4GqYbStG+ZgrEAdkxt4mY 9K7LsO2ysJLG4timGa/83EwelU5otZvkS4cilgBmU5CcJiuwItiF3/bJbvnqPrbllkoE xJvim3gT9jBWib9SjzUPP/KcwV6MKLPfGbRQhpl04UnPABpUCqTJp4e647j9VvaisGOI 8Xo6dNb9x1TJV8FNjhk+tsHN3W6totRGOJfCLlGFMijpS/FNVuF1An4iKNYXhAq3Jr2u EV5A+T83R+mtN9zannti4NcYwtO22m+L1XuDGPun036yhxwpcGOOshAI5rp1SdR4NZ1/ WfVg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=Gh7RyCp9; spf=pass (google.com: domain of mptcp+bounces-4261-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-4261-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 a14-20020a05651c210e00b00249265cbbd6si3182937ljq.522.2022.03.16.16.16.49 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 16 Mar 2022 16:16:50 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-4261-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=Gh7RyCp9; spf=pass (google.com: domain of mptcp+bounces-4261-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-4261-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 B0FA41C0CC4 for ; Wed, 16 Mar 2022 23:16:49 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 3E21F3D76; Wed, 16 Mar 2022 23:16:46 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga18.intel.com (mga18.intel.com [134.134.136.126]) (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 660663D6F for ; Wed, 16 Mar 2022 23:16: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=1647472604; x=1679008604; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=+o04xQLPfR6ph1mrN9TOLw9IIeTZ0vtmCqoGxs1NsH0=; b=Gh7RyCp9KRhBfg+n0RkmhGyU2BDZjMM7v8dy+Ki7+uRDIjS4c0pzroTe vcWjE7kDLBFkjBJL9K3LqzksT+7/iMu4uuiXXvREWrqkIINpQzHVq8DXv WlzrlBuM4IppsKiAkVsU886xz7AaDHBDHvjwnBCxk1fZ3IbK0OmWUiC9i Aeny/q42Ms8bhX1EY6BnotW1WXW0yDAUbdSIrbaTsRZDTRR6muExDXwfV 6vJZV6fczU1ssRHLjrViiRZZWGx0fve9KnnL+Da0wWwCGVtcdy5FUGCpn ZxGN2gLAgi1QaiZJUOkqBGwKB55GnOWLgr4TwxwPckLrOnTkEsQv5xKND g==; X-IronPort-AV: E=McAfee;i="6200,9189,10288"; a="238897690" X-IronPort-AV: E=Sophos;i="5.90,187,1643702400"; d="scan'208";a="238897690" Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Mar 2022 16:16:43 -0700 X-IronPort-AV: E=Sophos;i="5.90,187,1643702400"; d="scan'208";a="613813325" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by fmsmga004-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Mar 2022 16:16:43 -0700 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v5 11/14] selftests: mptcp: support MPTCP_PM_CMD_SUBFLOW_DESTROY Date: Wed, 16 Mar 2022 19:16:33 -0400 Message-Id: <20220316231636.645625-12-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220316231636.645625-1-kishen.maloor@intel.com> References: <20220316231636.645625-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 e2437bacd133..8d74fcb04929 100644 --- a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c +++ b/tools/testing/selftests/net/mptcp/pm_nl_ctl.c @@ -30,6 +30,7 @@ static void syntax(char *argv[]) fprintf(stderr, "\tann id token [port ] [dev ]\n"); fprintf(stderr, "\trem id token \n"); fprintf(stderr, "\tcsf lip lid rip rpor= t token \n"); + fprintf(stderr, "\tdsf lip lport rip = rport token \n"); fprintf(stderr, "\tdel []\n"); fprintf(stderr, "\tget \n"); fprintf(stderr, "\tset [] [id ] flags [no]backup|[no]fullmesh [po= rt ]\n"); @@ -174,6 +175,118 @@ static int resolve_mptcp_pm_netlink(int fd) return genl_parse_getfamily((void *)data); } =20 +int dsf(int fd, int pm_family, int argc, char *argv[]) +{ + char data[NLMSG_ALIGN(sizeof(struct nlmsghdr)) + + NLMSG_ALIGN(sizeof(struct genlmsghdr)) + + 1024]; + struct rtattr *rta, *addr; + u_int16_t family, port; + struct nlmsghdr *nh; + u_int32_t token; + int addr_start; + int off =3D 0; + int arg; + + const char *params[5]; + + memset(params, 0, 5 * sizeof(const char *)); + + memset(data, 0, sizeof(data)); + nh =3D (void *)data; + off =3D init_genl_req(data, pm_family, MPTCP_PM_CMD_SUBFLOW_DESTROY, + MPTCP_PM_VER); + + if (argc < 12) + syntax(argv); + + /* Params recorded in this order: + * , , , , + */ + for (arg =3D 2; arg < argc; arg++) { + if (!strcmp(argv[arg], "lip")) { + if (++arg >=3D argc) + error(1, 0, " missing local IP"); + + params[0] =3D argv[arg]; + } else if (!strcmp(argv[arg], "lport")) { + if (++arg >=3D argc) + error(1, 0, " missing local port"); + + params[1] =3D argv[arg]; + } else if (!strcmp(argv[arg], "rip")) { + if (++arg >=3D argc) + error(1, 0, " missing remote IP"); + + params[2] =3D argv[arg]; + } else if (!strcmp(argv[arg], "rport")) { + if (++arg >=3D argc) + error(1, 0, " missing remote port"); + + params[3] =3D argv[arg]; + } else if (!strcmp(argv[arg], "token")) { + if (++arg >=3D argc) + error(1, 0, " missing token"); + + params[4] =3D argv[arg]; + } else + error(1, 0, "unknown keyword %s", argv[arg]); + } + + for (arg =3D 0; arg < 4; arg =3D arg + 2) { + /* addr header */ + addr_start =3D off; + addr =3D (void *)(data + off); + addr->rta_type =3D NLA_F_NESTED | + ((arg =3D=3D 0) ? MPTCP_PM_ATTR_ADDR : MPTCP_PM_ATTR_ADDR_REMOTE); + addr->rta_len =3D RTA_LENGTH(0); + off +=3D NLMSG_ALIGN(addr->rta_len); + + /* addr data */ + rta =3D (void *)(data + off); + if (inet_pton(AF_INET, params[arg], RTA_DATA(rta))) { + family =3D AF_INET; + rta->rta_type =3D MPTCP_PM_ADDR_ATTR_ADDR4; + rta->rta_len =3D RTA_LENGTH(4); + } else if (inet_pton(AF_INET6, params[arg], RTA_DATA(rta))) { + family =3D AF_INET6; + rta->rta_type =3D MPTCP_PM_ADDR_ATTR_ADDR6; + rta->rta_len =3D RTA_LENGTH(16); + } else + error(1, errno, "can't parse ip %s", params[arg]); + off +=3D NLMSG_ALIGN(rta->rta_len); + + /* family */ + rta =3D (void *)(data + off); + rta->rta_type =3D MPTCP_PM_ADDR_ATTR_FAMILY; + rta->rta_len =3D RTA_LENGTH(2); + memcpy(RTA_DATA(rta), &family, 2); + off +=3D NLMSG_ALIGN(rta->rta_len); + + /* port */ + port =3D atoi(params[arg + 1]); + rta =3D (void *)(data + off); + rta->rta_type =3D MPTCP_PM_ADDR_ATTR_PORT; + rta->rta_len =3D RTA_LENGTH(2); + memcpy(RTA_DATA(rta), &port, 2); + off +=3D NLMSG_ALIGN(rta->rta_len); + + addr->rta_len =3D off - addr_start; + } + + /* token */ + token =3D atoi(params[4]); + rta =3D (void *)(data + off); + rta->rta_type =3D MPTCP_PM_ATTR_TOKEN; + rta->rta_len =3D RTA_LENGTH(4); + memcpy(RTA_DATA(rta), &token, 4); + off +=3D NLMSG_ALIGN(rta->rta_len); + + do_nl_req(fd, nh, off, 0); + + return 0; +} + int csf(int fd, int pm_family, int argc, char *argv[]) { char data[NLMSG_ALIGN(sizeof(struct nlmsghdr)) + @@ -1098,6 +1211,8 @@ int main(int argc, char *argv[]) return remove_addr(fd, pm_family, argc, argv); else if (!strcmp(argv[1], "csf")) return csf(fd, pm_family, argc, argv); + else if (!strcmp(argv[1], "dsf")) + return dsf(fd, pm_family, argc, argv); else if (!strcmp(argv[1], "del")) return del_addr(fd, pm_family, argc, argv); else if (!strcmp(argv[1], "flush")) --=20 2.31.1 From nobody Mon Apr 29 07:56:36 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a50:bae3:0:0:0:0:0 with SMTP id x90csp491645ede; Wed, 16 Mar 2022 16:16:55 -0700 (PDT) X-Google-Smtp-Source: ABdhPJyX4J/duNOWteBSfI8jJoWiV5AiqI/v6hd1150Uw7pUA9yNl4QPLRVbMqcl1TLQdb09K+NZ X-Received: by 2002:a05:6a00:24c4:b0:4f7:2fc6:50e8 with SMTP id d4-20020a056a0024c400b004f72fc650e8mr2099973pfv.63.1647472615019; Wed, 16 Mar 2022 16:16:55 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1647472615; cv=none; d=google.com; s=arc-20160816; b=wRA/KcQls926nt+63YvLuPGzYIWxLisWyHKhdNwUMdL/2aYDyofEFLPsAck62zR+TC LYZwzLLUsc7nhPjQ1Fb4QERgjNFhGRfNFsmi3p8jO3xKTmtO5poRqvk8YOzU9imhxDAR 0+83PU8RItML8Q2vtkZqLDnhKMoUTm6KlV82CYD12dqq8fFLCQPPthCW81h6MJJxyGBh r98UPuKrP8AJ+gNdseglV1WhWKFgai2tC5VpfaBQaD4hZ+Ekuuoc1AHSoeMHWHB5bTjX ysetz4B8aouS4iP12TgZfbPJXCGoRNmu7l8QiM31btFX+u5Q1iyh6YDxBv5jZ80WLAWe eamQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:to:from:dkim-signature; bh=ro06X8pgCB9pHF7f9HJ/zruOR6wqtOTW7EqS9rAp+O8=; b=zPkBS7LS+KVN9krqCGzpUsXLVp8bE9TyL7gBSm7y8LFq0i89tnD+4YcAqQ16OV92E+ WO2osYBuY03tq7CFYUJ+ZieS5aUNIGopE15PLFIgWqUAwDOYu29CEpG9kMtFt1go++Mp jlltAACHK1/96+8RCbvJO9V9qOXXsiGi1h2KcBtuuGRnjOJf78kXpXleAUnp+DBugT0J 1ArFZQO30Yix/vO+D/mPt8XnC2tZAhfHSDUk8Qvzl0HXbgfwfetUxIelD8sfU8OKQfI2 LsaPijMHFefw67Vo+ke+FuH5OA5Pb3Cs8bVynFjDndAD3yJXHlrYzlACLSZHhhYVphds TK4w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=Uvt9u7BJ; spf=pass (google.com: domain of mptcp+bounces-4265-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-4265-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 q16-20020a635050000000b003816043eff9si391174pgl.494.2022.03.16.16.16.54 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 16 Mar 2022 16:16:55 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-4265-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=Uvt9u7BJ; spf=pass (google.com: domain of mptcp+bounces-4265-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-4265-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 730C83E0F2D for ; Wed, 16 Mar 2022 23:16:54 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 581D23D73; Wed, 16 Mar 2022 23:16:48 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga18.intel.com (mga18.intel.com [134.134.136.126]) (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 342D83D6B for ; Wed, 16 Mar 2022 23:16: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=1647472606; x=1679008606; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=XfrMc4C9KslLyFbMwlZ3zV5PCfirWg7R8gW3MiTD9Fo=; b=Uvt9u7BJXgqD70nLWIkqr/e1SCSVRqcAPMrVqO3ckw9L4IYnG2AXLvP6 EV5VeiK0d47Q+bOtowKeZcCaFXzSwbDt0M+SmB4b908o4T4+S8vWAerZV sykJe9yKyjzr0DTKANfyZTwNiTT8GkLaq5vXEGsolM8t7EQLtXT6X29pA nNbMm2BKRrW9BSGwsIAekvKcBwjdd41ewm2Jgj4k3/lALG4XPuFFDoyuV sbGOPxqf2icX0Cm7woNVq6czbPsA1gjgdKPVDDkJFmLSi1r18Mt7h48X5 Dpaak7J3NfnR4r0X0QmP9sJBzDa8vSVmSTAX2VYpBrggaPdS1q2lVkMiH w==; X-IronPort-AV: E=McAfee;i="6200,9189,10288"; a="238897692" X-IronPort-AV: E=Sophos;i="5.90,187,1643702400"; d="scan'208";a="238897692" Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Mar 2022 16:16:43 -0700 X-IronPort-AV: E=Sophos;i="5.90,187,1643702400"; d="scan'208";a="613813328" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by fmsmga004-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Mar 2022 16:16:43 -0700 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v5 12/14] selftests: mptcp: capture netlink events Date: Wed, 16 Mar 2022 19:16:34 -0400 Message-Id: <20220316231636.645625-13-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220316231636.645625-1-kishen.maloor@intel.com> References: <20220316231636.645625-1-kishen.maloor@intel.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This change adds to self-testing support for the MPTCP netlink interface by capturing various MPTCP netlink events (and all their metadata) associated with connections, subflows and address announcements. It is used in self-testing scripts that exercise MPTCP netlink commands to precisely validate those operations by examining the dispatched MPTCP netlink events in response to those commands. Signed-off-by: Kishen Maloor --- tools/testing/selftests/net/mptcp/pm_nl_ctl.c | 164 +++++++++++++++++- 1 file changed, 157 insertions(+), 7 deletions(-) diff --git a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c b/tools/testing/= selftests/net/mptcp/pm_nl_ctl.c index 8d74fcb04929..f881d8548153 100644 --- a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c +++ b/tools/testing/selftests/net/mptcp/pm_nl_ctl.c @@ -22,6 +22,9 @@ #ifndef MPTCP_PM_NAME #define MPTCP_PM_NAME "mptcp_pm" #endif +#ifndef MPTCP_PM_EVENTS +#define MPTCP_PM_EVENTS "mptcp_pm_events" +#endif =20 static void syntax(char *argv[]) { @@ -37,6 +40,7 @@ static void syntax(char *argv[]) fprintf(stderr, "\tflush\n"); fprintf(stderr, "\tdump\n"); fprintf(stderr, "\tlimits [ ]\n"); + fprintf(stderr, "\tevents\n"); exit(0); } =20 @@ -88,6 +92,108 @@ static void nl_error(struct nlmsghdr *nh) } } =20 +static int capture_events(int fd, int event_group) +{ + u_int8_t buffer[NLMSG_ALIGN(sizeof(struct nlmsghdr)) + + NLMSG_ALIGN(sizeof(struct genlmsghdr)) + 1024]; + struct genlmsghdr *ghdr; + struct rtattr *attrs; + struct nlmsghdr *nh; + int ret =3D 0; + int res_len; + int msg_len; + fd_set rfds; + + if (setsockopt(fd, SOL_NETLINK, NETLINK_ADD_MEMBERSHIP, + &event_group, sizeof(event_group)) < 0) + error(1, errno, "could not join the " MPTCP_PM_EVENTS " mcast group"); + + do { + FD_ZERO(&rfds); + FD_SET(fd, &rfds); + res_len =3D NLMSG_ALIGN(sizeof(struct nlmsghdr)) + + NLMSG_ALIGN(sizeof(struct genlmsghdr)) + 1024; + + ret =3D select(FD_SETSIZE, &rfds, NULL, NULL, NULL); + + if (ret < 0) + error(1, ret, "error in select() on NL socket"); + + res_len =3D recv(fd, buffer, res_len, 0); + if (res_len < 0) + error(1, res_len, "error on recv() from NL socket"); + + nh =3D (struct nlmsghdr *)buffer; + + for (; NLMSG_OK(nh, res_len); nh =3D NLMSG_NEXT(nh, res_len)) { + if (nh->nlmsg_type =3D=3D NLMSG_ERROR) + error(1, NLMSG_ERROR, "received invalid NL message"); + + ghdr =3D (struct genlmsghdr *)NLMSG_DATA(nh); + + if (ghdr->cmd =3D=3D 0) + continue; + + fprintf(stderr, "type:%d", ghdr->cmd); + + msg_len =3D nh->nlmsg_len - NLMSG_LENGTH(GENL_HDRLEN); + + attrs =3D (struct rtattr *) ((char *) ghdr + GENL_HDRLEN); + while (RTA_OK(attrs, msg_len)) { + if (attrs->rta_type =3D=3D MPTCP_ATTR_TOKEN) + fprintf(stderr, ",token:%u", *(__u32 *)RTA_DATA(attrs)); + else if (attrs->rta_type =3D=3D MPTCP_ATTR_FAMILY) + fprintf(stderr, ",family:%u", *(__u16 *)RTA_DATA(attrs)); + else if (attrs->rta_type =3D=3D MPTCP_ATTR_LOC_ID) + fprintf(stderr, ",loc_id:%u", *(__u8 *)RTA_DATA(attrs)); + else if (attrs->rta_type =3D=3D MPTCP_ATTR_REM_ID) + fprintf(stderr, ",rem_id:%u", *(__u8 *)RTA_DATA(attrs)); + else if (attrs->rta_type =3D=3D MPTCP_ATTR_SADDR4) { + u_int32_t saddr4 =3D ntohl(*(__u32 *)RTA_DATA(attrs)); + + fprintf(stderr, ",saddr4:%u.%u.%u.%u", saddr4 >> 24, + (saddr4 >> 16) & 0xFF, (saddr4 >> 8) & 0xFF, + (saddr4 & 0xFF)); + } else if (attrs->rta_type =3D=3D MPTCP_ATTR_SADDR6) { + char buf[INET6_ADDRSTRLEN]; + + if (inet_ntop(AF_INET6, RTA_DATA(attrs), buf, + sizeof(buf)) !=3D NULL) + fprintf(stderr, ",saddr6:%s", buf); + } else if (attrs->rta_type =3D=3D MPTCP_ATTR_DADDR4) { + u_int32_t daddr4 =3D ntohl(*(__u32 *)RTA_DATA(attrs)); + + fprintf(stderr, ",daddr4:%u.%u.%u.%u", daddr4 >> 24, + (daddr4 >> 16) & 0xFF, (daddr4 >> 8) & 0xFF, + (daddr4 & 0xFF)); + } else if (attrs->rta_type =3D=3D MPTCP_ATTR_DADDR6) { + char buf[INET6_ADDRSTRLEN]; + + if (inet_ntop(AF_INET6, RTA_DATA(attrs), buf, + sizeof(buf)) !=3D NULL) + fprintf(stderr, ",daddr6:%s", buf); + } else if (attrs->rta_type =3D=3D MPTCP_ATTR_SPORT) + fprintf(stderr, ",sport:%u", + ntohs(*(__u16 *)RTA_DATA(attrs))); + else if (attrs->rta_type =3D=3D MPTCP_ATTR_DPORT) + fprintf(stderr, ",dport:%u", + ntohs(*(__u16 *)RTA_DATA(attrs))); + else if (attrs->rta_type =3D=3D MPTCP_ATTR_BACKUP) + fprintf(stderr, ",backup:%u", *(__u8 *)RTA_DATA(attrs)); + else if (attrs->rta_type =3D=3D MPTCP_ATTR_ERROR) + fprintf(stderr, ",error:%u", *(__u8 *)RTA_DATA(attrs)); + else if (attrs->rta_type =3D=3D MPTCP_ATTR_SERVER_SIDE) + fprintf(stderr, ",server_side:%u", *(__u8 *)RTA_DATA(attrs)); + + attrs =3D RTA_NEXT(attrs, msg_len); + } + } + fprintf(stderr, "\n"); + } while (1); + + return 0; +} + /* do a netlink command and, if max > 0, fetch the reply */ static int do_nl_req(int fd, struct nlmsghdr *nh, int len, int max) { @@ -121,11 +227,18 @@ static int do_nl_req(int fd, struct nlmsghdr *nh, int= len, int max) return ret; } =20 -static int genl_parse_getfamily(struct nlmsghdr *nlh) +static int genl_parse_getfamily(struct nlmsghdr *nlh, int *pm_family, + int *events_mcast_grp) { struct genlmsghdr *ghdr =3D NLMSG_DATA(nlh); int len =3D nlh->nlmsg_len; struct rtattr *attrs; + struct rtattr *grps; + struct rtattr *grp; + int got_events_grp; + int got_family; + int grps_len; + int grp_len; =20 if (nlh->nlmsg_type !=3D GENL_ID_CTRL) error(1, errno, "Not a controller message, len=3D%d type=3D0x%x\n", @@ -140,9 +253,42 @@ static int genl_parse_getfamily(struct nlmsghdr *nlh) error(1, errno, "Unknown controller command %d\n", ghdr->cmd); =20 attrs =3D (struct rtattr *) ((char *) ghdr + GENL_HDRLEN); + got_family =3D 0; + got_events_grp =3D 0; + while (RTA_OK(attrs, len)) { - if (attrs->rta_type =3D=3D CTRL_ATTR_FAMILY_ID) - return *(__u16 *)RTA_DATA(attrs); + if (attrs->rta_type =3D=3D CTRL_ATTR_FAMILY_ID) { + *pm_family =3D *(__u16 *)RTA_DATA(attrs); + got_family =3D 1; + } else if (attrs->rta_type =3D=3D CTRL_ATTR_MCAST_GROUPS) { + grps =3D RTA_DATA(attrs); + grps_len =3D RTA_PAYLOAD(attrs); + + while (RTA_OK(grps, grps_len)) { + grp =3D RTA_DATA(grps); + grp_len =3D RTA_PAYLOAD(grps); + got_events_grp =3D 0; + + while (RTA_OK(grp, grp_len)) { + if (grp->rta_type =3D=3D CTRL_ATTR_MCAST_GRP_ID) + *events_mcast_grp =3D *(__u32 *)RTA_DATA(grp); + else if (grp->rta_type =3D=3D CTRL_ATTR_MCAST_GRP_NAME && + !strcmp(RTA_DATA(grp), MPTCP_PM_EVENTS)) + got_events_grp =3D 1; + + grp =3D RTA_NEXT(grp, grp_len); + } + + if (got_events_grp) + break; + + grps =3D RTA_NEXT(grps, grps_len); + } + } + + if (got_family && got_events_grp) + return 0; + attrs =3D RTA_NEXT(attrs, len); } =20 @@ -150,7 +296,7 @@ static int genl_parse_getfamily(struct nlmsghdr *nlh) return -1; } =20 -static int resolve_mptcp_pm_netlink(int fd) +static int resolve_mptcp_pm_netlink(int fd, int *pm_family, int *events_mc= ast_grp) { char data[NLMSG_ALIGN(sizeof(struct nlmsghdr)) + NLMSG_ALIGN(sizeof(struct genlmsghdr)) + @@ -172,7 +318,7 @@ static int resolve_mptcp_pm_netlink(int fd) off +=3D NLMSG_ALIGN(rta->rta_len); =20 do_nl_req(fd, nh, off, sizeof(data)); - return genl_parse_getfamily((void *)data); + return genl_parse_getfamily((void *)data, pm_family, events_mcast_grp); } =20 int dsf(int fd, int pm_family, int argc, char *argv[]) @@ -1192,7 +1338,9 @@ int set_flags(int fd, int pm_family, int argc, char *= argv[]) =20 int main(int argc, char *argv[]) { - int fd, pm_family; + int events_mcast_grp; + int pm_family; + int fd; =20 if (argc < 2) syntax(argv); @@ -1201,7 +1349,7 @@ int main(int argc, char *argv[]) if (fd =3D=3D -1) error(1, errno, "socket netlink"); =20 - pm_family =3D resolve_mptcp_pm_netlink(fd); + resolve_mptcp_pm_netlink(fd, &pm_family, &events_mcast_grp); =20 if (!strcmp(argv[1], "add")) return add_addr(fd, pm_family, argc, argv); @@ -1225,6 +1373,8 @@ int main(int argc, char *argv[]) return get_set_limits(fd, pm_family, argc, argv); else if (!strcmp(argv[1], "set")) return set_flags(fd, pm_family, argc, argv); + else if (!strcmp(argv[1], "events")) + return capture_events(fd, events_mcast_grp); =20 fprintf(stderr, "unknown sub-command: %s", argv[1]); syntax(argv); --=20 2.31.1 From nobody Mon Apr 29 07:56:36 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a50:bae3:0:0:0:0:0 with SMTP id x90csp491724ede; Wed, 16 Mar 2022 16:17:03 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzbAMUmAdD5wR+iEU2gaPr95dcMbGkU3itGpHYjmyn6iJO+lKibxsCbqYq9l+AarWGbQXXT X-Received: by 2002:a05:651c:2118:b0:249:20cb:a42 with SMTP id a24-20020a05651c211800b0024920cb0a42mr1174520ljq.157.1647472623461; Wed, 16 Mar 2022 16:17:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1647472623; cv=none; d=google.com; s=arc-20160816; b=S/36kuQDDP5YxbtpaKBIrXT1XpiFjpwVfWUv6ndbTpgJdSJYS3wvFLcFHZfexK322s UZhv30a1bM8qwOT04uLmalVDFao/2q1VaaXLlw5a+Pz80YNfWZwXd9nWkAhkB4NR0DDa hyLioWjF6xtqt9chMniPm57uefHvNbXuVQoTZbOyujlKcMzjLn0B+zRepVSRR6iaZJWk HoJVa5PaOgFppODY2Bm1CABtt+M42cWwKuj6y2LvRzivYP3NR5iC/hf8bS3mZzDn0Gto wBHp99VYiapVYEJoD+dF+ZDwf1CAQko6TmQUecFqAzX+gTgMrhy8XBNisEqVTDx7j2HI LUBw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:to:from:dkim-signature; bh=G8jTCYSvmTaRB6yRTu6+S7h7wjY91OImblbHHsvJO1g=; b=HzvebagIyzLH7+j6hvgC5HH8E9Mvvq44FRV3I7ypGKvj/JfNiwlRzwI2/OJM5t9yNc MusoO4G2YiNydEG1P3M5pCaa1gfLnWvQQ6re9fD/xvZ/vB2JDZy9trTrYMshkOAJFcPE dmX9+YDEVZWU83LFT7AWr6KJ1QbEGgzTopDE6I+oTWQVNluEflAB1g1/AI7q4/7S0z5z n5WOIv18eM8mhWsxDeT0odN+9c4CvhBRykNExXLea30A3OvFtLhw9aAkK6kTg7a1WQOA yc06GMlglARrHm9N8mudr1Vsf57xMAezKUusQZAesL624+NsX8s87BT7qxQvOntxXGTe L+xg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=BG51fVU4; spf=pass (google.com: domain of mptcp+bounces-4272-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-4272-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 127-20020a2e0585000000b00247eb0ecf31si3191306ljf.518.2022.03.16.16.17.03 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 16 Mar 2022 16:17:03 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-4272-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=BG51fVU4; spf=pass (google.com: domain of mptcp+bounces-4272-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-4272-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 EB9BE1C0EA4 for ; Wed, 16 Mar 2022 23:17:02 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id B6EC43D6B; Wed, 16 Mar 2022 23:16:50 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga18.intel.com (mga18.intel.com [134.134.136.126]) (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 628C83D77 for ; Wed, 16 Mar 2022 23:16: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=1647472606; x=1679008606; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=tfzehsJBmGdChZMPc0RL5lKqpr+R150YHyu/cK7Z6gI=; b=BG51fVU4ujNQPXmV46TYIVj7hcFmYVxsX6JLx90oeSxQ0uCVC7gWAmzW almhvEqe1Izun5yhXm3o9Wroess7Dm/nVyTAquK/0BB56MnoIYTvsxPc7 RGrclitkkXxxqepbr6kHC2kZzWvn5ZmJrD4QafGNbUKkMcGtmSY3DYSPz ZUgdYQ9dIUyaGpSECYaiIhclCA+7Nqdg45WsJKd0hpWP158S8PxEPQk7r Pidemgop2yGD6w8ILiy9/0Dzn/l5W0TSfV/q21tMEuuGxbKWziVpgm36R MY7C3cYNu11yM5TT2N22jtpI+to6z9wGOz135Y40tCXbGp7XtoWrDdILW A==; X-IronPort-AV: E=McAfee;i="6200,9189,10288"; a="238897694" X-IronPort-AV: E=Sophos;i="5.90,187,1643702400"; d="scan'208";a="238897694" Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Mar 2022 16:16:44 -0700 X-IronPort-AV: E=Sophos;i="5.90,187,1643702400"; d="scan'208";a="613813331" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by fmsmga004-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Mar 2022 16:16:43 -0700 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v5 13/14] selftests: mptcp: create listeners to receive MPJs Date: Wed, 16 Mar 2022 19:16:35 -0400 Message-Id: <20220316231636.645625-14-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220316231636.645625-1-kishen.maloor@intel.com> References: <20220316231636.645625-1-kishen.maloor@intel.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This change updates the "pm_nl_ctl" testing sample with a "listen" option to bind a MPTCP listening socket to the provided addr+port. This option is exercised in testing subflow initiation scenarios in conjunction with userspace path managers where the MPTCP application does not hold an active listener to accept requests for new subflows. Signed-off-by: Kishen Maloor --- tools/testing/selftests/net/mptcp/pm_nl_ctl.c | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c b/tools/testing/= selftests/net/mptcp/pm_nl_ctl.c index f881d8548153..6a2f4b981e1d 100644 --- a/tools/testing/selftests/net/mptcp/pm_nl_ctl.c +++ b/tools/testing/selftests/net/mptcp/pm_nl_ctl.c @@ -25,6 +25,9 @@ #ifndef MPTCP_PM_EVENTS #define MPTCP_PM_EVENTS "mptcp_pm_events" #endif +#ifndef IPPROTO_MPTCP +#define IPPROTO_MPTCP 262 +#endif =20 static void syntax(char *argv[]) { @@ -41,6 +44,7 @@ static void syntax(char *argv[]) fprintf(stderr, "\tdump\n"); fprintf(stderr, "\tlimits [ ]\n"); fprintf(stderr, "\tevents\n"); + fprintf(stderr, "\tlisten \n"); exit(0); } =20 @@ -1219,6 +1223,54 @@ int get_set_limits(int fd, int pm_family, int argc, = char *argv[]) return 0; } =20 +int add_listener(int argc, char *argv[]) +{ + struct sockaddr_storage addr; + struct sockaddr_in6 *a6; + struct sockaddr_in *a4; + u_int16_t family; + int enable =3D 1; + int sock; + int err; + + if (argc < 4) + syntax(argv); + + memset(&addr, 0, sizeof(struct sockaddr_storage)); + a4 =3D (struct sockaddr_in *)&addr; + a6 =3D (struct sockaddr_in6 *)&addr; + + if (inet_pton(AF_INET, argv[2], &a4->sin_addr)) { + family =3D AF_INET; + a4->sin_family =3D family; + a4->sin_port =3D htons(atoi(argv[3])); + } else if (inet_pton(AF_INET6, argv[2], &a6->sin6_addr)) { + family =3D AF_INET6; + a6->sin6_family =3D family; + a6->sin6_port =3D htons(atoi(argv[3])); + } else + error(1, errno, "can't parse ip %s", argv[2]); + + sock =3D socket(family, SOCK_STREAM, IPPROTO_MPTCP); + if (sock < 0) + error(1, errno, "can't create listener sock\n"); + + if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &enable, sizeof(enable))) { + close(sock); + error(1, errno, "can't set SO_REUSEADDR on listener sock\n"); + } + + err =3D bind(sock, (struct sockaddr *)&addr, + ((family =3D=3D AF_INET) ? sizeof(struct sockaddr_in) : + sizeof(struct sockaddr_in6))); + + if (err =3D=3D 0 && listen(sock, 30) =3D=3D 0) + pause(); + + close(sock); + return 0; +} + int set_flags(int fd, int pm_family, int argc, char *argv[]) { char data[NLMSG_ALIGN(sizeof(struct nlmsghdr)) + @@ -1375,6 +1427,8 @@ int main(int argc, char *argv[]) return set_flags(fd, pm_family, argc, argv); else if (!strcmp(argv[1], "events")) return capture_events(fd, events_mcast_grp); + else if (!strcmp(argv[1], "listen")) + return add_listener(argc, argv); =20 fprintf(stderr, "unknown sub-command: %s", argv[1]); syntax(argv); --=20 2.31.1 From nobody Mon Apr 29 07:56:36 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a50:bae3:0:0:0:0:0 with SMTP id x90csp491722ede; Wed, 16 Mar 2022 16:17:03 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwQF84gBBsQFu9xU+DEzA6EArMsJTg6EYs3NSwBHjA3eZPFYL2+KfE1dAg2zpIQxGrRSVaO X-Received: by 2002:a2e:a0c9:0:b0:249:171b:1b06 with SMTP id f9-20020a2ea0c9000000b00249171b1b06mr1157608ljm.420.1647472623118; Wed, 16 Mar 2022 16:17:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1647472623; cv=none; d=google.com; s=arc-20160816; b=G/zygq8j14YStycH4nFVUh4cctToF62sUOlKPfDoEbuDiqcwz21BgIxjRvWhZK2UAz GpLPd205Vj1U9/XtziKbLo/3EgiJaAX8wKGTozhSi5xK1Ihfz1iFEqeeWITWuFgfDnFS IPBXvu9N8bAJhuGT0zou8UKzZ31xTabbNkH9iUmZk8sUupj9T3bDt2OCy9CriC8Ay/b+ 1Xcgj3InpmZVAUndnv3e4WyGNnY6S0DEVbIvRgV/DjalTfbueElR7jkHXU7I7Qyj8wSv zHIR56Q6xa+PP4gPbdpqtz6HvzcO2oMepprmajG9iaCHBRdsA4DgNOMi4TdxqsELNfpR xEng== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:to:from:dkim-signature; bh=6DMd0s1uVjdG6GB3LPiY+lWLWTreyp4e4BzNecchB9A=; b=Pr+1Ksv3deUYyms4lOeS/0+Ae4vKFYvh9PTJktAadvNfYDu3la6SFiJR5ojdeBx0pl TkRchxGwGiYxxqv069NzFvVR/pGqHZ32BFBY/6kconZQG2XC7/qfG4ryC7BLPI6bm9Ic 25SEyyBAy6XYCWaxJ3sApKJthHdZeC3PfSAvoJrwoAgdE6PN9IcYV+/oH9iBHBK+GRxT xZAFEmb21Kyd2I+ud+H0hQWLCmeHKGji/WiV03FEtfZ0DMAxIVLJR3nYPpAh23fOGc22 aYweTm6kzaYyUFcEh/EBNF/RNZfnIilEsoGQyC4HVgoexh0kWcgYctiayfAQGx8WX+I0 CM9g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=a1ozcHR8; spf=pass (google.com: domain of mptcp+bounces-4271-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-4271-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 t3-20020a056512068300b004486c0b0d32si432037lfe.113.2022.03.16.16.17.02 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 16 Mar 2022 16:17:03 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-4271-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=a1ozcHR8; spf=pass (google.com: domain of mptcp+bounces-4271-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-4271-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 BA72F1C0BA1 for ; Wed, 16 Mar 2022 23:17:01 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 57CB23D6F; Wed, 16 Mar 2022 23:16:50 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga18.intel.com (mga18.intel.com [134.134.136.126]) (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 608CF3D6B for ; Wed, 16 Mar 2022 23:16: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=1647472608; x=1679008608; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=xixavrOsJ6p/bpiJ3v73HbDTSkgWLluBSstFIZyzxFM=; b=a1ozcHR8htSwpxdY/jADnkjOV1ajThCBFLTehQajl03BWJxPUduyErN/ i7YlZUtvb00AHwuDe5swO/uqRezoSz0mL0P4gHwurLUTy4cMnPlEV1ZYF mAQLvmlpprArSRaD3f8wh+Qy4tNW2Bdz8/a9pY1XwDWoRTYhv1cANX9mk MLFtk7eLkNw9O2xKd0AWZqsC7F+CRjzKmbQq/6XkBwSc37e4IqAA94/9p giXltfFpQUUfbNFP489Wl6HyblpCy3c8EYAdLeILCzHfbXonb+lpdGIRa iiJkH+lmtVpzQ1ZSCAqJxBo0P7jNLDVvJIGsP9ElXgVEm7Onub5XNp9Gl g==; X-IronPort-AV: E=McAfee;i="6200,9189,10288"; a="238897695" X-IronPort-AV: E=Sophos;i="5.90,187,1643702400"; d="scan'208";a="238897695" Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by orsmga106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Mar 2022 16:16:44 -0700 X-IronPort-AV: E=Sophos;i="5.90,187,1643702400"; d="scan'208";a="613813334" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by fmsmga004-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Mar 2022 16:16:43 -0700 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v5 14/14] selftests: mptcp: functional tests for the userspace PM type Date: Wed, 16 Mar 2022 19:16:36 -0400 Message-Id: <20220316231636.645625-15-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220316231636.645625-1-kishen.maloor@intel.com> References: <20220316231636.645625-1-kishen.maloor@intel.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This change adds a selftest script that performs a comprehensive behavioral/functional test of all userspace PM capabilities by exercising all the newly added APIs and changes to support said capabilities. Signed-off-by: Kishen Maloor --- .../selftests/net/mptcp/userspace_pm.sh | 771 ++++++++++++++++++ 1 file changed, 771 insertions(+) create mode 100755 tools/testing/selftests/net/mptcp/userspace_pm.sh diff --git a/tools/testing/selftests/net/mptcp/userspace_pm.sh b/tools/test= ing/selftests/net/mptcp/userspace_pm.sh new file mode 100755 index 000000000000..4f5057ac99bc --- /dev/null +++ b/tools/testing/selftests/net/mptcp/userspace_pm.sh @@ -0,0 +1,771 @@ +#!/bin/bash +# SPDX-License-Identifier: GPL-2.0 + +ip -Version > /dev/null 2>&1 +if [ $? -ne 0 ];then + echo "SKIP: Cannot not run test without ip tool" + exit 1 +fi + +ANNOUNCED=3D6 # MPTCP_EVENT_ANNOUNCED +REMOVED=3D7 # MPTCP_EVENT_REMOVED +SUB_ESTABLISHED=3D10 # MPTCP_EVENT_SUB_ESTABLISHED +SUB_CLOSED=3D11 # MPTCP_EVENT_SUB_CLOSED + +AF_INET=3D2 +AF_INET6=3D10 + +evts_pid=3D0 +client4_pid=3D0 +server4_pid=3D0 +client6_pid=3D0 +server6_pid=3D0 +client4_token=3D"" +server4_token=3D"" +client6_token=3D"" +server6_token=3D"" +client4_port=3D0; +client6_port=3D0; +app4_port=3D50002 +new4_port=3D50003 +app6_port=3D50004 +client_addr_id=3D${RANDOM:0:2} +server_addr_id=3D${RANDOM:0:2} + +sec=3D$(date +%s) +rndh=3D$(printf %x "$sec")-$(mktemp -u XXXXXX) +ns1=3D"ns1-$rndh" +ns2=3D"ns2-$rndh" + +cleanup() +{ + echo "cleanup" + + # Terminate the MPTCP connection and related processes + kill -SIGUSR1 $client4_pid > /dev/null 2>&1 + kill $server4_pid > /dev/null 2>&1 + kill -SIGUSR1 $client6_pid > /dev/null 2>&1 + kill $server6_pid > /dev/null 2>&1 + + kill $evts_pid > /dev/null 2>&1 + + local netns + for netns in "$ns1" "$ns2" ;do + ip netns del "$netns" + done +} + +trap cleanup EXIT + +# Create and configure network namespaces for testing +for i in "$ns1" "$ns2" ;do + ip netns add "$i" || exit 1 + ip -net "$i" link set lo up + ip netns exec "$i" sysctl -q net.mptcp.enabled=3D1 + ip netns exec "$i" sysctl -q net.mptcp.pm_type=3D1 +done + +# "$ns1" ns2 +# ns1eth2 ns2eth1 + +ip link add ns1eth2 netns "$ns1" type veth peer name ns2eth1 netns "$ns2" + +# Add IPv4/v6 addresses to the namespaces +ip -net "$ns1" addr add 10.0.1.1/24 dev ns1eth2 +ip -net "$ns1" addr add 10.0.2.1/24 dev ns1eth2 +ip -net "$ns1" addr add dead:beef:1::1/64 dev ns1eth2 nodad +ip -net "$ns1" addr add dead:beef:2::1/64 dev ns1eth2 nodad +ip -net "$ns1" link set ns1eth2 up + +ip -net "$ns2" addr add 10.0.1.2/24 dev ns2eth1 +ip -net "$ns2" addr add 10.0.2.2/24 dev ns2eth1 +ip -net "$ns2" addr add dead:beef:1::2/64 dev ns2eth1 nodad +ip -net "$ns2" addr add dead:beef:2::2/64 dev ns2eth1 nodad +ip -net "$ns2" link set ns2eth1 up + +printf "Created network namespaces ns1, ns2 \t\t\t[OK]\n" + +make_file() +{ + # Store a chunk of data in a file to transmit over an MPTCP connection + local name=3D$1 + local ksize=3D1 + + dd if=3D/dev/urandom of=3D"$name" bs=3D1024 count=3D$ksize 2> /dev/null + echo -e "\nMPTCP_TEST_FILE_END_MARKER" >> "$name" +} + +make_connection() +{ + local file + file=3D$(mktemp) + make_file "$file" "client" + + local is_v6=3D$1 + local app_port=3D$app4_port + local connect_addr=3D"10.0.1.1" + local listen_addr=3D"0.0.0.0" + if [ "$is_v6" =3D "v6" ] + then + connect_addr=3D"dead:beef:1::1" + listen_addr=3D"::" + app_port=3D$app6_port + else + is_v6=3D"v4" + fi + + # Capture netlink events over the two network namespaces running + # the MPTCP client and server + local client_evts + client_evts=3D$(mktemp) + :>"$client_evts" + ip netns exec "$ns2" ./pm_nl_ctl events >> "$client_evts" 2>&1 & + local client_evts_pid=3D$! + local server_evts + server_evts=3D$(mktemp) + :>"$server_evts" + ip netns exec "$ns1" ./pm_nl_ctl events >> "$server_evts" 2>&1 & + local server_evts_pid=3D$! + sleep 0.1 + + # Run the server + ip netns exec "$ns1" \ + ./mptcp_connect -s MPTCP -w 300 -p $app_port -l $listen_addr > /dev/nu= ll 2>&1 & + local server_pid=3D$! + sleep 0.1 + + # Run the client, transfer $file and stay connected to the server + # to conduct tests + ip netns exec "$ns2" \ + ./mptcp_connect -s MPTCP -w 300 -m sendfile -p $app_port $connect_addr\ + 2>&1 > /dev/null < "$file" & + local client_pid=3D$! + sleep 0.1 + + # Capture client/server attributes from MPTCP connection netlink events + kill $client_evts_pid + + local client_token + local client_port + local client_serverside + local server_token + local server_serverside + + client_token=3D$(sed -n 's/.*\(token:\)\([[:digit:]]*\).*$/\2/p;q' "$clie= nt_evts") + client_port=3D$(sed -n 's/.*\(sport:\)\([[:digit:]]*\).*$/\2/p;q' "$clien= t_evts") + client_serverside=3D$(sed -n 's/.*\(server_side:\)\([[:digit:]]*\).*$/\2/= p;q'\ + "$client_evts") + + kill $server_evts_pid + server_token=3D$(sed -n 's/.*\(token:\)\([[:digit:]]*\).*$/\2/p;q' "$serv= er_evts") + server_serverside=3D$(sed -n 's/.*\(server_side:\)\([[:digit:]]*\).*$/\2/= p;q'\ + "$server_evts") + + rm -f "$client_evts" "$server_evts" "$file" + + if [ "$client_token" !=3D "" ] && [ "$server_token" !=3D "" ] && [ "$clie= nt_serverside" =3D 0 ] && + [ "$server_serverside" =3D 1 ] + then + printf "Established IP%s MPTCP Connection ns2 =3D> ns1 \t\t[OK]\n" $i= s_v6 + else + exit 1 + fi + + if [ "$is_v6" =3D "v6" ] + then + client6_token=3D$client_token + server6_token=3D$server_token + client6_port=3D$client_port + client6_pid=3D$client_pid + server6_pid=3D$server_pid + else + client4_token=3D$client_token + server4_token=3D$server_token + client4_port=3D$client_port + client4_pid=3D$client_pid + server4_pid=3D$server_pid + fi +} + +verify_announce_event() +{ + local evt=3D$1 + local e_type=3D$2 + local e_token=3D$3 + local e_addr=3D$4 + local e_id=3D$5 + local e_dport=3D$6 + local e_af=3D$7 + local type + local token + local addr + local dport + local id + + type=3D$(sed -n 's/.*\(type:\)\([[:digit:]]*\).*$/\2/p;q' "$evt") + token=3D$(sed -n 's/.*\(token:\)\([[:digit:]]*\).*$/\2/p;q' "$evt") + if [ "$e_af" =3D "v6" ] + then + addr=3D$(sed -n 's/.*\(daddr6:\)\([0-9a-f:.]*\).*$/\2/p;q' "$evt") + else + addr=3D$(sed -n 's/.*\(daddr4:\)\([0-9.]*\).*$/\2/p;q' "$evt") + fi + dport=3D$(sed -n 's/.*\(dport:\)\([[:digit:]]*\).*$/\2/p;q' "$evt") + id=3D$(sed -n 's/.*\(rem_id:\)\([[:digit:]]*\).*$/\2/p;q' "$evt") + if [ "$type" =3D "$e_type" ] && [ "$token" =3D "$e_token" ] && + [ "$addr" =3D "$e_addr" ] && [ "$dport" =3D "$e_dport" ] && + [ "$id" =3D "$e_id" ] + then + printf "[OK]\n" + return 0 + fi + printf "[FAIL]\n" + exit 1 +} + +test_announce() +{ + local evts + evts=3D$(mktemp) + # Capture events on the network namespace running the server + :>"$evts" + ip netns exec "$ns1" ./pm_nl_ctl events >> "$evts" 2>&1 & + evts_pid=3D$! + sleep 0.1 + + # ADD_ADDR using an invalid token should result in no action + local invalid_token=3D$(( client4_token - 1)) + ip netns exec "$ns2" ./pm_nl_ctl ann 10.0.2.2 token $invalid_token id\ + $client_addr_id dev ns2eth1 > /dev/null 2>&1 + + local type + type=3D$(sed -n 's/.*\(type:\)\([[:digit:]]*\).*$/\2/p;q' "$evts") + printf "ADD_ADDR 10.0.2.2 (ns2) =3D> ns1, invalid token \t\t" + if [ "$type" =3D "" ] + then + printf "[OK]\n" + else + printf "[FAIL]\n" + exit 1 + fi + + # ADD_ADDR from the client to server machine reusing the subflow port + :>"$evts" + ip netns exec "$ns2"\ + ./pm_nl_ctl ann 10.0.2.2 token "$client4_token" id $client_addr_id dev\ + ns2eth1 > /dev/null 2>&1 + printf "ADD_ADDR id:%d 10.0.2.2 (ns2) =3D> ns1, reuse port \t\t" $client_= addr_id + sleep 0.1 + verify_announce_event "$evts" "$ANNOUNCED" "$server4_token" "10.0.2.2" "$= client_addr_id"\ + "$client4_port" + + # ADD_ADDR6 from the client to server machine reusing the subflow port + :>"$evts" + ip netns exec "$ns2" ./pm_nl_ctl ann\ + dead:beef:2::2 token "$client6_token" id $client_addr_id dev ns2eth1 >= /dev/null 2>&1 + printf "ADD_ADDR6 id:%d dead:beef:2::2 (ns2) =3D> ns1, reuse port\t\t" $c= lient_addr_id + sleep 0.1 + verify_announce_event "$evts" "$ANNOUNCED" "$server6_token" "dead:beef:2:= :2"\ + "$client_addr_id" "$client6_port" "v6" + + # ADD_ADDR from the client to server machine using a new port + :>"$evts" + client_addr_id=3D$((client_addr_id+1)) + ip netns exec "$ns2" ./pm_nl_ctl ann 10.0.2.2 token "$client4_token" id\ + $client_addr_id dev ns2eth1 port $new4_port > /dev/null 2>&1 + printf "ADD_ADDR id:%d 10.0.2.2 (ns2) =3D> ns1, new port \t\t\t" $client_= addr_id + sleep 0.1 + verify_announce_event "$evts" "$ANNOUNCED" "$server4_token" "10.0.2.2"\ + "$client_addr_id" "$new4_port" + + kill $evts_pid + + # Capture events on the network namespace running the client + :>"$evts" + ip netns exec "$ns2" ./pm_nl_ctl events >> "$evts" 2>&1 & + evts_pid=3D$! + sleep 0.1 + + # ADD_ADDR from the server to client machine reusing the subflow port + ip netns exec "$ns1" ./pm_nl_ctl ann 10.0.2.1 token "$server4_token" id\ + $server_addr_id dev ns1eth2 > /dev/null 2>&1 + printf "ADD_ADDR id:%d 10.0.2.1 (ns1) =3D> ns2, reuse port \t\t" $server_= addr_id + sleep 0.1 + verify_announce_event "$evts" "$ANNOUNCED" "$client4_token" "10.0.2.1"\ + "$server_addr_id" "$app4_port" + + # ADD_ADDR6 from the server to client machine reusing the subflow port + :>"$evts" + ip netns exec "$ns1" ./pm_nl_ctl ann dead:beef:2::1 token "$server6_token= " id\ + $server_addr_id dev ns1eth2 > /dev/null 2>&1 + printf "ADD_ADDR6 id:%d dead:beef:2::1 (ns1) =3D> ns2, reuse port\t\t" $s= erver_addr_id + sleep 0.1 + verify_announce_event "$evts" "$ANNOUNCED" "$client6_token" "dead:beef:2:= :1"\ + "$server_addr_id" "$app6_port" "v6" + + # ADD_ADDR from the server to client machine using a new port + :>"$evts" + server_addr_id=3D$((server_addr_id+1)) + ip netns exec "$ns1" ./pm_nl_ctl ann 10.0.2.1 token "$server4_token" id\ + $server_addr_id dev ns1eth2 port $new4_port > /dev/null 2>&1 + printf "ADD_ADDR id:%d 10.0.2.1 (ns1) =3D> ns2, new port \t\t\t" $server_= addr_id + sleep 0.1 + verify_announce_event "$evts" "$ANNOUNCED" "$client4_token" "10.0.2.1"\ + "$server_addr_id" "$new4_port" + + kill $evts_pid + rm -f "$evts" +} + +verify_remove_event() +{ + local evt=3D$1 + local e_type=3D$2 + local e_token=3D$3 + local e_id=3D$4 + local type + local token + local id + + type=3D$(sed -n 's/.*\(type:\)\([[:digit:]]*\).*$/\2/p;q' "$evt") + token=3D$(sed -n 's/.*\(token:\)\([[:digit:]]*\).*$/\2/p;q' "$evt") + id=3D$(sed -n 's/.*\(rem_id:\)\([[:digit:]]*\).*$/\2/p;q' "$evt") + if [ "$type" =3D "$e_type" ] && [ "$token" =3D "$e_token" ] && + [ "$id" =3D "$e_id" ] + then + printf "[OK]\n" + return 0 + fi + printf "[FAIL]\n" + exit 1 +} + +test_remove() +{ + local evts + evts=3D$(mktemp) + + # Capture events on the network namespace running the server + :>"$evts" + ip netns exec "$ns1" ./pm_nl_ctl events >> "$evts" 2>&1 & + evts_pid=3D$! + sleep 0.1 + + # RM_ADDR using an invalid token should result in no action + local invalid_token=3D$(( client4_token - 1 )) + ip netns exec "$ns2" ./pm_nl_ctl rem token $invalid_token id\ + $client_addr_id > /dev/null 2>&1 + printf "RM_ADDR id:%d ns2 =3D> ns1, invalid token \t"\ + $client_addr_id + local type + type=3D$(sed -n 's/.*\(type:\)\([[:digit:]]*\).*$/\2/p;q' "$evts") + if [ "$type" =3D "" ] + then + printf "[OK]\n" + else + printf "[FAIL]\n" + fi + + # RM_ADDR using an invalid addr id should result in no action + local invalid_id=3D$(( client_addr_id + 1 )) + ip netns exec "$ns2" ./pm_nl_ctl rem token "$client4_token" id\ + $invalid_id > /dev/null 2>&1 + printf "RM_ADDR id:%d ns2 =3D> ns1, invalid id \t"\ + $invalid_id + type=3D$(sed -n 's/.*\(type:\)\([[:digit:]]*\).*$/\2/p;q' "$evts") + if [ "$type" =3D "" ] + then + printf "[OK]\n" + else + printf "[FAIL]\n" + fi + + # RM_ADDR from the client to server machine + :>"$evts" + ip netns exec "$ns2" ./pm_nl_ctl rem token "$client4_token" id\ + $client_addr_id > /dev/null 2>&1 + printf "RM_ADDR id:%d ns2 =3D> ns1 \t"\ + $client_addr_id + sleep 0.1 + verify_remove_event "$evts" "$REMOVED" "$server4_token" "$client_addr_id" + + # RM_ADDR from the client to server machine + :>"$evts" + client_addr_id=3D$(( client_addr_id - 1 )) + ip netns exec "$ns2" ./pm_nl_ctl rem token "$client4_token" id\ + $client_addr_id > /dev/null 2>&1 + printf "RM_ADDR id:%d ns2 =3D> ns1 \t"\ + $client_addr_id + sleep 0.1 + verify_remove_event "$evts" "$REMOVED" "$server4_token" "$client_addr_id" + + # RM_ADDR6 from the client to server machine + :>"$evts" + ip netns exec "$ns2" ./pm_nl_ctl rem token "$client6_token" id\ + $client_addr_id > /dev/null 2>&1 + printf "RM_ADDR6 id:%d ns2 =3D> ns1 \t"\ + $client_addr_id + sleep 0.1 + verify_remove_event "$evts" "$REMOVED" "$server6_token" "$client_addr_id" + + kill $evts_pid + + # Capture events on the network namespace running the client + :>"$evts" + ip netns exec "$ns2" ./pm_nl_ctl events >> "$evts" 2>&1 & + evts_pid=3D$! + sleep 0.1 + + # RM_ADDR from the server to client machine + ip netns exec "$ns1" ./pm_nl_ctl rem token "$server4_token" id\ + $server_addr_id > /dev/null 2>&1 + printf "RM_ADDR id:%d ns1 =3D> ns2 \t"\ + $server_addr_id + sleep 0.1 + verify_remove_event "$evts" "$REMOVED" "$client4_token" "$server_addr_id" + + # RM_ADDR from the server to client machine + :>"$evts" + server_addr_id=3D$(( server_addr_id - 1 )) + ip netns exec "$ns1" ./pm_nl_ctl rem token "$server4_token" id\ + $server_addr_id > /dev/null 2>&1 + printf "RM_ADDR id:%d ns1 =3D> ns2 \t" $se= rver_addr_id + sleep 0.1 + verify_remove_event "$evts" "$REMOVED" "$client4_token" "$server_addr_id" + + # RM_ADDR6 from the server to client machine + :>"$evts" + ip netns exec "$ns1" ./pm_nl_ctl rem token "$server6_token" id\ + $server_addr_id > /dev/null 2>&1 + printf "RM_ADDR6 id:%d ns1 =3D> ns2 \t" $se= rver_addr_id + sleep 0.1 + verify_remove_event "$evts" "$REMOVED" "$client6_token" "$server_addr_id" + + kill $evts_pid + rm -f "$evts" +} + +verify_subflow_events() +{ + local evt=3D$1 + local e_type=3D$2 + local e_token=3D$3 + local e_family=3D$4 + local e_saddr=3D$5 + local e_daddr=3D$6 + local e_dport=3D$7 + local e_locid=3D$8 + local e_remid=3D$9 + shift 2 + local e_from=3D$8 + local e_to=3D$9 + local type + local token + local family + local saddr + local daddr + local dport + local locid + local remid + + if [ "$e_type" =3D "$SUB_ESTABLISHED" ] + then + if [ "$e_family" =3D "$AF_INET6" ] + then + printf "CREATE_SUBFLOW6 %s (%s) =3D> %s (%s) "\ + "$e_saddr" "$e_from" "$e_daddr" "$e_to" + else + printf "CREATE_SUBFLOW %s (%s) =3D> %s (%s) \t"\ + "$e_saddr" "$e_from" "$e_daddr" "$e_to" + fi + else + if [ "$e_family" =3D "$AF_INET6" ] + then + printf "DESTROY_SUBFLOW6 %s (%s) =3D> %s (%s) "\ + "$e_saddr" "$e_from" "$e_daddr" "$e_to" + else + printf "DESTROY_SUBFLOW %s (%s) =3D> %s (%s) \t"\ + "$e_saddr" "$e_from" "$e_daddr" "$e_to" + fi + fi + + type=3D$(sed -n 's/.*\(type:\)\([[:digit:]]*\).*$/\2/p;q' "$evt") + token=3D$(sed -n 's/.*\(token:\)\([[:digit:]]*\).*$/\2/p;q' "$evt") + family=3D$(sed -n 's/.*\(family:\)\([[:digit:]]*\).*$/\2/p;q' "$evt") + dport=3D$(sed -n 's/.*\(dport:\)\([[:digit:]]*\).*$/\2/p;q' "$evt") + locid=3D$(sed -n 's/.*\(loc_id:\)\([[:digit:]]*\).*$/\2/p;q' "$evt") + remid=3D$(sed -n 's/.*\(rem_id:\)\([[:digit:]]*\).*$/\2/p;q' "$evt") + if [ "$family" =3D "$AF_INET6" ] + then + saddr=3D$(sed -n 's/.*\(saddr6:\)\([0-9a-f:.]*\).*$/\2/p;q' "$evt") + daddr=3D$(sed -n 's/.*\(daddr6:\)\([0-9a-f:.]*\).*$/\2/p;q' "$evt") + else + saddr=3D$(sed -n 's/.*\(saddr4:\)\([0-9.]*\).*$/\2/p;q' "$evt") + daddr=3D$(sed -n 's/.*\(daddr4:\)\([0-9.]*\).*$/\2/p;q' "$evt") + fi + + if [ "$type" =3D "$e_type" ] && [ "$token" =3D "$e_token" ] && + [ "$daddr" =3D "$e_daddr" ] && [ "$e_dport" =3D "$dport" ] && + [ "$family" =3D "$e_family" ] && [ "$saddr" =3D "$e_saddr" ] && + [ "$e_locid" =3D "$locid" ] && [ "$e_remid" =3D "$remid" ] + then + printf "[OK]\n" + return 0 + fi + printf "[FAIL]\n" + exit 1 +} + +test_subflows() +{ + local evts + evts=3D$(mktemp) + # Capture events on the network namespace running the server + :>"$evts" + ip netns exec "$ns1" ./pm_nl_ctl events >> "$evts" 2>&1 & + evts_pid=3D$! + sleep 0.1 + + # Attempt to add a listener at 10.0.2.2: + ip netns exec "$ns2" ./pm_nl_ctl listen 10.0.2.2\ + "$client4_port" > /dev/null 2>&1 & + local listener_pid=3D$! + + # ADD_ADDR from client to server machine reusing the subflow port + ip netns exec "$ns2" ./pm_nl_ctl ann 10.0.2.2 token "$client4_token" id\ + $client_addr_id > /dev/null 2>&1 + sleep 0.1 + + # CREATE_SUBFLOW from server to client machine + :>"$evts" + ip netns exec "$ns1" ./pm_nl_ctl csf lip 10.0.2.1 lid 23 rip 10.0.2.2\ + rport "$client4_port" token "$server4_token" > /dev/null 2>&1 + sleep 0.1 + verify_subflow_events "$evts" "$SUB_ESTABLISHED" "$server4_token" "$AF_IN= ET" "10.0.2.1"\ + "10.0.2.2" "$client4_port" "23" "$client_addr_id" "ns1" "ns2" + + # Delete the listener from the client ns, if one was created + kill $listener_pid > /dev/null 2>&1 + + local sport + sport=3D$(sed -n 's/.*\(sport:\)\([[:digit:]]*\).*$/\2/p;q' "$evts") + + # DESTROY_SUBFLOW from server to client machine + :>"$evts" + ip netns exec "$ns1" ./pm_nl_ctl dsf lip 10.0.2.1 lport "$sport" rip 10.0= .2.2 rport\ + "$client4_port" token "$server4_token" > /dev/null 2>&1 + sleep 0.1 + verify_subflow_events "$evts" "$SUB_CLOSED" "$server4_token" "$AF_INET" "= 10.0.2.1"\ + "10.0.2.2" "$client4_port" "23" "$client_addr_id" "ns1" "ns2" + + # RM_ADDR from client to server machine + ip netns exec "$ns2" ./pm_nl_ctl rem id $client_addr_id token\ + "$client4_token" > /dev/null 2>&1 + sleep 0.1 + + # Attempt to add a listener at dead:beef:2::2: + ip netns exec "$ns2" ./pm_nl_ctl listen dead:beef:2::2\ + "$client6_port" > /dev/null 2>&1 & + listener_pid=3D$! + + # ADD_ADDR6 from client to server machine reusing the subflow port + :>"$evts" + ip netns exec "$ns2" ./pm_nl_ctl ann dead:beef:2::2 token "$client6_token= " id\ + $client_addr_id > /dev/null 2>&1 + sleep 0.1 + + # CREATE_SUBFLOW6 from server to client machine + :>"$evts" + ip netns exec "$ns1" ./pm_nl_ctl csf lip dead:beef:2::1 lid 23 rip\ + dead:beef:2::2 rport "$client6_port" token "$server6_token" > /dev/nul= l 2>&1 + sleep 0.1 + verify_subflow_events "$evts" "$SUB_ESTABLISHED" "$server6_token" "$AF_IN= ET6"\ + "dead:beef:2::1" "dead:beef:2::2" "$client6_port" "23"\ + "$client_addr_id" "ns1" "ns2" + + # Delete the listener from the client ns, if one was created + kill $listener_pid > /dev/null 2>&1 + + sport=3D$(sed -n 's/.*\(sport:\)\([[:digit:]]*\).*$/\2/p;q' "$evts") + + # DESTROY_SUBFLOW6 from server to client machine + :>"$evts" + ip netns exec "$ns1" ./pm_nl_ctl dsf lip dead:beef:2::1 lport "$sport" ri= p\ + dead:beef:2::2 rport "$client6_port" token "$server6_token" > /dev/nul= l 2>&1 + sleep 0.1 + verify_subflow_events "$evts" "$SUB_CLOSED" "$server6_token" "$AF_INET6"\ + "dead:beef:2::1" "dead:beef:2::2" "$client6_port" "23"\ + "$client_addr_id" "ns1" "ns2" + + # RM_ADDR from client to server machine + ip netns exec "$ns2" ./pm_nl_ctl rem id $client_addr_id token\ + "$client6_token" > /dev/null 2>&1 + sleep 0.1 + + # Attempt to add a listener at 10.0.2.2: + ip netns exec "$ns2" ./pm_nl_ctl listen 10.0.2.2\ + $new4_port > /dev/null 2>&1 & + listener_pid=3D$! + + # ADD_ADDR from client to server machine using a new port + :>"$evts" + ip netns exec "$ns2" ./pm_nl_ctl ann 10.0.2.2 token "$client4_token" id\ + $client_addr_id port $new4_port > /dev/null 2>&1 + sleep 0.1 + + # CREATE_SUBFLOW from server to client machine + :>"$evts" + ip netns exec "$ns1" ./pm_nl_ctl csf lip 10.0.2.1 lid 23 rip 10.0.2.2 rpo= rt\ + $new4_port token "$server4_token" > /dev/null 2>&1 + sleep 0.1 + verify_subflow_events "$evts" "$SUB_ESTABLISHED" "$server4_token" "$AF_IN= ET"\ + "10.0.2.1" "10.0.2.2" "$new4_port" "23"\ + "$client_addr_id" "ns1" "ns2" + + # Delete the listener from the client ns, if one was created + kill $listener_pid > /dev/null 2>&1 + + sport=3D$(sed -n 's/.*\(sport:\)\([[:digit:]]*\).*$/\2/p;q' "$evts") + + # DESTROY_SUBFLOW from server to client machine + :>"$evts" + ip netns exec "$ns1" ./pm_nl_ctl dsf lip 10.0.2.1 lport "$sport" rip 10.0= .2.2 rport\ + $new4_port token "$server4_token" > /dev/null 2>&1 + sleep 0.1 + verify_subflow_events "$evts" "$SUB_CLOSED" "$server4_token" "$AF_INET" "= 10.0.2.1"\ + "10.0.2.2" "$new4_port" "23" "$client_addr_id" "ns1" "ns2" + + # RM_ADDR from client to server machine + ip netns exec "$ns2" ./pm_nl_ctl rem id $client_addr_id token\ + "$client4_token" > /dev/null 2>&1 + + kill $evts_pid + + # Capture events on the network namespace running the client + :>"$evts" + ip netns exec "$ns2" ./pm_nl_ctl events >> "$evts" 2>&1 & + evts_pid=3D$! + sleep 0.1 + + # Attempt to add a listener at 10.0.2.1: + ip netns exec "$ns1" ./pm_nl_ctl listen 10.0.2.1\ + $app4_port > /dev/null 2>&1 & + listener_pid=3D$! + + # ADD_ADDR from server to client machine reusing the subflow port + ip netns exec "$ns1" ./pm_nl_ctl ann 10.0.2.1 token "$server4_token" id\ + $server_addr_id > /dev/null 2>&1 + sleep 0.1 + + # CREATE_SUBFLOW from client to server machine + :>"$evts" + ip netns exec "$ns2" ./pm_nl_ctl csf lip 10.0.2.2 lid 23 rip 10.0.2.1 rpo= rt\ + $app4_port token "$client4_token" > /dev/null 2>&1 + sleep 0.1 + verify_subflow_events "$evts" "$SUB_ESTABLISHED" "$client4_token" "$AF_IN= ET" "10.0.2.2"\ + "10.0.2.1" "$app4_port" "23" "$server_addr_id" "ns2" "ns1" + + # Delete the listener from the server ns, if one was created + kill $listener_pid> /dev/null 2>&1 + + sport=3D$(sed -n 's/.*\(sport:\)\([[:digit:]]*\).*$/\2/p;q' "$evts") + + # DESTROY_SUBFLOW from client to server machine + :>"$evts" + ip netns exec "$ns2" ./pm_nl_ctl dsf lip 10.0.2.2 lport "$sport" rip 10.0= .2.1 rport\ + $app4_port token "$client4_token" > /dev/null 2>&1 + sleep 0.1 + verify_subflow_events "$evts" "$SUB_CLOSED" "$client4_token" "$AF_INET" "= 10.0.2.2"\ + "10.0.2.1" "$app4_port" "23" "$server_addr_id" "ns2" "ns1" + + # RM_ADDR from server to client machine + ip netns exec "$ns1" ./pm_nl_ctl rem id $server_addr_id token\ + "$server4_token" > /dev/null 2>&1 + sleep 0.1 + + # Attempt to add a listener at dead:beef:2::1: + ip netns exec "$ns1" ./pm_nl_ctl listen dead:beef:2::1\ + $app6_port > /dev/null 2>&1 & + listener_pid=3D$! + + # ADD_ADDR6 from server to client machine reusing the subflow port + :>"$evts" + ip netns exec "$ns1" ./pm_nl_ctl ann dead:beef:2::1 token "$server6_token= " id\ + $server_addr_id > /dev/null 2>&1 + sleep 0.1 + + # CREATE_SUBFLOW6 from client to server machine + :>"$evts" + ip netns exec "$ns2" ./pm_nl_ctl csf lip dead:beef:2::2 lid 23 rip\ + dead:beef:2::1 rport $app6_port token "$client6_token" > /dev/null 2>&1 + sleep 0.1 + verify_subflow_events "$evts" "$SUB_ESTABLISHED" "$client6_token"\ + "$AF_INET6" "dead:beef:2::2"\ + "dead:beef:2::1" "$app6_port" "23"\ + "$server_addr_id" "ns2" "ns1" + + # Delete the listener from the server ns, if one was created + kill $listener_pid > /dev/null 2>&1 + + sport=3D$(sed -n 's/.*\(sport:\)\([[:digit:]]*\).*$/\2/p;q' "$evts") + + # DESTROY_SUBFLOW6 from client to server machine + :>"$evts" + ip netns exec "$ns2" ./pm_nl_ctl dsf lip dead:beef:2::2 lport "$sport" ri= p\ + dead:beef:2::1 rport $app6_port token "$client6_token" > /dev/null 2>&1 + sleep 0.1 + verify_subflow_events "$evts" "$SUB_CLOSED" "$client6_token" "$AF_INET6" = "dead:beef:2::2"\ + "dead:beef:2::1" "$app6_port" "23" "$server_addr_id" "ns2" "ns1" + + # RM_ADDR6 from server to client machine + ip netns exec "$ns1" ./pm_nl_ctl rem id $server_addr_id token\ + "$server6_token" > /dev/null 2>&1 + sleep 0.1 + + # Attempt to add a listener at 10.0.2.1: + ip netns exec "$ns1" ./pm_nl_ctl listen 10.0.2.1\ + $new4_port > /dev/null 2>&1 & + listener_pid=3D$! + + # ADD_ADDR from server to client machine using a new port + :>"$evts" + ip netns exec "$ns1" ./pm_nl_ctl ann 10.0.2.1 token "$server4_token" id\ + $server_addr_id port $new4_port > /dev/null 2>&1 + sleep 0.1 + + # CREATE_SUBFLOW from client to server machine + :>"$evts" + ip netns exec "$ns2" ./pm_nl_ctl csf lip 10.0.2.2 lid 23 rip 10.0.2.1 rpo= rt\ + $new4_port token "$client4_token" > /dev/null 2>&1 + sleep 0.1 + verify_subflow_events "$evts" "$SUB_ESTABLISHED" "$client4_token" "$AF_IN= ET"\ + "10.0.2.2" "10.0.2.1" "$new4_port" "23" "$server_addr_id" "ns2" "= ns1" + + # Delete the listener from the server ns, if one was created + kill $listener_pid > /dev/null 2>&1 + + sport=3D$(sed -n 's/.*\(sport:\)\([[:digit:]]*\).*$/\2/p;q' "$evts") + + # DESTROY_SUBFLOW from client to server machine + :>"$evts" + ip netns exec "$ns2" ./pm_nl_ctl dsf lip 10.0.2.2 lport "$sport" rip 10.0= .2.1 rport\ + $new4_port token "$client4_token" > /dev/null 2>&1 + sleep 0.1 + verify_subflow_events "$evts" "$SUB_CLOSED" "$client4_token" "$AF_INET" "= 10.0.2.2"\ + "10.0.2.1" "$new4_port" "23" "$server_addr_id" "ns2" "ns1" + + # RM_ADDR from server to client machine + ip netns exec "$ns1" ./pm_nl_ctl rem id $server_addr_id token\ + "$server4_token" > /dev/null 2>&1 + + kill $evts_pid + rm -f "$evts" +} + +make_connection +make_connection "v6" +test_announce +test_remove +test_subflows + +exit 0 --=20 2.31.1