Lines Matching refs:wdev

54 static void cfg80211_sme_free(struct wireless_dev *wdev)
56 if (!wdev->conn)
59 kfree(wdev->conn->ie);
60 kfree(wdev->conn);
61 wdev->conn = NULL;
64 static int cfg80211_conn_scan(struct wireless_dev *wdev)
66 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
71 ASSERT_WDEV_LOCK(wdev);
76 if (wdev->conn->params.channel)
79 n_channels = ieee80211_get_num_supported_channels(wdev->wiphy);
87 if (wdev->conn->params.channel) {
88 enum nl80211_band band = wdev->conn->params.channel->band;
90 wdev->wiphy->bands[band];
96 request->channels[0] = wdev->conn->params.channel;
105 bands = wdev->wiphy->bands[band];
122 memcpy(request->ssids[0].ssid, wdev->conn->params.ssid,
123 wdev->conn->params.ssid_len);
124 request->ssids[0].ssid_len = wdev->conn->params.ssid_len;
128 request->wdev = wdev;
136 wdev->conn->state = CFG80211_CONN_SCANNING;
137 nl80211_send_scan_start(rdev, wdev);
138 dev_hold(wdev->netdev);
146 static int cfg80211_conn_do_work(struct wireless_dev *wdev,
149 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
154 ASSERT_WDEV_LOCK(wdev);
156 if (!wdev->conn)
159 params = &wdev->conn->params;
161 switch (wdev->conn->state) {
166 return cfg80211_conn_scan(wdev);
170 wdev->conn->state = CFG80211_CONN_AUTHENTICATING;
171 return cfg80211_mlme_auth(rdev, wdev->netdev,
184 wdev->conn->state = CFG80211_CONN_ASSOCIATING;
185 if (wdev->conn->prev_bssid_valid)
186 req.prev_bssid = wdev->conn->prev_bssid;
197 err = cfg80211_mlme_assoc(rdev, wdev->netdev, params->channel,
201 cfg80211_mlme_deauth(rdev, wdev->netdev, params->bssid,
210 cfg80211_mlme_deauth(rdev, wdev->netdev, params->bssid,
215 cfg80211_mlme_deauth(rdev, wdev->netdev, params->bssid,
221 cfg80211_sme_free(wdev);
232 struct wireless_dev *wdev;
238 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) {
239 if (!wdev->netdev)
242 wdev_lock(wdev);
243 if (!netif_running(wdev->netdev)) {
244 wdev_unlock(wdev);
247 if (!wdev->conn ||
248 wdev->conn->state == CFG80211_CONN_CONNECTED) {
249 wdev_unlock(wdev);
252 if (wdev->conn->params.bssid) {
253 memcpy(bssid_buf, wdev->conn->params.bssid, ETH_ALEN);
257 if (cfg80211_conn_do_work(wdev, &treason)) {
264 __cfg80211_connect_result(wdev->netdev, &cr, false);
266 wdev_unlock(wdev);
282 static struct cfg80211_bss *cfg80211_get_conn_bss(struct wireless_dev *wdev)
284 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
287 ASSERT_WDEV_LOCK(wdev);
289 bss = cfg80211_get_bss(wdev->wiphy, wdev->conn->params.channel,
290 wdev->conn->params.bssid,
291 wdev->conn->params.ssid,
292 wdev->conn->params.ssid_len,
293 wdev->conn_bss_type,
294 IEEE80211_PRIVACY(wdev->conn->params.privacy));
298 cfg80211_step_auth_next(wdev->conn, bss);
306 struct wireless_dev *wdev = dev->ieee80211_ptr;
307 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
310 ASSERT_WDEV_LOCK(wdev);
312 if (!wdev->conn)
315 if (wdev->conn->state != CFG80211_CONN_SCANNING &&
316 wdev->conn->state != CFG80211_CONN_SCAN_AGAIN)
319 bss = cfg80211_get_conn_bss(wdev);
328 struct wireless_dev *wdev = dev->ieee80211_ptr;
330 wdev_lock(wdev);
332 wdev_unlock(wdev);
335 void cfg80211_sme_rx_auth(struct wireless_dev *wdev, const u8 *buf, size_t len)
337 struct wiphy *wiphy = wdev->wiphy;
342 ASSERT_WDEV_LOCK(wdev);
344 if (!wdev->conn || wdev->conn->state == CFG80211_CONN_CONNECTED)
348 wdev->conn->auto_auth &&
349 wdev->conn->params.auth_type != NL80211_AUTHTYPE_NETWORK_EAP) {
351 switch (wdev->conn->params.auth_type) {
353 if (wdev->connect_keys)
354 wdev->conn->params.auth_type =
357 wdev->conn->params.auth_type =
361 wdev->conn->params.auth_type =
366 wdev->conn->params.auth_type =
370 wdev->conn->state = CFG80211_CONN_AUTHENTICATE_NEXT;
379 __cfg80211_connect_result(wdev->netdev, &cr, false);
380 } else if (wdev->conn->state == CFG80211_CONN_AUTHENTICATING) {
381 wdev->conn->state = CFG80211_CONN_ASSOCIATE_NEXT;
386 bool cfg80211_sme_rx_assoc_resp(struct wireless_dev *wdev, u16 status)
388 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
390 if (!wdev->conn)
394 wdev->conn->state = CFG80211_CONN_CONNECTED;
398 if (wdev->conn->prev_bssid_valid) {
404 wdev->conn->prev_bssid_valid = false;
405 wdev->conn->state = CFG80211_CONN_ASSOCIATE_NEXT;
410 wdev->conn->state = CFG80211_CONN_ASSOC_FAILED;
415 void cfg80211_sme_deauth(struct wireless_dev *wdev)
417 cfg80211_sme_free(wdev);
420 void cfg80211_sme_auth_timeout(struct wireless_dev *wdev)
422 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
424 if (!wdev->conn)
427 wdev->conn->state = CFG80211_CONN_AUTH_FAILED_TIMEOUT;
431 void cfg80211_sme_disassoc(struct wireless_dev *wdev)
433 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
435 if (!wdev->conn)
438 wdev->conn->state = CFG80211_CONN_DEAUTH;
442 void cfg80211_sme_assoc_timeout(struct wireless_dev *wdev)
444 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
446 if (!wdev->conn)
449 wdev->conn->state = CFG80211_CONN_ASSOC_FAILED_TIMEOUT;
453 void cfg80211_sme_abandon_assoc(struct wireless_dev *wdev)
455 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
457 if (!wdev->conn)
460 wdev->conn->state = CFG80211_CONN_ABANDON;
464 static int cfg80211_sme_get_conn_ies(struct wireless_dev *wdev,
468 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
520 static int cfg80211_sme_connect(struct wireless_dev *wdev,
524 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
531 if (wdev->current_bss) {
532 cfg80211_unhold_bss(wdev->current_bss);
533 cfg80211_put_bss(wdev->wiphy, &wdev->current_bss->pub);
534 wdev->current_bss = NULL;
536 cfg80211_sme_free(wdev);
539 if (wdev->conn)
542 wdev->conn = kzalloc(sizeof(*wdev->conn), GFP_KERNEL);
543 if (!wdev->conn)
549 memcpy(&wdev->conn->params, connect, sizeof(*connect));
551 wdev->conn->params.bssid = wdev->conn->bssid;
552 memcpy(wdev->conn->bssid, connect->bssid, ETH_ALEN);
555 if (cfg80211_sme_get_conn_ies(wdev, connect->ie, connect->ie_len,
556 &wdev->conn->ie,
557 &wdev->conn->params.ie_len)) {
558 kfree(wdev->conn);
559 wdev->conn = NULL;
562 wdev->conn->params.ie = wdev->conn->ie;
565 wdev->conn->auto_auth = true;
567 wdev->conn->params.auth_type =
570 wdev->conn->auto_auth = false;
573 wdev->conn->params.ssid = wdev->ssid;
574 wdev->conn->params.ssid_len = wdev->ssid_len;
577 bss = cfg80211_get_bss(wdev->wiphy, wdev->conn->params.channel,
578 wdev->conn->params.bssid,
579 wdev->conn->params.ssid,
580 wdev->conn->params.ssid_len,
581 wdev->conn_bss_type,
582 IEEE80211_PRIVACY(wdev->conn->params.privacy));
585 memcpy(wdev->conn->prev_bssid, prev_bssid, ETH_ALEN);
586 wdev->conn->prev_bssid_valid = true;
593 cfg80211_step_auth_next(wdev->conn, bss);
594 err = cfg80211_conn_do_work(wdev, &treason);
595 cfg80211_put_bss(wdev->wiphy, bss);
598 err = cfg80211_conn_scan(wdev);
607 wdev->conn->state = CFG80211_CONN_SCAN_AGAIN;
612 cfg80211_sme_free(wdev);
617 static int cfg80211_sme_disconnect(struct wireless_dev *wdev, u16 reason)
619 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
622 if (!wdev->conn)
628 if (wdev->conn->state == CFG80211_CONN_SCANNING ||
629 wdev->conn->state == CFG80211_CONN_SCAN_AGAIN) {
634 /* wdev->conn->params.bssid must be set if > SCANNING */
635 err = cfg80211_mlme_deauth(rdev, wdev->netdev,
636 wdev->conn->params.bssid,
639 cfg80211_sme_free(wdev);
650 struct wireless_dev *wdev;
662 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) {
663 wdev_lock(wdev);
664 if (wdev->conn || wdev->current_bss ||
665 cfg80211_beaconing_iface_active(wdev))
667 wdev_unlock(wdev);
695 struct wireless_dev *wdev = dev->ieee80211_ptr;
701 ASSERT_WDEV_LOCK(wdev);
703 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_STATION &&
704 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT)) {
705 cfg80211_put_bss(wdev->wiphy, cr->bss);
709 wdev->unprot_beacon_reported = 0;
710 nl80211_send_connect_result(wiphy_to_rdev(wdev->wiphy), dev, cr,
733 memcpy(wdev->wext.prev_bssid, cr->bssid, ETH_ALEN);
734 wdev->wext.prev_bssid_valid = true;
741 WARN_ON_ONCE(!wiphy_to_rdev(wdev->wiphy)->ops->connect);
742 cr->bss = cfg80211_get_bss(wdev->wiphy, NULL, cr->bssid,
743 wdev->ssid, wdev->ssid_len,
744 wdev->conn_bss_type,
750 if (wdev->current_bss) {
751 cfg80211_unhold_bss(wdev->current_bss);
752 cfg80211_put_bss(wdev->wiphy, &wdev->current_bss->pub);
753 wdev->current_bss = NULL;
757 kfree_sensitive(wdev->connect_keys);
758 wdev->connect_keys = NULL;
759 wdev->ssid_len = 0;
760 wdev->conn_owner_nlportid = 0;
763 cfg80211_put_bss(wdev->wiphy, cr->bss);
765 cfg80211_sme_free(wdev);
772 wdev->current_bss = bss_from_pub(cr->bss);
774 if (!(wdev->wiphy->flags & WIPHY_FLAG_HAS_STATIC_WEP))
775 cfg80211_upload_connect_keys(wdev);
795 regulatory_hint_country_ie(wdev->wiphy, cr->bss->channel->band,
805 struct wireless_dev *wdev = dev->ieee80211_ptr;
806 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
817 found = cfg80211_get_bss(wdev->wiphy, NULL,
819 wdev->ssid, wdev->ssid_len,
820 wdev->conn_bss_type,
841 cfg80211_put_bss(wdev->wiphy, tmp);
850 cfg80211_put_bss(wdev->wiphy, params->bss);
904 spin_lock_irqsave(&wdev->event_lock, flags);
905 list_add_tail(&ev->list, &wdev->event_list);
906 spin_unlock_irqrestore(&wdev->event_lock, flags);
912 void __cfg80211_roamed(struct wireless_dev *wdev,
918 ASSERT_WDEV_LOCK(wdev);
920 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_STATION &&
921 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT))
924 if (WARN_ON(!wdev->current_bss))
927 cfg80211_unhold_bss(wdev->current_bss);
928 cfg80211_put_bss(wdev->wiphy, &wdev->current_bss->pub);
929 wdev->current_bss = NULL;
935 wdev->current_bss = bss_from_pub(info->bss);
937 wdev->unprot_beacon_reported = 0;
938 nl80211_send_roamed(wiphy_to_rdev(wdev->wiphy),
939 wdev->netdev, info, GFP_KERNEL);
945 wireless_send_event(wdev->netdev, IWEVASSOCREQIE,
952 wireless_send_event(wdev->netdev, IWEVASSOCRESPIE,
959 memcpy(wdev->wext.prev_bssid, info->bss->bssid, ETH_ALEN);
960 wdev->wext.prev_bssid_valid = true;
961 wireless_send_event(wdev->netdev, SIOCGIWAP, &wrqu, NULL);
966 cfg80211_put_bss(wdev->wiphy, info->bss);
973 struct wireless_dev *wdev = dev->ieee80211_ptr;
974 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
980 info->bss = cfg80211_get_bss(wdev->wiphy, info->channel,
981 info->bssid, wdev->ssid,
982 wdev->ssid_len,
983 wdev->conn_bss_type,
994 cfg80211_put_bss(wdev->wiphy, info->bss);
1038 spin_lock_irqsave(&wdev->event_lock, flags);
1039 list_add_tail(&ev->list, &wdev->event_list);
1040 spin_unlock_irqrestore(&wdev->event_lock, flags);
1045 void __cfg80211_port_authorized(struct wireless_dev *wdev, const u8 *bssid)
1047 ASSERT_WDEV_LOCK(wdev);
1049 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_STATION))
1052 if (WARN_ON(!wdev->current_bss) ||
1053 WARN_ON(!ether_addr_equal(wdev->current_bss->pub.bssid, bssid)))
1056 nl80211_send_port_authorized(wiphy_to_rdev(wdev->wiphy), wdev->netdev,
1063 struct wireless_dev *wdev = dev->ieee80211_ptr;
1064 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
1079 * Use the wdev event list so that if there are pending
1082 spin_lock_irqsave(&wdev->event_lock, flags);
1083 list_add_tail(&ev->list, &wdev->event_list);
1084 spin_unlock_irqrestore(&wdev->event_lock, flags);
1092 struct wireless_dev *wdev = dev->ieee80211_ptr;
1093 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
1099 ASSERT_WDEV_LOCK(wdev);
1101 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_STATION &&
1102 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT))
1105 if (wdev->current_bss) {
1106 cfg80211_unhold_bss(wdev->current_bss);
1107 cfg80211_put_bss(wdev->wiphy, &wdev->current_bss->pub);
1110 wdev->current_bss = NULL;
1111 wdev->ssid_len = 0;
1112 wdev->conn_owner_nlportid = 0;
1113 kfree_sensitive(wdev->connect_keys);
1114 wdev->connect_keys = NULL;
1121 rdev_crit_proto_stop(rdev, wdev);
1132 wdev->wiphy,
1135 wdev->wiphy,
1148 wdev->wext.connect.ssid_len = 0;
1158 struct wireless_dev *wdev = dev->ieee80211_ptr;
1159 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
1174 spin_lock_irqsave(&wdev->event_lock, flags);
1175 list_add_tail(&ev->list, &wdev->event_list);
1176 spin_unlock_irqrestore(&wdev->event_lock, flags);
1190 struct wireless_dev *wdev = dev->ieee80211_ptr;
1193 ASSERT_WDEV_LOCK(wdev);
1200 if (wdev->ssid_len &&
1201 (wdev->ssid_len != connect->ssid_len ||
1202 memcmp(wdev->ssid, connect->ssid, wdev->ssid_len)))
1209 if (wdev->current_bss) {
1212 if (!ether_addr_equal(prev_bssid, wdev->current_bss->pub.bssid))
1221 if (wdev->connect_keys)
1261 /* connect can point to wdev->wext.connect which
1269 wdev->connect_keys = connkeys;
1270 memcpy(wdev->ssid, connect->ssid, connect->ssid_len);
1271 wdev->ssid_len = connect->ssid_len;
1273 wdev->conn_bss_type = connect->pbss ? IEEE80211_BSS_TYPE_PBSS :
1277 err = cfg80211_sme_connect(wdev, connect, prev_bssid);
1282 wdev->connect_keys = NULL;
1287 if (!wdev->current_bss)
1288 wdev->ssid_len = 0;
1298 struct wireless_dev *wdev = dev->ieee80211_ptr;
1301 ASSERT_WDEV_LOCK(wdev);
1303 kfree_sensitive(wdev->connect_keys);
1304 wdev->connect_keys = NULL;
1306 wdev->conn_owner_nlportid = 0;
1308 if (wdev->conn)
1309 err = cfg80211_sme_disconnect(wdev, reason);
1312 else if (wdev->ssid_len)
1320 if (!wdev->current_bss)
1321 wdev->ssid_len = 0;
1332 struct wireless_dev *wdev =
1334 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
1336 wdev_lock(wdev);
1338 if (wdev->conn_owner_nlportid) {
1339 switch (wdev->iftype) {
1341 __cfg80211_leave_ibss(rdev, wdev->netdev, false);
1345 __cfg80211_stop_ap(rdev, wdev->netdev, false);
1348 __cfg80211_leave_mesh(rdev, wdev->netdev);
1357 if (rdev->ops->disconnect || wdev->current_bss)
1358 cfg80211_disconnect(rdev, wdev->netdev,
1362 cfg80211_mlme_deauth(rdev, wdev->netdev,
1363 wdev->disconnect_bssid,
1373 wdev_unlock(wdev);