|
@@ -7501,6 +7501,7 @@ static int nl80211_channel_switch(struct sk_buff *skb, struct genl_info *info)
|
|
|
static struct nlattr *csa_attrs[NL80211_ATTR_MAX+1];
|
|
|
int err;
|
|
|
bool need_new_beacon = false;
|
|
|
+ bool need_handle_dfs_flag = true;
|
|
|
int len, i;
|
|
|
u32 cs_count;
|
|
|
|
|
@@ -7512,6 +7513,12 @@ static int nl80211_channel_switch(struct sk_buff *skb, struct genl_info *info)
|
|
|
case NL80211_IFTYPE_AP:
|
|
|
case NL80211_IFTYPE_P2P_GO:
|
|
|
need_new_beacon = true;
|
|
|
+ /* For all modes except AP the handle_dfs flag needs to be
|
|
|
+ * supplied to tell the kernel that userspace will handle radar
|
|
|
+ * events when they happen. Otherwise a switch to a channel
|
|
|
+ * requiring DFS will be rejected.
|
|
|
+ */
|
|
|
+ need_handle_dfs_flag = false;
|
|
|
|
|
|
/* useless if AP is not running */
|
|
|
if (!wdev->beacon_interval)
|
|
@@ -7634,8 +7641,13 @@ skip_beacons:
|
|
|
if (err < 0)
|
|
|
return err;
|
|
|
|
|
|
- if (err > 0)
|
|
|
+ if (err > 0) {
|
|
|
params.radar_required = true;
|
|
|
+ if (need_handle_dfs_flag &&
|
|
|
+ !nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS])) {
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
if (info->attrs[NL80211_ATTR_CH_SWITCH_BLOCK_TX])
|
|
|
params.block_tx = true;
|