[PATCH wireless-next 03/18] wifi: nl80211: Add kernel interfaces for Seamless Mobility Domain setup
From: Pooventhiran G <hidden>
Date: 2026-09-07 20:33:26
Also in:
linux-wireless, lkml
Subsystem:
802.11 (including cfg80211/nl80211), the rest · Maintainers:
Johannes Berg, Linus Torvalds
From: Aditya Sathish <redacted> 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 <redacted> Co-developed-by: Rohan Dutta <redacted> Signed-off-by: Rohan Dutta <redacted> Signed-off-by: Pooventhiran G <redacted> --- 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 +/* 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 Seamless + * 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 { NL80211_ATTR_STA_DUMP_LINK_STATS, + NL80211_ATTR_SMD_PARAMS, + /* add attributes here, update the policy in nl80211.c */ __NL80211_ATTR_AFTER_LAST,
@@ -9118,4 +9126,91 @@ enum nl80211_nan_peer_map_attrs { #define NL80211_NAN_SCHED_NOT_AVAIL_SLOT 0xff +/** + * enum nl80211_smd_type - Type of the SMD + * + * @NL80211_SMD_TYPE_PER_AP_MLD_MAC_SAP: Separate MAC SAP is used per AP MLD. + * @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 DS. + * 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 = 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 the 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 PTK 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 = 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 the 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 define + * 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 that + * 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 = __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] = { [NL80211_NAN_CONF_NOTIFY_DW] = { .type = NLA_FLAG }, }; +static const struct nla_policy +nl80211_smd_params_policy[NL80211_SMD_PARAMS_ATTR_MAX + 1] = { + [NL80211_SMD_PARAMS_ATTR_IDENTIFIER] = NLA_POLICY_ETH_ADDR, + [NL80211_SMD_PARAMS_ATTR_TIMEOUT] = + NLA_POLICY_MIN(NLA_U16, IEEE80211_SMD_INFO_PREP_TIMEOUT_MIN), + [NL80211_SMD_PARAMS_ATTR_DL_DATA_FORWARDING] = { .type = NLA_FLAG }, + [NL80211_SMD_PARAMS_ATTR_MAX_PEER_APMLDS] = + NLA_POLICY_MAX(NLA_U8, IEEE80211_SMD_INFO_NUM_PREP_AP_MAX), + [NL80211_SMD_PARAMS_ATTR_TYPE] = + NLA_POLICY_MAX(NLA_U8, NL80211_SMD_TYPE_MAX), + [NL80211_SMD_PARAMS_ATTR_PTK_MODE] = + NLA_POLICY_MAX(NLA_U8, NL80211_SMD_PTK_MODE_MAX), + [NL80211_SMD_PARAMS_ATTR_NEIGHBOR_PROBING] = { .type = NLA_FLAG }, +}; + static const struct netlink_range_validation nl80211_punct_bitmap_range = { .min = 0, .max = 0xffff,
@@ -1097,6 +1112,8 @@ static const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = { [NL80211_ATTR_NPCA_PUNCT_BITMAP] = NLA_POLICY_FULL_RANGE(NLA_U32, &nl80211_punct_bitmap_range), [NL80211_ATTR_STA_DUMP_LINK_STATS] = { .type = NLA_FLAG }, + [NL80211_ATTR_SMD_PARAMS] = + NLA_POLICY_NESTED(nl80211_smd_params_policy), }; /* policy for the key attributes */
--
2.34.1