Lines Matching defs:sdata

38 ieee80211_ibss_build_presp(struct ieee80211_sub_if_data *sdata,
45 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
46 struct ieee80211_local *local = sdata->local;
80 memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN);
183 ieee80211_apply_htcap_overrides(sdata, &ht_cap);
218 static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
225 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
226 struct ieee80211_local *local = sdata->local;
238 sdata_assert_lock(sdata);
241 drv_reset_tsf(local, sdata);
244 sta_info_flush(sdata);
247 if (sdata->vif.bss_conf.ibss_joined) {
248 sdata->vif.bss_conf.ibss_joined = false;
249 sdata->vif.bss_conf.ibss_creator = false;
250 sdata->vif.bss_conf.enable_beacon = false;
251 netif_carrier_off(sdata->dev);
252 ieee80211_bss_info_change_notify(sdata,
255 drv_leave_ibss(local, sdata);
259 lockdep_is_held(&sdata->wdev.mtx));
273 sdata_info(sdata,
282 sdata_info(sdata,
288 err = cfg80211_chandef_dfs_required(sdata->local->hw.wiphy,
291 sdata_info(sdata,
296 sdata_info(sdata,
304 if (ieee80211_vif_use_channel(sdata, &chandef,
308 sdata_info(sdata, "Failed to join IBSS, no channel context\n");
312 sdata->radar_required = radar_required;
317 presp = ieee80211_ibss_build_presp(sdata, beacon_int, basic_rates,
326 sdata->vif.bss_conf.enable_beacon = true;
327 sdata->vif.bss_conf.beacon_int = beacon_int;
328 sdata->vif.bss_conf.basic_rates = basic_rates;
329 sdata->vif.bss_conf.ssid_len = ifibss->ssid_len;
330 memcpy(sdata->vif.bss_conf.ssid, ifibss->ssid, ifibss->ssid_len);
332 bss_change |= ieee80211_reset_erp_info(sdata);
351 sdata->vif.bss_conf.use_short_slot = chan->band == NL80211_BAND_5GHZ;
356 sdata->flags |= IEEE80211_SDATA_OPERATING_GMODE;
358 sdata->flags &= ~IEEE80211_SDATA_OPERATING_GMODE;
360 ieee80211_set_wmm_default(sdata, true, false);
362 sdata->vif.bss_conf.ibss_joined = true;
363 sdata->vif.bss_conf.ibss_creator = creator;
365 err = drv_join_ibss(local, sdata);
367 sdata->vif.bss_conf.ibss_joined = false;
368 sdata->vif.bss_conf.ibss_creator = false;
369 sdata->vif.bss_conf.enable_beacon = false;
370 sdata->vif.bss_conf.ssid_len = 0;
374 ieee80211_vif_release_channel(sdata);
376 sdata_info(sdata, "Failed to join IBSS, driver failure: %d\n",
381 ieee80211_bss_info_change_notify(sdata, bss_change);
393 netif_carrier_on(sdata->dev);
394 cfg80211_ibss_joined(sdata->dev, ifibss->bssid, chan, GFP_KERNEL);
397 static void ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
413 sdata_assert_lock(sdata);
418 switch (sdata->u.ibss.chandef.width) {
422 chan_type = cfg80211_get_chandef_type(&sdata->u.ibss.chandef);
429 chandef.width = sdata->u.ibss.chandef.width;
434 chandef = sdata->u.ibss.chandef;
444 sband = sdata->local->hw.wiphy->bands[cbss->channel->band];
445 rate_flags = ieee80211_chandef_rate_flags(&sdata->u.ibss.chandef);
446 shift = ieee80211_vif_get_shift(&sdata->vif);
475 __ieee80211_sta_join_ibss(sdata, cbss->bssid,
483 int ieee80211_ibss_csa_beacon(struct ieee80211_sub_if_data *sdata,
486 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
494 sdata_assert_lock(sdata);
499 cbss = cfg80211_get_bss(sdata->local->hw.wiphy, ifibss->chandef.chan,
513 cfg80211_put_bss(sdata->local->hw.wiphy, cbss);
516 lockdep_is_held(&sdata->wdev.mtx));
518 presp = ieee80211_ibss_build_presp(sdata,
519 sdata->vif.bss_conf.beacon_int,
520 sdata->vif.bss_conf.basic_rates,
537 int ieee80211_ibss_finish_csa(struct ieee80211_sub_if_data *sdata)
539 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
542 sdata_assert_lock(sdata);
550 cbss = cfg80211_get_bss(sdata->local->hw.wiphy,
558 cbss->channel = sdata->csa_chandef.chan;
559 cfg80211_put_bss(sdata->local->hw.wiphy, cbss);
563 ifibss->chandef = sdata->csa_chandef;
566 return ieee80211_ibss_csa_beacon(sdata, NULL);
569 void ieee80211_ibss_stop(struct ieee80211_sub_if_data *sdata)
571 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
579 struct ieee80211_sub_if_data *sdata = sta->sdata;
584 ibss_dbg(sdata, "Adding new IBSS station %pM\n", addr);
590 if (!sta->sdata->u.ibss.control_port)
597 return sta_info_get(sdata, addr);
602 ieee80211_ibss_add_sta(struct ieee80211_sub_if_data *sdata, const u8 *bssid,
606 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
607 struct ieee80211_local *local = sdata->local;
620 sdata->name, addr);
630 if (!ether_addr_equal(bssid, sdata->u.ibss.bssid)) {
636 chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
643 sta = sta_info_alloc(sdata, addr, GFP_KERNEL);
657 static int ieee80211_sta_active_ibss(struct ieee80211_sub_if_data *sdata)
659 struct ieee80211_local *local = sdata->local;
663 sdata_assert_lock(sdata);
670 if (sta->sdata == sdata &&
683 static void ieee80211_ibss_disconnect(struct ieee80211_sub_if_data *sdata)
685 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
686 struct ieee80211_local *local = sdata->local;
700 cfg80211_put_bss(sdata->local->hw.wiphy, cbss);
706 sta_info_flush(sdata);
720 netif_carrier_off(sdata->dev);
722 sdata->vif.bss_conf.ibss_joined = false;
723 sdata->vif.bss_conf.ibss_creator = false;
724 sdata->vif.bss_conf.enable_beacon = false;
725 sdata->vif.bss_conf.ssid_len = 0;
729 lockdep_is_held(&sdata->wdev.mtx));
730 RCU_INIT_POINTER(sdata->u.ibss.presp, NULL);
734 clear_bit(SDATA_STATE_OFFCHANNEL_BEACON_STOPPED, &sdata->state);
735 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON_ENABLED |
737 drv_leave_ibss(local, sdata);
739 ieee80211_vif_release_channel(sdata);
745 struct ieee80211_sub_if_data *sdata =
749 sdata_lock(sdata);
751 ieee80211_ibss_disconnect(sdata);
753 skb_queue_purge(&sdata->skb_queue);
756 ieee80211_queue_work(&sdata->local->hw, &sdata->work);
758 sdata_unlock(sdata);
761 static void ieee80211_ibss_csa_mark_radar(struct ieee80211_sub_if_data *sdata)
763 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
769 err = cfg80211_chandef_dfs_required(sdata->local->hw.wiphy,
773 cfg80211_radar_event(sdata->local->hw.wiphy, &ifibss->chandef,
778 ieee80211_ibss_process_chanswitch(struct ieee80211_sub_if_data *sdata,
784 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
790 sdata_assert_lock(sdata);
810 err = ieee80211_parse_ch_switch_ie(sdata, elems,
823 if (!(sdata->local->hw.wiphy->flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH))
845 sdata_info(sdata,
861 if (!cfg80211_reg_can_beacon(sdata->local->hw.wiphy, &params.chandef,
863 sdata_info(sdata,
873 err = cfg80211_chandef_dfs_required(sdata->local->hw.wiphy,
886 &sdata->vif.bss_conf.chandef)) {
887 ibss_dbg(sdata,
893 ibss_dbg(sdata,
899 if (ieee80211_channel_switch(sdata->local->hw.wiphy, sdata->dev,
903 ieee80211_ibss_csa_mark_radar(sdata);
907 ibss_dbg(sdata, "Can't handle channel switch, disconnect\n");
908 ieee80211_queue_work(&sdata->local->hw,
911 ieee80211_ibss_csa_mark_radar(sdata);
917 ieee80211_rx_mgmt_spectrum_mgmt(struct ieee80211_sub_if_data *sdata,
937 if (!sdata->vif.csa_active)
938 ieee80211_ibss_process_chanswitch(sdata, elems, false);
941 static void ieee80211_rx_mgmt_deauth_ibss(struct ieee80211_sub_if_data *sdata,
950 ibss_dbg(sdata, "RX DeAuth SA=%pM DA=%pM\n", mgmt->sa, mgmt->da);
951 ibss_dbg(sdata, "\tBSSID=%pM (reason: %d)\n", mgmt->bssid, reason);
952 sta_info_destroy_addr(sdata, mgmt->sa);
955 static void ieee80211_rx_mgmt_auth_ibss(struct ieee80211_sub_if_data *sdata,
961 sdata_assert_lock(sdata);
969 ibss_dbg(sdata, "RX Auth SA=%pM DA=%pM\n", mgmt->sa, mgmt->da);
970 ibss_dbg(sdata, "\tBSSID=%pM (auth_transaction=%d)\n",
982 ieee80211_send_auth(sdata, 2, WLAN_AUTH_OPEN, 0, NULL, 0,
983 mgmt->sa, sdata->u.ibss.bssid, NULL, 0, 0, 0);
986 static void ieee80211_update_sta_info(struct ieee80211_sub_if_data *sdata,
995 struct ieee80211_local *local = sdata->local;
1000 if (sdata->vif.type != NL80211_IFTYPE_ADHOC)
1003 if (!ether_addr_equal(mgmt->bssid, sdata->u.ibss.bssid))
1011 sta = sta_info_get(sdata, mgmt->sa);
1014 supp_rates = ieee80211_sta_get_rates(sdata, elems,
1030 ibss_dbg(sdata,
1038 sta = ieee80211_ibss_add_sta(sdata, mgmt->bssid,
1051 sdata->u.ibss.chandef.width != NL80211_CHAN_WIDTH_20_NOHT &&
1052 sdata->u.ibss.chandef.width != NL80211_CHAN_WIDTH_5 &&
1053 sdata->u.ibss.chandef.width != NL80211_CHAN_WIDTH_10) {
1063 rates_updated |= ieee80211_ht_cap_ie_to_sta_ht_cap(sdata, sband,
1068 sdata->u.ibss.chandef.width != NL80211_CHAN_WIDTH_20 &&
1069 sdata->u.ibss.chandef.width != NL80211_CHAN_WIDTH_40) {
1081 ieee80211_vht_cap_ie_to_sta_vht_cap(sdata, sband,
1090 if (!cfg80211_chandef_compatible(&sdata->u.ibss.chandef,
1105 drv_sta_rc_update(local, sdata, &sta->sta, changed);
1111 static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata,
1116 struct ieee80211_local *local = sdata->local;
1128 ieee80211_update_sta_info(sdata, mgmt, len, rx_status, elems, channel);
1146 if (sdata->u.ibss.fixed_channel &&
1147 sdata->u.ibss.chandef.chan != cbss->channel)
1151 if (elems->ssid_len != sdata->u.ibss.ssid_len ||
1152 memcmp(elems->ssid, sdata->u.ibss.ssid,
1153 sdata->u.ibss.ssid_len))
1157 if (sdata->vif.csa_active ||
1158 ieee80211_ibss_process_chanswitch(sdata, elems, true))
1162 if (ether_addr_equal(cbss->bssid, sdata->u.ibss.bssid))
1166 if (sdata->u.ibss.fixed_bssid)
1179 rx_timestamp = drv_get_tsf(local, sdata);
1182 ibss_dbg(sdata, "RX beacon SA=%pM BSSID=%pM TSF=0x%llx\n",
1185 ibss_dbg(sdata, "\tBCN=0x%llx diff=%lld @%lu\n",
1191 ibss_dbg(sdata,
1194 ieee80211_sta_join_ibss(sdata, bss);
1195 supp_rates = ieee80211_sta_get_rates(sdata, elems, band, NULL);
1196 ieee80211_ibss_add_sta(sdata, mgmt->bssid, mgmt->sa,
1205 void ieee80211_ibss_rx_no_sta(struct ieee80211_sub_if_data *sdata,
1209 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
1210 struct ieee80211_local *local = sdata->local;
1223 sdata->name, addr);
1230 if (!ether_addr_equal(bssid, sdata->u.ibss.bssid))
1234 chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
1243 sta = sta_info_alloc(sdata, addr, GFP_ATOMIC);
1255 ieee80211_queue_work(&local->hw, &sdata->work);
1258 static void ieee80211_ibss_sta_expire(struct ieee80211_sub_if_data *sdata)
1260 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
1261 struct ieee80211_local *local = sdata->local;
1271 if (sdata != sta->sdata)
1279 sta_dbg(sta->sdata, "expiring inactive %sSTA %pM\n",
1283 ieee80211_send_deauth_disassoc(sdata, sta->sta.addr,
1299 static void ieee80211_sta_merge_ibss(struct ieee80211_sub_if_data *sdata)
1301 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
1304 sdata_assert_lock(sdata);
1309 ieee80211_ibss_sta_expire(sdata);
1315 if (ieee80211_sta_active_ibss(sdata))
1321 sdata_info(sdata,
1325 ieee80211_request_ibss_scan(sdata, ifibss->ssid, ifibss->ssid_len,
1329 static void ieee80211_sta_create_ibss(struct ieee80211_sub_if_data *sdata)
1331 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
1336 sdata_assert_lock(sdata);
1346 bssid[i] ^= sdata->vif.addr[i];
1351 sdata_info(sdata, "Creating new IBSS network, BSSID %pM\n", bssid);
1358 __ieee80211_sta_join_ibss(sdata, bssid, sdata->vif.bss_conf.beacon_int,
1437 static void ieee80211_sta_find_ibss(struct ieee80211_sub_if_data *sdata)
1439 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
1440 struct ieee80211_local *local = sdata->local;
1447 sdata_assert_lock(sdata);
1449 active_ibss = ieee80211_sta_active_ibss(sdata);
1450 ibss_dbg(sdata, "sta_find_ibss (active_ibss=%d)\n", active_ibss);
1470 ibss_dbg(sdata,
1473 sdata_info(sdata,
1477 ieee80211_sta_join_ibss(sdata, bss);
1486 sdata_info(sdata, "Created IBSS using preconfigured BSSID %pM\n",
1488 ieee80211_sta_create_ibss(sdata);
1493 ibss_dbg(sdata, "sta_find_ibss: did not try to join ibss\n");
1501 sdata_info(sdata, "Trigger new scan to find an IBSS to join\n");
1510 ieee80211_request_ibss_scan(sdata, ifibss->ssid,
1514 ieee80211_request_ibss_scan(sdata, ifibss->ssid,
1523 ieee80211_sta_create_ibss(sdata);
1530 static void ieee80211_rx_mgmt_probe_req(struct ieee80211_sub_if_data *sdata,
1534 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
1535 struct ieee80211_local *local = sdata->local;
1541 sdata_assert_lock(sdata);
1544 lockdep_is_held(&sdata->wdev.mtx));
1552 ibss_dbg(sdata, "RX ProbeReq SA=%pM DA=%pM\n", mgmt->sa, mgmt->da);
1553 ibss_dbg(sdata, "\tBSSID=%pM (tx_last_beacon=%d)\n",
1567 ibss_dbg(sdata, "Invalid SSID IE in ProbeReq from %pM\n",
1587 ibss_dbg(sdata, "Sending ProbeResp to %pM\n", mgmt->sa);
1594 ieee80211_tx_skb(sdata, skb);
1598 void ieee80211_rx_mgmt_probe_beacon(struct ieee80211_sub_if_data *sdata,
1619 ieee80211_rx_bss_info(sdata, mgmt, len, rx_status, &elems);
1622 void ieee80211_ibss_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
1635 sdata_lock(sdata);
1637 if (!sdata->u.ibss.ssid_len)
1642 ieee80211_rx_mgmt_probe_req(sdata, skb);
1646 ieee80211_rx_mgmt_probe_beacon(sdata, mgmt, skb->len,
1650 ieee80211_rx_mgmt_auth_ibss(sdata, mgmt, skb->len);
1653 ieee80211_rx_mgmt_deauth_ibss(sdata, mgmt, skb->len);
1672 ieee80211_rx_mgmt_spectrum_mgmt(sdata, mgmt, skb->len,
1679 sdata_unlock(sdata);
1682 void ieee80211_ibss_work(struct ieee80211_sub_if_data *sdata)
1684 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
1687 sdata_lock(sdata);
1712 ieee80211_sta_find_ibss(sdata);
1715 ieee80211_sta_merge_ibss(sdata);
1723 sdata_unlock(sdata);
1728 struct ieee80211_sub_if_data *sdata =
1729 from_timer(sdata, t, u.ibss.timer);
1731 ieee80211_queue_work(&sdata->local->hw, &sdata->work);
1734 void ieee80211_ibss_setup_sdata(struct ieee80211_sub_if_data *sdata)
1736 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
1748 struct ieee80211_sub_if_data *sdata;
1751 list_for_each_entry(sdata, &local->interfaces, list) {
1752 if (!ieee80211_sdata_running(sdata))
1754 if (sdata->vif.type != NL80211_IFTYPE_ADHOC)
1756 sdata->u.ibss.last_scan_completed = jiffies;
1761 int ieee80211_ibss_join(struct ieee80211_sub_if_data *sdata,
1768 struct ieee80211_local *local = sdata->local;
1780 sdata->wdev.iftype);
1794 ret = ieee80211_check_combinations(sdata, &params->chandef, chanmode,
1801 memcpy(sdata->u.ibss.bssid, params->bssid, ETH_ALEN);
1802 sdata->u.ibss.fixed_bssid = true;
1804 sdata->u.ibss.fixed_bssid = false;
1806 sdata->u.ibss.privacy = params->privacy;
1807 sdata->u.ibss.control_port = params->control_port;
1808 sdata->u.ibss.userspace_handles_dfs = params->userspace_handles_dfs;
1809 sdata->u.ibss.basic_rates = params->basic_rates;
1810 sdata->u.ibss.last_scan_completed = jiffies;
1817 sdata->u.ibss.basic_rates &= ~BIT(i);
1819 memcpy(sdata->vif.bss_conf.mcast_rate, params->mcast_rate,
1822 sdata->vif.bss_conf.beacon_int = params->beacon_interval;
1824 sdata->u.ibss.chandef = params->chandef;
1825 sdata->u.ibss.fixed_channel = params->channel_fixed;
1828 sdata->u.ibss.ie = kmemdup(params->ie, params->ie_len,
1830 if (sdata->u.ibss.ie)
1831 sdata->u.ibss.ie_len = params->ie_len;
1834 sdata->u.ibss.state = IEEE80211_IBSS_MLME_SEARCH;
1835 sdata->u.ibss.ibss_join_req = jiffies;
1837 memcpy(sdata->u.ibss.ssid, params->ssid, params->ssid_len);
1838 sdata->u.ibss.ssid_len = params->ssid_len;
1840 memcpy(&sdata->u.ibss.ht_capa, &params->ht_capa,
1841 sizeof(sdata->u.ibss.ht_capa));
1842 memcpy(&sdata->u.ibss.ht_capa_mask, &params->ht_capa_mask,
1843 sizeof(sdata->u.ibss.ht_capa_mask));
1855 sdata->vif.bss_conf.ht_operation_mode |=
1860 ieee80211_bss_info_change_notify(sdata, changed);
1862 sdata->smps_mode = IEEE80211_SMPS_OFF;
1863 sdata->needed_rx_chains = local->rx_chains;
1864 sdata->control_port_over_nl80211 = params->control_port_over_nl80211;
1866 ieee80211_queue_work(&local->hw, &sdata->work);
1871 int ieee80211_ibss_leave(struct ieee80211_sub_if_data *sdata)
1873 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
1875 ieee80211_ibss_disconnect(sdata);
1880 kfree(sdata->u.ibss.ie);
1881 sdata->u.ibss.ie = NULL;
1882 sdata->u.ibss.ie_len = 0;
1890 skb_queue_purge(&sdata->skb_queue);
1892 del_timer_sync(&sdata->u.ibss.timer);