Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/2218582/?format=api
{ "id": 2218582, "url": "http://patchwork.ozlabs.org/api/patches/2218582/?format=api", "web_url": "http://patchwork.ozlabs.org/project/hostap/patch/20260401052713.3761478-20-peddolla.reddy@oss.qualcomm.com/", "project": { "id": 22, "url": "http://patchwork.ozlabs.org/api/projects/22/?format=api", "name": "HostAP Development", "link_name": "hostap", "list_id": "hostap.lists.infradead.org", "list_email": "hostap@lists.infradead.org", "web_url": "", "scm_url": "", "webscm_url": "", "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<20260401052713.3761478-20-peddolla.reddy@oss.qualcomm.com>", "list_archive_url": null, "date": "2026-04-01T05:27:09", "name": "[RFC,19/23] nl80211: Add peer measurement support for proximity ranging", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "fb635ad3b629fad5301ec92c491a6e6e17449773", "submitter": { "id": 93026, "url": "http://patchwork.ozlabs.org/api/people/93026/?format=api", "name": "Peddolla Harshavardhan Reddy", "email": "peddolla.reddy@oss.qualcomm.com" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/hostap/patch/20260401052713.3761478-20-peddolla.reddy@oss.qualcomm.com/mbox/", "series": [ { "id": 498338, "url": "http://patchwork.ozlabs.org/api/series/498338/?format=api", "web_url": "http://patchwork.ozlabs.org/project/hostap/list/?series=498338", "date": "2026-04-01T05:26:59", "name": "[RFC,01/23] nl80211_copy.h changes related to Proximity Ranging", "version": 1, "mbox": "http://patchwork.ozlabs.org/series/498338/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/2218582/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/2218582/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "\n <hostap-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org>", "X-Original-To": "incoming@patchwork.ozlabs.org", "Delivered-To": "patchwork-incoming@legolas.ozlabs.org", "Authentication-Results": [ "legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n secure) header.d=lists.infradead.org header.i=@lists.infradead.org\n header.a=rsa-sha256 header.s=bombadil.20210309 header.b=S54vxKw8;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n unprotected) header.d=qualcomm.com header.i=@qualcomm.com header.a=rsa-sha256\n header.s=qcppdkim1 header.b=n7jMfGse;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n unprotected) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com\n header.a=rsa-sha256 header.s=google header.b=TnEFv9vr;\n\tdkim-atps=neutral", "legolas.ozlabs.org;\n spf=none (no SPF record) smtp.mailfrom=lists.infradead.org\n (client-ip=2607:7c80:54:3::133; helo=bombadil.infradead.org;\n envelope-from=hostap-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org;\n receiver=patchwork.ozlabs.org)" ], "Received": [ "from bombadil.infradead.org (bombadil.infradead.org\n [IPv6:2607:7c80:54:3::133])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519 server-signature ECDSA (secp384r1) server-digest SHA384)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fm6KM4rndz1xtJ\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 02 Apr 2026 01:08:39 +1100 (AEDT)", "from localhost ([::1] helo=bombadil.infradead.org)\n\tby bombadil.infradead.org with esmtp (Exim 4.98.2 #2 (Red Hat Linux))\n\tid 1w7wEk-0000000FNsS-0wDO;\n\tWed, 01 Apr 2026 14:08:02 +0000", "from mx0a-0031df01.pphosted.com ([205.220.168.131])\n\tby bombadil.infradead.org with esmtps (Exim 4.98.2 #2 (Red Hat Linux))\n\tid 1w7o8A-0000000Dzt3-3Ijx\n\tfor hostap@lists.infradead.org;\n\tWed, 01 Apr 2026 05:28:43 +0000", "from pps.filterd (m0279864.ppops.net [127.0.0.1])\n\tby mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id\n 6313VFhF1458761\n\tfor <hostap@lists.infradead.org>; Wed, 1 Apr 2026 05:28:42 GMT", "from mail-pf1-f200.google.com (mail-pf1-f200.google.com\n [209.85.210.200])\n\tby mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4d8uhg0dc2-1\n\t(version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT)\n\tfor <hostap@lists.infradead.org>; Wed, 01 Apr 2026 05:28:42 +0000 (GMT)", "by mail-pf1-f200.google.com with SMTP id\n d2e1a72fcca58-82a88a2704fso335350b3a.0\n for <hostap@lists.infradead.org>;\n Tue, 31 Mar 2026 22:28:42 -0700 (PDT)", "from hu-peddolla-hyd.qualcomm.com ([202.46.23.25])\n by smtp.gmail.com with ESMTPSA id\n d2e1a72fcca58-82ca843e1desm15021223b3a.4.2026.03.31.22.28.39\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Tue, 31 Mar 2026 22:28:40 -0700 (PDT)" ], "DKIM-Signature": [ "v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed;\n\td=lists.infradead.org; s=bombadil.20210309; h=Sender:\n\tContent-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post:\n\tList-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To:\n\tMessage-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description:\n\tResent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:\n\tList-Owner; bh=vlacKuoF2DmrVORinEAeuTntQfjx5nPVxQVyGSqX8kY=; b=S54vxKw8LavinG\n\tLbCFYwKFUixwPeo4/ez4kG7wwpbyhcyjUN07W+KAxHEMnWQ2jl8q1cWt2vv+OB9kK/pWUs2UQCwKh\n\tv37JYICJ/zbyYc/VjSY+JXoODTboxymwn5wUpOdu6AYg/7WaVmlTrOMYwN9Ti8Ey8TQ6+u2E2Me3q\n\tmac9DMMI4tInSqr3PN5Lyb3jKgMyuuUFucUScyDxrvE45drKf/jHOF85NgMweHrDEyYPLrmVLqt8w\n\tWQWJ4GGjwO4ZVl810/Lha4kN9Hd72w2SDHAZ8sWhIZ9l9rZYN3uOmPEulIwIHrOBlQtr1u0ILOy74\n\t4LSzdTRAIcSo3BcDW6qg==;", "v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h=\n\tcc:content-transfer-encoding:date:from:in-reply-to:message-id\n\t:mime-version:references:subject:to; s=qcppdkim1; bh=hkpWBTtHjVL\n\t6o/XhA5qOqFPxInSIy5HUT51eD0XdSe4=; b=n7jMfGse01wY1bvb3gR8A2AgKTg\n\t2F3tpjrtesJqUdM+7A6XqfzhtUpSz36tYHusvjIx6bnUyaAtwoAA41iNrMxBCBpi\n\tFPC2s79y2rNyt3lDCnREZlbUKDYmFqpvhQveu+chvKZ3CRNPQNIdq+RnHFtpKRHl\n\tK4cPQU8duP51PnrRwizworPRpZ2K4Z91anSjSi/5ef6uXIryGW2WEhz4Rm6+OO2Z\n\tWYBStmqTvoTiORiCt30x0mYNdhYxHmQRf48NzvCRDoUbkFWm2vKBCT4icsiCLNb+\n\tbFm4I8dm0DclmKa/5mqIWgHla8w/rIJcMUzYbYan5nlbEtutFdwYhIVc+hg==", "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=oss.qualcomm.com; s=google; t=1775021321; x=1775626121;\n darn=lists.infradead.org;\n h=content-transfer-encoding:mime-version:references:in-reply-to\n :message-id:date:subject:cc:to:from:from:to:cc:subject:date\n :message-id:reply-to;\n bh=hkpWBTtHjVL6o/XhA5qOqFPxInSIy5HUT51eD0XdSe4=;\n b=TnEFv9vrdLoAnMGaba/fp3EuvvxHfvSElmy4f5iSyuk9jPaomGUMonPDez+CAWXKHq\n 8NpjMZ15cYbofySL0ABZSdOs4bZVpRT2JeFun/CSyQXUhFKAGSy3gUzdxWEZpirDoFuY\n cSWVwzpSFZfrs7xxCXThJbLY+fVLbxXkfp4h3J2CnDqfcNAXJvU2g9pb3bA06hbp5nY3\n UBFiBnwTUm176aB96Q4XcyKEv5piXuBJkG8vcr94cNRUYlx9TBmAukbZ6qPJ7Zu+cr5/\n re14yRUrFLtWzRnTiFYjLdnqFhfU8bgCRi/56R816bJxccYNNPUi+Ux/sOcLQAzezT/w\n GZ6w==" ], "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1775021321; x=1775626121;\n h=content-transfer-encoding:mime-version:references:in-reply-to\n :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from\n :to:cc:subject:date:message-id:reply-to;\n bh=hkpWBTtHjVL6o/XhA5qOqFPxInSIy5HUT51eD0XdSe4=;\n b=ckWeEVdza2vuX4c8/4lXyIJKZh/8xDPUz2jjzWk9FtB68U8UmL1JYiht0zaOk/lwfS\n QpgWEDJRAizvDl1ChEGohZUvCYzEbhpskqb4y2igjn40PcLq0bidPKE6qunNGMTd6y0/\n J+ZbeWIb+eXGHp5yxrWV/uqpO1+HR2KoQZrTP9ENh9o5Ev6oAIJO0fLvhu2cSvYc+EAx\n C3t3rr6JcIvsetbKXPjBd/g2M0rGTV6OBlGh0z862TAnu/z/Pn0JrFcQl73xHORX1YD8\n DrZx6+BMs7D041ybSnsmN4zKAH4zcSoqdZJcZeziTqPEeeGtzC+f0XO5kfDKYL8mc4uM\n xD/w==", "X-Gm-Message-State": "AOJu0YwUCWSta/bPEdX7KFCaYPgquAw0NwjYf4Sdso1FU1Cjph2TbEMZ\n\ts3EGI6xXsARz8CK0Hyy/UKN5hWcspAimB2IWnrMeeKmVqxvZdTjrbDGTn3PkIRoe4RL4fhqsUVw\n\tg0bfX1/86vebFt6JsmXGrrv7TvRybaFK4VNXuZAHiI35aP9ZCVF24oj71OfVoZJYFooyEIq8=", "X-Gm-Gg": "ATEYQzx8abQ/9hHIXIewEyyKXTT3gDI/3PvlruHBQgxNLIqqLiMvWd63+TvSfG0M78V\n\t9ZEukCFQZdhr9EKCs3Zo6G6EfvTess/3VlA3D4XXwvECvhoiP5A2BIxmpNWKFDmIqUyGVvttRDU\n\tutvQX6uZRvDHOrO9exrreYybuZcKDKJaXeJtuwlj9E4/W2l9kupVkPV/bEo255b0WeAiV3jRxNk\n\t+fcfIBCPOiQqZ9n7QByEyUS0WZgv2aulAkWJDU9rhRFW2rtuZfzCP5FNzyMDfim719VwtwEVHyP\n\tVA5ZVaHlDdvfqKeLe0irmar/ejY00hlKCIx6UgP8XICqnKp+D7BKEWmtxZkZHytGV3HFdv3csQO\n\tct0FnEyNTR3PIDsfQEkdrGwuyrqpccR0c1VbAh+8BstUrkd52Y60Yqe8=", "X-Received": [ "by 2002:a05:6a00:8c01:b0:823:1444:7873 with SMTP id\n d2e1a72fcca58-82cd66b6a50mr5253239b3a.32.1775021321367;\n Tue, 31 Mar 2026 22:28:41 -0700 (PDT)", "by 2002:a05:6a00:8c01:b0:823:1444:7873 with SMTP id\n d2e1a72fcca58-82cd66b6a50mr5253215b3a.32.1775021320707;\n Tue, 31 Mar 2026 22:28:40 -0700 (PDT)" ], "From": "Peddolla Harshavardhan Reddy <peddolla.reddy@oss.qualcomm.com>", "To": "hostap@lists.infradead.org", "Cc": "vjakkam@qti.qualcomm.com", "Subject": "[RFC PATCH 19/23] nl80211: Add peer measurement support for proximity\n ranging", "Date": "Wed, 1 Apr 2026 10:57:09 +0530", "Message-Id": "<20260401052713.3761478-20-peddolla.reddy@oss.qualcomm.com>", "X-Mailer": "git-send-email 2.34.1", "In-Reply-To": "<20260401052713.3761478-1-peddolla.reddy@oss.qualcomm.com>", "References": "<20260401052713.3761478-1-peddolla.reddy@oss.qualcomm.com>", "MIME-Version": "1.0", "X-Proofpoint-Spam-Details-Enc": "AW1haW4tMjYwNDAxMDA0NCBTYWx0ZWRfXyJGPbu92TCp1\n fcYGbAhh1nLNp77YgKUwtEmlNtqW93Efb4NNp9Y3EW5tmRRjNUJP0QzqPMCkf1VMrCUjQX3le/1\n QEhYgbMaxS7qFh0deccMm97SoGSEs+Qei14W3IslcSh7H4yd6/ufv2It9WgiQ0iROfccmRsZbEs\n LlsJxVBDFLYy84VqlTt3gQslqoTA3BVrk8lRuN5X8tZxtsxNyj42Fe94qUfV4uGLTC/jOpB1nA/\n 94j2/PnmYasqeT3Xlrigk7ikitwnY7cs8eWnmjEkkBgK/2KLJug9IHt8C/FogEL2ZPBckAncNPj\n V273YOsYyMnfSZlolc1OqDY6EEhGZzH20nqzVdE0Pkt0mL4D1UYvjKAZ+If+n8+GUjjcRb6h9Dn\n g6o2QhPwW6Tm9hWtYYxlVHUBKJxUmjb4n2rMtKSWIPv6zsw1QrCExe5do9fB6Tark6lujvCojG7\n sGjt7Faq3oXpZudAt4A==", "X-Authority-Analysis": "v=2.4 cv=YcawJgRf c=1 sm=1 tr=0 ts=69ccad0a cx=c_pps\n a=mDZGXZTwRPZaeRUbqKGCBw==:117 a=ZePRamnt/+rB5gQjfz0u9A==:17\n a=A5OVakUREuEA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22\n a=u7WPNUs3qKkmUXheDGA7:22 a=DJpcGTmdVt4CTyJn9g5Z:22 a=EUspDBNiAAAA:8\n a=S_4shK1I8r1_wbNv0aUA:9 a=zc0IvFSfCIW2DFIPzwfm:22", "X-Proofpoint-GUID": "iUj7CR5KQNI1MuqvKc3kXdktfGU_JVTM", "X-Proofpoint-ORIG-GUID": "iUj7CR5KQNI1MuqvKc3kXdktfGU_JVTM", "X-Proofpoint-Virus-Version": "vendor=baseguard\n engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49\n definitions=2026-04-01_02,2026-03-31_02,2025-10-01_01", "X-Proofpoint-Spam-Details": "rule=outbound_notspam policy=outbound score=0\n phishscore=0 priorityscore=1501 adultscore=0 clxscore=1015 suspectscore=0\n malwarescore=0 impostorscore=0 spamscore=0 lowpriorityscore=0 bulkscore=0\n classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0\n reason=mlx scancount=1 engine=8.22.0-2603050001 definitions=main-2604010044", "X-CRM114-Version": "20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 ", "X-CRM114-CacheID": "sfid-20260331_222842_836461_A8E5F820 ", "X-CRM114-Status": "GOOD ( 24.57 )", "X-Spam-Score": "0.2 (/)", "X-Spam-Report": "Spam detection software,\n running on the system \"bombadil.infradead.org\",\n has NOT identified this incoming email as spam. The original\n message has been attached to this so you can view it or label\n similar future email. If you have any questions, see\n the administrator of that system for details.\n Content preview: Introduce support for triggering FTM-based proximity\n ranging\n via the NL80211 peer measurement interface after PASN auth. Add\n nl80211_start_peer_measurement()\n to build and send NL80211_CMD_PEER_MEASUREMENT_START with nested\n attributes\n for timeout handling, proximity detection, preamble selection,\n and FTM parameter\n struct [...]\n Content analysis details: (0.2 points, 5.0 required)\n pts rule name description\n ---- ----------------------\n --------------------------------------------------\n -0.7 RCVD_IN_DNSWL_LOW RBL: Sender listed at https://www.dnswl.org/, low\n trust\n [205.220.168.131 listed in list.dnswl.org]\n 1.0 RCVD_IN_VALIDITY_RPBL_BLOCKED RBL: ADMINISTRATOR NOTICE: The query to\n Validity was blocked. See\n https://knowledge.validity.com/hc/en-us/articles/20961730681243\n for more information.\n [205.220.168.131 listed in\n bl.score.senderscore.com]\n 1.0 RCVD_IN_VALIDITY_CERTIFIED_BLOCKED RBL: ADMINISTRATOR NOTICE: The\n query to Validity was blocked. See\n https://knowledge.validity.com/hc/en-us/articles/20961730681243\n for more information.\n [205.220.168.131 listed in\n sa-trusted.bondedsender.org]\n 1.0 RCVD_IN_VALIDITY_SAFE_BLOCKED RBL: ADMINISTRATOR NOTICE: The query to\n Validity was blocked. See\n https://knowledge.validity.com/hc/en-us/articles/20961730681243\n for more information.\n [205.220.168.131 listed in\n sa-accredit.habeas.com]\n 0.0 SPF_HELO_NONE SPF: HELO does not publish an SPF Record\n -0.0 SPF_PASS SPF: sender matches SPF record\n 0.1 DKIM_SIGNED Message has a DKIM or DK signature,\n not necessarily valid\n -0.1 DKIM_VALID_EF Message has a valid DKIM or DK signature from\n envelope-from domain\n -0.1 DKIM_VALID_AU Message has a valid DKIM or DK signature from\n author's\n domain\n -0.1 DKIM_VALID Message has at least one valid DKIM or DK\n signature\n -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1%\n [score: 0.0000]", "X-Mailman-Approved-At": "Wed, 01 Apr 2026 07:07:49 -0700", "X-BeenThere": "hostap@lists.infradead.org", "X-Mailman-Version": "2.1.34", "Precedence": "list", "List-Id": "<hostap.lists.infradead.org>", "List-Unsubscribe": "<http://lists.infradead.org/mailman/options/hostap>,\n <mailto:hostap-request@lists.infradead.org?subject=unsubscribe>", "List-Archive": "<http://lists.infradead.org/pipermail/hostap/>", "List-Post": "<mailto:hostap@lists.infradead.org>", "List-Help": "<mailto:hostap-request@lists.infradead.org?subject=help>", "List-Subscribe": "<http://lists.infradead.org/mailman/listinfo/hostap>,\n <mailto:hostap-request@lists.infradead.org?subject=subscribe>", "Content-Type": "text/plain; charset=\"us-ascii\"", "Content-Transfer-Encoding": "7bit", "Sender": "\"Hostap\" <hostap-bounces@lists.infradead.org>", "Errors-To": "hostap-bounces+incoming=patchwork.ozlabs.org@lists.infradead.org" }, "content": "Introduce support for triggering FTM-based proximity ranging\nvia the NL80211 peer measurement interface after PASN auth.\n\nAdd nl80211_start_peer_measurement() to build and send\nNL80211_CMD_PEER_MEASUREMENT_START with nested attributes for\ntimeout handling, proximity detection, preamble selection, and\nFTM parameter structure. Channel configuration includes proper\ncenter frequency calculation and mapping for EDCA and NTB.\n\nSigned-off-by: Peddolla Harshavardhan Reddy <peddolla.reddy@oss.qualcomm.com>\n---\n src/common/proximity_ranging.h | 7 +\n src/drivers/driver.h | 20 +++\n src/drivers/driver_nl80211.c | 302 +++++++++++++++++++++++++++++++++\n wpa_supplicant/driver_i.h | 16 ++\n wpa_supplicant/pr_supplicant.c | 213 ++++++++++++++++++++++-\n 5 files changed, 557 insertions(+), 1 deletion(-)", "diff": "diff --git a/src/common/proximity_ranging.h b/src/common/proximity_ranging.h\nindex cd12aaa50..6f597410f 100644\n--- a/src/common/proximity_ranging.h\n+++ b/src/common/proximity_ranging.h\n@@ -273,6 +273,7 @@ struct pr_pasn_ranging_params {\n \tu8 pr_pasn_status;\n \tu8 auth_mode;\n \tint freq;\n+\tu32 ranging_timeout;\n \tu8 src_addr[ETH_ALEN];\n \tenum pr_pasn_role pasn_role;\n \n@@ -353,6 +354,12 @@ struct pr_pasn_ranging_params {\n \tu32 continuous_ranging_session_time;\n \n \tint forced_pr_freq;\n+\tu8 ranging_op_class;\n+\tu16 channel_width; /* channel width in MHz (20/40/80/160/320) */\n+\tu8 format_bw;\n+\tu32 center_freq1;\n+\tu32 center_freq2;\n+\tu64 cookie;\n };\n \n struct pr_dev_ik {\ndiff --git a/src/drivers/driver.h b/src/drivers/driver.h\nindex 348634fad..c250bdaa9 100644\n--- a/src/drivers/driver.h\n+++ b/src/drivers/driver.h\n@@ -30,6 +30,7 @@\n \n struct nan_subscribe_params;\n struct nan_publish_params;\n+struct pr_pasn_ranging_params;\n \n #define HOSTAPD_CHAN_DISABLED 0x00000001\n #define HOSTAPD_CHAN_NO_IR 0x00000002\n@@ -5660,6 +5661,25 @@ struct wpa_driver_ops {\n \tstruct hostapd_multi_hw_info *\n \t(*get_multi_hw_info)(void *priv, unsigned int *num_multi_hws);\n \n+#ifdef CONFIG_PR\n+\t/**\n+\t * start_peer_measurement - Start peer measurement (FTM ranging)\n+\t * @priv: Private driver interface data\n+\t * @peer_addr: Peer MAC address\n+\t * @freq: Operating frequency in MHz\n+\t * @channel: Operating channel number\n+\t * @bw: Channel bandwidth in MHz\n+\t * @params: Ranging parameters (EDCA/NTB specific)\n+\t * Returns: 0 on success, -1 on failure\n+\t *\n+\t * This function triggers peer measurement (FTM ranging) after\n+\t * successful PASN authentication for proximity ranging.\n+\t */\n+\tint (*start_peer_measurement)(void *priv, const u8 *peer_addr,\n+\t\t\t\t int freq, u8 channel, int bw,\n+\t\t\t\t struct pr_pasn_ranging_params *params);\n+#endif /* CONFIG_PR */\n+\n #ifdef CONFIG_NAN\n \t/**\n \t * nan_start - Start NAN operation\ndiff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c\nindex 2543bc187..370701aa5 100644\n--- a/src/drivers/driver_nl80211.c\n+++ b/src/drivers/driver_nl80211.c\n@@ -41,6 +41,7 @@\n #include \"radiotap_iter.h\"\n #include \"rfkill.h\"\n #include \"driver_nl80211.h\"\n+#include \"common/proximity_ranging.h\"\n \n \n #ifndef NETLINK_CAP_ACK\n@@ -9110,6 +9111,306 @@ static int i802_sta_disassoc(void *priv, const u8 *own_addr, const u8 *addr,\n \t\t\t\t\t 0, NULL, 0, 0, link_id);\n }\n \n+#ifdef CONFIG_PR\n+\n+static u8 get_pr_preamble(u8 ranging_type, u8 format_bw)\n+{\n+\t/* Determine preamble based on ranging type and format_bw */\n+\tif (ranging_type & PR_EDCA_BASED_RANGING) {\n+\t\t/* EDCA format_bw maps to different preambles */\n+\t\tswitch (format_bw) {\n+\t\tcase EDCA_FORMAT_AND_BW_HT40:\n+\t\t\treturn NL80211_PREAMBLE_HT;\n+\t\tcase EDCA_FORMAT_AND_BW_VHT20:\n+\t\tcase EDCA_FORMAT_AND_BW_VHT40:\n+\t\tcase EDCA_FORMAT_AND_BW_VHT80:\n+\t\tcase EDCA_FORMAT_AND_BW_VHT80P80:\n+\t\tcase EDCA_FORMAT_AND_BW_VHT160_DUAL_LO:\n+\t\tcase EDCA_FORMAT_AND_BW_VHT160_SINGLE_LO:\n+\t\t\treturn NL80211_PREAMBLE_VHT;\n+\t\tdefault:\n+\t\t\treturn NL80211_PREAMBLE_VHT;\n+\t\t}\n+\t} else if (ranging_type & (PR_NTB_SECURE_LTF_BASED_RANGING | PR_NTB_OPEN_BASED_RANGING)) {\n+\t\t/* NTB format_bw all use HE preamble */\n+\t\treturn NL80211_PREAMBLE_HE;\n+\t}\n+\n+\t/* Default fallback */\n+\treturn NL80211_PREAMBLE_VHT;\n+}\n+\n+\n+/**\n+ * nl80211_start_peer_measurement - Start peer measurement (FTM ranging)\n+ * @priv: Private driver interface data\n+ * @peer_addr: Peer MAC address\n+ * @freq: Operating frequency in MHz\n+ * @channel: Operating channel number\n+ * @bw: Channel bandwidth in MHz\n+ * @params: Ranging parameters (EDCA/NTB specific)\n+ * Returns: 0 on success, -1 on failure\n+ *\n+ * This function constructs and sends NL80211_CMD_PEER_MEASUREMENT_START\n+ * command to trigger FTM ranging after successful PASN authentication.\n+ */\n+static int nl80211_start_peer_measurement(void *priv, const u8 *peer_addr,\n+\t\t\t\t\t int freq, u8 channel, int bw,\n+\t\t\t\t\t struct pr_pasn_ranging_params *params)\n+{\n+\tstruct i802_bss *bss = priv;\n+\tstruct i802_bss *pd_bss;\n+\tstruct wpa_driver_nl80211_data *drv = bss->drv;\n+\tstruct nl_msg *msg;\n+\tstruct nlattr *pmsr_attr, *peers_attr, *peer_attr, *chan_attr, *req_attr, *ftm_attr;\n+\tstruct nlattr *data_attr;\n+\tint ret = -1, center_freq1 = 0, center_freq2 = 0;\n+\tstruct nl80211_ack_ext_arg ack_arg;\n+\tenum nl80211_chan_width width;\n+\tu32 preamble;\n+\tu64 cookie;\n+\n+\tif (!peer_addr || !params) {\n+\t\twpa_printf(MSG_ERROR, \"nl80211: Invalid parameters for peer measurement\");\n+\t\treturn -1;\n+\t}\n+\n+\tpd_bss = nl80211_get_pd_bss_by_addr(drv, params->src_addr);\n+\tif (pd_bss) {\n+\t\twpa_printf(MSG_DEBUG,\n+\t\t\t \"nl80211: Peer measurement routed via PD wdev addr=\" MACSTR,\n+\t\t\t MAC2STR(pd_bss->addr));\n+\t\tbss = pd_bss;\n+\t}\n+\n+\twpa_printf(MSG_DEBUG,\n+\t\t \"nl80211: Start peer measurement for \" MACSTR \" freq=%d ch=%u bw=%d\",\n+\t\t MAC2STR(peer_addr), freq, channel, bw);\n+\n+\t/* Use center frequencies from params (calculated in wpas_pr_trigger_ranging) */\n+\tcenter_freq1 = params->center_freq1;\n+\tcenter_freq2 = params->center_freq2;\n+\n+\t/* channel_width is in MHz */\n+\tswitch (params->channel_width) {\n+\tcase 20:\n+\t\twidth = NL80211_CHAN_WIDTH_20;\n+\t\tbreak;\n+\tcase 40:\n+\t\twidth = NL80211_CHAN_WIDTH_40;\n+\t\tbreak;\n+\tcase 80:\n+\t\twidth = NL80211_CHAN_WIDTH_80;\n+\t\tbreak;\n+\tcase 160:\n+\t\twidth = NL80211_CHAN_WIDTH_160;\n+\t\tbreak;\n+\tcase 320:\n+\t\twidth = NL80211_CHAN_WIDTH_320;\n+\t\tbreak;\n+\tdefault:\n+\t\twpa_printf(MSG_ERROR, \"nl80211: Unsupported channel width %u MHz\",\n+\t\t\t params->channel_width);\n+\t\treturn -1;\n+\t}\n+\n+\twpa_printf(MSG_DEBUG,\n+\t\t \"nl80211: Using center_freq1=%u, center_freq2=%u, width=%d\",\n+\t\t center_freq1, center_freq2, width);\n+\t/*\n+\t * PD interfaces are non-netdev (ifindex=0); use nl80211_cmd_msg()\n+\t * which emits NL80211_ATTR_WDEV instead of NL80211_ATTR_IFINDEX.\n+\t */\n+\tmsg = nl80211_cmd_msg(bss, 0, NL80211_CMD_PEER_MEASUREMENT_START);\n+\tif (!msg)\n+\t\treturn -1;\n+\n+\t/* Add timeout if specified */\n+\tif (params->ranging_timeout > 0) {\n+\t\tif (nla_put_u32(msg, NL80211_ATTR_TIMEOUT, params->ranging_timeout))\n+\t\t\tgoto fail;\n+\t\twpa_printf(MSG_DEBUG, \"nl80211: Added timeout %u ms\", params->ranging_timeout);\n+\t}\n+\n+\t/* Add peer measurements attribute */\n+\tpmsr_attr = nla_nest_start(msg, NL80211_ATTR_PEER_MEASUREMENTS);\n+\tif (!pmsr_attr)\n+\t\tgoto fail;\n+\n+\t/* Add peers array */\n+\tpeers_attr = nla_nest_start(msg, NL80211_PMSR_ATTR_PEERS);\n+\tif (!peers_attr)\n+\t\tgoto fail;\n+\n+\t/* Add single peer */\n+\tpeer_attr = nla_nest_start(msg, 0);\n+\tif (!peer_attr)\n+\t\tgoto fail;\n+\n+\t/* Peer MAC address */\n+\tif (nla_put(msg, NL80211_PMSR_PEER_ATTR_ADDR, ETH_ALEN, peer_addr))\n+\t\tgoto fail;\n+\n+\t/* Add proximity detection request flag */\n+\tif (nla_put_flag(msg, NL80211_PMSR_PEER_ATTR_PD_REQUEST))\n+\t\tgoto fail;\n+\n+\t/* Channel information */\n+\tchan_attr = nla_nest_start(msg, NL80211_PMSR_PEER_ATTR_CHAN);\n+\tif (!chan_attr)\n+\t\tgoto fail;\n+\n+\tif (nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, freq) ||\n+\t nla_put_u32(msg, NL80211_ATTR_CHANNEL_WIDTH, width) ||\n+\t nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ1, center_freq1))\n+\t\tgoto fail;\n+\n+\tif (center_freq2 && nla_put_u32(msg, NL80211_ATTR_CENTER_FREQ2, center_freq2))\n+\t\tgoto fail;\n+\n+\tnla_nest_end(msg, chan_attr);\n+\n+\n+\t/* Request attributes */\n+\treq_attr = nla_nest_start(msg, NL80211_PMSR_PEER_ATTR_REQ);\n+\tif (!req_attr)\n+\t\tgoto fail;\n+\n+\t/* Add DATA attribute as required by NL80211 specification */\n+\tdata_attr = nla_nest_start(msg, NL80211_PMSR_REQ_ATTR_DATA);\n+\n+\tif (!data_attr)\n+\t\tgoto fail;\n+\n+\t/* FTM request */\n+\tftm_attr = nla_nest_start(msg, NL80211_PMSR_TYPE_FTM);\n+\tif (!ftm_attr)\n+\t\tgoto fail;\n+\n+\tpreamble = get_pr_preamble(params->ranging_type, params->format_bw);\n+\tif (nla_put_u32(msg, NL80211_PMSR_FTM_REQ_ATTR_PREAMBLE, preamble))\n+\t\tgoto fail;\n+\n+\t/* Map ranging parameters to NL80211 attributes based on protocol type */\n+\tif (params->ranging_role == PR_ISTA_SUPPORT &&\n+\t (params->ranging_type & PR_EDCA_BASED_RANGING)) {\n+\t\twpa_printf(MSG_DEBUG, \"nl80211: Adding EDCA ranging parameters\");\n+\n+\t\tif (nla_put_flag(msg, NL80211_PMSR_FTM_REQ_ATTR_ASAP) ||\n+\t\t nla_put_u16(msg, NL80211_PMSR_FTM_REQ_ATTR_BURST_PERIOD,\n+\t\t\t\tparams->burst_period) ||\n+\t\t nla_put_u8(msg, NL80211_PMSR_FTM_REQ_ATTR_NUM_BURSTS_EXP,\n+\t\t\t params->num_bursts_exp) ||\n+\t\t nla_put_u8(msg, NL80211_PMSR_FTM_REQ_ATTR_FTMS_PER_BURST,\n+\t\t\t params->ftms_per_burst) ||\n+\t\t nla_put_u8(msg, NL80211_PMSR_FTM_REQ_ATTR_NUM_FTMR_RETRIES,\n+\t\t\t params->ftmr_retries) ||\n+\t\t nla_put_u8(msg, NL80211_PMSR_FTM_REQ_ATTR_BURST_DURATION,\n+\t\t\t params->burst_duration))\n+\t\t\tgoto fail;\n+\t}\n+\n+\tif (params->ranging_type & (PR_NTB_SECURE_LTF_BASED_RANGING | PR_NTB_OPEN_BASED_RANGING)) {\n+\t\twpa_printf(MSG_DEBUG, \"nl80211: Adding NTB ranging parameters\");\n+\n+\t\t/* Set non-trigger based flag */\n+\t\tif (nla_put_flag(msg, NL80211_PMSR_FTM_REQ_ATTR_NON_TRIGGER_BASED))\n+\t\t\tgoto fail;\n+\n+\t\tif (params->ranging_role == PR_ISTA_SUPPORT &&\n+\t\t (nla_put_u32(msg, NL80211_PMSR_FTM_REQ_ATTR_MIN_TIME_BETWEEN_MEASUREMENTS,\n+\t\t\t\tparams->min_time_between_measurements) ||\n+\t\t nla_put_u32(msg, NL80211_PMSR_FTM_REQ_ATTR_MAX_TIME_BETWEEN_MEASUREMENTS,\n+\t\t\t\tparams->max_time_between_measurements) ||\n+\t\t nla_put_u32(msg, NL80211_PMSR_FTM_REQ_ATTR_AW_DURATION,\n+\t\t\t\tparams->availability_window) ||\n+\t\t nla_put_u32(msg, NL80211_PMSR_FTM_REQ_ATTR_NOMINAL_TIME,\n+\t\t\t\tparams->nominal_time) ||\n+\t\t nla_put_u32(msg, NL80211_PMSR_FTM_REQ_ATTR_MEAS_PER_AW,\n+\t\t\t\tparams->measurements_per_aw)))\n+\t\t\tgoto fail;\n+\t}\n+\n+\t/* Location requests */\n+\tif (params->request_lci &&\n+\t nla_put_flag(msg, NL80211_PMSR_FTM_REQ_ATTR_REQUEST_LCI))\n+\t\tgoto fail;\n+\n+\tif (params->request_civicloc &&\n+\t nla_put_flag(msg, NL80211_PMSR_FTM_REQ_ATTR_REQUEST_CIVICLOC))\n+\t\tgoto fail;\n+\n+\t/* RSTA mode if responder role */\n+\tif (params->ranging_role == PR_RSTA_SUPPORT &&\n+\t nla_put_flag(msg, NL80211_PMSR_FTM_REQ_ATTR_RSTA))\n+\t\tgoto fail;\n+\n+\t/*\n+\t * LMR feedback: negotiate LMR feedback for NTB ranging so that\n+\t * the RSTA can report its measurement results back to the ISTA.\n+\t * Only valid when NON_TRIGGER_BASED is set.\n+\t */\n+\tif ((params->ranging_type & (PR_NTB_SECURE_LTF_BASED_RANGING |\n+\t\t\t\t PR_NTB_OPEN_BASED_RANGING)) &&\n+\t nla_put_flag(msg, NL80211_PMSR_FTM_REQ_ATTR_LMR_FEEDBACK))\n+\t\tgoto fail;\n+\n+\t/*\n+\t * PD ingress/egress thresholds: only valid when\n+\t * NL80211_PMSR_PEER_ATTR_PD_REQUEST is set (always the case here).\n+\t * Thresholds are in millimeters.\n+\t */\n+\tif (params->ingress_threshold &&\n+\t nla_put_u64(msg, NL80211_PMSR_FTM_REQ_ATTR_INGRESS,\n+\t\t\tparams->ingress_threshold))\n+\t\tgoto fail;\n+\n+\tif (params->egress_threshold &&\n+\t nla_put_u64(msg, NL80211_PMSR_FTM_REQ_ATTR_EGRESS,\n+\t\t\tparams->egress_threshold))\n+\t\tgoto fail;\n+\n+\t/*\n+\t * PD suppress results: suppress ranging results for PD requests.\n+\t */\n+\tif (params->pr_suppress_results &&\n+\t nla_put_flag(msg, NL80211_PMSR_FTM_REQ_ATTR_PD_SUPPRESS_RESULTS))\n+\t\tgoto fail;\n+\n+\tnla_nest_end(msg, ftm_attr);\n+\tnla_nest_end(msg, data_attr);\n+\tnla_nest_end(msg, req_attr);\n+\tnla_nest_end(msg, peer_attr);\n+\tnla_nest_end(msg, peers_attr);\n+\tnla_nest_end(msg, pmsr_attr);\n+\n+\tcookie = 0;\n+\tos_memset(&ack_arg, 0, sizeof(struct nl80211_ack_ext_arg));\n+\tack_arg.ext_data = &cookie;\n+\tret = send_and_recv(drv, drv->global->nl, msg, NULL, NULL,\n+\t\t\t ack_handler_cookie, &ack_arg, NULL);\n+\n+\tif (ret < 0) {\n+\t\twpa_printf(MSG_ERROR,\n+\t\t\t \"nl80211: Peer measurement start failed: ret=%d (%s)\",\n+\t\t\t ret, strerror(-ret));\n+\t} else {\n+\t\twpa_printf(MSG_DEBUG,\n+\t\t\t \"nl80211: Peer measurement started successfully addr=\" MACSTR\n+\t\t\t \" cookie=%llu\", MAC2STR(peer_addr),\n+\t\t\t (unsigned long long) cookie);\n+\t\tparams->cookie = cookie;\n+\t}\n+\n+\treturn ret;\n+\n+fail:\n+\twpa_printf(MSG_ERROR, \"nl80211: Failed to build peer measurement message\");\n+\tnlmsg_free(msg);\n+\treturn -1;\n+}\n+\n+#endif /* CONFIG_PR */\n \n static void dump_ifidx(struct wpa_driver_nl80211_data *drv)\n {\n@@ -15883,5 +16184,6 @@ const struct wpa_driver_ops wpa_driver_nl80211_ops = {\n \t.pd_start = nl80211_pd_start,\n \t.pd_stop = nl80211_pd_stop,\n \t.get_pd_addr = nl80211_get_pd_addr,\n+\t.start_peer_measurement = nl80211_start_peer_measurement,\n #endif /* CONFIG_PR */\n };\ndiff --git a/wpa_supplicant/driver_i.h b/wpa_supplicant/driver_i.h\nindex f2eba74dc..3d1988fd3 100644\n--- a/wpa_supplicant/driver_i.h\n+++ b/wpa_supplicant/driver_i.h\n@@ -758,6 +758,22 @@ wpa_drv_pd_stop(struct wpa_supplicant *wpa_s)\n \n #endif /* CONFIG_PR */\n \n+#ifdef CONFIG_PR\n+\n+static inline int\n+wpa_drv_start_peer_measurement(struct wpa_supplicant *wpa_s, const u8 *peer,\n+\t\t\t int freq, u8 channel, int bw,\n+\t\t\t struct pr_pasn_ranging_params *params)\n+{\n+\tif (!wpa_s->driver->start_peer_measurement)\n+\t\treturn -1;\n+\treturn wpa_s->driver->start_peer_measurement(wpa_s->drv_priv, peer,\n+\t\t\t\t\t\t freq, channel, bw,\n+\t\t\t\t\t\t params);\n+}\n+\n+#endif /* CONFIG_PR */\n+\n static inline int wpa_drv_vendor_cmd(struct wpa_supplicant *wpa_s,\n \t\t\t\t int vendor_id, int subcmd, const u8 *data,\n \t\t\t\t size_t data_len,\ndiff --git a/wpa_supplicant/pr_supplicant.c b/wpa_supplicant/pr_supplicant.c\nindex 2504a2030..bc52c8389 100644\n--- a/wpa_supplicant/pr_supplicant.c\n+++ b/wpa_supplicant/pr_supplicant.c\n@@ -11,6 +11,7 @@\n #include \"utils/common.h\"\n #include \"utils/eloop.h\"\n #include \"common/ieee802_11_defs.h\"\n+#include \"common/ieee802_11_common.h\"\n #include \"common/proximity_ranging.h\"\n #include \"p2p/p2p.h\"\n #include \"wpa_supplicant_i.h\"\n@@ -135,6 +136,107 @@ wpas_pr_ntb_is_valid_op_class(u32 bw_bitmap, u32 preamble_bitmap,\n }\n \n \n+/**\n+ * wpas_pr_op_class_to_chan_params - Derive channel parameters from operating\n+ * class and channel number\n+ * @op_class: IEEE 802.11 operating class\n+ * @op_channel: Primary channel number\n+ * @center_freq1: Output - center frequency segment 0 (MHz)\n+ * @center_freq2: Output - center frequency segment 1 (MHz), 0 if not used\n+ * @width: Output - channel bandwidth\n+ * Returns: 0 on success, -1 on failure\n+ *\n+ * Derives center_freq1 and bandwidth from the operating class and primary\n+ * channel using existing hostap helpers. 2 GHz 40 MHz op_classes are handled\n+ * explicitly because 2.4 GHz channels are 5 MHz apart and the generic\n+ * offset-based formula does not apply. 80+80 MHz op_classes (130, 135) are\n+ * rejected because center_freq2 cannot be determined from the primary channel\n+ * alone.\n+ */\n+static int wpas_pr_op_class_to_chan_params(u8 op_class, u8 op_channel,\n+\t\t\t\t\t u32 *center_freq1,\n+\t\t\t\t\t u32 *center_freq2,\n+\t\t\t\t\t u16 *channel_width)\n+{\n+\tint control_freq, bw, offset = 0;\n+\n+\tif (!center_freq1 || !center_freq2 || !channel_width)\n+\t\treturn -1;\n+\n+\t*center_freq1 = 0;\n+\t*center_freq2 = 0;\n+\t*channel_width = 0;\n+\n+\t/* 80+80 MHz: center_freq2 is unknown from primary channel alone */\n+\tif (op_class == 130 || op_class == 135) {\n+\t\twpa_printf(MSG_DEBUG,\n+\t\t\t \"PR: op_class %u (80+80 MHz) not supported, \"\n+\t\t\t \"center_freq2 cannot be determined\", op_class);\n+\t\treturn -1;\n+\t}\n+\n+\tcontrol_freq = ieee80211_chan_to_freq(NULL, op_class, op_channel);\n+\tif (control_freq < 0) {\n+\t\twpa_printf(MSG_DEBUG, \"PR: Invalid op_class=%u channel=%u\",\n+\t\t\t op_class, op_channel);\n+\t\treturn -1;\n+\t}\n+\n+\tbw = op_class_to_bandwidth(op_class);\n+\n+\t/*\n+\t * 2 GHz 40 MHz: channels are 5 MHz apart so the generic offset\n+\t * formula does not apply. Handle upper (op_class 83) and lower\n+\t * (op_class 84) secondary channel directions explicitly.\n+\t */\n+\tif (op_class == 83) {\n+\t\t*center_freq1 = control_freq + 10;\n+\t\t*channel_width = 40;\n+\t\treturn 0;\n+\t}\n+\tif (op_class == 84) {\n+\t\t*center_freq1 = control_freq - 10;\n+\t\t*channel_width = 40;\n+\t\treturn 0;\n+\t}\n+\n+\tif (bw == 20) {\n+\t\t*center_freq1 = control_freq;\n+\t\t*channel_width = 20;\n+\t\treturn 0;\n+\t}\n+\n+\t/*\n+\t * For 5 GHz and 6 GHz wider bandwidths, compute the primary channel's\n+\t * position (in 20 MHz steps) within its band segment, then derive\n+\t * center_freq1 using the formula:\n+\t * center_freq1 = control_freq + (bw/2 - 10) - (offset & (bw/20 - 1)) * 20\n+\t */\n+\tif (control_freq >= 5955)\n+\t\toffset = (control_freq - 5955) / 20;\n+\telse if (control_freq >= 5745)\n+\t\toffset = (control_freq - 5745) / 20;\n+\telse if (control_freq >= 5180)\n+\t\toffset = (control_freq - 5180) / 20;\n+\n+\t/* Distance from the primary channel to the center of the BW block */\n+\tint half_bw = bw / 2 - 10;\n+\n+\t/* Position of the primary channel within its BW block (in 20 MHz steps) */\n+\tint block_pos = offset & (bw / 20 - 1);\n+\n+\t/* Center = primary channel + half-BW offset - position within block */\n+\t*center_freq1 = control_freq + half_bw - block_pos * 20;\n+\t*channel_width = bw;\n+\n+\twpa_printf(MSG_DEBUG,\n+\t\t \"PR: op_class=%u ch=%u -> freq=%d cf1=%u bw=%d\",\n+\t\t op_class, op_channel, control_freq, *center_freq1, bw);\n+\n+\treturn 0;\n+}\n+\n+\n static void\n wpas_pr_setup_edca_channels(struct wpa_supplicant *wpa_s,\n \t\t\t struct pr_channels *chan,\n@@ -275,6 +377,111 @@ static void wpas_pr_pasn_result(void *ctx, u8 role, u8 protocol_type,\n }\n \n \n+/**\n+ * wpas_pr_trigger_ranging - Trigger ranging measurement after PASN auth\n+ * @wpa_s: Pointer to wpa_supplicant data\n+ * @peer_addr: Peer MAC address\n+ * @freq: Operating frequency in MHz\n+ * @op_class: Operating class\n+ * @op_channel: Operating channel number\n+ * @bw: Channel bandwidth enum value\n+ * @format_bw: Format and bandwidth value\n+ * @protocol_type: Ranging protocol type (EDCA/NTB)\n+ *\n+ * This function triggers the actual ranging measurement after successful\n+ * PASN authentication by constructing and sending the NL80211 peer\n+ * measurement start command.\n+ */\n+static int wpas_pr_trigger_ranging(struct wpa_supplicant *wpa_s,\n+\t\t\t\t const u8 *peer_addr, int freq, u8 op_class,\n+\t\t\t\t u8 op_channel, u8 format_bw,\n+\t\t\t\t u8 protocol_type)\n+{\n+\tstruct pr_data *pr = wpa_s->global->pr;\n+\tstruct pr_pasn_ranging_params *params;\n+\tu16 channel_width = 0;\n+\tu32 center_freq1 = 0, center_freq2 = 0;\n+\tint ret;\n+\n+\tif (!pr || !pr->pr_pasn_params) {\n+\t\twpa_printf(MSG_DEBUG,\n+\t\t\t \"PR: No ranging params available for \" MACSTR,\n+\t\t\t MAC2STR(peer_addr));\n+\t\treturn -1;\n+\t}\n+\n+\tparams = pr->pr_pasn_params;\n+\n+\twpa_printf(MSG_DEBUG,\n+\t\t \"PR: Triggering ranging for \" MACSTR \" freq=%d ch=%u\",\n+\t\t MAC2STR(peer_addr), freq, op_channel);\n+\n+\t/* Derive center frequencies and channel width (MHz) from op_class */\n+\tret = wpas_pr_op_class_to_chan_params(op_class, op_channel,\n+\t\t\t\t\t ¢er_freq1, ¢er_freq2,\n+\t\t\t\t\t &channel_width);\n+\tif (ret < 0) {\n+\t\twpa_printf(MSG_ERROR,\n+\t\t\t \"PR: Failed to derive channel params for \"\n+\t\t\t \"op_class=%u ch=%u\", op_class, op_channel);\n+\t\tgoto fail;\n+\t}\n+\n+\t/* Populate ranging params */\n+\tparams->ranging_op_class = op_class;\n+\tparams->channel_width = channel_width;\n+\tparams->format_bw = format_bw;\n+\tparams->center_freq1 = center_freq1;\n+\tparams->center_freq2 = center_freq2;\n+\n+\t/* Validate format_bw is within enum limits before setting preamble */\n+\tif (protocol_type & PR_EDCA_BASED_RANGING) {\n+\t\tif (format_bw < EDCA_FORMAT_AND_BW_VHT20 ||\n+\t\t format_bw >= EDCA_FORMAT_AND_BW_MAX) {\n+\t\t\twpa_printf(MSG_ERROR,\n+\t\t\t\t \"PR: Invalid EDCA format_bw %u (valid range: %u-%u)\",\n+\t\t\t\t format_bw, EDCA_FORMAT_AND_BW_VHT20,\n+\t\t\t\t EDCA_FORMAT_AND_BW_MAX - 1);\n+\t\t\tgoto fail;\n+\t\t}\n+\t} else if (protocol_type & (PR_NTB_SECURE_LTF_BASED_RANGING |\n+\t\t\t\t PR_NTB_OPEN_BASED_RANGING)) {\n+\t\tif (format_bw >= NTB_FORMAT_AND_BW_MAX) {\n+\t\t\twpa_printf(MSG_ERROR,\n+\t\t\t\t \"PR: Invalid NTB format_bw %u (valid range: 0-%u)\",\n+\t\t\t\t format_bw, NTB_FORMAT_AND_BW_MAX - 1);\n+\t\t\tgoto fail;\n+\t\t}\n+\t} else {\n+\t\twpa_printf(MSG_ERROR, \"PR: Unknown protocol_type %u\",\n+\t\t\t protocol_type);\n+\t\tgoto fail;\n+\t}\n+\n+\twpa_printf(MSG_DEBUG,\n+\t\t \"PR: Ranging params - op_class=%u, ch_width=%u, format_bw=%u, cf1=%u, cf2=%u\",\n+\t\t params->ranging_op_class, params->channel_width,\n+\t\t params->format_bw, params->center_freq1, params->center_freq2);\n+\n+\t/* Call driver operation to start peer measurement */\n+\tif (wpa_drv_start_peer_measurement(wpa_s, peer_addr, freq, op_channel,\n+\t\t\t\t\t channel_width, params) < 0) {\n+\t\twpa_printf(MSG_ERROR, \"PR: Failed to start peer measurement\");\n+\t\tgoto fail;\n+\t}\n+\n+\twpa_printf(MSG_DEBUG, \"PR: Successfully triggered ranging measurement\");\n+\n+\treturn 0;\n+\n+fail:\n+\t/* Clean up on failure */\n+\tos_free(pr->pr_pasn_params);\n+\tpr->pr_pasn_params = NULL;\n+\treturn -1;\n+}\n+\n+\n static void wpas_pr_ranging_params(void *ctx, const u8 *dev_addr,\n \t\t\t\t const u8 *peer_addr, u8 ranging_role,\n \t\t\t\t u8 protocol_type, u8 op_class, u8 op_channel,\n@@ -283,7 +490,7 @@ static void wpas_pr_ranging_params(void *ctx, const u8 *dev_addr,\n \tstruct wpa_supplicant *wpa_s = ctx;\n \tint bw, format_bw, freq;\n \n-\tbw = oper_class_bw_to_int(get_oper_class(NULL, op_class));\n+\tbw = op_class_to_bandwidth(op_class);\n \tformat_bw = self_format_bw < peer_format_bw ?\n \t\tself_format_bw : peer_format_bw;\n \tfreq = ieee80211_chan_to_freq(NULL, op_class, op_channel);\n@@ -291,6 +498,10 @@ static void wpas_pr_ranging_params(void *ctx, const u8 *dev_addr,\n \twpas_notify_pr_ranging_params(wpa_s, dev_addr, peer_addr, ranging_role,\n \t\t\t\t protocol_type, freq, op_channel, bw,\n \t\t\t\t format_bw);\n+\n+\t/* Trigger ranging measurement after successful PASN authentication */\n+\twpas_pr_trigger_ranging(wpa_s, peer_addr, freq, op_class, op_channel,\n+\t\t\t\tformat_bw, protocol_type);\n }\n \n \n", "prefixes": [ "RFC", "19/23" ] }