diff options
Diffstat (limited to 'net/wireless')
-rw-r--r-- | net/wireless/mlme.c | 11 | ||||
-rw-r--r-- | net/wireless/nl80211.c | 34 | ||||
-rw-r--r-- | net/wireless/nl80211.h | 5 | ||||
-rw-r--r-- | net/wireless/reg.c | 39 |
4 files changed, 65 insertions, 24 deletions
diff --git a/net/wireless/mlme.c b/net/wireless/mlme.c index 8fd0242ee16..3df195a3e33 100644 --- a/net/wireless/mlme.c +++ b/net/wireless/mlme.c | |||
@@ -612,6 +612,17 @@ void cfg80211_del_sta(struct net_device *dev, const u8 *mac_addr, gfp_t gfp) | |||
612 | } | 612 | } |
613 | EXPORT_SYMBOL(cfg80211_del_sta); | 613 | EXPORT_SYMBOL(cfg80211_del_sta); |
614 | 614 | ||
615 | void cfg80211_conn_failed(struct net_device *dev, const u8 *mac_addr, | ||
616 | enum nl80211_connect_failed_reason reason, | ||
617 | gfp_t gfp) | ||
618 | { | ||
619 | struct wiphy *wiphy = dev->ieee80211_ptr->wiphy; | ||
620 | struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy); | ||
621 | |||
622 | nl80211_send_conn_failed_event(rdev, dev, mac_addr, reason, gfp); | ||
623 | } | ||
624 | EXPORT_SYMBOL(cfg80211_conn_failed); | ||
625 | |||
615 | struct cfg80211_mgmt_registration { | 626 | struct cfg80211_mgmt_registration { |
616 | struct list_head list; | 627 | struct list_head list; |
617 | 628 | ||
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 222189b6ed5..f1047aea868 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
@@ -8364,6 +8364,40 @@ void nl80211_send_sta_del_event(struct cfg80211_registered_device *rdev, | |||
8364 | nlmsg_free(msg); | 8364 | nlmsg_free(msg); |
8365 | } | 8365 | } |
8366 | 8366 | ||
8367 | void nl80211_send_conn_failed_event(struct cfg80211_registered_device *rdev, | ||
8368 | struct net_device *dev, const u8 *mac_addr, | ||
8369 | enum nl80211_connect_failed_reason reason, | ||
8370 | gfp_t gfp) | ||
8371 | { | ||
8372 | struct sk_buff *msg; | ||
8373 | void *hdr; | ||
8374 | |||
8375 | msg = nlmsg_new(NLMSG_GOODSIZE, gfp); | ||
8376 | if (!msg) | ||
8377 | return; | ||
8378 | |||
8379 | hdr = nl80211hdr_put(msg, 0, 0, 0, NL80211_CMD_CONN_FAILED); | ||
8380 | if (!hdr) { | ||
8381 | nlmsg_free(msg); | ||
8382 | return; | ||
8383 | } | ||
8384 | |||
8385 | if (nla_put_u32(msg, NL80211_ATTR_IFINDEX, dev->ifindex) || | ||
8386 | nla_put(msg, NL80211_ATTR_MAC, ETH_ALEN, mac_addr) || | ||
8387 | nla_put_u32(msg, NL80211_ATTR_CONN_FAILED_REASON, reason)) | ||
8388 | goto nla_put_failure; | ||
8389 | |||
8390 | genlmsg_end(msg, hdr); | ||
8391 | |||
8392 | genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, | ||
8393 | nl80211_mlme_mcgrp.id, gfp); | ||
8394 | return; | ||
8395 | |||
8396 | nla_put_failure: | ||
8397 | genlmsg_cancel(msg, hdr); | ||
8398 | nlmsg_free(msg); | ||
8399 | } | ||
8400 | |||
8367 | static bool __nl80211_unexpected_frame(struct net_device *dev, u8 cmd, | 8401 | static bool __nl80211_unexpected_frame(struct net_device *dev, u8 cmd, |
8368 | const u8 *addr, gfp_t gfp) | 8402 | const u8 *addr, gfp_t gfp) |
8369 | { | 8403 | { |
diff --git a/net/wireless/nl80211.h b/net/wireless/nl80211.h index 9f2616fffb4..f6153516068 100644 --- a/net/wireless/nl80211.h +++ b/net/wireless/nl80211.h | |||
@@ -91,6 +91,11 @@ void nl80211_send_sta_del_event(struct cfg80211_registered_device *rdev, | |||
91 | struct net_device *dev, const u8 *mac_addr, | 91 | struct net_device *dev, const u8 *mac_addr, |
92 | gfp_t gfp); | 92 | gfp_t gfp); |
93 | 93 | ||
94 | void nl80211_send_conn_failed_event(struct cfg80211_registered_device *rdev, | ||
95 | struct net_device *dev, const u8 *mac_addr, | ||
96 | enum nl80211_connect_failed_reason reason, | ||
97 | gfp_t gfp); | ||
98 | |||
94 | int nl80211_send_mgmt(struct cfg80211_registered_device *rdev, | 99 | int nl80211_send_mgmt(struct cfg80211_registered_device *rdev, |
95 | struct wireless_dev *wdev, u32 nlpid, | 100 | struct wireless_dev *wdev, u32 nlpid, |
96 | int freq, int sig_dbm, | 101 | int freq, int sig_dbm, |
diff --git a/net/wireless/reg.c b/net/wireless/reg.c index 1ad04e54014..844823973da 100644 --- a/net/wireless/reg.c +++ b/net/wireless/reg.c | |||
@@ -504,9 +504,11 @@ static bool reg_does_bw_fit(const struct ieee80211_freq_range *freq_range, | |||
504 | * | 504 | * |
505 | * This lets us know if a specific frequency rule is or is not relevant to | 505 | * This lets us know if a specific frequency rule is or is not relevant to |
506 | * a specific frequency's band. Bands are device specific and artificial | 506 | * a specific frequency's band. Bands are device specific and artificial |
507 | * definitions (the "2.4 GHz band" and the "5 GHz band"), however it is | 507 | * definitions (the "2.4 GHz band", the "5 GHz band" and the "60GHz band"), |
508 | * safe for now to assume that a frequency rule should not be part of a | 508 | * however it is safe for now to assume that a frequency rule should not be |
509 | * frequency's band if the start freq or end freq are off by more than 2 GHz. | 509 | * part of a frequency's band if the start freq or end freq are off by more |
510 | * than 2 GHz for the 2.4 and 5 GHz bands, and by more than 10 GHz for the | ||
511 | * 60 GHz band. | ||
510 | * This resolution can be lowered and should be considered as we add | 512 | * This resolution can be lowered and should be considered as we add |
511 | * regulatory rule support for other "bands". | 513 | * regulatory rule support for other "bands". |
512 | **/ | 514 | **/ |
@@ -514,9 +516,16 @@ static bool freq_in_rule_band(const struct ieee80211_freq_range *freq_range, | |||
514 | u32 freq_khz) | 516 | u32 freq_khz) |
515 | { | 517 | { |
516 | #define ONE_GHZ_IN_KHZ 1000000 | 518 | #define ONE_GHZ_IN_KHZ 1000000 |
517 | if (abs(freq_khz - freq_range->start_freq_khz) <= (2 * ONE_GHZ_IN_KHZ)) | 519 | /* |
520 | * From 802.11ad: directional multi-gigabit (DMG): | ||
521 | * Pertaining to operation in a frequency band containing a channel | ||
522 | * with the Channel starting frequency above 45 GHz. | ||
523 | */ | ||
524 | u32 limit = freq_khz > 45 * ONE_GHZ_IN_KHZ ? | ||
525 | 10 * ONE_GHZ_IN_KHZ : 2 * ONE_GHZ_IN_KHZ; | ||
526 | if (abs(freq_khz - freq_range->start_freq_khz) <= limit) | ||
518 | return true; | 527 | return true; |
519 | if (abs(freq_khz - freq_range->end_freq_khz) <= (2 * ONE_GHZ_IN_KHZ)) | 528 | if (abs(freq_khz - freq_range->end_freq_khz) <= limit) |
520 | return true; | 529 | return true; |
521 | return false; | 530 | return false; |
522 | #undef ONE_GHZ_IN_KHZ | 531 | #undef ONE_GHZ_IN_KHZ |
@@ -2193,7 +2202,6 @@ static void print_regdomain_info(const struct ieee80211_regdomain *rd) | |||
2193 | static int __set_regdom(const struct ieee80211_regdomain *rd) | 2202 | static int __set_regdom(const struct ieee80211_regdomain *rd) |
2194 | { | 2203 | { |
2195 | const struct ieee80211_regdomain *intersected_rd = NULL; | 2204 | const struct ieee80211_regdomain *intersected_rd = NULL; |
2196 | struct cfg80211_registered_device *rdev = NULL; | ||
2197 | struct wiphy *request_wiphy; | 2205 | struct wiphy *request_wiphy; |
2198 | /* Some basic sanity checks first */ | 2206 | /* Some basic sanity checks first */ |
2199 | 2207 | ||
@@ -2305,24 +2313,7 @@ static int __set_regdom(const struct ieee80211_regdomain *rd) | |||
2305 | return 0; | 2313 | return 0; |
2306 | } | 2314 | } |
2307 | 2315 | ||
2308 | if (!intersected_rd) | 2316 | return -EINVAL; |
2309 | return -EINVAL; | ||
2310 | |||
2311 | rdev = wiphy_to_dev(request_wiphy); | ||
2312 | |||
2313 | rdev->country_ie_alpha2[0] = rd->alpha2[0]; | ||
2314 | rdev->country_ie_alpha2[1] = rd->alpha2[1]; | ||
2315 | rdev->env = last_request->country_ie_env; | ||
2316 | |||
2317 | BUG_ON(intersected_rd == rd); | ||
2318 | |||
2319 | kfree(rd); | ||
2320 | rd = NULL; | ||
2321 | |||
2322 | reset_regdomains(false); | ||
2323 | cfg80211_regdomain = intersected_rd; | ||
2324 | |||
2325 | return 0; | ||
2326 | } | 2317 | } |
2327 | 2318 | ||
2328 | 2319 | ||