[PATCH wireless-next] wifi: mac80211: consider links for validating SCAN_FLAG_AP in scan request during MLO

Aditya Kumar Singh posted 1 patch 6 months, 3 weeks ago
There is a newer version of this series
net/mac80211/cfg.c | 38 ++++++++++++++++++++++++++++++++++----
1 file changed, 34 insertions(+), 4 deletions(-)
[PATCH wireless-next] wifi: mac80211: consider links for validating SCAN_FLAG_AP in scan request during MLO
Posted by Aditya Kumar Singh 6 months, 3 weeks ago
Commit 78a7a126dc5b ("wifi: mac80211: validate SCAN_FLAG_AP in scan request
during MLO") introduced a check that rejects scan requests if any link is
already beaconing. This works fine when all links share the same radio, but
breaks down in multi-radio setups.

Consider a scenario where a 2.4 GHz link is beaconing and a scan is
requested on a 5 GHz link, each backed by a different physical radio. The
current logic still blocks the scan, even though it should be allowed. As a
result, interface bring-up fails unnecessarily in valid configurations.

Fix this by checking whether the scan is being requested on the same
underlying radio as the beaconing link. Only reject the scan if it targets
a link that is already beaconing and the SCAN_FLAG_AP is not set. This
ensures correct behavior in multi-radio environments and avoids false
rejections.

Fixes: 78a7a126dc5b ("wifi: mac80211: validate SCAN_FLAG_AP in scan request during MLO")
Signed-off-by: Aditya Kumar Singh <aditya.kumar.singh@oss.qualcomm.com>
---
Depends-on: https://lore.kernel.org/all/20250527-mlo-dfs-acs-v2-0-92c2f37c81d9@quicinc.com/
---
 net/mac80211/cfg.c | 38 ++++++++++++++++++++++++++++++++++----
 1 file changed, 34 insertions(+), 4 deletions(-)

diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c
index d9d88f2f283120ba366401d3ac546e59d8c61c21..22bbe1f4bfc3e2248e6c376c8a465da924180e0f 100644
--- a/net/mac80211/cfg.c
+++ b/net/mac80211/cfg.c
@@ -2897,6 +2897,10 @@ static int ieee80211_scan(struct wiphy *wiphy,
 			  struct cfg80211_scan_request *req)
 {
 	struct ieee80211_sub_if_data *sdata;
+	struct ieee80211_link_data *link;
+	struct ieee80211_channel *chan;
+	int radio_idx;
+	u8 link_id;
 
 	sdata = IEEE80211_WDEV_TO_SUB_IF(req->wdev);
 
@@ -2924,10 +2928,36 @@ static int ieee80211_scan(struct wiphy *wiphy,
 		 * the frames sent while scanning on other channel will be
 		 * lost)
 		 */
-		if (ieee80211_num_beaconing_links(sdata) &&
-		    (!(wiphy->features & NL80211_FEATURE_AP_SCAN) ||
-		     !(req->flags & NL80211_SCAN_FLAG_AP)))
-			return -EOPNOTSUPP;
+		for (link_id = 0; link_id < IEEE80211_MLD_MAX_NUM_LINKS;
+		     link_id++) {
+			link = sdata_dereference(sdata->link[link_id], sdata);
+			if (!link)
+				continue;
+
+			/* if the link is not beaconing, ignore it */
+			if (!sdata_dereference(link->u.ap.beacon, sdata))
+				continue;
+
+			/* If we are here then at least one of the link is
+			 * beaconing and since radio level information is
+			 * not present or single underlying radio is present,
+			 * no point in checking further and hence return if
+			 * flag requirements are not met.
+			 */
+			if (wiphy->n_radio < 2 &&
+			    (!(wiphy->features & NL80211_FEATURE_AP_SCAN) ||
+			     !(req->flags & NL80211_SCAN_FLAG_AP)))
+				return -EOPNOTSUPP;
+
+			chan = link->conf->chanreq.oper.chan;
+			radio_idx = cfg80211_get_radio_idx_by_chan(wiphy, chan);
+
+			if (ieee80211_is_radio_idx_in_scan_req(wiphy, req,
+							       radio_idx) &&
+			    (!(wiphy->features & NL80211_FEATURE_AP_SCAN) ||
+			     !(req->flags & NL80211_SCAN_FLAG_AP)))
+				return -EOPNOTSUPP;
+		}
 		break;
 	case NL80211_IFTYPE_NAN:
 	default:

---
base-commit: ea15e046263b19e91ffd827645ae5dfa44ebd044
change-id: 20250527-fix_scan_ap_flag_requirement_during_mlo-d9bce1b859a1
Re: [PATCH wireless-next] wifi: mac80211: consider links for validating SCAN_FLAG_AP in scan request during MLO
Posted by kernel test robot 6 months, 3 weeks ago
Hi Aditya,

kernel test robot noticed the following build errors:

[auto build test ERROR on ea15e046263b19e91ffd827645ae5dfa44ebd044]

url:    https://github.com/intel-lab-lkp/linux/commits/Aditya-Kumar-Singh/wifi-mac80211-consider-links-for-validating-SCAN_FLAG_AP-in-scan-request-during-MLO/20250528-113350
base:   ea15e046263b19e91ffd827645ae5dfa44ebd044
patch link:    https://lore.kernel.org/r/20250528-fix_scan_ap_flag_requirement_during_mlo-v1-1-35ac0e3a2f7b%40oss.qualcomm.com
patch subject: [PATCH wireless-next] wifi: mac80211: consider links for validating SCAN_FLAG_AP in scan request during MLO
config: arm-randconfig-003-20250528 (https://download.01.org/0day-ci/archive/20250528/202505281853.CBjCB3yV-lkp@intel.com/config)
compiler: clang version 19.1.7 (https://github.com/llvm/llvm-project cd708029e0b2869e80abe31ddb175f7c35361f90)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250528/202505281853.CBjCB3yV-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202505281853.CBjCB3yV-lkp@intel.com/

All errors (new ones prefixed by >>):

>> net/mac80211/cfg.c:2953:16: error: call to undeclared function 'cfg80211_get_radio_idx_by_chan'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
    2953 |                         radio_idx = cfg80211_get_radio_idx_by_chan(wiphy, chan);
         |                                     ^
>> net/mac80211/cfg.c:2955:8: error: call to undeclared function 'ieee80211_is_radio_idx_in_scan_req'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
    2955 |                         if (ieee80211_is_radio_idx_in_scan_req(wiphy, req,
         |                             ^
   2 errors generated.


vim +/cfg80211_get_radio_idx_by_chan +2953 net/mac80211/cfg.c

  2895	
  2896	static int ieee80211_scan(struct wiphy *wiphy,
  2897				  struct cfg80211_scan_request *req)
  2898	{
  2899		struct ieee80211_sub_if_data *sdata;
  2900		struct ieee80211_link_data *link;
  2901		struct ieee80211_channel *chan;
  2902		int radio_idx;
  2903		u8 link_id;
  2904	
  2905		sdata = IEEE80211_WDEV_TO_SUB_IF(req->wdev);
  2906	
  2907		switch (ieee80211_vif_type_p2p(&sdata->vif)) {
  2908		case NL80211_IFTYPE_STATION:
  2909		case NL80211_IFTYPE_ADHOC:
  2910		case NL80211_IFTYPE_MESH_POINT:
  2911		case NL80211_IFTYPE_P2P_CLIENT:
  2912		case NL80211_IFTYPE_P2P_DEVICE:
  2913			break;
  2914		case NL80211_IFTYPE_P2P_GO:
  2915			if (sdata->local->ops->hw_scan)
  2916				break;
  2917			/*
  2918			 * FIXME: implement NoA while scanning in software,
  2919			 * for now fall through to allow scanning only when
  2920			 * beaconing hasn't been configured yet
  2921			 */
  2922			fallthrough;
  2923		case NL80211_IFTYPE_AP:
  2924			/*
  2925			 * If the scan has been forced (and the driver supports
  2926			 * forcing), don't care about being beaconing already.
  2927			 * This will create problems to the attached stations (e.g. all
  2928			 * the frames sent while scanning on other channel will be
  2929			 * lost)
  2930			 */
  2931			for (link_id = 0; link_id < IEEE80211_MLD_MAX_NUM_LINKS;
  2932			     link_id++) {
  2933				link = sdata_dereference(sdata->link[link_id], sdata);
  2934				if (!link)
  2935					continue;
  2936	
  2937				/* if the link is not beaconing, ignore it */
  2938				if (!sdata_dereference(link->u.ap.beacon, sdata))
  2939					continue;
  2940	
  2941				/* If we are here then at least one of the link is
  2942				 * beaconing and since radio level information is
  2943				 * not present or single underlying radio is present,
  2944				 * no point in checking further and hence return if
  2945				 * flag requirements are not met.
  2946				 */
  2947				if (wiphy->n_radio < 2 &&
  2948				    (!(wiphy->features & NL80211_FEATURE_AP_SCAN) ||
  2949				     !(req->flags & NL80211_SCAN_FLAG_AP)))
  2950					return -EOPNOTSUPP;
  2951	
  2952				chan = link->conf->chanreq.oper.chan;
> 2953				radio_idx = cfg80211_get_radio_idx_by_chan(wiphy, chan);
  2954	
> 2955				if (ieee80211_is_radio_idx_in_scan_req(wiphy, req,
  2956								       radio_idx) &&
  2957				    (!(wiphy->features & NL80211_FEATURE_AP_SCAN) ||
  2958				     !(req->flags & NL80211_SCAN_FLAG_AP)))
  2959					return -EOPNOTSUPP;
  2960			}
  2961			break;
  2962		case NL80211_IFTYPE_NAN:
  2963		default:
  2964			return -EOPNOTSUPP;
  2965		}
  2966	
  2967		return ieee80211_request_scan(sdata, req);
  2968	}
  2969	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki