diff options
author | Janusz Dziedzic <janusz.dziedzic@tieto.com> | 2014-02-21 13:46:12 -0500 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2014-02-25 11:29:25 -0500 |
commit | 089027e57cfa79337feffdd7252c8ba0be352afa (patch) | |
tree | 076b28e399d4ae3eca61a5e1dea50057e1ebb1c0 /net/wireless/nl80211.c | |
parent | fb5c96368fa306dae0f79d0078d2d4e505278204 (diff) |
cfg80211: regulatory: allow getting DFS CAC time from userspace
Introduce DFS CAC time as a regd param, configured per REG_RULE and
set per channel in cfg80211. DFS CAC time is close connected with
regulatory database configuration. Instead of using hardcoded values,
get DFS CAC time form regulatory database. Pass DFS CAC time to user
mode (mainly for iw reg get, iw list, iw info). Allow setting DFS CAC
time via CRDA. Add support for internal regulatory database.
Signed-off-by: Janusz Dziedzic <janusz.dziedzic@tieto.com>
[rewrap commit log]
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net/wireless/nl80211.c')
-rw-r--r-- | net/wireless/nl80211.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 2c38b28a85b9..9f7ebf94a050 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
@@ -593,6 +593,10 @@ static int nl80211_msg_put_channel(struct sk_buff *msg, | |||
593 | if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_DFS_TIME, | 593 | if (nla_put_u32(msg, NL80211_FREQUENCY_ATTR_DFS_TIME, |
594 | time)) | 594 | time)) |
595 | goto nla_put_failure; | 595 | goto nla_put_failure; |
596 | if (nla_put_u32(msg, | ||
597 | NL80211_FREQUENCY_ATTR_DFS_CAC_TIME, | ||
598 | chan->dfs_cac_ms)) | ||
599 | goto nla_put_failure; | ||
596 | } | 600 | } |
597 | } | 601 | } |
598 | 602 | ||
@@ -4614,6 +4618,7 @@ static const struct nla_policy reg_rule_policy[NL80211_REG_RULE_ATTR_MAX + 1] = | |||
4614 | [NL80211_ATTR_FREQ_RANGE_MAX_BW] = { .type = NLA_U32 }, | 4618 | [NL80211_ATTR_FREQ_RANGE_MAX_BW] = { .type = NLA_U32 }, |
4615 | [NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN] = { .type = NLA_U32 }, | 4619 | [NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN] = { .type = NLA_U32 }, |
4616 | [NL80211_ATTR_POWER_RULE_MAX_EIRP] = { .type = NLA_U32 }, | 4620 | [NL80211_ATTR_POWER_RULE_MAX_EIRP] = { .type = NLA_U32 }, |
4621 | [NL80211_ATTR_DFS_CAC_TIME] = { .type = NLA_U32 }, | ||
4617 | }; | 4622 | }; |
4618 | 4623 | ||
4619 | static int parse_reg_rule(struct nlattr *tb[], | 4624 | static int parse_reg_rule(struct nlattr *tb[], |
@@ -4649,6 +4654,10 @@ static int parse_reg_rule(struct nlattr *tb[], | |||
4649 | power_rule->max_antenna_gain = | 4654 | power_rule->max_antenna_gain = |
4650 | nla_get_u32(tb[NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN]); | 4655 | nla_get_u32(tb[NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN]); |
4651 | 4656 | ||
4657 | if (tb[NL80211_ATTR_DFS_CAC_TIME]) | ||
4658 | reg_rule->dfs_cac_ms = | ||
4659 | nla_get_u32(tb[NL80211_ATTR_DFS_CAC_TIME]); | ||
4660 | |||
4652 | return 0; | 4661 | return 0; |
4653 | } | 4662 | } |
4654 | 4663 | ||
@@ -5136,7 +5145,9 @@ static int nl80211_get_reg(struct sk_buff *skb, struct genl_info *info) | |||
5136 | nla_put_u32(msg, NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN, | 5145 | nla_put_u32(msg, NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN, |
5137 | power_rule->max_antenna_gain) || | 5146 | power_rule->max_antenna_gain) || |
5138 | nla_put_u32(msg, NL80211_ATTR_POWER_RULE_MAX_EIRP, | 5147 | nla_put_u32(msg, NL80211_ATTR_POWER_RULE_MAX_EIRP, |
5139 | power_rule->max_eirp)) | 5148 | power_rule->max_eirp) || |
5149 | nla_put_u32(msg, NL80211_ATTR_DFS_CAC_TIME, | ||
5150 | reg_rule->dfs_cac_ms)) | ||
5140 | goto nla_put_failure_rcu; | 5151 | goto nla_put_failure_rcu; |
5141 | 5152 | ||
5142 | nla_nest_end(msg, nl_reg_rule); | 5153 | nla_nest_end(msg, nl_reg_rule); |