aboutsummaryrefslogtreecommitdiffstats
path: root/net/wireless
diff options
context:
space:
mode:
Diffstat (limited to 'net/wireless')
-rw-r--r--net/wireless/mlme.c11
-rw-r--r--net/wireless/nl80211.c34
-rw-r--r--net/wireless/nl80211.h5
-rw-r--r--net/wireless/reg.c39
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}
613EXPORT_SYMBOL(cfg80211_del_sta); 613EXPORT_SYMBOL(cfg80211_del_sta);
614 614
615void 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}
624EXPORT_SYMBOL(cfg80211_conn_failed);
625
615struct cfg80211_mgmt_registration { 626struct 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
8367void 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
8367static bool __nl80211_unexpected_frame(struct net_device *dev, u8 cmd, 8401static 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
94void 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
94int nl80211_send_mgmt(struct cfg80211_registered_device *rdev, 99int 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)
2193static int __set_regdom(const struct ieee80211_regdomain *rd) 2202static 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