Lines Matching refs:wdev

50 static void cfg80211_sme_free(struct wireless_dev *wdev)  in cfg80211_sme_free()  argument
52 if (!wdev->conn) in cfg80211_sme_free()
55 kfree(wdev->conn->ie); in cfg80211_sme_free()
56 kfree(wdev->conn); in cfg80211_sme_free()
57 wdev->conn = NULL; in cfg80211_sme_free()
60 static int cfg80211_conn_scan(struct wireless_dev *wdev) in cfg80211_conn_scan() argument
62 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_conn_scan()
67 ASSERT_WDEV_LOCK(wdev); in cfg80211_conn_scan()
72 if (wdev->conn->params.channel) in cfg80211_conn_scan()
75 n_channels = ieee80211_get_num_supported_channels(wdev->wiphy); in cfg80211_conn_scan()
83 if (wdev->conn->params.channel) { in cfg80211_conn_scan()
84 enum ieee80211_band band = wdev->conn->params.channel->band; in cfg80211_conn_scan()
86 wdev->wiphy->bands[band]; in cfg80211_conn_scan()
92 request->channels[0] = wdev->conn->params.channel; in cfg80211_conn_scan()
101 bands = wdev->wiphy->bands[band]; in cfg80211_conn_scan()
118 memcpy(request->ssids[0].ssid, wdev->conn->params.ssid, in cfg80211_conn_scan()
119 wdev->conn->params.ssid_len); in cfg80211_conn_scan()
120 request->ssids[0].ssid_len = wdev->conn->params.ssid_len; in cfg80211_conn_scan()
122 request->wdev = wdev; in cfg80211_conn_scan()
130 wdev->conn->state = CFG80211_CONN_SCANNING; in cfg80211_conn_scan()
131 nl80211_send_scan_start(rdev, wdev); in cfg80211_conn_scan()
132 dev_hold(wdev->netdev); in cfg80211_conn_scan()
140 static int cfg80211_conn_do_work(struct wireless_dev *wdev) in cfg80211_conn_do_work() argument
142 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_conn_do_work()
147 ASSERT_WDEV_LOCK(wdev); in cfg80211_conn_do_work()
149 if (!wdev->conn) in cfg80211_conn_do_work()
152 params = &wdev->conn->params; in cfg80211_conn_do_work()
154 switch (wdev->conn->state) { in cfg80211_conn_do_work()
159 return cfg80211_conn_scan(wdev); in cfg80211_conn_do_work()
163 wdev->conn->state = CFG80211_CONN_AUTHENTICATING; in cfg80211_conn_do_work()
164 return cfg80211_mlme_auth(rdev, wdev->netdev, in cfg80211_conn_do_work()
176 wdev->conn->state = CFG80211_CONN_ASSOCIATING; in cfg80211_conn_do_work()
177 if (wdev->conn->prev_bssid_valid) in cfg80211_conn_do_work()
178 req.prev_bssid = wdev->conn->prev_bssid; in cfg80211_conn_do_work()
189 err = cfg80211_mlme_assoc(rdev, wdev->netdev, params->channel, in cfg80211_conn_do_work()
193 cfg80211_mlme_deauth(rdev, wdev->netdev, params->bssid, in cfg80211_conn_do_work()
199 cfg80211_mlme_deauth(rdev, wdev->netdev, params->bssid, in cfg80211_conn_do_work()
204 cfg80211_mlme_deauth(rdev, wdev->netdev, params->bssid, in cfg80211_conn_do_work()
208 cfg80211_sme_free(wdev); in cfg80211_conn_do_work()
219 struct wireless_dev *wdev; in cfg80211_conn_work() local
224 list_for_each_entry(wdev, &rdev->wdev_list, list) { in cfg80211_conn_work()
225 if (!wdev->netdev) in cfg80211_conn_work()
228 wdev_lock(wdev); in cfg80211_conn_work()
229 if (!netif_running(wdev->netdev)) { in cfg80211_conn_work()
230 wdev_unlock(wdev); in cfg80211_conn_work()
233 if (!wdev->conn || in cfg80211_conn_work()
234 wdev->conn->state == CFG80211_CONN_CONNECTED) { in cfg80211_conn_work()
235 wdev_unlock(wdev); in cfg80211_conn_work()
238 if (wdev->conn->params.bssid) { in cfg80211_conn_work()
239 memcpy(bssid_buf, wdev->conn->params.bssid, ETH_ALEN); in cfg80211_conn_work()
242 if (cfg80211_conn_do_work(wdev)) { in cfg80211_conn_work()
244 wdev->netdev, bssid, in cfg80211_conn_work()
249 wdev_unlock(wdev); in cfg80211_conn_work()
256 static struct cfg80211_bss *cfg80211_get_conn_bss(struct wireless_dev *wdev) in cfg80211_get_conn_bss() argument
258 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_get_conn_bss()
261 ASSERT_WDEV_LOCK(wdev); in cfg80211_get_conn_bss()
263 bss = cfg80211_get_bss(wdev->wiphy, wdev->conn->params.channel, in cfg80211_get_conn_bss()
264 wdev->conn->params.bssid, in cfg80211_get_conn_bss()
265 wdev->conn->params.ssid, in cfg80211_get_conn_bss()
266 wdev->conn->params.ssid_len, in cfg80211_get_conn_bss()
268 IEEE80211_PRIVACY(wdev->conn->params.privacy)); in cfg80211_get_conn_bss()
272 memcpy(wdev->conn->bssid, bss->bssid, ETH_ALEN); in cfg80211_get_conn_bss()
273 wdev->conn->params.bssid = wdev->conn->bssid; in cfg80211_get_conn_bss()
274 wdev->conn->params.channel = bss->channel; in cfg80211_get_conn_bss()
275 wdev->conn->state = CFG80211_CONN_AUTHENTICATE_NEXT; in cfg80211_get_conn_bss()
283 struct wireless_dev *wdev = dev->ieee80211_ptr; in __cfg80211_sme_scan_done() local
284 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in __cfg80211_sme_scan_done()
287 ASSERT_WDEV_LOCK(wdev); in __cfg80211_sme_scan_done()
289 if (!wdev->conn) in __cfg80211_sme_scan_done()
292 if (wdev->conn->state != CFG80211_CONN_SCANNING && in __cfg80211_sme_scan_done()
293 wdev->conn->state != CFG80211_CONN_SCAN_AGAIN) in __cfg80211_sme_scan_done()
296 bss = cfg80211_get_conn_bss(wdev); in __cfg80211_sme_scan_done()
305 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_sme_scan_done() local
307 wdev_lock(wdev); in cfg80211_sme_scan_done()
309 wdev_unlock(wdev); in cfg80211_sme_scan_done()
312 void cfg80211_sme_rx_auth(struct wireless_dev *wdev, const u8 *buf, size_t len) in cfg80211_sme_rx_auth() argument
314 struct wiphy *wiphy = wdev->wiphy; in cfg80211_sme_rx_auth()
319 ASSERT_WDEV_LOCK(wdev); in cfg80211_sme_rx_auth()
321 if (!wdev->conn || wdev->conn->state == CFG80211_CONN_CONNECTED) in cfg80211_sme_rx_auth()
325 wdev->conn->auto_auth && in cfg80211_sme_rx_auth()
326 wdev->conn->params.auth_type != NL80211_AUTHTYPE_NETWORK_EAP) { in cfg80211_sme_rx_auth()
328 switch (wdev->conn->params.auth_type) { in cfg80211_sme_rx_auth()
330 if (wdev->connect_keys) in cfg80211_sme_rx_auth()
331 wdev->conn->params.auth_type = in cfg80211_sme_rx_auth()
334 wdev->conn->params.auth_type = in cfg80211_sme_rx_auth()
338 wdev->conn->params.auth_type = in cfg80211_sme_rx_auth()
343 wdev->conn->params.auth_type = in cfg80211_sme_rx_auth()
347 wdev->conn->state = CFG80211_CONN_AUTHENTICATE_NEXT; in cfg80211_sme_rx_auth()
350 __cfg80211_connect_result(wdev->netdev, mgmt->bssid, in cfg80211_sme_rx_auth()
353 } else if (wdev->conn->state == CFG80211_CONN_AUTHENTICATING) { in cfg80211_sme_rx_auth()
354 wdev->conn->state = CFG80211_CONN_ASSOCIATE_NEXT; in cfg80211_sme_rx_auth()
359 bool cfg80211_sme_rx_assoc_resp(struct wireless_dev *wdev, u16 status) in cfg80211_sme_rx_assoc_resp() argument
361 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_sme_rx_assoc_resp()
363 if (!wdev->conn) in cfg80211_sme_rx_assoc_resp()
367 wdev->conn->state = CFG80211_CONN_CONNECTED; in cfg80211_sme_rx_assoc_resp()
371 if (wdev->conn->prev_bssid_valid) { in cfg80211_sme_rx_assoc_resp()
377 wdev->conn->prev_bssid_valid = false; in cfg80211_sme_rx_assoc_resp()
378 wdev->conn->state = CFG80211_CONN_ASSOCIATE_NEXT; in cfg80211_sme_rx_assoc_resp()
383 wdev->conn->state = CFG80211_CONN_ASSOC_FAILED; in cfg80211_sme_rx_assoc_resp()
388 void cfg80211_sme_deauth(struct wireless_dev *wdev) in cfg80211_sme_deauth() argument
390 cfg80211_sme_free(wdev); in cfg80211_sme_deauth()
393 void cfg80211_sme_auth_timeout(struct wireless_dev *wdev) in cfg80211_sme_auth_timeout() argument
395 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_sme_auth_timeout()
397 if (!wdev->conn) in cfg80211_sme_auth_timeout()
400 wdev->conn->state = CFG80211_CONN_AUTH_FAILED; in cfg80211_sme_auth_timeout()
404 void cfg80211_sme_disassoc(struct wireless_dev *wdev) in cfg80211_sme_disassoc() argument
406 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_sme_disassoc()
408 if (!wdev->conn) in cfg80211_sme_disassoc()
411 wdev->conn->state = CFG80211_CONN_DEAUTH; in cfg80211_sme_disassoc()
415 void cfg80211_sme_assoc_timeout(struct wireless_dev *wdev) in cfg80211_sme_assoc_timeout() argument
417 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_sme_assoc_timeout()
419 if (!wdev->conn) in cfg80211_sme_assoc_timeout()
422 wdev->conn->state = CFG80211_CONN_ASSOC_FAILED; in cfg80211_sme_assoc_timeout()
426 static int cfg80211_sme_get_conn_ies(struct wireless_dev *wdev, in cfg80211_sme_get_conn_ies() argument
430 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_sme_get_conn_ies()
482 static int cfg80211_sme_connect(struct wireless_dev *wdev, in cfg80211_sme_connect() argument
486 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_sme_connect()
493 if (wdev->current_bss) in cfg80211_sme_connect()
496 if (WARN_ON(wdev->conn)) in cfg80211_sme_connect()
499 wdev->conn = kzalloc(sizeof(*wdev->conn), GFP_KERNEL); in cfg80211_sme_connect()
500 if (!wdev->conn) in cfg80211_sme_connect()
506 memcpy(&wdev->conn->params, connect, sizeof(*connect)); in cfg80211_sme_connect()
508 wdev->conn->params.bssid = wdev->conn->bssid; in cfg80211_sme_connect()
509 memcpy(wdev->conn->bssid, connect->bssid, ETH_ALEN); in cfg80211_sme_connect()
512 if (cfg80211_sme_get_conn_ies(wdev, connect->ie, connect->ie_len, in cfg80211_sme_connect()
513 &wdev->conn->ie, in cfg80211_sme_connect()
514 &wdev->conn->params.ie_len)) { in cfg80211_sme_connect()
515 kfree(wdev->conn); in cfg80211_sme_connect()
516 wdev->conn = NULL; in cfg80211_sme_connect()
519 wdev->conn->params.ie = wdev->conn->ie; in cfg80211_sme_connect()
522 wdev->conn->auto_auth = true; in cfg80211_sme_connect()
524 wdev->conn->params.auth_type = in cfg80211_sme_connect()
527 wdev->conn->auto_auth = false; in cfg80211_sme_connect()
530 wdev->conn->params.ssid = wdev->ssid; in cfg80211_sme_connect()
531 wdev->conn->params.ssid_len = wdev->ssid_len; in cfg80211_sme_connect()
534 bss = cfg80211_get_conn_bss(wdev); in cfg80211_sme_connect()
537 memcpy(wdev->conn->prev_bssid, prev_bssid, ETH_ALEN); in cfg80211_sme_connect()
538 wdev->conn->prev_bssid_valid = true; in cfg80211_sme_connect()
543 err = cfg80211_conn_do_work(wdev); in cfg80211_sme_connect()
544 cfg80211_put_bss(wdev->wiphy, bss); in cfg80211_sme_connect()
547 err = cfg80211_conn_scan(wdev); in cfg80211_sme_connect()
556 wdev->conn->state = CFG80211_CONN_SCAN_AGAIN; in cfg80211_sme_connect()
561 cfg80211_sme_free(wdev); in cfg80211_sme_connect()
566 static int cfg80211_sme_disconnect(struct wireless_dev *wdev, u16 reason) in cfg80211_sme_disconnect() argument
568 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_sme_disconnect()
571 if (!wdev->conn) in cfg80211_sme_disconnect()
577 if (wdev->conn->state == CFG80211_CONN_SCANNING || in cfg80211_sme_disconnect()
578 wdev->conn->state == CFG80211_CONN_SCAN_AGAIN) { in cfg80211_sme_disconnect()
584 err = cfg80211_mlme_deauth(rdev, wdev->netdev, in cfg80211_sme_disconnect()
585 wdev->conn->params.bssid, in cfg80211_sme_disconnect()
588 cfg80211_sme_free(wdev); in cfg80211_sme_disconnect()
599 struct wireless_dev *wdev; in cfg80211_is_all_idle() local
608 list_for_each_entry(wdev, &rdev->wdev_list, list) { in cfg80211_is_all_idle()
609 wdev_lock(wdev); in cfg80211_is_all_idle()
610 if (wdev->conn || wdev->current_bss) in cfg80211_is_all_idle()
612 wdev_unlock(wdev); in cfg80211_is_all_idle()
642 struct wireless_dev *wdev = dev->ieee80211_ptr; in __cfg80211_connect_result() local
648 ASSERT_WDEV_LOCK(wdev); in __cfg80211_connect_result()
650 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_STATION && in __cfg80211_connect_result()
651 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)) { in __cfg80211_connect_result()
652 cfg80211_put_bss(wdev->wiphy, bss); in __cfg80211_connect_result()
656 nl80211_send_connect_result(wiphy_to_rdev(wdev->wiphy), dev, in __cfg80211_connect_result()
679 memcpy(wdev->wext.prev_bssid, bssid, ETH_ALEN); in __cfg80211_connect_result()
680 wdev->wext.prev_bssid_valid = true; in __cfg80211_connect_result()
687 WARN_ON_ONCE(!wiphy_to_rdev(wdev->wiphy)->ops->connect); in __cfg80211_connect_result()
688 bss = cfg80211_get_bss(wdev->wiphy, NULL, bssid, in __cfg80211_connect_result()
689 wdev->ssid, wdev->ssid_len, in __cfg80211_connect_result()
696 if (wdev->current_bss) { in __cfg80211_connect_result()
697 cfg80211_unhold_bss(wdev->current_bss); in __cfg80211_connect_result()
698 cfg80211_put_bss(wdev->wiphy, &wdev->current_bss->pub); in __cfg80211_connect_result()
699 wdev->current_bss = NULL; in __cfg80211_connect_result()
703 kzfree(wdev->connect_keys); in __cfg80211_connect_result()
704 wdev->connect_keys = NULL; in __cfg80211_connect_result()
705 wdev->ssid_len = 0; in __cfg80211_connect_result()
708 cfg80211_put_bss(wdev->wiphy, bss); in __cfg80211_connect_result()
710 cfg80211_sme_free(wdev); in __cfg80211_connect_result()
717 wdev->current_bss = bss_from_pub(bss); in __cfg80211_connect_result()
719 cfg80211_upload_connect_keys(wdev); in __cfg80211_connect_result()
739 regulatory_hint_country_ie(wdev->wiphy, bss->channel->band, in __cfg80211_connect_result()
749 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_connect_result() local
750 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_connect_result()
773 spin_lock_irqsave(&wdev->event_lock, flags); in cfg80211_connect_result()
774 list_add_tail(&ev->list, &wdev->event_list); in cfg80211_connect_result()
775 spin_unlock_irqrestore(&wdev->event_lock, flags); in cfg80211_connect_result()
781 void __cfg80211_roamed(struct wireless_dev *wdev, in __cfg80211_roamed() argument
789 ASSERT_WDEV_LOCK(wdev); in __cfg80211_roamed()
791 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_STATION && in __cfg80211_roamed()
792 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)) in __cfg80211_roamed()
795 if (WARN_ON(!wdev->current_bss)) in __cfg80211_roamed()
798 cfg80211_unhold_bss(wdev->current_bss); in __cfg80211_roamed()
799 cfg80211_put_bss(wdev->wiphy, &wdev->current_bss->pub); in __cfg80211_roamed()
800 wdev->current_bss = NULL; in __cfg80211_roamed()
803 wdev->current_bss = bss_from_pub(bss); in __cfg80211_roamed()
805 nl80211_send_roamed(wiphy_to_rdev(wdev->wiphy), in __cfg80211_roamed()
806 wdev->netdev, bss->bssid, in __cfg80211_roamed()
814 wireless_send_event(wdev->netdev, IWEVASSOCREQIE, in __cfg80211_roamed()
821 wireless_send_event(wdev->netdev, IWEVASSOCRESPIE, in __cfg80211_roamed()
828 memcpy(wdev->wext.prev_bssid, bss->bssid, ETH_ALEN); in __cfg80211_roamed()
829 wdev->wext.prev_bssid_valid = true; in __cfg80211_roamed()
830 wireless_send_event(wdev->netdev, SIOCGIWAP, &wrqu, NULL); in __cfg80211_roamed()
835 cfg80211_put_bss(wdev->wiphy, bss); in __cfg80211_roamed()
844 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_roamed() local
847 bss = cfg80211_get_bss(wdev->wiphy, channel, bssid, wdev->ssid, in cfg80211_roamed()
848 wdev->ssid_len, in cfg80211_roamed()
864 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_roamed_bss() local
865 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_roamed_bss()
874 cfg80211_put_bss(wdev->wiphy, bss); in cfg80211_roamed_bss()
887 spin_lock_irqsave(&wdev->event_lock, flags); in cfg80211_roamed_bss()
888 list_add_tail(&ev->list, &wdev->event_list); in cfg80211_roamed_bss()
889 spin_unlock_irqrestore(&wdev->event_lock, flags); in cfg80211_roamed_bss()
897 struct wireless_dev *wdev = dev->ieee80211_ptr; in __cfg80211_disconnected() local
898 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in __cfg80211_disconnected()
904 ASSERT_WDEV_LOCK(wdev); in __cfg80211_disconnected()
906 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_STATION && in __cfg80211_disconnected()
907 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)) in __cfg80211_disconnected()
910 if (wdev->current_bss) { in __cfg80211_disconnected()
911 cfg80211_unhold_bss(wdev->current_bss); in __cfg80211_disconnected()
912 cfg80211_put_bss(wdev->wiphy, &wdev->current_bss->pub); in __cfg80211_disconnected()
915 wdev->current_bss = NULL; in __cfg80211_disconnected()
916 wdev->ssid_len = 0; in __cfg80211_disconnected()
934 wdev->wext.connect.ssid_len = 0; in __cfg80211_disconnected()
943 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_disconnected() local
944 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy); in cfg80211_disconnected()
958 spin_lock_irqsave(&wdev->event_lock, flags); in cfg80211_disconnected()
959 list_add_tail(&ev->list, &wdev->event_list); in cfg80211_disconnected()
960 spin_unlock_irqrestore(&wdev->event_lock, flags); in cfg80211_disconnected()
974 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_connect() local
977 ASSERT_WDEV_LOCK(wdev); in cfg80211_connect()
979 if (WARN_ON(wdev->connect_keys)) { in cfg80211_connect()
980 kzfree(wdev->connect_keys); in cfg80211_connect()
981 wdev->connect_keys = NULL; in cfg80211_connect()
1014 wdev->connect_keys = connkeys; in cfg80211_connect()
1015 memcpy(wdev->ssid, connect->ssid, connect->ssid_len); in cfg80211_connect()
1016 wdev->ssid_len = connect->ssid_len; in cfg80211_connect()
1019 err = cfg80211_sme_connect(wdev, connect, prev_bssid); in cfg80211_connect()
1024 wdev->connect_keys = NULL; in cfg80211_connect()
1025 wdev->ssid_len = 0; in cfg80211_connect()
1035 struct wireless_dev *wdev = dev->ieee80211_ptr; in cfg80211_disconnect() local
1038 ASSERT_WDEV_LOCK(wdev); in cfg80211_disconnect()
1040 kzfree(wdev->connect_keys); in cfg80211_disconnect()
1041 wdev->connect_keys = NULL; in cfg80211_disconnect()
1043 if (wdev->conn) in cfg80211_disconnect()
1044 err = cfg80211_sme_disconnect(wdev, reason); in cfg80211_disconnect()
1047 else if (wdev->current_bss) in cfg80211_disconnect()