From nobody Fri Sep 25 23:09:24 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 749263BB113 for ; Mon, 7 Sep 2026 20:33:22 +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=1788813204; cv=none; b=kZU+M4cg/Zs6iJ7ZREv//HG4Fpl0WZ7a4oD/gNWeax7m9VJ08foG7ExNrFP0cEv2Z6c58GTQEiMvFOloMiC4yWU/08phuVSRsIx71Z4qPdNbWaiL3RV1UOw0POxvZDyBy4DrqRkSiHGpF8PZd6deoGo87SSYIvJoeqFCVLlh5dU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788813204; c=relaxed/simple; bh=NrgThq6Y8uHhb3wAckmPMV55GlSGJaL3Mt7emHZURDY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=CiTnYZrdXxwPxAj3zLpJIuM9sPhmtLQL1wbdYIlcAOdW524CzXFGYhYPuiB+YAhzqP+3ZsBqR77qExd1YjOwF52f6mYA6+smW6uTMxIStuFsTsDF4WmX+wNz0Rg/cikrK4ADmsaKeqCfYcLE1xlCB3rn9y4dnxZkb5FaTu36SsE= 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=mETh+2A6; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=eCtq1oI8; 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="mETh+2A6"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="eCtq1oI8" 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 687HWMLK565403 for ; Mon, 7 Sep 2026 20:33:22 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= UZdtDE9nITufoadjKmxDFYIwfAzWlsnkOtcwwliJ40E=; b=mETh+2A6Qi98H/cg JRlQd70yksouhVax3yQo4tKoAwbR1WgnoT1BAqTR2QGBq4/hdb5nIomQqD7IeAQI XDcrhGLS5Gu7X1H6/Yr9dewIfTsKabZ4t2jBfqGpabXYSiI4zDBgokDbQ9g2sPC5 B8BFBqERcR3HUp2voKAxB1Eq79Zj8r3kpsVmaHtiko2B1tpKGXbr7cax8lSei9fW gv9MPruNUWrnR6v7LkgjIzFQn6xwBfefw+oJudvaS/tcTKpndavCt9yaaqcL8l3L y2LppiikVjbdz5Ni5DBDEfONJh8kUQhTojGIEkxaNQ/gDcC++21GV7PnsDPdDlMK pDIuYA== Received: from mail-pf1-f198.google.com (mail-pf1-f198.google.com [209.85.210.198]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4gj1rrgfra-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 07 Sep 2026 20:33:21 +0000 (GMT) Received: by mail-pf1-f198.google.com with SMTP id d2e1a72fcca58-86476d54af1so2216147b3a.0 for ; Mon, 07 Sep 2026 13:33:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1788813196; x=1789417996; 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=UZdtDE9nITufoadjKmxDFYIwfAzWlsnkOtcwwliJ40E=; b=eCtq1oI8oUTrjnlqvS30f4sw7IMCU5jNQKndbClgFH4eTotkq/6uEuWvxu08CYyEeh huxoUMxrD+hsLru4as6Q/nDXpGw+Gfim4/DPEoO2XVPYKhlsfnRw87aaXHCUqXkWwDws vGUImRmDFCkqU/oXOza6iNqvzxXuphmyFc/Lp/G4GKNxhI2oPh9jdO9jQjlhJYHwEUI9 YS3PiIeJPqoFVY/4jWshrrJQIXA40gipBqPrKyStEcNAdQUsd6rvPBH4majFJTbNbbG6 tNXWLnt3wTUUbWOfCDaUzYCnkZBUAgOUMrKVQbSO1kQRO6kzg7gzLGitVsOv/iYMAow+ ef5w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788813196; x=1789417996; 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=UZdtDE9nITufoadjKmxDFYIwfAzWlsnkOtcwwliJ40E=; b=Gv2Q16kNfDVCGWfrXhuBQhNsGlGI1RGtia2JGWuN1ppSONk6DdY98+exSqQIyNmVaM dCT4Ly8XbDbmgsUtGupvKzZCCnPquow/PuoJVr/ncqxRemckn1Ffieaeh1jMbTzyTVuN bYCsXERrKx+hD+eG/wVn23p4YV4lMZyrtS6icmifPxFEA39gC6WAqYJ1E0J/p1I7HZLI MiV3ulbBqJ2txtV1vQCrVXPhy74v9bbrbHcv9GCIcNWdgvPe6kz6bJHLe/bu1uEuDpOT nlR7Nn9JjtekKP0HKcvXMD9zIi6BXvBH3l06NjTSap99zJamaKEztSFuFRe07VC1QxQc serw== X-Gm-Message-State: AFuF++ltMzGsidjM1z4IrBWkc0M5PIxt9mzc188DatvuvwbGGi9omJG1 yzym0WZ05XTDJQFLhboPprLBNy9sC1oNdYnT7HexZaIlRRkQZx9v4pSgi3lxTxJR+Omii0W0yCr ZlN+5qZ1hENRjZ/rPrq47Wmg9sUx52zfksXvUGQkjznh9t+QMz0w9lV29k1EytkPe1g== X-Gm-Gg: AYBFou08SiPayH26cPeD0uzCvwbR/djnSK3TrvbLUy6TLedNzknX6cgfzAFARUIeYdO cqkZJ0UDD3XprjCJdZWTFZbQ4RLDivKHqH9qsdO8V/OB/fycRbVzbdEE4NaYCJNZdfogDwu2y04 fUgEfwZe82RkET5BD3KIC/uPRLWBP6amSDWKnLCgYlty2chODOaZHR7rXdGCkE7dICIX91G7IYy c6sP4Ae8SvaZC+tJ56XcywiJrV4zjI1PaVUZz+ZhqDF7ho5RrnNbSkbBi/6bvAzhtK5etbf0m5x HOUOySpounO8LKKEe6TpsR6+J6c4a2gdd9irzebDXmbriOfjqoAN53DBfXT59wzEk2S87LBmdPs B+n1IfUuKnmaqz49SEYmK+NuUJ4Bk4SoVC5kDXnvIlh8Jjz08n657GcsXRIzcBDyXl3T9NEqMvv JeWekD3hLkoE4xNAWWnDHhUQ== X-Received: by 2002:a05:6300:6710:b0:3d8:1f68:59ac with SMTP id adf61e73a8af0-3da3a15bfc3mr39225025637.23.1788813196036; Mon, 07 Sep 2026 13:33:16 -0700 (PDT) X-Received: by 2002:a05:6300:6710:b0:3d8:1f68:59ac with SMTP id adf61e73a8af0-3da3a15bfc3mr39224968637.23.1788813195589; Mon, 07 Sep 2026 13:33: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-3339af25062sm47841297eec.16.2026.09.07.13.33.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 13:33:15 -0700 (PDT) From: Pooventhiran G Date: Tue, 08 Sep 2026 01:59:10 +0530 Subject: [PATCH wireless-next 01/18] net: skbuff: Add SKB extension support to wireless drivers 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: <20260908-smd-v1-1-65ad4ab30fbd@oss.qualcomm.com> References: <20260908-smd-v1-0-65ad4ab30fbd@oss.qualcomm.com> In-Reply-To: <20260908-smd-v1-0-65ad4ab30fbd@oss.qualcomm.com> To: "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Johannes Berg Cc: linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-wireless@vger.kernel.org, Pooventhiran G X-Mailer: b4 0.14.3 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA3MDIyNiBTYWx0ZWRfX5vCPAgpyoKFz ti894UwNbl2YHgTMXY7dj7jiGnOGDAovMP2cZXFsMLgrsYnrmkQsZNZyiAGmrqEi1e7hGdgID8f YgtoVNr22cTOSEr+GF4rPpGhrvUWA3k= X-Proofpoint-GUID: mVX7uh_7Yke-vtwFY1SdT44D8FjDjlk_ X-Authority-Analysis: v=2.4 cv=NsjhtcdJ c=1 sm=1 tr=0 ts=6a9f1f91 cx=c_pps a=m5Vt/hrsBiPMCU0y4gIsQw==: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=axc-8nxta6ncDHcsNdkA:9 a=QEXdDO2ut3YA:10 a=IoOABgeZipijB_acs4fv:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA3MDIyNiBTYWx0ZWRfX6K9SsVpgGhde 4rL3baEYMOf7R3l3Tg1WUj1CyGyj4cb6xHVqF80JH8Mb27CFDiuryAZ+DKSjRrHK4BD42Sx9UbG 1q20nO5VL4+e5TCeFSjLY27KPy+uWgf8rnUTe+df7onCjT/lWfJGdnGSADBJNROgz2FSKs0CeHA 11unoBve/0qyyc9OJ/TNXp3JE4QLfzzi2I/VMZo9wbX8tPpsYYB4oFCrjjyUzfdO86Ubxnv+jbT l5w3oQa0YWGSM8HnyfzDv4ZwjG8CWW3MO7Cw9bTflSue7GS78IAYb2XuiMPwqipYPAJHBtrNmRO hsR+ZaNLX//zimLlZIWtoWz802K0e/MHWcRYqD5whaEByRLPqL/KO68oCEyJuIbzXUh4jxEGPtz uzmeRH9387EZ4SfchMuihki4MmRuxFUaFhzmfrk7jI0qsmdXXWFL44LTK+0ukJTTIRu3j33E+mW A9FeUhWSWGoWbAV8V8g== X-Proofpoint-ORIG-GUID: mVX7uh_7Yke-vtwFY1SdT44D8FjDjlk_ 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-07_05,2026-09-07_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 lowpriorityscore=0 phishscore=0 suspectscore=0 clxscore=1011 priorityscore=1501 spamscore=0 adultscore=0 bulkscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609070226 IEEE P802.11bn/D2.0, Aug 2026, subclause 37.16, defines Seamless Mobility Domain (SMD) BSS Transition, in which a station roams between two AP MLDs within an SMD across two phases: Preparation and Execution. During these phases, the receiving AP driver processes a query frame and must carry the station's roaming context - per-TID sequence numbers in downlink (DL) and uplink (UL) directions, packet number in DL and per-TID packet numbers in UL, and per-TID BlockAck session parameters in DL and UL, plus a variable-length driver context - up through mac80211 and nl80211 to userspace, which uses it to complete the transition. This context does not fit in skb->cb (48 bytes). Carrying it separately, outside the SKB, breaks when the SKB is cloned through the RX path because the context lifetime is no longer tied to the frame; the driver would need independent state correlated with the SKB at nl80211 encode time, adding error-prone lifecycle management. SKB extensions avoid these problems: they are reference-counted, copy-on-write safe, and freed automatically with the SKB. Add a new skbuff_wireless.h with a typed union structured to accommodate future wireless extension types, carrying the SMD roaming context as its first payload. Signed-off-by: Pooventhiran G --- include/linux/skbuff.h | 3 +++ include/linux/skbuff_wireless.h | 55 +++++++++++++++++++++++++++++++++++++= ++++ net/core/skbuff.c | 55 +++++++++++++++++++++++++++++++++++++= ++++ 3 files changed, 113 insertions(+) diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 421f6fc45451..fb686024e97d 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h @@ -5061,6 +5061,9 @@ enum skb_ext_id { #endif #if IS_ENABLED(CONFIG_CAN) SKB_EXT_CAN, +#endif +#if IS_ENABLED(CONFIG_WIRELESS) + SKB_EXT_WIRELESS, #endif SKB_EXT_NUM, /* must be last */ }; diff --git a/include/linux/skbuff_wireless.h b/include/linux/skbuff_wireles= s.h new file mode 100644 index 000000000000..2cb04bff061c --- /dev/null +++ b/include/linux/skbuff_wireless.h @@ -0,0 +1,55 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * IEEE 802.11 WLAN skb_ext definitions + * + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. + */ + +#ifndef LINUX_SKB_WIRELESS_H +#define LINUX_SKB_WIRELESS_H + +#include +#include + +/** + * enum wireless_skb_ext_type - type of data in wireless_skb_ext + * @WIRELESS_SKB_EXT_INVALID: uninitialized state + * @WIRELESS_SKB_EXT_UHR_SMD: payload is @uhr_smd_ctx + */ +enum wireless_skb_ext_type { + WIRELESS_SKB_EXT_INVALID, + WIRELESS_SKB_EXT_UHR_SMD, +}; + +/** + * struct wireless_skb_ext_smd_ctx - UHR SMD roaming context container in + * SKB extensions + * @refcnt: reference count; one count per distinct skb_ext block that hol= ds + * this pointer. Plain skb_clone() shares the same skb_ext block and + * does not increment this counter. Only skb_ext_maybe_cow() increments + * this counter, when a COW produces a second independent ext block copy. + * @smd_ctx: pointer to the IEEE P802.11bn UHR SMD roaming context; + * must be a kmalloc-ed buffer, freed together with this container. + */ +struct wireless_skb_ext_smd_ctx { + refcount_t refcnt; + void *smd_ctx; +}; + +/** + * struct wireless_skb_ext - SKB extension data for wireless module use + * + * Carried as an skb extension (SKB_EXT_WIRELESS). The union is reserved + * for future wireless extension types; only one member is active per skb. + * + * @type: type of data + * @uhr_smd_ctx: pointer to the UHR SMD context container + */ +struct wireless_skb_ext { + enum wireless_skb_ext_type type; + union { + struct wireless_skb_ext_smd_ctx *uhr_smd_ctx; + }; +}; + +#endif /* LINUX_SKB_WIRELESS_H */ diff --git a/net/core/skbuff.c b/net/core/skbuff.c index ab195b99c853..f28ab7c3c888 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c @@ -93,6 +93,10 @@ #include #include =20 +#if IS_ENABLED(CONFIG_WIRELESS) +#include +#endif + #include "dev.h" #include "devmem.h" #include "net-sysfs.h" @@ -5169,6 +5173,9 @@ static const u8 skb_ext_type_len[] =3D { #if IS_ENABLED(CONFIG_CAN) [SKB_EXT_CAN] =3D SKB_EXT_CHUNKSIZEOF(struct can_skb_ext), #endif +#if IS_ENABLED(CONFIG_WIRELESS) + [SKB_EXT_WIRELESS] =3D SKB_EXT_CHUNKSIZEOF(struct wireless_skb_ext), +#endif }; =20 static __always_inline __no_profile unsigned int skb_ext_total_length(void) @@ -7152,6 +7159,16 @@ static struct skb_ext *skb_ext_maybe_cow(struct skb_= ext *old, if (flow->key) refcount_inc(&flow->key->refs); } +#endif +#if IS_ENABLED(CONFIG_WIRELESS) + if (old_active & (1 << SKB_EXT_WIRELESS)) { + struct wireless_skb_ext *wifi =3D + skb_ext_get_ptr(old, SKB_EXT_WIRELESS); + + if (wifi->type =3D=3D WIRELESS_SKB_EXT_UHR_SMD && + wifi->uhr_smd_ctx) + refcount_inc(&wifi->uhr_smd_ctx->refcnt); + } #endif __skb_ext_put(old); return new; @@ -7256,6 +7273,36 @@ static void skb_ext_put_mctp(struct mctp_flow *flow) } #endif =20 +#if IS_ENABLED(CONFIG_WIRELESS) +static void skb_ext_put_wireless(struct wireless_skb_ext *wifi) +{ + switch (wifi->type) { + case WIRELESS_SKB_EXT_UHR_SMD: + if (!wifi->uhr_smd_ctx) + break; + + if (refcount_dec_and_test(&wifi->uhr_smd_ctx->refcnt)) { + kfree(wifi->uhr_smd_ctx->smd_ctx); + kfree(wifi->uhr_smd_ctx); + } + + /* + * __skb_ext_del clears active_extensions but not ext->offset[], + * so __skb_ext_put will call skb_ext_put_wireless again; + * mark NULL regardless to avoid double free in __skb_ext_put. + */ + wifi->uhr_smd_ctx =3D NULL; + break; + case WIRELESS_SKB_EXT_INVALID: + /* data not yet set */ + break; + default: + WARN_ONCE(1, "unknown wireless skb extension type=3D%u\n", + wifi->type); + } +} +#endif + void __skb_ext_del(struct sk_buff *skb, enum skb_ext_id id) { struct skb_ext *ext =3D skb->extensions; @@ -7278,6 +7325,10 @@ void __skb_ext_del(struct sk_buff *skb, enum skb_ext= _id id) if (id =3D=3D SKB_EXT_MCTP) skb_ext_put_mctp(skb_ext_get_ptr(ext, SKB_EXT_MCTP)); #endif +#if IS_ENABLED(CONFIG_WIRELESS) + if (id =3D=3D SKB_EXT_WIRELESS) + skb_ext_put_wireless(skb_ext_get_ptr(ext, SKB_EXT_WIRELESS)); +#endif } EXPORT_SYMBOL(__skb_ext_del); =20 @@ -7300,6 +7351,10 @@ void __skb_ext_put(struct skb_ext *ext) if (__skb_ext_exist(ext, SKB_EXT_MCTP)) skb_ext_put_mctp(skb_ext_get_ptr(ext, SKB_EXT_MCTP)); #endif +#if IS_ENABLED(CONFIG_WIRELESS) + if (__skb_ext_exist(ext, SKB_EXT_WIRELESS)) + skb_ext_put_wireless(skb_ext_get_ptr(ext, SKB_EXT_WIRELESS)); +#endif =20 kmem_cache_free(skbuff_ext_cache, ext); } --=20 2.34.1 From nobody Fri Sep 25 23:09:24 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 41FB23A48C8 for ; Mon, 7 Sep 2026 20:33:21 +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=1788813202; cv=none; b=FqXWZMBdrSAgA2SPRbma4vz5HMPSFYroO1TEHSaMwevzoD7BL+5x/7Q7T1WyPgMk+8yomnaKKke7QBWq9UEPODSWARYWYzw9qaZcRanJialJ01szZn/vOpqlnW6vmaF27eQTavUqi75OPK+BDyTz0PtYU0km+C7WWELh2kkxpCw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788813202; c=relaxed/simple; bh=ODuW2nybW3REfD8SbUhi8QOhAYOU2HQqcQkaxRn64Q8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=OZ9HfoLFFJ18lDRC76if+APzN3PPCTJcfDNi4CegsmyD7EzG3rdiYDt35+sDgD7JVoRKN7s+i5t04qjn8i1A8vr/+r50XkAyE3iMatr8+tVbFEK666hr3hHPTZJYOiVx0RCXym2RNXwnhLJIPbHLbG3lgG42tNwJRUlie3hlWsY= 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=c3xL5C26; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=TtDh4qGL; 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="c3xL5C26"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="TtDh4qGL" Received: from pps.filterd (m0279865.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 687H7wb01314987 for ; Mon, 7 Sep 2026 20:33: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= s4tTeUVXrP8PDX4fDGv3MD0jVy8bbBgnnC6+ayxYRRA=; b=c3xL5C26/U1riqgx Uvn6EZppMDW6QU/3BUBxWZ8A62BeydPjaDc7d/II7QOqgJMpdk/Dy4VpjlEywTNh ohChqOUHGhvQ/uXIBkq3DUrBoAwT/++jyqsGhMEvRW8VWLty7WxZa8TsFGol4rXx GjG11RuC4DCIGVg6IO70ucPhzNGuRMi4b0D2HZPN9tf87OPlZXgAPtwBrXuCPv6E jI78W2EIEOUzSE2gZEt9jLDig/x8lZceO2WtNW1nRS3gaYuSDn0m0MBluse7gu1u qBh+tXpYPiVA9DHmUIbKKs/Jl+vtEu249+s8ygmLzieVMgQcT5LSqvbvcfExx5tN KRHdTA== Received: from mail-pj1-f72.google.com (mail-pj1-f72.google.com [209.85.216.72]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4ghuyk9vq7-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 07 Sep 2026 20:33:20 +0000 (GMT) Received: by mail-pj1-f72.google.com with SMTP id 98e67ed59e1d1-398dcfabbf8so729381a91.0 for ; Mon, 07 Sep 2026 13:33:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1788813200; x=1789418000; 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=s4tTeUVXrP8PDX4fDGv3MD0jVy8bbBgnnC6+ayxYRRA=; b=TtDh4qGLadDdbGwJVzglotsoD41NBjNwsqOqQTaUbqn0rxwWXxDaoFsV/sdu1ikark ika6YcuE6UI9Wm7jlWZGrx2eqfz/6MrLa6jwPK7S0rMDTb6SRJ1xnsp/x05TZEb4U65N TDmx3/yhDoTMjhJHNE6Dgo7g0yDg9e/KTNGnjzX3bE4K/AYZABeTUbKiWytpE9LDiGXj qy0J4/qWnGtsF3Rv5V0a6PwG2BAnlbgPDwVhFzToD6z4ZIH0Sx7VLFiWegcfxrEzJo9r 3BOSuWOmKOA6YxdtSnF9sehjTEIgu4i57ncaPGp0l/fqeVmymvqshP3QlC3lAaBVeu99 74qw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788813200; x=1789418000; 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=s4tTeUVXrP8PDX4fDGv3MD0jVy8bbBgnnC6+ayxYRRA=; b=ppMD9IFFVXuWeXT+0ROCmkvcomFX9oHn5pVS9SeWAoxDNIybRKoNi5aEav14JEbvJL CxEfD4Gfm0P7c/vd2zM1cfRfiqgCULRcYaIQLtw2nIuj/95sD5H30j7jqt0+WuZx647E +J5CfWUjZPLj8D0N0IOaBhT8gZhOXApgADihzLkoNPJnXh7mKj/n9jwUGz2O00JsmoUy CvaBTR+6K1DEI2bq9Nnn6b+IEzbzHeB8UjtRio+HdQ1R+KDphIIKW2Nes+K9UWlsbX9J T3WlPnx0WKic2gnbKeWT3CJ793SHrVkmPIaC8o8XMUvsmJ/AW+HWGfmwxLkO/b5H4Mrx eZcg== X-Gm-Message-State: AFuF++nCrm68+WihH0wx2RoavirFVXdTckmgttmQ5yikdkZsaFoDKr82 4u4mVPOXl438ZqUt2F9hJj3PcqvVL9GafE0RKJzemxhioMZud7Kvg2Z8iXae+GQwWBIOc+w8jDt SY+Xr4OQ/yFCgUp+w47JDWH/eDTPiPZxmCctFeHc2TAy8KmnuLGS4OHROX3OM9wdO2w== X-Gm-Gg: AYBFou0yyBsZdsM9gIP1EvQTvTp6VZPBu41/uzj3iQOWuCl+L5DWjLkvDe0Tt/7SNdX U+y1PlxR+w3BcB4D8TL8yxzU2m6ub0ouXRNHCFTc7eTcIKf6F98uXV9DB+6t9XQVC+8u0cZGpX3 DNy5uZ0Iu2DMOjkfHX1R2pUHI5kqVNKARXtir/u388Y955K1nBepcS7LbVvOtAL2388WHJiPA/r eqx6SFz2Q/37iksPSYapHm+la+nXPSGHzny0CUE4LPm2f/dwGI+qL19XFcgmZcmH1yWr7PjgPgN wzibXDqQTa62uTv76xMQAVOuAVDDO4ZKgRZJSnPc5sMQd3vyjcjcWUBj57no5LtYIve/8eC+G8z 8UdGhh4d30mfHjZ5rNjjcLKjwEcKAtSX2Y9A/kzLzVaP1hU2Nw49VfnMnR9oAyODzvUrlQsuUkD ifeFj5DhGm5WuPNnoIaaMfyQ== X-Received: by 2002:a17:90b:2f46:b0:396:6344:3b63 with SMTP id 98e67ed59e1d1-39b260de5c6mr40578520a91.2.1788813199905; Mon, 07 Sep 2026 13:33:19 -0700 (PDT) X-Received: by 2002:a17:90b:2f46:b0:396:6344:3b63 with SMTP id 98e67ed59e1d1-39b260de5c6mr40578476a91.2.1788813199447; Mon, 07 Sep 2026 13:33:19 -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-3339af25062sm47841297eec.16.2026.09.07.13.33.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 13:33:19 -0700 (PDT) From: Pooventhiran G Date: Tue, 08 Sep 2026 01:59:11 +0530 Subject: [PATCH wireless-next 02/18] 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: <20260908-smd-v1-2-65ad4ab30fbd@oss.qualcomm.com> References: <20260908-smd-v1-0-65ad4ab30fbd@oss.qualcomm.com> In-Reply-To: <20260908-smd-v1-0-65ad4ab30fbd@oss.qualcomm.com> To: "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Johannes Berg Cc: linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-wireless@vger.kernel.org, Pooventhiran G X-Mailer: b4 0.14.3 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA3MDIyNiBTYWx0ZWRfX8Wk64LvYMjz5 eH47vOEztqrCcbN+k6gp56znfhT68lYI4+uPhn8545F7vCGpvM5613qFbMuH4MJ7AqUp39/uUk6 k9nPQD0ngnuCvi4PeT4Q71RRH3naAuI= X-Proofpoint-GUID: NueyadzKOOL3d2BWgvbRMMCrfo0KzHfh X-Authority-Analysis: v=2.4 cv=ObSoyBTY c=1 sm=1 tr=0 ts=6a9f1f90 cx=c_pps a=RP+M6JBNLl+fLTcSJhASfg==:117 a=Ou0eQOY4+eZoSc0qltEV5Q==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=Um2Pa8k9VHT-vaBCBUpS:22 a=EUspDBNiAAAA:8 a=-9rhnhb8Ej--qkh-m00A:9 a=QEXdDO2ut3YA:10 a=iS9zxrgQBfv6-_F4QbHw:22 X-Proofpoint-ORIG-GUID: NueyadzKOOL3d2BWgvbRMMCrfo0KzHfh X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA3MDIyNiBTYWx0ZWRfX3B7dmCTvROKL HVlAdAhmi4vfT0amU0N+ZsEP6O8Y2Vx5+LhaqXX6zYTWf9oZxGzxuZiOzR+EPBUiu1Z2JC1TGYF 8Ll3WslKrlhIWikJdO8vKdeg9oE6i/QiV+W+TAfMdcwwI+0nRRBzeIAYekY9bzTI/oOCre1QOxt A6anyxskAuxzngjHLGqlDTGjD2XsSYEUhi43f8NtBWZVRnMvY/xM6exvwmACH+n+o2w4CE9VaVu P6l3y2LJKozd8E3FBTaf2H2Djw6yUSBDeH/8ftC2PVBcrBdItr7Bgs82dv8KHGo3eYK0n3hJpRH hT7LjPRqB2iIqVER3aeplWhBtaWF47ULKZX8a6lF/PsrOvyURXrSmY81E9mh8R7Dny0LpnJ9tDV V1thrCL/LOl7fUCEEUS33/IJaehDG0G940hzE3Sx/NHAxarNGD2TuzwQlkQaPOr6b8bbUiyLY4N Z/GUkVvYjlkAQbHi6QQ== 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-07_05,2026-09-07_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 lowpriorityscore=0 impostorscore=0 adultscore=0 phishscore=0 priorityscore=1501 malwarescore=0 clxscore=1011 bulkscore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609070226 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 d8fefefc11a9..d9ce185b0ef1 100644 --- a/include/uapi/linux/nl80211.h +++ b/include/uapi/linux/nl80211.h @@ -7114,6 +7114,15 @@ enum nl80211_feature_flags { * @NL80211_EXT_FEATURE_PROBE_AP: Driver supports probing the associated AP * in STA mode using @NL80211_CMD_PROBE_PEER. * + * @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. */ @@ -7196,6 +7205,8 @@ enum nl80211_ext_feature_index { NL80211_EXT_FEATURE_ROC_ADDR_FILTER, NL80211_EXT_FEATURE_SET_KEY_LTF_SEED, NL80211_EXT_FEATURE_PROBE_AP, + 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 Fri Sep 25 23:09:24 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 E801E42A165 for ; Mon, 7 Sep 2026 20:33:25 +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=1788813207; cv=none; b=icdxHGfGiTKz8kLRbuy8UyP0MCODr4FPYFp2A9dxxW1Ex1/bv1wkql5yEbqDcv+yyIkIbropTYvgmfM5UtKkn5GMmapR/Shti8aNuDahXmlumtuLG6fP/1TS0yaCuMuN2UAVppJAuL51b7UO8DOTAH1Og/RWELjDoDsurw+dPgU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788813207; c=relaxed/simple; bh=BdDhSKqvE4bR6i94Z4PzJjpFNgCG9vS4dOfg0BJDMsA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=gkFZcThU9kgVvnbdZQfBRAy0XVu+GGHp7HTvNM1V1RirGSUl6RcH2l5aZ7tLkNkb9YkgGUDZ20LbAPOF6Njzbopm1qSO2QzQEktgtxbzM3BmiZVDmrAUJ8qRlwY4KW71zJxbgZEdkIIne3IL76h5vZbw6DKoHBBFIfPqYGALE+k= 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=iRY5eD/v; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=Os+LXN6S; 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="iRY5eD/v"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="Os+LXN6S" Received: from pps.filterd (m0279865.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 687H7n701314404 for ; Mon, 7 Sep 2026 20:33:25 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= VQNR1mlZBEy+Xn7d0FfH0MwnsJQZNZ8utWBVHbu9Dpk=; b=iRY5eD/vXoH7sv8P k8JzvCxHSs9P+RfQUWcXUBDFagdmKTDSCzC4PTpuSp0UQXIgR+tINCzlXBWZAJvD 9r5K3FQvYY7rJ+FmCl9Gxy5+6pDtaCMIx8aQc5780VQOi0HEUka/11YzUMKwCih5 E6ZRNxwR5j5tGBIZqWfzzSKywD7HKs6CoG5fnwjEMpGSuATYrUOHmnnqLy1gbDpH IVwJ72CbXWr0Jgn76pcpqY0r8Dj1hWA6ZuW7s+B2UhJLkHd8hCJENRSyCRa0QViP EBmvQ9UnwaTZAA0Hc8MP0z6MZQIZ9K5Wqc5nmoIkxVyg+fQ6oBDB78WqDgU0oZZV ckUvrQ== Received: from mail-pj1-f70.google.com (mail-pj1-f70.google.com [209.85.216.70]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4ghuyk9vqt-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 07 Sep 2026 20:33:25 +0000 (GMT) Received: by mail-pj1-f70.google.com with SMTP id 98e67ed59e1d1-3968dfff779so5337195a91.1 for ; Mon, 07 Sep 2026 13:33:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1788813204; x=1789418004; 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=VQNR1mlZBEy+Xn7d0FfH0MwnsJQZNZ8utWBVHbu9Dpk=; b=Os+LXN6Sq5wxv1TuQZ3x5Jp7deX4vskpiGI4WGmJtjuqmOJRA/A9Tzz0IhdOkd9IN+ uSoe4yZ79cunFphkwFnt+WtL9B86tfe6Us+NLZg5CK0b9EV6F57hJ9Lo+pNuPVfz/HQF dZusoC9AvmN1+rwuwBZrehavQ9w4Ko2pyi4KeBczrubkoGM45UIw/YTUS+nls3N39Eis NEfe9d05SMDGKSEqyYSj/0dQMAgo3Jkg2X/DlQni/LjMriT4tqDFfd5ew+FNdMdYoM3O cYanoJrcv7LaqOfbXGE14p5dNwLZJjBpZ96bdV7qco+nsOozkdyMo6tJwIrXks4rlLHx 1Eow== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788813204; x=1789418004; 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=VQNR1mlZBEy+Xn7d0FfH0MwnsJQZNZ8utWBVHbu9Dpk=; b=ndYr6ZmpqhURxeTUmrnwmWd633uVHOZC/M+v9oMHg9SagGLCKjxPROWCIRr97dDO92 tbwVeUgWKXxuc4N5pkW7Ws+xkf6gA2pANSVuplPkz+pJD5abP23tishkmZCZRBTXkmk1 gWN1WF2kC4gt2hPiLzznBA+1vuYsGWqRtETom4MgmaJKClTtJYhvFKNVfW3g0zGW/v72 djlvPQF5umf7ezLoHJrzyGGoEgVhdsURMUezEUCkZAZ5TfGlgvlxYwpFtCQmjVwKHJrC 4o7XVBwsduICTJdpWYkbNJc6AWMUaAcc9SOAyb1anI63LuZmuvRvux1fN/ngJvh/nYW1 6JYg== X-Gm-Message-State: AFuF++mB4/STWGmhjEOzK3McGSCuzYQLEdrM5sYsiSJLhxm07ItxP0EM eYwlyZ+WOyvUVzlGbZTUr9VTOOV1O7qXODavbjZDw9WWFfOej6rfaiHV1pVl321mYj89+JG4F/N lV1cWVYSi5l+e0FoGv8ix5XLGFcH/DCjYjqCs8ImG/8hLShdGyBGJ09k1ce4j7S8wuQ== X-Gm-Gg: AYBFou0QbxIdvIEXODKYIFwpO50TLmUVeZJHRv6yUbrh16U/HAGYhZ/GGScRO8tcxEU MMp/eJjgS04Ria0/ssvMMS+rBiqOedQ3vPXm9VPperArq37r6ROtv+wI5wJZbEiCiVej5bB+GpJ 1GOgNjkJFeAItNA2W8sufpyb7KZaDJGqKWf9mqAG+JcRRSphPi2RykHVN/W8nUwasfNWxFHY8qY iKqC18/QWMe2LgK7SydjiC8ZaVkV5lpWGAffjLxLjCXkAf+vUs8WJ+iy5I/dNghMpsTPIrj9kfk hgrC2AQv+AV3uuP+ip7ll6YJGHLcX88N6El4zGv2qRlmXuFV51TmWryvZtwhRJnNZwUGdTpDW5A ofCKRYe7eUhdzyVWEo54LYtxp+7FcwQSjfBoCs+1IM8hM4KmZBPnWCHvVIUwJ1oooZUx8B305Et +Nk1/pG4AMwu2/GewvDqR3YQ== X-Received: by 2002:a17:90b:35cf:b0:398:9beb:a2bc with SMTP id 98e67ed59e1d1-39b0881d765mr33799969a91.30.1788813204293; Mon, 07 Sep 2026 13:33:24 -0700 (PDT) X-Received: by 2002:a17:90b:35cf:b0:398:9beb:a2bc with SMTP id 98e67ed59e1d1-39b0881d765mr33799937a91.30.1788813203786; Mon, 07 Sep 2026 13:33:23 -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-3339af25062sm47841297eec.16.2026.09.07.13.33.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 13:33:22 -0700 (PDT) From: Pooventhiran G Date: Tue, 08 Sep 2026 01:59:12 +0530 Subject: [PATCH wireless-next 03/18] 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: <20260908-smd-v1-3-65ad4ab30fbd@oss.qualcomm.com> References: <20260908-smd-v1-0-65ad4ab30fbd@oss.qualcomm.com> In-Reply-To: <20260908-smd-v1-0-65ad4ab30fbd@oss.qualcomm.com> To: "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Johannes Berg Cc: linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-wireless@vger.kernel.org, Pooventhiran G X-Mailer: b4 0.14.3 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA3MDIyNiBTYWx0ZWRfX96egMid4frPG 8tlHnJLg5UR+g/jZibjASE3VpNlffb3J3ksgq4V9PWzj7iixhntfQC8t+QWguzMuUgZXipjpbw+ spv2laDrhpcLmGZBpJoWxtXakPjy5K0= X-Proofpoint-GUID: oCsfFqYpurxAxNr-hChiNZLJjyB6MQTo X-Authority-Analysis: v=2.4 cv=ObSoyBTY c=1 sm=1 tr=0 ts=6a9f1f95 cx=c_pps a=0uOsjrqzRL749jD1oC5vDA==:117 a=Ou0eQOY4+eZoSc0qltEV5Q==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=Um2Pa8k9VHT-vaBCBUpS:22 a=EUspDBNiAAAA:8 a=WqWJlBuMtEtNw8dGTc8A:9 a=QEXdDO2ut3YA:10 a=mQ_c8vxmzFEMiUWkPHU9:22 X-Proofpoint-ORIG-GUID: oCsfFqYpurxAxNr-hChiNZLJjyB6MQTo X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA3MDIyNiBTYWx0ZWRfXymFqmspe1dot p5uw7H7VGQTB0MZQCq78bxP3tFAaz6O9p0ZzMuwKHwJ4TOcZWHxQ6x0uoJqAqB4YrblJJ/aQgIz VjjakQmMQ6Ei7F6LWTBYuCBY935JSE/EJ6HOfRFwbTryEzLMLOVT2m3mWD5pvk4cjgj+mMulxD4 DOk76uaBiEk5PhDtAooewfH+0afSUEQgJakskw4cJ1tgV8kVnVFvj/WRwyfupo7kEoP2TD5c41H 0D+r4yfs6y3aCC4yJn0pbaRV93eRMPHW4CQsMqCxfd6Yc8AJcATa4Ch73B7dZMuyuyvlsfGRyBp 5cKEj//TocwFbZanAKDn7wbZGWen+NUABgMI5M7tpmgTpgQyD382q7Rrbgth7SJm877U7lCpeIU 2buBbSKJxim7Mq/USkR0JbnrysYtVYEfu84U2d0Wc3hn38YDRSVYpMhbuFq1il66e2O8ISX01k7 xYk93/YQ0cy6bj92KQQ== 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-07_05,2026-09-07_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 suspectscore=0 lowpriorityscore=0 impostorscore=0 adultscore=0 phishscore=0 priorityscore=1501 malwarescore=0 clxscore=1011 bulkscore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609070226 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 d9ce185b0ef1..f5c8dbe5f26a 100644 --- a/include/uapi/linux/nl80211.h +++ b/include/uapi/linux/nl80211.h @@ -3185,6 +3185,12 @@ enum nl80211_commands { * The aggregated message always precedes the per-link messages for the * same station within a dump sequence. * + * @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 @@ -3785,6 +3791,8 @@ enum nl80211_attrs { =20 NL80211_ATTR_STA_DUMP_LINK_STATS, =20 + NL80211_ATTR_SMD_PARAMS, + /* add attributes here, update the policy in nl80211.c */ =20 __NL80211_ATTR_AFTER_LAST, @@ -9118,4 +9126,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 e585da1d79c9..22d71f32815f 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, @@ -1097,6 +1112,8 @@ static const struct nla_policy nl80211_policy[NUM_NL8= 0211_ATTR] =3D { [NL80211_ATTR_NPCA_PUNCT_BITMAP] =3D NLA_POLICY_FULL_RANGE(NLA_U32, &nl80211_punct_bitmap_range), [NL80211_ATTR_STA_DUMP_LINK_STATS] =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 Fri Sep 25 23:09:24 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 3CE1044607B for ; Mon, 7 Sep 2026 20:33:30 +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=1788813211; cv=none; b=ck1xK1+1KuZjqlds3gBtRpk/2r4I4kaNEtc4Tc4sIH9dkgRElf/Ur3rzdqq3rdlGZTxkj6zEZG1o1JSD1u1zUyOCkwenu0cVeXd5PKWDsGRMqMKbG/hp/pBTYEkKZpuym+/9+QcU9cN6IAkKufIfE05/pUx5oWgw94gHvPA9R5A= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788813211; c=relaxed/simple; bh=vGFJQ6aAodKhtzS21oPWEsRImbjCMwfBF99koJOYdiM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=phoiiUoG4fqXQH73OCFlqggcIKvExE6ntf/LFlkEj2t+v8zPUUQfr+PsLQLdrsbZ0StPOsEzceQwwmW5I5o/j1GdB459+PBUqWhNwxnygNpM9DgYTPN74N4T3JsfAo38mVf+sxos42+wUDdM/dtG9cebkkz7ybSOaL3H3Dn2rKk= 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=ZiGbn6se; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=QA3uUY7y; 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="ZiGbn6se"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="QA3uUY7y" Received: from pps.filterd (m0279873.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 687HXE0o552724 for ; Mon, 7 Sep 2026 20:33:29 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= tmSBOtvSp+Gmy3pqLBjim1lUAAw6sE0lZZQQfu5q2wE=; b=ZiGbn6segsoLakw4 y4HXVWYxLiKdfZtKxyeVKoWm5rUTQ1Fq9A4fVKo+E1+U+R/qQDHVMlP5XNT7eFde 4zLO1/JSHJGSRsb8JtUU1GrhAaC/elb0U/tXbfDXfkxw+mfdsxSzXXx/8swt0Bfm 0pJL3z/+cxKT6BIGVdQoh2F5uM0j2ewWnZwF/X7WBcaqGCdHprIeZUZtUlxJJXNz 1qluEfE5Z1hVTmgY54Cb75tzNWLUipgiTdiqhjVGG9ps2lT5sKiDFlfbaPFKs7n5 TVyJOokJ8xjnoNGc6qXo3Iwc4Xvbsn0jb0x0ZSnjMCmhTJUulH+H9IuHKJrNUxk/ oCHH3g== Received: from mail-pj1-f70.google.com (mail-pj1-f70.google.com [209.85.216.70]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4gj1rwgffj-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 07 Sep 2026 20:33:29 +0000 (GMT) Received: by mail-pj1-f70.google.com with SMTP id 98e67ed59e1d1-39533bb224cso353985a91.3 for ; Mon, 07 Sep 2026 13:33:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1788813208; x=1789418008; 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=tmSBOtvSp+Gmy3pqLBjim1lUAAw6sE0lZZQQfu5q2wE=; b=QA3uUY7yFSCFR8YAa+Bq4qdNAY+muwZjn/YDHzFj67iQNzWgrF3zCEkoimJazssqZK elH8tiftEbeMjV5BV/yBWSMir/j5E1C4HBZDJnwacNZbkcHw1pEuN6oit7oFGS3AxMaZ vsLnvDYkelfKS8bGWJIfYVvleJ0pwQ4HI8yIiym+5WQWlSP68SR9Qw/K05VdqBPdryFR TvUrbbModxJvuC4SmBdgPz3ji2QdFioTeExu4vODKIytuSuTo8FYmakn7AsJpC3MndrV Vfsm2ACL/KP464LwgDdO3KAPOCG9Sx+MdjL/rAVyoB0QPBMPSnNjBJMaRzZa6naRSCW3 12qw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788813208; x=1789418008; 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=tmSBOtvSp+Gmy3pqLBjim1lUAAw6sE0lZZQQfu5q2wE=; b=hqqN2BZYKe2EIS8IQKGk6sqdgS9ORlBfqzVRKbYoGg6ciUIpZwS6Ero1NfKi9+IJgx moF9DMGfX9wb5hpwy0HJyc58UR7DglUoGP2ogE8pus/szA0r4Oauv+V8m3pTnrUz5jUx EGJqjA5ZN5QoYCcYZfLAvBD8uZiH+zVgUey6xhhIITZeKDMnrVnEcgCe+Evj0wDu3oE9 xSKgT68IaXgNZgO48Zk8Z4QKxkyX22b0T7PKsiWYFT2cm6fLJhEGgqjZPGOqmoBxHtMR NmkvAxtGHd9yKyffqNn0RFip5GEqTuXRg2qPnDqJiqkgdOsBA1oCJ7fTENAsm7GgAWVv B9EQ== X-Gm-Message-State: AFuF++lNldJN7S41n+aL8u5P1wFh1F3xN7qAfRNZR+Ll9eQdj6Iiojjf DGsMfVGQGzxBaYGd2uwApI2GCr7+5LJWz0rB1YI1/IT1zMwl/cZ8cokUebuZLjacJmuFqJKZDeI XuRTq3AJPFVLap/LLaSW43GkHPcXvlci0tmJAVPlIWSxjBKEL64zzxhgrZEhebo+ElZXzNGpsew == X-Gm-Gg: AYBFou0f1mkpBv/eKpJXfCRnLp2P4icQHVOT4tYr/JvLTQlNJ5KwySKQHzy94iG4K7m odjGcCuEg64GIeHViGAlvr/l0oUsjdQgt3LyPz+nkcRHmRFahQSay0XCX+ucndzSF1/KvFM83De Eowghbq1PTLPL+sQYOS+qKtsIMXLG27luAzIeSNY4rpfev9SjPLgtnpdKKvID0IYt7qmSwvYuxW WDA5sZbmRl163yEQeJqLOmERZ8DA4uqLdXRyQivdxacKjcsHdTjh3/oll1cYnQKbdPemrSKexTG DZrT2xcgED5+F2cArH1e0+AlvuEa5LokATJyjM0XHRM7BYEO37z+UhiV/EgCqjlu0PDmXsfi2CE vfaWcVdExI/uukZZ9YR6Zj9w9RH2eBBugfwM1C8Pi8fngm5CvBbDw7GN4EII6e4jjrUk1n7EuHB jlS7ZxtA2H1C/zvEFuDxr+XQ== X-Received: by 2002:a17:90b:1dc3:b0:398:d6f4:c61a with SMTP id 98e67ed59e1d1-39b26207ee4mr38263436a91.17.1788813208192; Mon, 07 Sep 2026 13:33:28 -0700 (PDT) X-Received: by 2002:a17:90b:1dc3:b0:398:d6f4:c61a with SMTP id 98e67ed59e1d1-39b26207ee4mr38263380a91.17.1788813207672; Mon, 07 Sep 2026 13:33:27 -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-3339af25062sm47841297eec.16.2026.09.07.13.33.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 13:33:27 -0700 (PDT) From: Pooventhiran G Date: Tue, 08 Sep 2026 01:59:13 +0530 Subject: [PATCH wireless-next 04/18] 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: <20260908-smd-v1-4-65ad4ab30fbd@oss.qualcomm.com> References: <20260908-smd-v1-0-65ad4ab30fbd@oss.qualcomm.com> In-Reply-To: <20260908-smd-v1-0-65ad4ab30fbd@oss.qualcomm.com> To: "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Johannes Berg Cc: linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-wireless@vger.kernel.org, Pooventhiran G X-Mailer: b4 0.14.3 X-Authority-Analysis: v=2.4 cv=Ga8nWwXL c=1 sm=1 tr=0 ts=6a9f1f99 cx=c_pps a=0uOsjrqzRL749jD1oC5vDA==:117 a=Ou0eQOY4+eZoSc0qltEV5Q==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=rJkE3RaqiGZ5pbrm-msn:22 a=EUspDBNiAAAA:8 a=56q9xwJp3_aMvtWITrUA:9 a=QEXdDO2ut3YA:10 a=mQ_c8vxmzFEMiUWkPHU9:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA3MDIyNiBTYWx0ZWRfXxeD8qpGh0R+I 72EnrvzJ4LpVXvhNM94WHKDdl45SaL/dmySqQadDN/8PH2c04NKdrpRXfZJoW22eY2vblzWYqfp csb8Os+bsM5rZMTjL0MPGWVM0bm7iGZRJPHoW6jvVBXkhXfZeLtyk1SFoRtyHApnvM3hOESGQfe cSS04jQ6TX50uS0edA92FhuJzBgpyRJ6SR7SaYnIqNpJnFASVZgbwfboq2dIBNTArHzJRZAWlYv VBpuPC8tkQu940tQIBt5HpPLHuBWPVghhEgRy1rZvvG2pQ8x5dYI6USKi054KUavpGljV3gkcmY ATSjkDiB6t3L0uV43HRQ6vOkxJx5vnxEooEtGU839IXz+g1W/VtOVlZyywn9WAU+kwynBTRrxTm wUQ+MP3lgBmvzRA25jAZCUyKipXicSWDTcsljwR1Ob5yiOswngJzgxB4kdZb5Z2nwFacarJ6TD7 uXZN1HsmHE4guIa10bA== X-Proofpoint-ORIG-GUID: QOpGWBaA3wuSsv03j1gzNDxndJs5Po84 X-Proofpoint-GUID: QOpGWBaA3wuSsv03j1gzNDxndJs5Po84 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA3MDIyNiBTYWx0ZWRfX3T/6lCuYCdp/ OdHmehCKyfWMJxgeZc6XYxfahC/izaD2vhRl9zrfggqXW9aY4z0qvCWNnHWRpMXvucZXJZQvYY9 dtcu0qfIEiNM5DGDB7tegQPwPAWJhGQ= 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-07_05,2026-09-07_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 phishscore=0 suspectscore=0 clxscore=1015 impostorscore=0 bulkscore=0 spamscore=0 lowpriorityscore=0 priorityscore=1501 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609070226 From: Rohan Dutta When an AP is getting started, configure the AP as SMD-enabled if userspace defines 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 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 be able to 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 6461a7bd0169..d0a269f4c711 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 7bb4618065b6..6b82ca07fbf0 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 22d71f32815f..aa7aa70a5b41 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c @@ -7224,6 +7224,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]; @@ -7505,6 +7577,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 Fri Sep 25 23:09:24 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 7D4633BA241 for ; Mon, 7 Sep 2026 20:33:34 +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=1788813216; cv=none; b=oC6LWVYZiHq3vP8N+J4pNXfYTagnC9SviXxFL5idSLM/iifyt3Djm3NaaxZ/SqnheMsSvVBJRLpbzQBEFipC0Q3W2CkMx+A2/e/od7fY52mJeMvD+luZcuimRILNxUvayQECL/P/ye+lxTdhv0s5SK7W5yAiGdCyAyn8D4gt5/c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788813216; c=relaxed/simple; bh=okDgO6J3Qp+rfKQOFHaR0Wyt8fws8ufD69oII3M+1Jg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=mvlkkFrLvGGK168vtl9vFjl2gNn2OjlvtGK5f2xJog4NcQGfntP+whgrvVYNnD8AXcmCrcvXwvtdLnI90f8k7UVa5DQxnm/wtUM8tAaa1BHVAXBff2seJR+zl07CvFZwgezUYpXrLyuXGh4uZENKYxuBXNeo0y1Xrz8nJ1ycOss= 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=oU+cGpA3; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=ePlfY0T8; 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="oU+cGpA3"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="ePlfY0T8" 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 687H8c5n416291 for ; Mon, 7 Sep 2026 20:33:33 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= nlCSODNKgYyiYLj0bQxf12brdADlE9sLW5aEHOCrxXQ=; b=oU+cGpA3MXqoIz0L Xu0oj6z+lOw4ZocBIj6KK6Dmy65FB2AigOX956whehe3MUXHbmFOxDb5Yjb7SgfF zzs+yK17gQgd7wDGYXwV+pe5AAHiiYtOYYk6fnsgJrppXQSGO+E8gebDA64L1Cbo 9MVtYMMEZ1eKSfHN63P6/UDPqtw+J5hpAYJKcH2q59x15gPp5BiX5ZRmI9zkMdiY 2bpQOylUr+BsYNvMW5LiGCbbEuw4CCkxD5yjIp/PO1LfAb9ZA5hXSmqrluQg3/lO Wyp8H+YC97GF6u9ewSGVqi3rmaJEwjIIlHleMh13num9xy6kDhqdQBeI1MqNs/4Z FroyEw== Received: from mail-pg1-f200.google.com (mail-pg1-f200.google.com [209.85.215.200]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4ghsfyjkr2-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 07 Sep 2026 20:33:33 +0000 (GMT) Received: by mail-pg1-f200.google.com with SMTP id 41be03b00d2f7-cc4922b7c31so23755a12.1 for ; Mon, 07 Sep 2026 13:33:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1788813212; x=1789418012; 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=nlCSODNKgYyiYLj0bQxf12brdADlE9sLW5aEHOCrxXQ=; b=ePlfY0T8+1y0+ez2+A1w/L6faQ6mmEU+2cN9o1d1gguc4OrWiFSv7oFqeMv6AnjgIX tO7FjFITHFIvJZkGiWaJuhGTHHQK5fnnCMOURXzHJrskcjWLOwo9nr1kcENMM1m43Rou x06ZeyaMObSn2beHXGXvcU6AAvlIKXMyMy4xluRb9C9VPIJX6uHCcvL4jHNxpMxw2DB6 TILqcB/8mSEP//SaBnzcNNT6i11Om3rVWBNos9Mesw0qC5PEO4gZ5pxzvmt8NPnMst6e GfT3JLtPZKG5bM+GKXJ4VgW9jo9VM+NieDCkxVAA5cnIFuPFVME7XSCfrrw4fiAsm7Vl Qybg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788813212; x=1789418012; 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=nlCSODNKgYyiYLj0bQxf12brdADlE9sLW5aEHOCrxXQ=; b=EKGziGAL3iBVXw+giHlgeWafFYkYGn/Ef2QJEH7WtMB5dBNnuOQCCdQO+YEh6BXgYE 7WzDkR+JLLgKt1BX6KmhRmuOWekCfAcjF9nvAs4O4l/N5rqTUTkzFS+CN1MtiedOqe84 VqBu+7hiKK5ztqLPp7+14vQkJ6Q/qdQayOFquSaAJ8nAAdvp3zeqRenAkEAWvEd4OqIz kj/bV8zJSEKqPN7Y3+4e9EgIqmi+l0nQ8QlMyY2pcoy3LGgDhvNF0qgu5Y/0TLmYptwe F4cdSAVLCTV49YKMFa6QgKCNVSAmos/ZTJH8Dg9miZg3Br9nw5UuKxz8Tly/j2m/y3VN FKvA== X-Gm-Message-State: AFuF++n03bgasQA5axE5mMbjnCHXVCN8iyrsfensjBwyDunxQVWdsmq6 E5cccyy2h4NZitMBAM2Hkt8e8iLGkBnOUEZ/DsfTpayxCnrPlyN8vsGnYxy5Azd0SEaYctGw4Z3 0Oj/X4lLAhMcDkNYZxqIANrLn1+bGMEz2oUgrdpXIGUaOdw2uornCeJKRt8FZrl+aag== X-Gm-Gg: AYBFou3xbQDvABxan6q7JEyOSIamf1DkcsEGkraZXfAE4ej8ZHsl3nU5xvfBezH9ApF ENTThvtR2Cy3T0tKTXKEQyTUbzVAmO6ila4YL7UY0HVCI/ob/vCY9lHyXHuMEv2eNHnP4yh0uM4 tP+imBYdAA+Js6WLRDg0ax7LimiZ9zCyUGZllfT1DAfjymMGdzy3kP4mEYN+cqrqY42kd+QTpaF JGQgwn/jfes++3SqXp6Xpc6wDHGpGFD0mp7e7qPPVRdd4BQ/+p5AKy0mr2VQya/kNnsSDDPYk2O IDz2mgRYGBkQMzp3ZmRtoZEREkT4BnRBXye80dxAiuONh0QH2cdGj0Ymd8XYo3S/a8EizZQ6gP6 eT1TNz/ertn5mZDo9LG9UzaRfZ+/6vg4LtE4QjgjEzMcdr4XW2fQxk7O4zOV6bdUJubCHUwBDiX ZAgKzXlO0+HpnGQwRTZ5q8Ng== X-Received: by 2002:a05:6a20:9630:b0:3cd:9f0b:f7a2 with SMTP id adf61e73a8af0-3da39ee15d0mr39841132637.11.1788813212177; Mon, 07 Sep 2026 13:33:32 -0700 (PDT) X-Received: by 2002:a05:6a20:9630:b0:3cd:9f0b:f7a2 with SMTP id adf61e73a8af0-3da39ee15d0mr39841089637.11.1788813211641; Mon, 07 Sep 2026 13:33:31 -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-3339af25062sm47841297eec.16.2026.09.07.13.33.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 13:33:31 -0700 (PDT) From: Pooventhiran G Date: Tue, 08 Sep 2026 01:59:14 +0530 Subject: [PATCH wireless-next 05/18] 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: <20260908-smd-v1-5-65ad4ab30fbd@oss.qualcomm.com> References: <20260908-smd-v1-0-65ad4ab30fbd@oss.qualcomm.com> In-Reply-To: <20260908-smd-v1-0-65ad4ab30fbd@oss.qualcomm.com> To: "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Johannes Berg Cc: linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-wireless@vger.kernel.org, Pooventhiran G X-Mailer: b4 0.14.3 X-Proofpoint-ORIG-GUID: kKBVIszvopxEEwxNgPMgvd_Jmb9DodNC X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA3MDIyNiBTYWx0ZWRfXwIUxEAknYpLe yt8mFrh8grccU4mMH200i1zWIcSJSntRiC8e42TUNiFE3DSeNAr+LqEpC26CSwV78P9QtCenk0j 9mxCQbOo6rPGDm+GRl8lgguRTVf/FycgTjQrWVdwYzA9jG7fVJF4ajojBnGboJF8yUmbMwAyxTT 8HsBDSecP8tM5LY4Jb1vqPrdqLadnG+tOL3h3UL2wdsEmM14eHtHAFaL7QthQFSjjZOIFmfdYHu NbHAEnJdx7wyY29TYimhTQmRvr/I6xKmcNvj1y2uMCJLNZ7ju8dB5B2BQ8W0+AhCyGY53VQevJw SVsQz6E8Cm0j6fD/G9Zb39hZheV6Q8l0eKg3hwg4gzaGTuruukNcmNkn+Tohk9a5eGCwLE1miwv KwZNWy1hVYmxN9DDyzXacTpmie5GK4iNJbc550QeqZoo8uk71ZXL5eassZ8Z2CzDgafKdV9zGyF 9hnmRZMww92YIlGU10w== X-Proofpoint-GUID: kKBVIszvopxEEwxNgPMgvd_Jmb9DodNC X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA3MDIyNiBTYWx0ZWRfX4SQjIGyqgCE7 MFGwX9rNinHQbj34dh4ZTXcw4cNDtoQ9v3OkhOXl8XGAQ+FNqlF7isn2rHHTxgx4azuIp/EmsQi CeiFfIoJqPJem8L0ndsx+lvnBsErfvA= X-Authority-Analysis: v=2.4 cv=AduB2XXG c=1 sm=1 tr=0 ts=6a9f1f9d cx=c_pps a=oF/VQ+ItUULfLr/lQ2/icg==: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=Y27KnQjsX7IjzuVWbagA:9 a=QEXdDO2ut3YA:10 a=3WC7DwWrALyhR5TkjVHa: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-07_05,2026-09-07_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 lowpriorityscore=0 spamscore=0 bulkscore=0 adultscore=0 phishscore=0 clxscore=1015 suspectscore=0 priorityscore=1501 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609070226 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 d0a269f4c711..bf33cf5366ef 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 6b82ca07fbf0..d8f5e5d8a021 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h @@ -2727,6 +2727,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); @@ -2761,6 +2762,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 f5c8dbe5f26a..f1d8db31f17e 100644 --- a/include/uapi/linux/nl80211.h +++ b/include/uapi/linux/nl80211.h @@ -3191,6 +3191,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. + * + * @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. + * + * @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. + * * @NUM_NL80211_ATTR: total number of nl80211_attrs available * @NL80211_ATTR_MAX: highest attribute number currently defined * @__NL80211_ATTR_AFTER_LAST: internal use @@ -3793,6 +3804,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, @@ -3942,6 +3957,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 */ @@ -3955,6 +3971,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 aa7aa70a5b41..0d20c2ab3d5e 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c @@ -1114,6 +1114,9 @@ static const struct nla_policy nl80211_policy[NUM_NL8= 0211_ATTR] =3D { [NL80211_ATTR_STA_DUMP_LINK_STATS] =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 */ @@ -7702,6 +7705,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, @@ -7768,11 +7772,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: @@ -8913,7 +8919,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: @@ -9007,7 +9013,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 */ @@ -9261,6 +9268,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]; @@ -9399,6 +9430,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) @@ -9627,6 +9662,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 @@ -9660,7 +9699,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 Fri Sep 25 23:09:24 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 5FC8B3E00A5 for ; Mon, 7 Sep 2026 20:33:37 +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=1788813218; cv=none; b=ZBmi/T5Nb1uUChnA5zLjKvHUmiMykMII8JXDeEKOJdlnaBzTpE3C6sGSCecjuq/y57+Ko25WxvDsctpC5738Z6pT0CAAT3AWNv3UOLUWi+megw6j67TqXjHM1qHgNqTvsi4lL5tLLMrnij7+6pB3SRRwIj4Bi/wazOMtwz1xCjA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788813218; c=relaxed/simple; bh=n6QZOZ4ipBg1ZD4KtCHhdn0h3EQTsWMtpUTn1ZHyNpw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=pCH62ZSx4kYCuZAlcUEDd9eDbALZU+NhW92PTydkKtWvwEsqdewWG2J2ma994E+LPOQHLh9P/MXZnZ0RR56gillsQ4EXHpA9IYQCfSyAFJ1orq44AxVGKXBkNy80C2EVJcRDNSte22zSvnlKiqrXEOKO4Hj8zd/k5eoKUCs0WP4= 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=VfTHNGbA; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=NCncq8oE; 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="VfTHNGbA"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="NCncq8oE" 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 687H7jHo1642056 for ; Mon, 7 Sep 2026 20:33:36 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= 4cSKp76Wny+ccMBfbKuXS85MttxoIgTePwgcdN/NDrU=; b=VfTHNGbAqawR0xvl vlP2wlJ7T0WonKha64ImA46JyV07ZyMgjV5Xj5eoxcVNJL/r5A74sZxRt+tMx9CI m/JO2dYrQctSuTIrfIs9O7OQwRr3PCCA9GQYn0wtpWmLu5isXfU1qAJ6rmFPkzQg pPQLg/ObcEzhCDD3qATlccxXm2BFNfWtFq7semEPY0P5NrjJvDuJIkLCqs7xLwH9 q/1avRtfyOi6sITix36FLsR69NeChJ3PVwK8O5zv0x6rUJbvfDdXCmlXQARm6Y3k iT1krPbTP2kLWdMeChZGUxnSjsdljS/5PBqaEebpayaKbQknPU0O0xXPDsGdTxOC MxHfDQ== Received: from mail-pf1-f197.google.com (mail-pf1-f197.google.com [209.85.210.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4ghruaaxcg-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 07 Sep 2026 20:33:36 +0000 (GMT) Received: by mail-pf1-f197.google.com with SMTP id d2e1a72fcca58-84e1da97175so4533643b3a.0 for ; Mon, 07 Sep 2026 13:33:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1788813216; x=1789418016; 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=4cSKp76Wny+ccMBfbKuXS85MttxoIgTePwgcdN/NDrU=; b=NCncq8oE9oYH4zxb6ejEsJ4DVAqGG7/SHaRWROLokS344UDWFcTOOKErAWul31QZyJ Yee621h7FLd7Rlhw9Bxk1ix6qKL/QvUOOP934od7JkoyqE0e5AL4qOGB+LeOlA0l2Gkt 3IEsYlmlmgc18ZVnvQI9v/2f5PBV3hwE79TE+EcpMrduR+vxFyY+RpU72wrdpMJcqcQ4 Sx0QTk7mIaN9JlpGSAYfQ2GSXv687vPIElBcDaBIaIg7hdrM4jFX7FLEcXFc/NLEm6ME QnLXWOdHuAEAmCCQdp6FNjQ1JVdj+Kxz65Fz6mrc0hrMWbHdvqS95VeAE6lFZA2+4rV3 Uc1g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788813216; x=1789418016; 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=4cSKp76Wny+ccMBfbKuXS85MttxoIgTePwgcdN/NDrU=; b=a/vUGkery+1wM8Wr0G38IHLTWYD+ObgC4RN8TyFu7xUkstzLjgQJ9iHpTbOi8lZKbl DmmseVhNCXRb/AlziO4Pc/Rn5UCJFG3bVNdP+RrLHZ/WEhrv6lJ0BcVTkmxdOEl1IX+R ozqO9XaSykB0N3XD1v5ixnSV+wDdMdxAlG4InW6W11uaBnQGoG+1UjYmMBFjlaCDvBD6 8RuJ8i1aJfxATWNyk6Yj/BywJturi/Eju+pvF8u1x68HA3Nma+8Hbtr0xXV5SIBT/w0k 1GoKrUEeaHao0Hqm8kyEqSIBsHz/RFu/6eWPw3a3e5mtMO2u58P/B6LBwk17U01VSdDe Vz9Q== X-Gm-Message-State: AFuF++kZ4gd494mgFdcL2DFgEM2ForyZjVtRlwXx+s0ARm9itlEWn+K6 mgKY2suHhN+U0+zb1Adyq3AMhxgqHQdMmT33WJUh9y0SqhG2yTSMb/2fMoOLWaOwXEgktgA8HAq P86pN3RrHilXNjw0ksDl+ors3QeLeZNsLuUbcbbEyK/7rLrovb56nLkfhkRtV6wCZeQ== X-Gm-Gg: AYBFou2YN8yXMl2u8LhXECVu8w3QZbBERZI6oGJPtguT18CyP9YbAG/Ak6J28vGp1qr 0lDJms1UEa24SUdGDKsPcwlX9viUSxmpgAtYQk/GDuDoeoN801ymnfxw6qvenhFS1OVc/k9sUKg fRs49fAzo5Y/h9LWLoTd41WSJLjbOsrJMSpi4fELHD3vivn5OJnbFyXzUAroGTQlZFb5TxLOEfx w1fQPUVdUGFwAbnl2g9qoe6Ene/V2AMCLD14zIxDC3PPZSZR5sZNzST5eiBewx/jZThi7UzQCmK C8BInBkbDhsrjo6bwwgok3upUbs4vlTk4OfQDh99pYnpvh2tORnfKAf3re552Kw26cb6yCSwwEV p03pJEMJ6o985Mao8JnMilm9BC3A6F3604FpUYIC4NdML//6XPGK6t7Jhen3pTxJmFzcGQd39Mu qyfTil3mbEzYASET/0RNdL5w== X-Received: by 2002:a05:6a21:2983:b0:3d9:6f0:b42f with SMTP id adf61e73a8af0-3da39fd0822mr41240283637.17.1788813215926; Mon, 07 Sep 2026 13:33:35 -0700 (PDT) X-Received: by 2002:a05:6a21:2983:b0:3d9:6f0:b42f with SMTP id adf61e73a8af0-3da39fd0822mr41240244637.17.1788813215525; Mon, 07 Sep 2026 13:33:35 -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-3339af25062sm47841297eec.16.2026.09.07.13.33.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 13:33:35 -0700 (PDT) From: Pooventhiran G Date: Tue, 08 Sep 2026 01:59:15 +0530 Subject: [PATCH wireless-next 06/18] 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: <20260908-smd-v1-6-65ad4ab30fbd@oss.qualcomm.com> References: <20260908-smd-v1-0-65ad4ab30fbd@oss.qualcomm.com> In-Reply-To: <20260908-smd-v1-0-65ad4ab30fbd@oss.qualcomm.com> To: "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Johannes Berg Cc: linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-wireless@vger.kernel.org, Pooventhiran G X-Mailer: b4 0.14.3 X-Proofpoint-ORIG-GUID: bYrbM4jcBrvHTRjt-IT1SP4rPORiUUV1 X-Authority-Analysis: v=2.4 cv=U+aiy+ru c=1 sm=1 tr=0 ts=6a9f1fa0 cx=c_pps a=rEQLjTOiSrHUhVqRoksmgQ==: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=YW6yegcWvZZGXztGtDAA:9 a=QEXdDO2ut3YA:10 a=2VI0MkxyNR6bbpdq8BZq:22 X-Proofpoint-GUID: bYrbM4jcBrvHTRjt-IT1SP4rPORiUUV1 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA3MDIyNiBTYWx0ZWRfX2+AMBckw79qB lzwkcuqooz1HgcBHviVCnal6qTQ1E5Q2fpopnzQJsWrG7JqWNXCMveIFkD5Ay7OpJi65B5v6A50 3ZyiafWD+dRqDC6ZQ4cnybVLyYpGKj4= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA3MDIyNiBTYWx0ZWRfX7U1Qf8DhpY4E CsgZnewip4vS9XFLwjRq71iwKcaUwsoOqHjlfmSQUcZ89zQt+g0PIFRvdLV2M3FtRvi7PdyJCkk KW/4XlODPfNtGsnmvkIK7rRIPj0Z80jJw7f2HJKLMk3dVQTeswih5yXXC/duz5gkHyW0TndhVO4 FCPEhHLLVZL6x+xZahB+a2xRy+FmB/sHvIcInmz0z/yxTYTNmCDczWLSHgwe3RTT0DYBvWKLTR6 CS9tEtD4zY+11HmYNMfHY4Etz18qYWxxNs93Y+H8RlaoT9DuiBl7E5QUhBWo/suEfIVAfJnOOL3 kPtVmwyTGXdveSd5wSC2D4qenu1W67Conc0C1AqX8ySWx+VA6GJORU2+VCv18a+S4zFnK+nPVNx 7l9q+EUdJpdy6jNo39Sn3oYyhk3Zp6Mgjord1miWxxZ6DsDEgYuClt5QALU70PpYtsiDpeoyVTM mBqdDM4RHPUX8oI5D/A== 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-07_05,2026-09-07_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 suspectscore=0 priorityscore=1501 lowpriorityscore=0 clxscore=1015 impostorscore=0 adultscore=0 bulkscore=0 spamscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609070226 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 bf33cf5366ef..75d0123fbb5d 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 f1d8db31f17e..5e474fda2a49 100644 --- a/include/uapi/linux/nl80211.h +++ b/include/uapi/linux/nl80211.h @@ -3202,6 +3202,11 @@ enum nl80211_commands { * supports DL data forwarding within the SMD domain. * Used with %NL80211_CMD_NEW_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 @@ -3808,6 +3813,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 0d20c2ab3d5e..7577eb31ff65 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c @@ -1117,6 +1117,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 */ @@ -9289,6 +9290,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 Fri Sep 25 23:09:24 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 997793B9D9F for ; Mon, 7 Sep 2026 20:33:42 +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=1788813224; cv=none; b=gA73HLi75bUIUai/EVQdBIMnSoac5pxDz4NjRdkAl0WwymmoEqFUyYvTtytxHOkQ5xRpgGgQabdIiGNlbreH25jEvArkHvMExWt3mbqEuLKsa65LhTgwm/yurSShP9HXAvOWyDDaz11gTlTF1qmLjR6TRCVmXnvv4iGfMCeArVI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788813224; c=relaxed/simple; bh=XxXeGyH8LowR4EFnJMlxM2wbsxxbipviiWhjmsnKVcM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=OKarBGBJrkNhlzsoyCITisnnZPmYHQBj/HUjZRgONQXa1D/R6Nx9WoJDwrK+7vf3Wxyac9bPhc9VH39CNknCVJOJY6SF5yT61qyU0yfcQGl5EbluhHyI5JXa6onK+VeKXFl5jyCPDKIn2JIszqG4WVXUml+grnrWG3J951nh1eU= 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=jx2LWUgq; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=Yb13lr6J; 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="jx2LWUgq"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="Yb13lr6J" 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 687H8LfP1050067 for ; Mon, 7 Sep 2026 20:33:41 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= C4KjAE1JwpT6DGpnh/CZZfax3IJ/HuYkECxZMwDBCSw=; b=jx2LWUgqwXxwmLZC FB7Bk21kDrkW2c8kjyfcP+BAaAsVGyN68cYYqCoJFWZDrtujs9lzHMvps7NKFmuP aHTuSpWSPC2H2X5uDRinMgiiO2RDjqBrYS2v364ptdZ5bW++k1GKDKmQ9+REVmZ4 RbFAKTfU+kRmilkZL1v0ckJWU7tlu4JZDKC/+c8GOyXZoqsEb1/OdIM5Qts9JQ/B ocU8j/TTFsG1NZErbEKTfedeEDcsSAOCaL9F+W3+80rvZqw54pghhty2c2e/nBkt TPi7ZrpXMu/GS/6SRPyh5zNDX5zZhPMgMBDoqLfnK6fqWlSTZDBggUWhGeC2zwPG gTZesg== Received: from mail-pl1-f200.google.com (mail-pl1-f200.google.com [209.85.214.200]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4ghtdqj9sc-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 07 Sep 2026 20:33:40 +0000 (GMT) Received: by mail-pl1-f200.google.com with SMTP id d9443c01a7336-2db4e331406so26717865ad.0 for ; Mon, 07 Sep 2026 13:33:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1788813220; x=1789418020; 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=C4KjAE1JwpT6DGpnh/CZZfax3IJ/HuYkECxZMwDBCSw=; b=Yb13lr6JeSZ7DmWi0pWUpUE5u6hC03RQAkYuRPiqUwIksSJ/VkXXnNcqGCCx/aO2yy thlvVuTocbJk9vj4PTyYy2HoYo6m0fdA8aoZT4osPMs/NX8G6OG29v9l04zWQNzdT/35 i5ARSR0aMNFFPDsaVdTOe0UYrI1A0mLwCmP1agFJZRJE+32BVb5ZI0jq2Xyyx37l+PN9 floZKIoXpLPBcvrVNGs6IDxLJFcWTdZAeiuxsPypwrRpK7ihZs9eX+Qj1F6cTwTvT/RO IfpUbwMgPWnwC5MuJYad2kcdfs7YTuhh/NqMxITMp2H5HfW+lCa1gnFuYrjIPsQo13gi 664w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788813220; x=1789418020; 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=C4KjAE1JwpT6DGpnh/CZZfax3IJ/HuYkECxZMwDBCSw=; b=UG2hoxC5E/jy7+6VZPLJs5soUyF59occvJMaiA2jm0il/u7jeuG7EOSCKWaCwQy0dx GUHPrFxWooJrHR4FbcznvcPYnpd7tKN/aWugKWlxp5rUP1hVr43D8XqotTlhpULUyBAB n/8EbidBnHT5erVSLhfNY5w5hBwCf7kk+ol1IQ+JaFhfFqaJEuUtkGlfuT8+QGlsA3xh OyerMs/EtGQXWRqNaD35Nkk0AHxEOJ86QWIap9+sqCUof1mp1MzjX+Hn/wI3nZNShF4O 505xW45FyR4zWF2ooqaebnCujRBf6sBxLAXEVd/ckchazUkPMEg66a59tFkTQPZyH/aQ 56cQ== X-Gm-Message-State: AFuF++n8DbrYTJi56HtqoFZaCj7PCobzqbhZxkWl7+XxsloUL8pjFW0Z Kxdh8blKMckmdB94KY3vK7zCNqZ/UqbIZX23O/PJe8nwg2pokY9OLYJvukUY4QlOU+sE6csyv8N It50de/9i3Ty3N+5a9puHFEW/BAOa5rgfCJ1B+GyWrSeEqK5VTKL/JaS+ZgAqgtR5S5+uI/pjPw == X-Gm-Gg: AYBFou3uOVYaeJeckzpkxqA2wsojZgGifpeUJ5wVuqd5qKat0taxwJqlFEkQ5hQOxDz V98TxtHoQO/nauG+2OBURSPltRybKHOO+fkuO5xETwBleHnBOwVTTGbpP2ZP1vy7JBASxE4ossE zXiJRtbz4rAFucFmg28jN6jzZRA7mkdZdq9cE+Kp1hR9Z/X2Zjwe+xccoix8r6siAVOEUxip7pJ igMlhGtLn8s9z7ZONUv5iMovajBZLI8b1lrs+GW/1tvNGf895QiU3PmU7G7Mnf9Iv40tVF9ZNxX 1bB7qky7z5UFlDZBgvoF6Gq2oIis5yoxLqDUUiPHqNrLBMlrGBfgf9+IQRLzXTqYz10/xAe2Ecb 6M/8WQumV+JUrIGCGuIDSe6sQX4b4/c609MEQ0XET87vOLJW6nErZdy6woCxJOS4YMNVfXz9L2Y HrJyqS+3puMYFszkvNTkUzsQ== X-Received: by 2002:a17:902:ce82:b0:2d9:2ff6:2497 with SMTP id d9443c01a7336-2db12599b07mr340310315ad.13.1788813219951; Mon, 07 Sep 2026 13:33:39 -0700 (PDT) X-Received: by 2002:a17:902:ce82:b0:2d9:2ff6:2497 with SMTP id d9443c01a7336-2db12599b07mr340309845ad.13.1788813219492; Mon, 07 Sep 2026 13:33:39 -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-3339af25062sm47841297eec.16.2026.09.07.13.33.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 13:33:38 -0700 (PDT) From: Pooventhiran G Date: Tue, 08 Sep 2026 01:59:16 +0530 Subject: [PATCH wireless-next 07/18] 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: <20260908-smd-v1-7-65ad4ab30fbd@oss.qualcomm.com> References: <20260908-smd-v1-0-65ad4ab30fbd@oss.qualcomm.com> In-Reply-To: <20260908-smd-v1-0-65ad4ab30fbd@oss.qualcomm.com> To: "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Johannes Berg Cc: linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-wireless@vger.kernel.org, Pooventhiran G X-Mailer: b4 0.14.3 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA3MDIyNiBTYWx0ZWRfXxW5Py3NTVF75 gSFqS5L/6gIo6nZS+GjMkZd2UZqkFsx6Ou+b1bqXSqTgZgOXTg3o/x4LKZebz4JjLCDbMDdC4q7 7E+fy7U9ZGi+bOVhlVBnbk73iUCRdTpsGE+GQ06i8m7+zwVhnltfpT8CSMz7ICYJYJONZC7hCEA QXzh8gC49h1KbLO7yWJAeOiB04EG3tRHMbRUQHsVjceh3o8W0toHrEKhEeHYBPNAyRF5U00teFH XkFtU7ilwH9tNLtfu9e93xmUrsu7xvkQ+fs+CXzZYNJW13HKbkUYFReyX5//eJ5NnSnG5arsilT S6E58xjZaNeBUH3QHC6AF13dM/vT3JE0/wmH1yrDUtqQuTr8b/hE4hDov05OwGNFvZDEfFad/uT X6c4V+2MfCL4q7casnIpCNk9Yh+fHS1pBUgWDAB93qpnPYKTYCzUGA3+0RgvUrvdADJdO/Nt1GZ R/iqUYwF/Gcu+pSVPyg== X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA3MDIyNiBTYWx0ZWRfX4QhUFMRFlf55 UJ4X4XuwZw/4eO+t8id3wKyg+0b2bZY0/+sZhgiRMqHmsRI9bdjs9VDx96yqQXth0vsyCaf2JKJ b46uhH8ORyhgbmtWUr5L7UjsfkMHeoo= X-Proofpoint-ORIG-GUID: ttz-3ZYs24w2XJzEXl8mkhnhyKtQTeqN X-Authority-Analysis: v=2.4 cv=U6aiy+ru c=1 sm=1 tr=0 ts=6a9f1fa5 cx=c_pps a=IZJwPbhc+fLeJZngyXXI0A==: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=olGzuFvk815fMYXliRYA:9 a=QEXdDO2ut3YA:10 a=uG9DUKGECoFWVXl0Dc02:22 X-Proofpoint-GUID: ttz-3ZYs24w2XJzEXl8mkhnhyKtQTeqN 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-07_05,2026-09-07_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 adultscore=0 impostorscore=0 phishscore=0 clxscore=1015 lowpriorityscore=0 malwarescore=0 priorityscore=1501 spamscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609070226 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: NL80211_STA_FLAG_SMD_PREP_TARGET -- State 4a: target AP MLD prepared; Class 3 frames blocked except ST execution request/response. NL80211_STA_FLAG_SMD_EXEC_CURRENT -- State 4b: ST execution active on current AP MLD; UL Class 3 data blocked. NL80211_STA_FLAG_SMD_DL_DRAIN -- State 4c: DL draining period; only control frames and UHR Reconfiguration Notify permitted on current AP MLD. Add three internal station flags to track the 802.11bn SMD BSS Transition sub-states (4a/4b/4c) in mac80211: WLAN_STA_SMD_PREP_TARGET - State 4a WLAN_STA_SMD_EXEC_CURRENT - State 4b WLAN_STA_SMD_DL_DRAIN - State 4c These are transient sub-states of WLAN_STA_AUTHORIZED with the SMD-ME. The station remains authenticated, associated, and RSNA-established throughout; only the frame-filtering rules change. 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 | 10 ++++++++ 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, 95 insertions(+), 4 deletions(-) diff --git a/include/uapi/linux/nl80211.h b/include/uapi/linux/nl80211.h index 5e474fda2a49..65c7eefe9db5 100644 --- a/include/uapi/linux/nl80211.h +++ b/include/uapi/linux/nl80211.h @@ -3965,6 +3965,13 @@ 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). Class 3 frames blocked except ST execution req/resp. + * @NL80211_STA_FLAG_SMD_EXEC_CURRENT: current AP MLD is executing SMD BSS + * Transition (State 4b). Uplink Class 3 data blocked after exec-req Tx. + * @NL80211_STA_FLAG_SMD_DL_DRAIN: current AP MLD is in DL draining period + * (State 4c). Both directions restricted; only control and UHR Reconf + * Notify frames are permitted. * @NL80211_STA_FLAG_MAX: highest station flag number currently defined * @__NL80211_STA_FLAG_AFTER_LAST: internal use */ @@ -3979,6 +3986,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 7577eb31ff65..282d3c82dce8 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c @@ -7707,6 +7707,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, @@ -7773,7 +7776,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) | @@ -8920,7 +8927,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: @@ -9015,7 +9022,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 */ @@ -9702,7 +9712,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 Fri Sep 25 23:09:24 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 B20063A48C8 for ; Mon, 7 Sep 2026 20:33:45 +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=1788813228; cv=none; b=dL7BUDSQjQ09s2tbXWZsSqxmGE++CozIoLrne7bz7h8dz6kl0zBVamiY0szNf13oGbCyyp08ZUIwdRgxlylZ9/EO9kngMN0Vlm8xj1ezx0r5VYDXeEJiDyouoQ3p5HtQQPfZsl/sd6LeGJHHgoccdlXszENLrrdl3xywrp250mU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788813228; c=relaxed/simple; bh=0W1QH4oNYlUdeirmNfFD+jmPU+kApot3zeq7C9nGrDE=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=hgTQxIZQCK3wED4xoxyLMJA85Ft9gI9ArrDZgs46UqOzw2QlFA6h2xVxoQNHVoz9sb/xcazn7IgKgoh2gZRufgrekzDkaHVA9C6daHRwUKt9ruwW0MPmwDPbMwksMsStzxw0wEuhGBL5jlx83orlCCKpUazcT7lT+8Jhg9Cyd3Y= 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=NY01dkMU; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=aJIXhnBc; 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="NY01dkMU"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="aJIXhnBc" 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 687HWK7I564883 for ; Mon, 7 Sep 2026 20:33: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= afmJcrxX+TSrqMPN9T48TbSokMooP/JVAehCZMO0dOc=; b=NY01dkMUuSYhOXER ImJuqCMOr0uUYuAT3XfBpLEgLCvR69bW6FH/FiSJZRgWw3jtNBjcTqIwfI9Vtjfs 0gvYcoW5CU9mQyUZO+9UqgbP62Zr2QP8vE/nnEQb5AxtG42HuoLGgun2IOEnqsvR eAJwUjU3IdsgMfpmNS7OcDNOYvq4LmJFkCUjsyq66aSVxppcaqjZb6AuoU6cVXaI LRpNbJTUu/vRE7O3frZ9XlyFM2E+6Hmmzlb320IYoIIujC3dH9teTPgWtVmgzTSW YQ+wzLCJxQq+yflgzJU2NxZNiAaJzIZVTnHDJX5oD8x31PYneH8q3wNwLHYr9Me1 MIcuwQ== Received: from mail-pj1-f72.google.com (mail-pj1-f72.google.com [209.85.216.72]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4gj1rrgfts-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 07 Sep 2026 20:33:44 +0000 (GMT) Received: by mail-pj1-f72.google.com with SMTP id 98e67ed59e1d1-39b90cc0d5cso287265a91.0 for ; Mon, 07 Sep 2026 13:33:44 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1788813224; x=1789418024; 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=afmJcrxX+TSrqMPN9T48TbSokMooP/JVAehCZMO0dOc=; b=aJIXhnBc8bxbrCXNaBbYJ6eRdUj91WtI5sgSn+W+s4yShcxlTDGkJ16FJJFgmbZ2Rq xiX00TuQeKtMmiNdDr5Qo5k7zYaFiz92F2RmYlOHFPWWyntGOtPjiIZVoslvy6rRCRTX EyY6RXHf5yT7guulfd11+ZZ1KaBSFrcS1P/4POJ0U+WfX9vlubXZ06lQtnyq8jHPqBkz bZBNimf33kZP2Oe8gIOTxkYdm4lxsUHbIzVCjIqn8EvUqiFHaHOluA3xF+OuArsCUzZe 7zZIcrGLyEutQ6KKVFAGEr/OSjBU5uEvLooZuoXpQLkVwuj8VJOg47Z6/pqm5NnnQXkS lxNw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788813224; x=1789418024; 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=afmJcrxX+TSrqMPN9T48TbSokMooP/JVAehCZMO0dOc=; b=bU62+LTmxuvL/bxeFHpmxOC9AJf+fe5AbO4e2TqjGiOX1MIWSmIx9z1fcBzrQEgMx8 CAb5nB5T8sOqwIV5Hh+648NpbnjFqJA5GrOaJ5rksi+byH+rAOj7AdDC43PAdmclnLJJ nXQlDgfjNz5oKL0N2E81EEQK6mkJ/vFpGPGX2QlIOiIhxpM6KFqV97hVuu5HFSAYtz0+ 9Jc/5nMaFzZSGJMlAc3+k4W5bZTueg+Epor67PrJudROe4oWaV3X64owdm2eGpff6Ah4 fKZ8mCLbno62KbR+BRkizltqbg4zDywHr4G9YyvMW374z3v3J3DiSiUOSrnwLDe277QK BHKg== X-Gm-Message-State: AFuF++nYH1RDpj2eniVq27OT3RL4TaH7hESVGygVpBPmaZLlj/Uj1wzT x34SV+rJYQ1oZ0QwuUhrGzX/+6CoF0VsFPFOOBjO2ZWHG7dDJD/2GQFRhP8skrNYNcTUm/5c1RK /+NINePi4gcjc848ODNzDFZm3ZHjwUR5qPzv+wXY7Eg15aYmJAy6JDkeApY4c2k9AkQ== X-Gm-Gg: AYBFou36YuFEQjl6V82pi7Qk1fHye4ECfsuiWciiLHg80SKwUFb9QICLSyt/0qpZb9q w69qI+pjgU2c0Oq+b+mIUHCwhY/iywfMuuWQENwVsLoJRC6ugdVNM0CGNMqZAVYoDIMPqFYh66F +GJJQeqN2nQ6WrPgjDD21tRuhXkKGakiEcWnATGfFBmq9Y7OJ0xzY4te3MQKwjpc8FhDD0c0dPp 5ci24+tJho2PfqghrBabeAyfkjsmu97PC8C7F1Ya8RMPdN2a8IzALDdaDsXO9zZ1KkFSw3Bt3Z3 qH1UMpEyXqDTG9vLYigKJCm3YVhC0QyJigXM66PNnwx1pXX8Ti6JqVlruEJJNFf4FyYbhSRkCoL NysVIO6NX4YMIpDh6fFnnrjzDocyH2s9wp5t75HNMlV6kpKyS6iaHCnQpri9hC8ptsGJkXz6WcO 2BQfDNRSkgCx/uX55ZChGYEA== X-Received: by 2002:a17:90b:2f87:b0:38e:250b:122f with SMTP id 98e67ed59e1d1-39b261e75femr37290940a91.16.1788813224002; Mon, 07 Sep 2026 13:33:44 -0700 (PDT) X-Received: by 2002:a17:90b:2f87:b0:38e:250b:122f with SMTP id 98e67ed59e1d1-39b261e75femr37290895a91.16.1788813223395; Mon, 07 Sep 2026 13:33: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-3339af25062sm47841297eec.16.2026.09.07.13.33.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 13:33:42 -0700 (PDT) From: Pooventhiran G Date: Tue, 08 Sep 2026 01:59:17 +0530 Subject: [PATCH wireless-next 08/18] 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: <20260908-smd-v1-8-65ad4ab30fbd@oss.qualcomm.com> References: <20260908-smd-v1-0-65ad4ab30fbd@oss.qualcomm.com> In-Reply-To: <20260908-smd-v1-0-65ad4ab30fbd@oss.qualcomm.com> To: "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Johannes Berg Cc: linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-wireless@vger.kernel.org, Pooventhiran G X-Mailer: b4 0.14.3 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA3MDIyNiBTYWx0ZWRfXzc28pBfCqPqO qrMbZSbi+xoG1eo9DnMaXtjA57fl+0SElU6wrTNzLKSdfdumHYw28GJ0gVpVX5IOr7RwQICPfE6 qTr2UzXBGsxbl/S1p9/tMAyQdFkzrSI= X-Proofpoint-GUID: -_w61rYJW1W8T1ElV0VcWSoBmC7OkF4Y X-Authority-Analysis: v=2.4 cv=NsjhtcdJ c=1 sm=1 tr=0 ts=6a9f1fa8 cx=c_pps a=RP+M6JBNLl+fLTcSJhASfg==: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=uScroKfZLg1nAwDi7sIA:9 a=QEXdDO2ut3YA:10 a=O8hF6Hzn-FEA:10 a=iS9zxrgQBfv6-_F4QbHw:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA3MDIyNiBTYWx0ZWRfX7jaflDyqCil8 HqcgE2QP3khGVO9hxtl6S2xeAC7O1eE8+V9VMVo89pwelRH+ihEhVr4+KpOdvK4huQNQ7sc56pe H5zHLQsX5eO9DHgFHLEzwNSTKl7ySEpeFcMWkd3HO/KR4IXoJwQ86LRbZtlIOxR5mM//2lNu9he PMdzQKISDyxgH6CcIcbZqKM4vmEWnhgll0dGAqX6+Vy/yzWikP0HuHJe2MUhhZfSIub1c18CHSP K9jXvb8yxdfgKLhTGNBDnyh1ytV+OnbVEzH+LYc7dZ8OuRbAMJOxHnKZeufbmFExEqklj/gHplZ AfhufBwvLRTRlhxf5zoeY07gXx3Hu8y/HNe8PzhQSkKslk/kp0mRAWh7s3XZEb03iVqAAMQ4I1F 7ZBUrwERUDuaacmcrPutbMBkds95uOXfxdH6LofMIrtmXkILynWZdU70zwioIlsqpwZmyLaPISY OuJ66dayIgQsoUdaMag== X-Proofpoint-ORIG-GUID: -_w61rYJW1W8T1ElV0VcWSoBmC7OkF4Y 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-07_05,2026-09-07_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 lowpriorityscore=0 phishscore=0 suspectscore=0 clxscore=1015 priorityscore=1501 spamscore=0 adultscore=0 bulkscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609070226 During SMD BSS Transition, a non-AP MLD cycles through sub-states 4a, 4b, and 4c that impose different frame-filtering rules on the AP MLD. mac80211 tracks these sub-states in STA flags but has no mechanism to propagate the transitions to the driver, so hardware-level queue gating and frame-filtering cannot follow the SMD state machine. 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 d8f5e5d8a021..9b5fa6d6281b 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h @@ -4077,6 +4077,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 * @@ -4743,6 +4761,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, @@ -5144,6 +5165,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 Fri Sep 25 23:09:24 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 12DFA526AA9 for ; Mon, 7 Sep 2026 20:33:50 +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=1788813231; cv=none; b=HsPJg8ZXb7XBu4+nOBSDEU4inA52ZuqEvyI3cVJjTnu8rwSQPO8s9OzI/1yOQfbI6uMBOE/1nddTCfCYT8X/+v9B1x0216DkIkT/vt2yL+aylndmdScJte6Z0S+SQAuNXvJwFfg5/yenldPdXUHn19oX3lH9wmoKO9/sIDal8SI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788813231; c=relaxed/simple; bh=86w9hu+WJ1z3hy9Or+mlRGtKjgaxVht0KJsSe0k3fEg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=G/wQewBxYP+o5F90753XJgJeuvbXPfr2dXwvutI2snt/xaJbzM4/rNRiktO9YJA0Xo+KTepdebNxubJBOhjgbhkb5dn9FDr1PPDJMHWYHKdzjlrPfcww5GJX/88D2IJ8rYyCDI7GxuFN9XWZOXCgJoXtHnz+9O/nNCzWrYwEuwM= 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=RAVSusNU; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=ihQU8Mzt; 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="RAVSusNU"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="ihQU8Mzt" 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 687H85s1838247 for ; Mon, 7 Sep 2026 20:33:49 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= gofo4g5PMnVYPHJH99bL1SwGrtDr+P/qsI5BTGGqohw=; b=RAVSusNUGqWXGM24 HXFfHQS0H6iLEF2X3JaSi5NtkAfaOD/wCk32AQbYBtjiqEShavXWh/YEjt9oJ/4M 55a8JsB1m5mJsCB9l3G3GjctySL9GZ+JckPHVOFEG7XnqpVxD4EMR2zNu5m3lMeE CQ83XH89MZuXpY7G/ZjKrrDLC9BM3k+0PWyz21WSVUJgx4NZxCkcN39rqE1y97hK dIxKv7xGU2HVnrWi2b0+knt7OTlqX5j2gCFS9B1hIbCr9oGWufb6B+SzoRZfrq3l PrQLe6ySXkdHhZ1RNaDaaRcYapqMX4tpOcS3vgla0AvhcbciX3rJFWSXWhoe1rDU E3u1bw== Received: from mail-pj1-f71.google.com (mail-pj1-f71.google.com [209.85.216.71]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4ghssg2j26-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 07 Sep 2026 20:33:48 +0000 (GMT) Received: by mail-pj1-f71.google.com with SMTP id 98e67ed59e1d1-385d2703b64so4864362a91.1 for ; Mon, 07 Sep 2026 13:33:48 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1788813228; x=1789418028; 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=gofo4g5PMnVYPHJH99bL1SwGrtDr+P/qsI5BTGGqohw=; b=ihQU8MztNpQ5CWHSj9SaMdxQCZIBVBdOBkwnTVqaw+DK4Cyge3kAFsjPQjFObhNJnH sCdKWPXELq6EJtjHFcM6M+CSuDO3Soy2LLsOPy7UD1ZbvvFm5lzAaU4L8FJhiB1qDPK5 CrQveQX3Ml0NzR1KIWSQTqISloRHRiKgntxXrr9AYvkCNm0J1mvvYY+WtLbJG2vbWY4L ZuJi+YI06HlpC6qbJYfOu9+rk4UuVhJte7PDL31IPkaM0mCfVm88F52CmFPsw422Decr Pb5iX800ql/5rfQj0tnTPuCNdTDkcqWdnHgnDZFGHWP85fyCNzUVw5Iy46WqF8QoxWgw qwlg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788813228; x=1789418028; 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=gofo4g5PMnVYPHJH99bL1SwGrtDr+P/qsI5BTGGqohw=; b=SCQPXlmsDh2GlyvFQ5tXgFkFSgg7Jnn58czYYTwemP3awof3LPnTZfESxMlQIPAeBH qbODA9GpEDMui0GTjeCtG0nwAGdm5mk7HrKX0fyGRjfkBVPU+T27nNObuTa3BH/Cv39s tiXDgOT+dy+5U2VAKaEESOf89M2dKybzHrdcv/Edq0Asr94MVgMo7Q8lOE4T0n3d6Fxr MkLxq94qps+e+exSJl7rehpmS+HAwK7xSfqn4pYge2V20DiqEALWRQYYYwO4mln3eaUR BqdKQoaCSXTxBWY1DPzzALqo4/3TGoyXL11M3QNA2h+cQU+EK0XSMXwgy/SDl2z7D7Ja EgAw== X-Gm-Message-State: AFuF++nNqs9Ff333xgEOAVIHhZ5gH7DnvZrPR42DD+qi9W2+z2YdqRwX ZzX9X9Kh8vlKm7pef6vK+IqG58b6A3K+lOLiyaALjDc2GqnCNa1v4HQG5MQCZHbvPU+9RPsfXxd JHjjJvqfskq12FVCAkdOB3qT0qUxyq8htSItdNCiWbQn0rk8gmnBR2WVzRGaHP9OJAQ== X-Gm-Gg: AYBFou2nWdpQ8ApkOb6gJ7BekDsLC4X+x8EfLowNZoz5OhiuJnA5g2zEHcQKQ7dnpld X/H8bmXdL9EJUbG4vig+/xXTBVODz8eNXZRRjClZlybA5HRHgQ7ztV85NKeohrxYxwbJL/32b+r C2NiU3X+UiS7UQsy4pfRJPDTCgPTKPZa0RUjDOznw+hOe+pZld0q60hMWAGiuHGjkZAUYzXNp+l laO9qj3RWEewcKZb+6LwEyYaQL+GrMoxOXARyMVGE2tGxt8RhK7r08o/BDO7QLqMH1UGTuxORMb Uq0QGGW93KJwEfYqdSpAC7DiftLAD93pmaZ7SbX2CR//kl1FztAb8QiSHdP9Us6ZhYUTVt35wn8 KUAvHsX6LED/OUXekczf0boKSO/FgSaE5Hd4CA6t6z7173qtJK5oB56Db/XRptnhUw/77VwGDFd NVvrL1ugrdVRnNcIhM1Ax3gQ== X-Received: by 2002:a17:90a:f945:b0:395:8124:ac53 with SMTP id 98e67ed59e1d1-39b8bd31191mr2581274a91.6.1788813227998; Mon, 07 Sep 2026 13:33:47 -0700 (PDT) X-Received: by 2002:a17:90a:f945:b0:395:8124:ac53 with SMTP id 98e67ed59e1d1-39b8bd31191mr2581239a91.6.1788813227557; Mon, 07 Sep 2026 13:33:47 -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-3339af25062sm47841297eec.16.2026.09.07.13.33.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 13:33:46 -0700 (PDT) From: Pooventhiran G Date: Tue, 08 Sep 2026 01:59:18 +0530 Subject: [PATCH wireless-next 09/18] 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: <20260908-smd-v1-9-65ad4ab30fbd@oss.qualcomm.com> References: <20260908-smd-v1-0-65ad4ab30fbd@oss.qualcomm.com> In-Reply-To: <20260908-smd-v1-0-65ad4ab30fbd@oss.qualcomm.com> To: "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Johannes Berg Cc: linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-wireless@vger.kernel.org, Pooventhiran G X-Mailer: b4 0.14.3 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA3MDIyNiBTYWx0ZWRfX6Oo4bNfu59jD F4kv+VwAKL+Lpx4oAoAwQ8TZcuxBQPjF70cQVMVR5GBXhdgrW/Ryom9cfhtahrb0Q4mWMu0jJrH jGv6atIBzGOdqH2cT6BdV6sv6I3y+GMV6NgRAb1s8Zsn11LoX/ySUS4sepgeAuiraKp5V6tVeKv TvcA727ylNx/91JVUxqA9JbPO1n/K2xurX4Lypi8bYI/LmetcA1LNeG/Ex7+ku3rajKiNK303b3 geYe/GZ7794v5Elrx/oyUtllfS4GX0xEK1ew7fvw6+JUBR3h1uOHJdwFF6zACDsMfXTwJH/Zzei tQeXStI2O9R2GcyjtUWC6gQHswVLnXvu3PrWfPGFD3GrE2gr1khwNHy9e09JDsNQ9wR2RPEx1LM Ot1KWn5NiPXy6ImY0my6FmmB/fNpE9RhzkyC7Q7Xhm0fKX11YbHMPS808nhl3bur8d2V8FkJXTA auD99PpUH0+eu1sSOPg== X-Authority-Analysis: v=2.4 cv=MrJiLWae c=1 sm=1 tr=0 ts=6a9f1fac cx=c_pps a=UNFcQwm+pnOIJct1K4W+Mw==: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=poGJry9enlaRV4ryzAsA:9 a=QEXdDO2ut3YA:10 a=uKXjsCUrEbL0IQVhDsJ9:22 X-Proofpoint-ORIG-GUID: UL2AetTouuvLhLjeIbAkDrrqDquPYKFj X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA3MDIyNiBTYWx0ZWRfXzEF3SKmPc+ni 38M6T/Bl1+FV8kSEB9bCPZ33xOAcmVf7bQiDwgT48++AVOUJ/hjleR8H5M3Tt5qnd9pbf6qCc5s nZJaN8D/ZYCvnGI3gLip2qsmqGw/yeo= X-Proofpoint-GUID: UL2AetTouuvLhLjeIbAkDrrqDquPYKFj 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-07_05,2026-09-07_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 lowpriorityscore=0 malwarescore=0 phishscore=0 clxscore=1011 priorityscore=1501 impostorscore=0 suspectscore=0 adultscore=0 bulkscore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609070226 While sending AMPDU action hints to wireless drivers, mac80211 does not currently send the BlockAck policy extracted from ADDBA frames. Send the BlockAck policy as well so that drivers have complete information about the negotiation. Policy 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 9b5fa6d6281b..32b9b7cd1685 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h @@ -3964,6 +3964,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 * @@ -3976,6 +3989,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 @@ -3987,6 +4001,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 Fri Sep 25 23:09:24 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 5CC463C279B for ; Mon, 7 Sep 2026 20:33:53 +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=1788813235; cv=none; b=n+3NY0V8arvixIJXTPO2mfRWI/81s5U+eustZ7O50MRnrEocAwY2AsP8v8xQGyUljEn+XOlzRc1rQcJY323TQ/zRlBeAzdJGm3cuG5Ad/mVDfZ5vwtVGU/Za86LK++jCkb67I03UxPnCfoBkzL/mt/zq91kD7lFmleVWOrZAYrg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788813235; c=relaxed/simple; bh=3BIpCqgDAnBGrfpL4IV/b7aNMrM2UPJt17dMZbUsoWw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=jJKuxDlnLC82L07dfkQXyIVzzoSUV1407ER3goB2/Y+aqZf6ZNXvcjwP4V8t8hUzsgkroo1e3b0gUW4GbPYinYPz08rSi8rBctIw+SnOtc7AGDShsowm7nxvXip9HTHwSmtig5MkgQ1SGZc0AmDDqmSfacPWKdpmPyP0XcEbGZw= 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=LlrtBn7c; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=KM7AuC88; 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="LlrtBn7c"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="KM7AuC88" 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 687H7nX71642063 for ; Mon, 7 Sep 2026 20:33:52 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= pCsImhyIeDGFUN5AVZ441p15WIFo4hf5osqfn8vGVMw=; b=LlrtBn7crFH9fRya +Tz8nCXmaT3mT3zrlwdfQea6bUmqNeO6gAhMt8StV0VlDY8FFQAPrZcIypg3XXFN uAXxln9FXmFPvMd9cHrIYPRtUa+ibLoagUN29PJt84BSWt6Nx1hXarkULNucziDv +zyruQb6FfRxxYh6UtM6g9s+BReQnt1OhUnx3CehvjCNr5U360068VUanAzY/U+J pDtBVvWc37dt4Ytd/o5Evz6Q1NQZ55jMTdkXswacSvS8WRi9F9kbKUeNyL7PjKgL RfIJf/V6Sh2ujv6xVjnvcPDLeD22RfDRKF6TyWo0ctSX9QAzvo8Ae4YwI+NuVwN8 xPBkYA== Received: from mail-pg1-f200.google.com (mail-pg1-f200.google.com [209.85.215.200]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4ghruaaxe3-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 07 Sep 2026 20:33:52 +0000 (GMT) Received: by mail-pg1-f200.google.com with SMTP id 41be03b00d2f7-cc11b5dd54dso7217222a12.3 for ; Mon, 07 Sep 2026 13:33:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1788813232; x=1789418032; 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=pCsImhyIeDGFUN5AVZ441p15WIFo4hf5osqfn8vGVMw=; b=KM7AuC88U0JzmfFkcOrqZR4xZUJx9qzxEGOdd5to6wJ49PlGuoi3xoLdvwz1VXaL1A aCES257UgbEa5QR8jaxnd8bYh6IIyCM8nTQ2EnuY7aN6YNqOZ8qd1kmkYFbe5acWQYyW HdT2oKmTw81hh0d5o5Ng2TUKgfErQCi8GB1pHdN5zAvR60PaGyZVvXIpAsu9bHNM6daA Hzj6YftX5BPmaemBaJeS7pHxFs9bqSUrpVJArgRXKxJ9NSVoIK9GEMdDCYuwiEsNBuHg HtJ21R+mWWtOL4+gR967P94GvPZQhRlow3qg1ViWDbMuabQ1X+v8PjfBCRVAfX09ODQz pZUQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788813232; x=1789418032; 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=pCsImhyIeDGFUN5AVZ441p15WIFo4hf5osqfn8vGVMw=; b=qXoDlldrCcSbuOanZrdMGO8AN7yJxlqSt8EyHYZxeFE0NK8p3hu9YllLpAFzhu4Ehs ksXVdTQ6R3KLbXpfNZUeN6j6pyISnQW2xFxu9rfKZmZen6GBitk1oz/T1lDFsDkbPunh cpfWPcWUGHGa5B+3MH0ZfwdViJljjhi22RTcml+3sbikKSHD5J7lKvWKi0hnsoI91Ot+ wUPdiS1jaNxxZZUbqtYZsM2mmvmAk3ofp/NAhydT7oONrPseN1v2aR/6yLe0YtTpJybo YWGRh8NydPKp/tYylUtJmFvCnQYN24LmN7cwq7kwt92UIJutUeM2kTSAht7MEgLB7Bjb ZqZQ== X-Gm-Message-State: AFuF++mwV0DJqg9CUBRbRuTbS+TZ1KnQy7ySaV7Udf0xhiCueBKHr2r0 hzP9LRS7Nl4rR3WgGZ2AeQ3LABgP28jl8PJEk1aHwx2J6JTugjdzGtwPTYBDNEWHWgZzuA0Emhd 9u3/VeiVB6HDrocVsHimH9975hu34GFPbSrFkqnCfZXsF0+PZJM7XE5BE+8UqgNa0SA== X-Gm-Gg: AYBFou3DBLDm8ZWHTPRbqt9oMu5HtldzFSPDW5b8zxZzIoTLWFKx7djkdCnR2zuONWn AKq8Gic17yGcBjVFb3xsb+dYHnfcIt7VR3CYxBVAzI59nKwyb9RAfVIStV8NsWUbFdpKosRr2qj pHwQ2LhgVfsWLKGBNo73DY9/YLbZlK3aFDQAGJWSI+BKHF4BzWQITkFsX2ChxgKgAZdzcF6v37f NQl8ZToe5UlsmRj3l/t/GLo87Mv0dScEM/KFehnwjFLUBEYikQpM28/Z6ijpAS3vzfNCQyPXdqm RoPXXYYrrtDgbC2N8eWq+cBD0YVNM4ox2yv5lfYLKajjZTPYSYkT8skI2lx+iWiOEuSWBMmXCw3 5sAd1iTvBbE8YPD7kQfxy4DjIuoqYTammWKDgB0jTvkuowoYyMS4sY4Ub3a/ZxlXFO1CSw0fdN1 bprr6U/9ZVQXuHcncTUw/1XQ== X-Received: by 2002:a05:6a20:43a3:b0:3d3:afeb:880 with SMTP id adf61e73a8af0-3da3a223f79mr38439438637.28.1788813231898; Mon, 07 Sep 2026 13:33:51 -0700 (PDT) X-Received: by 2002:a05:6a20:43a3:b0:3d3:afeb:880 with SMTP id adf61e73a8af0-3da3a223f79mr38439400637.28.1788813231454; Mon, 07 Sep 2026 13:33:51 -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-3339af25062sm47841297eec.16.2026.09.07.13.33.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 13:33:51 -0700 (PDT) From: Pooventhiran G Date: Tue, 08 Sep 2026 01:59:19 +0530 Subject: [PATCH wireless-next 10/18] wifi: mac80211: Define SMD BSS Transition context for transport 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: <20260908-smd-v1-10-65ad4ab30fbd@oss.qualcomm.com> References: <20260908-smd-v1-0-65ad4ab30fbd@oss.qualcomm.com> In-Reply-To: <20260908-smd-v1-0-65ad4ab30fbd@oss.qualcomm.com> To: "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Johannes Berg Cc: linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-wireless@vger.kernel.org, Pooventhiran G X-Mailer: b4 0.14.3 X-Proofpoint-ORIG-GUID: 1yjfj642gsC-XdncE_Ch_4j40wYuzRTT X-Authority-Analysis: v=2.4 cv=U+aiy+ru c=1 sm=1 tr=0 ts=6a9f1fb0 cx=c_pps a=oF/VQ+ItUULfLr/lQ2/icg==: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=J9-iD1ZZfo0dXw_rko0A:9 a=QEXdDO2ut3YA:10 a=3WC7DwWrALyhR5TkjVHa:22 X-Proofpoint-GUID: 1yjfj642gsC-XdncE_Ch_4j40wYuzRTT X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA3MDIyNiBTYWx0ZWRfX0C70kzFu/G1R KBT7DNylb4RixRL7Ap3QSkxztPPpq4PFwHhFSxXprRkhvC4a8Twj9VISJohNu+l/JsLpWpZ5YRy 2lhBnZTj9CI9+NDxVKohQaFjFTKIjYM= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA3MDIyNiBTYWx0ZWRfX1OvWhuvMUE8g EI8Ge4k+O4ZcKkPpfeDX4GA+KIjfj/HnLkP4jr0kiw8PNdknCMIkddH8kLnMNd7xtqELmPEzkJI csDikzbAgJlabM0x9av3VwvlPkRu6PxGBgC1Rmyy5yTY1ecaH5AtEI4vJ8Z1Z+fRfu0a3AimbdJ WS6MZjUYgwVC22UT58Uw6a6PtnN7UphSbUAhx6NMAT5LGGNSBmU+g7b+Mxs9O7BHCgFg7u5R0zg IvWdnmy8/sYWzMHt1HryNvjlHyDne1bWXeU+RqrtWqF2OILp0Ci9L0rfio8lLNXhQYBrti5BU76 yLZlnWytG5qDPBwm5gBvJK+NSasQvTclB+p1MoWLg3HUeyO5D3lkckaXPkp+43K7IlypB/yqz29 0ApJNF0x8bU8JkzvY5hn/nvkuMqdJO7F2IS7wf1tjAYMGcGkMPQ19tzKji6glisRctedFzLS4er PuLvKvdjm7pTnLl27Bw== 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-07_05,2026-09-07_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 suspectscore=0 priorityscore=1501 lowpriorityscore=0 clxscore=1015 impostorscore=0 adultscore=0 bulkscore=0 spamscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609070226 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 management frame using SKB extensions so that userspace receives the context along with the relevant frame. Define the context data - per-TID sequence numbers in downlink (DL) and uplink (UL) directions, packet number in DL, per-TID packet numbers in UL, and per-TID BlockAck session parameters in DL and UL, plus a variable-length driver context - to be used by the driver to attach the context to the frame SKB. Additionally, define a helper that attaches the SMD context to the SKB extension so that the initialization operations (container allocation, reference tracking, and context linking) are properly handled. Signed-off-by: Pooventhiran G --- include/linux/ieee80211-uhr.h | 86 +++++++++++++++++++++++++++++++++++++++= ++++ include/net/mac80211.h | 50 +++++++++++++++++++++++++ 2 files changed, 136 insertions(+) diff --git a/include/linux/ieee80211-uhr.h b/include/linux/ieee80211-uhr.h index c3f87d4c8bec..f904b1e65f10 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 the 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) { diff --git a/include/net/mac80211.h b/include/net/mac80211.h index 32b9b7cd1685..b4b1d3db9b19 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -8246,4 +8247,53 @@ 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_skb_ext_add_uhr - attach or replace a UHR SMD context on + * SKB_EXT_WIRELESS + * @skb: the SKB to attach the extension to + * @ctx: the SMD context; must be a kmalloc-ed buffer by the caller + * + * Allocates a &struct wireless_skb_ext_smd_ctx container, sets @ctx to it= with + * @refcnt initialized to 1, and attaches it to @skb on SKB_EXT_WIRELESS. + * If SKB_EXT_WIRELESS is already active, the existing @container is relea= sed + * before the new one is attached. + * + * Ownership of @ctx transfers to @container on success - the core will + * kfree() both when the last reference is released. + * Upon error, @ctx ownership is not transferred from the caller; old @con= tainer + * may get freed. + * + * Drivers must use this helper to attach SKB_EXT_WIRELESS extension to + * properly handle clone and COW copies. + * + * Returns 0 on success; -ENOMEM on allocation failure. + */ +static inline int ieee80211_skb_ext_add_uhr(struct sk_buff *skb, + struct ieee80211_smd_ctx *ctx) +{ + struct wireless_skb_ext_smd_ctx *container; + struct wireless_skb_ext *ext; + + container =3D kzalloc_obj(*container, GFP_ATOMIC); + if (!container) + return -ENOMEM; + + refcount_set(&container->refcnt, 1); + container->smd_ctx =3D ctx; + + skb_ext_del(skb, SKB_EXT_WIRELESS); + + ext =3D skb_ext_add(skb, SKB_EXT_WIRELESS); + if (!ext) { + kfree(container); + return -ENOMEM; + } + + ext->uhr_smd_ctx =3D container; + ext->type =3D WIRELESS_SKB_EXT_UHR_SMD; + + return 0; +} + #endif /* MAC80211_H */ --=20 2.34.1 From nobody Fri Sep 25 23:09:24 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 16AC8399CE9 for ; Mon, 7 Sep 2026 20:33:56 +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=1788813238; cv=none; b=nFBwDW3cjV0QHeW/wDaKo1OvRMphG5puUZ7pycX01pb0svTEUp3vn3O70RqFYiSSr0ob4YuFTzFmzAwaAZpFAK2incPwVokDidYkh77ddTeG/CUYizN+kHTNvf0I4Lq6x+KGThGsqwjvFdhC/Nxk3TwZfL7it/SZliV6i5XLDHI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788813238; c=relaxed/simple; bh=slxYMd9pIzQAMKVqHjrMfdvbnPLm31GqOFhQsu0FO7Y=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=TF3WNZA2ZprCCS6coffyF/kii3yqv1gY1BRt7CRpI4uxvTLsryDicAG7ovidg1wNHiDUl8tPtA2V77v5LpOKZx5AUyUcXiYGru57bLrFlpqcpW3fflJ8gtNvkVsaGWTBr6xZm0mU4uVSYDvcirvUbehkifw/mVeZJj3GNOEKxqw= 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=CBxFsh19; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=AU0b1aXX; 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="CBxFsh19"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="AU0b1aXX" 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 687H7jHr1642056 for ; Mon, 7 Sep 2026 20:33:56 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= gYoBNxGLCxDZv4uAHMCNobIrbYmFXndZnMWIP9T37jE=; b=CBxFsh19AT4k+2gG A2A4/GcF7oPQGVdC7W3lsh/9k2PO2iwHkZUnds4FiZOnWGQ7gLqs3JwqAE5fJHWX BtxM3c6awmRbVNrnUXu8ieXFRQqncQDZ9aPL1DqJByNl0ve+c2Tvmn6A4Bz0vrXk CYPpsfQpDAN7LbCqLTUL6U7l+a28lZouMrXvTfrHo3pOnwp/YajuI2EjtjgYRgU5 dQ3p1ACMP0sRam1P0yOrgY7pEuVRDPyPgWlWvD2CMbrdsZZVljVMsxB8h7dpv5vt MXV83PTCsxtulGTTCDi9T0vQZPFz9/2P1jEscPe4NVyuOBI2xH/gc/MdGJYm6kNi HaXkQQ== Received: from mail-pg1-f197.google.com (mail-pg1-f197.google.com [209.85.215.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4ghruaaxed-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 07 Sep 2026 20:33:56 +0000 (GMT) Received: by mail-pg1-f197.google.com with SMTP id 41be03b00d2f7-cbb92868263so3164162a12.2 for ; Mon, 07 Sep 2026 13:33:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1788813236; x=1789418036; 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=gYoBNxGLCxDZv4uAHMCNobIrbYmFXndZnMWIP9T37jE=; b=AU0b1aXXKf+e/V8FXF9/Ci2j7SCEmlBKdYtvsTWsgr3NrgATgHcJ+g/xDd7giMWILc M11gzawDUaIAu424MXQQLQzCsho5SBEtyMPvxboOxRxoQk3kJQRUxlRzXIB6qvW3V+em YbHW+bayY9Gh56/GXzkun+qThMBRfXERMg8xWoAnopLJX2XsVATaOEMNfhigycN1JGYc s/g5r+sAZyeRYkFU1jDNqlVFO5rq3T3IbgiLqWMrVqIm63POqlxjnf8+ds1RJogZRPTB /d7W8Mm7+mx5QuvySLIFT9UXqGecNBCY3p4awXSF46fGt50hLfEF//niwC551z/bfRgN pCkQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788813236; x=1789418036; 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=gYoBNxGLCxDZv4uAHMCNobIrbYmFXndZnMWIP9T37jE=; b=p7SXZGNiEOLjLlXWRoqsb1MB1PClY/W/egxoDU6YPbq9i4/qEWYUreMPrsnMGlVzTP NqcdLEqhUJdEFmBTKetq8fDK7f9tOouxvkQ2qpuLYKGxebkDC9bTNb+IrsZGSFCkFe5E DVWdUWKD/ws3cq2XAFsrwEYLTBN631Mr5d7jfa4bemrbmNUCS6eRfHg3wEy1ZYQOF23D 5e75yDFVCDAGmmZCEp/VWFTf3TLcPH0wxI8fmv4dHx83YBhMUZgapujNwULneCneAO71 Pgfk3ZJi5sXrSAXVJQsWb7vTVZs6dYGHYjmsm6VoulmPLVdmTn94dF+r2hnSu8UvF7lP oOgQ== X-Gm-Message-State: AFuF++k7zM6wqyysK5h2Tvq+o+vvQ3sZMUpiKIQLfU3adAOCZuRkXqXq CE0gWlBr1Z1dl2Xo0fFBKOG1t1Ik+gM/rT8ulzggTL4YabDbfB+AQFbJyl9zmy11WK6JLLwmZpZ mKOxJX3eyuJ12/nEB+ze77zKJZSdBNNUxjmnBj0jfdLlQwKmrV0edLo0Fr7EZ2FRRpQ== X-Gm-Gg: AYBFou0MiEjHiAkerBR3UY+AT6Q00iTsV1b0OBKfiFv5smepBr8Z8HaDwhBAVeGpM5y hyWkjoqr0GEbIOBeBZ2j9Gm3IISOJF9cH79xpQ8Ccsy0ntxiuBBLDFlByhFxVP67o7GEQoXV7ta kL19wV0NnDqiTSgp9Yz7fnp8ztshGyh9cbvpohs2dPFDjiyPauUK30g60+0Aly4KOduage0xDlE FZNecSlp/k9b2/hxb2LXTGSbWSDI4bcefArLB0/xN9BxSQnspFTIkM8KfkuaAY5JBssQ4wkiKP2 E90ruUKYKXWC3pmfglOJQG15zuGNsvzHc7zQoRS2a3qa4tiW6P0UyoYxyBGq6xer5gg8/83avKY xL+oMiGVqerUWVNf6vq1xC0XcleNHYmemAqWzJ4IGBlNi5cHLuFBBhawwqP1tY0Rw3bQEl3AZgI yYKDwFLo0dI2eJ/AD00li6jg== X-Received: by 2002:a05:6a20:4321:b0:3d3:b02a:61a5 with SMTP id adf61e73a8af0-3da3a217599mr37266731637.28.1788813235703; Mon, 07 Sep 2026 13:33:55 -0700 (PDT) X-Received: by 2002:a05:6a20:4321:b0:3d3:b02a:61a5 with SMTP id adf61e73a8af0-3da3a217599mr37266691637.28.1788813235300; Mon, 07 Sep 2026 13:33:55 -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-3339af25062sm47841297eec.16.2026.09.07.13.33.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 13:33:54 -0700 (PDT) From: Pooventhiran G Date: Tue, 08 Sep 2026 01:59:20 +0530 Subject: [PATCH wireless-next 11/18] wifi: mac80211: Enable skb extensions along with mac80211 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: <20260908-smd-v1-11-65ad4ab30fbd@oss.qualcomm.com> References: <20260908-smd-v1-0-65ad4ab30fbd@oss.qualcomm.com> In-Reply-To: <20260908-smd-v1-0-65ad4ab30fbd@oss.qualcomm.com> To: "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Johannes Berg Cc: linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-wireless@vger.kernel.org, Pooventhiran G X-Mailer: b4 0.14.3 X-Proofpoint-ORIG-GUID: -F2sLdz6_yu5HkwF_pR6BSwEg3AEiOB1 X-Authority-Analysis: v=2.4 cv=U+aiy+ru c=1 sm=1 tr=0 ts=6a9f1fb4 cx=c_pps a=rz3CxIlbcmazkYymdCej/Q==: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=iJey_kD_w1PlP-9owF4A:9 a=QEXdDO2ut3YA:10 a=bFCP_H2QrGi7Okbo017w:22 X-Proofpoint-GUID: -F2sLdz6_yu5HkwF_pR6BSwEg3AEiOB1 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA3MDIyNiBTYWx0ZWRfX8U5mrTDF0I+K AC/jO+w1e7kfhjSO7NWOA3wrEO6mOYtmQCsibkUeZ3vDWU3CA8ruv0CbkvyqC71AJ/yjxmM+Nil eZBhM7LQnj/HI8hN6P7oUaOks721q8c= X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA3MDIyNiBTYWx0ZWRfX5fN+Ki3D2087 GD5Y9uELNbpljXK0e71aUyf3lNHkQjrf2RMp2RiD5mbRXIbTyLC/UtmNS0jjRhmbQU5Jc6miHVF FjwuIqVEEVnfPlgEyYSvHs5TDG/TqmpX8Wq8PtiP5GsKJCXx/0m8Bok7uyZjnEoiwDZYXwksboN KO+f9vmkWsFclPt1rvOHi/lN8MW+reSqrzz07GpwUwEEaiCpdAeyWfWy3rL+487kf/fE1ksZSYV 1005uxy1WHOb9CwJd31BazPXydwvYVJKVhry1TJLcKatMl4m8QCnCnwhed5waHYCrpaAU/H0hji 7bZZhVQUdfms4ZuaoMriqXzHgkJNtC+G/+xtvyJnO3B2Z6cvf+GOAlSye4VcSdBYEc7IykkIU4a B1jz2osGN4r38OfOLWkYygiPuUNW2nz3Pzn7yWZoL1bxmw7FPdbVW+wPUHFGYBwgwP0aj1ZzJk6 h7zJK/BG6dug0ljvQdw== 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-07_05,2026-09-07_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 suspectscore=0 priorityscore=1501 lowpriorityscore=0 clxscore=1015 impostorscore=0 adultscore=0 bulkscore=0 spamscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609070226 When mac80211 module is selected in build configs, enable SKB_EXTENSIONS as a dependency since mac80211 has started using SKB extensions with SMD as its first user. Signed-off-by: Pooventhiran G --- net/mac80211/Kconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/net/mac80211/Kconfig b/net/mac80211/Kconfig index d6bc295e23a1..10d28985a1ce 100644 --- a/net/mac80211/Kconfig +++ b/net/mac80211/Kconfig @@ -9,6 +9,7 @@ config MAC80211 select CRYPTO_CCM select CRYPTO_GCM select CRC32 + select SKB_EXTENSIONS help This option enables the hardware independent IEEE 802.11 networking stack. --=20 2.34.1 From nobody Fri Sep 25 23:09:24 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 25D6351FCAF for ; Mon, 7 Sep 2026 20:34: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=1788813243; cv=none; b=gsyESTd+UKJdu6ZP6mTNDVM3P3nsUGh6RIEYenzAL/2IPQtNE7syq0+oiAUPd7d17su6EL3FDMyXPl1fP80vkX9XKoE384JsDBFU3jU0OZlaC5Z4T48g49flOpQL8VmLEA3N5nSQoVIPO0P4sIbebpe0TP0WWG1N1PqoOL+VPhs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788813243; c=relaxed/simple; bh=79ChjcWn9P3rnnuHKmMDzO/rpLHUhW4oLw8lkH+rZT0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=YELRC+Z/ii7fZP42wyI4NPZjWDdcN63ZqiV0l9f8xKakJ18ZBgX0iORCr/JpLenwYVLVNNArBFXdjBwL0x8kvFMnK/n3A5lHCnMuC6B3DQmyoKu6jF3eA2V0MkdXj5+AqHy1JWcGe9McqkNGaaUmX1bXrUWh51hwfjqJIOCwzvA= 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=Q7UsOwTa; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=H4VTkxY8; 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="Q7UsOwTa"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="H4VTkxY8" 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 687H7mfQ4015814 for ; Mon, 7 Sep 2026 20:34:00 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= OEZFudhXBWzoCl30tcULXwca6zIY1XEjQJyY0OKHCVQ=; b=Q7UsOwTaiUjpBfu6 hugVjE0Z7D0eOo4pcvIlWxxlFGyG08p5YOpbrhiAqjrqKZcW3VMYJl+jIcllnGOm 2tKoBlIQ23VyL1LahXCH2pEaJIkQiabaMgWymh+dyyapusUzwFxtYtbGCBAm52/T +Mu/amd6wswXHcnNd897B2lEn0olzoOeuOYG/x9FbMD1j2X7xljuiC7pUxwHtnx4 5C4D8VH8kCdftn4K0i+SmyuwV2nQGBlz1QORbIDOm4Mrs++rI/X6MA1DAxEj7BKV C7qY1y4CYGvGHk1b4JcAEVL8ernkRTLmaCp4OGlGu7ZRhlFmcb2cHKfS22cKe9P8 jQWqKw== Received: from mail-pg1-f198.google.com (mail-pg1-f198.google.com [209.85.215.198]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4ghsw22fw0-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 07 Sep 2026 20:34:00 +0000 (GMT) Received: by mail-pg1-f198.google.com with SMTP id 41be03b00d2f7-cc1cdfb337eso5557704a12.0 for ; Mon, 07 Sep 2026 13:34:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1788813240; x=1789418040; 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=OEZFudhXBWzoCl30tcULXwca6zIY1XEjQJyY0OKHCVQ=; b=H4VTkxY8mDaqV4fw2ANcQ2BuoaB91zvHMv5wzr9zWgH3YV2tzpza1y8pheXZFkcVLD kQi9cFJ9K8EyJjC/RMXPMp70E5pqMHId2sfKg1ClIw3IHFi+nlx6sLa/sHWDB9aHgxfR yeoiD9Kv1ZTkipx8f3FSVL9c0kUvJkwKFw04fZRbLNoleaaO7Rd6Wrb9qE5NEVaHWoy5 gP0cvytKOFwV8LLf/kSZ1QnIiA0rUSKhlOCQ+ZrapuETX4KwggYfpwfq+aXeIG2x6+wj ktze9gWuO9ArRhUYfjEK/lmqm9FG1rcQqwiQ3IHqVHkxL7hFr6k+U1OUlhbodZHx+/uf DIWw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788813240; x=1789418040; 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=OEZFudhXBWzoCl30tcULXwca6zIY1XEjQJyY0OKHCVQ=; b=YIg0X3oKyV6B4fmE1fp0Dy67rZh+o9BU+K8ydeOrU9txhl/2KfpJZox9/h/sAkSrGm 9s//N7TbXqKGv/ZMOHIOovvNn9ZZYx9d2agWnwDvpPaZNTBdnPiUQH2832rgfCQf9rl5 V2//iIoG7fdV1aSBM0/e/nvfMoHNBGqtVPCz1WIsDApGNwo09Z+sCSP6c4sx5qKcXHdz 5sYfjDJn64Tzjf1f+n2i3dneaCsfHtEkTS9bUBqaZBJDm+/ev4V110ETWRbY6oKGB8pg cqGm/FW1W8iOMdh0sF87KD9CDDPHUVCucoATOb8/JDfgVKHVdd5Syaf1oW+xrwu0tlIe l54Q== X-Gm-Message-State: AFuF++lUxrwl9pIwm206Jo3QGu3Vi6D0lOozq/I/014x52OuXgmxv41/ 2bhDuYN9zGBZiwrdduhCDLR3Q3NsixZg/RtvdW6kAFnjnbN+F/r6azolXmnjkwvZE4mXRER1YJL 6LY3MAoxnVgsp6v/ugnMenXGA1kpdNEg5XeDCDtMbXMhpT4+Q2se6Teb85GI9nRTQHw== X-Gm-Gg: AYBFou1eCvCDpa203PtCj3XxmgW0M8pgCjpGKanCj5rAmk2coaSQ/rJ9VHogugyQnT5 VHZ1pBgxQkad/UY1448WaiOhKftwHC+sbs1d05T07HppWZRrYRhPk7KN9G0IcXPSBCiTmqBVmVh 5ZH3NiZ6VJ6GRtvpCs9RaWjqoDZa4Y+strvmvZvpJEuF4s3XmQ4bFc5wUtvsbuNDK/foB2YnL3B oVS3qwqsER+ZLLIeCoNbZZlZscEOvLDLlY1M9Omm+u+9Z9KjikrVAhhqs7nHXevFoy5fdcj9ooW oewrn15TSxPhMcVO0kYnsDNt9HT3qp+Aua3sEaq/hVbvHZcApYG8rAkOrAN3s5VksaRtMDaCCdX kEdeV5yi0husyqFKL2atOSrUCId8khge2pH1J4oD+FyYWOOP5xniAGMT8DN6pIwPJQXC9rNJsKB QYWvInz2wFQ5yXaMbCgms/4Q== X-Received: by 2002:a05:6a20:a11a:b0:3d0:abdb:de03 with SMTP id adf61e73a8af0-3da39b57f72mr39627709637.2.1788813239751; Mon, 07 Sep 2026 13:33:59 -0700 (PDT) X-Received: by 2002:a05:6a20:a11a:b0:3d0:abdb:de03 with SMTP id adf61e73a8af0-3da39b57f72mr39627661637.2.1788813239278; Mon, 07 Sep 2026 13:33: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-3339af25062sm47841297eec.16.2026.09.07.13.33.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 13:33:58 -0700 (PDT) From: Pooventhiran G Date: Tue, 08 Sep 2026 01:59:21 +0530 Subject: [PATCH wireless-next 12/18] 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: <20260908-smd-v1-12-65ad4ab30fbd@oss.qualcomm.com> References: <20260908-smd-v1-0-65ad4ab30fbd@oss.qualcomm.com> In-Reply-To: <20260908-smd-v1-0-65ad4ab30fbd@oss.qualcomm.com> To: "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Johannes Berg Cc: linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-wireless@vger.kernel.org, Pooventhiran G X-Mailer: b4 0.14.3 X-Proofpoint-ORIG-GUID: kIyg3uKKhikvqkPTzoS9k2yjbk_kP_CS X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA3MDIyNiBTYWx0ZWRfX874PduV4xuCh X5aHyq06YHHPJeoZkpbm5nyxuPz37gmreFwQBVBTtvOm6uiClb3PTm51/YjD78UcMPLKGzlxsB6 Bqa5BWbfzag15ENFEp6/AL9UwwRYlTA= X-Authority-Analysis: v=2.4 cv=eKwjSnp1 c=1 sm=1 tr=0 ts=6a9f1fb8 cx=c_pps a=Qgeoaf8Lrialg5Z894R3/Q==: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=x9snwWr2DeNwDh03kgHS:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA3MDIyNiBTYWx0ZWRfX3M2yOwroCYlw x3ITeWnpFEFMpGD+UIAalh/PeqbryIsJdE6RyHOte2XW9+fMyYHAatjwEsn0I+sPB4tZg5kH12u FvVruTVkmQ3oc/ZyIBeTR2So/yjETBdRMM8AfWS+dHXI9w6I0ouiDMEl/nwMVQ1bGXTJWj7ShNL al1vN00tDw/ZYJuUeq4PxNheftsXmA/Y+mO4ut4X/9n4PMvLfSslRuq5d8F4RPVsl5p9ETgbXL7 izakg2hyYj0mkK1sDmbi0Hs0+Eo4yH1rJOx9vCIDWq1pWXgSrNL/TFFa018qS0S3HBHnSOfdRyk EQlPAXdK7vrVKfMl1xoJ/3v71XZYxyaO39chR0OEEepZvi/sXN6hf8zw+Kt9/Za3Fg7qGhBp18S oMAjJGrPM7UqNOOw6vdkmE708btMMpcD01EIbcSKxoHiEqiuhKZF36DKwro9UQZAIoUN85dJeiP mu1dg3kqI/cfVLfWqvA== X-Proofpoint-GUID: kIyg3uKKhikvqkPTzoS9k2yjbk_kP_CS 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-07_05,2026-09-07_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 lowpriorityscore=0 malwarescore=0 priorityscore=1501 suspectscore=0 clxscore=1015 adultscore=0 spamscore=0 phishscore=0 impostorscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609070226 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 65c7eefe9db5..f41266181bf1 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 */ @@ -3207,6 +3223,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 @@ -3815,6 +3838,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, @@ -9247,4 +9273,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 282d3c82dce8..d59f0eb40493 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, @@ -1118,6 +1159,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 Fri Sep 25 23:09:24 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 353F252B1D1 for ; Mon, 7 Sep 2026 20:34:06 +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=1788813248; cv=none; b=btEeu9jueKG2bdR2ovtkLGS3mEA5F7mVbbroJEIXIQSFAUNIvc48cEz5jB2a/g1/1+uNM78pgy63tBYu/pZfWMXkst37HYrRi3DN5XKeJfsxHNkkaAIxqXFnTgiSQ/DXDFpAXjdO5/tNVOZyB+cbV17m1QRaT/ipAqcdaabeM5M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788813248; c=relaxed/simple; bh=/xXrRGDv6Jszk0sj0UbOjDjGSuSuowHtjBK+vXW0/Zg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=GOrjtYoBZ2JDdcXDMDZRFvIw7BSndlwEvmCXD6EJZzkFF/EkKUc2SRqXfBdhnkzxs+mRFouYqwd65p8kVXvRo33xgmIVCAckrKe0fCOZDGeVmeKqm9q29p5dJfGJ/4Oa7mSt4hdGyEmn8EavxazDfPN3PVnJUBP2v6FfUkl9AVo= 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=hJ993Gm2; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=igJTnoSZ; 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="hJ993Gm2"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="igJTnoSZ" 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 687H7x5M415156 for ; Mon, 7 Sep 2026 20:34:05 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= 2FTgMhgLWmf0Jq8fB7caGXnFJscVEgzrr/HiqFpuFaU=; b=hJ993Gm2X6ceZs4H 00hEijX8UwEgxYue+TyOtJfLGAbC0JtJEBE/k3N6bKD9PeNyXmIW71TZ+VGzm7T2 o7Cgp7mPfuyIhd6t/7fBw2ZxZIAXr1sGUAQfLCOKcpnC9RJk2iwEQ7myUbPSv1rH slKI8X0sv8lt8UYlnjaT8QfYmBvXrx+1NdIm6yRF2NQNhD/rkSP+WmLv9OW5/xYL iV/yUJ+Zg3WsZcMGutuaUIKlaLfOnMzb0vYzvi66U6Ue6Fn6sPLS2sA0JtANEb11 iRwFz4RysWEMa1+6ropAllHIgLtwqR0XYVNxB09YtU/OTD0QCpu24EI8Yzez3Zof No5cng== Received: from mail-pl1-f197.google.com (mail-pl1-f197.google.com [209.85.214.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4ghsfyjktw-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 07 Sep 2026 20:34:04 +0000 (GMT) Received: by mail-pl1-f197.google.com with SMTP id d9443c01a7336-2cee1ec30f2so44549025ad.3 for ; Mon, 07 Sep 2026 13:34:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1788813244; x=1789418044; 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=2FTgMhgLWmf0Jq8fB7caGXnFJscVEgzrr/HiqFpuFaU=; b=igJTnoSZCIVE56FlA/lnNK+Vil3eU5Y3WPFWUMyy7+e7ei8QxA5N9IBbQX3gMK+Tjl yJB1slTZI+aEpvTA1GiZ1ahBZd/QGEl6gUG8lDdKEa6sImEaafqXESGrpCSkKWpt5LXJ whJLNYSKxV3G5ygrzXkKItYB8X91CaIxLc8sfGyPvMS3o+DMrM6BxkBiIv0AvYVT/s2c j+xftki57lSzBJZplcPMOEhVnbjIyIITBnRoCmyElnqUI/0ufesbXa0sOlyouRwvJZ8w ++COWH1ccXhs7D94sriIscUrKn0UZ/K/0LptVflf1rKiurY4UZ2n10jE3hq/EiqhmOpO saFA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788813244; x=1789418044; 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=2FTgMhgLWmf0Jq8fB7caGXnFJscVEgzrr/HiqFpuFaU=; b=YR4Tz4BeWa5uNPCKdQGoTackOPw5aL3v4x/2HQ9TBJm6h2XFYXEl7xgR5k2wsXmFIG GzQCCa1P1D/Ns0U2DOKoZUV7jDlg4l5klEqKRm+/zCmEh5hjyLTFSDFftSvWlxDzAbQG EazgIKb63QHZ1SL+5sdQyij/dU84w8YVafiPTwol9kQaQW/Gum99ByS4Yv8YaJBbl1XY +smO4KYIaKVWTi5apowmQQbWk9VJSYCaL706iy3NP5h7EPN05Yzec4Y8+w9Xue+32xtW LdkOQKssT4aRzld6yDwa8jc/GdhSV60SGOWBvzJiFW4/gLptCkAP1vQKiB1x6CjfdNoI cVKQ== X-Gm-Message-State: AFuF++nQ6MMSuxOwmNL5+Q3RHAIlnV2ZgVQiEm+CgBHQ0aigkJQlxLuP j/iISoZooAgFWAj12gKKd9g6T9Omw9NtJ7qXq4mL79nTkwtOT5zDE4p8TTCQIsmk+aZoCRmqdS8 7Gl88etih8pAxdqaEmN3/ujEgXqW0JC/g+VtyWxhZIgvrMjrZmJzN2Mzn9I/umnmdIQ== X-Gm-Gg: AYBFou2QwMkTh9hP28F04Z/L1Q+CAzQqx1ifQz1Uv6NX/tWHCtEg2dl49lHlqjAbq68 nOCu6o+Rk69I5ABfwn2UreLixFC4EtGsnY9OlrOFbggHskHyyTwvAfLxbFiFRpzS00ZO8K0leTm VGervwaN/nAgFAg1PahoU2btQKcHBL5I+GMrS7dBLZrOVG+wxUlxHkvf/SiMBImI0D66nuEV78Y x3E6NbTCvGPOYjCN3tgcbkpKQlzJBt9woV62Q+hpVpIF7bANpwagvTm45oSR/BSwo0DDl8lSntF AkvKbf5HtZXUZHQCJhmdBWyLFhmIVbLHZopuaUWd6fhPAHL6m7/WE7U6+UcNY5mKMWyLGpflkS+ sL0Ky8oySttf6mLaqm4/1vjOK0VKz8733iF74UnxU1XSSoZx9tsJi9g+bcGzKekLcvMRK8VvsWD fvEiprHKGSiXEbE4xGFsM1bg== X-Received: by 2002:a05:6a20:a11a:b0:3d1:2dc5:7d37 with SMTP id adf61e73a8af0-3da39b5c97dmr38558551637.3.1788813243893; Mon, 07 Sep 2026 13:34:03 -0700 (PDT) X-Received: by 2002:a05:6a20:a11a:b0:3d1:2dc5:7d37 with SMTP id adf61e73a8af0-3da39b5c97dmr38558480637.3.1788813243407; Mon, 07 Sep 2026 13:34:03 -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-3339af25062sm47841297eec.16.2026.09.07.13.33.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 13:34:02 -0700 (PDT) From: Pooventhiran G Date: Tue, 08 Sep 2026 01:59:22 +0530 Subject: [PATCH wireless-next 13/18] 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: <20260908-smd-v1-13-65ad4ab30fbd@oss.qualcomm.com> References: <20260908-smd-v1-0-65ad4ab30fbd@oss.qualcomm.com> In-Reply-To: <20260908-smd-v1-0-65ad4ab30fbd@oss.qualcomm.com> To: "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Johannes Berg Cc: linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-wireless@vger.kernel.org, Pooventhiran G X-Mailer: b4 0.14.3 X-Proofpoint-ORIG-GUID: U5EwvJHZNqxChFFjPmXtcGG_IQO5s72j X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA3MDIyNiBTYWx0ZWRfX4+VzJggGP5Io DKVsMzBoA6KFpUksZLxF1f9WgmD27DT9Zj/xWVUikzydbdzXpOXDKl8tMLeCkeI/qkuj3C+gLT3 JSGr3lk6ogGIHi3XrI4QYpSOAiaZAyXaO0eyiKtuq+vSF0e24msR3o3uMrheg+43RYDBxhUVAO+ UONppL+hEXjnD1YsBWZ5Ft9xb8l3bEnIkXmrxL6rMEfl+1EheYnUO1cPEyqpmWGW+FHIO7oQ2Wi J3QESq7qMf4lf0hsTi4lahSlX7+iTUqzMoy4DjASLNmCybmhQyldjkKshV5itK+6MwcarhKtioC Guf1J47ExNwK3QdWipWm7r21WGw0hVzqZm9HIJJBlEljBNyuS/O/d7Jaoy+9p4xogvqUJ/GHIp9 AJI1ypgPfD8DMk20940tS+jBxrfCL9vxzj0MiVM/Al+Iva5lWo0dXcotg4602RC96yIqaHuelMO aDBktOUuGFGHSw27Fsg== X-Proofpoint-GUID: U5EwvJHZNqxChFFjPmXtcGG_IQO5s72j X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA3MDIyNiBTYWx0ZWRfX2TEXqSD8bfc2 aPrk+kzPUkkmk9iyzhpoB/13vpEoT6OlqnmZVd2lvCxxOcqPV/VgnZZEVJz9Oq5g0mx63SYKPw8 vxgB258/vtmGDZJjVgvZddOShfTur7g= X-Authority-Analysis: v=2.4 cv=AduB2XXG c=1 sm=1 tr=0 ts=6a9f1fbc cx=c_pps a=cmESyDAEBpBGqyK7t0alAg==: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=LQFPhaWwRXareCLbuGQA:9 a=QEXdDO2ut3YA:10 a=1OuFwYUASf3TG4hYMiVC: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-07_05,2026-09-07_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 lowpriorityscore=0 spamscore=0 bulkscore=0 adultscore=0 phishscore=0 clxscore=1015 suspectscore=0 priorityscore=1501 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609070226 The UHR Link Reconfiguration Request frame triggers SMD BSS Transition on the current AP MLD. At the point where mac80211 forwards this frame to userspace via nl80211_send_mgmt(), the driver has already collected the STA's dynamic context (SN, PN, BlockAck state) and attached it to the SKB via the SKB_EXT_WIRELESS extension. But this information is not known by nl80211 to pack the context with the frame sent to userspace. Add handling for the UHR ST Preparation and Execution request frames in ieee80211_rx_h_userspace_mgmt() to pull the ieee80211_smd_ctx pointer from the SKB extension and store it in cfg80211_rx_info, so that nl80211_send_mgmt() can include it in the NL80211_CMD_FRAME event. Signed-off-by: Pooventhiran G --- include/linux/ieee80211-uhr.h | 59 +++++++++++++++++++++++++++++++++++++++= ++++ include/net/cfg80211.h | 13 ++++++++++ net/mac80211/rx.c | 22 ++++++++++++++++ 3 files changed, 94 insertions(+) diff --git a/include/linux/ieee80211-uhr.h b/include/linux/ieee80211-uhr.h index f904b1e65f10..cda8251a1a9a 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 75d0123fbb5d..7b0f328fec79 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h @@ -4887,6 +4887,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 * @@ -9543,6 +9554,7 @@ void cfg80211_conn_failed(struct net_device *dev, con= st u8 *mac_addr, * @flags: flags, as defined in &enum nl80211_rxmgmt_flags * @rx_tstamp: Hardware timestamp of frame RX in nanoseconds * @ack_tstamp: Hardware timestamp of ack TX in nanoseconds + * @st_info: SMD BSS Transition data in skb extension */ struct cfg80211_rx_info { int freq; @@ -9554,6 +9566,7 @@ struct cfg80211_rx_info { u32 flags; u64 rx_tstamp; u64 ack_tstamp; + struct cfg80211_smd_transition_info st_info; }; =20 /** diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index 40ed03a775ba..156a4c0d55ac 100644 --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c @@ -3993,6 +3993,24 @@ ieee80211_rx_h_action(struct ieee80211_rx_data *rx) return RX_QUEUED; } =20 +static void +ieee80211_rx_h_userspace_mgmt_st_frame(struct cfg80211_rx_info *info, + struct sk_buff *skb) +{ + struct ieee80211_mgmt *mgmt =3D (void *)info->buf; + struct wireless_skb_ext *ext; + u8 type; + + type =3D mgmt->u.action.uhr_link_reconf_req.type; + + ext =3D skb_ext_find(skb, SKB_EXT_WIRELESS); + if (!ext || ext->type !=3D WIRELESS_SKB_EXT_UHR_SMD) + return; + + info->st_info.type =3D type; + info->st_info.ctx =3D ext->uhr_smd_ctx->smd_ctx; +} + static ieee80211_rx_result debug_noinline ieee80211_rx_h_userspace_mgmt(struct ieee80211_rx_data *rx) { @@ -4003,6 +4021,7 @@ ieee80211_rx_h_userspace_mgmt(struct ieee80211_rx_dat= a *rx) .len =3D rx->skb->len, .link_id =3D rx->link_id, .have_link_id =3D rx->link_id >=3D 0, + .st_info.ctx =3D NULL, }; =20 /* skip known-bad action frames and return them in the next handler */ @@ -4024,6 +4043,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_frame(&info, rx->skb); } =20 if (cfg80211_rx_mgmt_ext(&rx->sdata->wdev, &info)) { --=20 2.34.1 From nobody Fri Sep 25 23:09:24 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 F3B1E5221FD for ; Mon, 7 Sep 2026 20:34:09 +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=1788813252; cv=none; b=IczIPJKFpre/C2YxQlTjat4UzmY73Xv5heM+UBIugOE28FP/5OjURfBaAhgFcgwtW3uhvnvv9aKVvmOOf+EHKeNC50SvN2Z6PxifrRZk6m/96G9xJ2PR2Ejad06kI+HoW5WYSvv66mIrD3I/HoTyUXaacEXWLVKdA65E8Ux1srg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788813252; c=relaxed/simple; bh=9GUJmm0JnYOjtca2tQcxf9Y4BE+SaF+P3iTowK/ZOVM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=js+zOMDFcCnt+1OBzdzCj2PU9u3I4HaxfDo4gUxmGUThrt8EzPxMcFN5+ok0QMf2rvP/u5l7glFhFjhJtWLPLQpIuPtTA/ykhzXCzhGfFSGZLWURGfY485gOH6d5GnZLtQ8AbXFxxTAKmQk8k1JKWB0D0PoGCd34HfxFgS7Cj4Q= 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=Ddoh97ek; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=blKIGHxX; 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="Ddoh97ek"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="blKIGHxX" Received: from pps.filterd (m0279873.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 687HX8Lw552303 for ; Mon, 7 Sep 2026 20:34: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= wVk15Adnij0xzN+GSJBRJZvYMNQ2RQbb8lQpb3qcGW8=; b=Ddoh97ekoxO8K/6B vxZfoZ/3CldzvgdjITcJEd7yV1dzBOkbiv0FXPVLFWE3Juf/EmjMEDqq/V2zUBzm lewTzP5LNtbrrPSlak1OFSP6d14TWRtNPovoT9+G5OyP+eC9gThwb83sf4foG3GP 0G5YWZ5wBfTf84wFCnWKqapAiCUTjvuVd5dOaFbKCwSQIkNuRYIWZ6Iahba3cfJG 4d8SNUROtNKvGN4I4KhrEfI/hsMALB87P48NXBd8xyD5beB2OCO2MejS9qI7qNEU JZc8OOrylZBNlWeKWWZ2E4zmgRtuZwzAXu7Ly/czj6ZyT/Fm1bq7CntSzfMzFWH3 ICnzyA== Received: from mail-pj1-f71.google.com (mail-pj1-f71.google.com [209.85.216.71]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4gj1rwgfjn-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 07 Sep 2026 20:34:08 +0000 (GMT) Received: by mail-pj1-f71.google.com with SMTP id 98e67ed59e1d1-39533bb224cso354614a91.3 for ; Mon, 07 Sep 2026 13:34:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1788813248; x=1789418048; 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=wVk15Adnij0xzN+GSJBRJZvYMNQ2RQbb8lQpb3qcGW8=; b=blKIGHxX+cFuqBZWHX+DUAwjqgaNBQ3OCOgRJ/EJLGaLXo0yY5EO7epCxtCh9xyjb6 UIW9HaJCdaLOr51bojcYUdz5r9V+h21uJi+lQM5BkqX1AkTYj/QT0maAAF2+AYGqkFXj nCALd+nvnQj/rrImSsGATJWxEyzsAQFAlvZpylFnO6+j0DIrbWFeaU9HiTGoWaWhhifm eFjhtBDS+5a7S8J8T+zT0ZPYPjGpbO0vnNKz1QozDUdKEOkde8dpxg44YMceSurBMxf+ skWvqmtF5Gm2fXR82JiKBF6z8Krde9RhRgq7XrqUYGfg7BCk0tu0lDBfjPFfe77H23wW Z40g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788813248; x=1789418048; 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=wVk15Adnij0xzN+GSJBRJZvYMNQ2RQbb8lQpb3qcGW8=; b=rrvrL+lYMcxfYaCnKp8GzTSjlwrcgBpBCnheeaiMAHZ8pvQ9oWa/v73PWfKVVQUKxx /e1iPPN9CDN2IAKwk4tohBVAWSYYcDd00LTNMT/nvHtH9iGWBCMi3nSplOjxXkXoK96J 7O5S+5FYBKk9jDb2hVHZ16coKpajdy3btlGbjnzAZ7lIn91amDJgZRBgv/iGKNa60E/c 3X5zBagvq5POHLIKmOKrni0DFogfKY/9iUjJV2MGVFi2Xknojtt9Enxj23L3ShULmNWp IYI9LYfzaozD/lIgVJez8DFAt+CKsKjsTyjP0M7bLPINbA7GPmCIFnWD7no1YV8oUBJI 2JKg== X-Gm-Message-State: AFuF++maDpw7mmJPNrW1666/ra2JHS/u/qtikNZqGYV0Va0ovjY0x9EJ x3Yqt0Z/Qk7UPYKXLEzcUJTGSpZD1JF2TT+8gCjYQdIyRH2pKR9cQoUf15lU1oDnIEnotUb7Y9m ialEsNPP9xnI/h4SmiVPDoi+aaYt6DZ7pzisP2kicjs9U78gE6KLze4/6Chl41mzP/A== X-Gm-Gg: AYBFou3NNtD9fgslbWiX4OcQQM2UQ8mtNNLr72FJvkXcm3a194IZ1Vab6q46fEPrbaZ sawOrUrezCujLn6qhqEtOIfvGWw4uuXI7upQGePknO6ncyc4S/vhYNEu5mQoWRVuFMv/8YQjjs1 ULwBHtYY0P0mHB4P3/zyZqSqH50yw6J2R1mIkZjX0x8suhXQzmo/t3NVeRm4A8sZHVK3sHIn31q Csa4I+NDVC4Ym6BPew9o0mHFzqktqVJr76TO2lPZnDiSQa0bVMFw2N7tYd38XQF8bPX7vmJTbUI Ibyg6wHoufjhD9O9VlJDgvBlApNwPlFST1106CfZqp/EcZKVOTarHYXZqC+XfUUo6tzZqSZRcU6 pvwRssTBfq7EBLE0Oewqnl1TmZnKswY7vIkU5q6u4L7m+LgLQt5ntEUEwoiKL+Blx/6Nwii6HcD wS4Vb5sV4bSh6uSKQgAGuEhw== X-Received: by 2002:a05:6a21:e8b:b0:3d1:c99f:efbf with SMTP id adf61e73a8af0-3da3a11ed0cmr41235093637.14.1788813247711; Mon, 07 Sep 2026 13:34:07 -0700 (PDT) X-Received: by 2002:a05:6a21:e8b:b0:3d1:c99f:efbf with SMTP id adf61e73a8af0-3da3a11ed0cmr41235048637.14.1788813247274; Mon, 07 Sep 2026 13:34:07 -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-3339af25062sm47841297eec.16.2026.09.07.13.34.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 13:34:06 -0700 (PDT) From: Pooventhiran G Date: Tue, 08 Sep 2026 01:59:23 +0530 Subject: [PATCH wireless-next 14/18] 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: <20260908-smd-v1-14-65ad4ab30fbd@oss.qualcomm.com> References: <20260908-smd-v1-0-65ad4ab30fbd@oss.qualcomm.com> In-Reply-To: <20260908-smd-v1-0-65ad4ab30fbd@oss.qualcomm.com> To: "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Johannes Berg Cc: linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-wireless@vger.kernel.org, Pooventhiran G X-Mailer: b4 0.14.3 X-Authority-Analysis: v=2.4 cv=Ga8nWwXL c=1 sm=1 tr=0 ts=6a9f1fc0 cx=c_pps a=UNFcQwm+pnOIJct1K4W+Mw==:117 a=Ou0eQOY4+eZoSc0qltEV5Q==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=rJkE3RaqiGZ5pbrm-msn:22 a=EUspDBNiAAAA:8 a=bhEJrp4yiY6RaB6cu_EA:9 a=QEXdDO2ut3YA:10 a=uKXjsCUrEbL0IQVhDsJ9:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA3MDIyNiBTYWx0ZWRfX4aH2dAki8BnD rtg1dhCF2RHj5JO10CSxKeWDyyj0MnFajSSemW9Ls0oMj5GvyCTfoSEkdcM1S7dUeA60q6mqE65 ge672QuDQziAPvqinWgK3tOIL62blU4UFVd/fgp9qnWpcZ3vPtCS0WdiLGiS6XUhpw4namNV+Md GC83qxy1O2Xmsw05pH0lCjWuLmEqeN9zdOEWNXz+f6bgeD0TmMX74qkmJpTguVZkmj0k47vTbtK WhNdHxOVIrkRY/vmLQk1Ez9IkAAS745pdCoZvzotwZ54dR9a//BwPG3jaYqupoZj7GXcWe/DHtw r0c4qGoWfACtHA0fVcNOpRS7QMIqEojtfKdvKOt53W734DEza4gctf0CzSXzlMikzk16tfulmYp OsRHLNQiKT+3ZAPrwY9THAsujslunJaD9/dxu73Ajuq++TEaNVRwxJccIoz5Vo8uWxb/sveQSUo E4DyiEaDDVwNLq1B3OA== X-Proofpoint-ORIG-GUID: QFAMcBJtH_t3Y9EH9krd-_-HgTFNzQGM X-Proofpoint-GUID: QFAMcBJtH_t3Y9EH9krd-_-HgTFNzQGM X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA3MDIyNiBTYWx0ZWRfX0c/MeSCkWsur UkseT2Lp9uO9gzqK1w4POwyrcHZch4n56+qLuD+32G8K2LK/wyFLWmP+wmJW7/NTwliwTj3GRje 0UyfDzxcPXbmfkH86/EWKI/r6dcd6Ts= 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-07_05,2026-09-07_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 phishscore=0 suspectscore=0 clxscore=1015 impostorscore=0 bulkscore=0 spamscore=0 lowpriorityscore=0 priorityscore=1501 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609070226 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 | 269 +++++++++++++++++++++++++++++++++++++++++++++= +++- 1 file changed, 268 insertions(+), 1 deletion(-) diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index d59f0eb40493..5065dc75b0bc 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c @@ -19568,6 +19568,265 @@ 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(void) +{ + size_t n =3D 0; + + n +=3D nla_total_size(0); /* ba_params nest header */ + n +=3D n_dl_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(); /* DL BA params */ + + /* 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(); /* UL BA params */ + + 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; + 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); + } + + if (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 (ctx->pn_len && + 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 @@ -22193,10 +22452,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 @@ -22230,6 +22493,10 @@ int nl80211_send_mgmt(struct cfg80211_registered_d= evice *rdev, NL80211_ATTR_PAD))) 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 Fri Sep 25 23:09:24 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 1354F5237B4 for ; Mon, 7 Sep 2026 20:34:13 +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=1788813255; cv=none; b=jEiHEx0sQtzjAhvwCcLSYN0z8HmsMGn6Tgjdm2uifVHzpKNCRC77tBlZnVKvV4LLg6avLjTztR60DbfEDevjVCKGA0dIMNJii+Bee023N1xlQ1qCoPCMeinOljAk18SSMaM+BgklXci5KjrDqAn4ibYXyG5l2ixuw4yCiU5Vq7c= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788813255; c=relaxed/simple; bh=koNnvwZa0vK3Gfgf+JGtHxqQbGSq5YiRRM9pn+/Ijsc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=UQRuGH8kPaAKxytTn6TSbNtlqps5Ef7xNxGz/m5awANegloRQ+HIlCMzvE3Scel/BmnKKzNMnDTfaH11cCylaXTc89HQ3P1lKmml4uw/JqNLm9PO1YO6OXYzmgASPPUuhc3bozOHjSLWCa4XcbNIg0ky04bhCfrzDS5eMFZHxl0= 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=ZQBU1vH7; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=ZtYsYKCn; 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="ZQBU1vH7"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="ZtYsYKCn" 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 687HWMLS565403 for ; Mon, 7 Sep 2026 20:34:12 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= zLlnTeI0ddtuhwizLW1JQhzy8jPGbUL1WY3U9N/wbPI=; b=ZQBU1vH76LLXvqAU jWEyURRpL4e2TKHTy3/+xEF4POIobywOliaEmCA8uLG7ZO+xI8n7RyN8rdDZMkn0 yFBqdFvILbsRotetnzmKo4o9uPm9oK0UwexW1AGD1IM37VPBhu0TMILkPqd7+u3c ++iB5bZLzk10+aQ+gmCKOAmpxE/tbJ8DJGDwrQS5XKfL71NuHUTofVITN/dZfiGH QvYuhObbJsnF6uFy3vXgYLVE3j3jkKJeTJdsLPbvMD0QrifEar7mG5SzOFy7cZKd NvFRCX2b6TNAJx3SCOwthmsiN5KS6OlU8vnxVbvw9FcPBzvXG0pyyMY6EoKP7cAY /aV1aw== Received: from mail-pj1-f71.google.com (mail-pj1-f71.google.com [209.85.216.71]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4gj1rrgg01-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 07 Sep 2026 20:34:12 +0000 (GMT) Received: by mail-pj1-f71.google.com with SMTP id 98e67ed59e1d1-39533bb224cso354699a91.3 for ; Mon, 07 Sep 2026 13:34:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1788813252; x=1789418052; 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=zLlnTeI0ddtuhwizLW1JQhzy8jPGbUL1WY3U9N/wbPI=; b=ZtYsYKCn/KjNXuvlJoxnuL6+ycur0U75hVMIfX9C9Lrd1u8WNICMC+fxCXDQPFP2js lH4ELFyIYOuh+u/8XMR2oPOXvOdXOJEIiJUSakGIXgVIIBm+pdl3tZDecWjTLVlU/4gC 951LkPhFVQyj8oQOHFcl9PkUahxSp2f53iA+JMcori2pWISPDGFLL7gW+tiePZn2LeNm esrfVw/zHcUUXCnGNNhGBVrPlboAENGOpFj4TV4CJ5KuMboxpyL7mkRwGKWGKsd0geGo 8GaAh49CmpSD0XM09mvI+TabcLyCEugs8qBswloooa03FK02CqZq3cuF0Oy8USk4qywe Wq8w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788813252; x=1789418052; 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=zLlnTeI0ddtuhwizLW1JQhzy8jPGbUL1WY3U9N/wbPI=; b=fCH7tW2KTz400mO40B5xKFLLSECehqWkuH0rkiPmXx9DNlYL3RsnQDLAaXH9XBqjgq /jlL5ryBAw4DbUxYASXIcAC3p5vcn35owaZPF2ZWNyqvw1RPP1H60vrSkMazbGhuz79k cQgLNIBpQPW7LuIg7VGfgxJV+/VLOOwoYx19NpGFBtCSX73VwtKGUEMAN9Cz95L1JpTB pr8aTA9kIimtoIBfQEWuNby0jSuJk2BJVSqttXTvc6di7CMT+6xghA7P4sGkHvXT3ido zlkI54jyqzCTSghWwOvLhkwIpFokpQBRUxYUSohwyLBtO23dGjx7PsJXWnR5nr9zcygu 13gg== X-Gm-Message-State: AFuF++neQPL/KJR5x/Md5qBiUmBCCC3OXb0oEEdDv6lrZcVJ6i0DM6Rx 2jUKmCeSx6iuvjAgUbtNXPIVmXz+tat22foc++WWwmdZ0NP/XRKQ/GiT9HBeVo9WFzBZnKHGwoC 14D5ZVScvRQNy5aDW7ETLGtT7z9NDaPMUtWWSaZOq5s0nHYEHvMtTDRoj67kfPveEcw== X-Gm-Gg: AYBFou0YhAZHBIGHidw7ctGCGUodsfYo+ctfv6cuD/IVNxyW/NYLJh/YcQxupffJFMY KaWckWjK2rFICyUuISjluIyppQJJ3te/g1IDpumZJGFJMIZ81us//jS1pvHcMcpV+sX2thnSqVz uvPlgGAcw6QjFk0Na53+HiwWHTgiFkuVbN4M8XVVOToL2ZX/I/H2HhKDvPE4TShmoz2l/o023X8 HIs1jy79BGvr5GKD/FhvFc8oR0rEz/YKm4IUOO27zxsVhwNE5ixOAjn7RuxBtTMf2aFRM8r+cb6 ChEy93tPQ1Z30gkcIdsu/i3d1Z5HrxDLneFjOEIvsyE6yVa96kzuwu3Yi6cEa7hEFwWwstak9I+ XsEKd2jCR4fWBtosavvlNTEJB+G4rXZZwFW4X7arpLsiujnmnl2HbS/C00PhbRhysr7V0bVV1Rt wmllN8qa3Ys2A2uFMOj6axIQ== X-Received: by 2002:a05:6a20:4311:b0:3c3:bbe6:95de with SMTP id adf61e73a8af0-3da39eacfc8mr32184464637.6.1788813251607; Mon, 07 Sep 2026 13:34:11 -0700 (PDT) X-Received: by 2002:a05:6a20:4311:b0:3c3:bbe6:95de with SMTP id adf61e73a8af0-3da39eacfc8mr32184436637.6.1788813251159; Mon, 07 Sep 2026 13:34:11 -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-3339af25062sm47841297eec.16.2026.09.07.13.34.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 13:34:10 -0700 (PDT) From: Pooventhiran G Date: Tue, 08 Sep 2026 01:59:24 +0530 Subject: [PATCH wireless-next 15/18] 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: <20260908-smd-v1-15-65ad4ab30fbd@oss.qualcomm.com> References: <20260908-smd-v1-0-65ad4ab30fbd@oss.qualcomm.com> In-Reply-To: <20260908-smd-v1-0-65ad4ab30fbd@oss.qualcomm.com> To: "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Johannes Berg Cc: linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-wireless@vger.kernel.org, Pooventhiran G X-Mailer: b4 0.14.3 X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA3MDIyNiBTYWx0ZWRfX/rKn/Tr/ymk9 3oVmq5zPj5Ifcv9R8sKErEAGalz+TfmYT6TdOeVx3MQi1VenCJwjcKuoFCS22c+vJPGHLFYnmo1 TZutVTr2afLi7ysHt8zbvzueeQmhM8U= X-Proofpoint-GUID: -Ky8c_PaEYrp7suFG_nkzg0rI4kn2ZOa X-Authority-Analysis: v=2.4 cv=NsjhtcdJ c=1 sm=1 tr=0 ts=6a9f1fc4 cx=c_pps a=UNFcQwm+pnOIJct1K4W+Mw==: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=4KCYKawKnagZyZotmBEA:9 a=QEXdDO2ut3YA:10 a=uKXjsCUrEbL0IQVhDsJ9:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA3MDIyNiBTYWx0ZWRfX/A+LjepHKGW4 68lgmkZDQ2Ebei/GlYct+OajvNStaE+h0nYlYJqCAM0gfHQObJYRDjmDZy7rDgYEkx5rrtz5py7 6tFjE8DXu4wtRW6eEV6rdNwXWBwhoCwUkoRmGrbHeqhS5p4LqYyK2eJNRSBvBMSGWQskrrSgA2H XqB3py49lFt5UTgURBHD/ModI/LhgTOo8mG1p+8PiGKWMHQrr5wkrl6mVSdQpmqZvbYAFWFckCY 1Yj/fm/TZRBtARPgk4tcsVijE0eLGq6s055Yt+r4uektTClpsl25K6W2c68pXn8cl1VKQ8u/wW+ /iGtDOVozHMvGXN0fIyoRI/tW0NsrH4XfqTT8KEEc0L2ZJMyCHtZG4iyETX98b6W/kEtKTZMuS0 BtTq4SFf952pI89H90uPSzDCsYYOuCkzEDhl2JrTTYMktbwfixD2cJpbQL040Fivh9smPQmXmiR k639pngd9uKIXv2iqcg== X-Proofpoint-ORIG-GUID: -Ky8c_PaEYrp7suFG_nkzg0rI4kn2ZOa 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-07_05,2026-09-07_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 impostorscore=0 lowpriorityscore=0 phishscore=0 suspectscore=0 clxscore=1015 priorityscore=1501 spamscore=0 adultscore=0 bulkscore=0 malwarescore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609070226 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 | 332 ++++++++++++++++++++++++++++++++++++++++++++= ++++ net/wireless/rdev-ops.h | 14 ++ net/wireless/trace.h | 47 +++++++ 4 files changed, 400 insertions(+) diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index 7b0f328fec79..b68f5f6837be 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h @@ -5329,6 +5329,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); @@ -5707,6 +5711,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 5065dc75b0bc..70b8697e5dac 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c @@ -19827,6 +19827,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 @@ -20168,6 +20455,44 @@ 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 if processing is deferred after + * returning from this function. + */ + 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); @@ -21069,6 +21394,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 Fri Sep 25 23:09:24 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 E309852ED56 for ; Mon, 7 Sep 2026 20:34:17 +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=1788813261; cv=none; b=Fxxwl4k66BXnblXuuiCCYGDAdufQh3NuVQXh9PjaLY2ygPtmITR7bzF1dxHgxIH/Ux4QyEeQGBBj/Rj7wNOpAGGK4Xt4LHJIgRKiaF0JQzf2VCbZmsq/x45eUpi61o4nxDUnbLKASxlA/K13NGvPP0nLOGFqnP3Anjr5EVFjyX0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788813261; c=relaxed/simple; bh=1uMWzUWflebLiT0iHAY0034lgOkn4kH51Nlr0m2TKN8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=t4wO8FH+iRz4uP/rkNKMGV1cB02hdC6n56JzLpXmgqUL7jGO/9ETkz4cQ5cA8e9TeiOUSSESErSNBLaW42A4ClhAt39DymF7kSxuenQ99qhRa6uJJy2wJ210PjS53CB42TwjI/X1vfNntJ2BLtaoRVDpG5l8vd9A/YjGtafsdl4= 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=PDC31RPT; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=kptrbbyO; 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="PDC31RPT"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="kptrbbyO" 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 687H85EX838236 for ; Mon, 7 Sep 2026 20:34: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= DAgmn3n8oR+1sTJOd89f91uGu1zJpklwZxV7NMQTcT0=; b=PDC31RPT4SMfGTS8 4Wa6ZryAh/s1D4T4Ow6jnXw52Tlu4uUayey6XOYoSuWd1ylzc16uoOaink5GPVOX Doz2VE8380UFCw4ZRWgjln+/mnPzETFArWc5ZvkI1EgDPUxdS4zrK8QWusyHbXp6 bs1ptYryQFxp4nMOmZAtj58PsDQdKp9gZ+fUeg6W8J0RdADU/CznaOw1++vQ8pXA D7HADFKbddx4T2y+nQ9bDlrnbpjLbjPrgqJpVUcJpnuPjP2fnLd0/x+DY50bDZIM LElQT78K5jn/P22qg0GsjLYanVe6cqY+kwt4u0z/J9B9g7Z26XM7myKQpt4zTXZb 9zo1Dg== Received: from mail-pl1-f198.google.com (mail-pl1-f198.google.com [209.85.214.198]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4ghssg2j3x-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 07 Sep 2026 20:34:16 +0000 (GMT) Received: by mail-pl1-f198.google.com with SMTP id d9443c01a7336-2db3b126c9fso27884885ad.0 for ; Mon, 07 Sep 2026 13:34:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1788813256; x=1789418056; 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=DAgmn3n8oR+1sTJOd89f91uGu1zJpklwZxV7NMQTcT0=; b=kptrbbyOp2GBFb0fZz392DT6HOdLW6SxFNX+o5Nbm2C0Fh5t0wBcpCzyO3LjYRQwgJ +cfhYxofV9edkc5xrRXHa0MZxGKZyekCay2sMK1CoeyBpjK+8u1pBbdnB00hMk5PI6Hh m177CVUUKSrlP6zvQycMNB+IBLaw6rS+DlwY+qm7DLeKMRZxLtVbHD/tk9oB/cMEuvAe Vwm2KJLraPAn/jDZK0NwuxgLc/RLki9MtKda4ySIO2m73SW51RZ2+5VUuqvddlrElo4f OLNG63d9y1H5iwdIVHeDmvhgVOjE1OZ4k1s/0Jnq7Ie0SrwWfsJWfvPP2EvDggsM2Qra SqjQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788813256; x=1789418056; 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=DAgmn3n8oR+1sTJOd89f91uGu1zJpklwZxV7NMQTcT0=; b=I8dvdm1aD8dQnXhrmAGo9lscH1YIt0Zon2EpkFhBM4wR49l3uAvUK5pnScFCS+9khI Y3AbAmdSp7V4TT2MX0KOPe0iD9tUMudCCRYBC7Awi87rW3gTE7P9piqijrpU/CWHLavk FeqUzjj/0YRgGjeAu4X1p5GBD8+IGBs9nKMI2AntPjAsR4T2lwdT0K2o39EoUcCZMltq Dwum9stoPwFLhHbz0rPZnkH57fbOMdYun/xqL7Uwooe3BGJ8BTFCi9gvabakEIZTDRWj dmkmzUiPCvgIuOfRji5C7CKmZjTYHEt7bPp+pkouClZdZxnW71N0mYiZAXpMoc4Or0cH e71A== X-Gm-Message-State: AFuF++lo9BTABrJP7n38R5NHuBDZtGvMsBlDWnf0jAv0rw+gGyOMfj7L A4MloXpqctW5mYdO2Jgvx7KY4vyMBV8JxWM3J7Bj7/HXkYYwWCQRCDbwcKkEsd3QqMiZP9HHiU8 SiJt1j1m+YTDdY3kRSH6MQCqHeiN9ASOoCkOjDfIXYKLNu5eXCtbhaicy4PyZBtmxbA== X-Gm-Gg: AYBFou2c18V3QgCpqNjyMORUJoS5Yvw1HCQhkjBJmUJ+JRfxVPJy8nK2RJ2o2g8btgm zXkMZ5KC7hHLXhJRV7VddXCs+1l44JhbhYbYuZSZrNq3Pl0Vtw4udKJYpIjrFvwlr/0lnBwnOnC OLkcKD2e0yG90DzXx843R/nXFPJO5PJJIPqexMWwa4nqJtIDokNeLE6Mp0GNY3U5RnGdBwOniBK tbYMIAvgjLKV2l5suL+6AO7BkF4JXS92UOYDjddjw6gdclP5voNjEkVUcolUK17PnG5l/CMJZxy oHseoMEjWSNScZwwPWPMZkH+0WK/McuafyRDWWZ9WKLrHd/0nOV4QfKgJJYDTrUVSmYmUTLZUpj 3K3vsnY4sGI3xRvjKJulibgf4LYiDfAgpRY4lqN9KJ2LzK95E6/aDimYvh7DEkIMhFziYtqn+Lz 3XL5oMJyNKFDeeeK4ZiGIKtg== X-Received: by 2002:a17:903:4b04:b0:2d3:160b:c01f with SMTP id d9443c01a7336-2db124b1ae2mr338036255ad.6.1788813255584; Mon, 07 Sep 2026 13:34:15 -0700 (PDT) X-Received: by 2002:a17:903:4b04:b0:2d3:160b:c01f with SMTP id d9443c01a7336-2db124b1ae2mr338035425ad.6.1788813255020; Mon, 07 Sep 2026 13:34: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-3339af25062sm47841297eec.16.2026.09.07.13.34.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 13:34:14 -0700 (PDT) From: Pooventhiran G Date: Tue, 08 Sep 2026 01:59:25 +0530 Subject: [PATCH wireless-next 16/18] 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: <20260908-smd-v1-16-65ad4ab30fbd@oss.qualcomm.com> References: <20260908-smd-v1-0-65ad4ab30fbd@oss.qualcomm.com> In-Reply-To: <20260908-smd-v1-0-65ad4ab30fbd@oss.qualcomm.com> To: "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Johannes Berg Cc: linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-wireless@vger.kernel.org, Pooventhiran G X-Mailer: b4 0.14.3 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA3MDIyNiBTYWx0ZWRfX5ASwzAq9Y93v 2FSwGWxzPg+o592O69ZJBmeg4lLUBvMT4AhkzCfAkB23hcgZhUC9FAFNTcDikahttD+cpinPdb2 Y3vFWTo+VXdlqls252h+PflyTxFm4Rr4oo7EZCGyodc7ZOAU1SLvMAbvdZ4ckuPV2KDoFWbwHwL 6DvGuftap1CBD1tzGnOVA8b4wglCQgiYGbBb3T7oId2AJjGEYjYeJMHFB+WYhcO/hWsG4NlBJhI l8hQNu00SxdaXsLRWRDHL8GTfJs5gnTTaLx2Cwy736GuSMZulqAgv/W4zvqqh26yHwlyxq5UMJy HApl9PRsunpUQ5pDd12Vzm4eGjiu7V3BmB4zmUg//jKsErcz9aMzg89O6tIz6ZEtAhSi4dJ2Xrg IbBpcf0cnj3tb4yc4NknzKRe86qJpAEe25Z/yX1yAW1AKlBuvJiQVmhwCK063B4tc2CUMsOMorS Ni+YaqIgoGcd5XmfjAA== X-Authority-Analysis: v=2.4 cv=MrJiLWae c=1 sm=1 tr=0 ts=6a9f1fc8 cx=c_pps a=MTSHoo12Qbhz2p7MsH1ifg==: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=zHDNONmbSdC_GOYWSZkA:9 a=QEXdDO2ut3YA:10 a=GvdueXVYPmCkWapjIL-Q:22 X-Proofpoint-ORIG-GUID: cgoR-zD0Sz15nNrLspNBHNp7RMj55eRu X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA3MDIyNiBTYWx0ZWRfX8o9990GPCo8K nF2uhLwOKqbK+cOKdiadjh7TQXFIwwFi/y7oGQPayaSbCmMfmW8LeeXLTCScp3ZNoAwFfmArups vPhI4vJir3V2cpaL2zgvgGLcZGqurOE= X-Proofpoint-GUID: cgoR-zD0Sz15nNrLspNBHNp7RMj55eRu 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-07_05,2026-09-07_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 lowpriorityscore=0 malwarescore=0 phishscore=0 clxscore=1015 priorityscore=1501 impostorscore=0 suspectscore=0 adultscore=0 bulkscore=0 spamscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609070226 cfg80211 accepts NL80211_CMD_SET_SMD_CTX on the target AP MLD for userspace to be able to program the station's dynamic context on the TX and RX queues. Add mac80211 support to handle NL80211_CMD_SET_SMD_CTX in the 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 enables the seamless roaming facilitation of the SMD BSS Transition procedure. Signed-off-by: Pooventhiran G --- include/net/mac80211.h | 5 +++++ net/mac80211/cfg.c | 24 +++++++++++++++++++++++ net/mac80211/driver-ops.h | 24 +++++++++++++++++++++++ net/mac80211/trace.h | 49 +++++++++++++++++++++++++++++++++++++++++++= ++++ 4 files changed, 102 insertions(+) diff --git a/include/net/mac80211.h b/include/net/mac80211.h index b4b1d3db9b19..e0e13f0ed31f 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h @@ -4780,6 +4780,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, @@ -5186,6 +5188,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..268d5f42293a 100644 --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c @@ -6081,6 +6081,29 @@ 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 || !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 +6222,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 Fri Sep 25 23:09:24 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 72BD33AFAED for ; Mon, 7 Sep 2026 20:34:22 +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=1788813268; cv=none; b=WrG9EBYojUesEjoy6okR8BEnoEUhrM9KqVzkAekhwk0TtwrElAr3pLeveM51q/lI4XQLrT8unFvywXrrXJ6mdk9dOVVkWvPD4tnV3FWlBvyDMQpJwp//yEyUmJmV5XF1+Pc7xKIGsdFgpym2JLgxn+q985+V+OnAM3XyNOtDyIg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788813268; c=relaxed/simple; bh=DuVTL7SFSPGn50P5/cLnuDkfUI+vw4dP9jTarQNd3pQ=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=ZZSlCWR1onFLvTn2+ldzh3LCbvhSWrCMk2UhyAhubNFa7A3IxNlun/tQnD64iIKCo8oQsZrBkmQWROG415fK9FQhWx6cLmy++wXjc85e+KCw5ryTs6ROvb3HSWbdWV9vqrz8Dhnz9sFP5UENn/0FSErNJF6vUIER2g+LqDBPljc= 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=cAoCch18; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=E8jiiuf1; 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="cAoCch18"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="E8jiiuf1" Received: from pps.filterd (m0279873.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 687HXDYd552607 for ; Mon, 7 Sep 2026 20:34: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= jUEQhFwlbsnMglV+/k9/p+xndCktKv3p9s//lWGSM5g=; b=cAoCch18/zmi9372 cLMQPcH1FTLQPS77ERhj4pGvRBm3nBMJ0/JASLGHup0VbzqeGPNJoy1AG5AG7OZq WFL5L/m/2mHPd+MsNx1VAp7Pv8D8gDTGlnF59qN3ewJBaeN8cXd+DMkxOkCyKZCo NUv1JaLGbudDb+5/GTdk4i/tnCUlHlZANnayrEOJa4nY0DR2yLNC9R1JquARjLUh Bm6QfQ0NUyFpJwzB8mQ8AGvkmZ79cWDEoLvF33Yu0UvLVkxmJUIadYctr9fOld4q sigTObiwD3Lg7FcbiKVYKJ9o5CfVnL3I71JfT6zVCJ9k0fmBIys3//oq0lYnhpM+ XdcWWw== Received: from mail-pj1-f71.google.com (mail-pj1-f71.google.com [209.85.216.71]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4gj1rwgfk9-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 07 Sep 2026 20:34:20 +0000 (GMT) Received: by mail-pj1-f71.google.com with SMTP id 98e67ed59e1d1-398fe469aa0so6138076a91.2 for ; Mon, 07 Sep 2026 13:34:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1788813260; x=1789418060; 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=jUEQhFwlbsnMglV+/k9/p+xndCktKv3p9s//lWGSM5g=; b=E8jiiuf12RQCDlFxOQNbiMA6U9E7Y8EIZOS8iuOQyYm8SiwBZ+ERUjffmUXFG3qSYm it1OB/oXgK7tZpHzgRZDmZJVNPdV3Qcgdv12VfAU8+jgETECUbEma/nFWG3HbGEABlpC QwYyNQy/E8N3R7jMfG0hn8OhR/GB274GwRVdC1sZ4n6QA/xCg2Ya0Y6Tj7hv+xDoJSC9 22ELi0EriBnyPOVyq1UXg+0v4esNoTsX6iVTaPM3O7VHXyx01T+/CvRd+QHapHk6jr8m RGiq0tB2pU7DsJdCNWlEAyBlnQJuOFrMMmWjKL8B5hFMyfhBSZyz6KHhHPfd2Esjoxfx 9Pdg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788813260; x=1789418060; 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=jUEQhFwlbsnMglV+/k9/p+xndCktKv3p9s//lWGSM5g=; b=ED6vXTEWuU5Wo6KJBAkNyzUR2zSu8nvZAK56D759iOxPqeRqFpbSR4TPG8oVWNwFze H3qU6omwoiYTYAVNqvhORqk7+dSyXznGN2YC4meXCzv9Y1WFVWk5GgJSSHw3x6oLTab1 3EQxOkkWOw1c9HYrjtYnFBiZoPurMvE+Yy0lqOCzrNMk6uX2IDwKh+x5I2S7gOUOKDCd 9qNuudtLVE/TZ8BE8vWkW8vp8RqqGsGX2RI84GiUGIdIkS6SZUyAU1pGy2mnVFJhzy14 A73LCD1EOQ6X2hSeZ0wAWTc3WbTsY4tidY5zgjG20x02xYfAKuxCAsBvVeRmfcFZ9ar2 jFsQ== X-Gm-Message-State: AFuF++mKKiTG6Egmz+UPCTpjm1NksCw7r6T+noQD49SIS/k9/RCjzKAc ofziHipbRiw1CL238TwdnwBAVDWGTiEMuI+H3idK77EFXXX01gpvnZtSpdFuuP5ohkrC68dLZv/ Ey63PS26E7JlfS18sYUoLu0VKTGp5Fr7mTO3NhzCsZsJcvSkgepqVmiM8jVRR+1Y8YQ== X-Gm-Gg: AYBFou1kW6ECZb2bXIW6n0NF+ln7WslPPcGKRFMPj/Cca7TChW1UmTC7alap5Y3+s6g ZMlLOrZ9ThJ/HYU4CXYo/tpYXUkG0HFNImESdsNrZKwa4/CTi58455jJZyxmklZCysuSaQKrSUy VrfNu+HV/kBF46VbIWYU16h/SljzdFArd5ZgXSH2UaRg8GlBBKbCxJ0t7A0wA0M5p9L2Ox4Oyx0 DzWJBgpTZt8HQvWdUR8R74ZC9hBzzSmPrVa5P1L0hHNRGBTciKXcAbIu5oFUPDaSDMMMhx03OBT wSq3nrxeN90bZCrKw2SUilScDvqlNZ+e3Sjbb0eo92i0AxeEFU5u+AvhZXMVRsPROYWuzIlZtq9 Bf1JjHmfqAMQwIjYTMiLf3vQtsG+eUMUAPg+vB2sWDxcuTIExkrLHJ++c7ISPoQC8NMzJiBuVK/ 3aIeqTfmwpBO+u7NFpnwIelg== X-Received: by 2002:a17:90a:e18b:b0:398:ab03:95b2 with SMTP id 98e67ed59e1d1-39b26155274mr35334137a91.10.1788813259517; Mon, 07 Sep 2026 13:34:19 -0700 (PDT) X-Received: by 2002:a17:90a:e18b:b0:398:ab03:95b2 with SMTP id 98e67ed59e1d1-39b26155274mr35334090a91.10.1788813258964; Mon, 07 Sep 2026 13:34: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-3339af25062sm47841297eec.16.2026.09.07.13.34.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 13:34:18 -0700 (PDT) From: Pooventhiran G Date: Tue, 08 Sep 2026 01:59:26 +0530 Subject: [PATCH wireless-next 17/18] 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: <20260908-smd-v1-17-65ad4ab30fbd@oss.qualcomm.com> References: <20260908-smd-v1-0-65ad4ab30fbd@oss.qualcomm.com> In-Reply-To: <20260908-smd-v1-0-65ad4ab30fbd@oss.qualcomm.com> To: "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Johannes Berg Cc: linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-wireless@vger.kernel.org, Pooventhiran G X-Mailer: b4 0.14.3 X-Authority-Analysis: v=2.4 cv=Ga8nWwXL c=1 sm=1 tr=0 ts=6a9f1fcc cx=c_pps a=UNFcQwm+pnOIJct1K4W+Mw==:117 a=Ou0eQOY4+eZoSc0qltEV5Q==:17 a=IkcTkHD0fZMA:10 a=VdqzKS8jKosA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=rJkE3RaqiGZ5pbrm-msn:22 a=EUspDBNiAAAA:8 a=hdw18t4awISUpvPuE2cA:9 a=QEXdDO2ut3YA:10 a=uKXjsCUrEbL0IQVhDsJ9:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA3MDIyNiBTYWx0ZWRfX0bOWP5e2rq2z GEto9AVEmhN9IO0aBp0okxIkQMV/3AQCY+9kFfu8rFpT1G09+79UnzhnaJGJ/3MNBLzazTAeE4O ZyJG2M7aT7DGpGq249jElDmgd1pMP8Fl8gKbN3ViThpmqWeIdjsYw5mHLzGkanYpT84USm81qiX abLy9/bz6VT3VRIaB1D87jrxPKT4xz+Gd/yRR0plt/u31XwNDyygsSNdmPKfirMCnp7OMC/yiVx AhDb1EF3unQpW6VftcvbdMYE9gDW830QEXlSQ4oHtd+VP8FfXUu1dlLrQLOx1H9PLwRu5CdYoi/ axJlO9GECvZIhQZBccCcP5MAEn6biuXMQTzkycdkcuz0zqiVjufDAIVr0Qh6GJaYz9iP0eZ771f AD0+/7LMV+Ioyvm9OtdsBRDzOz2D9izQK6qriETlPEGrW39zRBQ3STbUKgot3VwDdK78Mq+2ZpG VxLKBd7VsKrT9UAdZQA== X-Proofpoint-ORIG-GUID: rf_yeAt3TCsrzRTRv0fRJvBD8b4-s3ul X-Proofpoint-GUID: rf_yeAt3TCsrzRTRv0fRJvBD8b4-s3ul X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA3MDIyNiBTYWx0ZWRfX8v2tzIzomFbd qoC01TPaoE/RExU/lsLDPY1R4wGDB4fi4BYntEIIYCH7Ax589mJfRPIDLyW8Y3Zg9vx/HclpJBk 7BaSyvamHStwsmHWEbAXl5sShdtzqSU= 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-07_05,2026-09-07_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 malwarescore=0 phishscore=0 suspectscore=0 clxscore=1015 impostorscore=0 bulkscore=0 spamscore=0 lowpriorityscore=0 priorityscore=1501 adultscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609070226 During SMD BSS Transition (ST), 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 | 32 +++++++++++ net/wireless/nl80211.c | 143 ++++++++++++++++++++++++++++++++++++++++++++= ++-- net/wireless/nl80211.h | 9 +++ net/wireless/rdev-ops.h | 14 +++++ net/wireless/trace.h | 26 +++++++++ 7 files changed, 298 insertions(+), 4 deletions(-) diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index b68f5f6837be..d72d1feb0ae3 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h @@ -4898,6 +4898,33 @@ 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]; +}; + +/** + * 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 (@st_info or @st_info->ctx may be NUL= L 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); + /** * struct cfg80211_ops - backend description for wireless configuration * @@ -5333,6 +5360,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); @@ -5714,6 +5743,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 /* @@ -7286,6 +7318,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; @@ -7405,6 +7439,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 @@ -11081,4 +11119,19 @@ 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); + #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..fa60e391f9bc 100644 --- a/net/wireless/mlme.c +++ b/net/wireless/mlme.c @@ -1475,3 +1475,35 @@ 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 && st_info->ctx) ? st_info : + NULL); + + 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 70b8697e5dac..47454ea2983b 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c @@ -19585,8 +19585,7 @@ static size_t _nl80211_smd_ctx_nl_ba_param_size(voi= d) 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; @@ -19698,8 +19697,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; @@ -20493,6 +20492,95 @@ 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; + } + /* + * Concurrent NL80211_CMD_GET_SMD_CTX commands are serialized by + * wiphy_lock in nl80211_pre_doit, so safe to unlock here. + */ + 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 in + * cfg80211_get_smd_ctx_done() or 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); @@ -21401,6 +21489,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 { @@ -24426,6 +24520,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 && 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 && 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..26e647dff866 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 +void +nl80211_notify_get_smd_ctx_done(struct wireless_dev *wdev, + const u8 *sta_addr, + struct cfg80211_smd_transition_info *st_info); + +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); + #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 Fri Sep 25 23:09:24 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 AFDB3530DF7 for ; Mon, 7 Sep 2026 20:34:27 +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=1788813271; cv=none; b=pCIWy8optjy0fJtsCK4AJGUDFx75ECA7A3pg4ujjRqiSEo/u6uUx7Ed/aNPSYznt2gKr/r6O7yPhFeB1egmiqSqqVgRjQKqywfGZfIvOXDFgmDo9xMzdYt4sSjEo4WGnEhvG4h38kgyGEaAQOZRqEHd70ECUmd63YRZNvQQ+1nA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788813271; c=relaxed/simple; bh=FQBKNG1LQN+Or7ubGtjxhGSxqu1NLRi2ZcAg1jgnpUg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=RA1XXeFxPdPKWEgOfRs6wPgbOymkhGqR+UVpo/ahWXe+vMf5QUiu6hMBkGdL5meyZ7vn9eI8IHuJ0liAnib45P8J1two2ymo9F1jOcTVD6Fn794zC6lEx5AYUyBDzZJ7b3YsFQ5sZo5J4FqppX+5nyzlsAK0arMcgwNR40L1XM0= 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=OoC2xGnw; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=G+u0tUHX; 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="OoC2xGnw"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="G+u0tUHX" 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 687HaZqP1109733 for ; Mon, 7 Sep 2026 20:34:24 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= tJrfU3MojC9W8Hc4my3vk6BlrKJp8pREKh3Df4ly1FA=; b=OoC2xGnwIVw6+/zZ YxCdpugcl1dqQF7oeAl0Woy+xsNAbcrpS3How7xgwvFlmMivmSDKD1m4A8p6gFaw lmbqNMzvXFJ+UysU+cBoneggQhjbTZqatOqXVxFcL9aa72vQKZSZFgwFFgp8W225 qKQ9EyIvr7H3jXCxqLsYWSAMi1T+MizyceS9FcrFVSKtdIiENX8idaa43/JZA7GC X+ABngcgEW5MkJhrzyK2K4AWyCCMefZIkS/X7c1700R/IUL3P/tI/5szjMnxFkIC ct7roYKVwtSpD+OUbhF4fe2YBPgPmXQjYTcnLUWG8MmqCOY1GIOzvpCNq75l28+C cKJGPQ== Received: from mail-pl1-f200.google.com (mail-pl1-f200.google.com [209.85.214.200]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4ghtdqj9u5-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 07 Sep 2026 20:34:24 +0000 (GMT) Received: by mail-pl1-f200.google.com with SMTP id d9443c01a7336-2db22383e8fso40387415ad.1 for ; Mon, 07 Sep 2026 13:34:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1788813263; x=1789418063; 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=tJrfU3MojC9W8Hc4my3vk6BlrKJp8pREKh3Df4ly1FA=; b=G+u0tUHXHB2yPT7hkdqvLOgH9IjLDnGbJ0oWvFmX/MJg0/MU/erCHwppJOLz+B/IHl uxaWDZzDaSZk9utDQoZwuI5ar1xtoUHo7mOejggMpy2JYu/8mW/RSNehzMP7EHXF0XEg ovj6342iZH+IQyqyMvk1Wb6ZqQSzENx+VSBI9etuPvhwo3ZOEDf67yFyPMcwlFbJeGen hLdldVwPkERXHer+hHQ9a5tWXtXepTyEBcS1bcn2eW7z97GjFWWopmGtncf5qe5HZKVT PhIAoMZhqOxWrE9kCtgJqfIJmkz/AwtS0UXuvrJTIyLL9YUzijvgOoFa4VKvwN68v4y+ /8FA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788813263; x=1789418063; 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=tJrfU3MojC9W8Hc4my3vk6BlrKJp8pREKh3Df4ly1FA=; b=RAlruVtF3jA6lm8T83/032DH2deauClF+Qp6MQbzNpCpiAhSpVcXKUDR/36+aTVc9e KYhPrmK3X5oUNV9HA5TE97YgOVdlH6DTTgXQDoViMvX6MgRDvtbhcq/dX7NjkHKHSfjt 1TmkJGTvI4KdY9jUjIsrKibp3NaHahDt7G0Y3aUoEx6qHGzznWScL0KyA3wu9t/ps4u1 pcxZNt8Lin2i+1rqBtjFuXExn5lz+/8MjZ6KOBMeXq/ytW/jHhf8ripThV38JzUTwsdk etI9AWuHn92U0g8v5yR8GYbqDyTMor5Q1/yqAqU9FfUmneuCQ1dWxkmbNsT+nlTailhC nnuw== X-Gm-Message-State: AFuF++kzTvD+Y5Y2UY6fVlmkUbhBHb0Pt/gHc2Fu5EtxJw72YJuvoUUB su9eTKQHWhYvbZx02BchJ7jlExjpZLVpi9I0dX3bti3e5kLa6KOREmK5Dy8xMuzuUZVHSV5EoC8 kN1Jm3+tDGHY7KAWOrdNxAH1+5+NrYF5qhlATp9v/4241dmNIwMLG6WZmC73mzpJikQ== X-Gm-Gg: AYBFou2HKXPAv2eujQE9++WTs2HWepnqBdhHHY4zHdyBxEOAnCz9GOBbAGJaTkMwk8g 5uDKQzdWKof4IwOBQEHGw56xAJ+K4Klo5IAYG7OgPpPchuAAvh5KWcrm7z2n21lalTCaV+I7Dc1 qvOZN78zoeTDQ5juD+CTDkppDZ13LIqeD3O3xprTe2vOupYHrAWDwmKVw038g4MNDl8j2CFatjs xOEm3Et17c/ha0YZXNfhPpe1OWQrqTnYounWyQu935Hzi4uUwDEd0IIO+Iq0k9kflWq40RxZNGH zVC4ZiwAXPevRHneGr3HkCbINF4IRreVvE+hJJ9spMROEN6fa814qsrZAprEQR9b0swDYzsAHz8 xS/U8U98VBKMQUGLREbjgW7MSQ480e8wnT+lciyenONFS8jDF15yRbvu1W/58lpQERKX2tkHpbn 1ITgToTHb55Mx4kc20xyQ2LQ== X-Received: by 2002:a17:902:c951:b0:2d9:2b1b:878a with SMTP id d9443c01a7336-2dafaf60ec2mr291623945ad.10.1788813263338; Mon, 07 Sep 2026 13:34:23 -0700 (PDT) X-Received: by 2002:a17:902:c951:b0:2d9:2b1b:878a with SMTP id d9443c01a7336-2dafaf60ec2mr291623525ad.10.1788813262835; Mon, 07 Sep 2026 13:34:22 -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-3339af25062sm47841297eec.16.2026.09.07.13.34.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 13:34:22 -0700 (PDT) From: Pooventhiran G Date: Tue, 08 Sep 2026 01:59:27 +0530 Subject: [PATCH wireless-next 18/18] 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: <20260908-smd-v1-18-65ad4ab30fbd@oss.qualcomm.com> References: <20260908-smd-v1-0-65ad4ab30fbd@oss.qualcomm.com> In-Reply-To: <20260908-smd-v1-0-65ad4ab30fbd@oss.qualcomm.com> To: "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , Johannes Berg Cc: linux-kernel@vger.kernel.org, netdev@vger.kernel.org, linux-wireless@vger.kernel.org, Pooventhiran G X-Mailer: b4 0.14.3 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwOTA3MDIyNiBTYWx0ZWRfX4dNvSSs28eV/ zDLT4VDRNpHuK8lm0oL3f0mhAyINfwYxB11fnsVOTqwtdL53qGBh+KQq7ktestmraAtb283kNGQ nSW7w0k0X5c1katapiTsGC4zxoMuPin95t9riDLyuFHL9kFlkUPtFRypfNi1u5PgN26TmxmIq3r 4Aied+mjdIoqwrH6orprLfpcIKgDI/WosXhhU37rKbFupXj0tt7GzFi89Z7HeAlIopsUdyF51rF 8Ul6tOcNiDfZSoitfJ4B4C9wd6mS7KGOxuUjHKzq1Y8OoiwgCEB7vxdCmZ4OW9z796DGE3U2n2R qMqleGfh9oOVMqMY1gbhE6KvEvuVs4hUPko7ABm5Ge95g9vNWYo19NVhBLCGHUmyaoWh0U7tiJu fCjMgJvs4vLD4ejMKhC7VG0xdvheNhD/qQ5n2sOCib1Mt29QcV7tdzmuXLia4wQTY9o2ls2emk9 +TmNbX+zLeMSiWerv0A== X-Proofpoint-Spam-Info: AW1haW4tMjYwOTA3MDIyNiBTYWx0ZWRfX8bm0n90YyiEr iJkEq7thfQ/HrfgSsUNBDcU3ri7aGMPl/r70wZ20TKrCG3sFG/1+/aA778NPZo5jYrYjD5zYWiO Dvm4rnAV7nacPq+2IFPK+XCOMTMLN5A= X-Proofpoint-ORIG-GUID: ZohPbF-A7ksPzwRaRh3Q23A6G3XXte_0 X-Authority-Analysis: v=2.4 cv=U6aiy+ru c=1 sm=1 tr=0 ts=6a9f1fd0 cx=c_pps a=IZJwPbhc+fLeJZngyXXI0A==: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=c93CP5vvwBK-QZUl55wA:9 a=QEXdDO2ut3YA:10 a=uG9DUKGECoFWVXl0Dc02:22 X-Proofpoint-GUID: ZohPbF-A7ksPzwRaRh3Q23A6G3XXte_0 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-07_05,2026-09-07_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 adultscore=0 impostorscore=0 phishscore=0 clxscore=1011 lowpriorityscore=0 malwarescore=0 priorityscore=1501 spamscore=0 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2606150000 definitions=main-2609070226 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. Implement the get_smd_ctx cfg80211_op in mac80211 to invoke the driver to collect the requested station context. Because context collection is asynchronous, the driver signals completion later via ieee80211_get_smd_ctx_done(), which packs the collected 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 | 23 +++++++++++++++++++++++ net/mac80211/cfg.c | 34 ++++++++++++++++++++++++++++++++++ net/mac80211/driver-ops.h | 24 ++++++++++++++++++++++++ net/mac80211/sta_info.c | 6 ++++++ net/mac80211/trace.h | 27 +++++++++++++++++++++++++++ 5 files changed, 114 insertions(+) diff --git a/include/net/mac80211.h b/include/net/mac80211.h index e0e13f0ed31f..f16112e41594 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h @@ -2528,6 +2528,21 @@ enum ieee80211_sta_state { IEEE80211_STA_AUTHORIZED, }; =20 +/** + * 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 (@st_info or @st_info->ctx may be NUL= L to + * indicate failure). @st_info is owned by the driver. + * + * Called by the driver after the %NL80211_CMD_GET_SMD_CTX context collect= ion + * is complete. mac80211 forwards the result to cfg80211 which finds the p= ending + * nl80211 request and sends reply to userspace. + */ +void ieee80211_get_smd_ctx_done(struct ieee80211_vif *vif, + const u8 *sta_addr, + struct cfg80211_smd_transition_info *st_info); + /** * enum ieee80211_sta_rx_bandwidth - station RX bandwidth * @IEEE80211_STA_RX_BW_20: station can only receive 20 MHz @@ -4782,6 +4797,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, @@ -5191,6 +5211,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 /** diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c index 268d5f42293a..a33ce96a4752 100644 --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c @@ -6104,6 +6104,39 @@ 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 || !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, @@ -6223,4 +6256,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