diff options
Diffstat (limited to 'net/wireless')
| -rw-r--r-- | net/wireless/nl80211.c | 11 | ||||
| -rw-r--r-- | net/wireless/reg.c | 7 | ||||
| -rw-r--r-- | net/wireless/sme.c | 29 |
3 files changed, 39 insertions, 8 deletions
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 1cc47aca7f05..25d217d90807 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
| @@ -4770,9 +4770,9 @@ do { \ | |||
| 4770 | FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshForwarding, 0, 1, | 4770 | FILL_IN_MESH_PARAM_IF_SET(tb, cfg, dot11MeshForwarding, 0, 1, |
| 4771 | mask, NL80211_MESHCONF_FORWARDING, | 4771 | mask, NL80211_MESHCONF_FORWARDING, |
| 4772 | nla_get_u8); | 4772 | nla_get_u8); |
| 4773 | FILL_IN_MESH_PARAM_IF_SET(tb, cfg, rssi_threshold, 1, 255, | 4773 | FILL_IN_MESH_PARAM_IF_SET(tb, cfg, rssi_threshold, -255, 0, |
| 4774 | mask, NL80211_MESHCONF_RSSI_THRESHOLD, | 4774 | mask, NL80211_MESHCONF_RSSI_THRESHOLD, |
| 4775 | nla_get_u32); | 4775 | nla_get_s32); |
| 4776 | FILL_IN_MESH_PARAM_IF_SET(tb, cfg, ht_opmode, 0, 16, | 4776 | FILL_IN_MESH_PARAM_IF_SET(tb, cfg, ht_opmode, 0, 16, |
| 4777 | mask, NL80211_MESHCONF_HT_OPMODE, | 4777 | mask, NL80211_MESHCONF_HT_OPMODE, |
| 4778 | nla_get_u16); | 4778 | nla_get_u16); |
| @@ -6613,12 +6613,14 @@ EXPORT_SYMBOL(cfg80211_testmode_alloc_event_skb); | |||
| 6613 | 6613 | ||
| 6614 | void cfg80211_testmode_event(struct sk_buff *skb, gfp_t gfp) | 6614 | void cfg80211_testmode_event(struct sk_buff *skb, gfp_t gfp) |
| 6615 | { | 6615 | { |
| 6616 | struct cfg80211_registered_device *rdev = ((void **)skb->cb)[0]; | ||
| 6616 | void *hdr = ((void **)skb->cb)[1]; | 6617 | void *hdr = ((void **)skb->cb)[1]; |
| 6617 | struct nlattr *data = ((void **)skb->cb)[2]; | 6618 | struct nlattr *data = ((void **)skb->cb)[2]; |
| 6618 | 6619 | ||
| 6619 | nla_nest_end(skb, data); | 6620 | nla_nest_end(skb, data); |
| 6620 | genlmsg_end(skb, hdr); | 6621 | genlmsg_end(skb, hdr); |
| 6621 | genlmsg_multicast(skb, 0, nl80211_testmode_mcgrp.id, gfp); | 6622 | genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), skb, 0, |
| 6623 | nl80211_testmode_mcgrp.id, gfp); | ||
| 6622 | } | 6624 | } |
| 6623 | EXPORT_SYMBOL(cfg80211_testmode_event); | 6625 | EXPORT_SYMBOL(cfg80211_testmode_event); |
| 6624 | #endif | 6626 | #endif |
| @@ -10064,7 +10066,8 @@ void cfg80211_mgmt_tx_status(struct wireless_dev *wdev, u64 cookie, | |||
| 10064 | 10066 | ||
| 10065 | genlmsg_end(msg, hdr); | 10067 | genlmsg_end(msg, hdr); |
| 10066 | 10068 | ||
| 10067 | genlmsg_multicast(msg, 0, nl80211_mlme_mcgrp.id, gfp); | 10069 | genlmsg_multicast_netns(wiphy_net(&rdev->wiphy), msg, 0, |
| 10070 | nl80211_mlme_mcgrp.id, gfp); | ||
| 10068 | return; | 10071 | return; |
| 10069 | 10072 | ||
| 10070 | nla_put_failure: | 10073 | nla_put_failure: |
diff --git a/net/wireless/reg.c b/net/wireless/reg.c index 5a24c986f34b..de06d5d1287f 100644 --- a/net/wireless/reg.c +++ b/net/wireless/reg.c | |||
| @@ -2247,10 +2247,13 @@ int reg_device_uevent(struct device *dev, struct kobj_uevent_env *env) | |||
| 2247 | 2247 | ||
| 2248 | void wiphy_regulatory_register(struct wiphy *wiphy) | 2248 | void wiphy_regulatory_register(struct wiphy *wiphy) |
| 2249 | { | 2249 | { |
| 2250 | struct regulatory_request *lr; | ||
| 2251 | |||
| 2250 | if (!reg_dev_ignore_cell_hint(wiphy)) | 2252 | if (!reg_dev_ignore_cell_hint(wiphy)) |
| 2251 | reg_num_devs_support_basehint++; | 2253 | reg_num_devs_support_basehint++; |
| 2252 | 2254 | ||
| 2253 | wiphy_update_regulatory(wiphy, NL80211_REGDOM_SET_BY_CORE); | 2255 | lr = get_last_request(); |
| 2256 | wiphy_update_regulatory(wiphy, lr->initiator); | ||
| 2254 | } | 2257 | } |
| 2255 | 2258 | ||
| 2256 | void wiphy_regulatory_deregister(struct wiphy *wiphy) | 2259 | void wiphy_regulatory_deregister(struct wiphy *wiphy) |
| @@ -2279,7 +2282,9 @@ void wiphy_regulatory_deregister(struct wiphy *wiphy) | |||
| 2279 | static void reg_timeout_work(struct work_struct *work) | 2282 | static void reg_timeout_work(struct work_struct *work) |
| 2280 | { | 2283 | { |
| 2281 | REG_DBG_PRINT("Timeout while waiting for CRDA to reply, restoring regulatory settings\n"); | 2284 | REG_DBG_PRINT("Timeout while waiting for CRDA to reply, restoring regulatory settings\n"); |
| 2285 | rtnl_lock(); | ||
| 2282 | restore_regulatory_settings(true); | 2286 | restore_regulatory_settings(true); |
| 2287 | rtnl_unlock(); | ||
| 2283 | } | 2288 | } |
| 2284 | 2289 | ||
| 2285 | int __init regulatory_init(void) | 2290 | int __init regulatory_init(void) |
diff --git a/net/wireless/sme.c b/net/wireless/sme.c index 1d3cfb1a3f28..81c8a10d743c 100644 --- a/net/wireless/sme.c +++ b/net/wireless/sme.c | |||
| @@ -34,8 +34,10 @@ struct cfg80211_conn { | |||
| 34 | CFG80211_CONN_SCAN_AGAIN, | 34 | CFG80211_CONN_SCAN_AGAIN, |
| 35 | CFG80211_CONN_AUTHENTICATE_NEXT, | 35 | CFG80211_CONN_AUTHENTICATE_NEXT, |
| 36 | CFG80211_CONN_AUTHENTICATING, | 36 | CFG80211_CONN_AUTHENTICATING, |
| 37 | CFG80211_CONN_AUTH_FAILED, | ||
| 37 | CFG80211_CONN_ASSOCIATE_NEXT, | 38 | CFG80211_CONN_ASSOCIATE_NEXT, |
| 38 | CFG80211_CONN_ASSOCIATING, | 39 | CFG80211_CONN_ASSOCIATING, |
| 40 | CFG80211_CONN_ASSOC_FAILED, | ||
| 39 | CFG80211_CONN_DEAUTH, | 41 | CFG80211_CONN_DEAUTH, |
| 40 | CFG80211_CONN_CONNECTED, | 42 | CFG80211_CONN_CONNECTED, |
| 41 | } state; | 43 | } state; |
| @@ -164,6 +166,8 @@ static int cfg80211_conn_do_work(struct wireless_dev *wdev) | |||
| 164 | NULL, 0, | 166 | NULL, 0, |
| 165 | params->key, params->key_len, | 167 | params->key, params->key_len, |
| 166 | params->key_idx, NULL, 0); | 168 | params->key_idx, NULL, 0); |
| 169 | case CFG80211_CONN_AUTH_FAILED: | ||
| 170 | return -ENOTCONN; | ||
| 167 | case CFG80211_CONN_ASSOCIATE_NEXT: | 171 | case CFG80211_CONN_ASSOCIATE_NEXT: |
| 168 | BUG_ON(!rdev->ops->assoc); | 172 | BUG_ON(!rdev->ops->assoc); |
| 169 | wdev->conn->state = CFG80211_CONN_ASSOCIATING; | 173 | wdev->conn->state = CFG80211_CONN_ASSOCIATING; |
| @@ -188,10 +192,17 @@ static int cfg80211_conn_do_work(struct wireless_dev *wdev) | |||
| 188 | WLAN_REASON_DEAUTH_LEAVING, | 192 | WLAN_REASON_DEAUTH_LEAVING, |
| 189 | false); | 193 | false); |
| 190 | return err; | 194 | return err; |
| 195 | case CFG80211_CONN_ASSOC_FAILED: | ||
| 196 | cfg80211_mlme_deauth(rdev, wdev->netdev, params->bssid, | ||
| 197 | NULL, 0, | ||
| 198 | WLAN_REASON_DEAUTH_LEAVING, false); | ||
| 199 | return -ENOTCONN; | ||
| 191 | case CFG80211_CONN_DEAUTH: | 200 | case CFG80211_CONN_DEAUTH: |
| 192 | cfg80211_mlme_deauth(rdev, wdev->netdev, params->bssid, | 201 | cfg80211_mlme_deauth(rdev, wdev->netdev, params->bssid, |
| 193 | NULL, 0, | 202 | NULL, 0, |
| 194 | WLAN_REASON_DEAUTH_LEAVING, false); | 203 | WLAN_REASON_DEAUTH_LEAVING, false); |
| 204 | /* free directly, disconnected event already sent */ | ||
| 205 | cfg80211_sme_free(wdev); | ||
| 195 | return 0; | 206 | return 0; |
| 196 | default: | 207 | default: |
| 197 | return 0; | 208 | return 0; |
| @@ -371,7 +382,7 @@ bool cfg80211_sme_rx_assoc_resp(struct wireless_dev *wdev, u16 status) | |||
| 371 | return true; | 382 | return true; |
| 372 | } | 383 | } |
| 373 | 384 | ||
| 374 | wdev->conn->state = CFG80211_CONN_DEAUTH; | 385 | wdev->conn->state = CFG80211_CONN_ASSOC_FAILED; |
| 375 | schedule_work(&rdev->conn_work); | 386 | schedule_work(&rdev->conn_work); |
| 376 | return false; | 387 | return false; |
| 377 | } | 388 | } |
| @@ -383,7 +394,13 @@ void cfg80211_sme_deauth(struct wireless_dev *wdev) | |||
| 383 | 394 | ||
| 384 | void cfg80211_sme_auth_timeout(struct wireless_dev *wdev) | 395 | void cfg80211_sme_auth_timeout(struct wireless_dev *wdev) |
| 385 | { | 396 | { |
| 386 | cfg80211_sme_free(wdev); | 397 | struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy); |
| 398 | |||
| 399 | if (!wdev->conn) | ||
| 400 | return; | ||
| 401 | |||
| 402 | wdev->conn->state = CFG80211_CONN_AUTH_FAILED; | ||
| 403 | schedule_work(&rdev->conn_work); | ||
| 387 | } | 404 | } |
| 388 | 405 | ||
| 389 | void cfg80211_sme_disassoc(struct wireless_dev *wdev) | 406 | void cfg80211_sme_disassoc(struct wireless_dev *wdev) |
| @@ -399,7 +416,13 @@ void cfg80211_sme_disassoc(struct wireless_dev *wdev) | |||
| 399 | 416 | ||
| 400 | void cfg80211_sme_assoc_timeout(struct wireless_dev *wdev) | 417 | void cfg80211_sme_assoc_timeout(struct wireless_dev *wdev) |
| 401 | { | 418 | { |
| 402 | cfg80211_sme_disassoc(wdev); | 419 | struct cfg80211_registered_device *rdev = wiphy_to_dev(wdev->wiphy); |
| 420 | |||
| 421 | if (!wdev->conn) | ||
| 422 | return; | ||
| 423 | |||
| 424 | wdev->conn->state = CFG80211_CONN_ASSOC_FAILED; | ||
| 425 | schedule_work(&rdev->conn_work); | ||
| 403 | } | 426 | } |
| 404 | 427 | ||
| 405 | static int cfg80211_sme_connect(struct wireless_dev *wdev, | 428 | static int cfg80211_sme_connect(struct wireless_dev *wdev, |
