cfg80211: reg: make CRDA support optional
If there's a built-in regulatory database, there may be little point in also calling out to CRDA and failing if the system is configured that way. Allow removing CRDA support to save ~1K kernel size. Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
@@ -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,
|
||||
|
Reference in New Issue
Block a user