Skip to content

Commit 0c9ca11

Browse files
benilevInteljmberg-intel
authored andcommitted
cfg80211: Add global RRM capability
Today, the supplicant will add the RRM capabilities Information Element in the association request only if Quiet period is supported (NL80211_FEATURE_QUIET). Quiet is one of many RRM features, and there are other RRM features that are not related to Quiet (e.g. neighbor report). Therefore, requiring Quiet to enable RRM is too restrictive. Some of the features, like neighbor report, can be supported by user space without any help from the kernel. Hence adding the RRM capabilities IE to association request should be the sole user space's decision. Removing the RRM dependency on Quiet in the driver solves this problem, but using an old driver with a user space tool that would not require Quiet feature would be problematic: the user space would add NL80211_ATTR_USE_RRM in the association request even if the kernel doesn't advertize NL80211_FEATURE_QUIET and the association would be denied by the kernel. This solution adds a global RRM capability, that tells user space that it can request RRM capabilities IE publishment without any specific feature support in the kernel. Signed-off-by: Beni Lev <[email protected]> Signed-off-by: Emmanuel Grumbach <[email protected]> Signed-off-by: Johannes Berg <[email protected]>
1 parent b5a33d5 commit 0c9ca11

File tree

2 files changed

+19
-7
lines changed

2 files changed

+19
-7
lines changed

include/uapi/linux/nl80211.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1727,6 +1727,8 @@ enum nl80211_commands {
17271727
* underlying device supports these minimal RRM features:
17281728
* %NL80211_FEATURE_DS_PARAM_SET_IE_IN_PROBES,
17291729
* %NL80211_FEATURE_QUIET,
1730+
* Or, if global RRM is supported, see:
1731+
* %NL80211_EXT_FEATURE_RRM
17301732
* If this flag is used, driver must add the Power Capabilities IE to the
17311733
* association request. In addition, it must also set the RRM capability
17321734
* flag in the association request's Capability Info field.
@@ -4402,12 +4404,18 @@ enum nl80211_feature_flags {
44024404
/**
44034405
* enum nl80211_ext_feature_index - bit index of extended features.
44044406
* @NL80211_EXT_FEATURE_VHT_IBSS: This driver supports IBSS with VHT datarates.
4407+
* @NL80211_EXT_FEATURE_RRM: This driver supports RRM. When featured, user can
4408+
* can request to use RRM (see %NL80211_ATTR_USE_RRM) with
4409+
* %NL80211_CMD_ASSOCIATE and %NL80211_CMD_CONNECT requests, which will set
4410+
* the ASSOC_REQ_USE_RRM flag in the association request even if
4411+
* NL80211_FEATURE_QUIET is not advertized.
44054412
*
44064413
* @NUM_NL80211_EXT_FEATURES: number of extended features.
44074414
* @MAX_NL80211_EXT_FEATURES: highest extended feature index.
44084415
*/
44094416
enum nl80211_ext_feature_index {
44104417
NL80211_EXT_FEATURE_VHT_IBSS,
4418+
NL80211_EXT_FEATURE_RRM,
44114419

44124420
/* add new features before the definition below */
44134421
NUM_NL80211_EXT_FEATURES,

net/wireless/nl80211.c

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
*
44
* Copyright 2006-2010 Johannes Berg <[email protected]>
55
* Copyright 2013-2014 Intel Mobile Communications GmbH
6-
* Copyright 2015 Intel Deutschland GmbH
6+
* Copyright 2015-2016 Intel Deutschland GmbH
77
*/
88

99
#include <linux/if.h>
@@ -7286,9 +7286,11 @@ static int nl80211_associate(struct sk_buff *skb, struct genl_info *info)
72867286
}
72877287

72887288
if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) {
7289-
if (!(rdev->wiphy.features &
7290-
NL80211_FEATURE_DS_PARAM_SET_IE_IN_PROBES) ||
7291-
!(rdev->wiphy.features & NL80211_FEATURE_QUIET))
7289+
if (!((rdev->wiphy.features &
7290+
NL80211_FEATURE_DS_PARAM_SET_IE_IN_PROBES) &&
7291+
(rdev->wiphy.features & NL80211_FEATURE_QUIET)) &&
7292+
!wiphy_ext_feature_isset(&rdev->wiphy,
7293+
NL80211_EXT_FEATURE_RRM))
72927294
return -EINVAL;
72937295
req.flags |= ASSOC_REQ_USE_RRM;
72947296
}
@@ -7976,9 +7978,11 @@ static int nl80211_connect(struct sk_buff *skb, struct genl_info *info)
79767978
}
79777979

79787980
if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) {
7979-
if (!(rdev->wiphy.features &
7980-
NL80211_FEATURE_DS_PARAM_SET_IE_IN_PROBES) ||
7981-
!(rdev->wiphy.features & NL80211_FEATURE_QUIET)) {
7981+
if (!((rdev->wiphy.features &
7982+
NL80211_FEATURE_DS_PARAM_SET_IE_IN_PROBES) &&
7983+
(rdev->wiphy.features & NL80211_FEATURE_QUIET)) &&
7984+
!wiphy_ext_feature_isset(&rdev->wiphy,
7985+
NL80211_EXT_FEATURE_RRM)) {
79827986
kzfree(connkeys);
79837987
return -EINVAL;
79847988
}

0 commit comments

Comments
 (0)