From nobody Mon Feb 9 09:32:42 2026 Delivered-To: wpasupplicant.patchew@gmail.com Received: by 2002:a05:6638:2248:0:0:0:0 with SMTP id m8csp375749jas; Thu, 27 Jan 2022 16:38:53 -0800 (PST) X-Google-Smtp-Source: ABdhPJyZYbdh6SrfRk9EeEiTMOuuGoTxKiM+zltUDqqirfQAgmy2aG9WarWKeBMYiCk2hXEh78hp X-Received: by 2002:a65:45cf:: with SMTP id m15mr4633766pgr.84.1643330332937; Thu, 27 Jan 2022 16:38:52 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1643330332; cv=none; d=google.com; s=arc-20160816; b=KZLqK/LaxvtI3Pv0awQGRgi/F7UQUFnTOJxYfbcl00BU92Eo9g7aYT9ctluHEWa2YB nR1Dzo9e5LiVG549jr/3UemvE3TT4uz+zT8xPcrJoplSzBvZmg3I2PY8oMc0K6tva7Vu La8s2AEGXwrkfjdHGcWgZZUnbH2NsPowZBBshedp8m7tfzdHeZDV5X3Yk0zz+RmpJTsz V4EoHiUTrX3lJlI0A1fhs3lEjstSP9oQ3lQvsqMe9YZHvArKYQwCIQGDm5lENYR4d819 ASPCL8yVJSDPHRTtzquC/BKkdHvuMbnT8e/vOS2SqdlEUDz1RobhbsT5jdajG1QqRJiU f57Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=content-transfer-encoding:mime-version:list-unsubscribe :list-subscribe:list-id:precedence:references:in-reply-to:message-id :date:subject:to:from:dkim-signature; bh=CGCaQ8+WCHNfd86VyPppEBAy0kHKus+TT3/aYoSZ77Y=; b=L0G6cASpEns/4gOQVB1ahZL0jtARxTnVtW+qznlgZwEZg4IHmWhmhIFqtBLviEXV1p j5EVuUU1sZuJ3YbG4FcjENqDTt091UtvTqtYBXT1lrkpGbhTLyRHr4Ij5I3eWFiUlp2g bs0/176oh2CS7lYCKwrSb6WjS5c8XkuwAsXWQn4JNmDHseVA09rW2CUcgk2MrxfjV+z1 i5Z+voTlzjuJhnuMMJTJsnL90OauZJn/8zhzJE3vhgxoK1HsJ/M1xjUrdsAjjeF2QPP5 OfQJNNVnnHRY7yzwLIRPvh0UDZ+pcuweYzIc+sKsnahG+V6IXHTeX7i6bFpBBlXaS+BD nesw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=EGERoqDC; spf=pass (google.com: domain of mptcp+bounces-3343-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3343-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from ewr.edge.kernel.org (ewr.edge.kernel.org. [2604:1380:1:3600::1]) by mx.google.com with ESMTPS id 11si3523250pgx.754.2022.01.27.16.38.52 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Thu, 27 Jan 2022 16:38:52 -0800 (PST) Received-SPF: pass (google.com: domain of mptcp+bounces-3343-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) client-ip=2604:1380:1:3600::1; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b=EGERoqDC; spf=pass (google.com: domain of mptcp+bounces-3343-wpasupplicant.patchew=gmail.com@lists.linux.dev designates 2604:1380:1:3600::1 as permitted sender) smtp.mailfrom="mptcp+bounces-3343-wpasupplicant.patchew=gmail.com@lists.linux.dev"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from smtp.subspace.kernel.org (wormhole.subspace.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ewr.edge.kernel.org (Postfix) with ESMTPS id 5DC931C0F21 for ; Fri, 28 Jan 2022 00:38:52 +0000 (UTC) Received: from localhost.localdomain (localhost.localdomain [127.0.0.1]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 337F32CA6; Fri, 28 Jan 2022 00:38:47 +0000 (UTC) X-Original-To: mptcp@lists.linux.dev Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8FFA02CAE for ; Fri, 28 Jan 2022 00:38:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1643330325; x=1674866325; h=from:to:subject:date:message-id:in-reply-to:references: mime-version:content-transfer-encoding; bh=nGeG430NBJeF9Y+vsoUaxacWf29cVhQeW2t6F+8m2pc=; b=EGERoqDCJvTaLE9i+La5rQ91CgRhcfleJOYgYI+pXkKZ1rbBWKsAGWlq S0DbxZuvdFxrkuX0noUEQs0Agm3mNHPsPfn6aX1C+BkUwHPNi1ekmq+YO pvTm6zQ3tRUxyc5BrALjsbw8nxsi6dO5rqqabnacPYR83bEKKih6TQRCR T+3l7lIqJLLXS722KuRJJ5JA52E8g0oykP0fRujQ5Eh9xNDiqfQtm7QM1 yuXW2yu8n5qBK+l4hSfoSPNpChpakwAuBukQHKkTx7/VNnyP2eMS7U+AJ ExxkA/QLloXad8TQuio0J4pmp91iOZt3wim1mhRLzUkHAWTZ9IBm4uu1i Q==; X-IronPort-AV: E=McAfee;i="6200,9189,10239"; a="333358332" X-IronPort-AV: E=Sophos;i="5.88,322,1635231600"; d="scan'208";a="333358332" Received: from orsmga006.jf.intel.com ([10.7.209.51]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Jan 2022 16:38:42 -0800 X-IronPort-AV: E=Sophos;i="5.88,322,1635231600"; d="scan'208";a="480527112" Received: from otc-tsn-4.jf.intel.com ([10.23.153.135]) by orsmga006-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Jan 2022 16:38:41 -0800 From: Kishen Maloor To: kishen.maloor@intel.com, mptcp@lists.linux.dev Subject: [PATCH mptcp-next v3 03/14] mptcp: handle local addrs announced by userspace PMs Date: Thu, 27 Jan 2022 19:38:25 -0500 Message-Id: <20220128003836.2732694-4-kishen.maloor@intel.com> X-Mailer: git-send-email 2.31.1 In-Reply-To: <20220128003836.2732694-1-kishen.maloor@intel.com> References: <20220128003836.2732694-1-kishen.maloor@intel.com> Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This change adds a new internal function to store/retrieve local addrs announced by userspace PM implementations to/from its kernel context. The function captures the requirements of three scenarios: 1) ADD_ADDR announcements (which require that a local id be provided), 2) retrieving the local id associated with an address, also where one may need to be assigned, and 3) reissuance of ADD_ADDRs when there's a successful match of addr/id. The list of all stored local addr entries is held under the MPTCP sock structure. This list, if not released by the REMOVE_ADDR flow is freed while the sock is destructed. Additionally, this function enforces the kernel imposed limit on the number of local addresses that may be used over a connection. Signed-off-by: Kishen Maloor --- v3: incorporate the new sysctl configurable limit on the # of local addresses that may be populated by userspace PMs --- net/mptcp/pm_netlink.c | 88 ++++++++++++++++++++++++++++++++++++++++++ net/mptcp/protocol.c | 2 + net/mptcp/protocol.h | 2 + 3 files changed, 92 insertions(+) diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c index 726dc0a56fca..ebec3610bb38 100644 --- a/net/mptcp/pm_netlink.c +++ b/net/mptcp/pm_netlink.c @@ -511,6 +511,34 @@ static bool mptcp_pm_alloc_anno_list(struct mptcp_sock= *msk, return true; } =20 +void mptcp_free_local_addr_list(struct mptcp_sock *msk) +{ + struct mptcp_pm_addr_entry *entry, *tmp; + struct sock *sk =3D (struct sock *)msk; + struct pm_nl_pernet *pernet; + LIST_HEAD(free_list); + + if (READ_ONCE(msk->pm.pm_type) =3D=3D MPTCP_PM_TYPE_KERNEL) + return; + + pernet =3D net_generic(sock_net(sk), pm_nl_pernet_id); + + pr_debug("msk=3D%p", msk); + + mptcp_data_lock(sk); + list_splice_init(&msk->local_addr_list, &free_list); + spin_lock_bh(&msk->pm.lock); + msk->pm.local_addr_used =3D 0; + spin_unlock_bh(&msk->pm.lock); + mptcp_data_unlock(sk); + + list_for_each_entry_safe(entry, tmp, &free_list, list) { + if (entry->lsk_ref) + lsk_list_release(pernet, entry->lsk_ref); + kfree(entry); + } +} + void mptcp_pm_free_anno_list(struct mptcp_sock *msk) { struct mptcp_pm_add_entry *entry, *tmp; @@ -1007,6 +1035,66 @@ static bool address_use_port(struct mptcp_pm_addr_en= try *entry) MPTCP_PM_ADDR_FLAG_SIGNAL; } =20 +static int mptcp_userspace_pm_append_new_local_addr(struct mptcp_sock *msk, + struct mptcp_pm_addr_entry *entry) +{ + DECLARE_BITMAP(id_bitmap, MPTCP_PM_MAX_ADDR_ID + 1); + struct mptcp_pm_addr_entry *match =3D NULL; + struct sock *sk =3D (struct sock *)msk; + struct mptcp_pm_addr_entry *e; + bool addr_match =3D false; + bool id_match =3D false; + int ret =3D -EINVAL; + + bitmap_zero(id_bitmap, MPTCP_PM_MAX_ADDR_ID + 1); + + mptcp_data_lock(sk); + list_for_each_entry(e, &msk->local_addr_list, list) { + addr_match =3D addresses_equal(&e->addr, &entry->addr, true); + if (addr_match && entry->addr.id =3D=3D 0) + entry->addr.id =3D e->addr.id; + id_match =3D (e->addr.id =3D=3D entry->addr.id); + if (addr_match && id_match) { + match =3D e; + break; + } else if (addr_match || id_match) { + break; + } + __set_bit(e->addr.id, id_bitmap); + } + + if (!match && !addr_match && !id_match) { + spin_lock_bh(&msk->pm.lock); + if (msk->pm.local_addr_used < + mptcp_get_userspace_pm_local_addr_max(sock_net(sk))) { + e =3D kmalloc(sizeof(*e), GFP_ATOMIC); + if (!e) { + mptcp_data_unlock(sk); + return -ENOMEM; + } + + *e =3D *entry; + if (!e->addr.id) + e->addr.id =3D find_next_zero_bit(id_bitmap, + MPTCP_PM_MAX_ADDR_ID + 1, + 1); + list_add_tail_rcu(&e->list, &msk->local_addr_list); + ++msk->pm.local_addr_used; + ret =3D e->addr.id; + + if (e->lsk_ref && e->addr.port) + lsk_list_add_ref(e->lsk_ref); + } + spin_unlock_bh(&msk->pm.lock); + } else if (match) { + ret =3D entry->addr.id; + } + + mptcp_data_unlock(sk); + + return ret; +} + static int mptcp_pm_nl_append_new_local_addr(struct pm_nl_pernet *pernet, struct mptcp_pm_addr_entry *entry) { diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 7c591177c3e8..82b4f9b76f42 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -2540,6 +2540,7 @@ static int __mptcp_init_sock(struct sock *sk) INIT_LIST_HEAD(&msk->conn_list); INIT_LIST_HEAD(&msk->join_list); INIT_LIST_HEAD(&msk->rtx_queue); + INIT_LIST_HEAD(&msk->local_addr_list); INIT_WORK(&msk->work, mptcp_worker); __skb_queue_head_init(&msk->receive_queue); msk->out_of_order_queue =3D RB_ROOT; @@ -3036,6 +3037,7 @@ void mptcp_destroy_common(struct mptcp_sock *msk) msk->rmem_fwd_alloc =3D 0; mptcp_token_destroy(msk); mptcp_pm_free_anno_list(msk); + mptcp_free_local_addr_list(msk); } =20 static void mptcp_destroy(struct sock *sk) diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index 6cfa8ec26482..dbf0c134e923 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -281,6 +281,7 @@ struct mptcp_sock { struct sk_buff_head receive_queue; struct list_head conn_list; struct list_head rtx_queue; + struct list_head local_addr_list; struct mptcp_data_frag *first_pending; struct list_head join_list; struct socket *subflow; /* outgoing connect/listener/!mp_capable */ @@ -733,6 +734,7 @@ struct mptcp_sock *mptcp_token_get_sock(struct net *net= , u32 token); struct mptcp_sock *mptcp_token_iter_next(const struct net *net, long *s_sl= ot, long *s_num); void mptcp_token_destroy(struct mptcp_sock *msk); +void mptcp_free_local_addr_list(struct mptcp_sock *msk); =20 void mptcp_crypto_key_sha(u64 key, u32 *token, u64 *idsn); =20 --=20 2.31.1