From nobody Thu Sep 24 13:39:02 2026 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (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 65A3E3D5C23 for ; Thu, 24 Sep 2026 02:41:36 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790217697; cv=none; b=TwnLJ6yYQ2Z4XigiXSK+ov+CXGGCpSEUJWNP7400UhLfRLhGGmo9bPubtfrsi69Ubhpc9wiHIDqZ8TxC56E/+CVtIsXSbgeMFNRmffe0bEYo6ehQyHTir8JIGQzG0mGLW57WeR6xC0Z2SP0rfINV18f3rk3N8OVIgzCNXXfswm4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790217697; c=relaxed/simple; bh=EyWLR8HT45CAln0XcNXl0Swx1iiDzFpgEV+ivaL8IlM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=jzEtjGdT5KpuXWIqDsHsztW7XYjJ+/aaGFxU+Ttn1p2OCyO152BZTHrwRZ6RTN5XnIT9LeZ/lX+6y7Te3T7YxqdlKaH0yEuJ1TlOJ8U5+jvBF7535dIyG9lDoIwwK0EwaR6wECcPM1ERVAQfKF6DDK1zX3SveIAiRH8rQTRHalw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=WT0ALLL8; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=ZJmYicwO; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="WT0ALLL8"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="ZJmYicwO" Received: from pps.filterd (m0279862.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68O2KAwb344497 for ; Thu, 24 Sep 2026 02:41:35 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= 28JFi8aQFyfFe/wqTpKPLr2ytagGCO4P3M2TiHnNNmg=; b=WT0ALLL8GCdyvton Eok1FIZvqH2OxbrwYcXSxfwlkecLxdZOatKff2W1cNwGd1uJg+PnvszVHMzxtgkN 9ezr+k3+5FI6a9NMsm+dtgFTXWoqmYHbbKzb9BGrseVWSMe862vuqFnxo8zLoJR0 HHRE0cZYL5Mv2yowRMrRDra8Y15go1gvWGit38bZ02kuS5PtEvS/Z0k1f/8akXoz XLYTkvqSyVaMNFqbnrmFN/BmFdNS8N9yzZNn28rY6mqTUtUdIEjVj8G8SwpwOtrK vpU5pS2lpym2+giVe7ryFJUMMJ+PKcgLK1BBwtCNTV5CGXIXu/OMj2K0blYxsLKZ 6gTO5Q== Received: from mail-dy1-f199.google.com (mail-dy1-f199.google.com [74.125.82.199]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4gvr908jr6-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 24 Sep 2026 02:41:35 +0000 (GMT) Received: by mail-dy1-f199.google.com with SMTP id 5a478bee46e88-33baaba6371so834756eec.1 for ; Wed, 23 Sep 2026 19:41:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1790217695; x=1790822495; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=28JFi8aQFyfFe/wqTpKPLr2ytagGCO4P3M2TiHnNNmg=; b=ZJmYicwO7dJtq4G/RC5X0fD56wmdq+iRD7DWtjPt7vnHmrtm1MIfnRMRwxbQ56GqXJ ojncJIFdpyV7mzlKosWCu6/VsAuVkejE7XFadT1R3w79GMrv8+PR1RJUlrkSpnaFl5oX Z26LI4lDx4HbDDR5+hQzcEz3thMRZtkSSeXJR49VlyGbOl69DgzRco4MMUJ6655nIV5x RFOOHFqcl8Lp0CT/WAumTROND4jVypijK9DDFAZB4Go4ZIuxVZgDlf+6LfFwURxBzo/X N24q6L/YuGBDWubjyjENBgJtgGQ7AvOACe+HYMXIWk6C4gizBi2cJup5jCQrHVxqOn46 XiFg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790217695; x=1790822495; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=28JFi8aQFyfFe/wqTpKPLr2ytagGCO4P3M2TiHnNNmg=; b=jeIVnz77IUIwgDdGY38U8mwGmpRtLu2in2vFEuG/UO4XMCCSZlmtfoX3R2dH5d6ZUn rHlWH6uMsFT4bHaJuPQiaUJOyi+kF2TWFVF2CUcoVEgmSez+vuVR5KzlmHkBK7eQbqpj QHbH/bPC+0u8mTsIi9LC5pVtivsXKdblg3lgC3PGaywMg9+P0zF4/IFCrXMHW7Xaj8wt imQ/bio3JJ9YwGKKA9P1TH5aJ58ut7C96ccku4idOz/iWc1N1NyHHEUFkhImI96D2fe+ yIeNo8V0pVI5kk+e/H+XdbFSC8M9RKZuG5NrOzo05n7IjtNeF1vyYYNanQTHOh/ic798 jURw== X-Forwarded-Encrypted: i=1; AKwUvByVSaAr+sMY2ne3E8Gpj2IDqpL3T/UREYNYCrD1MwoBJ4TJOH5VCSg7/o+xKGH7+5HLLE8hnrszv0EyPYU=@vger.kernel.org X-Gm-Message-State: AFuF++kzqT9hvCNg99nnNgtU4jmTPGhA25QAvOXw2T9CK+7wbg8SvFrZ TEABDRFkXWu9TZFLZjxxx4J4ZlG0Nv/w8GN3OKnVxSxYRa34WE/RXF8zmPDoQL2QNP21OVkzKlH ZBe37uKiqzgCdtKUItaB2GM8kUtM00APu5YB3StySXfcGp4b2SWPnmEZuss1JWuw8X9F/T63rhw == X-Gm-Gg: AYBFou1EnWtT8Z6Xzn1+MXea4iceUs2XmAC4vmckqlGwzWQpEARoRZWsURXXpIcjDEE gKSIvC+7/9SBBYgaJ5Oqc0L07D90Q5ylxQYqZT9IDwYmAxFhby/sGjxCBMIgO+XPRhn1O7kDZF0 k0iEF9Z/JbE3O+4g5makJ89b4ZuqBEzyZ8JoX2oSOVil2u7PeXo1Q7MsGS2EOigVmNBs9hKABNc +J648wkiNbbgAtRtiCtmFNJ1VY3qdWhC3Yz98qbkASj0WQzjXmyRuKmIgYG7v3ffkICm12khmwh gkuwloJ0vXs/vkZTxTR7EbhHp1tv6d7ehQ+yxKxkfr97YL2665rb7ifayljILG3yk4bQRrfTEx4 tzl6KZ6MpXkTPO4lRHOSN7A8wH/Ugr9w1r7sWi8XxEQR0IuimyY0cYx8PNjHYg5Wy7QgWOiJmPY y3F9q2Kp78/+uiV+BMC8T69w== X-Received: by 2002:a05:7300:8189:b0:33c:3515:daf4 with SMTP id 5a478bee46e88-340034c1e5amr1109997eec.27.1790217694827; Wed, 23 Sep 2026 19:41:34 -0700 (PDT) X-Received: by 2002:a05:7300:8189:b0:33c:3515:daf4 with SMTP id 5a478bee46e88-340034c1e5amr1109965eec.27.1790217694179; Wed, 23 Sep 2026 19:41:34 -0700 (PDT) Received: from hu-pooventh-blr.qualcomm.com (blr-bdr-fw-01_GlobalNAT_AllZones-Outside.qualcomm.com. [103.229.18.19]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-33e96258351sm9692263eec.12.2026.09.23.19.41.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 23 Sep 2026 19:41:33 -0700 (PDT) From: Pooventhiran G Date: Thu, 24 Sep 2026 08:10:38 +0530 Subject: [PATCH wireless-next v2 01/16] wifi: nl80211: Define Seamless Mobility Domain (SMD) device capability Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260924-smd-v2-1-bb40094da1d4@oss.qualcomm.com> References: <20260924-smd-v2-0-bb40094da1d4@oss.qualcomm.com> In-Reply-To: <20260924-smd-v2-0-bb40094da1d4@oss.qualcomm.com> To: Johannes Berg , Kees Cook , "Gustavo A. R. Silva" Cc: linux-wireless@vger.kernel.org, linux-kernel@vger.kernel.org, linux-hardening@vger.kernel.org, pooventhiran.g@oss.qualcomm.com X-Mailer: b4 0.14.3 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTI0MDAxMiBTYWx0ZWRfX62ignUrxsy5Z avE6C5wkMzIxy0x7zUBLfoQThvw3ZyfpoIpktDqly4rRsN/rkZxZPVRppgLVxq5F54r6t8SP8S3 mToNTNfhIwuhwsRd80kG6Wbvq3N27ng= X-Proofpoint-GUID: i_MH5Htp5cdD5lKzdc2ipdySawnYYkHd X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTI0MDAxMiBTYWx0ZWRfX1FrKW74Q/hTP 0Mt1sjFvYTSNb4kueK4Ydt3XHJdZgPup/Dk/WlopCr/gfXD2X/AmLk6mbtsTb6cdtz/N4v9+jaA x/uX77uCjav4J/DmjaQeH/gO3+q9CylpdV/5YjF6gMFAg772v1Unl53sxh3fBa2z3cSyka7NZQF 1ZDka/BuvKgl1f0N7rtAGJbqCtlIWHJoz4utkBsHcp8BOGmuyxxiaiOwkG7UVB6/0WOj0oaVS3l DKwY0sUkW+wgJYkKftycXR9rBylJ0y3o1gvUHrqScEJ2e4w8NgyVIfmUFkXoHmQ4pRunzl/dJPO YwHVfljgr/RY1ILaRQFal0qmFdU6BIs12gyaZsgNxbsK9FnYxHve3snCn9w78S+3pD9GFYgt92R 2SJUcczVshzh8vdPr7WkU3nBZOfpWWkgdLmt3KyEOL01zk81A1yj2vF1ORaWpw+i2IhLH8B7S9U vFIZycvto64L+i+95pA== X-Proofpoint-ORIG-GUID: i_MH5Htp5cdD5lKzdc2ipdySawnYYkHd X-Authority-Analysis: v=2.4 cv=fMusTpae c=1 sm=1 tr=0 ts=6ab48ddf cx=c_pps a=cFYjgdjTJScbgFmBucgdfQ==:117 a=Ou0eQOY4+eZoSc0qltEV5Q==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=_K5XuSEh1TEqbUxoQ0s3:22 a=EUspDBNiAAAA:8 a=-9rhnhb8Ej--qkh-m00A:9 a=QEXdDO2ut3YA:10 a=scEy_gLbYbu1JhEsrz4S:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-24_01,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 bulkscore=0 adultscore=0 lowpriorityscore=0 spamscore=0 clxscore=1015 impostorscore=0 malwarescore=0 priorityscore=1501 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609240012 From: Sidhanta Sahu Per IEEE P802.11bn/D2.0, Aug 2026, subclause 37.16, an AP MLD can be managed by a Seamless Mobility Domain Management Entity (SMD-ME) along with partner AP MLDs to enable seamless transition of an associated non-AP MLD from the current AP MLD to a target AP MLD. A non-AP MLD advertising SMD supports association to an SMD-ME and SMD BSS Transition between AP MLDs within an SMD. Subclause 37.16.11 defines an optional capability for the current AP MLD to forward buffered downlink (DL) data frames for the non-AP MLD to the target AP MLD. Userspace needs a way to be aware of the driver's SMD capabilities so that it can enable SMD configuration and operation only on capable devices. Define two extended feature flags - NL80211_EXT_FEATURE_SMD for SMD management and BSS Transition capability - NL80211_EXT_FEATURE_SMD_DL_PKT_FORWARDING for DL data forwarding capability so that userspace can gate SMD setup and data forwarding configuration on driver support. Signed-off-by: Sidhanta Sahu Signed-off-by: Pooventhiran G --- include/uapi/linux/nl80211.h | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h index 9a2ccb8d66b8..d05103889912 100644 --- a/include/uapi/linux/nl80211.h +++ b/include/uapi/linux/nl80211.h @@ -7126,6 +7126,15 @@ enum nl80211_feature_flags { * offload in station mode, including Fast Transition or Opportunistic * Key Caching. * + * @NL80211_EXT_FEATURE_SMD: Driver supports Seamless Mobility Domain (SMD) + * and is managed by an SMD-ME to support SMD BSS Transition in AP mode + * and supports association to an SMD-ME and SMD BSS transition in + * non-AP STA mode. + * + * @NL80211_EXT_FEATURE_SMD_DL_PKT_FORWARDING: Driver supports forwarding = of + * buffered downlink (DL) data packets in AP mode to the non-AP STA during + * SMD BSS Transition. + * * @NUM_NL80211_EXT_FEATURES: number of extended features. * @MAX_NL80211_EXT_FEATURES: highest extended feature index. */ @@ -7209,6 +7218,8 @@ enum nl80211_ext_feature_index { NL80211_EXT_FEATURE_SET_KEY_LTF_SEED, NL80211_EXT_FEATURE_PROBE_AP, NL80211_EXT_FEATURE_FAST_ROAM_OFFLOAD, + NL80211_EXT_FEATURE_SMD, + NL80211_EXT_FEATURE_SMD_DL_PKT_FORWARDING, =20 /* add new features before the definition below */ NUM_NL80211_EXT_FEATURES, --=20 2.34.1 From nobody Thu Sep 24 13:39:02 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (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 7573E371887 for ; Thu, 24 Sep 2026 02:41:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790217704; cv=none; b=L3K62sVq+5JM6NeIWg1kWt45B/bH3yxfBIcrBq0vE726KSjalh0lGyVF7X6sPnBiBNZBR5kPCONckioM6wOYhmBe63k7sQm0aXKl+c0evEh07rP75MhwCbLxLX4BCS+yjp7/FCXCLOczMrxG7ZjgY7OJ4F7AwBnmFMmCvBD5q3o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790217704; c=relaxed/simple; bh=A5JcIqBFxQ0+a5/+IVFf55NYSny4vDEgxMVzcOHWaHw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=eaJBIY55ZlPFa4/UuoDOE/U+gpfxRx3O33ZCriCh5E3oNb2UJwufWaLTTQKpG3orN67Meh/T8KC6//GSQOpXlT6Kv3BkDrgmx8YZ8V568vkXGreIWFZfQIHvBgRmjli9mk4yckOmMwHJ652ejm+7FVJFDUd8CdwWfmaHh5IsEJc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=VRy946jA; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=kgFp55cb; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="VRy946jA"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="kgFp55cb" Received: from pps.filterd (m0279870.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68O2Jun81107848 for ; Thu, 24 Sep 2026 02:41:39 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= ODyR1rthMpA1mqS2BL6bd97tNxqZN2OWPjCXhXyDeWQ=; b=VRy946jAk4C009Z0 w2GESdysnp+1Ngh9OUwSHxuOpIZibdyiopIhoed9iwUrV4zqScaXvlt36gn0KB1H vClo8JqizlTQp55GcsnEG1rNVDe7Cmvb0+/3Y1EHcrvV2YeVQlHujWgvqTeKVqsQ KtCYWo6DxuAhGS7wIpFg8WreJTywPYpm2xNcc53ZWgFmq+4g3zvHAyRYLvO0NEXk TLEFyoTrNZOyEtE5JFvHLQTK/EiagT/9zK+hlPa1tXHZypE8YEnzJe4QeGsUY9zo SCWU/sTBqywUKBfJdXipS9w0ibtVDeoJxYPnrwMiMlt0sEVfSK6VICKVChLviAUR ptWFRg== Received: from mail-dy1-f200.google.com (mail-dy1-f200.google.com [74.125.82.200]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4gvsfgrb0q-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 24 Sep 2026 02:41:39 +0000 (GMT) Received: by mail-dy1-f200.google.com with SMTP id 5a478bee46e88-333543ac378so1887791eec.1 for ; Wed, 23 Sep 2026 19:41:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1790217698; x=1790822498; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=ODyR1rthMpA1mqS2BL6bd97tNxqZN2OWPjCXhXyDeWQ=; b=kgFp55cbEiOpgTCiCSJC8V1MYJemjfePcCn8GUtbsXO4pEEZMVrxPm8u++/FwPhMOT trw8IUK0Dzov8S6pXqq1j3jewoh7/BDhmiqFhwFvT+HX6OvHMod517VaQo+p4U+Odif/ ajoUKTVf8x0UlzAOyg/wfwvxXf78+wLr0Gh3gRWLeASjS/xHD8VEtum2I9nJqoifo65x egWPVuQj0kROCAJKGOq0p8LrP3KqlG8UcGoTdP4sz/hSTCkf613i4sRYMLeI4D995zqF 8gigO6AtniplJi3IuIeTXDGs3snS/WwZrHQGQT2hV86PhjnP8BWcT5kPCHEneTAnIl/U WKXQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790217698; x=1790822498; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=ODyR1rthMpA1mqS2BL6bd97tNxqZN2OWPjCXhXyDeWQ=; b=HQFpkEqtLwlTDNh5lzm9qtWN9aMWXMruoG9BM79oUTry/LjmXoiviToBdIOVB3NFDU CrcxFDoo6vkaqN28W0kVnB34F/QFjAZc3HEadGeMT02dlgQ0CGd8bmh1qebUtvFlrLjs 8MoLez5/vThvG2bUGedsaxX7FaIR6iRAPk3G4x8GaV7ZZVFxfyDgaE4KxBksXnLzIxs6 l4XMUkEXUMxTSTPqGu77ejlS6ogOeVc2ej6YFdZs4vepgiMveJzsX5bZSeCn/zhkhQ8A yogebNdRgAa3dOaCCFounOLyt+8LzVhpxPm838AFrRanD5tiFhEAqdamlQU3cK3z+Mop 3x9A== X-Forwarded-Encrypted: i=1; AKwUvByUYBaRhB1ONZ5ZEQJ8vZiH4mGdhu2IHMBVYrwONWF/MwH357vU0SdPsDk4F4478HSWNkHk+LZMUcmOFtE=@vger.kernel.org X-Gm-Message-State: AFuF++lEKV7JE+zYDnXrcd5dCwm7HB2zxXm5/FmYnwInLp5pvXFBQ7pb TZVeOod+HJDhDuSVQdDlDQ2WqUfNqarIrXqHKU0mq9pHJtwg/8lvTjHZKAMpa1FAte3MklXiAp6 atb+a4Y3JyaJVg5FQSfb6iYXkmMgRVs26EtxBzoUy5mp3FC922H9SbuVjnbEnruHUPQ== X-Gm-Gg: AYBFou0k7rB5h1abfV1aZrNgS1r3LU9g+zT56BeK7hzh+OtVd0AiyPR2+127QkJsWBc nZZSJYY+ZYaDfUDv2C6m/XLFDtKGDn3EovqC4v2co9Plrlm63mpsjIP1mDpPnj04Ke5ovPImaAF 4SawFMGsCu2y2do47M6bjBBa4znOGv0U+AnomCxlqnR1JZaS27g4NlYin1I0S6vV0meshzP26bI nnvhxO04r2NhMYJ1sqx8Nqu99gVZhxl+P3eF+1SgRgJVuECXHnIk+D4lKrQ28TOFqKJK1+JuOz5 N9yBq5Zy1EUL7qddhTuQhfHvLL7orZH7KkZii6NdZvsGIF9Ehj4cUVeOARZRL+l+uBfSmxUAEjJ jpNPeOVLSikVOFaJ5/QQQkEyvGGUhVyBHoVFSyG9OnCx1FVoQrYa1ww1opNwwaUdOlTFMiibZC8 eLKnVAmPdiUloc7IKh7d+SWg== X-Received: by 2002:a05:7300:c019:10b0:33b:c24c:47cd with SMTP id 5a478bee46e88-340035bf9d9mr822554eec.16.1790217698002; Wed, 23 Sep 2026 19:41:38 -0700 (PDT) X-Received: by 2002:a05:7300:c019:10b0:33b:c24c:47cd with SMTP id 5a478bee46e88-340035bf9d9mr822530eec.16.1790217697377; Wed, 23 Sep 2026 19:41:37 -0700 (PDT) Received: from hu-pooventh-blr.qualcomm.com (blr-bdr-fw-01_GlobalNAT_AllZones-Outside.qualcomm.com. [103.229.18.19]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-33e96258351sm9692263eec.12.2026.09.23.19.41.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 23 Sep 2026 19:41:36 -0700 (PDT) From: Pooventhiran G Date: Thu, 24 Sep 2026 08:10:39 +0530 Subject: [PATCH wireless-next v2 02/16] wifi: nl80211: Add kernel interfaces for Seamless Mobility Domain setup Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260924-smd-v2-2-bb40094da1d4@oss.qualcomm.com> References: <20260924-smd-v2-0-bb40094da1d4@oss.qualcomm.com> In-Reply-To: <20260924-smd-v2-0-bb40094da1d4@oss.qualcomm.com> To: Johannes Berg , Kees Cook , "Gustavo A. R. Silva" Cc: linux-wireless@vger.kernel.org, linux-kernel@vger.kernel.org, linux-hardening@vger.kernel.org, pooventhiran.g@oss.qualcomm.com X-Mailer: b4 0.14.3 X-Authority-Analysis: v=2.4 cv=YfoodARf c=1 sm=1 tr=0 ts=6ab48de3 cx=c_pps a=PfFC4Oe2JQzmKTvty2cRDw==:117 a=Ou0eQOY4+eZoSc0qltEV5Q==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=gowsoOTTUOVcmtlkKump:22 a=EUspDBNiAAAA:8 a=WqWJlBuMtEtNw8dGTc8A:9 a=QEXdDO2ut3YA:10 a=6Ab_bkdmUrQuMsNx7PHu:22 X-Proofpoint-ORIG-GUID: ji0zkicuv66TBQY2P9-P_oUSN9kwuVzA X-Proofpoint-GUID: ji0zkicuv66TBQY2P9-P_oUSN9kwuVzA X-Proofpoint-Spam-Info: AW1haW4tMjYwOTI0MDAxMiBTYWx0ZWRfX95ouWT+vYFUh k87C1E+3oLkYpnOf2Ebi8JLZKlbRnR5EzRmJ1hP92RF/VzVD1Qt3EcVoTAV8pW9DkbdVk7AxwYp MC7c2cfNcmsZBwZWV84F967Dy7nhnfU= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTI0MDAxMiBTYWx0ZWRfX6s4Pb7nRD9In IbM0daT4hrH8CfDnNGHim+Lca0Rc/VC/+gLvtf3k5AUlrLekx/HR/XiOZzdqTffRg4W+ZkBsvXA 8BMoKPneyk5NNCsswj13RMZHLpREklO9KKvkEtyomaOsYereoc09hDvRZFJqORAD2VDZ5BaaFEs WqVRwx9AhbhUSvpoKsxbBdJ3qipn6ANz9SgcFiI88Wdny1QzZg4052ywQCFY1G2Wws3o+EwCP2r fWZnM6s8BmbRPWcErcuFgos/TE47r5ATaAtTFlYbGLYmzLbqnREDvyvN4em6MWSD1SqyoSCSXMG o3gg2vv9Imheq8s+EdgO7JQWylC+p7FDXcxY9Jye2PEoemkkpqNne23wxofymOSpdhnEzXTMZ72 N6l8xoKpp0PQuFmlXZevGMwGt0vhKIVaPchI0p7n/jhn+h25lV22tuSbJmvIwvC+axO38DxHd+N v85i45fW9TXnC6+LElg== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-24_01,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 clxscore=1015 lowpriorityscore=0 spamscore=0 priorityscore=1501 phishscore=0 adultscore=0 malwarescore=0 bulkscore=0 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609240012 From: Aditya Sathish An AP MLD managed by an SMD-ME must advertise its SMD parameters in Beacon and Probe Response frames so that an SMD-capable non-AP MLD can negotiate SMD during association and may choose to later perform SMD BSS Transition. Add nl80211 kernel interfaces for userspace to configure these parameters in nl80211_start_ap() so that the driver and lower layers can be configured with appropriate parameters. Signed-off-by: Aditya Sathish Co-developed-by: Rohan Dutta Signed-off-by: Rohan Dutta Signed-off-by: Pooventhiran G --- include/linux/ieee80211-uhr.h | 4 ++ include/uapi/linux/nl80211.h | 95 +++++++++++++++++++++++++++++++++++++++= ++++ net/wireless/nl80211.c | 17 ++++++++ 3 files changed, 116 insertions(+) diff --git a/include/linux/ieee80211-uhr.h b/include/linux/ieee80211-uhr.h index 19e9260d0db8..c3f87d4c8bec 100644 --- a/include/linux/ieee80211-uhr.h +++ b/include/linux/ieee80211-uhr.h @@ -589,6 +589,10 @@ ieee80211_uhr_dbe_cap(const struct ieee80211_uhr_cap *= cap) #define IEEE80211_SMD_INFO_CAPA_TYPE 0x10 #define IEEE80211_SMD_INFO_CAPA_PTK_PER_AP_MLD 0x20 =20 +/* IEEE P802.11bn/D2.0, Aug 2026, subclause 9.4.2.363 */ +#define IEEE80211_SMD_INFO_PREP_TIMEOUT_MIN 2 /* in 64 TUs */ +#define IEEE80211_SMD_INFO_NUM_PREP_AP_MAX 7 + struct ieee80211_smd_info { u8 id[ETH_ALEN]; u8 capa; diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h index d05103889912..1177a511c8cb 100644 --- a/include/uapi/linux/nl80211.h +++ b/include/uapi/linux/nl80211.h @@ -3190,6 +3190,12 @@ enum nl80211_commands { * known station to transmit a frame. This is relevant to know whether * MLD address translation happened or to disable it when sending a frame. * + * @NL80211_ATTR_SMD_PARAMS: Nested attribute to indicate support for Seam= less + * Mobility Domain (SMD); it contains parameters to define capabilities of + * an AP managed by an SMD-ME. Valid if the driver supports + * %NL80211_EXT_FEATURE_SMD. + * Used with %NL80211_CMD_START_AP. See &enum nl80211_smd_params_attrs. + * * @NUM_NL80211_ATTR: total number of nl80211_attrs available * @NL80211_ATTR_MAX: highest attribute number currently defined * @__NL80211_ATTR_AFTER_LAST: internal use @@ -3792,6 +3798,8 @@ enum nl80211_attrs { =20 NL80211_ATTR_FRAME_NO_STA, =20 + NL80211_ATTR_SMD_PARAMS, + /* add attributes here, update the policy in nl80211.c */ =20 __NL80211_ATTR_AFTER_LAST, @@ -9131,4 +9139,91 @@ enum nl80211_nan_peer_map_attrs { =20 #define NL80211_NAN_SCHED_NOT_AVAIL_SLOT 0xff =20 +/** + * enum nl80211_smd_type - Type of the SMD + * + * @NL80211_SMD_TYPE_PER_AP_MLD_MAC_SAP: Separate MAC SAP is used per AP M= LD. + * @NL80211_SMD_TYPE_PER_SMD_MAC_SAP: one MAC SAP is used in the SMD. + * @NUM_NL80211_SMD_TYPES: internal. + * @NL80211_SMD_TYPE_MAX: Max type of the SMD. + * + * This value represents the data path models between the non-AP MLD and D= S. + * DS mapping for the non-AP MLD is updated if + * %NL80211_SMD_TYPE_PER_AP_MLD_MAC_SAP is used. + * + * All AP MLDs within an SMD shall indicate the same SMD type (refer + * IEEE P802.11bn/D2.0, Aug 2026, subclause 37.16.1.2). + */ +enum nl80211_smd_type { + NL80211_SMD_TYPE_PER_AP_MLD_MAC_SAP, + NL80211_SMD_TYPE_PER_SMD_MAC_SAP, + + NUM_NL80211_SMD_TYPES, + NL80211_SMD_TYPE_MAX =3D NUM_NL80211_SMD_TYPES - 1, +}; + +/** + * enum nl80211_smd_ptk_mode - PTK Mode used in the SMD + * + * @NL80211_SMD_PTK_MODE_PER_SMD_PTK: one PTK is used by all AP MLDs in th= e SMD. + * @NL80211_SMD_PTK_MODE_PER_AP_MLD_PTK: Separate PTK is used per AP MLD. + * @NUM_NL80211_SMD_PTK_MODES: internal. + * @NL80211_SMD_PTK_MODE_MAX: Max type of PTK mode. + * + * This value represents the security mode of the SMD that dictates the PT= K used + * in current and target AP MLDs to protect communications with the non-AP= MLD + * (refer IEEE P802.11bn/D2.0, Aug 2026, subclause 37.16.1.3.2) + */ +enum nl80211_smd_ptk_mode { + NL80211_SMD_PTK_MODE_PER_SMD_PTK, + NL80211_SMD_PTK_MODE_PER_AP_MLD_PTK, + + NUM_NL80211_SMD_PTK_MODES, + NL80211_SMD_PTK_MODE_MAX =3D NUM_NL80211_SMD_PTK_MODES - 1, +}; + +/** + * enum nl80211_smd_params_attrs - SMD Domain parameters + * + * @NL80211_SMD_PARAMS_ATTR_UNSPEC: Invalid attribute. + * @NL80211_SMD_PARAMS_ATTR_IDENTIFIER: Required (binary) attribute of ETH= _ALEN + * bytes used to define the unique identifier for the SMD. + * @NL80211_SMD_PARAMS_ATTR_TIMEOUT: Required (u16) attribute to define th= e SMD + * Preparation timeout (in 64 TUs, values 0 and 1 are reserved) for + * the target AP MLD. + * @NL80211_SMD_PARAMS_ATTR_DL_DATA_FORWARDING: Flag attribute to indicate= that + * the device supports forwarding of buffered DL data packets. + * @NL80211_SMD_PARAMS_ATTR_MAX_PEER_APMLDS: Required (u8) attribute to de= fine + * the maximum number of AP MLDs a non-AP MLD can prepare with. Value is + * the maximum number of AP MLDs - 1. A value of 0 means that the non-AP + * MLD can prepare with 1 AP MLD. + * @NL80211_SMD_PARAMS_ATTR_TYPE: Required (u8) attribute to indicate the + * SMD Type (&enum nl80211_smd_type). + * @NL80211_SMD_PARAMS_ATTR_PTK_MODE: Required (u8) attribute to indicate = the + * PTK mode used for protection (&enum nl80211_smd_ptk_mode). + * @NL80211_SMD_PARAMS_ATTR_NEIGHBOR_PROBING: Flag attribute to indicate t= hat + * the device supports UHR Neighboring AP Probing. + * @__NL80211_SMD_PARAMS_ATTR_LAST: Last attribute, used internally. + * @NL80211_SMD_PARAMS_ATTR_MAX: Max attribute. + * + * Nested attributes carried in %NL80211_ATTR_SMD_PARAMS to define + * device capabilities that is part of an SMD (refer IEEE P802.11bn/D2.0, + * Aug 2026, subclause 9.4.2.363, Figure 9-aa43 and Figure 9-aa44). + * + */ +enum nl80211_smd_params_attrs { + NL80211_SMD_PARAMS_ATTR_UNSPEC, + NL80211_SMD_PARAMS_ATTR_IDENTIFIER, + NL80211_SMD_PARAMS_ATTR_TIMEOUT, + NL80211_SMD_PARAMS_ATTR_DL_DATA_FORWARDING, + NL80211_SMD_PARAMS_ATTR_MAX_PEER_APMLDS, + NL80211_SMD_PARAMS_ATTR_TYPE, + NL80211_SMD_PARAMS_ATTR_PTK_MODE, + NL80211_SMD_PARAMS_ATTR_NEIGHBOR_PROBING, + + /* keep last */ + __NL80211_SMD_PARAMS_ATTR_LAST, + NL80211_SMD_PARAMS_ATTR_MAX =3D __NL80211_SMD_PARAMS_ATTR_LAST - 1 +}; + #endif /* __LINUX_NL80211_H */ diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index ab5a14f5fe28..de93b34444b4 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c @@ -689,6 +689,21 @@ nl80211_nan_conf_policy[NL80211_NAN_CONF_ATTR_MAX + 1]= =3D { [NL80211_NAN_CONF_NOTIFY_DW] =3D { .type =3D NLA_FLAG }, }; =20 +static const struct nla_policy +nl80211_smd_params_policy[NL80211_SMD_PARAMS_ATTR_MAX + 1] =3D { + [NL80211_SMD_PARAMS_ATTR_IDENTIFIER] =3D NLA_POLICY_ETH_ADDR, + [NL80211_SMD_PARAMS_ATTR_TIMEOUT] =3D + NLA_POLICY_MIN(NLA_U16, IEEE80211_SMD_INFO_PREP_TIMEOUT_MIN), + [NL80211_SMD_PARAMS_ATTR_DL_DATA_FORWARDING] =3D { .type =3D NLA_FLAG }, + [NL80211_SMD_PARAMS_ATTR_MAX_PEER_APMLDS] =3D + NLA_POLICY_MAX(NLA_U8, IEEE80211_SMD_INFO_NUM_PREP_AP_MAX), + [NL80211_SMD_PARAMS_ATTR_TYPE] =3D + NLA_POLICY_MAX(NLA_U8, NL80211_SMD_TYPE_MAX), + [NL80211_SMD_PARAMS_ATTR_PTK_MODE] =3D + NLA_POLICY_MAX(NLA_U8, NL80211_SMD_PTK_MODE_MAX), + [NL80211_SMD_PARAMS_ATTR_NEIGHBOR_PROBING] =3D { .type =3D NLA_FLAG }, +}; + static const struct netlink_range_validation nl80211_punct_bitmap_range = =3D { .min =3D 0, .max =3D 0xffff, @@ -1098,6 +1113,8 @@ static const struct nla_policy nl80211_policy[NUM_NL8= 0211_ATTR] =3D { NLA_POLICY_FULL_RANGE(NLA_U32, &nl80211_punct_bitmap_range), [NL80211_ATTR_STA_DUMP_LINK_STATS] =3D { .type =3D NLA_FLAG }, [NL80211_ATTR_FRAME_NO_STA] =3D { .type =3D NLA_FLAG }, + [NL80211_ATTR_SMD_PARAMS] =3D + NLA_POLICY_NESTED(nl80211_smd_params_policy), }; =20 /* policy for the key attributes */ --=20 2.34.1 From nobody Thu Sep 24 13:39:02 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (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 85B063D0938 for ; Thu, 24 Sep 2026 02:41:43 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790217705; cv=none; b=OgM3AUdhygPmc/M/GUxCFU0FnQCwP0JmLD7YQuQmQqRO/y+hOkuPSJHJIK4aVUxzlzFfWu04iPuAMOAGvWpO2LOdM8io3sz6QtLSqwKX7pqiMKtm4XHQhIc4g1xl57fyd0kEwaAqXkVf9RPZn8ah5pd1mXHWAVjmiDOnBWaSLnI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790217705; c=relaxed/simple; bh=eSricYYNrtrlErctZulR5p1WU1rEO75n7pS1CPhbnEU=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=U5duL7NWJOEocJE59tF1ACI5OV+6iOB6zeQKeKargSVmbSMVk1jtVOcDcbeSMYRsl1O94KSn4ijaWa7k2GpXZlVDJlKYbP7DtcwH+u79icv9Z6ruXS4GyRTqteMMGnts3jHP2wz9IFAvW74Lk3MlnYH9qeXcUe87LlxfSVMVdTU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=D1eXD18b; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=R907v6J7; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="D1eXD18b"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="R907v6J7" Received: from pps.filterd (m0279868.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68O2KBwQ722544 for ; Thu, 24 Sep 2026 02:41:42 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= 9l9FUpOYaeyDvNvaTKqpoEQKgTajA/wJWZ0uNQmQU8I=; b=D1eXD18bMdcb/tLp KqVrBi9N+M4hPuv81rRhn02HDDhl6T9x1ZVH1bUE9DPm5fIBryR2Ztrd2sigNvJf 00pCynZFOO+cDCJ4ZrCGGConotBHdyaxQLFT7HX9ChtqwNcQea1mL9Qm/LT/HdVT lYXjCr6n2DOiMPVxQEPyyn+3bxTbZQ0gUfVaurcNgCj9jT1zGcP3APYqDqNj7fSG t0IJSq48lMx/rrB0OzEb0I9R9hn0XcffoDrkoaPH/j3VaaqqVFfIbsXJN7PI3ZJr laZgmK4TB/AXKaPIjOJ8LbUYLCHJY339r5WKBf5gGvjYSILC5Qf/Xr6JadXfS2gS TpPfqQ== Received: from mail-dy1-f197.google.com (mail-dy1-f197.google.com [74.125.82.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4gvmrr9bw8-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 24 Sep 2026 02:41:42 +0000 (GMT) Received: by mail-dy1-f197.google.com with SMTP id 5a478bee46e88-33bb08e80a8so520934eec.0 for ; Wed, 23 Sep 2026 19:41:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1790217701; x=1790822501; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=9l9FUpOYaeyDvNvaTKqpoEQKgTajA/wJWZ0uNQmQU8I=; b=R907v6J7HoaTzdPuDqUfqrU6cKFcgFELX1jVS652ouL4P+CaD5SQnbNENMby1opiKa qRtfi5Gj9sMCc5GHu5ui6+kCthoSTMWFVH72pU6VhFrN3GrodTOghinHyMEJnw7HPk/I jDIoJ+nOXuTC/YAYB+ZtrTtST3wG78tFlq/jp1QLvbp2ADxU6nDHLyAB5pvYxKertThr hAUUQUmh1u9d31IuGWZfaKMCeNQK5GnI+E2r0f8kvpT1iUByc83becEjMoZA6OxUBrwH uLhV9mpsb+iUMVuGY9YZ0aYh356Bwxee7j2DvousSjvbFbOAdHk+NI9hOSOJ0c/tWNJ3 NJBQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790217701; x=1790822501; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=9l9FUpOYaeyDvNvaTKqpoEQKgTajA/wJWZ0uNQmQU8I=; b=xUU9aZm9acdU3+NeZ5xTv69WxPHOj7mI2YXDPoOWL8ZfTAV07Hec5ZaVvpCR9LSf1V wIB2n4LBv4a1rjlp/AuibIC5UdD1HqeCN/oPKLEqJNtt3KARjDFn31xjQXs99F1cH8jN BhCr7kt+ZjpZQvYMegQFUJ4s/5sMMTnMXLA8kgnSK/q5mEblRsLJKwzxHZZFNQkuNjK0 NaDgcE6L2QAUfQwU/9BYg7kVOgR/oun1OsFmtCNvfd64cESKhp16W1sCB865sXdX2+Y4 k+9PeZB906hwYAJ9H+mxp/knbe86t5KL7MAG8ieiO0Qd71A+vvNHil8DQoxbFm85RxMu crAA== X-Forwarded-Encrypted: i=1; AKwUvBy+SrFWld9kR7lunZwzmcf2yEnhg8r3U7tWZ9QEugSFW15iuQJ6wuX/fuze9qtcObPgcZOkAmuh01rNYkg=@vger.kernel.org X-Gm-Message-State: AFuF++mwgskLx695jzU6m9zw8OBoMlHCepHlwyht1U9PyDD/wXeb/vE1 IXif2oOoEFYfZ/v1RISIV0r6OAW9XumB9fFyRGwoFkbzJzQbvr2JnxNdM18F8lAorgwwvc7JCdO cFXUDrnpjknp7WU11ShiYeviVSVLUVuguP1vzpdN1xWgLuPrwQ/cuAdqEPHLXwvtomA== X-Gm-Gg: AYBFou2Dhy+yLOx+5Rs0iV3oqjAUgp0xqbJDZdOEu+ivY+fI47U52vsKGGDVzQCboWk CasKuDk/jB/EKQVRkCwodtn7hamfvChvO8Frir/on8nPv1o28yz3oPmfuoaGMM8aJarC69YYmtC oQbOU17xTzBfm+rKnMOQjVVJ4NjCCCa3+pOvYoTFNQ8ZqvX4Dh15P5zWmBCtLtOJl4+jFEUcyQI lFxaw2J8Wx1PfTSquiCZjlUJVaHbtqJyph/T/IEFbZL1r46vOkck03MUVpbtp4qU0lpo2pzqKPL QPReM/9qNpbPAzUx2h8UXpTR5DyikxoJv7TfwOpPMd5G8ct9aIgxbG56RNOhM6R55ivpOB5SymJ oq+TsGtyOGJmaNe6z2KUJe2kqxg5pIBFi6xbR4r3wbXgM+xCW1GYeMrmAeyocFT29u5tN2gA05R JVkD0/ZDeS8JfxaQRh5ARV9A== X-Received: by 2002:a05:7301:705:b0:332:946c:477a with SMTP id 5a478bee46e88-340059679dfmr678105eec.16.1790217701111; Wed, 23 Sep 2026 19:41:41 -0700 (PDT) X-Received: by 2002:a05:7301:705:b0:332:946c:477a with SMTP id 5a478bee46e88-340059679dfmr678086eec.16.1790217700474; Wed, 23 Sep 2026 19:41:40 -0700 (PDT) Received: from hu-pooventh-blr.qualcomm.com (blr-bdr-fw-01_GlobalNAT_AllZones-Outside.qualcomm.com. [103.229.18.19]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-33e96258351sm9692263eec.12.2026.09.23.19.41.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 23 Sep 2026 19:41:40 -0700 (PDT) From: Pooventhiran G Date: Thu, 24 Sep 2026 08:10:40 +0530 Subject: [PATCH wireless-next v2 03/16] wifi: cfg80211/mac80211: Configure AP with SMD capabilities Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260924-smd-v2-3-bb40094da1d4@oss.qualcomm.com> References: <20260924-smd-v2-0-bb40094da1d4@oss.qualcomm.com> In-Reply-To: <20260924-smd-v2-0-bb40094da1d4@oss.qualcomm.com> To: Johannes Berg , Kees Cook , "Gustavo A. R. Silva" Cc: linux-wireless@vger.kernel.org, linux-kernel@vger.kernel.org, linux-hardening@vger.kernel.org, pooventhiran.g@oss.qualcomm.com X-Mailer: b4 0.14.3 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTI0MDAxMiBTYWx0ZWRfX6nBx1wtzQ0ar 6sbB9nOVbt1fAWNu4mmX3BHQNZP42lb5sswjVbxoX38Vu2ijbnUpaXPiurlzKgHpmem/EpDFFhE V9G+5dYWPg3YI/SIEWG7sjVGL+7YwnGeNLVECU9WvetiawYjyGX2iezYnEW5uw5/LOKHOPH/jE/ frDpejpTtY/Ng8igZj5af9hkuScM6BiKwlWWObPmDjrObJm25DdPmyeVdPLGeOS/AKC8BHGvDp6 ONcIKxQA6Ruko2EzlszopK0tgrGTFTaV323FrOTeFr6nS+nFoyvb/e2Fo1t+X4Ew0QFZbqNzj2o TLdGFXuxIZmSKzxEozumk0NJFXgaWhv2QtCA4YVZKo/x9nkPOEWrNlVzqsYoTjaNo37zNjOM4O/ RuMV5h5Qq/G/eT7l9+t3MYK3RU+YxKJZ7eJTHIB9usAjPjB1fvjf/a2X5ML5kfTYJ7kAYK5oYXY bwQ5TetPjk7kYYiXM/w== X-Authority-Analysis: v=2.4 cv=TYwDJhQh c=1 sm=1 tr=0 ts=6ab48de6 cx=c_pps a=Uww141gWH0fZj/3QKPojxA==:117 a=Ou0eQOY4+eZoSc0qltEV5Q==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=ZpdpYltYx_vBUK5n70dp:22 a=EUspDBNiAAAA:8 a=56q9xwJp3_aMvtWITrUA:9 a=QEXdDO2ut3YA:10 a=PxkB5W3o20Ba91AHUih5:22 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTI0MDAxMiBTYWx0ZWRfXyXSTQxp7BfoY ScxTncr3JoZD+AW6nzdyLKQXCfo3hm0odlSx58sggtOqMDHj9/HQ4P3jXJDQZRzGHl7wjWytU8v FIaHW9vDMLojdbRm8ie5zEIxKwFWXCk= X-Proofpoint-GUID: o_Xza4rgRaOCI0IVh8oTWP5B68gKfT6L X-Proofpoint-ORIG-GUID: o_Xza4rgRaOCI0IVh8oTWP5B68gKfT6L X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-24_01,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 malwarescore=0 phishscore=0 spamscore=0 lowpriorityscore=0 bulkscore=0 clxscore=1015 adultscore=0 priorityscore=1501 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609240012 From: Rohan Dutta When an AP is getting started, configure the AP as SMD-enabled if userspace provides configuration for the Seamless Mobility Domain (SMD). The SMD parameters are: - SMD Identifier: unique identifier of the SMD - SMD Preparation Timeout: Valid duration for a prepared target AP MLD - Downlink Data Forwarding: Forwarding support for buffered DL packets - Max Number of Peer AP MLDs: Number of target AP MLDs that a non-AP MLD can prepare with - SMD Type: Type of SMD - SMD PTK Mode: PTK mode used in the SMD - Neighbor Probing: UHR Neighboring AP Probing Without these parameters configured, drivers and lower layers cannot support SMD BSS Transition. Signed-off-by: Rohan Dutta Co-developed-by: Aditya Sathish Signed-off-by: Aditya Sathish Co-developed-by: Sidhanta Sahu Signed-off-by: Sidhanta Sahu Signed-off-by: Pooventhiran G --- include/net/cfg80211.h | 25 ++++++++++++++++ include/net/mac80211.h | 2 ++ net/mac80211/cfg.c | 5 ++++ net/wireless/nl80211.c | 78 ++++++++++++++++++++++++++++++++++++++++++++++= ++++ 4 files changed, 110 insertions(+) diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index 9aa7d2d4a184..df85dc804c50 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h @@ -1587,6 +1587,29 @@ struct cfg80211_s1g_short_beacon { size_t short_tail_len; }; =20 +/** + * struct cfg80211_smd_params - Seamless Mobility Domain parameters + * + * @smd_enabled: SMD is enabled on this device + * @smd_identifier: SMD ID (ETH_ALEN bytes) + * @smd_timeout: timeout in 64 TUs for ST Preparation + * @dl_data_fwd: MSDU forwarding supported + * @max_num_of_peer_apmlds: max prepared AP MLDs supported (0-7) + * @smd_type: SMD type + * @ptk_mode: PTK mode + * @neighbor_probing: UHR Neighboring AP Probing supported + */ +struct cfg80211_smd_params { + bool smd_enabled; + u8 smd_identifier[ETH_ALEN]; + u16 smd_timeout; + bool dl_data_fwd; + u8 max_num_of_peer_apmlds; + enum nl80211_smd_type smd_type; + enum nl80211_smd_ptk_mode ptk_mode; + bool neighbor_probing; +}; + /** * struct cfg80211_ap_settings - AP configuration * @@ -1623,6 +1646,7 @@ struct cfg80211_s1g_short_beacon { * @mbssid_config: AP settings for multiple bssid * @s1g_long_beacon_period: S1G long beacon period * @s1g_short_beacon: S1G short beacon data + * @smd_params: Seamless Mobility Domain (SMD) parameters */ struct cfg80211_ap_settings { struct cfg80211_chan_def chandef; @@ -1655,6 +1679,7 @@ struct cfg80211_ap_settings { struct cfg80211_mbssid_config mbssid_config; u8 s1g_long_beacon_period; struct cfg80211_s1g_short_beacon s1g_short_beacon; + struct cfg80211_smd_params smd_params; }; =20 =20 diff --git a/include/net/mac80211.h b/include/net/mac80211.h index 1172d7b83ed1..3a5011945eed 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h @@ -797,6 +797,7 @@ struct ieee80211_bss_npca_params { * @s1g_long_beacon_period: number of beacon intervals between each long * beacon transmission. * @npca: NPCA parameters + * @smd_params: SMD parameters */ struct ieee80211_bss_conf { struct ieee80211_vif *vif; @@ -904,6 +905,7 @@ struct ieee80211_bss_conf { u8 s1g_long_beacon_period; =20 struct ieee80211_bss_npca_params npca; + struct cfg80211_smd_params smd_params; }; =20 #define IEEE80211_NAN_MAX_CHANNELS 3 diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c index 23f4f9ec86d0..b4b42790c5d7 100644 --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c @@ -1796,6 +1796,11 @@ static int ieee80211_start_ap(struct wiphy *wiphy, s= truct net_device *dev, } } =20 + if (params->smd_params.smd_enabled) + link_conf->smd_params =3D params->smd_params; + else + link_conf->smd_params.smd_enabled =3D false; + if (sdata->vif.type =3D=3D NL80211_IFTYPE_AP && params->mbssid_config.tx_wdev) { err =3D ieee80211_set_ap_mbssid_options(sdata, diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index de93b34444b4..b4ff784d131b 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c @@ -7225,6 +7225,78 @@ static int nl80211_check_npca(struct cfg80211_regist= ered_device *rdev, return -EINVAL; } =20 +static int nl80211_parse_smd_params(struct genl_info *info, + struct cfg80211_smd_params *smd_params) +{ + struct nlattr *smd_params_attr =3D info->attrs[NL80211_ATTR_SMD_PARAMS]; + struct cfg80211_registered_device *rdev =3D info->user_ptr[0]; + struct net_device *dev =3D info->user_ptr[1]; + struct wireless_dev *wdev =3D dev->ieee80211_ptr; + struct nlattr *tb[NL80211_SMD_PARAMS_ATTR_MAX + 1]; + int err; + + if (!wiphy_ext_feature_isset(&rdev->wiphy, + NL80211_EXT_FEATURE_SMD)) { + GENL_SET_ERR_MSG(info, "SMD is not supported"); + return -EOPNOTSUPP; + } + + if (!wdev->valid_links) { + GENL_SET_ERR_MSG(info, "SMD is not allowed without MLO"); + return -EINVAL; + } + + err =3D nla_parse_nested(tb, NL80211_SMD_PARAMS_ATTR_MAX, + smd_params_attr, nl80211_smd_params_policy, + NULL); + if (err) { + GENL_SET_ERR_MSG(info, "failed to parse SMD parameters"); + return err; + } + + if (!tb[NL80211_SMD_PARAMS_ATTR_IDENTIFIER] || + !tb[NL80211_SMD_PARAMS_ATTR_TIMEOUT] || + !tb[NL80211_SMD_PARAMS_ATTR_MAX_PEER_APMLDS] || + !tb[NL80211_SMD_PARAMS_ATTR_TYPE] || + !tb[NL80211_SMD_PARAMS_ATTR_PTK_MODE]) { + GENL_SET_ERR_MSG(info, "required SMD parameters are missing"); + return -EINVAL; + } + + memcpy(smd_params->smd_identifier, + nla_data(tb[NL80211_SMD_PARAMS_ATTR_IDENTIFIER]), + ETH_ALEN); + + smd_params->smd_timeout =3D + nla_get_u16(tb[NL80211_SMD_PARAMS_ATTR_TIMEOUT]); + + smd_params->dl_data_fwd =3D + !!tb[NL80211_SMD_PARAMS_ATTR_DL_DATA_FORWARDING]; + if (smd_params->dl_data_fwd && + !wiphy_ext_feature_isset(&rdev->wiphy, + NL80211_EXT_FEATURE_SMD_DL_PKT_FORWARDING)) { + GENL_SET_ERR_MSG(info, + "SMD DL packet forwarding is not supported"); + return -EOPNOTSUPP; + } + + smd_params->max_num_of_peer_apmlds =3D + nla_get_u8(tb[NL80211_SMD_PARAMS_ATTR_MAX_PEER_APMLDS]); + + smd_params->smd_type =3D + nla_get_u8(tb[NL80211_SMD_PARAMS_ATTR_TYPE]); + + smd_params->ptk_mode =3D + nla_get_u8(tb[NL80211_SMD_PARAMS_ATTR_PTK_MODE]); + + smd_params->neighbor_probing =3D + !!tb[NL80211_SMD_PARAMS_ATTR_NEIGHBOR_PROBING]; + + smd_params->smd_enabled =3D true; + + return 0; +} + static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info) { struct cfg80211_registered_device *rdev =3D info->user_ptr[0]; @@ -7506,6 +7578,12 @@ static int nl80211_start_ap(struct sk_buff *skb, str= uct genl_info *info) =20 /* FIXME: validate MLO/link-id against driver capabilities */ =20 + if (info->attrs[NL80211_ATTR_SMD_PARAMS]) { + err =3D nl80211_parse_smd_params(info, ¶ms->smd_params); + if (err) + goto out; + } + err =3D rdev_start_ap(rdev, dev, params); if (!err) { wdev->links[link_id].ap.beacon_interval =3D params->beacon_interval; --=20 2.34.1 From nobody Thu Sep 24 13:39:02 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (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 090C33D5676 for ; Thu, 24 Sep 2026 02:41:46 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790217710; cv=none; b=IQoSecG3eQlMQ0nVzXtmpjzNGH82uSIt65qyepVJgrhHWaAvjgOad58lFvScW83Tmhy/aoN9MCiawxo3b9Mswk/OGS/PZeMsvGpgpIBNpwWuqNaegxiGozv1GjMTUl/P/joN26W1lMgd98lIzhIJqvkIwdUkerBLTfBxSCB8n9k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790217710; c=relaxed/simple; bh=G/rmWbY+P9DmNnDDZSpiVUK0rqtD5UWT3SjfEoiJI3g=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Qg0Sx6Vt09nh5WAqKiOPNahc25R+SYWxpU2sWhP6AcqGFkgONP+8wz6AnEQFpg9uZwoo7kS7QHT4zZOWNzFyp5OPsXoP8GJmyzCrOzE//g6EMa6HxU6m9OEJ0T2ANXrE3DVg+Dx5KUT7ya1Ty9uHW16QExOUz1bbT3eGOOABiNc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=J6suPMHD; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=KYiQmhTB; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="J6suPMHD"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="KYiQmhTB" Received: from pps.filterd (m0279871.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68O2K5Tj1474532 for ; Thu, 24 Sep 2026 02:41:45 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= qmVZoiMv7M0RtjS1Lv0wIeHx7PFyXkJQmL7AOMJ+2DQ=; b=J6suPMHDMoTCMm8y qI6woFcIELpbsV0kfSv1WYhQkiFxnAQL8ZXCCEh9yNUJ1pe9kpjNJuNCE+fT5XSh N+qM3zEl9KDP2IizMWo7pAsDZ4odgXW2RDJZp92auL/K+2EHN9X9txlN7QsbJUAY z29wpJtiZeSNlkSfTU574EYovq1EYAIKNEn0mRr25sk2t848pIGit6xFL1jG3og0 clAbhDp5m1Qcy1ZnYbuwPXqAexhHWiu7wVyWejvGdjbdEapRrhImjh+Cla7MIKuw pm/0rgK7GAP5Y12imGnyvP2SipJ/nvGnMsu2ZJQFiWyU5c7iMgiMnKaj5yFl0CCq qaDtxg== Received: from mail-dy1-f197.google.com (mail-dy1-f197.google.com [74.125.82.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4gvdb63gq8-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 24 Sep 2026 02:41:45 +0000 (GMT) Received: by mail-dy1-f197.google.com with SMTP id 5a478bee46e88-33c35f5ca6cso2623887eec.1 for ; Wed, 23 Sep 2026 19:41:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1790217705; x=1790822505; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=qmVZoiMv7M0RtjS1Lv0wIeHx7PFyXkJQmL7AOMJ+2DQ=; b=KYiQmhTBz/NJgC54ZdHxZiM68jqZTROsIdYP6NlMQSGBBuZyIpXAXuoC2Jal8/IWVW J4cWHqQvEIPZs2cRPUx4j1iSH/Gal4/KAXswoLdtHcob2ynSA16lZKjUCrxRupNsmlwS PtJzYu/D9NszJzYQQBvD+h9paAo0iWV1NkBPjMG1h7jKYZHNb65ZudJuCpj30kjtXHqy xPnXosCZn3b1n/thzoBYcWRzzYf4dMDtfWHNzTUOyRouMO1hYP9HyZC2LBaVxZyYm6ZF jTdrj/SEt7s7gGRe8rg/zWlamwgTmB4XD2uL4PCe292l+pS/5EOOByy9cEdwdXD1pue8 6ArQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790217705; x=1790822505; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=qmVZoiMv7M0RtjS1Lv0wIeHx7PFyXkJQmL7AOMJ+2DQ=; b=EQ5fsaQly5t73QLMAZbPR2K0opCbTQlZMYLIOKTuLrZaFtNM6fgWYfv/dBjx4S6RNk ZNX8bN0UmQ7sRJqHpWfjAYmtTLd0fd9sHT3KWCYo8bCDwlQazXxn10HS72+e91BrTAsu KnR9LB6n4Rn79mBT/X0lM4AAXA5ZOmq0oAtLfFcAZMF5iE6JQmR6rRRqE+ov1ZqhkZ1w UU0WX22AsZqHxe2UduIOeMxzZd8TOf5nc7IHpJkJ7YKMgu1ux5hDpTNsi4cZ6BN9/eo7 su5K3/qTmvFm/jHwvYy1rdMC3Ne1FdgeksUYX6zhvAyBFrGFZEsp8dzKpVbVAdmdIGiL 6e0A== X-Forwarded-Encrypted: i=1; AKwUvBzw1DYsRrNx2nxjiIxhIgT1iwrrXpjkwprOI191mC0LHgYpTT3TwEvthx0BA6n1WKZyzmBORqYl2zyw4VY=@vger.kernel.org X-Gm-Message-State: AFuF++m68oFgFUuGWoSXSnviYxd3DYkVyNRxylbvQ6L5smItMlQx3xoD 5Xh1vR+UwUp/IO9VC4u87Ng/qL/zKjHj4mqm76jUH1Rh5gK7/e0nU8QPDSoL1q1FWTYVGAvNsy1 AXYa8FPTxHMEwXw1fHd45qNqskoakeBo+TIxIeDH44aopzXDsqiFwCNegZBj/uMw2IMZLCSJaTQ == X-Gm-Gg: AYBFou092qbbyOay5K7WTCnhiwrzaRlF0nAHX1M4XhI3gWW0r7dYzqQjK4HLf9qJqou KWuQHce48RnINFOTTm7N3du7Br6Nfqrr9WFT3HmBoEZ6c7pwPkJ9rTr4EisPZBV3eRFJHG8j/Yq nMYueKv/qFpdzpUE7LqDrFnoWLnAQwCz6+QM2aVkcgjShOSyt12/iwg31T1uMjqpAGPiVomDFwr vZ8kVkAd8GPR30xiA4YLZameFmM8rA/MZQ6FrF5sg76KdLz7U3vGb8gaQZTJTlxN0lngp6S5mpj +2bZ+0uNM4cOHWKxYIAziXAKevifuOLiy1u3VVjO5FaHqdBbHa+4XdvJbVbwau76AX7FN4PaHyd jBKQTMPv65Cq6wZbUiAihaFSOnB3mP7asszfnWBq8C4cFrgkXMhk4FzY6T2vmUArqCZ+2HrnLx+ KY6Q4KypQ+geNLo7YQ53IChg== X-Received: by 2002:a05:7300:1695:b0:33c:16f1:2e3f with SMTP id 5a478bee46e88-33ffe44d72bmr658552eec.6.1790217704292; Wed, 23 Sep 2026 19:41:44 -0700 (PDT) X-Received: by 2002:a05:7300:1695:b0:33c:16f1:2e3f with SMTP id 5a478bee46e88-33ffe44d72bmr658530eec.6.1790217703616; Wed, 23 Sep 2026 19:41:43 -0700 (PDT) Received: from hu-pooventh-blr.qualcomm.com (blr-bdr-fw-01_GlobalNAT_AllZones-Outside.qualcomm.com. [103.229.18.19]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-33e96258351sm9692263eec.12.2026.09.23.19.41.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 23 Sep 2026 19:41:43 -0700 (PDT) From: Pooventhiran G Date: Thu, 24 Sep 2026 08:10:41 +0530 Subject: [PATCH wireless-next v2 04/16] wifi: cfg80211/mac80211: Parse SMD parameters in STA addition/modification Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260924-smd-v2-4-bb40094da1d4@oss.qualcomm.com> References: <20260924-smd-v2-0-bb40094da1d4@oss.qualcomm.com> In-Reply-To: <20260924-smd-v2-0-bb40094da1d4@oss.qualcomm.com> To: Johannes Berg , Kees Cook , "Gustavo A. R. Silva" Cc: linux-wireless@vger.kernel.org, linux-kernel@vger.kernel.org, linux-hardening@vger.kernel.org, pooventhiran.g@oss.qualcomm.com X-Mailer: b4 0.14.3 X-Proofpoint-GUID: BJq9S0GFXwaL6XGV3w75K1DwGADdgLtp X-Proofpoint-ORIG-GUID: BJq9S0GFXwaL6XGV3w75K1DwGADdgLtp X-Authority-Analysis: v=2.4 cv=QeXzLcbv c=1 sm=1 tr=0 ts=6ab48de9 cx=c_pps a=Uww141gWH0fZj/3QKPojxA==:117 a=Ou0eQOY4+eZoSc0qltEV5Q==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=3WHJM1ZQz_JShphwDgj5:22 a=EUspDBNiAAAA:8 a=tJjRGxMx1SIfQ35-_K4A:9 a=QEXdDO2ut3YA:10 a=PxkB5W3o20Ba91AHUih5:22 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTI0MDAxMiBTYWx0ZWRfX6lYrID9N8hlU o+gnAMoURgCSAd/5amUGB3VumjBym2hMR60U/9QvmQRl9ZBr2bOsIbFydbdE5wndcrhk0HSM4mp MA+vTZgQCDVtczuSPe5mTm6MSSS+UxQ= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTI0MDAxMiBTYWx0ZWRfX3/CcZ7Jbgayr vEC5SD8Ao8X0uTS2Pi0pAjbN7CZto+QG2aNMxHzP4UxJpByu++53p3/hOQgVkQ5VmbXhT2v81Zh MHT39xTGPwNxVuxTF5LQ+B4BW3P+9dYr7Uxs5r702msyvgQVm5tZ9scxvpv4x5btEt4ssjhvj4d lj1lGsgyGIxJcRFqMDTDlQ9yCE/tJ5xzCOrwhe2tOcYCfEqIr46T0HlxZckB/YMCD4HNw9tLdRR 0+OHF4eB1UKf/6YjI7sKms8VBotcWA6HmeMw7aH+qWk7Ois1RYJ7oxW1C3Z+L0Uhom9e4yVT7qV TM5tI8Zhitac3t/u/tgT+TvXJkcjZjjmmnk9eDVyJ597sumXiXIsqJ5/Fw6q0LhQzay1V2INUBu vM4sCbCEDobd1Ep4xZXKnctGFnoPZrZzUt495EaacuDxtIcBuHV8u3VS+wNlntMesfAtRLmaB6X 6Lkd7BioitxviDZ5cWQ== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-24_01,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 priorityscore=1501 phishscore=0 lowpriorityscore=0 bulkscore=0 impostorscore=0 adultscore=0 clxscore=1015 spamscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609240012 From: Aditya Sathish When a non-AP MLD is getting added or having its capabilities updated, handle the SMD parameters passed from userspace. Otherwise, drivers will not be able to identify that the non-AP MLD has negotiated SMD with this AP MLD during association nor can they support SMD BSS Transition if it has been requested later by the non-AP MLD. Signed-off-by: Aditya Sathish Co-developed-by: Sidhanta Sahu Signed-off-by: Sidhanta Sahu Co-developed-by: Pooventhiran G Signed-off-by: Pooventhiran G --- include/net/cfg80211.h | 15 +++++++++++++ include/net/mac80211.h | 3 +++ include/uapi/linux/nl80211.h | 17 ++++++++++++++ net/mac80211/cfg.c | 10 +++++++++ net/mac80211/debugfs_sta.c | 1 + net/mac80211/sta_info.h | 2 ++ net/wireless/nl80211.c | 53 ++++++++++++++++++++++++++++++++++++++--= ---- 7 files changed, 94 insertions(+), 7 deletions(-) diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index df85dc804c50..51fb64a837fd 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h @@ -1897,6 +1897,19 @@ struct cfg80211_ttlm_params { u16 ulink[8]; }; =20 +/** + * struct cfg80211_sta_smd_params - SMD parameters for an added station + * + * @smd_sta: SMD-negotiated STA + * @smd_identifier: SMD Identifier + * @dl_data_fwd: MSDU forwarding supported + */ +struct cfg80211_sta_smd_params { + bool smd_sta; + u8 smd_identifier[ETH_ALEN]; + bool dl_data_fwd; +}; + /** * struct station_parameters - station parameters * @@ -1937,6 +1950,7 @@ struct cfg80211_ttlm_params { * @link_sta_params: link related params. * @epp_peer: EPP peer indication * @nmi_mac: MAC address of the NMI station of the NAN peer + * @smd_params: SMD params for this station */ struct station_parameters { struct net_device *vlan; @@ -1965,6 +1979,7 @@ struct station_parameters { struct link_station_parameters link_sta_params; bool epp_peer; const u8 *nmi_mac; + struct cfg80211_sta_smd_params smd_params; }; =20 /** diff --git a/include/net/mac80211.h b/include/net/mac80211.h index 3a5011945eed..39d67c054ae6 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h @@ -2726,6 +2726,7 @@ struct ieee80211_link_sta { * @nan_sched: NAN peer schedule for this station. Valid only for NMI stat= ions. * @ext_mld_capa_ops: the MLD's extended MLD capabilities and operations * NOTE: currently only tracked for AP STAs + * @smd_params: SMD parameters of the STA */ struct ieee80211_sta { u8 addr[ETH_ALEN] __aligned(2); @@ -2760,6 +2761,8 @@ struct ieee80211_sta { /* should only be accessed with the wiphy mutex held */ struct ieee80211_nan_peer_sched *nan_sched; =20 + struct cfg80211_sta_smd_params smd_params; + /* must be last */ u8 drv_priv[] __aligned(sizeof(void *)); }; diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h index 1177a511c8cb..265c5883e6cf 100644 --- a/include/uapi/linux/nl80211.h +++ b/include/uapi/linux/nl80211.h @@ -3196,6 +3196,17 @@ enum nl80211_commands { * %NL80211_EXT_FEATURE_SMD. * Used with %NL80211_CMD_START_AP. See &enum nl80211_smd_params_attrs. * + * @NL80211_ATTR_PEER_SMD_ENABLED: Flag indicating a peer STA has SMD enab= led. + * Used with %NL80211_CMD_NEW_STATION and %NL80211_CMD_SET_STATION. + * + * @NL80211_ATTR_PEER_SMD_MAC_ADDR: Binary attribute with the 6-byte MAC + * address of the SMD-capable peer STA. + * Used with %NL80211_CMD_NEW_STATION and %NL80211_CMD_SET_STATION. + * + * @NL80211_ATTR_PEER_SMD_DL_DATA_FORWARDING: Flag indicating the peer STA + * supports DL data forwarding within the SMD domain. + * Used with %NL80211_CMD_NEW_STATION and %NL80211_CMD_SET_STATION. + * * @NUM_NL80211_ATTR: total number of nl80211_attrs available * @NL80211_ATTR_MAX: highest attribute number currently defined * @__NL80211_ATTR_AFTER_LAST: internal use @@ -3800,6 +3811,10 @@ enum nl80211_attrs { =20 NL80211_ATTR_SMD_PARAMS, =20 + NL80211_ATTR_PEER_SMD_ENABLED, + NL80211_ATTR_PEER_SMD_MAC_ADDR, + NL80211_ATTR_PEER_SMD_DL_DATA_FORWARDING, + /* add attributes here, update the policy in nl80211.c */ =20 __NL80211_ATTR_AFTER_LAST, @@ -3950,6 +3965,7 @@ enum nl80211_iftype { * that support %NL80211_FEATURE_FULL_AP_CLIENT_STATE to transition a * previously added station into associated state * @NL80211_STA_FLAG_SPP_AMSDU: station supports SPP A-MSDUs + * @NL80211_STA_FLAG_SMD: station has negotiated SMD. * @NL80211_STA_FLAG_MAX: highest station flag number currently defined * @__NL80211_STA_FLAG_AFTER_LAST: internal use */ @@ -3963,6 +3979,7 @@ enum nl80211_sta_flags { NL80211_STA_FLAG_TDLS_PEER, NL80211_STA_FLAG_ASSOCIATED, NL80211_STA_FLAG_SPP_AMSDU, + NL80211_STA_FLAG_SMD, =20 /* keep last */ __NL80211_STA_FLAG_AFTER_LAST, diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c index b4b42790c5d7..138b67f4bda4 100644 --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c @@ -2528,6 +2528,16 @@ static int sta_apply_parameters(struct ieee80211_loc= al *local, if (mask & BIT(NL80211_STA_FLAG_SPP_AMSDU)) sta->sta.spp_amsdu =3D set & BIT(NL80211_STA_FLAG_SPP_AMSDU); =20 + if (mask & BIT(NL80211_STA_FLAG_SMD)) { + if (set & BIT(NL80211_STA_FLAG_SMD)) + set_sta_flag(sta, WLAN_STA_SMD); + else if (test_sta_flag(sta, WLAN_STA_SMD)) + clear_sta_flag(sta, WLAN_STA_SMD); + } + + if (params->smd_params.smd_sta) + sta->sta.smd_params =3D params->smd_params; + /* mark TDLS channel switch support, if the AP allows it */ if (test_sta_flag(sta, WLAN_STA_TDLS_PEER) && !sdata->deflink.u.mgd.tdls_chan_switch_prohibited && diff --git a/net/mac80211/debugfs_sta.c b/net/mac80211/debugfs_sta.c index ef75255d47d5..d7e7c9c578e4 100644 --- a/net/mac80211/debugfs_sta.c +++ b/net/mac80211/debugfs_sta.c @@ -78,6 +78,7 @@ static const char * const sta_flag_names[] =3D { FLAG(PS_DELIVER), FLAG(USES_ENCRYPTION), FLAG(DECAP_OFFLOAD), + FLAG(SMD), #undef FLAG }; =20 diff --git a/net/mac80211/sta_info.h b/net/mac80211/sta_info.h index ee0d32877c5b..506aeb241a6d 100644 --- a/net/mac80211/sta_info.h +++ b/net/mac80211/sta_info.h @@ -72,6 +72,7 @@ * @WLAN_STA_USES_ENCRYPTION: This station was configured for encryption, * so drop all packets without a key later. * @WLAN_STA_DECAP_OFFLOAD: This station uses rx decap offload + * @WLAN_STA_SMD: this station is associated to an SMD-ME. * * @NUM_WLAN_STA_FLAGS: number of defined flags */ @@ -104,6 +105,7 @@ enum ieee80211_sta_info_flags { WLAN_STA_PS_DELIVER, WLAN_STA_USES_ENCRYPTION, WLAN_STA_DECAP_OFFLOAD, + WLAN_STA_SMD, =20 NUM_WLAN_STA_FLAGS, }; diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index b4ff784d131b..76fb83f61b89 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c @@ -1115,6 +1115,9 @@ static const struct nla_policy nl80211_policy[NUM_NL8= 0211_ATTR] =3D { [NL80211_ATTR_FRAME_NO_STA] =3D { .type =3D NLA_FLAG }, [NL80211_ATTR_SMD_PARAMS] =3D NLA_POLICY_NESTED(nl80211_smd_params_policy), + [NL80211_ATTR_PEER_SMD_ENABLED] =3D { .type =3D NLA_FLAG }, + [NL80211_ATTR_PEER_SMD_MAC_ADDR] =3D NLA_POLICY_ETH_ADDR, + [NL80211_ATTR_PEER_SMD_DL_DATA_FORWARDING] =3D { .type =3D NLA_FLAG }, }; =20 /* policy for the key attributes */ @@ -7703,6 +7706,7 @@ static const struct nla_policy sta_flags_policy[NL802= 11_STA_FLAG_MAX + 1] =3D { [NL80211_STA_FLAG_MFP] =3D { .type =3D NLA_FLAG }, [NL80211_STA_FLAG_AUTHENTICATED] =3D { .type =3D NLA_FLAG }, [NL80211_STA_FLAG_TDLS_PEER] =3D { .type =3D NLA_FLAG }, + [NL80211_STA_FLAG_SMD] =3D { .type =3D NLA_FLAG }, }; =20 static int parse_station_flags(struct genl_info *info, @@ -7769,11 +7773,13 @@ static int parse_station_flags(struct genl_info *in= fo, switch (iftype) { case NL80211_IFTYPE_AP: case NL80211_IFTYPE_AP_VLAN: + params->sta_flags_mask =3D BIT(NL80211_STA_FLAG_SMD); + fallthrough; case NL80211_IFTYPE_P2P_GO: - params->sta_flags_mask =3D BIT(NL80211_STA_FLAG_AUTHORIZED) | - BIT(NL80211_STA_FLAG_SHORT_PREAMBLE) | - BIT(NL80211_STA_FLAG_WME) | - BIT(NL80211_STA_FLAG_MFP); + params->sta_flags_mask |=3D BIT(NL80211_STA_FLAG_AUTHORIZED) | + BIT(NL80211_STA_FLAG_SHORT_PREAMBLE) | + BIT(NL80211_STA_FLAG_WME) | + BIT(NL80211_STA_FLAG_MFP); break; case NL80211_IFTYPE_P2P_CLIENT: case NL80211_IFTYPE_STATION: @@ -8914,7 +8920,7 @@ int cfg80211_check_station_change(struct wiphy *wiphy, return -EINVAL; =20 /* When you run into this, adjust the code below for the new flag */ - BUILD_BUG_ON(NL80211_STA_FLAG_MAX !=3D 8); + BUILD_BUG_ON(NL80211_STA_FLAG_MAX !=3D 9); =20 switch (statype) { case CFG80211_STA_MESH_PEER_KERNEL: @@ -9008,7 +9014,8 @@ int cfg80211_check_station_change(struct wiphy *wiphy, BIT(NL80211_STA_FLAG_SHORT_PREAMBLE) | BIT(NL80211_STA_FLAG_WME) | BIT(NL80211_STA_FLAG_MFP) | - BIT(NL80211_STA_FLAG_SPP_AMSDU))) + BIT(NL80211_STA_FLAG_SPP_AMSDU) | + BIT(NL80211_STA_FLAG_SMD))) return -EINVAL; =20 /* but authenticated/associated only if driver handles it */ @@ -9262,6 +9269,30 @@ static int nl80211_parse_sta_txpower_setting(struct = genl_info *info, return 0; } =20 +static int nl80211_set_station_smd(struct genl_info *info, + struct station_parameters *params) +{ + struct nlattr *smd_mac; + + params->smd_params.smd_sta =3D + !!info->attrs[NL80211_ATTR_PEER_SMD_ENABLED]; + + if (!params->smd_params.smd_sta) + return 0; + + smd_mac =3D info->attrs[NL80211_ATTR_PEER_SMD_MAC_ADDR]; + + if (!info->attrs[NL80211_ATTR_MLD_ADDR] || !smd_mac) + return -EINVAL; + + nla_memcpy(params->smd_params.smd_identifier, smd_mac, ETH_ALEN); + + params->smd_params.dl_data_fwd =3D + !!info->attrs[NL80211_ATTR_PEER_SMD_DL_DATA_FORWARDING]; + + return 0; +} + static int nl80211_set_station(struct sk_buff *skb, struct genl_info *info) { struct cfg80211_registered_device *rdev =3D info->user_ptr[0]; @@ -9400,6 +9431,10 @@ static int nl80211_set_station(struct sk_buff *skb, = struct genl_info *info) if (err) return err; =20 + err =3D nl80211_set_station_smd(info, ¶ms); + if (err) + return err; + /* Include parameters for TDLS peer (will check later) */ err =3D nl80211_set_station_tdls(info, ¶ms); if (err) @@ -9628,6 +9663,10 @@ static int nl80211_new_station(struct sk_buff *skb, = struct genl_info *info) if (parse_station_flags(info, wdev->iftype, ¶ms)) return -EINVAL; =20 + err =3D nl80211_set_station_smd(info, ¶ms); + if (err) + return err; + /* HT/VHT requires QoS, but if we don't have that just ignore HT/VHT * as userspace might just pass through the capabilities from the IEs * directly, rather than enforcing this restriction and returning an @@ -9661,7 +9700,7 @@ static int nl80211_new_station(struct sk_buff *skb, s= truct genl_info *info) return -EINVAL; =20 /* When you run into this, adjust the code below for the new flag */ - BUILD_BUG_ON(NL80211_STA_FLAG_MAX !=3D 8); + BUILD_BUG_ON(NL80211_STA_FLAG_MAX !=3D 9); =20 switch (wdev->iftype) { case NL80211_IFTYPE_AP: --=20 2.34.1 From nobody Thu Sep 24 13:39:02 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (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 B00AF3D5C23 for ; Thu, 24 Sep 2026 02:41:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790217711; cv=none; b=V8/hLtDDMETuJI5+L0nX1VFF30jDLWLZkN8Y8RM0D0GQkypC4RhzeXlYq7lQRj6nvIJWBPLjUHY9gmIYc5VDzRTjkYtC2Mm+7WJijGNgCGoHedzq9fec/9U/KglmwKU3bIgqglJ6ahhXPa6+o3T85Kr0lsBuLA80OeOX8XjZx+k= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790217711; c=relaxed/simple; bh=WCja1zMpIWpAvShJZ5yorR/YcVCtwzNTE3z3uAWcbDQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=YqNGy7JSIn9RGZ45E17QLW7miywA1nSCaa+kcZ4nIIAIRQw2hqeWxtacViryVc8SEBCSCa4bQyAGBr+JjilvzIMIyRnf6AHp6QdMLb0/brrokaynZqt/AH366xsfovK8zJ3kWRJb9cVkcKYXIZSqeV2NhnuxbgorWmWP347nmsM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=Jj0HHMnr; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=EqplB3zC; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="Jj0HHMnr"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="EqplB3zC" Received: from pps.filterd (m0279869.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68O2K2291316988 for ; Thu, 24 Sep 2026 02:41:48 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= G/twQYaftVTGoKuK359yIkzi9M9zMZOVOhOpBlAzba8=; b=Jj0HHMnrq1Q+FOzm sB9En1O5XLelPGwlL6KRP65h733KZjnVoxo+ZpqDQ/gW7te5/xUcbmxnkFlvT/MS 7Lqh/WTWG+X4CsRZtteQy9fNb77xdRYsd6npccjAI9lLOEMN9fVSaQaeb7H6lbWk vvinkWDrxkygOeV1IxeXrt+yZ0LjvQcDdZ4HCXdvjBKe9wsv0fFdeEQxRhp6m/kf 0uDHRGNw+L6IKBTaW53bgDI7VXFbobyBWJ/KTRWgTz1qrbGe7xOZ2kTEHqUxZBb+ J4MZ+RhAAWbGVaHelEIsCjnALF4g9lGlWc9Rohy787x3smDX6I8rs0vSqARjdeOb 7MfeoQ== Received: from mail-dy1-f199.google.com (mail-dy1-f199.google.com [74.125.82.199]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4gvfkbjwfd-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 24 Sep 2026 02:41:48 +0000 (GMT) Received: by mail-dy1-f199.google.com with SMTP id 5a478bee46e88-30c0d568830so2909131eec.1 for ; Wed, 23 Sep 2026 19:41:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1790217707; x=1790822507; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=G/twQYaftVTGoKuK359yIkzi9M9zMZOVOhOpBlAzba8=; b=EqplB3zC7DZS3MMq7V8rvoItZSyzuJS/uToa2JK4qUIZLT22I/lH/t+9gBytDIJOVp PahUoM0847vcO3SY3XY3wzNTnl41HGHiELEEMKohPaYfL1kEzqYodEQFdX5sYGbk85Br rxXV7dLzE4gpacL2g8U2RKEDZqqHIwPeC/a9V0oqKh3ZAtK5wjVvDaS1lQE4/6QVmA4q t0AFsFSpLxeo8Zo6CzuGAZi3FhzNJ3aaDq0BBY5ArFxGtpp013hs+inx4XjxUZJP2aU3 ofdlrsBShJgrkrvUZzta334E3U2tVVKdoWrwnndbRwcNHJZQSpZKDwYIgHcHVAFtsz21 SjVg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790217707; x=1790822507; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=G/twQYaftVTGoKuK359yIkzi9M9zMZOVOhOpBlAzba8=; b=Tmh762kFGFPkD0apCfKrCYks3oN8SW2hpe3kuuCJ3wJLK/DzjaeSXgh+e1IN+J7XDo 6pavSOkfXQp/F26VyTeBsj8vGrqkhF+d3kUbNgDtfy4Ql2z5tPMdFaRsrnbNDk0EVMVc S9KZqWem/IpxZ8c7AQWuS5+720mKwQ/Q5uulMDsxndqipnlgZ5PKFAjy0RLvD6CDNP5a CW/5F+U6MY0uDaUFsFBJK9e7Ms0gazoqcb6pQR5k5z4lfzf2K4XqJTiVNLG1EuGfqglA pd2VN//8xN46a+JTQIIS9x9aTgLx8ewi9mc3Yf5Cbc++zwwOfz2huHuBoHhhCCBcPMAH 68Hg== X-Forwarded-Encrypted: i=1; AKwUvBwHeB49mfjm7wwXb4615XKZKHq4FIHFdKsaTwQIo1SE5dSfqpFBMVpPDST3pjiJh9WhF3Mf3IudIhw44XE=@vger.kernel.org X-Gm-Message-State: AFuF++np4TQl2R2xC+NG6LopSsTAYOhkmEP1RJLp55B9kfQOK8yy7rnc wvfbfjteJQw00VxMoXGNjMWtr3EBMBX8kSrhgDVbtNl1tRXjlL6NWk98MUALg3rJ6Q1tT38zXjZ Ajr/9NUBAnLQ96t2apzL+lkeJ+xTVuCVUKYUAx2iAARorY+tLEdVn9Zr4g1ZsjgEr5g== X-Gm-Gg: AYBFou1BOKWJS/GkTkf4bBk0pHc0Nk8svURmC9g2FbyGxP8KNl6geFqNAa0ozvTGyIL SJ93ktJFkjMAq1w7ctrqKrQcB8NZ9LeiPuS5TLC4ivbVYpG5Cv5l8eNMhmuAgghN2kjLo8F/JTE wmn2WrU3arVzTZePzk4xt59lPSG+5qT5OCSBxab6zCrbGBMzeC20gzO2W5XKu2sdVMZ+DSo+Ecx pmqjjCk+RUgVMdCu1ZDM2pxaCsQ9DPOwsowPwS5xFlkOHWp6EuIM9G6TsVbuOrGz/zKYy+/tSd3 gK2QYo0FVQVhi9zyqxkVdYY+XqWTMCZ8zOS2qF3B/pqg07Wfp6Vt1v+4j2lQPQsHbpip7PyYadh NKnKAh1W9Z5K59qjUtq7Vjb8u+08MKVnRlBxnVmpNM56wi3yiSKboV0VxZJpp+yEY8STPGWcRPU lm8Jsr2RgJgw2qWn/BdxZWTw== X-Received: by 2002:a05:7301:b0c:b0:33e:6824:9f1c with SMTP id 5a478bee46e88-33ffe84f086mr723323eec.9.1790217707259; Wed, 23 Sep 2026 19:41:47 -0700 (PDT) X-Received: by 2002:a05:7301:b0c:b0:33e:6824:9f1c with SMTP id 5a478bee46e88-33ffe84f086mr723310eec.9.1790217706664; Wed, 23 Sep 2026 19:41:46 -0700 (PDT) Received: from hu-pooventh-blr.qualcomm.com (blr-bdr-fw-01_GlobalNAT_AllZones-Outside.qualcomm.com. [103.229.18.19]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-33e96258351sm9692263eec.12.2026.09.23.19.41.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 23 Sep 2026 19:41:46 -0700 (PDT) From: Pooventhiran G Date: Thu, 24 Sep 2026 08:10:42 +0530 Subject: [PATCH wireless-next v2 05/16] wifi: nl80211/cfg80211: Indicate STA creation via SMD BSS Transition Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260924-smd-v2-5-bb40094da1d4@oss.qualcomm.com> References: <20260924-smd-v2-0-bb40094da1d4@oss.qualcomm.com> In-Reply-To: <20260924-smd-v2-0-bb40094da1d4@oss.qualcomm.com> To: Johannes Berg , Kees Cook , "Gustavo A. R. Silva" Cc: linux-wireless@vger.kernel.org, linux-kernel@vger.kernel.org, linux-hardening@vger.kernel.org, pooventhiran.g@oss.qualcomm.com X-Mailer: b4 0.14.3 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTI0MDAxMiBTYWx0ZWRfXwpxRE1drZ8wH CeE8G9SLg9Ii1n9Wqh0nSWBfh5ilFuZFzwT8mGEyNTNdKxf7DzbTdIAA62XSjM4A53CpZf0QRjd I0vXuc3qlQ22HfqxfE4ztvHWziSqqAI= X-Proofpoint-GUID: MGFHdQ7IojeFUzr2SoWuF3suFW2ErSzv X-Authority-Analysis: v=2.4 cv=RYMFmFtv c=1 sm=1 tr=0 ts=6ab48dec cx=c_pps a=cFYjgdjTJScbgFmBucgdfQ==:117 a=Ou0eQOY4+eZoSc0qltEV5Q==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=_glEPmIy2e8OvE2BGh3C:22 a=EUspDBNiAAAA:8 a=YW6yegcWvZZGXztGtDAA:9 a=QEXdDO2ut3YA:10 a=scEy_gLbYbu1JhEsrz4S:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTI0MDAxMiBTYWx0ZWRfX6jYzzbGyl7V1 cmRUGkbEM/7/gVdw4bWITXsWm+P041R1StblX8eihzD385VZqYziS5aFGk9fP/qclPta1skkl2c UZZdV2kYXDbePp9kdbHMg5sDCfRH0kadYoWpKBjCSKSiJfqe3O42Pgf4wZ+WFLNk1YRM0Y1aPi9 FRmgsUY5zXFM1xhRIzBUnmfnyI/GsQyXDLPGC3kqDfJGu67whi6jMNMqYUL9g3tNGSvk/DhSJs4 0uiMCft9mRnNMOLANgiPeJghtUAqER6AtOBHWSHU15gcCH1cNCY6CGXmq/4dBqoBfxvOYsdHEpT e2s00it+QRgewgCq0zmspDSIt8A3g6MeK3+aEbYK9NWWaLw2EEVX+aSE3OW5D8fAESHyM6b8i0S uCGqy0M7ZrOCcOyVMHINkFiQKgWpea98rEU4Y/Xf0jxHS1VtAEynGDuWwLZg1FUgJIkAW7NhZ7d lXNqQnpBn5xLKmZePiw== X-Proofpoint-ORIG-GUID: MGFHdQ7IojeFUzr2SoWuF3suFW2ErSzv X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-24_01,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 suspectscore=0 clxscore=1015 priorityscore=1501 phishscore=0 adultscore=0 impostorscore=0 lowpriorityscore=0 bulkscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609240012 From: Rohan Dutta When the peer STA is created via SMD BSS Transition Preparation on the target AP MLD, indicate that the STA is created as part of SMD procedure unlike STA creation using typical association. This indication helps the drivers and lower layers to prepare the STA for handling ST Execution and datapath switch once the ST procedure is completed. Signed-off-by: Rohan Dutta Signed-off-by: Pooventhiran G --- include/net/cfg80211.h | 2 ++ include/uapi/linux/nl80211.h | 7 +++++++ net/wireless/nl80211.c | 3 +++ 3 files changed, 12 insertions(+) diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index 51fb64a837fd..a618b3c90161 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h @@ -1903,11 +1903,13 @@ struct cfg80211_ttlm_params { * @smd_sta: SMD-negotiated STA * @smd_identifier: SMD Identifier * @dl_data_fwd: MSDU forwarding supported + * @roam_sta: station was created via SMD BSS Transition procedure */ struct cfg80211_sta_smd_params { bool smd_sta; u8 smd_identifier[ETH_ALEN]; bool dl_data_fwd; + bool roam_sta; }; =20 /** diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h index 265c5883e6cf..3f9acbd4830f 100644 --- a/include/uapi/linux/nl80211.h +++ b/include/uapi/linux/nl80211.h @@ -3207,6 +3207,11 @@ enum nl80211_commands { * supports DL data forwarding within the SMD domain. * Used with %NL80211_CMD_NEW_STATION and %NL80211_CMD_SET_STATION. * + * @NL80211_ATTR_SMD_ROAM_STA: Flag attribute indicating this station was + * created via SMD BSS Transition Preparation at the Target AP MLD (refer + * IEEE P802.11bn/D2.0, Aug 2026, subclause 37.16.6). + * This flag is carried in %NL80211_CMD_NEW_STATION. + * * @NUM_NL80211_ATTR: total number of nl80211_attrs available * @NL80211_ATTR_MAX: highest attribute number currently defined * @__NL80211_ATTR_AFTER_LAST: internal use @@ -3815,6 +3820,8 @@ enum nl80211_attrs { NL80211_ATTR_PEER_SMD_MAC_ADDR, NL80211_ATTR_PEER_SMD_DL_DATA_FORWARDING, =20 + NL80211_ATTR_SMD_ROAM_STA, + /* add attributes here, update the policy in nl80211.c */ =20 __NL80211_ATTR_AFTER_LAST, diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 76fb83f61b89..eee6ef08950d 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c @@ -1118,6 +1118,7 @@ static const struct nla_policy nl80211_policy[NUM_NL8= 0211_ATTR] =3D { [NL80211_ATTR_PEER_SMD_ENABLED] =3D { .type =3D NLA_FLAG }, [NL80211_ATTR_PEER_SMD_MAC_ADDR] =3D NLA_POLICY_ETH_ADDR, [NL80211_ATTR_PEER_SMD_DL_DATA_FORWARDING] =3D { .type =3D NLA_FLAG }, + [NL80211_ATTR_SMD_ROAM_STA] =3D { .type =3D NLA_FLAG }, }; =20 /* policy for the key attributes */ @@ -9290,6 +9291,8 @@ static int nl80211_set_station_smd(struct genl_info *= info, params->smd_params.dl_data_fwd =3D !!info->attrs[NL80211_ATTR_PEER_SMD_DL_DATA_FORWARDING]; =20 + params->smd_params.roam_sta =3D !!info->attrs[NL80211_ATTR_SMD_ROAM_STA]; + return 0; } =20 --=20 2.34.1 From nobody Thu Sep 24 13:39:02 2026 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (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 6B3CB3D810D for ; Thu, 24 Sep 2026 02:41:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790217714; cv=none; b=LVfJJ70uEK69Gwo5FgtyAxkxCoq44J7kHTXAU6mpmPLsIZpf3OFJoxNB7wSmv6+aTurlOZIk3ckMphhpYs/u8Vpyc2WUkYgx1lp74Z7pTr5zwTes6qGLK48Ei89fR1qUE36gSvH6ovlYm5KPboVhmfI3RIrHEXm80bH3O+eTO+8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790217714; c=relaxed/simple; bh=niHUdxdsMzapGQWgN+ygxlQwbBOivdvtyi9oGnhcRmM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=jScFTv3pAzwBAGERUCtcg7j2/ZESMiyTNFXzKpizYBRQkzBbW5oziLm/lUOiAnl41IAJf/FFZ1qBei/Gf8z6BTu/W6o/EIu4YXkpNVlI4q7jpLtdlXbTt+MLnIlwAcOybIm0Ao8SBoFoS2nrMVslUjkz+TGs+oTPzkpnfWXmDXs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=Go/q84pW; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=IKf5meON; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="Go/q84pW"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="IKf5meON" Received: from pps.filterd (m0279864.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68O2K33U3722570 for ; Thu, 24 Sep 2026 02:41:51 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= wIM3NWZ3d8aicbDm/119VKkMxWVj5der5v1yPGJcgSw=; b=Go/q84pW2jElYtSB wFkAZw/IXpaRtu/pXKQrW7OH1bpmP52bGcyLIxs4Ua1DojQOiAib9ceoY8iCz6KS 1gHKFp5GMljROYWXWELur7vdyAAw5IgE4gyprQ75FWNEr8PSKi7ejmTM6CLc/vGb JcDXIfGcW1EwPCDknYOb3C8/l+5IUUvp0zhljTXGHv70eCyIfaR+GQVowUH1Kdeg UaHxQgYuxwvzYpaPinWf0bLXKCS+XhRsY2/eej0rrcoagfyHpUdVpVKOqBFHWa4g BwBs3IDYRPOrq4KREbDnlRvIp36v4D0qd0ppmy1S8NZG7uM3QYw72SoP3fjKEfFZ +33urw== Received: from mail-dy1-f198.google.com (mail-dy1-f198.google.com [74.125.82.198]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4gvfjv2wqc-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 24 Sep 2026 02:41:51 +0000 (GMT) Received: by mail-dy1-f198.google.com with SMTP id 5a478bee46e88-33bee712354so2033300eec.1 for ; Wed, 23 Sep 2026 19:41:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1790217711; x=1790822511; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=wIM3NWZ3d8aicbDm/119VKkMxWVj5der5v1yPGJcgSw=; b=IKf5meONna3gch9JyQKGqgsDKY3h7v3uG5rRYk6GNYwCPvbZmEIApiq6nw4ci2NE7z gnMzyWZx+UVwNjAs/PSKkM/XnuKeSGlGlHTak3+3XVmUIdZZ7cxhvGAwcwkga5U+SHR2 b8frl6LuI4wCSxAN1XnU5ThI1XNpl0gRXxoBAvKZ95s9D/+ZrXLUuYL/cZcy7rt4jQBO 4Okygu7B8iVpASvylOso5qLhQMvwdDR8w5ICflqyeEyoHDVPVLEs5Isaj/de+Md6qjH2 upt8qzP6rjC2dRZaQvSphA8wrcejk+tfo8C6GNWqxO6Q/XrfDlb4wkQIyVyuWqHwSlYd u3Sw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790217711; x=1790822511; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=wIM3NWZ3d8aicbDm/119VKkMxWVj5der5v1yPGJcgSw=; b=mHAnhkIwDXl+Xv5TS74h0TfJJAdhkEbwjC1xHcE89elwG1+BFvxQrr91vzTUkGsU0v KktfW/81Nob+C4lbqb0btAJFLg3E4pubLNEIFUNEmV+fEN9779GM7x0JdBdpgPn5ADt+ VPk4yT81btDfNss4bI3Kd8q2v3myWr7GuTAoyCvIWWWxkoziNYUcGTKnJjS9HGTzcrKV D+62UbT9N9uOwocE0WVZGsTX6oWD+syR8+e+gBEdKWkt7esC35vp3yRV5fnOkBT6OrGP zCtTrv1/182ATN0kOBLqH0cV4qqNIBcN+UOnK+ap8J23R7g+v5n7j42hpQPeBKgSqP7i PhTg== X-Forwarded-Encrypted: i=1; AKwUvBwpNubzgz6JooGpdZcjE/S9hw7j52TpgveI3u//jxQ3GP6Z/xGFU7PmUfvn1JHocq4K7wwxD4qTKsNc1kA=@vger.kernel.org X-Gm-Message-State: AFuF++nuiFgUj+VsbLqELoXUvz3uDRhXpbRAgZ/RMolHnxBn7VT2RFkB 6klvbM9jPm4DC5OKr6+jnc51jbevSelLjQrBdlYojyozMmdeyVrhzDBIzaW1NNzhUzx3OXBp0YR 3iLevcRcRDRj4lmkjrtCD+bkySbTT+JNCyjdClzBPQlGVDuPbaVs4dVNwAiDbWmOUIQ== X-Gm-Gg: AYBFou2S6qA69jJE1sXXyEhXNzDwsxIetlgyU+QRWZ9xrpQQUZZcFFMG/DXs4zNt4Zr KOA0uOOcsYItKu2wxpvb/6pIcfSPxvkWiwTIEffQS9ykTRwsM4Z29sk3+o+kpdewnKGrh+lrH+M kWhDV2KBe2t756EyB7ZPBU2puYUVwTwFPgDHATktOB/quwimRiUu2xktLzBLf+aoGp7VbC1pugJ 2GefFNj24peCSsJXxdFKUyHJkZDKi7RHVwGz1Wr433ofNOCMrRA92GYa0HSRQHMK8c2tJh6J7Dl vXd5udpVl8Q/mdSFCOxaYyhiIkavwMK+lcjnAQXWVnK0qSvW1rsjJ7Y+pN2qO4wvLZ5A7FxoKrP PAPyYkpakcbWsAMSvCycNslzMksOTKq2dmPqMQR12u4yjmET/BDUFNbY/bvhs7bfdh0Jvdorf1K F5YEKUES9FiQsPaujAFDzBDA== X-Received: by 2002:a05:7301:201d:b0:314:267f:46e2 with SMTP id 5a478bee46e88-34005c61551mr678904eec.20.1790217710636; Wed, 23 Sep 2026 19:41:50 -0700 (PDT) X-Received: by 2002:a05:7301:201d:b0:314:267f:46e2 with SMTP id 5a478bee46e88-34005c61551mr678884eec.20.1790217709863; Wed, 23 Sep 2026 19:41:49 -0700 (PDT) Received: from hu-pooventh-blr.qualcomm.com (blr-bdr-fw-01_GlobalNAT_AllZones-Outside.qualcomm.com. [103.229.18.19]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-33e96258351sm9692263eec.12.2026.09.23.19.41.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 23 Sep 2026 19:41:49 -0700 (PDT) From: Pooventhiran G Date: Thu, 24 Sep 2026 08:10:43 +0530 Subject: [PATCH wireless-next v2 06/16] wifi: nl80211/mac80211: Add SMD BSS Transition sub-state STA flags Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260924-smd-v2-6-bb40094da1d4@oss.qualcomm.com> References: <20260924-smd-v2-0-bb40094da1d4@oss.qualcomm.com> In-Reply-To: <20260924-smd-v2-0-bb40094da1d4@oss.qualcomm.com> To: Johannes Berg , Kees Cook , "Gustavo A. R. Silva" Cc: linux-wireless@vger.kernel.org, linux-kernel@vger.kernel.org, linux-hardening@vger.kernel.org, pooventhiran.g@oss.qualcomm.com X-Mailer: b4 0.14.3 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTI0MDAxMiBTYWx0ZWRfX9vmvDOKEcgRe OFt/bhim6GnDXSWVBaBAkmctGlboo1LgNOXCfp6r4lOp8CSYnjEFzq2rNri8yYeleKh+Z5sQ2LT o3Hpe70M9tnNnVEKHQZx5vQgY92jBTKjrYTxJMf6fc04+2vrgO/c9Mf5IRyGwji1ACbXQuDpHFl aWOQ3URfRdmuZvtIWGLwQAla6bcc5xVQE7Ob82xTa8VByPtVUN7wREKb9//0EaI7h4LQm+mLkwg y6j7hy0pc/If+9trgoylzMef7Ao0XbUQAQUex0i+HOk6uA7aZMbUogACq3fE1HG7vLvX8AlpwGk xfcly6u7CXKKYWxQmAsMOQrR35FwCS5X4+yyoK7C3llV4GuaA87Ne7imNArcPJY/bU4Mr08UWXB R8IniNlYauKFQUE4Y8IS1ijxiRATXdcw9UVJUG5TQb1JkiW7V4ELLgb4198MyV+3HTrR4eCVtXF FGukVthCe7QY7i+urHw== X-Authority-Analysis: v=2.4 cv=aIxlOr9m c=1 sm=1 tr=0 ts=6ab48def cx=c_pps a=wEP8DlPgTf/vqF+yE6f9lg==:117 a=Ou0eQOY4+eZoSc0qltEV5Q==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=DJpcGTmdVt4CTyJn9g5Z:22 a=EUspDBNiAAAA:8 a=jLbTusTt1GuB8y0ejZAA:9 a=QEXdDO2ut3YA:10 a=bBxd6f-gb0O0v-kibOvt:22 X-Proofpoint-GUID: VOtUt3ZzgjmIVSScPwxlgEVP_HbHPjjg X-Proofpoint-Spam-Info: AW1haW4tMjYwOTI0MDAxMiBTYWx0ZWRfX/7rj63jNWGxU MOsk+JtioWsGo0NzM2scI5wcpAAAXATtBr2Ms+3c7wTmoCWwsu9jP63rpSwBEtT71zAnCrqVJkW QkzckOEwc+p/E0JoCFOrHjOs3ReiyDg= X-Proofpoint-ORIG-GUID: VOtUt3ZzgjmIVSScPwxlgEVP_HbHPjjg X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-24_01,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 suspectscore=0 priorityscore=1501 spamscore=0 phishscore=0 malwarescore=0 lowpriorityscore=0 adultscore=0 bulkscore=0 clxscore=1015 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609240012 IEEE P802.11bn/D2.0, Aug 2026, subclause 11.3.1, defines three new MLD state sub-states (4a, 4b, 4c) that apply when a non-AP MLD and its associated SMD-ME are in state 4 and an SMD BSS Transition is in progress. Add the corresponding nl80211 STA flags and internal STA flags to track the SMD BSS Transition sub-states (4a, 4b, or 4c) in mac80211: - NL80211_STA_FLAG_SMD_PREP_TARGET (WLAN_STA_SMD_PREP_TARGET): State 4a: non-AP MLD is prepared with target AP MLD - NL80211_STA_FLAG_SMD_EXEC_CURRENT (WLAN_STA_SMD_EXEC_CURRENT): State 4b: ST execution active on current AP MLD - NL80211_STA_FLAG_SMD_DL_DRAIN (WLAN_STA_SMD_DL_DRAIN): State 4c: DL draining period These are transient sub-states of WLAN_STA_AUTHORIZED with the SMD-ME. The station remains authenticated, associated, and RSNA-established throughout. At most one of the three may be set at a time; mutual exclusion is enforced in sta_apply_smd_state_flags(). Signed-off-by: Pooventhiran G --- include/uapi/linux/nl80211.h | 9 +++++++ net/mac80211/cfg.c | 60 ++++++++++++++++++++++++++++++++++++++++= ++++ net/mac80211/debugfs_sta.c | 3 +++ net/mac80211/sta_info.h | 8 ++++++ net/wireless/nl80211.c | 18 ++++++++++--- 5 files changed, 94 insertions(+), 4 deletions(-) diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h index 3f9acbd4830f..cd9a320143d7 100644 --- a/include/uapi/linux/nl80211.h +++ b/include/uapi/linux/nl80211.h @@ -3973,6 +3973,12 @@ enum nl80211_iftype { * previously added station into associated state * @NL80211_STA_FLAG_SPP_AMSDU: station supports SPP A-MSDUs * @NL80211_STA_FLAG_SMD: station has negotiated SMD. + * @NL80211_STA_FLAG_SMD_PREP_TARGET: station is prepared at SMD target AP= MLD + * (State 4a). + * @NL80211_STA_FLAG_SMD_EXEC_CURRENT: current AP MLD is executing SMD BSS + * Transition (State 4b). + * @NL80211_STA_FLAG_SMD_DL_DRAIN: current AP MLD is in DL draining period + * (State 4c). * @NL80211_STA_FLAG_MAX: highest station flag number currently defined * @__NL80211_STA_FLAG_AFTER_LAST: internal use */ @@ -3987,6 +3993,9 @@ enum nl80211_sta_flags { NL80211_STA_FLAG_ASSOCIATED, NL80211_STA_FLAG_SPP_AMSDU, NL80211_STA_FLAG_SMD, + NL80211_STA_FLAG_SMD_PREP_TARGET, + NL80211_STA_FLAG_SMD_EXEC_CURRENT, + NL80211_STA_FLAG_SMD_DL_DRAIN, =20 /* keep last */ __NL80211_STA_FLAG_AFTER_LAST, diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c index 138b67f4bda4..69b3ac0b48f3 100644 --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c @@ -2452,6 +2452,55 @@ static int sta_link_apply_parameters(struct ieee8021= 1_local *local, return 0; } =20 +static int sta_apply_smd_state_flags(struct sta_info *sta, + u32 mask, u32 set) +{ + bool smd_prep_target, smd_exec_current, smd_dl_drain; + u32 expected_mask =3D BIT(NL80211_STA_FLAG_SMD_PREP_TARGET) | + BIT(NL80211_STA_FLAG_SMD_EXEC_CURRENT) | + BIT(NL80211_STA_FLAG_SMD_DL_DRAIN); + u32 smd_flags; + + if (!(mask & expected_mask)) + return 0; + + smd_flags =3D mask & expected_mask & set; + if (WARN_ON(hweight32(smd_flags) > 1)) + return -EINVAL; + + smd_prep_target =3D + !!(smd_flags & BIT(NL80211_STA_FLAG_SMD_PREP_TARGET)); + smd_exec_current =3D + !!(smd_flags & BIT(NL80211_STA_FLAG_SMD_EXEC_CURRENT)); + smd_dl_drain =3D + !!(smd_flags & BIT(NL80211_STA_FLAG_SMD_DL_DRAIN)); + + if (!test_sta_flag(sta, WLAN_STA_AUTHORIZED) && + (smd_exec_current || smd_dl_drain)) + return -EINVAL; + + if (smd_prep_target) { + clear_sta_flag(sta, WLAN_STA_SMD_EXEC_CURRENT); + clear_sta_flag(sta, WLAN_STA_SMD_DL_DRAIN); + set_sta_flag(sta, WLAN_STA_SMD_PREP_TARGET); + } else if (smd_exec_current) { + clear_sta_flag(sta, WLAN_STA_SMD_PREP_TARGET); + clear_sta_flag(sta, WLAN_STA_SMD_DL_DRAIN); + set_sta_flag(sta, WLAN_STA_SMD_EXEC_CURRENT); + } else if (smd_dl_drain) { + clear_sta_flag(sta, WLAN_STA_SMD_PREP_TARGET); + clear_sta_flag(sta, WLAN_STA_SMD_EXEC_CURRENT); + set_sta_flag(sta, WLAN_STA_SMD_DL_DRAIN); + } else { + /* all flags revert back to none being set */ + clear_sta_flag(sta, WLAN_STA_SMD_PREP_TARGET); + clear_sta_flag(sta, WLAN_STA_SMD_EXEC_CURRENT); + clear_sta_flag(sta, WLAN_STA_SMD_DL_DRAIN); + } + + return 0; +} + static int sta_apply_parameters(struct ieee80211_local *local, struct sta_info *sta, struct station_parameters *params) @@ -2538,6 +2587,17 @@ static int sta_apply_parameters(struct ieee80211_loc= al *local, if (params->smd_params.smd_sta) sta->sta.smd_params =3D params->smd_params; =20 + /* + * SMD BSS Transition sub-states (IEEE P802.11bn/D2.0, Aug 2026, + * subclause 11.3.1). + * Only meaningful for SMD-capable stations (WLAN_STA_SMD set). + */ + if (test_sta_flag(sta, WLAN_STA_SMD)) { + ret =3D sta_apply_smd_state_flags(sta, mask, set); + if (ret) + return ret; + } + /* mark TDLS channel switch support, if the AP allows it */ if (test_sta_flag(sta, WLAN_STA_TDLS_PEER) && !sdata->deflink.u.mgd.tdls_chan_switch_prohibited && diff --git a/net/mac80211/debugfs_sta.c b/net/mac80211/debugfs_sta.c index d7e7c9c578e4..24c985687bd2 100644 --- a/net/mac80211/debugfs_sta.c +++ b/net/mac80211/debugfs_sta.c @@ -79,6 +79,9 @@ static const char * const sta_flag_names[] =3D { FLAG(USES_ENCRYPTION), FLAG(DECAP_OFFLOAD), FLAG(SMD), + FLAG(SMD_PREP_TARGET), + FLAG(SMD_EXEC_CURRENT), + FLAG(SMD_DL_DRAIN), #undef FLAG }; =20 diff --git a/net/mac80211/sta_info.h b/net/mac80211/sta_info.h index 506aeb241a6d..89137b18a862 100644 --- a/net/mac80211/sta_info.h +++ b/net/mac80211/sta_info.h @@ -73,6 +73,11 @@ * so drop all packets without a key later. * @WLAN_STA_DECAP_OFFLOAD: This station uses rx decap offload * @WLAN_STA_SMD: this station is associated to an SMD-ME. + * @WLAN_STA_SMD_PREP_TARGET: this SMD station is prepared at the target A= P MLD. + * @WLAN_STA_SMD_EXEC_CURRENT: this SMD station has started execution at + * the current AP MLD. + * @WLAN_STA_SMD_DL_DRAIN: this SMD station has started draining at + * the current AP MLD. * * @NUM_WLAN_STA_FLAGS: number of defined flags */ @@ -106,6 +111,9 @@ enum ieee80211_sta_info_flags { WLAN_STA_USES_ENCRYPTION, WLAN_STA_DECAP_OFFLOAD, WLAN_STA_SMD, + WLAN_STA_SMD_PREP_TARGET, + WLAN_STA_SMD_EXEC_CURRENT, + WLAN_STA_SMD_DL_DRAIN, =20 NUM_WLAN_STA_FLAGS, }; diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index eee6ef08950d..26277b3352ae 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c @@ -7708,6 +7708,9 @@ static const struct nla_policy sta_flags_policy[NL802= 11_STA_FLAG_MAX + 1] =3D { [NL80211_STA_FLAG_AUTHENTICATED] =3D { .type =3D NLA_FLAG }, [NL80211_STA_FLAG_TDLS_PEER] =3D { .type =3D NLA_FLAG }, [NL80211_STA_FLAG_SMD] =3D { .type =3D NLA_FLAG }, + [NL80211_STA_FLAG_SMD_PREP_TARGET] =3D { .type =3D NLA_FLAG }, + [NL80211_STA_FLAG_SMD_EXEC_CURRENT] =3D { .type =3D NLA_FLAG }, + [NL80211_STA_FLAG_SMD_DL_DRAIN] =3D { .type =3D NLA_FLAG }, }; =20 static int parse_station_flags(struct genl_info *info, @@ -7774,7 +7777,11 @@ static int parse_station_flags(struct genl_info *inf= o, switch (iftype) { case NL80211_IFTYPE_AP: case NL80211_IFTYPE_AP_VLAN: - params->sta_flags_mask =3D BIT(NL80211_STA_FLAG_SMD); + params->sta_flags_mask =3D + BIT(NL80211_STA_FLAG_SMD) | + BIT(NL80211_STA_FLAG_SMD_PREP_TARGET) | + BIT(NL80211_STA_FLAG_SMD_EXEC_CURRENT) | + BIT(NL80211_STA_FLAG_SMD_DL_DRAIN); fallthrough; case NL80211_IFTYPE_P2P_GO: params->sta_flags_mask |=3D BIT(NL80211_STA_FLAG_AUTHORIZED) | @@ -8921,7 +8928,7 @@ int cfg80211_check_station_change(struct wiphy *wiphy, return -EINVAL; =20 /* When you run into this, adjust the code below for the new flag */ - BUILD_BUG_ON(NL80211_STA_FLAG_MAX !=3D 9); + BUILD_BUG_ON(NL80211_STA_FLAG_MAX !=3D 12); =20 switch (statype) { case CFG80211_STA_MESH_PEER_KERNEL: @@ -9016,7 +9023,10 @@ int cfg80211_check_station_change(struct wiphy *wiph= y, BIT(NL80211_STA_FLAG_WME) | BIT(NL80211_STA_FLAG_MFP) | BIT(NL80211_STA_FLAG_SPP_AMSDU) | - BIT(NL80211_STA_FLAG_SMD))) + BIT(NL80211_STA_FLAG_SMD) | + BIT(NL80211_STA_FLAG_SMD_PREP_TARGET) | + BIT(NL80211_STA_FLAG_SMD_EXEC_CURRENT) | + BIT(NL80211_STA_FLAG_SMD_DL_DRAIN))) return -EINVAL; =20 /* but authenticated/associated only if driver handles it */ @@ -9703,7 +9713,7 @@ static int nl80211_new_station(struct sk_buff *skb, s= truct genl_info *info) return -EINVAL; =20 /* When you run into this, adjust the code below for the new flag */ - BUILD_BUG_ON(NL80211_STA_FLAG_MAX !=3D 9); + BUILD_BUG_ON(NL80211_STA_FLAG_MAX !=3D 12); =20 switch (wdev->iftype) { case NL80211_IFTYPE_AP: --=20 2.34.1 From nobody Thu Sep 24 13:39:02 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (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 94B603B6C13 for ; Thu, 24 Sep 2026 02:41:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790217720; cv=none; b=lDRrd7vvqJ1vLgEkxiVEcneolf/s6ywd8mqd/+4mwVqTwWpicO62kzPjBcUO6RidsM5Hmsm1oUN9M3reKehFpe4dOlZUkgIQpXJCfuSgdtBQfJxz3M3CupevV0LZoPFhZVnpLz5AkeR68kHv80vlYGro9DgRFU53jr5++zgnEIQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790217720; c=relaxed/simple; bh=B09U8gOZesMCEBzvTLZSwdhDuHEUPOCrldRVojuw5F4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=cznf7nsx7lErRXKl9yoNEeufexs07RhWf0MJlVHJWyJG7gZb1/I1kYYd7T9DotUev794gLHwfOTk/Z8r2rqC3GFzP7ZiWsIqhwjU2odIuVfPdNBgJIJYmuh2VedILPe9Aq7ru6gD6+EtTClMT0tFxU/Nb+HIKU+I+0lM3iVE9N4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=j3VCF13B; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=B1YbnH+7; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="j3VCF13B"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="B1YbnH+7" Received: from pps.filterd (m0279869.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68O2KLHW1317311 for ; Thu, 24 Sep 2026 02:41:55 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= dqQFvCpqMmcYteEOAfp8FU0jNTDNQtjxvly1IY7Ldd8=; b=j3VCF13B4AMlpOdO QlHePRwQfsGPQZCLSmlN6/FTNtn2RuB7SHjhiqGO56aSqlv8i/3j52vDD2H3JPbh YgBX9vPEnFTXgUNYbaP/azE0bl5HgHRBlX/gHipCkbez2ww6+NRqkHHBeDRq1yBC OoJFmkftmEEs4T25dnwGI6JHXSd3LwXU5jexujZCGqXLH1gJTxb73EdKHicySgmZ z4UTby656ecl73b0/RtO6FiBmunAUB2TVlLrQxkvc3GxnJkTBJYZ25P4n1HK5vY0 GB6yoPjd9pLd0mQpwLtLDvG9UzLubnyZOBFVKy7LnTPqTdiVteb+DNYydjeP8vIk lQHB9w== Received: from mail-dy1-f197.google.com (mail-dy1-f197.google.com [74.125.82.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4gvfkbjwfq-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 24 Sep 2026 02:41:55 +0000 (GMT) Received: by mail-dy1-f197.google.com with SMTP id 5a478bee46e88-30c0d568830so2909213eec.1 for ; Wed, 23 Sep 2026 19:41:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1790217714; x=1790822514; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=dqQFvCpqMmcYteEOAfp8FU0jNTDNQtjxvly1IY7Ldd8=; b=B1YbnH+73zcBDLFnjK5lkh1zDoD9ARXPQEIQEE4ehs43T6QqY57p6My1Fmc89S67c9 n5C8/gyVK6gBVtKb98l1aX2oyYEICvMShQtOeROCjiTz7MCGBxBcuOgbid4i+b1rHWGo XOId4v8zFA6iD3KCsOzVj12Fg5PONPsFrcBcSCngS0rhXLFfdYbyoU0BlTCJgUE8/YPA 3ntR8F5ulF6bSMJdKwSso10gwrgOkRIAH86hKNRcRAWYKKeyqwoDXArgMMwfICl1sGKq 4RwfszEn7oqT8cintxmXEmvrQ39MS9l3RaoQlpRT55yX/+Ok8mAL2IzUiBI1rdHelalm C8nQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790217714; x=1790822514; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=dqQFvCpqMmcYteEOAfp8FU0jNTDNQtjxvly1IY7Ldd8=; b=1eT//VoXX1E0vQDB6PMyRY6Ya/rhNkUbaM3j7UmudQOo5W1WdAex4sKyefVzXGeQFf cPlpXPrvZsDE7NobGitCHvY7b3yLeuo5cW/B2eHdAKJd0l2BvAq2YTF5XU38WOlE+RW0 htlKD8RMvKJbg62wynJQWJzUlgevAVc6FXhTf4f4o7i4zlSZLT7pddjtBRYxMc06zhd1 JLwI28AzHUomN5sdTg6nfm2hS78pR2LLdJzermfpxha9WMljboubF4Gx/mYl+iPxhVtb x2DkAFBdoH4fsl2PkOPG4LgXJAQPqKOvufH363EhhYgh7tAKZhjhppATS+NrXLiE4qh8 B6Hg== X-Forwarded-Encrypted: i=1; AKwUvBxlGAaFCMzQjpSsZBmpGpZ69nUPlwzb76NpspFhlLEeaBSioOj4Fkawne4TeCqRXxQvPxJJHehaOXj8Fj4=@vger.kernel.org X-Gm-Message-State: AFuF++lCyV3Kdw4w8zVZ1lnnal8Msd9zes9K62QrIR+Tax5SKi1vktjk z3QAyzPgDt5ZzXRTE+ibIgvyMCoQhP9AsSd8d3cANIPmbMlo5FEc5nZQRgwa3t2mRmSOUfKuw6e 3qo4xODKAD/T7W1Wx40vqUCEAmiOWa0nKhylhSnobA4n/MUczT6lJZcRPajuE1No5qA== X-Gm-Gg: AYBFou3StrFTXzstbsmDYxRyT4s5ux5nTTPOhncT7MrG95BLs4bYNJGKfYJ2MNj4jxc NP2o+mc4AiYtIUJycO7wqQuyqHqx2fs4YsKbu+5pg7PqTRCqEIXeaVvmgbqd8HTHjArkn7YPIdI DMGbUGPKwJ3SBUnCgI4q6Mfi7wWK0XhwtKpWhBESF0nFqfVaGEDiS294cXxtlZPvPgG+SLkYh39 cI78jZFAcIvJHndtcETIlmM40Rw885jSsUkQcUM44XrSKOrzTV+N1C5KhleezXcGyszl5SDh+IJ MxmHKoJ2biNHOmr9rbt1UMNEZDpiRdIOJCrVmozg1edhbTGQwPumkq4RJ5S5NlVwIUYsi7oAVJ+ GpTQ7Cdi3U7A/iI5hsRPVBccFiD0GReJ+tJJq7lYfbqL5/9NATOqp22wEsP80jBcTK+aafMhfpp JnKbsI1dduoZsuZdsKYXsu9Q== X-Received: by 2002:a05:7301:4282:b0:33c:e72:5b3c with SMTP id 5a478bee46e88-3400044a1c3mr757566eec.26.1790217713767; Wed, 23 Sep 2026 19:41:53 -0700 (PDT) X-Received: by 2002:a05:7301:4282:b0:33c:e72:5b3c with SMTP id 5a478bee46e88-3400044a1c3mr757548eec.26.1790217713016; Wed, 23 Sep 2026 19:41:53 -0700 (PDT) Received: from hu-pooventh-blr.qualcomm.com (blr-bdr-fw-01_GlobalNAT_AllZones-Outside.qualcomm.com. [103.229.18.19]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-33e96258351sm9692263eec.12.2026.09.23.19.41.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 23 Sep 2026 19:41:52 -0700 (PDT) From: Pooventhiran G Date: Thu, 24 Sep 2026 08:10:44 +0530 Subject: [PATCH wireless-next v2 07/16] wifi: mac80211: Add driver_op for SMD substate changes Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260924-smd-v2-7-bb40094da1d4@oss.qualcomm.com> References: <20260924-smd-v2-0-bb40094da1d4@oss.qualcomm.com> In-Reply-To: <20260924-smd-v2-0-bb40094da1d4@oss.qualcomm.com> To: Johannes Berg , Kees Cook , "Gustavo A. R. Silva" Cc: linux-wireless@vger.kernel.org, linux-kernel@vger.kernel.org, linux-hardening@vger.kernel.org, pooventhiran.g@oss.qualcomm.com X-Mailer: b4 0.14.3 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTI0MDAxMiBTYWx0ZWRfX9ttiQzXHariR 2H7rNCbbsYfEX5IckjQ9k01/4APISiBSD713M6h0NTY1ip+/8PonM/98Vp7I46+Zo3axIoAufmZ w29jCKz6NceMIx7y3nekWNWpa9bRVB4= X-Proofpoint-GUID: D1-4t8XFsfmAz5qDV9ciI2vVVxgLOjeL X-Authority-Analysis: v=2.4 cv=RYMFmFtv c=1 sm=1 tr=0 ts=6ab48df3 cx=c_pps a=Uww141gWH0fZj/3QKPojxA==:117 a=Ou0eQOY4+eZoSc0qltEV5Q==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=_glEPmIy2e8OvE2BGh3C:22 a=EUspDBNiAAAA:8 a=uScroKfZLg1nAwDi7sIA:9 a=QEXdDO2ut3YA:10 a=O8hF6Hzn-FEA:10 a=PxkB5W3o20Ba91AHUih5:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTI0MDAxMiBTYWx0ZWRfX04y4QeeMAOep rrLvcSU98fhHRpOO9UkjckJaEBeMaIWjvsQtwaWD+tLZnhlt2NCN0h0i4AoFD8F/KOsQJsqNoIA ATScOUbxxyxWg2GIzc4b8RoeUpmayIJCT9wKNBW+RUfIHvIsBpmgb+taoS9OSWBiiESyMdUNwkc Z9cfmG4DFaRUaV/JuLXfkCwmFoN6vna+YkX8ShJz3bK49DItsKkU87R5WKrr9jAes4zpY6dzEFe 0XOMab630GGkGZs7MO9+fi8gEsAMeVV0ZuNzRI8VtnqQcWd+JvlVQosMqp+hFOL/c0bYSHyZRjB PiCedOegFhngiA7a0ozGW3K3wqgwsruHuMmTaNfQZ26wpuZeFuuhtHSPE8G5Mre5nE8ZwE5jVoo A/iypr5foxU9WmfNnmMguy3j2spaXsuzfa7K9RjuY7f3OwkKcs/AEYA5TCApl/d8eQsXjM2cpi5 Cq/cmS/1d2d4x3mNN4g== X-Proofpoint-ORIG-GUID: D1-4t8XFsfmAz5qDV9ciI2vVVxgLOjeL X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-24_01,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 suspectscore=0 clxscore=1015 priorityscore=1501 phishscore=0 adultscore=0 impostorscore=0 lowpriorityscore=0 bulkscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609240012 During SMD BSS Transition, a non-AP MLD moves through sub-states 4a, 4b, and 4c that impose different frame-filtering rules on the AP MLD. Add a new driver op that mac80211 calls on each sub-state transition. This lets drivers perform the necessary hardware queue and filtering adjustments at each phase of the SMD BSS Transition. Valid transition order: NONE -> PREP (ST preparation completed at the target AP MLD) NONE -> EXEC (ST execution in progress at the current AP MLD) EXEC -> DRAIN (DL drain period started at the current AP MLD) Suggested-by: Rohan Dutta Signed-off-by: Pooventhiran G --- include/net/mac80211.h | 26 +++++++++ net/mac80211/cfg.c | 59 ++++++++++++++----- net/mac80211/driver-ops.c | 24 ++++++++ net/mac80211/driver-ops.h | 6 ++ net/mac80211/sta_info.c | 140 ++++++++++++++++++++++++++++++++++++++++++= ++++ net/mac80211/sta_info.h | 9 +++ net/mac80211/trace.h | 33 +++++++++++ 7 files changed, 284 insertions(+), 13 deletions(-) diff --git a/include/net/mac80211.h b/include/net/mac80211.h index 39d67c054ae6..03b75eead766 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h @@ -4076,6 +4076,24 @@ struct ieee80211_prep_tx_info { int link_id; }; =20 +/** + * enum ieee80211_sta_smd_state - SMD BSS Transition sub-state + * + * Tracks the 802.11bn SMD BSS Transition sub-state (IEEE P802.11bn/D2.0, + * Aug 2026, subclause 11.3.1) for a specific (non-AP MLD, AP MLD) associa= tion. + * + * @IEEE80211_STA_SMD_NONE: Plain State 4. No sub-state active. + * @IEEE80211_STA_SMD_PREP: State 4a. STA prepared at the target AP MLD + * @IEEE80211_STA_SMD_EXEC: State 4b. ST execution active at the current = AP MLD + * @IEEE80211_STA_SMD_DRAIN: State 4c. DL draining period at the current A= P MLD + */ +enum ieee80211_sta_smd_state { + IEEE80211_STA_SMD_NONE, + IEEE80211_STA_SMD_PREP, + IEEE80211_STA_SMD_EXEC, + IEEE80211_STA_SMD_DRAIN, +}; + /** * struct ieee80211_ops - callbacks from mac80211 to the driver * @@ -4742,6 +4760,9 @@ struct ieee80211_prep_tx_info { * @set_eml_op_mode: Configure eMLSR/eMLMR operation mode in the underlay * driver according to the parameter received in the EML Operating mode * notification frame. + * @sta_smd_state: Notifies low level driver about IEEE 802.11bn SMD subst= ate + * transition of a station. It must not fail while transitioning down. + * The callback can sleep. */ struct ieee80211_ops { void (*tx)(struct ieee80211_hw *hw, @@ -5143,6 +5164,11 @@ struct ieee80211_ops { struct ieee80211_vif *vif, struct ieee80211_sta *sta, struct ieee80211_eml_params *eml_params); + int (*sta_smd_state)(struct ieee80211_hw *hw, + struct ieee80211_vif *vif, + struct ieee80211_sta *sta, + enum ieee80211_sta_smd_state old_state, + enum ieee80211_sta_smd_state new_state); }; =20 /** diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c index 69b3ac0b48f3..0ea8b610a771 100644 --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c @@ -2459,7 +2459,9 @@ static int sta_apply_smd_state_flags(struct sta_info = *sta, u32 expected_mask =3D BIT(NL80211_STA_FLAG_SMD_PREP_TARGET) | BIT(NL80211_STA_FLAG_SMD_EXEC_CURRENT) | BIT(NL80211_STA_FLAG_SMD_DL_DRAIN); + enum ieee80211_sta_smd_state new_ss; u32 smd_flags; + int err; =20 if (!(mask & expected_mask)) return 0; @@ -2479,6 +2481,22 @@ static int sta_apply_smd_state_flags(struct sta_info= *sta, (smd_exec_current || smd_dl_drain)) return -EINVAL; =20 + if (smd_prep_target) + new_ss =3D IEEE80211_STA_SMD_PREP; + else if (smd_exec_current) + new_ss =3D IEEE80211_STA_SMD_EXEC; + else if (smd_dl_drain) + new_ss =3D IEEE80211_STA_SMD_DRAIN; + else + new_ss =3D IEEE80211_STA_SMD_NONE; + + if (new_ss =3D=3D sta->smd_state) + return 0; + + err =3D sta_info_move_smd_state(sta, new_ss, true); + if (err) + return err; + if (smd_prep_target) { clear_sta_flag(sta, WLAN_STA_SMD_EXEC_CURRENT); clear_sta_flag(sta, WLAN_STA_SMD_DL_DRAIN); @@ -2578,26 +2596,17 @@ static int sta_apply_parameters(struct ieee80211_lo= cal *local, sta->sta.spp_amsdu =3D set & BIT(NL80211_STA_FLAG_SPP_AMSDU); =20 if (mask & BIT(NL80211_STA_FLAG_SMD)) { - if (set & BIT(NL80211_STA_FLAG_SMD)) + if (set & BIT(NL80211_STA_FLAG_SMD)) { set_sta_flag(sta, WLAN_STA_SMD); - else if (test_sta_flag(sta, WLAN_STA_SMD)) + } else if (test_sta_flag(sta, WLAN_STA_SMD)) { + sta_info_reset_smd_state(sta, true); clear_sta_flag(sta, WLAN_STA_SMD); + } } =20 if (params->smd_params.smd_sta) sta->sta.smd_params =3D params->smd_params; =20 - /* - * SMD BSS Transition sub-states (IEEE P802.11bn/D2.0, Aug 2026, - * subclause 11.3.1). - * Only meaningful for SMD-capable stations (WLAN_STA_SMD set). - */ - if (test_sta_flag(sta, WLAN_STA_SMD)) { - ret =3D sta_apply_smd_state_flags(sta, mask, set); - if (ret) - return ret; - } - /* mark TDLS channel switch support, if the AP allows it */ if (test_sta_flag(sta, WLAN_STA_TDLS_PEER) && !sdata->deflink.u.mgd.tdls_chan_switch_prohibited && @@ -2699,6 +2708,17 @@ static int sta_apply_parameters(struct ieee80211_loc= al *local, return ret; } =20 + /* + * SMD BSS Transition sub-states (IEEE P802.11bn/D2.0, Aug 2026, + * subclause 11.3.1). + * Only meaningful for SMD-capable stations (WLAN_STA_SMD set). + */ + if (test_sta_flag(sta, WLAN_STA_SMD)) { + ret =3D sta_apply_smd_state_flags(sta, mask, set); + if (ret) + return ret; + } + /* Mark the STA as MLO if MLD MAC address is available */ if (params->link_sta_params.mld_mac) sta->sta.mlo =3D true; @@ -2783,6 +2803,19 @@ static int ieee80211_add_station(struct wiphy *wiphy= , struct wireless_dev *wdev, */ if (!err && sdata->vif.type =3D=3D NL80211_IFTYPE_NAN_DATA) ieee80211_nan_update_ndi_carrier(sta->sdata); + + /* + * SMD sub-state was set in sta_apply_parameters() before the station + * was inserted so drv_sta_smd_state() was skipped (WLAN_STA_INSERTED + * was not yet set). Walk the driver step-by-step to the target state. + */ + if (!err && test_sta_flag(sta, WLAN_STA_SMD) && + sta->smd_state !=3D IEEE80211_STA_SMD_NONE) { + err =3D sta_info_move_drv_smd_state(sta); + if (err) + WARN_ON(__sta_info_destroy(sta)); + } + return err; } =20 diff --git a/net/mac80211/driver-ops.c b/net/mac80211/driver-ops.c index 49753b73aba2..d77a5a80f06e 100644 --- a/net/mac80211/driver-ops.c +++ b/net/mac80211/driver-ops.c @@ -633,3 +633,27 @@ int drv_change_sta_links(struct ieee80211_local *local, =20 return 0; } + +int drv_sta_smd_state(struct ieee80211_local *local, + struct ieee80211_sub_if_data *sdata, + struct ieee80211_sta *sta, + enum ieee80211_sta_smd_state old_state, + enum ieee80211_sta_smd_state new_state) +{ + int ret =3D 0; + + might_sleep(); + lockdep_assert_wiphy(local->hw.wiphy); + + sdata =3D get_bss_sdata(sdata); + if (!check_sdata_in_driver(sdata)) + return -EIO; + + trace_drv_sta_smd_state(local, sdata, sta, old_state, new_state); + if (local->ops->sta_smd_state) + ret =3D local->ops->sta_smd_state(&local->hw, &sdata->vif, + sta, old_state, new_state); + trace_drv_return_int(local, ret); + + return ret; +} diff --git a/net/mac80211/driver-ops.h b/net/mac80211/driver-ops.h index f1c0b87fddd5..ce11a723ec36 100644 --- a/net/mac80211/driver-ops.h +++ b/net/mac80211/driver-ops.h @@ -1814,4 +1814,10 @@ drv_nan_peer_sched_changed(struct ieee80211_local *l= ocal, return ret; } =20 +int drv_sta_smd_state(struct ieee80211_local *local, + struct ieee80211_sub_if_data *sdata, + struct ieee80211_sta *sta, + enum ieee80211_sta_smd_state old_state, + enum ieee80211_sta_smd_state new_state); + #endif /* __MAC80211_DRIVER_OPS */ diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c index fdf00cbf49d8..5aa6f5b481e3 100644 --- a/net/mac80211/sta_info.c +++ b/net/mac80211/sta_info.c @@ -701,6 +701,7 @@ __sta_info_alloc(struct ieee80211_sub_if_data *sdata, ieee80211_init_frag_cache(&sta->frags); =20 sta->sta_state =3D IEEE80211_STA_NONE; + sta->smd_state =3D IEEE80211_STA_SMD_NONE; =20 if (sdata->vif.type =3D=3D NL80211_IFTYPE_MESH_POINT) sta->amsdu_mesh_control =3D -1; @@ -1527,6 +1528,20 @@ static int _sta_info_move_state(struct sta_info *sta, WARN_ONCE(err, "Driver is not allowed to fail if the sta_state is transitioning down= the list: %d\n", err); + + /* revert SMD states if STA has transitioned down */ + if (new_state =3D=3D IEEE80211_STA_AUTH && + sta->sta_state =3D=3D IEEE80211_STA_ASSOC) { + if (test_sta_flag(sta, WLAN_STA_SMD) && + sta->smd_state =3D=3D IEEE80211_STA_SMD_PREP) + sta_info_reset_smd_state(sta, true); + } else if (new_state =3D=3D IEEE80211_STA_ASSOC && + sta->sta_state =3D=3D IEEE80211_STA_AUTHORIZED) { + if (test_sta_flag(sta, WLAN_STA_SMD) && + sta->smd_state !=3D IEEE80211_STA_SMD_NONE && + sta->smd_state !=3D IEEE80211_STA_SMD_PREP) + sta_info_reset_smd_state(sta, true); + } } =20 sta->sta_state =3D new_state; @@ -3883,3 +3898,128 @@ bool ieee80211_link_sta_update_rc_bw(struct ieee802= 11_link_data *link, =20 return true; } + +int sta_info_move_smd_state(struct sta_info *sta, + enum ieee80211_sta_smd_state new_ss, + bool notify) +{ + enum ieee80211_sta_smd_state old_ss =3D sta->smd_state; + struct ieee80211_local *local =3D sta->local; + bool notify_driver; + int err; + + might_sleep(); + + if (old_ss =3D=3D new_ss) + return 0; + + switch (new_ss) { + case IEEE80211_STA_SMD_NONE: + if (old_ss !=3D IEEE80211_STA_SMD_PREP && + old_ss !=3D IEEE80211_STA_SMD_EXEC && + old_ss !=3D IEEE80211_STA_SMD_DRAIN) + return -EINVAL; + break; + case IEEE80211_STA_SMD_EXEC: + if (old_ss !=3D IEEE80211_STA_SMD_NONE) + return -EINVAL; + break; + case IEEE80211_STA_SMD_DRAIN: + if (old_ss !=3D IEEE80211_STA_SMD_EXEC) + return -EINVAL; + break; + case IEEE80211_STA_SMD_PREP: + if (old_ss !=3D IEEE80211_STA_SMD_NONE) + return -EINVAL; + break; + default: + sdata_err(sta->sdata, "invalid smd state %d", new_ss); + return -EINVAL; + } + + sta_dbg(sta->sdata, "moving STA %pM SMD state %u -> %u\n", + sta->sta.addr, old_ss, new_ss); + + notify_driver =3D notify && test_sta_flag(sta, WLAN_STA_INSERTED); + + if (new_ss > old_ss && notify_driver) { + err =3D drv_sta_smd_state(local, sta->sdata, &sta->sta, old_ss, + new_ss); + if (err) + return err; + } + + if (new_ss < old_ss && notify_driver) { + err =3D drv_sta_smd_state(local, sta->sdata, &sta->sta, old_ss, + new_ss); + /* driver should not fail moving down SMD states */ + WARN_ONCE(err, + "Driver should not fail moving down SMD states: %d\n", + err); + } + + sta->smd_state =3D new_ss; + + return 0; +} + +void sta_info_reset_smd_state(struct sta_info *sta, bool notify) +{ + if (sta->smd_state =3D=3D IEEE80211_STA_SMD_NONE) + return; + + /* DRAIN -> NONE, EXEC -> NONE or PREP -> NONE */ + WARN_ON_ONCE(sta_info_move_smd_state(sta, IEEE80211_STA_SMD_NONE, + notify)); + + clear_sta_flag(sta, WLAN_STA_SMD_PREP_TARGET); + clear_sta_flag(sta, WLAN_STA_SMD_EXEC_CURRENT); + clear_sta_flag(sta, WLAN_STA_SMD_DL_DRAIN); +} + +int sta_info_move_drv_smd_state(struct sta_info *sta) +{ + enum ieee80211_sta_smd_state new_ss =3D sta->smd_state; + struct ieee80211_local *local =3D sta->local; + int err =3D 0; + + if (!test_sta_flag(sta, WLAN_STA_INSERTED)) + return 0; + + switch (new_ss) { + case IEEE80211_STA_SMD_PREP: + err =3D drv_sta_smd_state(local, sta->sdata, &sta->sta, + IEEE80211_STA_SMD_NONE, + IEEE80211_STA_SMD_PREP); + if (err) + goto rollback; + break; + case IEEE80211_STA_SMD_EXEC: + case IEEE80211_STA_SMD_DRAIN: + err =3D drv_sta_smd_state(local, sta->sdata, &sta->sta, + IEEE80211_STA_SMD_NONE, + IEEE80211_STA_SMD_EXEC); + if (err) + goto rollback; + + if (new_ss =3D=3D IEEE80211_STA_SMD_DRAIN) + err =3D drv_sta_smd_state(local, sta->sdata, &sta->sta, + IEEE80211_STA_SMD_EXEC, + IEEE80211_STA_SMD_DRAIN); + break; + default: + return -EINVAL; + } + + if (!err) + return 0; + + /* if EXEC -> DRAIN failed in the driver, notify EXEC -> NONE */ + WARN_ON_ONCE(drv_sta_smd_state(local, sta->sdata, &sta->sta, + IEEE80211_STA_SMD_EXEC, + IEEE80211_STA_SMD_NONE)); + +rollback: + sta_info_reset_smd_state(sta, false); + return err; +} diff --git a/net/mac80211/sta_info.h b/net/mac80211/sta_info.h index 89137b18a862..bdc021675727 100644 --- a/net/mac80211/sta_info.h +++ b/net/mac80211/sta_info.h @@ -721,6 +721,7 @@ struct ieee80211_sta_removed_link_stats { * would be assigned to link[link_id] where link_id is the id assigned * by the AP. * @rem_link_stats: accumulated removed link stats + * @smd_state: Sub-state for STAs in SMD BSS Transition */ struct sta_info { /* General information, mostly static */ @@ -797,6 +798,8 @@ struct sta_info { struct link_sta_info __rcu *link[IEEE80211_MLD_MAX_NUM_LINKS]; struct ieee80211_sta_removed_link_stats rem_link_stats; =20 + enum ieee80211_sta_smd_state smd_state; + /* keep last! */ struct ieee80211_sta sta; }; @@ -1169,4 +1172,10 @@ static inline u32 sta_stats_encode_rate(struct ieee8= 0211_rx_status *s) return r; } =20 +int sta_info_move_smd_state(struct sta_info *sta, + enum ieee80211_sta_smd_state new_ss, + bool notify); +void sta_info_reset_smd_state(struct sta_info *sta, bool notify); +int sta_info_move_drv_smd_state(struct sta_info *sta); + #endif /* STA_INFO_H */ diff --git a/net/mac80211/trace.h b/net/mac80211/trace.h index 562a4964afa3..294a8a44a125 100644 --- a/net/mac80211/trace.h +++ b/net/mac80211/trace.h @@ -3403,6 +3403,39 @@ TRACE_EVENT(drv_nan_peer_sched_changed, ) ); =20 +TRACE_EVENT(drv_sta_smd_state, + TP_PROTO(struct ieee80211_local *local, + struct ieee80211_sub_if_data *sdata, + struct ieee80211_sta *sta, + enum ieee80211_sta_smd_state old_state, + enum ieee80211_sta_smd_state new_state), + + TP_ARGS(local, sdata, sta, old_state, new_state), + + TP_STRUCT__entry( + LOCAL_ENTRY + VIF_ENTRY + STA_ENTRY + __field(u32, old_state) + __field(u32, new_state) + ), + + TP_fast_assign( + LOCAL_ASSIGN; + VIF_ASSIGN; + STA_ASSIGN; + __entry->old_state =3D old_state; + __entry->new_state =3D new_state; + ), + + TP_printk( + LOCAL_PR_FMT VIF_PR_FMT STA_PR_FMT + " smd_state: %d->%d", + LOCAL_PR_ARG, VIF_PR_ARG, STA_PR_ARG, + __entry->old_state, __entry->new_state + ) +); + #endif /* !__MAC80211_DRIVER_TRACE || TRACE_HEADER_MULTI_READ */ =20 #undef TRACE_INCLUDE_PATH --=20 2.34.1 From nobody Thu Sep 24 13:39:02 2026 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (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 747CF3D0C18 for ; Thu, 24 Sep 2026 02:41:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790217720; cv=none; b=doKA6ii8pdFfYRr8sJaQRD844GB08rtbcFwlQIerBWWs039vNaE/Kt+kCoTvkzY1n1rz7r+ZzuqfUe9eGXaZDxljDj/0us1OOObq5B0MrE1j0srJbRtbAArcYFns9F6Df/zart8iru1/T5zZ2C6YBUyr6XZJkx6SWQ9OQYOpnnM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790217720; c=relaxed/simple; bh=xGsLNyQlQoDV+Ub/zZp7BYFxqifILtCYTg9z7VysFrc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=bkXx5u7j4B9+klD3GAdYwBmwz+3PJSR1JuhVCijP861b+7suX4GBqoxCeCqU50zuzkmrmCog3A4ii37R1VTDLKDxehKL2OVTJl/WwFvHem0mRVfMpyHQgNSUfvt/Fr7/a02DM63ZAhB3K+7UX14fFf++zz+xZ0u+Zm78ooVROEI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=ZR/5+r0a; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=Y4EMzOCK; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="ZR/5+r0a"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="Y4EMzOCK" Received: from pps.filterd (m0279867.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68O2KLQ01995435 for ; Thu, 24 Sep 2026 02:41:57 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= R2A5S7dXBn8f2uUVD7ehSB6YipngkdXNcYQ7ZXaa4CA=; b=ZR/5+r0aoSNOdZ+I 7vy/9oswEnWZTd70OnS8d74cYf4NdDzgpWRaxBOl2uwycxHj6Bmx2NY7Jwx5uedR uFSuJEaZ7ygeisnMAYMA8FTsr3G95C5+SN517w12Jhz8NirMOgCbCBt/DJ14qjvY 7l8U6A8z0q6CfeOO0Fj2OZJQ+Uj6LQmq5m2XrmjwsurggG0r54zgoI3sSjJL9/xG L+r1jFvRAQexrbNs5cSXvU6sPWFj4YHqX/R14KhJjw8/UB7W7WIjoJpKJRcu4/db rodtwJCxXItBP/RoBEst4/tj+pxAbbMgqEjAzSgC5NDPkV473tTJhP2vByeIa8XZ y5rmXg== Received: from mail-dy1-f197.google.com (mail-dy1-f197.google.com [74.125.82.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4gvstug9m8-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 24 Sep 2026 02:41:57 +0000 (GMT) Received: by mail-dy1-f197.google.com with SMTP id 5a478bee46e88-334f782d1abso476670eec.0 for ; Wed, 23 Sep 2026 19:41:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1790217717; x=1790822517; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=R2A5S7dXBn8f2uUVD7ehSB6YipngkdXNcYQ7ZXaa4CA=; b=Y4EMzOCKvyy4QyxDFJcg2KBWICQcrMQKxME3hvCcA3mkpgu/m2wafpb2vL5jwzFTk7 L6afB3fY0hA3mrL1J9QSPiDxsV/ZwO0NWqBno8lR0fY3Zg3Rud7o7JrIAoO9w6m8UIAe StxAov33eA7YuMVq8JakQx8KmTGpR9bAvyVKpASxhlt43bhpSy1QsQBBflDJVOMdmzLy to5TMo+Zx8AiEcuYQ6GN7IoVfygtQazcRSP3vBhITahQZjlw+qbo61Y3Ctfqo968JMVT 4YzWnbiucctpQsJ+Rb/d8mDcWJu+uOYjUE1OT7NNOzHeom9u4HULxH5XqyoMqWGGFsV7 /dTw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790217717; x=1790822517; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=R2A5S7dXBn8f2uUVD7ehSB6YipngkdXNcYQ7ZXaa4CA=; b=KzislPz/mIuTIW4Zy2xyuAbXyR4qsTptsz/0w/62SBvEWBxWzd7QAgpKIpq4RJTxgE 1r4QfpJGLJnnjemj9L04OqyrE58X6SMMzlZxMxH4hGMn0ZlrH/g1IiqnqbVK0EWnGMRW 1p29+fh6gu68tPtMZlEYF9YESO7/tlAAKvUaN1bOTp1gHaBbJtN43HyAkcUBr3h28zVw 1pi+JHdoFICh+38607hXn5tzgvf0Of6zZL1cc3/8ik6ugNnFzTi/JCHxNMLBxQiCN12X GKwKshfBECITnY+klD329SOoYG57faTM+/2yebzoNTLZaH4yuXaKk7AV112qLa7KhNAK YOlw== X-Forwarded-Encrypted: i=1; AKwUvByGd0OCEPTyacQUSC7vnIGTL/1KoLVj0erVnOys/37kiJqo3+OrESs821jesRP/4mv8XpccHxl0tafAnW8=@vger.kernel.org X-Gm-Message-State: AFuF++mgnH90NoMI89UvrP2Ij9GpXqG/qilLSzdVVICEhxkjsSJ+fZJ4 9puYlgpw0V/lwz6qnYZxlb11+k8BX33pjd9BYT8dw9r+4MdMKialE4zVSTMweNYEhpAnP1W4GNm Y9PjqwYj/7wxDoUcxnO+D6ZY/vgc5DuHUB0dtOIPK68u7G8/yvtZKF+aOLNiY9kTUdA== X-Gm-Gg: AYBFou03veopbCoRANbGPBlTZEjSOqtZuhlMbp6wm5J8vDqaQcxMn1/F5Fxh4K/5twj Y0kUO3DheGE8weIoUwEqivwlmzYme6/AimD7ySwLfQ5PPkMYPYk15woM+wTSCprj6fAQXhUzZG2 pz2xeBgCzY1UA9u0xRTeH2ZFPchrH2CAaYjNJkwPBXvstLg60ryrK+WGuyV4R2pA9Ofa5wCBBw3 adLZMcQRxEXDZ28Bq1n6XUAfh/p8gSwdqjVl5KAD7Dkyb/RK5nNGqr7m4y9SsMgUF+s3HoS5GaD RNUQED9vYOxOxaDMCkQGUdogqBqE0g52PM/J+OV/zz5ZQGL49bpPOyPtx1Jj3rYcbifFGKziEWU Lwn0lL+v8vGfHcgDP5C+Uf5Spi7APKVrIOcJANFbtVwJ4odKHutAVPu5HpaVf2mQC/fQ2hgrNnJ ZKmJcqelrjDawOYixzeR83BA== X-Received: by 2002:a05:7300:ec0a:b0:33c:14c9:c79d with SMTP id 5a478bee46e88-34004b8b5bamr1063035eec.9.1790217716867; Wed, 23 Sep 2026 19:41:56 -0700 (PDT) X-Received: by 2002:a05:7300:ec0a:b0:33c:14c9:c79d with SMTP id 5a478bee46e88-34004b8b5bamr1063017eec.9.1790217716275; Wed, 23 Sep 2026 19:41:56 -0700 (PDT) Received: from hu-pooventh-blr.qualcomm.com (blr-bdr-fw-01_GlobalNAT_AllZones-Outside.qualcomm.com. [103.229.18.19]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-33e96258351sm9692263eec.12.2026.09.23.19.41.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 23 Sep 2026 19:41:55 -0700 (PDT) From: Pooventhiran G Date: Thu, 24 Sep 2026 08:10:45 +0530 Subject: [PATCH wireless-next v2 08/16] wifi: mac80211: Send BlockAck policy in AMPDU action Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260924-smd-v2-8-bb40094da1d4@oss.qualcomm.com> References: <20260924-smd-v2-0-bb40094da1d4@oss.qualcomm.com> In-Reply-To: <20260924-smd-v2-0-bb40094da1d4@oss.qualcomm.com> To: Johannes Berg , Kees Cook , "Gustavo A. R. Silva" Cc: linux-wireless@vger.kernel.org, linux-kernel@vger.kernel.org, linux-hardening@vger.kernel.org, pooventhiran.g@oss.qualcomm.com X-Mailer: b4 0.14.3 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTI0MDAxMiBTYWx0ZWRfX4JYFzs6guWeL DdI5MOmZE0PzNKvkCMuMgYGQkhwFzccMjZUgzXHkqFOpAuWKa/J2Z50iL/6xNkOdbn1UGaczynh UkU4zBqEvQhMnqrhKohhmd3obCObXH0= X-Proofpoint-ORIG-GUID: vHbzelBnAtUcLbVrZ8ViN3hi8mniHK1f X-Proofpoint-GUID: vHbzelBnAtUcLbVrZ8ViN3hi8mniHK1f X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTI0MDAxMiBTYWx0ZWRfXz4tVkjNwOP4B rWeVib957Fn64Ax42/f8mq5IuvTP4J3b6JxJxfM1dS/wuqrxTAJiJVutXJF2c+Kkoe4iRcNRV0j kk4Pioo2xFPu0Cb2lYf6Nye5RNH3j3JnaekImaaKPknkTDPZhjFff9aT2egnOT6Kj6f7DiFBQ3g KTf7L6JZaCfS/qh0Jlf0ZcrJdy09d1jl/TCt/+AmyGLRqDX/lFLHygv5x3o9kZ1jHblHMBiRfkb vLotuGsk3QgK7Hm2ykop/YGm9xK++audHrzPFl4f7d3MksZMjmqiqUyKVBSVYiti0sGSt1Qr5Qo iVKwcdwIgGB4gspWkoasAoBzlxRc2kKlCkq5a8ez9C+JKXALRzLRt+uLjv/GMDzjOdKSnamx/BE gIVmPZ2XlVTXfK32g2Hd5Mfe+5RxClgO69Kj+94kReISztzwDibxG3zQx/bmuMz49boStOHVrhd Qcl9S+OcQZeozBkQ0YA== X-Authority-Analysis: v=2.4 cv=cKp1IVeN c=1 sm=1 tr=0 ts=6ab48df5 cx=c_pps a=Uww141gWH0fZj/3QKPojxA==:117 a=Ou0eQOY4+eZoSc0qltEV5Q==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=eoimf2acIAo5FJnRuUoq:22 a=EUspDBNiAAAA:8 a=nliDdBWBufQ-nTcFh1oA:9 a=QEXdDO2ut3YA:10 a=PxkB5W3o20Ba91AHUih5:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-24_01,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 malwarescore=0 impostorscore=0 suspectscore=0 adultscore=0 priorityscore=1501 bulkscore=0 clxscore=1015 phishscore=0 lowpriorityscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609240012 While sending AMPDU action hints to drivers, mac80211 does not include the BlockAck policy extracted from ADDBA frames. Drivers may require the complete set of BlockAck negotiation parameters for certain use cases, such as SMD BSS Transition, where the complete BlockAck context needs to be transported as part of the transition. Include the BlockAck policy as well in AMPDU action so that drivers have the required information about the negotiation. Since the policy is extracted from the received ADDBA Request, it is valid only for IEEE80211_AMPDU_RX_START. Signed-off-by: Pooventhiran G --- include/net/mac80211.h | 15 +++++++++++++++ net/mac80211/agg-rx.c | 1 + net/mac80211/trace.h | 8 +++++--- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/include/net/mac80211.h b/include/net/mac80211.h index 03b75eead766..7bfa421535ca 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h @@ -3963,6 +3963,19 @@ enum ieee80211_ampdu_mlme_action { #define IEEE80211_AMPDU_TX_START_IMMEDIATE 1 #define IEEE80211_AMPDU_TX_START_DELAY_ADDBA 2 =20 +/** + * enum ieee80211_ba_policy - BlockAck Policy + * + * @IEEE80211_BLOCKACK_DELAYED: Block ACK sent to the BAR sender in next T= XOP + * @IEEE80211_BLOCKACK_IMMEDIATE: Block ACK sent to the BAR sender immedia= tely + * + * This field is valid only for %IEEE80211_AMPDU_RX_START. + */ +enum ieee80211_ba_policy { + IEEE80211_BLOCKACK_DELAYED, + IEEE80211_BLOCKACK_IMMEDIATE, +}; + /** * struct ieee80211_ampdu_params - AMPDU action parameters * @@ -3975,6 +3988,7 @@ enum ieee80211_ampdu_mlme_action { * @buf_size: reorder buffer size (number of subframes). Valid only when = the * action is set to %IEEE80211_AMPDU_RX_START or * %IEEE80211_AMPDU_TX_OPERATIONAL + * @policy: BlockAck policy of type &enum ieee80211_ba_policy * @amsdu: indicates the peer's ability to receive A-MSDU within A-MPDU. * valid when the action is set to %IEEE80211_AMPDU_TX_OPERATIONAL * @timeout: BA session timeout. Valid only when the action is set to @@ -3986,6 +4000,7 @@ struct ieee80211_ampdu_params { u16 tid; u16 ssn; u16 buf_size; + enum ieee80211_ba_policy policy; bool amsdu; u16 timeout; }; diff --git a/net/mac80211/agg-rx.c b/net/mac80211/agg-rx.c index 9629e00069a1..2d67fd883146 100644 --- a/net/mac80211/agg-rx.c +++ b/net/mac80211/agg-rx.c @@ -289,6 +289,7 @@ void __ieee80211_start_rx_ba_session(struct sta_info *s= ta, .amsdu =3D false, .timeout =3D timeout, .ssn =3D start_seq_num, + .policy =3D ba_policy, }; int i, ret =3D -EOPNOTSUPP; u16 status =3D WLAN_STATUS_REQUEST_DECLINED; diff --git a/net/mac80211/trace.h b/net/mac80211/trace.h index 294a8a44a125..63838a6d5d07 100644 --- a/net/mac80211/trace.h +++ b/net/mac80211/trace.h @@ -116,6 +116,7 @@ __field(u16, ssn) \ __field(u16, buf_size) \ __field(bool, amsdu) \ + __field(u8, policy) \ __field(u16, timeout) \ __field(u16, action) #define AMPDU_ACTION_ASSIGN STA_NAMED_ASSIGN(params->sta); \ @@ -123,12 +124,13 @@ __entry->ssn =3D params->ssn; \ __entry->buf_size =3D params->buf_size; \ __entry->amsdu =3D params->amsdu; \ + __entry->policy =3D params->policy; \ __entry->timeout =3D params->timeout; \ __entry->action =3D params->action; -#define AMPDU_ACTION_PR_FMT STA_PR_FMT " tid %d, ssn %d, buf_size %u, amsd= u %d, timeout %d action %d" +#define AMPDU_ACTION_PR_FMT STA_PR_FMT " tid %d, ssn %d, buf_size %u, amsd= u %d, policy=3D%u, timeout %d action %d" #define AMPDU_ACTION_PR_ARG STA_PR_ARG, __entry->tid, __entry->ssn, \ - __entry->buf_size, __entry->amsdu, __entry->timeout, \ - __entry->action + __entry->buf_size, __entry->amsdu, __entry->policy, \ + __entry->timeout, __entry->action =20 /* * Tracing for driver callbacks. --=20 2.34.1 From nobody Thu Sep 24 13:39:02 2026 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (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 175F23DA5A6 for ; Thu, 24 Sep 2026 02:42:01 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790217723; cv=none; b=p2jz1kr+taD/nmldK+f1O66eeFPedXXF7JLIQIAJlntUL6idUd80BrBMsvOwbVYHUNjTjJuzuxRBuhJaCB8OiQQZFl3jZOC9aUF5ZuSFWSgLJKb6/ny+fLcHLPRCNIYsh8uFKKxSgX6C+pDkZFpP2eQaD63oNcyyq0hHAD5YsYY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790217723; c=relaxed/simple; bh=zbyBR0/Jr9XStvE0BaDp0KlvS9RInzUSbblgN86wdg4=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=INY/Ltvkumz3yTM4zfuP7lKF4x6KRRFtxW+C5xMajcKAWG1GqY6JfoRHqi/3WwwHzL61+OrT3DsXFOii/ODeBdubcCqyJfGwjBZEkx9pEU+cNwW/gIH0C7FEgyEUSHbcyKc1iuzia3dNAEQpb/HVB2gs7njb0TpGPJK2lUpaC9o= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=Or8N0oBY; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=bbBUZsTN; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="Or8N0oBY"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="bbBUZsTN" Received: from pps.filterd (m0279866.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68O2Jsgs142910 for ; Thu, 24 Sep 2026 02:42:01 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= N3zlRvBjmBzkNQjO8objmY5TsdSrJG/Xb50VUn46oCk=; b=Or8N0oBYDHG1kKgk mHLprfW34FPs8cQgFV5jCUHBNt0E1jHuypiHmxr9JUa1j1iqRwuqBwKFwRtnLJ/4 wHeNOmsy1+sRojxev8Sh23av4cGJfsxAOr+5CtDsvJFTcFRkL1ZzhcwdXZeDONsh /RjoGH+GIOy6reCgjx5Bnl36mBld6XmDNpWX84copJVhRAyUHCZ1kGxL3LFobYNJ mt+kNnIUCcUZ/0F/K3oT81Z20X0Fn3CcJo+t7kBaP5GLExm+gPnCXZHySfuP9Oi5 ZGXf113c0iIxL2r04UA+d5xxAI54BnRwgcy/VRUM8Cyw0OAAsbvlh1sr/G0Vc4Id h7B5xg== Received: from mail-dy1-f199.google.com (mail-dy1-f199.google.com [74.125.82.199]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4gvbx7kvj4-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 24 Sep 2026 02:42:01 +0000 (GMT) Received: by mail-dy1-f199.google.com with SMTP id 5a478bee46e88-33310847fcaso2831076eec.1 for ; Wed, 23 Sep 2026 19:42:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1790217720; x=1790822520; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=N3zlRvBjmBzkNQjO8objmY5TsdSrJG/Xb50VUn46oCk=; b=bbBUZsTNfjecDTBVesGmfLvBvK/Qv8mN6z58NtMScgaqCn3rZkgtSdWUAROpkjJj1A uT4nZ2mok8IICz5hnq824hafSIQnFHmcsNgY/KiDqLmDkgiA8VauJcnCYPosZpLx+CW9 BxMSnWvXvM5gxfy8+6FEUyRE97kSdDqVzyzdDr3QMMftO+EC/SZhwa7S+uZ9vS1an7LP 6R0oVBJZlNeK8jYvBylEDcoMb1LvJz8nCSMCg7rOhzsrc+qTB8LTfBaiQTdOguOEQKJc tC7rbZASvvCPYPKdjt+lvfR8sekDmdF3j4VGCqLsAmeE3SsQrE2ki9dMiPGLTdIuqW5B 18ZQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790217720; x=1790822520; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=N3zlRvBjmBzkNQjO8objmY5TsdSrJG/Xb50VUn46oCk=; b=BRa26+1O34fqTuGxpfDuuyFV+ApDhedDDGC48NonsSZ5aFNBDcwXWGSkc8K7GnyRyZ F5tyZI2SgtGhVzx7Tv+hsbvJA6e9hBGkvEGT5HGM0vdFpBch1L7/smsU0BTvEFzeLIG8 v/71C0YvR8k/UC/V4Tpr7SULWE93yBR3lwFu/OryRZ5tNEq80iUFxh7k3kDSpFZaUXen YZyWa8AO+5vJJSyJUIbl9Zeq68jS3WFHTRUy8ticcAKxAfTvSv74V6g/2eOxMsMxNAYp qVN+SM0OkYM/fb6Toh0ovFK0ms2dZ/LL4p0Z6QuIPgLmZUATG30HMh8dt/7rjgZaTAjx pHAw== X-Forwarded-Encrypted: i=1; AKwUvBzsSDYdyZpy1i1o5JYX1/cFwxqDGQ38ZgY6WtQnz3i3e5hXKfWrHFDwSkhy5xwkHH32Jq8UB+o+f3KUt0w=@vger.kernel.org X-Gm-Message-State: AFuF++n6GyPMYpqJWNRj1/c/qxQmJg8airMccOR2ayoJKSzbV5eAc/OS h2fZywY5lJL1IVInBHmzYic1sf6nYK68RJ0a1WzBGMntlw5eGSedfQiMJGN53S7+emnJ9rmtZ1E nvrQjJoFIKPafUsept855I+j6R+3DgNC/sWxe7BYv7zeQZT1riKo0L3riCBGaNcrgCg== X-Gm-Gg: AYBFou29kO5BhhHdZc0aN3TQtG1cpOrO1HZ1pet6MkkizIndmhKEzt5IwUmDqXrlDqk 7d1xzLuIz7RuzvGx4tOmnuPRltOyPI0RkzvMcqpF6qcQo5dyrp66dL5Q0lF8PVXyXZNm9Acnyg5 Wkq2W8BUl205YzpMju0sQX/c4OoGSWwz+Z7gVv+K8PVbubMgimNLiUYyXk4Cveh3e5En803xErt Fu6hyze6vxP/FDJ4VIetJPpl8JcDmOr2mmWIob6wVxeV5m4GeOtqLURL6/Vbhc/h6jQ/IbhY7bo scvbuUJAy62wszMuu4sxvENzqcAg2jxm62UTa4uq+hmkBWrLhzi5KS0QrFf4rIOaOXe7c4TfOJd 7ZjZORBpA8YYm9osejzLW++ezCC5VT47aDlkDawAVRzxk8Muj5FS2zJJBJWnxc2KceCVt5VixTb tVf3y1D0kPeT1nAR5pct1FUw== X-Received: by 2002:a05:7301:4208:b0:33c:2457:bdb2 with SMTP id 5a478bee46e88-33ffe74cd9emr649862eec.6.1790217720242; Wed, 23 Sep 2026 19:42:00 -0700 (PDT) X-Received: by 2002:a05:7301:4208:b0:33c:2457:bdb2 with SMTP id 5a478bee46e88-33ffe74cd9emr649849eec.6.1790217719424; Wed, 23 Sep 2026 19:41:59 -0700 (PDT) Received: from hu-pooventh-blr.qualcomm.com (blr-bdr-fw-01_GlobalNAT_AllZones-Outside.qualcomm.com. [103.229.18.19]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-33e96258351sm9692263eec.12.2026.09.23.19.41.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 23 Sep 2026 19:41:58 -0700 (PDT) From: Pooventhiran G Date: Thu, 24 Sep 2026 08:10:46 +0530 Subject: [PATCH wireless-next v2 09/16] wifi: mac80211: Define layouts for SMD BSS Transition context Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260924-smd-v2-9-bb40094da1d4@oss.qualcomm.com> References: <20260924-smd-v2-0-bb40094da1d4@oss.qualcomm.com> In-Reply-To: <20260924-smd-v2-0-bb40094da1d4@oss.qualcomm.com> To: Johannes Berg , Kees Cook , "Gustavo A. R. Silva" Cc: linux-wireless@vger.kernel.org, linux-kernel@vger.kernel.org, linux-hardening@vger.kernel.org, pooventhiran.g@oss.qualcomm.com X-Mailer: b4 0.14.3 X-Proofpoint-ORIG-GUID: uX5Yi32rL0s574kUEe8I2PUJLD08mjR1 X-Authority-Analysis: v=2.4 cv=J4s/fwnS c=1 sm=1 tr=0 ts=6ab48df9 cx=c_pps a=cFYjgdjTJScbgFmBucgdfQ==:117 a=Ou0eQOY4+eZoSc0qltEV5Q==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=YMgV9FUhrdKAYTUUvYB2:22 a=EUspDBNiAAAA:8 a=Q3cHp_LDBd8SisU_aE8A:9 a=QEXdDO2ut3YA:10 a=scEy_gLbYbu1JhEsrz4S:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTI0MDAxMiBTYWx0ZWRfX9B4IkV+l0COW bUBV/9rvziTGPuai9T+2HrObJjnj/Vy5iv/A9x23P4GichVx4Y/35vZ1FZnmCnEWL9k/BISFuKA drS6mPTYaC1AiX4nb+Vm4OiCkzTLhCSwfAzAnTIhTQxnOi8MAigGr+4zi9exNEEt9wZOSZ18N0M MHsh57EQcDd2TfpHNDvx2rjlI87jlLn5RZUq7L15O1PpmsGfBUU2wEt0DI9ir+iemonHguOjFIa QzQ6hEffhz1KslYAWPjUNE8aNdswr+K4V5sJGlOa+/Za7YeZt4g6auzQjFGZ+ZZDnPZceRHh4Zj OMvcpRgKoul2gx8VLhucXbgVEY2BDtCDBpNNhMpkRpdvGE9mdO8tSyj4FCWxyMTJH3mtejXvXxn b/ys3hhigMj25Q+ZPiVbkYn2xVCm3Xxw6dphFJ2fGCBrgLiI0DcBXB1g8ixQryppEHYTSuiheR3 pIJIq1YKdh/LLnWMy/g== X-Proofpoint-Spam-Info: AW1haW4tMjYwOTI0MDAxMiBTYWx0ZWRfXyLA/QyFlqUPw GTUoQxX0h96v3WPEdIAKJ9s3fq3ui2Ig2J0KA5NJqUAGBxDqHXIX71PyGHznB8psl9boK89jQL/ mdv4u9OaYTj68Jh6vxkqjteAdh+sUXI= X-Proofpoint-GUID: uX5Yi32rL0s574kUEe8I2PUJLD08mjR1 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-24_01,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 malwarescore=0 spamscore=0 impostorscore=0 priorityscore=1501 phishscore=0 bulkscore=0 lowpriorityscore=0 adultscore=0 clxscore=1015 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609240012 IEEE P802.11bn/D2.0, Aug 2026, subclause 37.16.9, defines the context data to be transported during SMD BSS Transition (ST) laid out in subclause 37.16. The station's context data is attached to the ST Preparation or Execution Request action frames so that userspace receives the context along with the relevant frame. Define the context data: per-TID sequence numbers (SN) in downlink (DL) and uplink (UL) directions, packet number (PN) in DL, per-TID packet numbers in UL, and per-TID BlockAck session parameters in DL and UL; along with this, define an optional driver context. This data is used by drivers to report the context along with the frame SKB. Signed-off-by: Pooventhiran G --- include/linux/ieee80211-uhr.h | 86 +++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 86 insertions(+) diff --git a/include/linux/ieee80211-uhr.h b/include/linux/ieee80211-uhr.h index c3f87d4c8bec..e6aaef9ae9e6 100644 --- a/include/linux/ieee80211-uhr.h +++ b/include/linux/ieee80211-uhr.h @@ -649,6 +649,92 @@ struct ieee80211_uhr_mode_change_tuple { u8 variable[]; } __packed; =20 +/* + * Context information carried in SMD BSS Transition (refer IEEE P802.11bn= /D2.0, + * Aug 2026, subclause 37.16.9. + */ +#define IEEE80211_SMD_CTX_NUM_VALID_CTX 8 + +#define IEEE80211_SMD_CTX_VALID_DL_SN 0 +#define IEEE80211_SMD_CTX_VALID_UL_SN 1 +#define IEEE80211_SMD_CTX_VALID_PN 2 +#define IEEE80211_SMD_CTX_VALID_BA_PARAMS 3 +/* Positions 4 to 7 are reserved */ + +/* + * Data TIDs transported in the context, IEEE P802.11bn/D2.0, Aug 2026, + * subclause 9.4.2.364. + */ +#define IEEE80211_SMD_CTX_NUM_TIDS 8 + +#define IEEE80211_SMD_CTX_MAX_PN_LEN 16 + +/** + * struct ieee80211_smd_ctx_ba - BlockAck parameters for DL and UL + * + * @amsdu_supported: Peer's capability to support A-MSDU within A-MPDU. + * @ba_policy: BlockAck policy (0 =3D delayed BlockAck, 1 =3D immediate Bl= ockAck) + * @buffer_size: Reorder buffer size from ADDBA Request (10-bit, max 1023) + * @timeout: BlockAck session timeout + * @ext_no_frag: ADDBA Extension fragmentation support + * @extfrag_level: ADDBA Extension HE fragmentation level + * @ext_buffer_size: ADDBA Extension buffer size; combined with @buffer_si= ze as + * (@ext_buffer_size << 10 | @buffer_size) to get the full reorder + * buffer size + */ +struct ieee80211_smd_ctx_ba { + bool amsdu_supported; + u8 ba_policy; + u16 buffer_size; + u16 timeout; + bool ext_no_frag; + u8 extfrag_level; + u16 ext_buffer_size; +}; + +/** + * struct ieee80211_smd_ctx - IEEE 802.11bn SMD Roaming Context (refer + * IEEE P802.11bn/D2.0, Aug 2026, subclause 37.16.9) + * + * @valid_ctx_bmap: Bitmap indicating which context fields are valid; + * bit positions defined by IEEE80211_SMD_CTX_VALID_* constants + * @pn_len: Length of PN in bytes; varies by cipher type + * (e.g. CCMP (6), GCMP-256 (16)) + * @dl: Down-link context data + * @dl.valid_tid_bmap: valid DL TIDs for which context is present + * @dl.sn: DL SN per-TID to be assigned next + * @dl.pn: DL PN to be assigned next + * @dl.ba: DL BlockAck parameters per-TID for the BlockAck session + * @ul: Up-link context data + * @ul.valid_tid_bmap: valid UL TIDs for which context is present + * @ul.sn: UL SN per-TID to be checked next + * @ul.pn: UL PN per-TID to be checked next + * @ul.ba: UL BlockAck parameters per-TID for the BlockAck session + * @drv_ctx_size: Number of valid bytes in @drv_ctx. + * @drv_ctx: Variable-sized array of driver-specific context, counted by + * @drv_ctx_size. Opaque to the wireless core; interpreted by drivers. + */ +struct ieee80211_smd_ctx { + DECLARE_BITMAP(valid_ctx_bmap, IEEE80211_SMD_CTX_NUM_VALID_CTX); + u8 pn_len; + + struct { + DECLARE_BITMAP(valid_tid_bmap, IEEE80211_SMD_CTX_NUM_TIDS); + u16 sn[IEEE80211_SMD_CTX_NUM_TIDS]; + u8 pn[IEEE80211_SMD_CTX_MAX_PN_LEN]; + struct ieee80211_smd_ctx_ba ba[IEEE80211_SMD_CTX_NUM_TIDS]; + } dl; + struct { + DECLARE_BITMAP(valid_tid_bmap, IEEE80211_SMD_CTX_NUM_TIDS); + u16 sn[IEEE80211_SMD_CTX_NUM_TIDS]; + u8 pn[IEEE80211_SMD_CTX_NUM_TIDS][IEEE80211_SMD_CTX_MAX_PN_LEN]; + struct ieee80211_smd_ctx_ba ba[IEEE80211_SMD_CTX_NUM_TIDS]; + } ul; + + size_t drv_ctx_size; + u8 drv_ctx[] ____cacheline_aligned __counted_by(drv_ctx_size); +}; + static inline int ieee80211_uhr_mode_change_tuple_size(const struct ieee80211_uhr_mode_chang= e_tuple *tuple) { --=20 2.34.1 From nobody Thu Sep 24 13:39:02 2026 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (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 CB10A3D8916 for ; Thu, 24 Sep 2026 02:42:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790217726; cv=none; b=Kukn8f8rqAagd4Pj+xRXf9+C1kIgY+JRG7XjCVDZbNDVAG+FBcYKNo3bN+Lh0zGLkKENMvEteAiFjnFJ6QhfqzcH2LO4GduCT7t/1VP1fI6oFzOgiGzgC05C2SvjClJBivyYsNpCGV33FzWOKqKuVtxi1jP9APOf83pC7DNwOb0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790217726; c=relaxed/simple; bh=nLEiBqAYmNRnj3SiQa4tyaqBOk21t8wwuGJUP41TRSc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=h5VzvhJcDWat2CPxTNNMh4rae2y+R+giTgBkYOig9jcg9pbz3V9DGU2gL3nEe/LOK8diVXSW4ShcH5B/DAmNN5ZMUx1TEXkALfYT1vzcn4+DTZrLLW92nlWx2hXeQ1lJGJJ051C9JWzeij9ADtO5uiD+LPI69Pvo/cuZLwrDSaw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=jwsn0qm9; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=Ih4g/8y8; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="jwsn0qm9"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="Ih4g/8y8" Received: from pps.filterd (m0279866.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68O2JrMT142903 for ; Thu, 24 Sep 2026 02:42:04 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= pFSQ9jGZZpBjq/XoLPLbW42juICNQvaI4z1dRYyfMfI=; b=jwsn0qm9gO00XM3F kMYRTW5+aB7OiKlkMaYFEtEXIwK6RkPzBNVRYud1GN9mXhgfQtZ1q5uRUoWrJ/bJ SlRuTILgOsjt6UGd/J1jzF2+mcHU2siRDdd2RtEF3EC6+VGX3rikF+IT9KYjwrk4 Z9A/CgfOo4xDxpHa5EapJeytOADvejPPN/O1HLHdh5TpA3jEevnFH78xhjxaEDMG 0L9TKLiQL7XeYAxltARHX5H543OURNgTv6q0IwX6Lah2aP9jcwgYIcD3+8tEonUS kre5DuVKUCjhi0fqJcEorSb2JrGXvJ+Q8DavxYkwGpb6yGjLYumELZqj5JNhYpfn 3v9VNw== Received: from mail-dy1-f197.google.com (mail-dy1-f197.google.com [74.125.82.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4gvbx7kvj9-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 24 Sep 2026 02:42:03 +0000 (GMT) Received: by mail-dy1-f197.google.com with SMTP id 5a478bee46e88-313d1015161so355617eec.1 for ; Wed, 23 Sep 2026 19:42:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1790217723; x=1790822523; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=pFSQ9jGZZpBjq/XoLPLbW42juICNQvaI4z1dRYyfMfI=; b=Ih4g/8y8ipUX2uP/mGaothDADi27tIVelW/Hol4FVPjT6udKsGjN2K0cKXmOYMObcW vRh7mV9tLqY9oSgecYN30MLR8rnOL/1Oz8ALW2OK/nm9ZWQ4s9U6M4Pgvrm0kgEOQ5U4 LNBk4Rx7GGo8eBK5Ya98yRIjP3JOzxpYZzQkP/xWToprKOJwNkiFCKXuC2OuBFTxtT9j lU6Y4ryj4f638brIMdw9Qv59WRjCh5YaZsGchPQ+fT7aOXuT1E74KsXn0tHt9ptC9lv0 A/vaNqjDACUsD1WSq4qeP1rTXnTtsQ++Kjay6avs+SwNRiRqGmHdgf8Dhy5wheVp9ZTV I1kg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790217723; x=1790822523; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=pFSQ9jGZZpBjq/XoLPLbW42juICNQvaI4z1dRYyfMfI=; b=ycATUOneo/q8X1fIKR6drTFvq4LfkEZul+7hiGV2WSY9Y2wHLSFXK4FpFTpzBiwFal 1Eyjcwis1VKLMu1gmIEgXR7JMgPvGX7CP1fRtYrToVtIkkCBPbDc9v0sHsCuyo9BK+fG U8Bsjwzt1v8ruC4Op7f6OlOtegRGUQQoYrFCJzuPII39jSbK+a1TuZ/lEMOW/w7bHr0L QNWylAMFJKc0o9fyABiYl6FJY7fw4Hm6vdl5JALc3S5lxDq7oImgkrQVBLdhG8EwiSKz uR0f0AJpudu8CJ4K1ATUuIVpuA1UXERlsYYoKPO15qozmRqZo53uNrQA7mBQbxyS3l33 pvaQ== X-Forwarded-Encrypted: i=1; AKwUvBy7WAnl/z99Y6lpRJZ197BHXclbD5vMlFwWs3GQCzIWCAojFoKp+XA8RUYGRiaAt2K+4k3UG0z70e5qap4=@vger.kernel.org X-Gm-Message-State: AFuF++kIE9rgKTXOUuzC6Gy2xR/wRSCIt4CvCE6vHIHIwmuCtI3E7gWk el/OdFSOYhN7XnmHD6ICkA1wj9NQImfUfqrWpBxLKGnfZ5qJQ5aDy0OHAcGtB9ZdTrbySyh1tZz aer+0TCT/jg0zHwEN6lU7u9UvU+yNFM4uGBGugyqWMnjq49wF6hTab3+u612KKQnaTg== X-Gm-Gg: AYBFou2kWszJTp15qIWG91dcpzkV7IRMOifxyQJWefX1SPa7pzAPo0fVHf2x2vb0XxG xBAmKGcREZHgaokuX3NgtEgZRmk7WjJoJwK4Yq0PHllNSwOF+pTdh4NXHRc7yO9aG4POk+bNc73 RbvS0jGvcruwahZ1D7JaoB1C2ZoTXZ9IqyRIY3wZyAvYw0Bwf7mCh1nU6yC/+lHaFk/mUbcaUbc cQGPXw9lNn5UDTdCFbBQLyvk65XJAc1pvis7KXA/HJx8qhJYA6K++P0qNLVeuEVhuOSfZexOo2f G8Bdscw85h5ulQpJbA06v0tmtoGx2mYjDF+/QFEGW9Sj2aHq9yKU0jfJ527dTm3Wrhf5upS7BUb 4dVEiI35la6u3QkRowGd4HoVoc63K+socJiMjy+IqB/VFSfFHC1OG1agxaQs4ZeJCzC0gmsADUx XXoAc1oGU4zw8KtjSl+EVjWA== X-Received: by 2002:a05:693c:41db:10b0:33c:1fc9:3c17 with SMTP id 5a478bee46e88-34006e8e408mr764480eec.36.1790217723204; Wed, 23 Sep 2026 19:42:03 -0700 (PDT) X-Received: by 2002:a05:693c:41db:10b0:33c:1fc9:3c17 with SMTP id 5a478bee46e88-34006e8e408mr764464eec.36.1790217722601; Wed, 23 Sep 2026 19:42:02 -0700 (PDT) Received: from hu-pooventh-blr.qualcomm.com (blr-bdr-fw-01_GlobalNAT_AllZones-Outside.qualcomm.com. [103.229.18.19]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-33e96258351sm9692263eec.12.2026.09.23.19.41.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 23 Sep 2026 19:42:02 -0700 (PDT) From: Pooventhiran G Date: Thu, 24 Sep 2026 08:10:47 +0530 Subject: [PATCH wireless-next v2 10/16] wifi: nl80211: Define attributes to pack SMD BSS Transition context Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260924-smd-v2-10-bb40094da1d4@oss.qualcomm.com> References: <20260924-smd-v2-0-bb40094da1d4@oss.qualcomm.com> In-Reply-To: <20260924-smd-v2-0-bb40094da1d4@oss.qualcomm.com> To: Johannes Berg , Kees Cook , "Gustavo A. R. Silva" Cc: linux-wireless@vger.kernel.org, linux-kernel@vger.kernel.org, linux-hardening@vger.kernel.org, pooventhiran.g@oss.qualcomm.com X-Mailer: b4 0.14.3 X-Proofpoint-ORIG-GUID: f_FPvm0eaGLlJv2--CoXWWdsj02GrhgS X-Authority-Analysis: v=2.4 cv=J4s/fwnS c=1 sm=1 tr=0 ts=6ab48dfb cx=c_pps a=Uww141gWH0fZj/3QKPojxA==:117 a=Ou0eQOY4+eZoSc0qltEV5Q==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=YMgV9FUhrdKAYTUUvYB2:22 a=EUspDBNiAAAA:8 a=dL9KhdaHfVATLDi8aJoA:9 a=QEXdDO2ut3YA:10 a=PxkB5W3o20Ba91AHUih5:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTI0MDAxMiBTYWx0ZWRfX6lhTWb9YyVYF 7eR7Laq7YdMCoHPZs+2sGTlKpYPzMovm2jNa7m3OehEPwSUdeGC7fbDcaUhjiwyjepSTcN7CHLy Y7EIY0xLz536Y8om/7vt1YQ+ah0sAyeUl0egr13V+yieHXAjQG+2evfYoaKQ2JdUZ3BLbvOakle UvDmE3r+uFV6d3RsKPDjs1qF7rz5tDUxlruYjCk7r2xIlAu1Oo2RXZQPrG0GcIuCfKtFatPoYGF T5I+7njXaHb/D1F6nVy27rva5iWol71DfyN35nT++rWj/fl/3O+UMPrE/8aaU2xKpzwWMO6imH1 FIYjlpUtgnyRU+Hx8KMbKkXF8o0sxI0kuLCXl1VZXKxOpY7K/SbgtoNGu30DO8l0IeWQv9COH3C juhUTsWEXXCVzRrR77BpRUtELKmJydhV2Lp6dgk1fQYu5nq4q+HA93iiJA0B8NeI3P4ZPDNj337 anpSGzy7Ic+VPKtZLbQ== X-Proofpoint-Spam-Info: AW1haW4tMjYwOTI0MDAxMiBTYWx0ZWRfX5ebvAswloUrv Idvg9Tej9yppx0c5rwQ8ApC9oKmojFY7P34qehMkOqxcuzHrbc0qpVkoHxEZETSgB/HB89xWcVd 4vqMUKLFZ5pg0m4UdH/MmOGXtUQnV48= X-Proofpoint-GUID: f_FPvm0eaGLlJv2--CoXWWdsj02GrhgS X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-24_01,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 malwarescore=0 spamscore=0 impostorscore=0 priorityscore=1501 phishscore=0 bulkscore=0 lowpriorityscore=0 adultscore=0 clxscore=1015 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609240012 Define nl80211 attributes and policies required to pack SMD BSS Transition context along with NL80211_CMD_FRAME to be sent to userspace, and to set and get the context during roaming via current AP MLD and roaming via target AP MLD. Without these, userspace will not be able to transport the context to the target AP MLD, program the context on the target AP MLD TX and RX queues, nor fetch the context on behalf of the target AP MLD if the ST Execution frame is sent directly to the target. Suggested-by: Jouni Malinen Signed-off-by: Pooventhiran G --- include/uapi/linux/nl80211.h | 163 +++++++++++++++++++++++++++++++++++++++= ++++ net/wireless/nl80211.c | 44 ++++++++++++ 2 files changed, 207 insertions(+) diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h index cd9a320143d7..8dd07751a336 100644 --- a/include/uapi/linux/nl80211.h +++ b/include/uapi/linux/nl80211.h @@ -1427,6 +1427,18 @@ * @NL80211_CMD_STOP_PD: Stop the PD operation, identified by * its %NL80211_ATTR_WDEV interface. * + * @NL80211_CMD_SET_SMD_CTX: Set the SMD BSS Transition dynamic context fo= r a + * non-AP MLD sent from the current AP MLD on the target AP MLD managed by + * an SMD-ME. This command carries %NL80211_ATTR_MLD_ADDR, + * %NL80211_ATTR_SMD_CTX_TYPE and %NL80211_ATTR_SMD_CTX. + * @NL80211_CMD_GET_SMD_CTX: Get the SMD BSS Transition dynamic context fo= r a + * non-AP MLD associated to an AP MLD managed by an SMD-ME. This command + * carries %NL80211_ATTR_MLD_ADDR and %NL80211_ATTR_SMD_CTX_TYPE. + * @NL80211_CMD_SMD_CTX_EVENT: Event reporting the collected SMD context + * (requested via %NL80211_CMD_GET_SMD_CTX) to userspace. It carries + * %NL80211_ATTR_MLD_ADDR, %NL80211_ATTR_SMD_CTX_TYPE, and + * %NL80211_ATTR_SMD_CTX. + * * @NL80211_CMD_MAX: highest used command number * @__NL80211_CMD_AFTER_LAST: internal use */ @@ -1705,6 +1717,10 @@ enum nl80211_commands { NL80211_CMD_START_PD, NL80211_CMD_STOP_PD, =20 + NL80211_CMD_SET_SMD_CTX, + NL80211_CMD_GET_SMD_CTX, + NL80211_CMD_SMD_CTX_EVENT, + /* add new commands above here */ =20 /* used to define NL80211_CMD_MAX below */ @@ -3212,6 +3228,13 @@ enum nl80211_commands { * IEEE P802.11bn/D2.0, Aug 2026, subclause 37.16.6). * This flag is carried in %NL80211_CMD_NEW_STATION. * + * @NL80211_ATTR_SMD_CTX: Nested attribute associated with UHR SMD BSS + * Transition data. Used with %NL80211_CMD_SET_SMD_CTX and + * %NL80211_CMD_SMD_CTX_EVENT. See &enum nl80211_smd_ctx. + * @NL80211_ATTR_SMD_CTX_TYPE: u8 attribute specifying the type of SMD con= text. + * Used along with %NL80211_CMD_SET_SMD_CTX, %NL80211_CMD_GET_SMD_CTX, + * and %NL80211_CMD_SMD_CTX_EVENT. + * * @NUM_NL80211_ATTR: total number of nl80211_attrs available * @NL80211_ATTR_MAX: highest attribute number currently defined * @__NL80211_ATTR_AFTER_LAST: internal use @@ -3822,6 +3845,9 @@ enum nl80211_attrs { =20 NL80211_ATTR_SMD_ROAM_STA, =20 + NL80211_ATTR_SMD_CTX, + NL80211_ATTR_SMD_CTX_TYPE, + /* add attributes here, update the policy in nl80211.c */ =20 __NL80211_ATTR_AFTER_LAST, @@ -9259,4 +9285,141 @@ enum nl80211_smd_params_attrs { NL80211_SMD_PARAMS_ATTR_MAX =3D __NL80211_SMD_PARAMS_ATTR_LAST - 1 }; =20 +/** + * enum nl80211_smd_ctx_type - SMD Request Type values + * + * Used with %NL80211_ATTR_SMD_CTX_TYPE. + * + * @NL80211_SMD_CTX_TYPE_PREP: SMD BSS Transition (ST) Preparation. + * @NL80211_SMD_CTX_TYPE_EXEC: ST Execution. + * @NUM_SMD_CTX_TYPES: internal. + * @NL80211_SMD_CTX_TYPE_MAX: Max type of ST context. + */ +enum nl80211_smd_ctx_type { + NL80211_SMD_CTX_TYPE_PREP, + NL80211_SMD_CTX_TYPE_EXEC, + + NUM_SMD_CTX_TYPES, + NL80211_SMD_CTX_TYPE_MAX =3D NUM_SMD_CTX_TYPES - 1, +}; + +/** + * enum nl80211_smd_ctx_ba_param - SMD Block Ack Context attributes + * + * @__NL80211_SMD_CTX_BA_ATTR_INVALID: Invalid attribute. + * @NL80211_SMD_CTX_BA_ATTR_BUFF_SIZE: Required (u16) BA buffer size. + * @NL80211_SMD_CTX_BA_ATTR_POLICY: Required (u8) BA policy. + * @NL80211_SMD_CTX_BA_ATTR_AMSDU_SUPPORT: Flag attribute to indicate + * AMSDU support. + * @NL80211_SMD_CTX_BA_ATTR_TIMEOUT: Required (u16) Block Ack timeout. + * @NL80211_SMD_CTX_BA_ATTR_EXT_NO_FRAG: Flag attribute to indicate + * fragmentation support. + * @NL80211_SMD_CTX_BA_ATTR_EXT_FRAG_LEVEL: Required (u8) HE fragmentation + * level. + * @NL80211_SMD_CTX_BA_ATTR_EXT_BUFF_SIZE: Required (u16) extended buffer = size. + * @__NL80211_SMD_CTX_BA_ATTR_LAST: Last attribute, used internally. + * @NL80211_SMD_CTX_BA_ATTR_MAX: Max attribute. + * + * Used with %NL80211_SMD_CTX_DL_ATTR_BA_PARAMS and + * %NL80211_SMD_CTX_UL_ATTR_BA_PARAMS. + */ +enum nl80211_smd_ctx_ba_param { + __NL80211_SMD_CTX_BA_ATTR_INVALID, + NL80211_SMD_CTX_BA_ATTR_BUFF_SIZE, + NL80211_SMD_CTX_BA_ATTR_POLICY, + NL80211_SMD_CTX_BA_ATTR_AMSDU_SUPPORT, + NL80211_SMD_CTX_BA_ATTR_TIMEOUT, + NL80211_SMD_CTX_BA_ATTR_EXT_NO_FRAG, + NL80211_SMD_CTX_BA_ATTR_EXT_FRAG_LEVEL, + NL80211_SMD_CTX_BA_ATTR_EXT_BUFF_SIZE, + + __NL80211_SMD_CTX_BA_ATTR_LAST, + NL80211_SMD_CTX_BA_ATTR_MAX =3D __NL80211_SMD_CTX_BA_ATTR_LAST - 1 +}; + +/** + * enum nl80211_smd_ctx_dl - SMD Dynamic Context - DL direction + * + * @__NL80211_SMD_CTX_DL_ATTR_INVALID: Invalid attribute. + * @NL80211_SMD_CTX_DL_ATTR_VALID_TID_BITMAP: Optional (u8) TIDs included. + * @NL80211_SMD_CTX_DL_ATTR_SN: Optional (nested) next SN (u16) per TID to + * be assigned to DL individually addressed frames. + * @NL80211_SMD_CTX_DL_ATTR_PN: Optional (binary) starting PN (max 16 byte= s) for + * DL individually addressed frames. + * @NL80211_SMD_CTX_DL_ATTR_BA_PARAMS: Optional (nested) Block Ack paramet= ers, + * nested array of TIDs (uses &enum nl80211_smd_ctx_ba_param). + * @__NL80211_SMD_CTX_DL_ATTR_LAST: Last attribute, used internally. + * @NL80211_SMD_CTX_DL_ATTR_MAX: Max attribute. + * + * Used with %NL80211_SMD_CTX_ATTR_DL. + */ +enum nl80211_smd_ctx_dl { + __NL80211_SMD_CTX_DL_ATTR_INVALID, + NL80211_SMD_CTX_DL_ATTR_VALID_TID_BITMAP, + NL80211_SMD_CTX_DL_ATTR_SN, + NL80211_SMD_CTX_DL_ATTR_PN, + NL80211_SMD_CTX_DL_ATTR_BA_PARAMS, + + __NL80211_SMD_CTX_DL_ATTR_LAST, + NL80211_SMD_CTX_DL_ATTR_MAX =3D __NL80211_SMD_CTX_DL_ATTR_LAST - 1 +}; + +/** + * enum nl80211_smd_ctx_ul - SMD Dynamic Context - UL direction + * + * @__NL80211_SMD_CTX_UL_ATTR_INVALID: Invalid attribute. + * @NL80211_SMD_CTX_UL_ATTR_VALID_TID_BITMAP: Optional (u8) TIDs included. + * @NL80211_SMD_CTX_UL_ATTR_SN: Optional (nested) last SN received per TID + * for UL individually addressed frames. + * @NL80211_SMD_CTX_UL_ATTR_PN: Optional (nested) last PN received per TID + * for UL individually addressed frames. + * @NL80211_SMD_CTX_UL_ATTR_BA_PARAMS: Optional (nested) Block Ack paramet= ers + * (uses &enum nl80211_smd_ctx_ba_param). + * @__NL80211_SMD_CTX_UL_ATTR_LAST: Last attribute, used internally. + * @NL80211_SMD_CTX_UL_ATTR_MAX: Max attribute. + * + * Used with %NL80211_SMD_CTX_ATTR_UL. + */ +enum nl80211_smd_ctx_ul { + __NL80211_SMD_CTX_UL_ATTR_INVALID, + NL80211_SMD_CTX_UL_ATTR_VALID_TID_BITMAP, + NL80211_SMD_CTX_UL_ATTR_SN, + NL80211_SMD_CTX_UL_ATTR_PN, + NL80211_SMD_CTX_UL_ATTR_BA_PARAMS, + + __NL80211_SMD_CTX_UL_ATTR_LAST, + NL80211_SMD_CTX_UL_ATTR_MAX =3D __NL80211_SMD_CTX_UL_ATTR_LAST - 1 +}; + +/** + * enum nl80211_smd_ctx - SMD Context information + * + * Top-level container for SMD BSS Transition dynamic context. Carried in + * %NL80211_ATTR_SMD_CTX with %NL80211_CMD_SET_SMD_CTX (target AP MLD) or + * with %NL80211_CMD_FRAME (current AP MLD reporting context to userspace) + * and %NL80211_CMD_SMD_CTX_EVENT (current AP MLD reporting the requested + * context on behalf of the target AP MLD). + * + * @__NL80211_SMD_CTX_ATTR_INVALID: Invalid attribute. + * @NL80211_SMD_CTX_ATTR_DL: Optional (nested) DL parameters. + * See &enum nl80211_smd_ctx_dl. + * @NL80211_SMD_CTX_ATTR_UL: Optional (nested) UL parameters. + * See &enum nl80211_smd_ctx_ul. + * @NL80211_SMD_CTX_ATTR_DRV_DATA: Optional (binary) driver-specific blob. + * Passed through nl80211 as a blob; parsed only at the driver layer of + * the current AP MLD and target AP MLD. First 3 bytes shall be driver OUI + * for the driver to parse as required. + * @__NL80211_SMD_CTX_ATTR_LAST: Last attribute, used internally. + * @NL80211_SMD_CTX_ATTR_MAX: Max attribute. + */ +enum nl80211_smd_ctx { + __NL80211_SMD_CTX_ATTR_INVALID, + NL80211_SMD_CTX_ATTR_DL, + NL80211_SMD_CTX_ATTR_UL, + NL80211_SMD_CTX_ATTR_DRV_DATA, + + __NL80211_SMD_CTX_ATTR_LAST, + NL80211_SMD_CTX_ATTR_MAX =3D __NL80211_SMD_CTX_ATTR_LAST - 1 +}; + #endif /* __LINUX_NL80211_H */ diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 26277b3352ae..3940e349f270 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c @@ -704,6 +704,47 @@ nl80211_smd_params_policy[NL80211_SMD_PARAMS_ATTR_MAX = + 1] =3D { [NL80211_SMD_PARAMS_ATTR_NEIGHBOR_PROBING] =3D { .type =3D NLA_FLAG }, }; =20 +static const struct nla_policy +nl80211_smd_ctx_ba_policy[NL80211_SMD_CTX_BA_ATTR_MAX + 1] =3D { + [NL80211_SMD_CTX_BA_ATTR_BUFF_SIZE] =3D { .type =3D NLA_U16 }, + [NL80211_SMD_CTX_BA_ATTR_POLICY] =3D { .type =3D NLA_U8 }, + [NL80211_SMD_CTX_BA_ATTR_AMSDU_SUPPORT] =3D { .type =3D NLA_FLAG }, + [NL80211_SMD_CTX_BA_ATTR_TIMEOUT] =3D { .type =3D NLA_U16 }, + [NL80211_SMD_CTX_BA_ATTR_EXT_NO_FRAG] =3D { .type =3D NLA_FLAG }, + [NL80211_SMD_CTX_BA_ATTR_EXT_FRAG_LEVEL] =3D { .type =3D NLA_U8 }, + [NL80211_SMD_CTX_BA_ATTR_EXT_BUFF_SIZE] =3D { .type =3D NLA_U16 }, +}; + +static const struct nla_policy +nl80211_smd_ctx_dl_policy[NL80211_SMD_CTX_DL_ATTR_MAX + 1] =3D { + [NL80211_SMD_CTX_DL_ATTR_VALID_TID_BITMAP] =3D { .type =3D NLA_U8 }, + [NL80211_SMD_CTX_DL_ATTR_SN] =3D { .type =3D NLA_NESTED }, + [NL80211_SMD_CTX_DL_ATTR_PN] =3D { .type =3D NLA_BINARY, + .len =3D IEEE80211_SMD_CTX_MAX_PN_LEN }, + [NL80211_SMD_CTX_DL_ATTR_BA_PARAMS] =3D + NLA_POLICY_NESTED_ARRAY(nl80211_smd_ctx_ba_policy), +}; + +static const struct nla_policy +nl80211_smd_ctx_ul_policy[NL80211_SMD_CTX_UL_ATTR_MAX + 1] =3D { + [NL80211_SMD_CTX_UL_ATTR_VALID_TID_BITMAP] =3D { .type =3D NLA_U8 }, + [NL80211_SMD_CTX_UL_ATTR_SN] =3D { .type =3D NLA_NESTED }, + [NL80211_SMD_CTX_UL_ATTR_PN] =3D { .type =3D NLA_NESTED }, + [NL80211_SMD_CTX_UL_ATTR_BA_PARAMS] =3D + NLA_POLICY_NESTED_ARRAY(nl80211_smd_ctx_ba_policy), +}; + +static const struct nla_policy +nl80211_smd_ctx_policy[NL80211_SMD_CTX_ATTR_MAX + 1] =3D { + [NL80211_SMD_CTX_ATTR_DL] =3D + NLA_POLICY_NESTED(nl80211_smd_ctx_dl_policy), + [NL80211_SMD_CTX_ATTR_UL] =3D + NLA_POLICY_NESTED(nl80211_smd_ctx_ul_policy), + [NL80211_SMD_CTX_ATTR_DRV_DATA] =3D + NLA_POLICY_RANGE(NLA_BINARY, + 3, IEEE80211_MAX_DATA_LEN), +}; + static const struct netlink_range_validation nl80211_punct_bitmap_range = =3D { .min =3D 0, .max =3D 0xffff, @@ -1119,6 +1160,9 @@ static const struct nla_policy nl80211_policy[NUM_NL8= 0211_ATTR] =3D { [NL80211_ATTR_PEER_SMD_MAC_ADDR] =3D NLA_POLICY_ETH_ADDR, [NL80211_ATTR_PEER_SMD_DL_DATA_FORWARDING] =3D { .type =3D NLA_FLAG }, [NL80211_ATTR_SMD_ROAM_STA] =3D { .type =3D NLA_FLAG }, + [NL80211_ATTR_SMD_CTX] =3D NLA_POLICY_NESTED(nl80211_smd_ctx_policy), + [NL80211_ATTR_SMD_CTX_TYPE] =3D + NLA_POLICY_MAX(NLA_U8, NL80211_SMD_CTX_TYPE_MAX), }; =20 /* policy for the key attributes */ --=20 2.34.1 From nobody Thu Sep 24 13:39:02 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (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 3D0D13DA5DB for ; Thu, 24 Sep 2026 02:42:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790217731; cv=none; b=guc+TtZ5qKvNie9L9DldgjuJYHH5ecojehB2V0rP4LAA6b/W1lweg3uyGth7apmlq8cLJVASxDnC75jhts4xpVbI/9OIkoCJSx0aDCOy+p5Tr6ictFtaVQCMFdXHZ1Ao7RD5pb4OP+WfdRLxnrLVIxKm32SAEQy1N5+XcL6KF4U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790217731; c=relaxed/simple; bh=qjo4LXIMsSyzJCAJhlFb0c6ptyuXA14K/I0JXhuV/Hs=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=eDO5aznctuxgThlErpLck2GJhhdr1oZyZw9o+gHoUcZEH5QhnOh5i1D1X0A/clMFIT0pTeruhtw4kKNGLlYLi2tYBHeXAWn+uOIUkapCDrbDz58vf5+b205UhA9kL47uM2GsakFNupNAMXzmuMK5Z1Ssi9p3+RUm6xkZQ+dPB+0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=LSEX4eKb; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=IZeDx8uF; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="LSEX4eKb"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="IZeDx8uF" Received: from pps.filterd (m0279869.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68O2KCWL1317106 for ; Thu, 24 Sep 2026 02:42:08 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= d3/PwaR8+USw9E7Ih9bOMrj7G4CRNw/PS2L7c9cu4PY=; b=LSEX4eKbYGcY+U+l hY3ucSLYtVB7D6y1AKZnM3CsdrzKOJrAf1tPXMC7hHmJXukq8brY78qB2PVsO6u4 qwpldAQCwbYUlaClQxF8+fuBs7M/HDFvcR7zj4MMvF/UyVqWp9jp9wApy7grpEyW 8XZTF6ZYQCkvOA550mcPQNKBnP02qvok4zEaUZXGf+RrfIODrl4IkFAQ/+Vjkwqg YICSu2GUssFRz9I+5vxrjsM62jVN5fTrTT1nESh8gqc0Bc+zVSe6peWRTtc8bKlv ErjsfbxOs2r/ybTYFrc9JFZYn1v9S9ilvIeS9DmfNcmQAnAFiFYhaiz0nAeFBEnB XUktfQ== Received: from mail-dy1-f197.google.com (mail-dy1-f197.google.com [74.125.82.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4gvfkbjwg9-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 24 Sep 2026 02:42:07 +0000 (GMT) Received: by mail-dy1-f197.google.com with SMTP id 5a478bee46e88-32861f5448cso718695eec.0 for ; Wed, 23 Sep 2026 19:42:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1790217727; x=1790822527; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=d3/PwaR8+USw9E7Ih9bOMrj7G4CRNw/PS2L7c9cu4PY=; b=IZeDx8uFyL/32lJYuxTLYWrM9VarxO68AwttM7cwpkQhuxTn5Y4/boZGleadDftYjY P1pA2S/b/OudxMw0aSzLI/Y+JqNg66lePinEjoKSnNFyfL1mbmvC/PczVnXnx5xbDqyG UX8DgW5Asjeq8ajZPcv9Fsbyfczo61GGrruRdsbOnbTdjO3f+5OvEhuIJ54MCHrqQi3I vVHwG02JRXo9z7G8cjQSNAUey6TzADKrKrLExudSjIkfd8+X8Bc+puKVicGe7CpmoEqe VbVikzbhJg0ndmwMiulnDqGBqe4h8eY6r6BnsQiFJlYhRWGSFZifL30bndMzNnTiMpkr +EBA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790217727; x=1790822527; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=d3/PwaR8+USw9E7Ih9bOMrj7G4CRNw/PS2L7c9cu4PY=; b=tMQmpgPGAHkqTWE3KqA5UPBR2NTP/m8iWg9NOgQi3f5E22fKaYvPzi5AhOr+i10SFt fP6hvZNdS4IEKjIm3JkFYMNF7x99uXPFkYL7uaWp6K7X2lsTYz12VLvhiH7G3yfQ8MTJ U62TKTT91U4QNYxm44YddId6dqjSNlDIqyFmt6+qkFgmBR6mgpinpc037Fpg9PgfyNPr 0z5f/WzMVInpsnhyX/pACWwSloRBLya1nb/EhXIgddQGh5b53lXodUARiEokyyhEX5ZA 38rt74Hq56ZFIhZolSTCGlBZngd7yoYf5H0jiQsDWGydeyXC41RW6iaINoCcAwKyZtKm sf3g== X-Forwarded-Encrypted: i=1; AKwUvBwmL0eSiGhZTb2PDD9tR5ghMG4/ZbX9N4bCfKKnLDLtpl82nwiuMaYhK+RD5O1rgg3fvF+Z+nOg3N1MtBA=@vger.kernel.org X-Gm-Message-State: AFuF++kOuT829KEK5yR04YGaEcKmBLRydbFR6ytJ7aOyoXKnxrao4hg0 EmznHBYiSJ8vqujqaXCddmM9znMAtfXPM2TiWQkPmmxV+bpl/0luoKoacOBe9E7BHxngrbj/YEy kqm41c5tzZOkawSSiPLqvzHVMqRCKR2Z1g4Cpz4tc5IvUqmDJXH3PV6niyn785oC1kj9ZnDt3CA == X-Gm-Gg: AYBFou3St8mtHbGs2c87Q2cFRF18AL/bzXYokWloGgq27swMQGYqbTSgHvCro2xE6qk qXXTON3telUgLtE19Yq1y2BCNg5ot7IZJxEpkbIgJQEN8vFyl3LhzHT1bXAtyO+6fbqFfZ+cqHr 5YRhwa59TC0NX5YeBt0USiEocJzewBpXNfipFBwxeNGb2huFWEevv6nweDURcniCOfnx829lM+n TGzEKEGc+vIILUmpv80bIXw2uHzc2K6U7bXNrJRFksNZF01rzLSaV7X59cyOx9WPvjgE2bZzTkz 6oSbGW23XjFrMNnqq/q4VhGfY7WGCI0n95jY5aaNgbBisVrcz7a5G1QrUc8eLM9DwG++i+myGke FmPIekjcArWuO2WTyOZldaa8hLTlC3bJ8UC/smHG/kgCQXFPaFSrav6G8pI86Wzb3WSwQXath+D a4ANtb5sH7wnIYBWYOiph/cQ== X-Received: by 2002:a05:693c:621a:b0:33e:6a58:b03 with SMTP id 5a478bee46e88-34002edeb01mr909282eec.21.1790217726491; Wed, 23 Sep 2026 19:42:06 -0700 (PDT) X-Received: by 2002:a05:693c:621a:b0:33e:6a58:b03 with SMTP id 5a478bee46e88-34002edeb01mr909257eec.21.1790217725786; Wed, 23 Sep 2026 19:42:05 -0700 (PDT) Received: from hu-pooventh-blr.qualcomm.com (blr-bdr-fw-01_GlobalNAT_AllZones-Outside.qualcomm.com. [103.229.18.19]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-33e96258351sm9692263eec.12.2026.09.23.19.42.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 23 Sep 2026 19:42:05 -0700 (PDT) From: Pooventhiran G Date: Thu, 24 Sep 2026 08:10:48 +0530 Subject: [PATCH wireless-next v2 11/16] wifi: cfg80211/mac80211: Handle UHR Link Reconfiguration frame Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260924-smd-v2-11-bb40094da1d4@oss.qualcomm.com> References: <20260924-smd-v2-0-bb40094da1d4@oss.qualcomm.com> In-Reply-To: <20260924-smd-v2-0-bb40094da1d4@oss.qualcomm.com> To: Johannes Berg , Kees Cook , "Gustavo A. R. Silva" Cc: linux-wireless@vger.kernel.org, linux-kernel@vger.kernel.org, linux-hardening@vger.kernel.org, pooventhiran.g@oss.qualcomm.com X-Mailer: b4 0.14.3 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTI0MDAxMiBTYWx0ZWRfX1nQv0nEyz1NW Ieghwom3FmxpmQ2vWYaXeTBOiidjeEmlH2Lsm4nYih0k540zbND3q3EcBSXZ4gy/pLPtdTCRLq3 oRYWc+2OAOb0J3k9FaGEVnia6hBsS2k= X-Proofpoint-GUID: Q-GvegE9LgjnrL0bI8qVzSP0FcZglwHT X-Authority-Analysis: v=2.4 cv=RYMFmFtv c=1 sm=1 tr=0 ts=6ab48dff cx=c_pps a=Uww141gWH0fZj/3QKPojxA==:117 a=Ou0eQOY4+eZoSc0qltEV5Q==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=_glEPmIy2e8OvE2BGh3C:22 a=EUspDBNiAAAA:8 a=kIFG_faw9rmyLF2AHFUA:9 a=QEXdDO2ut3YA:10 a=PxkB5W3o20Ba91AHUih5:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTI0MDAxMiBTYWx0ZWRfX9u5qZeYq3io8 lStWhYkgQGp0MnWVQRcxzGcWVQtHDW1qOp2QCKJqjtrnMH2z9IE4Xt1EeP3/mIKVCVS6/15cqwX wQvUVKnPtYuZ08RDeQLBFYbtI6cy+5mXb7Mrne+D1ITo99IjsDAvt2atlm7PajPKj6nnWE766aX zw3iVeGG20XeZNaE3vDgsMdxXzDv3YmR8bmjgcq7EXgiU8C48XIU6bjauHEzGTpyo8q857Cx1iO aWdo3ofaKkYERDQAXMnafpcxudNWL+hvZyUHVSz93VlXst+Q/mcK9BKyiLFjl5LCRXIOSu8eyq6 OdexV6kHGAD/CczC3u2fm6/i9/YFxtKUCw8lcXW1QMF3sFnl3x3bEK88CJqhyr3grPokUGIns2b 1wF9LtSK8e77CMuUjHCaK5E/DGgtzpYBXn8EMc1gGth2XUMqP0HCGATL4YznXBEhjgde/+J8QMe xoO2VZx8NUFUsA+e8BA== X-Proofpoint-ORIG-GUID: Q-GvegE9LgjnrL0bI8qVzSP0FcZglwHT X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-24_01,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 suspectscore=0 clxscore=1015 priorityscore=1501 phishscore=0 adultscore=0 impostorscore=0 lowpriorityscore=0 bulkscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609240012 A UHR Link Reconfiguration Request frame (ST Preparation or Execution) triggers SMD BSS Transition on the current AP MLD. Userspace needs reporting of the STA's dynamic context along with such frames so that the same can be transported to the target AP MLD for setting up the STA TX and RX queues. Reserve a field in ieee80211_rx_status that enables drivers to attach the STA's dynamic context to the corresponding frame. Since the maximum possible context can grow too big, attach the pointer to the context to the frame. Add handling for UHR ST Preparation and Execution Request frames so that the associated context is propagated through cfg80211 and nl80211 for userspace reporting. Signed-off-by: Pooventhiran G --- include/linux/ieee80211-uhr.h | 59 ++++++++++++++++++++++++++ include/net/cfg80211.h | 13 ++++++ include/net/mac80211.h | 10 ++++- net/mac80211/ieee80211_i.h | 2 + net/mac80211/rx.c | 96 +++++++++++++++++++++++++++++----------= ---- 5 files changed, 149 insertions(+), 31 deletions(-) diff --git a/include/linux/ieee80211-uhr.h b/include/linux/ieee80211-uhr.h index e6aaef9ae9e6..e74de842b281 100644 --- a/include/linux/ieee80211-uhr.h +++ b/include/linux/ieee80211-uhr.h @@ -743,6 +743,65 @@ ieee80211_uhr_mode_change_tuple_size(const struct ieee= 80211_uhr_mode_change_tupl IEEE80211_UHR_MODE_CHANGE_CONTROL_MODE_LENGTH); } =20 +/** + * ieee80211_is_uhr_link_reconf_req - check if frame is UHR Link Reconf Re= quest + * @skb: the SKB to check + * Return: whether or not the frame is a UHR Link Reconf Request frame + */ +static inline bool ieee80211_is_uhr_link_reconf_req(struct sk_buff *skb) +{ + struct ieee80211_mgmt *mgmt =3D (void *)skb->data; + u8 category, action; + + if (!ieee80211_is_action(mgmt->frame_control)) + return false; + + if (skb->len < IEEE80211_MIN_ACTION_SIZE(uhr_link_reconf_req)) + return false; + + category =3D mgmt->u.action.category; + action =3D mgmt->u.action.action_code; + + return category =3D=3D WLAN_CATEGORY_PROTECTED_UHR && + action =3D=3D IEEE80211_PROTECTED_UHR_ACTION_LINK_RECONFIG_REQUEST; +} + +/** + * ieee80211_is_st_prep_req - check if frame is ST Preparation Request + * @skb: the SKB to check + * Return: whether or not the frame is an ST Prep request frame + */ +static inline bool ieee80211_is_st_prep_req(struct sk_buff *skb) +{ + struct ieee80211_mgmt *mgmt =3D (void *)skb->data; + u8 type; + + if (!ieee80211_is_uhr_link_reconf_req(skb)) + return false; + + type =3D mgmt->u.action.uhr_link_reconf_req.type; + + return type =3D=3D IEEE80211_UHR_LINK_RECONFIG_REQUEST_ST_PREP; +} + +/** + * ieee80211_is_st_exec_req - check if frame is ST Execution Request + * @skb: the SKB to check + * Return: whether or not the frame is an ST Exec request frame + */ +static inline bool ieee80211_is_st_exec_req(struct sk_buff *skb) +{ + struct ieee80211_mgmt *mgmt =3D (void *)skb->data; + u8 type; + + if (!ieee80211_is_uhr_link_reconf_req(skb)) + return false; + + type =3D mgmt->u.action.uhr_link_reconf_req.type; + + return type =3D=3D IEEE80211_UHR_LINK_RECONFIG_REQUEST_ST_EXEC; +} + #define for_each_uhr_mode_change_tuple(data, len, tuple) \ for (tuple =3D (const void *)(data); \ (len) - ((const u8 *)tuple - (data)) >=3D sizeof(*tuple) && \ diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index a618b3c90161..02fe733f0204 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h @@ -4889,6 +4889,17 @@ struct mgmt_frame_regs { u32 global_mcast_stypes, interface_mcast_stypes; }; =20 +/** + * struct cfg80211_smd_transition_info - SMD BSS Transition info + * + * @ctx: Dynamic context to be transferred as part of ST + * @type: Type of ST indication + */ +struct cfg80211_smd_transition_info { + struct ieee80211_smd_ctx *ctx; + enum nl80211_smd_ctx_type type; +}; + /** * struct cfg80211_ops - backend description for wireless configuration * @@ -9546,6 +9557,7 @@ void cfg80211_conn_failed(struct net_device *dev, con= st u8 *mac_addr, * @rx_tstamp: Hardware timestamp of frame RX in nanoseconds * @ack_tstamp: Hardware timestamp of ack TX in nanoseconds * @no_sta: set if no station is known for the frame (relevant for MLD) + * @st_info: SMD BSS Transition data */ struct cfg80211_rx_info { int freq; @@ -9558,6 +9570,7 @@ struct cfg80211_rx_info { u64 rx_tstamp; u64 ack_tstamp; bool no_sta; + struct cfg80211_smd_transition_info st_info; }; =20 /** diff --git a/include/net/mac80211.h b/include/net/mac80211.h index 7bfa421535ca..a377a16da5c4 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h @@ -1735,6 +1735,10 @@ enum mac80211_rx_encoding { * @ack_tx_hwtstamp: Hardware timestamp for the ack TX in nanoseconds. Only * needed for Timing measurement and Fine timing measurement action frames. * Only reported by devices that have timestamping enabled. + * @smd_ctx: Pointer to IEEE P802.11bn SMD BSS Transition context informat= ion. + * Only needed for ST Preparation Request and ST Execution Request action + * frames. The pointer will be consumed by mac80211; must be kmalloc-ed. + * Indicated by @smd_ctx_valid. * @device_timestamp: arbitrary timestamp for the device, mac80211 doesn't= use * it but can store it and pass it back to the driver for synchronisation * @band: the active band when this frame was received @@ -1775,12 +1779,15 @@ enum mac80211_rx_encoding { * @link_id: id of the link used to receive the packet. Set and used by * mac80211 internally, it uses @freq set by the driver to identify the * correct link per vif. + * @smd_ctx_valid: if @smd_ctx has a valid pointer to the ST context. This= flag + * is used only for ST Preparation or ST Execution Request frames. */ struct ieee80211_rx_status { u64 mactime; union { u64 boottime_ns; ktime_t ack_tx_hwtstamp; + struct ieee80211_smd_ctx *smd_ctx; }; u32 device_timestamp; u32 ampdu_reference; @@ -1814,7 +1821,8 @@ struct ieee80211_rx_status { u8 chains; s8 chain_signal[IEEE80211_MAX_CHAINS]; u8 zero_length_psdu_type; - u8 link_id:4; + u8 link_id:4, + smd_ctx_valid:1; }; =20 static_assert(sizeof(struct ieee80211_rx_status) <=3D sizeof_field(struct = sk_buff, cb)); diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h index 9514f01778be..cf1a5d54d229 100644 --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h @@ -268,6 +268,8 @@ struct ieee80211_rx_data { }; =20 u8 link_addrs[3 * ETH_ALEN]; + + struct ieee80211_smd_ctx *smd_ctx; }; =20 struct ieee80211_csa_settings { diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index b3990b7a7299..4ad7a71d298a 100644 --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c @@ -3970,6 +3970,22 @@ ieee80211_rx_h_action(struct ieee80211_rx_data *rx) return RX_QUEUED; } =20 +static void +ieee80211_rx_h_userspace_mgmt_st_req_frame(struct cfg80211_rx_info *info, + struct ieee80211_rx_data *rx) +{ + struct ieee80211_mgmt *mgmt =3D (void *)info->buf; + u8 type; + + if (!rx->smd_ctx) + return; + + type =3D mgmt->u.action.uhr_link_reconf_req.type; + + info->st_info.type =3D type; + info->st_info.ctx =3D rx->smd_ctx; +} + static ieee80211_rx_result debug_noinline ieee80211_rx_h_userspace_mgmt(struct ieee80211_rx_data *rx) { @@ -3981,6 +3997,7 @@ ieee80211_rx_h_userspace_mgmt(struct ieee80211_rx_dat= a *rx) .link_id =3D rx->link_id, .have_link_id =3D rx->link_id >=3D 0, .no_sta =3D !rx->sta, + .st_info.ctx =3D NULL, }; =20 /* skip known-bad action frames and return them in the next handler */ @@ -4002,6 +4019,9 @@ ieee80211_rx_h_userspace_mgmt(struct ieee80211_rx_dat= a *rx) ieee80211_is_ftm(rx->skb)) { info.rx_tstamp =3D ktime_to_ns(skb_hwtstamps(rx->skb)->hwtstamp); info.ack_tstamp =3D ktime_to_ns(status->ack_tx_hwtstamp); + } else if (ieee80211_is_st_prep_req(rx->skb) || + ieee80211_is_st_exec_req(rx->skb)) { + ieee80211_rx_h_userspace_mgmt_st_req_frame(&info, rx); } =20 if (cfg80211_rx_mgmt_ext(&rx->sdata->wdev, &info)) { @@ -5340,7 +5360,8 @@ static bool ieee80211_rx_valid_freq(int freq, struct = ieee80211_link_data *link) static void __ieee80211_rx_handle_packet(struct ieee80211_hw *hw, struct ieee80211_link_sta *link_pubsta, struct sk_buff *skb, - struct list_head *list) + struct list_head *list, + struct ieee80211_rx_data *rx) { struct ieee80211_local *local =3D hw_to_local(hw); struct ieee80211_sub_if_data *sdata; @@ -5349,16 +5370,14 @@ static void __ieee80211_rx_handle_packet(struct iee= e80211_hw *hw, struct link_sta_info *link_sta; struct sta_info *sta; __le16 fc; - struct ieee80211_rx_data rx; struct rhlist_head *tmp; bool rx_data_pending; int err =3D 0; =20 fc =3D ((struct ieee80211_hdr *)skb->data)->frame_control; - memset(&rx, 0, sizeof(rx)); - rx.skb =3D skb; - rx.local =3D local; - rx.list =3D list; + rx->skb =3D skb; + rx->local =3D local; + rx->list =3D list; =20 if (ieee80211_is_data(fc) || ieee80211_is_mgmt(fc)) I802_DEBUG_INC(local->dot11ReceivedFragmentCount); @@ -5390,8 +5409,8 @@ static void __ieee80211_rx_handle_packet(struct ieee8= 0211_hw *hw, } =20 hdr =3D (struct ieee80211_hdr *)skb->data; - ieee80211_parse_qos(&rx); - ieee80211_verify_alignment(&rx); + ieee80211_parse_qos(rx); + ieee80211_verify_alignment(rx); =20 if (unlikely(ieee80211_is_probe_resp(hdr->frame_control) || ieee80211_is_beacon(hdr->frame_control) || @@ -5412,9 +5431,9 @@ static void __ieee80211_rx_handle_packet(struct ieee8= 0211_hw *hw, sta); link_sta =3D rcu_dereference(sta->link[link_pubsta->link_id]); =20 - rx.sdata =3D sta->sdata; - if (ieee80211_rx_data_set_link_sta(&rx, link_sta) && - ieee80211_prepare_and_rx_handle(&rx, skb, true)) + rx->sdata =3D sta->sdata; + if (ieee80211_rx_data_set_link_sta(rx, link_sta) && + ieee80211_prepare_and_rx_handle(rx, skb, true)) return; =20 goto out; @@ -5434,13 +5453,13 @@ static void __ieee80211_rx_handle_packet(struct iee= e80211_hw *hw, continue; =20 if (rx_data_pending) { - ieee80211_prepare_and_rx_handle(&rx, skb, + ieee80211_prepare_and_rx_handle(rx, skb, false); rx_data_pending =3D false; } =20 - rx.sdata =3D sta->sdata; - if (!ieee80211_rx_data_set_link_sta(&rx, &sta->deflink)) + rx->sdata =3D sta->sdata; + if (!ieee80211_rx_data_set_link_sta(rx, &sta->deflink)) continue; =20 rx_data_pending =3D true; @@ -5458,20 +5477,20 @@ static void __ieee80211_rx_handle_packet(struct iee= e80211_hw *hw, continue; =20 if (rx_data_pending) { - ieee80211_prepare_and_rx_handle(&rx, skb, + ieee80211_prepare_and_rx_handle(rx, skb, false); rx_data_pending =3D false; } =20 - rx.sdata =3D sta->sdata; - if (!ieee80211_rx_data_set_link_sta(&rx, link_sta)) + rx->sdata =3D sta->sdata; + if (!ieee80211_rx_data_set_link_sta(rx, link_sta)) continue; =20 rx_data_pending =3D true; } =20 if (rx_data_pending) { - if (ieee80211_prepare_and_rx_handle(&rx, skb, true)) + if (ieee80211_prepare_and_rx_handle(rx, skb, true)) return; =20 goto out; @@ -5526,14 +5545,14 @@ static void __ieee80211_rx_handle_packet(struct iee= e80211_hw *hw, if (link_sta && link && ieee80211_rx_valid_freq(status->freq, link)) { if (rx_data_pending) { - ieee80211_prepare_and_rx_handle(&rx, skb, false); + ieee80211_prepare_and_rx_handle(rx, skb, false); rx_data_pending =3D false; } =20 /* No valid_links check as we need to RX beacons */ =20 - rx.sdata =3D sdata; - if (ieee80211_rx_data_set_link_sta(&rx, link_sta)) + rx->sdata =3D sdata; + if (ieee80211_rx_data_set_link_sta(rx, link_sta)) rx_data_pending =3D true; =20 continue; @@ -5562,22 +5581,22 @@ static void __ieee80211_rx_handle_packet(struct iee= e80211_hw *hw, } =20 if (rx_data_pending) { - ieee80211_prepare_and_rx_handle(&rx, skb, false); + ieee80211_prepare_and_rx_handle(rx, skb, false); rx_data_pending =3D false; } =20 - rx.sdata =3D sdata; - rx.local =3D sdata->local; - rx.link =3D link; - rx.link_id =3D link->link_id; - rx.sta =3D NULL; - rx.link_sta =3D NULL; + rx->sdata =3D sdata; + rx->local =3D sdata->local; + rx->link =3D link; + rx->link_id =3D link->link_id; + rx->sta =3D NULL; + rx->link_sta =3D NULL; =20 rx_data_pending =3D true; } =20 if (rx_data_pending && - ieee80211_prepare_and_rx_handle(&rx, skb, true)) + ieee80211_prepare_and_rx_handle(rx, skb, true)) return; =20 out: @@ -5597,6 +5616,15 @@ void ieee80211_rx_list(struct ieee80211_hw *hw, struct ieee80211_supported_band *sband; struct ieee80211_rx_status *status =3D IEEE80211_SKB_RXCB(skb); struct ieee80211_hdr *hdr =3D (struct ieee80211_hdr *)skb->data; + struct ieee80211_smd_ctx *smd_ctx =3D NULL; + struct ieee80211_rx_data rx =3D {}; + + /* cache the pointer to free it later */ + if (status->smd_ctx_valid) { + smd_ctx =3D status->smd_ctx; + status->smd_ctx =3D NULL; + status->smd_ctx_valid =3D false; + } =20 WARN_ON_ONCE(softirq_count() =3D=3D 0); =20 @@ -5731,6 +5759,12 @@ void ieee80211_rx_list(struct ieee80211_hw *hw, =20 kcov_remote_start_common(skb_get_kcov_handle(skb)); =20 + rx.smd_ctx =3D smd_ctx; + + if (WARN_ONCE((status->flag & RX_FLAG_8023) && rx.smd_ctx, + "802.3 packet but with IEEE P802.11bn SMD context")) + goto drop; + /* * Frames with failed FCS/PLCP checksum are not returned, * all other frames are returned without radiotap header @@ -5748,12 +5782,14 @@ void ieee80211_rx_list(struct ieee80211_hw *hw, __ieee80211_rx_handle_8023(hw, link_pubsta, skb, list); else __ieee80211_rx_handle_packet(hw, link_pubsta, skb, - list); + list, &rx); } + kfree(smd_ctx); =20 kcov_remote_stop(); return; drop: + kfree(smd_ctx); kfree_skb(skb); } EXPORT_SYMBOL(ieee80211_rx_list); --=20 2.34.1 From nobody Thu Sep 24 13:39:02 2026 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (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 46CCA3DAAB5 for ; Thu, 24 Sep 2026 02:42:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790217733; cv=none; b=GVSevUjvQTAFhslHA7nvq1lWXa4mvx2zBIlajQGiVMR8pWPd3NbbXWRfonLhkEJcdVKTQ8octR+uGHGzIB8oO7RILuBqX2au6p3QNc+d1iDUZ0bjBRCRdm5o5yFb+XtBs3K6PVGvb16OMqS9+EBPbzk4LhxOPY5mJynxPF8WhCA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790217733; c=relaxed/simple; bh=S9kul3CpD6z2OTmJsg8rUPYoFnddpwppURYOv5c/ydc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=i8JlpV2qi2iiugjrw1SjOoYNGTr9CyZR23y3z5t9qj5ucysOc/v5KgikMkHPI8sJ4bFVWVKm5SJHdG7cTQo1pvIqsS/T8tWwGLN21tFcju7Gbv94fGln0dloF+PLaMGEiN2Xg90vBqIWQfTGMB32vt6j5ncRqXwkihn3keGWVig= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=PBZj56Pz; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=TRlHs+JK; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="PBZj56Pz"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="TRlHs+JK" Received: from pps.filterd (m0279863.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68O2JqpF999393 for ; Thu, 24 Sep 2026 02:42:10 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= DcBFuRXort4XfTSgyIjJzIB8N6Jbd//5Kj0AfROrZqk=; b=PBZj56Pzgilr8UVY Q90wtoYWf2E/bpn63V8343olVaQGqBLWlzeASJvL5dJPrkb7yJvYgTWrulZwueMC LTMDU71T81Qwx3unTEk+KAEsWO3sGa7oJQdx9XhjQPmIbooOKRlsbqJEjj4K0z5C 6RJdOsrLnWVxVw4hjZI/Vg55fL5hoYGlY4ujHaVxfy420e+99FcGox1iBJVg4beC q1+NGdK5dZzLsqoPrZ3J51qNlfRCL7ue9LftRz0+S+fiQXTUEeWxSsgp1xqInRwn 2gX/cSsAJkKalTwUmQmiEBhEFIlJovPPpY9GROvq9ddu/fPfME8FqnC+9GBNNyWV sAEoRw== Received: from mail-dy1-f197.google.com (mail-dy1-f197.google.com [74.125.82.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4gvbwmbwp8-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 24 Sep 2026 02:42:10 +0000 (GMT) Received: by mail-dy1-f197.google.com with SMTP id 5a478bee46e88-331b2ec616fso745911eec.1 for ; Wed, 23 Sep 2026 19:42:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1790217730; x=1790822530; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=DcBFuRXort4XfTSgyIjJzIB8N6Jbd//5Kj0AfROrZqk=; b=TRlHs+JKoWHd5Lc7zPy3lfCUZvQPIWRfFti8BWO4110dVdoxncWxUK7fg9EBvKcCdD zuj7HWf9uhqrc+13lcm3VVLHjGAXp0OrGkRxGBHPcLxu0/rwGRsYbVgabOaKJNeVrHBW EIn4shXds6TcklhVMDh7wZe3BnZe22CMIzJ/JouoOp1VDDoKxjlFfms3eyZisuRB9ojD vzRDRM7/JCpueJugEYOZ2oZubTcKILqMZpAouij7yJliWAYfIZ6UgzDEUh6wOW/4BTYy p06Mn10mZL9PQVVn5tpt/H1OvXbb5Vmr/w2086vMhE16NDvaGSAY/aMuMzeWFfOJKgOd J7Ng== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790217730; x=1790822530; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=DcBFuRXort4XfTSgyIjJzIB8N6Jbd//5Kj0AfROrZqk=; b=fjixcOLQkiSb5Y2EDrRXrDyqKjMv/PEqLEYj5MpZjg2zLhqEcToE5DqOhc1qvFKoGG A1dUvw4Ypvl/0SX1ovXQELX/KD+7vI3bVrr17AX1MbdxNzYJcYlnSrnBvkampYdgS8Ut 00HxkYUmlb/CdSzvJ7+v9vHohvKPIjIpBf4YjzDg0AHqqeUpJEHefMGEve1EsiCtGJ+8 Jpk8U4IP+yD1ZckukvRwudlr16qeX6j9wICF8r8zkG9uB7ZulVryKQLmTTjYfAwALlo+ K5BSWxl1lEA8MNqq2JkUjKa4PNAfw34Q75UfGM5SUhigT86UeaS0eInD/GbpRtX60Hwa 3/Ng== X-Forwarded-Encrypted: i=1; AKwUvBzrufgF8OOB2OILBEhBzJkzd/K7RixOxwYbXpFexlAO8Xcof9pb+NkSWAP9+9X/RVYjMVIOh/R3BPiqyok=@vger.kernel.org X-Gm-Message-State: AFuF++nAkhL27VDG31DHVlvXZDK+BwiYVFoA0P4GjY2BTWTBlcibEaGv 1Dr/7pd2D1x6WV9aLZ3vGvisthCCsUiRfOheHG4kHQUyFVsKHxiGr0hv+0tdOyXtN2BMFtU3VxN xIxgvl9n5I1WvnCRDlqdYK4b6W6P+2TQDTcWxs5NF5whJcDbC098S4ILXu+Bt+IEK3g== X-Gm-Gg: AYBFou1yXUxtGBFJk0HN8YBxUYGQ6kgpevLe4YBrD+k9cfuF+/oxXYPet1F7y0M3wlQ My3Mdyi7Y2ChrjqCkTgjQnFljsITEF4qT4dfHpSffk7a7oMw7soxD0S4ZgbJFdnChqZNlBzDeR9 BBsdJhDsYhGpkMUhf3/QYeBgEw3g4RfBeiSaagyRXui7GzV82HwOvXniXYG5co2Ex+Fu3R1XHD9 /2UmzCA3g9iDszID9mgMBBG11kwwc4V+9+dODMAhHURgnncGnaeqZ+Pa2LOBkPIdFn5cHpEjv3a T74aQtypc2pTT8JkeCKU2Q/4WynFMR9/lVQzdoWcnvXKNSEbo9eRCxh2qt2orv+BgOJW8TGmmrf OnJccjHqFrgVxBib5wz7Xqcy4S92G+08lmOxltDB3MvSBgqYI/t84GFBBdgizNeQjfCRRhoNL1R BSmZLBrcqX0cr7m/EsMRUICg== X-Received: by 2002:a05:7300:f588:b0:33b:ae91:1e62 with SMTP id 5a478bee46e88-3400459996bmr704700eec.41.1790217729711; Wed, 23 Sep 2026 19:42:09 -0700 (PDT) X-Received: by 2002:a05:7300:f588:b0:33b:ae91:1e62 with SMTP id 5a478bee46e88-3400459996bmr704671eec.41.1790217728896; Wed, 23 Sep 2026 19:42:08 -0700 (PDT) Received: from hu-pooventh-blr.qualcomm.com (blr-bdr-fw-01_GlobalNAT_AllZones-Outside.qualcomm.com. [103.229.18.19]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-33e96258351sm9692263eec.12.2026.09.23.19.42.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 23 Sep 2026 19:42:08 -0700 (PDT) From: Pooventhiran G Date: Thu, 24 Sep 2026 08:10:49 +0530 Subject: [PATCH wireless-next v2 12/16] wifi: nl80211: Pack SMD dynamic context along with frame Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260924-smd-v2-12-bb40094da1d4@oss.qualcomm.com> References: <20260924-smd-v2-0-bb40094da1d4@oss.qualcomm.com> In-Reply-To: <20260924-smd-v2-0-bb40094da1d4@oss.qualcomm.com> To: Johannes Berg , Kees Cook , "Gustavo A. R. Silva" Cc: linux-wireless@vger.kernel.org, linux-kernel@vger.kernel.org, linux-hardening@vger.kernel.org, pooventhiran.g@oss.qualcomm.com X-Mailer: b4 0.14.3 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTI0MDAxMiBTYWx0ZWRfX+SqB6XtFLEDZ abzK7IfvVF/5nljjfOKM8zQj/wdmLZL1zZqY54Y8flLVJ86e7zqb3JlzmMoBm//WZEVs+OEFSzC 5Y5MJMoDvY4r8RqpiAzM4E1RspVtnHY= X-Authority-Analysis: v=2.4 cv=R/6WitRX c=1 sm=1 tr=0 ts=6ab48e02 cx=c_pps a=Uww141gWH0fZj/3QKPojxA==:117 a=Ou0eQOY4+eZoSc0qltEV5Q==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=yOCtJkima9RkubShWh1s:22 a=EUspDBNiAAAA:8 a=Yp_7Wk0lyRs0mq3gzKQA:9 a=QEXdDO2ut3YA:10 a=PxkB5W3o20Ba91AHUih5:22 X-Proofpoint-GUID: uh7uTuvX1bvTTASoh9BEnNuFBgjeP7cb X-Proofpoint-ORIG-GUID: uh7uTuvX1bvTTASoh9BEnNuFBgjeP7cb X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTI0MDAxMiBTYWx0ZWRfXx5QDEC6IRU2F FEfzm10RGIIEfOy9m1cA4TAkqWsXQrPQEGVrHBcaOJ0OEQCOeh0kSljwSshsnyHI6HWntMvRNt9 glCikcPdA9GDmEJsabDBa+ifWgWqO44SePIOgjURooi9XOlSVe7H900DynsNqrXXQhVXjyxn2Ok 0C6lKuYfWdqBvc45s89E8VI1NEwiCMi9ZmyBa7RO42PeiK3HTwUjpTs1kfL23Q6eVR3Ixl6NMCU k4/HlfC8kI6wZIwR8aYlp+KJFOXWMT8LwszkQ8MCsr8QjmMWXe5zVQi7RXN6Z7Cm+566LKF42Z7 nPthfNerX8D4RNnRZgnKEypkAkVc6EUR9DRaYYdcaSWjvju0AWbBx+qk+Jte6sSgFlc+lNB/D+0 TXl4uH6fKaWIQfkcbCBD8qZ1S0xE3cROMIqgWWX8TOQFKqA2bpfz3T9IXDpVwAkyXC2ewxzRJ1c g8WC8lwigzLoVVTp3fQ== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-24_01,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 clxscore=1015 malwarescore=0 impostorscore=0 priorityscore=1501 lowpriorityscore=0 spamscore=0 suspectscore=0 phishscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609240012 While packing the received management frame in nl80211_send_mgmt() to send to userspace, nest the SMD dynamic context along with the frame message. This shall be used by userspace to transport the context to the target AP MLD for programming the dynamic state of the STA session for seamless roaming as part of SMD BSS Transition. Suggested-by: Jouni Malinen Co-developed-by: Aditya Sathish Signed-off-by: Aditya Sathish Signed-off-by: Pooventhiran G --- net/wireless/nl80211.c | 274 +++++++++++++++++++++++++++++++++++++++++++++= +++- 1 file changed, 273 insertions(+), 1 deletion(-) diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 3940e349f270..5dc9d654d6f6 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c @@ -19578,6 +19578,270 @@ nl80211_epcs_cfg(struct sk_buff *skb, struct genl= _info *info) return rdev_set_epcs(rdev, dev, val); } =20 +static size_t _nl80211_smd_ctx_nl_ba_param_size(u8 n_tids) +{ + size_t n =3D 0; + + n +=3D nla_total_size(0); /* ba_params nest header */ + n +=3D n_tids * (nla_total_size(0) + /* tid nest header */ + nla_total_size(sizeof(u16)) + /* buff_size */ + nla_total_size(sizeof(u8)) + /* policy */ + nla_total_size(0) + /* amsdu_support */ + nla_total_size(sizeof(u16)) + /* timeout */ + nla_total_size(0) + /* ext_no_frag */ + nla_total_size(sizeof(u8)) + /* ext_frag_lvl */ + nla_total_size(sizeof(u16))); /* ext_buff_size */ + + return n; +} + +static size_t +nl80211_smd_ctx_nl_size(struct cfg80211_smd_transition_info *st_info) +{ + const struct ieee80211_smd_ctx *ctx =3D st_info->ctx; + int n_dl_tids =3D 0, n_ul_tids =3D 0; + u8 pn_len =3D ctx->pn_len; + size_t n =3D 0; + + /* count valid TIDs */ + n_dl_tids =3D bitmap_weight(ctx->dl.valid_tid_bmap, + IEEE80211_SMD_CTX_NUM_TIDS); + n_ul_tids =3D bitmap_weight(ctx->ul.valid_tid_bmap, + IEEE80211_SMD_CTX_NUM_TIDS); + + n +=3D nla_total_size(sizeof(u8)); /* ST type */ + + /* outer NL80211_ATTR_SMD_CTX nest */ + n +=3D nla_total_size(0); /* nest header */ + + /* DL nest */ + n +=3D nla_total_size(0); /* DL nest header */ + + n +=3D nla_total_size(sizeof(u8)); /* valid_tid_bitmap */ + + if (test_bit(IEEE80211_SMD_CTX_VALID_DL_SN, ctx->valid_ctx_bmap)) { + n +=3D nla_total_size(0); /* DL SN nest header */ + n +=3D n_dl_tids * nla_total_size(sizeof(u16)); /* DL SN */ + } + + if (test_bit(IEEE80211_SMD_CTX_VALID_PN, ctx->valid_ctx_bmap)) + n +=3D nla_total_size(pn_len); /* DL PN */ + + if (test_bit(IEEE80211_SMD_CTX_VALID_BA_PARAMS, ctx->valid_ctx_bmap)) + n +=3D _nl80211_smd_ctx_nl_ba_param_size(n_dl_tids); /* DL BA */ + + /* UL nest */ + n +=3D nla_total_size(0); /* UL nest header */ + + n +=3D nla_total_size(sizeof(u8)); /* valid_tid_bitmap */ + + if (test_bit(IEEE80211_SMD_CTX_VALID_UL_SN, ctx->valid_ctx_bmap)) { + n +=3D nla_total_size(0); /* UL SN nest header */ + n +=3D n_ul_tids * nla_total_size(sizeof(u16)); /* UL SN */ + } + + if (test_bit(IEEE80211_SMD_CTX_VALID_PN, ctx->valid_ctx_bmap)) { + n +=3D nla_total_size(0); /* UL PN nest header */ + n +=3D n_ul_tids * nla_total_size(pn_len); /* UL PN */ + } + + if (test_bit(IEEE80211_SMD_CTX_VALID_BA_PARAMS, ctx->valid_ctx_bmap)) + n +=3D _nl80211_smd_ctx_nl_ba_param_size(n_ul_tids); /* UL BA */ + + if (ctx->drv_ctx_size) + n +=3D nla_total_size(ctx->drv_ctx_size); /* Driver data */ + + return n; +} + +static int +nl80211_put_smd_ctx_ba_params(struct sk_buff *msg, + const unsigned long *tid_bmap, + const struct ieee80211_smd_ctx_ba *ba_tids, + bool dl) +{ + u32 ba_params_attr =3D NL80211_SMD_CTX_DL_ATTR_BA_PARAMS; + struct nlattr *dl_ul_ba =3D NULL, *tid_ba =3D NULL; + u8 tid; + + if (!dl) + ba_params_attr =3D NL80211_SMD_CTX_UL_ATTR_BA_PARAMS; + + dl_ul_ba =3D nla_nest_start(msg, ba_params_attr); + if (!dl_ul_ba) + return -ENOBUFS; + + for_each_set_bit(tid, tid_bmap, IEEE80211_SMD_CTX_NUM_TIDS) { + const struct ieee80211_smd_ctx_ba *ba =3D &ba_tids[tid]; + + tid_ba =3D nla_nest_start(msg, tid + 1); + if (!tid_ba) + goto nla_fail; + + if (nla_put_u16(msg, NL80211_SMD_CTX_BA_ATTR_BUFF_SIZE, + ba->buffer_size) || + nla_put_u8(msg, NL80211_SMD_CTX_BA_ATTR_POLICY, + ba->ba_policy) || + (ba->amsdu_supported && + nla_put_flag(msg, + NL80211_SMD_CTX_BA_ATTR_AMSDU_SUPPORT)) || + nla_put_u16(msg, NL80211_SMD_CTX_BA_ATTR_TIMEOUT, + ba->timeout) || + (ba->ext_no_frag && + nla_put_flag(msg, NL80211_SMD_CTX_BA_ATTR_EXT_NO_FRAG)) || + nla_put_u8(msg, NL80211_SMD_CTX_BA_ATTR_EXT_FRAG_LEVEL, + ba->extfrag_level) || + nla_put_u16(msg, NL80211_SMD_CTX_BA_ATTR_EXT_BUFF_SIZE, + ba->ext_buffer_size)) { + nla_nest_cancel(msg, tid_ba); + goto nla_fail; + } + + nla_nest_end(msg, tid_ba); + } + + nla_nest_end(msg, dl_ul_ba); + return 0; + +nla_fail: + nla_nest_cancel(msg, dl_ul_ba); + return -ENOBUFS; +} + +static int nl80211_put_smd_ctx(struct sk_buff *msg, + struct cfg80211_smd_transition_info *st_info) +{ + struct nlattr *dl_sn =3D NULL, *ul_sn =3D NULL, *ul_pn =3D NULL; + struct nlattr *smd_ctx =3D NULL, *dl =3D NULL, *ul =3D NULL; + const struct ieee80211_smd_ctx *ctx; + u8 dl_tid_bmap =3D 0, ul_tid_bmap =3D 0; + bool pn_size_valid; + u8 tid; + + /* ST Type */ + if (nla_put_u8(msg, NL80211_ATTR_SMD_CTX_TYPE, st_info->type)) + return -ENOBUFS; + + smd_ctx =3D nla_nest_start(msg, NL80211_ATTR_SMD_CTX); + if (!smd_ctx) + return -ENOBUFS; + + ctx =3D st_info->ctx; + + /* Build DL context */ + dl_tid_bmap =3D bitmap_read(ctx->dl.valid_tid_bmap, 0, + IEEE80211_SMD_CTX_NUM_TIDS); + + dl =3D nla_nest_start(msg, NL80211_SMD_CTX_ATTR_DL); + if (!dl) + goto nla_fail; + + if (nla_put_u8(msg, NL80211_SMD_CTX_DL_ATTR_VALID_TID_BITMAP, + dl_tid_bmap)) + goto nla_fail_dl; + + if (test_bit(IEEE80211_SMD_CTX_VALID_DL_SN, ctx->valid_ctx_bmap)) { + dl_sn =3D nla_nest_start(msg, NL80211_SMD_CTX_DL_ATTR_SN); + if (!dl_sn) + goto nla_fail_dl; + + for_each_set_bit(tid, ctx->dl.valid_tid_bmap, + IEEE80211_SMD_CTX_NUM_TIDS) { + if (nla_put_u16(msg, tid + 1, ctx->dl.sn[tid])) { + nla_nest_cancel(msg, dl_sn); + goto nla_fail_dl; + } + } + nla_nest_end(msg, dl_sn); + } + + pn_size_valid =3D + ctx->pn_len && ctx->pn_len <=3D IEEE80211_SMD_CTX_MAX_PN_LEN; + + if (pn_size_valid && + test_bit(IEEE80211_SMD_CTX_VALID_PN, ctx->valid_ctx_bmap) && + nla_put(msg, NL80211_SMD_CTX_DL_ATTR_PN, ctx->pn_len, ctx->dl.pn)) + goto nla_fail_dl; + + if (test_bit(IEEE80211_SMD_CTX_VALID_BA_PARAMS, ctx->valid_ctx_bmap) && + nl80211_put_smd_ctx_ba_params(msg, ctx->dl.valid_tid_bmap, + ctx->dl.ba, true)) + goto nla_fail_dl; + + nla_nest_end(msg, dl); + + /* Build UL context */ + ul_tid_bmap =3D bitmap_read(ctx->ul.valid_tid_bmap, 0, + IEEE80211_SMD_CTX_NUM_TIDS); + + ul =3D nla_nest_start(msg, NL80211_SMD_CTX_ATTR_UL); + if (!ul) + goto nla_fail; + + if (nla_put_u8(msg, NL80211_SMD_CTX_UL_ATTR_VALID_TID_BITMAP, + ul_tid_bmap)) + goto nla_fail_ul; + + if (test_bit(IEEE80211_SMD_CTX_VALID_UL_SN, ctx->valid_ctx_bmap)) { + ul_sn =3D nla_nest_start(msg, NL80211_SMD_CTX_UL_ATTR_SN); + if (!ul_sn) + goto nla_fail_ul; + + for_each_set_bit(tid, ctx->ul.valid_tid_bmap, + IEEE80211_SMD_CTX_NUM_TIDS) { + if (nla_put_u16(msg, tid + 1, ctx->ul.sn[tid])) { + nla_nest_cancel(msg, ul_sn); + goto nla_fail_ul; + } + } + nla_nest_end(msg, ul_sn); + } + + if (pn_size_valid && + test_bit(IEEE80211_SMD_CTX_VALID_PN, ctx->valid_ctx_bmap)) { + ul_pn =3D nla_nest_start(msg, NL80211_SMD_CTX_UL_ATTR_PN); + if (!ul_pn) + goto nla_fail_ul; + + for_each_set_bit(tid, ctx->ul.valid_tid_bmap, + IEEE80211_SMD_CTX_NUM_TIDS) { + if (nla_put(msg, tid + 1, ctx->pn_len, + ctx->ul.pn[tid])) { + nla_nest_cancel(msg, ul_pn); + goto nla_fail_ul; + } + } + nla_nest_end(msg, ul_pn); + } + + if (test_bit(IEEE80211_SMD_CTX_VALID_BA_PARAMS, ctx->valid_ctx_bmap) && + nl80211_put_smd_ctx_ba_params(msg, ctx->ul.valid_tid_bmap, + ctx->ul.ba, false)) + goto nla_fail_ul; + + nla_nest_end(msg, ul); + + /* Driver data blob */ + if (ctx->drv_ctx_size && + nla_put(msg, NL80211_SMD_CTX_ATTR_DRV_DATA, ctx->drv_ctx_size, + ctx->drv_ctx)) + goto nla_fail; + + nla_nest_end(msg, smd_ctx); + + return 0; + +nla_fail_ul: + nla_nest_cancel(msg, ul); + +nla_fail_dl: + nla_nest_cancel(msg, dl); + +nla_fail: + nla_nest_cancel(msg, smd_ctx); + return -EINVAL; +} + #define NL80211_FLAG_NEED_WIPHY 0x01 #define NL80211_FLAG_NEED_NETDEV 0x02 #define NL80211_FLAG_NEED_RTNL 0x04 @@ -22203,10 +22467,14 @@ int nl80211_send_mgmt(struct cfg80211_registered_= device *rdev, struct cfg80211_rx_info *info, gfp_t gfp) { struct net_device *netdev =3D wdev->netdev; + int st_roaming_data_len =3D 0; struct sk_buff *msg; void *hdr; =20 - msg =3D nlmsg_new(100 + info->len, gfp); + if (info->st_info.ctx) + st_roaming_data_len =3D nl80211_smd_ctx_nl_size(&info->st_info); + + msg =3D nlmsg_new(100 + info->len + st_roaming_data_len, gfp); if (!msg) return -ENOMEM; =20 @@ -22242,6 +22510,10 @@ int nl80211_send_mgmt(struct cfg80211_registered_d= evice *rdev, nla_put_flag(msg, NL80211_ATTR_FRAME_NO_STA))) goto nla_put_failure; =20 + if (st_roaming_data_len && + nl80211_put_smd_ctx(msg, &info->st_info)) + goto nla_put_failure; + genlmsg_end(msg, hdr); =20 return genlmsg_unicast(wiphy_net(&rdev->wiphy), msg, nlportid); --=20 2.34.1 From nobody Thu Sep 24 13:39:02 2026 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (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 AEC133DBD53 for ; Thu, 24 Sep 2026 02:42:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790217736; cv=none; b=YwbCvZgDajKl8Mtu86Js3yPqH8l1u0Sb9JMyc0u/GPqMbNcE/deER+HUy97yh045sVK7OgUt51TeZXymQG2e2rYdVWCYtB5A03dfbLkpfiySf4L1vTMrjhiLdZldQd1YV19Ci3Dh3I3V5c4ide3C7Zb6/Hxgp3gx2Vr3h4sVQqc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790217736; c=relaxed/simple; bh=rsyg9OrxC2RSurVrwLyot/phk4aj8tlnPMYH8VeVBtA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=JGV/MjpyIbPmUYs652tn4C1I+K65MoyiCBp0QNKX66B84JNBmYvrfk4F5Gfnxi66wJhQIrh8dgyfIMEjrFtOUg3taB8xlh2bzrVbtYhO8BbW7BUILkV/f0a3YsScStEESC+hnoYFUvVDQB8oaClAnpBzN5Tv9DHIdAx20b2rmEA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=fCRtEAwt; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=MPo2gEeY; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="fCRtEAwt"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="MPo2gEeY" Received: from pps.filterd (m0279862.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68O2KKVa344735 for ; Thu, 24 Sep 2026 02:42:13 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= mBkciKky5zjvb0Hg8dGSMjmVQWKMKuOxs8eQ0lWL6P8=; b=fCRtEAwtnONDGJpG ap5sT9C5CZyg1eJL0claRn41YeD6/NQSaZaNzTiSqkvT7cfTFaDSAerE2MAXmSj/ KYIkN95sEmGtUnt+G6Y9BXle6zo99Jl+VQvAtURxV/4vC9kl/VsTyyD/RsItka6y LDqIUPGg2Y8SbNeczilvkSom4sF+2oG5kyz/So7e5SYvoC+OPn1YsnZC+9Zu+2m0 DENr7PYFBNMLSj0h5TdwP+N/Ak3bovYWvsL2bptI5WPiMexAkd7j1Ik9gTwE3c+Q 3UDttF1j9CdhFMdEiLV0O9k0LJFMaai4vwIfsa3vdBtotJCzfQLtmbe8ZNP5qutR VTNy6g== Received: from mail-dy1-f200.google.com (mail-dy1-f200.google.com [74.125.82.200]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4gvr908jtc-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 24 Sep 2026 02:42:13 +0000 (GMT) Received: by mail-dy1-f200.google.com with SMTP id 5a478bee46e88-30c0d568830so2909424eec.1 for ; Wed, 23 Sep 2026 19:42:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1790217733; x=1790822533; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=mBkciKky5zjvb0Hg8dGSMjmVQWKMKuOxs8eQ0lWL6P8=; b=MPo2gEeYb4ndlgJZJh1t6s7wSfyurbjltbnHXtTo89NC0FUIoOF0FvGCUZoD6CZHXl Tr6bqAM7Myvh/+pVtiBBvwV4SgzeFCOq36yHE0bLoQMEisQrHu3pb7mfVvPn40Sq5BhL fZjgkOSnBOxJYA2+6yywyqQ8cP/HpoWtmCLlIwKEyAgoWtllkrHJRQbKUtLWWr2Zbtts XOC/frWvFT9RDpOR2SRfNThF+eqV3Ut8WtMv2lky04pZI4IrfewKkHjptsI56IZM3wTI DQ3RWTpCh48b0Im1J5v5iixJCj/uHvOI/9PAF2rSvLauljNVEQxf1FQ2Rx63rAhaBS0N jHrA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790217733; x=1790822533; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=mBkciKky5zjvb0Hg8dGSMjmVQWKMKuOxs8eQ0lWL6P8=; b=EOa4NISFc7Ni4xOtANNM05ZhD0eJFw2QTHg0tgiRI96p3xXxfw7RU9AR5JVp7sDBuC S6SunFSaqZN5jRtjF3SPv/P6s3ZGjNtAhYeyAEOuOl51E+Jkrd8jRqIVJHpPbl13DkGi P8gpdu3sgAgNqTVpOs1TeLwUAEnOjC6NzceC5SnmvWtPDERFGMD5obb4BkTlVo1ZHBI5 KVPEi4zy5eo6wLfLoY2cpEEgzu6E2b0YM/hc4oZc0oChAy7Z1lqMcoAymXhdcPxt4JoV ysCaGdCNG8YRlGoEOjngePSVmaKyNC4ui7O+5H0C86/iaO/WzAUEVuO3efShy4QaXEbN Zplw== X-Forwarded-Encrypted: i=1; AKwUvBxmVjdXYU7gpLAFMRAPu9H4/sam836q4iiOXTpByW4Fv276L59ApkHDcTyqX3kAouL6Wrpm1sS/AUBHeeU=@vger.kernel.org X-Gm-Message-State: AFuF++ns8qHyTGX0HL8SPWFrjTZOHgPWdshapsa1OOteZRHVzrc3339n LmehXQ/yZ9qmbxD5SLeQCtBCbSeYVguT5AtubiD9rpEaYxH5JyZg5wq09YDJILsNqbLkZYlLuTr y55gzbA+o+0SZdKApfM06Ia4aLzN8pkO6QJXL6QuGhrp9orjvEdKOv73xM5dTODPKvQ== X-Gm-Gg: AYBFou0JWuBXtBYhNHQ+jIlH4Zx++2QtLNmn6Z9yCPb//GOdbHpr+G7EbLwmzukWQVY 4ACQjBFionzTr7/4+NMtoL1b1EeivEUx8E017UCV40PUYYZ9SixkzRTiAjDDkmhyDfbk2fuNC+F VCGSP8/uxyjPZ4krZfxhBOCynSoUJHKUiXkOCZEsfsFiF5jbR6Cv9qyRGJlI9p5ID+3Ai/Ca1Nj WD15NMA7Agt51p1PaQ4eCvbORNMQZ9XKrUdd8kC9QUesUKaU2PpJQbfSN12yW7ClXC51zzh4Ggh Y4HMiUEOoH7iyNrQzX4eXKw+klfpm0PucXgRye9CHmko0X++FqRPPniLUrKZTfySD4c01/fYPQc vze2ydwXGleAsxE1bogq1TWB6WB7ckq6wdQGgZlt5oAvhLdl1o6NLR+vxg42HFRjHlV3zcLNjC4 +P3+4VBU/V/rC/I2keQquEIQ== X-Received: by 2002:a05:7301:77ca:b0:33c:e93:764d with SMTP id 5a478bee46e88-3400151e050mr795420eec.39.1790217732660; Wed, 23 Sep 2026 19:42:12 -0700 (PDT) X-Received: by 2002:a05:7301:77ca:b0:33c:e93:764d with SMTP id 5a478bee46e88-3400151e050mr795395eec.39.1790217732013; Wed, 23 Sep 2026 19:42:12 -0700 (PDT) Received: from hu-pooventh-blr.qualcomm.com (blr-bdr-fw-01_GlobalNAT_AllZones-Outside.qualcomm.com. [103.229.18.19]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-33e96258351sm9692263eec.12.2026.09.23.19.42.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 23 Sep 2026 19:42:11 -0700 (PDT) From: Pooventhiran G Date: Thu, 24 Sep 2026 08:10:50 +0530 Subject: [PATCH wireless-next v2 13/16] wifi: nl80211/cfg80211: Add support for SMD context programming Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260924-smd-v2-13-bb40094da1d4@oss.qualcomm.com> References: <20260924-smd-v2-0-bb40094da1d4@oss.qualcomm.com> In-Reply-To: <20260924-smd-v2-0-bb40094da1d4@oss.qualcomm.com> To: Johannes Berg , Kees Cook , "Gustavo A. R. Silva" Cc: linux-wireless@vger.kernel.org, linux-kernel@vger.kernel.org, linux-hardening@vger.kernel.org, pooventhiran.g@oss.qualcomm.com X-Mailer: b4 0.14.3 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTI0MDAxMiBTYWx0ZWRfX2kuxqsoXgit0 FFbtUQtoHlyv4fBu/j+vgN58spHOmbSa0yed/KgCijZqUVu0ffDadgXeXdJKziTuiR0nYSpIBYD fsYRMbcfhUXRrMMGMDNEw6M1LfwD8M0= X-Proofpoint-GUID: _DRHZ0VdWGmuM1C1cAdHNPslSq4q0BOv X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTI0MDAxMiBTYWx0ZWRfXxu0UdQXNUlfK zMRvPxUTblfpEF8mfMZb5e6QchdK9UO59FUf4028ocknvJZmbxxAiqU5SabpJUmPyE7KG5VkRfq KhrX9Apw6OXGeWfb4JK1u49dgjcFd14oXLuV7qcPr15leUAunfIopIIIO5grkgqArgezXnTIcqJ kgw/biK7UzpovdRlmMrvkY0C6ynhiwiIvzMl00CDNnNoDrb4ElCxpfLCQKKmUY8gFV2qm2k5NmC FKsI+9oN+bbSlZSG+nwLqfWwqHZ4iJsPreuIiNGAEG1bkhCdEW+CNSFp//FOilLNb+83OKiVJIv pC7bUaxYSS68rx1gOGAfINapGNHPT+HCh4ASiXEXqDG4p/PxsLKhTHOWPj5Tw/R7z+UrM819EUu lpOgFo9q3PJSlcFH6tVOBlVBewMgcdYp83CMBDoafPEfDq7a5VY0Ak73CATgUUx6S5nCZLktKRy r8j4g+ClA0befx2bXnA== X-Proofpoint-ORIG-GUID: _DRHZ0VdWGmuM1C1cAdHNPslSq4q0BOv X-Authority-Analysis: v=2.4 cv=fMusTpae c=1 sm=1 tr=0 ts=6ab48e05 cx=c_pps a=PfFC4Oe2JQzmKTvty2cRDw==:117 a=Ou0eQOY4+eZoSc0qltEV5Q==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=_K5XuSEh1TEqbUxoQ0s3:22 a=EUspDBNiAAAA:8 a=4KCYKawKnagZyZotmBEA:9 a=QEXdDO2ut3YA:10 a=6Ab_bkdmUrQuMsNx7PHu:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-24_01,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 bulkscore=0 adultscore=0 lowpriorityscore=0 spamscore=0 clxscore=1015 impostorscore=0 malwarescore=0 priorityscore=1501 phishscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609240012 On the target AP MLD to which the STA will be transitioning, the dynamic context collected and sent by the current AP MLD needs to be programmed on the TX and RX queues to enable seamless transition and reception. Such data include Sequence Number (SN), Packet Number (PN), BlockAck sessions, and any driver-specific data. Add nl80211 support to handle NL80211_CMD_SET_SMD_CTX, parse the SMD context attributes, and invoke the cfg80211 operation on the target AP MLD. Signed-off-by: Pooventhiran G --- include/net/cfg80211.h | 7 + net/wireless/nl80211.c | 330 ++++++++++++++++++++++++++++++++++++++++++++= ++++ net/wireless/rdev-ops.h | 14 ++ net/wireless/trace.h | 47 +++++++ 4 files changed, 398 insertions(+) diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index 02fe733f0204..ab003692f00e 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h @@ -5331,6 +5331,10 @@ struct cfg80211_smd_transition_info { * * @start_pd: Start the PD interface. * @stop_pd: Stop the PD interface. + * + * @set_smd_ctx: Set UHR SMD context data for the non-AP MLD. @st_info->ct= x is + * freed immediately after this call returns; drivers must copy + * @st_info->ctx if asynchronous processing is required. */ struct cfg80211_ops { int (*suspend)(struct wiphy *wiphy, struct cfg80211_wowlan *wow); @@ -5709,6 +5713,9 @@ struct cfg80211_ops { bool val); int (*start_pd)(struct wiphy *wiphy, struct wireless_dev *wdev); void (*stop_pd)(struct wiphy *wiphy, struct wireless_dev *wdev); + int (*set_smd_ctx)(struct wiphy *wiphy, struct wireless_dev *wdev, + const u8 *addr, + struct cfg80211_smd_transition_info *st_info); }; =20 /* diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 5dc9d654d6f6..550f65634480 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c @@ -19842,6 +19842,293 @@ static int nl80211_put_smd_ctx(struct sk_buff *ms= g, return -EINVAL; } =20 +static int +nl80211_parse_smd_ctx_ba_params(struct nlattr *tb, + struct ieee80211_smd_ctx_ba *ba_tids, + unsigned long *valid_ctx_bmap) +{ + struct nlattr *ba_tb[NL80211_SMD_CTX_BA_ATTR_MAX + 1]; + struct ieee80211_smd_ctx_ba *ba; + struct nlattr *ba_attr; + int n_tids =3D 0; + int rem, tid; + + if (!tb) + return 0; + + nla_for_each_nested(ba_attr, tb, rem) { + tid =3D nla_type(ba_attr) - 1; + if (tid < 0 || tid >=3D IEEE80211_SMD_CTX_NUM_TIDS) + return -EINVAL; + + if (nla_parse_nested(ba_tb, NL80211_SMD_CTX_BA_ATTR_MAX, + ba_attr, nl80211_smd_ctx_ba_policy, + NULL)) + return -EINVAL; + + ba =3D &ba_tids[tid]; + + if (ba_tb[NL80211_SMD_CTX_BA_ATTR_BUFF_SIZE]) + ba->buffer_size =3D + nla_get_u16(ba_tb[NL80211_SMD_CTX_BA_ATTR_BUFF_SIZE]); + + if (ba_tb[NL80211_SMD_CTX_BA_ATTR_POLICY]) + ba->ba_policy =3D + nla_get_u8(ba_tb[NL80211_SMD_CTX_BA_ATTR_POLICY]); + + ba->amsdu_supported =3D + !!ba_tb[NL80211_SMD_CTX_BA_ATTR_AMSDU_SUPPORT]; + + if (ba_tb[NL80211_SMD_CTX_BA_ATTR_TIMEOUT]) + ba->timeout =3D + nla_get_u16(ba_tb[NL80211_SMD_CTX_BA_ATTR_TIMEOUT]); + + ba->ext_no_frag =3D !!ba_tb[NL80211_SMD_CTX_BA_ATTR_EXT_NO_FRAG]; + + if (ba_tb[NL80211_SMD_CTX_BA_ATTR_EXT_FRAG_LEVEL]) + ba->extfrag_level =3D + nla_get_u8(ba_tb[NL80211_SMD_CTX_BA_ATTR_EXT_FRAG_LEVEL]); + + if (ba_tb[NL80211_SMD_CTX_BA_ATTR_EXT_BUFF_SIZE]) + ba->ext_buffer_size =3D + nla_get_u16(ba_tb[NL80211_SMD_CTX_BA_ATTR_EXT_BUFF_SIZE]); + + n_tids++; + } + + if (!n_tids) + return -EINVAL; + + set_bit(IEEE80211_SMD_CTX_VALID_BA_PARAMS, valid_ctx_bmap); + + return 0; +} + +static int nl80211_parse_smd_ctx(struct genl_info *info, + struct cfg80211_smd_transition_info *st_info) +{ + struct nlattr *dl_tb[NL80211_SMD_CTX_DL_ATTR_MAX + 1]; + struct nlattr *ul_tb[NL80211_SMD_CTX_UL_ATTR_MAX + 1]; + struct nlattr *tb[NL80211_SMD_CTX_ATTR_MAX + 1]; + struct ieee80211_smd_ctx *ctx; + struct nlattr *bmap_attr; + size_t drv_ctx_size =3D 0; + + st_info->type =3D nla_get_u8(info->attrs[NL80211_ATTR_SMD_CTX_TYPE]); + + if (nla_parse_nested(tb, NL80211_SMD_CTX_ATTR_MAX, + info->attrs[NL80211_ATTR_SMD_CTX], + nl80211_smd_ctx_policy, NULL)) { + GENL_SET_ERR_MSG(info, "failed to parse SMD context"); + return -EINVAL; + } + + if (tb[NL80211_SMD_CTX_ATTR_DRV_DATA]) + drv_ctx_size =3D nla_len(tb[NL80211_SMD_CTX_ATTR_DRV_DATA]); + + ctx =3D kzalloc(sizeof(*ctx) + drv_ctx_size, GFP_KERNEL); + if (!ctx) + return -ENOMEM; + + st_info->ctx =3D ctx; + + /* DL Context */ + if (tb[NL80211_SMD_CTX_ATTR_DL]) { + struct nlattr *ba_attr; + + if (nla_parse_nested(dl_tb, NL80211_SMD_CTX_DL_ATTR_MAX, + tb[NL80211_SMD_CTX_ATTR_DL], + nl80211_smd_ctx_dl_policy, NULL)) { + GENL_SET_ERR_MSG(info, "failed to parse DL context"); + goto err_free_ctx; + } + + bmap_attr =3D dl_tb[NL80211_SMD_CTX_DL_ATTR_VALID_TID_BITMAP]; + if (bmap_attr) + bitmap_write(ctx->dl.valid_tid_bmap, + nla_get_u8(bmap_attr), + 0, IEEE80211_SMD_CTX_NUM_TIDS); + + if (dl_tb[NL80211_SMD_CTX_DL_ATTR_SN]) { + struct nlattr *sn_attr; + int n_tids =3D 0; + int rem, tid; + + nla_for_each_nested(sn_attr, + dl_tb[NL80211_SMD_CTX_DL_ATTR_SN], + rem) { + tid =3D nla_type(sn_attr) - 1; + if (tid < 0 || + tid >=3D IEEE80211_SMD_CTX_NUM_TIDS) { + GENL_SET_ERR_MSG(info, + "invalid DL SN tid"); + goto err_free_ctx; + } + + if (nla_len(sn_attr) !=3D sizeof(u16)) { + GENL_SET_ERR_MSG(info, + "invalid DL SN len"); + goto err_free_ctx; + } + + ctx->dl.sn[tid] =3D nla_get_u16(sn_attr); + n_tids++; + } + + if (!n_tids) { + GENL_SET_ERR_MSG(info, "empty DL SN nesting"); + goto err_free_ctx; + } + + set_bit(IEEE80211_SMD_CTX_VALID_DL_SN, + ctx->valid_ctx_bmap); + } + + if (dl_tb[NL80211_SMD_CTX_DL_ATTR_PN]) { + const u8 *pn_data =3D + nla_data(dl_tb[NL80211_SMD_CTX_DL_ATTR_PN]); + + ctx->pn_len =3D + nla_len(dl_tb[NL80211_SMD_CTX_DL_ATTR_PN]); + + memcpy(ctx->dl.pn, pn_data, ctx->pn_len); + set_bit(IEEE80211_SMD_CTX_VALID_PN, + ctx->valid_ctx_bmap); + } + + ba_attr =3D dl_tb[NL80211_SMD_CTX_DL_ATTR_BA_PARAMS]; + if (ba_attr && + nl80211_parse_smd_ctx_ba_params(ba_attr, ctx->dl.ba, + ctx->valid_ctx_bmap)) { + GENL_SET_ERR_MSG(info, + "failed to parse DL BlockAck params"); + goto err_free_ctx; + } + } + + /* UL Context */ + if (tb[NL80211_SMD_CTX_ATTR_UL]) { + struct nlattr *ba_attr; + + if (nla_parse_nested(ul_tb, NL80211_SMD_CTX_UL_ATTR_MAX, + tb[NL80211_SMD_CTX_ATTR_UL], + nl80211_smd_ctx_ul_policy, NULL)) { + GENL_SET_ERR_MSG(info, "failed to parse UL context"); + goto err_free_ctx; + } + + bmap_attr =3D ul_tb[NL80211_SMD_CTX_UL_ATTR_VALID_TID_BITMAP]; + if (bmap_attr) + bitmap_write(ctx->ul.valid_tid_bmap, + nla_get_u8(bmap_attr), + 0, IEEE80211_SMD_CTX_NUM_TIDS); + + if (ul_tb[NL80211_SMD_CTX_UL_ATTR_SN]) { + struct nlattr *sn_attr; + int n_tids =3D 0; + int rem, tid; + + nla_for_each_nested(sn_attr, + ul_tb[NL80211_SMD_CTX_UL_ATTR_SN], + rem) { + tid =3D nla_type(sn_attr) - 1; + if (tid < 0 || + tid >=3D IEEE80211_SMD_CTX_NUM_TIDS) { + GENL_SET_ERR_MSG(info, + "invalid UL SN tid"); + goto err_free_ctx; + } + + if (nla_len(sn_attr) !=3D sizeof(u16)) { + GENL_SET_ERR_MSG(info, + "invalid UL SN len"); + goto err_free_ctx; + } + + ctx->ul.sn[tid] =3D nla_get_u16(sn_attr); + n_tids++; + } + + if (!n_tids) { + GENL_SET_ERR_MSG(info, "empty UL SN nesting"); + goto err_free_ctx; + } + + set_bit(IEEE80211_SMD_CTX_VALID_UL_SN, + ctx->valid_ctx_bmap); + } + + if (ul_tb[NL80211_SMD_CTX_UL_ATTR_PN]) { + struct nlattr *pn_attr; + int n_tids =3D 0; + int rem, tid; + + nla_for_each_nested(pn_attr, + ul_tb[NL80211_SMD_CTX_UL_ATTR_PN], + rem) { + u8 pn_len; + + tid =3D nla_type(pn_attr) - 1; + if (tid < 0 || + tid >=3D IEEE80211_SMD_CTX_NUM_TIDS) { + GENL_SET_ERR_MSG(info, + "invalid UL PN tid"); + goto err_free_ctx; + } + + /* + * PN length must be the same for all DL and + * UL TIDs. + */ + pn_len =3D nla_len(pn_attr); + if (pn_len > IEEE80211_SMD_CTX_MAX_PN_LEN || + (ctx->pn_len && pn_len !=3D ctx->pn_len)) { + GENL_SET_ERR_MSG(info, + "invalid PN length"); + goto err_free_ctx; + } + ctx->pn_len =3D pn_len; + + memcpy(ctx->ul.pn[tid], nla_data(pn_attr), + ctx->pn_len); + n_tids++; + } + + if (!n_tids) { + GENL_SET_ERR_MSG(info, "empty UL PN nesting"); + goto err_free_ctx; + } + + set_bit(IEEE80211_SMD_CTX_VALID_PN, + ctx->valid_ctx_bmap); + } + + ba_attr =3D ul_tb[NL80211_SMD_CTX_UL_ATTR_BA_PARAMS]; + if (ba_attr && + nl80211_parse_smd_ctx_ba_params(ba_attr, ctx->ul.ba, + ctx->valid_ctx_bmap)) { + GENL_SET_ERR_MSG(info, + "failed to parse UL BlockAck params"); + goto err_free_ctx; + } + } + + /* Driver data */ + if (tb[NL80211_SMD_CTX_ATTR_DRV_DATA]) { + ctx->drv_ctx_size =3D drv_ctx_size; + memcpy(ctx->drv_ctx, + nla_data(tb[NL80211_SMD_CTX_ATTR_DRV_DATA]), + drv_ctx_size); + } + + return 0; + +err_free_ctx: + kfree(ctx); + st_info->ctx =3D NULL; + return -EINVAL; +} + #define NL80211_FLAG_NEED_WIPHY 0x01 #define NL80211_FLAG_NEED_NETDEV 0x02 #define NL80211_FLAG_NEED_RTNL 0x04 @@ -20183,6 +20470,42 @@ static int nl80211_set_sar_specs(struct sk_buff *s= kb, struct genl_info *info) return err; } =20 +static int nl80211_set_smd_ctx(struct sk_buff *skb, struct genl_info *info) +{ + struct cfg80211_registered_device *rdev =3D info->user_ptr[0]; + struct cfg80211_smd_transition_info st_info =3D {}; + struct net_device *dev =3D info->user_ptr[1]; + struct wireless_dev *wdev =3D dev->ieee80211_ptr; + const u8 *addr; + int err; + + if (!rdev->ops->set_smd_ctx) + return -EOPNOTSUPP; + + if (wdev->iftype !=3D NL80211_IFTYPE_AP && + wdev->iftype !=3D NL80211_IFTYPE_AP_VLAN) + return -EINVAL; + + if (!info->attrs[NL80211_ATTR_MLD_ADDR] || + !info->attrs[NL80211_ATTR_SMD_CTX] || + !info->attrs[NL80211_ATTR_SMD_CTX_TYPE]) { + GENL_SET_ERR_MSG(info, "required attributes are missing"); + return -EINVAL; + } + + addr =3D nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); + + err =3D nl80211_parse_smd_ctx(info, &st_info); + if (err) + return err; + + /* drivers must copy @ctx for any deferred processing */ + err =3D rdev_set_smd_ctx(rdev, wdev, addr, &st_info); + + kfree(st_info.ctx); + return err; +} + #define SELECTOR(__sel, name, value) \ ((__sel) =3D=3D (value)) ? NL80211_IFL_SEL_##name : int __missing_selector(void); @@ -21084,6 +21407,13 @@ static const struct genl_small_ops nl80211_small_o= ps[] =3D { .flags =3D GENL_ADMIN_PERM, .internal_flags =3D IFLAGS(NL80211_FLAG_NEED_WDEV_UP), }, + { + .cmd =3D NL80211_CMD_SET_SMD_CTX, + .doit =3D nl80211_set_smd_ctx, + .flags =3D GENL_UNS_ADMIN_PERM, + .internal_flags =3D IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | + NL80211_FLAG_CLEAR_SKB), + }, }; =20 static struct genl_family nl80211_fam __ro_after_init =3D { diff --git a/net/wireless/rdev-ops.h b/net/wireless/rdev-ops.h index 46849fe8d0b3..d33a969606d7 100644 --- a/net/wireless/rdev-ops.h +++ b/net/wireless/rdev-ops.h @@ -1636,4 +1636,18 @@ rdev_set_epcs(struct cfg80211_registered_device *rde= v, return ret; } =20 +static inline int rdev_set_smd_ctx(struct cfg80211_registered_device *rdev, + struct wireless_dev *wdev, const u8 *addr, + struct cfg80211_smd_transition_info *st_info) +{ + int ret =3D -EOPNOTSUPP; + + trace_rdev_set_smd_ctx(&rdev->wiphy, wdev, addr, st_info); + if (rdev->ops->set_smd_ctx) + ret =3D rdev->ops->set_smd_ctx(&rdev->wiphy, wdev, addr, st_info); + trace_rdev_return_int(&rdev->wiphy, ret); + + return ret; +} + #endif /* __CFG80211_RDEV_OPS */ diff --git a/net/wireless/trace.h b/net/wireless/trace.h index 8c2a91b85c39..6234ceb9ebb1 100644 --- a/net/wireless/trace.h +++ b/net/wireless/trace.h @@ -4405,6 +4405,53 @@ TRACE_EVENT(cfg80211_nan_channel_evac, TP_printk(WDEV_PR_FMT ", " WIPHY_PR_FMT ", " CHAN_DEF_PR_FMT, WDEV_PR_ARG, WIPHY_PR_ARG, CHAN_DEF_PR_ARG) ); + +TRACE_EVENT(rdev_set_smd_ctx, + TP_PROTO(struct wiphy *wiphy, struct wireless_dev *wdev, const u8 *addr, + struct cfg80211_smd_transition_info *st_info), + + TP_ARGS(wiphy, wdev, addr, st_info), + + TP_STRUCT__entry( + WIPHY_ENTRY + WDEV_ENTRY + MAC_ENTRY(sta_addr) + __field(u8, st_type) + __field(unsigned int, num_tids) + __dynamic_array(unsigned long, tx_tid_bitmap, + BITS_TO_LONGS(IEEE80211_SMD_CTX_NUM_TIDS)) + __dynamic_array(unsigned long, rx_tid_bitmap, + BITS_TO_LONGS(IEEE80211_SMD_CTX_NUM_TIDS)) + ), + + TP_fast_assign( + struct ieee80211_smd_ctx *ctx =3D st_info->ctx; + unsigned long sz; + + WIPHY_ASSIGN; + WDEV_ASSIGN; + MAC_ASSIGN(sta_addr, addr); + __entry->st_type =3D st_info->type; + + __entry->num_tids =3D IEEE80211_SMD_CTX_NUM_TIDS; + sz =3D BITS_TO_LONGS(__entry->num_tids) * sizeof(unsigned long); + + memcpy(__get_dynamic_array(tx_tid_bitmap), + ctx->dl.valid_tid_bmap, sz); + memcpy(__get_dynamic_array(rx_tid_bitmap), + ctx->ul.valid_tid_bmap, sz); + ), + + TP_printk(WIPHY_PR_FMT ", " WDEV_PR_FMT + ", sta=3D%pM, ST type=3D%u DL TIDs: %*pb, UL TIDs: %*pb", + WIPHY_PR_ARG, WDEV_PR_ARG, __entry->sta_addr, + __entry->st_type, + __entry->num_tids, + (unsigned long *)__get_dynamic_array(tx_tid_bitmap), + __entry->num_tids, + (unsigned long *)__get_dynamic_array(rx_tid_bitmap)) +); + #endif /* !__RDEV_OPS_TRACE || TRACE_HEADER_MULTI_READ */ =20 #undef TRACE_INCLUDE_PATH --=20 2.34.1 From nobody Thu Sep 24 13:39:02 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (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 53E4D3DB303 for ; Thu, 24 Sep 2026 02:42:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790217740; cv=none; b=JR32nTI3VbyOXxLvLo7xLPwB/L4k7Mer13EZk3QYwBgujmXZi2p8ucvzsdMhyKKkpgoRHQrUsMqCQTt0tXmgiUtkr+haSpHbXZ1iBy9I8NzFtknWoTu1+3uK5Fu6lPrcZy10uukFs+292PC6UeiS3q/4ao9hg4j8zJrow/IpWU0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790217740; c=relaxed/simple; bh=6MDsvhsZRptcdzRT2KgxEhVYPgQoKySi/ytmitiXZf0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=in3b57cDchjqOvqnX6impLhv/W2XJMLVIQW/yXlcQjlR1FcwSPzRVwiHNikgt0dGO5TJO/C3svQqE/S2onThMO2PZPlqPeCOK4ejKhpVGTuwtxq7wU1qNco9uovbSTiIlLjTTDGorHrcpsKA96J1bQ7xsYMMRiL0tEnb1git4y4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=j8Qfdapf; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=EeyI6WuE; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="j8Qfdapf"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="EeyI6WuE" Received: from pps.filterd (m0279868.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68O2K3od722201 for ; Thu, 24 Sep 2026 02:42:17 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= 22Hkp/dfmESuHCK5pIE6zDXW+3S1sKzUXW4v3WjO7d0=; b=j8QfdapfhVCH+cms nRsJOhaYVc7hXZwzW3QSRy0lIUPNpK/lUJ23WcqGEPvDXrocusVjHyilZpF7W5Hb UdoPPZqkK0unww5sl0YT2gw7jJaQaJwBgLFiy/AQH1b/DOWygq+hHfBH2Q5RT24K NG8I2PcbR129rE0sMQWn3bRp2q7xaxe6iNPUYKzZ7cHaZMtUo+ayWuImkAiYhxKe D6Cacn3mwfx6yNv5sOJ5U2U+rJwnNKPzKy1MQmkuAnzVxzv19KeylxFmzvbipGDe XowqehR9/d+QJ1Qh7Bj4raXxFYNx+xb1frvRUTv3DINlqhVYm+jwmL/jCCkKQWcP yG4xMA== Received: from mail-dy1-f197.google.com (mail-dy1-f197.google.com [74.125.82.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4gvmrr9bxy-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 24 Sep 2026 02:42:16 +0000 (GMT) Received: by mail-dy1-f197.google.com with SMTP id 5a478bee46e88-30f1b904861so2168333eec.0 for ; Wed, 23 Sep 2026 19:42:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1790217736; x=1790822536; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=22Hkp/dfmESuHCK5pIE6zDXW+3S1sKzUXW4v3WjO7d0=; b=EeyI6WuEQNobOh0UyTdjiQxMngKPvE38n3kp6vBr2MqG0WGhy7dcvbjwQj0IY5NF5c 1q+oOhZwwJ+WXM/4/ElnIntUstSLy5t6tHXfcmiFiSmyKQg046lVEj2v4Jmx0JZTKPjw ApaYj+qJgXSBunbifNShOpO53bTFsalLMHxjkuuWaygQAPQrdQtqMeYQfEjgkoxWpoqd X89qWGdtbR2/eyHgZegHjgJtQAoTT2xkUU0F3PiU44dNYmxrnCf2dY9mWGXmDBMtFULH zKvmxM91czS7LcIoJC0YSm3UOFOhPBOo/jkDJl0KCNZfM7q1nsWXPMnJIb6+GJSpUnGT Zu/g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790217736; x=1790822536; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=22Hkp/dfmESuHCK5pIE6zDXW+3S1sKzUXW4v3WjO7d0=; b=Sy9NWZjshl+hOgH2MUIzbrhG7e9rp8kjwWK7uAsBtfsitOWP3GB8fPqveNg+KUSwQh 2Cqvft4NByX8pjI/KYas7wWUuRokVI/oDVifQIRjwaaS+pszJHx5QZTDfQSitdPWPrrI 1BsDzMA/2ZqfL4dabb0ulT88WMAjyxjkP2vr9h2UBU4mEVoslbm47kWg5Wpo6ZV/+7YN tlof43kXQoXeG/MHNN152CXzuswljHHzzsHMRM60J3DO+Am9sKNzJvfuUejpZ7w3j661 8zm0aqVM9D3F+fME8lizEntAyn3N3R/T/WGN0baT4/Wngx1jtQxVMmyo/DEXNUrm0WS2 CxCQ== X-Forwarded-Encrypted: i=1; AKwUvBxA2TGJ7HKWvoHscBm/849X0Lby7gUtktYdVy39/uZTmDp2yW0kiQYW2aC3lG6hMkK8R5Cga8A87W7YNUk=@vger.kernel.org X-Gm-Message-State: AFuF++mcp+q5N5qBK1iuD9Fu8W9MDmWxAES7cD/nZOOOb4eJMP7NPOui 66/Tj+OLeSnyESKIthV+fQVWZkEpKZralHcsVQKh2bofSR/REjRnunvfK9p/AZnECMBzb6LvvHk WsA2OrbZ6EOtOgZwEm3Rb2JfNUpHahGf80/Q+L0cmvPqql1wVzcVV4vNM1SpLSM5EPQ== X-Gm-Gg: AYBFou3sJJIK2IrPhcjGoe+RQDybb7OwPw0t9wYT6CbM0jhrTJEi4ngOWjvWtrJgZtH 27vpyc+DAPxyDh/QGJkNkHB9Ih1y4aJOFLQ2KkYQsyX2cEoo1ldA6J+Wj+fbCYugowNCpeECYo0 nHbPiDeNMN9lfG7u8Gp0kMPgfxivSWiQAB2A8JV6lSQaX+udsxdJimie/DGviolIiRQ8kyrEbjW RG7IUJNXr2FIpBnYh6ZX67nmDwqnHK/nSid3MREc5h3LpNzRa+6VK0dE7VZrFJ2KYoMMGTI1HrI +ys2bj+DpfasZz2OFKMbd0v8hcgfABubxTMYuwdB43UPXcBzEkw5dXCHP9tCjBi5vAkfjZBHMZl 1xMSeTchWjoPiiXSM71FFEXQKygKbjxd3lqBWsjgJgLNNWv7ZyhbQj9tuJrClXJpSvjNJMzr2aY bHS/l4m9ZYeqSYus4L3bSJFg== X-Received: by 2002:a05:693c:821a:b0:33e:699d:575d with SMTP id 5a478bee46e88-34003ca6caamr714418eec.1.1790217735745; Wed, 23 Sep 2026 19:42:15 -0700 (PDT) X-Received: by 2002:a05:693c:821a:b0:33e:699d:575d with SMTP id 5a478bee46e88-34003ca6caamr714390eec.1.1790217735131; Wed, 23 Sep 2026 19:42:15 -0700 (PDT) Received: from hu-pooventh-blr.qualcomm.com (blr-bdr-fw-01_GlobalNAT_AllZones-Outside.qualcomm.com. [103.229.18.19]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-33e96258351sm9692263eec.12.2026.09.23.19.42.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 23 Sep 2026 19:42:14 -0700 (PDT) From: Pooventhiran G Date: Thu, 24 Sep 2026 08:10:51 +0530 Subject: [PATCH wireless-next v2 14/16] wifi: mac80211: Add mac80211 support to handle NL80211_CMD_SET_SMD_CTX Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260924-smd-v2-14-bb40094da1d4@oss.qualcomm.com> References: <20260924-smd-v2-0-bb40094da1d4@oss.qualcomm.com> In-Reply-To: <20260924-smd-v2-0-bb40094da1d4@oss.qualcomm.com> To: Johannes Berg , Kees Cook , "Gustavo A. R. Silva" Cc: linux-wireless@vger.kernel.org, linux-kernel@vger.kernel.org, linux-hardening@vger.kernel.org, pooventhiran.g@oss.qualcomm.com X-Mailer: b4 0.14.3 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTI0MDAxMiBTYWx0ZWRfXyhWwIxufjTC2 9DKMmjs3QF8xnSbkXVSEhzB9YImpL4eIVFo1sRTHNDooETxKHbcxYqAMk+sIZq/X91O/GQk6aEk PCEb8AOSGIY8hVOijYtF8GeAWZwoaXjTHjl5GgsT/DCg1vvrCd6aB7BCxB89q2m1ZhxR27CCufm LUup4PToT59MqP+EWnz0x4uN/PIw002CORV+anEaEN3NYqOcHwSqGfDBdpUfVDDMtJpO2edMD52 UEEaAmVijCtwaGcIuLs878b8ywqXO2vTEYU76rQ+hAnDexk7WfhKvFZH5ULMBBJxGqVW4jLaEsh /2YoxNNrgec8pZuQwgT86VGiqnLm4/E2wOzUL0gm4kevmM18UB13e3XYp0KFWpdVoD+x+saxYSv 6SmZALEsJHymn6QbwwdXxZKracy1mqyt0HpTL4g2MqZjcmkJIvRm/o2QrZnRZvN5Hiixajsf/UG Nb4SYW89ZbIEbfiY3Pw== X-Authority-Analysis: v=2.4 cv=TYwDJhQh c=1 sm=1 tr=0 ts=6ab48e08 cx=c_pps a=Uww141gWH0fZj/3QKPojxA==:117 a=Ou0eQOY4+eZoSc0qltEV5Q==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=ZpdpYltYx_vBUK5n70dp:22 a=EUspDBNiAAAA:8 a=zHDNONmbSdC_GOYWSZkA:9 a=QEXdDO2ut3YA:10 a=PxkB5W3o20Ba91AHUih5:22 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTI0MDAxMiBTYWx0ZWRfXxUM9isHt00RQ wKMtWpao5MJb/dXo3HG7mx70F4vuAilgNE+ITfRYVjGKmiN5jtfDHxWXgNDDffBwTtbmaLt9Tkd RHZOhDuZkH4EojNFCUBHrF02PGt4SiI= X-Proofpoint-GUID: hsMAQhpbIffuUzd2rIyXtIcLU0lCTZuu X-Proofpoint-ORIG-GUID: hsMAQhpbIffuUzd2rIyXtIcLU0lCTZuu X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-24_01,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 malwarescore=0 phishscore=0 spamscore=0 lowpriorityscore=0 bulkscore=0 clxscore=1015 adultscore=0 priorityscore=1501 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609240012 cfg80211 supports NL80211_CMD_SET_SMD_CTX on the target AP MLD for userspace to program the station's dynamic context on the TX and RX queues. Add mac80211 support to handle this command in driver and lower layers so that the context is installed and the target AP MLD is ready to continue data transfer with the non-AP MLD from where it may have left off at the current AP MLD. This facilitates the seamless roaming benefit of the SMD BSS Transition procedure. Signed-off-by: Pooventhiran G --- include/net/mac80211.h | 5 +++++ net/mac80211/cfg.c | 26 +++++++++++++++++++++++++ net/mac80211/driver-ops.h | 24 +++++++++++++++++++++++ net/mac80211/trace.h | 49 +++++++++++++++++++++++++++++++++++++++++++= ++++ 4 files changed, 104 insertions(+) diff --git a/include/net/mac80211.h b/include/net/mac80211.h index a377a16da5c4..9b451628f248 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h @@ -4786,6 +4786,8 @@ enum ieee80211_sta_smd_state { * @sta_smd_state: Notifies low level driver about IEEE 802.11bn SMD subst= ate * transition of a station. It must not fail while transitioning down. * The callback can sleep. + * @set_smd_ctx: Set the UHR SMD context for the non-AP MLD. This is used = on + * the target AP MLD side to program dynamic context. */ struct ieee80211_ops { void (*tx)(struct ieee80211_hw *hw, @@ -5192,6 +5194,9 @@ struct ieee80211_ops { struct ieee80211_sta *sta, enum ieee80211_sta_smd_state old_state, enum ieee80211_sta_smd_state new_state); + int (*set_smd_ctx)(struct ieee80211_hw *hw, struct ieee80211_vif *vif, + struct ieee80211_sta *sta, + struct cfg80211_smd_transition_info *st_info); }; =20 /** diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c index 0ea8b610a771..2cf0e80137a7 100644 --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c @@ -6081,6 +6081,31 @@ ieee80211_set_peer_nan_sched(struct wiphy *wiphy, return ieee80211_nan_set_peer_sched(sdata, sched); } =20 +static int ieee80211_set_smd_ctx(struct wiphy *wiphy, struct wireless_dev = *wdev, + const u8 *addr, + struct cfg80211_smd_transition_info *st_info) +{ + struct ieee80211_local *local =3D wiphy_priv(wiphy); + struct ieee80211_sub_if_data *sdata; + struct sta_info *sta; + + lockdep_assert_wiphy(wiphy); + + sdata =3D IEEE80211_WDEV_TO_SUB_IF(wdev); + + if (sdata->vif.type !=3D NL80211_IFTYPE_AP && + sdata->vif.type !=3D NL80211_IFTYPE_AP_VLAN) + return -EOPNOTSUPP; + + sta =3D sta_info_get_bss(sdata, addr); + if (!sta) + return -ENOENT; + if (!sta->sta.smd_params.smd_sta) + return -EINVAL; + + return drv_set_smd_ctx(local, sdata, &sta->sta, st_info); +} + const struct cfg80211_ops mac80211_config_ops =3D { .add_virtual_intf =3D ieee80211_add_iface, .del_virtual_intf =3D ieee80211_del_iface, @@ -6199,4 +6224,5 @@ const struct cfg80211_ops mac80211_config_ops =3D { .set_epcs =3D ieee80211_set_epcs, .nan_set_local_sched =3D ieee80211_set_local_nan_sched, .nan_set_peer_sched =3D ieee80211_set_peer_nan_sched, + .set_smd_ctx =3D ieee80211_set_smd_ctx, }; diff --git a/net/mac80211/driver-ops.h b/net/mac80211/driver-ops.h index ce11a723ec36..e764dd394de2 100644 --- a/net/mac80211/driver-ops.h +++ b/net/mac80211/driver-ops.h @@ -1820,4 +1820,28 @@ int drv_sta_smd_state(struct ieee80211_local *local, enum ieee80211_sta_smd_state old_state, enum ieee80211_sta_smd_state new_state); =20 +static inline int drv_set_smd_ctx(struct ieee80211_local *local, + struct ieee80211_sub_if_data *sdata, + struct ieee80211_sta *sta, + struct cfg80211_smd_transition_info *st_info) +{ + int ret; + + if (!local->ops->set_smd_ctx) + return -EOPNOTSUPP; + + sdata =3D get_bss_sdata(sdata); + + lockdep_assert_wiphy(local->hw.wiphy); + + if (!check_sdata_in_driver(sdata)) + return -EIO; + + trace_drv_set_smd_ctx(local, sdata, sta, st_info); + ret =3D local->ops->set_smd_ctx(&local->hw, &sdata->vif, sta, st_info); + trace_drv_return_int(local, ret); + + return ret; +} + #endif /* __MAC80211_DRIVER_OPS */ diff --git a/net/mac80211/trace.h b/net/mac80211/trace.h index 63838a6d5d07..7aba79e441cf 100644 --- a/net/mac80211/trace.h +++ b/net/mac80211/trace.h @@ -3438,6 +3438,55 @@ TRACE_EVENT(drv_sta_smd_state, ) ); =20 +TRACE_EVENT(drv_set_smd_ctx, + TP_PROTO(struct ieee80211_local *local, + struct ieee80211_sub_if_data *sdata, + struct ieee80211_sta *sta, + struct cfg80211_smd_transition_info *st_info), + + TP_ARGS(local, sdata, sta, st_info), + + TP_STRUCT__entry( + LOCAL_ENTRY + VIF_ENTRY + STA_ENTRY + __field(u8, st_type) + __field(unsigned int, num_tids) + __dynamic_array(unsigned long, dl_tid_bitmap, + BITS_TO_LONGS(IEEE80211_SMD_CTX_NUM_TIDS)) + __dynamic_array(unsigned long, ul_tid_bitmap, + BITS_TO_LONGS(IEEE80211_SMD_CTX_NUM_TIDS)) + ), + + TP_fast_assign( + struct ieee80211_smd_ctx *ctx =3D st_info->ctx; + unsigned long sz; + + LOCAL_ASSIGN; + VIF_ASSIGN; + STA_ASSIGN; + __entry->st_type =3D st_info->type; + + __entry->num_tids =3D IEEE80211_SMD_CTX_NUM_TIDS; + sz =3D BITS_TO_LONGS(__entry->num_tids) * sizeof(unsigned long); + + memcpy(__get_dynamic_array(dl_tid_bitmap), + ctx->dl.valid_tid_bmap, sz); + memcpy(__get_dynamic_array(ul_tid_bitmap), + ctx->ul.valid_tid_bmap, sz); + ), + + TP_printk(LOCAL_PR_FMT VIF_PR_FMT STA_PR_FMT + ", ST type=3D%u DL TIDs: %*pb, UL TIDs: %*pb", + LOCAL_PR_ARG, VIF_PR_ARG, STA_PR_ARG, + __entry->st_type, + __entry->num_tids, + (unsigned long *)__get_dynamic_array(dl_tid_bitmap), + __entry->num_tids, + (unsigned long *)__get_dynamic_array(ul_tid_bitmap) + ) +); + #endif /* !__MAC80211_DRIVER_TRACE || TRACE_HEADER_MULTI_READ */ =20 #undef TRACE_INCLUDE_PATH --=20 2.34.1 From nobody Thu Sep 24 13:39:02 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.131]) (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 D21AC3D891C for ; Thu, 24 Sep 2026 02:42:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790217744; cv=none; b=aJ0D2pZDVFfds4u2N6Xd0W2UmBXfGv8rN8vhh3KgiluuEgHt+a9T+pD4yvaVAqyoY15I3MXpJ541NrD0mZLYcsrScE4zLn0ob8hJbCLNpndRxs5KMlHFH/rthOb7Z6BETH3c/3XFnPjR/py/rbhZxBWqvOK+3diKa6gw3nXwm74= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790217744; c=relaxed/simple; bh=G5Z8Q4mrpaJUYhgg7Iye7c1HxPEKe3dEZvEpQlOglWk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=BOFmpWABPIEcEiqImPNRy9/Xo+RYbtRE5CD15qfFUsz+Ou+qBR6WvWckbwWnwCESxg8QF5kGobQjLAsvnICc1HKLoGrD/P0+P4jLOKvjNv/o5oym48/zAKj5sJxbPsVqr+cy9MO6zVMd049gyWmi+7O91D9NTnSB2IaDn/eLlec= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=ppsID+Ns; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=Bh0VLZHw; arc=none smtp.client-ip=205.220.180.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="ppsID+Ns"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="Bh0VLZHw" Received: from pps.filterd (m0279872.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68O2KXRp159990 for ; Thu, 24 Sep 2026 02:42:20 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= mrsSw/baF5mdn64qF1y1HmmUd+kBtiEK8BpufQrVGb4=; b=ppsID+NsaiLeMwci dV/UART6Me3o/UbCghH9DUGkqJhRYcRgz3spb2v9CniICxHjI51i43LV4p0d3ecF Ku+4JZt/XyUWHaQMvMBMyqWN6xN59i5vq7X7Vyffky7e6/ASOLNQzqjgZIsoQ82o tf0wbZmc7L7AK0qdvYqaDcD3HvSSph7Kx+rUDW/TY7W+2/Ua+Ce4n0/G148J1ayY EuC3jHEGylabVkgt3MgzcRPiPPVjdGpZOwIZGNiMmrAEOGJn0yxc2f3ZrUyOjpyA nYH1CZCHGsXh5t412E/xXU99+nNHcwYfmIvKyXa7TY7JJZLY2LdpV4Rsltf80iKb dYwCYA== Received: from mail-dy1-f198.google.com (mail-dy1-f198.google.com [74.125.82.198]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4gvfmwjw1r-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 24 Sep 2026 02:42:20 +0000 (GMT) Received: by mail-dy1-f198.google.com with SMTP id 5a478bee46e88-338c2e27430so1388499eec.0 for ; Wed, 23 Sep 2026 19:42:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1790217739; x=1790822539; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=mrsSw/baF5mdn64qF1y1HmmUd+kBtiEK8BpufQrVGb4=; b=Bh0VLZHwBlKunZUaky5tg6sa0dF3w9tJNe9Z8GHySe7cd1JcnLMuKGzNksmpR8B5QU HBNIoU8VRulhLUFFEhNVDfMenUw+FJxp6F3+/9STNjge1Q/wFIXDU6/Y/98oLt9ftAYt hz3MBrUwwr5mefwVpu8O58H7BqajdrrFRrPOIXULSUUa7dqcnzvOiBB8dFGko3KwZbES BOCkzzVwQHlibqKlBMF1cuYF25fqId0O74728aDTHjbp+jPw0wNSBLQ0/eRrmBn4Cvzr EwdBzGoUzV+Jp2ULQmI+p7WdEPBBRg6bbXSCT5fqSqKy9XXbrODlNRnhprPVN2sIxt9O 74hw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790217739; x=1790822539; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=mrsSw/baF5mdn64qF1y1HmmUd+kBtiEK8BpufQrVGb4=; b=QTV5BM5h+DkbwRBnqg35vKgD7/upi/aYewR4aIorpnO4noLHiPKs/MQ1W96w2mKwQw 5SqoIHIrQxwkbjcz2KF3gyon4PAZQN6ol7JR6KNtW4fwaP37cT4RZL06ggxYFaMqmaaT D2UOl8RZ1txqVSs68cq/Y9vS3Rt+H8bIqV/SaZIRiRHKixrlx1eDCm5bAQFnbUYyzwPz XKrYLd3MWADej/U+AdyTg8NPVx6K4B/x6Uiu4friyDlRzV/bdZbOchq24G7gsG95Oy12 +eYETOmNnwlq2YfW8bphlmVcl5ClLNeZWQH+G1QD3GIs6IO1Pu1Y4BH8oXWdA4UYkSU9 NPFw== X-Forwarded-Encrypted: i=1; AKwUvBwef6XYBoQvTJ8BznuggJ22/p95ik6WogxyMgPJjMsAkW24Mxizk4iAendLrlw72QAwjMPSqqBwna/yzD0=@vger.kernel.org X-Gm-Message-State: AFuF++l7cTSL3LDQSxoMd4W+eajpYuEBmEwS3evF8w/x09+mHFu2+RQE yFKuHc1QEAUFJAe5TgT1jcg6y/n/M/3NfpaE/V7za10YmFCFkOMl3iWx9QgQ2bPMBgvHJpUkE2T p8wgFQLn3NlJxGaLBqS2Q4GU4UYykBE5AOCw5ZzHnyeifSIxk7/gSRLoSz9w4JiZpZt6ddcvYYA == X-Gm-Gg: AYBFou0jtp8SfvBZ2WSeuEjWaKBcdoX4sqAOzvilZxV2Sr313Bj4NM/eB3Fj+mVN70Y LWol8HwCzYdZbwK5sHkzrAQQUTCExrvNQOgdZsifoS2yHlNLW3rR9Ng3t5a1SzZNnCMTo/9MlaE 6/ABDkeI3lHqQ7WEZqrlW42nH6zGZqZ4mkMhiDKz+l+/faE+q0Ok0EiaCaClGRSVMaf67QYxL8h c0cUEupvsZF57nnlLURUvCOwNWVwZZtLec0mIXGl3JZMX8qo7gSGeyjxnXhWGY6sI2SyQzl8K57 IBjw02TY9M4sVdEOQ1n3mqeBV0qIlkAmqTlSvAOm1yNhRKx9DCMcI8aqpmd+BS6ons3J8MFTl5i jY8k4LASC7q+UX0yZbTtczflblN4Z1lpAJDatNn8hR/1GrFxMjDfI3+7CAsFSIfe42/ZqXA5+Uo +0+fwEPplpiyub2Z86CHcxZA== X-Received: by 2002:a05:693c:41db:10b0:339:7204:9490 with SMTP id 5a478bee46e88-34001917564mr719280eec.39.1790217739112; Wed, 23 Sep 2026 19:42:19 -0700 (PDT) X-Received: by 2002:a05:693c:41db:10b0:339:7204:9490 with SMTP id 5a478bee46e88-34001917564mr719259eec.39.1790217738293; Wed, 23 Sep 2026 19:42:18 -0700 (PDT) Received: from hu-pooventh-blr.qualcomm.com (blr-bdr-fw-01_GlobalNAT_AllZones-Outside.qualcomm.com. [103.229.18.19]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-33e96258351sm9692263eec.12.2026.09.23.19.42.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 23 Sep 2026 19:42:17 -0700 (PDT) From: Pooventhiran G Date: Thu, 24 Sep 2026 08:10:52 +0530 Subject: [PATCH wireless-next v2 15/16] wifi: nl80211/cfg80211: Add support for querying SMD context for target AP MLD Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260924-smd-v2-15-bb40094da1d4@oss.qualcomm.com> References: <20260924-smd-v2-0-bb40094da1d4@oss.qualcomm.com> In-Reply-To: <20260924-smd-v2-0-bb40094da1d4@oss.qualcomm.com> To: Johannes Berg , Kees Cook , "Gustavo A. R. Silva" Cc: linux-wireless@vger.kernel.org, linux-kernel@vger.kernel.org, linux-hardening@vger.kernel.org, pooventhiran.g@oss.qualcomm.com X-Mailer: b4 0.14.3 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTI0MDAxMiBTYWx0ZWRfX4BDW/YWu9maJ RrCPLmrkaM3aEzot8CBfOMbn3uGg0/067rTxi/PKF2BiuIKFkjLeYOkleD8GoNG5aHWNiv2fk3F yBJLvfGFeA9nRIs+yOKbCw3p/FTI1U0qvgLFwCe9THQdUbG+NUvEmXvjpCPQjGx/fX1NnnnCyoq E9CUh3aawxdk1Wtkn2y6SI33FufOlUll1arqoNU1bGs7Q4LwvAYIRyhN4QW7ICl/v3U6djU8Yu0 OY/7k4fznzND6YE1k2kNqsfy5zEVo35/esMy13c10v+aurqwrtOX1eQg2Tpo65s5NJW8YupAkTi 9JOQ6Sb79cIRDBMMhT6fIjsbZ0ik8I+D+wjdgOvNjrztiP/fXSef3WWywOpSOnwy7SQohnDPLZ8 sGGs0EnwlPbJz9HxzBePKacpn3PHiuaea8dIZj3BxGgHReySMb9uejf1wtsmRe6E2FORWNaNlk8 FCbNg0QSBVqkBAQyCYQ== X-Authority-Analysis: v=2.4 cv=WK/qzXsR c=1 sm=1 tr=0 ts=6ab48e0c cx=c_pps a=wEP8DlPgTf/vqF+yE6f9lg==:117 a=Ou0eQOY4+eZoSc0qltEV5Q==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=yx91gb_oNiZeI1HMLzn7:22 a=EUspDBNiAAAA:8 a=hdw18t4awISUpvPuE2cA:9 a=QEXdDO2ut3YA:10 a=bBxd6f-gb0O0v-kibOvt:22 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTI0MDAxMiBTYWx0ZWRfXxBCPX1w41vRY EeY8U5IkD5Y9tpF1MvhDNxM0nVw9wKNYTUqxJzkkbc+PPrIgYYPDvqLXCFtM32gn1iCmWOwYG9R LEvGEedLWacQ5Zd8kv9wG7U+cxgsTe0= X-Proofpoint-ORIG-GUID: 0x9YYigEbZyBSAwwzTYg1ZF0tJlrPQ_w X-Proofpoint-GUID: 0x9YYigEbZyBSAwwzTYg1ZF0tJlrPQ_w X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-24_01,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 clxscore=1015 bulkscore=0 suspectscore=0 adultscore=0 priorityscore=1501 malwarescore=0 lowpriorityscore=0 impostorscore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609240012 During SMD BSS Transition, the non-AP MLD that has been prepared with a target AP MLD may send the ST Execution frame directly to the target AP MLD. In such scenarios, the target AP MLD should pull the context from the current AP MLD to program TX and RX queues. Add nl80211 support to handle NL80211_CMD_GET_SMD_CTX, which is sent by userspace of the current AP MLD on behalf of the target AP MLD. This command carries the context type to indicate to the drivers which context needs to be collected. Once the collection is complete, the context is sent back to userspace as an asynchronous multicast event using NL80211_CMD_SMD_CTX_EVENT with full context data carried in NL80211_ATTR_SMD_CTX. Signed-off-by: Pooventhiran G --- include/net/cfg80211.h | 53 ++++++++++++++++++ net/wireless/core.c | 25 +++++++++ net/wireless/mlme.c | 30 +++++++++++ net/wireless/nl80211.c | 140 ++++++++++++++++++++++++++++++++++++++++++++= ++-- net/wireless/nl80211.h | 9 ++++ net/wireless/rdev-ops.h | 14 +++++ net/wireless/trace.h | 26 +++++++++ 7 files changed, 293 insertions(+), 4 deletions(-) diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index ab003692f00e..71711dbbf749 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h @@ -4900,6 +4900,16 @@ struct cfg80211_smd_transition_info { enum nl80211_smd_ctx_type type; }; =20 +/** + * struct cfg80211_smd_get_ctx_pending - pending async GET_SMD_CTX request + * @list: linkage on wireless_dev::smd_get_ctx_pending_list + * @sta_addr: non-AP MLD address for which context was requested + */ +struct cfg80211_smd_get_ctx_pending { + struct list_head list; + u8 sta_addr[ETH_ALEN]; +}; + /** * struct cfg80211_ops - backend description for wireless configuration * @@ -5335,6 +5345,8 @@ struct cfg80211_smd_transition_info { * @set_smd_ctx: Set UHR SMD context data for the non-AP MLD. @st_info->ct= x is * freed immediately after this call returns; drivers must copy * @st_info->ctx if asynchronous processing is required. + * + * @get_smd_ctx: Get UHR SMD context data for the non-AP MLD. */ struct cfg80211_ops { int (*suspend)(struct wiphy *wiphy, struct cfg80211_wowlan *wow); @@ -5716,6 +5728,9 @@ struct cfg80211_ops { int (*set_smd_ctx)(struct wiphy *wiphy, struct wireless_dev *wdev, const u8 *addr, struct cfg80211_smd_transition_info *st_info); + int (*get_smd_ctx)(struct wiphy *wiphy, struct wireless_dev *wdev, + const u8 *addr, + enum nl80211_smd_ctx_type type); }; =20 /* @@ -7288,6 +7303,8 @@ enum ieee80211_ap_reg_power { * @links.cac_time_ms: CAC time in ms * @valid_links: bitmap describing what elements of @links are valid * @radio_mask: Bitmask of radios that this interface is allowed to operat= e on. + * @smd_get_ctx_lock: lock to protect pending get_smd_ctx requests. + * @smd_get_ctx_pending_list: list to track pending get_smd_ctx requests. */ struct wireless_dev { struct wiphy *wiphy; @@ -7407,6 +7424,10 @@ struct wireless_dev { } links[IEEE80211_MLD_MAX_NUM_LINKS]; u16 valid_links; =20 + /* protects @smd_get_ctx_pending_list */ + spinlock_t smd_get_ctx_lock; + struct list_head smd_get_ctx_pending_list; + u32 radio_mask; }; =20 @@ -11085,4 +11106,36 @@ void cfg80211_incumbent_signal_notify(struct wiphy= *wiphy, u32 signal_interference_bitmap, gfp_t gfp); =20 +/** + * cfg80211_free_pending_smd_ctx_req - Free remaining entries in the + * cfg80211_smd_get_ctx_pending list. + * @wdev: wdev that maintains the list + * @addr: if @addr is NULL, drain the entire list; otherwise, drain only t= he + * matching entries + * + * When the current AP MLD requests the station's context, those requests = are + * maintained in a pending list until drivers notify completion. In case t= he + * device is brought down or the station is removed prematurely, free up t= he + * remaining entries in the list. + */ +void cfg80211_free_pending_smd_ctx_req(struct wireless_dev *wdev, + const u8 *addr); + +/** + * cfg80211_get_smd_ctx_done - deliver async GET_SMD_CTX result to nl80211 + * @wdev: wireless device that handled the request + * @sta_addr: non-AP MLD address the context was collected for + * @st_info: SMD BSS Transition Info (set @st_info->ctx to NULL to indicate + * failure) + * + * Called via ieee80211_get_smd_ctx_done after async driver context collec= tion + * completes. Finds the matching pending request and sends a multicast + * %NL80211_CMD_SMD_CTX_EVENT reply to userspace (MLME group). + * + * Return: None + */ +void cfg80211_get_smd_ctx_done(struct wireless_dev *wdev, + const u8 *sta_addr, + struct cfg80211_smd_transition_info *st_info); + #endif /* __NET_CFG80211_H */ diff --git a/net/wireless/core.c b/net/wireless/core.c index d13310fef691..129af6ba5fda 100644 --- a/net/wireless/core.c +++ b/net/wireless/core.c @@ -1405,6 +1405,25 @@ void wiphy_rfkill_set_hw_state_reason(struct wiphy *= wiphy, bool blocked, } EXPORT_SYMBOL(wiphy_rfkill_set_hw_state_reason); =20 +void cfg80211_free_pending_smd_ctx_req(struct wireless_dev *wdev, + const u8 *addr) +{ + struct cfg80211_smd_get_ctx_pending *pending, *tmp; + + spin_lock_bh(&wdev->smd_get_ctx_lock); + list_for_each_entry_safe(pending, tmp, + &wdev->smd_get_ctx_pending_list, + list) { + if (!addr || ether_addr_equal(pending->sta_addr, addr)) { + list_del(&pending->list); + kfree(pending); + dev_put(wdev->netdev); + } + } + spin_unlock_bh(&wdev->smd_get_ctx_lock); +} +EXPORT_SYMBOL(cfg80211_free_pending_smd_ctx_req); + static void _cfg80211_unregister_wdev(struct wireless_dev *wdev, bool unregister_netdev) { @@ -1477,6 +1496,10 @@ static void _cfg80211_unregister_wdev(struct wireles= s_dev *wdev, } } =20 + if (wdev->iftype =3D=3D NL80211_IFTYPE_AP || + wdev->iftype =3D=3D NL80211_IFTYPE_AP_VLAN) + cfg80211_free_pending_smd_ctx_req(wdev, NULL); + wdev->connected =3D false; } =20 @@ -1619,6 +1642,8 @@ void cfg80211_init_wdev(struct wireless_dev *wdev) INIT_LIST_HEAD(&wdev->pmsr_list); spin_lock_init(&wdev->pmsr_lock); wiphy_work_init(&wdev->pmsr_free_wk, cfg80211_pmsr_free_wk); + spin_lock_init(&wdev->smd_get_ctx_lock); + INIT_LIST_HEAD(&wdev->smd_get_ctx_pending_list); =20 #ifdef CONFIG_CFG80211_WEXT wdev->wext.default_key =3D -1; diff --git a/net/wireless/mlme.c b/net/wireless/mlme.c index a0d1cde26f0c..15e14f429c16 100644 --- a/net/wireless/mlme.c +++ b/net/wireless/mlme.c @@ -1475,3 +1475,33 @@ void cfg80211_mlo_reconf_add_done(struct net_device = *dev, nl80211_mlo_reconf_add_done(dev, data); } EXPORT_SYMBOL(cfg80211_mlo_reconf_add_done); + +void cfg80211_get_smd_ctx_done(struct wireless_dev *wdev, + const u8 *sta_addr, + struct cfg80211_smd_transition_info *st_info) +{ + struct cfg80211_smd_get_ctx_pending *pending =3D NULL, *iter; + + spin_lock_bh(&wdev->smd_get_ctx_lock); + list_for_each_entry(iter, &wdev->smd_get_ctx_pending_list, list) { + if (ether_addr_equal(iter->sta_addr, sta_addr)) { + pending =3D iter; + list_del(&pending->list); + break; + } + } + spin_unlock_bh(&wdev->smd_get_ctx_lock); + + if (!pending) { + wiphy_err(wdev->wiphy, + "No pending SMD ctx req for %pM found in %s\n", + sta_addr, __func__); + return; + } + + nl80211_notify_get_smd_ctx_done(wdev, sta_addr, st_info); + + dev_put(wdev->netdev); + kfree(pending); +} +EXPORT_SYMBOL(cfg80211_get_smd_ctx_done); diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 550f65634480..0de939495499 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c @@ -19595,8 +19595,7 @@ static size_t _nl80211_smd_ctx_nl_ba_param_size(u8 = n_tids) return n; } =20 -static size_t -nl80211_smd_ctx_nl_size(struct cfg80211_smd_transition_info *st_info) +size_t nl80211_smd_ctx_nl_size(struct cfg80211_smd_transition_info *st_inf= o) { const struct ieee80211_smd_ctx *ctx =3D st_info->ctx; int n_dl_tids =3D 0, n_ul_tids =3D 0; @@ -19708,8 +19707,8 @@ nl80211_put_smd_ctx_ba_params(struct sk_buff *msg, return -ENOBUFS; } =20 -static int nl80211_put_smd_ctx(struct sk_buff *msg, - struct cfg80211_smd_transition_info *st_info) +int nl80211_put_smd_ctx(struct sk_buff *msg, + struct cfg80211_smd_transition_info *st_info) { struct nlattr *dl_sn =3D NULL, *ul_sn =3D NULL, *ul_pn =3D NULL; struct nlattr *smd_ctx =3D NULL, *dl =3D NULL, *ul =3D NULL; @@ -20506,6 +20505,92 @@ static int nl80211_set_smd_ctx(struct sk_buff *skb= , struct genl_info *info) return err; } =20 +static struct cfg80211_smd_get_ctx_pending * +__cfg80211_get_smd_sta_pending_ctx(struct wireless_dev *wdev, const u8 *ad= dr) +{ + struct cfg80211_smd_get_ctx_pending *pending =3D NULL, *tmp; + + lockdep_assert_held(&wdev->smd_get_ctx_lock); + + list_for_each_entry(tmp, &wdev->smd_get_ctx_pending_list, list) { + if (ether_addr_equal(tmp->sta_addr, addr)) { + pending =3D tmp; + break; + } + } + + return pending; +} + +static int nl80211_get_smd_ctx(struct sk_buff *skb, struct genl_info *info) +{ + struct cfg80211_registered_device *rdev =3D info->user_ptr[0]; + struct net_device *dev =3D info->user_ptr[1]; + struct wireless_dev *wdev =3D dev->ieee80211_ptr; + struct cfg80211_smd_get_ctx_pending *pending; + enum nl80211_smd_ctx_type type; + const u8 *addr =3D NULL; + int err; + + if (!rdev->ops->get_smd_ctx) + return -EOPNOTSUPP; + + if (wdev->iftype !=3D NL80211_IFTYPE_AP && + wdev->iftype !=3D NL80211_IFTYPE_AP_VLAN) + return -EINVAL; + + if (!info->attrs[NL80211_ATTR_MLD_ADDR] || + !info->attrs[NL80211_ATTR_SMD_CTX_TYPE]) { + GENL_SET_ERR_MSG(info, "required attributes are missing"); + return -EINVAL; + } + + addr =3D nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]); + type =3D nla_get_u8(info->attrs[NL80211_ATTR_SMD_CTX_TYPE]); + + spin_lock_bh(&wdev->smd_get_ctx_lock); + if (__cfg80211_get_smd_sta_pending_ctx(wdev, addr)) { + spin_unlock_bh(&wdev->smd_get_ctx_lock); + return -EBUSY; + } + /* safe to unlock, concurrent commands are serialized by wiphy mutex */ + spin_unlock_bh(&wdev->smd_get_ctx_lock); + + pending =3D kzalloc_obj(*pending); + if (!pending) + return -ENOMEM; + + memcpy(pending->sta_addr, addr, ETH_ALEN); + + /* + * Take reference and add to the list before calling the driver to avoid + * race. Upon success, the reference is released while reporting back + * the context or in the list removal and drain path. + */ + dev_hold(wdev->netdev); + + spin_lock_bh(&wdev->smd_get_ctx_lock); + list_add_tail(&pending->list, &wdev->smd_get_ctx_pending_list); + spin_unlock_bh(&wdev->smd_get_ctx_lock); + + err =3D rdev_get_smd_ctx(rdev, wdev, addr, type); + if (err) { + /* revert upon failure */ + spin_lock_bh(&wdev->smd_get_ctx_lock); + pending =3D __cfg80211_get_smd_sta_pending_ctx(wdev, addr); + if (pending) { + list_del(&pending->list); + kfree(pending); + dev_put(wdev->netdev); + } + spin_unlock_bh(&wdev->smd_get_ctx_lock); + return err; + } + + /* Reply will arrive via cfg80211_get_smd_ctx_done() */ + return 0; +} + #define SELECTOR(__sel, name, value) \ ((__sel) =3D=3D (value)) ? NL80211_IFL_SEL_##name : int __missing_selector(void); @@ -21414,6 +21499,12 @@ static const struct genl_small_ops nl80211_small_o= ps[] =3D { .internal_flags =3D IFLAGS(NL80211_FLAG_NEED_NETDEV_UP | NL80211_FLAG_CLEAR_SKB), }, + { + .cmd =3D NL80211_CMD_GET_SMD_CTX, + .doit =3D nl80211_get_smd_ctx, + .flags =3D GENL_UNS_ADMIN_PERM, + .internal_flags =3D IFLAGS(NL80211_FLAG_NEED_NETDEV_UP), + }, }; =20 static struct genl_family nl80211_fam __ro_after_init =3D { @@ -24441,6 +24532,47 @@ void cfg80211_nan_channel_evac(struct wireless_dev= *wdev, } EXPORT_SYMBOL(cfg80211_nan_channel_evac); =20 +void +nl80211_notify_get_smd_ctx_done(struct wireless_dev *wdev, + const u8 *sta_addr, + struct cfg80211_smd_transition_info *st_info) +{ + struct cfg80211_registered_device *rdev =3D wiphy_to_rdev(wdev->wiphy); + struct net_device *dev =3D wdev->netdev; + size_t msg_len =3D NLMSG_DEFAULT_SIZE; + struct sk_buff *msg; + void *hdr; + + if (st_info->ctx) + msg_len =3D 100 + nl80211_smd_ctx_nl_size(st_info) + + nla_total_size(ETH_ALEN); /* MLD address */ + + msg =3D nlmsg_new(msg_len, GFP_ATOMIC); + if (!msg) + return; + + hdr =3D nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_SMD_CTX_EVENT); + if (!hdr) + goto nla_put_failure; + + if (nla_put_u32(msg, NL80211_ATTR_WIPHY, rdev->wiphy_idx) || + nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || + nla_put(msg, NL80211_ATTR_MLD_ADDR, ETH_ALEN, sta_addr)) + goto nla_put_failure; + + if (st_info->ctx && nl80211_put_smd_ctx(msg, st_info)) + goto nla_put_failure; + + genlmsg_end(msg, hdr); + + genlmsg_multicast_netns(&nl80211_fam, wiphy_net(&rdev->wiphy), msg, 0, + NL80211_MCGRP_MLME, GFP_ATOMIC); + return; + +nla_put_failure: + nlmsg_free(msg); +} + /* initialisation/exit functions */ =20 int __init nl80211_init(void) diff --git a/net/wireless/nl80211.h b/net/wireless/nl80211.h index bdb065d14054..2855d30ba354 100644 --- a/net/wireless/nl80211.h +++ b/net/wireless/nl80211.h @@ -129,4 +129,13 @@ int nl80211_pmsr_start(struct sk_buff *skb, struct gen= l_info *info); void nl80211_mlo_reconf_add_done(struct net_device *dev, struct cfg80211_mlo_reconf_done_data *data); =20 +size_t nl80211_smd_ctx_nl_size(struct cfg80211_smd_transition_info *st_inf= o); +int nl80211_put_smd_ctx(struct sk_buff *msg, + struct cfg80211_smd_transition_info *st_info); + +void +nl80211_notify_get_smd_ctx_done(struct wireless_dev *wdev, + const u8 *sta_addr, + struct cfg80211_smd_transition_info *st_info); + #endif /* __NET_WIRELESS_NL80211_H */ diff --git a/net/wireless/rdev-ops.h b/net/wireless/rdev-ops.h index d33a969606d7..ab520560f604 100644 --- a/net/wireless/rdev-ops.h +++ b/net/wireless/rdev-ops.h @@ -1650,4 +1650,18 @@ static inline int rdev_set_smd_ctx(struct cfg80211_r= egistered_device *rdev, return ret; } =20 +static inline int rdev_get_smd_ctx(struct cfg80211_registered_device *rdev, + struct wireless_dev *wdev, const u8 *addr, + enum nl80211_smd_ctx_type type) +{ + int ret =3D -EOPNOTSUPP; + + trace_rdev_get_smd_ctx(&rdev->wiphy, wdev, addr, type); + if (rdev->ops->get_smd_ctx) + ret =3D rdev->ops->get_smd_ctx(&rdev->wiphy, wdev, addr, type); + trace_rdev_return_int(&rdev->wiphy, ret); + + return ret; +} + #endif /* __CFG80211_RDEV_OPS */ diff --git a/net/wireless/trace.h b/net/wireless/trace.h index 6234ceb9ebb1..a2662919b8f0 100644 --- a/net/wireless/trace.h +++ b/net/wireless/trace.h @@ -4452,6 +4452,32 @@ TRACE_EVENT(rdev_set_smd_ctx, (unsigned long *)__get_dynamic_array(rx_tid_bitmap)) ); =20 +TRACE_EVENT(rdev_get_smd_ctx, + TP_PROTO(struct wiphy *wiphy, struct wireless_dev *wdev, const u8 *addr, + enum nl80211_smd_ctx_type type), + + TP_ARGS(wiphy, wdev, addr, type), + + TP_STRUCT__entry( + WIPHY_ENTRY + WDEV_ENTRY + MAC_ENTRY(sta_addr) + __field(u8, st_type) + ), + + TP_fast_assign( + WIPHY_ASSIGN; + WDEV_ASSIGN; + MAC_ASSIGN(sta_addr, addr); + __entry->st_type =3D type; + ), + + TP_printk(WIPHY_PR_FMT ", " WDEV_PR_FMT + ", sta=3D%pM, ST type=3D%u", + WIPHY_PR_ARG, WDEV_PR_ARG, __entry->sta_addr, + __entry->st_type) +); + #endif /* !__RDEV_OPS_TRACE || TRACE_HEADER_MULTI_READ */ =20 #undef TRACE_INCLUDE_PATH --=20 2.34.1 From nobody Thu Sep 24 13:39:02 2026 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (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 A24823DA5BB for ; Thu, 24 Sep 2026 02:42:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790217746; cv=none; b=B0NlARBgtxoapAYBEcjgcztxFfGd801u0eJMuhg/gIPXXOL7Qr6MDalKBoDpnGKiKGqFG3Ee/4agDTHUcBpNEtelsjbSLO5ELDrdqpZ2L51xKlVxeNyKk6M3YEuH199+Dws41FDOHgmI8SPfkSS84s8Icb9Yg9agOfya/urhaVg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1790217746; c=relaxed/simple; bh=5cnODwmbssOxPI5F5nevd+OQBmmnItipdocbwUtvPQk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=MZq9kQ+qXPi652I1fzLEsXubvXR2fCwujRHFpwuvCYCYNieZW9WG9WGM9CZFUcvLN0fzgmCo2UENCkd2zdMJ1dF6QapadiQDegQ1KCx7oRlf+qJRts1D7z2vjdnyzJF7+cy/L6sCIQh7uX8yALVuUjw+rjonGKhyDWhfABXQNxM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=FOpIjt9j; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=Gl9unw3n; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="FOpIjt9j"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="Gl9unw3n" Received: from pps.filterd (m0279863.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 68O2KI961000952 for ; Thu, 24 Sep 2026 02:42:23 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= fLQsUrUtDIuno+/NSEW02njKLVWe0y6MbvL6C+eWsxg=; b=FOpIjt9jIaQjABSm VBafULKtg/stOJm5w9LcC8ZJDfrZsHwGefqWMluF6F08mV7lvIUsHXThp5GOGE0K K5k/Pt0SyKrV2/tiSDr8qfv3Ophfq5Bf0Bs4laIaQlxbrhJQrY80K/yqzoWgFs3+ sfBDemC+mv+NCq6ArX+1UjC2JJp5Sql55tB3uCHaZQm1JuCpeXnRJC+QRDdaFhJn IWIge1Wp+qznfrIYQeArnWWrTiJZx7lUULHLmeIUjNr+cH3q+r/gLQsaG5mZgshl uSSNO77OqL3ysuQM+b5A6QOVDIaplJvhp1b01GNMuBg0KIoR5MS5uUW1QEzlAn09 djHOiQ== Received: from mail-dy1-f199.google.com (mail-dy1-f199.google.com [74.125.82.199]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4gvbwmbwqd-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Thu, 24 Sep 2026 02:42:22 +0000 (GMT) Received: by mail-dy1-f199.google.com with SMTP id 5a478bee46e88-3282d5302ffso470459eec.1 for ; Wed, 23 Sep 2026 19:42:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1790217742; x=1790822542; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=fLQsUrUtDIuno+/NSEW02njKLVWe0y6MbvL6C+eWsxg=; b=Gl9unw3nrsFwutoSDtlP0oq7clKDWDG4G2zOGgSXOwfNyrlu0eJrid68hdardwxrdG 8CaAgLe7+S8cKElMN+FXC91rQxg0uav9dhiyvHyjn5X09/p7MkJOppckFO1qPS28wwC9 Zs29fCh3kb1/X5GwAYt0IW3sQHT/dME5aogYR/58Eanbt4NZNOp5pEMyUzOTE7Y4YjCy CqF2ylx7w60c6XnD8k5xaA9jxjQYoO5ARxK662Ia8wjN8fb1LsejpxiFPPJ7L2SRe9lc 0Neqi4TpByT5IE4HkWWadZvlTSZ6KRzVMTAuEY1H3wSJX1ykkS+Q42PHlRKQ9H3nY2O9 HGyw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1790217742; x=1790822542; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :content-type:mime-version:subject:date:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=fLQsUrUtDIuno+/NSEW02njKLVWe0y6MbvL6C+eWsxg=; b=iHgo7EQssaYEeWytk8IruqhYVYVwvPih41rC+3/CY+4ZKR8zi6SEf0hNJb0u4mk+2o tXn61tC/aKoaVmQBkuaWYd1dlm4Nr76fFIA6NFHTAjx8Q7bqMRJlCw6AaLYYDYUMrKNn KLWTv4X5RVxVgARi7ttGuHZKZwxhvUn1TX9eqpRorARElNPmkvDftnrRAkkjCXM5LgKz qW/2f2eLVfKsYirzE+AjlX/pmBregNTJtRfeEj+0w/CFwn5Z0qIeqieHMSREgQCjypQ4 xRIOC3QENw6PaulxE/hu0ymS4QUjHjfPznLJDJGTjdkl/Cc3liwbCauEq9aVZky9DBti UPLg== X-Forwarded-Encrypted: i=1; AKwUvBzVkfxBUaVX25mP1bCpyIH19meMoh1S/8YsHVfLE0zIMYT0QoBM50lwwnzZm4fV85xPvmRP6ZMiCyXXVIQ=@vger.kernel.org X-Gm-Message-State: AFuF++nxk5Aj4TX1InRjNR0Lp2+8UVpE4xTUGAOudklaIoQiag1354Gu I6D5TyR/8hinIaC8Eh30LmlevhBvtDbKjHhlZQJ41naZ1pTribnyRB/6nkw1o6yWr/3JLRuLlmx 6S7aAcajVblFA7UW/4MOFSfK0nTx28QRDJ7Bv5wfuuRg7sRgvEASpTAIRLtQmvOcowA== X-Gm-Gg: AYBFou2OI3H8zOzbLQBiFGT93RK5RLPWEvPIHCFfLVZ/90hbIjqoax1rfuOQ+92mix0 1kMmWcpnpo+D/GVTVrFThC2LzgtGCY+HiqTJA6h/iCveC+avg9w9MIDs+Kdzq6bTVuYMplAie3o ke3PvaAtEJDZi87uKtURx8PxV1sLoG+6VmssohDpuiXH4dT6ankr7dwKHDhtm0PjsfI2wiHixMX 3ZLTfZfR5x6X89DOJir6j+WI3+ueQ07t7v5LjuiE5+eV83Js4CrUXgpqd1yW51oSLRN1A+km7a7 iI3j9kXyjYzkrYkoeRi6N2Ofhmpq1Ysrh3sOFYk+N8BHZYobz50BOCJHdZIVmqazxlY+dVNqLzn YEJDwnrR3pv9RRrghN6ySdCGCBtixm/qNAVqMkH/bCAq38fioKaGBRL+G++YCAmWAFei8CQbDEs JRXrMy+E1lOKIyLIJSR0KvKw== X-Received: by 2002:a05:693c:62cd:b0:339:851c:4c1 with SMTP id 5a478bee46e88-340059652f1mr673154eec.18.1790217742042; Wed, 23 Sep 2026 19:42:22 -0700 (PDT) X-Received: by 2002:a05:693c:62cd:b0:339:851c:4c1 with SMTP id 5a478bee46e88-340059652f1mr673134eec.18.1790217741409; Wed, 23 Sep 2026 19:42:21 -0700 (PDT) Received: from hu-pooventh-blr.qualcomm.com (blr-bdr-fw-01_GlobalNAT_AllZones-Outside.qualcomm.com. [103.229.18.19]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-33e96258351sm9692263eec.12.2026.09.23.19.42.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 23 Sep 2026 19:42:21 -0700 (PDT) From: Pooventhiran G Date: Thu, 24 Sep 2026 08:10:53 +0530 Subject: [PATCH wireless-next v2 16/16] wifi: mac80211: Add mac80211 support to handle NL80211_CMD_GET_SMD_CTX Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260924-smd-v2-16-bb40094da1d4@oss.qualcomm.com> References: <20260924-smd-v2-0-bb40094da1d4@oss.qualcomm.com> In-Reply-To: <20260924-smd-v2-0-bb40094da1d4@oss.qualcomm.com> To: Johannes Berg , Kees Cook , "Gustavo A. R. Silva" Cc: linux-wireless@vger.kernel.org, linux-kernel@vger.kernel.org, linux-hardening@vger.kernel.org, pooventhiran.g@oss.qualcomm.com X-Mailer: b4 0.14.3 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTI0MDAxMiBTYWx0ZWRfXxqes1J1fITHe yA8cOoCMDRv9N3pSt8Q5yc0GvDzIP7KmSEQhcBo1eWGjaNefQDFOihNt5uccjklZH2x8FNtOYuT lDdYbNS7KfI1Be+ZHvnf4Fqq8RrxpN4= X-Authority-Analysis: v=2.4 cv=R/6WitRX c=1 sm=1 tr=0 ts=6ab48e0e cx=c_pps a=cFYjgdjTJScbgFmBucgdfQ==:117 a=Ou0eQOY4+eZoSc0qltEV5Q==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=yOCtJkima9RkubShWh1s:22 a=EUspDBNiAAAA:8 a=c93CP5vvwBK-QZUl55wA:9 a=QEXdDO2ut3YA:10 a=scEy_gLbYbu1JhEsrz4S:22 X-Proofpoint-GUID: CCljCn6iSXy04f8DcgzNuBFm-SHtnDcW X-Proofpoint-ORIG-GUID: CCljCn6iSXy04f8DcgzNuBFm-SHtnDcW X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTI0MDAxMiBTYWx0ZWRfX4mgnHsYB3SB+ aK8qY+JJQYJQbMo8WuOFU4iPozVbWWzpzajjkEbL2imtUThBsuONv0EyFi98v0w/w0VWWjL1XMN GEOepFH8b4f6IaHFuZjE03y/MDuJnJsjOSc2uyzQmEmCVsE3wT9+cZ4bYUP5YMAqv51cocnZ1JR Udy94S/if0v3EMkWswfhQ+cw87ainAvpWs7ziUso8vLBIU6z5k1so2fbbIZSsIQhA53ub0RX9R8 EH1X2AQqAIPQB317BqDWB+R6fKL3YWeoyfCSxwNXB9MZhJhTWpw4B7ShpOGRQ5H1j6mnX0r1L3O MALHQEQ5I/8X8PN8oAHDerMguc0KzynF6VTtF9V1HyBA7iH1ZcWj6hMGsbycTLNfUjKasxmrnfG fIcWln3hUz73Y8eYWSOfZcjG8dbwFYDxMvgLmvPpbMvmVOgnShoCYEcfKIJAnD41/9FTj1cilr/ 2rmq2N+vwK02VicGdhg== X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1176,Hydra:6.1.134,FMLib:17.12.100.49 definitions=2026-09-24_01,2026-09-21_02,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 clxscore=1015 malwarescore=0 impostorscore=0 priorityscore=1501 lowpriorityscore=0 spamscore=0 suspectscore=0 phishscore=0 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2609040000 definitions=main-2609240012 cfg80211 supports NL80211_CMD_GET_SMD_CTX from userspace on the current AP MLD to collect the station's context on the target AP MLD's behalf; this context is used by the target AP MLD to program its TX and RX queues to support seamless roaming of the non-AP MLD. Add mac80211 support for the same to invoke the driver to collect the requested station context. Since context collection is asynchronous, the driver reports the collected context later via ieee80211_get_smd_ctx_done(), which then packs the context into NL80211_CMD_SMD_CTX_EVENT and delivers it to userspace as a multicast event. Signed-off-by: Pooventhiran G --- include/net/mac80211.h | 19 +++++++++++++++++++ net/mac80211/cfg.c | 36 ++++++++++++++++++++++++++++++++++++ net/mac80211/driver-ops.h | 24 ++++++++++++++++++++++++ net/mac80211/sta_info.c | 6 ++++++ net/mac80211/trace.h | 27 +++++++++++++++++++++++++++ 5 files changed, 112 insertions(+) diff --git a/include/net/mac80211.h b/include/net/mac80211.h index 9b451628f248..6a26823799d4 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h @@ -4788,6 +4788,11 @@ enum ieee80211_sta_smd_state { * The callback can sleep. * @set_smd_ctx: Set the UHR SMD context for the non-AP MLD. This is used = on * the target AP MLD side to program dynamic context. + * @get_smd_ctx: Get the UHR SMD context for the non-AP MLD. This is used = in + * the current AP MLD side on behalf of the target AP MLD to collect + * dynamic context, when the non-AP MLD sends ST Execute frame directly + * to the target. Since the response is asynchronous, the drivers that + * implement this should not store reference to @sta. */ struct ieee80211_ops { void (*tx)(struct ieee80211_hw *hw, @@ -5197,6 +5202,9 @@ struct ieee80211_ops { int (*set_smd_ctx)(struct ieee80211_hw *hw, struct ieee80211_vif *vif, struct ieee80211_sta *sta, struct cfg80211_smd_transition_info *st_info); + int (*get_smd_ctx)(struct ieee80211_hw *hw, struct ieee80211_vif *vif, + struct ieee80211_sta *sta, + enum nl80211_smd_ctx_type type); }; =20 /** @@ -8266,4 +8274,15 @@ bool ieee80211_vif_nan_started(struct ieee80211_vif = *vif); * Return: 0 if success and non-zero on error */ int ieee80211_encrypt_tx_skb(struct sk_buff *skb); + +/** + * ieee80211_get_smd_ctx_done - Deliver async get_smd_ctx result to nl80211 + * @vif: virtual interface + * @sta_addr: non-AP MLD address the context was collected for + * @st_info: SMD BSS Transition Info (set @st_info->ctx to NULL to indicate + * failure) + */ +void ieee80211_get_smd_ctx_done(struct ieee80211_vif *vif, + const u8 *sta_addr, + struct cfg80211_smd_transition_info *st_info); #endif /* MAC80211_H */ diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c index 2cf0e80137a7..95b699117147 100644 --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c @@ -6106,6 +6106,41 @@ static int ieee80211_set_smd_ctx(struct wiphy *wiphy= , struct wireless_dev *wdev, return drv_set_smd_ctx(local, sdata, &sta->sta, st_info); } =20 +static int ieee80211_get_smd_ctx(struct wiphy *wiphy, struct wireless_dev = *wdev, + const u8 *addr, + enum nl80211_smd_ctx_type type) +{ + struct ieee80211_local *local =3D wiphy_priv(wiphy); + struct ieee80211_sub_if_data *sdata; + struct sta_info *sta; + + lockdep_assert_wiphy(wiphy); + + sdata =3D IEEE80211_WDEV_TO_SUB_IF(wdev); + + if (sdata->vif.type !=3D NL80211_IFTYPE_AP && + sdata->vif.type !=3D NL80211_IFTYPE_AP_VLAN) + return -EOPNOTSUPP; + + sta =3D sta_info_get_bss(sdata, addr); + if (!sta) + return -ENOENT; + if (!sta->sta.smd_params.smd_sta) + return -EINVAL; + + return drv_get_smd_ctx(local, sdata, &sta->sta, type); +} + +void ieee80211_get_smd_ctx_done(struct ieee80211_vif *vif, + const u8 *sta_addr, + struct cfg80211_smd_transition_info *st_info) +{ + struct ieee80211_sub_if_data *sdata =3D vif_to_sdata(vif); + + cfg80211_get_smd_ctx_done(&sdata->wdev, sta_addr, st_info); +} +EXPORT_SYMBOL(ieee80211_get_smd_ctx_done); + const struct cfg80211_ops mac80211_config_ops =3D { .add_virtual_intf =3D ieee80211_add_iface, .del_virtual_intf =3D ieee80211_del_iface, @@ -6225,4 +6260,5 @@ const struct cfg80211_ops mac80211_config_ops =3D { .nan_set_local_sched =3D ieee80211_set_local_nan_sched, .nan_set_peer_sched =3D ieee80211_set_peer_nan_sched, .set_smd_ctx =3D ieee80211_set_smd_ctx, + .get_smd_ctx =3D ieee80211_get_smd_ctx, }; diff --git a/net/mac80211/driver-ops.h b/net/mac80211/driver-ops.h index e764dd394de2..0339ff71cd4a 100644 --- a/net/mac80211/driver-ops.h +++ b/net/mac80211/driver-ops.h @@ -1844,4 +1844,28 @@ static inline int drv_set_smd_ctx(struct ieee80211_l= ocal *local, return ret; } =20 +static inline int drv_get_smd_ctx(struct ieee80211_local *local, + struct ieee80211_sub_if_data *sdata, + struct ieee80211_sta *sta, + enum nl80211_smd_ctx_type type) +{ + int ret; + + if (!sdata || !local->ops->get_smd_ctx) + return -EOPNOTSUPP; + + sdata =3D get_bss_sdata(sdata); + + lockdep_assert_wiphy(local->hw.wiphy); + + if (!check_sdata_in_driver(sdata)) + return -EIO; + + trace_drv_get_smd_ctx(local, sdata, sta, type); + ret =3D local->ops->get_smd_ctx(&local->hw, &sdata->vif, sta, type); + trace_drv_return_int(local, ret); + + return ret; +} + #endif /* __MAC80211_DRIVER_OPS */ diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c index 5aa6f5b481e3..9ea0a8791289 100644 --- a/net/mac80211/sta_info.c +++ b/net/mac80211/sta_info.c @@ -1312,6 +1312,7 @@ static int __must_check __sta_info_destroy_part1(stru= ct sta_info *sta) { struct ieee80211_local *local; struct ieee80211_sub_if_data *sdata; + struct wireless_dev *wdev; int ret, i; =20 might_sleep(); @@ -1321,6 +1322,7 @@ static int __must_check __sta_info_destroy_part1(stru= ct sta_info *sta) =20 local =3D sta->local; sdata =3D sta->sdata; + wdev =3D &sdata->wdev; =20 lockdep_assert_wiphy(local->hw.wiphy); =20 @@ -1390,6 +1392,10 @@ static int __must_check __sta_info_destroy_part1(str= uct sta_info *sta) rcu_access_pointer(sdata->u.vlan.sta) =3D=3D sta) RCU_INIT_POINTER(sdata->u.vlan.sta, NULL); =20 + if (sdata->vif.type =3D=3D NL80211_IFTYPE_AP || + sdata->vif.type =3D=3D NL80211_IFTYPE_AP_VLAN) + cfg80211_free_pending_smd_ctx_req(wdev, sta->addr); + return 0; } =20 diff --git a/net/mac80211/trace.h b/net/mac80211/trace.h index 7aba79e441cf..38ad5076232d 100644 --- a/net/mac80211/trace.h +++ b/net/mac80211/trace.h @@ -3487,6 +3487,33 @@ TRACE_EVENT(drv_set_smd_ctx, ) ); =20 +TRACE_EVENT(drv_get_smd_ctx, + TP_PROTO(struct ieee80211_local *local, + struct ieee80211_sub_if_data *sdata, + struct ieee80211_sta *sta, + enum nl80211_smd_ctx_type type), + + TP_ARGS(local, sdata, sta, type), + + TP_STRUCT__entry( + LOCAL_ENTRY + VIF_ENTRY + STA_ENTRY + __field(u8, st_type) + ), + + TP_fast_assign( + LOCAL_ASSIGN; + VIF_ASSIGN; + STA_ASSIGN; + __entry->st_type =3D type; + ), + + TP_printk(LOCAL_PR_FMT VIF_PR_FMT STA_PR_FMT ", ST type=3D%u", + LOCAL_PR_ARG, VIF_PR_ARG, STA_PR_ARG, __entry->st_type + ) +); + #endif /* !__MAC80211_DRIVER_TRACE || TRACE_HEADER_MULTI_READ */ =20 #undef TRACE_INCLUDE_PATH --=20 2.34.1