diff options
| author | Arik Nemtsov <arik@wizery.com> | 2014-12-15 12:26:01 -0500 |
|---|---|---|
| committer | Johannes Berg <johannes.berg@intel.com> | 2014-12-17 05:49:55 -0500 |
| commit | 1bdd716cbccabc8127fbbaaa663c3090302ef78b (patch) | |
| tree | 6640c2203455f00eae2599976c20d8cf833dd289 /net/wireless | |
| parent | b0d7aa59592b4270531de5ce65dcf18338a2d98c (diff) | |
cfg80211: return private regdom for self-managed devices
If a device has self-managed regulatory, insist on returning the wiphy
specific regdomain if a wiphy-idx is specified. The global regdomain is
meaningless for such devices.
Also add an attribute for self-managed devices, so usermode can
distinguish them as such.
Signed-off-by: Arik Nemtsov <arikx.nemtsov@intel.com>
Reviewed-by: Luis R. Rodriguez <mcgrof@suse.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net/wireless')
| -rw-r--r-- | net/wireless/nl80211.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index eebb7e422989..5b1907f4c181 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
| @@ -396,6 +396,7 @@ static const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = { | |||
| 396 | [NL80211_ATTR_ADMITTED_TIME] = { .type = NLA_U16 }, | 396 | [NL80211_ATTR_ADMITTED_TIME] = { .type = NLA_U16 }, |
| 397 | [NL80211_ATTR_SMPS_MODE] = { .type = NLA_U8 }, | 397 | [NL80211_ATTR_SMPS_MODE] = { .type = NLA_U8 }, |
| 398 | [NL80211_ATTR_MAC_MASK] = { .len = ETH_ALEN }, | 398 | [NL80211_ATTR_MAC_MASK] = { .len = ETH_ALEN }, |
| 399 | [NL80211_ATTR_WIPHY_SELF_MANAGED_REG] = { .type = NLA_FLAG }, | ||
| 399 | }; | 400 | }; |
| 400 | 401 | ||
| 401 | /* policy for the key attributes */ | 402 | /* policy for the key attributes */ |
| @@ -1701,6 +1702,10 @@ static int nl80211_send_wiphy(struct cfg80211_registered_device *rdev, | |||
| 1701 | rdev->wiphy.max_num_csa_counters)) | 1702 | rdev->wiphy.max_num_csa_counters)) |
| 1702 | goto nla_put_failure; | 1703 | goto nla_put_failure; |
| 1703 | 1704 | ||
| 1705 | if (rdev->wiphy.regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && | ||
| 1706 | nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG)) | ||
| 1707 | goto nla_put_failure; | ||
| 1708 | |||
| 1704 | /* done */ | 1709 | /* done */ |
| 1705 | state->split_start = 0; | 1710 | state->split_start = 0; |
| 1706 | break; | 1711 | break; |
| @@ -5406,6 +5411,8 @@ static int nl80211_get_reg_do(struct sk_buff *skb, struct genl_info *info) | |||
| 5406 | goto put_failure; | 5411 | goto put_failure; |
| 5407 | 5412 | ||
| 5408 | if (info->attrs[NL80211_ATTR_WIPHY]) { | 5413 | if (info->attrs[NL80211_ATTR_WIPHY]) { |
| 5414 | bool self_managed; | ||
| 5415 | |||
| 5409 | rdev = cfg80211_get_dev_from_info(genl_info_net(info), info); | 5416 | rdev = cfg80211_get_dev_from_info(genl_info_net(info), info); |
| 5410 | if (IS_ERR(rdev)) { | 5417 | if (IS_ERR(rdev)) { |
| 5411 | nlmsg_free(msg); | 5418 | nlmsg_free(msg); |
| @@ -5413,8 +5420,16 @@ static int nl80211_get_reg_do(struct sk_buff *skb, struct genl_info *info) | |||
| 5413 | } | 5420 | } |
| 5414 | 5421 | ||
| 5415 | wiphy = &rdev->wiphy; | 5422 | wiphy = &rdev->wiphy; |
| 5423 | self_managed = wiphy->regulatory_flags & | ||
| 5424 | REGULATORY_WIPHY_SELF_MANAGED; | ||
| 5416 | regdom = get_wiphy_regdom(wiphy); | 5425 | regdom = get_wiphy_regdom(wiphy); |
| 5417 | 5426 | ||
| 5427 | /* a self-managed-reg device must have a private regdom */ | ||
| 5428 | if (WARN_ON(!regdom && self_managed)) { | ||
| 5429 | nlmsg_free(msg); | ||
| 5430 | return -EINVAL; | ||
| 5431 | } | ||
| 5432 | |||
| 5418 | if (regdom && | 5433 | if (regdom && |
| 5419 | nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy))) | 5434 | nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy))) |
| 5420 | goto nla_put_failure; | 5435 | goto nla_put_failure; |
| @@ -5471,6 +5486,10 @@ static int nl80211_send_regdom(struct sk_buff *msg, struct netlink_callback *cb, | |||
| 5471 | nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy))) | 5486 | nla_put_u32(msg, NL80211_ATTR_WIPHY, get_wiphy_idx(wiphy))) |
| 5472 | goto nla_put_failure; | 5487 | goto nla_put_failure; |
| 5473 | 5488 | ||
| 5489 | if (wiphy && wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && | ||
| 5490 | nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG)) | ||
| 5491 | goto nla_put_failure; | ||
| 5492 | |||
| 5474 | return genlmsg_end(msg, hdr); | 5493 | return genlmsg_end(msg, hdr); |
| 5475 | 5494 | ||
| 5476 | nla_put_failure: | 5495 | nla_put_failure: |
| @@ -11076,6 +11095,11 @@ static bool nl80211_reg_change_event_fill(struct sk_buff *msg, | |||
| 11076 | if (wiphy && | 11095 | if (wiphy && |
| 11077 | nla_put_u32(msg, NL80211_ATTR_WIPHY, request->wiphy_idx)) | 11096 | nla_put_u32(msg, NL80211_ATTR_WIPHY, request->wiphy_idx)) |
| 11078 | goto nla_put_failure; | 11097 | goto nla_put_failure; |
| 11098 | |||
| 11099 | if (wiphy && | ||
| 11100 | wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED && | ||
| 11101 | nla_put_flag(msg, NL80211_ATTR_WIPHY_SELF_MANAGED_REG)) | ||
| 11102 | goto nla_put_failure; | ||
| 11079 | } | 11103 | } |
| 11080 | 11104 | ||
| 11081 | return true; | 11105 | return true; |
