mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 10:41:38 -04:00
cfg80211: process regulatory DFS region for countries
The wireless-regdb now has support for mapping a country to one DFS region. CRDA sends this to us now so process it so we can provide that hint to drivers. This will later be used by code for processing DFS in a way that meets the criteria for the DFS region the country belongs to. Signed-off-by: Luis R. Rodriguez <[email protected]> Signed-off-by: John W. Linville <[email protected]>
This commit is contained in:
parent
4713e962c5
commit
8b60b07805
5 changed files with 75 additions and 0 deletions
|
|
@ -199,6 +199,7 @@ static const struct nla_policy nl80211_policy[NL80211_ATTR_MAX+1] = {
|
|||
[NL80211_ATTR_DONT_WAIT_FOR_ACK] = { .type = NLA_FLAG },
|
||||
[NL80211_ATTR_PROBE_RESP] = { .type = NLA_BINARY,
|
||||
.len = IEEE80211_MAX_DATA_LEN },
|
||||
[NL80211_ATTR_DFS_REGION] = { .type = NLA_U8 },
|
||||
};
|
||||
|
||||
/* policy for the key attributes */
|
||||
|
|
@ -3382,6 +3383,9 @@ static int nl80211_get_reg(struct sk_buff *skb, struct genl_info *info)
|
|||
|
||||
NLA_PUT_STRING(msg, NL80211_ATTR_REG_ALPHA2,
|
||||
cfg80211_regdomain->alpha2);
|
||||
if (cfg80211_regdomain->dfs_region)
|
||||
NLA_PUT_U8(msg, NL80211_ATTR_DFS_REGION,
|
||||
cfg80211_regdomain->dfs_region);
|
||||
|
||||
nl_reg_rules = nla_nest_start(msg, NL80211_ATTR_REG_RULES);
|
||||
if (!nl_reg_rules)
|
||||
|
|
@ -3440,6 +3444,7 @@ static int nl80211_set_reg(struct sk_buff *skb, struct genl_info *info)
|
|||
char *alpha2 = NULL;
|
||||
int rem_reg_rules = 0, r = 0;
|
||||
u32 num_rules = 0, rule_idx = 0, size_of_regd;
|
||||
u8 dfs_region = 0;
|
||||
struct ieee80211_regdomain *rd = NULL;
|
||||
|
||||
if (!info->attrs[NL80211_ATTR_REG_ALPHA2])
|
||||
|
|
@ -3450,6 +3455,9 @@ static int nl80211_set_reg(struct sk_buff *skb, struct genl_info *info)
|
|||
|
||||
alpha2 = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]);
|
||||
|
||||
if (info->attrs[NL80211_ATTR_DFS_REGION])
|
||||
dfs_region = nla_get_u8(info->attrs[NL80211_ATTR_DFS_REGION]);
|
||||
|
||||
nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES],
|
||||
rem_reg_rules) {
|
||||
num_rules++;
|
||||
|
|
@ -3477,6 +3485,13 @@ static int nl80211_set_reg(struct sk_buff *skb, struct genl_info *info)
|
|||
rd->alpha2[0] = alpha2[0];
|
||||
rd->alpha2[1] = alpha2[1];
|
||||
|
||||
/*
|
||||
* Disable DFS master mode if the DFS region was
|
||||
* not supported or known on this kernel.
|
||||
*/
|
||||
if (reg_supported_dfs_region(dfs_region))
|
||||
rd->dfs_region = dfs_region;
|
||||
|
||||
nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES],
|
||||
rem_reg_rules) {
|
||||
nla_parse(tb, NL80211_REG_RULE_ATTR_MAX,
|
||||
|
|
|
|||
|
|
@ -1946,6 +1946,42 @@ static void print_rd_rules(const struct ieee80211_regdomain *rd)
|
|||
}
|
||||
}
|
||||
|
||||
bool reg_supported_dfs_region(u8 dfs_region)
|
||||
{
|
||||
switch (dfs_region) {
|
||||
case NL80211_DFS_UNSET:
|
||||
case NL80211_DFS_FCC:
|
||||
case NL80211_DFS_ETSI:
|
||||
case NL80211_DFS_JP:
|
||||
return true;
|
||||
default:
|
||||
REG_DBG_PRINT("Ignoring uknown DFS master region: %d\n",
|
||||
dfs_region);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
static void print_dfs_region(u8 dfs_region)
|
||||
{
|
||||
if (!dfs_region)
|
||||
return;
|
||||
|
||||
switch (dfs_region) {
|
||||
case NL80211_DFS_FCC:
|
||||
pr_info(" DFS Master region FCC");
|
||||
break;
|
||||
case NL80211_DFS_ETSI:
|
||||
pr_info(" DFS Master region ETSI");
|
||||
break;
|
||||
case NL80211_DFS_JP:
|
||||
pr_info(" DFS Master region JP");
|
||||
break;
|
||||
default:
|
||||
pr_info(" DFS Master region Uknown");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void print_regdomain(const struct ieee80211_regdomain *rd)
|
||||
{
|
||||
|
||||
|
|
@ -1973,6 +2009,7 @@ static void print_regdomain(const struct ieee80211_regdomain *rd)
|
|||
pr_info("Regulatory domain changed to country: %c%c\n",
|
||||
rd->alpha2[0], rd->alpha2[1]);
|
||||
}
|
||||
print_dfs_region(rd->dfs_region);
|
||||
print_rd_rules(rd);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@ extern const struct ieee80211_regdomain *cfg80211_regdomain;
|
|||
|
||||
bool is_world_regdom(const char *alpha2);
|
||||
bool reg_is_valid_request(const char *alpha2);
|
||||
bool reg_supported_dfs_region(u8 dfs_region);
|
||||
|
||||
int regulatory_hint_user(const char *alpha2);
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue