From nobody Fri Sep 25 08:48:16 2026 Received: from lahtoruutu.iki.fi (lahtoruutu.iki.fi [185.185.170.37]) (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 A4AC043B3E5; Tue, 15 Sep 2026 05:43:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=185.185.170.37 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789450986; cv=pass; b=QQmtsUce/Z8WfLj8HyQMANEPnkbOtxM3IGqDJ5QUDF4cWTRE8OpfFWRIMqGC7raFdiG/3H4bXbeS3w0a0/NZhGNK2lAUZWlzLOlU495M4EI8rJI/yD8NcS/9FCPS70SfK9Lo952poYwpfC4BT4v0WY5V8d2lBHduHhxQE3x8s/I= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789450986; c=relaxed/simple; bh=lN9Z+R4oJGg98pVm3ppUYq8vWMoG9vejqZZ48d9Ap98=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=tO8Y59NKC6MCG6BAGbH1UXnK6Lm9Va5WowLHqTwmVJktDwrIf91MXfJAVV3Rdcc4WTq+V1uPQWZOpILo4UPTn9Jom99zuIE2GZs6VERUsafWm5LBMQCdbOydw9B3C5MzYwYd9ur9muVIMJyjdhuiGtTXPEHjT+n85AW8U4K4sN4= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi; spf=pass smtp.mailfrom=iki.fi; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b=sVHeiaGN; arc=pass smtp.client-ip=185.185.170.37 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=iki.fi Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b="sVHeiaGN" Received: from mandelbrot.. (xdsl-83-150-90-33.nebulazone.fi [83.150.90.33]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: jmtilli) by lahtoruutu.iki.fi (Postfix) with ESMTPSA id 4hkWBn3tycz49Q7r; Tue, 15 Sep 2026 08:42:57 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1789450977; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=k7bP4h3nh+VyKYPNxK0hdRhYNw+iBe49qjBNv0hFLYQ=; b=sVHeiaGNP/zfL3gH363vJRvDq90DwuN9l+zVWA0twfnl93qerSbF1eBz6+TVExVqznyEwO wWyF/gkubG6gmuvMCGUr/OuwcJ0vz16TqyBg1Ht/QLrpfRaULmdcQEF8dpgVH+1kI3yU6X viH+sypet3ncVaBKbYDU2VAFiU5hiS9sgkRseB781lI8xLKF6+qyQXstpjYgPdc5ffjxVn vf/BkA1Itl0a4G919awMTJsZSLugoThM2C6wYtk9VaQN42SZ5TanuUWk6ZggwFzGRjKnv3 dRjXrzI3+yjlowDxOYLPWmJ+CEiphp9fzpDPI/Sx7NeDMrqoQVxg0ZAOBM0cpA== ARC-Seal: i=1; a=rsa-sha256; d=iki.fi; s=lahtoruutu; cv=none; t=1789450977; b=LXOw6gM/RjmY9glHWveRDqX6ZVrXcPJ96GalVXWSS0Vr3pbVYD6wmJAcTABqVmrS/bJC1x IkmHSevmC62TyKYtMf8U9dCIK0nM9FZnRvh+R9jgra+JewzeDDmsDkLZlj706rYkZTvGr1 wsLxAzernqx1Io0cszxW/1o37lMh/aWReoULEAt9VY2H9QZQaexSudh4Q+k5lR7+EXPAv8 /pieZSsU3RnZaX1o5JGs5OSY64xnsuhJi6Pr8YpDZS0mgwUEnZqko0BSc/i80vzFEHWtNZ 3BnPd24oWRuRXCltEiM6lK0gJFaHr86ojCQp388Qjet4QEpFumnNzt1VbfkFxw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1789450977; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=k7bP4h3nh+VyKYPNxK0hdRhYNw+iBe49qjBNv0hFLYQ=; b=KQX40qrRuWoD3Q0QRmFfJxJot+ew5iJWrrNwxOJoWcKD/YZ/wESWLcDuafqxMWmmF3oN6c 5QYa/k1AF/KJHg83U3NsNMbA1tOhgtL/F+hy3eGr0Se/8yMg0FqLizmMmYLIRnz/xZ668T KzXRtUqTm+mqFqBtDXyadm2373pa3d8mK2cAlMJtNznur+fGLJdlKCmgyiDLJYzT8Lw+0y HkCRBF9JsELq456sFeE2QaV3c9eNhzD2aza22uwFnf8AI/p3KAFAiCFcrNIoUKE9Pbdwg2 /ULM85nfIvi1mmenHGPZXljjLmZBaOfKhzan3Y/awyudzESnSGlWyjafrajveA== ARC-Authentication-Results: i=1; ORIGINATING; auth=pass smtp.auth=jmtilli smtp.mailfrom=juha-matti.tilli@iki.fi From: Juha-Matti Tilli To: Manivannan Sadhasivam , linux-arm-msm@vger.kernel.org Cc: Juha-Matti Tilli , Jeff Hugo , Jeff Johnson , Bjorn Andersson , Konrad Dybcio , Eric Dumazet , Kuniyuki Iwashima , Paolo Abeni , Willem de Bruijn , "David S. Miller" , Jakub Kicinski , Simon Horman , Mihai Moldovan , Denis Kenzior , Marcel Holtmann , Andy Gross , linux-kernel@vger.kernel.org, mhi@lists.linux.dev, linux-wireless@vger.kernel.org, ath11k@lists.infradead.org, ath12k@lists.infradead.org, netdev@vger.kernel.org Subject: [PATCH v7 01/15] net: qrtr: ns: validate msglen before ctrl_pkt use Date: Tue, 15 Sep 2026 08:41:53 +0300 Message-Id: <20260915054207.2513877-2-juha-matti.tilli@iki.fi> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260915054207.2513877-1-juha-matti.tilli@iki.fi> References: <20260915054207.2513877-1-juha-matti.tilli@iki.fi> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Denis Kenzior The qrtr_ctrl_pkt structure is currently accessed without checking if the received payload is large enough to hold the structure's fields. Add a check to ensure the payload length is sufficient. Signed-off-by: Denis Kenzior Reviewed-by: Marcel Holtmann Reviewed-by: Andy Gross Signed-off-by: Mihai Moldovan Fixes: 0c2204a4ad71 ("net: qrtr: Migrate nameservice to kernel from userspa= ce") Signed-off-by: Juha-Matti Tilli Reviewed-by: Manivannan Sadhasivam --- net/qrtr/ns.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/net/qrtr/ns.c b/net/qrtr/ns.c index c5e7e01db2498..a3348e40d9275 100644 --- a/net/qrtr/ns.c +++ b/net/qrtr/ns.c @@ -668,6 +668,9 @@ static void qrtr_ns_worker(struct work_struct *work) break; } =20 + if ((size_t)msglen < sizeof(*pkt)) + break; + pkt =3D recv_buf; cmd =3D le32_to_cpu(pkt->cmd); if (cmd < ARRAY_SIZE(qrtr_ctrl_pkt_strings) && --=20 2.34.1 From nobody Fri Sep 25 08:48:16 2026 Received: from lahtoruutu.iki.fi (lahtoruutu.iki.fi [185.185.170.37]) (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 6C2AA43DEA5; Tue, 15 Sep 2026 05:43:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=185.185.170.37 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789451005; cv=pass; b=B/ynK7HPy1znspGReq0XwUF8IrDY9LGMgX9WS40y6X33huMfNUNB8+9c6dfouhh7WBV63RDoqZ16h5qTSYdocfISLCtHn+2ThmeiC2qayi2cv7ny6ne6qMqfmSDZz28yOO/RyrQBgb7N0R50SxYQKe00Lgk+ovPxLmLyYnxv7BE= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789451005; c=relaxed/simple; bh=mnCg6IjXPDA18F3gCIoGu45zsMeW4iiwBq36VbdhGrE=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=b6WvQHOFbFxBSc3t/ODFkFxFtw63dNOVsCUz5R/e4jUB1h0GiLWkaU3LH9WZk0jrnt7aW55m7ORaxA2/8IaPNQ4a5YjpZBucfhtyf4I9kC8H3RYFglqSgvplcEhfOdJ4w90ixYbrdXazv7dIphKndMj3tH9Dgf7Qi0tjnU7Tpu4= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi; spf=pass smtp.mailfrom=iki.fi; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b=kFnBhZY/; arc=pass smtp.client-ip=185.185.170.37 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=iki.fi Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b="kFnBhZY/" Received: from mandelbrot.. (xdsl-83-150-90-33.nebulazone.fi [83.150.90.33]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: jmtilli) by lahtoruutu.iki.fi (Postfix) with ESMTPSA id 4hkWC91N9Pz49Q7r; Tue, 15 Sep 2026 08:43:17 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1789450997; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=b2arz6d4RrSmlewlrh+D8m1nv0qdMIfe9W1Or8yisS4=; b=kFnBhZY/tQMpsMbHRTD5iBa9Np4ys7eYe0BR3VJXDgmsVVd4DuPQE0M1BCk63yXmFLM0hU EuC8xlqKmvvZLHq9lQr4lclMLmf8I6ePNmCLJwrlMrapJsnGh0q7mGiGuMFZ7uBCWovgOd LFZKmtRptv8yt5osCenf1EuC+JATkEDkpGwN5J0Ecu26TFXNcuqRTVz/wX645fMip1Ccwn bEZkxpbzfjl+ZHwY92KItA8bcILGBhqwiRuHXxbLFgogSMpSj6+yQ3dH3Qpf7egKJ1oVUA 0i7lIpgpI4koEkfqtVol/6dNv/FIOOZ0oZgaJ2tK8yqz+4X+d/oyT9DUvZwIUg== ARC-Seal: i=1; a=rsa-sha256; d=iki.fi; s=lahtoruutu; cv=none; t=1789450997; b=YXPpjGjFh5DM1a2DE+phDlSV2GEGVA/b3mz/XlD5TGGcWd5G+E+pJ4OjDu+wQt7R4n8qW2 eE61rHyjIatpJUpPq0b/MZtrn8Kz+j0vHNM9lOBRrRqkUsrwzW6lglKtyqPlH70HqGJFK0 r7vS28wY6u4ZommAEaoCsWk2wv8m1i6U+vleREY2S6v+JyytR0I+2CNfpLJwIScDbLTlOt vxo3Z24ZN6ol215Ky+/1Oh8Loo6KOL5VvGLqxy3vbBVplxDLpLtDkHeb0UvEPTYEF/+l2D aIVSTviuX707UZkj8iMv2MeXnB0akmwHdITGz0md6e6efBfSgV3/N8qcFiC06A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1789450997; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=b2arz6d4RrSmlewlrh+D8m1nv0qdMIfe9W1Or8yisS4=; b=gsV4ysXa8lo/mTQrJGr+DIoC0/r18kN4QSzJPbGZE3ZBk13c4u8bk9zpDV7klZLwh6vgGt nH2EvTpCils+36yA7BxSb+SqsolHePd/oy+kekg2IJ6jff+ThIlFBPl7SDYuKngze7dWIl XLvLh9fKoGA9Se9nBg5vGuOH3Mej86dXNYGwh8U46ml2MHbBRusFF+uup4Eh50HGXkGF9s XkusyOHb+I+eFaXNmHwoEMZbuib8M66J8jawzAxVL1BCCkWYLMY214Sjuyo20YzfhHH/NA Prbbb2NQmbcGMRV1ExPC2ZCxu4vZgC7oW3i7edhHpCSUXlVrcygPOi6GO4cKWw== ARC-Authentication-Results: i=1; ORIGINATING; auth=pass smtp.auth=jmtilli smtp.mailfrom=juha-matti.tilli@iki.fi From: Juha-Matti Tilli To: Manivannan Sadhasivam , linux-arm-msm@vger.kernel.org Cc: Juha-Matti Tilli , Jeff Hugo , Jeff Johnson , Bjorn Andersson , Konrad Dybcio , Eric Dumazet , Kuniyuki Iwashima , Paolo Abeni , Willem de Bruijn , "David S. Miller" , Jakub Kicinski , Simon Horman , Mihai Moldovan , Denis Kenzior , Marcel Holtmann , Andy Gross , linux-kernel@vger.kernel.org, mhi@lists.linux.dev, linux-wireless@vger.kernel.org, ath11k@lists.infradead.org, ath12k@lists.infradead.org, netdev@vger.kernel.org Subject: [PATCH v7 02/15] net: qrtr: allocate and track endpoint ids Date: Tue, 15 Sep 2026 08:41:54 +0300 Message-Id: <20260915054207.2513877-3-juha-matti.tilli@iki.fi> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260915054207.2513877-1-juha-matti.tilli@iki.fi> References: <20260915054207.2513877-1-juha-matti.tilli@iki.fi> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Denis Kenzior Currently, QRTR endpoints are tracked solely by their pointer value, which is sufficient as they are not exposed to user space and it is assumed that each endpoint has a unique set of node identifiers associated with it. However, this assumption does not hold when multiple devices of the same type are connected to the system. For example, multiple PCIe based 5G modems. Such a setup results in multiple endpoints with confliciting node identifiers. To enable support for such scenarios, introduce the ability to track and assign unique identifiers to QRTR endpoints. These identifiers can then be exposed to user space, allowing for userspace clients to identify which endpoint sent a given message, or to direct a message to a specific endpoint. A simple allocation strategy is used based on xa_alloc_cyclic. Remote endpoint ids start at 'qrtr_local_nid' + 1. Since qrtr_local_nid is currently always set to 1 and never changed, node identifiers start at '1' for the local endpoint and 2..INT_MAX for remote endpoints. Signed-off-by: Denis Kenzior Reviewed-by: Marcel Holtmann Reviewed-by: Andy Gross Signed-off-by: Mihai Moldovan Signed-off-by: Juha-Matti Tilli Reviewed-by: Manivannan Sadhasivam --- net/qrtr/af_qrtr.c | 24 ++++++++++++++++++++++++ net/qrtr/qrtr.h | 1 + 2 files changed, 25 insertions(+) diff --git a/net/qrtr/af_qrtr.c b/net/qrtr/af_qrtr.c index a30fa56e6aa31..38b6def7c5272 100644 --- a/net/qrtr/af_qrtr.c +++ b/net/qrtr/af_qrtr.c @@ -22,6 +22,7 @@ #define QRTR_MAX_EPH_SOCKET 0x7fff #define QRTR_EPH_PORT_RANGE \ XA_LIMIT(QRTR_MIN_EPH_SOCKET, QRTR_MAX_EPH_SOCKET) +#define QRTR_ENDPOINT_RANGE XA_LIMIT(qrtr_local_nid + 1, INT_MAX) =20 #define QRTR_PORT_CTRL_LEGACY 0xffff =20 @@ -109,6 +110,10 @@ static LIST_HEAD(qrtr_all_nodes); /* lock for qrtr_all_nodes and node reference */ static DEFINE_MUTEX(qrtr_node_lock); =20 +/* endpoint id allocation management */ +static DEFINE_XARRAY_ALLOC(qrtr_endpoints); +static u32 next_endpoint_id; + /* local port allocation management */ static DEFINE_XARRAY_ALLOC(qrtr_ports); =20 @@ -581,6 +586,8 @@ static struct sk_buff *qrtr_alloc_ctrl_packet(struct qr= tr_ctrl_pkt **pkt, int qrtr_endpoint_register(struct qrtr_endpoint *ep, unsigned int nid) { struct qrtr_node *node; + u32 endpoint_id; + int rc; =20 if (!ep || !ep->xmit) return -EINVAL; @@ -589,6 +596,13 @@ int qrtr_endpoint_register(struct qrtr_endpoint *ep, u= nsigned int nid) if (!node) return -ENOMEM; =20 + rc =3D xa_alloc_cyclic(&qrtr_endpoints, &endpoint_id, NULL, + QRTR_ENDPOINT_RANGE, &next_endpoint_id, + GFP_KERNEL); + + if (rc < 0) + goto free_node; + kref_init(&node->ref); mutex_init(&node->ep_lock); skb_queue_head_init(&node->rx_queue); @@ -604,8 +618,12 @@ int qrtr_endpoint_register(struct qrtr_endpoint *ep, u= nsigned int nid) list_add(&node->item, &qrtr_all_nodes); mutex_unlock(&qrtr_node_lock); ep->node =3D node; + ep->id =3D endpoint_id; =20 return 0; +free_node: + kfree(node); + return rc; } EXPORT_SYMBOL_GPL(qrtr_endpoint_register); =20 @@ -625,8 +643,10 @@ void qrtr_endpoint_unregister(struct qrtr_endpoint *ep) unsigned long flags; unsigned long index; void __rcu **slot; + u32 endpoint_id; =20 mutex_lock(&node->ep_lock); + endpoint_id =3D node->ep->id; node->ep =3D NULL; mutex_unlock(&node->ep_lock); =20 @@ -651,6 +671,10 @@ void qrtr_endpoint_unregister(struct qrtr_endpoint *ep) mutex_unlock(&node->qrtr_tx_lock); =20 qrtr_node_release(node); + + xa_erase(&qrtr_endpoints, endpoint_id); + + ep->id =3D 0; ep->node =3D NULL; } EXPORT_SYMBOL_GPL(qrtr_endpoint_unregister); diff --git a/net/qrtr/qrtr.h b/net/qrtr/qrtr.h index 3f2d28696062a..11b897af05e67 100644 --- a/net/qrtr/qrtr.h +++ b/net/qrtr/qrtr.h @@ -21,6 +21,7 @@ struct qrtr_endpoint { int (*xmit)(struct qrtr_endpoint *ep, struct sk_buff *skb); /* private: not for endpoint use */ struct qrtr_node *node; + u32 id; }; =20 int qrtr_endpoint_register(struct qrtr_endpoint *ep, unsigned int nid); --=20 2.34.1 From nobody Fri Sep 25 08:48:16 2026 Received: from lahtoruutu.iki.fi (lahtoruutu.iki.fi [185.185.170.37]) (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 F3B6E3F4118; Tue, 15 Sep 2026 05:43:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=185.185.170.37 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789451020; cv=pass; b=YtjW1znVkvlYsU6HSRfYE1XoiSa7xKZZRrs+p0zo4QUeRo01NChLGUoBj8j28T1Iuyfu436T0dMwHwmJpEN+8q6yxzGUNvVInR97BsMvIsM78ZvP59DSylvAYaSPw1RdcIeauYmbJToNoJzGv+OAFhfrkf+nbsMJIzi5BBMi8TY= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789451020; c=relaxed/simple; bh=fQk0OZNyx5bWSZ06u8sA1/WbxMmAEqhV0VVV323FxoE=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=N9njgdat6xnXIl/3aVduFAW9+NbVqjTsXtGfNGuApXW229JtcnHhIP59gl2sdjwcaQdIzsEjd8GMsvK9Vsnpd/Z7AzHjNAu0LbRJPHEY8iCUg/EQWQQy8GxEW8J3rTIViFXcV8bgAJ0+DN82jRXo0glHriOoEn8uelZEgBVOPjI= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi; spf=pass smtp.mailfrom=iki.fi; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b=V+7MW2km; arc=pass smtp.client-ip=185.185.170.37 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=iki.fi Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b="V+7MW2km" Received: from mandelbrot.. (xdsl-83-150-90-33.nebulazone.fi [83.150.90.33]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: jmtilli) by lahtoruutu.iki.fi (Postfix) with ESMTPSA id 4hkWCS1qznz49Q32; Tue, 15 Sep 2026 08:43:32 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1789451012; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Oycz5u0f3lz1AvS7cGHa543haJ+L6aX2mdafdbJn/A4=; b=V+7MW2kmntrh+EwEjzM95lAazznluGZ2f9AsFI2q2Xju3zHOdo0icpxSqDc+i00WiDeOHT czWM1CDrp6A+31l80ajryW7B3A46YlClUU7jPAe3sSuJcLQ6OGt7RGOWaxvTR7W9cu7oJG RpGKt/vtVj5KK8EuRjTYs5KcL6lN1WuTtV3IlwYM6hXcmktf+DcKpy4fqaZ4MdS+Zdcj3R a3YdyCenEUHCepAVxnubpYNcxdpHaryEZ+cLUGHaLoKJ4q5Iwpqn+BxijHQ1vTL394p/36 4+CY3WGVz0UkQPOO6XN8MmzwcVflO6/BjH351d5wgPfpG+RD3QUHaYEEHoiqEg== ARC-Seal: i=1; a=rsa-sha256; d=iki.fi; s=lahtoruutu; cv=none; t=1789451012; b=wdGVXNTHyAJUzKyV0bzerU/RIJZz/NZiIgUjUEDggCcyDeN45dF1iTrccXgBRsapHpZ9F9 BGXIHk3uOz0Vqsj+YFHJEgt5xeRAqRPZaHy9jRnN4f6A+G84tCFO8dYxVK+1DELvTeUvcE vwuH/TZ8RRUPckP77e9ceIXJpNfWvq4Lxgg/VXAXvEDWcT3/0tRRbZE8buC7Wcn97NvDOx sOMyf0ym2it9dba7Xpkmust3Xabs7ps4z2zzR/KfuOtsDTiylsfR3f1h9ebnnguJ3DjU72 0XO/cjH1BGLZaOr6O0VHjbG7E+m9cLwESXp2IWx+xFoNFUxkstLcjcejZKJfAQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1789451012; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Oycz5u0f3lz1AvS7cGHa543haJ+L6aX2mdafdbJn/A4=; b=qiYSnK5kHvRPvRq9cTrMgBuFSHITBXk134xPwU2F+GSzJD8kuzgvErUvvKrrjFQEB1Clcd YU45wga6lR+c0nYR42YJcW2CqilhR1LQrOAw0FicWS4S1qEma4F+tuLZbcuO4ke5m96eAt oy2NDdYAqGcUZm40KUMiYDMNGQbcSIcmFQ0okHCzlFBu8/WwhslrPBDD3lMcMO15h8uWPV mrWWuCIo7o1bCneJ1HcP+mZle0ax9/61rf3DG9B0qCDj3rbyHqJVlnkUxM5QrmFIm1Gl9M y5s4FYEjMUSeWYAbr7NkzqdG719fB/Cv4q6JOGzQQaAAzdB+0DY19iTUO8d8ag== ARC-Authentication-Results: i=1; ORIGINATING; auth=pass smtp.auth=jmtilli smtp.mailfrom=juha-matti.tilli@iki.fi From: Juha-Matti Tilli To: Manivannan Sadhasivam , linux-arm-msm@vger.kernel.org Cc: Juha-Matti Tilli , Jeff Hugo , Jeff Johnson , Bjorn Andersson , Konrad Dybcio , Eric Dumazet , Kuniyuki Iwashima , Paolo Abeni , Willem de Bruijn , "David S. Miller" , Jakub Kicinski , Simon Horman , Mihai Moldovan , Denis Kenzior , Marcel Holtmann , Andy Gross , linux-kernel@vger.kernel.org, mhi@lists.linux.dev, linux-wireless@vger.kernel.org, ath11k@lists.infradead.org, ath12k@lists.infradead.org, netdev@vger.kernel.org Subject: [PATCH v7 03/15] net: qrtr: fit node ID + port number combination into unsigned long Date: Tue, 15 Sep 2026 08:41:55 +0300 Message-Id: <20260915054207.2513877-4-juha-matti.tilli@iki.fi> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260915054207.2513877-1-juha-matti.tilli@iki.fi> References: <20260915054207.2513877-1-juha-matti.tilli@iki.fi> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Mihai Moldovan The flow control implementation uses a radix tree to store node ID and port number combinations and the key length is hardcoded to unsigned long. The original implementation shifted the node ID up by 32 bits and added the port number to the lower 32 bits of the unsigned long value to create a key. Unfortunately, since both node IDs and port numbers are defined as u32, this will overflow on platforms where sizeof(unsigned long) < 8 (which are most 32 bit platforms) and essentially just drop the node ID part. To fix this, build the key in a generic way, using half of the unsigned long space for the node ID and the other half for the port number. This will be transparent to platforms where sizeof(unsigned long) >=3D 8 and fix overflow issues otherwise. The caveat, of course, is that, for platforms where sizeof(unsigned long) < 8, the supported amount of node IDs and port numbers will be severely limited - to half of sizeof(unsigned long), which typically will be 16 bits. Needless to say, we have to check if both values fit into this limit. This limitation is probably not going to be an issue in real-world scenarios, but if it turns out to be one after all, we could switch from a radix tree implementation to an XArray implementation. Signed-off-by: Mihai Moldovan Fixes: 5fdeb0d372ab ("net: qrtr: Implement outgoing flow control") Signed-off-by: Juha-Matti Tilli --- net/qrtr/af_qrtr.c | 74 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 64 insertions(+), 10 deletions(-) diff --git a/net/qrtr/af_qrtr.c b/net/qrtr/af_qrtr.c index 38b6def7c5272..f2edbd2e9dea9 100644 --- a/net/qrtr/af_qrtr.c +++ b/net/qrtr/af_qrtr.c @@ -117,6 +117,26 @@ static u32 next_endpoint_id; /* local port allocation management */ static DEFINE_XARRAY_ALLOC(qrtr_ports); =20 +/* The xarray API uses fixed unsigned long keys and we will have to make + * do with that. + * These keys are often a combination of node IDs (currently u32) and + * port numbers (also currently u32). + * Using the high 32 bits for the node ID and the low 32 bits for the + * port number will work fine to create keys on platforms where unsigned l= ong + * is 64 bits wide, but obviously is not be possible on platforms where + * unsigned long is smaller. + * Virtually split up unsigned long in half and assign the upper bits to + * node IDs and the lower bits to the port number, however big that may be. + */ +#define QRTR_XARRAY_INDEX_BITS (8 /* CHAR_BIT */ * sizeof(unsigned long)) +#define QRTR_INDEX_HALF_BITS (QRTR_XARRAY_INDEX_BITS >> 1) + +#define QRTR_INDEX_HALF_UNSIGNED_MAX ((~(unsigned long)(0)) >> QRTR_INDEX_= HALF_BITS) +#define QRTR_INDEX_HALF_UNSIGNED_MIN ((unsigned long)(0)) + +#define QRTR_INDEX_HALF_SIGNED_MAX ((long)(QRTR_INDEX_HALF_UNSIGNED_MAX) >= > 1) +#define QRTR_INDEX_HALF_SIGNED_MIN ((long)(-1) - QRTR_INDEX_HALF_SIGNED_MA= X) + /** * struct qrtr_node - endpoint node * @ep_lock: lock for endpoint management and callbacks @@ -221,16 +241,23 @@ static void qrtr_node_release(struct qrtr_node *node) * qrtr_tx_resume() - reset flow control counter * @node: qrtr_node that the QRTR_TYPE_RESUME_TX packet arrived on * @skb: resume_tx packet + * + * Return: 0 on success; negative error code on failure */ -static void qrtr_tx_resume(struct qrtr_node *node, struct sk_buff *skb) +static int qrtr_tx_resume(struct qrtr_node *node, struct sk_buff *skb) { struct qrtr_ctrl_pkt *pkt =3D (struct qrtr_ctrl_pkt *)skb->data; u64 remote_node =3D le32_to_cpu(pkt->client.node); u32 remote_port =3D le32_to_cpu(pkt->client.port); struct qrtr_tx_flow *flow; - unsigned long key; + unsigned long key =3D 0; =20 - key =3D remote_node << 32 | remote_port; + if (remote_node > QRTR_INDEX_HALF_UNSIGNED_MAX || + remote_port > QRTR_INDEX_HALF_UNSIGNED_MAX) + return -EINVAL; + + key =3D ((unsigned long)(remote_node) << QRTR_INDEX_HALF_BITS) | + ((unsigned long)(remote_port) & QRTR_INDEX_HALF_UNSIGNED_MAX); =20 flow =3D xa_load(&node->qrtr_tx_flow, key); if (flow) { @@ -241,6 +268,8 @@ static void qrtr_tx_resume(struct qrtr_node *node, stru= ct sk_buff *skb) } =20 consume_skb(skb); + + return 0; } =20 /** @@ -261,11 +290,20 @@ static void qrtr_tx_resume(struct qrtr_node *node, st= ruct sk_buff *skb) static int qrtr_tx_wait(struct qrtr_node *node, int dest_node, int dest_po= rt, int type) { - unsigned long key =3D (u64)dest_node << 32 | dest_port; + unsigned long key =3D 0; struct qrtr_tx_flow *flow; int confirm_rx =3D 0; int ret; =20 + if (dest_node < QRTR_INDEX_HALF_SIGNED_MIN || + dest_node > QRTR_INDEX_HALF_SIGNED_MAX || + dest_port < QRTR_INDEX_HALF_SIGNED_MIN || + dest_port > QRTR_INDEX_HALF_SIGNED_MAX) + return -EINVAL; + + key =3D ((unsigned long)(dest_node) << QRTR_INDEX_HALF_BITS) | + ((unsigned long)(dest_port) & QRTR_INDEX_HALF_UNSIGNED_MAX); + /* Never set confirm_rx on non-data packets */ if (type !=3D QRTR_TYPE_DATA) return 0; @@ -322,19 +360,32 @@ static int qrtr_tx_wait(struct qrtr_node *node, int d= est_node, int dest_port, * message associated with the dropped confirm_rx message. * Work around this by marking the flow as having a failed transmission and * cause the next transmission attempt to be sent with the confirm_rx. + * + * Return: 0 on success; negative error code on failure */ -static void qrtr_tx_flow_failed(struct qrtr_node *node, int dest_node, - int dest_port) +static int qrtr_tx_flow_failed(struct qrtr_node *node, int dest_node, + int dest_port) { - unsigned long key =3D (u64)dest_node << 32 | dest_port; + unsigned long key =3D 0; struct qrtr_tx_flow *flow; =20 + if (dest_node < QRTR_INDEX_HALF_SIGNED_MIN || + dest_node > QRTR_INDEX_HALF_SIGNED_MAX || + dest_port < QRTR_INDEX_HALF_SIGNED_MIN || + dest_port > QRTR_INDEX_HALF_SIGNED_MAX) + return -EINVAL; + + key =3D ((unsigned long)(dest_node) << QRTR_INDEX_HALF_BITS) | + ((unsigned long)(dest_port) & QRTR_INDEX_HALF_UNSIGNED_MAX); + flow =3D xa_load(&node->qrtr_tx_flow, key); if (flow) { spin_lock_irq(&flow->resume_tx.lock); flow->tx_failed =3D 1; spin_unlock_irq(&flow->resume_tx.lock); } + + return 0; } =20 /* Pass an outgoing packet socket buffer to the endpoint driver. */ @@ -382,7 +433,7 @@ static int qrtr_node_enqueue(struct qrtr_node *node, st= ruct sk_buff *skb, /* Need to ensure that a subsequent message carries the otherwise lost * confirm_rx flag if we dropped this one */ if (rc && confirm_rx) - qrtr_tx_flow_failed(node, to->sq_node, to->sq_port); + rc =3D qrtr_tx_flow_failed(node, to->sq_node, to->sq_port); =20 return rc; } @@ -444,6 +495,7 @@ int qrtr_endpoint_post(struct qrtr_endpoint *ep, const = void *data, size_t len) size_t size; unsigned int ver; size_t hdrlen; + int ret =3D -EINVAL; =20 if (len =3D=3D 0 || len & 3) return -EINVAL; @@ -526,7 +578,9 @@ int qrtr_endpoint_post(struct qrtr_endpoint *ep, const = void *data, size_t len) } =20 if (cb->type =3D=3D QRTR_TYPE_RESUME_TX) { - qrtr_tx_resume(node, skb); + ret =3D qrtr_tx_resume(node, skb); + if (ret) + goto err; } else { ipc =3D qrtr_port_lookup(cb->dst_port); if (!ipc) @@ -544,7 +598,7 @@ int qrtr_endpoint_post(struct qrtr_endpoint *ep, const = void *data, size_t len) =20 err: kfree_skb(skb); - return -EINVAL; + return ret; =20 } EXPORT_SYMBOL_GPL(qrtr_endpoint_post); --=20 2.34.1 From nobody Fri Sep 25 08:48:16 2026 Received: from meesny.iki.fi (meesny.iki.fi [195.140.195.201]) (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 E7C6543E063; Tue, 15 Sep 2026 05:44:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=195.140.195.201 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789451068; cv=pass; b=GsjH78/RoUuShpeCBAeIUX/ff9zGQwUsBEA4WLuqooSASOZzDt7xUfSCFCHCqiUDlfLgYXkp1X7SAw9Qa3KH+4zbQmB2wCjc94LHxbLngAeRka07G6q5uoncXD0cTHc+R8QU+jTgmZCm5nytcBgeJxRQBieCuPr9eBvKs4wVPi0= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789451068; c=relaxed/simple; bh=ePdcpjW/kLvFZnLJetnASTkIonTXjx3cf8nqDnz7rQY=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=IGcdQk2dBuv3Dmmpr9vOcpjWeD3YuBApK0XZ3bFY9MElAyx087xNdveFKvRliyTbvGWmvPo1NNYanrS6gBQcHlQqekRVe38gelvmrXwo/TvPTE5hwPXRroLpoFQc1yDfyNtoNcAj6etZd4odFpbqxYyCGXsjeygLhxvMpfY4YIk= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi; spf=pass smtp.mailfrom=iki.fi; dkim=pass (1024-bit key) header.d=iki.fi header.i=@iki.fi header.b=ajsiIfNC; arc=pass smtp.client-ip=195.140.195.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=iki.fi Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=iki.fi header.i=@iki.fi header.b="ajsiIfNC" Received: from mandelbrot.. (xdsl-83-150-90-33.nebulazone.fi [83.150.90.33]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: jmtilli) by meesny.iki.fi (Postfix) with ESMTPSA id 4hkWDK4krFzySb; Tue, 15 Sep 2026 08:44:17 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=meesny; t=1789451059; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=v6GkYk0HZBFKkX376VoqF+8xKuVMeoSo1m24bvpn9Wg=; b=ajsiIfNCO9hm2npmFbvhPirjGVcAczP0wbWRAS1dswu6oKlgl9rogZQ+Ryg9EiXtO86E5W mB1HiV8QXHvAx9q6ZzTfoMMJ5zBVgS6INmI1WcaK2DVoTwPJFImf56GD+5q0BS+KB+Ow3n S0nvyFBbDBDLOyUvdPtSDstiIy+OsgM= ARC-Seal: i=1; a=rsa-sha256; d=iki.fi; s=meesny; cv=none; t=1789451059; b=dLmSL19LgGognTGhdycfQ/y3+GiybIa6A1YSWFYVaH/fj/NK0tUUdYmZux4OozCZC36RXr rGAn1gxLgAmovx6SNRoxfk9h1U4KJ7MSH4+dNOl0nBjsww5iJ/MuURu7C/bdgg1qvTL8cW JxBSze+PknetOz8eMB0py0DeyAXt/IQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=meesny; t=1789451059; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=v6GkYk0HZBFKkX376VoqF+8xKuVMeoSo1m24bvpn9Wg=; b=v7iPlidOcOVDpHBsQTK+fn5WKR77Z+TyY81OXnhw13khm6VDXfe+1jsQdg5zadFV/QhY97 l2HgqakrwzOtptFsm2YxdeyO5SMoTsLdyNjT5ZmQsUpBl2YqfslSLO4SloKJama67hYatA w53DSa4aBJhXH3pBrn+sMWjapHpjMTo= ARC-Authentication-Results: i=1; ORIGINATING; auth=pass smtp.auth=jmtilli smtp.mailfrom=juha-matti.tilli@iki.fi From: Juha-Matti Tilli To: Manivannan Sadhasivam , linux-arm-msm@vger.kernel.org Cc: Juha-Matti Tilli , Jeff Hugo , Jeff Johnson , Bjorn Andersson , Konrad Dybcio , Eric Dumazet , Kuniyuki Iwashima , Paolo Abeni , Willem de Bruijn , "David S. Miller" , Jakub Kicinski , Simon Horman , Mihai Moldovan , Denis Kenzior , Marcel Holtmann , Andy Gross , linux-kernel@vger.kernel.org, mhi@lists.linux.dev, linux-wireless@vger.kernel.org, ath11k@lists.infradead.org, ath12k@lists.infradead.org, netdev@vger.kernel.org Subject: [PATCH v7 04/15] net: qrtr: use only low 16 bits of node/port in 32-bit systems Date: Tue, 15 Sep 2026 08:41:56 +0300 Message-Id: <20260915054207.2513877-5-juha-matti.tilli@iki.fi> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260915054207.2513877-1-juha-matti.tilli@iki.fi> References: <20260915054207.2513877-1-juha-matti.tilli@iki.fi> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The node id is generally a single fixed value hardcoded into device firmware. If it happens to be larger than 16 bits on a 32-bit system, using the value modulo 65536 is enough. It is not necessary to check it for being in range. Evidence of this is a prior implementation that fit node_id (u32) and port (u32) into unsigned long in 32-bit systems, in a manner that completely discarded all bits of node_id. Do the same for port: don't check for it being in range. This arguably creates a bug where node_id could clash with a node_id that has the same low-order 16 bits, or a port could clash with a port that has the same low-order 16 bits. But it's probably better than discarding all bits of node and using only bits from port. It's probably also better than failing if either node or port is out-of-range. Signed-off-by: Juha-Matti Tilli --- net/qrtr/af_qrtr.c | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/net/qrtr/af_qrtr.c b/net/qrtr/af_qrtr.c index f2edbd2e9dea9..b2cb05f2480e0 100644 --- a/net/qrtr/af_qrtr.c +++ b/net/qrtr/af_qrtr.c @@ -252,9 +252,9 @@ static int qrtr_tx_resume(struct qrtr_node *node, struc= t sk_buff *skb) struct qrtr_tx_flow *flow; unsigned long key =3D 0; =20 - if (remote_node > QRTR_INDEX_HALF_UNSIGNED_MAX || - remote_port > QRTR_INDEX_HALF_UNSIGNED_MAX) - return -EINVAL; + /* Don't check node/port for the valid range, use only low + * 16 bits on 32-bit architectures. + */ =20 key =3D ((unsigned long)(remote_node) << QRTR_INDEX_HALF_BITS) | ((unsigned long)(remote_port) & QRTR_INDEX_HALF_UNSIGNED_MAX); @@ -295,11 +295,9 @@ static int qrtr_tx_wait(struct qrtr_node *node, int de= st_node, int dest_port, int confirm_rx =3D 0; int ret; =20 - if (dest_node < QRTR_INDEX_HALF_SIGNED_MIN || - dest_node > QRTR_INDEX_HALF_SIGNED_MAX || - dest_port < QRTR_INDEX_HALF_SIGNED_MIN || - dest_port > QRTR_INDEX_HALF_SIGNED_MAX) - return -EINVAL; + /* Don't check node/port for the valid range, use only low + * 16 bits on 32-bit architectures. + */ =20 key =3D ((unsigned long)(dest_node) << QRTR_INDEX_HALF_BITS) | ((unsigned long)(dest_port) & QRTR_INDEX_HALF_UNSIGNED_MAX); @@ -369,11 +367,9 @@ static int qrtr_tx_flow_failed(struct qrtr_node *node,= int dest_node, unsigned long key =3D 0; struct qrtr_tx_flow *flow; =20 - if (dest_node < QRTR_INDEX_HALF_SIGNED_MIN || - dest_node > QRTR_INDEX_HALF_SIGNED_MAX || - dest_port < QRTR_INDEX_HALF_SIGNED_MIN || - dest_port > QRTR_INDEX_HALF_SIGNED_MAX) - return -EINVAL; + /* Don't check node/port for the valid range, use only low + * 16 bits on 32-bit architectures. + */ =20 key =3D ((unsigned long)(dest_node) << QRTR_INDEX_HALF_BITS) | ((unsigned long)(dest_port) & QRTR_INDEX_HALF_UNSIGNED_MAX); --=20 2.34.1 From nobody Fri Sep 25 08:48:16 2026 Received: from meesny.iki.fi (meesny.iki.fi [195.140.195.201]) (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 A906D43DEBD; Tue, 15 Sep 2026 05:44:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=195.140.195.201 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789451085; cv=pass; b=Tfhy2xRKPfgBANXbbiaxJzpWemtVjrEEAD5ZDgqlg7RRILH45rwlB3CFtawjGiTU/wXS8yUrME1qOYkMKQCStMOtRuHS+qx8bJxO9RUFgQOCz4D2XnMfn+8etUQbnHJPULts1uQKsboVG4btHxYa/ipCJHh8ZV5pT6jOHOOtbIY= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789451085; c=relaxed/simple; bh=9MTKVHXaWAmpPah6Uzh7zDrZE8DXEn0CDbIpbMZiR8Q=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=keTTScj9U2NmWhBP2ojFP8vvkSrUy6mp7LTcZDBUAGCnPN7QXAWQCjeVg9N5R1ztTHfwZ5S6gNsyRzERaAb+rRzpkddai4YlY/fumagmi7d0H2QPLPeL8tXBAab2YF+X7fCP60r3M/G2yOidJt0txGb7N4BLdNRDejb9TMVenbc= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi; spf=pass smtp.mailfrom=iki.fi; dkim=pass (1024-bit key) header.d=iki.fi header.i=@iki.fi header.b=R8gSoob4; arc=pass smtp.client-ip=195.140.195.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=iki.fi Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=iki.fi header.i=@iki.fi header.b="R8gSoob4" Received: from mandelbrot.. (xdsl-83-150-90-33.nebulazone.fi [83.150.90.33]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: jmtilli) by meesny.iki.fi (Postfix) with ESMTPSA id 4hkWDh1q0JzySb; Tue, 15 Sep 2026 08:44:36 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=meesny; t=1789451076; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=eQQNkGqsz0DxTiGoA57xy08XjvAtpAjYEEPkpcv0BrA=; b=R8gSoob4pGF7nLjvNYw4Udy8mn3rAs0+w/EvzE5zK4fVn5Jhzcjs3rs4G+kfItBpX261s7 RV+aAezK+CITzQRUy10Ft+71Bfccrzqg/9wAUH77WFBwX/PqEqbVbZnQUyPrDOxUP2R+bV 79HasSxENmEo42+NlfeyszOhn53REd8= ARC-Seal: i=1; a=rsa-sha256; d=iki.fi; s=meesny; cv=none; t=1789451076; b=yKLNcBI+XHm97q7qhO1w1Oyr4hQTi7tdGEHAllbI10tfp1GqvpTpWiG1KtPcsoc/lcfq+J fJjaNmRFWeL8TjBRc0LuazJiLjGykG3gNWhHmCW80PKBb/xL5gtgFB/r53CVYTnk664vte sywcsD8xlmbuSYgXp4T3mVR+wWb7Qe8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=meesny; t=1789451076; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=eQQNkGqsz0DxTiGoA57xy08XjvAtpAjYEEPkpcv0BrA=; b=AbOFhUfIqAZvG6+0LxGUV0akK8VbyQK1rH110JkKT1QSrQcJK5A4FkNmgDPRWb/bwOekcD Csw2DaZ40g/FXqYPbNHnn1LqgRnfxHIksZc5uy87HBTacejfUUw24pTHfWcNg9Y5oXeBWX 6vwjyS3XOvK4mDFzcFQrQGTF8xsCeWM= ARC-Authentication-Results: i=1; ORIGINATING; auth=pass smtp.auth=jmtilli smtp.mailfrom=juha-matti.tilli@iki.fi From: Juha-Matti Tilli To: Manivannan Sadhasivam , linux-arm-msm@vger.kernel.org Cc: Juha-Matti Tilli , Jeff Hugo , Jeff Johnson , Bjorn Andersson , Konrad Dybcio , Eric Dumazet , Kuniyuki Iwashima , Paolo Abeni , Willem de Bruijn , "David S. Miller" , Jakub Kicinski , Simon Horman , Mihai Moldovan , Denis Kenzior , Marcel Holtmann , Andy Gross , linux-kernel@vger.kernel.org, mhi@lists.linux.dev, linux-wireless@vger.kernel.org, ath11k@lists.infradead.org, ath12k@lists.infradead.org, netdev@vger.kernel.org Subject: [PATCH v7 05/15] net: qrtr: support identical node ids Date: Tue, 15 Sep 2026 08:41:57 +0300 Message-Id: <20260915054207.2513877-6-juha-matti.tilli@iki.fi> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260915054207.2513877-1-juha-matti.tilli@iki.fi> References: <20260915054207.2513877-1-juha-matti.tilli@iki.fi> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Denis Kenzior Add support for tracking multiple endpoints that may have conflicting node identifiers. This is achieved by using both the node and endpoint identifiers as the key inside the radix_tree data structure. For backward compatibility with existing clients, the previous key schema (node identifier only) is preserved. However, this schema will only support the first endpoint/node combination. This is acceptable for legacy clients as support for multiple endpoints with conflicting node identifiers was not previously possible. Signed-off-by: Denis Kenzior Reviewed-by: Marcel Holtmann Reviewed-by: Andy Gross Signed-off-by: Mihai Moldovan Signed-off-by: Juha-Matti Tilli --- net/qrtr/af_qrtr.c | 57 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 42 insertions(+), 15 deletions(-) diff --git a/net/qrtr/af_qrtr.c b/net/qrtr/af_qrtr.c index b2cb05f2480e0..43e48b89b5cb6 100644 --- a/net/qrtr/af_qrtr.c +++ b/net/qrtr/af_qrtr.c @@ -119,14 +119,15 @@ static DEFINE_XARRAY_ALLOC(qrtr_ports); =20 /* The xarray API uses fixed unsigned long keys and we will have to make * do with that. - * These keys are often a combination of node IDs (currently u32) and - * port numbers (also currently u32). - * Using the high 32 bits for the node ID and the low 32 bits for the - * port number will work fine to create keys on platforms where unsigned l= ong - * is 64 bits wide, but obviously is not be possible on platforms where - * unsigned long is smaller. + * These keys are often a combination of node IDs and port numbers or + * endpoint IDs and node IDs (all currently u32). + * Using the high 32 bits for the node/endpoint ID and the low 32 bits for= the + * port number/node ID will work fine to create keys on platforms where + * unsigned long is 64 bits wide, but obviously is not be possible on + * platforms where unsigned long is smaller. * Virtually split up unsigned long in half and assign the upper bits to - * node IDs and the lower bits to the port number, however big that may be. + * node/endpoint IDs and the lower bits to the port number/node ID, however + * big that may be. */ #define QRTR_XARRAY_INDEX_BITS (8 /* CHAR_BIT */ * sizeof(unsigned long)) #define QRTR_INDEX_HALF_BITS (QRTR_XARRAY_INDEX_BITS >> 1) @@ -457,19 +458,36 @@ static struct qrtr_node *qrtr_node_lookup(unsigned in= t nid) * * This is mostly useful for automatic node id assignment, based on * the source id in the incoming packet. + * + * Return: 0 on success; negative error code on failure */ -static void qrtr_node_assign(struct qrtr_node *node, unsigned int nid) +static int qrtr_node_assign(struct qrtr_node *node, unsigned int nid) { unsigned long flags; + unsigned long key; =20 if (nid =3D=3D QRTR_EP_NID_AUTO) - return; + return 0; + + if (node->ep->id > QRTR_INDEX_HALF_UNSIGNED_MAX || + nid > QRTR_INDEX_HALF_UNSIGNED_MAX) + return -EINVAL; =20 spin_lock_irqsave(&qrtr_nodes_lock, flags); - radix_tree_insert(&qrtr_nodes, nid, node); + + /* Always insert with the endpoint_id + node_id */ + key =3D ((unsigned long)(node->ep->id) << QRTR_INDEX_HALF_BITS) | + ((unsigned long)(nid) & QRTR_INDEX_HALF_UNSIGNED_MAX); + radix_tree_insert(&qrtr_nodes, key, node); + + if (!radix_tree_lookup(&qrtr_nodes, nid)) + radix_tree_insert(&qrtr_nodes, nid, node); + if (node->nid =3D=3D QRTR_EP_NID_AUTO) node->nid =3D nid; spin_unlock_irqrestore(&qrtr_nodes_lock, flags); + + return 0; } =20 /** @@ -563,14 +581,18 @@ int qrtr_endpoint_post(struct qrtr_endpoint *ep, cons= t void *data, size_t len) =20 skb_put_data(skb, data + hdrlen, size); =20 - qrtr_node_assign(node, cb->src_node); + ret =3D qrtr_node_assign(node, cb->src_node); + if (ret) + goto err; =20 if (cb->type =3D=3D QRTR_TYPE_NEW_SERVER) { /* Remote node endpoint can bridge other distant nodes */ const struct qrtr_ctrl_pkt *pkt; =20 pkt =3D data + hdrlen; - qrtr_node_assign(node, le32_to_cpu(pkt->server.node)); + ret =3D qrtr_node_assign(node, le32_to_cpu(pkt->server.node)); + if (ret) + goto err; } =20 if (cb->type =3D=3D QRTR_TYPE_RESUME_TX) { @@ -579,10 +601,13 @@ int qrtr_endpoint_post(struct qrtr_endpoint *ep, cons= t void *data, size_t len) goto err; } else { ipc =3D qrtr_port_lookup(cb->dst_port); - if (!ipc) + if (!ipc) { + ret =3D -EINVAL; goto err; + } =20 - if (sock_queue_rcv_skb(&ipc->sk, skb)) { + ret =3D sock_queue_rcv_skb(&ipc->sk, skb); + if (ret) { qrtr_port_put(ipc); goto err; } @@ -662,7 +687,9 @@ int qrtr_endpoint_register(struct qrtr_endpoint *ep, un= signed int nid) xa_init(&node->qrtr_tx_flow); mutex_init(&node->qrtr_tx_lock); =20 - qrtr_node_assign(node, nid); + rc =3D qrtr_node_assign(node, nid); + if (rc < 0) + goto free_node; =20 mutex_lock(&qrtr_node_lock); list_add(&node->item, &qrtr_all_nodes); --=20 2.34.1 From nobody Fri Sep 25 08:48:16 2026 Received: from meesny.iki.fi (meesny.iki.fi [195.140.195.201]) (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 8DAF243DED9; Tue, 15 Sep 2026 05:45:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=195.140.195.201 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789451103; cv=pass; b=uk2iYCoDhIII+/J0xj2kxFZcGj6anO9JAhG4yOftu7Sohpaxrmlyq1ZArI2kZr+s6nekoumj3sTRuGkBttJfvRlJOmGyWPQfUQ3yefUbXyULIpVd0Rvj+coxOAV0Fp/48ADpaysfzZjyH6hcd1jwUXqiEAAK5YXnF9rbF8kOKCM= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789451103; c=relaxed/simple; bh=v+x6s0wezmJshrC2OL6alpuAOOKBGPsX+k/o8KtBl1U=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=XjuwnIZvwFyhJegviB307quw0bwNYOX51SSRqa0Xk8KwvkEp9G8R/RcTOCJChnO1L5SDxG/IP5+m/IjzYPMcz2NGaAsLAJZ+QM0rH6JMZV9VPvueRVxxpvQWrspZnDPma7e0KyDpoqz4AmwGGKul/iv79RsHKK2+atZ+WDYejB0= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi; spf=pass smtp.mailfrom=iki.fi; dkim=pass (1024-bit key) header.d=iki.fi header.i=@iki.fi header.b=ndqTK2vn; arc=pass smtp.client-ip=195.140.195.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=iki.fi Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=iki.fi header.i=@iki.fi header.b="ndqTK2vn" Received: from mandelbrot.. (xdsl-83-150-90-33.nebulazone.fi [83.150.90.33]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: jmtilli) by meesny.iki.fi (Postfix) with ESMTPSA id 4hkWF336f3zyQw; Tue, 15 Sep 2026 08:44:55 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=meesny; t=1789451095; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=UuXlxW26jpQ7eMuCzH4wvKP0Ct5qqrTEGsSRFeVotqM=; b=ndqTK2vnCDhCV3uv89+twARk3BrX/YGDctr51X/QzpGEoJuUpDPNk3sirZFz1eiSAT4o1p PglbzZJU/pqzTorfmIuBezQYl3qVTZkITEl2BZH+0S1yo1A+lqI4kfdKrLKgVOet10jpUJ q5YFnTx8S+mhpGC3eESXedIiNAI4Oe8= ARC-Seal: i=1; a=rsa-sha256; d=iki.fi; s=meesny; cv=none; t=1789451095; b=DoyUuV7aQYxDulFrFTU/WelxAMsjqgIbSQwP92NdyxeN5YOkCIi2tLtpp0VT/KrGca+v2n qwW8wtBlgJz9+EruxzJrY3NKURIEaEptbNX3NuEzMi40dMj3sTKPXp9FndooInuqWG2b1L EpRDm7A4tFxmqx5w3uxl4k6zFJiwMWI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=meesny; t=1789451095; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=UuXlxW26jpQ7eMuCzH4wvKP0Ct5qqrTEGsSRFeVotqM=; b=xFZglM/LTkp+ddScFu+GRg6UPGW2S9vOfL5KO5iXqK3yYY1k6M1mGzU08k5MoieKmNf4Y1 1YUcbuiNR96hrQTqvcWsSIa2o1xJt6254wMf2DfWKnztaQIwkZJ1n7lZ2YT696Z36lxD2k 73ETjStKH5gcn+ctZ6WuAf9jUX4VY0w= ARC-Authentication-Results: i=1; ORIGINATING; auth=pass smtp.auth=jmtilli smtp.mailfrom=juha-matti.tilli@iki.fi From: Juha-Matti Tilli To: Manivannan Sadhasivam , linux-arm-msm@vger.kernel.org Cc: Juha-Matti Tilli , Jeff Hugo , Jeff Johnson , Bjorn Andersson , Konrad Dybcio , Eric Dumazet , Kuniyuki Iwashima , Paolo Abeni , Willem de Bruijn , "David S. Miller" , Jakub Kicinski , Simon Horman , Mihai Moldovan , Denis Kenzior , Marcel Holtmann , Andy Gross , linux-kernel@vger.kernel.org, mhi@lists.linux.dev, linux-wireless@vger.kernel.org, ath11k@lists.infradead.org, ath12k@lists.infradead.org, netdev@vger.kernel.org Subject: [PATCH v7 06/15] net: qrtr: Report sender endpoint in aux data Date: Tue, 15 Sep 2026 08:41:58 +0300 Message-Id: <20260915054207.2513877-7-juha-matti.tilli@iki.fi> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260915054207.2513877-1-juha-matti.tilli@iki.fi> References: <20260915054207.2513877-1-juha-matti.tilli@iki.fi> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Denis Kenzior Introduce support for reporting the remote endpoint that generated a given QRTR message to clients using AF_QIPCRTR family sockets. This is achieved by including QRTR_ENDPOINT auxiliary data, which carries the endpoint identifier of the message sender. To receive this auxiliary data, clients must explicitly opt-in by using setsockopt with the QRTR_REPORT_ENDPOINT option enabled. Implementation of getsockopt and setsockopt is provided. An additional level 'SOL_QRTR' is added to socket.h for use by AF_QIPCRTR family sockets. Signed-off-by: Denis Kenzior Reviewed-by: Marcel Holtmann Reviewed-by: Andy Gross Signed-off-by: Mihai Moldovan Signed-off-by: Juha-Matti Tilli --- include/linux/socket.h | 1 + include/uapi/linux/qrtr.h | 6 +++ net/qrtr/af_qrtr.c | 77 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 84 insertions(+) diff --git a/include/linux/socket.h b/include/linux/socket.h index 5a5eb12501032..d4e2ba3bd6b39 100644 --- a/include/linux/socket.h +++ b/include/linux/socket.h @@ -400,6 +400,7 @@ struct ucred { #define SOL_MCTP 285 #define SOL_SMC 286 #define SOL_VSOCK 287 +#define SOL_QRTR 288 =20 /* IPX options */ #define IPX_TYPE 1 diff --git a/include/uapi/linux/qrtr.h b/include/uapi/linux/qrtr.h index f7e2fb3d752b5..6d0911984a050 100644 --- a/include/uapi/linux/qrtr.h +++ b/include/uapi/linux/qrtr.h @@ -46,4 +46,10 @@ struct qrtr_ctrl_pkt { }; } __packed; =20 +/* setsockopt / getsockopt */ +#define QRTR_REPORT_ENDPOINT 1 + +/* CMSG */ +#define QRTR_ENDPOINT 1 + #endif /* _LINUX_QRTR_H */ diff --git a/net/qrtr/af_qrtr.c b/net/qrtr/af_qrtr.c index 43e48b89b5cb6..897ecc8dc304d 100644 --- a/net/qrtr/af_qrtr.c +++ b/net/qrtr/af_qrtr.c @@ -26,6 +26,10 @@ =20 #define QRTR_PORT_CTRL_LEGACY 0xffff =20 +enum { + QRTR_F_REPORT_ENDPOINT, +}; + /** * struct qrtr_hdr_v1 - (I|R)PCrouter packet header version 1 * @version: protocol version @@ -79,6 +83,7 @@ struct qrtr_cb { u32 src_port; u32 dst_node; u32 dst_port; + u32 endpoint_id; =20 u8 type; u8 confirm_rx; @@ -92,6 +97,7 @@ struct qrtr_sock { struct sock sk; struct sockaddr_qrtr us; struct sockaddr_qrtr peer; + unsigned long flags; }; =20 static inline struct qrtr_sock *qrtr_sk(struct sock *sk) @@ -567,6 +573,8 @@ int qrtr_endpoint_post(struct qrtr_endpoint *ep, const = void *data, size_t len) if (cb->dst_port =3D=3D QRTR_PORT_CTRL_LEGACY) cb->dst_port =3D QRTR_PORT_CTRL; =20 + cb->endpoint_id =3D ep->id; + if (!size || size > len || len !=3D ALIGN(size, 4) + hdrlen) goto err; =20 @@ -1130,6 +1138,7 @@ static int qrtr_recvmsg(struct socket *sock, struct m= sghdr *msg, size_t size, int flags) { DECLARE_SOCKADDR(struct sockaddr_qrtr *, addr, msg->msg_name); + struct qrtr_sock *ipc =3D qrtr_sk(sock->sk); struct sock *sk =3D sock->sk; struct sk_buff *skb; struct qrtr_cb *cb; @@ -1155,6 +1164,10 @@ static int qrtr_recvmsg(struct socket *sock, struct = msghdr *msg, msg->msg_flags |=3D MSG_TRUNC; } =20 + if (cb->endpoint_id && test_bit(QRTR_F_REPORT_ENDPOINT, &ipc->flags)) + put_cmsg(msg, SOL_QRTR, QRTR_ENDPOINT, + sizeof(cb->endpoint_id), &cb->endpoint_id); + rc =3D skb_copy_datagram_msg(skb, 0, msg, copied); if (rc < 0) goto out; @@ -1300,6 +1313,68 @@ static int qrtr_ioctl(struct socket *sock, unsigned = int cmd, unsigned long arg) return rc; } =20 +static int qrtr_setsockopt(struct socket *sock, int level, int optname, + sockptr_t optval, unsigned int optlen) +{ + struct qrtr_sock *ipc =3D qrtr_sk(sock->sk); + unsigned int val =3D 0; + int rc =3D 0; + + if (level !=3D SOL_QRTR) + return -ENOPROTOOPT; + + if (optlen >=3D sizeof(val) && + copy_from_sockptr(&val, optval, sizeof(val))) + return -EFAULT; + + switch (optname) { + case QRTR_REPORT_ENDPOINT: + assign_bit(QRTR_F_REPORT_ENDPOINT, &ipc->flags, val); + break; + default: + rc =3D -ENOPROTOOPT; + } + + return rc; +} + +static int qrtr_getsockopt(struct socket *sock, int level, int optname, + char __user *optval, int __user *optlen) +{ + struct qrtr_sock *ipc =3D qrtr_sk(sock->sk); + unsigned int val; + int len; + int rc =3D 0; + + if (level !=3D SOL_QRTR) + return -ENOPROTOOPT; + + if (get_user(len, optlen)) + return -EFAULT; + + if (len < sizeof(val)) + return -EINVAL; + + switch (optname) { + case QRTR_REPORT_ENDPOINT: + val =3D test_bit(QRTR_F_REPORT_ENDPOINT, &ipc->flags); + break; + default: + rc =3D -ENOPROTOOPT; + } + + if (rc) + return rc; + + len =3D sizeof(int); + + if (put_user(len, optlen) || + copy_to_user(optval, &val, len)) + rc =3D -EFAULT; + + return rc; +} + static int qrtr_release(struct socket *sock) { struct sock *sk =3D sock->sk; @@ -1347,6 +1422,8 @@ static const struct proto_ops qrtr_proto_ops =3D { .shutdown =3D sock_no_shutdown, .release =3D qrtr_release, .mmap =3D sock_no_mmap, + .setsockopt =3D qrtr_setsockopt, + .getsockopt =3D qrtr_getsockopt, }; =20 static struct proto qrtr_proto =3D { --=20 2.34.1 From nobody Fri Sep 25 08:48:16 2026 Received: from meesny.iki.fi (meesny.iki.fi [195.140.195.201]) (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 708B343E4BA; Tue, 15 Sep 2026 05:45:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=195.140.195.201 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789451121; cv=pass; b=SHLO5SdCfv1MTW4n1fLsiKeI0i9VgnxVxd+rjdb14T0GKJxCnYcRDc8rAdGfaVXJ/WiRlIbKgYIxvYppLLGR74OOnb0aFazQJtxYfULfB82/+lbB2Bbk254gqdXOj94DthN3hENBRv2UakBQ0u20kTfhKVYqqRS8ty+zown4gWs= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789451121; c=relaxed/simple; bh=hdtkGhRfz8rVbNwgtAd+nE20hxvZoyBIqJKmY7rY+Oo=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=oITyCoXEUQ+KE/xnurPvKvRg7v8jE9cNRNpOdFPrChZIrxeArCF9Jxry50ek4sRByKrTeZot8q+pN3YItAlzApRtGY3ko8sL1UU2EhVMZHUjvXM2Y2sM4OsQIUgwsiaPvxlxuwEFQCdNLkaO+O79iYHbVYRCfTbOMkOPvcAr4OE= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi; spf=pass smtp.mailfrom=iki.fi; dkim=pass (1024-bit key) header.d=iki.fi header.i=@iki.fi header.b=qPmWK/pe; arc=pass smtp.client-ip=195.140.195.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=iki.fi Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=iki.fi header.i=@iki.fi header.b="qPmWK/pe" Received: from mandelbrot.. (xdsl-83-150-90-33.nebulazone.fi [83.150.90.33]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: jmtilli) by meesny.iki.fi (Postfix) with ESMTPSA id 4hkWFP2tHhzyQw; Tue, 15 Sep 2026 08:45:13 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=meesny; t=1789451113; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=RWGOLefIcCK3uanL/TxDzRS8ZuMg1qk19zGuow0Q++k=; b=qPmWK/pe1sMTxA1ekKFeoPpguqIQrcUZi0BQPLf2HL2+25Eul1z0d44eBQ1FWgawSaDYiP v0Q7TLJksanRJwzPB8L3D+fcliLwke81WhCqI8kJ8stk23YBQ89lz7V1xksRbhznlSaVI6 XniqeqMZ/KfjkzdGERz6blDy7c8l7tQ= ARC-Seal: i=1; a=rsa-sha256; d=iki.fi; s=meesny; cv=none; t=1789451113; b=my6pJt7M5RhMc/NTnvSd7VFe0t8mxgU0Q70G4o0iqFqtKqMDDEUS52di99126syoc+dnfb oPDKFNwAJecB1QJNrk1nzXHVFJ+YcSmmD6+z22B/3XB5LJutof1Cj/ioJfE3nBiu0k4Xsn PeZGh8g8wQ95I2wld4bfc1U4ix1641w= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=meesny; t=1789451113; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=RWGOLefIcCK3uanL/TxDzRS8ZuMg1qk19zGuow0Q++k=; b=e1kHr/q9ql9rQ2kvdjdEhcXJ715w5YvSSs5mutNpE9hkdBx9E2PdxLJwOe13Nilb1D/aoo X1g6AO0GDPArcSoxLGCRgFzMHdcWZd3H4S+ibvOsqBccd48pzdnLYqolI2TVsDafQvyj2g 9/CGTfSiPGtzsnMrBa/z2JDs0D33LzQ= ARC-Authentication-Results: i=1; ORIGINATING; auth=pass smtp.auth=jmtilli smtp.mailfrom=juha-matti.tilli@iki.fi From: Juha-Matti Tilli To: Manivannan Sadhasivam , linux-arm-msm@vger.kernel.org Cc: Juha-Matti Tilli , Jeff Hugo , Jeff Johnson , Bjorn Andersson , Konrad Dybcio , Eric Dumazet , Kuniyuki Iwashima , Paolo Abeni , Willem de Bruijn , "David S. Miller" , Jakub Kicinski , Simon Horman , Mihai Moldovan , Denis Kenzior , Marcel Holtmann , Andy Gross , linux-kernel@vger.kernel.org, mhi@lists.linux.dev, linux-wireless@vger.kernel.org, ath11k@lists.infradead.org, ath12k@lists.infradead.org, netdev@vger.kernel.org Subject: [PATCH v7 07/15] net: qrtr: Report endpoint for locally generated messages Date: Tue, 15 Sep 2026 08:41:59 +0300 Message-Id: <20260915054207.2513877-8-juha-matti.tilli@iki.fi> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260915054207.2513877-1-juha-matti.tilli@iki.fi> References: <20260915054207.2513877-1-juha-matti.tilli@iki.fi> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Denis Kenzior For messages generated by the local endpoint destined to the local endpoint, report the local endpoint identifier. Same QRTR_ENDPOINT auxiliary data and QRTR_REPORT_ENDPOINT socket option semantics apply as for messages generated by remote endpoints. Signed-off-by: Denis Kenzior Reviewed-by: Marcel Holtmann Reviewed-by: Andy Gross Signed-off-by: Mihai Moldovan Signed-off-by: Juha-Matti Tilli --- net/qrtr/af_qrtr.c | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/net/qrtr/af_qrtr.c b/net/qrtr/af_qrtr.c index 897ecc8dc304d..da7ccf19c6851 100644 --- a/net/qrtr/af_qrtr.c +++ b/net/qrtr/af_qrtr.c @@ -184,9 +184,11 @@ struct qrtr_tx_flow { #define QRTR_TX_FLOW_LOW 5 =20 static int qrtr_local_enqueue(struct qrtr_node *node, struct sk_buff *skb, + u32 endpoint_id, int type, struct sockaddr_qrtr *from, struct sockaddr_qrtr *to); static int qrtr_bcast_enqueue(struct qrtr_node *node, struct sk_buff *skb, + u32 endpoint_id, int type, struct sockaddr_qrtr *from, struct sockaddr_qrtr *to); static struct qrtr_sock *qrtr_port_lookup(int port); @@ -393,6 +395,7 @@ static int qrtr_tx_flow_failed(struct qrtr_node *node, = int dest_node, =20 /* Pass an outgoing packet socket buffer to the endpoint driver. */ static int qrtr_node_enqueue(struct qrtr_node *node, struct sk_buff *skb, + u32 endpoint_id, int type, struct sockaddr_qrtr *from, struct sockaddr_qrtr *to) { @@ -744,7 +747,8 @@ void qrtr_endpoint_unregister(struct qrtr_endpoint *ep) skb =3D qrtr_alloc_ctrl_packet(&pkt, GFP_ATOMIC); if (skb) { pkt->cmd =3D cpu_to_le32(QRTR_TYPE_BYE); - qrtr_local_enqueue(NULL, skb, QRTR_TYPE_BYE, &src, &dst); + qrtr_local_enqueue(NULL, skb, endpoint_id, + QRTR_TYPE_BYE, &src, &dst); } } spin_unlock_irqrestore(&qrtr_nodes_lock, flags); @@ -809,8 +813,8 @@ static void qrtr_port_remove(struct qrtr_sock *ipc) pkt->client.port =3D cpu_to_le32(ipc->us.sq_port); =20 skb_set_owner_w(skb, &ipc->sk); - qrtr_bcast_enqueue(NULL, skb, QRTR_TYPE_DEL_CLIENT, &ipc->us, - &to); + qrtr_bcast_enqueue(NULL, skb, qrtr_local_nid, + QRTR_TYPE_DEL_CLIENT, &ipc->us, &to); } =20 if (port =3D=3D QRTR_PORT_CTRL) @@ -950,6 +954,7 @@ static int qrtr_bind(struct socket *sock, struct sockad= dr_unsized *saddr, int le =20 /* Queue packet to local peer socket. */ static int qrtr_local_enqueue(struct qrtr_node *node, struct sk_buff *skb, + u32 endpoint_id, int type, struct sockaddr_qrtr *from, struct sockaddr_qrtr *to) { @@ -967,6 +972,7 @@ static int qrtr_local_enqueue(struct qrtr_node *node, s= truct sk_buff *skb, cb =3D (struct qrtr_cb *)skb->cb; cb->src_node =3D from->sq_node; cb->src_port =3D from->sq_port; + cb->endpoint_id =3D endpoint_id; =20 if (sock_queue_rcv_skb(&ipc->sk, skb)) { qrtr_port_put(ipc); @@ -981,6 +987,7 @@ static int qrtr_local_enqueue(struct qrtr_node *node, s= truct sk_buff *skb, =20 /* Queue packet for broadcast. */ static int qrtr_bcast_enqueue(struct qrtr_node *node, struct sk_buff *skb, + u32 endpoint_id, int type, struct sockaddr_qrtr *from, struct sockaddr_qrtr *to) { @@ -992,11 +999,11 @@ static int qrtr_bcast_enqueue(struct qrtr_node *node,= struct sk_buff *skb, if (!skbn) break; skb_set_owner_w(skbn, skb->sk); - qrtr_node_enqueue(node, skbn, type, from, to); + qrtr_node_enqueue(node, skbn, endpoint_id, type, from, to); } mutex_unlock(&qrtr_node_lock); =20 - qrtr_local_enqueue(NULL, skb, type, from, to); + qrtr_local_enqueue(NULL, skb, endpoint_id, type, from, to); =20 return 0; } @@ -1004,12 +1011,15 @@ static int qrtr_bcast_enqueue(struct qrtr_node *nod= e, struct sk_buff *skb, static int qrtr_sendmsg(struct socket *sock, struct msghdr *msg, size_t le= n) { DECLARE_SOCKADDR(struct sockaddr_qrtr *, addr, msg->msg_name); - int (*enqueue_fn)(struct qrtr_node *, struct sk_buff *, int, - struct sockaddr_qrtr *, struct sockaddr_qrtr *); + int (*enqueue_fn)(struct qrtr_node *node, struct sk_buff *skb, + u32 endpoint_id, int type, + struct sockaddr_qrtr *from, + struct sockaddr_qrtr *to); __le32 qrtr_type =3D cpu_to_le32(QRTR_TYPE_DATA); struct qrtr_sock *ipc =3D qrtr_sk(sock->sk); struct sock *sk =3D sock->sk; struct qrtr_node *node; + u32 endpoint_id =3D qrtr_local_nid; struct sk_buff *skb; size_t plen; u32 type; @@ -1093,7 +1103,7 @@ static int qrtr_sendmsg(struct socket *sock, struct m= sghdr *msg, size_t len) } =20 type =3D le32_to_cpu(qrtr_type); - rc =3D enqueue_fn(node, skb, type, &ipc->us, addr); + rc =3D enqueue_fn(node, skb, endpoint_id, type, &ipc->us, addr); if (rc >=3D 0) rc =3D len; =20 @@ -1127,7 +1137,8 @@ static int qrtr_send_resume_tx(struct qrtr_cb *cb) pkt->client.node =3D cpu_to_le32(cb->dst_node); pkt->client.port =3D cpu_to_le32(cb->dst_port); =20 - ret =3D qrtr_node_enqueue(node, skb, QRTR_TYPE_RESUME_TX, &local, &remote= ); + ret =3D qrtr_node_enqueue(node, skb, cb->endpoint_id, + QRTR_TYPE_RESUME_TX, &local, &remote); =20 qrtr_node_release(node); =20 --=20 2.34.1 From nobody Fri Sep 25 08:48:16 2026 Received: from lahtoruutu.iki.fi (lahtoruutu.iki.fi [185.185.170.37]) (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 47D973D34A2; Tue, 15 Sep 2026 05:45:59 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=185.185.170.37 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789451160; cv=pass; b=c995GAZthMrVaEPziNUkDYDDDaxVAEF2/sQw3zACOLnM23eX/SbkjtqHAzTYZo+D+1rYot6ZXzcuMNiTa51jpuespFGNvxAV2zNlYRD9Q+LPeAYBaaoXhcX55XTcLw6eo6q6Clyz097Z/YeJ5Hu18GGbmD72zegQBKlB4cEtO+o= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789451160; c=relaxed/simple; bh=QY1A8D3fH5Ocg0eZmlF5oy360Of+P5EZpl0ZY75wxxc=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=HsjrhjCO5sXbjfhNUynrCvk/qSq0PzkDhQb3l1z+7yOBMEp8youPgxCphEECRComo2vi9L1ZhI3pgMKVOelaBi2DfN4f6LDD61DQ4aHJvYR4cRe4nv1mHLD8XeklR4oQfyBOqwy8a6dyLMmV+v9/HdwCd26lTQTqQaL8WK3kd/8= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi; spf=pass smtp.mailfrom=iki.fi; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b=TENYGJ3u; arc=pass smtp.client-ip=185.185.170.37 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=iki.fi Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b="TENYGJ3u" Received: from mandelbrot.. (xdsl-83-150-90-33.nebulazone.fi [83.150.90.33]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: jmtilli) by lahtoruutu.iki.fi (Postfix) with ESMTPSA id 4hkWG90c8wz49Q32; Tue, 15 Sep 2026 08:45:53 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1789451153; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=LAv/+3HXe4Wk5FPqWwSHvR9+eMlqhJUTF/4hhmmGEYo=; b=TENYGJ3upWSpSuJzOKgE6XvJ06GwccwSS/cLNQ5UTwFVCUtrtThSq8YsR9yXQFIfwZZ43I bPUYzoYWDIkpeszdu770rNY0W8Vzg71iPKCN8L00NgHxILhOfHx9Sn4Fjju9af3ArK0Mf+ J9Z8O+G0xszCD5bIhWC5Inxbi/YdFC4fcPtnraDoT9bKkhmssNWrJNa5xnPJe7CaK3csnE 2ynWsQIuF1sJs5FcYr0Mc9vQ3uTBSbQOZXP9OemNsVTvLq9sbIQzVurT9H0KRpVFlP9utw Z4L5c6UCniG4E8ciRfr1jZN+XL1N8dfRw1hF9kaacR3XZ08fl/2tXsyLSofhkQ== ARC-Seal: i=1; a=rsa-sha256; d=iki.fi; s=lahtoruutu; cv=none; t=1789451153; b=pbtYuHiIu19kuwcFgoM9HfmEpFEw8FuZ5iqGwXZ15ELFRraKuQb3e8ZdbBJuHveKbGaloA sokP7GUItL/hTRTN5YmK4Q1a0PnMpA8WUP2EVtp/zp9mswHOnv6InnnPhnMs4gG+7clTMA gGx2+3Ou6BJklyl9LwfbfyWZKBytQkPT52cLj4NByjM8VLHrJ8kX+CWKfgRrDoaeLaCEGc lu23LvnCMnRKU9D+hM+oo5YKdjTymhmMeIWjgIK6upwTKKmtx99GEI0et/FX2a/NLLMuuF cqiqGz3Xy8ul1vA0ld8o39UQRm3Na0Lzkh15fgzU+aZB4yNjDrQMvykHlgA30g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1789451153; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=LAv/+3HXe4Wk5FPqWwSHvR9+eMlqhJUTF/4hhmmGEYo=; b=O5mksl54sbHk91U0BVUvqA1xxzTfz9+BSeovfQ6iIC2SzeC5oArMGeKcSle436+3cl8doO x7TFq14wUEdYagF8w3a2RT3rPYRslL/hcCtrhyCvIL5dYsCjN/EhPIrkZPBPWsPzy2AjVv z5p1dFJP79IcyVsMRWOEIRIpMBMh2SSLgjt3OWyVNmi9AeB8ThsK0Dhvfq+GmOdT4DZhJu BNWZaNBkwgcpUztx3neKvoHyVU/vDUEHOmpSJvBf7liALLcLYX7BKh16mTSGKX5VkEb8tb jXpzaMxMOuJ/HOqre2qRl1sFyxx4Nojnm4KNF7mIMpNluce+arLVsh84erJ1oQ== ARC-Authentication-Results: i=1; ORIGINATING; auth=pass smtp.auth=jmtilli smtp.mailfrom=juha-matti.tilli@iki.fi From: Juha-Matti Tilli To: Manivannan Sadhasivam , linux-arm-msm@vger.kernel.org Cc: Juha-Matti Tilli , Jeff Hugo , Jeff Johnson , Bjorn Andersson , Konrad Dybcio , Eric Dumazet , Kuniyuki Iwashima , Paolo Abeni , Willem de Bruijn , "David S. Miller" , Jakub Kicinski , Simon Horman , Mihai Moldovan , Denis Kenzior , Marcel Holtmann , Andy Gross , linux-kernel@vger.kernel.org, mhi@lists.linux.dev, linux-wireless@vger.kernel.org, ath11k@lists.infradead.org, ath12k@lists.infradead.org, netdev@vger.kernel.org Subject: [PATCH v7 08/15] net: qrtr: Allow sendmsg to target an endpoint Date: Tue, 15 Sep 2026 08:42:00 +0300 Message-Id: <20260915054207.2513877-9-juha-matti.tilli@iki.fi> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260915054207.2513877-1-juha-matti.tilli@iki.fi> References: <20260915054207.2513877-1-juha-matti.tilli@iki.fi> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Denis Kenzior Allow QIPCRTR family sockets to include QRTR_ENDPOINT auxiliary data as part of the sendmsg system call. By including this parameter, the client can ask the kernel to route the message to a given endpoint, in situations where multiple endpoints with conflicting node identifier sets exist in the system. For legacy clients, or clients that do not include QRTR_ENDPOINT data, the endpoint is looked up, as before, by only using the node identifier of the destination qrtr socket address. Signed-off-by: Denis Kenzior Reviewed-by: Marcel Holtmann Reviewed-by: Andy Gross Signed-off-by: Mihai Moldovan Signed-off-by: Juha-Matti Tilli --- net/qrtr/af_qrtr.c | 89 ++++++++++++++++++++++++++++++++++------------ net/qrtr/qrtr.h | 2 ++ 2 files changed, 68 insertions(+), 23 deletions(-) diff --git a/net/qrtr/af_qrtr.c b/net/qrtr/af_qrtr.c index da7ccf19c6851..d4a472f0ac4d1 100644 --- a/net/qrtr/af_qrtr.c +++ b/net/qrtr/af_qrtr.c @@ -106,6 +106,36 @@ static inline struct qrtr_sock *qrtr_sk(struct sock *s= k) return container_of(sk, struct qrtr_sock, sk); } =20 +int qrtr_msg_get_endpoint(struct msghdr *msg, u32 *out_endpoint_id) +{ + struct cmsghdr *cmsg; + u32 endpoint_id =3D 0; + + for_each_cmsghdr(cmsg, msg) { + if (!CMSG_OK(msg, cmsg)) + return -EINVAL; + + if (cmsg->cmsg_level !=3D SOL_QRTR) + continue; + + if (cmsg->cmsg_type !=3D QRTR_ENDPOINT) + return -EINVAL; + + if (cmsg->cmsg_len < CMSG_LEN(sizeof(u32))) + return -EINVAL; + + /* Endpoint ids start at 1 */ + endpoint_id =3D *(u32 *)CMSG_DATA(cmsg); + if (!endpoint_id) + return -EINVAL; + } + + if (out_endpoint_id) + *out_endpoint_id =3D endpoint_id; + + return 0; +} + static unsigned int qrtr_local_nid =3D 1; =20 /* for node ids */ @@ -448,14 +478,23 @@ static int qrtr_node_enqueue(struct qrtr_node *node, = struct sk_buff *skb, * * callers must release with qrtr_node_release() */ -static struct qrtr_node *qrtr_node_lookup(unsigned int nid) +static struct qrtr_node *qrtr_node_lookup(unsigned int endpoint_id, + unsigned int nid) { - struct qrtr_node *node; + struct qrtr_node *node =3D NULL; unsigned long flags; + unsigned long key =3D 0; + + if (endpoint_id > QRTR_INDEX_HALF_UNSIGNED_MAX || + nid > QRTR_INDEX_HALF_UNSIGNED_MAX) + return node; + + key =3D ((unsigned long)(endpoint_id) << QRTR_INDEX_HALF_BITS) | + ((unsigned long)(nid) & QRTR_INDEX_HALF_UNSIGNED_MAX); =20 mutex_lock(&qrtr_node_lock); spin_lock_irqsave(&qrtr_nodes_lock, flags); - node =3D radix_tree_lookup(&qrtr_nodes, nid); + node =3D radix_tree_lookup(&qrtr_nodes, key); node =3D qrtr_node_acquire(node); spin_unlock_irqrestore(&qrtr_nodes_lock, flags); mutex_unlock(&qrtr_node_lock); @@ -1019,6 +1058,7 @@ static int qrtr_sendmsg(struct socket *sock, struct m= sghdr *msg, size_t len) struct qrtr_sock *ipc =3D qrtr_sk(sock->sk); struct sock *sk =3D sock->sk; struct qrtr_node *node; + u32 msg_endpoint_id; u32 endpoint_id =3D qrtr_local_nid; struct sk_buff *skb; size_t plen; @@ -1031,46 +1071,48 @@ static int qrtr_sendmsg(struct socket *sock, struct= msghdr *msg, size_t len) if (len > 65535) return -EMSGSIZE; =20 + rc =3D qrtr_msg_get_endpoint(msg, &msg_endpoint_id); + if (rc < 0) + return rc; + lock_sock(sk); =20 if (addr) { - if (msg->msg_namelen < sizeof(*addr)) { - release_sock(sk); - return -EINVAL; - } + rc =3D -EINVAL; =20 - if (addr->sq_family !=3D AF_QIPCRTR) { - release_sock(sk); - return -EINVAL; - } + if (msg->msg_namelen < sizeof(*addr)) + goto release_sock; + + if (addr->sq_family !=3D AF_QIPCRTR) + goto release_sock; =20 rc =3D qrtr_autobind(sock); - if (rc) { - release_sock(sk); - return rc; - } + if (rc) + goto release_sock; } else if (sk->sk_state =3D=3D TCP_ESTABLISHED) { addr =3D &ipc->peer; } else { - release_sock(sk); - return -ENOTCONN; + rc =3D -ENOTCONN; + goto release_sock; } =20 node =3D NULL; if (addr->sq_node =3D=3D QRTR_NODE_BCAST) { if (addr->sq_port !=3D QRTR_PORT_CTRL && qrtr_local_nid !=3D QRTR_NODE_BCAST) { - release_sock(sk); - return -ENOTCONN; + rc =3D -ENOTCONN; + goto release_sock; } enqueue_fn =3D qrtr_bcast_enqueue; } else if (addr->sq_node =3D=3D ipc->us.sq_node) { enqueue_fn =3D qrtr_local_enqueue; } else { - node =3D qrtr_node_lookup(addr->sq_node); + endpoint_id =3D msg_endpoint_id; + + node =3D qrtr_node_lookup(endpoint_id, addr->sq_node); if (!node) { - release_sock(sk); - return -ECONNRESET; + rc =3D endpoint_id ? -ENXIO : -ECONNRESET; + goto release_sock; } enqueue_fn =3D qrtr_node_enqueue; } @@ -1109,6 +1151,7 @@ static int qrtr_sendmsg(struct socket *sock, struct m= sghdr *msg, size_t len) =20 out_node: qrtr_node_release(node); +release_sock: release_sock(sk); =20 return rc; @@ -1123,7 +1166,7 @@ static int qrtr_send_resume_tx(struct qrtr_cb *cb) struct sk_buff *skb; int ret; =20 - node =3D qrtr_node_lookup(remote.sq_node); + node =3D qrtr_node_lookup(cb->endpoint_id, remote.sq_node); if (!node) return -EINVAL; =20 diff --git a/net/qrtr/qrtr.h b/net/qrtr/qrtr.h index 11b897af05e67..22fcecbf8de23 100644 --- a/net/qrtr/qrtr.h +++ b/net/qrtr/qrtr.h @@ -34,4 +34,6 @@ int qrtr_ns_init(void); =20 void qrtr_ns_remove(void); =20 +int qrtr_msg_get_endpoint(struct msghdr *msg, u32 *out_endpoint_id); + #endif --=20 2.34.1 From nobody Fri Sep 25 08:48:16 2026 Received: from lahtoruutu.iki.fi (lahtoruutu.iki.fi [185.185.170.37]) (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 E950243E48D; Tue, 15 Sep 2026 05:46:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=185.185.170.37 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789451176; cv=pass; b=WE+pg/+IHZKqqWkc4WFmE/owqDlKFhvgn/QkbBWvJEqlLSXnaAlzpKlFqrxVxRrcq/22yGYKk8Oavf26j3GwiWAZZ9ZECkt/iva/hphDAeYIaDjEiP1ZRT5LxCffORJLwTpiFdP/6LtfQG79VyGBTMtUThY88N8y9j7mPUsJcvI= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789451176; c=relaxed/simple; bh=tKWTf1cazHWaXntnYsiXxrJYnrU+iW5fvyj/sDkCDtc=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=AuX56gPdYPp6zEGUF29I2lBL4t+HVs/j14TfQFX3CK0DY27W9fso/e++zVOxIMrGD5ESkzvdISQddDBM3/SXuHSboV8x4zDigPFOdbRP1+O7LnfWulZjZNwdg2mUQu8s0lhqRWHNiga1/EaUWDUbWZC3GbO2jCc+zSrIJX5sgBw= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi; spf=pass smtp.mailfrom=iki.fi; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b=LIhAK7gU; arc=pass smtp.client-ip=185.185.170.37 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=iki.fi Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b="LIhAK7gU" Received: from mandelbrot.. (xdsl-83-150-90-33.nebulazone.fi [83.150.90.33]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: jmtilli) by lahtoruutu.iki.fi (Postfix) with ESMTPSA id 4hkWGT1NHWz49Q32; Tue, 15 Sep 2026 08:46:09 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1789451169; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=+1zGVynj9H5SONi5WNNQRZuKnULVYkGJU/Lsk8iTgW0=; b=LIhAK7gUndGZcf4Yu+z3n6SHullxJtH1x/VxeLjY2AIYXB+MtqUcJBSoT0BJlV0fr3AyX+ YBW+nhgG7TL+aZwNOBmhkyNlDQ8WQIlHcebIDqR6DBbExvEmDQmY4SzfYD0xQ/bb3XH04m /iVPCVo9EBZBua+lNam+AREsp3wxa/Ghr8q8WVRIjdDPn2LnmchStyF3FhB5CYbZ7H2LcW oJUjNKupL44SWz/em8tYrJvvfkhwRD6bOXkZ/7t1CQdSANPQqA5ZCTyG0v/Hi6UktaWEuU rXis+bRlzj1OYpb6bAzvYE0+vb2MCWgTSYSb71ICekctjeJPLfAZFZdrbWfXbA== ARC-Seal: i=1; a=rsa-sha256; d=iki.fi; s=lahtoruutu; cv=none; t=1789451169; b=LHeP2tcneM0Dhi/1cZfiw9chfzytpozj9UnF7wS2cB2oAIvQExK8EYdCvyXSh7wftRcS4Y 3Db06UtIhAVhB7tJ6CFkE9AEkLux4e4WAvfr8zHvCePy89xtOUqHkXcV2b/QRTcSF51FDl ctO7rBfyM82NlTUOUjtz9DMjK2IfvSAY/hnNPj8bnCgFWh6B/a78TobUF9M6oFZifiQymA Q51ocfJlpy+UEeAIAxmYTDp1Kt641+qOH1/M1wfAJ3oL690OOcIpMVHRLd/r68K+LEV0Om 4wm4qWahTJ7o9ij/7yCBjG3sffpASdXwAx/kXzyy5xdze3kSMbo7cKMprH4J3Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1789451169; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=+1zGVynj9H5SONi5WNNQRZuKnULVYkGJU/Lsk8iTgW0=; b=NWwWzXYbDbtaVPdCSzsVXqcOea/p41so3KB9GoikBkfacSm5GTrDX9iQFxPMkxAy5i1RwZ EVnrl1hpPs38vfZ+j5BXrL/Bd1wyl7whExVVkFq8v0I+F82kYPRhdNoFaEnwWFdBX6xTfE MAT/gtl5RCh1WiJFRcNfVmH1D4Q/zq+kLOfBH8hS03qKegp8KGn96uNYn11HgIjIjqVHNG MUNeC6H5jlvyKSfKAxOqTZOksHdUIcYS4s4CyQwonYOWfnhCt9FV7W9QzyZ5o0aa/NCfIP p5SrrJnphsjIbW7yTPuMKRfDtdMn3Zh7kWfDSIdJqqBy4+DNM7jejOEag5B1qg== ARC-Authentication-Results: i=1; ORIGINATING; auth=pass smtp.auth=jmtilli smtp.mailfrom=juha-matti.tilli@iki.fi From: Juha-Matti Tilli To: Manivannan Sadhasivam , linux-arm-msm@vger.kernel.org Cc: Juha-Matti Tilli , Jeff Hugo , Jeff Johnson , Bjorn Andersson , Konrad Dybcio , Eric Dumazet , Kuniyuki Iwashima , Paolo Abeni , Willem de Bruijn , "David S. Miller" , Jakub Kicinski , Simon Horman , Mihai Moldovan , Denis Kenzior , Marcel Holtmann , Andy Gross , linux-kernel@vger.kernel.org, mhi@lists.linux.dev, linux-wireless@vger.kernel.org, ath11k@lists.infradead.org, ath12k@lists.infradead.org, netdev@vger.kernel.org Subject: [PATCH v7 09/15] net: qrtr: allow socket endpoint binding Date: Tue, 15 Sep 2026 08:42:01 +0300 Message-Id: <20260915054207.2513877-10-juha-matti.tilli@iki.fi> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260915054207.2513877-1-juha-matti.tilli@iki.fi> References: <20260915054207.2513877-1-juha-matti.tilli@iki.fi> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Denis Kenzior Introduce the ability to bind a QIPCRTR family socket to a specific endpoint. When a socket is bound, only messages from the bound endpoint can be received, and any messages sent from the socket are by default directed to the bound endpoint. Clients can bind a socket by using the setsockopt system call with the QRTR_BIND_ENDPOINT option set to the desired endpoint binding. A previously set binding can be reset by setting QRTR_BIND_ENDPOINT option to zero. This behavior matches that of SO_BINDTOIFINDEX. This functionality is useful for clients that need to communicate with a specific device (i.e. endpoint), such as a PCIe-based 5G modem, and are not interested in messages from other endpoints / nodes. Signed-off-by: Denis Kenzior Reviewed-by: Marcel Holtmann Reviewed-by: Andy Gross Signed-off-by: Mihai Moldovan Signed-off-by: Juha-Matti Tilli --- include/uapi/linux/qrtr.h | 1 + net/qrtr/af_qrtr.c | 56 ++++++++++++++++++++++++++++----------- 2 files changed, 41 insertions(+), 16 deletions(-) diff --git a/include/uapi/linux/qrtr.h b/include/uapi/linux/qrtr.h index 6d0911984a050..0a8667b049c3d 100644 --- a/include/uapi/linux/qrtr.h +++ b/include/uapi/linux/qrtr.h @@ -48,6 +48,7 @@ struct qrtr_ctrl_pkt { =20 /* setsockopt / getsockopt */ #define QRTR_REPORT_ENDPOINT 1 +#define QRTR_BIND_ENDPOINT 2 =20 /* CMSG */ #define QRTR_ENDPOINT 1 diff --git a/net/qrtr/af_qrtr.c b/net/qrtr/af_qrtr.c index d4a472f0ac4d1..ccfa3ed33a996 100644 --- a/net/qrtr/af_qrtr.c +++ b/net/qrtr/af_qrtr.c @@ -98,6 +98,7 @@ struct qrtr_sock { struct sockaddr_qrtr us; struct sockaddr_qrtr peer; unsigned long flags; + u32 bound_endpoint; }; =20 static inline struct qrtr_sock *qrtr_sk(struct sock *sk) @@ -656,10 +657,14 @@ int qrtr_endpoint_post(struct qrtr_endpoint *ep, cons= t void *data, size_t len) goto err; } =20 - ret =3D sock_queue_rcv_skb(&ipc->sk, skb); - if (ret) { - qrtr_port_put(ipc); - goto err; + /* Sockets bound to an endpoint only rx from that endpoint */ + if (!ipc->bound_endpoint || + ipc->bound_endpoint =3D=3D cb->endpoint_id) { + ret =3D sock_queue_rcv_skb(&ipc->sk, skb); + if (ret) { + qrtr_port_put(ipc); + goto err; + } } =20 qrtr_port_put(ipc); @@ -999,29 +1004,41 @@ static int qrtr_local_enqueue(struct qrtr_node *node= , struct sk_buff *skb, { struct qrtr_sock *ipc; struct qrtr_cb *cb; + int ret =3D -ENODEV; =20 ipc =3D qrtr_port_lookup(to->sq_port); - if (!ipc || &ipc->sk =3D=3D skb->sk) { /* do not send to self */ - if (ipc) - qrtr_port_put(ipc); - kfree_skb(skb); - return -ENODEV; - } + if (!ipc) + goto done; + + if (&ipc->sk =3D=3D skb->sk) /* do not send to self */ + goto done; + + /* + * Filter out unwanted packets that are not on behalf of the bound + * endpoint. Certain special packets (such as an empty NEW_SERVER + * packet that serves as a sentinel value) always go through. + */ + if (endpoint_id && ipc->bound_endpoint && + ipc->bound_endpoint !=3D endpoint_id) + goto done; =20 cb =3D (struct qrtr_cb *)skb->cb; cb->src_node =3D from->sq_node; cb->src_port =3D from->sq_port; cb->endpoint_id =3D endpoint_id; =20 - if (sock_queue_rcv_skb(&ipc->sk, skb)) { - qrtr_port_put(ipc); - kfree_skb(skb); - return -ENOSPC; - } + ret =3D -ENOSPC; + if (sock_queue_rcv_skb(&ipc->sk, skb)) + goto done; =20 qrtr_port_put(ipc); =20 return 0; +done: + if (ipc) + qrtr_port_put(ipc); + kfree_skb(skb); + return ret; } =20 /* Queue packet for broadcast. */ @@ -1107,7 +1124,8 @@ static int qrtr_sendmsg(struct socket *sock, struct m= sghdr *msg, size_t len) } else if (addr->sq_node =3D=3D ipc->us.sq_node) { enqueue_fn =3D qrtr_local_enqueue; } else { - endpoint_id =3D msg_endpoint_id; + endpoint_id =3D msg_endpoint_id ? + msg_endpoint_id : ipc->bound_endpoint; =20 node =3D qrtr_node_lookup(endpoint_id, addr->sq_node); if (!node) { @@ -1385,6 +1403,9 @@ static int qrtr_setsockopt(struct socket *sock, int l= evel, int optname, case QRTR_REPORT_ENDPOINT: assign_bit(QRTR_F_REPORT_ENDPOINT, &ipc->flags, val); break; + case QRTR_BIND_ENDPOINT: + WRITE_ONCE(ipc->bound_endpoint, val); + break; default: rc =3D -ENOPROTOOPT; } @@ -1413,6 +1434,9 @@ static int qrtr_getsockopt(struct socket *sock, int l= evel, int optname, case QRTR_REPORT_ENDPOINT: val =3D test_bit(QRTR_F_REPORT_ENDPOINT, &ipc->flags); break; + case QRTR_BIND_ENDPOINT: + val =3D READ_ONCE(ipc->bound_endpoint); + break; default: rc =3D -ENOPROTOOPT; } --=20 2.34.1 From nobody Fri Sep 25 08:48:16 2026 Received: from lahtoruutu.iki.fi (lahtoruutu.iki.fi [185.185.170.37]) (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 55D5743E07E; Tue, 15 Sep 2026 05:46:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=185.185.170.37 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789451192; cv=pass; b=m00MwDhen5gtpeWaIp10lEXht9VVm3COooo/OisrumwvQOulATFhQNzRhvDuVlb6Aqr1POg5hwToaYvQC/4V/sJEPcdKpv7PuE4fHLjeWjlCnxui6f5ObAKQRl+7yDbFFtTe5JVn22VT29Dz9/JKi1TZTTt5NXHVkSBIsl72YEg= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789451192; c=relaxed/simple; bh=Idzz+qs8f5I+xqu9a7wEtufSLSZ3EedsBKyqg8tf084=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=tI0ArgzH6z5Nadt54v1rsQcikiQ1fO52kJkbxO5KjfHqocQhhNpbHhfU8d4lIObmujVUF+3ARM+nNEcMEGJ5dtVBSXN6qnCcriJWi6vczWKtnG9XnEJmp0+NHlLuNZ/TA09EUfQAR/f2dR0sK3E7ipL7Dkd6r30fpFV8+3JdJ24= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi; spf=pass smtp.mailfrom=iki.fi; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b=L886c2Tv; arc=pass smtp.client-ip=185.185.170.37 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=iki.fi Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b="L886c2Tv" Received: from mandelbrot.. (xdsl-83-150-90-33.nebulazone.fi [83.150.90.33]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: jmtilli) by lahtoruutu.iki.fi (Postfix) with ESMTPSA id 4hkWGn1X1Gz49Q32; Tue, 15 Sep 2026 08:46:25 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1789451185; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=b3qERqGgzrD2T4aK1iBclz+AkDg1ZG2HnPrGpORQgtc=; b=L886c2TvMlIuMg7a7dmCHXKPWL5B5IEX+hfDzxJVKJwv+/LO37JPwb0PnTq3Vy5p+gXi9u ctx/1R72RoScgJZ2mkvfGXFTYtz5bqKLmxhekDC7mUxd7ikshyB6vYMoawAob16gM9l26e p0FfRHO41/j6RsGLYkFXlg0R/Ts9WNF26taxAoNpkAmY+9Rln3h8ioSLR2iUnTAX4v+LN5 ytcQqDYLJzLlDg//39ntBtxLN3BiHfol7oUkfHXbX49g1UC0f+Wy11hr4FIq0DrAaHd59A YtiM6h7tRIAxElgNX1TWBn+5bmDM8X96SbKqs27yVvc6DSbITAy9lrlYRC1qZg== ARC-Seal: i=1; a=rsa-sha256; d=iki.fi; s=lahtoruutu; cv=none; t=1789451185; b=eJkRRfc2jdgz9gfZv3fKKtxGBolN4wY2oAswvrOgKGGh4R1ajbxfRR5GL6fOqGRURh1YwX sEFmq0Xme8unHOKHfoTmIxeQvxii2msQ6yEtjFqfykuwUePTSDmHYHDzMQIRVcRVAvMKUP OwRkmLlLasT/rJBVLGU9N/SNpeUuIhXGsZHoq5Qfbzo7vlBl6LLlnOnKj6LiGs4hRyAP6+ dgo6/ZvDMgCz6GBvgyBHvLjunanGM/KxO1RN39e/Nz2VvktPRqqZl+2DIqvoYuCHesDXyy wGei7J6O2XWE9fhWfJuQXBCjVhKR3TTNwi0gVkTA5DM0+oYXWuA/GgYQg/BaSA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1789451185; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=b3qERqGgzrD2T4aK1iBclz+AkDg1ZG2HnPrGpORQgtc=; b=UQv6m/WtJ2T0Fcb77OBZkn7GOJLESp/+1FzWbyJHxzltCa2wJcVKtKnaJamqzkVU57m+TR 87TWlr0ETZHv8wDbxAYueD8sAvVz+1BsK9KCJjMxX6XKgz/j7UBj9NB9FCq8xZizNMll9U 7aSl52sH78GCgxlcNyfUXo36uEH04WJrl0Mqc4I48RlNdjHbqMsKw4/5rNpo/atukRJyAX NeJL3Cz5i3XXqTP5ttYM50pxw1hg65Nw0twyXomUHPiHJ9msBb/d6otaj8kz1QiagipCuo IJaJZhhIrm5TmQm9t1XXJpj46QCfMJV/YXmFGEr3gdYEuWJr46//vFHPwmDLHw== ARC-Authentication-Results: i=1; ORIGINATING; auth=pass smtp.auth=jmtilli smtp.mailfrom=juha-matti.tilli@iki.fi From: Juha-Matti Tilli To: Manivannan Sadhasivam , linux-arm-msm@vger.kernel.org Cc: Juha-Matti Tilli , Jeff Hugo , Jeff Johnson , Bjorn Andersson , Konrad Dybcio , Eric Dumazet , Kuniyuki Iwashima , Paolo Abeni , Willem de Bruijn , "David S. Miller" , Jakub Kicinski , Simon Horman , Mihai Moldovan , Denis Kenzior , Marcel Holtmann , Andy Gross , linux-kernel@vger.kernel.org, mhi@lists.linux.dev, linux-wireless@vger.kernel.org, ath11k@lists.infradead.org, ath12k@lists.infradead.org, netdev@vger.kernel.org Subject: [PATCH v7 10/15] net: qrtr: Drop remote {NEW|DEL}_LOOKUP messages Date: Tue, 15 Sep 2026 08:42:02 +0300 Message-Id: <20260915054207.2513877-11-juha-matti.tilli@iki.fi> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260915054207.2513877-1-juha-matti.tilli@iki.fi> References: <20260915054207.2513877-1-juha-matti.tilli@iki.fi> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Denis Kenzior These messages are explicitly filtered out by the in-kernel name service (ns.c). Filter them out even earlier to save some CPU cycles. Signed-off-by: Denis Kenzior Reviewed-by: Marcel Holtmann Reviewed-by: Andy Gross Signed-off-by: Mihai Moldovan Signed-off-by: Juha-Matti Tilli --- net/qrtr/af_qrtr.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/net/qrtr/af_qrtr.c b/net/qrtr/af_qrtr.c index ccfa3ed33a996..c139786c56f39 100644 --- a/net/qrtr/af_qrtr.c +++ b/net/qrtr/af_qrtr.c @@ -621,6 +621,11 @@ int qrtr_endpoint_post(struct qrtr_endpoint *ep, const= void *data, size_t len) if (!size || size > len || len !=3D ALIGN(size, 4) + hdrlen) goto err; =20 + /* Don't allow remote lookups */ + if (cb->type =3D=3D QRTR_TYPE_NEW_LOOKUP || + cb->type =3D=3D QRTR_TYPE_DEL_LOOKUP) + goto err; + if ((cb->type =3D=3D QRTR_TYPE_NEW_SERVER || cb->type =3D=3D QRTR_TYPE_RESUME_TX) && size < sizeof(struct qrtr_ctrl_pkt)) --=20 2.34.1 From nobody Fri Sep 25 08:48:16 2026 Received: from lahtoruutu.iki.fi (lahtoruutu.iki.fi [185.185.170.37]) (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 9163843CE41; Tue, 15 Sep 2026 05:46:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=185.185.170.37 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789451211; cv=pass; b=ZSsT1j2ZuBTIqfYU2E6kE65qOBZu7xwVTQrsSOYt48E62U0mmsPR/SLFIerVrSxIt3RqiiDzsbD8CdV/TuM6197q7xtEX+ftSJQ2QgnBgZCDIZEjx89MDIdEHp6osFib0/OvOapGhlf5lB8wAHGhNdCSVLWPSKF4UgzHm45NwWM= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789451211; c=relaxed/simple; bh=8pzmrrVnvgNB4HH7DllpTPe7JHx0H0GF9O6s6WxiCKg=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=Pc2ddDhjWDCQPDD4/vbutg6LOVVTmDQi7boAmUjPKE3aTzwrJYBUuAkmGK+qi5laSfPfXyTiE7083EGTfg66ebWRz2aekCcPNiKDRQwjgeQKq0cjkWGeDHsMw+nWGEwMCi/Iikm7fnD2utA8SEK+WdcAglWJHBVZHIsO8WBleqY= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi; spf=pass smtp.mailfrom=iki.fi; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b=wPILu8Ft; arc=pass smtp.client-ip=185.185.170.37 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=iki.fi Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b="wPILu8Ft" Received: from mandelbrot.. (xdsl-83-150-90-33.nebulazone.fi [83.150.90.33]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: jmtilli) by lahtoruutu.iki.fi (Postfix) with ESMTPSA id 4hkWH601HYz49Q32; Tue, 15 Sep 2026 08:46:42 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1789451202; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=KxfpSm4jC+uUVpycRkrBNbqmuq5JnX7Rrdb/3eU15Yw=; b=wPILu8FtcW0Z5+DOGuTSqqAC5VdBj6u7jvyeldHGLwUQGIRMUEsz8tLHPx0iHYf1Lhutaj 1UE9a0/UwNpWcY2elUQn4r6vqKvlKm6urj3ew6oa+1rSMRY6mlkLREMoEFbigSlOuxjPKG Lwda1ay4/SmkYg/HrE8492+aY+vQyFwuyCQvfu9avOBI6g1aCO34JXIA5KYzMPDt6ikVLi /Gej+nSPwgWT2GMPbRZUE+wiFlvDeO96JTCATSLwDOhQ0wsjQRdk0mzoEjoXjXNQUv+jUr Hm0DP2SiTP+OMblHWt+0wq64FqrV6GYMm4Za32Iq0Bk8bajoAbsNSCTW8mCWUw== ARC-Seal: i=1; a=rsa-sha256; d=iki.fi; s=lahtoruutu; cv=none; t=1789451202; b=uKvEai74zvtiVp52QkmOXTUt1wH2wcNMZklQl6urhQfQ4XnhTQxnGsuH5XabeLeMHIS1xa cNv20r7LDwgw6aA379R/SvIlRAnoWzSsZQLSMENjZhd3fooLitPEedftzmcy3AX46Wm3Vb dC7yncr6zOjT7kLUEvegagRu1aFXd8iuzZCO6UKaxvFzsM9sWHufDi9hWvHf/GgSV9WKTB gQDTTOvFRWxJbdIUSRHjRApfmNTil+9Lp0FhlJTt+ITFK9Jz8lKkwQ2w81i/033Cqzoi6N cYorzbpPf81bBqH0Fx6sWDQ2opr0tIsNQae7hQWb9XpQXfbjYcyDtk8xZSe6Gw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1789451202; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=KxfpSm4jC+uUVpycRkrBNbqmuq5JnX7Rrdb/3eU15Yw=; b=WcREKB8t2A2wv2TiVmFZ0/nOHgA7rTO8smdan7jNLCBDUBLEbL8PdQkPlJNMG+nbzyiUSq xOXOuM3P97ZbDCP4+AL99ceb06iFUnx8b7Jkrx7mMCNZ2UqrvuTI2Sx7i30zw1AAYXkK4y DrkzJ9PMCgABj6ypchwiJGsgVVM+8pLR0mO9trflJSSqh2exAjdK955heGBRkCZ4yeFEwC Y1vkxjGYAgCBJY6Mq/zLtxml58Shy+N0fdlOjR9GImzc89dCKV11uHa1qrUAcbON7Z+jeU 5HIDj7ttK1mzNhC/hsBV+r2+lh093RZBXlhFCvj80NCaZIfidhw8v1nhnqaWnw== ARC-Authentication-Results: i=1; ORIGINATING; auth=pass smtp.auth=jmtilli smtp.mailfrom=juha-matti.tilli@iki.fi From: Juha-Matti Tilli To: Manivannan Sadhasivam , linux-arm-msm@vger.kernel.org Cc: Juha-Matti Tilli , Jeff Hugo , Jeff Johnson , Bjorn Andersson , Konrad Dybcio , Eric Dumazet , Kuniyuki Iwashima , Paolo Abeni , Willem de Bruijn , "David S. Miller" , Jakub Kicinski , Simon Horman , Mihai Moldovan , Denis Kenzior , Marcel Holtmann , Andy Gross , linux-kernel@vger.kernel.org, mhi@lists.linux.dev, linux-wireless@vger.kernel.org, ath11k@lists.infradead.org, ath12k@lists.infradead.org, netdev@vger.kernel.org Subject: [PATCH v7 11/15] net: qrtr: ns: support multiple endpoints Date: Tue, 15 Sep 2026 08:42:03 +0300 Message-Id: <20260915054207.2513877-12-juha-matti.tilli@iki.fi> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260915054207.2513877-1-juha-matti.tilli@iki.fi> References: <20260915054207.2513877-1-juha-matti.tilli@iki.fi> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Denis Kenzior Extend the qrtr name service with the concept of an endpoint. Endpoints can be remote or local, and are represented by a unique endpoint id. This allows the qrtr name service to support multiple devices (endpoints) that might have overlapping node / port combinations. The socket used by the name service is subscribed to receive endpoint information via a mechanism similar to the SOL_QRTR QRTR_REPORT_ENDPOINT socket option. Internal data structures are then extended to track endpoint information in addition to nodes and ports. The name service directs packets to the endpoint originating the request. For NEW_SERVER and DEL_SERVER messages triggered using lookups or due to remote endpoints sending the corresponding message, qrtr name service generates a NEW_SERVER and DEL_SERVER messages to all local sockets registered to receive such notifications. The messages are made to look as if they're coming from the remote endpoint using a special extension to AF_QRTR sendmsg operation. This extension only works for the local socket that owns the QRTR_PORT_CTRL port (name service). Signed-off-by: Denis Kenzior Reviewed-by: Marcel Holtmann Reviewed-by: Andy Gross Signed-off-by: Mihai Moldovan Signed-off-by: Juha-Matti Tilli --- net/qrtr/af_qrtr.c | 12 ++ net/qrtr/ns.c | 313 ++++++++++++++++++++++++++++----------------- net/qrtr/qrtr.h | 1 + 3 files changed, 209 insertions(+), 117 deletions(-) diff --git a/net/qrtr/af_qrtr.c b/net/qrtr/af_qrtr.c index c139786c56f39..b27c5a659795d 100644 --- a/net/qrtr/af_qrtr.c +++ b/net/qrtr/af_qrtr.c @@ -107,6 +107,13 @@ static inline struct qrtr_sock *qrtr_sk(struct sock *s= k) return container_of(sk, struct qrtr_sock, sk); } =20 +void qrtr_sock_set_report_endpoint(struct sock *sk) +{ + struct qrtr_sock *ipc =3D qrtr_sk(sk); + + assign_bit(QRTR_F_REPORT_ENDPOINT, &ipc->flags, 1); +} + int qrtr_msg_get_endpoint(struct msghdr *msg, u32 *out_endpoint_id) { struct cmsghdr *cmsg; @@ -1165,6 +1172,11 @@ static int qrtr_sendmsg(struct socket *sock, struct = msghdr *msg, size_t len) =20 /* control messages already require the type as 'command' */ skb_copy_bits(skb, 0, &qrtr_type, 4); + /* + * Allow local name service to make packets appear as if + * they originated remotely + */ + endpoint_id =3D msg_endpoint_id; } =20 type =3D le32_to_cpu(qrtr_type); diff --git a/net/qrtr/ns.c b/net/qrtr/ns.c index a3348e40d9275..31dfa764e186a 100644 --- a/net/qrtr/ns.c +++ b/net/qrtr/ns.c @@ -5,6 +5,7 @@ * Copyright (c) 2020, Linaro Ltd. */ =20 +#define pr_fmt(fmt) "QRTR NS: "fmt #include #include #include @@ -16,7 +17,7 @@ #define CREATE_TRACE_POINTS #include =20 -static DEFINE_XARRAY(nodes); +static DEFINE_XARRAY(endpoints); =20 static struct { struct socket *sock; @@ -62,6 +63,7 @@ struct qrtr_server { =20 unsigned int node; unsigned int port; + u32 endpoint_id; =20 struct list_head qli; }; @@ -72,6 +74,11 @@ struct qrtr_node { u32 server_count; }; =20 +struct qrtr_ns_endpoint { + unsigned int id; + struct xarray nodes; +}; + /* Max nodes, server, lookup limits are chosen based on the current platfo= rm * requirements. If the requirement changes in the future, these values ca= n be * increased. @@ -82,35 +89,90 @@ struct qrtr_node { =20 static u16 node_count; =20 -static struct qrtr_node *node_get(unsigned int node_id) +static struct qrtr_node *node_get(u32 endpoint_id, unsigned int node_id) { + struct qrtr_ns_endpoint *endpoint; struct qrtr_node *node; + bool new_endpoint =3D false; + + endpoint =3D xa_load(&endpoints, endpoint_id); + if (!endpoint) { + endpoint =3D kzalloc_obj(*endpoint); + if (!endpoint) + return NULL; + + endpoint->id =3D endpoint_id; + xa_init(&endpoint->nodes); + + if (xa_store(&endpoints, endpoint_id, endpoint, GFP_KERNEL)) { + kfree(endpoint); + return NULL; + } + + new_endpoint =3D true; + } =20 - node =3D xa_load(&nodes, node_id); + node =3D xa_load(&endpoint->nodes, node_id); if (node) return node; =20 if (node_count >=3D QRTR_NS_MAX_NODES) { pr_err_ratelimited("QRTR clients exceed max node limit!\n"); - return NULL; + goto error; } =20 /* If node didn't exist, allocate and insert it to the tree */ node =3D kzalloc_obj(*node); if (!node) - return NULL; + goto error; =20 node->id =3D node_id; xa_init(&node->servers); =20 - if (xa_store(&nodes, node_id, node, GFP_KERNEL)) { + if (xa_store(&endpoint->nodes, node_id, node, GFP_KERNEL)) { kfree(node); - return NULL; + goto error; } =20 node_count++; =20 return node; +error: + if (new_endpoint) { + xa_erase(&endpoints, endpoint_id); + kfree(endpoint); + } + + return NULL; +} + +static void node_erase(u32 endpoint_id, unsigned int node_id) +{ + struct qrtr_ns_endpoint *endpoint; + struct qrtr_node *node; + + endpoint =3D xa_load(&endpoints, endpoint_id); + if (!endpoint) + return; + + node =3D xa_load(&endpoint->nodes, node_id); + if (!node) + return; + + xa_erase(&endpoint->nodes, node_id); + kfree(node); + node_count--; +} + +static struct qrtr_node *node_lookup(u32 endpoint_id, unsigned int node_id) +{ + struct qrtr_ns_endpoint *endpoint; + + endpoint =3D xa_load(&endpoints, endpoint_id); + if (!endpoint) + return NULL; + + return xa_load(&endpoint->nodes, node_id); } =20 static int server_match(const struct qrtr_server *srv, @@ -126,19 +188,42 @@ static int server_match(const struct qrtr_server *srv, return (srv->instance & ifilter) =3D=3D f->instance; } =20 -static int service_announce_new(struct sockaddr_qrtr *dest, - struct qrtr_server *srv) +static int qrtr_ns_sendmsg(u32 endpoint_id, struct sockaddr_qrtr *dest, + struct qrtr_ctrl_pkt *pkt) { - struct qrtr_ctrl_pkt pkt; struct msghdr msg =3D { }; struct kvec iv; + u8 control[CMSG_SPACE(sizeof(endpoint_id))]; + struct cmsghdr *cmsg; + + iv.iov_base =3D pkt; + iv.iov_len =3D sizeof(*pkt); + + msg.msg_name =3D (struct sockaddr *)dest; + msg.msg_namelen =3D sizeof(*dest); + + if (endpoint_id) { + msg.msg_control =3D control; + msg.msg_controllen =3D sizeof(control); + + cmsg =3D CMSG_FIRSTHDR(&msg); + cmsg->cmsg_level =3D SOL_QRTR; + cmsg->cmsg_type =3D QRTR_ENDPOINT; + cmsg->cmsg_len =3D CMSG_LEN(sizeof(endpoint_id)); + memcpy(CMSG_DATA(cmsg), &endpoint_id, sizeof(endpoint_id)); + } + + return kernel_sendmsg(qrtr_ns.sock, &msg, &iv, 1, sizeof(*pkt)); +} + +static int service_announce_new(u32 endpoint_id, struct sockaddr_qrtr *des= t, + struct qrtr_server *srv) +{ + struct qrtr_ctrl_pkt pkt; =20 trace_qrtr_ns_service_announce_new(srv->service, srv->instance, srv->node, srv->port); =20 - iv.iov_base =3D &pkt; - iv.iov_len =3D sizeof(pkt); - memset(&pkt, 0, sizeof(pkt)); pkt.cmd =3D cpu_to_le32(QRTR_TYPE_NEW_SERVER); pkt.server.service =3D cpu_to_le32(srv->service); @@ -146,26 +231,18 @@ static int service_announce_new(struct sockaddr_qrtr = *dest, pkt.server.node =3D cpu_to_le32(srv->node); pkt.server.port =3D cpu_to_le32(srv->port); =20 - msg.msg_name =3D (struct sockaddr *)dest; - msg.msg_namelen =3D sizeof(*dest); - - return kernel_sendmsg(qrtr_ns.sock, &msg, &iv, 1, sizeof(pkt)); + return qrtr_ns_sendmsg(endpoint_id, dest, &pkt); } =20 -static void service_announce_del(struct sockaddr_qrtr *dest, +static void service_announce_del(u32 endpoint_id, struct sockaddr_qrtr *de= st, struct qrtr_server *srv) { struct qrtr_ctrl_pkt pkt; - struct msghdr msg =3D { }; - struct kvec iv; int ret; =20 trace_qrtr_ns_service_announce_del(srv->service, srv->instance, srv->node, srv->port); =20 - iv.iov_base =3D &pkt; - iv.iov_len =3D sizeof(pkt); - memset(&pkt, 0, sizeof(pkt)); pkt.cmd =3D cpu_to_le32(QRTR_TYPE_DEL_SERVER); pkt.server.service =3D cpu_to_le32(srv->service); @@ -173,26 +250,24 @@ static void service_announce_del(struct sockaddr_qrtr= *dest, pkt.server.node =3D cpu_to_le32(srv->node); pkt.server.port =3D cpu_to_le32(srv->port); =20 - msg.msg_name =3D (struct sockaddr *)dest; - msg.msg_namelen =3D sizeof(*dest); - - ret =3D kernel_sendmsg(qrtr_ns.sock, &msg, &iv, 1, sizeof(pkt)); + ret =3D qrtr_ns_sendmsg(endpoint_id, dest, &pkt); if (ret < 0 && ret !=3D -ENODEV) pr_err("failed to announce del service\n"); =20 return; } =20 -static void lookup_notify(struct sockaddr_qrtr *to, struct qrtr_server *sr= v, - bool new) +static void lookup_notify(u32 endpoint_id, struct sockaddr_qrtr *to, + struct qrtr_server *srv, bool new) { struct qrtr_ctrl_pkt pkt; - struct msghdr msg =3D { }; - struct kvec iv; int ret; =20 - iv.iov_base =3D &pkt; - iv.iov_len =3D sizeof(pkt); + /* + * Notify a local client at @to about a server change. The aux data + * will look as if it came from the endpoint that reported the event + * (remote or local) + */ =20 memset(&pkt, 0, sizeof(pkt)); pkt.cmd =3D new ? cpu_to_le32(QRTR_TYPE_NEW_SERVER) : @@ -204,28 +279,25 @@ static void lookup_notify(struct sockaddr_qrtr *to, s= truct qrtr_server *srv, pkt.server.port =3D cpu_to_le32(srv->port); } =20 - msg.msg_name =3D (struct sockaddr *)to; - msg.msg_namelen =3D sizeof(*to); - - ret =3D kernel_sendmsg(qrtr_ns.sock, &msg, &iv, 1, sizeof(pkt)); + ret =3D qrtr_ns_sendmsg(endpoint_id, to, &pkt); if (ret < 0 && ret !=3D -ENODEV) pr_err("failed to send lookup notification\n"); } =20 -static int announce_servers(struct sockaddr_qrtr *sq) +static int announce_servers(u32 endpoint_id, struct sockaddr_qrtr *sq) { struct qrtr_server *srv; struct qrtr_node *node; unsigned long index; int ret; =20 - node =3D node_get(qrtr_ns.local_node); + node =3D node_lookup(qrtr_ns.local_node, qrtr_ns.local_node); if (!node) return 0; =20 - /* Announce the list of servers registered in this node */ + /* Announce servers registered on local endpoint to remote endpoint */ xa_for_each(&node->servers, index, srv) { - ret =3D service_announce_new(sq, srv); + ret =3D service_announce_new(endpoint_id, sq, srv); if (ret < 0) { if (ret =3D=3D -ENODEV) continue; @@ -237,7 +309,8 @@ static int announce_servers(struct sockaddr_qrtr *sq) return 0; } =20 -static struct qrtr_server *server_add(unsigned int service, +static struct qrtr_server *server_add(u32 endpoint_id, + unsigned int service, unsigned int instance, unsigned int node_id, unsigned int port) @@ -249,7 +322,7 @@ static struct qrtr_server *server_add(unsigned int serv= ice, if (!service || !port) return NULL; =20 - node =3D node_get(node_id); + node =3D node_get(endpoint_id, node_id); if (!node) return NULL; =20 @@ -293,7 +366,8 @@ static struct qrtr_server *server_add(unsigned int serv= ice, return NULL; } =20 -static int server_del(struct qrtr_node *node, unsigned int port, bool bcas= t) +static int server_del(u32 endpoint_id, struct qrtr_node *node, + unsigned int port, bool bcast) { struct qrtr_lookup *lookup; struct qrtr_server *srv; @@ -305,9 +379,10 @@ static int server_del(struct qrtr_node *node, unsigned= int port, bool bcast) =20 xa_erase(&node->servers, port); =20 - /* Broadcast the removal of local servers */ + /* Broadcast the removal of local servers to remote endpoints */ if (srv->node =3D=3D qrtr_ns.local_node && bcast) - service_announce_del(&qrtr_ns.bcast_sq, srv); + service_announce_del(qrtr_ns.local_node, + &qrtr_ns.bcast_sq, srv); =20 /* Announce the service's disappearance to observers */ list_for_each(li, &qrtr_ns.lookups) { @@ -317,7 +392,7 @@ static int server_del(struct qrtr_node *node, unsigned = int port, bool bcast) if (lookup->instance && lookup->instance !=3D srv->instance) continue; =20 - lookup_notify(&lookup->sq, srv, false); + lookup_notify(endpoint_id, &lookup->sq, srv, false); } =20 kfree(srv); @@ -326,23 +401,15 @@ static int server_del(struct qrtr_node *node, unsigne= d int port, bool bcast) return 0; } =20 -static int say_hello(struct sockaddr_qrtr *dest) +static int say_hello(u32 endpoint_id, struct sockaddr_qrtr *dest) { struct qrtr_ctrl_pkt pkt; - struct msghdr msg =3D { }; - struct kvec iv; int ret; =20 - iv.iov_base =3D &pkt; - iv.iov_len =3D sizeof(pkt); - memset(&pkt, 0, sizeof(pkt)); pkt.cmd =3D cpu_to_le32(QRTR_TYPE_HELLO); =20 - msg.msg_name =3D (struct sockaddr *)dest; - msg.msg_namelen =3D sizeof(*dest); - - ret =3D kernel_sendmsg(qrtr_ns.sock, &msg, &iv, 1, sizeof(pkt)); + ret =3D qrtr_ns_sendmsg(endpoint_id, dest, &pkt); if (ret < 0) pr_err("failed to send hello msg\n"); =20 @@ -350,42 +417,38 @@ static int say_hello(struct sockaddr_qrtr *dest) } =20 /* Announce the list of servers registered on the local node */ -static int ctrl_cmd_hello(struct sockaddr_qrtr *sq) +static int ctrl_cmd_hello(u32 endpoint_id, struct sockaddr_qrtr *sq) { int ret; =20 - ret =3D say_hello(sq); + /* Send Hello and New Server messages to remote endpoint */ + ret =3D say_hello(endpoint_id, sq); if (ret < 0) return ret; =20 - return announce_servers(sq); + return announce_servers(endpoint_id, sq); } =20 -static int ctrl_cmd_bye(struct sockaddr_qrtr *from) +static int ctrl_cmd_bye(u32 endpoint_id, struct sockaddr_qrtr *from) { struct qrtr_node *local_node; struct qrtr_ctrl_pkt pkt; struct qrtr_server *srv; struct sockaddr_qrtr sq; - struct msghdr msg =3D { }; struct qrtr_node *node; unsigned long index; - struct kvec iv; int ret =3D 0; =20 - iv.iov_base =3D &pkt; - iv.iov_len =3D sizeof(pkt); - - node =3D node_get(from->sq_node); + node =3D node_get(endpoint_id, from->sq_node); if (!node) return 0; =20 /* Advertise removal of this client to all servers of remote node */ xa_for_each(&node->servers, index, srv) - server_del(node, srv->port, true); + server_del(endpoint_id, node, srv->port, true); =20 /* Advertise the removal of this client to all local servers */ - local_node =3D node_get(qrtr_ns.local_node); + local_node =3D node_get(qrtr_ns.local_node, qrtr_ns.local_node); if (!local_node) { ret =3D 0; goto delete_node; @@ -400,10 +463,8 @@ static int ctrl_cmd_bye(struct sockaddr_qrtr *from) sq.sq_node =3D srv->node; sq.sq_port =3D srv->port; =20 - msg.msg_name =3D (struct sockaddr *)&sq; - msg.msg_namelen =3D sizeof(sq); - - ret =3D kernel_sendmsg(qrtr_ns.sock, &msg, &iv, 1, sizeof(pkt)); + /* Bye will look as if it came from endpoint_id */ + ret =3D qrtr_ns_sendmsg(endpoint_id, &sq, &pkt); if (ret < 0 && ret !=3D -ENODEV) { pr_err("failed to send bye cmd\n"); goto delete_node; @@ -414,32 +475,25 @@ static int ctrl_cmd_bye(struct sockaddr_qrtr *from) ret =3D 0; =20 delete_node: - xa_erase(&nodes, from->sq_node); - kfree(node); - node_count--; + node_erase(endpoint_id, from->sq_node); =20 return ret; } =20 -static int ctrl_cmd_del_client(struct sockaddr_qrtr *from, +static int ctrl_cmd_del_client(u32 endpoint_id, struct sockaddr_qrtr *from, unsigned int node_id, unsigned int port) { struct qrtr_node *local_node; struct qrtr_lookup *lookup; struct qrtr_ctrl_pkt pkt; - struct msghdr msg =3D { }; struct qrtr_server *srv; struct sockaddr_qrtr sq; struct qrtr_node *node; struct list_head *tmp; struct list_head *li; unsigned long index; - struct kvec iv; int ret; =20 - iv.iov_base =3D &pkt; - iv.iov_len =3D sizeof(pkt); - /* Don't accept spoofed messages */ if (from->sq_node !=3D node_id) return -EINVAL; @@ -465,12 +519,12 @@ static int ctrl_cmd_del_client(struct sockaddr_qrtr *= from, * DEL_SERVER. Neighbours would've already removed the server belonging * to this port due to the DEL_CLIENT broadcast from qrtr_port_remove(). */ - node =3D node_get(node_id); + node =3D node_lookup(endpoint_id, node_id); if (node) - server_del(node, port, false); + server_del(endpoint_id, node, port, false); =20 /* Advertise the removal of this client to all local servers */ - local_node =3D node_get(qrtr_ns.local_node); + local_node =3D node_lookup(qrtr_ns.local_node, qrtr_ns.local_node); if (!local_node) return 0; =20 @@ -484,10 +538,8 @@ static int ctrl_cmd_del_client(struct sockaddr_qrtr *f= rom, sq.sq_node =3D srv->node; sq.sq_port =3D srv->port; =20 - msg.msg_name =3D (struct sockaddr *)&sq; - msg.msg_namelen =3D sizeof(sq); - - ret =3D kernel_sendmsg(qrtr_ns.sock, &msg, &iv, 1, sizeof(pkt)); + /* Del Client will look as if it came from endpoint_id */ + ret =3D qrtr_ns_sendmsg(endpoint_id, &sq, &pkt); if (ret < 0 && ret !=3D -ENODEV) { pr_err("failed to send del client cmd\n"); return ret; @@ -496,7 +548,7 @@ static int ctrl_cmd_del_client(struct sockaddr_qrtr *fr= om, return 0; } =20 -static int ctrl_cmd_new_server(struct sockaddr_qrtr *from, +static int ctrl_cmd_new_server(u32 endpoint_id, struct sockaddr_qrtr *from, unsigned int service, unsigned int instance, unsigned int node_id, unsigned int port) { @@ -511,12 +563,16 @@ static int ctrl_cmd_new_server(struct sockaddr_qrtr *= from, port =3D from->sq_port; } =20 - srv =3D server_add(service, instance, node_id, port); - if (!srv) + srv =3D server_add(endpoint_id, service, instance, node_id, port); + if (!srv) { + pr_err("Failed to add server\n"); return -EINVAL; + } =20 if (srv->node =3D=3D qrtr_ns.local_node) { - ret =3D service_announce_new(&qrtr_ns.bcast_sq, srv); + /* Broadcast local server info to all peer endpoints */ + ret =3D service_announce_new(qrtr_ns.local_node, + &qrtr_ns.bcast_sq, srv); if (ret < 0) { pr_err("failed to announce new service\n"); return ret; @@ -531,13 +587,13 @@ static int ctrl_cmd_new_server(struct sockaddr_qrtr *= from, if (lookup->instance && lookup->instance !=3D instance) continue; =20 - lookup_notify(&lookup->sq, srv, true); + lookup_notify(endpoint_id, &lookup->sq, srv, true); } =20 return ret; } =20 -static int ctrl_cmd_del_server(struct sockaddr_qrtr *from, +static int ctrl_cmd_del_server(u32 endpoint_id, struct sockaddr_qrtr *from, unsigned int service, unsigned int instance, unsigned int node_id, unsigned int port) { @@ -553,24 +609,22 @@ static int ctrl_cmd_del_server(struct sockaddr_qrtr *= from, if (from->sq_node =3D=3D qrtr_ns.local_node && from->sq_port !=3D port) return -EINVAL; =20 - node =3D node_get(node_id); + node =3D node_lookup(endpoint_id, node_id); if (!node) return -ENOENT; =20 - server_del(node, port, true); + server_del(endpoint_id, node, port, true); =20 return 0; } =20 -static int ctrl_cmd_new_lookup(struct sockaddr_qrtr *from, +static int ctrl_cmd_new_lookup(u32 endpoint_id, struct sockaddr_qrtr *from, unsigned int service, unsigned int instance) { struct qrtr_server_filter filter; struct qrtr_lookup *lookup; - struct qrtr_server *srv; - struct qrtr_node *node; - unsigned long node_idx; - unsigned long srv_idx; + unsigned long id; + struct qrtr_ns_endpoint *endpoint; =20 /* Accept only local observers */ if (from->sq_node !=3D qrtr_ns.local_node) @@ -595,22 +649,30 @@ static int ctrl_cmd_new_lookup(struct sockaddr_qrtr *= from, filter.service =3D service; filter.instance =3D instance; =20 - xa_for_each(&nodes, node_idx, node) { - xa_for_each(&node->servers, srv_idx, srv) { - if (!server_match(srv, &filter)) - continue; + xa_for_each(&endpoints, id, endpoint) { + struct qrtr_node *node; + unsigned long node_idx; + + xa_for_each(&endpoint->nodes, node_idx, node) { + unsigned long srv_idx; + struct qrtr_server *srv; =20 - lookup_notify(from, srv, true); + xa_for_each(&node->servers, srv_idx, srv) { + if (!server_match(srv, &filter)) + continue; + + lookup_notify(id, from, srv, true); + } } } =20 /* Empty notification, to indicate end of listing */ - lookup_notify(from, NULL, true); + lookup_notify(0, from, NULL, true); =20 return 0; } =20 -static void ctrl_cmd_del_lookup(struct sockaddr_qrtr *from, +static void ctrl_cmd_del_lookup(u32 endpoint_id, struct sockaddr_qrtr *fro= m, unsigned int service, unsigned int instance) { struct qrtr_lookup *lookup; @@ -644,6 +706,7 @@ static void qrtr_ns_worker(struct work_struct *work) ssize_t msglen; void *recv_buf; struct kvec iv; + u8 control[32]; int ret; =20 msg.msg_name =3D (struct sockaddr *)&sq; @@ -654,8 +717,12 @@ static void qrtr_ns_worker(struct work_struct *work) return; =20 for (;;) { + u32 endpoint_id; + iv.iov_base =3D recv_buf; iv.iov_len =3D recv_buf_size; + msg.msg_control =3D control; + msg.msg_controllen =3D sizeof(control); =20 msglen =3D kernel_recvmsg(qrtr_ns.sock, &msg, &iv, 1, iv.iov_len, MSG_DONTWAIT); @@ -668,6 +735,16 @@ static void qrtr_ns_worker(struct work_struct *work) break; } =20 + /* AUX data is written direct into the control buffer */ + msg.msg_control =3D control; + msg.msg_controllen =3D sizeof(control) - msg.msg_controllen; + + ret =3D qrtr_msg_get_endpoint(&msg, &endpoint_id); + if (ret < 0) { + pr_err("error receiving endpoint id: %d\n", ret); + break; + } + if ((size_t)msglen < sizeof(*pkt)) break; =20 @@ -681,25 +758,25 @@ static void qrtr_ns_worker(struct work_struct *work) ret =3D 0; switch (cmd) { case QRTR_TYPE_HELLO: - ret =3D ctrl_cmd_hello(&sq); + ret =3D ctrl_cmd_hello(endpoint_id, &sq); break; case QRTR_TYPE_BYE: - ret =3D ctrl_cmd_bye(&sq); + ret =3D ctrl_cmd_bye(endpoint_id, &sq); break; case QRTR_TYPE_DEL_CLIENT: - ret =3D ctrl_cmd_del_client(&sq, + ret =3D ctrl_cmd_del_client(endpoint_id, &sq, le32_to_cpu(pkt->client.node), le32_to_cpu(pkt->client.port)); break; case QRTR_TYPE_NEW_SERVER: - ret =3D ctrl_cmd_new_server(&sq, + ret =3D ctrl_cmd_new_server(endpoint_id, &sq, le32_to_cpu(pkt->server.service), le32_to_cpu(pkt->server.instance), le32_to_cpu(pkt->server.node), le32_to_cpu(pkt->server.port)); break; case QRTR_TYPE_DEL_SERVER: - ret =3D ctrl_cmd_del_server(&sq, + ret =3D ctrl_cmd_del_server(endpoint_id, &sq, le32_to_cpu(pkt->server.service), le32_to_cpu(pkt->server.instance), le32_to_cpu(pkt->server.node), @@ -710,12 +787,12 @@ static void qrtr_ns_worker(struct work_struct *work) case QRTR_TYPE_RESUME_TX: break; case QRTR_TYPE_NEW_LOOKUP: - ret =3D ctrl_cmd_new_lookup(&sq, + ret =3D ctrl_cmd_new_lookup(endpoint_id, &sq, le32_to_cpu(pkt->server.service), le32_to_cpu(pkt->server.instance)); break; case QRTR_TYPE_DEL_LOOKUP: - ctrl_cmd_del_lookup(&sq, + ctrl_cmd_del_lookup(endpoint_id, &sq, le32_to_cpu(pkt->server.service), le32_to_cpu(pkt->server.instance)); break; @@ -749,6 +826,8 @@ int qrtr_ns_init(void) if (ret < 0) return ret; =20 + qrtr_sock_set_report_endpoint(qrtr_ns.sock->sk); + ret =3D kernel_getsockname(qrtr_ns.sock, (struct sockaddr *)&sq); if (ret < 0) { pr_err("failed to get socket name\n"); @@ -777,7 +856,7 @@ int qrtr_ns_init(void) qrtr_ns.bcast_sq.sq_node =3D QRTR_NODE_BCAST; qrtr_ns.bcast_sq.sq_port =3D QRTR_PORT_CTRL; =20 - ret =3D say_hello(&qrtr_ns.bcast_sq); + ret =3D say_hello(qrtr_ns.local_node, &qrtr_ns.bcast_sq); if (ret < 0) goto err_wq; =20 diff --git a/net/qrtr/qrtr.h b/net/qrtr/qrtr.h index 22fcecbf8de23..b4f50336ae75a 100644 --- a/net/qrtr/qrtr.h +++ b/net/qrtr/qrtr.h @@ -35,5 +35,6 @@ int qrtr_ns_init(void); void qrtr_ns_remove(void); =20 int qrtr_msg_get_endpoint(struct msghdr *msg, u32 *out_endpoint_id); +void qrtr_sock_set_report_endpoint(struct sock *sk); =20 #endif --=20 2.34.1 From nobody Fri Sep 25 08:48:16 2026 Received: from lahtoruutu.iki.fi (lahtoruutu.iki.fi [185.185.170.37]) (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 41F3B43DEC2; Tue, 15 Sep 2026 05:47:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=185.185.170.37 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789451251; cv=pass; b=eWI0hXPYzYuAUhdn5RQo7aFVkVtVpivV/xwb0wCF7ma+0cDO9VvjyEdNHTl35aTxctzK2xrTq/k+FMZoSfGRF9aDkpk/Aqf+Zw2ZTV6SH4k/DGk9SurWfCuW3tywvSvlh3aI5hYs1cVfMuF/HnTu+kYVP3VG5xuWhyqELAQD7TQ= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789451251; c=relaxed/simple; bh=rxPegwfWsbhaXnaOfXAiSIbv8UqPN8bqJ9GM2VU5AGA=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=e6uUDvaVGFhpkNyiXop8yInYP2dO5Bp2nJRODXt5G1/jm93DJ9ux1YbE2zrdVGu9XDd/tY6uLQqb96//1Y07r7WeZlUFPyIaERsEWPcAeJ9yQ7n0owsN6enRcH2+Bms1bwsCurxFYU+DYCYnhQeGwszc/NFiB5UAkIKFH5OT+Yg= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi; spf=pass smtp.mailfrom=iki.fi; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b=BWRfjJU2; arc=pass smtp.client-ip=185.185.170.37 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=iki.fi Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b="BWRfjJU2" Received: from mandelbrot.. (xdsl-83-150-90-33.nebulazone.fi [83.150.90.33]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: jmtilli) by lahtoruutu.iki.fi (Postfix) with ESMTPSA id 4hkWHv3QkMz49Q6x; Tue, 15 Sep 2026 08:47:23 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1789451243; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=v8dnLpIuawa/T5WKzmKQT35hCSn6pD7KsZ9UF2NkcKc=; b=BWRfjJU2Y1pi/YVWwpzyOTK4sAjECFATkJ51d8lxvHUftCGPXPk94J+hB2A5QY0v9ONrFo /GMVsrnydVc9q8Ci4Xu+TWTPxoHllx1DPnS8U4VyaKr0esBo6BQAmmJcQRuYUMTdYnV0Ov 5M2gwnO27CB8P0UagBvD2LJQopfVc2uVVjm+RTSwkzHL2oJs/XqtTXtgDwszkRg/qLu5sb z8YHZEKOYmLADKyej1j9n1ZBiryUenCugC/UYHIC3sK7rH1M8zbgQFwPm6e82Fb4tDPG90 cqBz9cSaR32DxtiqSIhH7agp90PpM7ORZVIlJtM4gTSPTubdEtJ1fCDFap9iHA== ARC-Seal: i=1; a=rsa-sha256; d=iki.fi; s=lahtoruutu; cv=none; t=1789451243; b=SsHBof+dIMMLHxAnF5KvFGo2Exe9Z4BYZUwq6kJks0+G+kjGpqy2xQHg1s8yO9cncDfHW2 oyi4gSYtt1nWAGT3Sq/Vdn/7JLS18EvZX3EIgPqCzmf5pdHQptp4naivJ4YQhnxp31U+nr yVNNXSZyq8PryhhzhVZSSkaPQzVr32IRXWAK/3oX3oukHf/armce2jake+OHHjeAg6rTRG RAAhOJAgW4vZfilI365RKMoKA7yu+1MSVie6t+pBiJ2CXeNDR7mToErgjw6pl4h4MTgPxg bcSiQygjB6tGKJLNh8kNIq4B4Ev8pQDuIbknrK2/iyWmbWxAFtC5zxMbKJyK9w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1789451243; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=v8dnLpIuawa/T5WKzmKQT35hCSn6pD7KsZ9UF2NkcKc=; b=fNJkeDHqKc4dOdtUsnvq7Gp4t2WKpLJq+NYagZIi7oX2SuUNv1nyPZKQ9yapDSk6tru5+o Mst19EtwC8XIJaGXooKfxUxQyvN6gyCxX90GJQFc0kFzo2IeUX9yqYntMKEPNChF658cFa 09qrwo7iWDFOD66ENwFtm0gdomX1p3zo2Wpahfl8+pzKpcJIWEnUNa9ZCwApGvzM7QP/vI ryEKW/IQ7vp3siWMob7Tkqu50OPd/grIvOp31MsenkKOn3ZuJHlXELJF1eJDWmh5sKU/we Tu3RhKEgNGcx8jvi/Ax72PNOJ/LFN3k2OVZS9RmLA0cRov+5n4ouEd+kegR6DQ== ARC-Authentication-Results: i=1; ORIGINATING; auth=pass smtp.auth=jmtilli smtp.mailfrom=juha-matti.tilli@iki.fi From: Juha-Matti Tilli To: Manivannan Sadhasivam , linux-arm-msm@vger.kernel.org Cc: Juha-Matti Tilli , Jeff Hugo , Jeff Johnson , Bjorn Andersson , Konrad Dybcio , Eric Dumazet , Kuniyuki Iwashima , Paolo Abeni , Willem de Bruijn , "David S. Miller" , Jakub Kicinski , Simon Horman , Mihai Moldovan , Denis Kenzior , Marcel Holtmann , Andy Gross , linux-kernel@vger.kernel.org, mhi@lists.linux.dev, linux-wireless@vger.kernel.org, ath11k@lists.infradead.org, ath12k@lists.infradead.org, netdev@vger.kernel.org Subject: [PATCH v7 12/15] net: qrtr: mhi: Report endpoint id in sysfs Date: Tue, 15 Sep 2026 08:42:04 +0300 Message-Id: <20260915054207.2513877-13-juha-matti.tilli@iki.fi> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260915054207.2513877-1-juha-matti.tilli@iki.fi> References: <20260915054207.2513877-1-juha-matti.tilli@iki.fi> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Denis Kenzior Add a read-only 'endpoint' sysfs entry that contains the qrtr endpoint identifier assigned to this mhi device. Can be used to direct / receive qrtr traffic only from a particular MHI device. Signed-off-by: Denis Kenzior Reviewed-by: Marcel Holtmann Reviewed-by: Andy Gross Signed-off-by: Mihai Moldovan Signed-off-by: Juha-Matti Tilli --- net/qrtr/mhi.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/net/qrtr/mhi.c b/net/qrtr/mhi.c index 3990da1a65dc4..630ce0da060e5 100644 --- a/net/qrtr/mhi.c +++ b/net/qrtr/mhi.c @@ -106,6 +106,16 @@ static int qcom_mhi_qrtr_queue_dl_buffers(struct mhi_d= evice *mhi_dev) return 0; } =20 +static ssize_t endpoint_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct qrtr_mhi_dev *qdev =3D dev_get_drvdata(dev); + + return sprintf(buf, "%u\n", qdev->ep.id); +} + +static DEVICE_ATTR_RO(endpoint); + static int qcom_mhi_qrtr_probe(struct mhi_device *mhi_dev, const struct mhi_device_id *id) { @@ -135,6 +145,9 @@ static int qcom_mhi_qrtr_probe(struct mhi_device *mhi_d= ev, if (rc) goto err_unregister; =20 + if (device_create_file(&mhi_dev->dev, &dev_attr_endpoint) < 0) + dev_err(qdev->dev, "Failed to create endpoint attribute\n"); + dev_dbg(qdev->dev, "Qualcomm MHI QRTR driver probed\n"); =20 return 0; @@ -151,6 +164,7 @@ static void qcom_mhi_qrtr_remove(struct mhi_device *mhi= _dev) { struct qrtr_mhi_dev *qdev =3D dev_get_drvdata(&mhi_dev->dev); =20 + device_remove_file(&mhi_dev->dev, &dev_attr_endpoint); qrtr_endpoint_unregister(&qdev->ep); mhi_unprepare_from_transfer(mhi_dev); dev_set_drvdata(&mhi_dev->dev, NULL); --=20 2.34.1 From nobody Fri Sep 25 08:48:16 2026 Received: from lahtoruutu.iki.fi (lahtoruutu.iki.fi [185.185.170.37]) (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 5EF2043BDC8; Tue, 15 Sep 2026 05:47:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=185.185.170.37 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789451267; cv=pass; b=GhXtTa+2cxekohCAuzxyEeEBvXU8YpyVpjAO94ISy7mTCfsmIGBNGZp+WluByrpMBaM4yYIx64R2XcczIR99eJ2teOx7exZ+13VKhFpT9Z+T/ydaO5Jj68EJ6OdP7EGd3W5FFIbdx065lq4VxGka02s5AllFLcomNxjb5p7nAXI= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789451267; c=relaxed/simple; bh=lmfXVdhj4XKXkltUcw+u085d9Gv1YopwSSRwYiRt+mI=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=uw2nLmdvansgXTnYKcWzW2jpIGkD6yYGvLG1GMKEQd6ESYe+BXgcONLgAJXvCpgZo4lHv3/u9ocr1Nw9VDpIjC0QuhNgrcSVPoJ5EofcxN7yxLCtgt+qP3wrHPD2C0LHq3Rx2yoHzlfalGHsm//UyR8jWmNeAglQEiooIZjPf3Y= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi; spf=pass smtp.mailfrom=iki.fi; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b=RRpAzP0r; arc=pass smtp.client-ip=185.185.170.37 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=iki.fi Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b="RRpAzP0r" Received: from mandelbrot.. (xdsl-83-150-90-33.nebulazone.fi [83.150.90.33]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: jmtilli) by lahtoruutu.iki.fi (Postfix) with ESMTPSA id 4hkWJD46Dxz49Q6x; Tue, 15 Sep 2026 08:47:40 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1789451260; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=ZL4TqLJCUHMypohzoaU3V9T/82qT11Mw0FniRBnY4gk=; b=RRpAzP0rct1htzJzzS0BWkkX4BAeYSFLpHT9GeN58Iij5peky4BObPmkaIMrdy68+/ml8j Fm4GHfJhjXn3W6X2HTAtQanFSOAZ3l5Aa6fqa4gO36dNo7AkwWJ9nOcmsgW89Y+nlAOIDT 8mUQf8Mrf5VPGaeCcWhNz9ArltdSBSpr6WRh9F17FMbdov2O+yjAefc9XJPlKEsg/KP8Rm L/hKAXvSl5xc3guYI33deKPMKY6gw7olVfHC992GX4+h7iWHkQktz9hg16OnMNFNnOZdJW 79MN4wNo6wzlaHq6e6NmIp1iJlqD5oDaiO7G+sAGOC5Z7ydRO5UaUWKR0QWQhg== ARC-Seal: i=1; a=rsa-sha256; d=iki.fi; s=lahtoruutu; cv=none; t=1789451260; b=t89+cva3wNzd0ZHDUSo2MFdt1cs3SzleXZ+hyhjgGP6W11OaO5zlz5RzlkeBjzh8h0/Dvq QN0zGUoUfISenyXCH9OOYZhC5JaptTRB9AlIARZKcWBumGA4RX8md1jFznTKMbjScR4q6h FnCn2k4lLQ63fUkqkhFL7vGKtRX0Ggvgse9ZMowZGAXYAlBFTTeOQCMlUEwb5uLl5U+Hbq ia/Ce62fcavKxMO/TD1JGMwXwXYusxDCg7dlvvsoCqnBaaHU5ECNSlJZ5dXHHcpJvI0obO 8cxuqntEQnt9UwMe2JBhYI5UG/76jGhKZeSJzQv2quMf4BTycnXkPQ+H1ckjSA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1789451260; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=ZL4TqLJCUHMypohzoaU3V9T/82qT11Mw0FniRBnY4gk=; b=UZzsRLN/oAXl3bHpS2GGg+HFNscL5SpoyYxwW30FasIzdT+QQK5+CZ4jnDYX4kU3Ix2pO3 rpQFWZ8ji8rmPuwP0pJRAmDugYdyYfhaZpTSKqh9uoB2tlkid52+BFffQxvsNBX+aLRrrV q/Ze2FAInpVuEEK2fMa/FYS0HnLaB3akjJNK4ypVDj84CiOqXPY57gJhSp7qwIaSr4vNmw Ae8w7Rpl7HCHwj92qeaGXhnOtt955YAYithupAuT4fgmKpq27jxFARJvZmFMz86xYo+kjz lTiKJ+0I+UYoLiL5U4HjSF4MUCdlfM6sLNVJCzFk8WTH0dCqDltVM25i3rtczg== ARC-Authentication-Results: i=1; ORIGINATING; auth=pass smtp.auth=jmtilli smtp.mailfrom=juha-matti.tilli@iki.fi From: Juha-Matti Tilli To: Manivannan Sadhasivam , linux-arm-msm@vger.kernel.org Cc: Juha-Matti Tilli , Jeff Hugo , Jeff Johnson , Bjorn Andersson , Konrad Dybcio , Eric Dumazet , Kuniyuki Iwashima , Paolo Abeni , Willem de Bruijn , "David S. Miller" , Jakub Kicinski , Simon Horman , Mihai Moldovan , Denis Kenzior , Marcel Holtmann , Andy Gross , linux-kernel@vger.kernel.org, mhi@lists.linux.dev, linux-wireless@vger.kernel.org, ath11k@lists.infradead.org, ath12k@lists.infradead.org, netdev@vger.kernel.org Subject: [PATCH v7 13/15] net: qrtr: limit endpoint range to 16 bits on 32-bit machines Date: Tue, 15 Sep 2026 08:42:05 +0300 Message-Id: <20260915054207.2513877-14-juha-matti.tilli@iki.fi> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260915054207.2513877-1-juha-matti.tilli@iki.fi> References: <20260915054207.2513877-1-juha-matti.tilli@iki.fi> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" On 64-bit machines, use the full range for endpoint ids, but on 32-bit machines, use only 16 bits. This gives plenty of endpoints, 65534 to be specific, apart from the invalid zero value and the local endpoint. This should fix any issues where a long-running system with lots of allocations might allocate an endpoint id bigger than 65535 on a 32-bit system. The node id, the secondary part, is already combined with port id into a value that is potentially 32 bits in existing old code. NOTE: this commit is a candidate for squashing with the two next commits, if we want to have the "radix tree of trees" approach. This note should probably be removed before committing. If we don't want "radix tree of trees", this commit needs careful decision of whether we may want to drop it. Signed-off-by: Juha-Matti Tilli --- net/qrtr/af_qrtr.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/net/qrtr/af_qrtr.c b/net/qrtr/af_qrtr.c index b27c5a659795d..3c84da3059a80 100644 --- a/net/qrtr/af_qrtr.c +++ b/net/qrtr/af_qrtr.c @@ -22,7 +22,11 @@ #define QRTR_MAX_EPH_SOCKET 0x7fff #define QRTR_EPH_PORT_RANGE \ XA_LIMIT(QRTR_MIN_EPH_SOCKET, QRTR_MAX_EPH_SOCKET) +#if BITS_PER_LONG >=3D 64 #define QRTR_ENDPOINT_RANGE XA_LIMIT(qrtr_local_nid + 1, INT_MAX) +#else +#define QRTR_ENDPOINT_RANGE XA_LIMIT(qrtr_local_nid + 1, USHRT_MAX) +#endif =20 #define QRTR_PORT_CTRL_LEGACY 0xffff =20 --=20 2.34.1 From nobody Fri Sep 25 08:48:16 2026 Received: from lahtoruutu.iki.fi (lahtoruutu.iki.fi [185.185.170.37]) (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 E5A3D43E9F9; Tue, 15 Sep 2026 05:48:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=185.185.170.37 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789451305; cv=pass; b=I/oQfP7wlG2TZ9ZRhMehFBYWzfO3rKq+lValZHQpEvxYBRBSPAS3N6VwvIuqeoVia9xQy7z8LFc3OKDVyXLNOrcXCuBnfBHcOFYG0eA3qIUxtKe73Dv7t0LYiNSUr1oqSrDzR5PJ0aDhxP3W6hML4c7CMayZNltlEfjlOW0IGg4= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789451305; c=relaxed/simple; bh=9/6M3/7gt0JLWQuczN0WgWo8dNZ1el0eF+EvhihOWSc=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=Ibbd5iraWN4I36oyaAvSnieVwhcAbCiEmCR0iVoKHCxQS/xRTROaE4A3hT+l8aFDEFh5izeHH0qYZTUVltcOamRXm3NSfoYJOnt7m7NBkQ3zBA/u6vSnwo8T3f+mcjyQ37x7brfBxwxJNr68aYYt/WE2Fs/ydktg4d5tkF7F8/E= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi; spf=pass smtp.mailfrom=iki.fi; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b=KytI+jpD; arc=pass smtp.client-ip=185.185.170.37 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=iki.fi Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b="KytI+jpD" Received: from mandelbrot.. (xdsl-83-150-90-33.nebulazone.fi [83.150.90.33]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: jmtilli) by lahtoruutu.iki.fi (Postfix) with ESMTPSA id 4hkWJx68B7z49Q32; Tue, 15 Sep 2026 08:48:17 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1789451298; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=9DZArNhvvAzVfrl1dfODQGqES9F9P7LrpHsacGtJDNA=; b=KytI+jpDm+VXWaQlWntDClP3mbKkyfu1BZqP5+8YViWP6GcQ+jEBiJYGWheGr7YSVU02uV 2B+le+nK7RE1yv46v+ZVgAf6YZ3LVGt9qU1EG1In5hbh+6FPavx06oFfX5Y1TNFtsezMHy gLcFplWlo/zi8RL44aoBXePHjnflHp9Kw4PYifw78NpLwHC7JWV6583nU6JSMo4GSJsLzo Wq3EydeOW8l167pJDLweH8KG+EHfqZzH0o8WlDltqqjWtzpbbU/RdiUOTt4b1IgoEiazOG o2OZ0xAL3TQTvsKCF18t35NccQlma4OQYoAFpVI4GWozRX1DNVe0gEC9QCeX4Q== ARC-Seal: i=1; a=rsa-sha256; d=iki.fi; s=lahtoruutu; cv=none; t=1789451298; b=llhd1Iwj/4wL6tuosk4gk5cMohP+ItEoAbTQ94C43a6NFJ46FeeXMVrMmkUIlfvT9cBWjr MUTlerohnrQj47ElH2yeoth8q7PZw9+EeLPJuQlH9o7Omxj/JKT2JtO7a2ZdL9JlI3EDkx zrFmsiUo3I6fMn8sfJOzL3LjfM0xLnEE7zjbSfySwqpEDx3iM8X1C7iv17nMO3IVdOBtnJ CsUtUz95/zVqdQVdZOrPO2nnUQRvRCWsJ/JQTiPle+jYtR2y1vrs6diAsG8JG/GO60REux YyKDeTFvssSm8kV8cne1eiuqmMNecnPRqi7Ed+WGQWKpAvcYen2caU+nhC3WDw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1789451298; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=9DZArNhvvAzVfrl1dfODQGqES9F9P7LrpHsacGtJDNA=; b=a8WmTcRpsY9kpaR00zL9DxydUHYqNRde+lPVpjgQzZd7sFxDEpqhlrUvo8fpdM+xsL0KFb hh1I4daH4KXIfH8u4kb9TGXyHuPhyIdCKETV5csylmWECVuibwL/iC1MDP2i4+BpNxk0sR UwM+s60LGcV6d69Jmuk/gU3vpWUEHGCHpyztZCmfdilRfq0PGapizIcpQORagprJ2ndhlR lLTB1cAVZ72ALHt714L7zV2UVlbO6eRkdBUEpvRTQrGKWoEJt7Oz+yPuYRhxY+BoKXVMtm D9GznDgel530LlZmUKtfw157NTk3oykcRqHaWWe4AwGjA5h8OrVuhne0vpGgjA== ARC-Authentication-Results: i=1; ORIGINATING; auth=pass smtp.auth=jmtilli smtp.mailfrom=juha-matti.tilli@iki.fi From: Juha-Matti Tilli To: Manivannan Sadhasivam , linux-arm-msm@vger.kernel.org Cc: Juha-Matti Tilli , Jeff Hugo , Jeff Johnson , Bjorn Andersson , Konrad Dybcio , Eric Dumazet , Kuniyuki Iwashima , Paolo Abeni , Willem de Bruijn , "David S. Miller" , Jakub Kicinski , Simon Horman , Mihai Moldovan , Denis Kenzior , Marcel Holtmann , Andy Gross , linux-kernel@vger.kernel.org, mhi@lists.linux.dev, linux-wireless@vger.kernel.org, ath11k@lists.infradead.org, ath12k@lists.infradead.org, netdev@vger.kernel.org Subject: [PATCH v7 14/15] net: qrtr: use nid modulo 65536 in 32-bit lookups Date: Tue, 15 Sep 2026 08:42:06 +0300 Message-Id: <20260915054207.2513877-15-juha-matti.tilli@iki.fi> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260915054207.2513877-1-juha-matti.tilli@iki.fi> References: <20260915054207.2513877-1-juha-matti.tilli@iki.fi> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The node id is chosen by the device firmware, and is generally a small single number. However, there's nothing to prevent the device from choosing a large node id. Use node id modulo 65536 in 32-bit systems to allow it to work in cases where the node id is large. NOTE: this commit is a candidate for squashing with the previous and next commit, if we want to have the "radix tree of trees" approach. This note should probably be removed before committing. If we don't want "radix tree of trees", this commit needs careful decision of whether we may want to drop it. Signed-off-by: Juha-Matti Tilli --- net/qrtr/af_qrtr.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/net/qrtr/af_qrtr.c b/net/qrtr/af_qrtr.c index 3c84da3059a80..87eb7363c4a9f 100644 --- a/net/qrtr/af_qrtr.c +++ b/net/qrtr/af_qrtr.c @@ -497,8 +497,11 @@ static struct qrtr_node *qrtr_node_lookup(unsigned int= endpoint_id, unsigned long flags; unsigned long key =3D 0; =20 - if (endpoint_id > QRTR_INDEX_HALF_UNSIGNED_MAX || - nid > QRTR_INDEX_HALF_UNSIGNED_MAX) + /* nid is chosen by device firmware and is generally a single + * and small number. If firmware chooses otherwise, use it + * modulo 65536 in 32-bit systems. + */ + if (endpoint_id > QRTR_INDEX_HALF_UNSIGNED_MAX) return node; =20 key =3D ((unsigned long)(endpoint_id) << QRTR_INDEX_HALF_BITS) | @@ -529,8 +532,11 @@ static int qrtr_node_assign(struct qrtr_node *node, un= signed int nid) if (nid =3D=3D QRTR_EP_NID_AUTO) return 0; =20 - if (node->ep->id > QRTR_INDEX_HALF_UNSIGNED_MAX || - nid > QRTR_INDEX_HALF_UNSIGNED_MAX) + /* nid is chosen by device firmware and is generally a single + * and small number. If firmware chooses otherwise, use it + * modulo 65536 in 32-bit systems. + */ + if (node->ep->id > QRTR_INDEX_HALF_UNSIGNED_MAX) return -EINVAL; =20 spin_lock_irqsave(&qrtr_nodes_lock, flags); --=20 2.34.1 From nobody Fri Sep 25 08:48:16 2026 Received: from lahtoruutu.iki.fi (lahtoruutu.iki.fi [185.185.170.37]) (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 5FAA8440620; Tue, 15 Sep 2026 05:48:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=pass smtp.client-ip=185.185.170.37 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789451322; cv=pass; b=XIy0X5u8HZTv85QbJGRexw1WnvsZ0CwYMGGemQgCcoHrNjfvE55/nAlfm8SUkq3Z3jaihqDSgKW1ICGeVRqRq1MhZ2wVXqVXnnn27UDtjNGEuQkNOAG4y0x2+KPuZA6VYJTfNwC/NKBdBnKyyp5mlNW/pR3EsD5wV23UO/dg8aQ= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789451322; c=relaxed/simple; bh=V5sdMqI078EOLCk+P3qvgH/cj+rEoBbOdiQkMrZL1AM=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=OX8TBvQXJHJVZOcQWrWkWfQo2Hz99xBhu1lyVutS2LZ/dPi819PL3tDQogoLqa8/qBXZIcVQERkAxRaWgktuFbNprBsTUQDMURbkxDUnSrn1+d+JmBlvehPhVYC721MP+yGP7Pi1xlrsb+a/n3VTAIOy6wWEnisVSW1vSb7IzxU= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi; spf=pass smtp.mailfrom=iki.fi; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b=IwmP77uf; arc=pass smtp.client-ip=185.185.170.37 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=iki.fi Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=iki.fi Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=iki.fi header.i=@iki.fi header.b="IwmP77uf" Received: from mandelbrot.. (xdsl-83-150-90-33.nebulazone.fi [83.150.90.33]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: jmtilli) by lahtoruutu.iki.fi (Postfix) with ESMTPSA id 4hkWKG2Nwtz49Q32; Tue, 15 Sep 2026 08:48:34 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1789451314; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=YwSqv8l1x28QURhXo1Itddi2DIBG1dqDfoaPmBvtnuE=; b=IwmP77ufj+144giP+UlGY7x4z3S2c0XdUZ5pi5AleQ4fnii2SXz5AWawwIUFWf+aj8Owm+ My4eCDEuYVQ4hYbpO2MUEnt9nWECcqnugl7zVXu3jXBXTwE+nBPPx6Mtc7Mks99trBIZiX PTj1xKw7IEw6hfrsFkcDq4rvj5ii/ie4DU6qKf7u/BP8E5iH0tbjyKM/M9kX/gRKZAYTSA /a1N/yOUAcYB+7aTqmrSicDSlgNBl0aLLpTtbrRNj9VrpJV4RS/khvaqpUUsCXPis9z7yW mTb71qDt9iRw6OmWW+ysXbrsYmD63HnULe8yRlAEoQeKg2bv6EPhVumhd1kZ8w== ARC-Seal: i=1; a=rsa-sha256; d=iki.fi; s=lahtoruutu; cv=none; t=1789451314; b=PjyO16p8LmVHUWCUyx2BgcBAd0crrfDMJagP/XyXO7Pkx9r3ZSMG/Df2/Notrx7NtnAuru C/wHF5cVAgvwHRDWiC76qOeAgGHdPR2WtX0dwlmNtf3tc/7No03sccjeaAV/i3zKLmbeHC uxP15TH8sz4eUuV3Tit82Kx2rpScllrvVr0PbW2zod0MErJhJdmc/3knMsHrwj9hquUTED Tc6CDyEzkm6b5/oT/tX8dI4GBkfD0aKkQjVZU/w7BYCbuKEj7iZjx2NOEmA/hj7AB7NMv4 uuTqa3yCQ7THg9uX2Ol6rSM83l00SabqM2yRIUiaNbE+CwoKH1NXzURSoA1kIA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=iki.fi; s=lahtoruutu; t=1789451314; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=YwSqv8l1x28QURhXo1Itddi2DIBG1dqDfoaPmBvtnuE=; b=fPmh/Dl+HiaMaqNqOYYyN1WfrtC7ujnXtkbWLEVrAMYaJUUo9nsDoN2EldedzsH+BVQKBO 5vbUFJcRRJY7x8mEBOQiOHRNYRLyjOODQlFvcRmuuX2MEijQBSR+txMXYV3MelenCSEHS7 Se+Nvm3SOvzeNAcLsWVmhjW7KQUMTUqz+dbutdyj6h9wXqTklyg7wOejVbT9pmR+KOaomm uBEjRptQNFONKDJhBM9VtDAKspffV79Q9s68oXT942kHd9nrU10BdryJPaMlJI6wEGE/Kr /xiWF5LoJxmJWTB4QASLtBp8fqK2Yn7UvZIzUeUaIFtzqJ6tYWXyrQAeVdQquQ== ARC-Authentication-Results: i=1; ORIGINATING; auth=pass smtp.auth=jmtilli smtp.mailfrom=juha-matti.tilli@iki.fi From: Juha-Matti Tilli To: Manivannan Sadhasivam , linux-arm-msm@vger.kernel.org Cc: Juha-Matti Tilli , Jeff Hugo , Jeff Johnson , Bjorn Andersson , Konrad Dybcio , Eric Dumazet , Kuniyuki Iwashima , Paolo Abeni , Willem de Bruijn , "David S. Miller" , Jakub Kicinski , Simon Horman , Mihai Moldovan , Denis Kenzior , Marcel Holtmann , Andy Gross , linux-kernel@vger.kernel.org, mhi@lists.linux.dev, linux-wireless@vger.kernel.org, ath11k@lists.infradead.org, ath12k@lists.infradead.org, netdev@vger.kernel.org Subject: [PATCH v7 15/15] net: qrtr: solve the 32-bit unsafe use in endpoints Date: Tue, 15 Sep 2026 08:42:07 +0300 Message-Id: <20260915054207.2513877-16-juha-matti.tilli@iki.fi> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260915054207.2513877-1-juha-matti.tilli@iki.fi> References: <20260915054207.2513877-1-juha-matti.tilli@iki.fi> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" In 32-bit architectures, a single radix tree can have at most 32 bit keys. We're cramming 64 bits in there. To solve this, use a radix tree of radix trees. First, the endpoint is looked up. Secondly, the node is looked up based on the endpoint. Theoretically, there could be the option of skipping the "tree of trees" approach if long is 64 bits. However, this has the drawback that the code would be entirely different on 32-bit and 64-bit architectures, and could create subtle bugs where someone commits and tests modifications on a 64-bit architecture, and suddenly those who use a 32-bit architecture would see them break. This has been tested on a 32-bit ARM machine with two identical ath11k modules, using patches by Mihai Moldovan to allow multiple modules to work in parallel. Signed-off-by: Juha-Matti Tilli Tested-by: Juha-Matti Tilli --- net/qrtr/af_qrtr.c | 118 ++++++++++++++++++++++++++++++--------------- net/qrtr/qrtr.h | 10 ++++ 2 files changed, 89 insertions(+), 39 deletions(-) diff --git a/net/qrtr/af_qrtr.c b/net/qrtr/af_qrtr.c index 87eb7363c4a9f..7c50d32b11015 100644 --- a/net/qrtr/af_qrtr.c +++ b/net/qrtr/af_qrtr.c @@ -22,11 +22,7 @@ #define QRTR_MAX_EPH_SOCKET 0x7fff #define QRTR_EPH_PORT_RANGE \ XA_LIMIT(QRTR_MIN_EPH_SOCKET, QRTR_MAX_EPH_SOCKET) -#if BITS_PER_LONG >=3D 64 #define QRTR_ENDPOINT_RANGE XA_LIMIT(qrtr_local_nid + 1, INT_MAX) -#else -#define QRTR_ENDPOINT_RANGE XA_LIMIT(qrtr_local_nid + 1, USHRT_MAX) -#endif =20 #define QRTR_PORT_CTRL_LEGACY 0xffff =20 @@ -186,6 +182,9 @@ static DEFINE_XARRAY_ALLOC(qrtr_ports); #define QRTR_INDEX_HALF_SIGNED_MAX ((long)(QRTR_INDEX_HALF_UNSIGNED_MAX) >= > 1) #define QRTR_INDEX_HALF_SIGNED_MIN ((long)(-1) - QRTR_INDEX_HALF_SIGNED_MA= X) =20 +/* endpoint not defined, i.e. endpoint 0 */ +static struct qrtr_node_lookup_helper helper0; + /** * struct qrtr_node - endpoint node * @ep_lock: lock for endpoint management and callbacks @@ -245,9 +244,11 @@ static void __qrtr_node_release(struct kref *kref) { struct qrtr_node *node =3D container_of(kref, struct qrtr_node, ref); struct radix_tree_iter iter; + struct radix_tree_iter iter2; struct qrtr_tx_flow *flow; unsigned long flags; void __rcu **slot; + void __rcu **slot2; unsigned long index; =20 spin_lock_irqsave(&qrtr_nodes_lock, flags); @@ -255,8 +256,18 @@ static void __qrtr_node_release(struct kref *kref) * multiple entries pointing to our released node, delete them all. */ radix_tree_for_each_slot(slot, &qrtr_nodes, &iter, 0) { - if (*slot =3D=3D node) + struct qrtr_node_lookup_helper *helper =3D *slot; + + if (!helper) + continue; + radix_tree_for_each_slot(slot2, &helper->nodes, &iter2, 0) { + if (*slot2 =3D=3D node) + radix_tree_iter_delete(&helper->nodes, &iter2, slot2); + } + if (helper !=3D &helper0 && radix_tree_empty(&helper->nodes)) { radix_tree_iter_delete(&qrtr_nodes, &iter, slot); + helper->added =3D 0; + } } spin_unlock_irqrestore(&qrtr_nodes_lock, flags); =20 @@ -494,22 +505,14 @@ static struct qrtr_node *qrtr_node_lookup(unsigned in= t endpoint_id, unsigned int nid) { struct qrtr_node *node =3D NULL; + struct qrtr_node_lookup_helper *helper =3D NULL; unsigned long flags; - unsigned long key =3D 0; - - /* nid is chosen by device firmware and is generally a single - * and small number. If firmware chooses otherwise, use it - * modulo 65536 in 32-bit systems. - */ - if (endpoint_id > QRTR_INDEX_HALF_UNSIGNED_MAX) - return node; - - key =3D ((unsigned long)(endpoint_id) << QRTR_INDEX_HALF_BITS) | - ((unsigned long)(nid) & QRTR_INDEX_HALF_UNSIGNED_MAX); =20 mutex_lock(&qrtr_node_lock); spin_lock_irqsave(&qrtr_nodes_lock, flags); - node =3D radix_tree_lookup(&qrtr_nodes, key); + helper =3D radix_tree_lookup(&qrtr_nodes, endpoint_id); + if (helper) + node =3D radix_tree_lookup(&helper->nodes, nid); node =3D qrtr_node_acquire(node); spin_unlock_irqrestore(&qrtr_nodes_lock, flags); mutex_unlock(&qrtr_node_lock); @@ -527,33 +530,45 @@ static struct qrtr_node *qrtr_node_lookup(unsigned in= t endpoint_id, static int qrtr_node_assign(struct qrtr_node *node, unsigned int nid) { unsigned long flags; - unsigned long key; + int rc =3D 0; + int did_insert0 =3D 0; =20 if (nid =3D=3D QRTR_EP_NID_AUTO) return 0; =20 - /* nid is chosen by device firmware and is generally a single - * and small number. If firmware chooses otherwise, use it - * modulo 65536 in 32-bit systems. - */ - if (node->ep->id > QRTR_INDEX_HALF_UNSIGNED_MAX) - return -EINVAL; - spin_lock_irqsave(&qrtr_nodes_lock, flags); =20 - /* Always insert with the endpoint_id + node_id */ - key =3D ((unsigned long)(node->ep->id) << QRTR_INDEX_HALF_BITS) | - ((unsigned long)(nid) & QRTR_INDEX_HALF_UNSIGNED_MAX); - radix_tree_insert(&qrtr_nodes, key, node); - - if (!radix_tree_lookup(&qrtr_nodes, nid)) - radix_tree_insert(&qrtr_nodes, nid, node); + if (!radix_tree_lookup(&helper0.nodes, nid)) { + rc =3D radix_tree_insert(&helper0.nodes, nid, node); + if (rc) + goto err_lock; + did_insert0 =3D 1; + } + if (!node->ep->helper.added) { + INIT_RADIX_TREE(&node->ep->helper.nodes, GFP_ATOMIC); + rc =3D radix_tree_insert(&qrtr_nodes, node->ep->id, + &node->ep->helper); + if (rc) + goto err_insert0; + node->ep->helper.added =3D 1; + } + rc =3D radix_tree_insert(&node->ep->helper.nodes, nid, node); + if (rc && rc !=3D -EEXIST) + goto err_insert0; // Don't revert helper insertion =20 if (node->nid =3D=3D QRTR_EP_NID_AUTO) node->nid =3D nid; spin_unlock_irqrestore(&qrtr_nodes_lock, flags); =20 return 0; + +err_insert0: + if (did_insert0) + radix_tree_delete(&helper0.nodes, nid); + +err_lock: + spin_unlock_irqrestore(&qrtr_nodes_lock, flags); + return rc; } =20 /** @@ -773,6 +788,7 @@ int qrtr_endpoint_register(struct qrtr_endpoint *ep, un= signed int nid) mutex_unlock(&qrtr_node_lock); ep->node =3D node; ep->id =3D endpoint_id; + ep->helper.added =3D 0; =20 return 0; free_node: @@ -791,12 +807,14 @@ void qrtr_endpoint_unregister(struct qrtr_endpoint *e= p) struct sockaddr_qrtr src =3D {AF_QIPCRTR, node->nid, QRTR_PORT_CTRL}; struct sockaddr_qrtr dst =3D {AF_QIPCRTR, qrtr_local_nid, QRTR_PORT_CTRL}; struct radix_tree_iter iter; + struct radix_tree_iter iter2; struct qrtr_ctrl_pkt *pkt; struct qrtr_tx_flow *flow; struct sk_buff *skb; unsigned long flags; unsigned long index; void __rcu **slot; + void __rcu **slot2; u32 endpoint_id; =20 mutex_lock(&node->ep_lock); @@ -807,16 +825,28 @@ void qrtr_endpoint_unregister(struct qrtr_endpoint *e= p) /* Notify the local controller about the event */ spin_lock_irqsave(&qrtr_nodes_lock, flags); radix_tree_for_each_slot(slot, &qrtr_nodes, &iter, 0) { - if (*slot !=3D node) + struct qrtr_node_lookup_helper *helper =3D *slot; + + if (!helper) continue; - src.sq_node =3D iter.index; - skb =3D qrtr_alloc_ctrl_packet(&pkt, GFP_ATOMIC); - if (skb) { - pkt->cmd =3D cpu_to_le32(QRTR_TYPE_BYE); - qrtr_local_enqueue(NULL, skb, endpoint_id, - QRTR_TYPE_BYE, &src, &dst); + radix_tree_for_each_slot(slot2, &helper->nodes, &iter2, 0) { + if (*slot2 !=3D node) + continue; + src.sq_node =3D iter.index; + skb =3D qrtr_alloc_ctrl_packet(&pkt, GFP_ATOMIC); + if (skb) { + pkt->cmd =3D cpu_to_le32(QRTR_TYPE_BYE); + qrtr_local_enqueue(NULL, skb, endpoint_id, + QRTR_TYPE_BYE, &src, &dst); + } } } + if (ep->helper.added) { + radix_tree_for_each_slot(slot, &ep->helper.nodes, &iter, 0) + radix_tree_iter_delete(&ep->helper.nodes, &iter, slot); + radix_tree_delete(&qrtr_nodes, ep->id); + ep->helper.added =3D 0; + } spin_unlock_irqrestore(&qrtr_nodes_lock, flags); =20 /* Wake up any transmitters waiting for resume-tx from the node */ @@ -1593,8 +1623,17 @@ static int __init qrtr_proto_init(void) if (rc) goto err_sock; =20 + rc =3D radix_tree_insert(&qrtr_nodes, 0, &helper0); + if (rc) + goto err_ns; + + INIT_RADIX_TREE(&helper0.nodes, GFP_ATOMIC); + helper0.added =3D 1; + return 0; =20 +err_ns: + qrtr_ns_remove(); err_sock: sock_unregister(qrtr_family.family); err_proto: @@ -1605,6 +1644,7 @@ postcore_initcall(qrtr_proto_init); =20 static void __exit qrtr_proto_fini(void) { + radix_tree_delete(&qrtr_nodes, 0); qrtr_ns_remove(); sock_unregister(qrtr_family.family); proto_unregister(&qrtr_proto); diff --git a/net/qrtr/qrtr.h b/net/qrtr/qrtr.h index b4f50336ae75a..affc24f426c64 100644 --- a/net/qrtr/qrtr.h +++ b/net/qrtr/qrtr.h @@ -9,6 +9,15 @@ struct sk_buff; /* endpoint node id auto assignment */ #define QRTR_EP_NID_AUTO (-1) =20 +/** + * struct qrtr_node_lookup_helper - node lookup helper, stored in qrtr_nod= es + * @nodes: nodes, indexed by node_id + */ +struct qrtr_node_lookup_helper { + int added; + struct radix_tree_root nodes; +}; + /** * struct qrtr_endpoint - endpoint handle * @xmit: Callback for outgoing packets @@ -21,6 +30,7 @@ struct qrtr_endpoint { int (*xmit)(struct qrtr_endpoint *ep, struct sk_buff *skb); /* private: not for endpoint use */ struct qrtr_node *node; + struct qrtr_node_lookup_helper helper; u32 id; }; =20 --=20 2.34.1