|
|
@@ -4944,56 +4944,6 @@ static int nl80211_set_bss(struct sk_buff *skb, struct genl_info *info)
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
-static const struct nla_policy reg_rule_policy[NL80211_REG_RULE_ATTR_MAX + 1] = {
|
|
|
- [NL80211_ATTR_REG_RULE_FLAGS] = { .type = NLA_U32 },
|
|
|
- [NL80211_ATTR_FREQ_RANGE_START] = { .type = NLA_U32 },
|
|
|
- [NL80211_ATTR_FREQ_RANGE_END] = { .type = NLA_U32 },
|
|
|
- [NL80211_ATTR_FREQ_RANGE_MAX_BW] = { .type = NLA_U32 },
|
|
|
- [NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN] = { .type = NLA_U32 },
|
|
|
- [NL80211_ATTR_POWER_RULE_MAX_EIRP] = { .type = NLA_U32 },
|
|
|
- [NL80211_ATTR_DFS_CAC_TIME] = { .type = NLA_U32 },
|
|
|
-};
|
|
|
-
|
|
|
-static int parse_reg_rule(struct nlattr *tb[],
|
|
|
- struct ieee80211_reg_rule *reg_rule)
|
|
|
-{
|
|
|
- struct ieee80211_freq_range *freq_range = ®_rule->freq_range;
|
|
|
- struct ieee80211_power_rule *power_rule = ®_rule->power_rule;
|
|
|
-
|
|
|
- if (!tb[NL80211_ATTR_REG_RULE_FLAGS])
|
|
|
- return -EINVAL;
|
|
|
- if (!tb[NL80211_ATTR_FREQ_RANGE_START])
|
|
|
- return -EINVAL;
|
|
|
- if (!tb[NL80211_ATTR_FREQ_RANGE_END])
|
|
|
- return -EINVAL;
|
|
|
- if (!tb[NL80211_ATTR_FREQ_RANGE_MAX_BW])
|
|
|
- return -EINVAL;
|
|
|
- if (!tb[NL80211_ATTR_POWER_RULE_MAX_EIRP])
|
|
|
- return -EINVAL;
|
|
|
-
|
|
|
- reg_rule->flags = nla_get_u32(tb[NL80211_ATTR_REG_RULE_FLAGS]);
|
|
|
-
|
|
|
- freq_range->start_freq_khz =
|
|
|
- nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_START]);
|
|
|
- freq_range->end_freq_khz =
|
|
|
- nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_END]);
|
|
|
- freq_range->max_bandwidth_khz =
|
|
|
- nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_MAX_BW]);
|
|
|
-
|
|
|
- power_rule->max_eirp =
|
|
|
- nla_get_u32(tb[NL80211_ATTR_POWER_RULE_MAX_EIRP]);
|
|
|
-
|
|
|
- if (tb[NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN])
|
|
|
- power_rule->max_antenna_gain =
|
|
|
- nla_get_u32(tb[NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN]);
|
|
|
-
|
|
|
- if (tb[NL80211_ATTR_DFS_CAC_TIME])
|
|
|
- reg_rule->dfs_cac_ms =
|
|
|
- nla_get_u32(tb[NL80211_ATTR_DFS_CAC_TIME]);
|
|
|
-
|
|
|
- return 0;
|
|
|
-}
|
|
|
-
|
|
|
static int nl80211_req_set_reg(struct sk_buff *skb, struct genl_info *info)
|
|
|
{
|
|
|
char *data = NULL;
|
|
|
@@ -5625,6 +5575,57 @@ out_err:
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
+#ifdef CONFIG_CFG80211_CRDA_SUPPORT
|
|
|
+static const struct nla_policy reg_rule_policy[NL80211_REG_RULE_ATTR_MAX + 1] = {
|
|
|
+ [NL80211_ATTR_REG_RULE_FLAGS] = { .type = NLA_U32 },
|
|
|
+ [NL80211_ATTR_FREQ_RANGE_START] = { .type = NLA_U32 },
|
|
|
+ [NL80211_ATTR_FREQ_RANGE_END] = { .type = NLA_U32 },
|
|
|
+ [NL80211_ATTR_FREQ_RANGE_MAX_BW] = { .type = NLA_U32 },
|
|
|
+ [NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN] = { .type = NLA_U32 },
|
|
|
+ [NL80211_ATTR_POWER_RULE_MAX_EIRP] = { .type = NLA_U32 },
|
|
|
+ [NL80211_ATTR_DFS_CAC_TIME] = { .type = NLA_U32 },
|
|
|
+};
|
|
|
+
|
|
|
+static int parse_reg_rule(struct nlattr *tb[],
|
|
|
+ struct ieee80211_reg_rule *reg_rule)
|
|
|
+{
|
|
|
+ struct ieee80211_freq_range *freq_range = ®_rule->freq_range;
|
|
|
+ struct ieee80211_power_rule *power_rule = ®_rule->power_rule;
|
|
|
+
|
|
|
+ if (!tb[NL80211_ATTR_REG_RULE_FLAGS])
|
|
|
+ return -EINVAL;
|
|
|
+ if (!tb[NL80211_ATTR_FREQ_RANGE_START])
|
|
|
+ return -EINVAL;
|
|
|
+ if (!tb[NL80211_ATTR_FREQ_RANGE_END])
|
|
|
+ return -EINVAL;
|
|
|
+ if (!tb[NL80211_ATTR_FREQ_RANGE_MAX_BW])
|
|
|
+ return -EINVAL;
|
|
|
+ if (!tb[NL80211_ATTR_POWER_RULE_MAX_EIRP])
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ reg_rule->flags = nla_get_u32(tb[NL80211_ATTR_REG_RULE_FLAGS]);
|
|
|
+
|
|
|
+ freq_range->start_freq_khz =
|
|
|
+ nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_START]);
|
|
|
+ freq_range->end_freq_khz =
|
|
|
+ nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_END]);
|
|
|
+ freq_range->max_bandwidth_khz =
|
|
|
+ nla_get_u32(tb[NL80211_ATTR_FREQ_RANGE_MAX_BW]);
|
|
|
+
|
|
|
+ power_rule->max_eirp =
|
|
|
+ nla_get_u32(tb[NL80211_ATTR_POWER_RULE_MAX_EIRP]);
|
|
|
+
|
|
|
+ if (tb[NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN])
|
|
|
+ power_rule->max_antenna_gain =
|
|
|
+ nla_get_u32(tb[NL80211_ATTR_POWER_RULE_MAX_ANT_GAIN]);
|
|
|
+
|
|
|
+ if (tb[NL80211_ATTR_DFS_CAC_TIME])
|
|
|
+ reg_rule->dfs_cac_ms =
|
|
|
+ nla_get_u32(tb[NL80211_ATTR_DFS_CAC_TIME]);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static int nl80211_set_reg(struct sk_buff *skb, struct genl_info *info)
|
|
|
{
|
|
|
struct nlattr *tb[NL80211_REG_RULE_ATTR_MAX + 1];
|
|
|
@@ -5701,6 +5702,7 @@ static int nl80211_set_reg(struct sk_buff *skb, struct genl_info *info)
|
|
|
kfree(rd);
|
|
|
return r;
|
|
|
}
|
|
|
+#endif /* CONFIG_CFG80211_CRDA_SUPPORT */
|
|
|
|
|
|
static int validate_scan_freqs(struct nlattr *freqs)
|
|
|
{
|
|
|
@@ -10895,6 +10897,7 @@ static const struct genl_ops nl80211_ops[] = {
|
|
|
.internal_flags = NL80211_FLAG_NEED_RTNL,
|
|
|
/* can be retrieved by unprivileged users */
|
|
|
},
|
|
|
+#ifdef CONFIG_CFG80211_CRDA_SUPPORT
|
|
|
{
|
|
|
.cmd = NL80211_CMD_SET_REG,
|
|
|
.doit = nl80211_set_reg,
|
|
|
@@ -10902,6 +10905,7 @@ static const struct genl_ops nl80211_ops[] = {
|
|
|
.flags = GENL_ADMIN_PERM,
|
|
|
.internal_flags = NL80211_FLAG_NEED_RTNL,
|
|
|
},
|
|
|
+#endif
|
|
|
{
|
|
|
.cmd = NL80211_CMD_REQ_SET_REG,
|
|
|
.doit = nl80211_req_set_reg,
|