diff mbox series

cfg80211: Set the channel definition for the different Wi-Fi modes when starting CAC

Message ID 20240812120909.2721400-1-root@hissam.office.simonwunderlich.net
State New
Headers show
Series cfg80211: Set the channel definition for the different Wi-Fi modes when starting CAC | expand

Commit Message

root Aug. 12, 2024, 12:09 p.m. UTC
From: Issam Hamdi <ih@simonwunderlich.de>

When starting CAC in a mode other than AP mode, it return a
"WARNING: CPU: 0 PID: 63 at cfg80211_chandef_dfs_usable+0x20/0xaf [cfg80211]"
caused by the chandef.chan being null at the end of CAC.

Solution: Ensure the channel definition is set for the different modes
when starting CAC to avoid getting a NULL 'chan' at the end of CAC.

 Call Trace:
  ? show_regs.part.0+0x14/0x16
  ? __warn+0x67/0xc0
  ? cfg80211_chandef_dfs_usable+0x20/0xaf [cfg80211]
  ? report_bug+0xa7/0x130
  ? exc_overflow+0x30/0x30
  ? handle_bug+0x27/0x50
  ? exc_invalid_op+0x18/0x60
  ? handle_exception+0xf6/0xf6
  ? exc_overflow+0x30/0x30
  ? cfg80211_chandef_dfs_usable+0x20/0xaf [cfg80211]
  ? exc_overflow+0x30/0x30
  ? cfg80211_chandef_dfs_usable+0x20/0xaf [cfg80211]
  ? regulatory_propagate_dfs_state.cold+0x1b/0x4c [cfg80211]
  ? cfg80211_propagate_cac_done_wk+0x1a/0x30 [cfg80211]
  ? process_one_work+0x165/0x280
  ? worker_thread+0x120/0x3f0
  ? kthread+0xc2/0xf0
  ? process_one_work+0x280/0x280
  ? kthread_complete_and_exit+0x20/0x20
  ? ret_from_fork+0x19/0x24

Signed-off-by: Issam Hamdi <ih@simonwunderlich.de>
Signed-off-by: Kretschmer Mathias <mathias.kretschmer@fit.fraunhofer.de>
---
 net/wireless/nl80211.c | 16 +++++++++++++++-
 1 file changed, 15 insertions(+), 1 deletion(-)

Comments

kernel test robot Aug. 12, 2024, 5:49 p.m. UTC | #1
Hi root,

kernel test robot noticed the following build warnings:

[auto build test WARNING on wireless-next/main]
[also build test WARNING on wireless/main linus/master v6.11-rc3 next-20240812]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/root/cfg80211-Set-the-channel-definition-for-the-different-Wi-Fi-modes-when-starting-CAC/20240812-202257
base:   https://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless-next.git main
patch link:    https://lore.kernel.org/r/20240812120909.2721400-1-root%40hissam.office.simonwunderlich.net
patch subject: [PATCH] cfg80211: Set the channel definition for the different Wi-Fi modes when starting CAC
config: arm-u8500_defconfig (https://download.01.org/0day-ci/archive/20240813/202408130125.u2jlMVQM-lkp@intel.com/config)
compiler: arm-linux-gnueabi-gcc (GCC) 14.1.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240813/202408130125.u2jlMVQM-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/202408130125.u2jlMVQM-lkp@intel.com/

All warnings (new ones prefixed by >>):

   net/wireless/nl80211.c: In function 'nl80211_start_radar_detection':
>> net/wireless/nl80211.c:10146:17: warning: enumeration value 'NL80211_IFTYPE_UNSPECIFIED' not handled in switch [-Wswitch]
   10146 |                 switch (wdev->iftype) {
         |                 ^~~~~~
>> net/wireless/nl80211.c:10146:17: warning: enumeration value 'NL80211_IFTYPE_STATION' not handled in switch [-Wswitch]
>> net/wireless/nl80211.c:10146:17: warning: enumeration value 'NL80211_IFTYPE_AP_VLAN' not handled in switch [-Wswitch]
>> net/wireless/nl80211.c:10146:17: warning: enumeration value 'NL80211_IFTYPE_WDS' not handled in switch [-Wswitch]
>> net/wireless/nl80211.c:10146:17: warning: enumeration value 'NL80211_IFTYPE_MONITOR' not handled in switch [-Wswitch]
>> net/wireless/nl80211.c:10146:17: warning: enumeration value 'NL80211_IFTYPE_P2P_CLIENT' not handled in switch [-Wswitch]
>> net/wireless/nl80211.c:10146:17: warning: enumeration value 'NL80211_IFTYPE_P2P_DEVICE' not handled in switch [-Wswitch]
>> net/wireless/nl80211.c:10146:17: warning: enumeration value 'NL80211_IFTYPE_NAN' not handled in switch [-Wswitch]
>> net/wireless/nl80211.c:10146:17: warning: enumeration value 'NUM_NL80211_IFTYPES' not handled in switch [-Wswitch]
>> net/wireless/nl80211.c:10146:17: warning: enumeration value 'NL80211_IFTYPE_MAX' not handled in switch [-Wswitch]


vim +/NL80211_IFTYPE_UNSPECIFIED +10146 net/wireless/nl80211.c

 10068	
 10069	static int nl80211_start_radar_detection(struct sk_buff *skb,
 10070						 struct genl_info *info)
 10071	{
 10072		struct cfg80211_registered_device *rdev = info->user_ptr[0];
 10073		struct net_device *dev = info->user_ptr[1];
 10074		struct wireless_dev *wdev = dev->ieee80211_ptr;
 10075		struct wiphy *wiphy = wdev->wiphy;
 10076		struct cfg80211_chan_def chandef;
 10077		enum nl80211_dfs_regions dfs_region;
 10078		unsigned int cac_time_ms;
 10079		int err = -EINVAL;
 10080	
 10081		flush_delayed_work(&rdev->dfs_update_channels_wk);
 10082	
 10083		switch (wdev->iftype) {
 10084		case NL80211_IFTYPE_AP:
 10085		case NL80211_IFTYPE_P2P_GO:
 10086		case NL80211_IFTYPE_MESH_POINT:
 10087		case NL80211_IFTYPE_ADHOC:
 10088			break;
 10089		default:
 10090			/* caution - see cfg80211_beaconing_iface_active() below */
 10091			return -EINVAL;
 10092		}
 10093	
 10094		wiphy_lock(wiphy);
 10095	
 10096		dfs_region = reg_get_dfs_region(wiphy);
 10097		if (dfs_region == NL80211_DFS_UNSET)
 10098			goto unlock;
 10099	
 10100		err = nl80211_parse_chandef(rdev, info, &chandef);
 10101		if (err)
 10102			goto unlock;
 10103	
 10104		err = cfg80211_chandef_dfs_required(wiphy, &chandef, wdev->iftype);
 10105		if (err < 0)
 10106			goto unlock;
 10107	
 10108		if (err == 0) {
 10109			err = -EINVAL;
 10110			goto unlock;
 10111		}
 10112	
 10113		if (!cfg80211_chandef_dfs_usable(wiphy, &chandef)) {
 10114			err = -EINVAL;
 10115			goto unlock;
 10116		}
 10117	
 10118		if (nla_get_flag(info->attrs[NL80211_ATTR_RADAR_BACKGROUND])) {
 10119			err = cfg80211_start_background_radar_detection(rdev, wdev,
 10120									&chandef);
 10121			goto unlock;
 10122		}
 10123	
 10124		if (cfg80211_beaconing_iface_active(wdev) || wdev->cac_started) {
 10125			err = -EBUSY;
 10126			goto unlock;
 10127		}
 10128	
 10129		/* CAC start is offloaded to HW and can't be started manually */
 10130		if (wiphy_ext_feature_isset(wiphy, NL80211_EXT_FEATURE_DFS_OFFLOAD)) {
 10131			err = -EOPNOTSUPP;
 10132			goto unlock;
 10133		}
 10134	
 10135		if (!rdev->ops->start_radar_detection) {
 10136			err = -EOPNOTSUPP;
 10137			goto unlock;
 10138		}
 10139	
 10140		cac_time_ms = cfg80211_chandef_dfs_cac_time(&rdev->wiphy, &chandef);
 10141		if (WARN_ON(!cac_time_ms))
 10142			cac_time_ms = IEEE80211_DFS_MIN_CAC_TIME_MS;
 10143	
 10144		err = rdev_start_radar_detection(rdev, dev, &chandef, cac_time_ms);
 10145		if (!err) {
 10146			switch (wdev->iftype) {
 10147			case NL80211_IFTYPE_MESH_POINT:
 10148				wdev->u.mesh.chandef = chandef;
 10149				break;
 10150			case NL80211_IFTYPE_ADHOC:
 10151				wdev->u.ibss.chandef = chandef;
 10152				break;
 10153			case NL80211_IFTYPE_OCB:
 10154				wdev->u.ocb.chandef = chandef;
 10155				break;
 10156			case NL80211_IFTYPE_AP:
 10157			case NL80211_IFTYPE_P2P_GO:
 10158				wdev->links[0].ap.chandef = chandef;
 10159				break;
 10160			}
 10161			wdev->cac_started = true;
 10162			wdev->cac_start_time = jiffies;
 10163			wdev->cac_time_ms = cac_time_ms;
 10164		}
 10165	unlock:
 10166		wiphy_unlock(wiphy);
 10167	
 10168		return err;
 10169	}
 10170
diff mbox series

Patch

diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
index 7397a372c78e..d200c365339a 100644
--- a/net/wireless/nl80211.c
+++ b/net/wireless/nl80211.c
@@ -10143,7 +10143,21 @@  static int nl80211_start_radar_detection(struct sk_buff *skb,
 
 	err = rdev_start_radar_detection(rdev, dev, &chandef, cac_time_ms);
 	if (!err) {
-		wdev->links[0].ap.chandef = chandef;
+		switch (wdev->iftype) {
+		case NL80211_IFTYPE_MESH_POINT:
+			wdev->u.mesh.chandef = chandef;
+			break;
+		case NL80211_IFTYPE_ADHOC:
+			wdev->u.ibss.chandef = chandef;
+			break;
+		case NL80211_IFTYPE_OCB:
+			wdev->u.ocb.chandef = chandef;
+			break;
+		case NL80211_IFTYPE_AP:
+		case NL80211_IFTYPE_P2P_GO:
+			wdev->links[0].ap.chandef = chandef;
+			break;
+		}
 		wdev->cac_started = true;
 		wdev->cac_start_time = jiffies;
 		wdev->cac_time_ms = cac_time_ms;