linux/net/mac80211/mlme.c
<<
>>
Prefs
   1/*
   2 * BSS client mode implementation
   3 * Copyright 2003-2008, Jouni Malinen <j@w1.fi>
   4 * Copyright 2004, Instant802 Networks, Inc.
   5 * Copyright 2005, Devicescape Software, Inc.
   6 * Copyright 2006-2007  Jiri Benc <jbenc@suse.cz>
   7 * Copyright 2007, Michael Wu <flamingice@sourmilk.net>
   8 * Copyright 2013-2014  Intel Mobile Communications GmbH
   9 * Copyright (C) 2015 - 2016 Intel Deutschland GmbH
  10 *
  11 * This program is free software; you can redistribute it and/or modify
  12 * it under the terms of the GNU General Public License version 2 as
  13 * published by the Free Software Foundation.
  14 */
  15
  16#include <linux/delay.h>
  17#include <linux/if_ether.h>
  18#include <linux/skbuff.h>
  19#include <linux/if_arp.h>
  20#include <linux/etherdevice.h>
  21#include <linux/moduleparam.h>
  22#include <linux/rtnetlink.h>
  23#include <linux/crc32.h>
  24#include <linux/slab.h>
  25#include <linux/export.h>
  26#include <net/mac80211.h>
  27#include <asm/unaligned.h>
  28
  29#include "ieee80211_i.h"
  30#include "driver-ops.h"
  31#include "rate.h"
  32#include "led.h"
  33
  34#define IEEE80211_AUTH_TIMEOUT          (HZ / 5)
  35#define IEEE80211_AUTH_TIMEOUT_LONG     (HZ / 2)
  36#define IEEE80211_AUTH_TIMEOUT_SHORT    (HZ / 10)
  37#define IEEE80211_AUTH_MAX_TRIES        3
  38#define IEEE80211_AUTH_WAIT_ASSOC       (HZ * 5)
  39#define IEEE80211_ASSOC_TIMEOUT         (HZ / 5)
  40#define IEEE80211_ASSOC_TIMEOUT_LONG    (HZ / 2)
  41#define IEEE80211_ASSOC_TIMEOUT_SHORT   (HZ / 10)
  42#define IEEE80211_ASSOC_MAX_TRIES       3
  43
  44static int max_nullfunc_tries = 2;
  45module_param(max_nullfunc_tries, int, 0644);
  46MODULE_PARM_DESC(max_nullfunc_tries,
  47                 "Maximum nullfunc tx tries before disconnecting (reason 4).");
  48
  49static int max_probe_tries = 5;
  50module_param(max_probe_tries, int, 0644);
  51MODULE_PARM_DESC(max_probe_tries,
  52                 "Maximum probe tries before disconnecting (reason 4).");
  53
  54/*
  55 * Beacon loss timeout is calculated as N frames times the
  56 * advertised beacon interval.  This may need to be somewhat
  57 * higher than what hardware might detect to account for
  58 * delays in the host processing frames. But since we also
  59 * probe on beacon miss before declaring the connection lost
  60 * default to what we want.
  61 */
  62static int beacon_loss_count = 7;
  63module_param(beacon_loss_count, int, 0644);
  64MODULE_PARM_DESC(beacon_loss_count,
  65                 "Number of beacon intervals before we decide beacon was lost.");
  66
  67/*
  68 * Time the connection can be idle before we probe
  69 * it to see if we can still talk to the AP.
  70 */
  71#define IEEE80211_CONNECTION_IDLE_TIME  (30 * HZ)
  72/*
  73 * Time we wait for a probe response after sending
  74 * a probe request because of beacon loss or for
  75 * checking the connection still works.
  76 */
  77static int probe_wait_ms = 500;
  78module_param(probe_wait_ms, int, 0644);
  79MODULE_PARM_DESC(probe_wait_ms,
  80                 "Maximum time(ms) to wait for probe response"
  81                 " before disconnecting (reason 4).");
  82
  83/*
  84 * How many Beacon frames need to have been used in average signal strength
  85 * before starting to indicate signal change events.
  86 */
  87#define IEEE80211_SIGNAL_AVE_MIN_COUNT  4
  88
  89/*
  90 * We can have multiple work items (and connection probing)
  91 * scheduling this timer, but we need to take care to only
  92 * reschedule it when it should fire _earlier_ than it was
  93 * asked for before, or if it's not pending right now. This
  94 * function ensures that. Note that it then is required to
  95 * run this function for all timeouts after the first one
  96 * has happened -- the work that runs from this timer will
  97 * do that.
  98 */
  99static void run_again(struct ieee80211_sub_if_data *sdata,
 100                      unsigned long timeout)
 101{
 102        sdata_assert_lock(sdata);
 103
 104        if (!timer_pending(&sdata->u.mgd.timer) ||
 105            time_before(timeout, sdata->u.mgd.timer.expires))
 106                mod_timer(&sdata->u.mgd.timer, timeout);
 107}
 108
 109void ieee80211_sta_reset_beacon_monitor(struct ieee80211_sub_if_data *sdata)
 110{
 111        if (sdata->vif.driver_flags & IEEE80211_VIF_BEACON_FILTER)
 112                return;
 113
 114        if (ieee80211_hw_check(&sdata->local->hw, CONNECTION_MONITOR))
 115                return;
 116
 117        mod_timer(&sdata->u.mgd.bcn_mon_timer,
 118                  round_jiffies_up(jiffies + sdata->u.mgd.beacon_timeout));
 119}
 120
 121void ieee80211_sta_reset_conn_monitor(struct ieee80211_sub_if_data *sdata)
 122{
 123        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
 124
 125        if (unlikely(!sdata->u.mgd.associated))
 126                return;
 127
 128        ifmgd->probe_send_count = 0;
 129
 130        if (ieee80211_hw_check(&sdata->local->hw, CONNECTION_MONITOR))
 131                return;
 132
 133        mod_timer(&sdata->u.mgd.conn_mon_timer,
 134                  round_jiffies_up(jiffies + IEEE80211_CONNECTION_IDLE_TIME));
 135}
 136
 137static int ecw2cw(int ecw)
 138{
 139        return (1 << ecw) - 1;
 140}
 141
 142static u32
 143ieee80211_determine_chantype(struct ieee80211_sub_if_data *sdata,
 144                             struct ieee80211_supported_band *sband,
 145                             struct ieee80211_channel *channel,
 146                             const struct ieee80211_ht_cap *ht_cap,
 147                             const struct ieee80211_ht_operation *ht_oper,
 148                             const struct ieee80211_vht_operation *vht_oper,
 149                             struct cfg80211_chan_def *chandef, bool tracking)
 150{
 151        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
 152        struct cfg80211_chan_def vht_chandef;
 153        struct ieee80211_sta_ht_cap sta_ht_cap;
 154        u32 ht_cfreq, ret;
 155
 156        memcpy(&sta_ht_cap, &sband->ht_cap, sizeof(sta_ht_cap));
 157        ieee80211_apply_htcap_overrides(sdata, &sta_ht_cap);
 158
 159        chandef->chan = channel;
 160        chandef->width = NL80211_CHAN_WIDTH_20_NOHT;
 161        chandef->center_freq1 = channel->center_freq;
 162        chandef->center_freq2 = 0;
 163
 164        if (!ht_cap || !ht_oper || !sta_ht_cap.ht_supported) {
 165                ret = IEEE80211_STA_DISABLE_HT | IEEE80211_STA_DISABLE_VHT;
 166                goto out;
 167        }
 168
 169        chandef->width = NL80211_CHAN_WIDTH_20;
 170
 171        if (!(ht_cap->cap_info &
 172              cpu_to_le16(IEEE80211_HT_CAP_SUP_WIDTH_20_40))) {
 173                ret = IEEE80211_STA_DISABLE_40MHZ;
 174                vht_chandef = *chandef;
 175                goto out;
 176        }
 177
 178        ht_cfreq = ieee80211_channel_to_frequency(ht_oper->primary_chan,
 179                                                  channel->band);
 180        /* check that channel matches the right operating channel */
 181        if (!tracking && channel->center_freq != ht_cfreq) {
 182                /*
 183                 * It's possible that some APs are confused here;
 184                 * Netgear WNDR3700 sometimes reports 4 higher than
 185                 * the actual channel in association responses, but
 186                 * since we look at probe response/beacon data here
 187                 * it should be OK.
 188                 */
 189                sdata_info(sdata,
 190                           "Wrong control channel: center-freq: %d ht-cfreq: %d ht->primary_chan: %d band: %d - Disabling HT\n",
 191                           channel->center_freq, ht_cfreq,
 192                           ht_oper->primary_chan, channel->band);
 193                ret = IEEE80211_STA_DISABLE_HT | IEEE80211_STA_DISABLE_VHT;
 194                goto out;
 195        }
 196
 197        /* check 40 MHz support, if we have it */
 198        if (sta_ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40) {
 199                ieee80211_chandef_ht_oper(ht_oper, chandef);
 200        } else {
 201                /* 40 MHz (and 80 MHz) must be supported for VHT */
 202                ret = IEEE80211_STA_DISABLE_VHT;
 203                /* also mark 40 MHz disabled */
 204                ret |= IEEE80211_STA_DISABLE_40MHZ;
 205                goto out;
 206        }
 207
 208        if (!vht_oper || !sband->vht_cap.vht_supported) {
 209                ret = IEEE80211_STA_DISABLE_VHT;
 210                goto out;
 211        }
 212
 213        vht_chandef = *chandef;
 214        if (!ieee80211_chandef_vht_oper(vht_oper, &vht_chandef)) {
 215                if (!(ifmgd->flags & IEEE80211_STA_DISABLE_VHT))
 216                        sdata_info(sdata,
 217                                   "AP VHT information is invalid, disable VHT\n");
 218                ret = IEEE80211_STA_DISABLE_VHT;
 219                goto out;
 220        }
 221
 222        if (!cfg80211_chandef_valid(&vht_chandef)) {
 223                if (!(ifmgd->flags & IEEE80211_STA_DISABLE_VHT))
 224                        sdata_info(sdata,
 225                                   "AP VHT information is invalid, disable VHT\n");
 226                ret = IEEE80211_STA_DISABLE_VHT;
 227                goto out;
 228        }
 229
 230        if (cfg80211_chandef_identical(chandef, &vht_chandef)) {
 231                ret = 0;
 232                goto out;
 233        }
 234
 235        if (!cfg80211_chandef_compatible(chandef, &vht_chandef)) {
 236                if (!(ifmgd->flags & IEEE80211_STA_DISABLE_VHT))
 237                        sdata_info(sdata,
 238                                   "AP VHT information doesn't match HT, disable VHT\n");
 239                ret = IEEE80211_STA_DISABLE_VHT;
 240                goto out;
 241        }
 242
 243        *chandef = vht_chandef;
 244
 245        ret = 0;
 246
 247out:
 248        /*
 249         * When tracking the current AP, don't do any further checks if the
 250         * new chandef is identical to the one we're currently using for the
 251         * connection. This keeps us from playing ping-pong with regulatory,
 252         * without it the following can happen (for example):
 253         *  - connect to an AP with 80 MHz, world regdom allows 80 MHz
 254         *  - AP advertises regdom US
 255         *  - CRDA loads regdom US with 80 MHz prohibited (old database)
 256         *  - the code below detects an unsupported channel, downgrades, and
 257         *    we disconnect from the AP in the caller
 258         *  - disconnect causes CRDA to reload world regdomain and the game
 259         *    starts anew.
 260         * (see https://bugzilla.kernel.org/show_bug.cgi?id=70881)
 261         *
 262         * It seems possible that there are still scenarios with CSA or real
 263         * bandwidth changes where a this could happen, but those cases are
 264         * less common and wouldn't completely prevent using the AP.
 265         */
 266        if (tracking &&
 267            cfg80211_chandef_identical(chandef, &sdata->vif.bss_conf.chandef))
 268                return ret;
 269
 270        /* don't print the message below for VHT mismatch if VHT is disabled */
 271        if (ret & IEEE80211_STA_DISABLE_VHT)
 272                vht_chandef = *chandef;
 273
 274        /*
 275         * Ignore the DISABLED flag when we're already connected and only
 276         * tracking the APs beacon for bandwidth changes - otherwise we
 277         * might get disconnected here if we connect to an AP, update our
 278         * regulatory information based on the AP's country IE and the
 279         * information we have is wrong/outdated and disables the channel
 280         * that we're actually using for the connection to the AP.
 281         */
 282        while (!cfg80211_chandef_usable(sdata->local->hw.wiphy, chandef,
 283                                        tracking ? 0 :
 284                                                   IEEE80211_CHAN_DISABLED)) {
 285                if (WARN_ON(chandef->width == NL80211_CHAN_WIDTH_20_NOHT)) {
 286                        ret = IEEE80211_STA_DISABLE_HT |
 287                              IEEE80211_STA_DISABLE_VHT;
 288                        break;
 289                }
 290
 291                ret |= ieee80211_chandef_downgrade(chandef);
 292        }
 293
 294        if (chandef->width != vht_chandef.width && !tracking)
 295                sdata_info(sdata,
 296                           "capabilities/regulatory prevented using AP HT/VHT configuration, downgraded\n");
 297
 298        WARN_ON_ONCE(!cfg80211_chandef_valid(chandef));
 299        return ret;
 300}
 301
 302static int ieee80211_config_bw(struct ieee80211_sub_if_data *sdata,
 303                               struct sta_info *sta,
 304                               const struct ieee80211_ht_cap *ht_cap,
 305                               const struct ieee80211_ht_operation *ht_oper,
 306                               const struct ieee80211_vht_operation *vht_oper,
 307                               const u8 *bssid, u32 *changed)
 308{
 309        struct ieee80211_local *local = sdata->local;
 310        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
 311        struct ieee80211_supported_band *sband;
 312        struct ieee80211_channel *chan;
 313        struct cfg80211_chan_def chandef;
 314        u16 ht_opmode;
 315        u32 flags;
 316        enum ieee80211_sta_rx_bandwidth new_sta_bw;
 317        int ret;
 318
 319        /* if HT was/is disabled, don't track any bandwidth changes */
 320        if (ifmgd->flags & IEEE80211_STA_DISABLE_HT || !ht_oper)
 321                return 0;
 322
 323        /* don't check VHT if we associated as non-VHT station */
 324        if (ifmgd->flags & IEEE80211_STA_DISABLE_VHT)
 325                vht_oper = NULL;
 326
 327        if (WARN_ON_ONCE(!sta))
 328                return -EINVAL;
 329
 330        /*
 331         * if bss configuration changed store the new one -
 332         * this may be applicable even if channel is identical
 333         */
 334        ht_opmode = le16_to_cpu(ht_oper->operation_mode);
 335        if (sdata->vif.bss_conf.ht_operation_mode != ht_opmode) {
 336                *changed |= BSS_CHANGED_HT;
 337                sdata->vif.bss_conf.ht_operation_mode = ht_opmode;
 338        }
 339
 340        chan = sdata->vif.bss_conf.chandef.chan;
 341        sband = local->hw.wiphy->bands[chan->band];
 342
 343        /* calculate new channel (type) based on HT/VHT operation IEs */
 344        flags = ieee80211_determine_chantype(sdata, sband, chan,
 345                                             ht_cap, ht_oper, vht_oper,
 346                                             &chandef, true);
 347
 348        /*
 349         * Downgrade the new channel if we associated with restricted
 350         * capabilities. For example, if we associated as a 20 MHz STA
 351         * to a 40 MHz AP (due to regulatory, capabilities or config
 352         * reasons) then switching to a 40 MHz channel now won't do us
 353         * any good -- we couldn't use it with the AP.
 354         */
 355        if (ifmgd->flags & IEEE80211_STA_DISABLE_80P80MHZ &&
 356            chandef.width == NL80211_CHAN_WIDTH_80P80)
 357                flags |= ieee80211_chandef_downgrade(&chandef);
 358        if (ifmgd->flags & IEEE80211_STA_DISABLE_160MHZ &&
 359            chandef.width == NL80211_CHAN_WIDTH_160)
 360                flags |= ieee80211_chandef_downgrade(&chandef);
 361        if (ifmgd->flags & IEEE80211_STA_DISABLE_40MHZ &&
 362            chandef.width > NL80211_CHAN_WIDTH_20)
 363                flags |= ieee80211_chandef_downgrade(&chandef);
 364
 365        if (cfg80211_chandef_identical(&chandef, &sdata->vif.bss_conf.chandef))
 366                return 0;
 367
 368        sdata_info(sdata,
 369                   "AP %pM changed bandwidth, new config is %d MHz, width %d (%d/%d MHz)\n",
 370                   ifmgd->bssid, chandef.chan->center_freq, chandef.width,
 371                   chandef.center_freq1, chandef.center_freq2);
 372
 373        if (flags != (ifmgd->flags & (IEEE80211_STA_DISABLE_HT |
 374                                      IEEE80211_STA_DISABLE_VHT |
 375                                      IEEE80211_STA_DISABLE_40MHZ |
 376                                      IEEE80211_STA_DISABLE_80P80MHZ |
 377                                      IEEE80211_STA_DISABLE_160MHZ)) ||
 378            !cfg80211_chandef_valid(&chandef)) {
 379                sdata_info(sdata,
 380                           "AP %pM changed bandwidth in a way we can't support - disconnect\n",
 381                           ifmgd->bssid);
 382                return -EINVAL;
 383        }
 384
 385        switch (chandef.width) {
 386        case NL80211_CHAN_WIDTH_20_NOHT:
 387        case NL80211_CHAN_WIDTH_20:
 388                new_sta_bw = IEEE80211_STA_RX_BW_20;
 389                break;
 390        case NL80211_CHAN_WIDTH_40:
 391                new_sta_bw = IEEE80211_STA_RX_BW_40;
 392                break;
 393        case NL80211_CHAN_WIDTH_80:
 394                new_sta_bw = IEEE80211_STA_RX_BW_80;
 395                break;
 396        case NL80211_CHAN_WIDTH_80P80:
 397        case NL80211_CHAN_WIDTH_160:
 398                new_sta_bw = IEEE80211_STA_RX_BW_160;
 399                break;
 400        default:
 401                return -EINVAL;
 402        }
 403
 404        if (new_sta_bw > sta->cur_max_bandwidth)
 405                new_sta_bw = sta->cur_max_bandwidth;
 406
 407        if (new_sta_bw < sta->sta.bandwidth) {
 408                sta->sta.bandwidth = new_sta_bw;
 409                rate_control_rate_update(local, sband, sta,
 410                                         IEEE80211_RC_BW_CHANGED);
 411        }
 412
 413        ret = ieee80211_vif_change_bandwidth(sdata, &chandef, changed);
 414        if (ret) {
 415                sdata_info(sdata,
 416                           "AP %pM changed bandwidth to incompatible one - disconnect\n",
 417                           ifmgd->bssid);
 418                return ret;
 419        }
 420
 421        if (new_sta_bw > sta->sta.bandwidth) {
 422                sta->sta.bandwidth = new_sta_bw;
 423                rate_control_rate_update(local, sband, sta,
 424                                         IEEE80211_RC_BW_CHANGED);
 425        }
 426
 427        return 0;
 428}
 429
 430/* frame sending functions */
 431
 432static void ieee80211_add_ht_ie(struct ieee80211_sub_if_data *sdata,
 433                                struct sk_buff *skb, u8 ap_ht_param,
 434                                struct ieee80211_supported_band *sband,
 435                                struct ieee80211_channel *channel,
 436                                enum ieee80211_smps_mode smps)
 437{
 438        u8 *pos;
 439        u32 flags = channel->flags;
 440        u16 cap;
 441        struct ieee80211_sta_ht_cap ht_cap;
 442
 443        BUILD_BUG_ON(sizeof(ht_cap) != sizeof(sband->ht_cap));
 444
 445        memcpy(&ht_cap, &sband->ht_cap, sizeof(ht_cap));
 446        ieee80211_apply_htcap_overrides(sdata, &ht_cap);
 447
 448        /* determine capability flags */
 449        cap = ht_cap.cap;
 450
 451        switch (ap_ht_param & IEEE80211_HT_PARAM_CHA_SEC_OFFSET) {
 452        case IEEE80211_HT_PARAM_CHA_SEC_ABOVE:
 453                if (flags & IEEE80211_CHAN_NO_HT40PLUS) {
 454                        cap &= ~IEEE80211_HT_CAP_SUP_WIDTH_20_40;
 455                        cap &= ~IEEE80211_HT_CAP_SGI_40;
 456                }
 457                break;
 458        case IEEE80211_HT_PARAM_CHA_SEC_BELOW:
 459                if (flags & IEEE80211_CHAN_NO_HT40MINUS) {
 460                        cap &= ~IEEE80211_HT_CAP_SUP_WIDTH_20_40;
 461                        cap &= ~IEEE80211_HT_CAP_SGI_40;
 462                }
 463                break;
 464        }
 465
 466        /*
 467         * If 40 MHz was disabled associate as though we weren't
 468         * capable of 40 MHz -- some broken APs will never fall
 469         * back to trying to transmit in 20 MHz.
 470         */
 471        if (sdata->u.mgd.flags & IEEE80211_STA_DISABLE_40MHZ) {
 472                cap &= ~IEEE80211_HT_CAP_SUP_WIDTH_20_40;
 473                cap &= ~IEEE80211_HT_CAP_SGI_40;
 474        }
 475
 476        /* set SM PS mode properly */
 477        cap &= ~IEEE80211_HT_CAP_SM_PS;
 478        switch (smps) {
 479        case IEEE80211_SMPS_AUTOMATIC:
 480        case IEEE80211_SMPS_NUM_MODES:
 481                WARN_ON(1);
 482        case IEEE80211_SMPS_OFF:
 483                cap |= WLAN_HT_CAP_SM_PS_DISABLED <<
 484                        IEEE80211_HT_CAP_SM_PS_SHIFT;
 485                break;
 486        case IEEE80211_SMPS_STATIC:
 487                cap |= WLAN_HT_CAP_SM_PS_STATIC <<
 488                        IEEE80211_HT_CAP_SM_PS_SHIFT;
 489                break;
 490        case IEEE80211_SMPS_DYNAMIC:
 491                cap |= WLAN_HT_CAP_SM_PS_DYNAMIC <<
 492                        IEEE80211_HT_CAP_SM_PS_SHIFT;
 493                break;
 494        }
 495
 496        /* reserve and fill IE */
 497        pos = skb_put(skb, sizeof(struct ieee80211_ht_cap) + 2);
 498        ieee80211_ie_build_ht_cap(pos, &ht_cap, cap);
 499}
 500
 501/* This function determines vht capability flags for the association
 502 * and builds the IE.
 503 * Note - the function may set the owner of the MU-MIMO capability
 504 */
 505static void ieee80211_add_vht_ie(struct ieee80211_sub_if_data *sdata,
 506                                 struct sk_buff *skb,
 507                                 struct ieee80211_supported_band *sband,
 508                                 struct ieee80211_vht_cap *ap_vht_cap)
 509{
 510        struct ieee80211_local *local = sdata->local;
 511        u8 *pos;
 512        u32 cap;
 513        struct ieee80211_sta_vht_cap vht_cap;
 514        u32 mask, ap_bf_sts, our_bf_sts;
 515
 516        BUILD_BUG_ON(sizeof(vht_cap) != sizeof(sband->vht_cap));
 517
 518        memcpy(&vht_cap, &sband->vht_cap, sizeof(vht_cap));
 519        ieee80211_apply_vhtcap_overrides(sdata, &vht_cap);
 520
 521        /* determine capability flags */
 522        cap = vht_cap.cap;
 523
 524        if (sdata->u.mgd.flags & IEEE80211_STA_DISABLE_80P80MHZ) {
 525                u32 bw = cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK;
 526
 527                cap &= ~IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK;
 528                if (bw == IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ ||
 529                    bw == IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ)
 530                        cap |= IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ;
 531        }
 532
 533        if (sdata->u.mgd.flags & IEEE80211_STA_DISABLE_160MHZ) {
 534                cap &= ~IEEE80211_VHT_CAP_SHORT_GI_160;
 535                cap &= ~IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK;
 536        }
 537
 538        /*
 539         * Some APs apparently get confused if our capabilities are better
 540         * than theirs, so restrict what we advertise in the assoc request.
 541         */
 542        if (!(ap_vht_cap->vht_cap_info &
 543                        cpu_to_le32(IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)))
 544                cap &= ~(IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
 545                         IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE);
 546        else if (!(ap_vht_cap->vht_cap_info &
 547                        cpu_to_le32(IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)))
 548                cap &= ~IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE;
 549
 550        /*
 551         * If some other vif is using the MU-MIMO capablity we cannot associate
 552         * using MU-MIMO - this will lead to contradictions in the group-id
 553         * mechanism.
 554         * Ownership is defined since association request, in order to avoid
 555         * simultaneous associations with MU-MIMO.
 556         */
 557        if (cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE) {
 558                bool disable_mu_mimo = false;
 559                struct ieee80211_sub_if_data *other;
 560
 561                list_for_each_entry_rcu(other, &local->interfaces, list) {
 562                        if (other->vif.mu_mimo_owner) {
 563                                disable_mu_mimo = true;
 564                                break;
 565                        }
 566                }
 567                if (disable_mu_mimo)
 568                        cap &= ~IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE;
 569                else
 570                        sdata->vif.mu_mimo_owner = true;
 571        }
 572
 573        mask = IEEE80211_VHT_CAP_BEAMFORMEE_STS_MASK;
 574
 575        ap_bf_sts = le32_to_cpu(ap_vht_cap->vht_cap_info) & mask;
 576        our_bf_sts = cap & mask;
 577
 578        if (ap_bf_sts < our_bf_sts) {
 579                cap &= ~mask;
 580                cap |= ap_bf_sts;
 581        }
 582
 583        /* reserve and fill IE */
 584        pos = skb_put(skb, sizeof(struct ieee80211_vht_cap) + 2);
 585        ieee80211_ie_build_vht_cap(pos, &vht_cap, cap);
 586}
 587
 588static void ieee80211_send_assoc(struct ieee80211_sub_if_data *sdata)
 589{
 590        struct ieee80211_local *local = sdata->local;
 591        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
 592        struct ieee80211_mgd_assoc_data *assoc_data = ifmgd->assoc_data;
 593        struct sk_buff *skb;
 594        struct ieee80211_mgmt *mgmt;
 595        u8 *pos, qos_info;
 596        size_t offset = 0, noffset;
 597        int i, count, rates_len, supp_rates_len, shift;
 598        u16 capab;
 599        struct ieee80211_supported_band *sband;
 600        struct ieee80211_chanctx_conf *chanctx_conf;
 601        struct ieee80211_channel *chan;
 602        u32 rate_flags, rates = 0;
 603
 604        sdata_assert_lock(sdata);
 605
 606        rcu_read_lock();
 607        chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
 608        if (WARN_ON(!chanctx_conf)) {
 609                rcu_read_unlock();
 610                return;
 611        }
 612        chan = chanctx_conf->def.chan;
 613        rate_flags = ieee80211_chandef_rate_flags(&chanctx_conf->def);
 614        rcu_read_unlock();
 615        sband = local->hw.wiphy->bands[chan->band];
 616        shift = ieee80211_vif_get_shift(&sdata->vif);
 617
 618        if (assoc_data->supp_rates_len) {
 619                /*
 620                 * Get all rates supported by the device and the AP as
 621                 * some APs don't like getting a superset of their rates
 622                 * in the association request (e.g. D-Link DAP 1353 in
 623                 * b-only mode)...
 624                 */
 625                rates_len = ieee80211_parse_bitrates(&chanctx_conf->def, sband,
 626                                                     assoc_data->supp_rates,
 627                                                     assoc_data->supp_rates_len,
 628                                                     &rates);
 629        } else {
 630                /*
 631                 * In case AP not provide any supported rates information
 632                 * before association, we send information element(s) with
 633                 * all rates that we support.
 634                 */
 635                rates_len = 0;
 636                for (i = 0; i < sband->n_bitrates; i++) {
 637                        if ((rate_flags & sband->bitrates[i].flags)
 638                            != rate_flags)
 639                                continue;
 640                        rates |= BIT(i);
 641                        rates_len++;
 642                }
 643        }
 644
 645        skb = alloc_skb(local->hw.extra_tx_headroom +
 646                        sizeof(*mgmt) + /* bit too much but doesn't matter */
 647                        2 + assoc_data->ssid_len + /* SSID */
 648                        4 + rates_len + /* (extended) rates */
 649                        4 + /* power capability */
 650                        2 + 2 * sband->n_channels + /* supported channels */
 651                        2 + sizeof(struct ieee80211_ht_cap) + /* HT */
 652                        2 + sizeof(struct ieee80211_vht_cap) + /* VHT */
 653                        assoc_data->ie_len + /* extra IEs */
 654                        9, /* WMM */
 655                        GFP_KERNEL);
 656        if (!skb)
 657                return;
 658
 659        skb_reserve(skb, local->hw.extra_tx_headroom);
 660
 661        capab = WLAN_CAPABILITY_ESS;
 662
 663        if (sband->band == IEEE80211_BAND_2GHZ) {
 664                capab |= WLAN_CAPABILITY_SHORT_SLOT_TIME;
 665                capab |= WLAN_CAPABILITY_SHORT_PREAMBLE;
 666        }
 667
 668        if (assoc_data->capability & WLAN_CAPABILITY_PRIVACY)
 669                capab |= WLAN_CAPABILITY_PRIVACY;
 670
 671        if ((assoc_data->capability & WLAN_CAPABILITY_SPECTRUM_MGMT) &&
 672            ieee80211_hw_check(&local->hw, SPECTRUM_MGMT))
 673                capab |= WLAN_CAPABILITY_SPECTRUM_MGMT;
 674
 675        if (ifmgd->flags & IEEE80211_STA_ENABLE_RRM)
 676                capab |= WLAN_CAPABILITY_RADIO_MEASURE;
 677
 678        mgmt = (struct ieee80211_mgmt *) skb_put(skb, 24);
 679        memset(mgmt, 0, 24);
 680        memcpy(mgmt->da, assoc_data->bss->bssid, ETH_ALEN);
 681        memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN);
 682        memcpy(mgmt->bssid, assoc_data->bss->bssid, ETH_ALEN);
 683
 684        if (!is_zero_ether_addr(assoc_data->prev_bssid)) {
 685                skb_put(skb, 10);
 686                mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
 687                                                  IEEE80211_STYPE_REASSOC_REQ);
 688                mgmt->u.reassoc_req.capab_info = cpu_to_le16(capab);
 689                mgmt->u.reassoc_req.listen_interval =
 690                                cpu_to_le16(local->hw.conf.listen_interval);
 691                memcpy(mgmt->u.reassoc_req.current_ap, assoc_data->prev_bssid,
 692                       ETH_ALEN);
 693        } else {
 694                skb_put(skb, 4);
 695                mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
 696                                                  IEEE80211_STYPE_ASSOC_REQ);
 697                mgmt->u.assoc_req.capab_info = cpu_to_le16(capab);
 698                mgmt->u.assoc_req.listen_interval =
 699                                cpu_to_le16(local->hw.conf.listen_interval);
 700        }
 701
 702        /* SSID */
 703        pos = skb_put(skb, 2 + assoc_data->ssid_len);
 704        *pos++ = WLAN_EID_SSID;
 705        *pos++ = assoc_data->ssid_len;
 706        memcpy(pos, assoc_data->ssid, assoc_data->ssid_len);
 707
 708        /* add all rates which were marked to be used above */
 709        supp_rates_len = rates_len;
 710        if (supp_rates_len > 8)
 711                supp_rates_len = 8;
 712
 713        pos = skb_put(skb, supp_rates_len + 2);
 714        *pos++ = WLAN_EID_SUPP_RATES;
 715        *pos++ = supp_rates_len;
 716
 717        count = 0;
 718        for (i = 0; i < sband->n_bitrates; i++) {
 719                if (BIT(i) & rates) {
 720                        int rate = DIV_ROUND_UP(sband->bitrates[i].bitrate,
 721                                                5 * (1 << shift));
 722                        *pos++ = (u8) rate;
 723                        if (++count == 8)
 724                                break;
 725                }
 726        }
 727
 728        if (rates_len > count) {
 729                pos = skb_put(skb, rates_len - count + 2);
 730                *pos++ = WLAN_EID_EXT_SUPP_RATES;
 731                *pos++ = rates_len - count;
 732
 733                for (i++; i < sband->n_bitrates; i++) {
 734                        if (BIT(i) & rates) {
 735                                int rate;
 736                                rate = DIV_ROUND_UP(sband->bitrates[i].bitrate,
 737                                                    5 * (1 << shift));
 738                                *pos++ = (u8) rate;
 739                        }
 740                }
 741        }
 742
 743        if (capab & WLAN_CAPABILITY_SPECTRUM_MGMT ||
 744            capab & WLAN_CAPABILITY_RADIO_MEASURE) {
 745                pos = skb_put(skb, 4);
 746                *pos++ = WLAN_EID_PWR_CAPABILITY;
 747                *pos++ = 2;
 748                *pos++ = 0; /* min tx power */
 749                 /* max tx power */
 750                *pos++ = ieee80211_chandef_max_power(&chanctx_conf->def);
 751        }
 752
 753        if (capab & WLAN_CAPABILITY_SPECTRUM_MGMT) {
 754                /* TODO: get this in reg domain format */
 755                pos = skb_put(skb, 2 * sband->n_channels + 2);
 756                *pos++ = WLAN_EID_SUPPORTED_CHANNELS;
 757                *pos++ = 2 * sband->n_channels;
 758                for (i = 0; i < sband->n_channels; i++) {
 759                        *pos++ = ieee80211_frequency_to_channel(
 760                                        sband->channels[i].center_freq);
 761                        *pos++ = 1; /* one channel in the subband*/
 762                }
 763        }
 764
 765        /* if present, add any custom IEs that go before HT */
 766        if (assoc_data->ie_len) {
 767                static const u8 before_ht[] = {
 768                        WLAN_EID_SSID,
 769                        WLAN_EID_SUPP_RATES,
 770                        WLAN_EID_EXT_SUPP_RATES,
 771                        WLAN_EID_PWR_CAPABILITY,
 772                        WLAN_EID_SUPPORTED_CHANNELS,
 773                        WLAN_EID_RSN,
 774                        WLAN_EID_QOS_CAPA,
 775                        WLAN_EID_RRM_ENABLED_CAPABILITIES,
 776                        WLAN_EID_MOBILITY_DOMAIN,
 777                        WLAN_EID_FAST_BSS_TRANSITION,   /* reassoc only */
 778                        WLAN_EID_RIC_DATA,              /* reassoc only */
 779                        WLAN_EID_SUPPORTED_REGULATORY_CLASSES,
 780                };
 781                static const u8 after_ric[] = {
 782                        WLAN_EID_SUPPORTED_REGULATORY_CLASSES,
 783                        WLAN_EID_HT_CAPABILITY,
 784                        WLAN_EID_BSS_COEX_2040,
 785                        WLAN_EID_EXT_CAPABILITY,
 786                        WLAN_EID_QOS_TRAFFIC_CAPA,
 787                        WLAN_EID_TIM_BCAST_REQ,
 788                        WLAN_EID_INTERWORKING,
 789                        /* 60GHz doesn't happen right now */
 790                        WLAN_EID_VHT_CAPABILITY,
 791                        WLAN_EID_OPMODE_NOTIF,
 792                };
 793
 794                noffset = ieee80211_ie_split_ric(assoc_data->ie,
 795                                                 assoc_data->ie_len,
 796                                                 before_ht,
 797                                                 ARRAY_SIZE(before_ht),
 798                                                 after_ric,
 799                                                 ARRAY_SIZE(after_ric),
 800                                                 offset);
 801                pos = skb_put(skb, noffset - offset);
 802                memcpy(pos, assoc_data->ie + offset, noffset - offset);
 803                offset = noffset;
 804        }
 805
 806        if (WARN_ON_ONCE((ifmgd->flags & IEEE80211_STA_DISABLE_HT) &&
 807                         !(ifmgd->flags & IEEE80211_STA_DISABLE_VHT)))
 808                ifmgd->flags |= IEEE80211_STA_DISABLE_VHT;
 809
 810        if (!(ifmgd->flags & IEEE80211_STA_DISABLE_HT))
 811                ieee80211_add_ht_ie(sdata, skb, assoc_data->ap_ht_param,
 812                                    sband, chan, sdata->smps_mode);
 813
 814        /* if present, add any custom IEs that go before VHT */
 815        if (assoc_data->ie_len) {
 816                static const u8 before_vht[] = {
 817                        WLAN_EID_SSID,
 818                        WLAN_EID_SUPP_RATES,
 819                        WLAN_EID_EXT_SUPP_RATES,
 820                        WLAN_EID_PWR_CAPABILITY,
 821                        WLAN_EID_SUPPORTED_CHANNELS,
 822                        WLAN_EID_RSN,
 823                        WLAN_EID_QOS_CAPA,
 824                        WLAN_EID_RRM_ENABLED_CAPABILITIES,
 825                        WLAN_EID_MOBILITY_DOMAIN,
 826                        WLAN_EID_SUPPORTED_REGULATORY_CLASSES,
 827                        WLAN_EID_HT_CAPABILITY,
 828                        WLAN_EID_BSS_COEX_2040,
 829                        WLAN_EID_EXT_CAPABILITY,
 830                        WLAN_EID_QOS_TRAFFIC_CAPA,
 831                        WLAN_EID_TIM_BCAST_REQ,
 832                        WLAN_EID_INTERWORKING,
 833                };
 834
 835                /* RIC already taken above, so no need to handle here anymore */
 836                noffset = ieee80211_ie_split(assoc_data->ie, assoc_data->ie_len,
 837                                             before_vht, ARRAY_SIZE(before_vht),
 838                                             offset);
 839                pos = skb_put(skb, noffset - offset);
 840                memcpy(pos, assoc_data->ie + offset, noffset - offset);
 841                offset = noffset;
 842        }
 843
 844        if (!(ifmgd->flags & IEEE80211_STA_DISABLE_VHT))
 845                ieee80211_add_vht_ie(sdata, skb, sband,
 846                                     &assoc_data->ap_vht_cap);
 847
 848        /* if present, add any custom non-vendor IEs that go after HT */
 849        if (assoc_data->ie_len) {
 850                noffset = ieee80211_ie_split_vendor(assoc_data->ie,
 851                                                    assoc_data->ie_len,
 852                                                    offset);
 853                pos = skb_put(skb, noffset - offset);
 854                memcpy(pos, assoc_data->ie + offset, noffset - offset);
 855                offset = noffset;
 856        }
 857
 858        if (assoc_data->wmm) {
 859                if (assoc_data->uapsd) {
 860                        qos_info = ifmgd->uapsd_queues;
 861                        qos_info |= (ifmgd->uapsd_max_sp_len <<
 862                                     IEEE80211_WMM_IE_STA_QOSINFO_SP_SHIFT);
 863                } else {
 864                        qos_info = 0;
 865                }
 866
 867                pos = ieee80211_add_wmm_info_ie(skb_put(skb, 9), qos_info);
 868        }
 869
 870        /* add any remaining custom (i.e. vendor specific here) IEs */
 871        if (assoc_data->ie_len) {
 872                noffset = assoc_data->ie_len;
 873                pos = skb_put(skb, noffset - offset);
 874                memcpy(pos, assoc_data->ie + offset, noffset - offset);
 875        }
 876
 877        drv_mgd_prepare_tx(local, sdata);
 878
 879        IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT;
 880        if (ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS))
 881                IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_CTL_REQ_TX_STATUS |
 882                                                IEEE80211_TX_INTFL_MLME_CONN_TX;
 883        ieee80211_tx_skb(sdata, skb);
 884}
 885
 886void ieee80211_send_pspoll(struct ieee80211_local *local,
 887                           struct ieee80211_sub_if_data *sdata)
 888{
 889        struct ieee80211_pspoll *pspoll;
 890        struct sk_buff *skb;
 891
 892        skb = ieee80211_pspoll_get(&local->hw, &sdata->vif);
 893        if (!skb)
 894                return;
 895
 896        pspoll = (struct ieee80211_pspoll *) skb->data;
 897        pspoll->frame_control |= cpu_to_le16(IEEE80211_FCTL_PM);
 898
 899        IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT;
 900        ieee80211_tx_skb(sdata, skb);
 901}
 902
 903void ieee80211_send_nullfunc(struct ieee80211_local *local,
 904                             struct ieee80211_sub_if_data *sdata,
 905                             bool powersave)
 906{
 907        struct sk_buff *skb;
 908        struct ieee80211_hdr_3addr *nullfunc;
 909        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
 910
 911        skb = ieee80211_nullfunc_get(&local->hw, &sdata->vif);
 912        if (!skb)
 913                return;
 914
 915        nullfunc = (struct ieee80211_hdr_3addr *) skb->data;
 916        if (powersave)
 917                nullfunc->frame_control |= cpu_to_le16(IEEE80211_FCTL_PM);
 918
 919        IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT |
 920                                        IEEE80211_TX_INTFL_OFFCHAN_TX_OK;
 921
 922        if (ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS))
 923                IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_CTL_REQ_TX_STATUS;
 924
 925        if (ifmgd->flags & IEEE80211_STA_CONNECTION_POLL)
 926                IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_CTL_USE_MINRATE;
 927
 928        ieee80211_tx_skb(sdata, skb);
 929}
 930
 931static void ieee80211_send_4addr_nullfunc(struct ieee80211_local *local,
 932                                          struct ieee80211_sub_if_data *sdata)
 933{
 934        struct sk_buff *skb;
 935        struct ieee80211_hdr *nullfunc;
 936        __le16 fc;
 937
 938        if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION))
 939                return;
 940
 941        skb = dev_alloc_skb(local->hw.extra_tx_headroom + 30);
 942        if (!skb)
 943                return;
 944
 945        skb_reserve(skb, local->hw.extra_tx_headroom);
 946
 947        nullfunc = (struct ieee80211_hdr *) skb_put(skb, 30);
 948        memset(nullfunc, 0, 30);
 949        fc = cpu_to_le16(IEEE80211_FTYPE_DATA | IEEE80211_STYPE_NULLFUNC |
 950                         IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS);
 951        nullfunc->frame_control = fc;
 952        memcpy(nullfunc->addr1, sdata->u.mgd.bssid, ETH_ALEN);
 953        memcpy(nullfunc->addr2, sdata->vif.addr, ETH_ALEN);
 954        memcpy(nullfunc->addr3, sdata->u.mgd.bssid, ETH_ALEN);
 955        memcpy(nullfunc->addr4, sdata->vif.addr, ETH_ALEN);
 956
 957        IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT;
 958        ieee80211_tx_skb(sdata, skb);
 959}
 960
 961/* spectrum management related things */
 962static void ieee80211_chswitch_work(struct work_struct *work)
 963{
 964        struct ieee80211_sub_if_data *sdata =
 965                container_of(work, struct ieee80211_sub_if_data, u.mgd.chswitch_work);
 966        struct ieee80211_local *local = sdata->local;
 967        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
 968        int ret;
 969
 970        if (!ieee80211_sdata_running(sdata))
 971                return;
 972
 973        sdata_lock(sdata);
 974        mutex_lock(&local->mtx);
 975        mutex_lock(&local->chanctx_mtx);
 976
 977        if (!ifmgd->associated)
 978                goto out;
 979
 980        if (!sdata->vif.csa_active)
 981                goto out;
 982
 983        /*
 984         * using reservation isn't immediate as it may be deferred until later
 985         * with multi-vif. once reservation is complete it will re-schedule the
 986         * work with no reserved_chanctx so verify chandef to check if it
 987         * completed successfully
 988         */
 989
 990        if (sdata->reserved_chanctx) {
 991                /*
 992                 * with multi-vif csa driver may call ieee80211_csa_finish()
 993                 * many times while waiting for other interfaces to use their
 994                 * reservations
 995                 */
 996                if (sdata->reserved_ready)
 997                        goto out;
 998
 999                ret = ieee80211_vif_use_reserved_context(sdata);
1000                if (ret) {
1001                        sdata_info(sdata,
1002                                   "failed to use reserved channel context, disconnecting (err=%d)\n",
1003                                   ret);
1004                        ieee80211_queue_work(&sdata->local->hw,
1005                                             &ifmgd->csa_connection_drop_work);
1006                        goto out;
1007                }
1008
1009                goto out;
1010        }
1011
1012        if (!cfg80211_chandef_identical(&sdata->vif.bss_conf.chandef,
1013                                        &sdata->csa_chandef)) {
1014                sdata_info(sdata,
1015                           "failed to finalize channel switch, disconnecting\n");
1016                ieee80211_queue_work(&sdata->local->hw,
1017                                     &ifmgd->csa_connection_drop_work);
1018                goto out;
1019        }
1020
1021        /* XXX: shouldn't really modify cfg80211-owned data! */
1022        ifmgd->associated->channel = sdata->csa_chandef.chan;
1023
1024        ifmgd->csa_waiting_bcn = true;
1025
1026        ieee80211_sta_reset_beacon_monitor(sdata);
1027        ieee80211_sta_reset_conn_monitor(sdata);
1028
1029out:
1030        mutex_unlock(&local->chanctx_mtx);
1031        mutex_unlock(&local->mtx);
1032        sdata_unlock(sdata);
1033}
1034
1035static void ieee80211_chswitch_post_beacon(struct ieee80211_sub_if_data *sdata)
1036{
1037        struct ieee80211_local *local = sdata->local;
1038        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
1039        int ret;
1040
1041        sdata_assert_lock(sdata);
1042
1043        WARN_ON(!sdata->vif.csa_active);
1044
1045        if (sdata->csa_block_tx) {
1046                ieee80211_wake_vif_queues(local, sdata,
1047                                          IEEE80211_QUEUE_STOP_REASON_CSA);
1048                sdata->csa_block_tx = false;
1049        }
1050
1051        sdata->vif.csa_active = false;
1052        ifmgd->csa_waiting_bcn = false;
1053
1054        ret = drv_post_channel_switch(sdata);
1055        if (ret) {
1056                sdata_info(sdata,
1057                           "driver post channel switch failed, disconnecting\n");
1058                ieee80211_queue_work(&local->hw,
1059                                     &ifmgd->csa_connection_drop_work);
1060                return;
1061        }
1062
1063        cfg80211_ch_switch_notify(sdata->dev, &sdata->reserved_chandef);
1064}
1065
1066void ieee80211_chswitch_done(struct ieee80211_vif *vif, bool success)
1067{
1068        struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
1069        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
1070
1071        trace_api_chswitch_done(sdata, success);
1072        if (!success) {
1073                sdata_info(sdata,
1074                           "driver channel switch failed, disconnecting\n");
1075                ieee80211_queue_work(&sdata->local->hw,
1076                                     &ifmgd->csa_connection_drop_work);
1077        } else {
1078                ieee80211_queue_work(&sdata->local->hw, &ifmgd->chswitch_work);
1079        }
1080}
1081EXPORT_SYMBOL(ieee80211_chswitch_done);
1082
1083static void ieee80211_chswitch_timer(unsigned long data)
1084{
1085        struct ieee80211_sub_if_data *sdata =
1086                (struct ieee80211_sub_if_data *) data;
1087
1088        ieee80211_queue_work(&sdata->local->hw, &sdata->u.mgd.chswitch_work);
1089}
1090
1091static void
1092ieee80211_sta_process_chanswitch(struct ieee80211_sub_if_data *sdata,
1093                                 u64 timestamp, u32 device_timestamp,
1094                                 struct ieee802_11_elems *elems,
1095                                 bool beacon)
1096{
1097        struct ieee80211_local *local = sdata->local;
1098        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
1099        struct cfg80211_bss *cbss = ifmgd->associated;
1100        struct ieee80211_chanctx_conf *conf;
1101        struct ieee80211_chanctx *chanctx;
1102        enum ieee80211_band current_band;
1103        struct ieee80211_csa_ie csa_ie;
1104        struct ieee80211_channel_switch ch_switch;
1105        int res;
1106
1107        sdata_assert_lock(sdata);
1108
1109        if (!cbss)
1110                return;
1111
1112        if (local->scanning)
1113                return;
1114
1115        /* disregard subsequent announcements if we are already processing */
1116        if (sdata->vif.csa_active)
1117                return;
1118
1119        current_band = cbss->channel->band;
1120        memset(&csa_ie, 0, sizeof(csa_ie));
1121        res = ieee80211_parse_ch_switch_ie(sdata, elems, current_band,
1122                                           ifmgd->flags,
1123                                           ifmgd->associated->bssid, &csa_ie);
1124        if (res < 0)
1125                ieee80211_queue_work(&local->hw,
1126                                     &ifmgd->csa_connection_drop_work);
1127        if (res)
1128                return;
1129
1130        if (!cfg80211_chandef_usable(local->hw.wiphy, &csa_ie.chandef,
1131                                     IEEE80211_CHAN_DISABLED)) {
1132                sdata_info(sdata,
1133                           "AP %pM switches to unsupported channel (%d MHz, width:%d, CF1/2: %d/%d MHz), disconnecting\n",
1134                           ifmgd->associated->bssid,
1135                           csa_ie.chandef.chan->center_freq,
1136                           csa_ie.chandef.width, csa_ie.chandef.center_freq1,
1137                           csa_ie.chandef.center_freq2);
1138                ieee80211_queue_work(&local->hw,
1139                                     &ifmgd->csa_connection_drop_work);
1140                return;
1141        }
1142
1143        if (cfg80211_chandef_identical(&csa_ie.chandef,
1144                                       &sdata->vif.bss_conf.chandef)) {
1145                if (ifmgd->csa_ignored_same_chan)
1146                        return;
1147                sdata_info(sdata,
1148                           "AP %pM tries to chanswitch to same channel, ignore\n",
1149                           ifmgd->associated->bssid);
1150                ifmgd->csa_ignored_same_chan = true;
1151                return;
1152        }
1153
1154        /*
1155         * Drop all TDLS peers - either we disconnect or move to a different
1156         * channel from this point on. There's no telling what our peer will do.
1157         * The TDLS WIDER_BW scenario is also problematic, as peers might now
1158         * have an incompatible wider chandef.
1159         */
1160        ieee80211_teardown_tdls_peers(sdata);
1161
1162        mutex_lock(&local->mtx);
1163        mutex_lock(&local->chanctx_mtx);
1164        conf = rcu_dereference_protected(sdata->vif.chanctx_conf,
1165                                         lockdep_is_held(&local->chanctx_mtx));
1166        if (!conf) {
1167                sdata_info(sdata,
1168                           "no channel context assigned to vif?, disconnecting\n");
1169                goto drop_connection;
1170        }
1171
1172        chanctx = container_of(conf, struct ieee80211_chanctx, conf);
1173
1174        if (local->use_chanctx &&
1175            !ieee80211_hw_check(&local->hw, CHANCTX_STA_CSA)) {
1176                sdata_info(sdata,
1177                           "driver doesn't support chan-switch with channel contexts\n");
1178                goto drop_connection;
1179        }
1180
1181        ch_switch.timestamp = timestamp;
1182        ch_switch.device_timestamp = device_timestamp;
1183        ch_switch.block_tx = csa_ie.mode;
1184        ch_switch.chandef = csa_ie.chandef;
1185        ch_switch.count = csa_ie.count;
1186
1187        if (drv_pre_channel_switch(sdata, &ch_switch)) {
1188                sdata_info(sdata,
1189                           "preparing for channel switch failed, disconnecting\n");
1190                goto drop_connection;
1191        }
1192
1193        res = ieee80211_vif_reserve_chanctx(sdata, &csa_ie.chandef,
1194                                            chanctx->mode, false);
1195        if (res) {
1196                sdata_info(sdata,
1197                           "failed to reserve channel context for channel switch, disconnecting (err=%d)\n",
1198                           res);
1199                goto drop_connection;
1200        }
1201        mutex_unlock(&local->chanctx_mtx);
1202
1203        sdata->vif.csa_active = true;
1204        sdata->csa_chandef = csa_ie.chandef;
1205        sdata->csa_block_tx = csa_ie.mode;
1206        ifmgd->csa_ignored_same_chan = false;
1207
1208        if (sdata->csa_block_tx)
1209                ieee80211_stop_vif_queues(local, sdata,
1210                                          IEEE80211_QUEUE_STOP_REASON_CSA);
1211        mutex_unlock(&local->mtx);
1212
1213        cfg80211_ch_switch_started_notify(sdata->dev, &csa_ie.chandef,
1214                                          csa_ie.count);
1215
1216        if (local->ops->channel_switch) {
1217                /* use driver's channel switch callback */
1218                drv_channel_switch(local, sdata, &ch_switch);
1219                return;
1220        }
1221
1222        /* channel switch handled in software */
1223        if (csa_ie.count <= 1)
1224                ieee80211_queue_work(&local->hw, &ifmgd->chswitch_work);
1225        else
1226                mod_timer(&ifmgd->chswitch_timer,
1227                          TU_TO_EXP_TIME((csa_ie.count - 1) *
1228                                         cbss->beacon_interval));
1229        return;
1230 drop_connection:
1231        ieee80211_queue_work(&local->hw, &ifmgd->csa_connection_drop_work);
1232        mutex_unlock(&local->chanctx_mtx);
1233        mutex_unlock(&local->mtx);
1234}
1235
1236static bool
1237ieee80211_find_80211h_pwr_constr(struct ieee80211_sub_if_data *sdata,
1238                                 struct ieee80211_channel *channel,
1239                                 const u8 *country_ie, u8 country_ie_len,
1240                                 const u8 *pwr_constr_elem,
1241                                 int *chan_pwr, int *pwr_reduction)
1242{
1243        struct ieee80211_country_ie_triplet *triplet;
1244        int chan = ieee80211_frequency_to_channel(channel->center_freq);
1245        int i, chan_increment;
1246        bool have_chan_pwr = false;
1247
1248        /* Invalid IE */
1249        if (country_ie_len % 2 || country_ie_len < IEEE80211_COUNTRY_IE_MIN_LEN)
1250                return false;
1251
1252        triplet = (void *)(country_ie + 3);
1253        country_ie_len -= 3;
1254
1255        switch (channel->band) {
1256        default:
1257                WARN_ON_ONCE(1);
1258                /* fall through */
1259        case IEEE80211_BAND_2GHZ:
1260        case IEEE80211_BAND_60GHZ:
1261                chan_increment = 1;
1262                break;
1263        case IEEE80211_BAND_5GHZ:
1264                chan_increment = 4;
1265                break;
1266        }
1267
1268        /* find channel */
1269        while (country_ie_len >= 3) {
1270                u8 first_channel = triplet->chans.first_channel;
1271
1272                if (first_channel >= IEEE80211_COUNTRY_EXTENSION_ID)
1273                        goto next;
1274
1275                for (i = 0; i < triplet->chans.num_channels; i++) {
1276                        if (first_channel + i * chan_increment == chan) {
1277                                have_chan_pwr = true;
1278                                *chan_pwr = triplet->chans.max_power;
1279                                break;
1280                        }
1281                }
1282                if (have_chan_pwr)
1283                        break;
1284
1285 next:
1286                triplet++;
1287                country_ie_len -= 3;
1288        }
1289
1290        if (have_chan_pwr && pwr_constr_elem)
1291                *pwr_reduction = *pwr_constr_elem;
1292        else
1293                *pwr_reduction = 0;
1294
1295        return have_chan_pwr;
1296}
1297
1298static void ieee80211_find_cisco_dtpc(struct ieee80211_sub_if_data *sdata,
1299                                      struct ieee80211_channel *channel,
1300                                      const u8 *cisco_dtpc_ie,
1301                                      int *pwr_level)
1302{
1303        /* From practical testing, the first data byte of the DTPC element
1304         * seems to contain the requested dBm level, and the CLI on Cisco
1305         * APs clearly state the range is -127 to 127 dBm, which indicates
1306         * a signed byte, although it seemingly never actually goes negative.
1307         * The other byte seems to always be zero.
1308         */
1309        *pwr_level = (__s8)cisco_dtpc_ie[4];
1310}
1311
1312static u32 ieee80211_handle_pwr_constr(struct ieee80211_sub_if_data *sdata,
1313                                       struct ieee80211_channel *channel,
1314                                       struct ieee80211_mgmt *mgmt,
1315                                       const u8 *country_ie, u8 country_ie_len,
1316                                       const u8 *pwr_constr_ie,
1317                                       const u8 *cisco_dtpc_ie)
1318{
1319        bool has_80211h_pwr = false, has_cisco_pwr = false;
1320        int chan_pwr = 0, pwr_reduction_80211h = 0;
1321        int pwr_level_cisco, pwr_level_80211h;
1322        int new_ap_level;
1323        __le16 capab = mgmt->u.probe_resp.capab_info;
1324
1325        if (country_ie &&
1326            (capab & cpu_to_le16(WLAN_CAPABILITY_SPECTRUM_MGMT) ||
1327             capab & cpu_to_le16(WLAN_CAPABILITY_RADIO_MEASURE))) {
1328                has_80211h_pwr = ieee80211_find_80211h_pwr_constr(
1329                        sdata, channel, country_ie, country_ie_len,
1330                        pwr_constr_ie, &chan_pwr, &pwr_reduction_80211h);
1331                pwr_level_80211h =
1332                        max_t(int, 0, chan_pwr - pwr_reduction_80211h);
1333        }
1334
1335        if (cisco_dtpc_ie) {
1336                ieee80211_find_cisco_dtpc(
1337                        sdata, channel, cisco_dtpc_ie, &pwr_level_cisco);
1338                has_cisco_pwr = true;
1339        }
1340
1341        if (!has_80211h_pwr && !has_cisco_pwr)
1342                return 0;
1343
1344        /* If we have both 802.11h and Cisco DTPC, apply both limits
1345         * by picking the smallest of the two power levels advertised.
1346         */
1347        if (has_80211h_pwr &&
1348            (!has_cisco_pwr || pwr_level_80211h <= pwr_level_cisco)) {
1349                new_ap_level = pwr_level_80211h;
1350
1351                if (sdata->ap_power_level == new_ap_level)
1352                        return 0;
1353
1354                sdata_dbg(sdata,
1355                          "Limiting TX power to %d (%d - %d) dBm as advertised by %pM\n",
1356                          pwr_level_80211h, chan_pwr, pwr_reduction_80211h,
1357                          sdata->u.mgd.bssid);
1358        } else {  /* has_cisco_pwr is always true here. */
1359                new_ap_level = pwr_level_cisco;
1360
1361                if (sdata->ap_power_level == new_ap_level)
1362                        return 0;
1363
1364                sdata_dbg(sdata,
1365                          "Limiting TX power to %d dBm as advertised by %pM\n",
1366                          pwr_level_cisco, sdata->u.mgd.bssid);
1367        }
1368
1369        sdata->ap_power_level = new_ap_level;
1370        if (__ieee80211_recalc_txpower(sdata))
1371                return BSS_CHANGED_TXPOWER;
1372        return 0;
1373}
1374
1375/* powersave */
1376static void ieee80211_enable_ps(struct ieee80211_local *local,
1377                                struct ieee80211_sub_if_data *sdata)
1378{
1379        struct ieee80211_conf *conf = &local->hw.conf;
1380
1381        /*
1382         * If we are scanning right now then the parameters will
1383         * take effect when scan finishes.
1384         */
1385        if (local->scanning)
1386                return;
1387
1388        if (conf->dynamic_ps_timeout > 0 &&
1389            !ieee80211_hw_check(&local->hw, SUPPORTS_DYNAMIC_PS)) {
1390                mod_timer(&local->dynamic_ps_timer, jiffies +
1391                          msecs_to_jiffies(conf->dynamic_ps_timeout));
1392        } else {
1393                if (ieee80211_hw_check(&local->hw, PS_NULLFUNC_STACK))
1394                        ieee80211_send_nullfunc(local, sdata, true);
1395
1396                if (ieee80211_hw_check(&local->hw, PS_NULLFUNC_STACK) &&
1397                    ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS))
1398                        return;
1399
1400                conf->flags |= IEEE80211_CONF_PS;
1401                ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS);
1402        }
1403}
1404
1405static void ieee80211_change_ps(struct ieee80211_local *local)
1406{
1407        struct ieee80211_conf *conf = &local->hw.conf;
1408
1409        if (local->ps_sdata) {
1410                ieee80211_enable_ps(local, local->ps_sdata);
1411        } else if (conf->flags & IEEE80211_CONF_PS) {
1412                conf->flags &= ~IEEE80211_CONF_PS;
1413                ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS);
1414                del_timer_sync(&local->dynamic_ps_timer);
1415                cancel_work_sync(&local->dynamic_ps_enable_work);
1416        }
1417}
1418
1419static bool ieee80211_powersave_allowed(struct ieee80211_sub_if_data *sdata)
1420{
1421        struct ieee80211_if_managed *mgd = &sdata->u.mgd;
1422        struct sta_info *sta = NULL;
1423        bool authorized = false;
1424
1425        if (!mgd->powersave)
1426                return false;
1427
1428        if (mgd->broken_ap)
1429                return false;
1430
1431        if (!mgd->associated)
1432                return false;
1433
1434        if (mgd->flags & IEEE80211_STA_CONNECTION_POLL)
1435                return false;
1436
1437        if (!mgd->have_beacon)
1438                return false;
1439
1440        rcu_read_lock();
1441        sta = sta_info_get(sdata, mgd->bssid);
1442        if (sta)
1443                authorized = test_sta_flag(sta, WLAN_STA_AUTHORIZED);
1444        rcu_read_unlock();
1445
1446        return authorized;
1447}
1448
1449/* need to hold RTNL or interface lock */
1450void ieee80211_recalc_ps(struct ieee80211_local *local)
1451{
1452        struct ieee80211_sub_if_data *sdata, *found = NULL;
1453        int count = 0;
1454        int timeout;
1455
1456        if (!ieee80211_hw_check(&local->hw, SUPPORTS_PS)) {
1457                local->ps_sdata = NULL;
1458                return;
1459        }
1460
1461        list_for_each_entry(sdata, &local->interfaces, list) {
1462                if (!ieee80211_sdata_running(sdata))
1463                        continue;
1464                if (sdata->vif.type == NL80211_IFTYPE_AP) {
1465                        /* If an AP vif is found, then disable PS
1466                         * by setting the count to zero thereby setting
1467                         * ps_sdata to NULL.
1468                         */
1469                        count = 0;
1470                        break;
1471                }
1472                if (sdata->vif.type != NL80211_IFTYPE_STATION)
1473                        continue;
1474                found = sdata;
1475                count++;
1476        }
1477
1478        if (count == 1 && ieee80211_powersave_allowed(found)) {
1479                u8 dtimper = found->u.mgd.dtim_period;
1480                s32 beaconint_us;
1481
1482                beaconint_us = ieee80211_tu_to_usec(
1483                                        found->vif.bss_conf.beacon_int);
1484
1485                timeout = local->dynamic_ps_forced_timeout;
1486                if (timeout < 0)
1487                        timeout = 100;
1488                local->hw.conf.dynamic_ps_timeout = timeout;
1489
1490                /* If the TIM IE is invalid, pretend the value is 1 */
1491                if (!dtimper)
1492                        dtimper = 1;
1493
1494                local->hw.conf.ps_dtim_period = dtimper;
1495                local->ps_sdata = found;
1496        } else {
1497                local->ps_sdata = NULL;
1498        }
1499
1500        ieee80211_change_ps(local);
1501}
1502
1503void ieee80211_recalc_ps_vif(struct ieee80211_sub_if_data *sdata)
1504{
1505        bool ps_allowed = ieee80211_powersave_allowed(sdata);
1506
1507        if (sdata->vif.bss_conf.ps != ps_allowed) {
1508                sdata->vif.bss_conf.ps = ps_allowed;
1509                ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_PS);
1510        }
1511}
1512
1513void ieee80211_dynamic_ps_disable_work(struct work_struct *work)
1514{
1515        struct ieee80211_local *local =
1516                container_of(work, struct ieee80211_local,
1517                             dynamic_ps_disable_work);
1518
1519        if (local->hw.conf.flags & IEEE80211_CONF_PS) {
1520                local->hw.conf.flags &= ~IEEE80211_CONF_PS;
1521                ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS);
1522        }
1523
1524        ieee80211_wake_queues_by_reason(&local->hw,
1525                                        IEEE80211_MAX_QUEUE_MAP,
1526                                        IEEE80211_QUEUE_STOP_REASON_PS,
1527                                        false);
1528}
1529
1530void ieee80211_dynamic_ps_enable_work(struct work_struct *work)
1531{
1532        struct ieee80211_local *local =
1533                container_of(work, struct ieee80211_local,
1534                             dynamic_ps_enable_work);
1535        struct ieee80211_sub_if_data *sdata = local->ps_sdata;
1536        struct ieee80211_if_managed *ifmgd;
1537        unsigned long flags;
1538        int q;
1539
1540        /* can only happen when PS was just disabled anyway */
1541        if (!sdata)
1542                return;
1543
1544        ifmgd = &sdata->u.mgd;
1545
1546        if (local->hw.conf.flags & IEEE80211_CONF_PS)
1547                return;
1548
1549        if (local->hw.conf.dynamic_ps_timeout > 0) {
1550                /* don't enter PS if TX frames are pending */
1551                if (drv_tx_frames_pending(local)) {
1552                        mod_timer(&local->dynamic_ps_timer, jiffies +
1553                                  msecs_to_jiffies(
1554                                  local->hw.conf.dynamic_ps_timeout));
1555                        return;
1556                }
1557
1558                /*
1559                 * transmission can be stopped by others which leads to
1560                 * dynamic_ps_timer expiry. Postpone the ps timer if it
1561                 * is not the actual idle state.
1562                 */
1563                spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
1564                for (q = 0; q < local->hw.queues; q++) {
1565                        if (local->queue_stop_reasons[q]) {
1566                                spin_unlock_irqrestore(&local->queue_stop_reason_lock,
1567                                                       flags);
1568                                mod_timer(&local->dynamic_ps_timer, jiffies +
1569                                          msecs_to_jiffies(
1570                                          local->hw.conf.dynamic_ps_timeout));
1571                                return;
1572                        }
1573                }
1574                spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
1575        }
1576
1577        if (ieee80211_hw_check(&local->hw, PS_NULLFUNC_STACK) &&
1578            !(ifmgd->flags & IEEE80211_STA_NULLFUNC_ACKED)) {
1579                if (drv_tx_frames_pending(local)) {
1580                        mod_timer(&local->dynamic_ps_timer, jiffies +
1581                                  msecs_to_jiffies(
1582                                  local->hw.conf.dynamic_ps_timeout));
1583                } else {
1584                        ieee80211_send_nullfunc(local, sdata, true);
1585                        /* Flush to get the tx status of nullfunc frame */
1586                        ieee80211_flush_queues(local, sdata, false);
1587                }
1588        }
1589
1590        if (!(ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS) &&
1591              ieee80211_hw_check(&local->hw, PS_NULLFUNC_STACK)) ||
1592            (ifmgd->flags & IEEE80211_STA_NULLFUNC_ACKED)) {
1593                ifmgd->flags &= ~IEEE80211_STA_NULLFUNC_ACKED;
1594                local->hw.conf.flags |= IEEE80211_CONF_PS;
1595                ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS);
1596        }
1597}
1598
1599void ieee80211_dynamic_ps_timer(unsigned long data)
1600{
1601        struct ieee80211_local *local = (void *) data;
1602
1603        ieee80211_queue_work(&local->hw, &local->dynamic_ps_enable_work);
1604}
1605
1606void ieee80211_dfs_cac_timer_work(struct work_struct *work)
1607{
1608        struct delayed_work *delayed_work = to_delayed_work(work);
1609        struct ieee80211_sub_if_data *sdata =
1610                container_of(delayed_work, struct ieee80211_sub_if_data,
1611                             dfs_cac_timer_work);
1612        struct cfg80211_chan_def chandef = sdata->vif.bss_conf.chandef;
1613
1614        mutex_lock(&sdata->local->mtx);
1615        if (sdata->wdev.cac_started) {
1616                ieee80211_vif_release_channel(sdata);
1617                cfg80211_cac_event(sdata->dev, &chandef,
1618                                   NL80211_RADAR_CAC_FINISHED,
1619                                   GFP_KERNEL);
1620        }
1621        mutex_unlock(&sdata->local->mtx);
1622}
1623
1624static bool
1625__ieee80211_sta_handle_tspec_ac_params(struct ieee80211_sub_if_data *sdata)
1626{
1627        struct ieee80211_local *local = sdata->local;
1628        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
1629        bool ret = false;
1630        int ac;
1631
1632        if (local->hw.queues < IEEE80211_NUM_ACS)
1633                return false;
1634
1635        for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
1636                struct ieee80211_sta_tx_tspec *tx_tspec = &ifmgd->tx_tspec[ac];
1637                int non_acm_ac;
1638                unsigned long now = jiffies;
1639
1640                if (tx_tspec->action == TX_TSPEC_ACTION_NONE &&
1641                    tx_tspec->admitted_time &&
1642                    time_after(now, tx_tspec->time_slice_start + HZ)) {
1643                        tx_tspec->consumed_tx_time = 0;
1644                        tx_tspec->time_slice_start = now;
1645
1646                        if (tx_tspec->downgraded)
1647                                tx_tspec->action =
1648                                        TX_TSPEC_ACTION_STOP_DOWNGRADE;
1649                }
1650
1651                switch (tx_tspec->action) {
1652                case TX_TSPEC_ACTION_STOP_DOWNGRADE:
1653                        /* take the original parameters */
1654                        if (drv_conf_tx(local, sdata, ac, &sdata->tx_conf[ac]))
1655                                sdata_err(sdata,
1656                                          "failed to set TX queue parameters for queue %d\n",
1657                                          ac);
1658                        tx_tspec->action = TX_TSPEC_ACTION_NONE;
1659                        tx_tspec->downgraded = false;
1660                        ret = true;
1661                        break;
1662                case TX_TSPEC_ACTION_DOWNGRADE:
1663                        if (time_after(now, tx_tspec->time_slice_start + HZ)) {
1664                                tx_tspec->action = TX_TSPEC_ACTION_NONE;
1665                                ret = true;
1666                                break;
1667                        }
1668                        /* downgrade next lower non-ACM AC */
1669                        for (non_acm_ac = ac + 1;
1670                             non_acm_ac < IEEE80211_NUM_ACS;
1671                             non_acm_ac++)
1672                                if (!(sdata->wmm_acm & BIT(7 - 2 * non_acm_ac)))
1673                                        break;
1674                        /* The loop will result in using BK even if it requires
1675                         * admission control, such configuration makes no sense
1676                         * and we have to transmit somehow - the AC selection
1677                         * does the same thing.
1678                         */
1679                        if (drv_conf_tx(local, sdata, ac,
1680                                        &sdata->tx_conf[non_acm_ac]))
1681                                sdata_err(sdata,
1682                                          "failed to set TX queue parameters for queue %d\n",
1683                                          ac);
1684                        tx_tspec->action = TX_TSPEC_ACTION_NONE;
1685                        ret = true;
1686                        schedule_delayed_work(&ifmgd->tx_tspec_wk,
1687                                tx_tspec->time_slice_start + HZ - now + 1);
1688                        break;
1689                case TX_TSPEC_ACTION_NONE:
1690                        /* nothing now */
1691                        break;
1692                }
1693        }
1694
1695        return ret;
1696}
1697
1698void ieee80211_sta_handle_tspec_ac_params(struct ieee80211_sub_if_data *sdata)
1699{
1700        if (__ieee80211_sta_handle_tspec_ac_params(sdata))
1701                ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_QOS);
1702}
1703
1704static void ieee80211_sta_handle_tspec_ac_params_wk(struct work_struct *work)
1705{
1706        struct ieee80211_sub_if_data *sdata;
1707
1708        sdata = container_of(work, struct ieee80211_sub_if_data,
1709                             u.mgd.tx_tspec_wk.work);
1710        ieee80211_sta_handle_tspec_ac_params(sdata);
1711}
1712
1713/* MLME */
1714static bool ieee80211_sta_wmm_params(struct ieee80211_local *local,
1715                                     struct ieee80211_sub_if_data *sdata,
1716                                     const u8 *wmm_param, size_t wmm_param_len)
1717{
1718        struct ieee80211_tx_queue_params params[IEEE80211_NUM_ACS];
1719        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
1720        size_t left;
1721        int count, ac;
1722        const u8 *pos;
1723        u8 uapsd_queues = 0;
1724
1725        if (!local->ops->conf_tx)
1726                return false;
1727
1728        if (local->hw.queues < IEEE80211_NUM_ACS)
1729                return false;
1730
1731        if (!wmm_param)
1732                return false;
1733
1734        if (wmm_param_len < 8 || wmm_param[5] /* version */ != 1)
1735                return false;
1736
1737        if (ifmgd->flags & IEEE80211_STA_UAPSD_ENABLED)
1738                uapsd_queues = ifmgd->uapsd_queues;
1739
1740        count = wmm_param[6] & 0x0f;
1741        if (count == ifmgd->wmm_last_param_set)
1742                return false;
1743        ifmgd->wmm_last_param_set = count;
1744
1745        pos = wmm_param + 8;
1746        left = wmm_param_len - 8;
1747
1748        memset(&params, 0, sizeof(params));
1749
1750        sdata->wmm_acm = 0;
1751        for (; left >= 4; left -= 4, pos += 4) {
1752                int aci = (pos[0] >> 5) & 0x03;
1753                int acm = (pos[0] >> 4) & 0x01;
1754                bool uapsd = false;
1755
1756                switch (aci) {
1757                case 1: /* AC_BK */
1758                        ac = IEEE80211_AC_BK;
1759                        if (acm)
1760                                sdata->wmm_acm |= BIT(1) | BIT(2); /* BK/- */
1761                        if (uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BK)
1762                                uapsd = true;
1763                        break;
1764                case 2: /* AC_VI */
1765                        ac = IEEE80211_AC_VI;
1766                        if (acm)
1767                                sdata->wmm_acm |= BIT(4) | BIT(5); /* CL/VI */
1768                        if (uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VI)
1769                                uapsd = true;
1770                        break;
1771                case 3: /* AC_VO */
1772                        ac = IEEE80211_AC_VO;
1773                        if (acm)
1774                                sdata->wmm_acm |= BIT(6) | BIT(7); /* VO/NC */
1775                        if (uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_VO)
1776                                uapsd = true;
1777                        break;
1778                case 0: /* AC_BE */
1779                default:
1780                        ac = IEEE80211_AC_BE;
1781                        if (acm)
1782                                sdata->wmm_acm |= BIT(0) | BIT(3); /* BE/EE */
1783                        if (uapsd_queues & IEEE80211_WMM_IE_STA_QOSINFO_AC_BE)
1784                                uapsd = true;
1785                        break;
1786                }
1787
1788                params[ac].aifs = pos[0] & 0x0f;
1789
1790                if (params[ac].aifs < 2) {
1791                        sdata_info(sdata,
1792                                   "AP has invalid WMM params (AIFSN=%d for ACI %d), will use 2\n",
1793                                   params[ac].aifs, aci);
1794                        params[ac].aifs = 2;
1795                }
1796                params[ac].cw_max = ecw2cw((pos[1] & 0xf0) >> 4);
1797                params[ac].cw_min = ecw2cw(pos[1] & 0x0f);
1798                params[ac].txop = get_unaligned_le16(pos + 2);
1799                params[ac].acm = acm;
1800                params[ac].uapsd = uapsd;
1801
1802                if (params[ac].cw_min > params[ac].cw_max) {
1803                        sdata_info(sdata,
1804                                   "AP has invalid WMM params (CWmin/max=%d/%d for ACI %d), using defaults\n",
1805                                   params[ac].cw_min, params[ac].cw_max, aci);
1806                        return false;
1807                }
1808        }
1809
1810        for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
1811                mlme_dbg(sdata,
1812                         "WMM AC=%d acm=%d aifs=%d cWmin=%d cWmax=%d txop=%d uapsd=%d, downgraded=%d\n",
1813                         ac, params[ac].acm,
1814                         params[ac].aifs, params[ac].cw_min, params[ac].cw_max,
1815                         params[ac].txop, params[ac].uapsd,
1816                         ifmgd->tx_tspec[ac].downgraded);
1817                sdata->tx_conf[ac] = params[ac];
1818                if (!ifmgd->tx_tspec[ac].downgraded &&
1819                    drv_conf_tx(local, sdata, ac, &params[ac]))
1820                        sdata_err(sdata,
1821                                  "failed to set TX queue parameters for AC %d\n",
1822                                  ac);
1823        }
1824
1825        /* enable WMM or activate new settings */
1826        sdata->vif.bss_conf.qos = true;
1827        return true;
1828}
1829
1830static void __ieee80211_stop_poll(struct ieee80211_sub_if_data *sdata)
1831{
1832        lockdep_assert_held(&sdata->local->mtx);
1833
1834        sdata->u.mgd.flags &= ~IEEE80211_STA_CONNECTION_POLL;
1835        ieee80211_run_deferred_scan(sdata->local);
1836}
1837
1838static void ieee80211_stop_poll(struct ieee80211_sub_if_data *sdata)
1839{
1840        mutex_lock(&sdata->local->mtx);
1841        __ieee80211_stop_poll(sdata);
1842        mutex_unlock(&sdata->local->mtx);
1843}
1844
1845static u32 ieee80211_handle_bss_capability(struct ieee80211_sub_if_data *sdata,
1846                                           u16 capab, bool erp_valid, u8 erp)
1847{
1848        struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf;
1849        u32 changed = 0;
1850        bool use_protection;
1851        bool use_short_preamble;
1852        bool use_short_slot;
1853
1854        if (erp_valid) {
1855                use_protection = (erp & WLAN_ERP_USE_PROTECTION) != 0;
1856                use_short_preamble = (erp & WLAN_ERP_BARKER_PREAMBLE) == 0;
1857        } else {
1858                use_protection = false;
1859                use_short_preamble = !!(capab & WLAN_CAPABILITY_SHORT_PREAMBLE);
1860        }
1861
1862        use_short_slot = !!(capab & WLAN_CAPABILITY_SHORT_SLOT_TIME);
1863        if (ieee80211_get_sdata_band(sdata) == IEEE80211_BAND_5GHZ)
1864                use_short_slot = true;
1865
1866        if (use_protection != bss_conf->use_cts_prot) {
1867                bss_conf->use_cts_prot = use_protection;
1868                changed |= BSS_CHANGED_ERP_CTS_PROT;
1869        }
1870
1871        if (use_short_preamble != bss_conf->use_short_preamble) {
1872                bss_conf->use_short_preamble = use_short_preamble;
1873                changed |= BSS_CHANGED_ERP_PREAMBLE;
1874        }
1875
1876        if (use_short_slot != bss_conf->use_short_slot) {
1877                bss_conf->use_short_slot = use_short_slot;
1878                changed |= BSS_CHANGED_ERP_SLOT;
1879        }
1880
1881        return changed;
1882}
1883
1884static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata,
1885                                     struct cfg80211_bss *cbss,
1886                                     u32 bss_info_changed)
1887{
1888        struct ieee80211_bss *bss = (void *)cbss->priv;
1889        struct ieee80211_local *local = sdata->local;
1890        struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf;
1891
1892        bss_info_changed |= BSS_CHANGED_ASSOC;
1893        bss_info_changed |= ieee80211_handle_bss_capability(sdata,
1894                bss_conf->assoc_capability, bss->has_erp_value, bss->erp_value);
1895
1896        sdata->u.mgd.beacon_timeout = usecs_to_jiffies(ieee80211_tu_to_usec(
1897                beacon_loss_count * bss_conf->beacon_int));
1898
1899        sdata->u.mgd.associated = cbss;
1900        memcpy(sdata->u.mgd.bssid, cbss->bssid, ETH_ALEN);
1901
1902        sdata->u.mgd.flags |= IEEE80211_STA_RESET_SIGNAL_AVE;
1903
1904        if (sdata->vif.p2p ||
1905            sdata->vif.driver_flags & IEEE80211_VIF_GET_NOA_UPDATE) {
1906                const struct cfg80211_bss_ies *ies;
1907
1908                rcu_read_lock();
1909                ies = rcu_dereference(cbss->ies);
1910                if (ies) {
1911                        int ret;
1912
1913                        ret = cfg80211_get_p2p_attr(
1914                                        ies->data, ies->len,
1915                                        IEEE80211_P2P_ATTR_ABSENCE_NOTICE,
1916                                        (u8 *) &bss_conf->p2p_noa_attr,
1917                                        sizeof(bss_conf->p2p_noa_attr));
1918                        if (ret >= 2) {
1919                                sdata->u.mgd.p2p_noa_index =
1920                                        bss_conf->p2p_noa_attr.index;
1921                                bss_info_changed |= BSS_CHANGED_P2P_PS;
1922                        }
1923                }
1924                rcu_read_unlock();
1925        }
1926
1927        /* just to be sure */
1928        ieee80211_stop_poll(sdata);
1929
1930        ieee80211_led_assoc(local, 1);
1931
1932        if (sdata->u.mgd.have_beacon) {
1933                /*
1934                 * If the AP is buggy we may get here with no DTIM period
1935                 * known, so assume it's 1 which is the only safe assumption
1936                 * in that case, although if the TIM IE is broken powersave
1937                 * probably just won't work at all.
1938                 */
1939                bss_conf->dtim_period = sdata->u.mgd.dtim_period ?: 1;
1940                bss_conf->beacon_rate = bss->beacon_rate;
1941                bss_info_changed |= BSS_CHANGED_BEACON_INFO;
1942        } else {
1943                bss_conf->beacon_rate = NULL;
1944                bss_conf->dtim_period = 0;
1945        }
1946
1947        bss_conf->assoc = 1;
1948
1949        /* Tell the driver to monitor connection quality (if supported) */
1950        if (sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_CQM_RSSI &&
1951            bss_conf->cqm_rssi_thold)
1952                bss_info_changed |= BSS_CHANGED_CQM;
1953
1954        /* Enable ARP filtering */
1955        if (bss_conf->arp_addr_cnt)
1956                bss_info_changed |= BSS_CHANGED_ARP_FILTER;
1957
1958        ieee80211_bss_info_change_notify(sdata, bss_info_changed);
1959
1960        mutex_lock(&local->iflist_mtx);
1961        ieee80211_recalc_ps(local);
1962        mutex_unlock(&local->iflist_mtx);
1963
1964        ieee80211_recalc_smps(sdata);
1965        ieee80211_recalc_ps_vif(sdata);
1966
1967        netif_carrier_on(sdata->dev);
1968}
1969
1970static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata,
1971                                   u16 stype, u16 reason, bool tx,
1972                                   u8 *frame_buf)
1973{
1974        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
1975        struct ieee80211_local *local = sdata->local;
1976        u32 changed = 0;
1977
1978        sdata_assert_lock(sdata);
1979
1980        if (WARN_ON_ONCE(tx && !frame_buf))
1981                return;
1982
1983        if (WARN_ON(!ifmgd->associated))
1984                return;
1985
1986        ieee80211_stop_poll(sdata);
1987
1988        ifmgd->associated = NULL;
1989        netif_carrier_off(sdata->dev);
1990
1991        /*
1992         * if we want to get out of ps before disassoc (why?) we have
1993         * to do it before sending disassoc, as otherwise the null-packet
1994         * won't be valid.
1995         */
1996        if (local->hw.conf.flags & IEEE80211_CONF_PS) {
1997                local->hw.conf.flags &= ~IEEE80211_CONF_PS;
1998                ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS);
1999        }
2000        local->ps_sdata = NULL;
2001
2002        /* disable per-vif ps */
2003        ieee80211_recalc_ps_vif(sdata);
2004
2005        /* make sure ongoing transmission finishes */
2006        synchronize_net();
2007
2008        /*
2009         * drop any frame before deauth/disassoc, this can be data or
2010         * management frame. Since we are disconnecting, we should not
2011         * insist sending these frames which can take time and delay
2012         * the disconnection and possible the roaming.
2013         */
2014        if (tx)
2015                ieee80211_flush_queues(local, sdata, true);
2016
2017        /* deauthenticate/disassociate now */
2018        if (tx || frame_buf)
2019                ieee80211_send_deauth_disassoc(sdata, ifmgd->bssid, stype,
2020                                               reason, tx, frame_buf);
2021
2022        /* flush out frame - make sure the deauth was actually sent */
2023        if (tx)
2024                ieee80211_flush_queues(local, sdata, false);
2025
2026        /* clear bssid only after building the needed mgmt frames */
2027        eth_zero_addr(ifmgd->bssid);
2028
2029        /* remove AP and TDLS peers */
2030        sta_info_flush(sdata);
2031
2032        /* finally reset all BSS / config parameters */
2033        changed |= ieee80211_reset_erp_info(sdata);
2034
2035        ieee80211_led_assoc(local, 0);
2036        changed |= BSS_CHANGED_ASSOC;
2037        sdata->vif.bss_conf.assoc = false;
2038
2039        ifmgd->p2p_noa_index = -1;
2040        memset(&sdata->vif.bss_conf.p2p_noa_attr, 0,
2041               sizeof(sdata->vif.bss_conf.p2p_noa_attr));
2042
2043        /* on the next assoc, re-program HT/VHT parameters */
2044        memset(&ifmgd->ht_capa, 0, sizeof(ifmgd->ht_capa));
2045        memset(&ifmgd->ht_capa_mask, 0, sizeof(ifmgd->ht_capa_mask));
2046        memset(&ifmgd->vht_capa, 0, sizeof(ifmgd->vht_capa));
2047        memset(&ifmgd->vht_capa_mask, 0, sizeof(ifmgd->vht_capa_mask));
2048
2049        /* reset MU-MIMO ownership and group data */
2050        memset(sdata->vif.bss_conf.mu_group.membership, 0,
2051               sizeof(sdata->vif.bss_conf.mu_group.membership));
2052        memset(sdata->vif.bss_conf.mu_group.position, 0,
2053               sizeof(sdata->vif.bss_conf.mu_group.position));
2054        changed |= BSS_CHANGED_MU_GROUPS;
2055        sdata->vif.mu_mimo_owner = false;
2056
2057        sdata->ap_power_level = IEEE80211_UNSET_POWER_LEVEL;
2058
2059        del_timer_sync(&local->dynamic_ps_timer);
2060        cancel_work_sync(&local->dynamic_ps_enable_work);
2061
2062        /* Disable ARP filtering */
2063        if (sdata->vif.bss_conf.arp_addr_cnt)
2064                changed |= BSS_CHANGED_ARP_FILTER;
2065
2066        sdata->vif.bss_conf.qos = false;
2067        changed |= BSS_CHANGED_QOS;
2068
2069        /* The BSSID (not really interesting) and HT changed */
2070        changed |= BSS_CHANGED_BSSID | BSS_CHANGED_HT;
2071        ieee80211_bss_info_change_notify(sdata, changed);
2072
2073        /* disassociated - set to defaults now */
2074        ieee80211_set_wmm_default(sdata, false, false);
2075
2076        del_timer_sync(&sdata->u.mgd.conn_mon_timer);
2077        del_timer_sync(&sdata->u.mgd.bcn_mon_timer);
2078        del_timer_sync(&sdata->u.mgd.timer);
2079        del_timer_sync(&sdata->u.mgd.chswitch_timer);
2080
2081        sdata->vif.bss_conf.dtim_period = 0;
2082        sdata->vif.bss_conf.beacon_rate = NULL;
2083
2084        ifmgd->have_beacon = false;
2085
2086        ifmgd->flags = 0;
2087        mutex_lock(&local->mtx);
2088        ieee80211_vif_release_channel(sdata);
2089
2090        sdata->vif.csa_active = false;
2091        ifmgd->csa_waiting_bcn = false;
2092        ifmgd->csa_ignored_same_chan = false;
2093        if (sdata->csa_block_tx) {
2094                ieee80211_wake_vif_queues(local, sdata,
2095                                          IEEE80211_QUEUE_STOP_REASON_CSA);
2096                sdata->csa_block_tx = false;
2097        }
2098        mutex_unlock(&local->mtx);
2099
2100        /* existing TX TSPEC sessions no longer exist */
2101        memset(ifmgd->tx_tspec, 0, sizeof(ifmgd->tx_tspec));
2102        cancel_delayed_work_sync(&ifmgd->tx_tspec_wk);
2103
2104        sdata->encrypt_headroom = IEEE80211_ENCRYPT_HEADROOM;
2105}
2106
2107void ieee80211_sta_rx_notify(struct ieee80211_sub_if_data *sdata,
2108                             struct ieee80211_hdr *hdr)
2109{
2110        /*
2111         * We can postpone the mgd.timer whenever receiving unicast frames
2112         * from AP because we know that the connection is working both ways
2113         * at that time. But multicast frames (and hence also beacons) must
2114         * be ignored here, because we need to trigger the timer during
2115         * data idle periods for sending the periodic probe request to the
2116         * AP we're connected to.
2117         */
2118        if (is_multicast_ether_addr(hdr->addr1))
2119                return;
2120
2121        ieee80211_sta_reset_conn_monitor(sdata);
2122}
2123
2124static void ieee80211_reset_ap_probe(struct ieee80211_sub_if_data *sdata)
2125{
2126        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
2127        struct ieee80211_local *local = sdata->local;
2128
2129        mutex_lock(&local->mtx);
2130        if (!(ifmgd->flags & IEEE80211_STA_CONNECTION_POLL))
2131                goto out;
2132
2133        __ieee80211_stop_poll(sdata);
2134
2135        mutex_lock(&local->iflist_mtx);
2136        ieee80211_recalc_ps(local);
2137        mutex_unlock(&local->iflist_mtx);
2138
2139        if (ieee80211_hw_check(&sdata->local->hw, CONNECTION_MONITOR))
2140                goto out;
2141
2142        /*
2143         * We've received a probe response, but are not sure whether
2144         * we have or will be receiving any beacons or data, so let's
2145         * schedule the timers again, just in case.
2146         */
2147        ieee80211_sta_reset_beacon_monitor(sdata);
2148
2149        mod_timer(&ifmgd->conn_mon_timer,
2150                  round_jiffies_up(jiffies +
2151                                   IEEE80211_CONNECTION_IDLE_TIME));
2152out:
2153        mutex_unlock(&local->mtx);
2154}
2155
2156static void ieee80211_sta_tx_wmm_ac_notify(struct ieee80211_sub_if_data *sdata,
2157                                           struct ieee80211_hdr *hdr,
2158                                           u16 tx_time)
2159{
2160        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
2161        u16 tid = *ieee80211_get_qos_ctl(hdr) & IEEE80211_QOS_CTL_TID_MASK;
2162        int ac = ieee80211_ac_from_tid(tid);
2163        struct ieee80211_sta_tx_tspec *tx_tspec = &ifmgd->tx_tspec[ac];
2164        unsigned long now = jiffies;
2165
2166        if (likely(!tx_tspec->admitted_time))
2167                return;
2168
2169        if (time_after(now, tx_tspec->time_slice_start + HZ)) {
2170                tx_tspec->consumed_tx_time = 0;
2171                tx_tspec->time_slice_start = now;
2172
2173                if (tx_tspec->downgraded) {
2174                        tx_tspec->action = TX_TSPEC_ACTION_STOP_DOWNGRADE;
2175                        schedule_delayed_work(&ifmgd->tx_tspec_wk, 0);
2176                }
2177        }
2178
2179        if (tx_tspec->downgraded)
2180                return;
2181
2182        tx_tspec->consumed_tx_time += tx_time;
2183
2184        if (tx_tspec->consumed_tx_time >= tx_tspec->admitted_time) {
2185                tx_tspec->downgraded = true;
2186                tx_tspec->action = TX_TSPEC_ACTION_DOWNGRADE;
2187                schedule_delayed_work(&ifmgd->tx_tspec_wk, 0);
2188        }
2189}
2190
2191void ieee80211_sta_tx_notify(struct ieee80211_sub_if_data *sdata,
2192                             struct ieee80211_hdr *hdr, bool ack, u16 tx_time)
2193{
2194        ieee80211_sta_tx_wmm_ac_notify(sdata, hdr, tx_time);
2195
2196        if (!ieee80211_is_data(hdr->frame_control))
2197            return;
2198
2199        if (ieee80211_is_nullfunc(hdr->frame_control) &&
2200            sdata->u.mgd.probe_send_count > 0) {
2201                if (ack)
2202                        ieee80211_sta_reset_conn_monitor(sdata);
2203                else
2204                        sdata->u.mgd.nullfunc_failed = true;
2205                ieee80211_queue_work(&sdata->local->hw, &sdata->work);
2206                return;
2207        }
2208
2209        if (ack)
2210                ieee80211_sta_reset_conn_monitor(sdata);
2211}
2212
2213static void ieee80211_mgd_probe_ap_send(struct ieee80211_sub_if_data *sdata)
2214{
2215        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
2216        const u8 *ssid;
2217        u8 *dst = ifmgd->associated->bssid;
2218        u8 unicast_limit = max(1, max_probe_tries - 3);
2219
2220        /*
2221         * Try sending broadcast probe requests for the last three
2222         * probe requests after the first ones failed since some
2223         * buggy APs only support broadcast probe requests.
2224         */
2225        if (ifmgd->probe_send_count >= unicast_limit)
2226                dst = NULL;
2227
2228        /*
2229         * When the hardware reports an accurate Tx ACK status, it's
2230         * better to send a nullfunc frame instead of a probe request,
2231         * as it will kick us off the AP quickly if we aren't associated
2232         * anymore. The timeout will be reset if the frame is ACKed by
2233         * the AP.
2234         */
2235        ifmgd->probe_send_count++;
2236
2237        if (ieee80211_hw_check(&sdata->local->hw, REPORTS_TX_ACK_STATUS)) {
2238                ifmgd->nullfunc_failed = false;
2239                ieee80211_send_nullfunc(sdata->local, sdata, false);
2240        } else {
2241                int ssid_len;
2242
2243                rcu_read_lock();
2244                ssid = ieee80211_bss_get_ie(ifmgd->associated, WLAN_EID_SSID);
2245                if (WARN_ON_ONCE(ssid == NULL))
2246                        ssid_len = 0;
2247                else
2248                        ssid_len = ssid[1];
2249
2250                ieee80211_send_probe_req(sdata, sdata->vif.addr, dst,
2251                                         ssid + 2, ssid_len, NULL,
2252                                         0, (u32) -1, true, 0,
2253                                         ifmgd->associated->channel, false);
2254                rcu_read_unlock();
2255        }
2256
2257        ifmgd->probe_timeout = jiffies + msecs_to_jiffies(probe_wait_ms);
2258        run_again(sdata, ifmgd->probe_timeout);
2259}
2260
2261static void ieee80211_mgd_probe_ap(struct ieee80211_sub_if_data *sdata,
2262                                   bool beacon)
2263{
2264        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
2265        bool already = false;
2266
2267        if (!ieee80211_sdata_running(sdata))
2268                return;
2269
2270        sdata_lock(sdata);
2271
2272        if (!ifmgd->associated)
2273                goto out;
2274
2275        mutex_lock(&sdata->local->mtx);
2276
2277        if (sdata->local->tmp_channel || sdata->local->scanning) {
2278                mutex_unlock(&sdata->local->mtx);
2279                goto out;
2280        }
2281
2282        if (beacon) {
2283                mlme_dbg_ratelimited(sdata,
2284                                     "detected beacon loss from AP (missed %d beacons) - probing\n",
2285                                     beacon_loss_count);
2286
2287                ieee80211_cqm_beacon_loss_notify(&sdata->vif, GFP_KERNEL);
2288        }
2289
2290        /*
2291         * The driver/our work has already reported this event or the
2292         * connection monitoring has kicked in and we have already sent
2293         * a probe request. Or maybe the AP died and the driver keeps
2294         * reporting until we disassociate...
2295         *
2296         * In either case we have to ignore the current call to this
2297         * function (except for setting the correct probe reason bit)
2298         * because otherwise we would reset the timer every time and
2299         * never check whether we received a probe response!
2300         */
2301        if (ifmgd->flags & IEEE80211_STA_CONNECTION_POLL)
2302                already = true;
2303
2304        ifmgd->flags |= IEEE80211_STA_CONNECTION_POLL;
2305
2306        mutex_unlock(&sdata->local->mtx);
2307
2308        if (already)
2309                goto out;
2310
2311        mutex_lock(&sdata->local->iflist_mtx);
2312        ieee80211_recalc_ps(sdata->local);
2313        mutex_unlock(&sdata->local->iflist_mtx);
2314
2315        ifmgd->probe_send_count = 0;
2316        ieee80211_mgd_probe_ap_send(sdata);
2317 out:
2318        sdata_unlock(sdata);
2319}
2320
2321struct sk_buff *ieee80211_ap_probereq_get(struct ieee80211_hw *hw,
2322                                          struct ieee80211_vif *vif)
2323{
2324        struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
2325        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
2326        struct cfg80211_bss *cbss;
2327        struct sk_buff *skb;
2328        const u8 *ssid;
2329        int ssid_len;
2330
2331        if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION))
2332                return NULL;
2333
2334        sdata_assert_lock(sdata);
2335
2336        if (ifmgd->associated)
2337                cbss = ifmgd->associated;
2338        else if (ifmgd->auth_data)
2339                cbss = ifmgd->auth_data->bss;
2340        else if (ifmgd->assoc_data)
2341                cbss = ifmgd->assoc_data->bss;
2342        else
2343                return NULL;
2344
2345        rcu_read_lock();
2346        ssid = ieee80211_bss_get_ie(cbss, WLAN_EID_SSID);
2347        if (WARN_ON_ONCE(ssid == NULL))
2348                ssid_len = 0;
2349        else
2350                ssid_len = ssid[1];
2351
2352        skb = ieee80211_build_probe_req(sdata, sdata->vif.addr, cbss->bssid,
2353                                        (u32) -1, cbss->channel,
2354                                        ssid + 2, ssid_len,
2355                                        NULL, 0, true);
2356        rcu_read_unlock();
2357
2358        return skb;
2359}
2360EXPORT_SYMBOL(ieee80211_ap_probereq_get);
2361
2362static void ieee80211_report_disconnect(struct ieee80211_sub_if_data *sdata,
2363                                        const u8 *buf, size_t len, bool tx,
2364                                        u16 reason)
2365{
2366        struct ieee80211_event event = {
2367                .type = MLME_EVENT,
2368                .u.mlme.data = tx ? DEAUTH_TX_EVENT : DEAUTH_RX_EVENT,
2369                .u.mlme.reason = reason,
2370        };
2371
2372        if (tx)
2373                cfg80211_tx_mlme_mgmt(sdata->dev, buf, len);
2374        else
2375                cfg80211_rx_mlme_mgmt(sdata->dev, buf, len);
2376
2377        drv_event_callback(sdata->local, sdata, &event);
2378}
2379
2380static void __ieee80211_disconnect(struct ieee80211_sub_if_data *sdata)
2381{
2382        struct ieee80211_local *local = sdata->local;
2383        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
2384        u8 frame_buf[IEEE80211_DEAUTH_FRAME_LEN];
2385
2386        sdata_lock(sdata);
2387        if (!ifmgd->associated) {
2388                sdata_unlock(sdata);
2389                return;
2390        }
2391
2392        ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH,
2393                               WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY,
2394                               true, frame_buf);
2395        mutex_lock(&local->mtx);
2396        sdata->vif.csa_active = false;
2397        ifmgd->csa_waiting_bcn = false;
2398        if (sdata->csa_block_tx) {
2399                ieee80211_wake_vif_queues(local, sdata,
2400                                          IEEE80211_QUEUE_STOP_REASON_CSA);
2401                sdata->csa_block_tx = false;
2402        }
2403        mutex_unlock(&local->mtx);
2404
2405        ieee80211_report_disconnect(sdata, frame_buf, sizeof(frame_buf), true,
2406                                    WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY);
2407
2408        sdata_unlock(sdata);
2409}
2410
2411static void ieee80211_beacon_connection_loss_work(struct work_struct *work)
2412{
2413        struct ieee80211_sub_if_data *sdata =
2414                container_of(work, struct ieee80211_sub_if_data,
2415                             u.mgd.beacon_connection_loss_work);
2416        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
2417
2418        if (ifmgd->associated)
2419                ifmgd->beacon_loss_count++;
2420
2421        if (ifmgd->connection_loss) {
2422                sdata_info(sdata, "Connection to AP %pM lost\n",
2423                           ifmgd->bssid);
2424                __ieee80211_disconnect(sdata);
2425        } else {
2426                ieee80211_mgd_probe_ap(sdata, true);
2427        }
2428}
2429
2430static void ieee80211_csa_connection_drop_work(struct work_struct *work)
2431{
2432        struct ieee80211_sub_if_data *sdata =
2433                container_of(work, struct ieee80211_sub_if_data,
2434                             u.mgd.csa_connection_drop_work);
2435
2436        __ieee80211_disconnect(sdata);
2437}
2438
2439void ieee80211_beacon_loss(struct ieee80211_vif *vif)
2440{
2441        struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
2442        struct ieee80211_hw *hw = &sdata->local->hw;
2443
2444        trace_api_beacon_loss(sdata);
2445
2446        sdata->u.mgd.connection_loss = false;
2447        ieee80211_queue_work(hw, &sdata->u.mgd.beacon_connection_loss_work);
2448}
2449EXPORT_SYMBOL(ieee80211_beacon_loss);
2450
2451void ieee80211_connection_loss(struct ieee80211_vif *vif)
2452{
2453        struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
2454        struct ieee80211_hw *hw = &sdata->local->hw;
2455
2456        trace_api_connection_loss(sdata);
2457
2458        sdata->u.mgd.connection_loss = true;
2459        ieee80211_queue_work(hw, &sdata->u.mgd.beacon_connection_loss_work);
2460}
2461EXPORT_SYMBOL(ieee80211_connection_loss);
2462
2463
2464static void ieee80211_destroy_auth_data(struct ieee80211_sub_if_data *sdata,
2465                                        bool assoc)
2466{
2467        struct ieee80211_mgd_auth_data *auth_data = sdata->u.mgd.auth_data;
2468
2469        sdata_assert_lock(sdata);
2470
2471        if (!assoc) {
2472                /*
2473                 * we are not authenticated yet, the only timer that could be
2474                 * running is the timeout for the authentication response which
2475                 * which is not relevant anymore.
2476                 */
2477                del_timer_sync(&sdata->u.mgd.timer);
2478                sta_info_destroy_addr(sdata, auth_data->bss->bssid);
2479
2480                eth_zero_addr(sdata->u.mgd.bssid);
2481                ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID);
2482                sdata->u.mgd.flags = 0;
2483                mutex_lock(&sdata->local->mtx);
2484                ieee80211_vif_release_channel(sdata);
2485                mutex_unlock(&sdata->local->mtx);
2486        }
2487
2488        cfg80211_put_bss(sdata->local->hw.wiphy, auth_data->bss);
2489        kfree(auth_data);
2490        sdata->u.mgd.auth_data = NULL;
2491}
2492
2493static void ieee80211_destroy_assoc_data(struct ieee80211_sub_if_data *sdata,
2494                                         bool assoc)
2495{
2496        struct ieee80211_mgd_assoc_data *assoc_data = sdata->u.mgd.assoc_data;
2497
2498        sdata_assert_lock(sdata);
2499
2500        if (!assoc) {
2501                /*
2502                 * we are not associated yet, the only timer that could be
2503                 * running is the timeout for the association response which
2504                 * which is not relevant anymore.
2505                 */
2506                del_timer_sync(&sdata->u.mgd.timer);
2507                sta_info_destroy_addr(sdata, assoc_data->bss->bssid);
2508
2509                eth_zero_addr(sdata->u.mgd.bssid);
2510                ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID);
2511                sdata->u.mgd.flags = 0;
2512                sdata->vif.mu_mimo_owner = false;
2513
2514                mutex_lock(&sdata->local->mtx);
2515                ieee80211_vif_release_channel(sdata);
2516                mutex_unlock(&sdata->local->mtx);
2517        }
2518
2519        kfree(assoc_data);
2520        sdata->u.mgd.assoc_data = NULL;
2521}
2522
2523static void ieee80211_auth_challenge(struct ieee80211_sub_if_data *sdata,
2524                                     struct ieee80211_mgmt *mgmt, size_t len)
2525{
2526        struct ieee80211_local *local = sdata->local;
2527        struct ieee80211_mgd_auth_data *auth_data = sdata->u.mgd.auth_data;
2528        u8 *pos;
2529        struct ieee802_11_elems elems;
2530        u32 tx_flags = 0;
2531
2532        pos = mgmt->u.auth.variable;
2533        ieee802_11_parse_elems(pos, len - (pos - (u8 *) mgmt), false, &elems);
2534        if (!elems.challenge)
2535                return;
2536        auth_data->expected_transaction = 4;
2537        drv_mgd_prepare_tx(sdata->local, sdata);
2538        if (ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS))
2539                tx_flags = IEEE80211_TX_CTL_REQ_TX_STATUS |
2540                           IEEE80211_TX_INTFL_MLME_CONN_TX;
2541        ieee80211_send_auth(sdata, 3, auth_data->algorithm, 0,
2542                            elems.challenge - 2, elems.challenge_len + 2,
2543                            auth_data->bss->bssid, auth_data->bss->bssid,
2544                            auth_data->key, auth_data->key_len,
2545                            auth_data->key_idx, tx_flags);
2546}
2547
2548static void ieee80211_rx_mgmt_auth(struct ieee80211_sub_if_data *sdata,
2549                                   struct ieee80211_mgmt *mgmt, size_t len)
2550{
2551        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
2552        u8 bssid[ETH_ALEN];
2553        u16 auth_alg, auth_transaction, status_code;
2554        struct sta_info *sta;
2555        struct ieee80211_event event = {
2556                .type = MLME_EVENT,
2557                .u.mlme.data = AUTH_EVENT,
2558        };
2559
2560        sdata_assert_lock(sdata);
2561
2562        if (len < 24 + 6)
2563                return;
2564
2565        if (!ifmgd->auth_data || ifmgd->auth_data->done)
2566                return;
2567
2568        memcpy(bssid, ifmgd->auth_data->bss->bssid, ETH_ALEN);
2569
2570        if (!ether_addr_equal(bssid, mgmt->bssid))
2571                return;
2572
2573        auth_alg = le16_to_cpu(mgmt->u.auth.auth_alg);
2574        auth_transaction = le16_to_cpu(mgmt->u.auth.auth_transaction);
2575        status_code = le16_to_cpu(mgmt->u.auth.status_code);
2576
2577        if (auth_alg != ifmgd->auth_data->algorithm ||
2578            auth_transaction != ifmgd->auth_data->expected_transaction) {
2579                sdata_info(sdata, "%pM unexpected authentication state: alg %d (expected %d) transact %d (expected %d)\n",
2580                           mgmt->sa, auth_alg, ifmgd->auth_data->algorithm,
2581                           auth_transaction,
2582                           ifmgd->auth_data->expected_transaction);
2583                return;
2584        }
2585
2586        if (status_code != WLAN_STATUS_SUCCESS) {
2587                sdata_info(sdata, "%pM denied authentication (status %d)\n",
2588                           mgmt->sa, status_code);
2589                ieee80211_destroy_auth_data(sdata, false);
2590                cfg80211_rx_mlme_mgmt(sdata->dev, (u8 *)mgmt, len);
2591                event.u.mlme.status = MLME_DENIED;
2592                event.u.mlme.reason = status_code;
2593                drv_event_callback(sdata->local, sdata, &event);
2594                return;
2595        }
2596
2597        switch (ifmgd->auth_data->algorithm) {
2598        case WLAN_AUTH_OPEN:
2599        case WLAN_AUTH_LEAP:
2600        case WLAN_AUTH_FT:
2601        case WLAN_AUTH_SAE:
2602                break;
2603        case WLAN_AUTH_SHARED_KEY:
2604                if (ifmgd->auth_data->expected_transaction != 4) {
2605                        ieee80211_auth_challenge(sdata, mgmt, len);
2606                        /* need another frame */
2607                        return;
2608                }
2609                break;
2610        default:
2611                WARN_ONCE(1, "invalid auth alg %d",
2612                          ifmgd->auth_data->algorithm);
2613                return;
2614        }
2615
2616        event.u.mlme.status = MLME_SUCCESS;
2617        drv_event_callback(sdata->local, sdata, &event);
2618        sdata_info(sdata, "authenticated\n");
2619        ifmgd->auth_data->done = true;
2620        ifmgd->auth_data->timeout = jiffies + IEEE80211_AUTH_WAIT_ASSOC;
2621        ifmgd->auth_data->timeout_started = true;
2622        run_again(sdata, ifmgd->auth_data->timeout);
2623
2624        if (ifmgd->auth_data->algorithm == WLAN_AUTH_SAE &&
2625            ifmgd->auth_data->expected_transaction != 2) {
2626                /*
2627                 * Report auth frame to user space for processing since another
2628                 * round of Authentication frames is still needed.
2629                 */
2630                cfg80211_rx_mlme_mgmt(sdata->dev, (u8 *)mgmt, len);
2631                return;
2632        }
2633
2634        /* move station state to auth */
2635        mutex_lock(&sdata->local->sta_mtx);
2636        sta = sta_info_get(sdata, bssid);
2637        if (!sta) {
2638                WARN_ONCE(1, "%s: STA %pM not found", sdata->name, bssid);
2639                goto out_err;
2640        }
2641        if (sta_info_move_state(sta, IEEE80211_STA_AUTH)) {
2642                sdata_info(sdata, "failed moving %pM to auth\n", bssid);
2643                goto out_err;
2644        }
2645        mutex_unlock(&sdata->local->sta_mtx);
2646
2647        cfg80211_rx_mlme_mgmt(sdata->dev, (u8 *)mgmt, len);
2648        return;
2649 out_err:
2650        mutex_unlock(&sdata->local->sta_mtx);
2651        /* ignore frame -- wait for timeout */
2652}
2653
2654#define case_WLAN(type) \
2655        case WLAN_REASON_##type: return #type
2656
2657static const char *ieee80211_get_reason_code_string(u16 reason_code)
2658{
2659        switch (reason_code) {
2660        case_WLAN(UNSPECIFIED);
2661        case_WLAN(PREV_AUTH_NOT_VALID);
2662        case_WLAN(DEAUTH_LEAVING);
2663        case_WLAN(DISASSOC_DUE_TO_INACTIVITY);
2664        case_WLAN(DISASSOC_AP_BUSY);
2665        case_WLAN(CLASS2_FRAME_FROM_NONAUTH_STA);
2666        case_WLAN(CLASS3_FRAME_FROM_NONASSOC_STA);
2667        case_WLAN(DISASSOC_STA_HAS_LEFT);
2668        case_WLAN(STA_REQ_ASSOC_WITHOUT_AUTH);
2669        case_WLAN(DISASSOC_BAD_POWER);
2670        case_WLAN(DISASSOC_BAD_SUPP_CHAN);
2671        case_WLAN(INVALID_IE);
2672        case_WLAN(MIC_FAILURE);
2673        case_WLAN(4WAY_HANDSHAKE_TIMEOUT);
2674        case_WLAN(GROUP_KEY_HANDSHAKE_TIMEOUT);
2675        case_WLAN(IE_DIFFERENT);
2676        case_WLAN(INVALID_GROUP_CIPHER);
2677        case_WLAN(INVALID_PAIRWISE_CIPHER);
2678        case_WLAN(INVALID_AKMP);
2679        case_WLAN(UNSUPP_RSN_VERSION);
2680        case_WLAN(INVALID_RSN_IE_CAP);
2681        case_WLAN(IEEE8021X_FAILED);
2682        case_WLAN(CIPHER_SUITE_REJECTED);
2683        case_WLAN(DISASSOC_UNSPECIFIED_QOS);
2684        case_WLAN(DISASSOC_QAP_NO_BANDWIDTH);
2685        case_WLAN(DISASSOC_LOW_ACK);
2686        case_WLAN(DISASSOC_QAP_EXCEED_TXOP);
2687        case_WLAN(QSTA_LEAVE_QBSS);
2688        case_WLAN(QSTA_NOT_USE);
2689        case_WLAN(QSTA_REQUIRE_SETUP);
2690        case_WLAN(QSTA_TIMEOUT);
2691        case_WLAN(QSTA_CIPHER_NOT_SUPP);
2692        case_WLAN(MESH_PEER_CANCELED);
2693        case_WLAN(MESH_MAX_PEERS);
2694        case_WLAN(MESH_CONFIG);
2695        case_WLAN(MESH_CLOSE);
2696        case_WLAN(MESH_MAX_RETRIES);
2697        case_WLAN(MESH_CONFIRM_TIMEOUT);
2698        case_WLAN(MESH_INVALID_GTK);
2699        case_WLAN(MESH_INCONSISTENT_PARAM);
2700        case_WLAN(MESH_INVALID_SECURITY);
2701        case_WLAN(MESH_PATH_ERROR);
2702        case_WLAN(MESH_PATH_NOFORWARD);
2703        case_WLAN(MESH_PATH_DEST_UNREACHABLE);
2704        case_WLAN(MAC_EXISTS_IN_MBSS);
2705        case_WLAN(MESH_CHAN_REGULATORY);
2706        case_WLAN(MESH_CHAN);
2707        default: return "<unknown>";
2708        }
2709}
2710
2711static void ieee80211_rx_mgmt_deauth(struct ieee80211_sub_if_data *sdata,
2712                                     struct ieee80211_mgmt *mgmt, size_t len)
2713{
2714        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
2715        u16 reason_code = le16_to_cpu(mgmt->u.deauth.reason_code);
2716
2717        sdata_assert_lock(sdata);
2718
2719        if (len < 24 + 2)
2720                return;
2721
2722        if (ifmgd->associated &&
2723            ether_addr_equal(mgmt->bssid, ifmgd->associated->bssid)) {
2724                const u8 *bssid = ifmgd->associated->bssid;
2725
2726                sdata_info(sdata, "deauthenticated from %pM (Reason: %u=%s)\n",
2727                           bssid, reason_code,
2728                           ieee80211_get_reason_code_string(reason_code));
2729
2730                ieee80211_set_disassoc(sdata, 0, 0, false, NULL);
2731
2732                ieee80211_report_disconnect(sdata, (u8 *)mgmt, len, false,
2733                                            reason_code);
2734                return;
2735        }
2736
2737        if (ifmgd->assoc_data &&
2738            ether_addr_equal(mgmt->bssid, ifmgd->assoc_data->bss->bssid)) {
2739                const u8 *bssid = ifmgd->assoc_data->bss->bssid;
2740
2741                sdata_info(sdata,
2742                           "deauthenticated from %pM while associating (Reason: %u=%s)\n",
2743                           bssid, reason_code,
2744                           ieee80211_get_reason_code_string(reason_code));
2745
2746                ieee80211_destroy_assoc_data(sdata, false);
2747
2748                cfg80211_rx_mlme_mgmt(sdata->dev, (u8 *)mgmt, len);
2749                return;
2750        }
2751}
2752
2753
2754static void ieee80211_rx_mgmt_disassoc(struct ieee80211_sub_if_data *sdata,
2755                                       struct ieee80211_mgmt *mgmt, size_t len)
2756{
2757        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
2758        u16 reason_code;
2759
2760        sdata_assert_lock(sdata);
2761
2762        if (len < 24 + 2)
2763                return;
2764
2765        if (!ifmgd->associated ||
2766            !ether_addr_equal(mgmt->bssid, ifmgd->associated->bssid))
2767                return;
2768
2769        reason_code = le16_to_cpu(mgmt->u.disassoc.reason_code);
2770
2771        sdata_info(sdata, "disassociated from %pM (Reason: %u)\n",
2772                   mgmt->sa, reason_code);
2773
2774        ieee80211_set_disassoc(sdata, 0, 0, false, NULL);
2775
2776        ieee80211_report_disconnect(sdata, (u8 *)mgmt, len, false, reason_code);
2777}
2778
2779static void ieee80211_get_rates(struct ieee80211_supported_band *sband,
2780                                u8 *supp_rates, unsigned int supp_rates_len,
2781                                u32 *rates, u32 *basic_rates,
2782                                bool *have_higher_than_11mbit,
2783                                int *min_rate, int *min_rate_index,
2784                                int shift, u32 rate_flags)
2785{
2786        int i, j;
2787
2788        for (i = 0; i < supp_rates_len; i++) {
2789                int rate = supp_rates[i] & 0x7f;
2790                bool is_basic = !!(supp_rates[i] & 0x80);
2791
2792                if ((rate * 5 * (1 << shift)) > 110)
2793                        *have_higher_than_11mbit = true;
2794
2795                /*
2796                 * BSS_MEMBERSHIP_SELECTOR_HT_PHY is defined in 802.11n-2009
2797                 * 7.3.2.2 as a magic value instead of a rate. Hence, skip it.
2798                 *
2799                 * Note: Even through the membership selector and the basic
2800                 *       rate flag share the same bit, they are not exactly
2801                 *       the same.
2802                 */
2803                if (!!(supp_rates[i] & 0x80) &&
2804                    (supp_rates[i] & 0x7f) == BSS_MEMBERSHIP_SELECTOR_HT_PHY)
2805                        continue;
2806
2807                for (j = 0; j < sband->n_bitrates; j++) {
2808                        struct ieee80211_rate *br;
2809                        int brate;
2810
2811                        br = &sband->bitrates[j];
2812                        if ((rate_flags & br->flags) != rate_flags)
2813                                continue;
2814
2815                        brate = DIV_ROUND_UP(br->bitrate, (1 << shift) * 5);
2816                        if (brate == rate) {
2817                                *rates |= BIT(j);
2818                                if (is_basic)
2819                                        *basic_rates |= BIT(j);
2820                                if ((rate * 5) < *min_rate) {
2821                                        *min_rate = rate * 5;
2822                                        *min_rate_index = j;
2823                                }
2824                                break;
2825                        }
2826                }
2827        }
2828}
2829
2830static bool ieee80211_assoc_success(struct ieee80211_sub_if_data *sdata,
2831                                    struct cfg80211_bss *cbss,
2832                                    struct ieee80211_mgmt *mgmt, size_t len)
2833{
2834        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
2835        struct ieee80211_local *local = sdata->local;
2836        struct ieee80211_supported_band *sband;
2837        struct sta_info *sta;
2838        u8 *pos;
2839        u16 capab_info, aid;
2840        struct ieee802_11_elems elems;
2841        struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf;
2842        const struct cfg80211_bss_ies *bss_ies = NULL;
2843        struct ieee80211_mgd_assoc_data *assoc_data = ifmgd->assoc_data;
2844        u32 changed = 0;
2845        int err;
2846        bool ret;
2847
2848        /* AssocResp and ReassocResp have identical structure */
2849
2850        aid = le16_to_cpu(mgmt->u.assoc_resp.aid);
2851        capab_info = le16_to_cpu(mgmt->u.assoc_resp.capab_info);
2852
2853        if ((aid & (BIT(15) | BIT(14))) != (BIT(15) | BIT(14)))
2854                sdata_info(sdata, "invalid AID value 0x%x; bits 15:14 not set\n",
2855                           aid);
2856        aid &= ~(BIT(15) | BIT(14));
2857
2858        ifmgd->broken_ap = false;
2859
2860        if (aid == 0 || aid > IEEE80211_MAX_AID) {
2861                sdata_info(sdata, "invalid AID value %d (out of range), turn off PS\n",
2862                           aid);
2863                aid = 0;
2864                ifmgd->broken_ap = true;
2865        }
2866
2867        pos = mgmt->u.assoc_resp.variable;
2868        ieee802_11_parse_elems(pos, len - (pos - (u8 *) mgmt), false, &elems);
2869
2870        if (!elems.supp_rates) {
2871                sdata_info(sdata, "no SuppRates element in AssocResp\n");
2872                return false;
2873        }
2874
2875        ifmgd->aid = aid;
2876        ifmgd->tdls_chan_switch_prohibited =
2877                elems.ext_capab && elems.ext_capab_len >= 5 &&
2878                (elems.ext_capab[4] & WLAN_EXT_CAPA5_TDLS_CH_SW_PROHIBITED);
2879
2880        /*
2881         * Some APs are erroneously not including some information in their
2882         * (re)association response frames. Try to recover by using the data
2883         * from the beacon or probe response. This seems to afflict mobile
2884         * 2G/3G/4G wifi routers, reported models include the "Onda PN51T",
2885         * "Vodafone PocketWiFi 2", "ZTE MF60" and a similar T-Mobile device.
2886         */
2887        if ((assoc_data->wmm && !elems.wmm_param) ||
2888            (!(ifmgd->flags & IEEE80211_STA_DISABLE_HT) &&
2889             (!elems.ht_cap_elem || !elems.ht_operation)) ||
2890            (!(ifmgd->flags & IEEE80211_STA_DISABLE_VHT) &&
2891             (!elems.vht_cap_elem || !elems.vht_operation))) {
2892                const struct cfg80211_bss_ies *ies;
2893                struct ieee802_11_elems bss_elems;
2894
2895                rcu_read_lock();
2896                ies = rcu_dereference(cbss->ies);
2897                if (ies)
2898                        bss_ies = kmemdup(ies, sizeof(*ies) + ies->len,
2899                                          GFP_ATOMIC);
2900                rcu_read_unlock();
2901                if (!bss_ies)
2902                        return false;
2903
2904                ieee802_11_parse_elems(bss_ies->data, bss_ies->len,
2905                                       false, &bss_elems);
2906                if (assoc_data->wmm &&
2907                    !elems.wmm_param && bss_elems.wmm_param) {
2908                        elems.wmm_param = bss_elems.wmm_param;
2909                        sdata_info(sdata,
2910                                   "AP bug: WMM param missing from AssocResp\n");
2911                }
2912
2913                /*
2914                 * Also check if we requested HT/VHT, otherwise the AP doesn't
2915                 * have to include the IEs in the (re)association response.
2916                 */
2917                if (!elems.ht_cap_elem && bss_elems.ht_cap_elem &&
2918                    !(ifmgd->flags & IEEE80211_STA_DISABLE_HT)) {
2919                        elems.ht_cap_elem = bss_elems.ht_cap_elem;
2920                        sdata_info(sdata,
2921                                   "AP bug: HT capability missing from AssocResp\n");
2922                }
2923                if (!elems.ht_operation && bss_elems.ht_operation &&
2924                    !(ifmgd->flags & IEEE80211_STA_DISABLE_HT)) {
2925                        elems.ht_operation = bss_elems.ht_operation;
2926                        sdata_info(sdata,
2927                                   "AP bug: HT operation missing from AssocResp\n");
2928                }
2929                if (!elems.vht_cap_elem && bss_elems.vht_cap_elem &&
2930                    !(ifmgd->flags & IEEE80211_STA_DISABLE_VHT)) {
2931                        elems.vht_cap_elem = bss_elems.vht_cap_elem;
2932                        sdata_info(sdata,
2933                                   "AP bug: VHT capa missing from AssocResp\n");
2934                }
2935                if (!elems.vht_operation && bss_elems.vht_operation &&
2936                    !(ifmgd->flags & IEEE80211_STA_DISABLE_VHT)) {
2937                        elems.vht_operation = bss_elems.vht_operation;
2938                        sdata_info(sdata,
2939                                   "AP bug: VHT operation missing from AssocResp\n");
2940                }
2941        }
2942
2943        /*
2944         * We previously checked these in the beacon/probe response, so
2945         * they should be present here. This is just a safety net.
2946         */
2947        if (!(ifmgd->flags & IEEE80211_STA_DISABLE_HT) &&
2948            (!elems.wmm_param || !elems.ht_cap_elem || !elems.ht_operation)) {
2949                sdata_info(sdata,
2950                           "HT AP is missing WMM params or HT capability/operation\n");
2951                ret = false;
2952                goto out;
2953        }
2954
2955        if (!(ifmgd->flags & IEEE80211_STA_DISABLE_VHT) &&
2956            (!elems.vht_cap_elem || !elems.vht_operation)) {
2957                sdata_info(sdata,
2958                           "VHT AP is missing VHT capability/operation\n");
2959                ret = false;
2960                goto out;
2961        }
2962
2963        mutex_lock(&sdata->local->sta_mtx);
2964        /*
2965         * station info was already allocated and inserted before
2966         * the association and should be available to us
2967         */
2968        sta = sta_info_get(sdata, cbss->bssid);
2969        if (WARN_ON(!sta)) {
2970                mutex_unlock(&sdata->local->sta_mtx);
2971                ret = false;
2972                goto out;
2973        }
2974
2975        sband = local->hw.wiphy->bands[ieee80211_get_sdata_band(sdata)];
2976
2977        /* Set up internal HT/VHT capabilities */
2978        if (elems.ht_cap_elem && !(ifmgd->flags & IEEE80211_STA_DISABLE_HT))
2979                ieee80211_ht_cap_ie_to_sta_ht_cap(sdata, sband,
2980                                                  elems.ht_cap_elem, sta);
2981
2982        if (elems.vht_cap_elem && !(ifmgd->flags & IEEE80211_STA_DISABLE_VHT))
2983                ieee80211_vht_cap_ie_to_sta_vht_cap(sdata, sband,
2984                                                    elems.vht_cap_elem, sta);
2985
2986        /*
2987         * Some APs, e.g. Netgear WNDR3700, report invalid HT operation data
2988         * in their association response, so ignore that data for our own
2989         * configuration. If it changed since the last beacon, we'll get the
2990         * next beacon and update then.
2991         */
2992
2993        /*
2994         * If an operating mode notification IE is present, override the
2995         * NSS calculation (that would be done in rate_control_rate_init())
2996         * and use the # of streams from that element.
2997         */
2998        if (elems.opmode_notif &&
2999            !(*elems.opmode_notif & IEEE80211_OPMODE_NOTIF_RX_NSS_TYPE_BF)) {
3000                u8 nss;
3001
3002                nss = *elems.opmode_notif & IEEE80211_OPMODE_NOTIF_RX_NSS_MASK;
3003                nss >>= IEEE80211_OPMODE_NOTIF_RX_NSS_SHIFT;
3004                nss += 1;
3005                sta->sta.rx_nss = nss;
3006        }
3007
3008        rate_control_rate_init(sta);
3009
3010        if (ifmgd->flags & IEEE80211_STA_MFP_ENABLED) {
3011                set_sta_flag(sta, WLAN_STA_MFP);
3012                sta->sta.mfp = true;
3013        } else {
3014                sta->sta.mfp = false;
3015        }
3016
3017        sta->sta.wme = elems.wmm_param && local->hw.queues >= IEEE80211_NUM_ACS;
3018
3019        err = sta_info_move_state(sta, IEEE80211_STA_ASSOC);
3020        if (!err && !(ifmgd->flags & IEEE80211_STA_CONTROL_PORT))
3021                err = sta_info_move_state(sta, IEEE80211_STA_AUTHORIZED);
3022        if (err) {
3023                sdata_info(sdata,
3024                           "failed to move station %pM to desired state\n",
3025                           sta->sta.addr);
3026                WARN_ON(__sta_info_destroy(sta));
3027                mutex_unlock(&sdata->local->sta_mtx);
3028                ret = false;
3029                goto out;
3030        }
3031
3032        mutex_unlock(&sdata->local->sta_mtx);
3033
3034        /*
3035         * Always handle WMM once after association regardless
3036         * of the first value the AP uses. Setting -1 here has
3037         * that effect because the AP values is an unsigned
3038         * 4-bit value.
3039         */
3040        ifmgd->wmm_last_param_set = -1;
3041
3042        if (ifmgd->flags & IEEE80211_STA_DISABLE_WMM) {
3043                ieee80211_set_wmm_default(sdata, false, false);
3044        } else if (!ieee80211_sta_wmm_params(local, sdata, elems.wmm_param,
3045                                             elems.wmm_param_len)) {
3046                /* still enable QoS since we might have HT/VHT */
3047                ieee80211_set_wmm_default(sdata, false, true);
3048                /* set the disable-WMM flag in this case to disable
3049                 * tracking WMM parameter changes in the beacon if
3050                 * the parameters weren't actually valid. Doing so
3051                 * avoids changing parameters very strangely when
3052                 * the AP is going back and forth between valid and
3053                 * invalid parameters.
3054                 */
3055                ifmgd->flags |= IEEE80211_STA_DISABLE_WMM;
3056        }
3057        changed |= BSS_CHANGED_QOS;
3058
3059        /* set AID and assoc capability,
3060         * ieee80211_set_associated() will tell the driver */
3061        bss_conf->aid = aid;
3062        bss_conf->assoc_capability = capab_info;
3063        ieee80211_set_associated(sdata, cbss, changed);
3064
3065        /*
3066         * If we're using 4-addr mode, let the AP know that we're
3067         * doing so, so that it can create the STA VLAN on its side
3068         */
3069        if (ifmgd->use_4addr)
3070                ieee80211_send_4addr_nullfunc(local, sdata);
3071
3072        /*
3073         * Start timer to probe the connection to the AP now.
3074         * Also start the timer that will detect beacon loss.
3075         */
3076        ieee80211_sta_rx_notify(sdata, (struct ieee80211_hdr *)mgmt);
3077        ieee80211_sta_reset_beacon_monitor(sdata);
3078
3079        ret = true;
3080 out:
3081        kfree(bss_ies);
3082        return ret;
3083}
3084
3085static void ieee80211_rx_mgmt_assoc_resp(struct ieee80211_sub_if_data *sdata,
3086                                         struct ieee80211_mgmt *mgmt,
3087                                         size_t len)
3088{
3089        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
3090        struct ieee80211_mgd_assoc_data *assoc_data = ifmgd->assoc_data;
3091        u16 capab_info, status_code, aid;
3092        struct ieee802_11_elems elems;
3093        int ac, uapsd_queues = -1;
3094        u8 *pos;
3095        bool reassoc;
3096        struct cfg80211_bss *bss;
3097        struct ieee80211_event event = {
3098                .type = MLME_EVENT,
3099                .u.mlme.data = ASSOC_EVENT,
3100        };
3101
3102        sdata_assert_lock(sdata);
3103
3104        if (!assoc_data)
3105                return;
3106        if (!ether_addr_equal(assoc_data->bss->bssid, mgmt->bssid))
3107                return;
3108
3109        /*
3110         * AssocResp and ReassocResp have identical structure, so process both
3111         * of them in this function.
3112         */
3113
3114        if (len < 24 + 6)
3115                return;
3116
3117        reassoc = ieee80211_is_reassoc_req(mgmt->frame_control);
3118        capab_info = le16_to_cpu(mgmt->u.assoc_resp.capab_info);
3119        status_code = le16_to_cpu(mgmt->u.assoc_resp.status_code);
3120        aid = le16_to_cpu(mgmt->u.assoc_resp.aid);
3121
3122        sdata_info(sdata,
3123                   "RX %sssocResp from %pM (capab=0x%x status=%d aid=%d)\n",
3124                   reassoc ? "Rea" : "A", mgmt->sa,
3125                   capab_info, status_code, (u16)(aid & ~(BIT(15) | BIT(14))));
3126
3127        pos = mgmt->u.assoc_resp.variable;
3128        ieee802_11_parse_elems(pos, len - (pos - (u8 *) mgmt), false, &elems);
3129
3130        if (status_code == WLAN_STATUS_ASSOC_REJECTED_TEMPORARILY &&
3131            elems.timeout_int &&
3132            elems.timeout_int->type == WLAN_TIMEOUT_ASSOC_COMEBACK) {
3133                u32 tu, ms;
3134                tu = le32_to_cpu(elems.timeout_int->value);
3135                ms = tu * 1024 / 1000;
3136                sdata_info(sdata,
3137                           "%pM rejected association temporarily; comeback duration %u TU (%u ms)\n",
3138                           mgmt->sa, tu, ms);
3139                assoc_data->timeout = jiffies + msecs_to_jiffies(ms);
3140                assoc_data->timeout_started = true;
3141                if (ms > IEEE80211_ASSOC_TIMEOUT)
3142                        run_again(sdata, assoc_data->timeout);
3143                return;
3144        }
3145
3146        bss = assoc_data->bss;
3147
3148        if (status_code != WLAN_STATUS_SUCCESS) {
3149                sdata_info(sdata, "%pM denied association (code=%d)\n",
3150                           mgmt->sa, status_code);
3151                ieee80211_destroy_assoc_data(sdata, false);
3152                event.u.mlme.status = MLME_DENIED;
3153                event.u.mlme.reason = status_code;
3154                drv_event_callback(sdata->local, sdata, &event);
3155        } else {
3156                if (!ieee80211_assoc_success(sdata, bss, mgmt, len)) {
3157                        /* oops -- internal error -- send timeout for now */
3158                        ieee80211_destroy_assoc_data(sdata, false);
3159                        cfg80211_assoc_timeout(sdata->dev, bss);
3160                        return;
3161                }
3162                event.u.mlme.status = MLME_SUCCESS;
3163                drv_event_callback(sdata->local, sdata, &event);
3164                sdata_info(sdata, "associated\n");
3165
3166                /*
3167                 * destroy assoc_data afterwards, as otherwise an idle
3168                 * recalc after assoc_data is NULL but before associated
3169                 * is set can cause the interface to go idle
3170                 */
3171                ieee80211_destroy_assoc_data(sdata, true);
3172
3173                /* get uapsd queues configuration */
3174                uapsd_queues = 0;
3175                for (ac = 0; ac < IEEE80211_NUM_ACS; ac++)
3176                        if (sdata->tx_conf[ac].uapsd)
3177                                uapsd_queues |= BIT(ac);
3178        }
3179
3180        cfg80211_rx_assoc_resp(sdata->dev, bss, (u8 *)mgmt, len, uapsd_queues);
3181}
3182
3183static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata,
3184                                  struct ieee80211_mgmt *mgmt, size_t len,
3185                                  struct ieee80211_rx_status *rx_status,
3186                                  struct ieee802_11_elems *elems)
3187{
3188        struct ieee80211_local *local = sdata->local;
3189        struct ieee80211_bss *bss;
3190        struct ieee80211_channel *channel;
3191
3192        sdata_assert_lock(sdata);
3193
3194        channel = ieee80211_get_channel(local->hw.wiphy, rx_status->freq);
3195        if (!channel)
3196                return;
3197
3198        bss = ieee80211_bss_info_update(local, rx_status, mgmt, len, elems,
3199                                        channel);
3200        if (bss) {
3201                sdata->vif.bss_conf.beacon_rate = bss->beacon_rate;
3202                ieee80211_rx_bss_put(local, bss);
3203        }
3204}
3205
3206
3207static void ieee80211_rx_mgmt_probe_resp(struct ieee80211_sub_if_data *sdata,
3208                                         struct sk_buff *skb)
3209{
3210        struct ieee80211_mgmt *mgmt = (void *)skb->data;
3211        struct ieee80211_if_managed *ifmgd;
3212        struct ieee80211_rx_status *rx_status = (void *) skb->cb;
3213        size_t baselen, len = skb->len;
3214        struct ieee802_11_elems elems;
3215
3216        ifmgd = &sdata->u.mgd;
3217
3218        sdata_assert_lock(sdata);
3219
3220        if (!ether_addr_equal(mgmt->da, sdata->vif.addr))
3221                return; /* ignore ProbeResp to foreign address */
3222
3223        baselen = (u8 *) mgmt->u.probe_resp.variable - (u8 *) mgmt;
3224        if (baselen > len)
3225                return;
3226
3227        ieee802_11_parse_elems(mgmt->u.probe_resp.variable, len - baselen,
3228                               false, &elems);
3229
3230        ieee80211_rx_bss_info(sdata, mgmt, len, rx_status, &elems);
3231
3232        if (ifmgd->associated &&
3233            ether_addr_equal(mgmt->bssid, ifmgd->associated->bssid))
3234                ieee80211_reset_ap_probe(sdata);
3235}
3236
3237/*
3238 * This is the canonical list of information elements we care about,
3239 * the filter code also gives us all changes to the Microsoft OUI
3240 * (00:50:F2) vendor IE which is used for WMM which we need to track,
3241 * as well as the DTPC IE (part of the Cisco OUI) used for signaling
3242 * changes to requested client power.
3243 *
3244 * We implement beacon filtering in software since that means we can
3245 * avoid processing the frame here and in cfg80211, and userspace
3246 * will not be able to tell whether the hardware supports it or not.
3247 *
3248 * XXX: This list needs to be dynamic -- userspace needs to be able to
3249 *      add items it requires. It also needs to be able to tell us to
3250 *      look out for other vendor IEs.
3251 */
3252static const u64 care_about_ies =
3253        (1ULL << WLAN_EID_COUNTRY) |
3254        (1ULL << WLAN_EID_ERP_INFO) |
3255        (1ULL << WLAN_EID_CHANNEL_SWITCH) |
3256        (1ULL << WLAN_EID_PWR_CONSTRAINT) |
3257        (1ULL << WLAN_EID_HT_CAPABILITY) |
3258        (1ULL << WLAN_EID_HT_OPERATION) |
3259        (1ULL << WLAN_EID_EXT_CHANSWITCH_ANN);
3260
3261static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata,
3262                                     struct ieee80211_mgmt *mgmt, size_t len,
3263                                     struct ieee80211_rx_status *rx_status)
3264{
3265        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
3266        struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf;
3267        size_t baselen;
3268        struct ieee802_11_elems elems;
3269        struct ieee80211_local *local = sdata->local;
3270        struct ieee80211_chanctx_conf *chanctx_conf;
3271        struct ieee80211_channel *chan;
3272        struct sta_info *sta;
3273        u32 changed = 0;
3274        bool erp_valid;
3275        u8 erp_value = 0;
3276        u32 ncrc;
3277        u8 *bssid;
3278        u8 deauth_buf[IEEE80211_DEAUTH_FRAME_LEN];
3279
3280        sdata_assert_lock(sdata);
3281
3282        /* Process beacon from the current BSS */
3283        baselen = (u8 *) mgmt->u.beacon.variable - (u8 *) mgmt;
3284        if (baselen > len)
3285                return;
3286
3287        rcu_read_lock();
3288        chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
3289        if (!chanctx_conf) {
3290                rcu_read_unlock();
3291                return;
3292        }
3293
3294        if (rx_status->freq != chanctx_conf->def.chan->center_freq) {
3295                rcu_read_unlock();
3296                return;
3297        }
3298        chan = chanctx_conf->def.chan;
3299        rcu_read_unlock();
3300
3301        if (ifmgd->assoc_data && ifmgd->assoc_data->need_beacon &&
3302            ether_addr_equal(mgmt->bssid, ifmgd->assoc_data->bss->bssid)) {
3303                ieee802_11_parse_elems(mgmt->u.beacon.variable,
3304                                       len - baselen, false, &elems);
3305
3306                ieee80211_rx_bss_info(sdata, mgmt, len, rx_status, &elems);
3307                if (elems.tim && !elems.parse_error) {
3308                        const struct ieee80211_tim_ie *tim_ie = elems.tim;
3309                        ifmgd->dtim_period = tim_ie->dtim_period;
3310                }
3311                ifmgd->have_beacon = true;
3312                ifmgd->assoc_data->need_beacon = false;
3313                if (ieee80211_hw_check(&local->hw, TIMING_BEACON_ONLY)) {
3314                        sdata->vif.bss_conf.sync_tsf =
3315                                le64_to_cpu(mgmt->u.beacon.timestamp);
3316                        sdata->vif.bss_conf.sync_device_ts =
3317                                rx_status->device_timestamp;
3318                        if (elems.tim)
3319                                sdata->vif.bss_conf.sync_dtim_count =
3320                                        elems.tim->dtim_count;
3321                        else
3322                                sdata->vif.bss_conf.sync_dtim_count = 0;
3323                }
3324                /* continue assoc process */
3325                ifmgd->assoc_data->timeout = jiffies;
3326                ifmgd->assoc_data->timeout_started = true;
3327                run_again(sdata, ifmgd->assoc_data->timeout);
3328                return;
3329        }
3330
3331        if (!ifmgd->associated ||
3332            !ether_addr_equal(mgmt->bssid, ifmgd->associated->bssid))
3333                return;
3334        bssid = ifmgd->associated->bssid;
3335
3336        /* Track average RSSI from the Beacon frames of the current AP */
3337        if (ifmgd->flags & IEEE80211_STA_RESET_SIGNAL_AVE) {
3338                ifmgd->flags &= ~IEEE80211_STA_RESET_SIGNAL_AVE;
3339                ewma_beacon_signal_init(&ifmgd->ave_beacon_signal);
3340                ifmgd->last_cqm_event_signal = 0;
3341                ifmgd->count_beacon_signal = 1;
3342                ifmgd->last_ave_beacon_signal = 0;
3343        } else {
3344                ifmgd->count_beacon_signal++;
3345        }
3346
3347        ewma_beacon_signal_add(&ifmgd->ave_beacon_signal, -rx_status->signal);
3348
3349        if (ifmgd->rssi_min_thold != ifmgd->rssi_max_thold &&
3350            ifmgd->count_beacon_signal >= IEEE80211_SIGNAL_AVE_MIN_COUNT) {
3351                int sig = -ewma_beacon_signal_read(&ifmgd->ave_beacon_signal);
3352                int last_sig = ifmgd->last_ave_beacon_signal;
3353                struct ieee80211_event event = {
3354                        .type = RSSI_EVENT,
3355                };
3356
3357                /*
3358                 * if signal crosses either of the boundaries, invoke callback
3359                 * with appropriate parameters
3360                 */
3361                if (sig > ifmgd->rssi_max_thold &&
3362                    (last_sig <= ifmgd->rssi_min_thold || last_sig == 0)) {
3363                        ifmgd->last_ave_beacon_signal = sig;
3364                        event.u.rssi.data = RSSI_EVENT_HIGH;
3365                        drv_event_callback(local, sdata, &event);
3366                } else if (sig < ifmgd->rssi_min_thold &&
3367                           (last_sig >= ifmgd->rssi_max_thold ||
3368                           last_sig == 0)) {
3369                        ifmgd->last_ave_beacon_signal = sig;
3370                        event.u.rssi.data = RSSI_EVENT_LOW;
3371                        drv_event_callback(local, sdata, &event);
3372                }
3373        }
3374
3375        if (bss_conf->cqm_rssi_thold &&
3376            ifmgd->count_beacon_signal >= IEEE80211_SIGNAL_AVE_MIN_COUNT &&
3377            !(sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_CQM_RSSI)) {
3378                int sig = -ewma_beacon_signal_read(&ifmgd->ave_beacon_signal);
3379                int last_event = ifmgd->last_cqm_event_signal;
3380                int thold = bss_conf->cqm_rssi_thold;
3381                int hyst = bss_conf->cqm_rssi_hyst;
3382
3383                if (sig < thold &&
3384                    (last_event == 0 || sig < last_event - hyst)) {
3385                        ifmgd->last_cqm_event_signal = sig;
3386                        ieee80211_cqm_rssi_notify(
3387                                &sdata->vif,
3388                                NL80211_CQM_RSSI_THRESHOLD_EVENT_LOW,
3389                                GFP_KERNEL);
3390                } else if (sig > thold &&
3391                           (last_event == 0 || sig > last_event + hyst)) {
3392                        ifmgd->last_cqm_event_signal = sig;
3393                        ieee80211_cqm_rssi_notify(
3394                                &sdata->vif,
3395                                NL80211_CQM_RSSI_THRESHOLD_EVENT_HIGH,
3396                                GFP_KERNEL);
3397                }
3398        }
3399
3400        if (ifmgd->flags & IEEE80211_STA_CONNECTION_POLL) {
3401                mlme_dbg_ratelimited(sdata,
3402                                     "cancelling AP probe due to a received beacon\n");
3403                ieee80211_reset_ap_probe(sdata);
3404        }
3405
3406        /*
3407         * Push the beacon loss detection into the future since
3408         * we are processing a beacon from the AP just now.
3409         */
3410        ieee80211_sta_reset_beacon_monitor(sdata);
3411
3412        ncrc = crc32_be(0, (void *)&mgmt->u.beacon.beacon_int, 4);
3413        ncrc = ieee802_11_parse_elems_crc(mgmt->u.beacon.variable,
3414                                          len - baselen, false, &elems,
3415                                          care_about_ies, ncrc);
3416
3417        if (ieee80211_hw_check(&local->hw, PS_NULLFUNC_STACK) &&
3418            ieee80211_check_tim(elems.tim, elems.tim_len, ifmgd->aid)) {
3419                if (local->hw.conf.dynamic_ps_timeout > 0) {
3420                        if (local->hw.conf.flags & IEEE80211_CONF_PS) {
3421                                local->hw.conf.flags &= ~IEEE80211_CONF_PS;
3422                                ieee80211_hw_config(local,
3423                                                    IEEE80211_CONF_CHANGE_PS);
3424                        }
3425                        ieee80211_send_nullfunc(local, sdata, false);
3426                } else if (!local->pspolling && sdata->u.mgd.powersave) {
3427                        local->pspolling = true;
3428
3429                        /*
3430                         * Here is assumed that the driver will be
3431                         * able to send ps-poll frame and receive a
3432                         * response even though power save mode is
3433                         * enabled, but some drivers might require
3434                         * to disable power save here. This needs
3435                         * to be investigated.
3436                         */
3437                        ieee80211_send_pspoll(local, sdata);
3438                }
3439        }
3440
3441        if (sdata->vif.p2p ||
3442            sdata->vif.driver_flags & IEEE80211_VIF_GET_NOA_UPDATE) {
3443                struct ieee80211_p2p_noa_attr noa = {};
3444                int ret;
3445
3446                ret = cfg80211_get_p2p_attr(mgmt->u.beacon.variable,
3447                                            len - baselen,
3448                                            IEEE80211_P2P_ATTR_ABSENCE_NOTICE,
3449                                            (u8 *) &noa, sizeof(noa));
3450                if (ret >= 2) {
3451                        if (sdata->u.mgd.p2p_noa_index != noa.index) {
3452                                /* valid noa_attr and index changed */
3453                                sdata->u.mgd.p2p_noa_index = noa.index;
3454                                memcpy(&bss_conf->p2p_noa_attr, &noa, sizeof(noa));
3455                                changed |= BSS_CHANGED_P2P_PS;
3456                                /*
3457                                 * make sure we update all information, the CRC
3458                                 * mechanism doesn't look at P2P attributes.
3459                                 */
3460                                ifmgd->beacon_crc_valid = false;
3461                        }
3462                } else if (sdata->u.mgd.p2p_noa_index != -1) {
3463                        /* noa_attr not found and we had valid noa_attr before */
3464                        sdata->u.mgd.p2p_noa_index = -1;
3465                        memset(&bss_conf->p2p_noa_attr, 0, sizeof(bss_conf->p2p_noa_attr));
3466                        changed |= BSS_CHANGED_P2P_PS;
3467                        ifmgd->beacon_crc_valid = false;
3468                }
3469        }
3470
3471        if (ifmgd->csa_waiting_bcn)
3472                ieee80211_chswitch_post_beacon(sdata);
3473
3474        /*
3475         * Update beacon timing and dtim count on every beacon appearance. This
3476         * will allow the driver to use the most updated values. Do it before
3477         * comparing this one with last received beacon.
3478         * IMPORTANT: These parameters would possibly be out of sync by the time
3479         * the driver will use them. The synchronized view is currently
3480         * guaranteed only in certain callbacks.
3481         */
3482        if (ieee80211_hw_check(&local->hw, TIMING_BEACON_ONLY)) {
3483                sdata->vif.bss_conf.sync_tsf =
3484                        le64_to_cpu(mgmt->u.beacon.timestamp);
3485                sdata->vif.bss_conf.sync_device_ts =
3486                        rx_status->device_timestamp;
3487                if (elems.tim)
3488                        sdata->vif.bss_conf.sync_dtim_count =
3489                                elems.tim->dtim_count;
3490                else
3491                        sdata->vif.bss_conf.sync_dtim_count = 0;
3492        }
3493
3494        if (ncrc == ifmgd->beacon_crc && ifmgd->beacon_crc_valid)
3495                return;
3496        ifmgd->beacon_crc = ncrc;
3497        ifmgd->beacon_crc_valid = true;
3498
3499        ieee80211_rx_bss_info(sdata, mgmt, len, rx_status, &elems);
3500
3501        ieee80211_sta_process_chanswitch(sdata, rx_status->mactime,
3502                                         rx_status->device_timestamp,
3503                                         &elems, true);
3504
3505        if (!(ifmgd->flags & IEEE80211_STA_DISABLE_WMM) &&
3506            ieee80211_sta_wmm_params(local, sdata, elems.wmm_param,
3507                                     elems.wmm_param_len))
3508                changed |= BSS_CHANGED_QOS;
3509
3510        /*
3511         * If we haven't had a beacon before, tell the driver about the
3512         * DTIM period (and beacon timing if desired) now.
3513         */
3514        if (!ifmgd->have_beacon) {
3515                /* a few bogus AP send dtim_period = 0 or no TIM IE */
3516                if (elems.tim)
3517                        bss_conf->dtim_period = elems.tim->dtim_period ?: 1;
3518                else
3519                        bss_conf->dtim_period = 1;
3520
3521                changed |= BSS_CHANGED_BEACON_INFO;
3522                ifmgd->have_beacon = true;
3523
3524                mutex_lock(&local->iflist_mtx);
3525                ieee80211_recalc_ps(local);
3526                mutex_unlock(&local->iflist_mtx);
3527
3528                ieee80211_recalc_ps_vif(sdata);
3529        }
3530
3531        if (elems.erp_info) {
3532                erp_valid = true;
3533                erp_value = elems.erp_info[0];
3534        } else {
3535                erp_valid = false;
3536        }
3537        changed |= ieee80211_handle_bss_capability(sdata,
3538                        le16_to_cpu(mgmt->u.beacon.capab_info),
3539                        erp_valid, erp_value);
3540
3541        mutex_lock(&local->sta_mtx);
3542        sta = sta_info_get(sdata, bssid);
3543
3544        if (ieee80211_config_bw(sdata, sta,
3545                                elems.ht_cap_elem, elems.ht_operation,
3546                                elems.vht_operation, bssid, &changed)) {
3547                mutex_unlock(&local->sta_mtx);
3548                sdata_info(sdata,
3549                           "failed to follow AP %pM bandwidth change, disconnect\n",
3550                           bssid);
3551                ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH,
3552                                       WLAN_REASON_DEAUTH_LEAVING,
3553                                       true, deauth_buf);
3554                ieee80211_report_disconnect(sdata, deauth_buf,
3555                                            sizeof(deauth_buf), true,
3556                                            WLAN_REASON_DEAUTH_LEAVING);
3557                return;
3558        }
3559
3560        if (sta && elems.opmode_notif)
3561                ieee80211_vht_handle_opmode(sdata, sta, *elems.opmode_notif,
3562                                            rx_status->band);
3563        mutex_unlock(&local->sta_mtx);
3564
3565        changed |= ieee80211_handle_pwr_constr(sdata, chan, mgmt,
3566                                               elems.country_elem,
3567                                               elems.country_elem_len,
3568                                               elems.pwr_constr_elem,
3569                                               elems.cisco_dtpc_elem);
3570
3571        ieee80211_bss_info_change_notify(sdata, changed);
3572}
3573
3574void ieee80211_sta_rx_queued_mgmt(struct ieee80211_sub_if_data *sdata,
3575                                  struct sk_buff *skb)
3576{
3577        struct ieee80211_rx_status *rx_status;
3578        struct ieee80211_mgmt *mgmt;
3579        u16 fc;
3580        struct ieee802_11_elems elems;
3581        int ies_len;
3582
3583        rx_status = (struct ieee80211_rx_status *) skb->cb;
3584        mgmt = (struct ieee80211_mgmt *) skb->data;
3585        fc = le16_to_cpu(mgmt->frame_control);
3586
3587        sdata_lock(sdata);
3588
3589        switch (fc & IEEE80211_FCTL_STYPE) {
3590        case IEEE80211_STYPE_BEACON:
3591                ieee80211_rx_mgmt_beacon(sdata, mgmt, skb->len, rx_status);
3592                break;
3593        case IEEE80211_STYPE_PROBE_RESP:
3594                ieee80211_rx_mgmt_probe_resp(sdata, skb);
3595                break;
3596        case IEEE80211_STYPE_AUTH:
3597                ieee80211_rx_mgmt_auth(sdata, mgmt, skb->len);
3598                break;
3599        case IEEE80211_STYPE_DEAUTH:
3600                ieee80211_rx_mgmt_deauth(sdata, mgmt, skb->len);
3601                break;
3602        case IEEE80211_STYPE_DISASSOC:
3603                ieee80211_rx_mgmt_disassoc(sdata, mgmt, skb->len);
3604                break;
3605        case IEEE80211_STYPE_ASSOC_RESP:
3606        case IEEE80211_STYPE_REASSOC_RESP:
3607                ieee80211_rx_mgmt_assoc_resp(sdata, mgmt, skb->len);
3608                break;
3609        case IEEE80211_STYPE_ACTION:
3610                if (mgmt->u.action.category == WLAN_CATEGORY_SPECTRUM_MGMT) {
3611                        ies_len = skb->len -
3612                                  offsetof(struct ieee80211_mgmt,
3613                                           u.action.u.chan_switch.variable);
3614
3615                        if (ies_len < 0)
3616                                break;
3617
3618                        ieee802_11_parse_elems(
3619                                mgmt->u.action.u.chan_switch.variable,
3620                                ies_len, true, &elems);
3621
3622                        if (elems.parse_error)
3623                                break;
3624
3625                        ieee80211_sta_process_chanswitch(sdata,
3626                                                 rx_status->mactime,
3627                                                 rx_status->device_timestamp,
3628                                                 &elems, false);
3629                } else if (mgmt->u.action.category == WLAN_CATEGORY_PUBLIC) {
3630                        ies_len = skb->len -
3631                                  offsetof(struct ieee80211_mgmt,
3632                                           u.action.u.ext_chan_switch.variable);
3633
3634                        if (ies_len < 0)
3635                                break;
3636
3637                        ieee802_11_parse_elems(
3638                                mgmt->u.action.u.ext_chan_switch.variable,
3639                                ies_len, true, &elems);
3640
3641                        if (elems.parse_error)
3642                                break;
3643
3644                        /* for the handling code pretend this was also an IE */
3645                        elems.ext_chansw_ie =
3646                                &mgmt->u.action.u.ext_chan_switch.data;
3647
3648                        ieee80211_sta_process_chanswitch(sdata,
3649                                                 rx_status->mactime,
3650                                                 rx_status->device_timestamp,
3651                                                 &elems, false);
3652                }
3653                break;
3654        }
3655        sdata_unlock(sdata);
3656}
3657
3658static void ieee80211_sta_timer(unsigned long data)
3659{
3660        struct ieee80211_sub_if_data *sdata =
3661                (struct ieee80211_sub_if_data *) data;
3662
3663        ieee80211_queue_work(&sdata->local->hw, &sdata->work);
3664}
3665
3666static void ieee80211_sta_connection_lost(struct ieee80211_sub_if_data *sdata,
3667                                          u8 *bssid, u8 reason, bool tx)
3668{
3669        u8 frame_buf[IEEE80211_DEAUTH_FRAME_LEN];
3670
3671        ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH, reason,
3672                               tx, frame_buf);
3673
3674        ieee80211_report_disconnect(sdata, frame_buf, sizeof(frame_buf), true,
3675                                    reason);
3676}
3677
3678static int ieee80211_auth(struct ieee80211_sub_if_data *sdata)
3679{
3680        struct ieee80211_local *local = sdata->local;
3681        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
3682        struct ieee80211_mgd_auth_data *auth_data = ifmgd->auth_data;
3683        u32 tx_flags = 0;
3684        u16 trans = 1;
3685        u16 status = 0;
3686
3687        sdata_assert_lock(sdata);
3688
3689        if (WARN_ON_ONCE(!auth_data))
3690                return -EINVAL;
3691
3692        auth_data->tries++;
3693
3694        if (auth_data->tries > IEEE80211_AUTH_MAX_TRIES) {
3695                sdata_info(sdata, "authentication with %pM timed out\n",
3696                           auth_data->bss->bssid);
3697
3698                /*
3699                 * Most likely AP is not in the range so remove the
3700                 * bss struct for that AP.
3701                 */
3702                cfg80211_unlink_bss(local->hw.wiphy, auth_data->bss);
3703
3704                return -ETIMEDOUT;
3705        }
3706
3707        drv_mgd_prepare_tx(local, sdata);
3708
3709        sdata_info(sdata, "send auth to %pM (try %d/%d)\n",
3710                   auth_data->bss->bssid, auth_data->tries,
3711                   IEEE80211_AUTH_MAX_TRIES);
3712
3713        auth_data->expected_transaction = 2;
3714
3715        if (auth_data->algorithm == WLAN_AUTH_SAE) {
3716                trans = auth_data->sae_trans;
3717                status = auth_data->sae_status;
3718                auth_data->expected_transaction = trans;
3719        }
3720
3721        if (ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS))
3722                tx_flags = IEEE80211_TX_CTL_REQ_TX_STATUS |
3723                           IEEE80211_TX_INTFL_MLME_CONN_TX;
3724
3725        ieee80211_send_auth(sdata, trans, auth_data->algorithm, status,
3726                            auth_data->data, auth_data->data_len,
3727                            auth_data->bss->bssid,
3728                            auth_data->bss->bssid, NULL, 0, 0,
3729                            tx_flags);
3730
3731        if (tx_flags == 0) {
3732                auth_data->timeout = jiffies + IEEE80211_AUTH_TIMEOUT;
3733                auth_data->timeout_started = true;
3734                run_again(sdata, auth_data->timeout);
3735        } else {
3736                auth_data->timeout =
3737                        round_jiffies_up(jiffies + IEEE80211_AUTH_TIMEOUT_LONG);
3738                auth_data->timeout_started = true;
3739                run_again(sdata, auth_data->timeout);
3740        }
3741
3742        return 0;
3743}
3744
3745static int ieee80211_do_assoc(struct ieee80211_sub_if_data *sdata)
3746{
3747        struct ieee80211_mgd_assoc_data *assoc_data = sdata->u.mgd.assoc_data;
3748        struct ieee80211_local *local = sdata->local;
3749
3750        sdata_assert_lock(sdata);
3751
3752        assoc_data->tries++;
3753        if (assoc_data->tries > IEEE80211_ASSOC_MAX_TRIES) {
3754                sdata_info(sdata, "association with %pM timed out\n",
3755                           assoc_data->bss->bssid);
3756
3757                /*
3758                 * Most likely AP is not in the range so remove the
3759                 * bss struct for that AP.
3760                 */
3761                cfg80211_unlink_bss(local->hw.wiphy, assoc_data->bss);
3762
3763                return -ETIMEDOUT;
3764        }
3765
3766        sdata_info(sdata, "associate with %pM (try %d/%d)\n",
3767                   assoc_data->bss->bssid, assoc_data->tries,
3768                   IEEE80211_ASSOC_MAX_TRIES);
3769        ieee80211_send_assoc(sdata);
3770
3771        if (!ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS)) {
3772                assoc_data->timeout = jiffies + IEEE80211_ASSOC_TIMEOUT;
3773                assoc_data->timeout_started = true;
3774                run_again(sdata, assoc_data->timeout);
3775        } else {
3776                assoc_data->timeout =
3777                        round_jiffies_up(jiffies +
3778                                         IEEE80211_ASSOC_TIMEOUT_LONG);
3779                assoc_data->timeout_started = true;
3780                run_again(sdata, assoc_data->timeout);
3781        }
3782
3783        return 0;
3784}
3785
3786void ieee80211_mgd_conn_tx_status(struct ieee80211_sub_if_data *sdata,
3787                                  __le16 fc, bool acked)
3788{
3789        struct ieee80211_local *local = sdata->local;
3790
3791        sdata->u.mgd.status_fc = fc;
3792        sdata->u.mgd.status_acked = acked;
3793        sdata->u.mgd.status_received = true;
3794
3795        ieee80211_queue_work(&local->hw, &sdata->work);
3796}
3797
3798void ieee80211_sta_work(struct ieee80211_sub_if_data *sdata)
3799{
3800        struct ieee80211_local *local = sdata->local;
3801        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
3802
3803        sdata_lock(sdata);
3804
3805        if (ifmgd->status_received) {
3806                __le16 fc = ifmgd->status_fc;
3807                bool status_acked = ifmgd->status_acked;
3808
3809                ifmgd->status_received = false;
3810                if (ifmgd->auth_data && ieee80211_is_auth(fc)) {
3811                        if (status_acked) {
3812                                ifmgd->auth_data->timeout =
3813                                        jiffies + IEEE80211_AUTH_TIMEOUT_SHORT;
3814                                run_again(sdata, ifmgd->auth_data->timeout);
3815                        } else {
3816                                ifmgd->auth_data->timeout = jiffies - 1;
3817                        }
3818                        ifmgd->auth_data->timeout_started = true;
3819                } else if (ifmgd->assoc_data &&
3820                           (ieee80211_is_assoc_req(fc) ||
3821                            ieee80211_is_reassoc_req(fc))) {
3822                        if (status_acked) {
3823                                ifmgd->assoc_data->timeout =
3824                                        jiffies + IEEE80211_ASSOC_TIMEOUT_SHORT;
3825                                run_again(sdata, ifmgd->assoc_data->timeout);
3826                        } else {
3827                                ifmgd->assoc_data->timeout = jiffies - 1;
3828                        }
3829                        ifmgd->assoc_data->timeout_started = true;
3830                }
3831        }
3832
3833        if (ifmgd->auth_data && ifmgd->auth_data->timeout_started &&
3834            time_after(jiffies, ifmgd->auth_data->timeout)) {
3835                if (ifmgd->auth_data->done) {
3836                        /*
3837                         * ok ... we waited for assoc but userspace didn't,
3838                         * so let's just kill the auth data
3839                         */
3840                        ieee80211_destroy_auth_data(sdata, false);
3841                } else if (ieee80211_auth(sdata)) {
3842                        u8 bssid[ETH_ALEN];
3843                        struct ieee80211_event event = {
3844                                .type = MLME_EVENT,
3845                                .u.mlme.data = AUTH_EVENT,
3846                                .u.mlme.status = MLME_TIMEOUT,
3847                        };
3848
3849                        memcpy(bssid, ifmgd->auth_data->bss->bssid, ETH_ALEN);
3850
3851                        ieee80211_destroy_auth_data(sdata, false);
3852
3853                        cfg80211_auth_timeout(sdata->dev, bssid);
3854                        drv_event_callback(sdata->local, sdata, &event);
3855                }
3856        } else if (ifmgd->auth_data && ifmgd->auth_data->timeout_started)
3857                run_again(sdata, ifmgd->auth_data->timeout);
3858
3859        if (ifmgd->assoc_data && ifmgd->assoc_data->timeout_started &&
3860            time_after(jiffies, ifmgd->assoc_data->timeout)) {
3861                if ((ifmgd->assoc_data->need_beacon && !ifmgd->have_beacon) ||
3862                    ieee80211_do_assoc(sdata)) {
3863                        struct cfg80211_bss *bss = ifmgd->assoc_data->bss;
3864                        struct ieee80211_event event = {
3865                                .type = MLME_EVENT,
3866                                .u.mlme.data = ASSOC_EVENT,
3867                                .u.mlme.status = MLME_TIMEOUT,
3868                        };
3869
3870                        ieee80211_destroy_assoc_data(sdata, false);
3871                        cfg80211_assoc_timeout(sdata->dev, bss);
3872                        drv_event_callback(sdata->local, sdata, &event);
3873                }
3874        } else if (ifmgd->assoc_data && ifmgd->assoc_data->timeout_started)
3875                run_again(sdata, ifmgd->assoc_data->timeout);
3876
3877        if (ifmgd->flags & IEEE80211_STA_CONNECTION_POLL &&
3878            ifmgd->associated) {
3879                u8 bssid[ETH_ALEN];
3880                int max_tries;
3881
3882                memcpy(bssid, ifmgd->associated->bssid, ETH_ALEN);
3883
3884                if (ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS))
3885                        max_tries = max_nullfunc_tries;
3886                else
3887                        max_tries = max_probe_tries;
3888
3889                /* ACK received for nullfunc probing frame */
3890                if (!ifmgd->probe_send_count)
3891                        ieee80211_reset_ap_probe(sdata);
3892                else if (ifmgd->nullfunc_failed) {
3893                        if (ifmgd->probe_send_count < max_tries) {
3894                                mlme_dbg(sdata,
3895                                         "No ack for nullfunc frame to AP %pM, try %d/%i\n",
3896                                         bssid, ifmgd->probe_send_count,
3897                                         max_tries);
3898                                ieee80211_mgd_probe_ap_send(sdata);
3899                        } else {
3900                                mlme_dbg(sdata,
3901                                         "No ack for nullfunc frame to AP %pM, disconnecting.\n",
3902                                         bssid);
3903                                ieee80211_sta_connection_lost(sdata, bssid,
3904                                        WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY,
3905                                        false);
3906                        }
3907                } else if (time_is_after_jiffies(ifmgd->probe_timeout))
3908                        run_again(sdata, ifmgd->probe_timeout);
3909                else if (ieee80211_hw_check(&local->hw, REPORTS_TX_ACK_STATUS)) {
3910                        mlme_dbg(sdata,
3911                                 "Failed to send nullfunc to AP %pM after %dms, disconnecting\n",
3912                                 bssid, probe_wait_ms);
3913                        ieee80211_sta_connection_lost(sdata, bssid,
3914                                WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY, false);
3915                } else if (ifmgd->probe_send_count < max_tries) {
3916                        mlme_dbg(sdata,
3917                                 "No probe response from AP %pM after %dms, try %d/%i\n",
3918                                 bssid, probe_wait_ms,
3919                                 ifmgd->probe_send_count, max_tries);
3920                        ieee80211_mgd_probe_ap_send(sdata);
3921                } else {
3922                        /*
3923                         * We actually lost the connection ... or did we?
3924                         * Let's make sure!
3925                         */
3926                        mlme_dbg(sdata,
3927                                 "No probe response from AP %pM after %dms, disconnecting.\n",
3928                                 bssid, probe_wait_ms);
3929
3930                        ieee80211_sta_connection_lost(sdata, bssid,
3931                                WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY, false);
3932                }
3933        }
3934
3935        sdata_unlock(sdata);
3936}
3937
3938static void ieee80211_sta_bcn_mon_timer(unsigned long data)
3939{
3940        struct ieee80211_sub_if_data *sdata =
3941                (struct ieee80211_sub_if_data *) data;
3942        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
3943
3944        if (sdata->vif.csa_active && !ifmgd->csa_waiting_bcn)
3945                return;
3946
3947        sdata->u.mgd.connection_loss = false;
3948        ieee80211_queue_work(&sdata->local->hw,
3949                             &sdata->u.mgd.beacon_connection_loss_work);
3950}
3951
3952static void ieee80211_sta_conn_mon_timer(unsigned long data)
3953{
3954        struct ieee80211_sub_if_data *sdata =
3955                (struct ieee80211_sub_if_data *) data;
3956        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
3957        struct ieee80211_local *local = sdata->local;
3958
3959        if (sdata->vif.csa_active && !ifmgd->csa_waiting_bcn)
3960                return;
3961
3962        ieee80211_queue_work(&local->hw, &ifmgd->monitor_work);
3963}
3964
3965static void ieee80211_sta_monitor_work(struct work_struct *work)
3966{
3967        struct ieee80211_sub_if_data *sdata =
3968                container_of(work, struct ieee80211_sub_if_data,
3969                             u.mgd.monitor_work);
3970
3971        ieee80211_mgd_probe_ap(sdata, false);
3972}
3973
3974static void ieee80211_restart_sta_timer(struct ieee80211_sub_if_data *sdata)
3975{
3976        if (sdata->vif.type == NL80211_IFTYPE_STATION) {
3977                __ieee80211_stop_poll(sdata);
3978
3979                /* let's probe the connection once */
3980                if (!ieee80211_hw_check(&sdata->local->hw, CONNECTION_MONITOR))
3981                        ieee80211_queue_work(&sdata->local->hw,
3982                                             &sdata->u.mgd.monitor_work);
3983        }
3984}
3985
3986#ifdef CONFIG_PM
3987void ieee80211_mgd_quiesce(struct ieee80211_sub_if_data *sdata)
3988{
3989        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
3990        u8 frame_buf[IEEE80211_DEAUTH_FRAME_LEN];
3991
3992        sdata_lock(sdata);
3993
3994        if (ifmgd->auth_data || ifmgd->assoc_data) {
3995                const u8 *bssid = ifmgd->auth_data ?
3996                                ifmgd->auth_data->bss->bssid :
3997                                ifmgd->assoc_data->bss->bssid;
3998
3999                /*
4000                 * If we are trying to authenticate / associate while suspending,
4001                 * cfg80211 won't know and won't actually abort those attempts,
4002                 * thus we need to do that ourselves.
4003                 */
4004                ieee80211_send_deauth_disassoc(sdata, bssid,
4005                                               IEEE80211_STYPE_DEAUTH,
4006                                               WLAN_REASON_DEAUTH_LEAVING,
4007                                               false, frame_buf);
4008                if (ifmgd->assoc_data)
4009                        ieee80211_destroy_assoc_data(sdata, false);
4010                if (ifmgd->auth_data)
4011                        ieee80211_destroy_auth_data(sdata, false);
4012                cfg80211_tx_mlme_mgmt(sdata->dev, frame_buf,
4013                                      IEEE80211_DEAUTH_FRAME_LEN);
4014        }
4015
4016        /* This is a bit of a hack - we should find a better and more generic
4017         * solution to this. Normally when suspending, cfg80211 will in fact
4018         * deauthenticate. However, it doesn't (and cannot) stop an ongoing
4019         * auth (not so important) or assoc (this is the problem) process.
4020         *
4021         * As a consequence, it can happen that we are in the process of both
4022         * associating and suspending, and receive an association response
4023         * after cfg80211 has checked if it needs to disconnect, but before
4024         * we actually set the flag to drop incoming frames. This will then
4025         * cause the workqueue flush to process the association response in
4026         * the suspend, resulting in a successful association just before it
4027         * tries to remove the interface from the driver, which now though
4028         * has a channel context assigned ... this results in issues.
4029         *
4030         * To work around this (for now) simply deauth here again if we're
4031         * now connected.
4032         */
4033        if (ifmgd->associated && !sdata->local->wowlan) {
4034                u8 bssid[ETH_ALEN];
4035                struct cfg80211_deauth_request req = {
4036                        .reason_code = WLAN_REASON_DEAUTH_LEAVING,
4037                        .bssid = bssid,
4038                };
4039
4040                memcpy(bssid, ifmgd->associated->bssid, ETH_ALEN);
4041                ieee80211_mgd_deauth(sdata, &req);
4042        }
4043
4044        sdata_unlock(sdata);
4045}
4046
4047void ieee80211_sta_restart(struct ieee80211_sub_if_data *sdata)
4048{
4049        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
4050
4051        sdata_lock(sdata);
4052        if (!ifmgd->associated) {
4053                sdata_unlock(sdata);
4054                return;
4055        }
4056
4057        if (sdata->flags & IEEE80211_SDATA_DISCONNECT_RESUME) {
4058                sdata->flags &= ~IEEE80211_SDATA_DISCONNECT_RESUME;
4059                mlme_dbg(sdata, "driver requested disconnect after resume\n");
4060                ieee80211_sta_connection_lost(sdata,
4061                                              ifmgd->associated->bssid,
4062                                              WLAN_REASON_UNSPECIFIED,
4063                                              true);
4064                sdata_unlock(sdata);
4065                return;
4066        }
4067        sdata_unlock(sdata);
4068}
4069#endif
4070
4071/* interface setup */
4072void ieee80211_sta_setup_sdata(struct ieee80211_sub_if_data *sdata)
4073{
4074        struct ieee80211_if_managed *ifmgd;
4075
4076        ifmgd = &sdata->u.mgd;
4077        INIT_WORK(&ifmgd->monitor_work, ieee80211_sta_monitor_work);
4078        INIT_WORK(&ifmgd->chswitch_work, ieee80211_chswitch_work);
4079        INIT_WORK(&ifmgd->beacon_connection_loss_work,
4080                  ieee80211_beacon_connection_loss_work);
4081        INIT_WORK(&ifmgd->csa_connection_drop_work,
4082                  ieee80211_csa_connection_drop_work);
4083        INIT_WORK(&ifmgd->request_smps_work, ieee80211_request_smps_mgd_work);
4084        INIT_DELAYED_WORK(&ifmgd->tdls_peer_del_work,
4085                          ieee80211_tdls_peer_del_work);
4086        setup_timer(&ifmgd->timer, ieee80211_sta_timer,
4087                    (unsigned long) sdata);
4088        setup_timer(&ifmgd->bcn_mon_timer, ieee80211_sta_bcn_mon_timer,
4089                    (unsigned long) sdata);
4090        setup_timer(&ifmgd->conn_mon_timer, ieee80211_sta_conn_mon_timer,
4091                    (unsigned long) sdata);
4092        setup_timer(&ifmgd->chswitch_timer, ieee80211_chswitch_timer,
4093                    (unsigned long) sdata);
4094        INIT_DELAYED_WORK(&ifmgd->tx_tspec_wk,
4095                          ieee80211_sta_handle_tspec_ac_params_wk);
4096
4097        ifmgd->flags = 0;
4098        ifmgd->powersave = sdata->wdev.ps;
4099        ifmgd->uapsd_queues = sdata->local->hw.uapsd_queues;
4100        ifmgd->uapsd_max_sp_len = sdata->local->hw.uapsd_max_sp_len;
4101        ifmgd->p2p_noa_index = -1;
4102
4103        if (sdata->local->hw.wiphy->features & NL80211_FEATURE_DYNAMIC_SMPS)
4104                ifmgd->req_smps = IEEE80211_SMPS_AUTOMATIC;
4105        else
4106                ifmgd->req_smps = IEEE80211_SMPS_OFF;
4107
4108        /* Setup TDLS data */
4109        spin_lock_init(&ifmgd->teardown_lock);
4110        ifmgd->teardown_skb = NULL;
4111        ifmgd->orig_teardown_skb = NULL;
4112}
4113
4114/* scan finished notification */
4115void ieee80211_mlme_notify_scan_completed(struct ieee80211_local *local)
4116{
4117        struct ieee80211_sub_if_data *sdata;
4118
4119        /* Restart STA timers */
4120        rcu_read_lock();
4121        list_for_each_entry_rcu(sdata, &local->interfaces, list) {
4122                if (ieee80211_sdata_running(sdata))
4123                        ieee80211_restart_sta_timer(sdata);
4124        }
4125        rcu_read_unlock();
4126}
4127
4128static u8 ieee80211_ht_vht_rx_chains(struct ieee80211_sub_if_data *sdata,
4129                                     struct cfg80211_bss *cbss)
4130{
4131        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
4132        const u8 *ht_cap_ie, *vht_cap_ie;
4133        const struct ieee80211_ht_cap *ht_cap;
4134        const struct ieee80211_vht_cap *vht_cap;
4135        u8 chains = 1;
4136
4137        if (ifmgd->flags & IEEE80211_STA_DISABLE_HT)
4138                return chains;
4139
4140        ht_cap_ie = ieee80211_bss_get_ie(cbss, WLAN_EID_HT_CAPABILITY);
4141        if (ht_cap_ie && ht_cap_ie[1] >= sizeof(*ht_cap)) {
4142                ht_cap = (void *)(ht_cap_ie + 2);
4143                chains = ieee80211_mcs_to_chains(&ht_cap->mcs);
4144                /*
4145                 * TODO: use "Tx Maximum Number Spatial Streams Supported" and
4146                 *       "Tx Unequal Modulation Supported" fields.
4147                 */
4148        }
4149
4150        if (ifmgd->flags & IEEE80211_STA_DISABLE_VHT)
4151                return chains;
4152
4153        vht_cap_ie = ieee80211_bss_get_ie(cbss, WLAN_EID_VHT_CAPABILITY);
4154        if (vht_cap_ie && vht_cap_ie[1] >= sizeof(*vht_cap)) {
4155                u8 nss;
4156                u16 tx_mcs_map;
4157
4158                vht_cap = (void *)(vht_cap_ie + 2);
4159                tx_mcs_map = le16_to_cpu(vht_cap->supp_mcs.tx_mcs_map);
4160                for (nss = 8; nss > 0; nss--) {
4161                        if (((tx_mcs_map >> (2 * (nss - 1))) & 3) !=
4162                                        IEEE80211_VHT_MCS_NOT_SUPPORTED)
4163                                break;
4164                }
4165                /* TODO: use "Tx Highest Supported Long GI Data Rate" field? */
4166                chains = max(chains, nss);
4167        }
4168
4169        return chains;
4170}
4171
4172static int ieee80211_prep_channel(struct ieee80211_sub_if_data *sdata,
4173                                  struct cfg80211_bss *cbss)
4174{
4175        struct ieee80211_local *local = sdata->local;
4176        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
4177        const struct ieee80211_ht_cap *ht_cap = NULL;
4178        const struct ieee80211_ht_operation *ht_oper = NULL;
4179        const struct ieee80211_vht_operation *vht_oper = NULL;
4180        struct ieee80211_supported_band *sband;
4181        struct cfg80211_chan_def chandef;
4182        int ret;
4183        u32 i;
4184        bool have_80mhz;
4185
4186        sband = local->hw.wiphy->bands[cbss->channel->band];
4187
4188        ifmgd->flags &= ~(IEEE80211_STA_DISABLE_40MHZ |
4189                          IEEE80211_STA_DISABLE_80P80MHZ |
4190                          IEEE80211_STA_DISABLE_160MHZ);
4191
4192        rcu_read_lock();
4193
4194        if (!(ifmgd->flags & IEEE80211_STA_DISABLE_HT) &&
4195            sband->ht_cap.ht_supported) {
4196                const u8 *ht_oper_ie, *ht_cap_ie;
4197
4198                ht_oper_ie = ieee80211_bss_get_ie(cbss, WLAN_EID_HT_OPERATION);
4199                if (ht_oper_ie && ht_oper_ie[1] >= sizeof(*ht_oper))
4200                        ht_oper = (void *)(ht_oper_ie + 2);
4201
4202                ht_cap_ie = ieee80211_bss_get_ie(cbss, WLAN_EID_HT_CAPABILITY);
4203                if (ht_cap_ie && ht_cap_ie[1] >= sizeof(*ht_cap))
4204                        ht_cap = (void *)(ht_cap_ie + 2);
4205
4206                if (!ht_cap) {
4207                        ifmgd->flags |= IEEE80211_STA_DISABLE_HT;
4208                        ht_oper = NULL;
4209                }
4210        }
4211
4212        if (!(ifmgd->flags & IEEE80211_STA_DISABLE_VHT) &&
4213            sband->vht_cap.vht_supported) {
4214                const u8 *vht_oper_ie, *vht_cap;
4215
4216                vht_oper_ie = ieee80211_bss_get_ie(cbss,
4217                                                   WLAN_EID_VHT_OPERATION);
4218                if (vht_oper_ie && vht_oper_ie[1] >= sizeof(*vht_oper))
4219                        vht_oper = (void *)(vht_oper_ie + 2);
4220                if (vht_oper && !ht_oper) {
4221                        vht_oper = NULL;
4222                        sdata_info(sdata,
4223                                   "AP advertised VHT without HT, disabling both\n");
4224                        ifmgd->flags |= IEEE80211_STA_DISABLE_HT;
4225                        ifmgd->flags |= IEEE80211_STA_DISABLE_VHT;
4226                }
4227
4228                vht_cap = ieee80211_bss_get_ie(cbss, WLAN_EID_VHT_CAPABILITY);
4229                if (!vht_cap || vht_cap[1] < sizeof(struct ieee80211_vht_cap)) {
4230                        ifmgd->flags |= IEEE80211_STA_DISABLE_VHT;
4231                        vht_oper = NULL;
4232                }
4233        }
4234
4235        /* Allow VHT if at least one channel on the sband supports 80 MHz */
4236        have_80mhz = false;
4237        for (i = 0; i < sband->n_channels; i++) {
4238                if (sband->channels[i].flags & (IEEE80211_CHAN_DISABLED |
4239                                                IEEE80211_CHAN_NO_80MHZ))
4240                        continue;
4241
4242                have_80mhz = true;
4243                break;
4244        }
4245
4246        if (!have_80mhz)
4247                ifmgd->flags |= IEEE80211_STA_DISABLE_VHT;
4248
4249        ifmgd->flags |= ieee80211_determine_chantype(sdata, sband,
4250                                                     cbss->channel,
4251                                                     ht_cap, ht_oper, vht_oper,
4252                                                     &chandef, false);
4253
4254        sdata->needed_rx_chains = min(ieee80211_ht_vht_rx_chains(sdata, cbss),
4255                                      local->rx_chains);
4256
4257        rcu_read_unlock();
4258
4259        /* will change later if needed */
4260        sdata->smps_mode = IEEE80211_SMPS_OFF;
4261
4262        mutex_lock(&local->mtx);
4263        /*
4264         * If this fails (possibly due to channel context sharing
4265         * on incompatible channels, e.g. 80+80 and 160 sharing the
4266         * same control channel) try to use a smaller bandwidth.
4267         */
4268        ret = ieee80211_vif_use_channel(sdata, &chandef,
4269                                        IEEE80211_CHANCTX_SHARED);
4270
4271        /* don't downgrade for 5 and 10 MHz channels, though. */
4272        if (chandef.width == NL80211_CHAN_WIDTH_5 ||
4273            chandef.width == NL80211_CHAN_WIDTH_10)
4274                goto out;
4275
4276        while (ret && chandef.width != NL80211_CHAN_WIDTH_20_NOHT) {
4277                ifmgd->flags |= ieee80211_chandef_downgrade(&chandef);
4278                ret = ieee80211_vif_use_channel(sdata, &chandef,
4279                                                IEEE80211_CHANCTX_SHARED);
4280        }
4281 out:
4282        mutex_unlock(&local->mtx);
4283        return ret;
4284}
4285
4286static int ieee80211_prep_connection(struct ieee80211_sub_if_data *sdata,
4287                                     struct cfg80211_bss *cbss, bool assoc,
4288                                     bool override)
4289{
4290        struct ieee80211_local *local = sdata->local;
4291        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
4292        struct ieee80211_bss *bss = (void *)cbss->priv;
4293        struct sta_info *new_sta = NULL;
4294        struct ieee80211_supported_band *sband;
4295        bool have_sta = false;
4296        int err;
4297
4298        sband = local->hw.wiphy->bands[cbss->channel->band];
4299
4300        if (WARN_ON(!ifmgd->auth_data && !ifmgd->assoc_data))
4301                return -EINVAL;
4302
4303        if (assoc) {
4304                rcu_read_lock();
4305                have_sta = sta_info_get(sdata, cbss->bssid);
4306                rcu_read_unlock();
4307        }
4308
4309        if (!have_sta) {
4310                new_sta = sta_info_alloc(sdata, cbss->bssid, GFP_KERNEL);
4311                if (!new_sta)
4312                        return -ENOMEM;
4313        }
4314
4315        if (new_sta || override) {
4316                err = ieee80211_prep_channel(sdata, cbss);
4317                if (err) {
4318                        if (new_sta)
4319                                sta_info_free(local, new_sta);
4320                        return -EINVAL;
4321                }
4322        }
4323
4324        if (new_sta) {
4325                u32 rates = 0, basic_rates = 0;
4326                bool have_higher_than_11mbit;
4327                int min_rate = INT_MAX, min_rate_index = -1;
4328                struct ieee80211_chanctx_conf *chanctx_conf;
4329                const struct cfg80211_bss_ies *ies;
4330                int shift = ieee80211_vif_get_shift(&sdata->vif);
4331                u32 rate_flags;
4332
4333                rcu_read_lock();
4334                chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
4335                if (WARN_ON(!chanctx_conf)) {
4336                        rcu_read_unlock();
4337                        sta_info_free(local, new_sta);
4338                        return -EINVAL;
4339                }
4340                rate_flags = ieee80211_chandef_rate_flags(&chanctx_conf->def);
4341                rcu_read_unlock();
4342
4343                ieee80211_get_rates(sband, bss->supp_rates,
4344                                    bss->supp_rates_len,
4345                                    &rates, &basic_rates,
4346                                    &have_higher_than_11mbit,
4347                                    &min_rate, &min_rate_index,
4348                                    shift, rate_flags);
4349
4350                /*
4351                 * This used to be a workaround for basic rates missing
4352                 * in the association response frame. Now that we no
4353                 * longer use the basic rates from there, it probably
4354                 * doesn't happen any more, but keep the workaround so
4355                 * in case some *other* APs are buggy in different ways
4356                 * we can connect -- with a warning.
4357                 */
4358                if (!basic_rates && min_rate_index >= 0) {
4359                        sdata_info(sdata,
4360                                   "No basic rates, using min rate instead\n");
4361                        basic_rates = BIT(min_rate_index);
4362                }
4363
4364                new_sta->sta.supp_rates[cbss->channel->band] = rates;
4365                sdata->vif.bss_conf.basic_rates = basic_rates;
4366
4367                /* cf. IEEE 802.11 9.2.12 */
4368                if (cbss->channel->band == IEEE80211_BAND_2GHZ &&
4369                    have_higher_than_11mbit)
4370                        sdata->flags |= IEEE80211_SDATA_OPERATING_GMODE;
4371                else
4372                        sdata->flags &= ~IEEE80211_SDATA_OPERATING_GMODE;
4373
4374                memcpy(ifmgd->bssid, cbss->bssid, ETH_ALEN);
4375
4376                /* set timing information */
4377                sdata->vif.bss_conf.beacon_int = cbss->beacon_interval;
4378                rcu_read_lock();
4379                ies = rcu_dereference(cbss->beacon_ies);
4380                if (ies) {
4381                        const u8 *tim_ie;
4382
4383                        sdata->vif.bss_conf.sync_tsf = ies->tsf;
4384                        sdata->vif.bss_conf.sync_device_ts =
4385                                bss->device_ts_beacon;
4386                        tim_ie = cfg80211_find_ie(WLAN_EID_TIM,
4387                                                  ies->data, ies->len);
4388                        if (tim_ie && tim_ie[1] >= 2)
4389                                sdata->vif.bss_conf.sync_dtim_count = tim_ie[2];
4390                        else
4391                                sdata->vif.bss_conf.sync_dtim_count = 0;
4392                } else if (!ieee80211_hw_check(&sdata->local->hw,
4393                                               TIMING_BEACON_ONLY)) {
4394                        ies = rcu_dereference(cbss->proberesp_ies);
4395                        /* must be non-NULL since beacon IEs were NULL */
4396                        sdata->vif.bss_conf.sync_tsf = ies->tsf;
4397                        sdata->vif.bss_conf.sync_device_ts =
4398                                bss->device_ts_presp;
4399                        sdata->vif.bss_conf.sync_dtim_count = 0;
4400                } else {
4401                        sdata->vif.bss_conf.sync_tsf = 0;
4402                        sdata->vif.bss_conf.sync_device_ts = 0;
4403                        sdata->vif.bss_conf.sync_dtim_count = 0;
4404                }
4405                rcu_read_unlock();
4406
4407                /* tell driver about BSSID, basic rates and timing */
4408                ieee80211_bss_info_change_notify(sdata,
4409                        BSS_CHANGED_BSSID | BSS_CHANGED_BASIC_RATES |
4410                        BSS_CHANGED_BEACON_INT);
4411
4412                if (assoc)
4413                        sta_info_pre_move_state(new_sta, IEEE80211_STA_AUTH);
4414
4415                err = sta_info_insert(new_sta);
4416                new_sta = NULL;
4417                if (err) {
4418                        sdata_info(sdata,
4419                                   "failed to insert STA entry for the AP (error %d)\n",
4420                                   err);
4421                        return err;
4422                }
4423        } else
4424                WARN_ON_ONCE(!ether_addr_equal(ifmgd->bssid, cbss->bssid));
4425
4426        /* Cancel scan to ensure that nothing interferes with connection */
4427        if (local->scanning)
4428                ieee80211_scan_cancel(local);
4429
4430        return 0;
4431}
4432
4433/* config hooks */
4434int ieee80211_mgd_auth(struct ieee80211_sub_if_data *sdata,
4435                       struct cfg80211_auth_request *req)
4436{
4437        struct ieee80211_local *local = sdata->local;
4438        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
4439        struct ieee80211_mgd_auth_data *auth_data;
4440        u16 auth_alg;
4441        int err;
4442
4443        /* prepare auth data structure */
4444
4445        switch (req->auth_type) {
4446        case NL80211_AUTHTYPE_OPEN_SYSTEM:
4447                auth_alg = WLAN_AUTH_OPEN;
4448                break;
4449        case NL80211_AUTHTYPE_SHARED_KEY:
4450                if (IS_ERR(local->wep_tx_tfm))
4451                        return -EOPNOTSUPP;
4452                auth_alg = WLAN_AUTH_SHARED_KEY;
4453                break;
4454        case NL80211_AUTHTYPE_FT:
4455                auth_alg = WLAN_AUTH_FT;
4456                break;
4457        case NL80211_AUTHTYPE_NETWORK_EAP:
4458                auth_alg = WLAN_AUTH_LEAP;
4459                break;
4460        case NL80211_AUTHTYPE_SAE:
4461                auth_alg = WLAN_AUTH_SAE;
4462                break;
4463        default:
4464                return -EOPNOTSUPP;
4465        }
4466
4467        auth_data = kzalloc(sizeof(*auth_data) + req->sae_data_len +
4468                            req->ie_len, GFP_KERNEL);
4469        if (!auth_data)
4470                return -ENOMEM;
4471
4472        auth_data->bss = req->bss;
4473
4474        if (req->sae_data_len >= 4) {
4475                __le16 *pos = (__le16 *) req->sae_data;
4476                auth_data->sae_trans = le16_to_cpu(pos[0]);
4477                auth_data->sae_status = le16_to_cpu(pos[1]);
4478                memcpy(auth_data->data, req->sae_data + 4,
4479                       req->sae_data_len - 4);
4480                auth_data->data_len += req->sae_data_len - 4;
4481        }
4482
4483        if (req->ie && req->ie_len) {
4484                memcpy(&auth_data->data[auth_data->data_len],
4485                       req->ie, req->ie_len);
4486                auth_data->data_len += req->ie_len;
4487        }
4488
4489        if (req->key && req->key_len) {
4490                auth_data->key_len = req->key_len;
4491                auth_data->key_idx = req->key_idx;
4492                memcpy(auth_data->key, req->key, req->key_len);
4493        }
4494
4495        auth_data->algorithm = auth_alg;
4496
4497        /* try to authenticate/probe */
4498
4499        if ((ifmgd->auth_data && !ifmgd->auth_data->done) ||
4500            ifmgd->assoc_data) {
4501                err = -EBUSY;
4502                goto err_free;
4503        }
4504
4505        if (ifmgd->auth_data)
4506                ieee80211_destroy_auth_data(sdata, false);
4507
4508        /* prep auth_data so we don't go into idle on disassoc */
4509        ifmgd->auth_data = auth_data;
4510
4511        if (ifmgd->associated) {
4512                u8 frame_buf[IEEE80211_DEAUTH_FRAME_LEN];
4513
4514                sdata_info(sdata,
4515                           "disconnect from AP %pM for new auth to %pM\n",
4516                           ifmgd->associated->bssid, req->bss->bssid);
4517                ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH,
4518                                       WLAN_REASON_UNSPECIFIED,
4519                                       false, frame_buf);
4520
4521                ieee80211_report_disconnect(sdata, frame_buf,
4522                                            sizeof(frame_buf), true,
4523                                            WLAN_REASON_UNSPECIFIED);
4524        }
4525
4526        sdata_info(sdata, "authenticate with %pM\n", req->bss->bssid);
4527
4528        err = ieee80211_prep_connection(sdata, req->bss, false, false);
4529        if (err)
4530                goto err_clear;
4531
4532        err = ieee80211_auth(sdata);
4533        if (err) {
4534                sta_info_destroy_addr(sdata, req->bss->bssid);
4535                goto err_clear;
4536        }
4537
4538        /* hold our own reference */
4539        cfg80211_ref_bss(local->hw.wiphy, auth_data->bss);
4540        return 0;
4541
4542 err_clear:
4543        eth_zero_addr(ifmgd->bssid);
4544        ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID);
4545        ifmgd->auth_data = NULL;
4546        mutex_lock(&sdata->local->mtx);
4547        ieee80211_vif_release_channel(sdata);
4548        mutex_unlock(&sdata->local->mtx);
4549 err_free:
4550        kfree(auth_data);
4551        return err;
4552}
4553
4554int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata,
4555                        struct cfg80211_assoc_request *req)
4556{
4557        struct ieee80211_local *local = sdata->local;
4558        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
4559        struct ieee80211_bss *bss = (void *)req->bss->priv;
4560        struct ieee80211_mgd_assoc_data *assoc_data;
4561        const struct cfg80211_bss_ies *beacon_ies;
4562        struct ieee80211_supported_band *sband;
4563        const u8 *ssidie, *ht_ie, *vht_ie;
4564        int i, err;
4565        bool override = false;
4566
4567        assoc_data = kzalloc(sizeof(*assoc_data) + req->ie_len, GFP_KERNEL);
4568        if (!assoc_data)
4569                return -ENOMEM;
4570
4571        rcu_read_lock();
4572        ssidie = ieee80211_bss_get_ie(req->bss, WLAN_EID_SSID);
4573        if (!ssidie) {
4574                rcu_read_unlock();
4575                kfree(assoc_data);
4576                return -EINVAL;
4577        }
4578        memcpy(assoc_data->ssid, ssidie + 2, ssidie[1]);
4579        assoc_data->ssid_len = ssidie[1];
4580        rcu_read_unlock();
4581
4582        if (ifmgd->associated) {
4583                u8 frame_buf[IEEE80211_DEAUTH_FRAME_LEN];
4584
4585                sdata_info(sdata,
4586                           "disconnect from AP %pM for new assoc to %pM\n",
4587                           ifmgd->associated->bssid, req->bss->bssid);
4588                ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH,
4589                                       WLAN_REASON_UNSPECIFIED,
4590                                       false, frame_buf);
4591
4592                ieee80211_report_disconnect(sdata, frame_buf,
4593                                            sizeof(frame_buf), true,
4594                                            WLAN_REASON_UNSPECIFIED);
4595        }
4596
4597        if (ifmgd->auth_data && !ifmgd->auth_data->done) {
4598                err = -EBUSY;
4599                goto err_free;
4600        }
4601
4602        if (ifmgd->assoc_data) {
4603                err = -EBUSY;
4604                goto err_free;
4605        }
4606
4607        if (ifmgd->auth_data) {
4608                bool match;
4609
4610                /* keep sta info, bssid if matching */
4611                match = ether_addr_equal(ifmgd->bssid, req->bss->bssid);
4612                ieee80211_destroy_auth_data(sdata, match);
4613        }
4614
4615        /* prepare assoc data */
4616
4617        ifmgd->beacon_crc_valid = false;
4618
4619        assoc_data->wmm = bss->wmm_used &&
4620                          (local->hw.queues >= IEEE80211_NUM_ACS);
4621
4622        /*
4623         * IEEE802.11n does not allow TKIP/WEP as pairwise ciphers in HT mode.
4624         * We still associate in non-HT mode (11a/b/g) if any one of these
4625         * ciphers is configured as pairwise.
4626         * We can set this to true for non-11n hardware, that'll be checked
4627         * separately along with the peer capabilities.
4628         */
4629        for (i = 0; i < req->crypto.n_ciphers_pairwise; i++) {
4630                if (req->crypto.ciphers_pairwise[i] == WLAN_CIPHER_SUITE_WEP40 ||
4631                    req->crypto.ciphers_pairwise[i] == WLAN_CIPHER_SUITE_TKIP ||
4632                    req->crypto.ciphers_pairwise[i] == WLAN_CIPHER_SUITE_WEP104) {
4633                        ifmgd->flags |= IEEE80211_STA_DISABLE_HT;
4634                        ifmgd->flags |= IEEE80211_STA_DISABLE_VHT;
4635                        netdev_info(sdata->dev,
4636                                    "disabling HT/VHT due to WEP/TKIP use\n");
4637                }
4638        }
4639
4640        /* Also disable HT if we don't support it or the AP doesn't use WMM */
4641        sband = local->hw.wiphy->bands[req->bss->channel->band];
4642        if (!sband->ht_cap.ht_supported ||
4643            local->hw.queues < IEEE80211_NUM_ACS || !bss->wmm_used ||
4644            ifmgd->flags & IEEE80211_STA_DISABLE_WMM) {
4645                ifmgd->flags |= IEEE80211_STA_DISABLE_HT;
4646                if (!bss->wmm_used &&
4647                    !(ifmgd->flags & IEEE80211_STA_DISABLE_WMM))
4648                        netdev_info(sdata->dev,
4649                                    "disabling HT as WMM/QoS is not supported by the AP\n");
4650        }
4651
4652        /* disable VHT if we don't support it or the AP doesn't use WMM */
4653        if (!sband->vht_cap.vht_supported ||
4654            local->hw.queues < IEEE80211_NUM_ACS || !bss->wmm_used ||
4655            ifmgd->flags & IEEE80211_STA_DISABLE_WMM) {
4656                ifmgd->flags |= IEEE80211_STA_DISABLE_VHT;
4657                if (!bss->wmm_used &&
4658                    !(ifmgd->flags & IEEE80211_STA_DISABLE_WMM))
4659                        netdev_info(sdata->dev,
4660                                    "disabling VHT as WMM/QoS is not supported by the AP\n");
4661        }
4662
4663        memcpy(&ifmgd->ht_capa, &req->ht_capa, sizeof(ifmgd->ht_capa));
4664        memcpy(&ifmgd->ht_capa_mask, &req->ht_capa_mask,
4665               sizeof(ifmgd->ht_capa_mask));
4666
4667        memcpy(&ifmgd->vht_capa, &req->vht_capa, sizeof(ifmgd->vht_capa));
4668        memcpy(&ifmgd->vht_capa_mask, &req->vht_capa_mask,
4669               sizeof(ifmgd->vht_capa_mask));
4670
4671        if (req->ie && req->ie_len) {
4672                memcpy(assoc_data->ie, req->ie, req->ie_len);
4673                assoc_data->ie_len = req->ie_len;
4674        }
4675
4676        assoc_data->bss = req->bss;
4677
4678        if (ifmgd->req_smps == IEEE80211_SMPS_AUTOMATIC) {
4679                if (ifmgd->powersave)
4680                        sdata->smps_mode = IEEE80211_SMPS_DYNAMIC;
4681                else
4682                        sdata->smps_mode = IEEE80211_SMPS_OFF;
4683        } else
4684                sdata->smps_mode = ifmgd->req_smps;
4685
4686        assoc_data->capability = req->bss->capability;
4687        assoc_data->supp_rates = bss->supp_rates;
4688        assoc_data->supp_rates_len = bss->supp_rates_len;
4689
4690        rcu_read_lock();
4691        ht_ie = ieee80211_bss_get_ie(req->bss, WLAN_EID_HT_OPERATION);
4692        if (ht_ie && ht_ie[1] >= sizeof(struct ieee80211_ht_operation))
4693                assoc_data->ap_ht_param =
4694                        ((struct ieee80211_ht_operation *)(ht_ie + 2))->ht_param;
4695        else
4696                ifmgd->flags |= IEEE80211_STA_DISABLE_HT;
4697        vht_ie = ieee80211_bss_get_ie(req->bss, WLAN_EID_VHT_CAPABILITY);
4698        if (vht_ie && vht_ie[1] >= sizeof(struct ieee80211_vht_cap))
4699                memcpy(&assoc_data->ap_vht_cap, vht_ie + 2,
4700                       sizeof(struct ieee80211_vht_cap));
4701        else
4702                ifmgd->flags |= IEEE80211_STA_DISABLE_VHT;
4703        rcu_read_unlock();
4704
4705        if (WARN((sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_UAPSD) &&
4706                 ieee80211_hw_check(&local->hw, PS_NULLFUNC_STACK),
4707             "U-APSD not supported with HW_PS_NULLFUNC_STACK\n"))
4708                sdata->vif.driver_flags &= ~IEEE80211_VIF_SUPPORTS_UAPSD;
4709
4710        if (bss->wmm_used && bss->uapsd_supported &&
4711            (sdata->vif.driver_flags & IEEE80211_VIF_SUPPORTS_UAPSD)) {
4712                assoc_data->uapsd = true;
4713                ifmgd->flags |= IEEE80211_STA_UAPSD_ENABLED;
4714        } else {
4715                assoc_data->uapsd = false;
4716                ifmgd->flags &= ~IEEE80211_STA_UAPSD_ENABLED;
4717        }
4718
4719        if (req->prev_bssid)
4720                memcpy(assoc_data->prev_bssid, req->prev_bssid, ETH_ALEN);
4721
4722        if (req->use_mfp) {
4723                ifmgd->mfp = IEEE80211_MFP_REQUIRED;
4724                ifmgd->flags |= IEEE80211_STA_MFP_ENABLED;
4725        } else {
4726                ifmgd->mfp = IEEE80211_MFP_DISABLED;
4727                ifmgd->flags &= ~IEEE80211_STA_MFP_ENABLED;
4728        }
4729
4730        if (req->flags & ASSOC_REQ_USE_RRM)
4731                ifmgd->flags |= IEEE80211_STA_ENABLE_RRM;
4732        else
4733                ifmgd->flags &= ~IEEE80211_STA_ENABLE_RRM;
4734
4735        if (req->crypto.control_port)
4736                ifmgd->flags |= IEEE80211_STA_CONTROL_PORT;
4737        else
4738                ifmgd->flags &= ~IEEE80211_STA_CONTROL_PORT;
4739
4740        sdata->control_port_protocol = req->crypto.control_port_ethertype;
4741        sdata->control_port_no_encrypt = req->crypto.control_port_no_encrypt;
4742        sdata->encrypt_headroom = ieee80211_cs_headroom(local, &req->crypto,
4743                                                        sdata->vif.type);
4744
4745        /* kick off associate process */
4746
4747        ifmgd->assoc_data = assoc_data;
4748        ifmgd->dtim_period = 0;
4749        ifmgd->have_beacon = false;
4750
4751        /* override HT/VHT configuration only if the AP and we support it */
4752        if (!(ifmgd->flags & IEEE80211_STA_DISABLE_HT)) {
4753                struct ieee80211_sta_ht_cap sta_ht_cap;
4754
4755                if (req->flags & ASSOC_REQ_DISABLE_HT)
4756                        override = true;
4757
4758                memcpy(&sta_ht_cap, &sband->ht_cap, sizeof(sta_ht_cap));
4759                ieee80211_apply_htcap_overrides(sdata, &sta_ht_cap);
4760
4761                /* check for 40 MHz disable override */
4762                if (!(ifmgd->flags & IEEE80211_STA_DISABLE_40MHZ) &&
4763                    sband->ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40 &&
4764                    !(sta_ht_cap.cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40))
4765                        override = true;
4766
4767                if (!(ifmgd->flags & IEEE80211_STA_DISABLE_VHT) &&
4768                    req->flags & ASSOC_REQ_DISABLE_VHT)
4769                        override = true;
4770        }
4771
4772        if (req->flags & ASSOC_REQ_DISABLE_HT) {
4773                ifmgd->flags |= IEEE80211_STA_DISABLE_HT;
4774                ifmgd->flags |= IEEE80211_STA_DISABLE_VHT;
4775        }
4776
4777        if (req->flags & ASSOC_REQ_DISABLE_VHT)
4778                ifmgd->flags |= IEEE80211_STA_DISABLE_VHT;
4779
4780        err = ieee80211_prep_connection(sdata, req->bss, true, override);
4781        if (err)
4782                goto err_clear;
4783
4784        rcu_read_lock();
4785        beacon_ies = rcu_dereference(req->bss->beacon_ies);
4786
4787        if (ieee80211_hw_check(&sdata->local->hw, NEED_DTIM_BEFORE_ASSOC) &&
4788            !beacon_ies) {
4789                /*
4790                 * Wait up to one beacon interval ...
4791                 * should this be more if we miss one?
4792                 */
4793                sdata_info(sdata, "waiting for beacon from %pM\n",
4794                           ifmgd->bssid);
4795                assoc_data->timeout = TU_TO_EXP_TIME(req->bss->beacon_interval);
4796                assoc_data->timeout_started = true;
4797                assoc_data->need_beacon = true;
4798        } else if (beacon_ies) {
4799                const u8 *tim_ie = cfg80211_find_ie(WLAN_EID_TIM,
4800                                                    beacon_ies->data,
4801                                                    beacon_ies->len);
4802                u8 dtim_count = 0;
4803
4804                if (tim_ie && tim_ie[1] >= sizeof(struct ieee80211_tim_ie)) {
4805                        const struct ieee80211_tim_ie *tim;
4806                        tim = (void *)(tim_ie + 2);
4807                        ifmgd->dtim_period = tim->dtim_period;
4808                        dtim_count = tim->dtim_count;
4809                }
4810                ifmgd->have_beacon = true;
4811                assoc_data->timeout = jiffies;
4812                assoc_data->timeout_started = true;
4813
4814                if (ieee80211_hw_check(&local->hw, TIMING_BEACON_ONLY)) {
4815                        sdata->vif.bss_conf.sync_tsf = beacon_ies->tsf;
4816                        sdata->vif.bss_conf.sync_device_ts =
4817                                bss->device_ts_beacon;
4818                        sdata->vif.bss_conf.sync_dtim_count = dtim_count;
4819                }
4820        } else {
4821                assoc_data->timeout = jiffies;
4822                assoc_data->timeout_started = true;
4823        }
4824        rcu_read_unlock();
4825
4826        run_again(sdata, assoc_data->timeout);
4827
4828        if (bss->corrupt_data) {
4829                char *corrupt_type = "data";
4830                if (bss->corrupt_data & IEEE80211_BSS_CORRUPT_BEACON) {
4831                        if (bss->corrupt_data &
4832                                        IEEE80211_BSS_CORRUPT_PROBE_RESP)
4833                                corrupt_type = "beacon and probe response";
4834                        else
4835                                corrupt_type = "beacon";
4836                } else if (bss->corrupt_data & IEEE80211_BSS_CORRUPT_PROBE_RESP)
4837                        corrupt_type = "probe response";
4838                sdata_info(sdata, "associating with AP with corrupt %s\n",
4839                           corrupt_type);
4840        }
4841
4842        return 0;
4843 err_clear:
4844        eth_zero_addr(ifmgd->bssid);
4845        ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BSSID);
4846        ifmgd->assoc_data = NULL;
4847 err_free:
4848        kfree(assoc_data);
4849        return err;
4850}
4851
4852int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata,
4853                         struct cfg80211_deauth_request *req)
4854{
4855        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
4856        u8 frame_buf[IEEE80211_DEAUTH_FRAME_LEN];
4857        bool tx = !req->local_state_change;
4858
4859        if (ifmgd->auth_data &&
4860            ether_addr_equal(ifmgd->auth_data->bss->bssid, req->bssid)) {
4861                sdata_info(sdata,
4862                           "aborting authentication with %pM by local choice (Reason: %u=%s)\n",
4863                           req->bssid, req->reason_code,
4864                           ieee80211_get_reason_code_string(req->reason_code));
4865
4866                drv_mgd_prepare_tx(sdata->local, sdata);
4867                ieee80211_send_deauth_disassoc(sdata, req->bssid,
4868                                               IEEE80211_STYPE_DEAUTH,
4869                                               req->reason_code, tx,
4870                                               frame_buf);
4871                ieee80211_destroy_auth_data(sdata, false);
4872                ieee80211_report_disconnect(sdata, frame_buf,
4873                                            sizeof(frame_buf), true,
4874                                            req->reason_code);
4875
4876                return 0;
4877        }
4878
4879        if (ifmgd->assoc_data &&
4880            ether_addr_equal(ifmgd->assoc_data->bss->bssid, req->bssid)) {
4881                sdata_info(sdata,
4882                           "aborting association with %pM by local choice (Reason: %u=%s)\n",
4883                           req->bssid, req->reason_code,
4884                           ieee80211_get_reason_code_string(req->reason_code));
4885
4886                drv_mgd_prepare_tx(sdata->local, sdata);
4887                ieee80211_send_deauth_disassoc(sdata, req->bssid,
4888                                               IEEE80211_STYPE_DEAUTH,
4889                                               req->reason_code, tx,
4890                                               frame_buf);
4891                ieee80211_destroy_assoc_data(sdata, false);
4892                ieee80211_report_disconnect(sdata, frame_buf,
4893                                            sizeof(frame_buf), true,
4894                                            req->reason_code);
4895                return 0;
4896        }
4897
4898        if (ifmgd->associated &&
4899            ether_addr_equal(ifmgd->associated->bssid, req->bssid)) {
4900                sdata_info(sdata,
4901                           "deauthenticating from %pM by local choice (Reason: %u=%s)\n",
4902                           req->bssid, req->reason_code,
4903                           ieee80211_get_reason_code_string(req->reason_code));
4904
4905                ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DEAUTH,
4906                                       req->reason_code, tx, frame_buf);
4907                ieee80211_report_disconnect(sdata, frame_buf,
4908                                            sizeof(frame_buf), true,
4909                                            req->reason_code);
4910                return 0;
4911        }
4912
4913        return -ENOTCONN;
4914}
4915
4916int ieee80211_mgd_disassoc(struct ieee80211_sub_if_data *sdata,
4917                           struct cfg80211_disassoc_request *req)
4918{
4919        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
4920        u8 bssid[ETH_ALEN];
4921        u8 frame_buf[IEEE80211_DEAUTH_FRAME_LEN];
4922
4923        /*
4924         * cfg80211 should catch this ... but it's racy since
4925         * we can receive a disassoc frame, process it, hand it
4926         * to cfg80211 while that's in a locked section already
4927         * trying to tell us that the user wants to disconnect.
4928         */
4929        if (ifmgd->associated != req->bss)
4930                return -ENOLINK;
4931
4932        sdata_info(sdata,
4933                   "disassociating from %pM by local choice (Reason: %u=%s)\n",
4934                   req->bss->bssid, req->reason_code, ieee80211_get_reason_code_string(req->reason_code));
4935
4936        memcpy(bssid, req->bss->bssid, ETH_ALEN);
4937        ieee80211_set_disassoc(sdata, IEEE80211_STYPE_DISASSOC,
4938                               req->reason_code, !req->local_state_change,
4939                               frame_buf);
4940
4941        ieee80211_report_disconnect(sdata, frame_buf, sizeof(frame_buf), true,
4942                                    req->reason_code);
4943
4944        return 0;
4945}
4946
4947void ieee80211_mgd_stop(struct ieee80211_sub_if_data *sdata)
4948{
4949        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
4950
4951        /*
4952         * Make sure some work items will not run after this,
4953         * they will not do anything but might not have been
4954         * cancelled when disconnecting.
4955         */
4956        cancel_work_sync(&ifmgd->monitor_work);
4957        cancel_work_sync(&ifmgd->beacon_connection_loss_work);
4958        cancel_work_sync(&ifmgd->request_smps_work);
4959        cancel_work_sync(&ifmgd->csa_connection_drop_work);
4960        cancel_work_sync(&ifmgd->chswitch_work);
4961        cancel_delayed_work_sync(&ifmgd->tdls_peer_del_work);
4962
4963        sdata_lock(sdata);
4964        if (ifmgd->assoc_data) {
4965                struct cfg80211_bss *bss = ifmgd->assoc_data->bss;
4966                ieee80211_destroy_assoc_data(sdata, false);
4967                cfg80211_assoc_timeout(sdata->dev, bss);
4968        }
4969        if (ifmgd->auth_data)
4970                ieee80211_destroy_auth_data(sdata, false);
4971        spin_lock_bh(&ifmgd->teardown_lock);
4972        if (ifmgd->teardown_skb) {
4973                kfree_skb(ifmgd->teardown_skb);
4974                ifmgd->teardown_skb = NULL;
4975                ifmgd->orig_teardown_skb = NULL;
4976        }
4977        spin_unlock_bh(&ifmgd->teardown_lock);
4978        del_timer_sync(&ifmgd->timer);
4979        sdata_unlock(sdata);
4980}
4981
4982void ieee80211_cqm_rssi_notify(struct ieee80211_vif *vif,
4983                               enum nl80211_cqm_rssi_threshold_event rssi_event,
4984                               gfp_t gfp)
4985{
4986        struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
4987
4988        trace_api_cqm_rssi_notify(sdata, rssi_event);
4989
4990        cfg80211_cqm_rssi_notify(sdata->dev, rssi_event, gfp);
4991}
4992EXPORT_SYMBOL(ieee80211_cqm_rssi_notify);
4993
4994void ieee80211_cqm_beacon_loss_notify(struct ieee80211_vif *vif, gfp_t gfp)
4995{
4996        struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
4997
4998        trace_api_cqm_beacon_loss_notify(sdata->local, sdata);
4999
5000        cfg80211_cqm_beacon_loss_notify(sdata->dev, gfp);
5001}
5002EXPORT_SYMBOL(ieee80211_cqm_beacon_loss_notify);
5003