From: Pooventhiran G <pooventhiran.g@oss.qualcomm.com>
To: "David S . Miller" <davem@davemloft.net>,
Eric Dumazet <edumazet@google.com>,
Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
Simon Horman <horms@kernel.org>,
Johannes Berg <johannes@sipsolutions.net>
Cc: linux-kernel@vger.kernel.org, netdev@vger.kernel.org,
linux-wireless@vger.kernel.org,
Pooventhiran G <pooventhiran.g@oss.qualcomm.com>
Subject: [PATCH RESEND wireless-next 17/18] wifi: nl80211/cfg80211: Add support for querying SMD context for target AP MLD
Date: Tue, 8 Sep 2026 22:39:45 +0530 [thread overview]
Message-ID: <20260908-smd-v1-17-9fd2d876a1fb@oss.qualcomm.com> (raw)
In-Reply-To: <20260908-smd-v1-0-9fd2d876a1fb@oss.qualcomm.com>
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 <pooventhiran.g@oss.qualcomm.com>
---
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;
};
+/**
+ * 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 NULL to
+ * indicate failure)
+ *
+ * Called via ieee80211_get_smd_ctx_done after async driver context collection
+ * 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->ctx 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);
};
/*
@@ -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 operate 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;
+ /* protects @smd_get_ctx_pending_list */
+ spinlock_t smd_get_ctx_lock;
+ struct list_head smd_get_ctx_pending_list;
+
u32 radio_mask;
};
@@ -11081,4 +11119,19 @@ void cfg80211_incumbent_signal_notify(struct wiphy *wiphy,
u32 signal_interference_bitmap,
gfp_t gfp);
+/**
+ * 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 the
+ * 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 the
+ * device is brought down or the station is removed prematurely, free up the
+ * 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);
+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 wireless_dev *wdev,
}
}
+ if (wdev->iftype == NL80211_IFTYPE_AP ||
+ wdev->iftype == NL80211_IFTYPE_AP_VLAN)
+ cfg80211_free_pending_smd_ctx_req(wdev, NULL);
+
wdev->connected = false;
}
@@ -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);
#ifdef CONFIG_CFG80211_WEXT
wdev->wext.default_key = -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 = 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 = 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(void)
return n;
}
-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_info)
{
const struct ieee80211_smd_ctx *ctx = st_info->ctx;
int n_dl_tids = 0, n_ul_tids = 0;
@@ -19698,8 +19697,8 @@ nl80211_put_smd_ctx_ba_params(struct sk_buff *msg,
return -ENOBUFS;
}
-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 = NULL, *ul_sn = NULL, *ul_pn = NULL;
struct nlattr *smd_ctx = NULL, *dl = NULL, *ul = NULL;
@@ -20493,6 +20492,95 @@ static int nl80211_set_smd_ctx(struct sk_buff *skb, struct genl_info *info)
return err;
}
+static struct cfg80211_smd_get_ctx_pending *
+__cfg80211_get_smd_sta_pending_ctx(struct wireless_dev *wdev, const u8 *addr)
+{
+ struct cfg80211_smd_get_ctx_pending *pending = 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 = tmp;
+ break;
+ }
+ }
+
+ return pending;
+}
+
+static int nl80211_get_smd_ctx(struct sk_buff *skb, struct genl_info *info)
+{
+ struct cfg80211_registered_device *rdev = info->user_ptr[0];
+ struct net_device *dev = info->user_ptr[1];
+ struct wireless_dev *wdev = dev->ieee80211_ptr;
+ struct cfg80211_smd_get_ctx_pending *pending;
+ enum nl80211_smd_ctx_type type;
+ const u8 *addr = NULL;
+ int err;
+
+ if (!rdev->ops->get_smd_ctx)
+ return -EOPNOTSUPP;
+
+ if (wdev->iftype != NL80211_IFTYPE_AP &&
+ wdev->iftype != 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 = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]);
+ type = 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 = 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 = rdev_get_smd_ctx(rdev, wdev, addr, type);
+ if (err) {
+ /* revert upon failure */
+ spin_lock_bh(&wdev->smd_get_ctx_lock);
+ pending = __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) == (value)) ? NL80211_IFL_SEL_##name :
int __missing_selector(void);
@@ -21401,6 +21489,12 @@ static const struct genl_small_ops nl80211_small_ops[] = {
.internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP |
NL80211_FLAG_CLEAR_SKB),
},
+ {
+ .cmd = NL80211_CMD_GET_SMD_CTX,
+ .doit = nl80211_get_smd_ctx,
+ .flags = GENL_UNS_ADMIN_PERM,
+ .internal_flags = IFLAGS(NL80211_FLAG_NEED_NETDEV_UP),
+ },
};
static struct genl_family nl80211_fam __ro_after_init = {
@@ -24426,6 +24520,47 @@ void cfg80211_nan_channel_evac(struct wireless_dev *wdev,
}
EXPORT_SYMBOL(cfg80211_nan_channel_evac);
+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 = wiphy_to_rdev(wdev->wiphy);
+ struct net_device *dev = wdev->netdev;
+ size_t msg_len = NLMSG_DEFAULT_SIZE;
+ struct sk_buff *msg;
+ void *hdr;
+
+ if (st_info && st_info->ctx)
+ msg_len = 100 + nl80211_smd_ctx_nl_size(st_info) +
+ nla_total_size(ETH_ALEN); /* MLD address */
+
+ msg = nlmsg_new(msg_len, GFP_ATOMIC);
+ if (!msg)
+ return;
+
+ hdr = 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 */
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 genl_info *info);
void nl80211_mlo_reconf_add_done(struct net_device *dev,
struct cfg80211_mlo_reconf_done_data *data);
+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_info);
+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_registered_device *rdev,
return ret;
}
+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 = -EOPNOTSUPP;
+
+ trace_rdev_get_smd_ctx(&rdev->wiphy, wdev, addr, type);
+ if (rdev->ops->get_smd_ctx)
+ ret = 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))
);
+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 = type;
+ ),
+
+ TP_printk(WIPHY_PR_FMT ", " WDEV_PR_FMT
+ ", sta=%pM, ST type=%u",
+ WIPHY_PR_ARG, WDEV_PR_ARG, __entry->sta_addr,
+ __entry->st_type)
+);
+
#endif /* !__RDEV_OPS_TRACE || TRACE_HEADER_MULTI_READ */
#undef TRACE_INCLUDE_PATH
--
2.34.1
next prev parent reply other threads:[~2026-09-08 17:11 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-08 17:09 [PATCH RESEND wireless-next 00/18] wifi: Add Seamless Mobility Domain (SMD) AP support Pooventhiran G
2026-09-08 17:09 ` [PATCH RESEND wireless-next 01/18] net: skbuff: Add SKB extension support to wireless drivers Pooventhiran G
2026-09-08 17:09 ` [PATCH RESEND wireless-next 02/18] wifi: nl80211: Define Seamless Mobility Domain (SMD) device capability Pooventhiran G
2026-09-08 17:09 ` [PATCH RESEND wireless-next 03/18] wifi: nl80211: Add kernel interfaces for Seamless Mobility Domain setup Pooventhiran G
2026-09-08 17:09 ` [PATCH RESEND wireless-next 04/18] wifi: cfg80211/mac80211: Configure AP with SMD capabilities Pooventhiran G
2026-09-08 17:09 ` [PATCH RESEND wireless-next 05/18] wifi: cfg80211/mac80211: Parse SMD parameters in STA addition/modification Pooventhiran G
2026-09-08 17:09 ` [PATCH RESEND wireless-next 06/18] wifi: nl80211/cfg80211: Indicate STA creation via SMD BSS Transition Pooventhiran G
2026-09-08 17:09 ` [PATCH RESEND wireless-next 07/18] wifi: nl80211/mac80211: Add SMD BSS Transition sub-state STA flags Pooventhiran G
2026-09-08 17:09 ` [PATCH RESEND wireless-next 08/18] wifi: mac80211: Add driver_op for SMD substate changes Pooventhiran G
2026-09-08 17:09 ` [PATCH RESEND wireless-next 09/18] wifi: mac80211: Send BlockAck policy in AMPDU action Pooventhiran G
2026-09-08 17:09 ` [PATCH RESEND wireless-next 10/18] wifi: mac80211: Define SMD BSS Transition context for transport Pooventhiran G
2026-09-08 17:09 ` [PATCH RESEND wireless-next 11/18] wifi: mac80211: Enable skb extensions along with mac80211 Pooventhiran G
2026-09-08 17:09 ` [PATCH RESEND wireless-next 12/18] wifi: nl80211: Define attributes to pack SMD BSS Transition context Pooventhiran G
2026-09-08 17:09 ` [PATCH RESEND wireless-next 13/18] wifi: cfg80211/mac80211: Handle UHR Link Reconfiguration frame Pooventhiran G
2026-09-08 17:09 ` [PATCH RESEND wireless-next 14/18] wifi: nl80211: Pack SMD dynamic context along with frame Pooventhiran G
2026-09-08 17:09 ` [PATCH RESEND wireless-next 15/18] wifi: nl80211/cfg80211: Add support for SMD context programming Pooventhiran G
2026-09-08 17:09 ` [PATCH RESEND wireless-next 16/18] wifi: mac80211: Add mac80211 support to handle NL80211_CMD_SET_SMD_CTX Pooventhiran G
2026-09-08 17:09 ` Pooventhiran G [this message]
2026-09-08 17:09 ` [PATCH RESEND wireless-next 18/18] wifi: mac80211: Add mac80211 support to handle NL80211_CMD_GET_SMD_CTX Pooventhiran G
2026-09-08 19:50 ` [PATCH RESEND wireless-next 00/18] wifi: Add Seamless Mobility Domain (SMD) AP support Jakub Kicinski
2026-09-08 19:51 ` Johannes Berg
2026-09-08 19:57 ` Johannes Berg
2026-09-08 20:20 ` Jakub Kicinski
2026-09-08 20:27 ` Johannes Berg
2026-09-09 0:20 ` Jeff Johnson
2026-09-09 5:53 ` Johannes Berg
2026-09-09 14:12 ` Jeff Johnson
2026-09-09 17:25 ` Pooventhiran G
2026-09-09 8:34 ` Paolo Abeni
2026-09-09 20:13 ` Jakub Kicinski
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260908-smd-v1-17-9fd2d876a1fb@oss.qualcomm.com \
--to=pooventhiran.g@oss.qualcomm.com \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=horms@kernel.org \
--cc=johannes@sipsolutions.net \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-wireless@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox