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);
70 ASSERT_WDEV_LOCK(wdev);
75 if (wdev->conn->params.channel)
78 n_channels = ieee80211_get_num_supported_channels(wdev->wiphy);
86 if (wdev->conn->params.channel) {
87 enum nl80211_band band = wdev->conn->params.channel->band;
89 wdev->wiphy->bands[band];
95 request->channels[0] = wdev->conn->params.channel;
104 bands = wdev->wiphy->bands[band];
121 memcpy(request->ssids[0].ssid, wdev->conn->params.ssid,
122 wdev->conn->params.ssid_len);
123 request->ssids[0].ssid_len = wdev->conn->params.ssid_len;
127 request->wdev = wdev;
135 wdev->conn->state = CFG80211_CONN_SCANNING;
136 nl80211_send_scan_start(rdev, wdev);
137 dev_hold(wdev->netdev);
145 static int cfg80211_conn_do_work(struct wireless_dev *wdev,
148 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;
181 err = cfg80211_mlme_auth(rdev, wdev->netdev, &auth_req);
190 wdev->conn->state = CFG80211_CONN_ASSOCIATING;
191 if (wdev->conn->prev_bssid_valid)
192 req.prev_bssid = wdev->conn->prev_bssid;
212 err = cfg80211_mlme_assoc(rdev, wdev->netdev, &req);
217 cfg80211_mlme_deauth(rdev, wdev->netdev, params->bssid,
226 cfg80211_mlme_deauth(rdev, wdev->netdev, params->bssid,
231 cfg80211_mlme_deauth(rdev, wdev->netdev, params->bssid,
237 cfg80211_sme_free(wdev);
248 struct wireless_dev *wdev;
254 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) {
255 if (!wdev->netdev)
258 wdev_lock(wdev);
259 if (!netif_running(wdev->netdev)) {
260 wdev_unlock(wdev);
263 if (!wdev->conn ||
264 wdev->conn->state == CFG80211_CONN_CONNECTED) {
265 wdev_unlock(wdev);
268 if (wdev->conn->params.bssid) {
269 memcpy(bssid_buf, wdev->conn->params.bssid, ETH_ALEN);
273 if (cfg80211_conn_do_work(wdev, &treason)) {
280 __cfg80211_connect_result(wdev->netdev, &cr, false);
282 wdev_unlock(wdev);
298 static struct cfg80211_bss *cfg80211_get_conn_bss(struct wireless_dev *wdev)
300 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
303 ASSERT_WDEV_LOCK(wdev);
305 bss = cfg80211_get_bss(wdev->wiphy, wdev->conn->params.channel,
306 wdev->conn->params.bssid,
307 wdev->conn->params.ssid,
308 wdev->conn->params.ssid_len,
309 wdev->conn_bss_type,
310 IEEE80211_PRIVACY(wdev->conn->params.privacy));
314 cfg80211_step_auth_next(wdev->conn, bss);
322 struct wireless_dev *wdev = dev->ieee80211_ptr;
323 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
326 ASSERT_WDEV_LOCK(wdev);
328 if (!wdev->conn)
331 if (wdev->conn->state != CFG80211_CONN_SCANNING &&
332 wdev->conn->state != CFG80211_CONN_SCAN_AGAIN)
335 bss = cfg80211_get_conn_bss(wdev);
344 struct wireless_dev *wdev = dev->ieee80211_ptr;
346 wdev_lock(wdev);
348 wdev_unlock(wdev);
351 void cfg80211_sme_rx_auth(struct wireless_dev *wdev, const u8 *buf, size_t len)
353 struct wiphy *wiphy = wdev->wiphy;
358 ASSERT_WDEV_LOCK(wdev);
360 if (!wdev->conn || wdev->conn->state == CFG80211_CONN_CONNECTED)
364 wdev->conn->auto_auth &&
365 wdev->conn->params.auth_type != NL80211_AUTHTYPE_NETWORK_EAP) {
367 switch (wdev->conn->params.auth_type) {
369 if (wdev->connect_keys)
370 wdev->conn->params.auth_type =
373 wdev->conn->params.auth_type =
377 wdev->conn->params.auth_type =
382 wdev->conn->params.auth_type =
386 wdev->conn->state = CFG80211_CONN_AUTHENTICATE_NEXT;
395 __cfg80211_connect_result(wdev->netdev, &cr, false);
396 } else if (wdev->conn->state == CFG80211_CONN_AUTHENTICATING) {
397 wdev->conn->state = CFG80211_CONN_ASSOCIATE_NEXT;
402 bool cfg80211_sme_rx_assoc_resp(struct wireless_dev *wdev, u16 status)
404 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
406 if (!wdev->conn)
410 wdev->conn->state = CFG80211_CONN_CONNECTED;
414 if (wdev->conn->prev_bssid_valid) {
420 wdev->conn->prev_bssid_valid = false;
421 wdev->conn->state = CFG80211_CONN_ASSOCIATE_NEXT;
426 wdev->conn->state = CFG80211_CONN_ASSOC_FAILED;
431 void cfg80211_sme_deauth(struct wireless_dev *wdev)
433 cfg80211_sme_free(wdev);
436 void cfg80211_sme_auth_timeout(struct wireless_dev *wdev)
438 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
440 if (!wdev->conn)
443 wdev->conn->state = CFG80211_CONN_AUTH_FAILED_TIMEOUT;
447 void cfg80211_sme_disassoc(struct wireless_dev *wdev)
449 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
451 if (!wdev->conn)
454 wdev->conn->state = CFG80211_CONN_DEAUTH;
458 void cfg80211_sme_assoc_timeout(struct wireless_dev *wdev)
460 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
462 if (!wdev->conn)
465 wdev->conn->state = CFG80211_CONN_ASSOC_FAILED_TIMEOUT;
469 void cfg80211_sme_abandon_assoc(struct wireless_dev *wdev)
471 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
473 if (!wdev->conn)
476 wdev->conn->state = CFG80211_CONN_ABANDON;
480 static void cfg80211_wdev_release_bsses(struct wireless_dev *wdev)
484 for_each_valid_link(wdev, link) {
485 if (!wdev->links[link].client.current_bss)
487 cfg80211_unhold_bss(wdev->links[link].client.current_bss);
488 cfg80211_put_bss(wdev->wiphy,
489 &wdev->links[link].client.current_bss->pub);
490 wdev->links[link].client.current_bss = NULL;
494 void cfg80211_wdev_release_link_bsses(struct wireless_dev *wdev, u16 link_mask)
498 for_each_valid_link(wdev, link) {
499 if (!wdev->links[link].client.current_bss ||
502 cfg80211_unhold_bss(wdev->links[link].client.current_bss);
503 cfg80211_put_bss(wdev->wiphy,
504 &wdev->links[link].client.current_bss->pub);
505 wdev->links[link].client.current_bss = NULL;
509 static int cfg80211_sme_get_conn_ies(struct wireless_dev *wdev,
513 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
565 static int cfg80211_sme_connect(struct wireless_dev *wdev,
569 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
576 cfg80211_wdev_release_bsses(wdev);
578 if (wdev->connected) {
579 cfg80211_sme_free(wdev);
580 wdev->connected = false;
583 if (wdev->conn)
586 wdev->conn = kzalloc(sizeof(*wdev->conn), GFP_KERNEL);
587 if (!wdev->conn)
593 memcpy(&wdev->conn->params, connect, sizeof(*connect));
595 wdev->conn->params.bssid = wdev->conn->bssid;
596 memcpy(wdev->conn->bssid, connect->bssid, ETH_ALEN);
599 if (cfg80211_sme_get_conn_ies(wdev, connect->ie, connect->ie_len,
600 &wdev->conn->ie,
601 &wdev->conn->params.ie_len)) {
602 kfree(wdev->conn);
603 wdev->conn = NULL;
606 wdev->conn->params.ie = wdev->conn->ie;
609 wdev->conn->auto_auth = true;
611 wdev->conn->params.auth_type =
614 wdev->conn->auto_auth = false;
617 wdev->conn->params.ssid = wdev->u.client.ssid;
618 wdev->conn->params.ssid_len = wdev->u.client.ssid_len;
621 bss = cfg80211_get_bss(wdev->wiphy, wdev->conn->params.channel,
622 wdev->conn->params.bssid,
623 wdev->conn->params.ssid,
624 wdev->conn->params.ssid_len,
625 wdev->conn_bss_type,
626 IEEE80211_PRIVACY(wdev->conn->params.privacy));
629 memcpy(wdev->conn->prev_bssid, prev_bssid, ETH_ALEN);
630 wdev->conn->prev_bssid_valid = true;
637 cfg80211_step_auth_next(wdev->conn, bss);
638 err = cfg80211_conn_do_work(wdev, &treason);
639 cfg80211_put_bss(wdev->wiphy, bss);
642 err = cfg80211_conn_scan(wdev);
651 wdev->conn->state = CFG80211_CONN_SCAN_AGAIN;
656 cfg80211_sme_free(wdev);
661 static int cfg80211_sme_disconnect(struct wireless_dev *wdev, u16 reason)
663 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
666 if (!wdev->conn)
672 if (wdev->conn->state == CFG80211_CONN_SCANNING ||
673 wdev->conn->state == CFG80211_CONN_SCAN_AGAIN) {
678 /* wdev->conn->params.bssid must be set if > SCANNING */
679 err = cfg80211_mlme_deauth(rdev, wdev->netdev,
680 wdev->conn->params.bssid,
683 cfg80211_sme_free(wdev);
694 struct wireless_dev *wdev;
706 list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) {
707 wdev_lock(wdev);
708 if (wdev->conn || wdev->connected ||
709 cfg80211_beaconing_iface_active(wdev))
711 wdev_unlock(wdev);
729 cfg80211_connect_result_release_bsses(struct wireless_dev *wdev,
738 cfg80211_put_bss(wdev->wiphy, cr->links[link].bss);
752 struct wireless_dev *wdev = dev->ieee80211_ptr;
764 ASSERT_WDEV_LOCK(wdev);
766 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_STATION &&
767 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT))
779 if (WARN_ON(wdev->connect_keys))
783 wdev->unprot_beacon_reported = 0;
784 nl80211_send_connect_result(wiphy_to_rdev(wdev->wiphy), dev, cr,
808 memcpy(wdev->wext.prev_bssid, connected_addr, ETH_ALEN);
809 wdev->wext.prev_bssid_valid = true;
816 if (!wiphy_to_rdev(wdev->wiphy)->ops->connect) {
832 cfg80211_get_bss(wdev->wiphy, NULL,
834 wdev->u.client.ssid,
835 wdev->u.client.ssid_len,
836 wdev->conn_bss_type,
846 cfg80211_wdev_release_bsses(wdev);
849 kfree_sensitive(wdev->connect_keys);
850 wdev->connect_keys = NULL;
851 wdev->u.client.ssid_len = 0;
852 wdev->conn_owner_nlportid = 0;
853 cfg80211_connect_result_release_bsses(wdev, cr);
854 cfg80211_sme_free(wdev);
859 cfg80211_connect_result_release_bsses(wdev, cr);
863 memset(wdev->links, 0, sizeof(wdev->links));
872 cfg80211_put_bss(wdev->wiphy, cr->links[link].bss);
874 wdev->valid_links = cr->valid_links;
876 wdev->links[link].client.current_bss =
878 wdev->connected = true;
879 ether_addr_copy(wdev->u.client.connected_addr, connected_addr);
882 memcpy(wdev->links[link].addr, cr->links[link].addr,
886 cfg80211_upload_connect_keys(wdev);
908 regulatory_hint_country_ie(wdev->wiphy,
913 if (!wdev->u.client.ssid_len) {
922 memcpy(wdev->u.client.ssid, ssid->data, ssid->datalen);
923 wdev->u.client.ssid_len = ssid->datalen;
932 cfg80211_put_bss(wdev->wiphy, cr->links[link].bss);
935 static void cfg80211_update_link_bss(struct wireless_dev *wdev,
938 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
948 found = cfg80211_get_bss(wdev->wiphy, NULL,
950 wdev->u.client.ssid,
951 wdev->u.client.ssid_len,
952 wdev->conn_bss_type,
973 cfg80211_put_bss(wdev->wiphy, tmp);
982 struct wireless_dev *wdev = dev->ieee80211_ptr;
983 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
991 cfg80211_update_link_bss(wdev, &params->links[link].bss);
1004 cfg80211_put_bss(wdev->wiphy,
1079 spin_lock_irqsave(&wdev->event_lock, flags);
1080 list_add_tail(&ev->list, &wdev->event_list);
1081 spin_unlock_irqrestore(&wdev->event_lock, flags);
1087 void __cfg80211_roamed(struct wireless_dev *wdev,
1096 ASSERT_WDEV_LOCK(wdev);
1098 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_STATION &&
1099 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT))
1102 if (WARN_ON(!wdev->connected))
1115 cfg80211_wdev_release_bsses(wdev);
1122 memset(wdev->links, 0, sizeof(wdev->links));
1123 wdev->valid_links = info->valid_links;
1126 wdev->links[link].client.current_bss =
1133 ether_addr_copy(wdev->u.client.connected_addr, connected_addr);
1136 memcpy(wdev->links[link].addr, info->links[link].addr,
1139 wdev->unprot_beacon_reported = 0;
1140 nl80211_send_roamed(wiphy_to_rdev(wdev->wiphy),
1141 wdev->netdev, info, GFP_KERNEL);
1148 wireless_send_event(wdev->netdev, IWEVASSOCREQIE,
1155 wireless_send_event(wdev->netdev, IWEVASSOCRESPIE,
1162 memcpy(wdev->wext.prev_bssid, connected_addr, ETH_ALEN);
1163 wdev->wext.prev_bssid_valid = true;
1164 wireless_send_event(wdev->netdev, SIOCGIWAP, &wrqu, NULL);
1171 cfg80211_put_bss(wdev->wiphy, info->links[link].bss);
1178 struct wireless_dev *wdev = dev->ieee80211_ptr;
1179 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
1195 cfg80211_get_bss(wdev->wiphy,
1198 wdev->u.client.ssid,
1199 wdev->u.client.ssid_len,
1200 wdev->conn_bss_type,
1284 spin_lock_irqsave(&wdev->event_lock, flags);
1285 list_add_tail(&ev->list, &wdev->event_list);
1286 spin_unlock_irqrestore(&wdev->event_lock, flags);
1292 cfg80211_put_bss(wdev->wiphy, info->links[link].bss);
1297 void __cfg80211_port_authorized(struct wireless_dev *wdev, const u8 *bssid,
1300 ASSERT_WDEV_LOCK(wdev);
1302 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_STATION &&
1303 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT))
1306 if (WARN_ON(!wdev->connected) ||
1307 WARN_ON(!ether_addr_equal(wdev->u.client.connected_addr, bssid)))
1310 nl80211_send_port_authorized(wiphy_to_rdev(wdev->wiphy), wdev->netdev,
1317 struct wireless_dev *wdev = dev->ieee80211_ptr;
1318 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
1336 * Use the wdev event list so that if there are pending
1339 spin_lock_irqsave(&wdev->event_lock, flags);
1340 list_add_tail(&ev->list, &wdev->event_list);
1341 spin_unlock_irqrestore(&wdev->event_lock, flags);
1349 struct wireless_dev *wdev = dev->ieee80211_ptr;
1350 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
1356 ASSERT_WDEV_LOCK(wdev);
1358 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_STATION &&
1359 wdev->iftype != NL80211_IFTYPE_P2P_CLIENT))
1362 cfg80211_wdev_release_bsses(wdev);
1363 wdev->connected = false;
1364 wdev->u.client.ssid_len = 0;
1365 wdev->conn_owner_nlportid = 0;
1366 kfree_sensitive(wdev->connect_keys);
1367 wdev->connect_keys = NULL;
1374 rdev_crit_proto_stop(rdev, wdev);
1385 wdev->wiphy,
1388 wdev->wiphy,
1401 wdev->wext.connect.ssid_len = 0;
1411 struct wireless_dev *wdev = dev->ieee80211_ptr;
1412 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
1427 spin_lock_irqsave(&wdev->event_lock, flags);
1428 list_add_tail(&ev->list, &wdev->event_list);
1429 spin_unlock_irqrestore(&wdev->event_lock, flags);
1443 struct wireless_dev *wdev = dev->ieee80211_ptr;
1446 ASSERT_WDEV_LOCK(wdev);
1453 if (wdev->u.client.ssid_len &&
1454 (wdev->u.client.ssid_len != connect->ssid_len ||
1455 memcmp(wdev->u.client.ssid, connect->ssid, wdev->u.client.ssid_len)))
1462 if (wdev->connected) {
1466 wdev->u.client.connected_addr))
1475 if (wdev->connect_keys)
1512 /* connect can point to wdev->wext.connect which
1520 wdev->connect_keys = connkeys;
1521 memcpy(wdev->u.client.ssid, connect->ssid, connect->ssid_len);
1522 wdev->u.client.ssid_len = connect->ssid_len;
1524 wdev->conn_bss_type = connect->pbss ? IEEE80211_BSS_TYPE_PBSS :
1528 err = cfg80211_sme_connect(wdev, connect, prev_bssid);
1533 wdev->connect_keys = NULL;
1538 if (!wdev->connected)
1539 wdev->u.client.ssid_len = 0;
1549 struct wireless_dev *wdev = dev->ieee80211_ptr;
1552 ASSERT_WDEV_LOCK(wdev);
1554 kfree_sensitive(wdev->connect_keys);
1555 wdev->connect_keys = NULL;
1557 wdev->conn_owner_nlportid = 0;
1559 if (wdev->conn)
1560 err = cfg80211_sme_disconnect(wdev, reason);
1563 else if (wdev->u.client.ssid_len)
1571 if (!wdev->connected)
1572 wdev->u.client.ssid_len = 0;
1583 struct wireless_dev *wdev =
1585 struct cfg80211_registered_device *rdev = wiphy_to_rdev(wdev->wiphy);
1587 wiphy_lock(wdev->wiphy);
1588 wdev_lock(wdev);
1590 if (wdev->conn_owner_nlportid) {
1591 switch (wdev->iftype) {
1593 __cfg80211_leave_ibss(rdev, wdev->netdev, false);
1597 __cfg80211_stop_ap(rdev, wdev->netdev, -1, false);
1600 __cfg80211_leave_mesh(rdev, wdev->netdev);
1609 if (rdev->ops->disconnect || wdev->connected)
1610 cfg80211_disconnect(rdev, wdev->netdev,
1614 cfg80211_mlme_deauth(rdev, wdev->netdev,
1615 wdev->disconnect_bssid,
1625 wdev_unlock(wdev);
1626 wiphy_unlock(wdev->wiphy);