linux/net/mac80211/util.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * Copyright 2002-2005, Instant802 Networks, Inc.
   4 * Copyright 2005-2006, Devicescape Software, Inc.
   5 * Copyright 2006-2007  Jiri Benc <jbenc@suse.cz>
   6 * Copyright 2007       Johannes Berg <johannes@sipsolutions.net>
   7 * Copyright 2013-2014  Intel Mobile Communications GmbH
   8 * Copyright (C) 2015-2017      Intel Deutschland GmbH
   9 * Copyright (C) 2018-2020 Intel Corporation
  10 *
  11 * utilities for mac80211
  12 */
  13
  14#include <net/mac80211.h>
  15#include <linux/netdevice.h>
  16#include <linux/export.h>
  17#include <linux/types.h>
  18#include <linux/slab.h>
  19#include <linux/skbuff.h>
  20#include <linux/etherdevice.h>
  21#include <linux/if_arp.h>
  22#include <linux/bitmap.h>
  23#include <linux/crc32.h>
  24#include <net/net_namespace.h>
  25#include <net/cfg80211.h>
  26#include <net/rtnetlink.h>
  27
  28#include "ieee80211_i.h"
  29#include "driver-ops.h"
  30#include "rate.h"
  31#include "mesh.h"
  32#include "wme.h"
  33#include "led.h"
  34#include "wep.h"
  35
  36/* privid for wiphys to determine whether they belong to us or not */
  37const void *const mac80211_wiphy_privid = &mac80211_wiphy_privid;
  38
  39struct ieee80211_hw *wiphy_to_ieee80211_hw(struct wiphy *wiphy)
  40{
  41        struct ieee80211_local *local;
  42
  43        local = wiphy_priv(wiphy);
  44        return &local->hw;
  45}
  46EXPORT_SYMBOL(wiphy_to_ieee80211_hw);
  47
  48u8 *ieee80211_get_bssid(struct ieee80211_hdr *hdr, size_t len,
  49                        enum nl80211_iftype type)
  50{
  51        __le16 fc = hdr->frame_control;
  52
  53        if (ieee80211_is_data(fc)) {
  54                if (len < 24) /* drop incorrect hdr len (data) */
  55                        return NULL;
  56
  57                if (ieee80211_has_a4(fc))
  58                        return NULL;
  59                if (ieee80211_has_tods(fc))
  60                        return hdr->addr1;
  61                if (ieee80211_has_fromds(fc))
  62                        return hdr->addr2;
  63
  64                return hdr->addr3;
  65        }
  66
  67        if (ieee80211_is_s1g_beacon(fc)) {
  68                struct ieee80211_ext *ext = (void *) hdr;
  69
  70                return ext->u.s1g_beacon.sa;
  71        }
  72
  73        if (ieee80211_is_mgmt(fc)) {
  74                if (len < 24) /* drop incorrect hdr len (mgmt) */
  75                        return NULL;
  76                return hdr->addr3;
  77        }
  78
  79        if (ieee80211_is_ctl(fc)) {
  80                if (ieee80211_is_pspoll(fc))
  81                        return hdr->addr1;
  82
  83                if (ieee80211_is_back_req(fc)) {
  84                        switch (type) {
  85                        case NL80211_IFTYPE_STATION:
  86                                return hdr->addr2;
  87                        case NL80211_IFTYPE_AP:
  88                        case NL80211_IFTYPE_AP_VLAN:
  89                                return hdr->addr1;
  90                        default:
  91                                break; /* fall through to the return */
  92                        }
  93                }
  94        }
  95
  96        return NULL;
  97}
  98EXPORT_SYMBOL(ieee80211_get_bssid);
  99
 100void ieee80211_tx_set_protected(struct ieee80211_tx_data *tx)
 101{
 102        struct sk_buff *skb;
 103        struct ieee80211_hdr *hdr;
 104
 105        skb_queue_walk(&tx->skbs, skb) {
 106                hdr = (struct ieee80211_hdr *) skb->data;
 107                hdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_PROTECTED);
 108        }
 109}
 110
 111int ieee80211_frame_duration(enum nl80211_band band, size_t len,
 112                             int rate, int erp, int short_preamble,
 113                             int shift)
 114{
 115        int dur;
 116
 117        /* calculate duration (in microseconds, rounded up to next higher
 118         * integer if it includes a fractional microsecond) to send frame of
 119         * len bytes (does not include FCS) at the given rate. Duration will
 120         * also include SIFS.
 121         *
 122         * rate is in 100 kbps, so divident is multiplied by 10 in the
 123         * DIV_ROUND_UP() operations.
 124         *
 125         * shift may be 2 for 5 MHz channels or 1 for 10 MHz channels, and
 126         * is assumed to be 0 otherwise.
 127         */
 128
 129        if (band == NL80211_BAND_5GHZ || erp) {
 130                /*
 131                 * OFDM:
 132                 *
 133                 * N_DBPS = DATARATE x 4
 134                 * N_SYM = Ceiling((16+8xLENGTH+6) / N_DBPS)
 135                 *      (16 = SIGNAL time, 6 = tail bits)
 136                 * TXTIME = T_PREAMBLE + T_SIGNAL + T_SYM x N_SYM + Signal Ext
 137                 *
 138                 * T_SYM = 4 usec
 139                 * 802.11a - 18.5.2: aSIFSTime = 16 usec
 140                 * 802.11g - 19.8.4: aSIFSTime = 10 usec +
 141                 *      signal ext = 6 usec
 142                 */
 143                dur = 16; /* SIFS + signal ext */
 144                dur += 16; /* IEEE 802.11-2012 18.3.2.4: T_PREAMBLE = 16 usec */
 145                dur += 4; /* IEEE 802.11-2012 18.3.2.4: T_SIGNAL = 4 usec */
 146
 147                /* IEEE 802.11-2012 18.3.2.4: all values above are:
 148                 *  * times 4 for 5 MHz
 149                 *  * times 2 for 10 MHz
 150                 */
 151                dur *= 1 << shift;
 152
 153                /* rates should already consider the channel bandwidth,
 154                 * don't apply divisor again.
 155                 */
 156                dur += 4 * DIV_ROUND_UP((16 + 8 * (len + 4) + 6) * 10,
 157                                        4 * rate); /* T_SYM x N_SYM */
 158        } else {
 159                /*
 160                 * 802.11b or 802.11g with 802.11b compatibility:
 161                 * 18.3.4: TXTIME = PreambleLength + PLCPHeaderTime +
 162                 * Ceiling(((LENGTH+PBCC)x8)/DATARATE). PBCC=0.
 163                 *
 164                 * 802.11 (DS): 15.3.3, 802.11b: 18.3.4
 165                 * aSIFSTime = 10 usec
 166                 * aPreambleLength = 144 usec or 72 usec with short preamble
 167                 * aPLCPHeaderLength = 48 usec or 24 usec with short preamble
 168                 */
 169                dur = 10; /* aSIFSTime = 10 usec */
 170                dur += short_preamble ? (72 + 24) : (144 + 48);
 171
 172                dur += DIV_ROUND_UP(8 * (len + 4) * 10, rate);
 173        }
 174
 175        return dur;
 176}
 177
 178/* Exported duration function for driver use */
 179__le16 ieee80211_generic_frame_duration(struct ieee80211_hw *hw,
 180                                        struct ieee80211_vif *vif,
 181                                        enum nl80211_band band,
 182                                        size_t frame_len,
 183                                        struct ieee80211_rate *rate)
 184{
 185        struct ieee80211_sub_if_data *sdata;
 186        u16 dur;
 187        int erp, shift = 0;
 188        bool short_preamble = false;
 189
 190        erp = 0;
 191        if (vif) {
 192                sdata = vif_to_sdata(vif);
 193                short_preamble = sdata->vif.bss_conf.use_short_preamble;
 194                if (sdata->flags & IEEE80211_SDATA_OPERATING_GMODE)
 195                        erp = rate->flags & IEEE80211_RATE_ERP_G;
 196                shift = ieee80211_vif_get_shift(vif);
 197        }
 198
 199        dur = ieee80211_frame_duration(band, frame_len, rate->bitrate, erp,
 200                                       short_preamble, shift);
 201
 202        return cpu_to_le16(dur);
 203}
 204EXPORT_SYMBOL(ieee80211_generic_frame_duration);
 205
 206__le16 ieee80211_rts_duration(struct ieee80211_hw *hw,
 207                              struct ieee80211_vif *vif, size_t frame_len,
 208                              const struct ieee80211_tx_info *frame_txctl)
 209{
 210        struct ieee80211_local *local = hw_to_local(hw);
 211        struct ieee80211_rate *rate;
 212        struct ieee80211_sub_if_data *sdata;
 213        bool short_preamble;
 214        int erp, shift = 0, bitrate;
 215        u16 dur;
 216        struct ieee80211_supported_band *sband;
 217
 218        sband = local->hw.wiphy->bands[frame_txctl->band];
 219
 220        short_preamble = false;
 221
 222        rate = &sband->bitrates[frame_txctl->control.rts_cts_rate_idx];
 223
 224        erp = 0;
 225        if (vif) {
 226                sdata = vif_to_sdata(vif);
 227                short_preamble = sdata->vif.bss_conf.use_short_preamble;
 228                if (sdata->flags & IEEE80211_SDATA_OPERATING_GMODE)
 229                        erp = rate->flags & IEEE80211_RATE_ERP_G;
 230                shift = ieee80211_vif_get_shift(vif);
 231        }
 232
 233        bitrate = DIV_ROUND_UP(rate->bitrate, 1 << shift);
 234
 235        /* CTS duration */
 236        dur = ieee80211_frame_duration(sband->band, 10, bitrate,
 237                                       erp, short_preamble, shift);
 238        /* Data frame duration */
 239        dur += ieee80211_frame_duration(sband->band, frame_len, bitrate,
 240                                        erp, short_preamble, shift);
 241        /* ACK duration */
 242        dur += ieee80211_frame_duration(sband->band, 10, bitrate,
 243                                        erp, short_preamble, shift);
 244
 245        return cpu_to_le16(dur);
 246}
 247EXPORT_SYMBOL(ieee80211_rts_duration);
 248
 249__le16 ieee80211_ctstoself_duration(struct ieee80211_hw *hw,
 250                                    struct ieee80211_vif *vif,
 251                                    size_t frame_len,
 252                                    const struct ieee80211_tx_info *frame_txctl)
 253{
 254        struct ieee80211_local *local = hw_to_local(hw);
 255        struct ieee80211_rate *rate;
 256        struct ieee80211_sub_if_data *sdata;
 257        bool short_preamble;
 258        int erp, shift = 0, bitrate;
 259        u16 dur;
 260        struct ieee80211_supported_band *sband;
 261
 262        sband = local->hw.wiphy->bands[frame_txctl->band];
 263
 264        short_preamble = false;
 265
 266        rate = &sband->bitrates[frame_txctl->control.rts_cts_rate_idx];
 267        erp = 0;
 268        if (vif) {
 269                sdata = vif_to_sdata(vif);
 270                short_preamble = sdata->vif.bss_conf.use_short_preamble;
 271                if (sdata->flags & IEEE80211_SDATA_OPERATING_GMODE)
 272                        erp = rate->flags & IEEE80211_RATE_ERP_G;
 273                shift = ieee80211_vif_get_shift(vif);
 274        }
 275
 276        bitrate = DIV_ROUND_UP(rate->bitrate, 1 << shift);
 277
 278        /* Data frame duration */
 279        dur = ieee80211_frame_duration(sband->band, frame_len, bitrate,
 280                                       erp, short_preamble, shift);
 281        if (!(frame_txctl->flags & IEEE80211_TX_CTL_NO_ACK)) {
 282                /* ACK duration */
 283                dur += ieee80211_frame_duration(sband->band, 10, bitrate,
 284                                                erp, short_preamble, shift);
 285        }
 286
 287        return cpu_to_le16(dur);
 288}
 289EXPORT_SYMBOL(ieee80211_ctstoself_duration);
 290
 291static void __ieee80211_wake_txqs(struct ieee80211_sub_if_data *sdata, int ac)
 292{
 293        struct ieee80211_local *local = sdata->local;
 294        struct ieee80211_vif *vif = &sdata->vif;
 295        struct fq *fq = &local->fq;
 296        struct ps_data *ps = NULL;
 297        struct txq_info *txqi;
 298        struct sta_info *sta;
 299        int i;
 300
 301        local_bh_disable();
 302        spin_lock(&fq->lock);
 303
 304        if (sdata->vif.type == NL80211_IFTYPE_AP)
 305                ps = &sdata->bss->ps;
 306
 307        sdata->vif.txqs_stopped[ac] = false;
 308
 309        list_for_each_entry_rcu(sta, &local->sta_list, list) {
 310                if (sdata != sta->sdata)
 311                        continue;
 312
 313                for (i = 0; i < ARRAY_SIZE(sta->sta.txq); i++) {
 314                        struct ieee80211_txq *txq = sta->sta.txq[i];
 315
 316                        if (!txq)
 317                                continue;
 318
 319                        txqi = to_txq_info(txq);
 320
 321                        if (ac != txq->ac)
 322                                continue;
 323
 324                        if (!test_and_clear_bit(IEEE80211_TXQ_STOP_NETIF_TX,
 325                                                &txqi->flags))
 326                                continue;
 327
 328                        spin_unlock(&fq->lock);
 329                        drv_wake_tx_queue(local, txqi);
 330                        spin_lock(&fq->lock);
 331                }
 332        }
 333
 334        if (!vif->txq)
 335                goto out;
 336
 337        txqi = to_txq_info(vif->txq);
 338
 339        if (!test_and_clear_bit(IEEE80211_TXQ_STOP_NETIF_TX, &txqi->flags) ||
 340            (ps && atomic_read(&ps->num_sta_ps)) || ac != vif->txq->ac)
 341                goto out;
 342
 343        spin_unlock(&fq->lock);
 344
 345        drv_wake_tx_queue(local, txqi);
 346        local_bh_enable();
 347        return;
 348out:
 349        spin_unlock(&fq->lock);
 350        local_bh_enable();
 351}
 352
 353static void
 354__releases(&local->queue_stop_reason_lock)
 355__acquires(&local->queue_stop_reason_lock)
 356_ieee80211_wake_txqs(struct ieee80211_local *local, unsigned long *flags)
 357{
 358        struct ieee80211_sub_if_data *sdata;
 359        int n_acs = IEEE80211_NUM_ACS;
 360        int i;
 361
 362        rcu_read_lock();
 363
 364        if (local->hw.queues < IEEE80211_NUM_ACS)
 365                n_acs = 1;
 366
 367        for (i = 0; i < local->hw.queues; i++) {
 368                if (local->queue_stop_reasons[i])
 369                        continue;
 370
 371                spin_unlock_irqrestore(&local->queue_stop_reason_lock, *flags);
 372                list_for_each_entry_rcu(sdata, &local->interfaces, list) {
 373                        int ac;
 374
 375                        for (ac = 0; ac < n_acs; ac++) {
 376                                int ac_queue = sdata->vif.hw_queue[ac];
 377
 378                                if (ac_queue == i ||
 379                                    sdata->vif.cab_queue == i)
 380                                        __ieee80211_wake_txqs(sdata, ac);
 381                        }
 382                }
 383                spin_lock_irqsave(&local->queue_stop_reason_lock, *flags);
 384        }
 385
 386        rcu_read_unlock();
 387}
 388
 389void ieee80211_wake_txqs(unsigned long data)
 390{
 391        struct ieee80211_local *local = (struct ieee80211_local *)data;
 392        unsigned long flags;
 393
 394        spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
 395        _ieee80211_wake_txqs(local, &flags);
 396        spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
 397}
 398
 399void ieee80211_propagate_queue_wake(struct ieee80211_local *local, int queue)
 400{
 401        struct ieee80211_sub_if_data *sdata;
 402        int n_acs = IEEE80211_NUM_ACS;
 403
 404        if (local->ops->wake_tx_queue)
 405                return;
 406
 407        if (local->hw.queues < IEEE80211_NUM_ACS)
 408                n_acs = 1;
 409
 410        list_for_each_entry_rcu(sdata, &local->interfaces, list) {
 411                int ac;
 412
 413                if (!sdata->dev)
 414                        continue;
 415
 416                if (sdata->vif.cab_queue != IEEE80211_INVAL_HW_QUEUE &&
 417                    local->queue_stop_reasons[sdata->vif.cab_queue] != 0)
 418                        continue;
 419
 420                for (ac = 0; ac < n_acs; ac++) {
 421                        int ac_queue = sdata->vif.hw_queue[ac];
 422
 423                        if (ac_queue == queue ||
 424                            (sdata->vif.cab_queue == queue &&
 425                             local->queue_stop_reasons[ac_queue] == 0 &&
 426                             skb_queue_empty(&local->pending[ac_queue])))
 427                                netif_wake_subqueue(sdata->dev, ac);
 428                }
 429        }
 430}
 431
 432static void __ieee80211_wake_queue(struct ieee80211_hw *hw, int queue,
 433                                   enum queue_stop_reason reason,
 434                                   bool refcounted,
 435                                   unsigned long *flags)
 436{
 437        struct ieee80211_local *local = hw_to_local(hw);
 438
 439        trace_wake_queue(local, queue, reason);
 440
 441        if (WARN_ON(queue >= hw->queues))
 442                return;
 443
 444        if (!test_bit(reason, &local->queue_stop_reasons[queue]))
 445                return;
 446
 447        if (!refcounted) {
 448                local->q_stop_reasons[queue][reason] = 0;
 449        } else {
 450                local->q_stop_reasons[queue][reason]--;
 451                if (WARN_ON(local->q_stop_reasons[queue][reason] < 0))
 452                        local->q_stop_reasons[queue][reason] = 0;
 453        }
 454
 455        if (local->q_stop_reasons[queue][reason] == 0)
 456                __clear_bit(reason, &local->queue_stop_reasons[queue]);
 457
 458        if (local->queue_stop_reasons[queue] != 0)
 459                /* someone still has this queue stopped */
 460                return;
 461
 462        if (skb_queue_empty(&local->pending[queue])) {
 463                rcu_read_lock();
 464                ieee80211_propagate_queue_wake(local, queue);
 465                rcu_read_unlock();
 466        } else
 467                tasklet_schedule(&local->tx_pending_tasklet);
 468
 469        /*
 470         * Calling _ieee80211_wake_txqs here can be a problem because it may
 471         * release queue_stop_reason_lock which has been taken by
 472         * __ieee80211_wake_queue's caller. It is certainly not very nice to
 473         * release someone's lock, but it is fine because all the callers of
 474         * __ieee80211_wake_queue call it right before releasing the lock.
 475         */
 476        if (local->ops->wake_tx_queue) {
 477                if (reason == IEEE80211_QUEUE_STOP_REASON_DRIVER)
 478                        tasklet_schedule(&local->wake_txqs_tasklet);
 479                else
 480                        _ieee80211_wake_txqs(local, flags);
 481        }
 482}
 483
 484void ieee80211_wake_queue_by_reason(struct ieee80211_hw *hw, int queue,
 485                                    enum queue_stop_reason reason,
 486                                    bool refcounted)
 487{
 488        struct ieee80211_local *local = hw_to_local(hw);
 489        unsigned long flags;
 490
 491        spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
 492        __ieee80211_wake_queue(hw, queue, reason, refcounted, &flags);
 493        spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
 494}
 495
 496void ieee80211_wake_queue(struct ieee80211_hw *hw, int queue)
 497{
 498        ieee80211_wake_queue_by_reason(hw, queue,
 499                                       IEEE80211_QUEUE_STOP_REASON_DRIVER,
 500                                       false);
 501}
 502EXPORT_SYMBOL(ieee80211_wake_queue);
 503
 504static void __ieee80211_stop_queue(struct ieee80211_hw *hw, int queue,
 505                                   enum queue_stop_reason reason,
 506                                   bool refcounted)
 507{
 508        struct ieee80211_local *local = hw_to_local(hw);
 509        struct ieee80211_sub_if_data *sdata;
 510        int n_acs = IEEE80211_NUM_ACS;
 511
 512        trace_stop_queue(local, queue, reason);
 513
 514        if (WARN_ON(queue >= hw->queues))
 515                return;
 516
 517        if (!refcounted)
 518                local->q_stop_reasons[queue][reason] = 1;
 519        else
 520                local->q_stop_reasons[queue][reason]++;
 521
 522        if (__test_and_set_bit(reason, &local->queue_stop_reasons[queue]))
 523                return;
 524
 525        if (local->hw.queues < IEEE80211_NUM_ACS)
 526                n_acs = 1;
 527
 528        rcu_read_lock();
 529        list_for_each_entry_rcu(sdata, &local->interfaces, list) {
 530                int ac;
 531
 532                if (!sdata->dev)
 533                        continue;
 534
 535                for (ac = 0; ac < n_acs; ac++) {
 536                        if (sdata->vif.hw_queue[ac] == queue ||
 537                            sdata->vif.cab_queue == queue) {
 538                                if (!local->ops->wake_tx_queue) {
 539                                        netif_stop_subqueue(sdata->dev, ac);
 540                                        continue;
 541                                }
 542                                spin_lock(&local->fq.lock);
 543                                sdata->vif.txqs_stopped[ac] = true;
 544                                spin_unlock(&local->fq.lock);
 545                        }
 546                }
 547        }
 548        rcu_read_unlock();
 549}
 550
 551void ieee80211_stop_queue_by_reason(struct ieee80211_hw *hw, int queue,
 552                                    enum queue_stop_reason reason,
 553                                    bool refcounted)
 554{
 555        struct ieee80211_local *local = hw_to_local(hw);
 556        unsigned long flags;
 557
 558        spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
 559        __ieee80211_stop_queue(hw, queue, reason, refcounted);
 560        spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
 561}
 562
 563void ieee80211_stop_queue(struct ieee80211_hw *hw, int queue)
 564{
 565        ieee80211_stop_queue_by_reason(hw, queue,
 566                                       IEEE80211_QUEUE_STOP_REASON_DRIVER,
 567                                       false);
 568}
 569EXPORT_SYMBOL(ieee80211_stop_queue);
 570
 571void ieee80211_add_pending_skb(struct ieee80211_local *local,
 572                               struct sk_buff *skb)
 573{
 574        struct ieee80211_hw *hw = &local->hw;
 575        unsigned long flags;
 576        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
 577        int queue = info->hw_queue;
 578
 579        if (WARN_ON(!info->control.vif)) {
 580                ieee80211_free_txskb(&local->hw, skb);
 581                return;
 582        }
 583
 584        spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
 585        __ieee80211_stop_queue(hw, queue, IEEE80211_QUEUE_STOP_REASON_SKB_ADD,
 586                               false);
 587        __skb_queue_tail(&local->pending[queue], skb);
 588        __ieee80211_wake_queue(hw, queue, IEEE80211_QUEUE_STOP_REASON_SKB_ADD,
 589                               false, &flags);
 590        spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
 591}
 592
 593void ieee80211_add_pending_skbs(struct ieee80211_local *local,
 594                                struct sk_buff_head *skbs)
 595{
 596        struct ieee80211_hw *hw = &local->hw;
 597        struct sk_buff *skb;
 598        unsigned long flags;
 599        int queue, i;
 600
 601        spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
 602        while ((skb = skb_dequeue(skbs))) {
 603                struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
 604
 605                if (WARN_ON(!info->control.vif)) {
 606                        ieee80211_free_txskb(&local->hw, skb);
 607                        continue;
 608                }
 609
 610                queue = info->hw_queue;
 611
 612                __ieee80211_stop_queue(hw, queue,
 613                                IEEE80211_QUEUE_STOP_REASON_SKB_ADD,
 614                                false);
 615
 616                __skb_queue_tail(&local->pending[queue], skb);
 617        }
 618
 619        for (i = 0; i < hw->queues; i++)
 620                __ieee80211_wake_queue(hw, i,
 621                        IEEE80211_QUEUE_STOP_REASON_SKB_ADD,
 622                        false, &flags);
 623        spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
 624}
 625
 626void ieee80211_stop_queues_by_reason(struct ieee80211_hw *hw,
 627                                     unsigned long queues,
 628                                     enum queue_stop_reason reason,
 629                                     bool refcounted)
 630{
 631        struct ieee80211_local *local = hw_to_local(hw);
 632        unsigned long flags;
 633        int i;
 634
 635        spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
 636
 637        for_each_set_bit(i, &queues, hw->queues)
 638                __ieee80211_stop_queue(hw, i, reason, refcounted);
 639
 640        spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
 641}
 642
 643void ieee80211_stop_queues(struct ieee80211_hw *hw)
 644{
 645        ieee80211_stop_queues_by_reason(hw, IEEE80211_MAX_QUEUE_MAP,
 646                                        IEEE80211_QUEUE_STOP_REASON_DRIVER,
 647                                        false);
 648}
 649EXPORT_SYMBOL(ieee80211_stop_queues);
 650
 651int ieee80211_queue_stopped(struct ieee80211_hw *hw, int queue)
 652{
 653        struct ieee80211_local *local = hw_to_local(hw);
 654        unsigned long flags;
 655        int ret;
 656
 657        if (WARN_ON(queue >= hw->queues))
 658                return true;
 659
 660        spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
 661        ret = test_bit(IEEE80211_QUEUE_STOP_REASON_DRIVER,
 662                       &local->queue_stop_reasons[queue]);
 663        spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
 664        return ret;
 665}
 666EXPORT_SYMBOL(ieee80211_queue_stopped);
 667
 668void ieee80211_wake_queues_by_reason(struct ieee80211_hw *hw,
 669                                     unsigned long queues,
 670                                     enum queue_stop_reason reason,
 671                                     bool refcounted)
 672{
 673        struct ieee80211_local *local = hw_to_local(hw);
 674        unsigned long flags;
 675        int i;
 676
 677        spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
 678
 679        for_each_set_bit(i, &queues, hw->queues)
 680                __ieee80211_wake_queue(hw, i, reason, refcounted, &flags);
 681
 682        spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
 683}
 684
 685void ieee80211_wake_queues(struct ieee80211_hw *hw)
 686{
 687        ieee80211_wake_queues_by_reason(hw, IEEE80211_MAX_QUEUE_MAP,
 688                                        IEEE80211_QUEUE_STOP_REASON_DRIVER,
 689                                        false);
 690}
 691EXPORT_SYMBOL(ieee80211_wake_queues);
 692
 693static unsigned int
 694ieee80211_get_vif_queues(struct ieee80211_local *local,
 695                         struct ieee80211_sub_if_data *sdata)
 696{
 697        unsigned int queues;
 698
 699        if (sdata && ieee80211_hw_check(&local->hw, QUEUE_CONTROL)) {
 700                int ac;
 701
 702                queues = 0;
 703
 704                for (ac = 0; ac < IEEE80211_NUM_ACS; ac++)
 705                        queues |= BIT(sdata->vif.hw_queue[ac]);
 706                if (sdata->vif.cab_queue != IEEE80211_INVAL_HW_QUEUE)
 707                        queues |= BIT(sdata->vif.cab_queue);
 708        } else {
 709                /* all queues */
 710                queues = BIT(local->hw.queues) - 1;
 711        }
 712
 713        return queues;
 714}
 715
 716void __ieee80211_flush_queues(struct ieee80211_local *local,
 717                              struct ieee80211_sub_if_data *sdata,
 718                              unsigned int queues, bool drop)
 719{
 720        if (!local->ops->flush)
 721                return;
 722
 723        /*
 724         * If no queue was set, or if the HW doesn't support
 725         * IEEE80211_HW_QUEUE_CONTROL - flush all queues
 726         */
 727        if (!queues || !ieee80211_hw_check(&local->hw, QUEUE_CONTROL))
 728                queues = ieee80211_get_vif_queues(local, sdata);
 729
 730        ieee80211_stop_queues_by_reason(&local->hw, queues,
 731                                        IEEE80211_QUEUE_STOP_REASON_FLUSH,
 732                                        false);
 733
 734        drv_flush(local, sdata, queues, drop);
 735
 736        ieee80211_wake_queues_by_reason(&local->hw, queues,
 737                                        IEEE80211_QUEUE_STOP_REASON_FLUSH,
 738                                        false);
 739}
 740
 741void ieee80211_flush_queues(struct ieee80211_local *local,
 742                            struct ieee80211_sub_if_data *sdata, bool drop)
 743{
 744        __ieee80211_flush_queues(local, sdata, 0, drop);
 745}
 746
 747void ieee80211_stop_vif_queues(struct ieee80211_local *local,
 748                               struct ieee80211_sub_if_data *sdata,
 749                               enum queue_stop_reason reason)
 750{
 751        ieee80211_stop_queues_by_reason(&local->hw,
 752                                        ieee80211_get_vif_queues(local, sdata),
 753                                        reason, true);
 754}
 755
 756void ieee80211_wake_vif_queues(struct ieee80211_local *local,
 757                               struct ieee80211_sub_if_data *sdata,
 758                               enum queue_stop_reason reason)
 759{
 760        ieee80211_wake_queues_by_reason(&local->hw,
 761                                        ieee80211_get_vif_queues(local, sdata),
 762                                        reason, true);
 763}
 764
 765static void __iterate_interfaces(struct ieee80211_local *local,
 766                                 u32 iter_flags,
 767                                 void (*iterator)(void *data, u8 *mac,
 768                                                  struct ieee80211_vif *vif),
 769                                 void *data)
 770{
 771        struct ieee80211_sub_if_data *sdata;
 772        bool active_only = iter_flags & IEEE80211_IFACE_ITER_ACTIVE;
 773
 774        list_for_each_entry_rcu(sdata, &local->interfaces, list) {
 775                switch (sdata->vif.type) {
 776                case NL80211_IFTYPE_MONITOR:
 777                        if (!(sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE))
 778                                continue;
 779                        break;
 780                case NL80211_IFTYPE_AP_VLAN:
 781                        continue;
 782                default:
 783                        break;
 784                }
 785                if (!(iter_flags & IEEE80211_IFACE_ITER_RESUME_ALL) &&
 786                    active_only && !(sdata->flags & IEEE80211_SDATA_IN_DRIVER))
 787                        continue;
 788                if ((iter_flags & IEEE80211_IFACE_SKIP_SDATA_NOT_IN_DRIVER) &&
 789                    !(sdata->flags & IEEE80211_SDATA_IN_DRIVER))
 790                        continue;
 791                if (ieee80211_sdata_running(sdata) || !active_only)
 792                        iterator(data, sdata->vif.addr,
 793                                 &sdata->vif);
 794        }
 795
 796        sdata = rcu_dereference_check(local->monitor_sdata,
 797                                      lockdep_is_held(&local->iflist_mtx) ||
 798                                      lockdep_rtnl_is_held());
 799        if (sdata &&
 800            (iter_flags & IEEE80211_IFACE_ITER_RESUME_ALL || !active_only ||
 801             sdata->flags & IEEE80211_SDATA_IN_DRIVER))
 802                iterator(data, sdata->vif.addr, &sdata->vif);
 803}
 804
 805void ieee80211_iterate_interfaces(
 806        struct ieee80211_hw *hw, u32 iter_flags,
 807        void (*iterator)(void *data, u8 *mac,
 808                         struct ieee80211_vif *vif),
 809        void *data)
 810{
 811        struct ieee80211_local *local = hw_to_local(hw);
 812
 813        mutex_lock(&local->iflist_mtx);
 814        __iterate_interfaces(local, iter_flags, iterator, data);
 815        mutex_unlock(&local->iflist_mtx);
 816}
 817EXPORT_SYMBOL_GPL(ieee80211_iterate_interfaces);
 818
 819void ieee80211_iterate_active_interfaces_atomic(
 820        struct ieee80211_hw *hw, u32 iter_flags,
 821        void (*iterator)(void *data, u8 *mac,
 822                         struct ieee80211_vif *vif),
 823        void *data)
 824{
 825        struct ieee80211_local *local = hw_to_local(hw);
 826
 827        rcu_read_lock();
 828        __iterate_interfaces(local, iter_flags | IEEE80211_IFACE_ITER_ACTIVE,
 829                             iterator, data);
 830        rcu_read_unlock();
 831}
 832EXPORT_SYMBOL_GPL(ieee80211_iterate_active_interfaces_atomic);
 833
 834void ieee80211_iterate_active_interfaces_rtnl(
 835        struct ieee80211_hw *hw, u32 iter_flags,
 836        void (*iterator)(void *data, u8 *mac,
 837                         struct ieee80211_vif *vif),
 838        void *data)
 839{
 840        struct ieee80211_local *local = hw_to_local(hw);
 841
 842        ASSERT_RTNL();
 843
 844        __iterate_interfaces(local, iter_flags | IEEE80211_IFACE_ITER_ACTIVE,
 845                             iterator, data);
 846}
 847EXPORT_SYMBOL_GPL(ieee80211_iterate_active_interfaces_rtnl);
 848
 849static void __iterate_stations(struct ieee80211_local *local,
 850                               void (*iterator)(void *data,
 851                                                struct ieee80211_sta *sta),
 852                               void *data)
 853{
 854        struct sta_info *sta;
 855
 856        list_for_each_entry_rcu(sta, &local->sta_list, list) {
 857                if (!sta->uploaded)
 858                        continue;
 859
 860                iterator(data, &sta->sta);
 861        }
 862}
 863
 864void ieee80211_iterate_stations_atomic(struct ieee80211_hw *hw,
 865                        void (*iterator)(void *data,
 866                                         struct ieee80211_sta *sta),
 867                        void *data)
 868{
 869        struct ieee80211_local *local = hw_to_local(hw);
 870
 871        rcu_read_lock();
 872        __iterate_stations(local, iterator, data);
 873        rcu_read_unlock();
 874}
 875EXPORT_SYMBOL_GPL(ieee80211_iterate_stations_atomic);
 876
 877struct ieee80211_vif *wdev_to_ieee80211_vif(struct wireless_dev *wdev)
 878{
 879        struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
 880
 881        if (!ieee80211_sdata_running(sdata) ||
 882            !(sdata->flags & IEEE80211_SDATA_IN_DRIVER))
 883                return NULL;
 884        return &sdata->vif;
 885}
 886EXPORT_SYMBOL_GPL(wdev_to_ieee80211_vif);
 887
 888struct wireless_dev *ieee80211_vif_to_wdev(struct ieee80211_vif *vif)
 889{
 890        struct ieee80211_sub_if_data *sdata;
 891
 892        if (!vif)
 893                return NULL;
 894
 895        sdata = vif_to_sdata(vif);
 896
 897        if (!ieee80211_sdata_running(sdata) ||
 898            !(sdata->flags & IEEE80211_SDATA_IN_DRIVER))
 899                return NULL;
 900
 901        return &sdata->wdev;
 902}
 903EXPORT_SYMBOL_GPL(ieee80211_vif_to_wdev);
 904
 905/*
 906 * Nothing should have been stuffed into the workqueue during
 907 * the suspend->resume cycle. Since we can't check each caller
 908 * of this function if we are already quiescing / suspended,
 909 * check here and don't WARN since this can actually happen when
 910 * the rx path (for example) is racing against __ieee80211_suspend
 911 * and suspending / quiescing was set after the rx path checked
 912 * them.
 913 */
 914static bool ieee80211_can_queue_work(struct ieee80211_local *local)
 915{
 916        if (local->quiescing || (local->suspended && !local->resuming)) {
 917                pr_warn("queueing ieee80211 work while going to suspend\n");
 918                return false;
 919        }
 920
 921        return true;
 922}
 923
 924void ieee80211_queue_work(struct ieee80211_hw *hw, struct work_struct *work)
 925{
 926        struct ieee80211_local *local = hw_to_local(hw);
 927
 928        if (!ieee80211_can_queue_work(local))
 929                return;
 930
 931        queue_work(local->workqueue, work);
 932}
 933EXPORT_SYMBOL(ieee80211_queue_work);
 934
 935void ieee80211_queue_delayed_work(struct ieee80211_hw *hw,
 936                                  struct delayed_work *dwork,
 937                                  unsigned long delay)
 938{
 939        struct ieee80211_local *local = hw_to_local(hw);
 940
 941        if (!ieee80211_can_queue_work(local))
 942                return;
 943
 944        queue_delayed_work(local->workqueue, dwork, delay);
 945}
 946EXPORT_SYMBOL(ieee80211_queue_delayed_work);
 947
 948static void ieee80211_parse_extension_element(u32 *crc,
 949                                              const struct element *elem,
 950                                              struct ieee802_11_elems *elems)
 951{
 952        const void *data = elem->data + 1;
 953        u8 len = elem->datalen - 1;
 954
 955        switch (elem->data[0]) {
 956        case WLAN_EID_EXT_HE_MU_EDCA:
 957                if (len == sizeof(*elems->mu_edca_param_set)) {
 958                        elems->mu_edca_param_set = data;
 959                        if (crc)
 960                                *crc = crc32_be(*crc, (void *)elem,
 961                                                elem->datalen + 2);
 962                }
 963                break;
 964        case WLAN_EID_EXT_HE_CAPABILITY:
 965                elems->he_cap = data;
 966                elems->he_cap_len = len;
 967                break;
 968        case WLAN_EID_EXT_HE_OPERATION:
 969                if (len >= sizeof(*elems->he_operation) &&
 970                    len == ieee80211_he_oper_size(data) - 1) {
 971                        if (crc)
 972                                *crc = crc32_be(*crc, (void *)elem,
 973                                                elem->datalen + 2);
 974                        elems->he_operation = data;
 975                }
 976                break;
 977        case WLAN_EID_EXT_UORA:
 978                if (len == 1)
 979                        elems->uora_element = data;
 980                break;
 981        case WLAN_EID_EXT_MAX_CHANNEL_SWITCH_TIME:
 982                if (len == 3)
 983                        elems->max_channel_switch_time = data;
 984                break;
 985        case WLAN_EID_EXT_MULTIPLE_BSSID_CONFIGURATION:
 986                if (len == sizeof(*elems->mbssid_config_ie))
 987                        elems->mbssid_config_ie = data;
 988                break;
 989        case WLAN_EID_EXT_HE_SPR:
 990                if (len >= sizeof(*elems->he_spr) &&
 991                    len >= ieee80211_he_spr_size(data))
 992                        elems->he_spr = data;
 993                break;
 994        case WLAN_EID_EXT_HE_6GHZ_CAPA:
 995                if (len == sizeof(*elems->he_6ghz_capa))
 996                        elems->he_6ghz_capa = data;
 997                break;
 998        }
 999}
1000
1001static u32
1002_ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action,
1003                            struct ieee802_11_elems *elems,
1004                            u64 filter, u32 crc,
1005                            const struct element *check_inherit)
1006{
1007        const struct element *elem;
1008        bool calc_crc = filter != 0;
1009        DECLARE_BITMAP(seen_elems, 256);
1010        const u8 *ie;
1011
1012        bitmap_zero(seen_elems, 256);
1013
1014        for_each_element(elem, start, len) {
1015                bool elem_parse_failed;
1016                u8 id = elem->id;
1017                u8 elen = elem->datalen;
1018                const u8 *pos = elem->data;
1019
1020                if (check_inherit &&
1021                    !cfg80211_is_element_inherited(elem,
1022                                                   check_inherit))
1023                        continue;
1024
1025                switch (id) {
1026                case WLAN_EID_SSID:
1027                case WLAN_EID_SUPP_RATES:
1028                case WLAN_EID_FH_PARAMS:
1029                case WLAN_EID_DS_PARAMS:
1030                case WLAN_EID_CF_PARAMS:
1031                case WLAN_EID_TIM:
1032                case WLAN_EID_IBSS_PARAMS:
1033                case WLAN_EID_CHALLENGE:
1034                case WLAN_EID_RSN:
1035                case WLAN_EID_ERP_INFO:
1036                case WLAN_EID_EXT_SUPP_RATES:
1037                case WLAN_EID_HT_CAPABILITY:
1038                case WLAN_EID_HT_OPERATION:
1039                case WLAN_EID_VHT_CAPABILITY:
1040                case WLAN_EID_VHT_OPERATION:
1041                case WLAN_EID_MESH_ID:
1042                case WLAN_EID_MESH_CONFIG:
1043                case WLAN_EID_PEER_MGMT:
1044                case WLAN_EID_PREQ:
1045                case WLAN_EID_PREP:
1046                case WLAN_EID_PERR:
1047                case WLAN_EID_RANN:
1048                case WLAN_EID_CHANNEL_SWITCH:
1049                case WLAN_EID_EXT_CHANSWITCH_ANN:
1050                case WLAN_EID_COUNTRY:
1051                case WLAN_EID_PWR_CONSTRAINT:
1052                case WLAN_EID_TIMEOUT_INTERVAL:
1053                case WLAN_EID_SECONDARY_CHANNEL_OFFSET:
1054                case WLAN_EID_WIDE_BW_CHANNEL_SWITCH:
1055                case WLAN_EID_CHAN_SWITCH_PARAM:
1056                case WLAN_EID_EXT_CAPABILITY:
1057                case WLAN_EID_CHAN_SWITCH_TIMING:
1058                case WLAN_EID_LINK_ID:
1059                case WLAN_EID_BSS_MAX_IDLE_PERIOD:
1060                case WLAN_EID_RSNX:
1061                case WLAN_EID_S1G_BCN_COMPAT:
1062                case WLAN_EID_S1G_CAPABILITIES:
1063                case WLAN_EID_S1G_OPERATION:
1064                case WLAN_EID_AID_RESPONSE:
1065                case WLAN_EID_S1G_SHORT_BCN_INTERVAL:
1066                /*
1067                 * not listing WLAN_EID_CHANNEL_SWITCH_WRAPPER -- it seems possible
1068                 * that if the content gets bigger it might be needed more than once
1069                 */
1070                        if (test_bit(id, seen_elems)) {
1071                                elems->parse_error = true;
1072                                continue;
1073                        }
1074                        break;
1075                }
1076
1077                if (calc_crc && id < 64 && (filter & (1ULL << id)))
1078                        crc = crc32_be(crc, pos - 2, elen + 2);
1079
1080                elem_parse_failed = false;
1081
1082                switch (id) {
1083                case WLAN_EID_LINK_ID:
1084                        if (elen + 2 != sizeof(struct ieee80211_tdls_lnkie)) {
1085                                elem_parse_failed = true;
1086                                break;
1087                        }
1088                        elems->lnk_id = (void *)(pos - 2);
1089                        break;
1090                case WLAN_EID_CHAN_SWITCH_TIMING:
1091                        if (elen != sizeof(struct ieee80211_ch_switch_timing)) {
1092                                elem_parse_failed = true;
1093                                break;
1094                        }
1095                        elems->ch_sw_timing = (void *)pos;
1096                        break;
1097                case WLAN_EID_EXT_CAPABILITY:
1098                        elems->ext_capab = pos;
1099                        elems->ext_capab_len = elen;
1100                        break;
1101                case WLAN_EID_SSID:
1102                        elems->ssid = pos;
1103                        elems->ssid_len = elen;
1104                        break;
1105                case WLAN_EID_SUPP_RATES:
1106                        elems->supp_rates = pos;
1107                        elems->supp_rates_len = elen;
1108                        break;
1109                case WLAN_EID_DS_PARAMS:
1110                        if (elen >= 1)
1111                                elems->ds_params = pos;
1112                        else
1113                                elem_parse_failed = true;
1114                        break;
1115                case WLAN_EID_TIM:
1116                        if (elen >= sizeof(struct ieee80211_tim_ie)) {
1117                                elems->tim = (void *)pos;
1118                                elems->tim_len = elen;
1119                        } else
1120                                elem_parse_failed = true;
1121                        break;
1122                case WLAN_EID_CHALLENGE:
1123                        elems->challenge = pos;
1124                        elems->challenge_len = elen;
1125                        break;
1126                case WLAN_EID_VENDOR_SPECIFIC:
1127                        if (elen >= 4 && pos[0] == 0x00 && pos[1] == 0x50 &&
1128                            pos[2] == 0xf2) {
1129                                /* Microsoft OUI (00:50:F2) */
1130
1131                                if (calc_crc)
1132                                        crc = crc32_be(crc, pos - 2, elen + 2);
1133
1134                                if (elen >= 5 && pos[3] == 2) {
1135                                        /* OUI Type 2 - WMM IE */
1136                                        if (pos[4] == 0) {
1137                                                elems->wmm_info = pos;
1138                                                elems->wmm_info_len = elen;
1139                                        } else if (pos[4] == 1) {
1140                                                elems->wmm_param = pos;
1141                                                elems->wmm_param_len = elen;
1142                                        }
1143                                }
1144                        }
1145                        break;
1146                case WLAN_EID_RSN:
1147                        elems->rsn = pos;
1148                        elems->rsn_len = elen;
1149                        break;
1150                case WLAN_EID_ERP_INFO:
1151                        if (elen >= 1)
1152                                elems->erp_info = pos;
1153                        else
1154                                elem_parse_failed = true;
1155                        break;
1156                case WLAN_EID_EXT_SUPP_RATES:
1157                        elems->ext_supp_rates = pos;
1158                        elems->ext_supp_rates_len = elen;
1159                        break;
1160                case WLAN_EID_HT_CAPABILITY:
1161                        if (elen >= sizeof(struct ieee80211_ht_cap))
1162                                elems->ht_cap_elem = (void *)pos;
1163                        else
1164                                elem_parse_failed = true;
1165                        break;
1166                case WLAN_EID_HT_OPERATION:
1167                        if (elen >= sizeof(struct ieee80211_ht_operation))
1168                                elems->ht_operation = (void *)pos;
1169                        else
1170                                elem_parse_failed = true;
1171                        break;
1172                case WLAN_EID_VHT_CAPABILITY:
1173                        if (elen >= sizeof(struct ieee80211_vht_cap))
1174                                elems->vht_cap_elem = (void *)pos;
1175                        else
1176                                elem_parse_failed = true;
1177                        break;
1178                case WLAN_EID_VHT_OPERATION:
1179                        if (elen >= sizeof(struct ieee80211_vht_operation)) {
1180                                elems->vht_operation = (void *)pos;
1181                                if (calc_crc)
1182                                        crc = crc32_be(crc, pos - 2, elen + 2);
1183                                break;
1184                        }
1185                        elem_parse_failed = true;
1186                        break;
1187                case WLAN_EID_OPMODE_NOTIF:
1188                        if (elen > 0) {
1189                                elems->opmode_notif = pos;
1190                                if (calc_crc)
1191                                        crc = crc32_be(crc, pos - 2, elen + 2);
1192                                break;
1193                        }
1194                        elem_parse_failed = true;
1195                        break;
1196                case WLAN_EID_MESH_ID:
1197                        elems->mesh_id = pos;
1198                        elems->mesh_id_len = elen;
1199                        break;
1200                case WLAN_EID_MESH_CONFIG:
1201                        if (elen >= sizeof(struct ieee80211_meshconf_ie))
1202                                elems->mesh_config = (void *)pos;
1203                        else
1204                                elem_parse_failed = true;
1205                        break;
1206                case WLAN_EID_PEER_MGMT:
1207                        elems->peering = pos;
1208                        elems->peering_len = elen;
1209                        break;
1210                case WLAN_EID_MESH_AWAKE_WINDOW:
1211                        if (elen >= 2)
1212                                elems->awake_window = (void *)pos;
1213                        break;
1214                case WLAN_EID_PREQ:
1215                        elems->preq = pos;
1216                        elems->preq_len = elen;
1217                        break;
1218                case WLAN_EID_PREP:
1219                        elems->prep = pos;
1220                        elems->prep_len = elen;
1221                        break;
1222                case WLAN_EID_PERR:
1223                        elems->perr = pos;
1224                        elems->perr_len = elen;
1225                        break;
1226                case WLAN_EID_RANN:
1227                        if (elen >= sizeof(struct ieee80211_rann_ie))
1228                                elems->rann = (void *)pos;
1229                        else
1230                                elem_parse_failed = true;
1231                        break;
1232                case WLAN_EID_CHANNEL_SWITCH:
1233                        if (elen != sizeof(struct ieee80211_channel_sw_ie)) {
1234                                elem_parse_failed = true;
1235                                break;
1236                        }
1237                        elems->ch_switch_ie = (void *)pos;
1238                        break;
1239                case WLAN_EID_EXT_CHANSWITCH_ANN:
1240                        if (elen != sizeof(struct ieee80211_ext_chansw_ie)) {
1241                                elem_parse_failed = true;
1242                                break;
1243                        }
1244                        elems->ext_chansw_ie = (void *)pos;
1245                        break;
1246                case WLAN_EID_SECONDARY_CHANNEL_OFFSET:
1247                        if (elen != sizeof(struct ieee80211_sec_chan_offs_ie)) {
1248                                elem_parse_failed = true;
1249                                break;
1250                        }
1251                        elems->sec_chan_offs = (void *)pos;
1252                        break;
1253                case WLAN_EID_CHAN_SWITCH_PARAM:
1254                        if (elen !=
1255                            sizeof(*elems->mesh_chansw_params_ie)) {
1256                                elem_parse_failed = true;
1257                                break;
1258                        }
1259                        elems->mesh_chansw_params_ie = (void *)pos;
1260                        break;
1261                case WLAN_EID_WIDE_BW_CHANNEL_SWITCH:
1262                        if (!action ||
1263                            elen != sizeof(*elems->wide_bw_chansw_ie)) {
1264                                elem_parse_failed = true;
1265                                break;
1266                        }
1267                        elems->wide_bw_chansw_ie = (void *)pos;
1268                        break;
1269                case WLAN_EID_CHANNEL_SWITCH_WRAPPER:
1270                        if (action) {
1271                                elem_parse_failed = true;
1272                                break;
1273                        }
1274                        /*
1275                         * This is a bit tricky, but as we only care about
1276                         * the wide bandwidth channel switch element, so
1277                         * just parse it out manually.
1278                         */
1279                        ie = cfg80211_find_ie(WLAN_EID_WIDE_BW_CHANNEL_SWITCH,
1280                                              pos, elen);
1281                        if (ie) {
1282                                if (ie[1] == sizeof(*elems->wide_bw_chansw_ie))
1283                                        elems->wide_bw_chansw_ie =
1284                                                (void *)(ie + 2);
1285                                else
1286                                        elem_parse_failed = true;
1287                        }
1288                        break;
1289                case WLAN_EID_COUNTRY:
1290                        elems->country_elem = pos;
1291                        elems->country_elem_len = elen;
1292                        break;
1293                case WLAN_EID_PWR_CONSTRAINT:
1294                        if (elen != 1) {
1295                                elem_parse_failed = true;
1296                                break;
1297                        }
1298                        elems->pwr_constr_elem = pos;
1299                        break;
1300                case WLAN_EID_CISCO_VENDOR_SPECIFIC:
1301                        /* Lots of different options exist, but we only care
1302                         * about the Dynamic Transmit Power Control element.
1303                         * First check for the Cisco OUI, then for the DTPC
1304                         * tag (0x00).
1305                         */
1306                        if (elen < 4) {
1307                                elem_parse_failed = true;
1308                                break;
1309                        }
1310
1311                        if (pos[0] != 0x00 || pos[1] != 0x40 ||
1312                            pos[2] != 0x96 || pos[3] != 0x00)
1313                                break;
1314
1315                        if (elen != 6) {
1316                                elem_parse_failed = true;
1317                                break;
1318                        }
1319
1320                        if (calc_crc)
1321                                crc = crc32_be(crc, pos - 2, elen + 2);
1322
1323                        elems->cisco_dtpc_elem = pos;
1324                        break;
1325                case WLAN_EID_ADDBA_EXT:
1326                        if (elen != sizeof(struct ieee80211_addba_ext_ie)) {
1327                                elem_parse_failed = true;
1328                                break;
1329                        }
1330                        elems->addba_ext_ie = (void *)pos;
1331                        break;
1332                case WLAN_EID_TIMEOUT_INTERVAL:
1333                        if (elen >= sizeof(struct ieee80211_timeout_interval_ie))
1334                                elems->timeout_int = (void *)pos;
1335                        else
1336                                elem_parse_failed = true;
1337                        break;
1338                case WLAN_EID_BSS_MAX_IDLE_PERIOD:
1339                        if (elen >= sizeof(*elems->max_idle_period_ie))
1340                                elems->max_idle_period_ie = (void *)pos;
1341                        break;
1342                case WLAN_EID_RSNX:
1343                        elems->rsnx = pos;
1344                        elems->rsnx_len = elen;
1345                        break;
1346                case WLAN_EID_EXTENSION:
1347                        ieee80211_parse_extension_element(calc_crc ?
1348                                                                &crc : NULL,
1349                                                          elem, elems);
1350                        break;
1351                case WLAN_EID_S1G_CAPABILITIES:
1352                        if (elen == sizeof(*elems->s1g_capab))
1353                                elems->s1g_capab = (void *)pos;
1354                        else
1355                                elem_parse_failed = true;
1356                        break;
1357                case WLAN_EID_S1G_OPERATION:
1358                        if (elen == sizeof(*elems->s1g_oper))
1359                                elems->s1g_oper = (void *)pos;
1360                        else
1361                                elem_parse_failed = true;
1362                        break;
1363                case WLAN_EID_S1G_BCN_COMPAT:
1364                        if (elen == sizeof(*elems->s1g_bcn_compat))
1365                                elems->s1g_bcn_compat = (void *)pos;
1366                        else
1367                                elem_parse_failed = true;
1368                        break;
1369                case WLAN_EID_AID_RESPONSE:
1370                        if (elen == sizeof(struct ieee80211_aid_response_ie))
1371                                elems->aid_resp = (void *)pos;
1372                        else
1373                                elem_parse_failed = true;
1374                        break;
1375                default:
1376                        break;
1377                }
1378
1379                if (elem_parse_failed)
1380                        elems->parse_error = true;
1381                else
1382                        __set_bit(id, seen_elems);
1383        }
1384
1385        if (!for_each_element_completed(elem, start, len))
1386                elems->parse_error = true;
1387
1388        return crc;
1389}
1390
1391static size_t ieee802_11_find_bssid_profile(const u8 *start, size_t len,
1392                                            struct ieee802_11_elems *elems,
1393                                            u8 *transmitter_bssid,
1394                                            u8 *bss_bssid,
1395                                            u8 *nontransmitted_profile)
1396{
1397        const struct element *elem, *sub;
1398        size_t profile_len = 0;
1399        bool found = false;
1400
1401        if (!bss_bssid || !transmitter_bssid)
1402                return profile_len;
1403
1404        for_each_element_id(elem, WLAN_EID_MULTIPLE_BSSID, start, len) {
1405                if (elem->datalen < 2)
1406                        continue;
1407
1408                for_each_element(sub, elem->data + 1, elem->datalen - 1) {
1409                        u8 new_bssid[ETH_ALEN];
1410                        const u8 *index;
1411
1412                        if (sub->id != 0 || sub->datalen < 4) {
1413                                /* not a valid BSS profile */
1414                                continue;
1415                        }
1416
1417                        if (sub->data[0] != WLAN_EID_NON_TX_BSSID_CAP ||
1418                            sub->data[1] != 2) {
1419                                /* The first element of the
1420                                 * Nontransmitted BSSID Profile is not
1421                                 * the Nontransmitted BSSID Capability
1422                                 * element.
1423                                 */
1424                                continue;
1425                        }
1426
1427                        memset(nontransmitted_profile, 0, len);
1428                        profile_len = cfg80211_merge_profile(start, len,
1429                                                             elem,
1430                                                             sub,
1431                                                             nontransmitted_profile,
1432                                                             len);
1433
1434                        /* found a Nontransmitted BSSID Profile */
1435                        index = cfg80211_find_ie(WLAN_EID_MULTI_BSSID_IDX,
1436                                                 nontransmitted_profile,
1437                                                 profile_len);
1438                        if (!index || index[1] < 1 || index[2] == 0) {
1439                                /* Invalid MBSSID Index element */
1440                                continue;
1441                        }
1442
1443                        cfg80211_gen_new_bssid(transmitter_bssid,
1444                                               elem->data[0],
1445                                               index[2],
1446                                               new_bssid);
1447                        if (ether_addr_equal(new_bssid, bss_bssid)) {
1448                                found = true;
1449                                elems->bssid_index_len = index[1];
1450                                elems->bssid_index = (void *)&index[2];
1451                                break;
1452                        }
1453                }
1454        }
1455
1456        return found ? profile_len : 0;
1457}
1458
1459u32 ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action,
1460                               struct ieee802_11_elems *elems,
1461                               u64 filter, u32 crc, u8 *transmitter_bssid,
1462                               u8 *bss_bssid)
1463{
1464        const struct element *non_inherit = NULL;
1465        u8 *nontransmitted_profile;
1466        int nontransmitted_profile_len = 0;
1467
1468        memset(elems, 0, sizeof(*elems));
1469        elems->ie_start = start;
1470        elems->total_len = len;
1471
1472        nontransmitted_profile = kmalloc(len, GFP_ATOMIC);
1473        if (nontransmitted_profile) {
1474                nontransmitted_profile_len =
1475                        ieee802_11_find_bssid_profile(start, len, elems,
1476                                                      transmitter_bssid,
1477                                                      bss_bssid,
1478                                                      nontransmitted_profile);
1479                non_inherit =
1480                        cfg80211_find_ext_elem(WLAN_EID_EXT_NON_INHERITANCE,
1481                                               nontransmitted_profile,
1482                                               nontransmitted_profile_len);
1483        }
1484
1485        crc = _ieee802_11_parse_elems_crc(start, len, action, elems, filter,
1486                                          crc, non_inherit);
1487
1488        /* Override with nontransmitted profile, if found */
1489        if (nontransmitted_profile_len)
1490                _ieee802_11_parse_elems_crc(nontransmitted_profile,
1491                                            nontransmitted_profile_len,
1492                                            action, elems, 0, 0, NULL);
1493
1494        if (elems->tim && !elems->parse_error) {
1495                const struct ieee80211_tim_ie *tim_ie = elems->tim;
1496
1497                elems->dtim_period = tim_ie->dtim_period;
1498                elems->dtim_count = tim_ie->dtim_count;
1499        }
1500
1501        /* Override DTIM period and count if needed */
1502        if (elems->bssid_index &&
1503            elems->bssid_index_len >=
1504            offsetofend(struct ieee80211_bssid_index, dtim_period))
1505                elems->dtim_period = elems->bssid_index->dtim_period;
1506
1507        if (elems->bssid_index &&
1508            elems->bssid_index_len >=
1509            offsetofend(struct ieee80211_bssid_index, dtim_count))
1510                elems->dtim_count = elems->bssid_index->dtim_count;
1511
1512        kfree(nontransmitted_profile);
1513
1514        return crc;
1515}
1516
1517void ieee80211_regulatory_limit_wmm_params(struct ieee80211_sub_if_data *sdata,
1518                                           struct ieee80211_tx_queue_params
1519                                           *qparam, int ac)
1520{
1521        struct ieee80211_chanctx_conf *chanctx_conf;
1522        const struct ieee80211_reg_rule *rrule;
1523        const struct ieee80211_wmm_ac *wmm_ac;
1524        u16 center_freq = 0;
1525
1526        if (sdata->vif.type != NL80211_IFTYPE_AP &&
1527            sdata->vif.type != NL80211_IFTYPE_STATION)
1528                return;
1529
1530        rcu_read_lock();
1531        chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
1532        if (chanctx_conf)
1533                center_freq = chanctx_conf->def.chan->center_freq;
1534
1535        if (!center_freq) {
1536                rcu_read_unlock();
1537                return;
1538        }
1539
1540        rrule = freq_reg_info(sdata->wdev.wiphy, MHZ_TO_KHZ(center_freq));
1541
1542        if (IS_ERR_OR_NULL(rrule) || !rrule->has_wmm) {
1543                rcu_read_unlock();
1544                return;
1545        }
1546
1547        if (sdata->vif.type == NL80211_IFTYPE_AP)
1548                wmm_ac = &rrule->wmm_rule.ap[ac];
1549        else
1550                wmm_ac = &rrule->wmm_rule.client[ac];
1551        qparam->cw_min = max_t(u16, qparam->cw_min, wmm_ac->cw_min);
1552        qparam->cw_max = max_t(u16, qparam->cw_max, wmm_ac->cw_max);
1553        qparam->aifs = max_t(u8, qparam->aifs, wmm_ac->aifsn);
1554        qparam->txop = min_t(u16, qparam->txop, wmm_ac->cot / 32);
1555        rcu_read_unlock();
1556}
1557
1558void ieee80211_set_wmm_default(struct ieee80211_sub_if_data *sdata,
1559                               bool bss_notify, bool enable_qos)
1560{
1561        struct ieee80211_local *local = sdata->local;
1562        struct ieee80211_tx_queue_params qparam;
1563        struct ieee80211_chanctx_conf *chanctx_conf;
1564        int ac;
1565        bool use_11b;
1566        bool is_ocb; /* Use another EDCA parameters if dot11OCBActivated=true */
1567        int aCWmin, aCWmax;
1568
1569        if (!local->ops->conf_tx)
1570                return;
1571
1572        if (local->hw.queues < IEEE80211_NUM_ACS)
1573                return;
1574
1575        memset(&qparam, 0, sizeof(qparam));
1576
1577        rcu_read_lock();
1578        chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
1579        use_11b = (chanctx_conf &&
1580                   chanctx_conf->def.chan->band == NL80211_BAND_2GHZ) &&
1581                 !(sdata->flags & IEEE80211_SDATA_OPERATING_GMODE);
1582        rcu_read_unlock();
1583
1584        is_ocb = (sdata->vif.type == NL80211_IFTYPE_OCB);
1585
1586        /* Set defaults according to 802.11-2007 Table 7-37 */
1587        aCWmax = 1023;
1588        if (use_11b)
1589                aCWmin = 31;
1590        else
1591                aCWmin = 15;
1592
1593        /* Confiure old 802.11b/g medium access rules. */
1594        qparam.cw_max = aCWmax;
1595        qparam.cw_min = aCWmin;
1596        qparam.txop = 0;
1597        qparam.aifs = 2;
1598
1599        for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
1600                /* Update if QoS is enabled. */
1601                if (enable_qos) {
1602                        switch (ac) {
1603                        case IEEE80211_AC_BK:
1604                                qparam.cw_max = aCWmax;
1605                                qparam.cw_min = aCWmin;
1606                                qparam.txop = 0;
1607                                if (is_ocb)
1608                                        qparam.aifs = 9;
1609                                else
1610                                        qparam.aifs = 7;
1611                                break;
1612                        /* never happens but let's not leave undefined */
1613                        default:
1614                        case IEEE80211_AC_BE:
1615                                qparam.cw_max = aCWmax;
1616                                qparam.cw_min = aCWmin;
1617                                qparam.txop = 0;
1618                                if (is_ocb)
1619                                        qparam.aifs = 6;
1620                                else
1621                                        qparam.aifs = 3;
1622                                break;
1623                        case IEEE80211_AC_VI:
1624                                qparam.cw_max = aCWmin;
1625                                qparam.cw_min = (aCWmin + 1) / 2 - 1;
1626                                if (is_ocb)
1627                                        qparam.txop = 0;
1628                                else if (use_11b)
1629                                        qparam.txop = 6016/32;
1630                                else
1631                                        qparam.txop = 3008/32;
1632
1633                                if (is_ocb)
1634                                        qparam.aifs = 3;
1635                                else
1636                                        qparam.aifs = 2;
1637                                break;
1638                        case IEEE80211_AC_VO:
1639                                qparam.cw_max = (aCWmin + 1) / 2 - 1;
1640                                qparam.cw_min = (aCWmin + 1) / 4 - 1;
1641                                if (is_ocb)
1642                                        qparam.txop = 0;
1643                                else if (use_11b)
1644                                        qparam.txop = 3264/32;
1645                                else
1646                                        qparam.txop = 1504/32;
1647                                qparam.aifs = 2;
1648                                break;
1649                        }
1650                }
1651                ieee80211_regulatory_limit_wmm_params(sdata, &qparam, ac);
1652
1653                qparam.uapsd = false;
1654
1655                sdata->tx_conf[ac] = qparam;
1656                drv_conf_tx(local, sdata, ac, &qparam);
1657        }
1658
1659        if (sdata->vif.type != NL80211_IFTYPE_MONITOR &&
1660            sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE &&
1661            sdata->vif.type != NL80211_IFTYPE_NAN) {
1662                sdata->vif.bss_conf.qos = enable_qos;
1663                if (bss_notify)
1664                        ieee80211_bss_info_change_notify(sdata,
1665                                                         BSS_CHANGED_QOS);
1666        }
1667}
1668
1669void ieee80211_send_auth(struct ieee80211_sub_if_data *sdata,
1670                         u16 transaction, u16 auth_alg, u16 status,
1671                         const u8 *extra, size_t extra_len, const u8 *da,
1672                         const u8 *bssid, const u8 *key, u8 key_len, u8 key_idx,
1673                         u32 tx_flags)
1674{
1675        struct ieee80211_local *local = sdata->local;
1676        struct sk_buff *skb;
1677        struct ieee80211_mgmt *mgmt;
1678        int err;
1679
1680        /* 24 + 6 = header + auth_algo + auth_transaction + status_code */
1681        skb = dev_alloc_skb(local->hw.extra_tx_headroom + IEEE80211_WEP_IV_LEN +
1682                            24 + 6 + extra_len + IEEE80211_WEP_ICV_LEN);
1683        if (!skb)
1684                return;
1685
1686        skb_reserve(skb, local->hw.extra_tx_headroom + IEEE80211_WEP_IV_LEN);
1687
1688        mgmt = skb_put_zero(skb, 24 + 6);
1689        mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
1690                                          IEEE80211_STYPE_AUTH);
1691        memcpy(mgmt->da, da, ETH_ALEN);
1692        memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN);
1693        memcpy(mgmt->bssid, bssid, ETH_ALEN);
1694        mgmt->u.auth.auth_alg = cpu_to_le16(auth_alg);
1695        mgmt->u.auth.auth_transaction = cpu_to_le16(transaction);
1696        mgmt->u.auth.status_code = cpu_to_le16(status);
1697        if (extra)
1698                skb_put_data(skb, extra, extra_len);
1699
1700        if (auth_alg == WLAN_AUTH_SHARED_KEY && transaction == 3) {
1701                mgmt->frame_control |= cpu_to_le16(IEEE80211_FCTL_PROTECTED);
1702                err = ieee80211_wep_encrypt(local, skb, key, key_len, key_idx);
1703                WARN_ON(err);
1704        }
1705
1706        IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT |
1707                                        tx_flags;
1708        ieee80211_tx_skb(sdata, skb);
1709}
1710
1711void ieee80211_send_deauth_disassoc(struct ieee80211_sub_if_data *sdata,
1712                                    const u8 *da, const u8 *bssid,
1713                                    u16 stype, u16 reason,
1714                                    bool send_frame, u8 *frame_buf)
1715{
1716        struct ieee80211_local *local = sdata->local;
1717        struct sk_buff *skb;
1718        struct ieee80211_mgmt *mgmt = (void *)frame_buf;
1719
1720        /* build frame */
1721        mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | stype);
1722        mgmt->duration = 0; /* initialize only */
1723        mgmt->seq_ctrl = 0; /* initialize only */
1724        memcpy(mgmt->da, da, ETH_ALEN);
1725        memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN);
1726        memcpy(mgmt->bssid, bssid, ETH_ALEN);
1727        /* u.deauth.reason_code == u.disassoc.reason_code */
1728        mgmt->u.deauth.reason_code = cpu_to_le16(reason);
1729
1730        if (send_frame) {
1731                skb = dev_alloc_skb(local->hw.extra_tx_headroom +
1732                                    IEEE80211_DEAUTH_FRAME_LEN);
1733                if (!skb)
1734                        return;
1735
1736                skb_reserve(skb, local->hw.extra_tx_headroom);
1737
1738                /* copy in frame */
1739                skb_put_data(skb, mgmt, IEEE80211_DEAUTH_FRAME_LEN);
1740
1741                if (sdata->vif.type != NL80211_IFTYPE_STATION ||
1742                    !(sdata->u.mgd.flags & IEEE80211_STA_MFP_ENABLED))
1743                        IEEE80211_SKB_CB(skb)->flags |=
1744                                IEEE80211_TX_INTFL_DONT_ENCRYPT;
1745
1746                ieee80211_tx_skb(sdata, skb);
1747        }
1748}
1749
1750static u8 *ieee80211_write_he_6ghz_cap(u8 *pos, __le16 cap, u8 *end)
1751{
1752        if ((end - pos) < 5)
1753                return pos;
1754
1755        *pos++ = WLAN_EID_EXTENSION;
1756        *pos++ = 1 + sizeof(cap);
1757        *pos++ = WLAN_EID_EXT_HE_6GHZ_CAPA;
1758        memcpy(pos, &cap, sizeof(cap));
1759
1760        return pos + 2;
1761}
1762
1763static int ieee80211_build_preq_ies_band(struct ieee80211_sub_if_data *sdata,
1764                                         u8 *buffer, size_t buffer_len,
1765                                         const u8 *ie, size_t ie_len,
1766                                         enum nl80211_band band,
1767                                         u32 rate_mask,
1768                                         struct cfg80211_chan_def *chandef,
1769                                         size_t *offset, u32 flags)
1770{
1771        struct ieee80211_local *local = sdata->local;
1772        struct ieee80211_supported_band *sband;
1773        const struct ieee80211_sta_he_cap *he_cap;
1774        u8 *pos = buffer, *end = buffer + buffer_len;
1775        size_t noffset;
1776        int supp_rates_len, i;
1777        u8 rates[32];
1778        int num_rates;
1779        int ext_rates_len;
1780        int shift;
1781        u32 rate_flags;
1782        bool have_80mhz = false;
1783
1784        *offset = 0;
1785
1786        sband = local->hw.wiphy->bands[band];
1787        if (WARN_ON_ONCE(!sband))
1788                return 0;
1789
1790        rate_flags = ieee80211_chandef_rate_flags(chandef);
1791        shift = ieee80211_chandef_get_shift(chandef);
1792
1793        num_rates = 0;
1794        for (i = 0; i < sband->n_bitrates; i++) {
1795                if ((BIT(i) & rate_mask) == 0)
1796                        continue; /* skip rate */
1797                if ((rate_flags & sband->bitrates[i].flags) != rate_flags)
1798                        continue;
1799
1800                rates[num_rates++] =
1801                        (u8) DIV_ROUND_UP(sband->bitrates[i].bitrate,
1802                                          (1 << shift) * 5);
1803        }
1804
1805        supp_rates_len = min_t(int, num_rates, 8);
1806
1807        if (end - pos < 2 + supp_rates_len)
1808                goto out_err;
1809        *pos++ = WLAN_EID_SUPP_RATES;
1810        *pos++ = supp_rates_len;
1811        memcpy(pos, rates, supp_rates_len);
1812        pos += supp_rates_len;
1813
1814        /* insert "request information" if in custom IEs */
1815        if (ie && ie_len) {
1816                static const u8 before_extrates[] = {
1817                        WLAN_EID_SSID,
1818                        WLAN_EID_SUPP_RATES,
1819                        WLAN_EID_REQUEST,
1820                };
1821                noffset = ieee80211_ie_split(ie, ie_len,
1822                                             before_extrates,
1823                                             ARRAY_SIZE(before_extrates),
1824                                             *offset);
1825                if (end - pos < noffset - *offset)
1826                        goto out_err;
1827                memcpy(pos, ie + *offset, noffset - *offset);
1828                pos += noffset - *offset;
1829                *offset = noffset;
1830        }
1831
1832        ext_rates_len = num_rates - supp_rates_len;
1833        if (ext_rates_len > 0) {
1834                if (end - pos < 2 + ext_rates_len)
1835                        goto out_err;
1836                *pos++ = WLAN_EID_EXT_SUPP_RATES;
1837                *pos++ = ext_rates_len;
1838                memcpy(pos, rates + supp_rates_len, ext_rates_len);
1839                pos += ext_rates_len;
1840        }
1841
1842        if (chandef->chan && sband->band == NL80211_BAND_2GHZ) {
1843                if (end - pos < 3)
1844                        goto out_err;
1845                *pos++ = WLAN_EID_DS_PARAMS;
1846                *pos++ = 1;
1847                *pos++ = ieee80211_frequency_to_channel(
1848                                chandef->chan->center_freq);
1849        }
1850
1851        if (flags & IEEE80211_PROBE_FLAG_MIN_CONTENT)
1852                goto done;
1853
1854        /* insert custom IEs that go before HT */
1855        if (ie && ie_len) {
1856                static const u8 before_ht[] = {
1857                        /*
1858                         * no need to list the ones split off already
1859                         * (or generated here)
1860                         */
1861                        WLAN_EID_DS_PARAMS,
1862                        WLAN_EID_SUPPORTED_REGULATORY_CLASSES,
1863                };
1864                noffset = ieee80211_ie_split(ie, ie_len,
1865                                             before_ht, ARRAY_SIZE(before_ht),
1866                                             *offset);
1867                if (end - pos < noffset - *offset)
1868                        goto out_err;
1869                memcpy(pos, ie + *offset, noffset - *offset);
1870                pos += noffset - *offset;
1871                *offset = noffset;
1872        }
1873
1874        if (sband->ht_cap.ht_supported) {
1875                if (end - pos < 2 + sizeof(struct ieee80211_ht_cap))
1876                        goto out_err;
1877                pos = ieee80211_ie_build_ht_cap(pos, &sband->ht_cap,
1878                                                sband->ht_cap.cap);
1879        }
1880
1881        /* insert custom IEs that go before VHT */
1882        if (ie && ie_len) {
1883                static const u8 before_vht[] = {
1884                        /*
1885                         * no need to list the ones split off already
1886                         * (or generated here)
1887                         */
1888                        WLAN_EID_BSS_COEX_2040,
1889                        WLAN_EID_EXT_CAPABILITY,
1890                        WLAN_EID_SSID_LIST,
1891                        WLAN_EID_CHANNEL_USAGE,
1892                        WLAN_EID_INTERWORKING,
1893                        WLAN_EID_MESH_ID,
1894                        /* 60 GHz (Multi-band, DMG, MMS) can't happen */
1895                };
1896                noffset = ieee80211_ie_split(ie, ie_len,
1897                                             before_vht, ARRAY_SIZE(before_vht),
1898                                             *offset);
1899                if (end - pos < noffset - *offset)
1900                        goto out_err;
1901                memcpy(pos, ie + *offset, noffset - *offset);
1902                pos += noffset - *offset;
1903                *offset = noffset;
1904        }
1905
1906        /* Check if any channel in this sband supports at least 80 MHz */
1907        for (i = 0; i < sband->n_channels; i++) {
1908                if (sband->channels[i].flags & (IEEE80211_CHAN_DISABLED |
1909                                                IEEE80211_CHAN_NO_80MHZ))
1910                        continue;
1911
1912                have_80mhz = true;
1913                break;
1914        }
1915
1916        if (sband->vht_cap.vht_supported && have_80mhz) {
1917                if (end - pos < 2 + sizeof(struct ieee80211_vht_cap))
1918                        goto out_err;
1919                pos = ieee80211_ie_build_vht_cap(pos, &sband->vht_cap,
1920                                                 sband->vht_cap.cap);
1921        }
1922
1923        /* insert custom IEs that go before HE */
1924        if (ie && ie_len) {
1925                static const u8 before_he[] = {
1926                        /*
1927                         * no need to list the ones split off before VHT
1928                         * or generated here
1929                         */
1930                        WLAN_EID_EXTENSION, WLAN_EID_EXT_FILS_REQ_PARAMS,
1931                        WLAN_EID_AP_CSN,
1932                        /* TODO: add 11ah/11aj/11ak elements */
1933                };
1934                noffset = ieee80211_ie_split(ie, ie_len,
1935                                             before_he, ARRAY_SIZE(before_he),
1936                                             *offset);
1937                if (end - pos < noffset - *offset)
1938                        goto out_err;
1939                memcpy(pos, ie + *offset, noffset - *offset);
1940                pos += noffset - *offset;
1941                *offset = noffset;
1942        }
1943
1944        he_cap = ieee80211_get_he_sta_cap(sband);
1945        if (he_cap) {
1946                pos = ieee80211_ie_build_he_cap(pos, he_cap, end);
1947                if (!pos)
1948                        goto out_err;
1949
1950                if (sband->band == NL80211_BAND_6GHZ) {
1951                        enum nl80211_iftype iftype =
1952                                ieee80211_vif_type_p2p(&sdata->vif);
1953                        __le16 cap = ieee80211_get_he_6ghz_capa(sband, iftype);
1954
1955                        pos = ieee80211_write_he_6ghz_cap(pos, cap, end);
1956                }
1957        }
1958
1959        /*
1960         * If adding more here, adjust code in main.c
1961         * that calculates local->scan_ies_len.
1962         */
1963
1964        return pos - buffer;
1965 out_err:
1966        WARN_ONCE(1, "not enough space for preq IEs\n");
1967 done:
1968        return pos - buffer;
1969}
1970
1971int ieee80211_build_preq_ies(struct ieee80211_sub_if_data *sdata, u8 *buffer,
1972                             size_t buffer_len,
1973                             struct ieee80211_scan_ies *ie_desc,
1974                             const u8 *ie, size_t ie_len,
1975                             u8 bands_used, u32 *rate_masks,
1976                             struct cfg80211_chan_def *chandef,
1977                             u32 flags)
1978{
1979        size_t pos = 0, old_pos = 0, custom_ie_offset = 0;
1980        int i;
1981
1982        memset(ie_desc, 0, sizeof(*ie_desc));
1983
1984        for (i = 0; i < NUM_NL80211_BANDS; i++) {
1985                if (bands_used & BIT(i)) {
1986                        pos += ieee80211_build_preq_ies_band(sdata,
1987                                                             buffer + pos,
1988                                                             buffer_len - pos,
1989                                                             ie, ie_len, i,
1990                                                             rate_masks[i],
1991                                                             chandef,
1992                                                             &custom_ie_offset,
1993                                                             flags);
1994                        ie_desc->ies[i] = buffer + old_pos;
1995                        ie_desc->len[i] = pos - old_pos;
1996                        old_pos = pos;
1997                }
1998        }
1999
2000        /* add any remaining custom IEs */
2001        if (ie && ie_len) {
2002                if (WARN_ONCE(buffer_len - pos < ie_len - custom_ie_offset,
2003                              "not enough space for preq custom IEs\n"))
2004                        return pos;
2005                memcpy(buffer + pos, ie + custom_ie_offset,
2006                       ie_len - custom_ie_offset);
2007                ie_desc->common_ies = buffer + pos;
2008                ie_desc->common_ie_len = ie_len - custom_ie_offset;
2009                pos += ie_len - custom_ie_offset;
2010        }
2011
2012        return pos;
2013};
2014
2015struct sk_buff *ieee80211_build_probe_req(struct ieee80211_sub_if_data *sdata,
2016                                          const u8 *src, const u8 *dst,
2017                                          u32 ratemask,
2018                                          struct ieee80211_channel *chan,
2019                                          const u8 *ssid, size_t ssid_len,
2020                                          const u8 *ie, size_t ie_len,
2021                                          u32 flags)
2022{
2023        struct ieee80211_local *local = sdata->local;
2024        struct cfg80211_chan_def chandef;
2025        struct sk_buff *skb;
2026        struct ieee80211_mgmt *mgmt;
2027        int ies_len;
2028        u32 rate_masks[NUM_NL80211_BANDS] = {};
2029        struct ieee80211_scan_ies dummy_ie_desc;
2030
2031        /*
2032         * Do not send DS Channel parameter for directed probe requests
2033         * in order to maximize the chance that we get a response.  Some
2034         * badly-behaved APs don't respond when this parameter is included.
2035         */
2036        chandef.width = sdata->vif.bss_conf.chandef.width;
2037        if (flags & IEEE80211_PROBE_FLAG_DIRECTED)
2038                chandef.chan = NULL;
2039        else
2040                chandef.chan = chan;
2041
2042        skb = ieee80211_probereq_get(&local->hw, src, ssid, ssid_len,
2043                                     100 + ie_len);
2044        if (!skb)
2045                return NULL;
2046
2047        rate_masks[chan->band] = ratemask;
2048        ies_len = ieee80211_build_preq_ies(sdata, skb_tail_pointer(skb),
2049                                           skb_tailroom(skb), &dummy_ie_desc,
2050                                           ie, ie_len, BIT(chan->band),
2051                                           rate_masks, &chandef, flags);
2052        skb_put(skb, ies_len);
2053
2054        if (dst) {
2055                mgmt = (struct ieee80211_mgmt *) skb->data;
2056                memcpy(mgmt->da, dst, ETH_ALEN);
2057                memcpy(mgmt->bssid, dst, ETH_ALEN);
2058        }
2059
2060        IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT;
2061
2062        return skb;
2063}
2064
2065u32 ieee80211_sta_get_rates(struct ieee80211_sub_if_data *sdata,
2066                            struct ieee802_11_elems *elems,
2067                            enum nl80211_band band, u32 *basic_rates)
2068{
2069        struct ieee80211_supported_band *sband;
2070        size_t num_rates;
2071        u32 supp_rates, rate_flags;
2072        int i, j, shift;
2073
2074        sband = sdata->local->hw.wiphy->bands[band];
2075        if (WARN_ON(!sband))
2076                return 1;
2077
2078        rate_flags = ieee80211_chandef_rate_flags(&sdata->vif.bss_conf.chandef);
2079        shift = ieee80211_vif_get_shift(&sdata->vif);
2080
2081        num_rates = sband->n_bitrates;
2082        supp_rates = 0;
2083        for (i = 0; i < elems->supp_rates_len +
2084                     elems->ext_supp_rates_len; i++) {
2085                u8 rate = 0;
2086                int own_rate;
2087                bool is_basic;
2088                if (i < elems->supp_rates_len)
2089                        rate = elems->supp_rates[i];
2090                else if (elems->ext_supp_rates)
2091                        rate = elems->ext_supp_rates
2092                                [i - elems->supp_rates_len];
2093                own_rate = 5 * (rate & 0x7f);
2094                is_basic = !!(rate & 0x80);
2095
2096                if (is_basic && (rate & 0x7f) == BSS_MEMBERSHIP_SELECTOR_HT_PHY)
2097                        continue;
2098
2099                for (j = 0; j < num_rates; j++) {
2100                        int brate;
2101                        if ((rate_flags & sband->bitrates[j].flags)
2102                            != rate_flags)
2103                                continue;
2104
2105                        brate = DIV_ROUND_UP(sband->bitrates[j].bitrate,
2106                                             1 << shift);
2107
2108                        if (brate == own_rate) {
2109                                supp_rates |= BIT(j);
2110                                if (basic_rates && is_basic)
2111                                        *basic_rates |= BIT(j);
2112                        }
2113                }
2114        }
2115        return supp_rates;
2116}
2117
2118void ieee80211_stop_device(struct ieee80211_local *local)
2119{
2120        ieee80211_led_radio(local, false);
2121        ieee80211_mod_tpt_led_trig(local, 0, IEEE80211_TPT_LEDTRIG_FL_RADIO);
2122
2123        cancel_work_sync(&local->reconfig_filter);
2124
2125        flush_workqueue(local->workqueue);
2126        drv_stop(local);
2127}
2128
2129static void ieee80211_flush_completed_scan(struct ieee80211_local *local,
2130                                           bool aborted)
2131{
2132        /* It's possible that we don't handle the scan completion in
2133         * time during suspend, so if it's still marked as completed
2134         * here, queue the work and flush it to clean things up.
2135         * Instead of calling the worker function directly here, we
2136         * really queue it to avoid potential races with other flows
2137         * scheduling the same work.
2138         */
2139        if (test_bit(SCAN_COMPLETED, &local->scanning)) {
2140                /* If coming from reconfiguration failure, abort the scan so
2141                 * we don't attempt to continue a partial HW scan - which is
2142                 * possible otherwise if (e.g.) the 2.4 GHz portion was the
2143                 * completed scan, and a 5 GHz portion is still pending.
2144                 */
2145                if (aborted)
2146                        set_bit(SCAN_ABORTED, &local->scanning);
2147                ieee80211_queue_delayed_work(&local->hw, &local->scan_work, 0);
2148                flush_delayed_work(&local->scan_work);
2149        }
2150}
2151
2152static void ieee80211_handle_reconfig_failure(struct ieee80211_local *local)
2153{
2154        struct ieee80211_sub_if_data *sdata;
2155        struct ieee80211_chanctx *ctx;
2156
2157        /*
2158         * We get here if during resume the device can't be restarted properly.
2159         * We might also get here if this happens during HW reset, which is a
2160         * slightly different situation and we need to drop all connections in
2161         * the latter case.
2162         *
2163         * Ask cfg80211 to turn off all interfaces, this will result in more
2164         * warnings but at least we'll then get into a clean stopped state.
2165         */
2166
2167        local->resuming = false;
2168        local->suspended = false;
2169        local->in_reconfig = false;
2170
2171        ieee80211_flush_completed_scan(local, true);
2172
2173        /* scheduled scan clearly can't be running any more, but tell
2174         * cfg80211 and clear local state
2175         */
2176        ieee80211_sched_scan_end(local);
2177
2178        list_for_each_entry(sdata, &local->interfaces, list)
2179                sdata->flags &= ~IEEE80211_SDATA_IN_DRIVER;
2180
2181        /* Mark channel contexts as not being in the driver any more to avoid
2182         * removing them from the driver during the shutdown process...
2183         */
2184        mutex_lock(&local->chanctx_mtx);
2185        list_for_each_entry(ctx, &local->chanctx_list, list)
2186                ctx->driver_present = false;
2187        mutex_unlock(&local->chanctx_mtx);
2188
2189        cfg80211_shutdown_all_interfaces(local->hw.wiphy);
2190}
2191
2192static void ieee80211_assign_chanctx(struct ieee80211_local *local,
2193                                     struct ieee80211_sub_if_data *sdata)
2194{
2195        struct ieee80211_chanctx_conf *conf;
2196        struct ieee80211_chanctx *ctx;
2197
2198        if (!local->use_chanctx)
2199                return;
2200
2201        mutex_lock(&local->chanctx_mtx);
2202        conf = rcu_dereference_protected(sdata->vif.chanctx_conf,
2203                                         lockdep_is_held(&local->chanctx_mtx));
2204        if (conf) {
2205                ctx = container_of(conf, struct ieee80211_chanctx, conf);
2206                drv_assign_vif_chanctx(local, sdata, ctx);
2207        }
2208        mutex_unlock(&local->chanctx_mtx);
2209}
2210
2211static void ieee80211_reconfig_stations(struct ieee80211_sub_if_data *sdata)
2212{
2213        struct ieee80211_local *local = sdata->local;
2214        struct sta_info *sta;
2215
2216        /* add STAs back */
2217        mutex_lock(&local->sta_mtx);
2218        list_for_each_entry(sta, &local->sta_list, list) {
2219                enum ieee80211_sta_state state;
2220
2221                if (!sta->uploaded || sta->sdata != sdata)
2222                        continue;
2223
2224                for (state = IEEE80211_STA_NOTEXIST;
2225                     state < sta->sta_state; state++)
2226                        WARN_ON(drv_sta_state(local, sta->sdata, sta, state,
2227                                              state + 1));
2228        }
2229        mutex_unlock(&local->sta_mtx);
2230}
2231
2232static int ieee80211_reconfig_nan(struct ieee80211_sub_if_data *sdata)
2233{
2234        struct cfg80211_nan_func *func, **funcs;
2235        int res, id, i = 0;
2236
2237        res = drv_start_nan(sdata->local, sdata,
2238                            &sdata->u.nan.conf);
2239        if (WARN_ON(res))
2240                return res;
2241
2242        funcs = kcalloc(sdata->local->hw.max_nan_de_entries + 1,
2243                        sizeof(*funcs),
2244                        GFP_KERNEL);
2245        if (!funcs)
2246                return -ENOMEM;
2247
2248        /* Add all the functions:
2249         * This is a little bit ugly. We need to call a potentially sleeping
2250         * callback for each NAN function, so we can't hold the spinlock.
2251         */
2252        spin_lock_bh(&sdata->u.nan.func_lock);
2253
2254        idr_for_each_entry(&sdata->u.nan.function_inst_ids, func, id)
2255                funcs[i++] = func;
2256
2257        spin_unlock_bh(&sdata->u.nan.func_lock);
2258
2259        for (i = 0; funcs[i]; i++) {
2260                res = drv_add_nan_func(sdata->local, sdata, funcs[i]);
2261                if (WARN_ON(res))
2262                        ieee80211_nan_func_terminated(&sdata->vif,
2263                                                      funcs[i]->instance_id,
2264                                                      NL80211_NAN_FUNC_TERM_REASON_ERROR,
2265                                                      GFP_KERNEL);
2266        }
2267
2268        kfree(funcs);
2269
2270        return 0;
2271}
2272
2273int ieee80211_reconfig(struct ieee80211_local *local)
2274{
2275        struct ieee80211_hw *hw = &local->hw;
2276        struct ieee80211_sub_if_data *sdata;
2277        struct ieee80211_chanctx *ctx;
2278        struct sta_info *sta;
2279        int res, i;
2280        bool reconfig_due_to_wowlan = false;
2281        struct ieee80211_sub_if_data *sched_scan_sdata;
2282        struct cfg80211_sched_scan_request *sched_scan_req;
2283        bool sched_scan_stopped = false;
2284        bool suspended = local->suspended;
2285
2286        /* nothing to do if HW shouldn't run */
2287        if (!local->open_count)
2288                goto wake_up;
2289
2290#ifdef CONFIG_PM
2291        if (suspended)
2292                local->resuming = true;
2293
2294        if (local->wowlan) {
2295                /*
2296                 * In the wowlan case, both mac80211 and the device
2297                 * are functional when the resume op is called, so
2298                 * clear local->suspended so the device could operate
2299                 * normally (e.g. pass rx frames).
2300                 */
2301                local->suspended = false;
2302                res = drv_resume(local);
2303                local->wowlan = false;
2304                if (res < 0) {
2305                        local->resuming = false;
2306                        return res;
2307                }
2308                if (res == 0)
2309                        goto wake_up;
2310                WARN_ON(res > 1);
2311                /*
2312                 * res is 1, which means the driver requested
2313                 * to go through a regular reset on wakeup.
2314                 * restore local->suspended in this case.
2315                 */
2316                reconfig_due_to_wowlan = true;
2317                local->suspended = true;
2318        }
2319#endif
2320
2321        /*
2322         * In case of hw_restart during suspend (without wowlan),
2323         * cancel restart work, as we are reconfiguring the device
2324         * anyway.
2325         * Note that restart_work is scheduled on a frozen workqueue,
2326         * so we can't deadlock in this case.
2327         */
2328        if (suspended && local->in_reconfig && !reconfig_due_to_wowlan)
2329                cancel_work_sync(&local->restart_work);
2330
2331        local->started = false;
2332
2333        /*
2334         * Upon resume hardware can sometimes be goofy due to
2335         * various platform / driver / bus issues, so restarting
2336         * the device may at times not work immediately. Propagate
2337         * the error.
2338         */
2339        res = drv_start(local);
2340        if (res) {
2341                if (suspended)
2342                        WARN(1, "Hardware became unavailable upon resume. This could be a software issue prior to suspend or a hardware issue.\n");
2343                else
2344                        WARN(1, "Hardware became unavailable during restart.\n");
2345                ieee80211_handle_reconfig_failure(local);
2346                return res;
2347        }
2348
2349        /* setup fragmentation threshold */
2350        drv_set_frag_threshold(local, hw->wiphy->frag_threshold);
2351
2352        /* setup RTS threshold */
2353        drv_set_rts_threshold(local, hw->wiphy->rts_threshold);
2354
2355        /* reset coverage class */
2356        drv_set_coverage_class(local, hw->wiphy->coverage_class);
2357
2358        ieee80211_led_radio(local, true);
2359        ieee80211_mod_tpt_led_trig(local,
2360                                   IEEE80211_TPT_LEDTRIG_FL_RADIO, 0);
2361
2362        /* add interfaces */
2363        sdata = rtnl_dereference(local->monitor_sdata);
2364        if (sdata) {
2365                /* in HW restart it exists already */
2366                WARN_ON(local->resuming);
2367                res = drv_add_interface(local, sdata);
2368                if (WARN_ON(res)) {
2369                        RCU_INIT_POINTER(local->monitor_sdata, NULL);
2370                        synchronize_net();
2371                        kfree(sdata);
2372                }
2373        }
2374
2375        list_for_each_entry(sdata, &local->interfaces, list) {
2376                if (sdata->vif.type != NL80211_IFTYPE_AP_VLAN &&
2377                    sdata->vif.type != NL80211_IFTYPE_MONITOR &&
2378                    ieee80211_sdata_running(sdata)) {
2379                        res = drv_add_interface(local, sdata);
2380                        if (WARN_ON(res))
2381                                break;
2382                }
2383        }
2384
2385        /* If adding any of the interfaces failed above, roll back and
2386         * report failure.
2387         */
2388        if (res) {
2389                list_for_each_entry_continue_reverse(sdata, &local->interfaces,
2390                                                     list)
2391                        if (sdata->vif.type != NL80211_IFTYPE_AP_VLAN &&
2392                            sdata->vif.type != NL80211_IFTYPE_MONITOR &&
2393                            ieee80211_sdata_running(sdata))
2394                                drv_remove_interface(local, sdata);
2395                ieee80211_handle_reconfig_failure(local);
2396                return res;
2397        }
2398
2399        /* add channel contexts */
2400        if (local->use_chanctx) {
2401                mutex_lock(&local->chanctx_mtx);
2402                list_for_each_entry(ctx, &local->chanctx_list, list)
2403                        if (ctx->replace_state !=
2404                            IEEE80211_CHANCTX_REPLACES_OTHER)
2405                                WARN_ON(drv_add_chanctx(local, ctx));
2406                mutex_unlock(&local->chanctx_mtx);
2407
2408                sdata = rtnl_dereference(local->monitor_sdata);
2409                if (sdata && ieee80211_sdata_running(sdata))
2410                        ieee80211_assign_chanctx(local, sdata);
2411        }
2412
2413        /* reconfigure hardware */
2414        ieee80211_hw_config(local, ~0);
2415
2416        ieee80211_configure_filter(local);
2417
2418        /* Finally also reconfigure all the BSS information */
2419        list_for_each_entry(sdata, &local->interfaces, list) {
2420                u32 changed;
2421
2422                if (!ieee80211_sdata_running(sdata))
2423                        continue;
2424
2425                ieee80211_assign_chanctx(local, sdata);
2426
2427                switch (sdata->vif.type) {
2428                case NL80211_IFTYPE_AP_VLAN:
2429                case NL80211_IFTYPE_MONITOR:
2430                        break;
2431                case NL80211_IFTYPE_ADHOC:
2432                        if (sdata->vif.bss_conf.ibss_joined)
2433                                WARN_ON(drv_join_ibss(local, sdata));
2434                        fallthrough;
2435                default:
2436                        ieee80211_reconfig_stations(sdata);
2437                        fallthrough;
2438                case NL80211_IFTYPE_AP: /* AP stations are handled later */
2439                        for (i = 0; i < IEEE80211_NUM_ACS; i++)
2440                                drv_conf_tx(local, sdata, i,
2441                                            &sdata->tx_conf[i]);
2442                        break;
2443                }
2444
2445                /* common change flags for all interface types */
2446                changed = BSS_CHANGED_ERP_CTS_PROT |
2447                          BSS_CHANGED_ERP_PREAMBLE |
2448                          BSS_CHANGED_ERP_SLOT |
2449                          BSS_CHANGED_HT |
2450                          BSS_CHANGED_BASIC_RATES |
2451                          BSS_CHANGED_BEACON_INT |
2452                          BSS_CHANGED_BSSID |
2453                          BSS_CHANGED_CQM |
2454                          BSS_CHANGED_QOS |
2455                          BSS_CHANGED_IDLE |
2456                          BSS_CHANGED_TXPOWER |
2457                          BSS_CHANGED_MCAST_RATE;
2458
2459                if (sdata->vif.mu_mimo_owner)
2460                        changed |= BSS_CHANGED_MU_GROUPS;
2461
2462                switch (sdata->vif.type) {
2463                case NL80211_IFTYPE_STATION:
2464                        changed |= BSS_CHANGED_ASSOC |
2465                                   BSS_CHANGED_ARP_FILTER |
2466                                   BSS_CHANGED_PS;
2467
2468                        /* Re-send beacon info report to the driver */
2469                        if (sdata->u.mgd.have_beacon)
2470                                changed |= BSS_CHANGED_BEACON_INFO;
2471
2472                        if (sdata->vif.bss_conf.max_idle_period ||
2473                            sdata->vif.bss_conf.protected_keep_alive)
2474                                changed |= BSS_CHANGED_KEEP_ALIVE;
2475
2476                        sdata_lock(sdata);
2477                        ieee80211_bss_info_change_notify(sdata, changed);
2478                        sdata_unlock(sdata);
2479                        break;
2480                case NL80211_IFTYPE_OCB:
2481                        changed |= BSS_CHANGED_OCB;
2482                        ieee80211_bss_info_change_notify(sdata, changed);
2483                        break;
2484                case NL80211_IFTYPE_ADHOC:
2485                        changed |= BSS_CHANGED_IBSS;
2486                        fallthrough;
2487                case NL80211_IFTYPE_AP:
2488                        changed |= BSS_CHANGED_SSID | BSS_CHANGED_P2P_PS;
2489
2490                        if (sdata->vif.bss_conf.ftm_responder == 1 &&
2491                            wiphy_ext_feature_isset(sdata->local->hw.wiphy,
2492                                        NL80211_EXT_FEATURE_ENABLE_FTM_RESPONDER))
2493                                changed |= BSS_CHANGED_FTM_RESPONDER;
2494
2495                        if (sdata->vif.type == NL80211_IFTYPE_AP) {
2496                                changed |= BSS_CHANGED_AP_PROBE_RESP;
2497
2498                                if (rcu_access_pointer(sdata->u.ap.beacon))
2499                                        drv_start_ap(local, sdata);
2500                        }
2501                        fallthrough;
2502                case NL80211_IFTYPE_MESH_POINT:
2503                        if (sdata->vif.bss_conf.enable_beacon) {
2504                                changed |= BSS_CHANGED_BEACON |
2505                                           BSS_CHANGED_BEACON_ENABLED;
2506                                ieee80211_bss_info_change_notify(sdata, changed);
2507                        }
2508                        break;
2509                case NL80211_IFTYPE_NAN:
2510                        res = ieee80211_reconfig_nan(sdata);
2511                        if (res < 0) {
2512                                ieee80211_handle_reconfig_failure(local);
2513                                return res;
2514                        }
2515                        break;
2516                case NL80211_IFTYPE_WDS:
2517                case NL80211_IFTYPE_AP_VLAN:
2518                case NL80211_IFTYPE_MONITOR:
2519                case NL80211_IFTYPE_P2P_DEVICE:
2520                        /* nothing to do */
2521                        break;
2522                case NL80211_IFTYPE_UNSPECIFIED:
2523                case NUM_NL80211_IFTYPES:
2524                case NL80211_IFTYPE_P2P_CLIENT:
2525                case NL80211_IFTYPE_P2P_GO:
2526                        WARN_ON(1);
2527                        break;
2528                }
2529        }
2530
2531        ieee80211_recalc_ps(local);
2532
2533        /*
2534         * The sta might be in psm against the ap (e.g. because
2535         * this was the state before a hw restart), so we
2536         * explicitly send a null packet in order to make sure
2537         * it'll sync against the ap (and get out of psm).
2538         */
2539        if (!(local->hw.conf.flags & IEEE80211_CONF_PS)) {
2540                list_for_each_entry(sdata, &local->interfaces, list) {
2541                        if (sdata->vif.type != NL80211_IFTYPE_STATION)
2542                                continue;
2543                        if (!sdata->u.mgd.associated)
2544                                continue;
2545
2546                        ieee80211_send_nullfunc(local, sdata, false);
2547                }
2548        }
2549
2550        /* APs are now beaconing, add back stations */
2551        mutex_lock(&local->sta_mtx);
2552        list_for_each_entry(sta, &local->sta_list, list) {
2553                enum ieee80211_sta_state state;
2554
2555                if (!sta->uploaded)
2556                        continue;
2557
2558                if (sta->sdata->vif.type != NL80211_IFTYPE_AP &&
2559                    sta->sdata->vif.type != NL80211_IFTYPE_AP_VLAN)
2560                        continue;
2561
2562                for (state = IEEE80211_STA_NOTEXIST;
2563                     state < sta->sta_state; state++)
2564                        WARN_ON(drv_sta_state(local, sta->sdata, sta, state,
2565                                              state + 1));
2566        }
2567        mutex_unlock(&local->sta_mtx);
2568
2569        /* add back keys */
2570        list_for_each_entry(sdata, &local->interfaces, list)
2571                ieee80211_reenable_keys(sdata);
2572
2573        /* Reconfigure sched scan if it was interrupted by FW restart */
2574        mutex_lock(&local->mtx);
2575        sched_scan_sdata = rcu_dereference_protected(local->sched_scan_sdata,
2576                                                lockdep_is_held(&local->mtx));
2577        sched_scan_req = rcu_dereference_protected(local->sched_scan_req,
2578                                                lockdep_is_held(&local->mtx));
2579        if (sched_scan_sdata && sched_scan_req)
2580                /*
2581                 * Sched scan stopped, but we don't want to report it. Instead,
2582                 * we're trying to reschedule. However, if more than one scan
2583                 * plan was set, we cannot reschedule since we don't know which
2584                 * scan plan was currently running (and some scan plans may have
2585                 * already finished).
2586                 */
2587                if (sched_scan_req->n_scan_plans > 1 ||
2588                    __ieee80211_request_sched_scan_start(sched_scan_sdata,
2589                                                         sched_scan_req)) {
2590                        RCU_INIT_POINTER(local->sched_scan_sdata, NULL);
2591                        RCU_INIT_POINTER(local->sched_scan_req, NULL);
2592                        sched_scan_stopped = true;
2593                }
2594        mutex_unlock(&local->mtx);
2595
2596        if (sched_scan_stopped)
2597                cfg80211_sched_scan_stopped_rtnl(local->hw.wiphy, 0);
2598
2599 wake_up:
2600
2601        if (local->monitors == local->open_count && local->monitors > 0)
2602                ieee80211_add_virtual_monitor(local);
2603
2604        /*
2605         * Clear the WLAN_STA_BLOCK_BA flag so new aggregation
2606         * sessions can be established after a resume.
2607         *
2608         * Also tear down aggregation sessions since reconfiguring
2609         * them in a hardware restart scenario is not easily done
2610         * right now, and the hardware will have lost information
2611         * about the sessions, but we and the AP still think they
2612         * are active. This is really a workaround though.
2613         */
2614        if (ieee80211_hw_check(hw, AMPDU_AGGREGATION)) {
2615                mutex_lock(&local->sta_mtx);
2616
2617                list_for_each_entry(sta, &local->sta_list, list) {
2618                        if (!local->resuming)
2619                                ieee80211_sta_tear_down_BA_sessions(
2620                                                sta, AGG_STOP_LOCAL_REQUEST);
2621                        clear_sta_flag(sta, WLAN_STA_BLOCK_BA);
2622                }
2623
2624                mutex_unlock(&local->sta_mtx);
2625        }
2626
2627        if (local->in_reconfig) {
2628                local->in_reconfig = false;
2629                barrier();
2630
2631                /* Restart deferred ROCs */
2632                mutex_lock(&local->mtx);
2633                ieee80211_start_next_roc(local);
2634                mutex_unlock(&local->mtx);
2635
2636                /* Requeue all works */
2637                list_for_each_entry(sdata, &local->interfaces, list)
2638                        ieee80211_queue_work(&local->hw, &sdata->work);
2639        }
2640
2641        ieee80211_wake_queues_by_reason(hw, IEEE80211_MAX_QUEUE_MAP,
2642                                        IEEE80211_QUEUE_STOP_REASON_SUSPEND,
2643                                        false);
2644
2645        /*
2646         * If this is for hw restart things are still running.
2647         * We may want to change that later, however.
2648         */
2649        if (local->open_count && (!suspended || reconfig_due_to_wowlan))
2650                drv_reconfig_complete(local, IEEE80211_RECONFIG_TYPE_RESTART);
2651
2652        if (!suspended)
2653                return 0;
2654
2655#ifdef CONFIG_PM
2656        /* first set suspended false, then resuming */
2657        local->suspended = false;
2658        mb();
2659        local->resuming = false;
2660
2661        ieee80211_flush_completed_scan(local, false);
2662
2663        if (local->open_count && !reconfig_due_to_wowlan)
2664                drv_reconfig_complete(local, IEEE80211_RECONFIG_TYPE_SUSPEND);
2665
2666        list_for_each_entry(sdata, &local->interfaces, list) {
2667                if (!ieee80211_sdata_running(sdata))
2668                        continue;
2669                if (sdata->vif.type == NL80211_IFTYPE_STATION)
2670                        ieee80211_sta_restart(sdata);
2671        }
2672
2673        mod_timer(&local->sta_cleanup, jiffies + 1);
2674#else
2675        WARN_ON(1);
2676#endif
2677
2678        return 0;
2679}
2680
2681void ieee80211_resume_disconnect(struct ieee80211_vif *vif)
2682{
2683        struct ieee80211_sub_if_data *sdata;
2684        struct ieee80211_local *local;
2685        struct ieee80211_key *key;
2686
2687        if (WARN_ON(!vif))
2688                return;
2689
2690        sdata = vif_to_sdata(vif);
2691        local = sdata->local;
2692
2693        if (WARN_ON(!local->resuming))
2694                return;
2695
2696        if (WARN_ON(vif->type != NL80211_IFTYPE_STATION))
2697                return;
2698
2699        sdata->flags |= IEEE80211_SDATA_DISCONNECT_RESUME;
2700
2701        mutex_lock(&local->key_mtx);
2702        list_for_each_entry(key, &sdata->key_list, list)
2703                key->flags |= KEY_FLAG_TAINTED;
2704        mutex_unlock(&local->key_mtx);
2705}
2706EXPORT_SYMBOL_GPL(ieee80211_resume_disconnect);
2707
2708void ieee80211_recalc_smps(struct ieee80211_sub_if_data *sdata)
2709{
2710        struct ieee80211_local *local = sdata->local;
2711        struct ieee80211_chanctx_conf *chanctx_conf;
2712        struct ieee80211_chanctx *chanctx;
2713
2714        mutex_lock(&local->chanctx_mtx);
2715
2716        chanctx_conf = rcu_dereference_protected(sdata->vif.chanctx_conf,
2717                                        lockdep_is_held(&local->chanctx_mtx));
2718
2719        /*
2720         * This function can be called from a work, thus it may be possible
2721         * that the chanctx_conf is removed (due to a disconnection, for
2722         * example).
2723         * So nothing should be done in such case.
2724         */
2725        if (!chanctx_conf)
2726                goto unlock;
2727
2728        chanctx = container_of(chanctx_conf, struct ieee80211_chanctx, conf);
2729        ieee80211_recalc_smps_chanctx(local, chanctx);
2730 unlock:
2731        mutex_unlock(&local->chanctx_mtx);
2732}
2733
2734void ieee80211_recalc_min_chandef(struct ieee80211_sub_if_data *sdata)
2735{
2736        struct ieee80211_local *local = sdata->local;
2737        struct ieee80211_chanctx_conf *chanctx_conf;
2738        struct ieee80211_chanctx *chanctx;
2739
2740        mutex_lock(&local->chanctx_mtx);
2741
2742        chanctx_conf = rcu_dereference_protected(sdata->vif.chanctx_conf,
2743                                        lockdep_is_held(&local->chanctx_mtx));
2744
2745        if (WARN_ON_ONCE(!chanctx_conf))
2746                goto unlock;
2747
2748        chanctx = container_of(chanctx_conf, struct ieee80211_chanctx, conf);
2749        ieee80211_recalc_chanctx_min_def(local, chanctx);
2750 unlock:
2751        mutex_unlock(&local->chanctx_mtx);
2752}
2753
2754size_t ieee80211_ie_split_vendor(const u8 *ies, size_t ielen, size_t offset)
2755{
2756        size_t pos = offset;
2757
2758        while (pos < ielen && ies[pos] != WLAN_EID_VENDOR_SPECIFIC)
2759                pos += 2 + ies[pos + 1];
2760
2761        return pos;
2762}
2763
2764static void _ieee80211_enable_rssi_reports(struct ieee80211_sub_if_data *sdata,
2765                                            int rssi_min_thold,
2766                                            int rssi_max_thold)
2767{
2768        trace_api_enable_rssi_reports(sdata, rssi_min_thold, rssi_max_thold);
2769
2770        if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION))
2771                return;
2772
2773        /*
2774         * Scale up threshold values before storing it, as the RSSI averaging
2775         * algorithm uses a scaled up value as well. Change this scaling
2776         * factor if the RSSI averaging algorithm changes.
2777         */
2778        sdata->u.mgd.rssi_min_thold = rssi_min_thold*16;
2779        sdata->u.mgd.rssi_max_thold = rssi_max_thold*16;
2780}
2781
2782void ieee80211_enable_rssi_reports(struct ieee80211_vif *vif,
2783                                    int rssi_min_thold,
2784                                    int rssi_max_thold)
2785{
2786        struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
2787
2788        WARN_ON(rssi_min_thold == rssi_max_thold ||
2789                rssi_min_thold > rssi_max_thold);
2790
2791        _ieee80211_enable_rssi_reports(sdata, rssi_min_thold,
2792                                       rssi_max_thold);
2793}
2794EXPORT_SYMBOL(ieee80211_enable_rssi_reports);
2795
2796void ieee80211_disable_rssi_reports(struct ieee80211_vif *vif)
2797{
2798        struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
2799
2800        _ieee80211_enable_rssi_reports(sdata, 0, 0);
2801}
2802EXPORT_SYMBOL(ieee80211_disable_rssi_reports);
2803
2804u8 *ieee80211_ie_build_ht_cap(u8 *pos, struct ieee80211_sta_ht_cap *ht_cap,
2805                              u16 cap)
2806{
2807        __le16 tmp;
2808
2809        *pos++ = WLAN_EID_HT_CAPABILITY;
2810        *pos++ = sizeof(struct ieee80211_ht_cap);
2811        memset(pos, 0, sizeof(struct ieee80211_ht_cap));
2812
2813        /* capability flags */
2814        tmp = cpu_to_le16(cap);
2815        memcpy(pos, &tmp, sizeof(u16));
2816        pos += sizeof(u16);
2817
2818        /* AMPDU parameters */
2819        *pos++ = ht_cap->ampdu_factor |
2820                 (ht_cap->ampdu_density <<
2821                        IEEE80211_HT_AMPDU_PARM_DENSITY_SHIFT);
2822
2823        /* MCS set */
2824        memcpy(pos, &ht_cap->mcs, sizeof(ht_cap->mcs));
2825        pos += sizeof(ht_cap->mcs);
2826
2827        /* extended capabilities */
2828        pos += sizeof(__le16);
2829
2830        /* BF capabilities */
2831        pos += sizeof(__le32);
2832
2833        /* antenna selection */
2834        pos += sizeof(u8);
2835
2836        return pos;
2837}
2838
2839u8 *ieee80211_ie_build_vht_cap(u8 *pos, struct ieee80211_sta_vht_cap *vht_cap,
2840                               u32 cap)
2841{
2842        __le32 tmp;
2843
2844        *pos++ = WLAN_EID_VHT_CAPABILITY;
2845        *pos++ = sizeof(struct ieee80211_vht_cap);
2846        memset(pos, 0, sizeof(struct ieee80211_vht_cap));
2847
2848        /* capability flags */
2849        tmp = cpu_to_le32(cap);
2850        memcpy(pos, &tmp, sizeof(u32));
2851        pos += sizeof(u32);
2852
2853        /* VHT MCS set */
2854        memcpy(pos, &vht_cap->vht_mcs, sizeof(vht_cap->vht_mcs));
2855        pos += sizeof(vht_cap->vht_mcs);
2856
2857        return pos;
2858}
2859
2860u8 ieee80211_ie_len_he_cap(struct ieee80211_sub_if_data *sdata, u8 iftype)
2861{
2862        const struct ieee80211_sta_he_cap *he_cap;
2863        struct ieee80211_supported_band *sband;
2864        u8 n;
2865
2866        sband = ieee80211_get_sband(sdata);
2867        if (!sband)
2868                return 0;
2869
2870        he_cap = ieee80211_get_he_iftype_cap(sband, iftype);
2871        if (!he_cap)
2872                return 0;
2873
2874        n = ieee80211_he_mcs_nss_size(&he_cap->he_cap_elem);
2875        return 2 + 1 +
2876               sizeof(he_cap->he_cap_elem) + n +
2877               ieee80211_he_ppe_size(he_cap->ppe_thres[0],
2878                                     he_cap->he_cap_elem.phy_cap_info);
2879}
2880
2881u8 *ieee80211_ie_build_he_cap(u8 *pos,
2882                              const struct ieee80211_sta_he_cap *he_cap,
2883                              u8 *end)
2884{
2885        u8 n;
2886        u8 ie_len;
2887        u8 *orig_pos = pos;
2888
2889        /* Make sure we have place for the IE */
2890        /*
2891         * TODO: the 1 added is because this temporarily is under the EXTENSION
2892         * IE. Get rid of it when it moves.
2893         */
2894        if (!he_cap)
2895                return orig_pos;
2896
2897        n = ieee80211_he_mcs_nss_size(&he_cap->he_cap_elem);
2898        ie_len = 2 + 1 +
2899                 sizeof(he_cap->he_cap_elem) + n +
2900                 ieee80211_he_ppe_size(he_cap->ppe_thres[0],
2901                                       he_cap->he_cap_elem.phy_cap_info);
2902
2903        if ((end - pos) < ie_len)
2904                return orig_pos;
2905
2906        *pos++ = WLAN_EID_EXTENSION;
2907        pos++; /* We'll set the size later below */
2908        *pos++ = WLAN_EID_EXT_HE_CAPABILITY;
2909
2910        /* Fixed data */
2911        memcpy(pos, &he_cap->he_cap_elem, sizeof(he_cap->he_cap_elem));
2912        pos += sizeof(he_cap->he_cap_elem);
2913
2914        memcpy(pos, &he_cap->he_mcs_nss_supp, n);
2915        pos += n;
2916
2917        /* Check if PPE Threshold should be present */
2918        if ((he_cap->he_cap_elem.phy_cap_info[6] &
2919             IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT) == 0)
2920                goto end;
2921
2922        /*
2923         * Calculate how many PPET16/PPET8 pairs are to come. Algorithm:
2924         * (NSS_M1 + 1) x (num of 1 bits in RU_INDEX_BITMASK)
2925         */
2926        n = hweight8(he_cap->ppe_thres[0] &
2927                     IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK);
2928        n *= (1 + ((he_cap->ppe_thres[0] & IEEE80211_PPE_THRES_NSS_MASK) >>
2929                   IEEE80211_PPE_THRES_NSS_POS));
2930
2931        /*
2932         * Each pair is 6 bits, and we need to add the 7 "header" bits to the
2933         * total size.
2934         */
2935        n = (n * IEEE80211_PPE_THRES_INFO_PPET_SIZE * 2) + 7;
2936        n = DIV_ROUND_UP(n, 8);
2937
2938        /* Copy PPE Thresholds */
2939        memcpy(pos, &he_cap->ppe_thres, n);
2940        pos += n;
2941
2942end:
2943        orig_pos[1] = (pos - orig_pos) - 2;
2944        return pos;
2945}
2946
2947void ieee80211_ie_build_he_6ghz_cap(struct ieee80211_sub_if_data *sdata,
2948                                    struct sk_buff *skb)
2949{
2950        struct ieee80211_supported_band *sband;
2951        const struct ieee80211_sband_iftype_data *iftd;
2952        enum nl80211_iftype iftype = ieee80211_vif_type_p2p(&sdata->vif);
2953        u8 *pos;
2954        u16 cap;
2955
2956        sband = ieee80211_get_sband(sdata);
2957        if (!sband)
2958                return;
2959
2960        iftd = ieee80211_get_sband_iftype_data(sband, iftype);
2961        if (WARN_ON(!iftd))
2962                return;
2963
2964        /* Check for device HE 6 GHz capability before adding element */
2965        if (!iftd->he_6ghz_capa.capa)
2966                return;
2967
2968        cap = le16_to_cpu(iftd->he_6ghz_capa.capa);
2969        cap &= ~IEEE80211_HE_6GHZ_CAP_SM_PS;
2970
2971        switch (sdata->smps_mode) {
2972        case IEEE80211_SMPS_AUTOMATIC:
2973        case IEEE80211_SMPS_NUM_MODES:
2974                WARN_ON(1);
2975                fallthrough;
2976        case IEEE80211_SMPS_OFF:
2977                cap |= u16_encode_bits(WLAN_HT_CAP_SM_PS_DISABLED,
2978                                       IEEE80211_HE_6GHZ_CAP_SM_PS);
2979                break;
2980        case IEEE80211_SMPS_STATIC:
2981                cap |= u16_encode_bits(WLAN_HT_CAP_SM_PS_STATIC,
2982                                       IEEE80211_HE_6GHZ_CAP_SM_PS);
2983                break;
2984        case IEEE80211_SMPS_DYNAMIC:
2985                cap |= u16_encode_bits(WLAN_HT_CAP_SM_PS_DYNAMIC,
2986                                       IEEE80211_HE_6GHZ_CAP_SM_PS);
2987                break;
2988        }
2989
2990        pos = skb_put(skb, 2 + 1 + sizeof(cap));
2991        ieee80211_write_he_6ghz_cap(pos, cpu_to_le16(cap),
2992                                    pos + 2 + 1 + sizeof(cap));
2993}
2994
2995u8 *ieee80211_ie_build_ht_oper(u8 *pos, struct ieee80211_sta_ht_cap *ht_cap,
2996                               const struct cfg80211_chan_def *chandef,
2997                               u16 prot_mode, bool rifs_mode)
2998{
2999        struct ieee80211_ht_operation *ht_oper;
3000        /* Build HT Information */
3001        *pos++ = WLAN_EID_HT_OPERATION;
3002        *pos++ = sizeof(struct ieee80211_ht_operation);
3003        ht_oper = (struct ieee80211_ht_operation *)pos;
3004        ht_oper->primary_chan = ieee80211_frequency_to_channel(
3005                                        chandef->chan->center_freq);
3006        switch (chandef->width) {
3007        case NL80211_CHAN_WIDTH_160:
3008        case NL80211_CHAN_WIDTH_80P80:
3009        case NL80211_CHAN_WIDTH_80:
3010        case NL80211_CHAN_WIDTH_40:
3011                if (chandef->center_freq1 > chandef->chan->center_freq)
3012                        ht_oper->ht_param = IEEE80211_HT_PARAM_CHA_SEC_ABOVE;
3013                else
3014                        ht_oper->ht_param = IEEE80211_HT_PARAM_CHA_SEC_BELOW;
3015                break;
3016        default:
3017                ht_oper->ht_param = IEEE80211_HT_PARAM_CHA_SEC_NONE;
3018                break;
3019        }
3020        if (ht_cap->cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40 &&
3021            chandef->width != NL80211_CHAN_WIDTH_20_NOHT &&
3022            chandef->width != NL80211_CHAN_WIDTH_20)
3023                ht_oper->ht_param |= IEEE80211_HT_PARAM_CHAN_WIDTH_ANY;
3024
3025        if (rifs_mode)
3026                ht_oper->ht_param |= IEEE80211_HT_PARAM_RIFS_MODE;
3027
3028        ht_oper->operation_mode = cpu_to_le16(prot_mode);
3029        ht_oper->stbc_param = 0x0000;
3030
3031        /* It seems that Basic MCS set and Supported MCS set
3032           are identical for the first 10 bytes */
3033        memset(&ht_oper->basic_set, 0, 16);
3034        memcpy(&ht_oper->basic_set, &ht_cap->mcs, 10);
3035
3036        return pos + sizeof(struct ieee80211_ht_operation);
3037}
3038
3039void ieee80211_ie_build_wide_bw_cs(u8 *pos,
3040                                   const struct cfg80211_chan_def *chandef)
3041{
3042        *pos++ = WLAN_EID_WIDE_BW_CHANNEL_SWITCH;       /* EID */
3043        *pos++ = 3;                                     /* IE length */
3044        /* New channel width */
3045        switch (chandef->width) {
3046        case NL80211_CHAN_WIDTH_80:
3047                *pos++ = IEEE80211_VHT_CHANWIDTH_80MHZ;
3048                break;
3049        case NL80211_CHAN_WIDTH_160:
3050                *pos++ = IEEE80211_VHT_CHANWIDTH_160MHZ;
3051                break;
3052        case NL80211_CHAN_WIDTH_80P80:
3053                *pos++ = IEEE80211_VHT_CHANWIDTH_80P80MHZ;
3054                break;
3055        default:
3056                *pos++ = IEEE80211_VHT_CHANWIDTH_USE_HT;
3057        }
3058
3059        /* new center frequency segment 0 */
3060        *pos++ = ieee80211_frequency_to_channel(chandef->center_freq1);
3061        /* new center frequency segment 1 */
3062        if (chandef->center_freq2)
3063                *pos++ = ieee80211_frequency_to_channel(chandef->center_freq2);
3064        else
3065                *pos++ = 0;
3066}
3067
3068u8 *ieee80211_ie_build_vht_oper(u8 *pos, struct ieee80211_sta_vht_cap *vht_cap,
3069                                const struct cfg80211_chan_def *chandef)
3070{
3071        struct ieee80211_vht_operation *vht_oper;
3072
3073        *pos++ = WLAN_EID_VHT_OPERATION;
3074        *pos++ = sizeof(struct ieee80211_vht_operation);
3075        vht_oper = (struct ieee80211_vht_operation *)pos;
3076        vht_oper->center_freq_seg0_idx = ieee80211_frequency_to_channel(
3077                                                        chandef->center_freq1);
3078        if (chandef->center_freq2)
3079                vht_oper->center_freq_seg1_idx =
3080                        ieee80211_frequency_to_channel(chandef->center_freq2);
3081        else
3082                vht_oper->center_freq_seg1_idx = 0x00;
3083
3084        switch (chandef->width) {
3085        case NL80211_CHAN_WIDTH_160:
3086                /*
3087                 * Convert 160 MHz channel width to new style as interop
3088                 * workaround.
3089                 */
3090                vht_oper->chan_width = IEEE80211_VHT_CHANWIDTH_80MHZ;
3091                vht_oper->center_freq_seg1_idx = vht_oper->center_freq_seg0_idx;
3092                if (chandef->chan->center_freq < chandef->center_freq1)
3093                        vht_oper->center_freq_seg0_idx -= 8;
3094                else
3095                        vht_oper->center_freq_seg0_idx += 8;
3096                break;
3097        case NL80211_CHAN_WIDTH_80P80:
3098                /*
3099                 * Convert 80+80 MHz channel width to new style as interop
3100                 * workaround.
3101                 */
3102                vht_oper->chan_width = IEEE80211_VHT_CHANWIDTH_80MHZ;
3103                break;
3104        case NL80211_CHAN_WIDTH_80:
3105                vht_oper->chan_width = IEEE80211_VHT_CHANWIDTH_80MHZ;
3106                break;
3107        default:
3108                vht_oper->chan_width = IEEE80211_VHT_CHANWIDTH_USE_HT;
3109                break;
3110        }
3111
3112        /* don't require special VHT peer rates */
3113        vht_oper->basic_mcs_set = cpu_to_le16(0xffff);
3114
3115        return pos + sizeof(struct ieee80211_vht_operation);
3116}
3117
3118u8 *ieee80211_ie_build_he_oper(u8 *pos, struct cfg80211_chan_def *chandef)
3119{
3120        struct ieee80211_he_operation *he_oper;
3121        struct ieee80211_he_6ghz_oper *he_6ghz_op;
3122        u32 he_oper_params;
3123        u8 ie_len = 1 + sizeof(struct ieee80211_he_operation);
3124
3125        if (chandef->chan->band == NL80211_BAND_6GHZ)
3126                ie_len += sizeof(struct ieee80211_he_6ghz_oper);
3127
3128        *pos++ = WLAN_EID_EXTENSION;
3129        *pos++ = ie_len;
3130        *pos++ = WLAN_EID_EXT_HE_OPERATION;
3131
3132        he_oper_params = 0;
3133        he_oper_params |= u32_encode_bits(1023, /* disabled */
3134                                IEEE80211_HE_OPERATION_RTS_THRESHOLD_MASK);
3135        he_oper_params |= u32_encode_bits(1,
3136                                IEEE80211_HE_OPERATION_ER_SU_DISABLE);
3137        he_oper_params |= u32_encode_bits(1,
3138                                IEEE80211_HE_OPERATION_BSS_COLOR_DISABLED);
3139        if (chandef->chan->band == NL80211_BAND_6GHZ)
3140                he_oper_params |= u32_encode_bits(1,
3141                                IEEE80211_HE_OPERATION_6GHZ_OP_INFO);
3142
3143        he_oper = (struct ieee80211_he_operation *)pos;
3144        he_oper->he_oper_params = cpu_to_le32(he_oper_params);
3145
3146        /* don't require special HE peer rates */
3147        he_oper->he_mcs_nss_set = cpu_to_le16(0xffff);
3148        pos += sizeof(struct ieee80211_he_operation);
3149
3150        if (chandef->chan->band != NL80211_BAND_6GHZ)
3151                goto out;
3152
3153        /* TODO add VHT operational */
3154        he_6ghz_op = (struct ieee80211_he_6ghz_oper *)pos;
3155        he_6ghz_op->minrate = 6; /* 6 Mbps */
3156        he_6ghz_op->primary =
3157                ieee80211_frequency_to_channel(chandef->chan->center_freq);
3158        he_6ghz_op->ccfs0 =
3159                ieee80211_frequency_to_channel(chandef->center_freq1);
3160        if (chandef->center_freq2)
3161                he_6ghz_op->ccfs1 =
3162                        ieee80211_frequency_to_channel(chandef->center_freq2);
3163        else
3164                he_6ghz_op->ccfs1 = 0;
3165
3166        switch (chandef->width) {
3167        case NL80211_CHAN_WIDTH_160:
3168                /* Convert 160 MHz channel width to new style as interop
3169                 * workaround.
3170                 */
3171                he_6ghz_op->control =
3172                        IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_160MHZ;
3173                he_6ghz_op->ccfs1 = he_6ghz_op->ccfs0;
3174                if (chandef->chan->center_freq < chandef->center_freq1)
3175                        he_6ghz_op->ccfs0 -= 8;
3176                else
3177                        he_6ghz_op->ccfs0 += 8;
3178                fallthrough;
3179        case NL80211_CHAN_WIDTH_80P80:
3180                he_6ghz_op->control =
3181                        IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_160MHZ;
3182                break;
3183        case NL80211_CHAN_WIDTH_80:
3184                he_6ghz_op->control =
3185                        IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_80MHZ;
3186                break;
3187        case NL80211_CHAN_WIDTH_40:
3188                he_6ghz_op->control =
3189                        IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_40MHZ;
3190                break;
3191        default:
3192                he_6ghz_op->control =
3193                        IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_20MHZ;
3194                break;
3195        }
3196
3197        pos += sizeof(struct ieee80211_he_6ghz_oper);
3198
3199out:
3200        return pos;
3201}
3202
3203bool ieee80211_chandef_ht_oper(const struct ieee80211_ht_operation *ht_oper,
3204                               struct cfg80211_chan_def *chandef)
3205{
3206        enum nl80211_channel_type channel_type;
3207
3208        if (!ht_oper)
3209                return false;
3210
3211        switch (ht_oper->ht_param & IEEE80211_HT_PARAM_CHA_SEC_OFFSET) {
3212        case IEEE80211_HT_PARAM_CHA_SEC_NONE:
3213                channel_type = NL80211_CHAN_HT20;
3214                break;
3215        case IEEE80211_HT_PARAM_CHA_SEC_ABOVE:
3216                channel_type = NL80211_CHAN_HT40PLUS;
3217                break;
3218        case IEEE80211_HT_PARAM_CHA_SEC_BELOW:
3219                channel_type = NL80211_CHAN_HT40MINUS;
3220                break;
3221        default:
3222                channel_type = NL80211_CHAN_NO_HT;
3223                return false;
3224        }
3225
3226        cfg80211_chandef_create(chandef, chandef->chan, channel_type);
3227        return true;
3228}
3229
3230bool ieee80211_chandef_vht_oper(struct ieee80211_hw *hw, u32 vht_cap_info,
3231                                const struct ieee80211_vht_operation *oper,
3232                                const struct ieee80211_ht_operation *htop,
3233                                struct cfg80211_chan_def *chandef)
3234{
3235        struct cfg80211_chan_def new = *chandef;
3236        int cf0, cf1;
3237        int ccfs0, ccfs1, ccfs2;
3238        int ccf0, ccf1;
3239        u32 vht_cap;
3240        bool support_80_80 = false;
3241        bool support_160 = false;
3242        u8 ext_nss_bw_supp = u32_get_bits(vht_cap_info,
3243                                          IEEE80211_VHT_CAP_EXT_NSS_BW_MASK);
3244        u8 supp_chwidth = u32_get_bits(vht_cap_info,
3245                                       IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK);
3246
3247        if (!oper || !htop)
3248                return false;
3249
3250        vht_cap = hw->wiphy->bands[chandef->chan->band]->vht_cap.cap;
3251        support_160 = (vht_cap & (IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_MASK |
3252                                  IEEE80211_VHT_CAP_EXT_NSS_BW_MASK));
3253        support_80_80 = ((vht_cap &
3254                         IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160_80PLUS80MHZ) ||
3255                        (vht_cap & IEEE80211_VHT_CAP_SUPP_CHAN_WIDTH_160MHZ &&
3256                         vht_cap & IEEE80211_VHT_CAP_EXT_NSS_BW_MASK) ||
3257                        ((vht_cap & IEEE80211_VHT_CAP_EXT_NSS_BW_MASK) >>
3258                                    IEEE80211_VHT_CAP_EXT_NSS_BW_SHIFT > 1));
3259        ccfs0 = oper->center_freq_seg0_idx;
3260        ccfs1 = oper->center_freq_seg1_idx;
3261        ccfs2 = (le16_to_cpu(htop->operation_mode) &
3262                                IEEE80211_HT_OP_MODE_CCFS2_MASK)
3263                        >> IEEE80211_HT_OP_MODE_CCFS2_SHIFT;
3264
3265        ccf0 = ccfs0;
3266
3267        /* if not supported, parse as though we didn't understand it */
3268        if (!ieee80211_hw_check(hw, SUPPORTS_VHT_EXT_NSS_BW))
3269                ext_nss_bw_supp = 0;
3270
3271        /*
3272         * Cf. IEEE 802.11 Table 9-250
3273         *
3274         * We really just consider that because it's inefficient to connect
3275         * at a higher bandwidth than we'll actually be able to use.
3276         */
3277        switch ((supp_chwidth << 4) | ext_nss_bw_supp) {
3278        default:
3279        case 0x00:
3280                ccf1 = 0;
3281                support_160 = false;
3282                support_80_80 = false;
3283                break;
3284        case 0x01:
3285                support_80_80 = false;
3286                fallthrough;
3287        case 0x02:
3288        case 0x03:
3289                ccf1 = ccfs2;
3290                break;
3291        case 0x10:
3292                ccf1 = ccfs1;
3293                break;
3294        case 0x11:
3295        case 0x12:
3296                if (!ccfs1)
3297                        ccf1 = ccfs2;
3298                else
3299                        ccf1 = ccfs1;
3300                break;
3301        case 0x13:
3302        case 0x20:
3303        case 0x23:
3304                ccf1 = ccfs1;
3305                break;
3306        }
3307
3308        cf0 = ieee80211_channel_to_frequency(ccf0, chandef->chan->band);
3309        cf1 = ieee80211_channel_to_frequency(ccf1, chandef->chan->band);
3310
3311        switch (oper->chan_width) {
3312        case IEEE80211_VHT_CHANWIDTH_USE_HT:
3313                /* just use HT information directly */
3314                break;
3315        case IEEE80211_VHT_CHANWIDTH_80MHZ:
3316                new.width = NL80211_CHAN_WIDTH_80;
3317                new.center_freq1 = cf0;
3318                /* If needed, adjust based on the newer interop workaround. */
3319                if (ccf1) {
3320                        unsigned int diff;
3321
3322                        diff = abs(ccf1 - ccf0);
3323                        if ((diff == 8) && support_160) {
3324                                new.width = NL80211_CHAN_WIDTH_160;
3325                                new.center_freq1 = cf1;
3326                        } else if ((diff > 8) && support_80_80) {
3327                                new.width = NL80211_CHAN_WIDTH_80P80;
3328                                new.center_freq2 = cf1;
3329                        }
3330                }
3331                break;
3332        case IEEE80211_VHT_CHANWIDTH_160MHZ:
3333                /* deprecated encoding */
3334                new.width = NL80211_CHAN_WIDTH_160;
3335                new.center_freq1 = cf0;
3336                break;
3337        case IEEE80211_VHT_CHANWIDTH_80P80MHZ:
3338                /* deprecated encoding */
3339                new.width = NL80211_CHAN_WIDTH_80P80;
3340                new.center_freq1 = cf0;
3341                new.center_freq2 = cf1;
3342                break;
3343        default:
3344                return false;
3345        }
3346
3347        if (!cfg80211_chandef_valid(&new))
3348                return false;
3349
3350        *chandef = new;
3351        return true;
3352}
3353
3354bool ieee80211_chandef_he_6ghz_oper(struct ieee80211_sub_if_data *sdata,
3355                                    const struct ieee80211_he_operation *he_oper,
3356                                    struct cfg80211_chan_def *chandef)
3357{
3358        struct ieee80211_local *local = sdata->local;
3359        struct ieee80211_supported_band *sband;
3360        enum nl80211_iftype iftype = ieee80211_vif_type_p2p(&sdata->vif);
3361        const struct ieee80211_sta_he_cap *he_cap;
3362        struct cfg80211_chan_def he_chandef = *chandef;
3363        const struct ieee80211_he_6ghz_oper *he_6ghz_oper;
3364        bool support_80_80, support_160;
3365        u8 he_phy_cap;
3366        u32 freq;
3367
3368        if (chandef->chan->band != NL80211_BAND_6GHZ)
3369                return true;
3370
3371        sband = local->hw.wiphy->bands[NL80211_BAND_6GHZ];
3372
3373        he_cap = ieee80211_get_he_iftype_cap(sband, iftype);
3374        if (!he_cap) {
3375                sdata_info(sdata, "Missing iftype sband data/HE cap");
3376                return false;
3377        }
3378
3379        he_phy_cap = he_cap->he_cap_elem.phy_cap_info[0];
3380        support_160 =
3381                he_phy_cap &
3382                IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_160MHZ_IN_5G;
3383        support_80_80 =
3384                he_phy_cap &
3385                IEEE80211_HE_PHY_CAP0_CHANNEL_WIDTH_SET_80PLUS80_MHZ_IN_5G;
3386
3387        if (!he_oper) {
3388                sdata_info(sdata,
3389                           "HE is not advertised on (on %d MHz), expect issues\n",
3390                           chandef->chan->center_freq);
3391                return false;
3392        }
3393
3394        he_6ghz_oper = ieee80211_he_6ghz_oper(he_oper);
3395
3396        if (!he_6ghz_oper) {
3397                sdata_info(sdata,
3398                           "HE 6GHz operation missing (on %d MHz), expect issues\n",
3399                           chandef->chan->center_freq);
3400                return false;
3401        }
3402
3403        freq = ieee80211_channel_to_frequency(he_6ghz_oper->primary,
3404                                              NL80211_BAND_6GHZ);
3405        he_chandef.chan = ieee80211_get_channel(sdata->local->hw.wiphy, freq);
3406
3407        switch (u8_get_bits(he_6ghz_oper->control,
3408                            IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH)) {
3409        case IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_20MHZ:
3410                he_chandef.width = NL80211_CHAN_WIDTH_20;
3411                break;
3412        case IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_40MHZ:
3413                he_chandef.width = NL80211_CHAN_WIDTH_40;
3414                break;
3415        case IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_80MHZ:
3416                he_chandef.width = NL80211_CHAN_WIDTH_80;
3417                break;
3418        case IEEE80211_HE_6GHZ_OPER_CTRL_CHANWIDTH_160MHZ:
3419                he_chandef.width = NL80211_CHAN_WIDTH_80;
3420                if (!he_6ghz_oper->ccfs1)
3421                        break;
3422                if (abs(he_6ghz_oper->ccfs1 - he_6ghz_oper->ccfs0) == 8) {
3423                        if (support_160)
3424                                he_chandef.width = NL80211_CHAN_WIDTH_160;
3425                } else {
3426                        if (support_80_80)
3427                                he_chandef.width = NL80211_CHAN_WIDTH_80P80;
3428                }
3429                break;
3430        }
3431
3432        if (he_chandef.width == NL80211_CHAN_WIDTH_160) {
3433                he_chandef.center_freq1 =
3434                        ieee80211_channel_to_frequency(he_6ghz_oper->ccfs1,
3435                                                       NL80211_BAND_6GHZ);
3436        } else {
3437                he_chandef.center_freq1 =
3438                        ieee80211_channel_to_frequency(he_6ghz_oper->ccfs0,
3439                                                       NL80211_BAND_6GHZ);
3440                if (support_80_80 || support_160)
3441                        he_chandef.center_freq2 =
3442                                ieee80211_channel_to_frequency(he_6ghz_oper->ccfs1,
3443                                                               NL80211_BAND_6GHZ);
3444        }
3445
3446        if (!cfg80211_chandef_valid(&he_chandef)) {
3447                sdata_info(sdata,
3448                           "HE 6GHz operation resulted in invalid chandef: %d MHz/%d/%d MHz/%d MHz\n",
3449                           he_chandef.chan ? he_chandef.chan->center_freq : 0,
3450                           he_chandef.width,
3451                           he_chandef.center_freq1,
3452                           he_chandef.center_freq2);
3453                return false;
3454        }
3455
3456        *chandef = he_chandef;
3457
3458        return true;
3459}
3460
3461bool ieee80211_chandef_s1g_oper(const struct ieee80211_s1g_oper_ie *oper,
3462                                struct cfg80211_chan_def *chandef)
3463{
3464        u32 oper_freq;
3465
3466        if (!oper)
3467                return false;
3468
3469        switch (FIELD_GET(S1G_OPER_CH_WIDTH_OPER, oper->ch_width)) {
3470        case IEEE80211_S1G_CHANWIDTH_1MHZ:
3471                chandef->width = NL80211_CHAN_WIDTH_1;
3472                break;
3473        case IEEE80211_S1G_CHANWIDTH_2MHZ:
3474                chandef->width = NL80211_CHAN_WIDTH_2;
3475                break;
3476        case IEEE80211_S1G_CHANWIDTH_4MHZ:
3477                chandef->width = NL80211_CHAN_WIDTH_4;
3478                break;
3479        case IEEE80211_S1G_CHANWIDTH_8MHZ:
3480                chandef->width = NL80211_CHAN_WIDTH_8;
3481                break;
3482        case IEEE80211_S1G_CHANWIDTH_16MHZ:
3483                chandef->width = NL80211_CHAN_WIDTH_16;
3484                break;
3485        default:
3486                return false;
3487        }
3488
3489        oper_freq = ieee80211_channel_to_freq_khz(oper->oper_ch,
3490                                                  NL80211_BAND_S1GHZ);
3491        chandef->center_freq1 = KHZ_TO_MHZ(oper_freq);
3492        chandef->freq1_offset = oper_freq % 1000;
3493
3494        return true;
3495}
3496
3497int ieee80211_parse_bitrates(struct cfg80211_chan_def *chandef,
3498                             const struct ieee80211_supported_band *sband,
3499                             const u8 *srates, int srates_len, u32 *rates)
3500{
3501        u32 rate_flags = ieee80211_chandef_rate_flags(chandef);
3502        int shift = ieee80211_chandef_get_shift(chandef);
3503        struct ieee80211_rate *br;
3504        int brate, rate, i, j, count = 0;
3505
3506        *rates = 0;
3507
3508        for (i = 0; i < srates_len; i++) {
3509                rate = srates[i] & 0x7f;
3510
3511                for (j = 0; j < sband->n_bitrates; j++) {
3512                        br = &sband->bitrates[j];
3513                        if ((rate_flags & br->flags) != rate_flags)
3514                                continue;
3515
3516                        brate = DIV_ROUND_UP(br->bitrate, (1 << shift) * 5);
3517                        if (brate == rate) {
3518                                *rates |= BIT(j);
3519                                count++;
3520                                break;
3521                        }
3522                }
3523        }
3524        return count;
3525}
3526
3527int ieee80211_add_srates_ie(struct ieee80211_sub_if_data *sdata,
3528                            struct sk_buff *skb, bool need_basic,
3529                            enum nl80211_band band)
3530{
3531        struct ieee80211_local *local = sdata->local;
3532        struct ieee80211_supported_band *sband;
3533        int rate, shift;
3534        u8 i, rates, *pos;
3535        u32 basic_rates = sdata->vif.bss_conf.basic_rates;
3536        u32 rate_flags;
3537
3538        shift = ieee80211_vif_get_shift(&sdata->vif);
3539        rate_flags = ieee80211_chandef_rate_flags(&sdata->vif.bss_conf.chandef);
3540        sband = local->hw.wiphy->bands[band];
3541        rates = 0;
3542        for (i = 0; i < sband->n_bitrates; i++) {
3543                if ((rate_flags & sband->bitrates[i].flags) != rate_flags)
3544                        continue;
3545                rates++;
3546        }
3547        if (rates > 8)
3548                rates = 8;
3549
3550        if (skb_tailroom(skb) < rates + 2)
3551                return -ENOMEM;
3552
3553        pos = skb_put(skb, rates + 2);
3554        *pos++ = WLAN_EID_SUPP_RATES;
3555        *pos++ = rates;
3556        for (i = 0; i < rates; i++) {
3557                u8 basic = 0;
3558                if ((rate_flags & sband->bitrates[i].flags) != rate_flags)
3559                        continue;
3560
3561                if (need_basic && basic_rates & BIT(i))
3562                        basic = 0x80;
3563                rate = DIV_ROUND_UP(sband->bitrates[i].bitrate,
3564                                    5 * (1 << shift));
3565                *pos++ = basic | (u8) rate;
3566        }
3567
3568        return 0;
3569}
3570
3571int ieee80211_add_ext_srates_ie(struct ieee80211_sub_if_data *sdata,
3572                                struct sk_buff *skb, bool need_basic,
3573                                enum nl80211_band band)
3574{
3575        struct ieee80211_local *local = sdata->local;
3576        struct ieee80211_supported_band *sband;
3577        int rate, shift;
3578        u8 i, exrates, *pos;
3579        u32 basic_rates = sdata->vif.bss_conf.basic_rates;
3580        u32 rate_flags;
3581
3582        rate_flags = ieee80211_chandef_rate_flags(&sdata->vif.bss_conf.chandef);
3583        shift = ieee80211_vif_get_shift(&sdata->vif);
3584
3585        sband = local->hw.wiphy->bands[band];
3586        exrates = 0;
3587        for (i = 0; i < sband->n_bitrates; i++) {
3588                if ((rate_flags & sband->bitrates[i].flags) != rate_flags)
3589                        continue;
3590                exrates++;
3591        }
3592
3593        if (exrates > 8)
3594                exrates -= 8;
3595        else
3596                exrates = 0;
3597
3598        if (skb_tailroom(skb) < exrates + 2)
3599                return -ENOMEM;
3600
3601        if (exrates) {
3602                pos = skb_put(skb, exrates + 2);
3603                *pos++ = WLAN_EID_EXT_SUPP_RATES;
3604                *pos++ = exrates;
3605                for (i = 8; i < sband->n_bitrates; i++) {
3606                        u8 basic = 0;
3607                        if ((rate_flags & sband->bitrates[i].flags)
3608                            != rate_flags)
3609                                continue;
3610                        if (need_basic && basic_rates & BIT(i))
3611                                basic = 0x80;
3612                        rate = DIV_ROUND_UP(sband->bitrates[i].bitrate,
3613                                            5 * (1 << shift));
3614                        *pos++ = basic | (u8) rate;
3615                }
3616        }
3617        return 0;
3618}
3619
3620int ieee80211_ave_rssi(struct ieee80211_vif *vif)
3621{
3622        struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
3623        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
3624
3625        if (WARN_ON_ONCE(sdata->vif.type != NL80211_IFTYPE_STATION)) {
3626                /* non-managed type inferfaces */
3627                return 0;
3628        }
3629        return -ewma_beacon_signal_read(&ifmgd->ave_beacon_signal);
3630}
3631EXPORT_SYMBOL_GPL(ieee80211_ave_rssi);
3632
3633u8 ieee80211_mcs_to_chains(const struct ieee80211_mcs_info *mcs)
3634{
3635        if (!mcs)
3636                return 1;
3637
3638        /* TODO: consider rx_highest */
3639
3640        if (mcs->rx_mask[3])
3641                return 4;
3642        if (mcs->rx_mask[2])
3643                return 3;
3644        if (mcs->rx_mask[1])
3645                return 2;
3646        return 1;
3647}
3648
3649/**
3650 * ieee80211_calculate_rx_timestamp - calculate timestamp in frame
3651 * @local: mac80211 hw info struct
3652 * @status: RX status
3653 * @mpdu_len: total MPDU length (including FCS)
3654 * @mpdu_offset: offset into MPDU to calculate timestamp at
3655 *
3656 * This function calculates the RX timestamp at the given MPDU offset, taking
3657 * into account what the RX timestamp was. An offset of 0 will just normalize
3658 * the timestamp to TSF at beginning of MPDU reception.
3659 */
3660u64 ieee80211_calculate_rx_timestamp(struct ieee80211_local *local,
3661                                     struct ieee80211_rx_status *status,
3662                                     unsigned int mpdu_len,
3663                                     unsigned int mpdu_offset)
3664{
3665        u64 ts = status->mactime;
3666        struct rate_info ri;
3667        u16 rate;
3668
3669        if (WARN_ON(!ieee80211_have_rx_timestamp(status)))
3670                return 0;
3671
3672        memset(&ri, 0, sizeof(ri));
3673
3674        ri.bw = status->bw;
3675
3676        /* Fill cfg80211 rate info */
3677        switch (status->encoding) {
3678        case RX_ENC_HT:
3679                ri.mcs = status->rate_idx;
3680                ri.flags |= RATE_INFO_FLAGS_MCS;
3681                if (status->enc_flags & RX_ENC_FLAG_SHORT_GI)
3682                        ri.flags |= RATE_INFO_FLAGS_SHORT_GI;
3683                break;
3684        case RX_ENC_VHT:
3685                ri.flags |= RATE_INFO_FLAGS_VHT_MCS;
3686                ri.mcs = status->rate_idx;
3687                ri.nss = status->nss;
3688                if (status->enc_flags & RX_ENC_FLAG_SHORT_GI)
3689                        ri.flags |= RATE_INFO_FLAGS_SHORT_GI;
3690                break;
3691        default:
3692                WARN_ON(1);
3693                fallthrough;
3694        case RX_ENC_LEGACY: {
3695                struct ieee80211_supported_band *sband;
3696                int shift = 0;
3697                int bitrate;
3698
3699                switch (status->bw) {
3700                case RATE_INFO_BW_10:
3701                        shift = 1;
3702                        break;
3703                case RATE_INFO_BW_5:
3704                        shift = 2;
3705                        break;
3706                }
3707
3708                sband = local->hw.wiphy->bands[status->band];
3709                bitrate = sband->bitrates[status->rate_idx].bitrate;
3710                ri.legacy = DIV_ROUND_UP(bitrate, (1 << shift));
3711
3712                if (status->flag & RX_FLAG_MACTIME_PLCP_START) {
3713                        /* TODO: handle HT/VHT preambles */
3714                        if (status->band == NL80211_BAND_5GHZ) {
3715                                ts += 20 << shift;
3716                                mpdu_offset += 2;
3717                        } else if (status->enc_flags & RX_ENC_FLAG_SHORTPRE) {
3718                                ts += 96;
3719                        } else {
3720                                ts += 192;
3721                        }
3722                }
3723                break;
3724                }
3725        }
3726
3727        rate = cfg80211_calculate_bitrate(&ri);
3728        if (WARN_ONCE(!rate,
3729                      "Invalid bitrate: flags=0x%llx, idx=%d, vht_nss=%d\n",
3730                      (unsigned long long)status->flag, status->rate_idx,
3731                      status->nss))
3732                return 0;
3733
3734        /* rewind from end of MPDU */
3735        if (status->flag & RX_FLAG_MACTIME_END)
3736                ts -= mpdu_len * 8 * 10 / rate;
3737
3738        ts += mpdu_offset * 8 * 10 / rate;
3739
3740        return ts;
3741}
3742
3743void ieee80211_dfs_cac_cancel(struct ieee80211_local *local)
3744{
3745        struct ieee80211_sub_if_data *sdata;
3746        struct cfg80211_chan_def chandef;
3747
3748        /* for interface list, to avoid linking iflist_mtx and chanctx_mtx */
3749        ASSERT_RTNL();
3750
3751        mutex_lock(&local->mtx);
3752        list_for_each_entry(sdata, &local->interfaces, list) {
3753                /* it might be waiting for the local->mtx, but then
3754                 * by the time it gets it, sdata->wdev.cac_started
3755                 * will no longer be true
3756                 */
3757                cancel_delayed_work(&sdata->dfs_cac_timer_work);
3758
3759                if (sdata->wdev.cac_started) {
3760                        chandef = sdata->vif.bss_conf.chandef;
3761                        ieee80211_vif_release_channel(sdata);
3762                        cfg80211_cac_event(sdata->dev,
3763                                           &chandef,
3764                                           NL80211_RADAR_CAC_ABORTED,
3765                                           GFP_KERNEL);
3766                }
3767        }
3768        mutex_unlock(&local->mtx);
3769}
3770
3771void ieee80211_dfs_radar_detected_work(struct work_struct *work)
3772{
3773        struct ieee80211_local *local =
3774                container_of(work, struct ieee80211_local, radar_detected_work);
3775        struct cfg80211_chan_def chandef = local->hw.conf.chandef;
3776        struct ieee80211_chanctx *ctx;
3777        int num_chanctx = 0;
3778
3779        mutex_lock(&local->chanctx_mtx);
3780        list_for_each_entry(ctx, &local->chanctx_list, list) {
3781                if (ctx->replace_state == IEEE80211_CHANCTX_REPLACES_OTHER)
3782                        continue;
3783
3784                num_chanctx++;
3785                chandef = ctx->conf.def;
3786        }
3787        mutex_unlock(&local->chanctx_mtx);
3788
3789        rtnl_lock();
3790        ieee80211_dfs_cac_cancel(local);
3791        rtnl_unlock();
3792
3793        if (num_chanctx > 1)
3794                /* XXX: multi-channel is not supported yet */
3795                WARN_ON(1);
3796        else
3797                cfg80211_radar_event(local->hw.wiphy, &chandef, GFP_KERNEL);
3798}
3799
3800void ieee80211_radar_detected(struct ieee80211_hw *hw)
3801{
3802        struct ieee80211_local *local = hw_to_local(hw);
3803
3804        trace_api_radar_detected(local);
3805
3806        schedule_work(&local->radar_detected_work);
3807}
3808EXPORT_SYMBOL(ieee80211_radar_detected);
3809
3810u32 ieee80211_chandef_downgrade(struct cfg80211_chan_def *c)
3811{
3812        u32 ret;
3813        int tmp;
3814
3815        switch (c->width) {
3816        case NL80211_CHAN_WIDTH_20:
3817                c->width = NL80211_CHAN_WIDTH_20_NOHT;
3818                ret = IEEE80211_STA_DISABLE_HT | IEEE80211_STA_DISABLE_VHT;
3819                break;
3820        case NL80211_CHAN_WIDTH_40:
3821                c->width = NL80211_CHAN_WIDTH_20;
3822                c->center_freq1 = c->chan->center_freq;
3823                ret = IEEE80211_STA_DISABLE_40MHZ |
3824                      IEEE80211_STA_DISABLE_VHT;
3825                break;
3826        case NL80211_CHAN_WIDTH_80:
3827                tmp = (30 + c->chan->center_freq - c->center_freq1)/20;
3828                /* n_P40 */
3829                tmp /= 2;
3830                /* freq_P40 */
3831                c->center_freq1 = c->center_freq1 - 20 + 40 * tmp;
3832                c->width = NL80211_CHAN_WIDTH_40;
3833                ret = IEEE80211_STA_DISABLE_VHT;
3834                break;
3835        case NL80211_CHAN_WIDTH_80P80:
3836                c->center_freq2 = 0;
3837                c->width = NL80211_CHAN_WIDTH_80;
3838                ret = IEEE80211_STA_DISABLE_80P80MHZ |
3839                      IEEE80211_STA_DISABLE_160MHZ;
3840                break;
3841        case NL80211_CHAN_WIDTH_160:
3842                /* n_P20 */
3843                tmp = (70 + c->chan->center_freq - c->center_freq1)/20;
3844                /* n_P80 */
3845                tmp /= 4;
3846                c->center_freq1 = c->center_freq1 - 40 + 80 * tmp;
3847                c->width = NL80211_CHAN_WIDTH_80;
3848                ret = IEEE80211_STA_DISABLE_80P80MHZ |
3849                      IEEE80211_STA_DISABLE_160MHZ;
3850                break;
3851        default:
3852        case NL80211_CHAN_WIDTH_20_NOHT:
3853                WARN_ON_ONCE(1);
3854                c->width = NL80211_CHAN_WIDTH_20_NOHT;
3855                ret = IEEE80211_STA_DISABLE_HT | IEEE80211_STA_DISABLE_VHT;
3856                break;
3857        case NL80211_CHAN_WIDTH_1:
3858        case NL80211_CHAN_WIDTH_2:
3859        case NL80211_CHAN_WIDTH_4:
3860        case NL80211_CHAN_WIDTH_8:
3861        case NL80211_CHAN_WIDTH_16:
3862        case NL80211_CHAN_WIDTH_5:
3863        case NL80211_CHAN_WIDTH_10:
3864                WARN_ON_ONCE(1);
3865                /* keep c->width */
3866                ret = IEEE80211_STA_DISABLE_HT | IEEE80211_STA_DISABLE_VHT;
3867                break;
3868        }
3869
3870        WARN_ON_ONCE(!cfg80211_chandef_valid(c));
3871
3872        return ret;
3873}
3874
3875/*
3876 * Returns true if smps_mode_new is strictly more restrictive than
3877 * smps_mode_old.
3878 */
3879bool ieee80211_smps_is_restrictive(enum ieee80211_smps_mode smps_mode_old,
3880                                   enum ieee80211_smps_mode smps_mode_new)
3881{
3882        if (WARN_ON_ONCE(smps_mode_old == IEEE80211_SMPS_AUTOMATIC ||
3883                         smps_mode_new == IEEE80211_SMPS_AUTOMATIC))
3884                return false;
3885
3886        switch (smps_mode_old) {
3887        case IEEE80211_SMPS_STATIC:
3888                return false;
3889        case IEEE80211_SMPS_DYNAMIC:
3890                return smps_mode_new == IEEE80211_SMPS_STATIC;
3891        case IEEE80211_SMPS_OFF:
3892                return smps_mode_new != IEEE80211_SMPS_OFF;
3893        default:
3894                WARN_ON(1);
3895        }
3896
3897        return false;
3898}
3899
3900int ieee80211_send_action_csa(struct ieee80211_sub_if_data *sdata,
3901                              struct cfg80211_csa_settings *csa_settings)
3902{
3903        struct sk_buff *skb;
3904        struct ieee80211_mgmt *mgmt;
3905        struct ieee80211_local *local = sdata->local;
3906        int freq;
3907        int hdr_len = offsetofend(struct ieee80211_mgmt,
3908                                  u.action.u.chan_switch);
3909        u8 *pos;
3910
3911        if (sdata->vif.type != NL80211_IFTYPE_ADHOC &&
3912            sdata->vif.type != NL80211_IFTYPE_MESH_POINT)
3913                return -EOPNOTSUPP;
3914
3915        skb = dev_alloc_skb(local->tx_headroom + hdr_len +
3916                            5 + /* channel switch announcement element */
3917                            3 + /* secondary channel offset element */
3918                            5 + /* wide bandwidth channel switch announcement */
3919                            8); /* mesh channel switch parameters element */
3920        if (!skb)
3921                return -ENOMEM;
3922
3923        skb_reserve(skb, local->tx_headroom);
3924        mgmt = skb_put_zero(skb, hdr_len);
3925        mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
3926                                          IEEE80211_STYPE_ACTION);
3927
3928        eth_broadcast_addr(mgmt->da);
3929        memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN);
3930        if (ieee80211_vif_is_mesh(&sdata->vif)) {
3931                memcpy(mgmt->bssid, sdata->vif.addr, ETH_ALEN);
3932        } else {
3933                struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
3934                memcpy(mgmt->bssid, ifibss->bssid, ETH_ALEN);
3935        }
3936        mgmt->u.action.category = WLAN_CATEGORY_SPECTRUM_MGMT;
3937        mgmt->u.action.u.chan_switch.action_code = WLAN_ACTION_SPCT_CHL_SWITCH;
3938        pos = skb_put(skb, 5);
3939        *pos++ = WLAN_EID_CHANNEL_SWITCH;                       /* EID */
3940        *pos++ = 3;                                             /* IE length */
3941        *pos++ = csa_settings->block_tx ? 1 : 0;                /* CSA mode */
3942        freq = csa_settings->chandef.chan->center_freq;
3943        *pos++ = ieee80211_frequency_to_channel(freq);          /* channel */
3944        *pos++ = csa_settings->count;                           /* count */
3945
3946        if (csa_settings->chandef.width == NL80211_CHAN_WIDTH_40) {
3947                enum nl80211_channel_type ch_type;
3948
3949                skb_put(skb, 3);
3950                *pos++ = WLAN_EID_SECONDARY_CHANNEL_OFFSET;     /* EID */
3951                *pos++ = 1;                                     /* IE length */
3952                ch_type = cfg80211_get_chandef_type(&csa_settings->chandef);
3953                if (ch_type == NL80211_CHAN_HT40PLUS)
3954                        *pos++ = IEEE80211_HT_PARAM_CHA_SEC_ABOVE;
3955                else
3956                        *pos++ = IEEE80211_HT_PARAM_CHA_SEC_BELOW;
3957        }
3958
3959        if (ieee80211_vif_is_mesh(&sdata->vif)) {
3960                struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
3961
3962                skb_put(skb, 8);
3963                *pos++ = WLAN_EID_CHAN_SWITCH_PARAM;            /* EID */
3964                *pos++ = 6;                                     /* IE length */
3965                *pos++ = sdata->u.mesh.mshcfg.dot11MeshTTL;     /* Mesh TTL */
3966                *pos = 0x00;    /* Mesh Flag: Tx Restrict, Initiator, Reason */
3967                *pos |= WLAN_EID_CHAN_SWITCH_PARAM_INITIATOR;
3968                *pos++ |= csa_settings->block_tx ?
3969                          WLAN_EID_CHAN_SWITCH_PARAM_TX_RESTRICT : 0x00;
3970                put_unaligned_le16(WLAN_REASON_MESH_CHAN, pos); /* Reason Cd */
3971                pos += 2;
3972                put_unaligned_le16(ifmsh->pre_value, pos);/* Precedence Value */
3973                pos += 2;
3974        }
3975
3976        if (csa_settings->chandef.width == NL80211_CHAN_WIDTH_80 ||
3977            csa_settings->chandef.width == NL80211_CHAN_WIDTH_80P80 ||
3978            csa_settings->chandef.width == NL80211_CHAN_WIDTH_160) {
3979                skb_put(skb, 5);
3980                ieee80211_ie_build_wide_bw_cs(pos, &csa_settings->chandef);
3981        }
3982
3983        ieee80211_tx_skb(sdata, skb);
3984        return 0;
3985}
3986
3987bool ieee80211_cs_valid(const struct ieee80211_cipher_scheme *cs)
3988{
3989        return !(cs == NULL || cs->cipher == 0 ||
3990                 cs->hdr_len < cs->pn_len + cs->pn_off ||
3991                 cs->hdr_len <= cs->key_idx_off ||
3992                 cs->key_idx_shift > 7 ||
3993                 cs->key_idx_mask == 0);
3994}
3995
3996bool ieee80211_cs_list_valid(const struct ieee80211_cipher_scheme *cs, int n)
3997{
3998        int i;
3999
4000        /* Ensure we have enough iftype bitmap space for all iftype values */
4001        WARN_ON((NUM_NL80211_IFTYPES / 8 + 1) > sizeof(cs[0].iftype));
4002
4003        for (i = 0; i < n; i++)
4004                if (!ieee80211_cs_valid(&cs[i]))
4005                        return false;
4006
4007        return true;
4008}
4009
4010const struct ieee80211_cipher_scheme *
4011ieee80211_cs_get(struct ieee80211_local *local, u32 cipher,
4012                 enum nl80211_iftype iftype)
4013{
4014        const struct ieee80211_cipher_scheme *l = local->hw.cipher_schemes;
4015        int n = local->hw.n_cipher_schemes;
4016        int i;
4017        const struct ieee80211_cipher_scheme *cs = NULL;
4018
4019        for (i = 0; i < n; i++) {
4020                if (l[i].cipher == cipher) {
4021                        cs = &l[i];
4022                        break;
4023                }
4024        }
4025
4026        if (!cs || !(cs->iftype & BIT(iftype)))
4027                return NULL;
4028
4029        return cs;
4030}
4031
4032int ieee80211_cs_headroom(struct ieee80211_local *local,
4033                          struct cfg80211_crypto_settings *crypto,
4034                          enum nl80211_iftype iftype)
4035{
4036        const struct ieee80211_cipher_scheme *cs;
4037        int headroom = IEEE80211_ENCRYPT_HEADROOM;
4038        int i;
4039
4040        for (i = 0; i < crypto->n_ciphers_pairwise; i++) {
4041                cs = ieee80211_cs_get(local, crypto->ciphers_pairwise[i],
4042                                      iftype);
4043
4044                if (cs && headroom < cs->hdr_len)
4045                        headroom = cs->hdr_len;
4046        }
4047
4048        cs = ieee80211_cs_get(local, crypto->cipher_group, iftype);
4049        if (cs && headroom < cs->hdr_len)
4050                headroom = cs->hdr_len;
4051
4052        return headroom;
4053}
4054
4055static bool
4056ieee80211_extend_noa_desc(struct ieee80211_noa_data *data, u32 tsf, int i)
4057{
4058        s32 end = data->desc[i].start + data->desc[i].duration - (tsf + 1);
4059        int skip;
4060
4061        if (end > 0)
4062                return false;
4063
4064        /* One shot NOA  */
4065        if (data->count[i] == 1)
4066                return false;
4067
4068        if (data->desc[i].interval == 0)
4069                return false;
4070
4071        /* End time is in the past, check for repetitions */
4072        skip = DIV_ROUND_UP(-end, data->desc[i].interval);
4073        if (data->count[i] < 255) {
4074                if (data->count[i] <= skip) {
4075                        data->count[i] = 0;
4076                        return false;
4077                }
4078
4079                data->count[i] -= skip;
4080        }
4081
4082        data->desc[i].start += skip * data->desc[i].interval;
4083
4084        return true;
4085}
4086
4087static bool
4088ieee80211_extend_absent_time(struct ieee80211_noa_data *data, u32 tsf,
4089                             s32 *offset)
4090{
4091        bool ret = false;
4092        int i;
4093
4094        for (i = 0; i < IEEE80211_P2P_NOA_DESC_MAX; i++) {
4095                s32 cur;
4096
4097                if (!data->count[i])
4098                        continue;
4099
4100                if (ieee80211_extend_noa_desc(data, tsf + *offset, i))
4101                        ret = true;
4102
4103                cur = data->desc[i].start - tsf;
4104                if (cur > *offset)
4105                        continue;
4106
4107                cur = data->desc[i].start + data->desc[i].duration - tsf;
4108                if (cur > *offset)
4109                        *offset = cur;
4110        }
4111
4112        return ret;
4113}
4114
4115static u32
4116ieee80211_get_noa_absent_time(struct ieee80211_noa_data *data, u32 tsf)
4117{
4118        s32 offset = 0;
4119        int tries = 0;
4120        /*
4121         * arbitrary limit, used to avoid infinite loops when combined NoA
4122         * descriptors cover the full time period.
4123         */
4124        int max_tries = 5;
4125
4126        ieee80211_extend_absent_time(data, tsf, &offset);
4127        do {
4128                if (!ieee80211_extend_absent_time(data, tsf, &offset))
4129                        break;
4130
4131                tries++;
4132        } while (tries < max_tries);
4133
4134        return offset;
4135}
4136
4137void ieee80211_update_p2p_noa(struct ieee80211_noa_data *data, u32 tsf)
4138{
4139        u32 next_offset = BIT(31) - 1;
4140        int i;
4141
4142        data->absent = 0;
4143        data->has_next_tsf = false;
4144        for (i = 0; i < IEEE80211_P2P_NOA_DESC_MAX; i++) {
4145                s32 start;
4146
4147                if (!data->count[i])
4148                        continue;
4149
4150                ieee80211_extend_noa_desc(data, tsf, i);
4151                start = data->desc[i].start - tsf;
4152                if (start <= 0)
4153                        data->absent |= BIT(i);
4154
4155                if (next_offset > start)
4156                        next_offset = start;
4157
4158                data->has_next_tsf = true;
4159        }
4160
4161        if (data->absent)
4162                next_offset = ieee80211_get_noa_absent_time(data, tsf);
4163
4164        data->next_tsf = tsf + next_offset;
4165}
4166EXPORT_SYMBOL(ieee80211_update_p2p_noa);
4167
4168int ieee80211_parse_p2p_noa(const struct ieee80211_p2p_noa_attr *attr,
4169                            struct ieee80211_noa_data *data, u32 tsf)
4170{
4171        int ret = 0;
4172        int i;
4173
4174        memset(data, 0, sizeof(*data));
4175
4176        for (i = 0; i < IEEE80211_P2P_NOA_DESC_MAX; i++) {
4177                const struct ieee80211_p2p_noa_desc *desc = &attr->desc[i];
4178
4179                if (!desc->count || !desc->duration)
4180                        continue;
4181
4182                data->count[i] = desc->count;
4183                data->desc[i].start = le32_to_cpu(desc->start_time);
4184                data->desc[i].duration = le32_to_cpu(desc->duration);
4185                data->desc[i].interval = le32_to_cpu(desc->interval);
4186
4187                if (data->count[i] > 1 &&
4188                    data->desc[i].interval < data->desc[i].duration)
4189                        continue;
4190
4191                ieee80211_extend_noa_desc(data, tsf, i);
4192                ret++;
4193        }
4194
4195        if (ret)
4196                ieee80211_update_p2p_noa(data, tsf);
4197
4198        return ret;
4199}
4200EXPORT_SYMBOL(ieee80211_parse_p2p_noa);
4201
4202void ieee80211_recalc_dtim(struct ieee80211_local *local,
4203                           struct ieee80211_sub_if_data *sdata)
4204{
4205        u64 tsf = drv_get_tsf(local, sdata);
4206        u64 dtim_count = 0;
4207        u16 beacon_int = sdata->vif.bss_conf.beacon_int * 1024;
4208        u8 dtim_period = sdata->vif.bss_conf.dtim_period;
4209        struct ps_data *ps;
4210        u8 bcns_from_dtim;
4211
4212        if (tsf == -1ULL || !beacon_int || !dtim_period)
4213                return;
4214
4215        if (sdata->vif.type == NL80211_IFTYPE_AP ||
4216            sdata->vif.type == NL80211_IFTYPE_AP_VLAN) {
4217                if (!sdata->bss)
4218                        return;
4219
4220                ps = &sdata->bss->ps;
4221        } else if (ieee80211_vif_is_mesh(&sdata->vif)) {
4222                ps = &sdata->u.mesh.ps;
4223        } else {
4224                return;
4225        }
4226
4227        /*
4228         * actually finds last dtim_count, mac80211 will update in
4229         * __beacon_add_tim().
4230         * dtim_count = dtim_period - (tsf / bcn_int) % dtim_period
4231         */
4232        do_div(tsf, beacon_int);
4233        bcns_from_dtim = do_div(tsf, dtim_period);
4234        /* just had a DTIM */
4235        if (!bcns_from_dtim)
4236                dtim_count = 0;
4237        else
4238                dtim_count = dtim_period - bcns_from_dtim;
4239
4240        ps->dtim_count = dtim_count;
4241}
4242
4243static u8 ieee80211_chanctx_radar_detect(struct ieee80211_local *local,
4244                                         struct ieee80211_chanctx *ctx)
4245{
4246        struct ieee80211_sub_if_data *sdata;
4247        u8 radar_detect = 0;
4248
4249        lockdep_assert_held(&local->chanctx_mtx);
4250
4251        if (WARN_ON(ctx->replace_state == IEEE80211_CHANCTX_WILL_BE_REPLACED))
4252                return 0;
4253
4254        list_for_each_entry(sdata, &ctx->reserved_vifs, reserved_chanctx_list)
4255                if (sdata->reserved_radar_required)
4256                        radar_detect |= BIT(sdata->reserved_chandef.width);
4257
4258        /*
4259         * An in-place reservation context should not have any assigned vifs
4260         * until it replaces the other context.
4261         */
4262        WARN_ON(ctx->replace_state == IEEE80211_CHANCTX_REPLACES_OTHER &&
4263                !list_empty(&ctx->assigned_vifs));
4264
4265        list_for_each_entry(sdata, &ctx->assigned_vifs, assigned_chanctx_list)
4266                if (sdata->radar_required)
4267                        radar_detect |= BIT(sdata->vif.bss_conf.chandef.width);
4268
4269        return radar_detect;
4270}
4271
4272int ieee80211_check_combinations(struct ieee80211_sub_if_data *sdata,
4273                                 const struct cfg80211_chan_def *chandef,
4274                                 enum ieee80211_chanctx_mode chanmode,
4275                                 u8 radar_detect)
4276{
4277        struct ieee80211_local *local = sdata->local;
4278        struct ieee80211_sub_if_data *sdata_iter;
4279        enum nl80211_iftype iftype = sdata->wdev.iftype;
4280        struct ieee80211_chanctx *ctx;
4281        int total = 1;
4282        struct iface_combination_params params = {
4283                .radar_detect = radar_detect,
4284        };
4285
4286        lockdep_assert_held(&local->chanctx_mtx);
4287
4288        if (WARN_ON(hweight32(radar_detect) > 1))
4289                return -EINVAL;
4290
4291        if (WARN_ON(chandef && chanmode == IEEE80211_CHANCTX_SHARED &&
4292                    !chandef->chan))
4293                return -EINVAL;
4294
4295        if (WARN_ON(iftype >= NUM_NL80211_IFTYPES))
4296                return -EINVAL;
4297
4298        if (sdata->vif.type == NL80211_IFTYPE_AP ||
4299            sdata->vif.type == NL80211_IFTYPE_MESH_POINT) {
4300                /*
4301                 * always passing this is harmless, since it'll be the
4302                 * same value that cfg80211 finds if it finds the same
4303                 * interface ... and that's always allowed
4304                 */
4305                params.new_beacon_int = sdata->vif.bss_conf.beacon_int;
4306        }
4307
4308        /* Always allow software iftypes */
4309        if (cfg80211_iftype_allowed(local->hw.wiphy, iftype, 0, 1)) {
4310                if (radar_detect)
4311                        return -EINVAL;
4312                return 0;
4313        }
4314
4315        if (chandef)
4316                params.num_different_channels = 1;
4317
4318        if (iftype != NL80211_IFTYPE_UNSPECIFIED)
4319                params.iftype_num[iftype] = 1;
4320
4321        list_for_each_entry(ctx, &local->chanctx_list, list) {
4322                if (ctx->replace_state == IEEE80211_CHANCTX_WILL_BE_REPLACED)
4323                        continue;
4324                params.radar_detect |=
4325                        ieee80211_chanctx_radar_detect(local, ctx);
4326                if (ctx->mode == IEEE80211_CHANCTX_EXCLUSIVE) {
4327                        params.num_different_channels++;
4328                        continue;
4329                }
4330                if (chandef && chanmode == IEEE80211_CHANCTX_SHARED &&
4331                    cfg80211_chandef_compatible(chandef,
4332                                                &ctx->conf.def))
4333                        continue;
4334                params.num_different_channels++;
4335        }
4336
4337        list_for_each_entry_rcu(sdata_iter, &local->interfaces, list) {
4338                struct wireless_dev *wdev_iter;
4339
4340                wdev_iter = &sdata_iter->wdev;
4341
4342                if (sdata_iter == sdata ||
4343                    !ieee80211_sdata_running(sdata_iter) ||
4344                    cfg80211_iftype_allowed(local->hw.wiphy,
4345                                            wdev_iter->iftype, 0, 1))
4346                        continue;
4347
4348                params.iftype_num[wdev_iter->iftype]++;
4349                total++;
4350        }
4351
4352        if (total == 1 && !params.radar_detect)
4353                return 0;
4354
4355        return cfg80211_check_combinations(local->hw.wiphy, &params);
4356}
4357
4358static void
4359ieee80211_iter_max_chans(const struct ieee80211_iface_combination *c,
4360                         void *data)
4361{
4362        u32 *max_num_different_channels = data;
4363
4364        *max_num_different_channels = max(*max_num_different_channels,
4365                                          c->num_different_channels);
4366}
4367
4368int ieee80211_max_num_channels(struct ieee80211_local *local)
4369{
4370        struct ieee80211_sub_if_data *sdata;
4371        struct ieee80211_chanctx *ctx;
4372        u32 max_num_different_channels = 1;
4373        int err;
4374        struct iface_combination_params params = {0};
4375
4376        lockdep_assert_held(&local->chanctx_mtx);
4377
4378        list_for_each_entry(ctx, &local->chanctx_list, list) {
4379                if (ctx->replace_state == IEEE80211_CHANCTX_WILL_BE_REPLACED)
4380                        continue;
4381
4382                params.num_different_channels++;
4383
4384                params.radar_detect |=
4385                        ieee80211_chanctx_radar_detect(local, ctx);
4386        }
4387
4388        list_for_each_entry_rcu(sdata, &local->interfaces, list)
4389                params.iftype_num[sdata->wdev.iftype]++;
4390
4391        err = cfg80211_iter_combinations(local->hw.wiphy, &params,
4392                                         ieee80211_iter_max_chans,
4393                                         &max_num_different_channels);
4394        if (err < 0)
4395                return err;
4396
4397        return max_num_different_channels;
4398}
4399
4400void ieee80211_add_s1g_capab_ie(struct ieee80211_sub_if_data *sdata,
4401                                struct ieee80211_sta_s1g_cap *caps,
4402                                struct sk_buff *skb)
4403{
4404        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
4405        struct ieee80211_s1g_cap s1g_capab;
4406        u8 *pos;
4407        int i;
4408
4409        if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION))
4410                return;
4411
4412        if (!caps->s1g)
4413                return;
4414
4415        memcpy(s1g_capab.capab_info, caps->cap, sizeof(caps->cap));
4416        memcpy(s1g_capab.supp_mcs_nss, caps->nss_mcs, sizeof(caps->nss_mcs));
4417
4418        /* override the capability info */
4419        for (i = 0; i < sizeof(ifmgd->s1g_capa.capab_info); i++) {
4420                u8 mask = ifmgd->s1g_capa_mask.capab_info[i];
4421
4422                s1g_capab.capab_info[i] &= ~mask;
4423                s1g_capab.capab_info[i] |= ifmgd->s1g_capa.capab_info[i] & mask;
4424        }
4425
4426        /* then MCS and NSS set */
4427        for (i = 0; i < sizeof(ifmgd->s1g_capa.supp_mcs_nss); i++) {
4428                u8 mask = ifmgd->s1g_capa_mask.supp_mcs_nss[i];
4429
4430                s1g_capab.supp_mcs_nss[i] &= ~mask;
4431                s1g_capab.supp_mcs_nss[i] |=
4432                        ifmgd->s1g_capa.supp_mcs_nss[i] & mask;
4433        }
4434
4435        pos = skb_put(skb, 2 + sizeof(s1g_capab));
4436        *pos++ = WLAN_EID_S1G_CAPABILITIES;
4437        *pos++ = sizeof(s1g_capab);
4438
4439        memcpy(pos, &s1g_capab, sizeof(s1g_capab));
4440}
4441
4442void ieee80211_add_aid_request_ie(struct ieee80211_sub_if_data *sdata,
4443                                  struct sk_buff *skb)
4444{
4445        u8 *pos = skb_put(skb, 3);
4446
4447        *pos++ = WLAN_EID_AID_REQUEST;
4448        *pos++ = 1;
4449        *pos++ = 0;
4450}
4451
4452u8 *ieee80211_add_wmm_info_ie(u8 *buf, u8 qosinfo)
4453{
4454        *buf++ = WLAN_EID_VENDOR_SPECIFIC;
4455        *buf++ = 7; /* len */
4456        *buf++ = 0x00; /* Microsoft OUI 00:50:F2 */
4457        *buf++ = 0x50;
4458        *buf++ = 0xf2;
4459        *buf++ = 2; /* WME */
4460        *buf++ = 0; /* WME info */
4461        *buf++ = 1; /* WME ver */
4462        *buf++ = qosinfo; /* U-APSD no in use */
4463
4464        return buf;
4465}
4466
4467void ieee80211_txq_get_depth(struct ieee80211_txq *txq,
4468                             unsigned long *frame_cnt,
4469                             unsigned long *byte_cnt)
4470{
4471        struct txq_info *txqi = to_txq_info(txq);
4472        u32 frag_cnt = 0, frag_bytes = 0;
4473        struct sk_buff *skb;
4474
4475        skb_queue_walk(&txqi->frags, skb) {
4476                frag_cnt++;
4477                frag_bytes += skb->len;
4478        }
4479
4480        if (frame_cnt)
4481                *frame_cnt = txqi->tin.backlog_packets + frag_cnt;
4482
4483        if (byte_cnt)
4484                *byte_cnt = txqi->tin.backlog_bytes + frag_bytes;
4485}
4486EXPORT_SYMBOL(ieee80211_txq_get_depth);
4487
4488const u8 ieee80211_ac_to_qos_mask[IEEE80211_NUM_ACS] = {
4489        IEEE80211_WMM_IE_STA_QOSINFO_AC_VO,
4490        IEEE80211_WMM_IE_STA_QOSINFO_AC_VI,
4491        IEEE80211_WMM_IE_STA_QOSINFO_AC_BE,
4492        IEEE80211_WMM_IE_STA_QOSINFO_AC_BK
4493};
4494
4495u16 ieee80211_encode_usf(int listen_interval)
4496{
4497        static const int listen_int_usf[] = { 1, 10, 1000, 10000 };
4498        u16 ui, usf = 0;
4499
4500        /* find greatest USF */
4501        while (usf < IEEE80211_MAX_USF) {
4502                if (listen_interval % listen_int_usf[usf + 1])
4503                        break;
4504                usf += 1;
4505        }
4506        ui = listen_interval / listen_int_usf[usf];
4507
4508        /* error if there is a remainder. Should've been checked by user */
4509        WARN_ON_ONCE(ui > IEEE80211_MAX_UI);
4510        listen_interval = FIELD_PREP(LISTEN_INT_USF, usf) |
4511                          FIELD_PREP(LISTEN_INT_UI, ui);
4512
4513        return (u16) listen_interval;
4514}
4515