From nobody Tue Apr 30 06:32:02 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:1788:b0:4ac:5e5b:1ad1 with SMTP id y8csp1138649piq; Wed, 6 Apr 2022 19:42:53 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxqPkqdnIEtYivOo/2LnJopO2dL5mtDNOgk8lbpo6KriSmHwA81L8O80oOYWP0FYTr3rmSf X-Received: by 2002:a17:906:4313:b0:6b8:b3e5:a46 with SMTP id j19-20020a170906431300b006b8b3e50a46mr11008064ejm.417.1649299373808; Wed, 06 Apr 2022 19:42:53 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1649299373; cv=none; d=google.com; s=arc-20160816; b=Vx41QJWinh7fY9rG3IRt0JtNvO9ZvxL1X7Rk7o416PPBSjzNeFncm5lbiMN0zv3Q3C HsqWQgWGTLytREBDFxTNqGxErBxqUGgB0QVWqJy1yUvuaJFbys7qoATTW0mi6ZQw29Td qmUcgwgicfYYAXPtipFH7lSzKWcpAll/nlCjWsfqjDpKiej6tN99lb5alAGL/5EwV81l Gw1Twp7ZHXapUNrR/gx7lqBMseq+WSwm3rPkIO0HY9DTy8Bb24r+Ox/X3fsHJs25DEUo IolUEAwVYlHZlLUNzH+Oy3+8o2+KKVmwsZnjRqZQ/0Jknn21l0QJVFaYKhuUhYh3V8Xi //vg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:to:from:dkim-signature; bh=hHu0eZL8esBbr2Tbv/3xJeIDB24jR0afNwWAg9Lyxo0=; b=NyxLho+Y2MXPbe+pWmQvxjwfLXrfylzrQaigS699AC/QL0ygh29fj8+4hi1LIMRWJj T4ko6xRNAcCFwg35Kuet1v5wJEgtX5gZsS5fFqoUmyFyOqkih48vyGzKF3oh2I1mHmPg LGb8WcR0V4YeYUVOHn35+aQ/El5kUjOSg9xgU2PjnYkz2Hrpah2iwO3Hy1nCspJuosF7 aIy8hm3x1phpQ4ux/d9T7gJ0D6HShFlkeby1vkzINdwm1O0kCDgn9NXIYSZTJYy5r7GL SIgHfjUM/OHwkUNeuImjcMevu8b7XJ00AW3HS8i2HQHC8D5Wa+2rgujjim3vb0iHN2RQ 9aiw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=LF4L6ZJj; spf=pass (google.com: domain of mptcp+bounces-4619-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-4619-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 w7-20020a50d987000000b0041c9427ec69si9921561edj.107.2022.04.06.19.42.53 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 06 Apr 2022 19:42:53 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-4619-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=LF4L6ZJj; spf=pass (google.com: domain of mptcp+bounces-4619-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-4619-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 627F31C0A40 for ; Thu, 7 Apr 2022 02:42:52 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 5E2B520EE; Thu, 7 Apr 2022 02:42:50 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) (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 E2D1A17F2 for ; Thu, 7 Apr 2022 02:42: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=1649299368; x=1680835368; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=sKHGYS4wSoiHYtJWAVjOUe7mFJkoa0zCDSkyK1QyfBM=; b=LF4L6ZJjnKSNoKkwtKFJ/42w/T4wyzrVVPKdU5MofElJtvowKkvro57u PI9RCNrwVJ2fyecbDSDmv5L820RKWhfLNoEIlWa6+a60x+AyF1LRpwkER lskVeE33IPXs2fXku6gfybETZFY+R5jwx4IJ7pgfdp/5G/u/jHubQ3jWi 49/4wfZTLQ05O/UF7LYbqnNlAQTqnr9n7ugxxK+xqV5QgkSRQiCMdXy8E fH6PfdNm05Truk4EKkIbXy5YOktvMACJnMJfdzIeOTYnM7i2AmUwAz3Pa Ih69cSDvRMumzNSBsgd95c4D8B/WXh2FQbHK5CECyTsqS71oNE2Po/rLA g==; X-IronPort-AV: E=McAfee;i="6200,9189,10309"; a="286189740" X-IronPort-AV: E=Sophos;i="5.90,241,1643702400"; d="scan'208";a="286189740" Received: from orsmga004.jf.intel.com ([10.7.209.38]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Apr 2022 19:42:47 -0700 X-IronPort-AV: E=Sophos;i="5.90,241,1643702400"; d="scan'208";a="658882184" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Apr 2022 19:42:46 -0700 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v7 01/14] mptcp: allow ADD_ADDR reissuance by userspace PMs Date: Wed, 6 Apr 2022 22:42:28 -0400 Message-Id: <20220407024241.1757334-2-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220407024241.1757334-1-kishen.maloor@intel.com> References: <20220407024241.1757334-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 a4430c576ce9..98b205c2c101 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -369,8 +369,16 @@ static bool mptcp_pm_alloc_anno_list(struct mptcp_sock= *msk, =20 lockdep_assert_held(&msk->pm.lock); =20 - if (mptcp_lookup_anno_list_by_saddr(msk, &entry->addr)) - return false; + add_entry =3D mptcp_lookup_anno_list_by_saddr(msk, &entry->addr); + + if (add_entry) { + if (mptcp_pm_is_kernel(msk)) + return false; + + sk_reset_timer(sk, &add_entry->add_timer, + jiffies + mptcp_get_add_addr_timeout(net)); + return true; + } =20 add_entry =3D kmalloc(sizeof(*add_entry), GFP_ATOMIC); if (!add_entry) --=20 2.31.1 From nobody Tue Apr 30 06:32:02 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:1788:b0:4ac:5e5b:1ad1 with SMTP id y8csp1138665piq; Wed, 6 Apr 2022 19:42:56 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxBVJ8TbJ0EkazeP5J/HCCY7ognjgTBaU4m02OVoz4G4pBNwvHF5Z9KMpNMVpjK+hHU4Vca X-Received: by 2002:a50:9e61:0:b0:419:d8e5:6236 with SMTP id z88-20020a509e61000000b00419d8e56236mr11912744ede.327.1649299376061; Wed, 06 Apr 2022 19:42:56 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1649299376; cv=none; d=google.com; s=arc-20160816; b=AvdVgewCATIVNBPXZHKbarkS6npvNnrOZlO/dXYiwAj2eBRVKQXtDSMTGl/9WAa8uE 0UxS6nHIu5mpMpO/f+qAicvwdwxPpm7YQNGellpfjadwe0sB6O4oOq8HjNatVZciUpFG 6cmD6WFlhh5FYLmts2d5XG55l8n9abHlZGK5yzNg8R1B8C8e+ji7p/Z/kasOoRYk6rZI tPfc5qCwEdZ16wNuyaFaNchLjNMW1UFOGKbF9YhG5V/0SB4zcj8aC2QASouHyo0uqXQi oLy03Sl2ThnQXNxd5dWmYMUAsolCl3fp4OcxjeChHuacl8+8kJPlDSTaERbRT9myX7CI degg== 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=zU04fxA85nfqkHQnW8PPUgHsgcxKvtBlLbZP4KKuaEc=; b=NnOGP0Oc70GGMGndkFdJyu3zg17IMJKai0qBmWFAssa+BK7faGBAoqgKRoTwmA1L1E h1eUpopeDbZ1zc3Yv2STDn5qlVA+AWp5cpvccRC1Vz2PHW107X5CACk1r9UT3vMEv2Mm NrJJMWsMnvyMOAUGULLbFqJrMnZcV3CrKNH6Gj9ZTris7/LFMXxz17pJCsd7x2JPfeE5 5cRYv/FMJ0YuwK+HfCZFRP2UkTtNeEsnamnX6r7ngQbCNNt5Bcwk6G7TwTfkOze3PMj+ 7AODmdbFJFU/rLl/uFBKHITDJPe2EoLhYfm1rUg0rWchlesJow7J/cYonc1GB1kiJxcj mvYA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=lEcITnaa; spf=pass (google.com: domain of mptcp+bounces-4621-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-4621-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 g8-20020a056402090800b00418c2b5be6bsi14062437edz.333.2022.04.06.19.42.55 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 06 Apr 2022 19:42:56 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-4621-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=lEcITnaa; spf=pass (google.com: domain of mptcp+bounces-4621-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-4621-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 B1E1E1C0B49 for ; Thu, 7 Apr 2022 02:42:54 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id D47FC20EC; Thu, 7 Apr 2022 02:42:51 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) (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 BF37520EB for ; Thu, 7 Apr 2022 02:42:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1649299369; x=1680835369; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=Syhm3JxrK1qh9AAQfbEQU8i+3WuSZLh1x7GSs+nj6os=; b=lEcITnaaSC0JLVXZPqhez5J2yFlk/R8WXZP4yJ7mKo/j+g8gdFDmFu+j APVMqfTsfqPbV39aJ1zkXFuxkHkz9OnMYMD/+IcnhXzo7auSe4FfxuQa4 mVSQjJbsOeBl92F8qabYQGnAtJDR9tW71rOozie5RJC9/vHnbtqwBA8Eo PgP8Cf/WP58aA36kuyWFfPZ/4EGp9LcfrIn/yE1IRvbicsapr8QOHaWhI bjDhWfoglNigP7xlZeu3Ihx/X8xz9Ypab1rRhvwjhckyuxuxDjx60tDWK 5YmjIHkn7I+vCbL0vd9EeMwnKRQ4t7zxnPoRnRPDT4YRUThUXqv9EomF7 w==; X-IronPort-AV: E=McAfee;i="6200,9189,10309"; a="286189742" X-IronPort-AV: E=Sophos;i="5.90,241,1643702400"; d="scan'208";a="286189742" Received: from orsmga004.jf.intel.com ([10.7.209.38]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Apr 2022 19:42:47 -0700 X-IronPort-AV: E=Sophos;i="5.90,241,1643702400"; d="scan'208";a="658882187" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Apr 2022 19:42:46 -0700 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v7 02/14] mptcp: handle local addrs announced by userspace PMs Date: Wed, 6 Apr 2022 22:42:29 -0400 Message-Id: <20220407024241.1757334-3-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220407024241.1757334-1-kishen.maloor@intel.com> References: <20220407024241.1757334-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 --- v6: -Move local_addr_list into struct mptcp_pm_data. -Replace mptcp_data_lock() with the pm spinlock. -Move mptcp_userspace_pm_append_new_local_addr() and mptcp_free_local_addr_list() into a new pm_userspace.c. -Make addresses_equal() helper non-static and rename to mptcp_addresses_equal(). --- net/mptcp/Makefile | 2 +- net/mptcp/pm.c | 1 + net/mptcp/pm_netlink.c | 34 +++++++++--------- net/mptcp/pm_userspace.c | 74 ++++++++++++++++++++++++++++++++++++++++ net/mptcp/protocol.c | 1 + net/mptcp/protocol.h | 7 ++++ 6 files changed, 101 insertions(+), 18 deletions(-) create mode 100644 net/mptcp/pm_userspace.c diff --git a/net/mptcp/Makefile b/net/mptcp/Makefile index 168c55d1c917..4004347db47e 100644 --- a/net/mptcp/Makefile +++ b/net/mptcp/Makefile @@ -2,7 +2,7 @@ obj-$(CONFIG_MPTCP) +=3D mptcp.o =20 mptcp-y :=3D protocol.o subflow.o options.o token.o crypto.o ctrl.o pm.o d= iag.o \ - mib.o pm_netlink.o sockopt.o + mib.o pm_netlink.o sockopt.o pm_userspace.o =20 obj-$(CONFIG_SYN_COOKIES) +=3D syncookies.o obj-$(CONFIG_INET_MPTCP_DIAG) +=3D mptcp_diag.o diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c index 5d6832c4d9f2..cdc2d79071f8 100644 --- a/net/mptcp/pm.c +++ b/net/mptcp/pm.c @@ -469,6 +469,7 @@ void mptcp_pm_data_init(struct mptcp_sock *msk) { spin_lock_init(&msk->pm.lock); INIT_LIST_HEAD(&msk->pm.anno_list); + INIT_LIST_HEAD(&msk->pm.userspace_pm_local_addr_list); mptcp_pm_data_reset(msk); } =20 diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index 98b205c2c101..92d47e8e8983 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -66,8 +66,8 @@ pm_nl_get_pernet_from_msk(const struct mptcp_sock *msk) return pm_nl_get_pernet(sock_net((struct sock *)msk)); } =20 -static bool addresses_equal(const struct mptcp_addr_info *a, - const struct mptcp_addr_info *b, bool use_port) +bool mptcp_addresses_equal(const struct mptcp_addr_info *a, + const struct mptcp_addr_info *b, bool use_port) { bool addr_equals =3D false; =20 @@ -131,7 +131,7 @@ static bool lookup_subflow_by_saddr(const struct list_h= ead *list, skc =3D (struct sock_common *)mptcp_subflow_tcp_sock(subflow); =20 local_address(skc, &cur); - if (addresses_equal(&cur, saddr, saddr->port)) + if (mptcp_addresses_equal(&cur, saddr, saddr->port)) return true; } =20 @@ -149,7 +149,7 @@ static bool lookup_subflow_by_daddr(const struct list_h= ead *list, skc =3D (struct sock_common *)mptcp_subflow_tcp_sock(subflow); =20 remote_address(skc, &cur); - if (addresses_equal(&cur, daddr, daddr->port)) + if (mptcp_addresses_equal(&cur, daddr, daddr->port)) return true; } =20 @@ -269,7 +269,7 @@ mptcp_lookup_anno_list_by_saddr(const struct mptcp_sock= *msk, lockdep_assert_held(&msk->pm.lock); =20 list_for_each_entry(entry, &msk->pm.anno_list, list) { - if (addresses_equal(&entry->addr, addr, true)) + if (mptcp_addresses_equal(&entry->addr, addr, true)) return entry; } =20 @@ -286,7 +286,7 @@ bool mptcp_pm_sport_in_anno_list(struct mptcp_sock *msk= , const struct sock *sk) =20 spin_lock_bh(&msk->pm.lock); list_for_each_entry(entry, &msk->pm.anno_list, list) { - if (addresses_equal(&entry->addr, &saddr, true)) { + if (mptcp_addresses_equal(&entry->addr, &saddr, true)) { ret =3D true; goto out; } @@ -421,7 +421,7 @@ static bool lookup_address_in_vec(const struct mptcp_ad= dr_info *addrs, unsigned int i; =20 for (i =3D 0; i < nr; i++) { - if (addresses_equal(&addrs[i], addr, addr->port)) + if (mptcp_addresses_equal(&addrs[i], addr, addr->port)) return true; } =20 @@ -457,7 +457,7 @@ static unsigned int fill_remote_addresses_vec(struct mp= tcp_sock *msk, bool fullm mptcp_for_each_subflow(msk, subflow) { ssk =3D mptcp_subflow_tcp_sock(subflow); remote_address((struct sock_common *)ssk, &addrs[i]); - if (deny_id0 && addresses_equal(&addrs[i], &remote, false)) + if (deny_id0 && mptcp_addresses_equal(&addrs[i], &remote, false)) continue; =20 if (!lookup_address_in_vec(addrs, i, &addrs[i]) && @@ -490,7 +490,7 @@ __lookup_addr(struct pm_nl_pernet *pernet, const struct= mptcp_addr_info *info, struct mptcp_pm_addr_entry *entry; =20 list_for_each_entry(entry, &pernet->local_addr_list, list) { - if ((!lookup_by_id && addresses_equal(&entry->addr, info, true)) || + if ((!lookup_by_id && mptcp_addresses_equal(&entry->addr, info, true)) || (lookup_by_id && entry->addr.id =3D=3D info->id)) return entry; } @@ -505,7 +505,7 @@ lookup_id_by_addr(const struct pm_nl_pernet *pernet, co= nst struct mptcp_addr_inf =20 rcu_read_lock(); list_for_each_entry(entry, &pernet->local_addr_list, list) { - if (addresses_equal(&entry->addr, addr, entry->addr.port)) { + if (mptcp_addresses_equal(&entry->addr, addr, entry->addr.port)) { ret =3D entry->addr.id; break; } @@ -739,7 +739,7 @@ static int mptcp_pm_nl_mp_prio_send_ack(struct mptcp_so= ck *msk, struct mptcp_addr_info local; =20 local_address((struct sock_common *)ssk, &local); - if (!addresses_equal(&local, addr, addr->port)) + if (!mptcp_addresses_equal(&local, addr, addr->port)) continue; =20 if (subflow->backup !=3D bkup) @@ -909,9 +909,9 @@ static int mptcp_pm_nl_append_new_local_addr(struct pm_= nl_pernet *pernet, * singled addresses */ list_for_each_entry(cur, &pernet->local_addr_list, list) { - if (addresses_equal(&cur->addr, &entry->addr, - address_use_port(entry) && - address_use_port(cur))) { + if (mptcp_addresses_equal(&cur->addr, &entry->addr, + address_use_port(entry) && + address_use_port(cur))) { /* allow replacing the exiting endpoint only if such * endpoint is an implicit one and the user-space * did not provide an endpoint id @@ -1038,14 +1038,14 @@ int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk= , struct sock_common *skc) */ local_address((struct sock_common *)msk, &msk_local); local_address((struct sock_common *)skc, &skc_local); - if (addresses_equal(&msk_local, &skc_local, false)) + if (mptcp_addresses_equal(&msk_local, &skc_local, false)) return 0; =20 pernet =3D pm_nl_get_pernet_from_msk(msk); =20 rcu_read_lock(); list_for_each_entry_rcu(entry, &pernet->local_addr_list, list) { - if (addresses_equal(&entry->addr, &skc_local, entry->addr.port)) { + if (mptcp_addresses_equal(&entry->addr, &skc_local, entry->addr.port)) { ret =3D entry->addr.id; break; } @@ -1416,7 +1416,7 @@ static int mptcp_nl_remove_id_zero_address(struct net= *net, goto next; =20 local_address((struct sock_common *)msk, &msk_local); - if (!addresses_equal(&msk_local, addr, addr->port)) + if (!mptcp_addresses_equal(&msk_local, addr, addr->port)) goto next; =20 lock_sock(sk); diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c new file mode 100644 index 000000000000..cb8321cdb4ea --- /dev/null +++ b/net/mptcp/pm_userspace.c @@ -0,0 +1,74 @@ +// SPDX-License-Identifier: GPL-2.0 + +#include "protocol.h" + +void mptcp_free_local_addr_list(struct mptcp_sock *msk) +{ + struct mptcp_pm_addr_entry *entry, *tmp; + struct sock *sk =3D (struct sock *)msk; + LIST_HEAD(free_list); + + if (!mptcp_pm_is_userspace(msk)) + return; + + spin_lock_bh(&msk->pm.lock); + list_splice_init(&msk->pm.userspace_pm_local_addr_list, &free_list); + spin_unlock_bh(&msk->pm.lock); + + list_for_each_entry_safe(entry, tmp, &free_list, list) { + sock_kfree_s(sk, entry, sizeof(*entry)); + } +} + +int mptcp_userspace_pm_append_new_local_addr(struct mptcp_sock *msk, + struct mptcp_pm_addr_entry *entry) +{ + DECLARE_BITMAP(id_bitmap, MPTCP_PM_MAX_ADDR_ID + 1); + struct mptcp_pm_addr_entry *match =3D NULL; + struct sock *sk =3D (struct sock *)msk; + struct mptcp_pm_addr_entry *e; + bool addr_match =3D false; + bool id_match =3D false; + int ret =3D -EINVAL; + + bitmap_zero(id_bitmap, MPTCP_PM_MAX_ADDR_ID + 1); + + spin_lock_bh(&msk->pm.lock); + list_for_each_entry(e, &msk->pm.userspace_pm_local_addr_list, list) { + addr_match =3D mptcp_addresses_equal(&e->addr, &entry->addr, true); + if (addr_match && entry->addr.id =3D=3D 0) + entry->addr.id =3D e->addr.id; + id_match =3D (e->addr.id =3D=3D entry->addr.id); + if (addr_match && id_match) { + match =3D e; + break; + } else if (addr_match || id_match) { + break; + } + __set_bit(e->addr.id, id_bitmap); + } + + if (!match && !addr_match && !id_match) { + /* Memory for the entry is allocated from the + * sock option buffer. + */ + e =3D sock_kmalloc(sk, sizeof(*e), GFP_ATOMIC); + if (!e) { + spin_unlock_bh(&msk->pm.lock); + return -ENOMEM; + } + + *e =3D *entry; + if (!e->addr.id) + e->addr.id =3D find_next_zero_bit(id_bitmap, + MPTCP_PM_MAX_ADDR_ID + 1, + 1); + list_add_tail_rcu(&e->list, &msk->pm.userspace_pm_local_addr_list); + ret =3D e->addr.id; + } else if (match) { + ret =3D entry->addr.id; + } + + spin_unlock_bh(&msk->pm.lock); + return ret; +} diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index b2c654992de0..b016822f44dc 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -3103,6 +3103,7 @@ void mptcp_destroy_common(struct mptcp_sock *msk) msk->rmem_fwd_alloc =3D 0; mptcp_token_destroy(msk); mptcp_pm_free_anno_list(msk); + mptcp_free_local_addr_list(msk); } =20 static void mptcp_destroy(struct sock *sk) diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index 187c932deef0..40dabf9462a8 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -208,6 +208,7 @@ struct mptcp_pm_data { struct mptcp_addr_info local; struct mptcp_addr_info remote; struct list_head anno_list; + struct list_head userspace_pm_local_addr_list; =20 spinlock_t lock; /*protects the whole PM data */ =20 @@ -601,6 +602,9 @@ void mptcp_subflow_reset(struct sock *ssk); void mptcp_sock_graft(struct sock *sk, struct socket *parent); struct socket *__mptcp_nmpc_socket(const struct mptcp_sock *msk); =20 +bool mptcp_addresses_equal(const struct mptcp_addr_info *a, + const struct mptcp_addr_info *b, bool use_port); + /* called with sk socket lock held */ int __mptcp_subflow_connect(struct sock *sk, const struct mptcp_addr_info = *loc, const struct mptcp_addr_info *remote); @@ -779,6 +783,9 @@ int mptcp_pm_announce_addr(struct mptcp_sock *msk, bool echo); int mptcp_pm_remove_addr(struct mptcp_sock *msk, const struct mptcp_rm_lis= t *rm_list); int mptcp_pm_remove_subflow(struct mptcp_sock *msk, const struct mptcp_rm_= list *rm_list); +int mptcp_userspace_pm_append_new_local_addr(struct mptcp_sock *msk, + struct mptcp_pm_addr_entry *entry); +void mptcp_free_local_addr_list(struct mptcp_sock *msk); =20 void mptcp_event(enum mptcp_event_type type, const struct mptcp_sock *msk, const struct sock *ssk, gfp_t gfp); --=20 2.31.1 From nobody Tue Apr 30 06:32:02 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:1788:b0:4ac:5e5b:1ad1 with SMTP id y8csp1138652piq; Wed, 6 Apr 2022 19:42:54 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxIoy8aK/ckNHqnpelQtOhPdbRNn6cYZJ8iWEeVE/qjG0u9/b+AyA7z2JpnjCN4dBDGUF88 X-Received: by 2002:a17:907:7255:b0:6e7:e853:73b8 with SMTP id ds21-20020a170907725500b006e7e85373b8mr11666945ejc.172.1649299374011; Wed, 06 Apr 2022 19:42:54 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1649299374; cv=none; d=google.com; s=arc-20160816; b=zw4vZk8t7Qos90JzxYaQew8CLSnWuVZrpo8nReV0CUAT4CKwwjZgtI4rzOYkB3LwRA R1iPyR3hvSTWk9XqTiSxFwJkyodekn5fz2W6K2FzVuXNQyOyUo5J2yYFasFYaKf3lj2g mRqy11pIzPCJjvBqh5CsNEt/8rsGsGIc6neFZbEDr3yBPnNpMo5521fXim372eX7K7Yz YNi5kGsiKX7CRJNz84eKlV2XckIs9kGRZPYlR1JosjZDT/jPcaVMoLZdkqV3ojPoSQmE rtMmoYr5hdZd5wJVviT6o3ZFSq+z0RZJJfr/BgNDi4esJmdrSKJSZcfPqRkjqO2mWK6C 0xXg== 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=zJIlpMwOoWEkkvq32pUDNjqMYt+9Vq8CyGbAI4FuRWo=; b=Eed8syqhmKIjJ/0FpFUOIKvcRyqF5IAOc8LacXg4AURxhuPoWxVumYToxixOpcVZsp Hq/m6/rF99LOjlAnmfuWLISzWFHGMsC67Xjr3uethEUn7TSnL+d/nYIB2ex1cCw3GC+v bZP2yLewswN+djtaR2lqeA/3EtAWSnvej0X6BDwtutXVN+RdscsVc47U2FUDM16lYwgY UrqgbxnyCRnK1UPebvINkuShwVYWaKd5U8MdD9qA+emv/jI6N0kD0me5uGrIKyb81xZI ZEU7erhrOPretS15UsffqBE8VdGZORBXWTK7hDC0sO23TzAO9gVBH+AuLTLlBgcvRmko qhMg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=OfmKplfn; spf=pass (google.com: domain of mptcp+bounces-4620-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-4620-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 jx2-20020a170907760200b006e707485fbasi10220462ejc.848.2022.04.06.19.42.53 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 06 Apr 2022 19:42:54 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-4620-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=OfmKplfn; spf=pass (google.com: domain of mptcp+bounces-4620-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-4620-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 7B6531C0B42 for ; Thu, 7 Apr 2022 02:42:53 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id C292D20F0; Thu, 7 Apr 2022 02:42:51 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) (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 2920E20EC for ; Thu, 7 Apr 2022 02:42:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1649299370; x=1680835370; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=F5bEzE1YdN2UjunsOAw9AkKJ4FZzqySyiEln37ltG8Y=; b=OfmKplfnlpOqyUA9IwpCYVSdDJjpRtbBZG/vjtn6dGBWml6jl3RSVs2t FA5/wfU8Pax0mYRj3R1ykbXrHtFW39XR7gvYaNLn+YGfIkYqhRcVpNP+a CGS4JqFezU+QWpXvLl0VJILDgPObW925NwOh+1hgWky6Jf0Y1SK4TtclU 0zzwXORQQEWYYkwtiWYzgockOv9Muh9efWEFZSDOhJcCipLuV2xGfQYab EdZ6q8fXCz37jy34jPlwiMoJRKX1OaDuYZ4wJSiRkZuV8ESjiHAbbI8sj TsbLhk7IheqbR/5N90uyEpcKCEX7EK1ldoTHrw593lofp5EdBDTYVGRVg g==; X-IronPort-AV: E=McAfee;i="6200,9189,10309"; a="286189744" X-IronPort-AV: E=Sophos;i="5.90,241,1643702400"; d="scan'208";a="286189744" Received: from orsmga004.jf.intel.com ([10.7.209.38]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Apr 2022 19:42:47 -0700 X-IronPort-AV: E=Sophos;i="5.90,241,1643702400"; d="scan'208";a="658882190" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Apr 2022 19:42:46 -0700 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v7 03/14] mptcp: read attributes of addr entries managed by userspace PMs Date: Wed, 6 Apr 2022 22:42:30 -0400 Message-Id: <20220407024241.1757334-4-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220407024241.1757334-1-kishen.maloor@intel.com> References: <20220407024241.1757334-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 --- v7: -Move userspace PM specific handling into mptcp_userspace_pm_get_local_id() and mptcp_userspace_pm_get_flags_and_ifindex_by_id(). --- net/mptcp/pm_netlink.c | 13 +++++++++++- net/mptcp/pm_userspace.c | 43 ++++++++++++++++++++++++++++++++++++++++ net/mptcp/protocol.h | 7 ++++++- net/mptcp/subflow.c | 2 +- 4 files changed, 62 insertions(+), 3 deletions(-) diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index 92d47e8e8983..ceb1c310d0c6 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -1041,6 +1041,9 @@ int mptcp_pm_nl_get_local_id(struct mptcp_sock *msk, = struct sock_common *skc) if (mptcp_addresses_equal(&msk_local, &skc_local, false)) return 0; =20 + if (mptcp_pm_is_userspace(msk)) + return mptcp_userspace_pm_get_local_id(msk, &skc_local); + pernet =3D pm_nl_get_pernet_from_msk(msk); =20 rcu_read_lock(); @@ -1305,15 +1308,23 @@ static int mptcp_nl_cmd_add_addr(struct sk_buff *sk= b, struct genl_info *info) return 0; } =20 -int mptcp_pm_get_flags_and_ifindex_by_id(struct net *net, unsigned int id, +int mptcp_pm_get_flags_and_ifindex_by_id(struct mptcp_sock *msk, unsigned = int id, u8 *flags, int *ifindex) { struct mptcp_pm_addr_entry *entry; + struct sock *sk =3D (struct sock *)msk; + struct net *net =3D sock_net(sk); =20 *flags =3D 0; *ifindex =3D 0; =20 if (id) { + if (mptcp_pm_is_userspace(msk)) + return mptcp_userspace_pm_get_flags_and_ifindex_by_id(msk, + id, + flags, + ifindex); + rcu_read_lock(); entry =3D __lookup_addr_by_id(pm_nl_get_pernet(net), id); if (entry) { diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c index cb8321cdb4ea..871baee676bd 100644 --- a/net/mptcp/pm_userspace.c +++ b/net/mptcp/pm_userspace.c @@ -72,3 +72,46 @@ int mptcp_userspace_pm_append_new_local_addr(struct mptc= p_sock *msk, spin_unlock_bh(&msk->pm.lock); return ret; } + +int mptcp_userspace_pm_get_flags_and_ifindex_by_id(struct mptcp_sock *msk, + unsigned int id, + u8 *flags, int *ifindex) +{ + struct mptcp_pm_addr_entry *entry, *match =3D NULL; + + *flags =3D 0; + *ifindex =3D 0; + + spin_lock_bh(&msk->pm.lock); + list_for_each_entry(entry, &msk->pm.userspace_pm_local_addr_list, list) { + if (id =3D=3D entry->addr.id) { + match =3D entry; + break; + } + } + spin_unlock_bh(&msk->pm.lock); + if (match) { + *flags =3D match->flags; + *ifindex =3D match->ifindex; + } + + return 0; +} + +int mptcp_userspace_pm_get_local_id(struct mptcp_sock *msk, + struct mptcp_addr_info *skc) +{ + struct mptcp_pm_addr_entry new_entry; + __be16 msk_sport =3D ((struct inet_sock *) + inet_sk((struct sock *)msk))->inet_sport; + + memset(&new_entry, 0, sizeof(struct mptcp_pm_addr_entry)); + new_entry.addr =3D *skc; + new_entry.addr.id =3D 0; + new_entry.flags =3D MPTCP_PM_ADDR_FLAG_IMPLICIT; + + if (new_entry.addr.port =3D=3D msk_sport) + new_entry.addr.port =3D 0; + + return mptcp_userspace_pm_append_new_local_addr(msk, &new_entry); +} diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index 40dabf9462a8..a6ee811e5d02 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -775,8 +775,12 @@ mptcp_pm_del_add_timer(struct mptcp_sock *msk, struct mptcp_pm_add_entry * mptcp_lookup_anno_list_by_saddr(const struct mptcp_sock *msk, const struct mptcp_addr_info *addr); -int mptcp_pm_get_flags_and_ifindex_by_id(struct net *net, unsigned int id, +int mptcp_pm_get_flags_and_ifindex_by_id(struct mptcp_sock *msk, + unsigned int id, u8 *flags, int *ifindex); +int mptcp_userspace_pm_get_flags_and_ifindex_by_id(struct mptcp_sock *msk, + unsigned int id, + u8 *flags, int *ifindex); =20 int mptcp_pm_announce_addr(struct mptcp_sock *msk, const struct mptcp_addr_info *addr, @@ -854,6 +858,7 @@ bool mptcp_pm_add_addr_signal(struct mptcp_sock *msk, c= onst struct sk_buff *skb, bool mptcp_pm_rm_addr_signal(struct mptcp_sock *msk, unsigned int remainin= g, struct mptcp_rm_list *rm_list); int mptcp_pm_get_local_id(struct mptcp_sock *msk, struct sock_common *skc); +int mptcp_userspace_pm_get_local_id(struct mptcp_sock *msk, struct mptcp_a= ddr_info *skc); =20 void __init mptcp_pm_nl_init(void); void mptcp_pm_nl_work(struct mptcp_sock *msk); diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c index a0e7af33fb26..6d59336a8e1e 100644 --- a/net/mptcp/subflow.c +++ b/net/mptcp/subflow.c @@ -1468,7 +1468,7 @@ int __mptcp_subflow_connect(struct sock *sk, const st= ruct mptcp_addr_info *loc, if (local_id) subflow_set_local_id(subflow, local_id); =20 - mptcp_pm_get_flags_and_ifindex_by_id(sock_net(sk), local_id, + mptcp_pm_get_flags_and_ifindex_by_id(msk, local_id, &flags, &ifindex); subflow->remote_key =3D msk->remote_key; subflow->local_key =3D msk->local_key; --=20 2.31.1 From nobody Tue Apr 30 06:32:02 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:1788:b0:4ac:5e5b:1ad1 with SMTP id y8csp1138703piq; Wed, 6 Apr 2022 19:43:01 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzptbhz8SC1yHcPq74zNhnt4IwqYv4HzlUd1sADwNaGa/lg0/yJuRUA57elRqHhvwHlDJ82 X-Received: by 2002:a17:90b:1994:b0:1ca:9b45:405e with SMTP id mv20-20020a17090b199400b001ca9b45405emr13249264pjb.22.1649299381419; Wed, 06 Apr 2022 19:43:01 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1649299381; cv=none; d=google.com; s=arc-20160816; b=HKxB8zC46AopC44MbwoBSijGt9p72sbJ5QG2Tj8v/XutyUsTKtRaDkQ6AeSQ4SNb2z e2jWRy9r4J3Z7HM7186/dWF4KsT0UKE0pxJKMmK6u1vZaFX3h9JSI1H+mbKPvpEhoTvg 7qdEPIJUjGFrUoaBQWXAz7XfmlrFrnRybbQ7FP+u72AXSYRhi8Bgw3ATW7zhK5x6D6tq S0dIxMnVmjKjZjBHuqdPUzKXY6UyuUaI0GD2cpytPcP9DTKqhUOhoRLGx52Yl+qSR61K GGEyBkRmGNsGWL6OAuPZJn80ZxGnAsn2ZJylAM54uOuRfzs8K7JxZRkauUXB5GjtXgFT JEJA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:cc:to:from:dkim-signature; bh=iE5GasUvIy2jGMATCwJLRXmWe0vMs8GyLiS7V8GCuu8=; b=XLx0ELqJ3xaF6dunmQlZWUpX1Wzd48jZgsiN0WOW3JrYjuFbeMBiCz9iIceVShRPpg 6BK4qVsg39K0wLvMjFaLVu/k662e8JEBgaVnna6N2bHG3fDk4u+3NHk3GZ+NdnkTwh65 JKuXwbqWkEV167XfzzAObg8R30oxcAWFfAw0NznZ57R2IpBb5I0kKezLOX+hbv4Dz0pS zzTY5JWPRcP2Fx/mzb5TTCINTF/L3pG6OrBHJ+tHTgIJowfkGorbasw9jGYrVLR57ikL V1KuOxo7kgEUbh6zDFvTEEVzgvNtxUi/RcJbEDzG2LFNMOlZZAM/4mHJv0mYoSFkFyWX /c3Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=CYPHIRpL; spf=pass (google.com: domain of mptcp+bounces-4626-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-4626-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 u13-20020a17090a3fcd00b001ca9f895c4esi572554pjm.18.2022.04.06.19.43.01 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 06 Apr 2022 19:43:01 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-4626-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=CYPHIRpL; spf=pass (google.com: domain of mptcp+bounces-4626-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-4626-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 AA58A3E0F73 for ; Thu, 7 Apr 2022 02:43:00 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 14ABC20F1; Thu, 7 Apr 2022 02:42:55 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) (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 C797D20EF for ; Thu, 7 Apr 2022 02:42:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1649299373; x=1680835373; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=J9jdnFEOjdcVMxcGtEt9EtlvExU+dCPgZUx+8RRX+8c=; b=CYPHIRpLJa7MYbcZBzjH11/8c9RajaK/N54Or2T3jTYJWoeUXYh4RRRC o+5Yc3uRpz08RjQRpG59izQg4UUZaIEOpF1mnVQODe89lqKQSbYupLyaS ikz3ExSNfVw64mSDt1aEtqIl3UBkp9VWzWpIsx76v+pdx1uUkIf1VYA6U Kb4ZWYpbjN7Bn7TJXJ7imM6/3bFYlJsgVK2SJREWrLMuRTGmuE/dzhlTJ sUy4y00NWcI2zatSzI0BSppYaEtIp+bJHVGpfmZZIB+yyRi6ni/TmqZ+B rZudamDlYfYYRPI8KoRnSFYhKHANbCixNdgvYmySdy22L6RBznXch2xB3 w==; X-IronPort-AV: E=McAfee;i="6200,9189,10309"; a="286189749" X-IronPort-AV: E=Sophos;i="5.90,241,1643702400"; d="scan'208";a="286189749" Received: from orsmga004.jf.intel.com ([10.7.209.38]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Apr 2022 19:42:48 -0700 X-IronPort-AV: E=Sophos;i="5.90,241,1643702400"; d="scan'208";a="658882193" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Apr 2022 19:42:46 -0700 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Cc: Florian Westphal Subject: [PATCH mptcp-next v7 04/14] mptcp: netlink: split mptcp_pm_parse_addr into two functions Date: Wed, 6 Apr 2022 22:42:31 -0400 Message-Id: <20220407024241.1757334-5-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220407024241.1757334-1-kishen.maloor@intel.com> References: <20220407024241.1757334-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 ceb1c310d0c6..ece0158519e2 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -1150,11 +1150,12 @@ static int mptcp_pm_family_to_addr(int family) return MPTCP_PM_ADDR_ATTR_ADDR4; } =20 -static int mptcp_pm_parse_addr(struct nlattr *attr, struct genl_info *info, - bool require_family, - struct mptcp_pm_addr_entry *entry) +static int mptcp_pm_parse_pm_addr_attr(struct nlattr *tb[], + const struct nlattr *attr, + struct genl_info *info, + struct mptcp_addr_info *addr, + bool require_family) { - struct nlattr *tb[MPTCP_PM_ADDR_ATTR_MAX + 1]; int err, addr_addr; =20 if (!attr) { @@ -1168,27 +1169,29 @@ static int mptcp_pm_parse_addr(struct nlattr *attr,= struct genl_info *info, if (err) return err; =20 - memset(entry, 0, sizeof(*entry)); + if (tb[MPTCP_PM_ADDR_ATTR_ID]) + addr->id =3D nla_get_u8(tb[MPTCP_PM_ADDR_ATTR_ID]); + if (!tb[MPTCP_PM_ADDR_ATTR_FAMILY]) { if (!require_family) - goto skip_family; + return err; =20 NL_SET_ERR_MSG_ATTR(info->extack, attr, "missing family"); return -EINVAL; } =20 - entry->addr.family =3D nla_get_u16(tb[MPTCP_PM_ADDR_ATTR_FAMILY]); - if (entry->addr.family !=3D AF_INET + addr->family =3D nla_get_u16(tb[MPTCP_PM_ADDR_ATTR_FAMILY]); + if (addr->family !=3D AF_INET #if IS_ENABLED(CONFIG_MPTCP_IPV6) - && entry->addr.family !=3D AF_INET6 + && addr->family !=3D AF_INET6 #endif ) { NL_SET_ERR_MSG_ATTR(info->extack, attr, "unknown address family"); return -EINVAL; } - addr_addr =3D mptcp_pm_family_to_addr(entry->addr.family); + addr_addr =3D mptcp_pm_family_to_addr(addr->family); if (!tb[addr_addr]) { NL_SET_ERR_MSG_ATTR(info->extack, attr, "missing address data"); @@ -1196,22 +1199,37 @@ static int mptcp_pm_parse_addr(struct nlattr *attr,= struct genl_info *info, } =20 #if IS_ENABLED(CONFIG_MPTCP_IPV6) - if (entry->addr.family =3D=3D AF_INET6) - entry->addr.addr6 =3D nla_get_in6_addr(tb[addr_addr]); + if (addr->family =3D=3D AF_INET6) + addr->addr6 =3D nla_get_in6_addr(tb[addr_addr]); else #endif - entry->addr.addr.s_addr =3D nla_get_in_addr(tb[addr_addr]); + addr->addr.s_addr =3D nla_get_in_addr(tb[addr_addr]); + + if (tb[MPTCP_PM_ADDR_ATTR_PORT]) + addr->port =3D htons(nla_get_u16(tb[MPTCP_PM_ADDR_ATTR_PORT])); + + return err; +} + +static int mptcp_pm_parse_entry(struct nlattr *attr, struct genl_info *inf= o, + bool require_family, + struct mptcp_pm_addr_entry *entry) +{ + struct nlattr *tb[MPTCP_PM_ADDR_ATTR_MAX + 1]; + int err; + + memset(entry, 0, sizeof(*entry)); + + err =3D mptcp_pm_parse_pm_addr_attr(tb, attr, info, &entry->addr, require= _family); + if (err) + return err; =20 -skip_family: if (tb[MPTCP_PM_ADDR_ATTR_IF_IDX]) { u32 val =3D nla_get_s32(tb[MPTCP_PM_ADDR_ATTR_IF_IDX]); =20 entry->ifindex =3D val; } =20 - if (tb[MPTCP_PM_ADDR_ATTR_ID]) - entry->addr.id =3D nla_get_u8(tb[MPTCP_PM_ADDR_ATTR_ID]); - if (tb[MPTCP_PM_ADDR_ATTR_FLAGS]) entry->flags =3D nla_get_u32(tb[MPTCP_PM_ADDR_ATTR_FLAGS]); =20 @@ -1259,7 +1277,7 @@ static int mptcp_nl_cmd_add_addr(struct sk_buff *skb,= struct genl_info *info) struct mptcp_pm_addr_entry addr, *entry; int ret; =20 - ret =3D mptcp_pm_parse_addr(attr, info, true, &addr); + ret =3D mptcp_pm_parse_entry(attr, info, true, &addr); if (ret < 0) return ret; =20 @@ -1453,7 +1471,7 @@ static int mptcp_nl_cmd_del_addr(struct sk_buff *skb,= struct genl_info *info) unsigned int addr_max; int ret; =20 - ret =3D mptcp_pm_parse_addr(attr, info, false, &addr); + ret =3D mptcp_pm_parse_entry(attr, info, false, &addr); if (ret < 0) return ret; =20 @@ -1627,7 +1645,7 @@ static int mptcp_nl_cmd_get_addr(struct sk_buff *skb,= struct genl_info *info) void *reply; int ret; =20 - ret =3D mptcp_pm_parse_addr(attr, info, false, &addr); + ret =3D mptcp_pm_parse_entry(attr, info, false, &addr); if (ret < 0) return ret; =20 @@ -1838,7 +1856,7 @@ static int mptcp_nl_cmd_set_flags(struct sk_buff *skb= , struct genl_info *info) u8 bkup =3D 0, lookup_by_id =3D 0; int ret; =20 - ret =3D mptcp_pm_parse_addr(attr, info, false, &addr); + ret =3D mptcp_pm_parse_entry(attr, info, false, &addr); if (ret < 0) return ret; =20 --=20 2.31.1 From nobody Tue Apr 30 06:32:02 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:1788:b0:4ac:5e5b:1ad1 with SMTP id y8csp1138673piq; Wed, 6 Apr 2022 19:42:57 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwT77HWMAud/U5PVLqleV25E5UPcJq9UxNAtFdukMlsbRzQ+utbqML1CTj2w5+bU2bSRtF/ X-Received: by 2002:a17:907:7242:b0:6da:b561:d523 with SMTP id ds2-20020a170907724200b006dab561d523mr10954580ejc.118.1649299376986; Wed, 06 Apr 2022 19:42:56 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1649299376; cv=none; d=google.com; s=arc-20160816; b=VSCdIKpd4v/yc3zhRlkzx0LDxAphw9zkycfugPdtLaqP8K8b4313m8uLAFnyQZV/zt dj5XQqu6x8Dvmm/TVcrLxwrMwk9oujKSu9A9u4vN277z2vZcaiL9mnlaEc/nz0T2otCF 4VpsLdb8z7EvaR8lDWd9muC0GI4fG+0xM+yeAtII2rOwCMJr1uu0ZyI/49yyKsOHhVdR Qes6K+ReQSvRcy83a1RawRHu0dMqiBqId52bbJM+zGszfCyxbGNgMg3zJeUwoDw/ru2v jaVcGYnJwXhZKsAsoQmw6RF0ntOA0wIg5z1X30i8z4DYxocwY6fRkUVAN78DuomwnpBv oRJQ== 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=sQnrWKemkKgcxUZmEapsNMVwsXGKQys+zoY6piwWFnE=; b=wQW2wmZbUmpSzpSYeCjh8sacaqrsNLeSrwTIUEIXUz8WmWLbBY+ilowJkA2YMxyfMf xiu0i3EKKvPpMwu1cAcv5gPJARS+GdgxOlYhOdCd9lsmulAZPEFKBracAFK8gNkw1vPL d4GRYItmkmNEwhM56BmDaTeu1YmuH7pa25bEC5/l7PpMB3BIwTzqVHXFzb3a20QZ8c19 sDmw4y9qtir6wRQjhE7pfd8xC+rHbSfh7H+aPiCvbaRjtUMkqXCweLxS8NKE7LX4kp5h +6fRdrIeMCa8651QSQKmJ827+msmiLYoj7Rgc3d+XH5tPGsUccLbneEl94kKlmepkRmX Q70g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=XKcWEG5N; spf=pass (google.com: domain of mptcp+bounces-4622-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-4622-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 fe5-20020a1709072a4500b006df76385cf7si11437046ejc.407.2022.04.06.19.42.56 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 06 Apr 2022 19:42:56 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-4622-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=XKcWEG5N; spf=pass (google.com: domain of mptcp+bounces-4622-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-4622-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 E70C91C0D2B for ; Thu, 7 Apr 2022 02:42:55 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 516FE20EA; Thu, 7 Apr 2022 02:42:52 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) (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 6964320EF for ; Thu, 7 Apr 2022 02:42:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1649299370; x=1680835370; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=WnB4/7sLpcFgv5J76mJJg5mYkFCteAYbrZOaU1nCtFo=; b=XKcWEG5NgeBhzyJPBNKIeACcIpfi/t/7EagKskcv7wrJFzSY7Db1qUew BQtf9bqbJPSavXQq8Qnpxmxm/WWlO06BKFGZbODbzIfrh54LVBpM0sWIx a/rc9LI9sYYPyD06aDJ5rN9dC7/+GRMSqBPMvpM6Z45U+LZ7bnSvgvmUO 7q9tTJFhjUUPvmTYWzDZc3nLifRayaCtkBAvaGqDPbDc75MFhbnTnlvRl kdX3WDfn7wLlW/D7anSPQ+e042m3Sforw/aaXevTnmQZPuaMbzX0+hu7o lZO87bbp67uW211srF0CY1UN1105pX4eT56K2idDU5Y3jkPV7coTOO98c A==; X-IronPort-AV: E=McAfee;i="6200,9189,10309"; a="286189745" X-IronPort-AV: E=Sophos;i="5.90,241,1643702400"; d="scan'208";a="286189745" Received: from orsmga004.jf.intel.com ([10.7.209.38]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Apr 2022 19:42:47 -0700 X-IronPort-AV: E=Sophos;i="5.90,241,1643702400"; d="scan'208";a="658882196" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Apr 2022 19:42:47 -0700 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v7 05/14] mptcp: netlink: Add MPTCP_PM_CMD_ANNOUNCE Date: Wed, 6 Apr 2022 22:42:32 -0400 Message-Id: <20220407024241.1757334-6-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220407024241.1757334-1-kishen.maloor@intel.com> References: <20220407024241.1757334-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 --- v6: -Move struct mptcp_pm_addr_entry into protocol.h. -Make mptcp_pm_alloc_anno_list() and mptcp_pm_parse_entry() non-static. -Move mptcp_nl_cmd_announce() into pm_userspace.c. --- include/uapi/linux/mptcp.h | 2 ++ net/mptcp/pm_netlink.c | 24 ++++++++-------- net/mptcp/pm_userspace.c | 58 ++++++++++++++++++++++++++++++++++++++ net/mptcp/protocol.h | 17 +++++++++++ 4 files changed, 88 insertions(+), 13 deletions(-) diff --git a/include/uapi/linux/mptcp.h b/include/uapi/linux/mptcp.h index e41ea01a94bb..ac66c1263f02 100644 --- a/include/uapi/linux/mptcp.h +++ b/include/uapi/linux/mptcp.h @@ -55,6 +55,7 @@ enum { MPTCP_PM_ATTR_ADDR, /* nested address */ MPTCP_PM_ATTR_RCV_ADD_ADDRS, /* u32 */ MPTCP_PM_ATTR_SUBFLOWS, /* u32 */ + MPTCP_PM_ATTR_TOKEN, /* u32 */ =20 __MPTCP_PM_ATTR_MAX }; @@ -93,6 +94,7 @@ enum { MPTCP_PM_CMD_SET_LIMITS, MPTCP_PM_CMD_GET_LIMITS, MPTCP_PM_CMD_SET_FLAGS, + MPTCP_PM_CMD_ANNOUNCE, =20 __MPTCP_PM_CMD_AFTER_LAST }; diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index ece0158519e2..dbe5ccd95ac5 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -22,14 +22,6 @@ static struct genl_family mptcp_genl_family; =20 static int pm_nl_pernet_id; =20 -struct mptcp_pm_addr_entry { - struct list_head list; - struct mptcp_addr_info addr; - u8 flags; - int ifindex; - struct socket *lsk; -}; - struct mptcp_pm_add_entry { struct list_head list; struct mptcp_addr_info addr; @@ -360,8 +352,8 @@ mptcp_pm_del_add_timer(struct mptcp_sock *msk, return entry; } =20 -static bool mptcp_pm_alloc_anno_list(struct mptcp_sock *msk, - const struct mptcp_pm_addr_entry *entry) +bool mptcp_pm_alloc_anno_list(struct mptcp_sock *msk, + const struct mptcp_pm_addr_entry *entry) { struct mptcp_pm_add_entry *add_entry =3D NULL; struct sock *sk =3D (struct sock *)msk; @@ -1102,6 +1094,7 @@ static const struct nla_policy mptcp_pm_policy[MPTCP_= PM_ATTR_MAX + 1] =3D { NLA_POLICY_NESTED(mptcp_pm_addr_policy), [MPTCP_PM_ATTR_RCV_ADD_ADDRS] =3D { .type =3D NLA_U32, }, [MPTCP_PM_ATTR_SUBFLOWS] =3D { .type =3D NLA_U32, }, + [MPTCP_PM_ATTR_TOKEN] =3D { .type =3D NLA_U32, }, }; =20 void mptcp_pm_nl_subflow_chk_stale(const struct mptcp_sock *msk, struct so= ck *ssk) @@ -1211,9 +1204,9 @@ static int mptcp_pm_parse_pm_addr_attr(struct nlattr = *tb[], return err; } =20 -static int mptcp_pm_parse_entry(struct nlattr *attr, struct genl_info *inf= o, - bool require_family, - struct mptcp_pm_addr_entry *entry) +int mptcp_pm_parse_entry(struct nlattr *attr, struct genl_info *info, + bool require_family, + struct mptcp_pm_addr_entry *entry) { struct nlattr *tb[MPTCP_PM_ADDR_ATTR_MAX + 1]; int err; @@ -2206,6 +2199,11 @@ static const struct genl_small_ops mptcp_pm_ops[] = =3D { .doit =3D mptcp_nl_cmd_set_flags, .flags =3D GENL_ADMIN_PERM, }, + { + .cmd =3D MPTCP_PM_CMD_ANNOUNCE, + .doit =3D mptcp_nl_cmd_announce, + .flags =3D GENL_ADMIN_PERM, + }, }; =20 static struct genl_family mptcp_genl_family __ro_after_init =3D { diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c index 871baee676bd..029361c23440 100644 --- a/net/mptcp/pm_userspace.c +++ b/net/mptcp/pm_userspace.c @@ -115,3 +115,61 @@ int mptcp_userspace_pm_get_local_id(struct mptcp_sock = *msk, =20 return mptcp_userspace_pm_append_new_local_addr(msk, &new_entry); } + +int mptcp_nl_cmd_announce(struct sk_buff *skb, struct genl_info *info) +{ + struct nlattr *token =3D info->attrs[MPTCP_PM_ATTR_TOKEN]; + struct nlattr *addr =3D info->attrs[MPTCP_PM_ATTR_ADDR]; + struct mptcp_pm_addr_entry addr_val; + struct mptcp_sock *msk; + u32 token_val; + int err; + + if (!addr || !token) { + GENL_SET_ERR_MSG(info, "missing required inputs"); + return -EINVAL; + } + + token_val =3D nla_get_u32(token); + + msk =3D mptcp_token_get_sock(sock_net(skb->sk), token_val); + if (!msk) { + NL_SET_ERR_MSG_ATTR(info->extack, token, "invalid token"); + return -EINVAL; + } + + if (!mptcp_pm_is_userspace(msk)) { + GENL_SET_ERR_MSG(info, "invalid request; userspace PM not selected"); + return -EINVAL; + } + + err =3D mptcp_pm_parse_entry(addr, info, true, &addr_val); + if (err < 0) { + GENL_SET_ERR_MSG(info, "error parsing local address"); + return err; + } + + if (addr_val.addr.id =3D=3D 0 || !(addr_val.flags & MPTCP_PM_ADDR_FLAG_SI= GNAL)) { + GENL_SET_ERR_MSG(info, "invalid addr id or flags"); + return -EINVAL; + } + + err =3D mptcp_userspace_pm_append_new_local_addr(msk, &addr_val); + if (err < 0) { + GENL_SET_ERR_MSG(info, "did not match address and id"); + return err; + } + + lock_sock((struct sock *)msk); + spin_lock_bh(&msk->pm.lock); + + if (mptcp_pm_alloc_anno_list(msk, &addr_val)) { + mptcp_pm_announce_addr(msk, &addr_val.addr, false); + mptcp_pm_nl_addr_send_ack(msk); + } + + spin_unlock_bh(&msk->pm.lock); + release_sock((struct sock *)msk); + + return 0; +} diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index a6ee811e5d02..2abf98e66074 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -11,6 +11,7 @@ #include #include #include +#include =20 #define MPTCP_SUPPORTED_VERSION 1 =20 @@ -747,6 +748,19 @@ u16 __mptcp_make_csum(u64 data_seq, u32 subflow_seq, u= 16 data_len, __wsum sum); void __init mptcp_pm_init(void); void mptcp_pm_data_init(struct mptcp_sock *msk); void mptcp_pm_data_reset(struct mptcp_sock *msk); + +struct mptcp_pm_addr_entry { + struct list_head list; + struct mptcp_addr_info addr; + u8 flags; + int ifindex; + struct socket *lsk; +}; + +int mptcp_pm_parse_entry(struct nlattr *attr, struct genl_info *info, + bool require_family, + struct mptcp_pm_addr_entry *entry); + void mptcp_pm_subflow_chk_stale(const struct mptcp_sock *msk, struct sock = *ssk); void mptcp_pm_nl_subflow_chk_stale(const struct mptcp_sock *msk, struct so= ck *ssk); void mptcp_pm_new_connection(struct mptcp_sock *msk, const struct sock *ss= k, int server_side); @@ -767,6 +781,8 @@ void mptcp_pm_rm_addr_received(struct mptcp_sock *msk, const struct mptcp_rm_list *rm_list); void mptcp_pm_mp_prio_received(struct sock *sk, u8 bkup); void mptcp_pm_mp_fail_received(struct sock *sk, u64 fail_seq); +bool mptcp_pm_alloc_anno_list(struct mptcp_sock *msk, + const struct mptcp_pm_addr_entry *entry); void mptcp_pm_free_anno_list(struct mptcp_sock *msk); bool mptcp_pm_sport_in_anno_list(struct mptcp_sock *msk, const struct sock= *sk); struct mptcp_pm_add_entry * @@ -790,6 +806,7 @@ int mptcp_pm_remove_subflow(struct mptcp_sock *msk, con= st struct mptcp_rm_list * int mptcp_userspace_pm_append_new_local_addr(struct mptcp_sock *msk, struct mptcp_pm_addr_entry *entry); void mptcp_free_local_addr_list(struct mptcp_sock *msk); +int mptcp_nl_cmd_announce(struct sk_buff *skb, struct genl_info *info); =20 void mptcp_event(enum mptcp_event_type type, const struct mptcp_sock *msk, const struct sock *ssk, gfp_t gfp); --=20 2.31.1 From nobody Tue Apr 30 06:32:02 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:1788:b0:4ac:5e5b:1ad1 with SMTP id y8csp1138683piq; Wed, 6 Apr 2022 19:42:58 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzrkp8fvdkTzn+IYUR89bSjdZq+7bXIqYw7ybI8siJyeqZpsgfFbWXBxYDjtAPU+MYzpJvo X-Received: by 2002:a17:902:b183:b0:14f:c266:20d5 with SMTP id s3-20020a170902b18300b0014fc26620d5mr11775108plr.136.1649299378649; Wed, 06 Apr 2022 19:42:58 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1649299378; cv=none; d=google.com; s=arc-20160816; b=Z1msSXBDe1uKx2Q+nItmaA1haD/gGyp70Q72Yu8WVxmbv0WbAeOZdxmtIUmwKLdSGp R6BzsBkyoB3zfbYrOxh8etL8XT/aMkM8J3Bnv2mYj4YtGStbtGx8jxEMK6jpcmk5/ghS QxCVfV0J+4tb0WN/I088QJ1vWkbGe5bXmQJrsiTQ+7ptFZBXQo5DF+Ivx06tcZz/enC9 Y4ZN1XBZgtLXZv8w0KZAMIFXpDLt955Sp/VYRavZH0g9ae7XVGUG+Va70M9VrWWNwdM2 d9p2o6AYDjrRPWobj3P9GX7vLpzHujOtGfzj5qspnQ1c09kc/QCi8aUiTkXGx24nqQ9N NMsg== 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=QETkZrOzJ3fDb8Kv9KvKolJOKxPSBXf72ez9JxwRq9dWh1dTxa/INoCTCoE649kHmH 1GhuGUEQqdAlH17w2gZ8mVbhuNS3TZSUk9Uotnczr74b98MqOmtCQBjYEqUtdX0W+85o 0w3UJMhYmqPqaWASMAlKaYZSMoEvgCocFfKzRDq9BHQus5a+2t3f3KeGetC62Q4Pt8B3 PHnJYENV/Zk2RLQFr6hANXxuBmAbBncLOptFWV2xWvKLwfalTYHtA8lGNrsw+qWcWerl jtesstIR4cCjVJ+sTfb9UoXnsYRdJtrb6QxmHMhojOeoaelWC1M1TWx8Yzz4ChPvrUfc ryoA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=BWBi9yXw; spf=pass (google.com: domain of mptcp+bounces-4624-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-4624-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 b16-20020a170903229000b001570ab00a37si163798plh.177.2022.04.06.19.42.58 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 06 Apr 2022 19:42:58 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-4624-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=BWBi9yXw; spf=pass (google.com: domain of mptcp+bounces-4624-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-4624-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 400663E0F23 for ; Thu, 7 Apr 2022 02:42:58 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id D96E120F2; Thu, 7 Apr 2022 02:42:53 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) (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 5DFD120EB for ; Thu, 7 Apr 2022 02:42:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1649299372; x=1680835372; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=UhUPMksKwrGyZiZFoGBkKb8Lil20ZzQprtFN2H/4J28=; b=BWBi9yXwVlEr71iPdRZ9Yav9D4NTpMg0noYQDpBIiSAV9hxEc3v7H3VH 3Vzb5hCyVnmXt7wAXkIyLxNcg0Bym4TK5T0J4jBe+V9VUwn5ithpwklqi 6XvVrhPU5QPJYGk+5hqrlQ+av+f1ezMLkA007ymzahh/u8rmdQXmiIP0J gdU+G8qR9k8UfvTc6+AcUBMj765dsJlQkfENqO3+4086Iba1S39iUYSVJ 4PoDKpEoam2IkN26mLoJhC/09p7bTkuv1BYK93OXftSw0YVolDvpYE41i Eng1GWc8FA+AQJrZmJeG+1mXM9MNxN+kwCpQ9AgdriVCVSJMVsQCQlO0y Q==; X-IronPort-AV: E=McAfee;i="6200,9189,10309"; a="286189746" X-IronPort-AV: E=Sophos;i="5.90,241,1643702400"; d="scan'208";a="286189746" Received: from orsmga004.jf.intel.com ([10.7.209.38]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Apr 2022 19:42:47 -0700 X-IronPort-AV: E=Sophos;i="5.90,241,1643702400"; d="scan'208";a="658882199" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Apr 2022 19:42:47 -0700 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v7 06/14] selftests: mptcp: support MPTCP_PM_CMD_ANNOUNCE Date: Wed, 6 Apr 2022 22:42:33 -0400 Message-Id: <20220407024241.1757334-7-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220407024241.1757334-1-kishen.maloor@intel.com> References: <20220407024241.1757334-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 Tue Apr 30 06:32:02 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:1788:b0:4ac:5e5b:1ad1 with SMTP id y8csp1138698piq; Wed, 6 Apr 2022 19:43:00 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxPVpO0MhnWpUbM6kWWnNgBF4EqrTIbYKZBrRNWO7dYVnPqtDQDsgleW3MI6k2ZhNIzYN1a X-Received: by 2002:a05:6402:5193:b0:419:3d19:ce9e with SMTP id q19-20020a056402519300b004193d19ce9emr11836238edd.199.1649299380797; Wed, 06 Apr 2022 19:43:00 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1649299380; cv=none; d=google.com; s=arc-20160816; b=zdMpzeyonEll5PTABFmpM1WPhLIao8BGn4816iXpdsp/mKU5Gg8hvtA0tCWwOfswe8 +meBDvut+xbqcArSmqtOw/YDJlGdvliAihefYkx6lCBeIz8L+ggFtMADTs9Ms062+oDi Y3TYEg5YwE4ux2rfuWfjKwzFeI7mNMT71TfYBrsKfZuulskPjlF6cK9ea3YpgVLGgXv5 Of1EKDvDdkZe0MLhDIF6GYr5vs76WeJ82OSZLMx3aMXW4nVxdVz5QXSEV1MCuN+qU4Pg kdjBWCiHQ2lNOTYD50V2qEiransO+aAXkiT9iQYakl2WHhOZgKgNROfVpaxv9kCZWiAF 15NQ== 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=EbKqr+fQsSsDtg16HHd5gZ3c581buNKGTwop3bS7u5Y=; b=YR3dHDXVTx233LzGKxd/qFZAoStICf6ABo7Z94e9BPT1nNWM9XiFQK0LMUX1m9e5o/ p4R5O+RJ8IPMJgiRXVvKSlcFUVfTlL/M15n9EHmEowZBSLqQGu/nxfm30caax4VWd/tP p9fTiLMNttWdhoPPGxs6PBZ9aU3G7RsETrXGN9fmtkZeLQYhvcKeBiv/HVnIYdTJVN8e 2fbUGpdIqixGAUQr2uvUqPkkHy7w71Uk+WoJmTC532EfmLY9ZOWWCRR449YU57LvIjip CUkuKD9KQQYsYMt9b0dKAacv3B3YbDppNA2js3zwJEZFnoywQZhb3jjjCZsqZAiLsd9N rpVg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=exKiKER1; spf=pass (google.com: domain of mptcp+bounces-4625-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-4625-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 la22-20020a170907781600b006e8304044d6si1016167ejc.63.2022.04.06.19.43.00 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 06 Apr 2022 19:43:00 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-4625-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=exKiKER1; spf=pass (google.com: domain of mptcp+bounces-4625-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-4625-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 C778E1C0AF4 for ; Thu, 7 Apr 2022 02:42:59 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id EDA0A20F3; Thu, 7 Apr 2022 02:42:54 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) (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 667BE20F1 for ; Thu, 7 Apr 2022 02:42:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1649299372; x=1680835372; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=jj4khomRzZf5jteIRRHyU02U5TB8lj9UuUXmddsYKrM=; b=exKiKER1kYIY96U/jVoxWIysKHq4Jpp58ft/t1gGEBth3d6LVzEeM8rR z7dVTAoRbVG66UHTsJtb0BcfVSJY/rLiw4DBl094w+pSAoc6ANVKyn78d VyK8Fvfeqkjxb17Efn+wOYqUCgt3nCegef2Bu5CC5TOkIMcjXOX671rjg bDFsjSidrjfRnqk95XJOynhhT1Fnjvx1mgYSvOu20iKzbucHn3FbklRWg Fl8bRkZIZt9DropOB8gddYEl6gGJFQ6Zodn0QHacFDGovTV3WN+dDt8By +I9jHhKPC9pavEBk7Nlpcthsjb8tprzuIbfh0B2TG2crHF4plRmYJ73C1 Q==; X-IronPort-AV: E=McAfee;i="6200,9189,10309"; a="286189747" X-IronPort-AV: E=Sophos;i="5.90,241,1643702400"; d="scan'208";a="286189747" Received: from orsmga004.jf.intel.com ([10.7.209.38]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Apr 2022 19:42:47 -0700 X-IronPort-AV: E=Sophos;i="5.90,241,1643702400"; d="scan'208";a="658882202" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Apr 2022 19:42:47 -0700 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v7 07/14] mptcp: netlink: Add MPTCP_PM_CMD_REMOVE Date: Wed, 6 Apr 2022 22:42:34 -0400 Message-Id: <20220407024241.1757334-8-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220407024241.1757334-1-kishen.maloor@intel.com> References: <20220407024241.1757334-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 --- v6: -Make mptcp_pm_remove_addrs_and_subflows() non-static. -Move mptcp_nl_cmd_remove() into pm_userspace.c. --- include/uapi/linux/mptcp.h | 2 ++ net/mptcp/pm_netlink.c | 10 +++++-- net/mptcp/pm_userspace.c | 57 ++++++++++++++++++++++++++++++++++++++ net/mptcp/protocol.h | 4 +++ 4 files changed, 71 insertions(+), 2 deletions(-) diff --git a/include/uapi/linux/mptcp.h b/include/uapi/linux/mptcp.h index ac66c1263f02..11f9fa001a3c 100644 --- a/include/uapi/linux/mptcp.h +++ b/include/uapi/linux/mptcp.h @@ -56,6 +56,7 @@ enum { MPTCP_PM_ATTR_RCV_ADD_ADDRS, /* u32 */ MPTCP_PM_ATTR_SUBFLOWS, /* u32 */ MPTCP_PM_ATTR_TOKEN, /* u32 */ + MPTCP_PM_ATTR_LOC_ID, /* u8 */ =20 __MPTCP_PM_ATTR_MAX }; @@ -95,6 +96,7 @@ enum { MPTCP_PM_CMD_GET_LIMITS, MPTCP_PM_CMD_SET_FLAGS, MPTCP_PM_CMD_ANNOUNCE, + MPTCP_PM_CMD_REMOVE, =20 __MPTCP_PM_CMD_AFTER_LAST }; diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index dbe5ccd95ac5..a26750f19f65 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -1095,6 +1095,7 @@ static const struct nla_policy mptcp_pm_policy[MPTCP_= PM_ATTR_MAX + 1] =3D { [MPTCP_PM_ATTR_RCV_ADD_ADDRS] =3D { .type =3D NLA_U32, }, [MPTCP_PM_ATTR_SUBFLOWS] =3D { .type =3D NLA_U32, }, [MPTCP_PM_ATTR_TOKEN] =3D { .type =3D NLA_U32, }, + [MPTCP_PM_ATTR_LOC_ID] =3D { .type =3D NLA_U8, }, }; =20 void mptcp_pm_nl_subflow_chk_stale(const struct mptcp_sock *msk, struct so= ck *ssk) @@ -1504,8 +1505,8 @@ static int mptcp_nl_cmd_del_addr(struct sk_buff *skb,= struct genl_info *info) return ret; } =20 -static void mptcp_pm_remove_addrs_and_subflows(struct mptcp_sock *msk, - struct list_head *rm_list) +void mptcp_pm_remove_addrs_and_subflows(struct mptcp_sock *msk, + struct list_head *rm_list) { struct mptcp_rm_list alist =3D { .nr =3D 0 }, slist =3D { .nr =3D 0 }; struct mptcp_pm_addr_entry *entry; @@ -2204,6 +2205,11 @@ static const struct genl_small_ops mptcp_pm_ops[] = =3D { .doit =3D mptcp_nl_cmd_announce, .flags =3D GENL_ADMIN_PERM, }, + { + .cmd =3D MPTCP_PM_CMD_REMOVE, + .doit =3D mptcp_nl_cmd_remove, + .flags =3D GENL_ADMIN_PERM, + }, }; =20 static struct genl_family mptcp_genl_family __ro_after_init =3D { diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c index 029361c23440..b1b1aa881ba7 100644 --- a/net/mptcp/pm_userspace.c +++ b/net/mptcp/pm_userspace.c @@ -173,3 +173,60 @@ int mptcp_nl_cmd_announce(struct sk_buff *skb, struct = genl_info *info) =20 return 0; } + +int mptcp_nl_cmd_remove(struct sk_buff *skb, struct genl_info *info) +{ + struct nlattr *token =3D info->attrs[MPTCP_PM_ATTR_TOKEN]; + struct nlattr *id =3D info->attrs[MPTCP_PM_ATTR_LOC_ID]; + struct mptcp_pm_addr_entry *match =3D NULL; + struct mptcp_pm_addr_entry *entry; + struct mptcp_sock *msk; + LIST_HEAD(free_list); + u32 token_val; + u8 id_val; + + if (!id || !token) { + GENL_SET_ERR_MSG(info, "missing required inputs"); + return -EINVAL; + } + + id_val =3D nla_get_u8(id); + token_val =3D nla_get_u32(token); + + msk =3D mptcp_token_get_sock(sock_net(skb->sk), token_val); + if (!msk) { + NL_SET_ERR_MSG_ATTR(info->extack, token, "invalid token"); + return -EINVAL; + } + + if (!mptcp_pm_is_userspace(msk)) { + GENL_SET_ERR_MSG(info, "invalid request; userspace PM not selected"); + return -EINVAL; + } + + lock_sock((struct sock *)msk); + + list_for_each_entry(entry, &msk->pm.userspace_pm_local_addr_list, list) { + if (entry->addr.id =3D=3D id_val) { + match =3D entry; + break; + } + } + + if (!match) { + GENL_SET_ERR_MSG(info, "address with specified id not found"); + release_sock((struct sock *)msk); + return -EINVAL; + } + + list_move(&match->list, &free_list); + + mptcp_pm_remove_addrs_and_subflows(msk, &free_list); + + release_sock((struct sock *)msk); + + list_for_each_entry_safe(match, entry, &free_list, list) { + sock_kfree_s((struct sock *)msk, match, sizeof(*match)); + } + return 0; +} diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index 2abf98e66074..bf499ca81445 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -803,10 +803,14 @@ int mptcp_pm_announce_addr(struct mptcp_sock *msk, bool echo); int mptcp_pm_remove_addr(struct mptcp_sock *msk, const struct mptcp_rm_lis= t *rm_list); int mptcp_pm_remove_subflow(struct mptcp_sock *msk, const struct mptcp_rm_= list *rm_list); +void mptcp_pm_remove_addrs_and_subflows(struct mptcp_sock *msk, + struct list_head *rm_list); + int mptcp_userspace_pm_append_new_local_addr(struct mptcp_sock *msk, struct mptcp_pm_addr_entry *entry); void mptcp_free_local_addr_list(struct mptcp_sock *msk); int mptcp_nl_cmd_announce(struct sk_buff *skb, struct genl_info *info); +int mptcp_nl_cmd_remove(struct sk_buff *skb, struct genl_info *info); =20 void mptcp_event(enum mptcp_event_type type, const struct mptcp_sock *msk, const struct sock *ssk, gfp_t gfp); --=20 2.31.1 From nobody Tue Apr 30 06:32:02 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:1788:b0:4ac:5e5b:1ad1 with SMTP id y8csp1138678piq; Wed, 6 Apr 2022 19:42:57 -0700 (PDT) X-Google-Smtp-Source: ABdhPJx56WyJmsJrwFOjtn119HRjdVKAC8aRISJHc/38dovMOvbwjaYJ2EUYAYIhvcEKAYtpZEeg X-Received: by 2002:a05:6402:5191:b0:41c:e08c:ae21 with SMTP id q17-20020a056402519100b0041ce08cae21mr11975945edd.268.1649299377704; Wed, 06 Apr 2022 19:42:57 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1649299377; cv=none; d=google.com; s=arc-20160816; b=vipcCPHH1COI3Q17meY7d3EfR9TibsS/ZwP30lP8SmGrkIrHFz8dZTIedoqRJQ2/U0 Zhy332m8K89IeKUZuA0B3cNZiKc6s7sGOFxTHYUwAB28+3oqHu4WvVlnaiWlByFug58/ 0RYOWkaoKYfHRXdgelgNXZPTQEugdwKcUj5CmNZxITtcSlTwLkSU4mEr0twhp1jdSayp h4ul36TurXEnXrZZH4E5qTZ/xgsEWsttckuMRqr0WtKGhiRTGPyqJNCMB8z+uoW6BKi6 e9A/87jdpE5MW+fDIJXAhNGmaeQBCw935/px7cpozTdnx7DtGZrLJ8plJKpEUTHyadDQ QgEA== 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=gECIpCrKHdtpzJ/sIJ7abT6WHGhBGrUzKNtlTInzVK5ERelBJMRtax1rney5JDTRFg uqyl6XrGvrHWuGFMFmBvmtO7LBDkdXTCsUQLrspI0K7Om532mCHbuFYQyk1g0X2+1k2H dfonbH+B25kIsrneAZ4KxIW1qpgvtEHfAQFa7iuvdlL+7gvWvVhrFUcD5IpSxfNa9XOc yYrBwWcr6pXGEUTHLqYXSjXDKJvMTdboaNpIh0pAT2QGQGjqVLlB+VumM9Hfqeim471N 0FnZ6kXG4hnB8UMnwh7xveHwKWTZpnI9kUTCxaRuZ+Bo+WAFDhaCdiKPngCXZ0TpBxu0 COpQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=K6UjuyZ0; spf=pass (google.com: domain of mptcp+bounces-4623-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-4623-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 bw7-20020a170906c1c700b006df76385d9fsi12707400ejb.575.2022.04.06.19.42.57 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 06 Apr 2022 19:42:57 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-4623-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=K6UjuyZ0; spf=pass (google.com: domain of mptcp+bounces-4623-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-4623-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 324451C0BDE for ; Thu, 7 Apr 2022 02:42:57 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id BF01320EE; Thu, 7 Apr 2022 02:42:53 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) (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 6678C20EF for ; Thu, 7 Apr 2022 02:42:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1649299372; x=1680835372; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=RAhrEvJmyKeoBz/vW0WCe2KrNVdwr/PvsJn+yTOk/F0=; b=K6UjuyZ0kjy8xKwGfaYfzFsbNgjN8HVI+mY0ycpewaX2nHb8uuF2achp 0T88NGR9j4jX8PlYu1pM1u/zywgIr06QJr6ZuswVjn4Ep9LPLQ1knWLCK jmCv8AID/l3JnqJLaRSAd0yqRPWDJ0HeaTEAje0mTxuf/8adlkKNt+xAF XzOAqXxNRSeK/zb5vJtvU0odCLwKNjcnxvjOt/P79z9wiYANYlTOkBAcz miYf1hHnz8DEP7Ma8P+nXZfGt277VYsabh8bAaG3CBDwjSNrHCFZ/QnCZ MvDXRUSgl798xGycTOfT294DcyvMGyPd7MTOSzCSIFhK9VzFe7LBuY3jX g==; X-IronPort-AV: E=McAfee;i="6200,9189,10309"; a="286189748" X-IronPort-AV: E=Sophos;i="5.90,241,1643702400"; d="scan'208";a="286189748" Received: from orsmga004.jf.intel.com ([10.7.209.38]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Apr 2022 19:42:48 -0700 X-IronPort-AV: E=Sophos;i="5.90,241,1643702400"; d="scan'208";a="658882206" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Apr 2022 19:42:47 -0700 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v7 08/14] selftests: mptcp: support MPTCP_PM_CMD_REMOVE Date: Wed, 6 Apr 2022 22:42:35 -0400 Message-Id: <20220407024241.1757334-9-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220407024241.1757334-1-kishen.maloor@intel.com> References: <20220407024241.1757334-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 Tue Apr 30 06:32:02 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:1788:b0:4ac:5e5b:1ad1 with SMTP id y8csp1138747piq; Wed, 6 Apr 2022 19:43:07 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxKHnXs/NBJz7gaZfegZ/JkSkqfdyCybJWY9nXkzWRcUs07XxkcdNzNzU5SpZphE/UIlZuE X-Received: by 2002:a05:6402:3553:b0:419:6552:11b7 with SMTP id f19-20020a056402355300b00419655211b7mr11834220edd.286.1649299387534; Wed, 06 Apr 2022 19:43:07 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1649299387; cv=none; d=google.com; s=arc-20160816; b=EjsinHeXO+ccE68oF9nHOHz/ts67AeIvjJ+EfqEmwiwSyFnrV4uD3rL9iHu5hsYq3l ymAPGm30juvqh9fz5cwtUcbx+yHtGLaW/nf92Oj6UzM2bxv/iTh9/jre3CaBPVqmK46l fXlmtJIzQ5w4oR3C1ZczMVbaRRSA2USuzFx9hJTNxsDwopniL7KmJTDpfRU76zUIg8Wq ++atZJsUOd1CFY++IntpqbxlapeA8R065BIM8z3Dy/OYdkA8M/ZPb5v8tXVUViwuyRwl FztOV4ao/NV3tuQFMhNqoc+3VVFll38FpB1yWhNQM/by1Uv8e4kROkk2DGcc95rxSp9B sdlw== 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=69Jl26IcyDDcD/aFEWC9VMiJ9tCw+eJqWGOJ8nLo4FY=; b=kXbrzhAzPeJH1BDTIJXAiZSfAm9orRpLt8ozaIL0+TNknwFoA8UoaIUWC8Smc/Pdgm bXbGq4DKC5oSzCWrxv6XsOLu9p3liSWQ37sgf/ER+z4hF8WJfsGT+4nYectQystEn+bl 70FPmIPeiKctP6vSI/4tNrBFgxBHSgloGO9yoHJWM1vyGhPVsrVcmsF7EfExuHm/O1ac H7TWkLB1vEJHZb3V70RwMD5ujm2mGMvC6p9guEcgu+AL7zvgxSupisTkU4pscA9n2wHX IkwthzNjL/uQz45kEfxA3B6FrjNRnrpad978wapngn3UH0pnZnFeLteDgxFgkmSTMdw/ ErNg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=VoAUcCuX; spf=pass (google.com: domain of mptcp+bounces-4631-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-4631-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 b2-20020a50be82000000b00418c2b5bde1si12677750edk.195.2022.04.06.19.43.07 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 06 Apr 2022 19:43:07 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-4631-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=VoAUcCuX; spf=pass (google.com: domain of mptcp+bounces-4631-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-4631-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 05FCF1C0D50 for ; Thu, 7 Apr 2022 02:43:07 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 4E4AB20F0; Thu, 7 Apr 2022 02:43:03 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) (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 978DD20EA for ; Thu, 7 Apr 2022 02:43:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1649299381; x=1680835381; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=DqW74sX+cU2s7li/5Mzp/jvN8n0HiAuBjLIZKmEvgu4=; b=VoAUcCuXsCvqEG9BGvUD/tq78BadbOkLtIXYuNsYQ9Z8VdqgyMWfU+CJ CUyKx6wqsCuUT4zBUusbsr2r6GNr+hiMJcsIlKX7xYhI8nBgUtEMiJ/db fM0msG67zMyECEhM8+thwgurkMuHeE67yUpjqStpGny7QLyLfENwU6T6l UFTe96U7ijR5tVSM3A8AqclccAZvyBBtNXXe/kNQRtazIe895L+AWeE7O JmMosw239vArs8sBaRnkWirtFGzskhX8b2sUWGEIad/COf8ojZWOSN/2S 3j3FfYSAFF/h/g56i3hJdM6joDEojktDzl0Cjkit9rPdOl/uVEcDAEpc3 w==; X-IronPort-AV: E=McAfee;i="6200,9189,10309"; a="261390129" X-IronPort-AV: E=Sophos;i="5.90,241,1643702400"; d="scan'208";a="261390129" Received: from orsmga004.jf.intel.com ([10.7.209.38]) by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Apr 2022 19:42:48 -0700 X-IronPort-AV: E=Sophos;i="5.90,241,1643702400"; d="scan'208";a="658882209" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Apr 2022 19:42:47 -0700 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Cc: Florian Westphal Subject: [PATCH mptcp-next v7 09/14] mptcp: netlink: allow userspace-driven subflow establishment Date: Wed, 6 Apr 2022 22:42:36 -0400 Message-Id: <20220407024241.1757334-10-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220407024241.1757334-1-kishen.maloor@intel.com> References: <20220407024241.1757334-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 --- v6: -Make mptcp_pm_parse_addr() non-static. -Move mptcp_nl_cmd_sf_create(), mptcp_nl_find_ssk() and mptcp_nl_cmd_sf_destroy() into pm_userspace.c. --- include/uapi/linux/mptcp.h | 3 + net/mptcp/pm_netlink.c | 22 +++++ net/mptcp/pm_userspace.c | 179 +++++++++++++++++++++++++++++++++++++ net/mptcp/protocol.h | 4 + 4 files changed, 208 insertions(+) diff --git a/include/uapi/linux/mptcp.h b/include/uapi/linux/mptcp.h index 11f9fa001a3c..921963589904 100644 --- a/include/uapi/linux/mptcp.h +++ b/include/uapi/linux/mptcp.h @@ -57,6 +57,7 @@ enum { MPTCP_PM_ATTR_SUBFLOWS, /* u32 */ MPTCP_PM_ATTR_TOKEN, /* u32 */ MPTCP_PM_ATTR_LOC_ID, /* u8 */ + MPTCP_PM_ATTR_ADDR_REMOTE, /* nested address */ =20 __MPTCP_PM_ATTR_MAX }; @@ -97,6 +98,8 @@ enum { MPTCP_PM_CMD_SET_FLAGS, MPTCP_PM_CMD_ANNOUNCE, MPTCP_PM_CMD_REMOVE, + MPTCP_PM_CMD_SUBFLOW_CREATE, + MPTCP_PM_CMD_SUBFLOW_DESTROY, =20 __MPTCP_PM_CMD_AFTER_LAST }; diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index a26750f19f65..e099f2a12504 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -1096,6 +1096,8 @@ static const struct nla_policy mptcp_pm_policy[MPTCP_= PM_ATTR_MAX + 1] =3D { [MPTCP_PM_ATTR_SUBFLOWS] =3D { .type =3D NLA_U32, }, [MPTCP_PM_ATTR_TOKEN] =3D { .type =3D NLA_U32, }, [MPTCP_PM_ATTR_LOC_ID] =3D { .type =3D NLA_U8, }, + [MPTCP_PM_ATTR_ADDR_REMOTE] =3D + NLA_POLICY_NESTED(mptcp_pm_addr_policy), }; =20 void mptcp_pm_nl_subflow_chk_stale(const struct mptcp_sock *msk, struct so= ck *ssk) @@ -1205,6 +1207,16 @@ static int mptcp_pm_parse_pm_addr_attr(struct nlattr= *tb[], return err; } =20 +int mptcp_pm_parse_addr(struct nlattr *attr, struct genl_info *info, + struct mptcp_addr_info *addr) +{ + struct nlattr *tb[MPTCP_PM_ADDR_ATTR_MAX + 1]; + + memset(addr, 0, sizeof(*addr)); + + return mptcp_pm_parse_pm_addr_attr(tb, attr, info, addr, true); +} + int mptcp_pm_parse_entry(struct nlattr *attr, struct genl_info *info, bool require_family, struct mptcp_pm_addr_entry *entry) @@ -2210,6 +2222,16 @@ static const struct genl_small_ops mptcp_pm_ops[] = =3D { .doit =3D mptcp_nl_cmd_remove, .flags =3D GENL_ADMIN_PERM, }, + { + .cmd =3D MPTCP_PM_CMD_SUBFLOW_CREATE, + .doit =3D mptcp_nl_cmd_sf_create, + .flags =3D GENL_ADMIN_PERM, + }, + { + .cmd =3D MPTCP_PM_CMD_SUBFLOW_DESTROY, + .doit =3D mptcp_nl_cmd_sf_destroy, + .flags =3D GENL_ADMIN_PERM, + }, }; =20 static struct genl_family mptcp_genl_family __ro_after_init =3D { diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c index b1b1aa881ba7..75d8ec0430d3 100644 --- a/net/mptcp/pm_userspace.c +++ b/net/mptcp/pm_userspace.c @@ -230,3 +230,182 @@ int mptcp_nl_cmd_remove(struct sk_buff *skb, struct g= enl_info *info) } return 0; } + +int mptcp_nl_cmd_sf_create(struct sk_buff *skb, struct genl_info *info) +{ + struct nlattr *raddr =3D info->attrs[MPTCP_PM_ATTR_ADDR_REMOTE]; + struct nlattr *token =3D info->attrs[MPTCP_PM_ATTR_TOKEN]; + struct nlattr *laddr =3D info->attrs[MPTCP_PM_ATTR_ADDR]; + struct mptcp_addr_info addr_r; + struct mptcp_addr_info addr_l; + struct mptcp_sock *msk; + struct sock *sk; + u32 token_val; + int ret; + + if (!laddr || !raddr || !token) { + GENL_SET_ERR_MSG(info, "missing required inputs"); + return -EINVAL; + } + + token_val =3D nla_get_u32(token); + + msk =3D mptcp_token_get_sock(genl_info_net(info), token_val); + if (!msk) { + NL_SET_ERR_MSG_ATTR(info->extack, token, "invalid token"); + return -EINVAL; + } + + if (!mptcp_pm_is_userspace(msk)) { + GENL_SET_ERR_MSG(info, "invalid request; userspace PM not selected"); + return -EINVAL; + } + + ret =3D mptcp_pm_parse_addr(laddr, info, &addr_l); + if (ret < 0) { + NL_SET_ERR_MSG_ATTR(info->extack, laddr, "error parsing local addr"); + return -EINVAL; + } + + if (addr_l.id =3D=3D 0) { + NL_SET_ERR_MSG_ATTR(info->extack, laddr, "missing local addr id"); + return -EINVAL; + } + + ret =3D mptcp_pm_parse_addr(raddr, info, &addr_r); + if (ret < 0) { + NL_SET_ERR_MSG_ATTR(info->extack, raddr, "error parsing remote addr"); + return -EINVAL; + } + + sk =3D &msk->sk.icsk_inet.sk; + lock_sock(sk); + + ret =3D __mptcp_subflow_connect(sk, &addr_l, &addr_r); + + release_sock(sk); + + return ret; +} + +static struct sock *mptcp_nl_find_ssk(struct mptcp_sock *msk, + const struct mptcp_addr_info *local, + const struct mptcp_addr_info *remote) +{ + struct sock *sk =3D &msk->sk.icsk_inet.sk; + struct mptcp_subflow_context *subflow; + struct sock *found =3D NULL; + + if (local->family !=3D remote->family) + return NULL; + + lock_sock(sk); + + mptcp_for_each_subflow(msk, subflow) { + const struct ipv6_pinfo *pinfo; + const struct inet_sock *issk; + struct sock *ssk; + + ssk =3D mptcp_subflow_tcp_sock(subflow); + + if (local->family !=3D ssk->sk_family) + continue; + + issk =3D inet_sk(ssk); + + switch (ssk->sk_family) { + case AF_INET: + if (issk->inet_saddr !=3D local->addr.s_addr || + issk->inet_daddr !=3D remote->addr.s_addr) + continue; + break; +#if IS_ENABLED(CONFIG_MPTCP_IPV6) + case AF_INET6: + pinfo =3D inet6_sk(ssk); + if (!ipv6_addr_equal(&local->addr6, &pinfo->saddr) || + !ipv6_addr_equal(&remote->addr6, &ssk->sk_v6_daddr)) + continue; + break; +#endif + default: + continue; + } + + if (issk->inet_sport =3D=3D local->port && + issk->inet_dport =3D=3D remote->port) { + found =3D ssk; + goto found; + } + } + +found: + release_sock(sk); + + return found; +} + +int mptcp_nl_cmd_sf_destroy(struct sk_buff *skb, struct genl_info *info) +{ + struct nlattr *raddr =3D info->attrs[MPTCP_PM_ATTR_ADDR_REMOTE]; + struct nlattr *token =3D info->attrs[MPTCP_PM_ATTR_TOKEN]; + struct nlattr *laddr =3D info->attrs[MPTCP_PM_ATTR_ADDR]; + struct mptcp_addr_info addr_l; + struct mptcp_addr_info addr_r; + struct mptcp_sock *msk; + struct sock *sk, *ssk; + u32 token_val; + int ret; + + if (!laddr || !raddr || !token) { + GENL_SET_ERR_MSG(info, "missing required inputs"); + return -EINVAL; + } + + token_val =3D nla_get_u32(token); + + msk =3D mptcp_token_get_sock(genl_info_net(info), token_val); + if (!msk) { + NL_SET_ERR_MSG_ATTR(info->extack, token, "invalid token"); + return -EINVAL; + } + + if (!mptcp_pm_is_userspace(msk)) { + GENL_SET_ERR_MSG(info, "invalid request; userspace PM not selected"); + return -EINVAL; + } + + ret =3D mptcp_pm_parse_addr(laddr, info, &addr_l); + if (ret < 0) { + NL_SET_ERR_MSG_ATTR(info->extack, laddr, "error parsing local addr"); + return ret; + } + + ret =3D mptcp_pm_parse_addr(raddr, info, &addr_r); + if (ret < 0) { + NL_SET_ERR_MSG_ATTR(info->extack, raddr, "error parsing remote addr"); + return ret; + } + + if (addr_l.family !=3D addr_r.family) { + GENL_SET_ERR_MSG(info, "address families do not match"); + return -EINVAL; + } + + if (!addr_l.port || !addr_r.port) { + GENL_SET_ERR_MSG(info, "missing local or remote port"); + return -EINVAL; + } + + sk =3D &msk->sk.icsk_inet.sk; + ssk =3D mptcp_nl_find_ssk(msk, &addr_l, &addr_r); + if (ssk) { + struct mptcp_subflow_context *subflow =3D mptcp_subflow_ctx(ssk); + + mptcp_subflow_shutdown(sk, ssk, RCV_SHUTDOWN | SEND_SHUTDOWN); + mptcp_close_ssk(sk, ssk, subflow); + } else { + ret =3D -ESRCH; + } + + return ret; +} diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index bf499ca81445..c799b253998a 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -757,6 +757,8 @@ struct mptcp_pm_addr_entry { struct socket *lsk; }; =20 +int mptcp_pm_parse_addr(struct nlattr *attr, struct genl_info *info, + struct mptcp_addr_info *addr); int mptcp_pm_parse_entry(struct nlattr *attr, struct genl_info *info, bool require_family, struct mptcp_pm_addr_entry *entry); @@ -811,6 +813,8 @@ int mptcp_userspace_pm_append_new_local_addr(struct mpt= cp_sock *msk, void mptcp_free_local_addr_list(struct mptcp_sock *msk); int mptcp_nl_cmd_announce(struct sk_buff *skb, struct genl_info *info); int mptcp_nl_cmd_remove(struct sk_buff *skb, struct genl_info *info); +int mptcp_nl_cmd_sf_create(struct sk_buff *skb, struct genl_info *info); +int mptcp_nl_cmd_sf_destroy(struct sk_buff *skb, struct genl_info *info); =20 void mptcp_event(enum mptcp_event_type type, const struct mptcp_sock *msk, const struct sock *ssk, gfp_t gfp); --=20 2.31.1 From nobody Tue Apr 30 06:32:02 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:1788:b0:4ac:5e5b:1ad1 with SMTP id y8csp1138757piq; Wed, 6 Apr 2022 19:43:09 -0700 (PDT) X-Google-Smtp-Source: ABdhPJz+QIfrRUSINMxbOxjxYMFWhBnqLiJzNCz4jRAJWEhWxVrXhZBK0ToSviXpOWzTfyBytRUA X-Received: by 2002:a17:907:3e0b:b0:6df:cc38:ffeb with SMTP id hp11-20020a1709073e0b00b006dfcc38ffebmr10986913ejc.263.1649299389402; Wed, 06 Apr 2022 19:43:09 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1649299389; cv=none; d=google.com; s=arc-20160816; b=F6egNfx2gK/8d9uEaKKh+x25N4XW0RrJ6M4d2zGDGJOifhoBjPvoVhqeGz5wpt9cas IfS2JgPmgJ5SSHSRYC5Z6R+CR2yR/JFK7adXwRiili9I3DtbsavUvWRBf9iKk4A5URoy Zqwj9HSxeS/Cyl0iD38wmvpHwTv2YJvSwF5zsxmiHm/i0KnPYWVePrTt0R0DXWzkIJ/p pkqBxqZpVjB6PHF+MCKqBjFgYIdJNoP+fD4NIWlgZl/vSkN0bZPcdlvZNGjfhLT/VxqZ qEjT8Yl6943ZeX35sFaQaPaHlBfMEm/Wh8cPvNWtNulvlOKHPmyvNBGSuYT6zeLqlJ3C lY4w== 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=fHm+vToiD+cwzPoiZzx3w+yzWnrsk2CTjg4FyvXJHZK/fW3lgAMIFRU7FQ7xTnmfTI wcczKVl8VzaN4wxuz0nu7u/EEPaH137PCgVnxsQnYJNO1PiWK2mEhJEEQIs3i5qfWqxP dZibjGgn2FisZF/DG8CFK1LX/Lr7yZU3xi8VAdoVSgsHO9a4+lPZ4GCQr7vSBuCRy0d6 lwT5qVW1XX/wS1BeLmevRfhselQj4nRBJsAzKADqzMXvION8PBM+E6f3ZMPpJAEXL+2a iepoR4XLIMfAAvhM/fw5M/IkYCpmb6wmzKuMKRmuWwAZzOOT6sfypQsrDWLpBT7MebFP 3BCw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=cAQl+PTp; spf=pass (google.com: domain of mptcp+bounces-4632-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-4632-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 b2-20020a50be82000000b00418c2b5bde1si12677750edk.195.2022.04.06.19.43.09 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 06 Apr 2022 19:43:09 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-4632-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=cAQl+PTp; spf=pass (google.com: domain of mptcp+bounces-4632-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-4632-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 EB05B1C0F10 for ; Thu, 7 Apr 2022 02:43:07 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 5D56E20EA; Thu, 7 Apr 2022 02:43:03 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) (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 F232B20EF for ; Thu, 7 Apr 2022 02:43:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1649299381; x=1680835381; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=+rECdyQd8y0br4SUS01z9OTNvgvoP6peEX2mLurHiq0=; b=cAQl+PTpFrdYVgwBuk/2Fzy8WW/xg0VPPXUbU6vL1Oa1MNYIJ/OV0CZ6 8JQ5Ow9lUqrQNYR2dW+lU443H0qhx7I2Tnh3ybrFQEj4saf+qrNWdkMHE PdNqWlEcnnqytOcB7o3P3m0YA67dh/n9gWkYr7jvbrs6E5R8gXYVbtpT3 hZ9Z59H4L/ExSCVyfzNNxYYEQoA9gqc4x5E/X4/IrsReNk3MdEasOt9RR aNoeLsJeVUWElrO4fgGaOUYv0teiuG6DOBwDd59iC1KVXMunDs+E0I6Lf jXRabdHoTTA2QLH7G/qsbn/ooWMvYOcqBbl6+eKUUef1QKUoF47ir4QEd g==; X-IronPort-AV: E=McAfee;i="6200,9189,10309"; a="261390127" X-IronPort-AV: E=Sophos;i="5.90,241,1643702400"; d="scan'208";a="261390127" Received: from orsmga004.jf.intel.com ([10.7.209.38]) by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Apr 2022 19:42:48 -0700 X-IronPort-AV: E=Sophos;i="5.90,241,1643702400"; d="scan'208";a="658882211" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Apr 2022 19:42:47 -0700 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v7 10/14] selftests: mptcp: support MPTCP_PM_CMD_SUBFLOW_CREATE Date: Wed, 6 Apr 2022 22:42:37 -0400 Message-Id: <20220407024241.1757334-11-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220407024241.1757334-1-kishen.maloor@intel.com> References: <20220407024241.1757334-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 Tue Apr 30 06:32:02 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:1788:b0:4ac:5e5b:1ad1 with SMTP id y8csp1138718piq; Wed, 6 Apr 2022 19:43:03 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzpXhFQY3IBuPgIMdXMnNUqzo3Um2BQJ2jUf9iSaf57wRiQNesx4TWInSD1oK5Ds8Dsq/yw X-Received: by 2002:a17:90a:c504:b0:1bf:6d9f:65a6 with SMTP id k4-20020a17090ac50400b001bf6d9f65a6mr13232232pjt.204.1649299383089; Wed, 06 Apr 2022 19:43:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1649299383; cv=none; d=google.com; s=arc-20160816; b=sosfByt/gIVKwhk4ghUO99nYG43EMZs5lw7nSKIAbNgExMv0IibnvywdghmSf3wZjc M0ycC6Rf6GDtxaqktjgkwZzk2ylaxQcKnlazs68B49bqFS/ebBA9rBNmgo0TQmmf57+K l9mK2UizOxctdQSIW6cVeRHw+pK2ia1whTmSUit+tb+v8iEOX3aBQqJy/qcIFF+f5KoP /kudNPyHypBfwjrFW50mmidrZfclyPaRqo1QG7IzyguUtnDsWBdeujknR64ANOGGOCyX wdIeUWIo//O8roTalglvjt8InsTKsRONK95xC7GgLpelhYHyLjMYMA1pPXlwgZ+5zRj/ Uzrg== 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=RvXxGHOQFziWJWnlSIrsQvvPx3XAJl7BWE+iydbuZIU1KJL7UKLLxEw44vnKU2pRpI GydXROB/LWv0FMBygxb+gKp+tYZO/lB8gCAjEz/iiBtdyKEUVF3yyviOTbtZbHYRTBAl /4yfgdm0N9oQNbv1Ekx3qhos/x8E+9vM6sAk0Aaaag1p2M2A5o0pxKrI3aBNPvO1dP8L RyAOpOam0T4dYDMCk9wP1dHgSVYlgwU8WrHC80VGkscdltEEUifzO7xb3WoYSl8MLsMM X3Vu57KOVjMUTLMXIKQm3nRYwrP0YAtGW515vXstJx7x8pHrK1DPZKtEwn4h2CRqnC6R lPZQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=ZOAOMlkI; spf=pass (google.com: domain of mptcp+bounces-4627-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-4627-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 q10-20020a056a00088a00b004faaaf135b9si18815454pfj.345.2022.04.06.19.43.03 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 06 Apr 2022 19:43:03 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-4627-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=ZOAOMlkI; spf=pass (google.com: domain of mptcp+bounces-4627-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-4627-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 AA9093E00DF for ; Thu, 7 Apr 2022 02:43:01 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 7422920F4; Thu, 7 Apr 2022 02:42:55 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) (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 08DFB20EB for ; Thu, 7 Apr 2022 02:42:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1649299374; x=1680835374; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=+o04xQLPfR6ph1mrN9TOLw9IIeTZ0vtmCqoGxs1NsH0=; b=ZOAOMlkIR1go3L32zVIzHXb9AEIbz/iyJR9ggq8IuVlQSJUu7LNFnVEG yZm4gVRiwYOj++Sar6nHu0/tB/K6xG0/ZaG7C12P/xjc072HXgpN0071U NYpR0HuHsMQGHfCeYL/Xzf88Ay2EYfWRPFa4VbGtfI+9fFWMGY9eJ7jhg vmw4EMksJ108e49p3Ese/KuesalZ0TaEwukqar6eJDKjpNqQMyKZheNEg IXs4pN6x1vLMU7Dt+d9NK3JLdYiOUkHE5tFxvvdEoRhDEhbhqRVxfHCfk 2xf+lptUg/O8FTlAsAoFAHvbzKHgm3KTkCNBoxaMyew8JjWUL5orEgy3O w==; X-IronPort-AV: E=McAfee;i="6200,9189,10309"; a="286189750" X-IronPort-AV: E=Sophos;i="5.90,241,1643702400"; d="scan'208";a="286189750" Received: from orsmga004.jf.intel.com ([10.7.209.38]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Apr 2022 19:42:48 -0700 X-IronPort-AV: E=Sophos;i="5.90,241,1643702400"; d="scan'208";a="658882214" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Apr 2022 19:42:47 -0700 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v7 11/14] selftests: mptcp: support MPTCP_PM_CMD_SUBFLOW_DESTROY Date: Wed, 6 Apr 2022 22:42:38 -0400 Message-Id: <20220407024241.1757334-12-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220407024241.1757334-1-kishen.maloor@intel.com> References: <20220407024241.1757334-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 Tue Apr 30 06:32:02 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:1788:b0:4ac:5e5b:1ad1 with SMTP id y8csp1138720piq; Wed, 6 Apr 2022 19:43:03 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxzB85zI16uGfLJfiI+1DQxYRckPhSu8IJQzD6VQZRdB8mk535bHhqSKY4/YJUhOw6HYpR+ X-Received: by 2002:a05:6a00:2908:b0:4fa:9297:f631 with SMTP id cg8-20020a056a00290800b004fa9297f631mr11989653pfb.3.1649299383138; Wed, 06 Apr 2022 19:43:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1649299383; cv=none; d=google.com; s=arc-20160816; b=LFNtuW7xEDq4ugklZDIoQuKxzV+ylq0f9ojZePvb9/Fuy+316o2V0S+qSX/KmNn2O9 nkCOwZ6BncPc5zp+Z1JYOvWun0DVCnqsF48WeYIKShi3CT+1YJ0RHszNxswkCKxm8tzo FRIZv5suFVMETRPaUxRIG/YMjKyKwIH68V0MPSRkie4Omh61TRMF8DGksan44Q/KeKy5 RCLAXyh+RmjQ8ZFUMQgF4vAUn1RviSxJRYX3ZDVDw065ftyzJlimfAjqIhMNWjphna8/ 9KCE8mgHIN/of+/AI6c82NIGqDtdifF330bu6HoXMm15yzpOTninwwS0iFrXoMAlAh0+ yjJQ== 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=g7Ljo+2lPSrkCbVjqoCIzFtZ5+gpGHCNxRFxIVqD2syCImtD0CDID/0QUIgUhmXp6o 5GcPS76ULEhiPoAsdn42oGl02/TxbQ0bOVb1EZvDunSwEKtFtXHhv/55QE/7vnMaZEZR fX1vmpCPcPZhOd0NRlgzOMQax5Xu3nPwBuj3VdXzdo6Qj3m7sBXLOUlGTVAMU6w80rNo Tw9Z9RhfFT6+LvNNN+Axy+0+Q3ZNerO9TKlfV1QU+6K+DpdXpYyYiGLlketntJIFYwTe 7GzG/dWFdqyZWhwY4tycWAcxUNQ992mO7g0rDZwcNYqEa3Agm4qvywnlw0B4zkFZJyfP icLA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b="BU8a/cSg"; spf=pass (google.com: domain of mptcp+bounces-4628-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-4628-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 e29-20020a63371d000000b003816043efd6si17471644pga.459.2022.04.06.19.43.03 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 06 Apr 2022 19:43:03 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-4628-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="BU8a/cSg"; spf=pass (google.com: domain of mptcp+bounces-4628-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.69.165 as permitted sender) smtp.mailfrom="mptcp+bounces-4628-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 E4B9C3E0FDC for ; Thu, 7 Apr 2022 02:43:02 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 552B220EB; Thu, 7 Apr 2022 02:42:56 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) (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 04FD720F0 for ; Thu, 7 Apr 2022 02:42:54 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1649299375; x=1680835375; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=XfrMc4C9KslLyFbMwlZ3zV5PCfirWg7R8gW3MiTD9Fo=; b=BU8a/cSgdY18ZrK187Gs4JZufktZW4rwCbloatgqmuU4QK/gjq7J0hxv dqML90NpxWYHsG7D+Y6nsSdE0nsv+omqKH0OzGMGfBlaWOxohL+ZSKqcy 6OFAjm8h3jPJWAz+LJ+7fImzJZXWga4ZfVuz/2k4VU63/vyUAspNflFVH 4ONmcOV3aHpZGJ+lmRYUB3KMjxtIdO/7CJt38+I74ECYvf6/g106YZUKK XLrEzV3271/jt1f2ZvCimw/T7DfoVF77RCF71pYuOc2cJ6cD1q+HsUvSh mGsFj/f+Gi4oxuUTqv/yGswT1aqp2s/63xO2jS/1P6VQNimxqkfFtikYu g==; X-IronPort-AV: E=McAfee;i="6200,9189,10309"; a="286189751" X-IronPort-AV: E=Sophos;i="5.90,241,1643702400"; d="scan'208";a="286189751" Received: from orsmga004.jf.intel.com ([10.7.209.38]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Apr 2022 19:42:48 -0700 X-IronPort-AV: E=Sophos;i="5.90,241,1643702400"; d="scan'208";a="658882217" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Apr 2022 19:42:47 -0700 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v7 12/14] selftests: mptcp: capture netlink events Date: Wed, 6 Apr 2022 22:42:39 -0400 Message-Id: <20220407024241.1757334-13-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220407024241.1757334-1-kishen.maloor@intel.com> References: <20220407024241.1757334-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 Tue Apr 30 06:32:02 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:1788:b0:4ac:5e5b:1ad1 with SMTP id y8csp1138736piq; Wed, 6 Apr 2022 19:43:06 -0700 (PDT) X-Google-Smtp-Source: ABdhPJw0JmNqdliHYQ/YdqmLsxXRyGNkadaO7HO/C3VmoQpkle8Cw+dgO1QQFEgpwVe1JYS758XG X-Received: by 2002:a17:90a:af8f:b0:1ca:7bce:ce3b with SMTP id w15-20020a17090aaf8f00b001ca7bcece3bmr13484025pjq.224.1649299385839; Wed, 06 Apr 2022 19:43:05 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1649299385; cv=none; d=google.com; s=arc-20160816; b=oKY+2JyYKWyCIdYg1GD3g1V0nSvxFk30e1UlnVogbMuob8sGzrlEDamFVwEgpZzx+c WpfvB2KEZYXoWO7C5wl5eZafr+aqBngmOIXR6ZCHuLBCGiRJjyYywpqxtLpyUKSwwKDr +/vr55Ux9SS6eHXEKEq41PMU0Lf7pztQKyTDX+wepTb/nmRvFN14hKuTXju3KVakQ8ns p0Xi4racPHTgD6737PJESp2Oe/aSeYERjXo5Bqyx10fMzKFJg/J/hjldzLdWkHwEvBGR ba4YltEIG+LMarQHaCktmVerNL9OhVoOyEG+dRYP0huCQ00HRxifo+BvTxzkOBgkKz0S ahAw== 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=F2wtIAyp1wEbBgS62QwYJaJJhh/xOip4FV9iHS0CeiuX/UJZYO/HDXJ6Sbs1739B3e wp4+QkJX+pAwx7gZrYAqI32SwwraiJ5n3a0zfxdW2O2NXHLbXkT+UxE68jmgzoIkxwIb dtLNIjTN+hcuWT2ib4dzZybxeySmyQLLESSMETysUwqC6yRyymVgEEWznTq1UJ4e26UI KKLQmgyzkHaJsUFmt8U7qeptP8nLnJVFFIkLMaw1x7j8EUUkUdNx024OqHOcTDiQQjDz Tnuu9KBidP93jzb3RqDsumN+nSgQ+Hm7gZ0+FrCDxfPyveP+nRBonKMuOLK/OuIu3/bB gXZA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=J9iYqnMV; spf=pass (google.com: domain of mptcp+bounces-4630-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-4630-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 j1-20020aa78001000000b004fa852292b0si15246759pfi.308.2022.04.06.19.43.05 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 06 Apr 2022 19:43:05 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-4630-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=J9iYqnMV; spf=pass (google.com: domain of mptcp+bounces-4630-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1000:8100::1 as permitted sender) smtp.mailfrom="mptcp+bounces-4630-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 74D063E100A for ; Thu, 7 Apr 2022 02:43:05 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 8AE4C20EE; Thu, 7 Apr 2022 02:43:01 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) (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 EDC5720EA for ; Thu, 7 Apr 2022 02:42:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1649299379; x=1680835379; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=tfzehsJBmGdChZMPc0RL5lKqpr+R150YHyu/cK7Z6gI=; b=J9iYqnMVjZNKKzjZ94yDcWwXS8UcB8g2WWnTBrnxsbipGPedP+0le6Ar 7aYJR9ZLheA07vr7puuUiJKP4GY0RV5p1TCmOzt0cjNiBVSxfQsrSaofj WmuP0Ei7xpe3iqi72MOe3V9aBjRDwGJWJyYjK369wp6/bZ4DMuMK77jfh /UrmKHs7TV0P7FyXljf+87IEgqnpyKlJxTSZ0vsO5CmVuWYdqQCs4CX5D tBoHBb4+ptplY9P2nAYLQ18YrxhJMj/3+XYO76jyNBsTMG3idVsKxJGKr BpKWlkQdYLyTdSqFyRKRmXaiMMxFTukpdJRSsVMsNOAa9fjCmX5Bu60rq A==; X-IronPort-AV: E=McAfee;i="6200,9189,10309"; a="261390130" X-IronPort-AV: E=Sophos;i="5.90,241,1643702400"; d="scan'208";a="261390130" Received: from orsmga004.jf.intel.com ([10.7.209.38]) by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Apr 2022 19:42:48 -0700 X-IronPort-AV: E=Sophos;i="5.90,241,1643702400"; d="scan'208";a="658882221" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Apr 2022 19:42:47 -0700 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v7 13/14] selftests: mptcp: create listeners to receive MPJs Date: Wed, 6 Apr 2022 22:42:40 -0400 Message-Id: <20220407024241.1757334-14-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220407024241.1757334-1-kishen.maloor@intel.com> References: <20220407024241.1757334-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 Tue Apr 30 06:32:02 2024 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6a06:1788:b0:4ac:5e5b:1ad1 with SMTP id y8csp1138729piq; Wed, 6 Apr 2022 19:43:05 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxSoWbUMRBo1zm2LsBjigo+2N5y8Phtt5c9B45GD4R5HzhAJotxdg7haZ4KdoB1fS4jn+84 X-Received: by 2002:a17:906:6a17:b0:6e1:13c3:e35c with SMTP id qw23-20020a1709066a1700b006e113c3e35cmr11555173ejc.760.1649299385040; Wed, 06 Apr 2022 19:43:05 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1649299385; cv=none; d=google.com; s=arc-20160816; b=esA1msoHoexXHHI60kR/5zB9UNsa1h9ixGBnKqlUUbMlBBi6GVScZFKTPWNGhX53ww AMY3NNjmQP6qrYoc8v8eHTp2tiPbJIespiBF5dYPP0OeF2g3bXnJ6HmfleVoWAhYW8/M 2EuHaZXhGCUwMbBFfO84L0vcNIrHJZsGytIdKNA6HzIyz59tlxd/yYE0LJipL6ljGn8M M44wTXsd5o4LRj9OYZTLA25B3Gvl2jrjIMVyoY497MHEQ3llSQLNKy3kKqpWW9r3e2oU WqeEteLE+HN1dXsRkR9J8jDdriaJcpl/enjgEoLsjyvM7KfBpPiRFH9ziqXNhEamyZek SOsw== 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=W6J6MSL09bCYcLCB2YIlICAtoE4woMNq+zo1MCDzo+CpxAGqyyn5OdnjdOJwX+MRin o2DxHj/BW254AiXHbVd9fy1T4xoXwx6AZqrXtbS7oCEaQwWPodi3MRU0UKFnTd0zT/FA wjR9Ec9vVP4tMBYMltG8sdzSj5X8bTC9pIGEofHXglcaH2NG4KBh6BHRFsUkR+/Lf0/F vDCp8ukeeEdGBOK5+p4Iaw+U0/JVYNIyT0oLH2x/gWVPVOU6z2cAahPI4S5MnNOl7gbl Kl+fiV/rQsz/pZZbYc0uA/OCkuhCex8ihXiMJXQZsS4eOKpXkPmlYXO8CUvCxTPlxnD6 ESSw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=hEVmYcLW; spf=pass (google.com: domain of mptcp+bounces-4629-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-4629-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 i6-20020a50cfc6000000b00418f13e9795si13041965edk.166.2022.04.06.19.43.04 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Wed, 06 Apr 2022 19:43:05 -0700 (PDT) Received-SPF: pass (google.com: domain of mptcp+bounces-4629-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=hEVmYcLW; spf=pass (google.com: domain of mptcp+bounces-4629-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 147.75.197.195 as permitted sender) smtp.mailfrom="mptcp+bounces-4629-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 759BA1C0EF3 for ; Thu, 7 Apr 2022 02:43:04 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 382F620EC; Thu, 7 Apr 2022 02:42:57 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) (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 1FC4F20EF for ; Thu, 7 Apr 2022 02:42:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1649299375; x=1680835375; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=xixavrOsJ6p/bpiJ3v73HbDTSkgWLluBSstFIZyzxFM=; b=hEVmYcLWjyQPaxgvaQ/I4Qre6O7aV+kJvE+rKHpcpWTLqbPd1V8TRRju 0eqqKRJsx3yoeUrfAILT6pCrdx4mUZhLg7nhq5bTMo6oYjjVebd594V6n f0T3mUN1oKtWM4Vk5ncNoLkH+lMdau5jOI9yD8pXzo0FcaTD1c3n9LY8H UCAcMXs6PU1AYS+jaO2R8F7tjpZQ3s10wzGJHaJr2D73PV56PdXMvw7vt aNVMMg5UYKQ0SvQ2wYDfRINMQWt86vuL4FSvOrcgG2ReGse4iPJTE+aa1 w/OPjr5RBm3o66etfLAY2q/N7enfJGcsK0iDP8yjXFi4wKXFdpsypYhFm g==; X-IronPort-AV: E=McAfee;i="6200,9189,10309"; a="286189752" X-IronPort-AV: E=Sophos;i="5.90,241,1643702400"; d="scan'208";a="286189752" Received: from orsmga004.jf.intel.com ([10.7.209.38]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Apr 2022 19:42:48 -0700 X-IronPort-AV: E=Sophos;i="5.90,241,1643702400"; d="scan'208";a="658882224" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga004-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Apr 2022 19:42:47 -0700 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v7 14/14] selftests: mptcp: functional tests for the userspace PM type Date: Wed, 6 Apr 2022 22:42:41 -0400 Message-Id: <20220407024241.1757334-15-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220407024241.1757334-1-kishen.maloor@intel.com> References: <20220407024241.1757334-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