@@ -2639,6 +2639,10 @@ enum nl80211_commands {
* Mandatory parameter for the transmitting interface to enable MBSSID.
* Optional for the non-transmitting interfaces.
*
+ * @NL80211_ATTR_RADAR_OFFCHAN: Configure dedicated chain available for radar
+ * detection on some hw. The chain can't be used to transmits or receives
+ * frames. The driver is supposed to implement CAC management in sw or fw.
+ *
* @NUM_NL80211_ATTR: total number of nl80211_attrs available
* @NL80211_ATTR_MAX: highest attribute number currently defined
* @__NL80211_ATTR_AFTER_LAST: internal use
@@ -3145,6 +3149,8 @@ enum nl80211_attrs {
NL80211_ATTR_MBSSID_CONFIG,
NL80211_ATTR_MBSSID_ELEMS,
+ NL80211_ATTR_RADAR_OFFCHAN,
+
/* add attributes here, update the policy in nl80211.c */
__NL80211_ATTR_AFTER_LAST,
@@ -776,6 +776,7 @@ static const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = {
[NL80211_ATTR_MBSSID_CONFIG] =
NLA_POLICY_NESTED(nl80211_mbssid_config_policy),
[NL80211_ATTR_MBSSID_ELEMS] = { .type = NLA_NESTED },
+ [NL80211_ATTR_RADAR_OFFCHAN] = { .type = NLA_FLAG },
};
/* policy for the key attributes */
@@ -9279,10 +9280,12 @@ static int nl80211_start_radar_detection(struct sk_buff *skb,
if (err)
return err;
- if (netif_carrier_ok(dev))
+ if (!nla_get_flag(info->attrs[NL80211_ATTR_RADAR_OFFCHAN]) &&
+ netif_carrier_ok(dev))
return -EBUSY;
- if (wdev->cac_started)
+ if (!nla_get_flag(info->attrs[NL80211_ATTR_RADAR_OFFCHAN]) &&
+ wdev->cac_started)
return -EBUSY;
err = cfg80211_chandef_dfs_required(wiphy, &chandef, wdev->iftype);
@@ -9299,6 +9302,11 @@ static int nl80211_start_radar_detection(struct sk_buff *skb,
if (wiphy_ext_feature_isset(wiphy, NL80211_EXT_FEATURE_DFS_OFFLOAD))
return -EOPNOTSUPP;
+ if (nla_get_flag(info->attrs[NL80211_ATTR_RADAR_OFFCHAN])) {
+ /* offchannel radar detection */
+ return rdev_set_radar_offchan(rdev, &chandef);
+ }
+
if (!rdev->ops->start_radar_detection)
return -EOPNOTSUPP;