diff mbox series

mac80211: support poll sta for ML clients

Message ID 20230119135036.17709-1-quic_srirrama@quicinc.com (mailing list archive)
State Superseded
Delegated to: Johannes Berg
Headers show
Series mac80211: support poll sta for ML clients | expand

Commit Message

Sriram R Jan. 19, 2023, 1:50 p.m. UTC
Update the client probe handling which sends Null data
frames to check inactivity to support ML Stations as well.

Replace the use of default bss conf with the link specific
conf and use the stations default link to send the probe
frame. Non ML Stations associated to the ML AP would use
its default link as well which is one of the active links.

For Non ML AP, the default link id is 0 and it is taken care
as well.

Signed-off-by: Sriram R <quic_srirrama@quicinc.com>
---
 net/mac80211/cfg.c | 35 +++++++++++++++++++++++++++--------
 1 file changed, 27 insertions(+), 8 deletions(-)
diff mbox series

Patch

diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
index c885076fae89..72df8c708a2d 100644
--- a/net/mac80211/cfg.c
+++ b/net/mac80211/cfg.c
@@ -3980,17 +3980,13 @@  static int ieee80211_probe_client(struct wiphy *wiphy, struct net_device *dev,
 	struct ieee80211_chanctx_conf *chanctx_conf;
 	enum nl80211_band band;
 	int ret;
+	u8 link_id;
+	struct ieee80211_bss_conf *conf;
 
 	/* the lock is needed to assign the cookie later */
 	mutex_lock(&local->mtx);
 
 	rcu_read_lock();
-	chanctx_conf = rcu_dereference(sdata->vif.bss_conf.chanctx_conf);
-	if (WARN_ON(!chanctx_conf)) {
-		ret = -EINVAL;
-		goto unlock;
-	}
-	band = chanctx_conf->def.chan->band;
 	sta = sta_info_get_bss(sdata, peer);
 	if (sta) {
 		qos = sta->sta.wme;
@@ -3999,6 +3995,27 @@  static int ieee80211_probe_client(struct wiphy *wiphy, struct net_device *dev,
 		goto unlock;
 	}
 
+	/* In case of ML vif, we shall use the default sta link to
+	 * send the probe frame. For non ML vif the link id 0 is
+	 * the deflink
+	 */
+	link_id = sta->deflink.link_id;
+
+	conf = rcu_dereference(sdata->vif.link_conf[link_id]);
+
+	if (unlikely(!conf)) {
+		ret = -ENOLINK;
+		goto unlock;
+	}
+
+	chanctx_conf = rcu_dereference(conf->chanctx_conf);
+	if (WARN_ON(!chanctx_conf)) {
+		ret = -EINVAL;
+		goto unlock;
+	}
+
+	band = chanctx_conf->def.chan->band;
+
 	if (qos) {
 		fc = cpu_to_le16(IEEE80211_FTYPE_DATA |
 				 IEEE80211_STYPE_QOS_NULLFUNC |
@@ -4024,8 +4041,8 @@  static int ieee80211_probe_client(struct wiphy *wiphy, struct net_device *dev,
 	nullfunc->frame_control = fc;
 	nullfunc->duration_id = 0;
 	memcpy(nullfunc->addr1, sta->sta.addr, ETH_ALEN);
-	memcpy(nullfunc->addr2, sdata->vif.addr, ETH_ALEN);
-	memcpy(nullfunc->addr3, sdata->vif.addr, ETH_ALEN);
+	memcpy(nullfunc->addr2, conf->addr, ETH_ALEN);
+	memcpy(nullfunc->addr3, conf->addr, ETH_ALEN);
 	nullfunc->seq_ctrl = 0;
 
 	info = IEEE80211_SKB_CB(skb);
@@ -4034,6 +4051,8 @@  static int ieee80211_probe_client(struct wiphy *wiphy, struct net_device *dev,
 		       IEEE80211_TX_INTFL_NL80211_FRAME_TX;
 	info->band = band;
 
+	info->control.flags |= u32_encode_bits(link_id, IEEE80211_TX_CTRL_MLO_LINK);
+
 	skb_set_queue_mapping(skb, IEEE80211_AC_VO);
 	skb->priority = 7;
 	if (qos)