Linux wireless drivers development
 help / color / mirror / Atom feed
From: Johannes Berg <johannes@sipsolutions.net>
To: Priyansha Tiwari <priyansha.tiwari@oss.qualcomm.com>
Cc: linux-wireless@vger.kernel.org, quic_drohan@quicinc.com
Subject: Re: [PATCH wireless-next v2 3/4] wifi: mac80211: add per-link PROBE_PEER support
Date: Tue, 05 May 2026 14:44:52 +0200	[thread overview]
Message-ID: <e62b7868368678b59ce89dddcfc50311ecbf3c2d.camel@sipsolutions.net> (raw)
In-Reply-To: <20260417133124.3412752-4-pritiwa@qti.qualcomm.com>

On Fri, 2026-04-17 at 19:01 +0530, Priyansha Tiwari wrote:
> 
> -			u8 pad2;
> +			u8 link_valid:1, link_id:4, pad2:3;

You don't need to pad bitfields.

> +	if (sdata->vif.type == NL80211_IFTYPE_STATION ||
> +	    sdata->vif.type == NL80211_IFTYPE_P2P_CLIENT) {

Err ...

> +	/* STA/P2P: userspace must NOT provide peer MAC, AP is implied.	 */

> +		if (peer)
> +			return -EINVAL;

That check belongs into cfg80211, not here?

> +		if (!sdata->u.mgd.associated)
> +			return -ENOTCONN;

maybe be consistent, cfg80211 returns -ENOLINK?

> +	} else if (!peer) {
> +		/* AP/GO: must have a peer MAC. */
> +		return -EINVAL;
>  	}
>  
> -	qos = sta->sta.wme;
> +	guard(rcu)();
>  
> -	if (ieee80211_vif_is_mld(&sdata->vif)) {
> -		if (sta->sta.mlo) {
> -			link_id = IEEE80211_LINK_UNSPECIFIED;
> -		} else {
> -			/*
> -			 * For non-MLO clients connected to an AP MLD, band
> -			 * information is not used; instead, sta->deflink is
> -			 * used to send packets.
> -			 */
> -			link_id = sta->deflink.link_id;
> +	if (sdata->vif.type == NL80211_IFTYPE_AP ||
> +	    sdata->vif.type == NL80211_IFTYPE_P2P_GO) {

Again, what?

And unrelated, maybe this would all be better as a switch statement?

> +		sta = sta_info_get_bss(sdata, peer);
> +		if (!sta)
> +			return -ENOLINK;
>  
> -			conf = rcu_dereference(sdata->vif.link_conf[link_id]);
> +		qos = sta->sta.wme;
>  
> -			if (unlikely(!conf)) {
> -				ret = -ENOLINK;
> -				goto unlock;
> +		if (ieee80211_vif_is_mld(&sdata->vif)) {
> +			if (sta->sta.mlo) {
> +				link_id = IEEE80211_LINK_UNSPECIFIED;
> +			} else {
> +				/*
> +				 * For non-MLO clients connected to an AP MLD,
> +				 * use the link address for the client's link.
> +				 */
> +				link_id = sta->deflink.link_id;
> +				conf = rcu_dereference(sdata->vif.link_conf[link_id]);
> +				if (unlikely(!conf))
> +					return -ENOLINK;
>  			}
> +			/* MLD transmissions must not rely on the band */
> +			band = 0;
> +		} else {
> +			chanctx_conf = rcu_dereference(sdata->vif.bss_conf.chanctx_conf);
> +			if (WARN_ON(!chanctx_conf))
> +				return -EINVAL;
> +			band = chanctx_conf->def.chan->band;
> +			link_id = 0;
> +		}
> +
> +		size = sizeof(*nullfunc);
> +		fc = cpu_to_le16(IEEE80211_FTYPE_DATA |
> +				 (qos ? IEEE80211_STYPE_QOS_NULLFUNC
> +				      : IEEE80211_STYPE_NULLFUNC) |
> +				 IEEE80211_FCTL_FROMDS);
> +		if (!qos)
> +			size -= 2;
> +
> +		skb = dev_alloc_skb(local->hw.extra_tx_headroom + size);
> +		if (!skb)
> +			return -ENOMEM;
> +
> +		skb->dev = dev;
> +		skb_reserve(skb, local->hw.extra_tx_headroom);
> +
> +		nullfunc = skb_put(skb, size);
> +		memset(nullfunc, 0, size);
> +		nullfunc->frame_control = fc;
> +
> +		memcpy(nullfunc->addr1, sta->sta.addr, ETH_ALEN);
> +		if (ieee80211_vif_is_mld(&sdata->vif) && !sta->sta.mlo) {
> +			memcpy(nullfunc->addr2, conf->addr, ETH_ALEN);
> +			memcpy(nullfunc->addr3, conf->addr, ETH_ALEN);
> +		} else {
> +			memcpy(nullfunc->addr2, sdata->vif.addr, ETH_ALEN);
> +			memcpy(nullfunc->addr3, sdata->vif.addr, ETH_ALEN);
> +		}
> +
> +		info = IEEE80211_SKB_CB(skb);
> +		info->flags |= IEEE80211_TX_CTL_REQ_TX_STATUS |
> +			       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)
> +			nullfunc->qos_ctrl = cpu_to_le16(7);
> +
> +		ret = ieee80211_attach_ack_skb(local, skb, cookie, GFP_ATOMIC);
> +		if (ret) {
> +			kfree_skb(skb);
> +			return ret;
>  		}
> -		/* MLD transmissions must not rely on the band */
> +
> +		local_bh_disable();
> +		ieee80211_xmit(sdata, sta, skb);
> +		local_bh_enable();
> +
> +		return 0;
> +	}
> +
> +	/*
> +	 * STA/P2P: send a nullfunc to probe the AP/peer.
> +	 * For MLO, let the driver/firmware decide which link to use.
> +	 */
> +	if (ieee80211_vif_is_mld(&sdata->vif)) {
> +		link_id = IEEE80211_LINK_UNSPECIFIED;
> +		peer_addr = sdata->vif.cfg.ap_addr;
> +		src_addr = sdata->vif.addr;
>  		band = 0;
> +		sta = sta_info_get(sdata, sdata->vif.cfg.ap_addr);
>  	} else {
> -		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;
>  		link_id = 0;
> +		conf = rcu_dereference(sdata->vif.link_conf[0]);
> +		if (!conf)
> +			return -ENOLINK;
> +		band = conf->chanreq.oper.chan->band;
> +		peer_addr = conf->bssid;
> +		src_addr = conf->addr;
> +		sta = sta_info_get_bss(sdata, peer_addr);
>  	}

I really don't like the layout and code duplication here. Off-hand I'd
think the duplication isn't needed, but otherwise perhaps it should be
in separate functions or so.

johannes

  reply	other threads:[~2026-05-05 12:44 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-04-17 13:31 [PATCH wireless-next v2 0/4] wifi: nl80211: introduce PROBE_PEER for AP and STA with MLO support Priyansha Tiwari
2026-04-17 13:31 ` [PATCH wireless-next v2 1/4] wifi: nl80211: rename PROBE_CLIENT to PROBE_PEER and add STA-side probing support Priyansha Tiwari
2026-05-05 12:37   ` Johannes Berg
2026-04-17 13:31 ` [PATCH wireless-next v2 2/4] wifi: cfg80211/nl80211: rename to probe_peer(), extend probe status, and update in-tree users Priyansha Tiwari
2026-05-05 12:39   ` Johannes Berg
2026-04-17 13:31 ` [PATCH wireless-next v2 3/4] wifi: mac80211: add per-link PROBE_PEER support Priyansha Tiwari
2026-05-05 12:44   ` Johannes Berg [this message]
2026-04-17 13:31 ` [PATCH wireless-next v2 4/4] wifi: mac80211_hwsim: report TX status link_id Priyansha Tiwari

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=e62b7868368678b59ce89dddcfc50311ecbf3c2d.camel@sipsolutions.net \
    --to=johannes@sipsolutions.net \
    --cc=linux-wireless@vger.kernel.org \
    --cc=priyansha.tiwari@oss.qualcomm.com \
    --cc=quic_drohan@quicinc.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