Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/2218583/?format=api
{ "id": 2218583, "url": "http://patchwork.ozlabs.org/api/patches/2218583/?format=api", "web_url": "http://patchwork.ozlabs.org/project/hostap/patch/20260401052713.3761478-13-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-13-peddolla.reddy@oss.qualcomm.com>", "list_archive_url": null, "date": "2026-04-01T05:27:02", "name": "[RFC,12/23] nl80211: Add Proximity Detection (PD) wdev support", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "12cd006f8e5ae9c2c73db54325a64b2cca951f94", "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-13-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/2218583/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/2218583/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=kpyCFDR+;\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=pDuMb299;\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=h/35bcil;\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 4fm6KM5LKhz1yGw\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 1w7wEc-0000000FNn9-0AO1;\n\tWed, 01 Apr 2026 14:07:54 +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 1w7o7y-0000000DzoS-3W2h\n\tfor hostap@lists.infradead.org;\n\tWed, 01 Apr 2026 05:28:31 +0000", "from pps.filterd (m0279865.ppops.net [127.0.0.1])\n\tby mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id\n 6312Is1W1004296\n\tfor <hostap@lists.infradead.org>; Wed, 1 Apr 2026 05:28:30 GMT", "from mail-pf1-f199.google.com (mail-pf1-f199.google.com\n [209.85.210.199])\n\tby mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4d8tfjgn1k-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:29 +0000 (GMT)", "by mail-pf1-f199.google.com with SMTP id\n d2e1a72fcca58-82c1e1a6cfbso4759235b3a.0\n for <hostap@lists.infradead.org>;\n Tue, 31 Mar 2026 22:28:29 -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.27\n (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n Tue, 31 Mar 2026 22:28:28 -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=ZnZOZ8Hqd0qmfSXkJ/YORoJrlgVTHduHK2EfCPqQEbs=; b=kpyCFDR+Gqt2x8\n\tHnkumv612t1OTVyumI+7M3MfC+ZhhtZXAIDdu1PvbOrRITl+bRsjePjaFEwSIDsBmJF26Zl2MYy+5\n\t2D4NC7fqv7SHncE5SZAgg5RjaoD6aR+WbvwGXp6KidTKnub9TOIcGEVpSk989eLXqxyOuNQv/XBau\n\tsYQprhAk+f/mcxgsmbtpGqU6jE7Nyl5x1AbswsXp4vQ76mIB7kH6BphgfP5SC3Ij4xIq7KSXuOGRY\n\tXY8lzRXgOzE6DgRqyklEssqqOiYktbU1aGLvjVkQX2aIGfrhBvpoSO8Hs675ax5VAonF6QdlRFIAK\n\tuzxYynqY8IveqHOCFHGQ==;", "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=vv52xGZmTq6\n\tQM1P7goI1VWEmwA46y2q7bkccTE3tL3Q=; b=pDuMb2992wIkuXw7UQzguhMslKe\n\tT+3wz5xzCG7VZ/NhPsXIICtdWSggKTPkK8roJx7h8iULDzQ9qG0U0jxfg3h1r4U/\n\tyTQBMTpJ6sdcEvrIm4t35U/xY6bc+ELUyFr1SY5eKIez3/6Ywca+QA5EgrPX2jUQ\n\trn2UjlMBRplsCxQUxxfdSiujA38HdoAOw6Dh79TJmwrdQP0IYaxxzyPSrydc8GeV\n\tJTqcXstMt3StDtPHndFHrXOm/F40bmbyn7819gQSTBRzsELz+eURLK9kyOX3Xhb3\n\tU8saKWz35I1I9JovivHcBonxjoSuufDNxzzNZ4/OG1zTd2vXZDzlBr5AV1g==", "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=oss.qualcomm.com; s=google; t=1775021309; x=1775626109;\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=vv52xGZmTq6QM1P7goI1VWEmwA46y2q7bkccTE3tL3Q=;\n b=h/35bcilFY/dQiw0vjcxYpvQA0KUlKm1xx5jwXGc/JWT3koZxm8VGWUqY3Vgh0sLtQ\n dSu8/BBSku5PaywJJnu5KixK0djOeL2sdRb75hz5LOsPgnsNaQ2QvF/FoFOZutTIjhW1\n mMB00wY2IgBXTxXd+JJSkDAvKbaIYaLRRQthV34n5POTvGhO8F5Nx+zRqfo2JPSO1fzE\n g3OTvZvHy6vscQKd3LC5M/qPIr/TdR5nq1EN20zifzx+t5gWIKH8pHJWBS/0PQPmCXGr\n hz6rnesv0/Z7+pDuJxmOWgpuuUC3t0X2S0Bn/vVeDq4iFU/bOLzs0IYWPZ7nCzm7chRe\n s8xg==" ], "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1775021309; x=1775626109;\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=vv52xGZmTq6QM1P7goI1VWEmwA46y2q7bkccTE3tL3Q=;\n b=CVW9uOzsSalt+rAKfqMBdPM/r9E5un+LDipW+yTNx0F0Zp4yR/rqNq5A4eG5FYV3Jg\n OLb2GQHCtUrOZKQecEx983rCi4V0Isw/5mFaQBXybnZWZAklwDHydKyPqaFmthbA6DoO\n ErVKMMZt0GEdwTRtookuJU+EGgtD5ot3MN3UHcOGJWw+nSQuK3iQPiO3PLwek1aydrWo\n tyQz429Oz2OJnBrAVw8vUiU0URKBsYV8aXizepcp+G2zwL+oZWdqYMwvbCDMTg2ymwj8\n LY8tC05C8bfJY/J8f1EiiyNeesz/HR2TiT4p2C7r50O9lJHPBwpGwyoMxz0j9mLIlWAv\n ymgQ==", "X-Gm-Message-State": "AOJu0YyC0aDFwjAYflBw0JgBGNqlgIUQ3jRuNSno7AWMh8qAjXRT4e5x\n\t57PtA10PcZUL+nxx3amgN5lMSK6xS2MCw6tzpP8LbAzdtLL+xRfdCIKWPFMfbL+qzAIqYy6qZJQ\n\tbHRZ+shu1C2Mqt9JatHznLpIqSVL4acUclCfpyYVsa2HPSeyZgef4Dyb6c4Dw8aCWowcrnlA=", "X-Gm-Gg": "ATEYQzxFprnqBufwNmDRhl+rAZ2Y2+6NWi0IgJpa//xdLf/Wel5ASZ25pHeQDJhLHG+\n\tE69l/JkDMINsvsr+axzdc2NyF9eKDKu7ZeSH4fIihIV2AlY7U3uYPSeeM7BqRxhd595cXgcKWVH\n\t1o8GbElWVZAHfbKexbM6Lo8kgZe9hyNwcbMIVydlng5w4akvbDV2UN+s0lbkjIHtgY1k+vCGOnz\n\tuRwzfq/AfFiu37GV8vbDgFvLb6IP+jdkpODPHHGiDiPzE5AS11SOVQe3PO22V4BrjknlmRj82FO\n\tGocmJRmP8wyTkw+cZHomLbDFgjgd3zCQ97DEijgQzKhTh4fvjWyv3sEElG0a8JHH0oDHVPoSAD4\n\tYWMFgrpRRLwlg8kWgtvzHYorOk3BRyHnCbyYESslWfJqQVa3lq3nMi/c=", "X-Received": [ "by 2002:a05:6a00:cc4:b0:81f:44f9:7c1a with SMTP id\n d2e1a72fcca58-82ce88ea2f6mr2398077b3a.3.1775021309265;\n Tue, 31 Mar 2026 22:28:29 -0700 (PDT)", "by 2002:a05:6a00:cc4:b0:81f:44f9:7c1a with SMTP id\n d2e1a72fcca58-82ce88ea2f6mr2398047b3a.3.1775021308635;\n Tue, 31 Mar 2026 22:28:28 -0700 (PDT)" ], "From": "Peddolla Harshavardhan Reddy <peddolla.reddy@oss.qualcomm.com>", "To": "hostap@lists.infradead.org", "Cc": "vjakkam@qti.qualcomm.com", "Subject": "[RFC PATCH 12/23] nl80211: Add Proximity Detection (PD) wdev support", "Date": "Wed, 1 Apr 2026 10:57:02 +0530", "Message-Id": "<20260401052713.3761478-13-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-GUID": "cBnBt1fsFLvnTBlPJea5hxL1irnhZzYv", "X-Proofpoint-Spam-Details-Enc": "AW1haW4tMjYwNDAxMDA0NCBTYWx0ZWRfXzyXoXNObX0jn\n PdXOyl1kyTp6/no8PISfSpbc/8IBd2isKtiM/soeIBxdVUjW7Pg47FcdUM3+OZjOlc+YhtbA/Qs\n 2JKnLkRNxUY/MXjf6asu9zLPFrQmv4EkczjlQXZ9gCu3stzqeqLZuSaql7nOWzzQyZvBV+3p9wI\n c5gZYf39siJgGkhFVUi4xQlbKbSlL0oU+h57AK/szn9eUh0X/S+M+vFPuD3qGidP5wT/Xrez4kD\n GDrFYp/Tm7zNDsEf/ZcxIiREZDxh878M8MeQkF139MJhn1U8uCzKjWUtzvyS05f3JfRFXmYuEU6\n ODBlzpaviKyzuvsJZxiIBFwGkTDsY7PbCE3+ABefqPcVbBU6U6Ojp68KYrzAckaMfjRXbDLVU94\n VEk9QbBYAnD8FrGR3JcrFvzn/uV9pSkmeUs3aE17l6JpnEnAmIjD47fKwK/0rUKngWcSuvD9I3R\n 0N/C1R4sRHEG+nyOBEg==", "X-Authority-Analysis": "v=2.4 cv=fJc0HJae c=1 sm=1 tr=0 ts=69ccacfe cx=c_pps\n a=WW5sKcV1LcKqjgzy2JUPuA==:117 a=ZePRamnt/+rB5gQjfz0u9A==:17\n a=A5OVakUREuEA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22\n a=u7WPNUs3qKkmUXheDGA7:22 a=Um2Pa8k9VHT-vaBCBUpS:22 a=EUspDBNiAAAA:8\n a=DHxRlQbFRQVQbWPMS9sA:9 a=OpyuDcXvxspvyRM73sMx:22", "X-Proofpoint-ORIG-GUID": "cBnBt1fsFLvnTBlPJea5hxL1irnhZzYv", "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 malwarescore=0 phishscore=0 suspectscore=0 lowpriorityscore=0 adultscore=0\n priorityscore=1501 spamscore=0 clxscore=1015 bulkscore=0 impostorscore=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_222830_890697_AF48BC85 ", "X-CRM114-Status": "GOOD ( 26.94 )", "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: From: Veerendranath Jakkam <vjakkam@qti.qualcomm.com>\n Introduce\n driver and nl80211 support for a Proximity Detection (PD) virtual\n interface,\n enabled under CONFIG_PR. A new set of driver ops is added: - pd_start():\n create and activate a PD wdev (NL80211_IFTYPE_PD), returning the effective\n PD MAC address - pd_stop(): stop and destroy the PD wdev - get_pd_addr():\n que [...]\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": "From: Veerendranath Jakkam <vjakkam@qti.qualcomm.com>\n\nIntroduce driver and nl80211 support for a Proximity Detection (PD) virtual\ninterface, enabled under CONFIG_PR.\n\nA new set of driver ops is added:\n- pd_start(): create and activate a PD wdev (NL80211_IFTYPE_PD), returning\n the effective PD MAC address\n- pd_stop(): stop and destroy the PD wdev\n- get_pd_addr(): query the MAC address of the active PD wdev\n\nOn the nl80211 side:\n- Create a PD-only i802_bss (drv->pd_bss) that is not part of the regular\n BSS list but is associated with the parent wpa_s (ctx).\n- nl80211_pd_start() creates a non-netdev PD interface via\n nl80211_create_iface(), obtains its wdev_id and MAC address, and\n activates it via nl80211_set_pr_dev(..., 1) which sends\n NL80211_CMD_START_PD.\n- nl80211_pd_stop() deactivates and removes the PD wdev via\n nl80211_set_pr_dev(..., 0) and nl80211_del_non_netdev().\n- nl80211_get_pd_addr() exposes the current PD MAC address to upper layers.\n- Add helper lookups nl80211_get_pd_bss_by_addr() and\n nl80211_get_pd_bss_by_wdev() to route events arriving on the PD wdev\n back to the parent context.\n\nThe wdev_info helper and its netlink callback are generalized and renamed\nto nl80211_wdev_handler_info so they can be reused both for PD creation\nand for other non-netdev interfaces (replacing the previous\nnl80211_wdev_handler).\n\nwpa_supplicant is updated with wpa_drv_pd_start() and wpa_drv_pd_stop()\nwrappers that call into the driver if CONFIG_PR is enabled. All PD-related\noperations are safe no-ops when no PD wdev is active.\n\nSigned-off-by: Veerendranath Jakkam <vjakkam@qti.qualcomm.com>\n---\n src/drivers/driver.h | 35 +++++++\n src/drivers/driver_nl80211.c | 193 ++++++++++++++++++++++++++++++-----\n src/drivers/driver_nl80211.h | 29 ++++++\n wpa_supplicant/driver_i.h | 20 ++++\n 4 files changed, 250 insertions(+), 27 deletions(-)", "diff": "diff --git a/src/drivers/driver.h b/src/drivers/driver.h\nindex 79e3230da..c7c4e7571 100644\n--- a/src/drivers/driver.h\n+++ b/src/drivers/driver.h\n@@ -5677,6 +5677,41 @@ struct wpa_driver_ops {\n \t */\n \tvoid (*nan_stop)(void *priv);\n #endif /* CONFIG_NAN */\n+\n+#ifdef CONFIG_PR\n+\t/**\n+\t * pd_start - Create and activate a PD (Proximity Detection) wdev\n+\t * @priv: Private driver interface data\n+\t * @addr: Requested MAC address for the PD wdev\n+\t * @pd_addr: Buffer (ETH_ALEN) to receive the actual assigned MAC\n+\t * Returns: 0 on success, -1 on failure\n+\t *\n+\t * Creates a PD virtual interface in the driver and activates it via\n+\t * NL80211_CMD_START_PD. The PD wdev is associated with the parent\n+\t * BSS; all PD operations (key install, TX, peer measurement) are\n+\t * routed through it by matching the PD MAC address.\n+\t */\n+\tint (*pd_start)(void *priv, const u8 *addr, u8 *pd_addr);\n+\n+\t/**\n+\t * pd_stop - Stop and destroy the PD wdev\n+\t * @priv: Private driver interface data\n+\t *\n+\t * Sends NL80211_CMD_STOP_PD, deletes the PD wdev via\n+\t * NL80211_CMD_DEL_INTERFACE, and frees all associated driver\n+\t * resources. Safe to call when no PD wdev is active (no-op).\n+\t */\n+\tvoid (*pd_stop)(void *priv);\n+\n+\t/**\n+\t * get_pd_addr - Return the MAC address of the active PD wdev\n+\t * @priv: Private driver interface data\n+\t * @addr: Buffer (ETH_ALEN) to receive the PD wdev MAC address\n+\t * Returns: 0 on success, -1 if no PD wdev is active\n+\t */\n+\tint (*get_pd_addr)(void *priv, u8 *addr);\n+#endif /* CONFIG_PR */\n+\n };\n \n /**\ndiff --git a/src/drivers/driver_nl80211.c b/src/drivers/driver_nl80211.c\nindex aa1ea3c61..8bf2ffebc 100644\n--- a/src/drivers/driver_nl80211.c\n+++ b/src/drivers/driver_nl80211.c\n@@ -199,6 +199,9 @@ static int nl80211_put_mesh_config(struct nl_msg *msg,\n #endif /* CONFIG_MESH */\n static int i802_sta_disassoc(void *priv, const u8 *own_addr, const u8 *addr,\n \t\t\t u16 reason, int link_id);\n+#ifdef CONFIG_PR\n+static void nl80211_pd_stop(void *priv);\n+#endif /* CONFIG_PR */\n \n \n /* Converts nl80211_chan_width to a common format */\n@@ -3186,6 +3189,31 @@ static int nl80211_set_p2pdev(struct i802_bss *bss, int start)\n \treturn ret;\n }\n \n+struct wdev_info {\n+\tu64 wdev_id;\n+\tint wdev_id_set;\n+\tu8 macaddr[ETH_ALEN];\n+};\n+\n+static int nl80211_wdev_handler_info(struct nl_msg *msg, void *arg)\n+{\n+\tstruct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));\n+\tstruct nlattr *tb[NL80211_ATTR_MAX + 1];\n+\tstruct wdev_info *wi = arg;\n+\n+\tnla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),\n+\t\t genlmsg_attrlen(gnlh, 0), NULL);\n+\tif (tb[NL80211_ATTR_WDEV]) {\n+\t\twi->wdev_id = nla_get_u64(tb[NL80211_ATTR_WDEV]);\n+\t\twi->wdev_id_set = 1;\n+\t}\n+\tif (tb[NL80211_ATTR_MAC])\n+\t\tos_memcpy(wi->macaddr, nla_data(tb[NL80211_ATTR_MAC]),\n+\t\t\t ETH_ALEN);\n+\treturn NL_SKIP;\n+}\n+\n+\n static int nl80211_set_pr_dev(struct i802_bss *bss, int start)\n {\n \tstruct nl_msg *msg;\n@@ -3203,6 +3231,134 @@ static int nl80211_set_pr_dev(struct i802_bss *bss, int start)\n }\n \n \n+#ifdef CONFIG_PR\n+/**\n+ * nl80211_pd_start - Create and activate a PD wdev\n+ *\n+ * Creates a PD virtual interface (NL80211_IFTYPE_PD) in the kernel and\n+ * activates it via NL80211_CMD_START_PD. The resulting i802_bss is stored\n+ * in drv->pd_bss with ctx pointing to the parent wpa_s so that events\n+ * arriving on the PD wdev_id are routed back to the parent.\n+ */\n+static int nl80211_pd_start(void *priv, const u8 *addr, u8 *pd_addr)\n+{\n+\tstruct i802_bss *bss = priv;\n+\tstruct wpa_driver_nl80211_data *drv = bss->drv;\n+\tstruct i802_bss *pd_bss;\n+\tstruct wdev_info info;\n+\tint ret;\n+\n+\tif (drv->pd_bss) {\n+\t\twpa_printf(MSG_DEBUG, \"nl80211: PD wdev already active\");\n+\t\tif (pd_addr)\n+\t\t\tos_memcpy(pd_addr, drv->pd_bss->addr, ETH_ALEN);\n+\t\treturn 0;\n+\t}\n+\n+\tpd_bss = os_zalloc(sizeof(*pd_bss));\n+\tif (!pd_bss)\n+\t\treturn -1;\n+\n+\tpd_bss->drv = drv;\n+\tpd_bss->ctx = bss->ctx; /* parent wpa_s */\n+\tpd_bss->flink = &pd_bss->links[0];\n+\tos_strlcpy(pd_bss->ifname, \"pd-wdev\", sizeof(pd_bss->ifname));\n+\n+\tos_memset(&info, 0, sizeof(info));\n+\tret = nl80211_create_iface(drv, \"pd-wdev\", NL80211_IFTYPE_PD, addr,\n+\t\t\t\t 0, nl80211_wdev_handler_info, &info, 0);\n+\tif (ret || !info.wdev_id_set) {\n+\t\twpa_printf(MSG_ERROR,\n+\t\t\t \"nl80211: Failed to create PD wdev (ret=%d)\", ret);\n+\t\tos_free(pd_bss);\n+\t\treturn -1;\n+\t}\n+\n+\tpd_bss->wdev_id = info.wdev_id;\n+\tpd_bss->wdev_id_set = 1;\n+\tif (!is_zero_ether_addr(info.macaddr))\n+\t\tos_memcpy(pd_bss->addr, info.macaddr, ETH_ALEN);\n+\telse if (addr)\n+\t\tos_memcpy(pd_bss->addr, addr, ETH_ALEN);\n+\tos_memcpy(pd_bss->flink->addr, pd_bss->addr, ETH_ALEN);\n+\n+\t/* Activate the PD device */\n+\tret = nl80211_set_pr_dev(pd_bss, 1);\n+\tif (ret) {\n+\t\twpa_printf(MSG_ERROR,\n+\t\t\t \"nl80211: Failed to start PD device (ret=%d)\", ret);\n+\t\tgoto failed;\n+\t}\n+\n+\tif (nl80211_init_bss(pd_bss)) {\n+\t\twpa_printf(MSG_ERROR,\n+\t\t\t \"nl80211: Failed to init PD BSS (ret=%d)\", ret);\n+\t\tgoto failed;\n+\t}\n+\n+\tif (nl80211_mgmt_subscribe_non_ap(pd_bss))\n+\t\twpa_printf(MSG_DEBUG,\n+\t\t\t \"nl80211: Failed to register frame processing for PD interface - ignore for now\");\n+\n+\tdrv->pd_bss = pd_bss;\n+\n+\tif (pd_addr)\n+\t\tos_memcpy(pd_addr, pd_bss->addr, ETH_ALEN);\n+\n+\twpa_printf(MSG_DEBUG,\n+\t\t \"nl80211: PD wdev created wdev_id=0x%llx addr=\" MACSTR,\n+\t\t (unsigned long long) pd_bss->wdev_id,\n+\t\t MAC2STR(pd_bss->addr));\n+\treturn 0;\n+\n+failed:\n+\tnl80211_del_non_netdev(pd_bss);\n+\tos_free(pd_bss);\n+\treturn -1;\n+}\n+\n+\n+/**\n+ * nl80211_pd_stop - Stop and destroy the PD wdev\n+ */\n+static void nl80211_pd_stop(void *priv)\n+{\n+\tstruct i802_bss *bss = priv;\n+\tstruct wpa_driver_nl80211_data *drv = bss->drv;\n+\n+\tif (!drv->pd_bss)\n+\t\treturn;\n+\n+\twpa_printf(MSG_DEBUG,\n+\t\t \"nl80211: Stopping PD wdev wdev_id=0x%llx addr=\" MACSTR,\n+\t\t (unsigned long long) drv->pd_bss->wdev_id,\n+\t\t MAC2STR(drv->pd_bss->addr));\n+\n+\tnl80211_destroy_bss(drv->pd_bss);\n+\tnl80211_set_pr_dev(drv->pd_bss, 0);\n+\tnl80211_del_non_netdev(drv->pd_bss);\n+\tos_free(drv->pd_bss);\n+\tdrv->pd_bss = NULL;\n+}\n+\n+\n+/**\n+ * nl80211_get_pd_addr - Return the MAC address of the active PD wdev\n+ */\n+static int nl80211_get_pd_addr(void *priv, u8 *addr)\n+{\n+\tstruct i802_bss *bss = priv;\n+\tstruct wpa_driver_nl80211_data *drv = bss->drv;\n+\n+\tif (!drv->pd_bss || !addr)\n+\t\treturn -1;\n+\n+\tos_memcpy(addr, drv->pd_bss->addr, ETH_ALEN);\n+\treturn 0;\n+}\n+#endif /* CONFIG_PR */\n+\n+\n #ifdef CONFIG_NAN\n static void nl80211_nan_stop(struct i802_bss *bss)\n {\n@@ -3567,6 +3723,10 @@ static void wpa_driver_nl80211_deinit(struct i802_bss *bss)\n \t\teloop_unregister_read_sock(drv->eapol_tx_sock);\n \tif (drv->eapol_tx_sock >= 0)\n \t\tclose(drv->eapol_tx_sock);\n+#ifdef CONFIG_PR\n+\tif (drv->pd_bss)\n+\t\tnl80211_pd_stop(bss);\n+#endif /* CONFIG_PR */\n \n \tif (bss->nl_preq)\n \t\twpa_driver_nl80211_probe_req_report(bss, 0);\n@@ -9386,32 +9546,6 @@ static int nl80211_vif_addr(struct wpa_driver_nl80211_data *drv, u8 *new_addr)\n }\n \n \n-struct wdev_info {\n-\tu64 wdev_id;\n-\tint wdev_id_set;\n-\tu8 macaddr[ETH_ALEN];\n-};\n-\n-static int nl80211_wdev_handler(struct nl_msg *msg, void *arg)\n-{\n-\tstruct genlmsghdr *gnlh = nlmsg_data(nlmsg_hdr(msg));\n-\tstruct nlattr *tb[NL80211_ATTR_MAX + 1];\n-\tstruct wdev_info *wi = arg;\n-\n-\tnla_parse(tb, NL80211_ATTR_MAX, genlmsg_attrdata(gnlh, 0),\n-\t\t genlmsg_attrlen(gnlh, 0), NULL);\n-\tif (tb[NL80211_ATTR_WDEV]) {\n-\t\twi->wdev_id = nla_get_u64(tb[NL80211_ATTR_WDEV]);\n-\t\twi->wdev_id_set = 1;\n-\t}\n-\n-\tif (tb[NL80211_ATTR_MAC])\n-\t\tos_memcpy(wi->macaddr, nla_data(tb[NL80211_ATTR_MAC]),\n-\t\t\t ETH_ALEN);\n-\n-\treturn NL_SKIP;\n-}\n-\n \n static int wpa_driver_nl80211_if_add(void *priv, enum wpa_driver_if_type type,\n \t\t\t\t const char *ifname, const u8 *addr,\n@@ -9434,7 +9568,7 @@ static int wpa_driver_nl80211_if_add(void *priv, enum wpa_driver_if_type type,\n \n \t\tos_memset(&nonnetdev_info, 0, sizeof(nonnetdev_info));\n \t\tifidx = nl80211_create_iface(drv, ifname, nlmode, addr,\n-\t\t\t\t\t 0, nl80211_wdev_handler,\n+\t\t\t\t\t 0, nl80211_wdev_handler_info,\n \t\t\t\t\t &nonnetdev_info, use_existing);\n \t\tif (!nonnetdev_info.wdev_id_set || ifidx != 0) {\n \t\t\twpa_printf(MSG_ERROR,\n@@ -15717,4 +15851,9 @@ const struct wpa_driver_ops wpa_driver_nl80211_ops = {\n \t.nan_stop = wpa_driver_nl80211_nan_stop,\n \t.nan_change_config = wpa_driver_nl80211_nan_change_config,\n #endif /* CONFIG_NAN */\n+#ifdef CONFIG_PR\n+\t.pd_start = nl80211_pd_start,\n+\t.pd_stop = nl80211_pd_stop,\n+\t.get_pd_addr = nl80211_get_pd_addr,\n+#endif /* CONFIG_PR */\n };\ndiff --git a/src/drivers/driver_nl80211.h b/src/drivers/driver_nl80211.h\nindex c0544aeb0..1d1187f62 100644\n--- a/src/drivers/driver_nl80211.h\n+++ b/src/drivers/driver_nl80211.h\n@@ -286,12 +286,41 @@ struct wpa_driver_nl80211_data {\n #ifdef CONFIG_NAN\n \tunsigned int nan_started:1;\n #endif /* CONFIG_NAN */\n+#ifdef CONFIG_PR\n+\tstruct i802_bss *pd_bss; /* PD wdev; not in the BSS list */\n+#endif /* CONFIG_PR */\n };\n \n struct nl80211_err_info {\n \tint link_id;\n };\n \n+static inline struct i802_bss *\n+nl80211_get_pd_bss_by_addr(struct wpa_driver_nl80211_data *drv,\n+\t\t\t const u8 *addr)\n+{\n+#ifdef CONFIG_PR\n+\tif (addr && drv->pd_bss && ether_addr_equal(addr, drv->pd_bss->addr))\n+\t\treturn drv->pd_bss;\n+#endif /* CONFIG_PR */\n+\n+\treturn NULL;\n+}\n+\n+\n+static inline struct i802_bss *\n+nl80211_get_pd_bss_by_wdev(struct wpa_driver_nl80211_data *drv,\n+\t\t\t u64 wdev_id, int wdev_id_set)\n+{\n+#ifdef CONFIG_PR\n+\tif (wdev_id_set && drv->pd_bss && drv->pd_bss->wdev_id_set &&\n+\t wdev_id == drv->pd_bss->wdev_id)\n+\t\treturn drv->pd_bss;\n+#endif /* CONFIG_PR */\n+\n+\treturn NULL;\n+}\n+\n void * nl80211_cmd(struct wpa_driver_nl80211_data *drv,\n \t\t struct nl_msg *msg, int flags, uint8_t cmd);\n struct nl_msg * nl80211_cmd_msg(struct i802_bss *bss, int flags, uint8_t cmd);\ndiff --git a/wpa_supplicant/driver_i.h b/wpa_supplicant/driver_i.h\nindex 5a8298288..f2eba74dc 100644\n--- a/wpa_supplicant/driver_i.h\n+++ b/wpa_supplicant/driver_i.h\n@@ -738,6 +738,26 @@ static inline int wpa_drv_wowlan(struct wpa_supplicant *wpa_s,\n \treturn wpa_s->driver->set_wowlan(wpa_s->drv_priv, triggers);\n }\n \n+#ifdef CONFIG_PR\n+\n+static inline int\n+wpa_drv_pd_start(struct wpa_supplicant *wpa_s, const u8 *addr, u8 *pd_addr)\n+{\n+\tif (!wpa_s->driver->pd_start)\n+\t\treturn -1;\n+\treturn wpa_s->driver->pd_start(wpa_s->drv_priv, addr, pd_addr);\n+}\n+\n+static inline void\n+wpa_drv_pd_stop(struct wpa_supplicant *wpa_s)\n+{\n+\tif (!wpa_s->driver->pd_stop)\n+\t\treturn;\n+\twpa_s->driver->pd_stop(wpa_s->drv_priv);\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,\n", "prefixes": [ "RFC", "12/23" ] }