Lines Matching refs: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;
79 memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN);
179 ieee80211_apply_htcap_overrides(sdata, &ht_cap);
214 static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
221 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
222 struct ieee80211_local *local = sdata->local;
237 drv_reset_tsf(local, sdata);
240 sta_info_flush(sdata, -1);
243 if (sdata->vif.cfg.ibss_joined) {
244 sdata->vif.cfg.ibss_joined = false;
245 sdata->vif.cfg.ibss_creator = false;
246 sdata->vif.bss_conf.enable_beacon = false;
247 netif_carrier_off(sdata->dev);
248 ieee80211_bss_info_change_notify(sdata,
251 drv_leave_ibss(local, sdata);
254 presp = sdata_dereference(ifibss->presp, sdata);
268 sdata_info(sdata,
277 sdata_info(sdata,
283 err = cfg80211_chandef_dfs_required(sdata->local->hw.wiphy,
286 sdata_info(sdata,
291 sdata_info(sdata,
298 if (ieee80211_link_use_channel(&sdata->deflink, &chanreq,
302 sdata_info(sdata, "Failed to join IBSS, no channel context\n");
305 sdata->deflink.radar_required = radar_required;
309 presp = ieee80211_ibss_build_presp(sdata, beacon_int, basic_rates,
318 sdata->vif.bss_conf.enable_beacon = true;
319 sdata->vif.bss_conf.beacon_int = beacon_int;
320 sdata->vif.bss_conf.basic_rates = basic_rates;
321 sdata->vif.cfg.ssid_len = ifibss->ssid_len;
322 memcpy(sdata->vif.cfg.ssid, ifibss->ssid, ifibss->ssid_len);
324 bss_change |= ieee80211_reset_erp_info(sdata);
343 sdata->vif.bss_conf.use_short_slot = chan->band == NL80211_BAND_5GHZ;
347 sdata->deflink.operating_11g_mode =
350 ieee80211_set_wmm_default(&sdata->deflink, true, false);
352 sdata->vif.cfg.ibss_joined = true;
353 sdata->vif.cfg.ibss_creator = creator;
355 err = drv_join_ibss(local, sdata);
357 sdata->vif.cfg.ibss_joined = false;
358 sdata->vif.cfg.ibss_creator = false;
359 sdata->vif.bss_conf.enable_beacon = false;
360 sdata->vif.cfg.ssid_len = 0;
363 ieee80211_link_release_channel(&sdata->deflink);
364 sdata_info(sdata, "Failed to join IBSS, driver failure: %d\n",
369 ieee80211_bss_info_change_notify(sdata, bss_change);
380 netif_carrier_on(sdata->dev);
381 cfg80211_ibss_joined(sdata->dev, ifibss->bssid, chan, GFP_KERNEL);
384 static void ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
399 lockdep_assert_wiphy(sdata->local->hw.wiphy);
404 switch (sdata->u.ibss.chandef.width) {
408 chan_type = cfg80211_get_chandef_type(&sdata->u.ibss.chandef);
415 chandef.width = sdata->u.ibss.chandef.width;
420 chandef = sdata->u.ibss.chandef;
430 sband = sdata->local->hw.wiphy->bands[cbss->channel->band];
431 rate_flags = ieee80211_chandef_rate_flags(&sdata->u.ibss.chandef);
459 __ieee80211_sta_join_ibss(sdata, cbss->bssid,
467 int ieee80211_ibss_csa_beacon(struct ieee80211_sub_if_data *sdata,
471 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
478 lockdep_assert_wiphy(sdata->local->hw.wiphy);
483 cbss = cfg80211_get_bss(sdata->local->hw.wiphy, ifibss->chandef.chan,
495 cfg80211_put_bss(sdata->local->hw.wiphy, cbss);
497 old_presp = sdata_dereference(ifibss->presp, sdata);
499 presp = ieee80211_ibss_build_presp(sdata,
500 sdata->vif.bss_conf.beacon_int,
501 sdata->vif.bss_conf.basic_rates,
515 int ieee80211_ibss_finish_csa(struct ieee80211_sub_if_data *sdata, u64 *changed)
517 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
520 lockdep_assert_wiphy(sdata->local->hw.wiphy);
528 cbss = cfg80211_get_bss(sdata->local->hw.wiphy,
536 cbss->channel = sdata->deflink.csa_chanreq.oper.chan;
537 cfg80211_put_bss(sdata->local->hw.wiphy, cbss);
541 ifibss->chandef = sdata->deflink.csa_chanreq.oper;
544 return ieee80211_ibss_csa_beacon(sdata, NULL, changed);
547 void ieee80211_ibss_stop(struct ieee80211_sub_if_data *sdata)
549 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
551 wiphy_work_cancel(sdata->local->hw.wiphy,
558 struct ieee80211_sub_if_data *sdata = sta->sdata;
563 ibss_dbg(sdata, "Adding new IBSS station %pM\n", addr);
569 if (!sta->sdata->u.ibss.control_port)
576 return sta_info_get(sdata, addr);
581 ieee80211_ibss_add_sta(struct ieee80211_sub_if_data *sdata, const u8 *bssid,
585 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
586 struct ieee80211_local *local = sdata->local;
598 sdata->name, addr);
608 if (!ether_addr_equal(bssid, sdata->u.ibss.bssid)) {
614 chanctx_conf = rcu_dereference(sdata->vif.bss_conf.chanctx_conf);
620 sta = sta_info_alloc(sdata, addr, GFP_KERNEL);
634 static int ieee80211_sta_active_ibss(struct ieee80211_sub_if_data *sdata)
636 struct ieee80211_local *local = sdata->local;
640 lockdep_assert_wiphy(sdata->local->hw.wiphy);
647 if (sta->sdata == sdata &&
660 static void ieee80211_ibss_disconnect(struct ieee80211_sub_if_data *sdata)
662 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
663 struct ieee80211_local *local = sdata->local;
679 cfg80211_put_bss(sdata->local->hw.wiphy, cbss);
685 sta_info_flush(sdata, -1);
699 netif_carrier_off(sdata->dev);
701 sdata->vif.cfg.ibss_joined = false;
702 sdata->vif.cfg.ibss_creator = false;
703 sdata->vif.bss_conf.enable_beacon = false;
704 sdata->vif.cfg.ssid_len = 0;
707 presp = sdata_dereference(ifibss->presp, sdata);
708 RCU_INIT_POINTER(sdata->u.ibss.presp, NULL);
712 clear_bit(SDATA_STATE_OFFCHANNEL_BEACON_STOPPED, &sdata->state);
713 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON_ENABLED |
715 drv_leave_ibss(local, sdata);
716 ieee80211_link_release_channel(&sdata->deflink);
722 struct ieee80211_sub_if_data *sdata =
726 ieee80211_ibss_disconnect(sdata);
728 skb_queue_purge(&sdata->skb_queue);
731 wiphy_work_queue(sdata->local->hw.wiphy, &sdata->work);
734 static void ieee80211_ibss_csa_mark_radar(struct ieee80211_sub_if_data *sdata)
736 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
742 err = cfg80211_chandef_dfs_required(sdata->local->hw.wiphy,
746 cfg80211_radar_event(sdata->local->hw.wiphy, &ifibss->chandef,
751 ieee80211_ibss_process_chanswitch(struct ieee80211_sub_if_data *sdata,
757 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
766 lockdep_assert_wiphy(sdata->local->hw.wiphy);
785 err = ieee80211_parse_ch_switch_ie(sdata, elems,
798 if (!(sdata->local->hw.wiphy->flags & WIPHY_FLAG_HAS_CHANNEL_SWITCH))
820 sdata_info(sdata,
836 if (!cfg80211_reg_can_beacon(sdata->local->hw.wiphy, &params.chandef,
838 sdata_info(sdata,
848 err = cfg80211_chandef_dfs_required(sdata->local->hw.wiphy,
861 &sdata->vif.bss_conf.chanreq.oper)) {
862 ibss_dbg(sdata,
868 ibss_dbg(sdata,
874 if (ieee80211_channel_switch(sdata->local->hw.wiphy, sdata->dev,
878 ieee80211_ibss_csa_mark_radar(sdata);
882 ibss_dbg(sdata, "Can't handle channel switch, disconnect\n");
883 wiphy_work_queue(sdata->local->hw.wiphy,
886 ieee80211_ibss_csa_mark_radar(sdata);
892 ieee80211_rx_mgmt_spectrum_mgmt(struct ieee80211_sub_if_data *sdata,
912 if (!sdata->vif.bss_conf.csa_active)
913 ieee80211_ibss_process_chanswitch(sdata, elems, false);
916 static void ieee80211_rx_mgmt_deauth_ibss(struct ieee80211_sub_if_data *sdata,
925 ibss_dbg(sdata, "RX DeAuth SA=%pM DA=%pM\n", mgmt->sa, mgmt->da);
926 ibss_dbg(sdata, "\tBSSID=%pM (reason: %d)\n", mgmt->bssid, reason);
927 sta_info_destroy_addr(sdata, mgmt->sa);
930 static void ieee80211_rx_mgmt_auth_ibss(struct ieee80211_sub_if_data *sdata,
936 lockdep_assert_wiphy(sdata->local->hw.wiphy);
944 ibss_dbg(sdata, "RX Auth SA=%pM DA=%pM\n", mgmt->sa, mgmt->da);
945 ibss_dbg(sdata, "\tBSSID=%pM (auth_transaction=%d)\n",
957 ieee80211_send_auth(sdata, 2, WLAN_AUTH_OPEN, 0, NULL, 0,
958 mgmt->sa, sdata->u.ibss.bssid, NULL, 0, 0, 0);
961 static void ieee80211_update_sta_info(struct ieee80211_sub_if_data *sdata,
969 struct ieee80211_local *local = sdata->local;
974 if (sdata->vif.type != NL80211_IFTYPE_ADHOC)
977 if (!ether_addr_equal(mgmt->bssid, sdata->u.ibss.bssid))
985 sta = sta_info_get(sdata, mgmt->sa);
988 supp_rates = ieee80211_sta_get_rates(sdata, elems,
998 ibss_dbg(sdata,
1006 sta = ieee80211_ibss_add_sta(sdata, mgmt->bssid,
1019 sdata->u.ibss.chandef.width != NL80211_CHAN_WIDTH_20_NOHT &&
1020 sdata->u.ibss.chandef.width != NL80211_CHAN_WIDTH_5 &&
1021 sdata->u.ibss.chandef.width != NL80211_CHAN_WIDTH_10) {
1031 rates_updated |= ieee80211_ht_cap_ie_to_sta_ht_cap(sdata, sband,
1036 sdata->u.ibss.chandef.width != NL80211_CHAN_WIDTH_20 &&
1037 sdata->u.ibss.chandef.width != NL80211_CHAN_WIDTH_40) {
1049 ieee80211_vht_cap_ie_to_sta_vht_cap(sdata, sband,
1059 if (!cfg80211_chandef_compatible(&sdata->u.ibss.chandef,
1074 drv_sta_rc_update(local, sdata, &sta->sta, changed);
1080 static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata,
1085 struct ieee80211_local *local = sdata->local;
1097 ieee80211_update_sta_info(sdata, mgmt, len, rx_status, elems, channel);
1115 if (sdata->u.ibss.fixed_channel &&
1116 sdata->u.ibss.chandef.chan != cbss->channel)
1120 if (elems->ssid_len != sdata->u.ibss.ssid_len ||
1121 memcmp(elems->ssid, sdata->u.ibss.ssid,
1122 sdata->u.ibss.ssid_len))
1126 if (sdata->vif.bss_conf.csa_active ||
1127 ieee80211_ibss_process_chanswitch(sdata, elems, true))
1131 if (ether_addr_equal(cbss->bssid, sdata->u.ibss.bssid))
1135 if (sdata->u.ibss.fixed_bssid)
1148 rx_timestamp = drv_get_tsf(local, sdata);
1151 ibss_dbg(sdata, "RX beacon SA=%pM BSSID=%pM TSF=0x%llx\n",
1154 ibss_dbg(sdata, "\tBCN=0x%llx diff=%lld @%lu\n",
1160 ibss_dbg(sdata,
1163 ieee80211_sta_join_ibss(sdata, bss);
1164 supp_rates = ieee80211_sta_get_rates(sdata, elems, band, NULL);
1165 ieee80211_ibss_add_sta(sdata, mgmt->bssid, mgmt->sa,
1174 void ieee80211_ibss_rx_no_sta(struct ieee80211_sub_if_data *sdata,
1178 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
1179 struct ieee80211_local *local = sdata->local;
1191 sdata->name, addr);
1198 if (!ether_addr_equal(bssid, sdata->u.ibss.bssid))
1202 chanctx_conf = rcu_dereference(sdata->vif.bss_conf.chanctx_conf);
1210 sta = sta_info_alloc(sdata, addr, GFP_ATOMIC);
1222 wiphy_work_queue(local->hw.wiphy, &sdata->work);
1225 static void ieee80211_ibss_sta_expire(struct ieee80211_sub_if_data *sdata)
1227 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
1228 struct ieee80211_local *local = sdata->local;
1238 if (sdata != sta->sdata)
1246 sta_dbg(sta->sdata, "expiring inactive %sSTA %pM\n",
1250 ieee80211_send_deauth_disassoc(sdata, sta->sta.addr,
1264 static void ieee80211_sta_merge_ibss(struct ieee80211_sub_if_data *sdata)
1266 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
1268 lockdep_assert_wiphy(sdata->local->hw.wiphy);
1273 ieee80211_ibss_sta_expire(sdata);
1279 if (ieee80211_sta_active_ibss(sdata))
1285 sdata_info(sdata,
1288 ieee80211_request_ibss_scan(sdata, ifibss->ssid, ifibss->ssid_len,
1292 static void ieee80211_sta_create_ibss(struct ieee80211_sub_if_data *sdata)
1294 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
1299 lockdep_assert_wiphy(sdata->local->hw.wiphy);
1309 bssid[i] ^= sdata->vif.addr[i];
1314 sdata_info(sdata, "Creating new IBSS network, BSSID %pM\n", bssid);
1321 __ieee80211_sta_join_ibss(sdata, bssid, sdata->vif.bss_conf.beacon_int,
1400 static void ieee80211_sta_find_ibss(struct ieee80211_sub_if_data *sdata)
1402 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
1403 struct ieee80211_local *local = sdata->local;
1409 lockdep_assert_wiphy(sdata->local->hw.wiphy);
1411 active_ibss = ieee80211_sta_active_ibss(sdata);
1412 ibss_dbg(sdata, "sta_find_ibss (active_ibss=%d)\n", active_ibss);
1432 ibss_dbg(sdata,
1435 sdata_info(sdata,
1439 ieee80211_sta_join_ibss(sdata, bss);
1448 sdata_info(sdata, "Created IBSS using preconfigured BSSID %pM\n",
1450 ieee80211_sta_create_ibss(sdata);
1455 ibss_dbg(sdata, "sta_find_ibss: did not try to join ibss\n");
1463 sdata_info(sdata, "Trigger new scan to find an IBSS to join\n");
1470 ieee80211_request_ibss_scan(sdata, ifibss->ssid,
1474 ieee80211_request_ibss_scan(sdata, ifibss->ssid,
1482 ieee80211_sta_create_ibss(sdata);
1489 static void ieee80211_rx_mgmt_probe_req(struct ieee80211_sub_if_data *sdata,
1493 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
1494 struct ieee80211_local *local = sdata->local;
1500 lockdep_assert_wiphy(sdata->local->hw.wiphy);
1502 presp = sdata_dereference(ifibss->presp, sdata);
1510 ibss_dbg(sdata, "RX ProbeReq SA=%pM DA=%pM\n", mgmt->sa, mgmt->da);
1511 ibss_dbg(sdata, "\tBSSID=%pM (tx_last_beacon=%d)\n",
1525 ibss_dbg(sdata, "Invalid SSID IE in ProbeReq from %pM\n",
1545 ibss_dbg(sdata, "Sending ProbeResp to %pM\n", mgmt->sa);
1552 ieee80211_tx_skb(sdata, skb);
1556 void ieee80211_rx_mgmt_probe_beacon(struct ieee80211_sub_if_data *sdata,
1578 ieee80211_rx_bss_info(sdata, mgmt, len, rx_status, elems);
1583 void ieee80211_ibss_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
1596 if (!sdata->u.ibss.ssid_len)
1601 ieee80211_rx_mgmt_probe_req(sdata, skb);
1605 ieee80211_rx_mgmt_probe_beacon(sdata, mgmt, skb->len,
1609 ieee80211_rx_mgmt_auth_ibss(sdata, mgmt, skb->len);
1612 ieee80211_rx_mgmt_deauth_ibss(sdata, mgmt, skb->len);
1629 ieee80211_rx_mgmt_spectrum_mgmt(sdata, mgmt,
1639 void ieee80211_ibss_work(struct ieee80211_sub_if_data *sdata)
1641 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
1667 ieee80211_sta_find_ibss(sdata);
1670 ieee80211_sta_merge_ibss(sdata);
1680 struct ieee80211_sub_if_data *sdata =
1681 from_timer(sdata, t, u.ibss.timer);
1683 wiphy_work_queue(sdata->local->hw.wiphy, &sdata->work);
1686 void ieee80211_ibss_setup_sdata(struct ieee80211_sub_if_data *sdata)
1688 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
1700 struct ieee80211_sub_if_data *sdata;
1704 list_for_each_entry(sdata, &local->interfaces, list) {
1705 if (!ieee80211_sdata_running(sdata))
1707 if (sdata->vif.type != NL80211_IFTYPE_ADHOC)
1709 sdata->u.ibss.last_scan_completed = jiffies;
1713 int ieee80211_ibss_join(struct ieee80211_sub_if_data *sdata,
1720 struct ieee80211_local *local = sdata->local;
1734 sdata->wdev.iftype);
1747 ret = ieee80211_check_combinations(sdata, &params->chandef, chanmode,
1753 memcpy(sdata->u.ibss.bssid, params->bssid, ETH_ALEN);
1754 sdata->u.ibss.fixed_bssid = true;
1756 sdata->u.ibss.fixed_bssid = false;
1758 sdata->u.ibss.privacy = params->privacy;
1759 sdata->u.ibss.control_port = params->control_port;
1760 sdata->u.ibss.userspace_handles_dfs = params->userspace_handles_dfs;
1761 sdata->u.ibss.basic_rates = params->basic_rates;
1762 sdata->u.ibss.last_scan_completed = jiffies;
1769 sdata->u.ibss.basic_rates &= ~BIT(i);
1771 memcpy(sdata->vif.bss_conf.mcast_rate, params->mcast_rate,
1774 sdata->vif.bss_conf.beacon_int = params->beacon_interval;
1776 sdata->u.ibss.chandef = params->chandef;
1777 sdata->u.ibss.fixed_channel = params->channel_fixed;
1780 sdata->u.ibss.ie = kmemdup(params->ie, params->ie_len,
1782 if (sdata->u.ibss.ie)
1783 sdata->u.ibss.ie_len = params->ie_len;
1786 sdata->u.ibss.state = IEEE80211_IBSS_MLME_SEARCH;
1787 sdata->u.ibss.ibss_join_req = jiffies;
1789 memcpy(sdata->u.ibss.ssid, params->ssid, params->ssid_len);
1790 sdata->u.ibss.ssid_len = params->ssid_len;
1792 memcpy(&sdata->u.ibss.ht_capa, &params->ht_capa,
1793 sizeof(sdata->u.ibss.ht_capa));
1794 memcpy(&sdata->u.ibss.ht_capa_mask, &params->ht_capa_mask,
1795 sizeof(sdata->u.ibss.ht_capa_mask));
1807 sdata->vif.bss_conf.ht_operation_mode |=
1812 ieee80211_link_info_change_notify(sdata, &sdata->deflink, changed);
1814 sdata->deflink.smps_mode = IEEE80211_SMPS_OFF;
1815 sdata->deflink.needed_rx_chains = local->rx_chains;
1816 sdata->control_port_over_nl80211 = params->control_port_over_nl80211;
1818 wiphy_work_queue(local->hw.wiphy, &sdata->work);
1823 int ieee80211_ibss_leave(struct ieee80211_sub_if_data *sdata)
1825 struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
1827 ieee80211_ibss_disconnect(sdata);
1832 kfree(sdata->u.ibss.ie);
1833 sdata->u.ibss.ie = NULL;
1834 sdata->u.ibss.ie_len = 0;
1842 skb_queue_purge(&sdata->skb_queue);
1844 del_timer_sync(&sdata->u.ibss.timer);