Merge tag 'for-6.0/dm-changes-2' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-microblaze.git] / net / mac80211 / ibss.c
index 14c04fd..d56890e 100644 (file)
@@ -9,7 +9,7 @@
  * Copyright 2009, Johannes Berg <johannes@sipsolutions.net>
  * Copyright 2013-2014  Intel Mobile Communications GmbH
  * Copyright(c) 2016 Intel Deutschland GmbH
- * Copyright(c) 2018-2021 Intel Corporation
+ * Copyright(c) 2018-2022 Intel Corporation
  */
 
 #include <linux/delay.h>
@@ -244,9 +244,9 @@ static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
                sta_info_flush(sdata);
 
        /* if merging, indicate to driver that we leave the old IBSS */
-       if (sdata->vif.bss_conf.ibss_joined) {
-               sdata->vif.bss_conf.ibss_joined = false;
-               sdata->vif.bss_conf.ibss_creator = false;
+       if (sdata->vif.cfg.ibss_joined) {
+               sdata->vif.cfg.ibss_joined = false;
+               sdata->vif.cfg.ibss_creator = false;
                sdata->vif.bss_conf.enable_beacon = false;
                netif_carrier_off(sdata->dev);
                ieee80211_bss_info_change_notify(sdata,
@@ -255,8 +255,7 @@ static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
                drv_leave_ibss(local, sdata);
        }
 
-       presp = rcu_dereference_protected(ifibss->presp,
-                                         lockdep_is_held(&sdata->wdev.mtx));
+       presp = sdata_dereference(ifibss->presp, sdata);
        RCU_INIT_POINTER(ifibss->presp, NULL);
        if (presp)
                kfree_rcu(presp, rcu_head);
@@ -301,15 +300,15 @@ static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
        radar_required = err;
 
        mutex_lock(&local->mtx);
-       if (ieee80211_vif_use_channel(sdata, &chandef,
-                                     ifibss->fixed_channel ?
+       if (ieee80211_link_use_channel(&sdata->deflink, &chandef,
+                                      ifibss->fixed_channel ?
                                        IEEE80211_CHANCTX_SHARED :
                                        IEEE80211_CHANCTX_EXCLUSIVE)) {
                sdata_info(sdata, "Failed to join IBSS, no channel context\n");
                mutex_unlock(&local->mtx);
                return;
        }
-       sdata->radar_required = radar_required;
+       sdata->deflink.radar_required = radar_required;
        mutex_unlock(&local->mtx);
 
        memcpy(ifibss->bssid, bssid, ETH_ALEN);
@@ -326,8 +325,8 @@ static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
        sdata->vif.bss_conf.enable_beacon = true;
        sdata->vif.bss_conf.beacon_int = beacon_int;
        sdata->vif.bss_conf.basic_rates = basic_rates;
-       sdata->vif.bss_conf.ssid_len = ifibss->ssid_len;
-       memcpy(sdata->vif.bss_conf.ssid, ifibss->ssid, ifibss->ssid_len);
+       sdata->vif.cfg.ssid_len = ifibss->ssid_len;
+       memcpy(sdata->vif.cfg.ssid, ifibss->ssid, ifibss->ssid_len);
        bss_change = BSS_CHANGED_BEACON_INT;
        bss_change |= ieee80211_reset_erp_info(sdata);
        bss_change |= BSS_CHANGED_BSSID;
@@ -352,26 +351,24 @@ static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
        bss_change |= BSS_CHANGED_ERP_SLOT;
 
        /* cf. IEEE 802.11 9.2.12 */
-       if (chan->band == NL80211_BAND_2GHZ && have_higher_than_11mbit)
-               sdata->flags |= IEEE80211_SDATA_OPERATING_GMODE;
-       else
-               sdata->flags &= ~IEEE80211_SDATA_OPERATING_GMODE;
+       sdata->deflink.operating_11g_mode =
+               chan->band == NL80211_BAND_2GHZ && have_higher_than_11mbit;
 
-       ieee80211_set_wmm_default(sdata, true, false);
+       ieee80211_set_wmm_default(&sdata->deflink, true, false);
 
-       sdata->vif.bss_conf.ibss_joined = true;
-       sdata->vif.bss_conf.ibss_creator = creator;
+       sdata->vif.cfg.ibss_joined = true;
+       sdata->vif.cfg.ibss_creator = creator;
 
        err = drv_join_ibss(local, sdata);
        if (err) {
-               sdata->vif.bss_conf.ibss_joined = false;
-               sdata->vif.bss_conf.ibss_creator = false;
+               sdata->vif.cfg.ibss_joined = false;
+               sdata->vif.cfg.ibss_creator = false;
                sdata->vif.bss_conf.enable_beacon = false;
-               sdata->vif.bss_conf.ssid_len = 0;
+               sdata->vif.cfg.ssid_len = 0;
                RCU_INIT_POINTER(ifibss->presp, NULL);
                kfree_rcu(presp, rcu_head);
                mutex_lock(&local->mtx);
-               ieee80211_vif_release_channel(sdata);
+               ieee80211_link_release_channel(&sdata->deflink);
                mutex_unlock(&local->mtx);
                sdata_info(sdata, "Failed to join IBSS, driver failure: %d\n",
                           err);
@@ -509,8 +506,7 @@ int ieee80211_ibss_csa_beacon(struct ieee80211_sub_if_data *sdata,
        rcu_read_unlock();
        cfg80211_put_bss(sdata->local->hw.wiphy, cbss);
 
-       old_presp = rcu_dereference_protected(ifibss->presp,
-                                         lockdep_is_held(&sdata->wdev.mtx));
+       old_presp = sdata_dereference(ifibss->presp, sdata);
 
        presp = ieee80211_ibss_build_presp(sdata,
                                           sdata->vif.bss_conf.beacon_int,
@@ -544,12 +540,12 @@ int ieee80211_ibss_finish_csa(struct ieee80211_sub_if_data *sdata)
                                        IEEE80211_PRIVACY(ifibss->privacy));
                /* XXX: should not really modify cfg80211 data */
                if (cbss) {
-                       cbss->channel = sdata->csa_chandef.chan;
+                       cbss->channel = sdata->deflink.csa_chandef.chan;
                        cfg80211_put_bss(sdata->local->hw.wiphy, cbss);
                }
        }
 
-       ifibss->chandef = sdata->csa_chandef;
+       ifibss->chandef = sdata->deflink.csa_chandef;
 
        /* generate the beacon */
        return ieee80211_ibss_csa_beacon(sdata, NULL);
@@ -622,7 +618,7 @@ ieee80211_ibss_add_sta(struct ieee80211_sub_if_data *sdata, const u8 *bssid,
        }
 
        rcu_read_lock();
-       chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
+       chanctx_conf = rcu_dereference(sdata->vif.bss_conf.chanctx_conf);
        if (WARN_ON_ONCE(!chanctx_conf))
                return NULL;
        band = chanctx_conf->def.chan->band;
@@ -708,14 +704,13 @@ static void ieee80211_ibss_disconnect(struct ieee80211_sub_if_data *sdata)
 
        netif_carrier_off(sdata->dev);
 
-       sdata->vif.bss_conf.ibss_joined = false;
-       sdata->vif.bss_conf.ibss_creator = false;
+       sdata->vif.cfg.ibss_joined = false;
+       sdata->vif.cfg.ibss_creator = false;
        sdata->vif.bss_conf.enable_beacon = false;
-       sdata->vif.bss_conf.ssid_len = 0;
+       sdata->vif.cfg.ssid_len = 0;
 
        /* remove beacon */
-       presp = rcu_dereference_protected(ifibss->presp,
-                                         lockdep_is_held(&sdata->wdev.mtx));
+       presp = sdata_dereference(ifibss->presp, sdata);
        RCU_INIT_POINTER(sdata->u.ibss.presp, NULL);
        if (presp)
                kfree_rcu(presp, rcu_head);
@@ -725,7 +720,7 @@ static void ieee80211_ibss_disconnect(struct ieee80211_sub_if_data *sdata)
                                                BSS_CHANGED_IBSS);
        drv_leave_ibss(local, sdata);
        mutex_lock(&local->mtx);
-       ieee80211_vif_release_channel(sdata);
+       ieee80211_link_release_channel(&sdata->deflink);
        mutex_unlock(&local->mtx);
 }
 
@@ -773,20 +768,21 @@ ieee80211_ibss_process_chanswitch(struct ieee80211_sub_if_data *sdata,
        struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
        enum nl80211_channel_type ch_type;
        int err;
-       u32 sta_flags;
+       ieee80211_conn_flags_t conn_flags;
        u32 vht_cap_info = 0;
 
        sdata_assert_lock(sdata);
 
-       sta_flags = IEEE80211_STA_DISABLE_VHT;
+       conn_flags = IEEE80211_CONN_DISABLE_VHT;
+
        switch (ifibss->chandef.width) {
        case NL80211_CHAN_WIDTH_5:
        case NL80211_CHAN_WIDTH_10:
        case NL80211_CHAN_WIDTH_20_NOHT:
-               sta_flags |= IEEE80211_STA_DISABLE_HT;
+               conn_flags |= IEEE80211_CONN_DISABLE_HT;
                fallthrough;
        case NL80211_CHAN_WIDTH_20:
-               sta_flags |= IEEE80211_STA_DISABLE_40MHZ;
+               conn_flags |= IEEE80211_CONN_DISABLE_40MHZ;
                break;
        default:
                break;
@@ -799,7 +795,7 @@ ieee80211_ibss_process_chanswitch(struct ieee80211_sub_if_data *sdata,
        err = ieee80211_parse_ch_switch_ie(sdata, elems,
                                           ifibss->chandef.chan->band,
                                           vht_cap_info,
-                                          sta_flags, ifibss->bssid, &csa_ie);
+                                          conn_flags, ifibss->bssid, &csa_ie);
        /* can't switch to destination channel, fail */
        if (err < 0)
                goto disconnect;
@@ -842,7 +838,7 @@ ieee80211_ibss_process_chanswitch(struct ieee80211_sub_if_data *sdata,
                }
                break;
        default:
-               /* should not happen, sta_flags should prevent VHT modes. */
+               /* should not happen, conn_flags should prevent VHT modes. */
                WARN_ON(1);
                goto disconnect;
        }
@@ -923,7 +919,7 @@ ieee80211_rx_mgmt_spectrum_mgmt(struct ieee80211_sub_if_data *sdata,
        if (len < required_len)
                return;
 
-       if (!sdata->vif.csa_active)
+       if (!sdata->vif.bss_conf.csa_active)
                ieee80211_ibss_process_chanswitch(sdata, elems, false);
 }
 
@@ -1051,7 +1047,7 @@ static void ieee80211_update_sta_info(struct ieee80211_sub_if_data *sdata,
                memcpy(&htcap_ie, elems->ht_cap_elem, sizeof(htcap_ie));
                rates_updated |= ieee80211_ht_cap_ie_to_sta_ht_cap(sdata, sband,
                                                                   &htcap_ie,
-                                                                  sta);
+                                                                  &sta->deflink);
 
                if (elems->vht_operation && elems->vht_cap_elem &&
                    sdata->u.ibss.chandef.width != NL80211_CHAN_WIDTH_20 &&
@@ -1068,7 +1064,8 @@ static void ieee80211_update_sta_info(struct ieee80211_sub_if_data *sdata,
                                                   &chandef);
                        memcpy(&cap_ie, elems->vht_cap_elem, sizeof(cap_ie));
                        ieee80211_vht_cap_ie_to_sta_vht_cap(sdata, sband,
-                                                           &cap_ie, sta);
+                                                           &cap_ie,
+                                                           &sta->deflink);
                        if (memcmp(&cap, &sta->sta.deflink.vht_cap, sizeof(cap)))
                                rates_updated |= true;
                }
@@ -1143,7 +1140,7 @@ static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata,
                goto put_bss;
 
        /* process channel switch */
-       if (sdata->vif.csa_active ||
+       if (sdata->vif.bss_conf.csa_active ||
            ieee80211_ibss_process_chanswitch(sdata, elems, true))
                goto put_bss;
 
@@ -1220,7 +1217,7 @@ void ieee80211_ibss_rx_no_sta(struct ieee80211_sub_if_data *sdata,
                return;
 
        rcu_read_lock();
-       chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
+       chanctx_conf = rcu_dereference(sdata->vif.bss_conf.chanctx_conf);
        if (WARN_ON_ONCE(!chanctx_conf)) {
                rcu_read_unlock();
                return;
@@ -1529,8 +1526,7 @@ static void ieee80211_rx_mgmt_probe_req(struct ieee80211_sub_if_data *sdata,
 
        sdata_assert_lock(sdata);
 
-       presp = rcu_dereference_protected(ifibss->presp,
-                                         lockdep_is_held(&sdata->wdev.mtx));
+       presp = sdata_dereference(ifibss->presp, sdata);
 
        if (ifibss->state != IEEE80211_IBSS_MLME_JOINED ||
            len < 24 + 2 || !presp)
@@ -1603,8 +1599,7 @@ void ieee80211_rx_mgmt_probe_beacon(struct ieee80211_sub_if_data *sdata,
                return;
 
        elems = ieee802_11_parse_elems(mgmt->u.probe_resp.variable,
-                                      len - baselen, false,
-                                      mgmt->bssid, NULL);
+                                      len - baselen, false, NULL);
 
        if (elems) {
                ieee80211_rx_bss_info(sdata, mgmt, len, rx_status, elems);
@@ -1657,7 +1652,7 @@ void ieee80211_ibss_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
 
                        elems = ieee802_11_parse_elems(
                                mgmt->u.action.u.chan_switch.variable,
-                               ies_len, true, mgmt->bssid, NULL);
+                               ies_len, true, NULL);
 
                        if (elems && !elems->parse_error)
                                ieee80211_rx_mgmt_spectrum_mgmt(sdata, mgmt,
@@ -1851,10 +1846,10 @@ int ieee80211_ibss_join(struct ieee80211_sub_if_data *sdata,
                | IEEE80211_HT_PARAM_RIFS_MODE;
 
        changed |= BSS_CHANGED_HT | BSS_CHANGED_MCAST_RATE;
-       ieee80211_bss_info_change_notify(sdata, changed);
+       ieee80211_link_info_change_notify(sdata, &sdata->deflink, changed);
 
-       sdata->smps_mode = IEEE80211_SMPS_OFF;
-       sdata->needed_rx_chains = local->rx_chains;
+       sdata->deflink.smps_mode = IEEE80211_SMPS_OFF;
+       sdata->deflink.needed_rx_chains = local->rx_chains;
        sdata->control_port_over_nl80211 = params->control_port_over_nl80211;
 
        ieee80211_queue_work(&local->hw, &sdata->work);